From bf6dd82a1c687fb15a46cf8248bf5006b317f211 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberts=20Muktup=C4=81vels?= Date: Wed, 15 Apr 2015 14:44:54 +0300 Subject: keybindings: add toggle-tile-left/right bindings Having keybindings for side-by-side tiling has been requested for a long time, so add this support now. https://bugzilla.gnome.org/show_bug.cgi?id=648700 Based on mutter commit: https://git.gnome.org/browse/mutter/commit/?id=34f6ffd1ad0d3b7369120a9802d84517748fe887 --- src/50-metacity-windows.xml.in | 8 +++++ src/core/keybindings.c | 57 +++++++++++++++++++++++++++++++++++ src/include/prefs.h | 2 ++ src/org.gnome.metacity.gschema.xml.in | 9 ++++++ 4 files changed, 76 insertions(+) diff --git a/src/50-metacity-windows.xml.in b/src/50-metacity-windows.xml.in index daf60f9e..af4d2658 100644 --- a/src/50-metacity-windows.xml.in +++ b/src/50-metacity-windows.xml.in @@ -38,5 +38,13 @@ + + + + diff --git a/src/core/keybindings.c b/src/core/keybindings.c index 81b06493..5a4ed568 100644 --- a/src/core/keybindings.c +++ b/src/core/keybindings.c @@ -46,6 +46,7 @@ #endif #define SCHEMA_COMMON_KEYBINDINGS "org.gnome.desktop.wm.keybindings" +#define SCHEMA_METACITY_KEYBINDINGS "org.gnome.metacity.keybindings" static gboolean all_bindings_disabled = FALSE; @@ -2881,6 +2882,48 @@ handle_toggle_above (MetaDisplay *display, meta_window_make_above (window); } +static void +handle_toggle_tiled (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *window, + XEvent *event, + MetaKeyBinding *binding, + gpointer dummy) +{ + const MetaXineramaScreenInfo *monitor; + MetaTileMode mode = binding->handler->data; + + monitor = meta_screen_get_current_xinerama (window->screen); + + if ((META_WINDOW_TILED_LEFT (window) && mode == META_TILE_LEFT) || + (META_WINDOW_TILED_RIGHT (window) && mode == META_TILE_RIGHT)) + { + window->tile_monitor_number = window->saved_maximize ? monitor->number + : -1; + window->tile_mode = window->saved_maximize ? META_TILE_MAXIMIZED + : META_TILE_NONE; + + if (window->saved_maximize) + meta_window_maximize (window, META_MAXIMIZE_VERTICAL | + META_MAXIMIZE_HORIZONTAL); + else + meta_window_unmaximize (window, META_MAXIMIZE_VERTICAL | + META_MAXIMIZE_HORIZONTAL); + } + else if (meta_window_can_tile_side_by_side (window)) + { + window->tile_monitor_number = monitor->number; + window->tile_mode = mode; + /* Maximization constraints beat tiling constraints, so if the window + * is maximized, tiling won't have any effect unless we unmaximize it + * horizontally first; rather than calling meta_window_unmaximize(), + * we just set the flag and rely on meta_window_tile() syncing it to + * save an additional roundtrip. */ + window->maximized_horizontally = FALSE; + meta_window_tile (window); + } +} + static void handle_toggle_maximized (MetaDisplay *display, MetaScreen *screen, @@ -3486,6 +3529,20 @@ init_builtin_key_bindings (MetaDisplay *display) META_KEYBINDING_ACTION_TOGGLE_MAXIMIZED, (MetaKeyHandlerFunc) handle_toggle_maximized, 0); + add_builtin_keybinding (display, + "toggle-tiled-left", + SCHEMA_METACITY_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_TOGGLE_TILED_LEFT, + handle_toggle_tiled, META_TILE_LEFT); + + add_builtin_keybinding (display, + "toggle-tiled-right", + SCHEMA_METACITY_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_TOGGLE_TILED_RIGHT, + handle_toggle_tiled, META_TILE_RIGHT); + add_builtin_keybinding (display, "toggle-above", SCHEMA_COMMON_KEYBINDINGS, diff --git a/src/include/prefs.h b/src/include/prefs.h index 6ce6fd39..1cfaa031 100644 --- a/src/include/prefs.h +++ b/src/include/prefs.h @@ -186,6 +186,8 @@ typedef enum _MetaKeyBindingAction META_KEYBINDING_ACTION_ACTIVATE_WINDOW_MENU, META_KEYBINDING_ACTION_TOGGLE_FULLSCREEN, META_KEYBINDING_ACTION_TOGGLE_MAXIMIZED, + META_KEYBINDING_ACTION_TOGGLE_TILED_LEFT, + META_KEYBINDING_ACTION_TOGGLE_TILED_RIGHT, META_KEYBINDING_ACTION_TOGGLE_ABOVE, META_KEYBINDING_ACTION_MAXIMIZE, META_KEYBINDING_ACTION_UNMAXIMIZE, diff --git a/src/org.gnome.metacity.gschema.xml.in b/src/org.gnome.metacity.gschema.xml.in index 94628d02..23a893be 100644 --- a/src/org.gnome.metacity.gschema.xml.in +++ b/src/org.gnome.metacity.gschema.xml.in @@ -72,4 +72,13 @@ + + + Left']]]> + + + Right']]]> + + + -- cgit v1.2.1