commit 49e0968

Michael Forney  ·  2013-06-21 07:16:46 +0000 UTC
parent f72c996
surface: Handle input region correctly
1 files changed,  +13, -3
+13, -3
 1@@ -4,13 +4,18 @@
 2 
 3 #include <stdio.h>
 4 
 5+static pixman_box32_t infinite_extents = {
 6+    .x1 = INT32_MIN, .y1 = INT32_MIN,
 7+    .x2 = INT32_MAX, .y2 = INT32_MAX
 8+};
 9+
10 static void state_initialize(struct swc_surface_state * state)
11 {
12     state->buffer = NULL;
13 
14     pixman_region32_init(&state->damage);
15     pixman_region32_init(&state->opaque);
16-    pixman_region32_init(&state->input);
17+    pixman_region32_init_with_extents(&state->input, &infinite_extents);
18 
19     wl_list_init(&state->frame_callbacks);
20 }
21@@ -112,7 +117,7 @@ static void set_input_region(struct wl_client * client,
22         pixman_region32_copy(&surface->pending.state.input, &region->region);
23     }
24     else
25-        pixman_region32_clear(&surface->pending.state.input);
26+        pixman_region32_reset(&surface->pending.state.input, &infinite_extents);
27 }
28 
29 static void commit(struct wl_client * client, struct wl_resource * resource)
30@@ -138,6 +143,12 @@ static void commit(struct wl_client * client, struct wl_resource * resource)
31                                    surface->geometry.width,
32                                    surface->geometry.height);
33 
34+    /* Input */
35+    pixman_region32_copy(&surface->state.input, &surface->pending.state.input);
36+    pixman_region32_intersect_rect(&surface->state.input,
37+                                   &surface->state.input, 0, 0,
38+                                   surface->geometry.width,
39+                                   surface->geometry.height);
40 
41     wl_list_insert_list(&surface->state.frame_callbacks,
42                         &surface->pending.state.frame_callbacks);
43@@ -145,7 +156,6 @@ static void commit(struct wl_client * client, struct wl_resource * resource)
44     /* Reset pending state */
45     pixman_region32_clear(&surface->pending.state.damage);
46     pixman_region32_clear(&surface->pending.state.opaque);
47-    pixman_region32_clear(&surface->pending.state.input);
48     surface->pending.state.buffer = surface->state.buffer;
49     wl_list_init(&surface->pending.state.frame_callbacks);
50