window: Toggle maximized with super-f5
authorKristian Høgsberg <krh@bitplanet.net>
Thu, 16 Feb 2012 20:53:46 +0000 (15:53 -0500)
committerKristian Høgsberg <krh@bitplanet.net>
Fri, 17 Feb 2012 04:19:38 +0000 (23:19 -0500)
clients/window.c
clients/window.h

index ae5a791..0dfd7f3 100644 (file)
@@ -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;
index a199f6f..fd6e57b 100644 (file)
@@ -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