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