From 8c3437fd2754c9aec761545a1a1e668ed6d07ea1 Mon Sep 17 00:00:00 2001 From: Havoc Pennington Date: Sat, 6 Jul 2002 16:50:48 +0000 Subject: [PATCH] put _NET_DESKTOP_NAMES in the array of atom names, so desktop names might 2002-07-06 Havoc Pennington * src/display.c (meta_display_open): put _NET_DESKTOP_NAMES in the array of atom names, so desktop names might work and we don't read uninitialized memory. * src/main.c (main): add VERSION/timestamp verbose message. * src/keybindings.c: implement cycle_windows cycle_panels * src/metacity.schemas.in: add the cycle_windows cycle_panels keybindings * src/prefs.h (META_KEYBINDING_FOCUS_PREVIOUS): replace FOCUS_PREVIOUS key binding with CYCLE_WINDOWS and CYCLE_PANELS (not good names really, but I don't have ideas). * src/common.h: add a grab op for alt+esc window cycling --- ChangeLog | 19 +++++ src/common.h | 5 ++ src/display.c | 11 ++- src/keybindings.c | 174 ++++++++++++++++++++-------------------- src/main.c | 13 ++- src/metacity.schemas.in | 39 +++++++-- src/prefs.c | 5 +- src/prefs.h | 6 +- src/tabpopup.c | 9 ++- 9 files changed, 177 insertions(+), 104 deletions(-) diff --git a/ChangeLog b/ChangeLog index a86286e1e..182e49f65 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,22 @@ +2002-07-06 Havoc Pennington + + * src/display.c (meta_display_open): put _NET_DESKTOP_NAMES in the + array of atom names, so desktop names might work and we don't read + uninitialized memory. + + * src/main.c (main): add VERSION/timestamp verbose message. + + * src/keybindings.c: implement cycle_windows cycle_panels + + * src/metacity.schemas.in: add the cycle_windows cycle_panels + keybindings + + * src/prefs.h (META_KEYBINDING_FOCUS_PREVIOUS): replace + FOCUS_PREVIOUS key binding with CYCLE_WINDOWS and CYCLE_PANELS + (not good names really, but I don't have ideas). + + * src/common.h: add a grab op for alt+esc window cycling + 2002-07-05 Havoc Pennington * src/themes/Makefile.am (THEMES): Take Gorilla out until it gets diff --git a/src/common.h b/src/common.h index d87933342..0cc643227 100644 --- a/src/common.h +++ b/src/common.h @@ -99,9 +99,14 @@ typedef enum META_GRAB_OP_KEYBOARD_RESIZING_SW, META_GRAB_OP_KEYBOARD_RESIZING_NW, + /* Alt+Tab */ META_GRAB_OP_KEYBOARD_TABBING_NORMAL, META_GRAB_OP_KEYBOARD_TABBING_DOCK, + /* Alt+Esc */ + META_GRAB_OP_KEYBOARD_ESCAPING_NORMAL, + META_GRAB_OP_KEYBOARD_ESCAPING_DOCK, + META_GRAB_OP_KEYBOARD_WORKSPACE_SWITCHING, /* Frame button ops */ diff --git a/src/display.c b/src/display.c index 04cfe95b1..04f17e8cb 100644 --- a/src/display.c +++ b/src/display.c @@ -226,7 +226,8 @@ meta_display_open (const char *name) "MULTIPLE", "TIMESTAMP", "VERSION", - "ATOM_PAIR" + "ATOM_PAIR", + "_NET_DESKTOP_NAMES" }; Atom atoms[G_N_ELEMENTS(atom_names)]; @@ -783,6 +784,8 @@ grab_op_is_keyboard (MetaGrabOp op) case META_GRAB_OP_KEYBOARD_RESIZING_NW: case META_GRAB_OP_KEYBOARD_TABBING_NORMAL: case META_GRAB_OP_KEYBOARD_TABBING_DOCK: + case META_GRAB_OP_KEYBOARD_ESCAPING_NORMAL: + case META_GRAB_OP_KEYBOARD_ESCAPING_DOCK: case META_GRAB_OP_KEYBOARD_WORKSPACE_SWITCHING: return TRUE; break; @@ -2297,11 +2300,13 @@ meta_display_begin_grab_op (MetaDisplay *display, switch (op) { case META_GRAB_OP_KEYBOARD_TABBING_NORMAL: + case META_GRAB_OP_KEYBOARD_ESCAPING_NORMAL: meta_screen_ensure_tab_popup (screen, META_TAB_LIST_NORMAL); break; case META_GRAB_OP_KEYBOARD_TABBING_DOCK: + case META_GRAB_OP_KEYBOARD_ESCAPING_DOCK: meta_screen_ensure_tab_popup (screen, META_TAB_LIST_DOCKS); break; @@ -2324,11 +2329,15 @@ void meta_display_end_grab_op (MetaDisplay *display, Time timestamp) { + meta_verbose ("Ending grab op %d at time %ld\n", display->grab_op, timestamp); + if (display->grab_op == META_GRAB_OP_NONE) return; if (display->grab_op == META_GRAB_OP_KEYBOARD_TABBING_NORMAL || display->grab_op == META_GRAB_OP_KEYBOARD_TABBING_DOCK || + display->grab_op == META_GRAB_OP_KEYBOARD_ESCAPING_NORMAL || + display->grab_op == META_GRAB_OP_KEYBOARD_ESCAPING_DOCK || display->grab_op == META_GRAB_OP_KEYBOARD_WORKSPACE_SWITCHING) { meta_ui_tab_popup_free (display->grab_screen->tab_popup); diff --git a/src/keybindings.c b/src/keybindings.c index b343b4543..3014cb0cd 100644 --- a/src/keybindings.c +++ b/src/keybindings.c @@ -50,7 +50,7 @@ static void handle_tab_forward (MetaDisplay *display, MetaWindow *window, XEvent *event, MetaKeyBinding *binding); -static void handle_focus_previous (MetaDisplay *display, +static void handle_cycle_forward (MetaDisplay *display, MetaWindow *window, XEvent *event, MetaKeyBinding *binding); @@ -184,8 +184,10 @@ static const MetaKeyHandler screen_handlers[] = { GINT_TO_POINTER (META_TAB_LIST_NORMAL) }, { META_KEYBINDING_SWITCH_PANELS, handle_tab_forward, GINT_TO_POINTER (META_TAB_LIST_DOCKS) }, - { META_KEYBINDING_FOCUS_PREVIOUS, handle_focus_previous, - NULL }, + { META_KEYBINDING_CYCLE_WINDOWS, handle_cycle_forward, + GINT_TO_POINTER (META_TAB_LIST_NORMAL) }, + { META_KEYBINDING_CYCLE_PANELS, handle_cycle_forward, + GINT_TO_POINTER (META_TAB_LIST_DOCKS) }, { META_KEYBINDING_SHOW_DESKTOP, handle_toggle_desktop, NULL }, { NULL, NULL, NULL } @@ -1188,11 +1190,14 @@ meta_display_process_key_event (MetaDisplay *display, case META_GRAB_OP_KEYBOARD_TABBING_NORMAL: case META_GRAB_OP_KEYBOARD_TABBING_DOCK: + case META_GRAB_OP_KEYBOARD_ESCAPING_NORMAL: + case META_GRAB_OP_KEYBOARD_ESCAPING_DOCK: meta_topic (META_DEBUG_KEYBINDINGS, - "Processing event for keyboard tabbing\n"); + "Processing event for keyboard tabbing/cycling\n"); g_assert (window != NULL); handled = process_tab_grab (display, window, event, keysym); break; + case META_GRAB_OP_KEYBOARD_WORKSPACE_SWITCHING: meta_topic (META_DEBUG_KEYBINDINGS, "Processing event for keyboard workspace switching\n"); @@ -1701,7 +1706,8 @@ process_tab_grab (MetaDisplay *display, { MetaScreen *screen; MetaKeyBindingAction action; - + gboolean popup_not_showing; + window = NULL; /* be sure we don't use this, it's irrelevant */ screen = display->grab_window->screen; @@ -1754,18 +1760,45 @@ process_tab_grab (MetaDisplay *display, action = meta_prefs_get_keybinding_action (keysym, display->grab_mask); + /* FIXME weird side effect here is that you can use the Escape + * key while tabbing, or the tab key while escaping + */ + + popup_not_showing = FALSE; switch (action) { + case META_KEYBINDING_ACTION_CYCLE_PANELS: + case META_KEYBINDING_ACTION_CYCLE_WINDOWS: + popup_not_showing = TRUE; + /* FALL THRU */ case META_KEYBINDING_ACTION_SWITCH_PANELS: case META_KEYBINDING_ACTION_SWITCH_WINDOWS: + meta_topic (META_DEBUG_KEYBINDINGS, + "Key pressed, moving tab focus in popup\n"); + if (event->xkey.state & ShiftMask) meta_ui_tab_popup_backward (screen->tab_popup); else meta_ui_tab_popup_forward (screen->tab_popup); - /* continue grab */ - meta_topic (META_DEBUG_KEYBINDINGS, - "Tab key pressed, moving tab focus in popup\n"); + if (popup_not_showing) + { + /* We can't actually change window focus, due to the grab. + * but raise the window. + */ + Window target_xwindow; + MetaWindow *target_window; + + target_xwindow = + (Window) meta_ui_tab_popup_get_selected (screen->tab_popup); + target_window = + meta_display_lookup_x_window (display, target_xwindow); + + if (target_window) + { + meta_window_raise (target_window); + } + } return TRUE; break; @@ -1775,7 +1808,7 @@ process_tab_grab (MetaDisplay *display, /* end grab */ meta_topic (META_DEBUG_KEYBINDINGS, - "Ending tabbing, uninteresting key pressed\n"); + "Ending tabbing/cycling, uninteresting key pressed\n"); return FALSE; } @@ -1997,7 +2030,7 @@ handle_activate_menu (MetaDisplay *display, } static MetaGrabOp -op_from_tab_type (MetaTabList type) +tab_op_from_tab_type (MetaTabList type) { switch (type) { @@ -2012,11 +2045,28 @@ op_from_tab_type (MetaTabList type) return 0; } +static MetaGrabOp +cycle_op_from_tab_type (MetaTabList type) +{ + switch (type) + { + case META_TAB_LIST_NORMAL: + return META_GRAB_OP_KEYBOARD_ESCAPING_NORMAL; + case META_TAB_LIST_DOCKS: + return META_GRAB_OP_KEYBOARD_ESCAPING_DOCK; + } + + g_assert_not_reached (); + + return 0; +} + static void -handle_tab_forward (MetaDisplay *display, - MetaWindow *event_window, - XEvent *event, - MetaKeyBinding *binding) +do_choose_window (MetaDisplay *display, + MetaWindow *event_window, + XEvent *event, + MetaKeyBinding *binding, + gboolean show_popup) { MetaWindow *window; MetaTabList type; @@ -2025,7 +2075,7 @@ handle_tab_forward (MetaDisplay *display, type = GPOINTER_TO_INT (binding->handler->data); meta_topic (META_DEBUG_KEYBINDINGS, - "Tab type = %d\n", type); + "Tab list = %d show_popup = %d\n", type, show_popup); /* backward if shift is down, this isn't configurable */ backward = (event->xkey.state & ShiftMask) != 0; @@ -2066,13 +2116,15 @@ handle_tab_forward (MetaDisplay *display, if (window) { meta_topic (META_DEBUG_KEYBINDINGS, - "Starting tab between windows, showing popup\n"); + "Starting tab/cycle between windows\n"); if (meta_display_begin_grab_op (window->display, window->screen, display->focus_window ? display->focus_window : window, - op_from_tab_type (type), + show_popup ? + tab_op_from_tab_type (type) : + cycle_op_from_tab_type (type), FALSE, 0, event->xkey.state & ~(display->ignored_modifier_mask), @@ -2081,84 +2133,32 @@ handle_tab_forward (MetaDisplay *display, { meta_ui_tab_popup_select (window->screen->tab_popup, (MetaTabEntryKey) window->xwindow); - /* only after selecting proper window */ - meta_ui_tab_popup_set_showing (window->screen->tab_popup, - TRUE); + + if (show_popup) + meta_ui_tab_popup_set_showing (window->screen->tab_popup, + TRUE); + else + meta_window_raise (window); } } } -static MetaWindow * -get_previous_focus_window (MetaDisplay *display, - MetaScreen *screen) +static void +handle_tab_forward (MetaDisplay *display, + MetaWindow *event_window, + XEvent *event, + MetaKeyBinding *binding) { - MetaWindow *window = NULL; - - /* get previously-focused window, front of list is currently - * focused window - */ - if (display->mru_list && - display->mru_list->next) - { - window = display->mru_list->next->data; - } - - if (window && - !meta_window_visible_on_workspace (window, - screen->active_workspace)) - { - window = NULL; - } - - if (window == NULL) - { - /* Pick first window in tab order */ - window = meta_display_get_tab_next (screen->display, - META_TAB_LIST_NORMAL, - screen, - screen->active_workspace, - NULL, - TRUE); - } - - if (window && - !meta_window_visible_on_workspace (window, - screen->active_workspace)) - { - window = NULL; - } - - return window; + do_choose_window (display, event_window, event, binding, TRUE); } static void -handle_focus_previous (MetaDisplay *display, - MetaWindow *event_window, - XEvent *event, - MetaKeyBinding *binding) +handle_cycle_forward (MetaDisplay *display, + MetaWindow *event_window, + XEvent *event, + MetaKeyBinding *binding) { - MetaWindow *window; - MetaScreen *screen; - - meta_topic (META_DEBUG_KEYBINDINGS, - "Focus previous window\n"); - - screen = meta_display_screen_for_root (display, - event->xkey.root); - - if (screen == NULL) - return; - - window = get_previous_focus_window (display, screen); - - if (window) - { - meta_window_raise (window); - meta_topic (META_DEBUG_FOCUS, - "Focusing %s due to 'focus previous' keybinding\n", - window->desc); - meta_window_focus (window, event->xkey.time); - } + do_choose_window (display, event_window, event, binding, FALSE); } static void @@ -2405,7 +2405,7 @@ handle_workspace_switch (MetaDisplay *display, meta_ui_tab_popup_select (screen->tab_popup, (MetaTabEntryKey) next); - /* only after selecting proper window */ + /* only after selecting proper space */ meta_ui_tab_popup_set_showing (screen->tab_popup, TRUE); } } diff --git a/src/main.c b/src/main.c index 913a23724..190c34edc 100644 --- a/src/main.c +++ b/src/main.c @@ -39,6 +39,7 @@ #include #include #include +#include static MetaExitCode meta_exit_code = META_EXIT_SUCCESS; static GMainLoop *meta_main_loop = NULL; @@ -98,6 +99,15 @@ main (int argc, char **argv) if (g_getenv ("METACITY_DEBUG")) meta_set_debugging (TRUE); meta_set_syncing (g_getenv ("METACITY_SYNC") != NULL); + + { + char buf[256]; + GDate d; + g_date_clear (&d, 1); + g_date_set_time (&d, time (NULL)); + g_date_strftime (buf, sizeof (buf), "%x", &d); + meta_verbose ("Metacity version %s running on %s\n", VERSION, buf); + } { const char *charset; @@ -105,7 +115,7 @@ main (int argc, char **argv) meta_verbose ("Running in locale \"%s\" with encoding \"%s\"\n", setlocale (LC_ALL, NULL), charset); } - + bindtextdomain (GETTEXT_PACKAGE, METACITY_LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); @@ -269,7 +279,6 @@ main (int argc, char **argv) g_log_set_handler ("GThread", G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION, log_handler, NULL); - #endif if (g_getenv ("METACITY_G_FATAL_WARNINGS") != NULL) diff --git a/src/metacity.schemas.in b/src/metacity.schemas.in index 60e3c34f9..abc1eaed5 100644 --- a/src/metacity.schemas.in +++ b/src/metacity.schemas.in @@ -729,7 +729,8 @@ you set Move focus between windows - The keybinding used to move focus between windows. + The keybinding used to move focus between windows, using + a popup window. (Traditionally <Alt>Tab) The format looks like "<Control>a" or @@ -754,7 +755,7 @@ you set Move focus between panels and the desktop The keybinding used to move focus between panels and - the desktop. + the desktop, using a popup window. The format looks like "<Control>a" or "<Shift><Alt>F1. @@ -769,16 +770,17 @@ you set - /schemas/apps/metacity/global_keybindings/focus_previous_window - /apps/metacity/global_keybindings/focus_previous_window + /schemas/apps/metacity/global_keybindings/cycle_windows + /apps/metacity/global_keybindings/cycle_windows metacity string <Alt>Escape - Move focus to the previously-focused window + Move focus between windows - The keybinding used to move focus back to the window which last - had the focus. + The keybinding used to move focus between windows without + a popup window. + (Traditionally <Alt>Escape) The format looks like "<Control>a" or "<Shift><Alt>F1. @@ -791,7 +793,30 @@ you set + + + /schemas/apps/metacity/global_keybindings/cycle_panels + /apps/metacity/global_keybindings/cycle_panels + metacity + string + <Control><Alt>Escape + + Move focus between panels and the desktop + + The keybinding used to move focus between panels and + the desktop, without a popup window. + 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. + + + /schemas/apps/metacity/global_keybindings/show_desktop diff --git a/src/prefs.c b/src/prefs.c index fdbc794f3..26fc4b21e 100644 --- a/src/prefs.c +++ b/src/prefs.c @@ -1,7 +1,7 @@ /* Metacity preferences */ /* - * Copyright (C) 2001 Havoc Pennington + * Copyright (C) 2001 Havoc Pennington, Copyright (C) 2002 Red Hat Inc. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -819,7 +819,8 @@ static MetaKeyPref screen_bindings[] = { { META_KEYBINDING_WORKSPACE_DOWN, 0, 0 }, { META_KEYBINDING_SWITCH_WINDOWS, 0, 0 }, { META_KEYBINDING_SWITCH_PANELS, 0, 0 }, - { META_KEYBINDING_FOCUS_PREVIOUS, 0, 0 }, + { META_KEYBINDING_CYCLE_WINDOWS, 0, 0 }, + { META_KEYBINDING_CYCLE_PANELS, 0, 0 }, { META_KEYBINDING_SHOW_DESKTOP, 0, 0 }, { NULL, 0, 0 } }; diff --git a/src/prefs.h b/src/prefs.h index c1ca58505..bcc93e78a 100644 --- a/src/prefs.h +++ b/src/prefs.h @@ -82,7 +82,8 @@ void meta_prefs_set_num_workspaces (int n_workspaces); #define META_KEYBINDING_WORKSPACE_DOWN "switch_to_workspace_down" #define META_KEYBINDING_SWITCH_WINDOWS "switch_windows" #define META_KEYBINDING_SWITCH_PANELS "switch_panels" -#define META_KEYBINDING_FOCUS_PREVIOUS "focus_previous_window" +#define META_KEYBINDING_CYCLE_WINDOWS "cycle_windows" +#define META_KEYBINDING_CYCLE_PANELS "cycle_panels" #define META_KEYBINDING_SHOW_DESKTOP "show_desktop" /* Window bindings */ @@ -134,7 +135,8 @@ typedef enum _MetaKeyBindingAction META_KEYBINDING_ACTION_WORKSPACE_DOWN, META_KEYBINDING_ACTION_SWITCH_WINDOWS, META_KEYBINDING_ACTION_SWITCH_PANELS, - META_KEYBINDING_ACTION_FOCUS_PREVIOUS, + META_KEYBINDING_ACTION_CYCLE_WINDOWS, + META_KEYBINDING_ACTION_CYCLE_PANELS, META_KEYBINDING_ACTION_SHOW_DESKTOP } MetaKeyBindingAction; diff --git a/src/tabpopup.c b/src/tabpopup.c index 6d5d283eb..daa65002f 100644 --- a/src/tabpopup.c +++ b/src/tabpopup.c @@ -299,9 +299,12 @@ meta_ui_tab_popup_set_showing (MetaTabPopup *popup, } else { - meta_verbose ("Hiding tab popup window\n"); - gtk_widget_hide (popup->window); - meta_core_increment_event_serial (gdk_display); + if (GTK_WIDGET_VISIBLE (popup->window)) + { + meta_verbose ("Hiding tab popup window\n"); + gtk_widget_hide (popup->window); + meta_core_increment_event_serial (gdk_display); + } } }