commit ce14c72

Michael Forney  ·  2014-02-27 04:07:07 +0000 UTC
parent 9eefeab
pointer: Pass button press structure to pointer handler
3 files changed,  +24, -18
+20, -14
 1@@ -155,19 +155,18 @@ void pointer_set_cursor(struct pointer * pointer, uint32_t id)
 2     view_attach(&pointer->cursor.view, pointer->cursor.internal_buffer);
 3 }
 4 
 5-static bool client_handle_button(struct pointer_handler * handler,
 6-                                 uint32_t time, uint32_t button, uint32_t state)
 7+static bool client_handle_button
 8+    (struct pointer_handler * handler, uint32_t time,
 9+     struct press * press, uint32_t state)
10 {
11     struct pointer * pointer
12         = CONTAINER_OF(handler, typeof(*pointer), client_handler);
13-    uint32_t serial;
14 
15     if (!pointer->focus.resource)
16         return false;
17 
18-    serial = wl_display_get_serial(swc.display);
19-    wl_pointer_send_button(pointer->focus.resource, serial, time,
20-                           button, state);
21+    wl_pointer_send_button(pointer->focus.resource, press->serial, time,
22+                           press->value, state);
23 
24     return true;
25 }
26@@ -364,27 +363,34 @@ void pointer_handle_button(struct pointer * pointer, uint32_t time,
27         {
28             if (button->press.value == value)
29             {
30-                swc_array_remove(&pointer->buttons, button, sizeof *button);
31-
32-                if (button->handler->button)
33+                if (button->handler)
34                 {
35+                    button->press.serial = serial;
36                     button->handler->button(button->handler, time,
37-                                            value, state);
38+                                            &button->press, state);
39                 }
40 
41+                swc_array_remove(&pointer->buttons, button, sizeof *button);
42                 break;
43             }
44         }
45     }
46     else
47     {
48+        button = wl_array_add(&pointer->buttons, sizeof *button);
49+
50+        if (!button)
51+            return;
52+
53+        button->press.value = value;
54+        button->press.serial = serial;
55+        button->handler = NULL;
56+
57         wl_list_for_each(handler, &pointer->handlers, link)
58         {
59-            if (handler->button && handler->button(handler, time, value, state))
60+            if (handler->button && handler->button(handler, time,
61+                                                   &button->press, state))
62             {
63-                button = wl_array_add(&pointer->buttons, sizeof *button);
64-                button->press.value = value;
65-                button->press.serial = serial;
66                 button->handler = handler;
67                 break;
68             }
+1, -1
1@@ -42,7 +42,7 @@ struct pointer_handler
2     bool (* motion)(struct pointer_handler * handler, uint32_t time,
3                     wl_fixed_t x, wl_fixed_t y);
4     bool (* button)(struct pointer_handler * handler, uint32_t time,
5-                    uint32_t button, uint32_t state);
6+                    struct press * press, uint32_t state);
7     bool (* axis)(struct pointer_handler * handler, uint32_t time,
8                   enum wl_pointer_axis axis, wl_fixed_t amount);
9 
+3, -3
 1@@ -204,7 +204,7 @@ static bool resize_motion(struct pointer_handler * handler, uint32_t time,
 2 }
 3 
 4 static bool handle_button(struct pointer_handler * handler, uint32_t time,
 5-                          uint32_t button, uint32_t state)
 6+                          struct press * press, uint32_t state)
 7 {
 8     struct window_pointer_interaction * interaction
 9         = CONTAINER_OF(handler, typeof(*interaction), handler);
10@@ -215,8 +215,8 @@ static bool handle_button(struct pointer_handler * handler, uint32_t time,
11         return false;
12     }
13 
14-    interaction->original_handler->button
15-        (interaction->original_handler, time, button, state);
16+    interaction->original_handler->button(interaction->original_handler, time,
17+                                          press, state);
18     wl_list_remove(&handler->link);
19 
20     return true;