Hi!
Again, I think you should grab the seperate keys instead of the whole
keyboard.
Anyway, a good thing to avoid a lockout due to the keyboard being grabbed
is to use XNest. Test your application in a Xnested session. If your
keyboard is "grabbed" so you can't do anything you an just kill the
XNest-session from your "main" session.
/h
> Yessss it's working !
>
> Thanks you very much for your help, i will be able to continue my work
> :)
>
> Romain
>
>
> On Thu, 2004-04-22 at 00:49, Henrik Sandklef wrote:
>> Hmmm.... If you flush the X buffer after the ungrab call. Just add
>>
>> XFlush(disp);
>>
>> That should do it... I hope :)
>>
>> BTW, I would have grabbed the keys insted of the whole keyboard.
>>
>> /hesa
>> On Tue, 2004-04-20 at 20:28, Romain wrote:
>> > Humm nobody know where i can find help ?
>> >
>> > On Mon, 2004-04-19 at 01:39, Romain wrote:
>> > > Hello,
>> > >
>> > > I try to make a little program based on xlib and xosd, it's a daemon
>> > > listening on the keyboard made for example to increase volume level
>> or
>> > > other things.
>> > >
>> > > But i have a problem to Ungrab the keyboard, i made a sample of what
>> i
>> > > would like to do, if someone see where is the problem
>> > >
>> > > Thanks ! :)
>> > >
>> > > Romain
>> > >
>> > > (gcc devxosd.c -o devxosd -lxosd)
>> > >
>> > > /*
>> > > * XOSD TEST
>> > > */
>> > >
>> > > #include <stdio.h>
>> > > #include <stdlib.h>
>> > > #include <unistd.h>
>> > > #include <fcntl.h>
>> > > #include <sys/ioctl.h>
>> > > #include <errno.h>
>> > > #include <linux/types.h>
>> > >
>> > > #include <xosd.h>
>> > > #include <X11/Xlib.h>
>> > > #include <X11/keysym.h>
>> > > #include <X11/Xutil.h>
>> > >
>> > > #include <sys/soundcard.h>
>> > >
>> > >
>> > > int getSound (void)
>> > > {
>> > > int fd_mixer, vol;
>> > >
>> > > if ((fd_mixer = open ("/dev/mixer", O_RDWR)) < 0) {
>> > > perror ("/dev/mixer");
>> > > return -1;
>> > > }
>> > >
>> > > if (ioctl (fd_mixer, SOUND_MIXER_READ_VOLUME, &vol) == -1) {
>> > > perror ("ioctl");
>> > > return -1;
>> > > }
>> > >
>> > > if (close(fd_mixer) == -1) {
>> > > perror("close");
>> > > return -1;
>> > > }
>> > >
>> > > return vol&255;
>> > > }
>> > >
>> > > int setSound (int v)
>> > > {
>> > > int fd_mixer, vol;
>> > >
>> > > if ((fd_mixer = open ("/dev/mixer", O_RDWR)) < 0) {
>> > > perror ("/dev/mixer");
>> > > return -1;
>> > > }
>> > >
>> > > vol = (v << 8) | v ;
>> > >
>> > > if (ioctl (fd_mixer, SOUND_MIXER_WRITE_VOLUME, &vol) == -1) {
>> > > perror ("ioctl");
>> > > return -1;
>> > > }
>> > >
>> > > if (close(fd_mixer) == -1) {
>> > > perror("close");
>> > > return -1;
>> > > }
>> > >
>> > > return 0;
>> > > }
>> > >
>> > > int volume (int level)
>> > > {
>> > > Display *disp = NULL;
>> > > Window root;
>> > >
>> > > disp = XOpenDisplay(NULL);
>> > > if (!disp) {
>> > > fprintf(stderr, "Failed to open display\n");
>> > > return -1;
>> > > }
>> > >
>> > > root = DefaultRootWindow(disp);
>> > >
>> > >
>> > > /* Xlib */
>> > > int nbre;
>> > > char chaine[2];
>> > > KeySym touche;
>> > >
>> > > /* Xosd */
>> > > xosd *osd = NULL;
>> > > char *font =
>> > > "-adobe-helvetica-bold-r-normal-*-*-240-*-*-p-*-iso8859-1";
>> > > char *title = "Volume";
>> > >
>> > > int isUp = 1;
>> > >
>> > > osd = xosd_create (2);
>> > > if (osd == NULL) {
>> > > perror ("Could not create \"osd\"");
>> > > return -1;
>> > > }
>> > >
>> > > if (xosd_set_font (osd, font)) {
>> > > printf ("Cound not set font\n");
>> > > return -1;
>> > > }
>> > >
>> > > xosd_set_shadow_offset (osd, 2);
>> > > xosd_set_colour (osd, "white");
>> > >
>> > > /* Position */
>> > > xosd_set_pos (osd, XOSD_bottom);
>> > > xosd_set_vertical_offset (osd, 20);
>> > > xosd_set_align (osd, XOSD_center);
>> > > xosd_set_horizontal_offset (osd, 0);
>> > > xosd_set_bar_length(osd, 20);
>> > >
>> > > xosd_display (osd, 0, XOSD_string, title);
>> > > xosd_display (osd, 1, XOSD_percentage, level);
>> > >
>> > > XGrabKeyboard (disp, root, True, GrabModeAsync, GrabModeAsync,
>> > > CurrentTime);
>> > >
>> > > while (isUp) {
>> > > XEvent ev;
>> > >
>> > > XNextEvent (disp, &ev);
>> > > if (ev.type == KeyPress) {
>> > >
>> > > nbre = XLookupString (&ev.xkey, chaine, 2, &touche,
>> 0);
>> > > chaine[nbre] = 0;
>> > >
>> > > switch (touche) {
>> > >
>> > > case XK_q:
>> > > case XK_Q:
>> > > case XK_Escape:
>> > > isUp = 0;
>> > > break;
>> > >
>> > > case XK_Right:
>> > > level = (level > 95 ? 100 : level + 5 );
>> > > setSound(level);
>> > > xosd_display (osd, 1, XOSD_percentage, level);
>> > > break;
>> > >
>> > > case XK_Left:
>> > > level = (level < 5 ? 0 : level - 5 );
>> > > setSound(level);
>> > > xosd_display (osd, 1, XOSD_percentage, level);
>> > > break;
>> > >
>> > > default:
>> > > break;
>> > > }
>> > > }
>> > > }
>> > >
>> > > XUngrabKeyboard (disp, CurrentTime);
>> > > xosd_destroy (osd);
>> > > return 0;
>> > > }
>> > >
>> > >
>> > > int main (int argc, char *argv[])
>> > > {
>> > > volume (getSound());
>> > > printf ("I want the keyboard back !\n");
>> > > sleep (20);
>> > > return 1;
>> > > }
>>
>> _______________________________________________
>> XFree86 mailing list
>> [EMAIL PROTECTED]
>> http://XFree86.Org/mailman/listinfo/xfree86
> --
> Romain <[EMAIL PROTECTED]>
> _______________________________________________
> XFree86 mailing list
> [EMAIL PROTECTED]
> http://XFree86.Org/mailman/listinfo/xfree86
>
--
Though we rush ahead to save our time
We are only what we feel
-- Neil Young / On the Way Home --
_______________________________________________
XFree86 mailing list
[EMAIL PROTECTED]
http://XFree86.Org/mailman/listinfo/xfree86