/* * Compile with * * cc -o audio_keys -O2 -s audio_keys.c -L/usr/X11R6/lib -lX11 */ #include #include #include int main(int argc, char *argv[]) { struct { int keycode; int modifier; char *action; } actions[] = { { 174, 0, "amixer -c1 sset PCM 5%-" }, // volume down { 176, 0, "amixer -c1 sset PCM 5%+" }, // volume up { 160, 0, "amixer -c1 sset PCM toggle" }, // mute { 162, 1, "xmms --show-main-window" }, // shift play/pause { 162, 0, "xmms --play-pause" }, // play/pause { 164, 0, "xmms --stop" }, // stop { 144, 0, "xmms --rew" }, // rewind { 153, 0, "xmms --fwd" } // forward }; Display *display; int i; if ((display = XOpenDisplay(NULL)) == NULL) { fprintf(stderr, "Cannot open display\n"); exit(1); } for (i = 0; i < sizeof(actions)/sizeof(actions[0]); i++) XGrabKey(display, actions[i].keycode, AnyModifier, DefaultRootWindow(display), False, GrabModeAsync, GrabModeAsync); for (;;) { XEvent e; XNextEvent(display, &e); if (e.type == KeyPress) { for (i = 0; i < sizeof(actions)/sizeof(actions[0]); i++) { if (actions[i].keycode == e.xkey.keycode && (actions[i].modifier == 0 || (actions[i].modifier & e.xkey.state))) { printf("%s\n", actions[i].action); system(actions[i].action); break; } } } } return 0; }