diff -u metacity-2.8.5/src/keybindings.c metacity-2.8.5new/src/keybindings.c
--- metacity-2.8.5/src/keybindings.c	2004-08-30 08:14:25.000000000 +0200
+++ metacity-2.8.5new/src/keybindings.c	2004-09-30 19:03:28.289395556 +0200
@@ -184,6 +184,11 @@
                                        MetaWindow     *window,
                                        XEvent         *event,
                                        MetaKeyBinding *binding);
+static void handle_run_terminal       (MetaDisplay    *display,
+                                       MetaScreen     *screen,
+                                       MetaWindow     *window,
+                                       XEvent         *event,
+                                       MetaKeyBinding *binding);
 
 /* debug */
 static void handle_spew_mark          (MetaDisplay *display,
@@ -357,6 +362,8 @@
     GINT_TO_POINTER (32) },
   { META_KEYBINDING_COMMAND_WIN_SCREENSHOT, handle_run_command,
     GINT_TO_POINTER (33) },
+  { META_KEYBINDING_RUN_COMMAND_TERMINAL, handle_run_terminal,
+    NULL },
   { NULL, NULL, NULL }
 };
   
@@ -2483,23 +2490,17 @@
 }
 
 static void
-error_on_command (int         command_index,
-                  const char *command,
-                  const char *message,
-                  int         screen_number,
-                  Time        timestamp)
+error_on_generic_command (const char *key,
+                          const char *command,
+                          const char *message,
+                          int         screen_number,
+                          Time        timestamp)
 {
   GError *err;
   char *argv[10];
-  char *key;
   char numbuf[32];
   char timestampbuf[32];
   
-  meta_warning ("Error on command %d \"%s\": %s\n",
-                command_index, command, message);  
-
-  key = meta_prefs_get_gconf_key_for_command (command_index);
-
   sprintf (numbuf, "%d", screen_number);
   sprintf (timestampbuf, "%lu", timestamp);
   
@@ -2530,10 +2531,41 @@
                     err->message);
       g_error_free (err);
     }
+}
+
+static void
+error_on_command (int         command_index,
+                  const char *command,
+                  const char *message,
+                  int         screen_number,
+                  Time        timestamp)
+{
+  char *key;
+  
+  meta_warning ("Error on command %d \"%s\": %s\n",
+                command_index, command, message);  
+
+  key = meta_prefs_get_gconf_key_for_command (command_index);
+
+  error_on_generic_command (key, command, message, screen_number, timestamp);
   
   g_free (key);
 }
 
+error_on_terminal_command (const char *command,
+                           const char *message,
+                           int         screen_number,
+                           Time        timestamp)
+{
+  char *key;
+  
+  meta_warning ("Error on terminal command \"%s\": %s\n", command, message);  
+
+  key = meta_prefs_get_gconf_key_for_terminal_command ();
+
+  error_on_generic_command (key, command, message, screen_number, timestamp);
+}
+
 static void
 set_display_setup_func (void *data)
 {
@@ -3396,3 +3428,40 @@
   meta_topic (META_DEBUG_KEYBINDINGS,
               "Keybindings %s\n", all_bindings_disabled ? "disabled" : "enabled");
 }
+
+static void
+handle_run_terminal (MetaDisplay    *display,
+                     MetaScreen     *screen,
+                     MetaWindow     *window,
+                     XEvent         *event,
+                     MetaKeyBinding *binding)
+{
+  const char *command;
+  GError *err;
+  
+  command = meta_prefs_get_terminal_command ();
+
+  if (command == NULL)
+    {
+      char *s;
+
+      meta_topic (META_DEBUG_KEYBINDINGS,
+                  "No terminal command to run in response to "
+		  "keybinding press\n");
+      
+      s = g_strdup_printf (_("No terminal command has been defined.\n"));
+      error_on_terminal_command (NULL, s, screen->number, event->xkey.time);
+      g_free (s);
+      
+      return;
+    }
+
+  err = NULL;
+  if (!meta_spawn_command_line_async_on_screen (command, screen, &err))
+    {
+      error_on_terminal_command (command, err->message, screen->number,
+		      		 event->xkey.time);
+      
+      g_error_free (err);
+    }
+}
diff -u metacity-2.8.5/src/metacity.schemas.in metacity-2.8.5new/src/metacity.schemas.in
--- metacity-2.8.5/src/metacity.schemas.in	2004-09-30 19:27:47.978550044 +0200
+++ metacity-2.8.5new/src/metacity.schemas.in	2004-09-30 19:13:12.742260642 +0200
@@ -1750,6 +1750,29 @@
     </schema>
 
     <schema>
