Index: actions/acme.h
===================================================================
--- actions/acme.h	(revision 386)
+++ actions/acme.h	(working copy)
@@ -52,7 +52,8 @@
 static struct {
         int key_type;
         const char *gconf_key;
-        Key *key;
+        /* a GList of Key * */
+        GList *key_list;
 } keys[HANDLED_KEYS] = {
         { MUTE_KEY, GCONF_BINDING_DIR "/volume_mute",NULL },
         { VOLUME_DOWN_KEY, GCONF_BINDING_DIR "/volume_down", NULL },
Index: gsd-media-keys-manager.c
===================================================================
--- gsd-media-keys-manager.c	(revision 386)
+++ gsd-media-keys-manager.c	(working copy)
@@ -270,6 +270,71 @@
 }
 
 static void
+grab_one_key (GsdMediaKeysManager *manager, const char *value, guint i)
+{
+	Key  *key;
+
+	if (!is_valid_shortcut (value)) {
+		g_debug ("Not a valid shortcut: '%s'", value);
+		return;
+	}
+
+	key = g_new0 (Key, 1);
+	if (!egg_accelerator_parse_virtual (value, &key->keysym, &key->keycode, &key->state)
+	    || key->keycode == 0) {
+		g_debug ("Unable to parse: '%s'", value);
+
+		g_free (key);
+		return;
+	}
+	/* avoid grabbing all the keyboard when KeyCode cannot be retrieved */
+	if (key->keycode == AnyKey)  {
+		g_warning ("The shortcut key \"%s\" cannot be found on the current system, ignoring the binding", value);
+
+		g_free (key);
+		return;
+	}
+
+	keys[i].key_list = g_list_append (keys[i].key_list, key);
+
+	grab_key (key, TRUE, manager->priv->screens);
+}
+
+static GList *
+get_key_list (GConfClient *client, const char *key)
+{
+	GConfValue *value;
+	GList *list;
+
+	value = gconf_client_get (client, key, NULL);
+	if (value == NULL)
+		return NULL;
+
+	list = NULL;
+
+	if (value->type == GCONF_VALUE_STRING) {
+		GList *list;
+		char *tmp;
+
+		tmp = g_strdup (gconf_value_get_string (value));
+		list = g_list_append (NULL, tmp);
+	} else if (value->type == GCONF_VALUE_LIST && gconf_value_get_list_type (value) == GCONF_VALUE_STRING) {
+		GSList *l;
+		GList *list;
+
+		l = gconf_value_get_list (value);
+		list = NULL;
+		for ( ; l != NULL; l = l->next)
+			list = g_list_prepend (list, g_strdup (l->data));
+		list = g_list_reverse (list);
+	}
+
+	gconf_value_free (value);
+
+	return list;
+}
+
+static void
 update_kbd_cb (GConfClient         *client,
                guint                id,
                GConfEntry          *entry,
@@ -283,34 +348,20 @@
         for (i = 0; i < HANDLED_KEYS; i++) {
                 if (strcmp (entry->key, keys[i].gconf_key) == 0) {
                         char *tmp;
-                        Key  *key;
+			GList *l;
 
-                        if (keys[i].key != NULL) {
-                                grab_key (keys[i].key, FALSE, manager->priv->screens);
-                        }
+			for (l = keys[i].key_list; l != NULL; l = l->next) {
+				grab_key ((Key *) l->data, FALSE, manager->priv->screens);
+				g_free (l->data);
+			}
+			g_list_free (keys[i].key_list);
+			keys[i].key_list = NULL;
 
-                        g_free (keys[i].key);
-                        keys[i].key = NULL;
-
                         tmp = gconf_client_get_string (manager->priv->conf_client,
                                                        keys[i].gconf_key, NULL);
 
-                        if (is_valid_shortcut (tmp) == FALSE) {
-                                g_free (tmp);
-                                break;
-                        }
+			grab_one_key (manager, tmp, i);
 
-                        key = g_new0 (Key, 1);
-                        if (egg_accelerator_parse_virtual (tmp, &key->keysym, &key->keycode, &key->state) == FALSE
-                            || key->keycode == 0) {
-                                g_free (tmp);
-                                g_free (key);
-                                break;
-                        }
-
-                        grab_key (key, TRUE, manager->priv->screens);
-                        keys[i].key = key;
-
                         g_free (tmp);
 
                         break;
@@ -321,13 +372,12 @@
 static void
 init_kbd (GsdMediaKeysManager *manager)
 {
-        int i;
+        guint i;
 
         gnome_settings_profile_start (NULL);
 
         for (i = 0; i < HANDLED_KEYS; i++) {
                 char *tmp;
-                Key  *key;
 
                 manager->priv->notify[i] =
                         gconf_client_notify_add (manager->priv->conf_client,
@@ -340,34 +390,10 @@
                 tmp = gconf_client_get_string (manager->priv->conf_client,
                                                keys[i].gconf_key,
                                                NULL);
-                if (!is_valid_shortcut (tmp)) {
-                        g_debug ("Not a valid shortcut: '%s'", tmp);
-                        g_free (tmp);
-                        continue;
-                }
 
-                key = g_new0 (Key, 1);
-                if (!egg_accelerator_parse_virtual (tmp, &key->keysym, &key->keycode, &key->state)
-                    || key->keycode == 0) {
-                        g_debug ("Unable to parse: '%s'", tmp);
+                grab_one_key (manager, tmp, i);
 
-                        g_free (tmp);
-                        g_free (key);
-                        continue;
-                }
-                /* avoid grabbing all the keyboard when KeyCode cannot be retrieved */
-                if (key->keycode == AnyKey)  {
-                        g_warning ("The shortcut key \"%s\" cannot be found on the current system, ignoring the binding", tmp);
-                        g_free (tmp);
-                        g_free (key);
-                        continue;
-                }
-
                 g_free (tmp);
-
-                keys[i].key = key;
-
-                grab_key (key, TRUE, manager->priv->screens);
         }
 
         gnome_settings_profile_end (NULL);
@@ -851,6 +877,18 @@
         return NULL;
 }
 
+static gboolean
+match_key_list (GList *key_list, XEvent *xev)
+{
+	GList *l;
+
+	for (l = key_list; l != NULL; l = l->next) {
+		if (match_key ((Key *) l->data, xev) != FALSE)
+			return TRUE;
+	}
+	return FALSE;
+}
+
 static GdkFilterReturn
 acme_filter_events (GdkXEvent           *xevent,
                     GdkEvent            *event,
@@ -866,7 +904,7 @@
         }
 
         for (i = 0; i < HANDLED_KEYS; i++) {
-                if (match_key (keys[i].key, xev)) {
+                if (match_key_list (keys[i].key_list, xev)) {
                         switch (keys[i].key_type) {
                         case VOLUME_DOWN_KEY:
                         case VOLUME_UP_KEY:
@@ -976,8 +1014,9 @@
         }
 
         for (i = 0; i < HANDLED_KEYS; ++i) {
-                g_free (keys[i].key);
-                keys[i].key = NULL;
+        	g_list_foreach (keys[i].key_list, (GFunc) g_free, NULL);
+        	g_list_free (keys[i].key_list);
+                keys[i].key_list = NULL;
         }
 
         if (priv->volume) {
