diff options
author | Kristian Høgsberg <krh@bitplanet.net> | 2012-02-16 15:53:46 -0500 |
---|---|---|
committer | Kristian Høgsberg <krh@bitplanet.net> | 2012-02-16 23:19:38 -0500 |
commit | d6bcd7daa753673621f6bd7c36e4324fa2f8454a (patch) | |
tree | e9fdfecfc672f960ecec1bfa4ea7f77597e37fa7 /clients | |
parent | 96879dfe5213c3ff3fcc6719a629f3eba18a5bc4 (diff) |
window: Toggle maximized with super-f5
Diffstat (limited to 'clients')
-rw-r--r-- | clients/window.c | 38 | ||||
-rw-r--r-- | clients/window.h | 3 |
2 files changed, 38 insertions, 3 deletions
diff --git a/clients/window.c b/clients/window.c index ae5a791..0dfd7f3 100644 --- a/clients/window.c +++ b/clients/window.c @@ -50,6 +50,7 @@ #endif #include <X11/extensions/XKBcommon.h> +#include <X11/X.h> #include <linux/input.h> #include <wayland-client.h> @@ -99,6 +100,7 @@ struct display { enum { TYPE_TOPLEVEL, TYPE_FULLSCREEN, + TYPE_MAXIMIZED, TYPE_TRANSIENT, TYPE_MENU, TYPE_CUSTOM @@ -790,6 +792,9 @@ window_set_type(struct window *window) case TYPE_FULLSCREEN: wl_shell_surface_set_fullscreen(window->shell_surface); break; + case TYPE_MAXIMIZED: + wl_shell_surface_set_maximized(window->shell_surface, NULL); + break; case TYPE_TOPLEVEL: wl_shell_surface_set_toplevel(window->shell_surface); break; @@ -1566,9 +1571,14 @@ input_handle_key(void *data, struct wl_input_device *input_device, else input->modifiers &= ~d->xkb->map->modmap[code]; - if (window->key_handler) - (*window->key_handler)(window, input, time, key, sym, state, - window->user_data); + if (key == KEY_F5 && input->modifiers == Mod4Mask) { + if (state) + window_set_maximized(window, + window->type != TYPE_MAXIMIZED); + } else if (window->key_handler) { + (*window->key_handler)(window, input, time, key, + sym, state, window->user_data); + } } static void @@ -2173,6 +2183,28 @@ window_set_fullscreen(struct window *window, int fullscreen) } void +window_set_maximized(struct window *window, int maximized) +{ + if (!window->display->shell) + return; + + if ((window->type == TYPE_MAXIMIZED) == maximized) + return; + + if (window->type == TYPE_TOPLEVEL) { + window->saved_allocation = window->allocation; + wl_shell_surface_set_maximized(window->shell_surface, NULL); + window->type = TYPE_MAXIMIZED; + } else { + wl_shell_surface_set_toplevel(window->shell_surface); + window->type = TYPE_TOPLEVEL; + window_schedule_resize(window, + window->saved_allocation.width, + window->saved_allocation.height); + } +} + +void window_set_user_data(struct window *window, void *data) { window->user_data = data; diff --git a/clients/window.h b/clients/window.h index a199f6f..fd6e57b 100644 --- a/clients/window.h +++ b/clients/window.h @@ -271,6 +271,9 @@ void window_set_fullscreen(struct window *window, int fullscreen); void +window_set_maximized(struct window *window, int maximized); + +void window_set_custom(struct window *window); void |