+      <key>/schemas/apps/metacity/global_keybindings/run_command_terminal</key>
+      <applyto>/apps/metacity/global_keybindings/run_command_terminal</applyto>
+      <owner>metacity</owner>
+      <type>string</type>
+      <default>disabled</default>
+      <locale name="C">
+         <short>Run a terminal</short>
+         <long>
+          The keybinding which invokes a terminal.
+
+          The format looks like "&lt;Control&gt;a" or
+          "&lt;Shift&gt;&lt;Alt&gt;F1".
+
+          The parser is fairly liberal and allows lower or upper case,
+          and also abbreviations such as "&lt;Ctl&gt;" and
+          "&lt;Ctrl&gt;". If you set the option to the special string
+          "disabled", then there will be no keybinding for this
+          action.
+         </long>
+      </locale>
+    </schema>
+
+    <schema>
       <key>/schemas/apps/metacity/global_keybindings/run_command</key>
       <applyto>/apps/metacity/global_keybindings/run_command_1</applyto>
       <applyto>/apps/metacity/global_keybindings/run_command_2</applyto>
Seulement dans metacity-2.8.5new/src/: metacity-theme-viewer
Seulement dans metacity-2.8.5new/src/: place.o
diff -u metacity-2.8.5/src/prefs.c metacity-2.8.5new/src/prefs.c
--- metacity-2.8.5/src/prefs.c	2004-09-30 19:27:47.801563141 +0200
+++ metacity-2.8.5new/src/prefs.c	2004-09-30 19:13:12.565273701 +0200
@@ -55,6 +55,9 @@
 #define KEY_RAISE_ON_CLICK "/apps/metacity/general/raise_on_click"
 
 #define KEY_COMMAND_PREFIX "/apps/metacity/keybinding_commands/command_"
+
+#define KEY_TERMINAL_COMMAND "/desktop/gnome/applications/terminal/exec"
+
 #define KEY_SCREEN_BINDINGS_PREFIX "/apps/metacity/global_keybindings"
 #define KEY_WINDOW_BINDINGS_PREFIX "/apps/metacity/window_keybindings"
 
@@ -107,6 +110,8 @@
 /* The screenshot commands are at the end */
 static char *commands[MAX_COMMANDS] = { NULL, };
 
+static char *terminal_command = NULL;
+
 static char *workspace_names[MAX_REASONABLE_WORKSPACES] = { NULL, };
 
 #ifdef HAVE_GCONF
@@ -133,6 +138,7 @@
                                            const char  *value);
 static gboolean update_command            (const char  *name,
                                            const char  *value);
+static gboolean update_terminal_command   (const char *value);
 static gboolean update_workspace_name     (const char  *name,
                                            const char  *value);
 static gboolean update_reduced_resources  (gboolean     value);
@@ -402,6 +408,12 @@
 				    &err);
   cleanup_error (&err);
   update_reduced_resources (bool_val);
+
+  str_val = gconf_client_get_string (default_client, KEY_TERMINAL_COMMAND,
+                                     &err);
+  cleanup_error (&err);
+  update_terminal_command (str_val);
+  g_free (str_val);
 #endif /* HAVE_GCONF */
   
   /* Load keybindings prefs */
@@ -419,6 +431,11 @@
                            NULL,
                            NULL,
                            &err);
+  gconf_client_notify_add (default_client, KEY_TERMINAL_COMMAND,
+                           change_notify,
+                           NULL,
+                           NULL,
+                           &err);
   cleanup_error (&err);  
 #endif /* HAVE_GCONF */
 }
@@ -702,6 +719,22 @@
       if (update_command (key, str))
         queue_changed (META_PREF_COMMANDS);
     }
