Implement server side move override
authorKristian Høgsberg <krh@bitplanet.net>
Thu, 5 Aug 2010 03:21:41 +0000 (23:21 -0400)
committerKristian Høgsberg <krh@bitplanet.net>
Thu, 5 Aug 2010 03:21:41 +0000 (23:21 -0400)
compositor.c
compositor.h

index 3af3566..da1a658 100644 (file)
@@ -783,9 +783,15 @@ notify_button(struct wlsc_input_device *device,
                        device->grab = WLSC_DEVICE_GRAB_NONE;
                }
 
-               wl_surface_post_event(&surface->base, &device->base,
-                                     WL_INPUT_DEVICE_BUTTON,
-                                     time, button, state);
+               if (state && button == BTN_LEFT &&
+                   device->grab == WLSC_DEVICE_GRAB_MOTION &&
+                   (device->modifier_state & MODIFIER_SUPER))
+                       shell_move(NULL, &compositor->shell,
+                                  &surface->base, device, time);
+               else
+                       wl_surface_post_event(&surface->base, &device->base,
+                                             WL_INPUT_DEVICE_BUTTON,
+                                             time, button, state);
 
                wlsc_compositor_schedule_repaint(compositor);
        }
@@ -795,11 +801,10 @@ void
 notify_key(struct wlsc_input_device *device,
           uint32_t time, uint32_t key, uint32_t state)
 {
-       struct wlsc_compositor *compositor = device->ec;
        uint32_t *k, *end;
        uint32_t modifier;
 
-       switch (key | compositor->modifier_state) {
+       switch (key | device->modifier_state) {
        case KEY_BACKSPACE | MODIFIER_CTRL | MODIFIER_ALT:
                kill(0, SIGTERM);
                return;
@@ -816,15 +821,20 @@ notify_key(struct wlsc_input_device *device,
                modifier = MODIFIER_ALT;
                break;
 
+       case KEY_LEFTMETA:
+       case KEY_RIGHTMETA:
+               modifier = MODIFIER_SUPER;
+               break;
+
        default:
                modifier = 0;
                break;
        }
 
        if (state)
-               compositor->modifier_state |= modifier;
+               device->modifier_state |= modifier;
        else
-               compositor->modifier_state &= ~modifier;
+               device->modifier_state &= ~modifier;
 
        end = device->keys.data + device->keys.size;
        for (k = device->keys.data; k < end; k++) {
index 7b42eb7..f1ffbd9 100644 (file)
@@ -82,6 +82,7 @@ struct wlsc_input_device {
        struct wlsc_surface *pointer_focus;
        struct wlsc_surface *keyboard_focus;
        struct wl_array keys;
+       uint32_t modifier_state;
 
        enum wlsc_grab_type grab;
        uint32_t grab_time;
@@ -121,7 +122,6 @@ struct wlsc_compositor {
        struct timespec previous_swap;
        uint32_t current_frame;
 
-       uint32_t modifier_state;
        uint32_t focus;
 
        void (*present)(struct wlsc_compositor *c);
@@ -129,6 +129,7 @@ struct wlsc_compositor {
 
 #define MODIFIER_CTRL  (1 << 8)
 #define MODIFIER_ALT   (1 << 9)
+#define MODIFIER_SUPER (1 << 10)
 
 struct wlsc_vector {
        GLfloat f[4];