swc

Unnamed repository; edit this file 'description' to name the repository.
git clone git://git.nihaljere.xyz/swc
Log | Files | Refs | README | LICENSE

commit fe96140aa0d435fdd4448ffcf958ec7d78cf8069
parent ea14d0f6eba92f49a96ac056e5343d5a114318e5
Author: Michael Forney <mforney@mforney.org>
Date:   Sat, 16 Aug 2014 21:31:29 -0700

Add screen enter event

Diffstat:
Mexample/wm.c | 8++++++++
Mlibswc/screen.c | 35+++++++++++++++++++++++++++++++++++
Mlibswc/swc.c | 4++++
Mlibswc/swc.h | 5+++++
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