diff -r -u acconfig.h rhythmbox.patched/acconfig.h
--- acconfig.h	2003-01-23 21:56:15.000000000 +0000
+++ rhythmbox.patched/acconfig.h	2003-02-08 21:31:11.000000000 +0000
@@ -5,3 +5,4 @@
 #undef HAVE_LC_MESSAGES
 #undef HAVE_REMOTE
 #undef HAVE_XOSD
+#undef HAVE_ACME
diff -r -u configure.in rhythmbox.patched/configure.in
--- configure.in	2003-02-07 23:11:49.000000000 +0000
+++ rhythmbox.patched/configure.in	2003-02-08 22:42:00.000000000 +0000
@@ -74,6 +74,14 @@
 			,,) ] ,)
 fi
 
+dnl Check of Mulitmedia keys
+AC_ARG_ENABLE(xacme, AC_HELP_STRING([--disable-acme],
+				[don't build with acme support]))
+if test "x$enable_acme" != "xno"; then
+AC_CHECK_HEADER(X11/XF86keysym.h, [enable_acme=yes
+		AC_DEFINE(HAVE_ACME)],,)
+fi
+
 dnl Check for zlib
 
 AC_CHECK_HEADER(zlib.h,,
diff -r -u shell/rb-shell-player.c rhythmbox.patched/shell/rb-shell-player.c
--- shell/rb-shell-player.c	2003-02-07 22:06:12.000000000 +0000
+++ rhythmbox.patched/shell/rb-shell-player.c	2003-02-08 22:50:08.000000000 +0000
@@ -28,6 +28,9 @@
 #include <libgnomevfs/gnome-vfs-uri.h>
 #include <libgnome/gnome-i18n.h>
 #include <monkey-media.h>
+#ifdef HAVE_ACME
+#include <X11/XF86keysym.h>
+#endif
 
 #include "rb-shell-player.h"
 #include "rb-stock-icons.h"
@@ -98,6 +101,9 @@
 static void rb_shell_player_remote_cb (RBRemote *remote, RBRemoteCommand cmd,
 				       RBShellPlayer *player);
 #endif
+#ifdef HAVE_ACME
+static void rb_pause_or_play (RBShellPlayer *player);
+#endif
 
 #define MENU_PATH_PLAY     "/menu/Controls/Play"
 #define TRAY_PATH_PLAY     "/popups/TrayPopup/Play"
@@ -950,3 +956,50 @@
 	}
 }
 #endif
+
+#ifdef HAVE_ACME
+static void
+rb_pause_or_play (RBShellPlayer *player)
+{
+ 	if (player != NULL)
+ 	{
+		if (monkey_media_player_playing (player->priv->mmplayer))
+		{
+			rb_shell_player_cmd_pause (NULL, player, NULL);
+		}
+		else
+		{
+			rb_shell_player_cmd_play (NULL, player, NULL);
+		}
+ 	}
+}
+#endif
+
+gboolean
+rb_player_action_handle_key (RBShellPlayer *player, guint keyval)
+{
+ 	gboolean retval = TRUE;
+#ifdef HAVE_ACME
+ 	switch (keyval) {
+ 	case XF86XK_AudioPlay:
+ 	case XF86XK_AudioPause:
+ 		rb_pause_or_play (player);
+ 		break;
+ 	case XF86XK_AudioPrev:
+	    	if (rb_view_player_have_previous (player->priv->player) == TRUE)
+		{
+ 			rb_view_player_previous (player->priv->player);
+		}
+ 		break;
+ 	case XF86XK_AudioNext:
+	    	if (rb_view_player_have_next (player->priv->player) == TRUE)
+		{
+			rb_view_player_next (player->priv->player);
+		}
+ 		break;
+ 	default:
+ 		retval = FALSE;
+ 	}
+#endif 
+ 	return retval;
+}
diff -r -u shell/rb-shell-player.h rhythmbox.patched/shell/rb-shell-player.h
--- shell/rb-shell-player.h	2003-01-27 08:30:13.000000000 +0000
+++ rhythmbox.patched/shell/rb-shell-player.h	2003-02-08 21:38:12.000000000 +0000
@@ -71,6 +71,8 @@
 
 MonkeyMediaPlayer    *rb_shell_player_get_mm_player  (RBShellPlayer *shell_player);
 
+gboolean rb_player_action_handle_key (RBShellPlayer *player, guint keyval);
+
 gboolean	      rb_shell_player_get_playing (RBShellPlayer *shell_player);
 
 G_END_DECLS
diff -r -u shell/rb-shell.c rhythmbox.patched/shell/rb-shell.c
--- shell/rb-shell.c	2003-02-07 22:58:13.000000000 +0000
+++ rhythmbox.patched/shell/rb-shell.c	2003-02-08 21:45:28.000000000 +0000
@@ -223,6 +223,8 @@
 static void rb_shell_remote_cb (RBRemote *remote, RBRemoteCommand cmd,
 				RBShell *shell);
 #endif
+static int rb_window_key_press_cb (GtkWidget *win, GdkEventKey *event,
+                        gpointer user_data);
 
 static const GtkTargetEntry target_table[] =
 	{
@@ -883,6 +885,12 @@
 			  G_CALLBACK (rb_shell_window_delete_cb),
 			  shell);
 
+	/* Connect the keys */
+	gtk_widget_add_events (shell->priv->window, GDK_KEY_PRESS_MASK);
+	g_signal_connect (G_OBJECT(shell->priv->window), "key_press_event",
+			G_CALLBACK (rb_window_key_press_cb), 
+			shell);
+
 	shell->priv->echoarea = rb_echo_area_new ();
 
 	shell->priv->container = bonobo_window_get_ui_container (win);
@@ -2511,4 +2519,24 @@
 			break;
 	}
 }
-#endif
+#endif
+
+static int
+rb_window_key_press_cb (GtkWidget *win, GdkEventKey *event,
+                        gpointer user_data)
+{
+	RBShell *shell = RB_SHELL (user_data);
+
+	if (event->state != 0
+	            && ((event->state & GDK_CONTROL_MASK)
+	                || (event->state & GDK_MOD1_MASK)
+	                || (event->state & GDK_MOD3_MASK)
+	                || (event->state & GDK_MOD4_MASK)
+	                || (event->state & GDK_MOD5_MASK)))
+	{
+		return FALSE;
+	}
+
+	return rb_player_action_handle_key (shell->priv->player_shell, event->keyval);
+}
+
