From d6bcd7daa753673621f6bd7c36e4324fa2f8454a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Thu, 16 Feb 2012 15:53:46 -0500 Subject: [PATCH] window: Toggle maximized with super-f5 --- clients/window.c | 38 +++++++++++++++++++++++++++++++++++--- clients/window.h | 3 +++ 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/clients/window.c b/clients/window.c index ae5a7912..0dfd7f30 100644 --- a/clients/window.c +++ b/clients/window.c @@ -50,6 +50,7 @@ #endif #include +#include #include #include @@ -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 @@ -2172,6 +2182,28 @@ window_set_fullscreen(struct window *window, int fullscreen) window_schedule_resize(window, width, height); } +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) { diff --git a/clients/window.h b/clients/window.h index a199f6fb..fd6e57be 100644 --- a/clients/window.h +++ b/clients/window.h @@ -270,6 +270,9 @@ window_set_buffer_type(struct window *window, enum window_buffer_type type); 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);