Author: goetz
Date: Sat Feb 10 18:03:52 2007
New Revision: 118759
Added:
packages/cooker/rhythmbox/current/SOURCES/rhythmbox-0.9.7-mmkeys-plugin.patch
Modified:
packages/cooker/rhythmbox/current/SPECS/rhythmbox.spec
Log:
add mmkeys plugin from Fedora
Added:
packages/cooker/rhythmbox/current/SOURCES/rhythmbox-0.9.7-mmkeys-plugin.patch
==============================================================================
--- (empty file)
+++
packages/cooker/rhythmbox/current/SOURCES/rhythmbox-0.9.7-mmkeys-plugin.patch
Sat Feb 10 18:03:52 2007
@@ -0,0 +1,711 @@
+diff -urN rhythmbox-0.9.7/configure.ac rhythmbox-0.9.7.mmkeys/configure.ac
+--- rhythmbox-0.9.7/configure.ac 2006-12-17 12:38:33.000000000 +0000
++++ rhythmbox-0.9.7.mmkeys/configure.ac 2007-01-31 12:01:13.000000000
+0000
+@@ -956,6 +956,7 @@
+ plugins/generic-player/Makefile
+ plugins/rb/Makefile
+ plugins/power-manager/Makefile
++plugins/mmkeys/Makefile
+ bindings/Makefile
+ bindings/python/Makefile
+ help/Makefile
+diff -urN rhythmbox-0.9.7/data/rhythmbox.schemas
rhythmbox-0.9.7.mmkeys/data/rhythmbox.schemas
+--- rhythmbox-0.9.7/data/rhythmbox.schemas 2006-12-18 12:26:46.000000000
+0000
++++ rhythmbox-0.9.7.mmkeys/data/rhythmbox.schemas 2007-01-31
12:02:16.000000000 +0000
+@@ -978,5 +978,27 @@
+ <long>True if the DAAP plugin is hidden.</long>
+ </locale>
+ </schema>
++ <schema>
++ <key>/schemas/apps/rhythmbox/plugins/mmkeys/active</key>
++ <applyto>/apps/rhythmbox/plugins/mmkeys/active</applyto>
++ <owner>rhythmbox</owner>
++ <type>bool</type>
++ <default>TRUE</default>
++ <locale name="C">
++ <short>True if the media player keys plugin is enabled.</short>
++ <long>True if the media player keys plugin is enabled.</long>
++ </locale>
++ </schema>
++ <schema>
++ <key>/schemas/apps/rhythmbox/plugins/mmkeys/hidden</key>
++ <applyto>/apps/rhythmbox/plugins/mmkeys/hidden</applyto>
++ <owner>rhythmbox</owner>
++ <type>bool</type>
++ <default>TRUE</default>
++ <locale name="C">
++ <short>True if the media player keys plugin is hidden.</short>
++ <long>True if the media player keys plugin is hidden.</long>
++ </locale>
++ </schema>
+ </schemalist>
+ </gconfschemafile>
+diff -urN rhythmbox-0.9.7/plugins/Makefile.am
rhythmbox-0.9.7.mmkeys/plugins/Makefile.am
+--- rhythmbox-0.9.7/plugins/Makefile.am 2006-12-11 12:36:58.000000000
+0000
++++ rhythmbox-0.9.7.mmkeys/plugins/Makefile.am 2007-01-31 12:00:42.000000000
+0000
+@@ -3,6 +3,7 @@
+ SUBDIRS = \
+ generic-player \
+ iradio \
++ mmkeys \
+ sample
+
+ if WITH_AUDIOSCROBBLER
+diff -urN rhythmbox-0.9.7/plugins/mmkeys/Makefile.am
rhythmbox-0.9.7.mmkeys/plugins/mmkeys/Makefile.am
+--- rhythmbox-0.9.7/plugins/mmkeys/Makefile.am 1970-01-01 01:00:00.000000000
+0100
++++ rhythmbox-0.9.7.mmkeys/plugins/mmkeys/Makefile.am 2007-01-31
12:00:42.000000000 +0000
+@@ -0,0 +1,51 @@
++NULL =
++
++plugindir = $(PLUGINDIR)/mmkeys
++plugin_LTLIBRARIES = libmmkeys.la
++
++libmmkeys_la_SOURCES = \
++ rb-mmkeys-plugin.c \
++ $(NULL)
++
++libmmkeys_la_LDFLAGS = $(PLUGIN_LIBTOOL_FLAGS)
++
++libmmkeys_la_LIBADD = \
++ $(NULL)
++
++INCLUDES = \
++ -DGNOMELOCALEDIR=\""$(datadir)/locale"\" \
++ -DG_LOG_DOMAIN=\"Rhythmbox\" \
++ -I$(top_srcdir) \
++ -I$(top_srcdir)/lib \
++ -I$(top_srcdir)/player \
++ -I$(top_srcdir)/rhythmdb \
++ -I$(top_srcdir)/widgets \
++ -I$(top_srcdir)/sources \
++ -I$(top_srcdir)/plugins \
++ -I$(top_srcdir)/shell \
++ -DPIXMAP_DIR=\""$(datadir)/pixmaps"\" \
++ -DSHARE_DIR=\"$(pkgdatadir)\" \
++ -DDATADIR=\""$(datadir)"\" \
++ $(RHYTHMBOX_CFLAGS) \
++ $(WARN_CFLAGS) \
++ -D_XOPEN_SOURCE -D_BSD_SOURCE \
++ $(NULL)
++
++if WITH_DBUS
++INCLUDES += $(DBUS_CFLAGS)
++libmmkeys_la_LIBADD += $(DBUS_LIBS)
++endif
++
++gladedir = $(datadir)/rhythmbox/glade
++glade_DATA =
++
++plugin_in_files = mmkeys.rb-plugin.desktop.in
++
++%.rb-plugin: %.rb-plugin.desktop.in $(INTLTOOL_MERGE) $(wildcard
$(top_srcdir)/po/*po) ; $(INTLTOOL_MERGE) $(top_srcdir)/po $< $@ -d -u -c
$(top_builddir)/po/.intltool-merge-cache
++
++plugin_DATA = $(plugin_in_files:.rb-plugin.desktop.in=.rb-plugin)
++
++EXTRA_DIST = $(glade_DATA) $(plugin_in_files)
++
++CLEANFILES = $(plugin_DATA)
++DISTCLEANFILES = $(plugin_DATA)
+diff -urN rhythmbox-0.9.7/plugins/mmkeys/mmkeys.rb-plugin.desktop.in
rhythmbox-0.9.7.mmkeys/plugins/mmkeys/mmkeys.rb-plugin.desktop.in
+--- rhythmbox-0.9.7/plugins/mmkeys/mmkeys.rb-plugin.desktop.in 1970-01-01
01:00:00.000000000 +0100
++++ rhythmbox-0.9.7.mmkeys/plugins/mmkeys/mmkeys.rb-plugin.desktop.in
2007-01-31 12:00:42.000000000 +0000
+@@ -0,0 +1,8 @@
++[RB Plugin]
++Module=mmkeys
++IAge=1
++_Name=Media Player Keys
++_Description=Control Rhythmbox using key shortcuts
++Authors=Rhythmbox authors
++Copyright=Copyright © 2002-2007 Rhythmbox authors
++Website=http://www.rhythmbox.org/
+diff -urN rhythmbox-0.9.7/plugins/mmkeys/rb-mmkeys-plugin.c
rhythmbox-0.9.7.mmkeys/plugins/mmkeys/rb-mmkeys-plugin.c
+--- rhythmbox-0.9.7/plugins/mmkeys/rb-mmkeys-plugin.c 1970-01-01
01:00:00.000000000 +0100
++++ rhythmbox-0.9.7.mmkeys/plugins/mmkeys/rb-mmkeys-plugin.c 2007-01-31
12:00:42.000000000 +0000
+@@ -0,0 +1,419 @@
++/*
++ * rb-mmkeys-plugin.c
++ *
++ * Copyright (C) 2002, 2003 Jorn Baayen <[EMAIL PROTECTED]>
++ * Copyright (C) 2002,2003 Colin Walters <[EMAIL PROTECTED]>
++ * Copyright (C) 2007 James Livingston <[EMAIL PROTECTED]>
++ * Copyright (C) 2007 Jonathan Matthew <[EMAIL PROTECTED]>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2, or (at your option)
++ * any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ */
++
++#ifdef HAVE_CONFIG_H
++#include <config.h>
++#endif
++
++#include <string.h> /* For strlen */
++#include <glib/gi18n-lib.h>
++#include <gmodule.h>
++#include <gtk/gtk.h>
++#include <glib.h>
++#include <glib-object.h>
++
++#include "rb-plugin.h"
++#include "rb-debug.h"
++#include "rb-shell.h"
++#include "rb-shell-player.h"
++#include "rb-marshal.h"
++
++#ifdef WITH_DBUS
++#include <dbus/dbus-glib.h>
++#endif
++
++#ifdef HAVE_MMKEYS
++#include <X11/Xlib.h>
++#include <X11/XF86keysym.h>
++#include <gdk/gdkx.h>
++#endif /* HAVE_MMKEYS */
++
++#define RB_TYPE_MMKEYS_PLUGIN (rb_mmkeys_plugin_get_type ())
++#define RB_MMKEYS_PLUGIN(o) (G_TYPE_CHECK_INSTANCE_CAST
((o), RB_TYPE_MMKEYS_PLUGIN, RBMMKeysPlugin))
++#define RB_MMKEYS_PLUGIN_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k),
RB_TYPE_MMKEYS_PLUGIN, RBMMKeysPluginClass))
++#define RB_IS_MMKEYS_PLUGIN(o) (G_TYPE_CHECK_INSTANCE_TYPE
((o), RB_TYPE_MMKEYS_PLUGIN))
++#define RB_IS_MMKEYS_PLUGIN_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k),
RB_TYPE_MMKEYS_PLUGIN))
++#define RB_MMKEYS_PLUGIN_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o),
RB_TYPE_MMKEYS_PLUGIN, RBMMKeysPluginClass))
++
++typedef struct
++{
++ RBPlugin parent;
++
++ enum {
++ NONE = 0,
++ SETTINGS_DAEMON,
++ X_KEY_GRAB
++ } grab_type;
++ RBShellPlayer *shell_player;
++#ifdef WITH_DBUS
++ DBusGProxy *proxy;
++#endif
++} RBMMKeysPlugin;
++
++typedef struct
++{
++ RBPluginClass parent_class;
++} RBMMKeysPluginClass;
++
++
++G_MODULE_EXPORT GType register_rb_plugin (GTypeModule *module);
++GType rb_mmkeys_plugin_get_type (void) G_GNUC_CONST;
++
++RB_PLUGIN_REGISTER(RBMMKeysPlugin, rb_mmkeys_plugin)
++#define RB_MMKEYS_PLUGIN_GET_PRIVATE(object) (G_TYPE_INSTANCE_GET_PRIVATE
((object), RB_TYPE_MMKEYS_PLUGIN, RBMMKeysPluginPrivate))
++
++
++static void
++rb_mmkeys_plugin_init (RBMMKeysPlugin *plugin)
++{
++ rb_debug ("RBMMKeysPlugin initialising");
++}
++
++#ifdef WITH_DBUS
++static void
++media_player_key_pressed (DBusGProxy *proxy,
++ const gchar *application,
++ const gchar *key,
++ RBMMKeysPlugin *plugin)
++{
++ rb_debug ("got media key '%s' for application '%s'",
++ key, application);
++
++ if (strcmp (application, "Rhythmbox"))
++ return;
++
++ if (strcmp (key, "Play") == 0) {
++ rb_shell_player_playpause (plugin->shell_player, FALSE, NULL);
++ } else if (strcmp (key, "Pause") == 0 ||
++ strcmp (key, "Stop") == 0) {
++ rb_shell_player_pause (plugin->shell_player, NULL);
++ } else if (strcmp (key, "Previous") == 0) {
++ rb_shell_player_do_previous (plugin->shell_player, NULL);
++ } else if (strcmp (key, "Next") == 0) {
++ rb_shell_player_do_next (plugin->shell_player, NULL);
++ }
++}
++
++static gboolean
++window_focus_cb (GtkWidget *window,
++ GdkEventFocus *event,
++ RBMMKeysPlugin *plugin)
++{
++ rb_debug ("window got focus, re-grabbing media keys");
++
++ dbus_g_proxy_call (plugin->proxy,
++ "GrabMediaPlayerKeys", NULL,
++ G_TYPE_STRING, "Rhythmbox",
++ G_TYPE_UINT, 0,
++ G_TYPE_INVALID, G_TYPE_INVALID);
++
++ return FALSE;
++}
++
++#endif
++
++#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 void
++ungrab_mmkey (int key_code,
++ GdkWindow *root)
++{
++ gdk_error_trap_push ();
++
++ XUngrabKey (GDK_DISPLAY (), key_code, 0, GDK_WINDOW_XID (root));
++ XUngrabKey (GDK_DISPLAY (), key_code, Mod2Mask, GDK_WINDOW_XID (root));
++ XUngrabKey (GDK_DISPLAY (), key_code, Mod5Mask, GDK_WINDOW_XID (root));
++ XUngrabKey (GDK_DISPLAY (), key_code, LockMask, GDK_WINDOW_XID (root));
++ XUngrabKey (GDK_DISPLAY (), key_code, Mod2Mask | Mod5Mask,
GDK_WINDOW_XID (root));
++ XUngrabKey (GDK_DISPLAY (), key_code, Mod2Mask | LockMask,
GDK_WINDOW_XID (root));
++ XUngrabKey (GDK_DISPLAY (), key_code, Mod5Mask | LockMask,
GDK_WINDOW_XID (root));
++ XUngrabKey (GDK_DISPLAY (), key_code, Mod2Mask | Mod5Mask | LockMask,
GDK_WINDOW_XID (root));
++
++ 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, FALSE, NULL);
++ return GDK_FILTER_REMOVE;
++ } else if (XKeysymToKeycode (GDK_DISPLAY (), XF86XK_AudioPause) ==
key->keycode) {
++ rb_shell_player_pause (player, NULL);
++ return GDK_FILTER_REMOVE;
++ } else if (XKeysymToKeycode (GDK_DISPLAY (), XF86XK_AudioStop) ==
key->keycode) {
++ rb_shell_player_stop (player);
++ return GDK_FILTER_REMOVE;
++ } else if (XKeysymToKeycode (GDK_DISPLAY (), XF86XK_AudioPrev) ==
key->keycode) {
++ rb_shell_player_do_previous (player, NULL);
++ return GDK_FILTER_REMOVE;
++ } else if (XKeysymToKeycode (GDK_DISPLAY (), XF86XK_AudioNext) ==
key->keycode) {
++ rb_shell_player_do_next (player, NULL);
++ return GDK_FILTER_REMOVE;
++ } else {
++ return GDK_FILTER_CONTINUE;
++ }
++}
++
++static void
++mmkeys_grab (RBMMKeysPlugin *plugin, gboolean grab)
++{
++ gint keycodes[] = {0, 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);
++ keycodes[4] = XKeysymToKeycode (GDK_DISPLAY (), XF86XK_AudioPause);
++
++ 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 < G_N_ELEMENTS (keycodes) ; j++) {
++ if (keycodes[j] != 0) {
++ if (grab)
++ grab_mmkey (keycodes[j], root);
++ else
++ ungrab_mmkey (keycodes[j],
root);
++ }
++ }
++
++ if (grab)
++ gdk_window_add_filter (root, filter_mmkeys,
++ (gpointer)
plugin->shell_player);
++ else
++ gdk_window_remove_filter (root, filter_mmkeys,
++ (gpointer)
plugin->shell_player);
++ }
++ }
++}
++
++#endif
++
++static void
++impl_activate (RBPlugin *bplugin,
++ RBShell *shell)
++{
++#ifdef WITH_DBUS
++ DBusGConnection *bus;
++#endif
++ RBMMKeysPlugin *plugin;
++
++ rb_debug ("activating media player keys plugin");
++
++ plugin = RB_MMKEYS_PLUGIN (bplugin);
++ g_object_get (shell,
++ "shell-player", &plugin->shell_player,
++ NULL);
++
++#ifdef WITH_DBUS
++ bus = dbus_g_bus_get (DBUS_BUS_SESSION, NULL);
++ if (plugin->grab_type == NONE && bus != NULL) {
++ GError *error = NULL;
++
++ plugin->proxy = dbus_g_proxy_new_for_name (bus,
++ "org.gnome.SettingsDaemon",
++ "/org/gnome/SettingsDaemon",
++ "org.gnome.SettingsDaemon");
++ if (plugin->proxy != NULL) {
++ dbus_g_proxy_call (plugin->proxy,
++ "GrabMediaPlayerKeys", &error,
++ G_TYPE_STRING, "Rhythmbox",
++ G_TYPE_UINT, 0,
++ G_TYPE_INVALID,
++ G_TYPE_INVALID);
++ if (error == NULL) {
++ GtkWindow *window;
++
++ rb_debug ("created dbus proxy for
org.gnome.SettingsDaemon; grabbing keys");
++ dbus_g_object_register_marshaller
(rb_marshal_VOID__STRING_STRING,
++ G_TYPE_NONE, G_TYPE_STRING,
G_TYPE_STRING, G_TYPE_INVALID);
++
++ dbus_g_proxy_add_signal (plugin->proxy,
++
"MediaPlayerKeyPressed",
++
G_TYPE_STRING,G_TYPE_STRING,G_TYPE_INVALID);
++
++ dbus_g_proxy_connect_signal (plugin->proxy,
++
"MediaPlayerKeyPressed",
++ G_CALLBACK
(media_player_key_pressed),
++ plugin, NULL);
++
++ /* re-grab keys when the main window gains
focus */
++ g_object_get (shell, "window", &window, NULL);
++ g_signal_connect_object (window,
"focus-in-event",
++ G_CALLBACK
(window_focus_cb),
++ plugin, 0);
++ g_object_unref (window);
++
++ plugin->grab_type = SETTINGS_DAEMON;
++
++ } else if (error->domain == DBUS_GERROR &&
++ (error->code !=
DBUS_GERROR_NAME_HAS_NO_OWNER ||
++ error->code != DBUS_GERROR_SERVICE_UNKNOWN))
{
++ /* settings daemon dbus service doesn't exist.
++ * just silently fail.
++ */
++ rb_debug ("org.gnome.SettingsDaemon dbus
service not found");
++ g_error_free (error);
++ } else {
++ g_warning ("Unable to grab media player keys:
%s", error->message);
++ g_error_free (error);
++ }
++ }
++ } else {
++ rb_debug ("couldn't get dbus session bus");
++ }
++#endif
++
++#ifdef HAVE_MMKEYS
++ if (plugin->grab_type == NONE) {
++ rb_debug ("attempting old-style key grabs");
++ mmkeys_grab (plugin, TRUE);
++ plugin->grab_type = X_KEY_GRAB;
++ }
++#endif
++}
++
++static void
++impl_deactivate (RBPlugin *bplugin,
++ RBShell *shell)
++{
++ RBMMKeysPlugin *plugin;
++
++ plugin = RB_MMKEYS_PLUGIN (bplugin);
++ if (plugin->shell_player != NULL) {
++ g_object_unref (plugin->shell_player);
++ plugin->shell_player = NULL;
++ }
++
++#ifdef WITH_DBUS
++ if (plugin->proxy != NULL) {
++ GError *error = NULL;
++
++ if (plugin->grab_type == SETTINGS_DAEMON) {
++ dbus_g_proxy_call (plugin->proxy,
++ "ReleaseMediaPlayerKeys", &error,
++ G_TYPE_STRING, "Rhythmbox",
++ G_TYPE_INVALID, G_TYPE_INVALID);
++ if (error != NULL) {
++ g_warning ("Could not release media player
keys: %s", error->message);
++ g_error_free (error);
++ }
++ plugin->grab_type = NONE;
++ }
++
++ g_object_unref (plugin->proxy);
++ plugin->proxy = NULL;
++ }
++#endif
++#ifdef HAVE_MMKEYS
++ if (plugin->grab_type == X_KEY_GRAB) {
++ rb_debug ("undoing old-style key grabs");
++ mmkeys_grab (plugin, FALSE);
++ plugin->grab_type = NONE;
++ }
++#endif
++}
++
++
++static void
++rb_mmkeys_plugin_class_init (RBMMKeysPluginClass *klass)
++{
++ RBPluginClass *plugin_class = RB_PLUGIN_CLASS (klass);
++
++ plugin_class->activate = impl_activate;
++ plugin_class->deactivate = impl_deactivate;
++}
++
+diff -urN rhythmbox-0.9.7/shell/rb-shell-player.c
rhythmbox-0.9.7.mmkeys/shell/rb-shell-player.c
+--- rhythmbox-0.9.7/shell/rb-shell-player.c 2006-12-18 12:27:34.000000000
+0000
++++ rhythmbox-0.9.7.mmkeys/shell/rb-shell-player.c 2007-01-31
12:00:42.000000000 +0000
+@@ -35,12 +35,6 @@
+ #include <libgnomevfs/gnome-vfs-utils.h>
+ #include <libgnomevfs/gnome-vfs-uri.h>
+
+-#ifdef HAVE_MMKEYS
+-#include <X11/Xlib.h>
+-#include <X11/XF86keysym.h>
+-#include <gdk/gdkx.h>
+-#endif /* HAVE_MMKEYS */
+-
+ #include "rb-property-view.h"
+ #include "rb-shell-player.h"
+ #include "rb-stock-icons.h"
+@@ -154,14 +148,6 @@
+
+ static gboolean rb_shell_player_jump_to_current_idle (RBShellPlayer *player);
+
+-#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 CONF_STATE CONF_PREFIX "/state"
+
+ struct RBShellPlayerPrivate
+@@ -735,11 +721,6 @@
+ eel_gconf_notification_add (CONF_UI_SONG_POSITION_SLIDER_HIDDEN,
+ (GConfClientNotifyFunc)
gconf_song_position_slider_visibility_changed,
+ player);
+-
+-#ifdef HAVE_MMKEYS
+- /* Enable Multimedia Keys */
+- rb_shell_player_init_mmkeys (player);
+-#endif /* HAVE_MMKEYS */
+ }
+
+ static void
+@@ -2844,124 +2825,6 @@
+ return TRUE;
+ }
+
+-#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, FALSE, NULL);
+- return GDK_FILTER_REMOVE;
+- } else if (XKeysymToKeycode (GDK_DISPLAY (), XF86XK_AudioPause) ==
key->keycode) {
+- rb_shell_player_pause (player, NULL);
+- return GDK_FILTER_REMOVE;
+- } else if (XKeysymToKeycode (GDK_DISPLAY (), XF86XK_AudioStop) ==
key->keycode) {
+- rb_shell_player_stop (player);
+- return GDK_FILTER_REMOVE;
+- } else if (XKeysymToKeycode (GDK_DISPLAY (), XF86XK_AudioPrev) ==
key->keycode) {
+- rb_shell_player_cmd_previous (NULL, player);
+- return GDK_FILTER_REMOVE;
+- } else if (XKeysymToKeycode (GDK_DISPLAY (), XF86XK_AudioNext) ==
key->keycode) {
+- rb_shell_player_cmd_next (NULL, player);
+- return GDK_FILTER_REMOVE;
+- } else {
+- return GDK_FILTER_CONTINUE;
+- }
+-}
+-
+-static void
+-rb_shell_player_init_mmkeys (RBShellPlayer *shell_player)
+-{
+- gint keycodes[] = {0, 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);
+- keycodes[4] = XKeysymToKeycode (GDK_DISPLAY (), XF86XK_AudioPause);
+-
+- 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 < G_N_ELEMENTS (keycodes) ; j++) {
+- if (keycodes[j] != 0)
+- grab_mmkey (keycodes[j], root);
+- }
+-
+- gdk_window_add_filter (root, filter_mmkeys,
+- (gpointer) shell_player);
+- }
+- }
+-}
+-#endif /* HAVE_MMKEYS */
+-
+ static gboolean
+ _idle_unblock_signal_cb (gpointer data)
+ {
Modified: packages/cooker/rhythmbox/current/SPECS/rhythmbox.spec
==============================================================================
--- packages/cooker/rhythmbox/current/SPECS/rhythmbox.spec (original)
+++ packages/cooker/rhythmbox/current/SPECS/rhythmbox.spec Sat Feb 10
18:03:52 2007
@@ -1,6 +1,6 @@
%define version 0.9.7
-%define release %mkrel 4
+%define release %mkrel 5
%if %mdkversion >= 200610
%define gstreamer 0.10.0
@@ -23,6 +23,8 @@
Patch: rhythmbox-0.9.7-use-icon-name.patch
# gw fix python plugins on 64 bit
Patch1: rhythmbox-python-plugins.patch
+#gw from Fedora, add a working mmkeys plugin
+Patch2: rhythmbox-0.9.7-mmkeys-plugin.patch
URL: http://www.rhythmbox.org
BuildRoot: %{_tmppath}/%{name}-%{version}-root
BuildRequires: libgnomeui2-devel
@@ -94,6 +96,11 @@
%setup -q
%patch -p1 -b .use-icon-name
%patch1 -p0 -b .python
+%patch2 -p1 -b .mmkeys
+# For Patch1
+aclocal -I macros
+autoconf
+automake
%build