Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1953 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [Xlib] Grab/Ungrab

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Xlib] Grab/Ungrab

n°704330
zoupick
Posté le 20-04-2004 à 22:50:12  profilanswer
 

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. }


mood
Publicité
Posté le 20-04-2004 à 22:50:12  profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [Xlib] Grab/Ungrab

 

Sujets relatifs
Xlib sous Linux ???affichage avec Xlib
[C] xlib (edit: ca marche!)[C] compilation avec Xlib sur freebsd, je désespère
C XLib Threads - comment envoyer un message ?palette sous sun XLIB
[XLib] Programmation avec pixmap qui foire (fichiers XPM)Programmation XLib
Plus de sujets relatifs à : [Xlib] Grab/Ungrab


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)