+  else if (strcmp (key, KEY_TERMINAL_COMMAND) == 0)
+    {
+      const char *str;
+
+      if (value && value->type != GCONF_VALUE_STRING)
+        {
+          meta_warning (_("GConf key \"%s\" is set to an invalid type\n"),
+                        KEY_TERMINAL_COMMAND);
+          goto out;
+        }
+      
+      str = value ? gconf_value_get_string (value) : NULL;
+
+      if (update_terminal_command (str))
+        queue_changed (META_PREF_TERMINAL_COMMAND);
+    }
   else if (str_has_prefix (key, KEY_WORKSPACE_NAME_PREFIX))
     {
       const char *str;
@@ -1371,6 +1404,9 @@
     case META_PREF_COMMANDS:
       return "COMMANDS";
 
+    case META_PREF_TERMINAL_COMMAND:
+      return "TERMINAL_COMMAND";
+
     case META_PREF_BUTTON_LAYOUT:
       return "BUTTON_LAYOUT";
       break;
@@ -1493,6 +1529,7 @@
   { META_KEYBINDING_COMMAND_32, 0, 0, FALSE },
   { META_KEYBINDING_COMMAND_SCREENSHOT, 0, 0, FALSE },
   { META_KEYBINDING_COMMAND_WIN_SCREENSHOT, 0, 0, FALSE },
+  { META_KEYBINDING_RUN_COMMAND_TERMINAL, 0, 0, FALSE },
   { NULL, 0, 0, FALSE}
 };
 
@@ -1812,6 +1849,31 @@
   
   return TRUE;
 }
+
+static gboolean
+update_terminal_command (const char *value)
+{
+  char *old_terminal_command;
+  gboolean changed;
+  
+  old_terminal_command = terminal_command;
+  
+  if (value != NULL && *value)
+    {
+      terminal_command = g_strdup (value);
+    }
+
+  changed = TRUE;
+  if ((old_terminal_command && terminal_command &&
+       strcmp (old_terminal_command, terminal_command) == 0) ||
+      (old_terminal_command == NULL && terminal_command == NULL))
+    changed = FALSE;
+
+  if (old_terminal_command != terminal_command)
+    g_free (old_terminal_command);
+
+  return changed;
+}
 #endif /* HAVE_GCONF */
 
 const char*
@@ -1843,6 +1905,18 @@
   return key;
 }
 
+const char*
+meta_prefs_get_terminal_command (void)
+{
+  return terminal_command;
+}
+
+const char*
+meta_prefs_get_gconf_key_for_terminal_command (void)
+{
+  return KEY_TERMINAL_COMMAND;
+}
+
 #ifdef HAVE_GCONF
 static gboolean
 update_workspace_name (const char  *name,
diff -u metacity-2.8.5/src/prefs.h metacity-2.8.5new/src/prefs.h
--- metacity-2.8.5/src/prefs.h	2004-09-30 19:27:47.803562993 +0200
+++ metacity-2.8.5new/src/prefs.h	2004-09-30 19:13:12.567273554 +0200
@@ -41,6 +41,7 @@
   META_PREF_SCREEN_KEYBINDINGS,
   META_PREF_DISABLE_WORKAROUNDS,
   META_PREF_COMMANDS,
+  META_PREF_TERMINAL_COMMAND,
   META_PREF_BUTTON_LAYOUT,
   META_PREF_WORKSPACE_NAMES,
   META_PREF_VISUAL_BELL,
@@ -78,6 +79,9 @@
 
 char*                       meta_prefs_get_gconf_key_for_command (int i);
 
+const char*                 meta_prefs_get_terminal_command   (void);
+const char*                 meta_prefs_get_gconf_key_for_terminal_command (void);
+
 void                        meta_prefs_get_button_layout (MetaButtonLayout *button_layout);
 MetaActionDoubleClickTitlebar meta_prefs_get_action_double_click_titlebar (void);
 
@@ -149,6 +153,7 @@
 #define META_KEYBINDING_COMMAND_32               "run_command_32"
 #define META_KEYBINDING_COMMAND_SCREENSHOT       "run_command_screenshot"
 #define META_KEYBINDING_COMMAND_WIN_SCREENSHOT   "run_command_window_screenshot"
+#define META_KEYBINDING_RUN_COMMAND_TERMINAL     "run_command_terminal"
 
 /* Window bindings */
 #define META_KEYBINDING_WINDOW_MENU              "activate_window_menu"
