[Xlib] Grab/Ungrab

Grab/Ungrab [Xlib] - C - Programmation

Marsh Posté le 20-04-2004 à 22:50:12    

Bonjour,
 
J'essaye de faire un petit programe base sur xlib et xosd, c'est un daemon qui peut ecouter sur le clavier et effectuer des operations comme la modification du volume ou autre.
 
J'utilise la fonction XGrabKeyboard pour intercepter le clavier cependant XUngrabKeyboard ne me rend pas la main..
 
Si qq a une piste  ?  
 
Voila un exemple de code ou je devrai retrouver la main pendant les 20 secondes.
 
Romain
 
(gcc devxosd.c -o devxosd -lxosd)
 

Code :
  1. /*
  2. * XOSD TEST
  3. */
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <unistd.h>
  7. #include <fcntl.h>
  8. #include <sys/ioctl.h>
  9. #include <errno.h>
  10. #include <linux/types.h>
  11. #include <xosd.h>
  12. #include <X11/Xlib.h>
  13. #include <X11/keysym.h>
  14. #include <X11/Xutil.h>
  15. #include <sys/soundcard.h>
  16. int getSound (void)
  17. {
  18.      int fd_mixer, vol;
  19.      
  20.      if ((fd_mixer = open ("/dev/mixer", O_RDWR)) < 0) {
  21.           perror ("/dev/mixer" );
  22.           return -1;
  23.      }
  24.      
  25.      if (ioctl (fd_mixer, SOUND_MIXER_READ_VOLUME, &vol) == -1) {
  26.           perror ("ioctl" );
  27.           return -1;
  28.      }
  29.      if (close(fd_mixer) == -1) {
  30.           perror("close" );
  31.           return -1;
  32.      }
  33.      
  34.      return vol&255;
  35. }
  36. int setSound (int v)
  37. {
  38.      int fd_mixer, vol;
  39.      
  40.      if ((fd_mixer = open ("/dev/mixer", O_RDWR)) < 0) {
  41.           perror ("/dev/mixer" );
  42.           return -1;
  43.      }
  44.      
  45.      vol = (v << 8) | v ;
  46.      
  47.      if (ioctl (fd_mixer, SOUND_MIXER_WRITE_VOLUME, &vol) == -1) {
  48.           perror ("ioctl" );
  49.           return -1;
  50.      }
  51.                                                                                                                                                          
  52.      if (close(fd_mixer) == -1) {
  53.           perror("close" );
  54.           return -1;
  55.      }
  56.                                                                                                                                                          
  57.      return 0;
  58. }
  59. int volume (int level)
  60. {
  61.      Display *disp = NULL;
  62.      Window root;
  63.                                                                                                                                                          
  64.      disp = XOpenDisplay(NULL);
  65.      if (!disp) {
  66.           fprintf(stderr, "Failed to open display\n" );
  67.           return -1;
  68.      }
  69.                                                                                                                                                          
  70.      root = DefaultRootWindow(disp);
  71.                                                                                                                                                          
  72.                                                                                                                                                          
  73.      /* Xlib */
  74.      int nbre;
  75.      char chaine[2];
  76.      KeySym touche;
  77.                                                                                                                                                          
  78.      /* Xosd */
  79.      xosd *osd = NULL;
  80.      char *font =
  81. "-adobe-helvetica-bold-r-normal-*-*-240-*-*-p-*-iso8859-1";
  82.      char *title = "Volume";
  83.                                                                                                                                                          
  84.      int isUp = 1;
  85.                                                                                                                                                          
  86.      osd = xosd_create (2);
  87.      if (osd == NULL) {
  88.           perror ("Could not create \"osd\"" );
  89.           return -1;
  90.      }
  91.                                                                                                                                                          
  92.      if (xosd_set_font (osd, font)) {
  93.           printf ("Cound not set font\n" );
  94.           return -1;
  95.      }
  96.                                                                                                                                                          
  97.      xosd_set_shadow_offset (osd, 2);
  98.      xosd_set_colour (osd, "white" );
  99.                                                                                                                                                          
  100.      /* Position */
  101.      xosd_set_pos (osd, XOSD_bottom);
  102.      xosd_set_vertical_offset (osd, 20);
  103.      xosd_set_align (osd, XOSD_center);
  104.      xosd_set_horizontal_offset (osd, 0);
  105.      xosd_set_bar_length(osd, 20);
  106.                                                                                                                                                          
  107.      xosd_display (osd, 0, XOSD_string, title);
  108.      xosd_display (osd, 1, XOSD_percentage, level);
  109.                                                                                                                                                          
  110.      XGrabKeyboard (disp, root, True, GrabModeAsync, GrabModeAsync,
  111. CurrentTime);
  112.      while (isUp) {
  113.           XEvent ev;
  114.                                                                                                                                                          
  115.           XNextEvent (disp, &ev);
  116.           if (ev.type == KeyPress) {
  117.                                                                                                                                                          
  118.                nbre = XLookupString (&ev.xkey, chaine, 2, &touche, 0);
  119.                chaine[nbre] = 0;
  120.                                                                                                                                                          
  121.                switch (touche) {
  122.                                                                                                                                                          
  123.                case XK_q:
  124.                case XK_Q:
  125.                case XK_Escape:
  126.                     isUp = 0;
  127.                     break;
  128.                                                                                                                                                          
  129.                case XK_Right:
  130.                     level = (level > 95 ? 100 : level + 5 );
  131.                     setSound(level);
  132.                     xosd_display (osd, 1, XOSD_percentage, level);
  133.                     break;
  134.                                                                                                                                                          
  135.                case XK_Left:
  136.                     level = (level < 5 ? 0 : level - 5 );
  137.                     setSound(level);
  138.                     xosd_display (osd, 1, XOSD_percentage, level);
  139.                     break;
  140.                                                                                                                                                          
  141.                default:
  142.                     break;
  143.                }
  144.           }
  145.      }
  146.                                                                                                                                                          
  147.      XUngrabKeyboard (disp, CurrentTime);
  148.      xosd_destroy (osd);
  149.      return 0;
  150. }
  151.                                                                                                                                                          
  152.                                                                                                                                                          
  153. int main (int argc, char *argv[])
  154. {
  155.      volume (getSound());
  156.      printf ("I want the keyboard back !\n" );
  157.      sleep (20);
  158.      return 1;
  159. }


Reply

Marsh Posté le 20-04-2004 à 22:50:12   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed