[Rhythmbox-devel] Re: [patch] add support for Multimedia Keys



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



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]