commit 57bad52

Michael Forney  ·  2014-08-16 23:18:59 +0000 UTC
parent a42aa95
window: Only allow pointer interactions when in STACKED mode
2 files changed,  +47, -18
+45, -18
  1@@ -63,15 +63,38 @@ static void begin_interaction(struct window_pointer_interaction * interaction,
  2 {
  3     if (button)
  4     {
  5+        /* Store the serial of the button press so we are able to cancel the
  6+         * interaction if the window changes from stacked mode. */
  7+        interaction->serial = button->press.serial;
  8         interaction->original_handler = button->handler;
  9         button->handler = &interaction->handler;
 10     }
 11     else
 12         interaction->original_handler = NULL;
 13 
 14+    interaction->active = true;
 15     wl_list_insert(&swc.seat->pointer->handlers, &interaction->handler.link);
 16 }
 17 
 18+static void end_interaction(struct window_pointer_interaction * interaction)
 19+{
 20+    if (!interaction->active)
 21+        return;
 22+
 23+    if (interaction->original_handler)
 24+    {
 25+        struct button * button;
 26+
 27+        button = pointer_get_button(swc.seat->pointer, interaction->serial);
 28+        interaction->original_handler->button(interaction->original_handler,
 29+                                              swc_time(), &button->press,
 30+                                              WL_POINTER_BUTTON_STATE_RELEASED);
 31+    }
 32+
 33+    interaction->active = false;
 34+    wl_list_remove(&interaction->handler.link);
 35+}
 36+
 37 EXPORT
 38 void swc_window_set_handler(struct swc_window * base,
 39                             const struct swc_window_handler * handler,
 40@@ -140,6 +163,8 @@ void swc_window_set_tiled(struct swc_window * base)
 41 {
 42     struct window * window = INTERNAL(base);
 43 
 44+    end_interaction(&window->move.interaction);
 45+    end_interaction(&window->resize.interaction);
 46     if (window->impl->set_mode)
 47         window->impl->set_mode(window, WINDOW_MODE_TILED);
 48     window->mode = WINDOW_MODE_TILED;
 49@@ -200,35 +225,27 @@ void swc_window_set_border(struct swc_window * window,
 50 }
 51 
 52 EXPORT
 53-void swc_window_begin_move(struct swc_window * base)
 54+void swc_window_begin_move(struct swc_window * window)
 55 {
 56-    struct window * window = (struct window *) base;
 57-
 58-    window_begin_move(window, NULL);
 59+    window_begin_move(INTERNAL(window), NULL);
 60 }
 61 
 62 EXPORT
 63-void swc_window_end_move(struct swc_window * base)
 64+void swc_window_end_move(struct swc_window * window)
 65 {
 66-    struct window * window = (struct window *) base;
 67-
 68-    wl_list_remove(&window->move.interaction.handler.link);
 69+    end_interaction(&INTERNAL(window)->move.interaction);
 70 }
 71 
 72 EXPORT
 73-void swc_window_begin_resize(struct swc_window * base, uint32_t edges)
 74+void swc_window_begin_resize(struct swc_window * window, uint32_t edges)
 75 {
 76-    struct window * window = (struct window *) base;
 77-
 78-    window_begin_resize(window, edges, NULL);
 79+    window_begin_resize(INTERNAL(window), edges, NULL);
 80 }
 81 
 82 EXPORT
 83-void swc_window_end_resize(struct swc_window * base)
 84+void swc_window_end_resize(struct swc_window * window)
 85 {
 86-    struct window * window = (struct window *) base;
 87-
 88-    wl_list_remove(&window->resize.interaction.handler.link);
 89+    end_interaction(&INTERNAL(window)->resize.interaction);
 90 }
 91 
 92 static bool move_motion(struct pointer_handler * handler, uint32_t time,
 93@@ -263,10 +280,9 @@ static bool handle_button(struct pointer_handler * handler, uint32_t time,
 94         return false;
 95     }
 96 
 97+    end_interaction(interaction);
 98     interaction->original_handler->button(interaction->original_handler, time,
 99                                           press, state);
100-    wl_list_remove(&handler->link);
101-
102     return true;
103 }
104 
105@@ -287,10 +303,12 @@ bool window_initialize(struct window * window, const struct window_impl * impl,
106     window->view->window = window;
107     window->managed = false;
108     window->mode = WINDOW_MODE_STACKED;
109+    window->move.interaction.active = false;
110     window->move.interaction.handler = (struct pointer_handler) {
111         .motion = &move_motion,
112         .button = &handle_button
113     };
114+    window->resize.interaction.active = false;
115     window->resize.interaction.handler = (struct pointer_handler) {
116         .motion = &resize_motion,
117         .button = &handle_button
118@@ -362,6 +380,9 @@ void window_set_parent(struct window * window, struct window * parent)
119 
120 void window_begin_move(struct window * window, struct button * button)
121 {
122+    if (window->mode != WINDOW_MODE_STACKED || window->move.interaction.active)
123+        return;
124+
125     struct swc_rectangle * geometry = &window->view->base.geometry;
126     int32_t px = wl_fixed_to_int(swc.seat->pointer->x),
127             py = wl_fixed_to_int(swc.seat->pointer->y);
128@@ -374,6 +395,12 @@ void window_begin_move(struct window * window, struct button * button)
129 void window_begin_resize(struct window * window, uint32_t edges,
130                          struct button * button)
131 {
132+    if (window->mode != WINDOW_MODE_STACKED
133+        || window->resize.interaction.active)
134+    {
135+        return;
136+    }
137+
138     begin_interaction(&window->resize.interaction, button);
139 
140     if (!edges)
+2, -0
1@@ -32,6 +32,8 @@
2 
3 struct window_pointer_interaction
4 {
5+    bool active;
6+    uint32_t serial;
7     struct pointer_handler handler, * original_handler;
8 };
9