summaryrefslogtreecommitdiff
path: root/clients
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@bitplanet.net>2012-02-16 15:53:46 -0500
committerKristian Høgsberg <krh@bitplanet.net>2012-02-16 23:19:38 -0500
commitd6bcd7daa753673621f6bd7c36e4324fa2f8454a (patch)
treee9fdfecfc672f960ecec1bfa4ea7f77597e37fa7 /clients
parent96879dfe5213c3ff3fcc6719a629f3eba18a5bc4 (diff)
window: Toggle maximized with super-f5
Diffstat (limited to 'clients')
-rw-r--r--clients/window.c38
-rw-r--r--clients/window.h3
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