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
 

Reply via email to