zoupick | 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 :
- /*
- * 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;
- }
|
|