commit fe96140

Michael Forney  ·  2014-08-17 04:31:29 +0000 UTC
parent ea14d0f
Add screen enter event
4 files changed,  +52, -0
+8, -0
 1@@ -137,8 +137,16 @@ static void screen_usable_geometry_changed(void * data)
 2     arrange(screen);
 3 }
 4 
 5+static void screen_entered(void * data)
 6+{
 7+    struct screen * screen = data;
 8+
 9+    active_screen = screen;
10+}
11+
12 static const struct swc_screen_handler screen_handler = {
13     .usable_geometry_changed = &screen_usable_geometry_changed,
14+    .entered = &screen_entered,
15 };
16 
17 static void window_destroy(void * data)
+35, -0
 1@@ -27,6 +27,7 @@
 2 #include "internal.h"
 3 #include "mode.h"
 4 #include "output.h"
 5+#include "pointer.h"
 6 #include "util.h"
 7 #include "protocol/swc-server-protocol.h"
 8 
 9@@ -35,8 +36,16 @@
10 
11 #define INTERNAL(s) ((struct screen *) (s))
12 
13+static struct screen * active_screen;
14 static const struct swc_screen_handler null_handler;
15 
16+static bool handle_motion(struct pointer_handler * handler, uint32_t time,
17+                          wl_fixed_t x, wl_fixed_t y);
18+
19+struct pointer_handler screens_pointer_handler = {
20+    .motion = &handle_motion
21+};
22+
23 EXPORT
24 void swc_screen_set_handler(struct swc_screen * base,
25                             const struct swc_screen_handler * handler,
26@@ -156,6 +165,8 @@ void screen_destroy(struct screen * screen)
27 {
28     struct swc_output * output, * next;
29 
30+    if (active_screen == screen)
31+        active_screen = NULL;
32     if (screen->handler->destroy)
33         screen->handler->destroy(screen->handler_data);
34     wl_signal_emit(&screen->destroy_signal, NULL);
35@@ -203,3 +214,27 @@ void screen_update_usable_geometry(struct screen * screen)
36     }
37 }
38 
39+bool handle_motion(struct pointer_handler * handler, uint32_t time,
40+                   wl_fixed_t fx, wl_fixed_t fy)
41+{
42+    struct screen * screen;
43+    int32_t x = wl_fixed_to_int(fx), y = wl_fixed_to_int(fy);
44+
45+    wl_list_for_each(screen, &swc.screens, link)
46+    {
47+        if (swc_rectangle_contains_point(&screen->base.geometry, x, y))
48+        {
49+            if (screen != active_screen)
50+            {
51+                active_screen = screen;
52+
53+                if (screen->handler->entered)
54+                    screen->handler->entered(screen->handler_data);
55+            }
56+            break;
57+        }
58+    }
59+
60+    return false;
61+}
62+
+4, -0
 1@@ -51,6 +51,8 @@ extern struct swc_shm swc_shm;
 2 extern struct swc_xserver swc_xserver;
 3 #endif
 4 
 5+extern struct pointer_handler screens_pointer_handler;
 6+
 7 struct swc swc = {
 8     .launch = &swc_launch,
 9     .seat = &swc_seat,
10@@ -73,6 +75,8 @@ static void setup_compositor()
11                    &swc.bindings->keyboard_handler->link);
12     wl_list_insert(&swc.seat->pointer->handlers,
13                    &swc.compositor->pointer_handler->link);
14+    wl_list_insert(&swc.seat->pointer->handlers,
15+                   &screens_pointer_handler.link);
16     wl_signal_add(&swc.seat->pointer->focus.event_signal,
17                   &window_enter_listener);
18 
+5, -0
 1@@ -62,6 +62,11 @@ struct swc_screen_handler
 2      * within this area.
 3      */
 4     void (* usable_geometry_changed)(void * data);
 5+
 6+    /**
 7+     * Called when the pointer enters the screen.
 8+     */
 9+    void (* entered)(void * data);
10 };
11 
12 struct swc_screen