commit fe96140aa0d435fdd4448ffcf958ec7d78cf8069
parent ea14d0f6eba92f49a96ac056e5343d5a114318e5
Author: Michael Forney <mforney@mforney.org>
Date: Sat, 16 Aug 2014 21:31:29 -0700
Add screen enter event
Diffstat:
4 files changed, 52 insertions(+), 0 deletions(-)
diff --git a/example/wm.c b/example/wm.c
@@ -137,8 +137,16 @@ static void screen_usable_geometry_changed(void * data)
arrange(screen);
}
+static void screen_entered(void * data)
+{
+ struct screen * screen = data;
+
+ active_screen = screen;
+}
+
static const struct swc_screen_handler screen_handler = {
.usable_geometry_changed = &screen_usable_geometry_changed,
+ .entered = &screen_entered,
};
static void window_destroy(void * data)
diff --git a/libswc/screen.c b/libswc/screen.c
@@ -27,6 +27,7 @@
#include "internal.h"
#include "mode.h"
#include "output.h"
+#include "pointer.h"
#include "util.h"
#include "protocol/swc-server-protocol.h"
@@ -35,8 +36,16 @@
#define INTERNAL(s) ((struct screen *) (s))
+static struct screen * active_screen;
static const struct swc_screen_handler null_handler;
+static bool handle_motion(struct pointer_handler * handler, uint32_t time,
+ wl_fixed_t x, wl_fixed_t y);
+
+struct pointer_handler screens_pointer_handler = {
+ .motion = &handle_motion
+};
+
EXPORT
void swc_screen_set_handler(struct swc_screen * base,
const struct swc_screen_handler * handler,
@@ -156,6 +165,8 @@ void screen_destroy(struct screen * screen)
{
struct swc_output * output, * next;
+ if (active_screen == screen)
+ active_screen = NULL;
if (screen->handler->destroy)
screen->handler->destroy(screen->handler_data);
wl_signal_emit(&screen->destroy_signal, NULL);
@@ -203,3 +214,27 @@ void screen_update_usable_geometry(struct screen * screen)
}
}
+bool handle_motion(struct pointer_handler * handler, uint32_t time,
+ wl_fixed_t fx, wl_fixed_t fy)
+{
+ struct screen * screen;
+ int32_t x = wl_fixed_to_int(fx), y = wl_fixed_to_int(fy);
+
+ wl_list_for_each(screen, &swc.screens, link)
+ {
+ if (swc_rectangle_contains_point(&screen->base.geometry, x, y))
+ {
+ if (screen != active_screen)
+ {
+ active_screen = screen;
+
+ if (screen->handler->entered)
+ screen->handler->entered(screen->handler_data);
+ }
+ break;
+ }
+ }
+
+ return false;
+}
+
diff --git a/libswc/swc.c b/libswc/swc.c
@@ -51,6 +51,8 @@ extern struct swc_shm swc_shm;
extern struct swc_xserver swc_xserver;
#endif
+extern struct pointer_handler screens_pointer_handler;
+
struct swc swc = {
.launch = &swc_launch,
.seat = &swc_seat,
@@ -73,6 +75,8 @@ static void setup_compositor()
&swc.bindings->keyboard_handler->link);
wl_list_insert(&swc.seat->pointer->handlers,
&swc.compositor->pointer_handler->link);
+ wl_list_insert(&swc.seat->pointer->handlers,
+ &screens_pointer_handler.link);
wl_signal_add(&swc.seat->pointer->focus.event_signal,
&window_enter_listener);
diff --git a/libswc/swc.h b/libswc/swc.h
@@ -62,6 +62,11 @@ struct swc_screen_handler
* within this area.
*/
void (* usable_geometry_changed)(void * data);
+
+ /**
+ * Called when the pointer enters the screen.
+ */
+ void (* entered)(void * data);
};
struct swc_screen