mirror of
https://github.com/hyprwm/wlroots-hyprland.git
synced 2024-12-26 19:39:49 +01:00
Add focus change event for seats
This commit is contained in:
parent
50a8758313
commit
252bcce2f3
4 changed files with 44 additions and 1 deletions
|
@ -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.
|
||||
*/
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in a new issue