diff options
author | Vincent Untz <vincent@vuntz.net> | 2004-10-13 08:32:10 +0000 |
---|---|---|
committer | Vincent Untz <vuntz@src.gnome.org> | 2004-10-13 08:32:10 +0000 |
commit | b03558dc4dae223a4d4222d628f7b91caddcc566 (patch) | |
tree | d9024e857c587d4d6f66886d7c15dd09d4168cea /src | |
parent | 278b5807f1c53fe7efe1c78ef1647138ff107dff (diff) | |
download | metacity-b03558dc4dae223a4d4222d628f7b91caddcc566.tar.gz |
Add a keybinding to launch a terminal
2004-10-13 Vincent Untz <vincent@vuntz.net>
Add a keybinding to launch a terminal
* src/keybindings.c: (handle_run_terminal): new function,
(error_on_generic_command): new function, (error_on_command): wrapper
around error_on_generic_command(), (error_on_terminal_command): new
function
* src/metacity.schemas.in: add run_command_terminal key
* src/prefs.[ch]: (meta_prefs_init): cache the terminal command and
register a gconf callback to update it, (change_notify): handle the
notification of terminal command changes, (meta_preference_to_string):
add the terminal command case, (update_terminal_command): new function,
(meta_prefs_get_terminal_command): new function,
(meta_prefs_get_gconf_key_for_terminal_command): new function
Diffstat (limited to 'src')
-rw-r--r-- | src/keybindings.c | 91 | ||||
-rw-r--r-- | src/metacity.schemas.in | 23 | ||||
-rw-r--r-- | src/prefs.c | 74 | ||||
-rw-r--r-- | src/prefs.h | 5 |
4 files changed, 182 insertions, 11 deletions
diff --git a/src/keybindings.c b/src/keybindings.c index 8013982d..5dc9e1f2 100644 --- a/src/keybindings.c +++ b/src/keybindings.c @@ -184,6 +184,11 @@ static void handle_maximize_horiz (MetaDisplay *display, 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 @@ static const MetaKeyHandler screen_handlers[] = { 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 @@ handle_activate_workspace (MetaDisplay *display, } 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 @@ error_on_command (int command_index, 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) { @@ -3409,3 +3441,40 @@ meta_set_keybindings_disabled (gboolean setting) 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 --git a/src/metacity.schemas.in b/src/metacity.schemas.in index 0e833a2e..37e70623 100644 --- a/src/metacity.schemas.in +++ b/src/metacity.schemas.in @@ -1736,6 +1736,29 @@ you set </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 "<Control>a" or + "<Shift><Alt>F1". + + The parser is fairly liberal and allows lower or upper case, + and also abbreviations such as "<Ctl>" and + "<Ctrl>". 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> diff --git a/src/prefs.c b/src/prefs.c index df6168d7..655ba1ee 100644 --- a/src/prefs.c +++ b/src/prefs.c @@ -54,6 +54,9 @@ #define KEY_REDUCED_RESOURCES "/apps/metacity/general/reduced_resources" #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" @@ -105,6 +108,8 @@ static MetaButtonLayout button_layout = { /* 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 @@ -130,6 +135,7 @@ static gboolean update_binding (MetaKeyPref *binding, 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); @@ -395,6 +401,12 @@ meta_prefs_init (void) &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 */ @@ -412,6 +424,11 @@ meta_prefs_init (void) NULL, NULL, &err); + gconf_client_notify_add (default_client, KEY_TERMINAL_COMMAND, + change_notify, + NULL, + NULL, + &err); cleanup_error (&err); #endif /* HAVE_GCONF */ } @@ -679,6 +696,22 @@ change_notify (GConfClient *client, 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; @@ -1335,6 +1368,9 @@ meta_preference_to_string (MetaPreference pref) case META_PREF_COMMANDS: return "COMMANDS"; + case META_PREF_TERMINAL_COMMAND: + return "TERMINAL_COMMAND"; + case META_PREF_BUTTON_LAYOUT: return "BUTTON_LAYOUT"; break; @@ -1457,6 +1493,7 @@ static MetaKeyPref screen_bindings[] = { { 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} }; @@ -1776,6 +1813,31 @@ update_command (const char *name, 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* @@ -1807,6 +1869,18 @@ meta_prefs_get_gconf_key_for_command (int i) 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 --git a/src/prefs.h b/src/prefs.h index 815b998c..8da00da5 100644 --- a/src/prefs.h +++ b/src/prefs.h @@ -41,6 +41,7 @@ typedef enum 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, @@ -76,6 +77,9 @@ const char* meta_prefs_get_command (int i); 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); @@ -147,6 +151,7 @@ void meta_prefs_change_workspace_name (int i, #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" |