On Sat, 2003-08-16 at 15:00, Jan Arne Petersen wrote: > Hi, > > this patch adds support for Multimedia Keys to Rhythmbox. > > You need to add --enable-mmkeys to the configure options to enable the > Multimedia Keys support. Fix a problem if a Multimedia Key isn't defined. Regards Jan Arne Petersen -- Jan Arne Petersen <jpetersen@uni-bonn.de>
Index: configure.ac =================================================================== RCS file: /cvs/gnome/rhythmbox/configure.ac,v retrieving revision 1.21 diff -u -r1.21 configure.ac --- configure.ac 15 Aug 2003 21:25:26 -0000 1.21 +++ configure.ac 16 Aug 2003 22:35:24 -0000 @@ -222,6 +222,14 @@ fi AM_CONDITIONAL(HAVE_MUSICBRAINZ,test "x$enable_musicbrainz" = "xyes") +dnl Multimedia Keys support +AC_ARG_ENABLE(mmkeys, AC_HELP_STRING([--enable-mmkeys], + [build with Multimedia Keys support])) +if test x"$enable_mmkeys" = xyes; then + AC_DEFINE(HAVE_MMKEYS, 1, [define if Multimedia Keys are enabled]) +fi +AM_CONDITIONAL(HAVE_MMKEYS, test "x$enable_mmkeys" = "xyes") + dnl CD Audio support dnl AC_ARG_ENABLE(audiocd, AC_HELP_STRING([--enable-audiocd], dnl [build with Audio CD support]),enable_audiocd=yes) Index: shell/rb-shell-player.c =================================================================== RCS file: /cvs/gnome/rhythmbox/shell/rb-shell-player.c,v retrieving revision 1.67 diff -u -r1.67 rb-shell-player.c --- shell/rb-shell-player.c 11 Aug 2003 17:46:58 -0000 1.67 +++ shell/rb-shell-player.c 16 Aug 2003 22:35:27 -0000 @@ -31,6 +31,12 @@ #include <libgnome/gnome-i18n.h> #include <monkey-media.h> +#ifdef HAVE_MMKEYS +#include <X11/Xlib.h> +#include <X11/XF86keysym.h> +#include <gdk/gdkx.h> +#endif /* HAVE_MMKEYS */ + #include "rb-shell-player.h" #include "rb-stock-icons.h" #include "rb-glade-helpers.h" @@ -136,6 +142,14 @@ void buffering_end_cb (MonkeyMediaPlayer *player, gpointer data); void buffering_begin_cb (MonkeyMediaPlayer *player, gpointer data); +#ifdef HAVE_MMKEYS +static void grab_mmkey (int key_code, GdkWindow *root); +static GdkFilterReturn filter_mmkeys (GdkXEvent *xevent, + GdkEvent *event, + gpointer data); +static void rb_shell_player_init_mmkeys (RBShellPlayer *shell_player); +#endif /* HAVE_MMKEYS */ + #define MENU_PATH_PLAY "/menu/Controls/Play" #define TRAY_PATH_PLAY "/popups/TrayPopup/Play" @@ -411,6 +425,11 @@ eel_gconf_notification_add (CONF_STATE, (GConfClientNotifyFunc) rb_shell_player_state_changed_cb, player); + +#ifdef HAVE_MMKEYS + /* Enable Multimedia Keys */ + rb_shell_player_init_mmkeys (player); +#endif /* HAVE_MMKEYS */ } static void @@ -1576,3 +1595,114 @@ return shell_player->priv->url; } +#ifdef HAVE_MMKEYS +static void +grab_mmkey (int key_code, GdkWindow *root) +{ + gdk_error_trap_push (); + + XGrabKey (GDK_DISPLAY (), key_code, + 0, + GDK_WINDOW_XID (root), True, + GrabModeAsync, GrabModeAsync); + XGrabKey (GDK_DISPLAY (), key_code, + Mod2Mask, + GDK_WINDOW_XID (root), True, + GrabModeAsync, GrabModeAsync); + XGrabKey (GDK_DISPLAY (), key_code, + Mod5Mask, + GDK_WINDOW_XID (root), True, + GrabModeAsync, GrabModeAsync); + XGrabKey (GDK_DISPLAY (), key_code, + LockMask, + GDK_WINDOW_XID (root), True, + GrabModeAsync, GrabModeAsync); + XGrabKey (GDK_DISPLAY (), key_code, + Mod2Mask | Mod5Mask, + GDK_WINDOW_XID (root), True, + GrabModeAsync, GrabModeAsync); + XGrabKey (GDK_DISPLAY (), key_code, + Mod2Mask | LockMask, + GDK_WINDOW_XID (root), True, + GrabModeAsync, GrabModeAsync); + XGrabKey (GDK_DISPLAY (), key_code, + Mod5Mask | LockMask, + GDK_WINDOW_XID (root), True, + GrabModeAsync, GrabModeAsync); + XGrabKey (GDK_DISPLAY (), key_code, + Mod2Mask | Mod5Mask | LockMask, + GDK_WINDOW_XID (root), True, + GrabModeAsync, GrabModeAsync); + + gdk_flush (); + if (gdk_error_trap_pop ()) { + rb_debug ("Error grabbing key"); + } +} + +static GdkFilterReturn +filter_mmkeys (GdkXEvent *xevent, GdkEvent *event, gpointer data) +{ + XEvent *xev; + XKeyEvent *key; + RBShellPlayer *player; + + xev = (XEvent *) xevent; + if (xev->type != KeyPress) { + return GDK_FILTER_CONTINUE; + } + + key = (XKeyEvent *) xevent; + + player = (RBShellPlayer *)data; + + if (XKeysymToKeycode (GDK_DISPLAY (), XF86XK_AudioPlay) == key->keycode) { + rb_shell_player_playpause (player); + return GDK_FILTER_REMOVE; + } else if (XKeysymToKeycode (GDK_DISPLAY (), XF86XK_AudioStop) == key->keycode) { + rb_shell_player_set_playing_source (player, NULL); + return GDK_FILTER_REMOVE; + } else if (XKeysymToKeycode (GDK_DISPLAY (), XF86XK_AudioPrev) == key->keycode) { + rb_shell_player_do_previous (player); + return GDK_FILTER_REMOVE; + } else if (XKeysymToKeycode (GDK_DISPLAY (), XF86XK_AudioNext) == key->keycode) { + rb_shell_player_do_next (player); + return GDK_FILTER_REMOVE; + } else { + return GDK_FILTER_CONTINUE; + } +} + +static void +rb_shell_player_init_mmkeys (RBShellPlayer *player) +{ + gint keycodes[] = {0, 0, 0, 0}; + GdkDisplay *display; + GdkScreen *screen; + GdkWindow *root; + guint i, j; + + keycodes[0] = XKeysymToKeycode (GDK_DISPLAY (), XF86XK_AudioPlay); + keycodes[1] = XKeysymToKeycode (GDK_DISPLAY (), XF86XK_AudioStop); + keycodes[2] = XKeysymToKeycode (GDK_DISPLAY (), XF86XK_AudioPrev); + keycodes[3] = XKeysymToKeycode (GDK_DISPLAY (), XF86XK_AudioNext); + + display = gdk_display_get_default (); + + for (i = 0; i < gdk_display_get_n_screens (display); i++) { + screen = gdk_display_get_screen (display, i); + + if (screen != NULL) { + root = gdk_screen_get_root_window (screen); + + for (j = 0; j < 4 ; j++) { + if (keycodes[j] != 0) + grab_mmkey (keycodes[j], root); + } + + gdk_window_add_filter (root, filter_mmkeys, + (gpointer) player); + } + } +} +#endif /* HAVE_MMKEYS */
This is a digitally signed message part