swc

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

commit 2859b0b5be2a5f9eb7e15c45cfd7fe45bcc210bd
parent 415910cad2b7cfe198e70131266352785b37497b
Author: Michael Forney <mforney@mforney.org>
Date:   Fri, 21 Jun 2013 01:47:31 -0700

Add pointer handler

Diffstat:
Mcompositor.c | 44++++++++++++++++++++++++++++++++++++++++++++
Mpointer.h | 2+-
2 files changed, 45 insertions(+), 1 deletion(-)

diff --git a/compositor.c b/compositor.c @@ -105,7 +105,50 @@ struct swc_keyboard_handler keyboard_handler = { .key = &handle_key, }; +static void handle_focus(struct swc_pointer * pointer) +{ + struct swc_seat * seat; + struct swc_compositor * compositor; + struct swc_surface * surface; + int32_t surface_x, surface_y; + + wl_list_for_each(surface, &compositor->surfaces, link) + { + pixman_region32_t region; + + pixman_region32_init_rect + (&region, surface->geometry.x, surface->geometry.y, + surface->geometry.width, surface->geometry.height); + + surface_x = wl_fixed_to_int(pointer->x) - surface->geometry.x; + surface_y = wl_fixed_to_int(pointer->y) - surface->geometry.y; + + if (pixman_region32_contains_point(&surface->state.input, + surface_x, surface_y, NULL)) + { + swc_pointer_set_focus(pointer, surface); + return; + } + } + swc_pointer_set_focus(pointer, NULL); +} + +static bool handle_motion(struct swc_pointer * pointer, uint32_t time) +{ + struct swc_seat * seat; + struct swc_compositor * compositor; + + seat = wl_container_of(pointer, seat, pointer); + compositor = wl_container_of(seat, compositor, seat); + + return false; +} + +struct swc_pointer_handler pointer_handler = { + .focus = &handle_focus, + .motion = &handle_motion +}; /* XXX: maybe this should go in swc_drm */ static void handle_tty_event(struct wl_listener * listener, void * data) @@ -319,6 +362,7 @@ bool swc_compositor_initialize(struct swc_compositor * compositor, swc_seat_add_event_sources(&compositor->seat, event_loop); compositor->seat.keyboard.handler = &keyboard_handler; + compositor->seat.pointer.handler = &pointer_handler; /* TODO: configurable seat */ if (!swc_drm_initialize(&compositor->drm, compositor->udev, default_seat)) diff --git a/pointer.h b/pointer.h @@ -11,7 +11,7 @@ struct swc_pointer; struct swc_pointer_handler { void (* focus)(struct swc_pointer * pointer); - void (* motion)(struct swc_pointer * pointer, uint32_t time); + bool (* motion)(struct swc_pointer * pointer, uint32_t time); void (* button)(struct swc_pointer * pointer, uint32_t time, uint32_t button, uint32_t state); };