diff --git a/include/wlr/types/wlr_data_device.h b/include/wlr/types/wlr_data_device.h index 256654e55..966669456 100644 --- a/include/wlr/types/wlr_data_device.h +++ b/include/wlr/types/wlr_data_device.h @@ -12,6 +12,8 @@ #include #include +struct wlr_surface_2; + extern const struct wlr_pointer_grab_interface wlr_data_device_pointer_drag_interface; @@ -93,7 +95,7 @@ struct wlr_drag; struct wlr_drag_icon { struct wlr_drag *drag; - struct wlr_surface *surface; + struct wlr_surface_2 *surface; bool mapped; struct { @@ -102,6 +104,7 @@ struct wlr_drag_icon { struct wl_signal destroy; } events; + struct wl_listener surface_commit; struct wl_listener surface_destroy; void *data; @@ -124,7 +127,7 @@ struct wlr_drag { struct wlr_seat_client *focus_client; struct wlr_drag_icon *icon; // can be NULL - struct wlr_surface *focus; // can be NULL + struct wlr_surface_2 *focus; // can be NULL struct wlr_data_source *source; // can be NULL bool started, dropped, cancelling; @@ -187,13 +190,13 @@ void wlr_seat_set_selection(struct wlr_seat *seat, * `wlr_seat_request_start_drag`. */ struct wlr_drag *wlr_drag_create(struct wlr_seat_client *seat_client, - struct wlr_data_source *source, struct wlr_surface *icon_surface); + struct wlr_data_source *source, struct wlr_surface_2 *icon_surface); /** * Requests a drag to be started on the seat. */ void wlr_seat_request_start_drag(struct wlr_seat *seat, struct wlr_drag *drag, - struct wlr_surface *origin, uint32_t serial); + struct wlr_surface_2 *origin, uint32_t serial); /** * Starts a drag on the seat. This starts an implicit keyboard grab, but doesn't diff --git a/include/wlr/types/wlr_seat.h b/include/wlr/types/wlr_seat.h index 0724136b4..32568e9e4 100644 --- a/include/wlr/types/wlr_seat.h +++ b/include/wlr/types/wlr_seat.h @@ -13,7 +13,8 @@ #include #include #include -#include + +struct wlr_surface_2; /** * Contains state for a single client's bound wl_seat resource and can be used @@ -39,10 +40,10 @@ struct wlr_seat_client { struct wlr_touch_point { int32_t touch_id; - struct wlr_surface *surface; + struct wlr_surface_2 *surface; struct wlr_seat_client *client; - struct wlr_surface *focus_surface; + struct wlr_surface_2 *focus_surface; struct wlr_seat_client *focus_client; double sx, sy; @@ -60,7 +61,7 @@ struct wlr_seat_pointer_grab; struct wlr_pointer_grab_interface { void (*enter)(struct wlr_seat_pointer_grab *grab, - struct wlr_surface *surface, double sx, double sy); + struct wlr_surface_2 *surface, double sx, double sy); void (*motion)(struct wlr_seat_pointer_grab *grab, uint32_t time_msec, double sx, double sy); uint32_t (*button)(struct wlr_seat_pointer_grab *grab, uint32_t time_msec, @@ -76,7 +77,7 @@ struct wlr_seat_keyboard_grab; struct wlr_keyboard_grab_interface { void (*enter)(struct wlr_seat_keyboard_grab *grab, - struct wlr_surface *surface, uint32_t keycodes[], + struct wlr_surface_2 *surface, uint32_t keycodes[], size_t num_keycodes, struct wlr_keyboard_modifiers *modifiers); void (*key)(struct wlr_seat_keyboard_grab *grab, uint32_t time_msec, uint32_t key, uint32_t state); @@ -134,7 +135,7 @@ struct wlr_seat_pointer_grab { struct wlr_seat_pointer_state { struct wlr_seat *seat; struct wlr_seat_client *focused_client; - struct wlr_surface *focused_surface; + struct wlr_surface_2 *focused_surface; double sx, sy; struct wlr_seat_pointer_grab *grab; @@ -158,7 +159,7 @@ struct wlr_seat_keyboard_state { struct wlr_keyboard *keyboard; struct wlr_seat_client *focused_client; - struct wlr_surface *focused_surface; + struct wlr_surface_2 *focused_surface; struct wl_listener keyboard_destroy; struct wl_listener keyboard_keymap; @@ -250,7 +251,7 @@ struct wlr_seat { struct wlr_seat_pointer_request_set_cursor_event { struct wlr_seat_client *seat_client; - struct wlr_surface *surface; + struct wlr_surface_2 *surface; uint32_t serial; int32_t hotspot_x, hotspot_y; }; @@ -267,19 +268,19 @@ struct wlr_seat_request_set_primary_selection_event { struct wlr_seat_request_start_drag_event { struct wlr_drag *drag; - struct wlr_surface *origin; + struct wlr_surface_2 *origin; uint32_t serial; }; struct wlr_seat_pointer_focus_change_event { struct wlr_seat *seat; - struct wlr_surface *old_surface, *new_surface; + struct wlr_surface_2 *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; + struct wlr_surface_2 *old_surface, *new_surface; }; /** @@ -312,7 +313,7 @@ void wlr_seat_set_name(struct wlr_seat *wlr_seat, const char *name); * Whether or not the surface has pointer focus */ bool wlr_seat_pointer_surface_has_focus(struct wlr_seat *wlr_seat, - struct wlr_surface *surface); + struct wlr_surface_2 *surface); /** * Send a pointer enter event to the given surface and consider it to be the @@ -322,7 +323,7 @@ bool wlr_seat_pointer_surface_has_focus(struct wlr_seat *wlr_seat, * focus to respect pointer grabs. */ void wlr_seat_pointer_enter(struct wlr_seat *wlr_seat, - struct wlr_surface *surface, double sx, double sy); + struct wlr_surface_2 *surface, double sx, double sy); /** * Clear the focused surface for the pointer and leave all entered surfaces. @@ -382,7 +383,7 @@ void wlr_seat_pointer_end_grab(struct wlr_seat *wlr_seat); * where the enter occurred. */ void wlr_seat_pointer_notify_enter(struct wlr_seat *wlr_seat, - struct wlr_surface *surface, double sx, double sy); + struct wlr_surface_2 *surface, double sx, double sy); /** * Notify the seat of motion over the given surface. Pass surface-local @@ -474,7 +475,7 @@ void wlr_seat_keyboard_notify_modifiers(struct wlr_seat *seat, * keyboard. */ void wlr_seat_keyboard_notify_enter(struct wlr_seat *seat, - struct wlr_surface *surface, uint32_t keycodes[], size_t num_keycodes, + struct wlr_surface_2 *surface, uint32_t keycodes[], size_t num_keycodes, struct wlr_keyboard_modifiers *modifiers); /** @@ -485,7 +486,7 @@ void wlr_seat_keyboard_notify_enter(struct wlr_seat *seat, * keyboard grabs. */ void wlr_seat_keyboard_enter(struct wlr_seat *seat, - struct wlr_surface *surface, uint32_t keycodes[], size_t num_keycodes, + struct wlr_surface_2 *surface, uint32_t keycodes[], size_t num_keycodes, struct wlr_keyboard_modifiers *modifiers); /** @@ -523,7 +524,7 @@ struct wlr_touch_point *wlr_seat_touch_get_point(struct wlr_seat *seat, * the touch device. */ uint32_t wlr_seat_touch_notify_down(struct wlr_seat *seat, - struct wlr_surface *surface, uint32_t time_msec, + struct wlr_surface_2 *surface, uint32_t time_msec, int32_t touch_id, double sx, double sy); /** @@ -548,7 +549,7 @@ void wlr_seat_touch_notify_motion(struct wlr_seat *seat, uint32_t time_msec, * `wlr_seat_touch_point_clear_focus()`. */ void wlr_seat_touch_point_focus(struct wlr_seat *seat, - struct wlr_surface *surface, uint32_t time_msec, + struct wlr_surface_2 *surface, uint32_t time_msec, int32_t touch_id, double sx, double sy); /** @@ -566,7 +567,7 @@ void wlr_seat_touch_point_clear_focus(struct wlr_seat *seat, uint32_t time_msec, * `wlr_seat_touch_notify_down()` to respect any grabs of the touch device. */ uint32_t wlr_seat_touch_send_down(struct wlr_seat *seat, - struct wlr_surface *surface, uint32_t time_msec, + struct wlr_surface_2 *surface, uint32_t time_msec, int32_t touch_id, double sx, double sy); /** @@ -607,7 +608,7 @@ bool wlr_seat_validate_grab_serial(struct wlr_seat *seat, uint32_t serial); * Check whether this serial is valid to start a pointer grab action. */ bool wlr_seat_validate_pointer_grab_serial(struct wlr_seat *seat, - struct wlr_surface *origin, uint32_t serial); + struct wlr_surface_2 *origin, uint32_t serial); /** * Check whether this serial is valid to start a touch grab action. If it's the @@ -615,7 +616,7 @@ bool wlr_seat_validate_pointer_grab_serial(struct wlr_seat *seat, * the serial. */ bool wlr_seat_validate_touch_grab_serial(struct wlr_seat *seat, - struct wlr_surface *origin, uint32_t serial, + struct wlr_surface_2 *origin, uint32_t serial, struct wlr_touch_point **point_ptr); /** diff --git a/include/wlr/types/wlr_tablet_v2.h b/include/wlr/types/wlr_tablet_v2.h index d6fd646d9..34019da42 100644 --- a/include/wlr/types/wlr_tablet_v2.h +++ b/include/wlr/types/wlr_tablet_v2.h @@ -19,6 +19,7 @@ #define WLR_TABLET_V2_TOOL_BUTTONS_CAP 16 struct wlr_tablet_pad_v2_grab_interface; +struct wlr_surface_2; struct wlr_tablet_pad_v2_grab { const struct wlr_tablet_pad_v2_grab_interface *interface; @@ -71,7 +72,7 @@ struct wlr_tablet_v2_tablet_tool { struct wl_listener tool_destroy; struct wlr_tablet_tool_client_v2 *current_client; - struct wlr_surface *focused_surface; + struct wlr_surface_2 *focused_surface; struct wl_listener surface_destroy; struct wlr_tablet_tool_v2_grab *grab; @@ -112,7 +113,7 @@ struct wlr_tablet_v2_tablet_pad { }; struct wlr_tablet_v2_event_cursor { - struct wlr_surface *surface; + struct wlr_surface_2 *surface; uint32_t serial; int32_t hotspot_x; int32_t hotspot_y; @@ -146,7 +147,7 @@ void wlr_tablet_v2_destroy(struct wlr_tablet_manager_v2 *manager); void wlr_send_tablet_v2_tablet_tool_proximity_in( struct wlr_tablet_v2_tablet_tool *tool, struct wlr_tablet_v2_tablet *tablet, - struct wlr_surface *surface); + struct wlr_surface_2 *surface); void wlr_send_tablet_v2_tablet_tool_down(struct wlr_tablet_v2_tablet_tool *tool); void wlr_send_tablet_v2_tablet_tool_up(struct wlr_tablet_v2_tablet_tool *tool); @@ -184,7 +185,7 @@ void wlr_send_tablet_v2_tablet_tool_button( void wlr_tablet_v2_tablet_tool_notify_proximity_in( struct wlr_tablet_v2_tablet_tool *tool, struct wlr_tablet_v2_tablet *tablet, - struct wlr_surface *surface); + struct wlr_surface_2 *surface); void wlr_tablet_v2_tablet_tool_notify_down(struct wlr_tablet_v2_tablet_tool *tool); void wlr_tablet_v2_tablet_tool_notify_up(struct wlr_tablet_v2_tablet_tool *tool); @@ -222,7 +223,7 @@ struct wlr_tablet_tool_v2_grab_interface { void (*proximity_in)( struct wlr_tablet_tool_v2_grab *grab, struct wlr_tablet_v2_tablet *tablet, - struct wlr_surface *surface); + struct wlr_surface_2 *surface); void (*down)(struct wlr_tablet_tool_v2_grab *grab); void (*up)(struct wlr_tablet_tool_v2_grab *grab); @@ -258,7 +259,7 @@ void wlr_tablet_tool_v2_start_implicit_grab(struct wlr_tablet_v2_tablet_tool *to uint32_t wlr_send_tablet_v2_tablet_pad_enter( struct wlr_tablet_v2_tablet_pad *pad, struct wlr_tablet_v2_tablet *tablet, - struct wlr_surface *surface); + struct wlr_surface_2 *surface); void wlr_send_tablet_v2_tablet_pad_button( struct wlr_tablet_v2_tablet_pad *pad, size_t button, @@ -270,7 +271,7 @@ void wlr_send_tablet_v2_tablet_pad_ring(struct wlr_tablet_v2_tablet_pad *pad, uint32_t ring, double position, bool finger, uint32_t time); uint32_t wlr_send_tablet_v2_tablet_pad_leave(struct wlr_tablet_v2_tablet_pad *pad, - struct wlr_surface *surface); + struct wlr_surface_2 *surface); uint32_t wlr_send_tablet_v2_tablet_pad_mode(struct wlr_tablet_v2_tablet_pad *pad, size_t group, uint32_t mode, uint32_t time); @@ -279,7 +280,7 @@ uint32_t wlr_send_tablet_v2_tablet_pad_mode(struct wlr_tablet_v2_tablet_pad *pad uint32_t wlr_tablet_v2_tablet_pad_notify_enter( struct wlr_tablet_v2_tablet_pad *pad, struct wlr_tablet_v2_tablet *tablet, - struct wlr_surface *surface); + struct wlr_surface_2 *surface); void wlr_tablet_v2_tablet_pad_notify_button( struct wlr_tablet_v2_tablet_pad *pad, size_t button, @@ -293,7 +294,7 @@ void wlr_tablet_v2_tablet_pad_notify_ring( uint32_t ring, double position, bool finger, uint32_t time); uint32_t wlr_tablet_v2_tablet_pad_notify_leave( - struct wlr_tablet_v2_tablet_pad *pad, struct wlr_surface *surface); + struct wlr_tablet_v2_tablet_pad *pad, struct wlr_surface_2 *surface); uint32_t wlr_tablet_v2_tablet_pad_notify_mode( struct wlr_tablet_v2_tablet_pad *pad, @@ -303,7 +304,7 @@ struct wlr_tablet_pad_v2_grab_interface { uint32_t (*enter)( struct wlr_tablet_pad_v2_grab *grab, struct wlr_tablet_v2_tablet *tablet, - struct wlr_surface *surface); + struct wlr_surface_2 *surface); void (*button)(struct wlr_tablet_pad_v2_grab *grab,size_t button, uint32_t time, enum zwp_tablet_pad_v2_button_state state); @@ -314,7 +315,7 @@ struct wlr_tablet_pad_v2_grab_interface { uint32_t ring, double position, bool finger, uint32_t time); uint32_t (*leave)(struct wlr_tablet_pad_v2_grab *grab, - struct wlr_surface *surface); + struct wlr_surface_2 *surface); uint32_t (*mode)(struct wlr_tablet_pad_v2_grab *grab, size_t group, uint32_t mode, uint32_t time); @@ -326,5 +327,5 @@ void wlr_tablet_v2_end_grab(struct wlr_tablet_v2_tablet_pad *pad); void wlr_tablet_v2_start_grab(struct wlr_tablet_v2_tablet_pad *pad, struct wlr_tablet_pad_v2_grab *grab); bool wlr_surface_accepts_tablet_v2(struct wlr_tablet_v2_tablet *tablet, - struct wlr_surface *surface); + struct wlr_surface_2 *surface); #endif /* WLR_TYPES_WLR_TABLET_V2_H */ diff --git a/types/data_device/wlr_data_device.c b/types/data_device/wlr_data_device.c index d494cf75d..0914efaa2 100644 --- a/types/data_device/wlr_data_device.c +++ b/types/data_device/wlr_data_device.c @@ -6,6 +6,7 @@ #include #include #include +#include #include #include "types/wlr_data_device.h" #include "util/signal.h" @@ -55,18 +56,19 @@ static void data_device_start_drag(struct wl_client *client, return; } - struct wlr_surface *origin = wlr_surface_from_resource(origin_resource); + struct wlr_surface_2 *origin = wlr_surface_from_resource_2(origin_resource); struct wlr_client_data_source *source = NULL; if (source_resource != NULL) { source = client_data_source_from_resource(source_resource); } - struct wlr_surface *icon = NULL; + struct wlr_surface_2 *icon = NULL; if (icon_resource) { - icon = wlr_surface_from_resource(icon_resource); - if (!wlr_surface_set_role(icon, &drag_icon_surface_role, NULL, - icon_resource, WL_DATA_DEVICE_ERROR_ROLE)) { + icon = wlr_surface_from_resource_2(icon_resource); + if (!wlr_surface_set_role_2(icon, "wl_data_device")) { + wl_resource_post_error(icon_resource, WL_DATA_DEVICE_ERROR_ROLE, + "surface already has role"); return; } } diff --git a/types/data_device/wlr_drag.c b/types/data_device/wlr_drag.c index ab0005d3e..134a90bd3 100644 --- a/types/data_device/wlr_drag.c +++ b/types/data_device/wlr_drag.c @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include "types/wlr_data_device.h" @@ -20,7 +21,7 @@ static void drag_handle_seat_client_destroy(struct wl_listener *listener, } static void drag_set_focus(struct wlr_drag *drag, - struct wlr_surface *surface, double sx, double sy) { + struct wlr_surface_2 *surface, double sx, double sy) { if (drag->focus == surface) { return; } @@ -154,7 +155,7 @@ static void drag_destroy(struct wlr_drag *drag) { } static void drag_handle_pointer_enter(struct wlr_seat_pointer_grab *grab, - struct wlr_surface *surface, double sx, double sy) { + struct wlr_surface_2 *surface, double sx, double sy) { struct wlr_drag *drag = grab->data; drag_set_focus(drag, surface, sx, sy); } @@ -298,7 +299,7 @@ static const struct wlr_touch_grab_interface }; static void drag_handle_keyboard_enter(struct wlr_seat_keyboard_grab *grab, - struct wlr_surface *surface, uint32_t keycodes[], size_t num_keycodes, + struct wlr_surface_2 *surface, uint32_t keycodes[], size_t num_keycodes, struct wlr_keyboard_modifiers *modifiers) { // nothing has keyboard focus during drags } @@ -347,10 +348,25 @@ static void drag_icon_destroy(struct wlr_drag_icon *icon) { drag_icon_set_mapped(icon, false); wlr_signal_emit_safe(&icon->events.destroy, icon); icon->surface->role_data = NULL; + wl_list_remove(&icon->surface_commit.link); wl_list_remove(&icon->surface_destroy.link); free(icon); } +static void drag_icon_handle_surface_commit(struct wl_listener *listener, + void *data) { + struct wlr_drag_icon *icon = + wl_container_of(listener, icon, surface_commit); + + struct wlr_commit *commit = wlr_surface_get_commit(icon->surface); + bool has_buffer = commit->buffer; + wlr_commit_unref(commit); + + if (has_buffer) { + drag_icon_set_mapped(icon, true); + } +} + static void drag_icon_handle_surface_destroy(struct wl_listener *listener, void *data) { struct wlr_drag_icon *icon = @@ -358,23 +374,8 @@ static void drag_icon_handle_surface_destroy(struct wl_listener *listener, drag_icon_destroy(icon); } -static void drag_icon_surface_role_commit(struct wlr_surface *surface) { - assert(surface->role == &drag_icon_surface_role); - struct wlr_drag_icon *icon = surface->role_data; - if (icon == NULL) { - return; - } - - drag_icon_set_mapped(icon, wlr_surface_has_buffer(surface)); -} - -const struct wlr_surface_role drag_icon_surface_role = { - .name = "wl_data_device-icon", - .commit = drag_icon_surface_role_commit, -}; - static struct wlr_drag_icon *drag_icon_create(struct wlr_drag *drag, - struct wlr_surface *surface) { + struct wlr_surface_2 *surface) { struct wlr_drag_icon *icon = calloc(1, sizeof(struct wlr_drag_icon)); if (!icon) { return NULL; @@ -387,13 +388,21 @@ static struct wlr_drag_icon *drag_icon_create(struct wlr_drag *drag, wl_signal_init(&icon->events.unmap); wl_signal_init(&icon->events.destroy); + wl_signal_add(&icon->surface->events.commit, &icon->surface_commit); + icon->surface_commit.notify = drag_icon_handle_surface_commit; wl_signal_add(&icon->surface->events.destroy, &icon->surface_destroy); icon->surface_destroy.notify = drag_icon_handle_surface_destroy; icon->surface->role_data = icon; - if (wlr_surface_has_buffer(surface)) { - drag_icon_set_mapped(icon, true); + struct wlr_commit *commit = wlr_surface_get_commit(icon->surface); + if (commit) { + bool has_buffer = commit->buffer; + wlr_commit_unref(commit); + + if (has_buffer) { + drag_icon_set_mapped(icon, true); + } } return icon; @@ -401,7 +410,7 @@ static struct wlr_drag_icon *drag_icon_create(struct wlr_drag *drag, struct wlr_drag *wlr_drag_create(struct wlr_seat_client *seat_client, - struct wlr_data_source *source, struct wlr_surface *icon_surface) { + struct wlr_data_source *source, struct wlr_surface_2 *icon_surface) { struct wlr_drag *drag = calloc(1, sizeof(struct wlr_drag)); if (drag == NULL) { return NULL; @@ -447,7 +456,7 @@ struct wlr_drag *wlr_drag_create(struct wlr_seat_client *seat_client, } void wlr_seat_request_start_drag(struct wlr_seat *seat, struct wlr_drag *drag, - struct wlr_surface *origin, uint32_t serial) { + struct wlr_surface_2 *origin, uint32_t serial) { assert(drag->seat == seat); if (seat->drag != NULL) { diff --git a/types/meson.build b/types/meson.build index 4fa2f7ade..bf580519c 100644 --- a/types/meson.build +++ b/types/meson.build @@ -1,18 +1,18 @@ lib_wlr_types = static_library( 'wlr_types', files( - #'data_device/wlr_data_device.c', - #'data_device/wlr_data_offer.c', - #'data_device/wlr_data_source.c', - #'data_device/wlr_drag.c', - #'seat/wlr_seat_keyboard.c', - #'seat/wlr_seat_pointer.c', - #'seat/wlr_seat_touch.c', - #'seat/wlr_seat.c', - #'tablet_v2/wlr_tablet_v2_pad.c', - #'tablet_v2/wlr_tablet_v2_tablet.c', - #'tablet_v2/wlr_tablet_v2_tool.c', - #'tablet_v2/wlr_tablet_v2.c', + 'data_device/wlr_data_device.c', + 'data_device/wlr_data_offer.c', + 'data_device/wlr_data_source.c', + 'data_device/wlr_drag.c', + 'seat/wlr_seat_keyboard.c', + 'seat/wlr_seat_pointer.c', + 'seat/wlr_seat_touch.c', + 'seat/wlr_seat.c', + 'tablet_v2/wlr_tablet_v2_pad.c', + 'tablet_v2/wlr_tablet_v2_tablet.c', + 'tablet_v2/wlr_tablet_v2_tool.c', + 'tablet_v2/wlr_tablet_v2.c', #'xdg_shell_v6/wlr_xdg_popup_v6.c', #'xdg_shell_v6/wlr_xdg_positioner_v6.c', #'xdg_shell_v6/wlr_xdg_shell_v6.c', @@ -27,18 +27,18 @@ lib_wlr_types = static_library( 'wlr_compositor.c', 'wlr_subcompositor.c', #'wlr_cursor.c', - #'wlr_data_control_v1.c', + 'wlr_data_control_v1.c', #'wlr_export_dmabuf_v1.c', #'wlr_foreign_toplevel_management_v1.c', #'wlr_fullscreen_shell_v1.c', #'wlr_gamma_control_v1.c', #'wlr_gamma_control.c', - #'wlr_gtk_primary_selection.c', + 'wlr_gtk_primary_selection.c', #'wlr_idle_inhibit_v1.c', - #'wlr_idle.c', - #'wlr_input_device.c', - #'wlr_input_inhibitor.c', - #'wlr_input_method_v2.c', + 'wlr_idle.c', + 'wlr_input_device.c', + 'wlr_input_inhibitor.c', + 'wlr_input_method_v2.c', 'wlr_keyboard.c', #'wlr_layer_shell_v1.c', 'wlr_linux_dmabuf_v1.c', @@ -49,22 +49,22 @@ lib_wlr_types = static_library( 'wlr_output_management_v1.c', #'wlr_output.c', #'wlr_pointer_constraints_v1.c', - #'wlr_pointer_gestures_v1.c', + 'wlr_pointer_gestures_v1.c', 'wlr_pointer.c', #'wlr_presentation_time.c', - #'wlr_primary_selection_v1.c', - #'wlr_primary_selection.c', - #'wlr_relative_pointer_v1.c', + 'wlr_primary_selection_v1.c', + 'wlr_primary_selection.c', + 'wlr_relative_pointer_v1.c', #'wlr_screencopy_v1.c', #'wlr_screenshooter.c', #'wlr_server_decoration.c', #'wlr_surface.c', 'wlr_switch.c', 'wlr_tablet_pad.c', - #'wlr_tablet_tool.c', - #'wlr_text_input_v3.c', + 'wlr_tablet_tool.c', + 'wlr_text_input_v3.c', 'wlr_touch.c', - #'wlr_virtual_keyboard_v1.c', + 'wlr_virtual_keyboard_v1.c', #'wlr_xcursor_manager.c', #'wlr_xdg_decoration_v1.c', #'wlr_xdg_output_v1.c', diff --git a/types/seat/wlr_seat_keyboard.c b/types/seat/wlr_seat_keyboard.c index c92103eb6..869f9780a 100644 --- a/types/seat/wlr_seat_keyboard.c +++ b/types/seat/wlr_seat_keyboard.c @@ -9,6 +9,7 @@ #include #include #include +#include #include #include "types/wlr_data_device.h" #include "types/wlr_seat.h" @@ -16,7 +17,7 @@ #include "util/signal.h" static void default_keyboard_enter(struct wlr_seat_keyboard_grab *grab, - struct wlr_surface *surface, uint32_t keycodes[], size_t num_keycodes, + struct wlr_surface_2 *surface, uint32_t keycodes[], size_t num_keycodes, struct wlr_keyboard_modifiers *modifiers) { wlr_seat_keyboard_enter(grab->seat, surface, keycodes, num_keycodes, modifiers); } @@ -219,7 +220,7 @@ void wlr_seat_keyboard_send_modifiers(struct wlr_seat *seat, } void wlr_seat_keyboard_enter(struct wlr_seat *seat, - struct wlr_surface *surface, uint32_t keycodes[], size_t num_keycodes, + struct wlr_surface_2 *surface, uint32_t keycodes[], size_t num_keycodes, struct wlr_keyboard_modifiers *modifiers) { if (seat->keyboard_state.focused_surface == surface) { // this surface already got an enter notify @@ -235,7 +236,7 @@ void wlr_seat_keyboard_enter(struct wlr_seat *seat, struct wlr_seat_client *focused_client = seat->keyboard_state.focused_client; - struct wlr_surface *focused_surface = + struct wlr_surface_2 *focused_surface = seat->keyboard_state.focused_surface; // leave the previously entered surface @@ -304,7 +305,7 @@ void wlr_seat_keyboard_enter(struct wlr_seat *seat, } void wlr_seat_keyboard_notify_enter(struct wlr_seat *seat, - struct wlr_surface *surface, uint32_t keycodes[], size_t num_keycodes, + struct wlr_surface_2 *surface, uint32_t keycodes[], size_t num_keycodes, struct wlr_keyboard_modifiers *modifiers) { struct wlr_seat_keyboard_grab *grab = seat->keyboard_state.grab; grab->interface->enter(grab, surface, keycodes, num_keycodes, modifiers); diff --git a/types/seat/wlr_seat_pointer.c b/types/seat/wlr_seat_pointer.c index e1182fd24..013ad0634 100644 --- a/types/seat/wlr_seat_pointer.c +++ b/types/seat/wlr_seat_pointer.c @@ -5,12 +5,13 @@ #include #include #include +#include #include #include "types/wlr_seat.h" #include "util/signal.h" static void default_pointer_enter(struct wlr_seat_pointer_grab *grab, - struct wlr_surface *surface, double sx, double sy) { + struct wlr_surface_2 *surface, double sx, double sy) { wlr_seat_pointer_enter(grab->seat, surface, sx, sy); } @@ -65,10 +66,6 @@ struct wlr_seat_client *wlr_seat_client_from_pointer_resource( return wl_resource_get_user_data(resource); } -static const struct wlr_surface_role pointer_cursor_surface_role = { - .name = "wl_pointer-cursor", -}; - static void pointer_set_cursor(struct wl_client *client, struct wl_resource *pointer_resource, uint32_t serial, struct wl_resource *surface_resource, @@ -79,11 +76,12 @@ static void pointer_set_cursor(struct wl_client *client, return; } - struct wlr_surface *surface = NULL; + struct wlr_surface_2 *surface = NULL; if (surface_resource != NULL) { - surface = wlr_surface_from_resource(surface_resource); - if (!wlr_surface_set_role(surface, &pointer_cursor_surface_role, NULL, - surface_resource, WL_POINTER_ERROR_ROLE)) { + surface = wlr_surface_from_resource_2(surface_resource); + if (!wlr_surface_set_role_2(surface, "wl_pointer")) { + wl_resource_post_error(surface_resource, WL_POINTER_ERROR_ROLE, + "surface already has role"); return; } } @@ -115,7 +113,7 @@ static void pointer_handle_resource_destroy(struct wl_resource *resource) { bool wlr_seat_pointer_surface_has_focus(struct wlr_seat *wlr_seat, - struct wlr_surface *surface) { + struct wlr_surface_2 *surface) { return surface == wlr_seat->pointer_state.focused_surface; } @@ -129,7 +127,7 @@ static void seat_pointer_handle_surface_destroy(struct wl_listener *listener, } void wlr_seat_pointer_enter(struct wlr_seat *wlr_seat, - struct wlr_surface *surface, double sx, double sy) { + struct wlr_surface_2 *surface, double sx, double sy) { if (wlr_seat->pointer_state.focused_surface == surface) { // this surface already got an enter notify return; @@ -143,7 +141,7 @@ void wlr_seat_pointer_enter(struct wlr_seat *wlr_seat, struct wlr_seat_client *focused_client = wlr_seat->pointer_state.focused_client; - struct wlr_surface *focused_surface = + struct wlr_surface_2 *focused_surface = wlr_seat->pointer_state.focused_surface; // leave the previously entered surface @@ -324,7 +322,7 @@ void wlr_seat_pointer_end_grab(struct wlr_seat *wlr_seat) { } void wlr_seat_pointer_notify_enter(struct wlr_seat *wlr_seat, - struct wlr_surface *surface, double sx, double sy) { + struct wlr_surface_2 *surface, double sx, double sy) { struct wlr_seat_pointer_grab *grab = wlr_seat->pointer_state.grab; grab->interface->enter(grab, surface, sx, sy); } @@ -409,7 +407,7 @@ void seat_client_destroy_pointer(struct wl_resource *resource) { } bool wlr_seat_validate_pointer_grab_serial(struct wlr_seat *seat, - struct wlr_surface *origin, uint32_t serial) { + struct wlr_surface_2 *origin, uint32_t serial) { if (seat->pointer_state.button_count != 1 || seat->pointer_state.grab_serial != serial) { wlr_log(WLR_DEBUG, "Pointer grab serial validation failed: " diff --git a/types/seat/wlr_seat_touch.c b/types/seat/wlr_seat_touch.c index 75b304a54..5d65a4f68 100644 --- a/types/seat/wlr_seat_touch.c +++ b/types/seat/wlr_seat_touch.c @@ -5,6 +5,7 @@ #include #include #include +#include #include #include "types/wlr_seat.h" #include "util/signal.h" @@ -114,7 +115,7 @@ static void touch_point_handle_surface_destroy(struct wl_listener *listener, static struct wlr_touch_point *touch_point_create( struct wlr_seat *seat, int32_t touch_id, - struct wlr_surface *surface, double sx, double sy) { + struct wlr_surface_2 *surface, double sx, double sy) { struct wl_client *wl_client = wl_resource_get_client(surface->resource); struct wlr_seat_client *client = wlr_seat_client_for_wl_client(seat, wl_client); @@ -159,7 +160,7 @@ struct wlr_touch_point *wlr_seat_touch_get_point( } uint32_t wlr_seat_touch_notify_down(struct wlr_seat *seat, - struct wlr_surface *surface, uint32_t time, int32_t touch_id, double sx, + struct wlr_surface_2 *surface, uint32_t time, int32_t touch_id, double sx, double sy) { clock_gettime(CLOCK_MONOTONIC, &seat->last_event); struct wlr_seat_touch_grab *grab = seat->touch_state.grab; @@ -217,7 +218,7 @@ static void handle_point_focus_destroy(struct wl_listener *listener, } static void touch_point_set_focus(struct wlr_touch_point *point, - struct wlr_surface *surface, double sx, double sy) { + struct wlr_surface_2 *surface, double sx, double sy) { if (point->focus_surface == surface) { return; } @@ -241,7 +242,7 @@ static void touch_point_set_focus(struct wlr_touch_point *point, } void wlr_seat_touch_point_focus(struct wlr_seat *seat, - struct wlr_surface *surface, uint32_t time, int32_t touch_id, double sx, + struct wlr_surface_2 *surface, uint32_t time, int32_t touch_id, double sx, double sy) { assert(surface); struct wlr_touch_point *point = wlr_seat_touch_get_point(seat, touch_id); @@ -249,7 +250,7 @@ void wlr_seat_touch_point_focus(struct wlr_seat *seat, wlr_log(WLR_ERROR, "got touch point focus for unknown touch point"); return; } - struct wlr_surface *focus = point->focus_surface; + struct wlr_surface_2 *focus = point->focus_surface; touch_point_set_focus(point, surface, sx, sy); if (focus != point->focus_surface) { @@ -270,7 +271,7 @@ void wlr_seat_touch_point_clear_focus(struct wlr_seat *seat, uint32_t time, } uint32_t wlr_seat_touch_send_down(struct wlr_seat *seat, - struct wlr_surface *surface, uint32_t time, int32_t touch_id, double sx, + struct wlr_surface_2 *surface, uint32_t time, int32_t touch_id, double sx, double sy) { struct wlr_touch_point *point = wlr_seat_touch_get_point(seat, touch_id); if (!point) { @@ -361,7 +362,7 @@ void seat_client_destroy_touch(struct wl_resource *resource) { } bool wlr_seat_validate_touch_grab_serial(struct wlr_seat *seat, - struct wlr_surface *origin, uint32_t serial, + struct wlr_surface_2 *origin, uint32_t serial, struct wlr_touch_point **point_ptr) { if (wlr_seat_touch_num_points(seat) != 1 || seat->touch_state.grab_serial != serial) { diff --git a/types/tablet_v2/wlr_tablet_v2_pad.c b/types/tablet_v2/wlr_tablet_v2_pad.c index 578eef06e..4b552c0ce 100644 --- a/types/tablet_v2/wlr_tablet_v2_pad.c +++ b/types/tablet_v2/wlr_tablet_v2_pad.c @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -413,7 +414,7 @@ struct wlr_tablet_pad_client_v2 *tablet_pad_client_from_resource(struct wl_resou uint32_t wlr_send_tablet_v2_tablet_pad_enter( struct wlr_tablet_v2_tablet_pad *pad, struct wlr_tablet_v2_tablet *tablet, - struct wlr_surface *surface) { + struct wlr_surface_2 *surface) { struct wl_client *client = wl_resource_get_client(surface->resource); struct wlr_tablet_client_v2 *tablet_tmp; @@ -520,7 +521,7 @@ void wlr_send_tablet_v2_tablet_pad_ring(struct wlr_tablet_v2_tablet_pad *pad, } uint32_t wlr_send_tablet_v2_tablet_pad_leave(struct wlr_tablet_v2_tablet_pad *pad, - struct wlr_surface *surface) { + struct wlr_surface_2 *surface) { struct wl_client *client = wl_resource_get_client(surface->resource); if (!pad->current_client || client != pad->current_client->client) { return 0; @@ -555,7 +556,7 @@ uint32_t wlr_send_tablet_v2_tablet_pad_mode(struct wlr_tablet_v2_tablet_pad *pad } bool wlr_surface_accepts_tablet_v2(struct wlr_tablet_v2_tablet *tablet, - struct wlr_surface *surface) { + struct wlr_surface_2 *surface) { struct wl_client *client = wl_resource_get_client(surface->resource); if (tablet->current_client && @@ -577,7 +578,7 @@ bool wlr_surface_accepts_tablet_v2(struct wlr_tablet_v2_tablet *tablet, uint32_t wlr_tablet_v2_tablet_pad_notify_enter( struct wlr_tablet_v2_tablet_pad *pad, struct wlr_tablet_v2_tablet *tablet, - struct wlr_surface *surface) { + struct wlr_surface_2 *surface) { if (pad->grab && pad->grab->interface->enter) { return pad->grab->interface->enter(pad->grab, tablet, surface); } @@ -610,7 +611,7 @@ void wlr_tablet_v2_tablet_pad_notify_ring( } uint32_t wlr_tablet_v2_tablet_pad_notify_leave( - struct wlr_tablet_v2_tablet_pad *pad, struct wlr_surface *surface) { + struct wlr_tablet_v2_tablet_pad *pad, struct wlr_surface_2 *surface) { if (pad->grab && pad->grab->interface->leave) { return pad->grab->interface->leave(pad->grab, surface); } @@ -653,7 +654,7 @@ void wlr_tablet_v2_end_grab(struct wlr_tablet_v2_tablet_pad *pad) { static uint32_t default_pad_enter( struct wlr_tablet_pad_v2_grab *grab, struct wlr_tablet_v2_tablet *tablet, - struct wlr_surface *surface) { + struct wlr_surface_2 *surface) { return wlr_send_tablet_v2_tablet_pad_enter(grab->pad, tablet, surface); } @@ -673,7 +674,7 @@ static void default_pad_ring(struct wlr_tablet_pad_v2_grab *grab, } static uint32_t default_pad_leave(struct wlr_tablet_pad_v2_grab *grab, - struct wlr_surface *surface) { + struct wlr_surface_2 *surface) { return wlr_send_tablet_v2_tablet_pad_leave(grab->pad, surface); } diff --git a/types/tablet_v2/wlr_tablet_v2_tool.c b/types/tablet_v2/wlr_tablet_v2_tool.c index fc151e52b..fcd2d55ab 100644 --- a/types/tablet_v2/wlr_tablet_v2_tool.c +++ b/types/tablet_v2/wlr_tablet_v2_tool.c @@ -8,16 +8,13 @@ #include #include #include +#include #include #include #include static const struct wlr_tablet_tool_v2_grab_interface default_tool_grab_interface; -static const struct wlr_surface_role tablet_tool_cursor_surface_role = { - .name = "wp_tablet_tool-cursor", -}; - static void handle_tablet_tool_v2_set_cursor(struct wl_client *client, struct wl_resource *resource, uint32_t serial, struct wl_resource *surface_resource, @@ -27,11 +24,13 @@ static void handle_tablet_tool_v2_set_cursor(struct wl_client *client, return; } - struct wlr_surface *surface = NULL; + struct wlr_surface_2 *surface = NULL; if (surface_resource != NULL) { - surface = wlr_surface_from_resource(surface_resource); - if (!wlr_surface_set_role(surface, &tablet_tool_cursor_surface_role, NULL, - surface_resource, ZWP_TABLET_TOOL_V2_ERROR_ROLE)) { + surface = wlr_surface_from_resource_2(surface_resource); + if (!wlr_surface_set_role_2(surface, "wp_tablet_tool")) { + wl_resource_post_error(surface_resource, + ZWP_TABLET_TOOL_V2_ERROR_ROLE, + "surface already has role"); return; } } @@ -307,7 +306,7 @@ static void queue_tool_frame(struct wlr_tablet_tool_client_v2 *tool) { void wlr_send_tablet_v2_tablet_tool_proximity_in( struct wlr_tablet_v2_tablet_tool *tool, struct wlr_tablet_v2_tablet *tablet, - struct wlr_surface *surface) { + struct wlr_surface_2 *surface) { struct wl_client *client = wl_resource_get_client(surface->resource); if (tool->focused_surface == surface) { @@ -525,7 +524,7 @@ void wlr_send_tablet_v2_tablet_tool_up(struct wlr_tablet_v2_tablet_tool *tool) { void wlr_tablet_v2_tablet_tool_notify_proximity_in( struct wlr_tablet_v2_tablet_tool *tool, struct wlr_tablet_v2_tablet *tablet, - struct wlr_surface *surface) { + struct wlr_surface_2 *surface) { if (tool->grab->interface->proximity_in) { tool->grab->interface->proximity_in(tool->grab, tablet, surface); } @@ -623,7 +622,7 @@ void wlr_tablet_tool_v2_end_grab(struct wlr_tablet_v2_tablet_tool *tool) { static void default_tool_proximity_in( struct wlr_tablet_tool_v2_grab *grab, struct wlr_tablet_v2_tablet *tablet, - struct wlr_surface *surface) { + struct wlr_surface_2 *surface) { wlr_send_tablet_v2_tablet_tool_proximity_in(grab->tool, tablet, surface); } @@ -701,10 +700,10 @@ static const struct wlr_tablet_tool_v2_grab_interface }; struct implicit_grab_state { - struct wlr_surface *original; + struct wlr_surface_2 *original; bool released; - struct wlr_surface *focused; + struct wlr_surface_2 *focused; struct wlr_tablet_v2_tablet *tablet; }; @@ -735,7 +734,7 @@ static void check_and_release_implicit_grab(struct wlr_tablet_tool_v2_grab *grab static void implicit_tool_proximity_in( struct wlr_tablet_tool_v2_grab *grab, struct wlr_tablet_v2_tablet *tablet, - struct wlr_surface *surface) { + struct wlr_surface_2 *surface) { /* As long as we got an implicit grab, proximity won't change * But should track the currently focused surface to change to it when diff --git a/types/wlr_pointer_gestures_v1.c b/types/wlr_pointer_gestures_v1.c index 33b9db0f8..468192b9c 100644 --- a/types/wlr_pointer_gestures_v1.c +++ b/types/wlr_pointer_gestures_v1.c @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -47,7 +48,7 @@ void wlr_pointer_gestures_v1_send_swipe_begin( struct wlr_seat *seat, uint32_t time_msec, uint32_t fingers) { - struct wlr_surface *focus = seat->pointer_state.focused_surface; + struct wlr_surface_2 *focus = seat->pointer_state.focused_surface; if (focus == NULL) { return; } @@ -74,7 +75,7 @@ void wlr_pointer_gestures_v1_send_swipe_update( uint32_t time_msec, double dx, double dy) { - struct wlr_surface *focus = seat->pointer_state.focused_surface; + struct wlr_surface_2 *focus = seat->pointer_state.focused_surface; if (focus == NULL) { return; } @@ -98,7 +99,7 @@ void wlr_pointer_gestures_v1_send_swipe_end( struct wlr_seat *seat, uint32_t time_msec, bool cancelled) { - struct wlr_surface *focus = seat->pointer_state.focused_surface; + struct wlr_surface_2 *focus = seat->pointer_state.focused_surface; if (focus == NULL) { return; } @@ -159,7 +160,7 @@ void wlr_pointer_gestures_v1_send_pinch_begin( struct wlr_seat *seat, uint32_t time_msec, uint32_t fingers) { - struct wlr_surface *focus = seat->pointer_state.focused_surface; + struct wlr_surface_2 *focus = seat->pointer_state.focused_surface; if (focus == NULL) { return; } @@ -188,7 +189,7 @@ void wlr_pointer_gestures_v1_send_pinch_update( double dy, double scale, double rotation) { - struct wlr_surface *focus = seat->pointer_state.focused_surface; + struct wlr_surface_2 *focus = seat->pointer_state.focused_surface; if (focus == NULL) { return; } @@ -214,7 +215,7 @@ void wlr_pointer_gestures_v1_send_pinch_end( struct wlr_seat *seat, uint32_t time_msec, bool cancelled) { - struct wlr_surface *focus = seat->pointer_state.focused_surface; + struct wlr_surface_2 *focus = seat->pointer_state.focused_surface; if (focus == NULL) { return; }