diff --git a/include/wlr/types/wlr_seat.h b/include/wlr/types/wlr_seat.h index b3c02cf2..d850ba52 100644 --- a/include/wlr/types/wlr_seat.h +++ b/include/wlr/types/wlr_seat.h @@ -146,6 +146,10 @@ struct wlr_seat_pointer_state { uint32_t grab_time; struct wl_listener surface_destroy; + + struct { + struct wl_signal focus_change; + } events; }; // TODO: May be useful to be able to simulate keyboard input events @@ -164,6 +168,10 @@ struct wlr_seat_keyboard_state { struct wlr_seat_keyboard_grab *grab; struct wlr_seat_keyboard_grab *default_grab; + + struct { + struct wl_signal focus_change; + } events; }; struct wlr_seat_touch_state { @@ -238,6 +246,20 @@ struct wlr_seat_pointer_request_set_cursor_event { int32_t hotspot_x, hotspot_y; }; +struct wlr_seat_pointer_focus_change_event { + struct wlr_seat *seat; + struct wlr_surface *old_surface, *new_surface; + double sx, sy; +}; + +struct wlr_seat_keyboard_focus_change_event { + struct wlr_seat *seat; + struct wlr_surface *old_surface, *new_surface; + size_t num_keycodes; + uint32_t *keycodes; + struct wlr_keyboard_modifiers *modifiers; +}; + /** * Allocates a new wlr_seat and adds a wl_seat global to the display. */ diff --git a/types/seat/wlr_seat.c b/types/seat/wlr_seat.c index 2e7da0a4..c4da29e2 100644 --- a/types/seat/wlr_seat.c +++ b/types/seat/wlr_seat.c @@ -225,6 +225,8 @@ struct wlr_seat *wlr_seat_create(struct wl_display *display, const char *name) { seat->pointer_state.default_grab = pointer_grab; seat->pointer_state.grab = pointer_grab; + wl_signal_init(&seat->pointer_state.events.focus_change); + // keyboard state struct wlr_seat_keyboard_grab *keyboard_grab = calloc(1, sizeof(struct wlr_seat_keyboard_grab)); @@ -241,6 +243,8 @@ struct wlr_seat *wlr_seat_create(struct wl_display *display, const char *name) { seat->keyboard_state.seat = seat; wl_list_init(&seat->keyboard_state.surface_destroy.link); + wl_signal_init(&seat->keyboard_state.events.focus_change); + // touch state struct wlr_seat_touch_grab *touch_grab = calloc(1, sizeof(struct wlr_seat_touch_grab)); diff --git a/types/seat/wlr_seat_keyboard.c b/types/seat/wlr_seat_keyboard.c index e8ea300e..4f95b265 100644 --- a/types/seat/wlr_seat_keyboard.c +++ b/types/seat/wlr_seat_keyboard.c @@ -291,6 +291,16 @@ void wlr_seat_keyboard_enter(struct wlr_seat *seat, // as it targets seat->keyboard_state.focused_client wlr_seat_keyboard_send_modifiers(seat, modifiers); } + + struct wlr_seat_keyboard_focus_change_event event = { + .seat = seat, + .new_surface = surface, + .old_surface = focused_surface, + .num_keycodes = num_keycodes, + .keycodes = keycodes, + .modifiers = modifiers, + }; + wlr_signal_emit_safe(&seat->keyboard_state.events.focus_change, &event); } void wlr_seat_keyboard_notify_enter(struct wlr_seat *seat, diff --git a/types/seat/wlr_seat_pointer.c b/types/seat/wlr_seat_pointer.c index 899fb64f..d6df0365 100644 --- a/types/seat/wlr_seat_pointer.c +++ b/types/seat/wlr_seat_pointer.c @@ -183,7 +183,14 @@ void wlr_seat_pointer_enter(struct wlr_seat *wlr_seat, wlr_seat->pointer_state.focused_client = client; wlr_seat->pointer_state.focused_surface = surface; - // TODO: send focus change event + struct wlr_seat_pointer_focus_change_event event = { + .seat = wlr_seat, + .new_surface = surface, + .old_surface = focused_surface, + .sx = sx, + .sy = sy, + }; + wlr_signal_emit_safe(&wlr_seat->pointer_state.events.focus_change, &event); } void wlr_seat_pointer_clear_focus(struct wlr_seat *wlr_seat) {