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