Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for cursor-shape-v1 #7571

Merged
merged 1 commit into from
Jul 24, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions include/sway/input/cursor.h
Original file line number Diff line number Diff line change
Expand Up @@ -145,4 +145,6 @@ uint32_t get_mouse_button(const char *name, char **error);

const char *get_mouse_button_name(uint32_t button);

void handle_request_set_cursor_shape(struct wl_listener *listener, void *data);

#endif
2 changes: 2 additions & 0 deletions include/sway/server.h
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,8 @@ struct sway_server {
struct wl_listener xdg_activation_v1_request_activate;
struct wl_listener xdg_activation_v1_new_token;

struct wl_listener request_set_cursor_shape;

struct wl_list pending_launcher_ctxs; // launcher_ctx::link

// The timeout for transactions, after which a transaction is applied
Expand Down
1 change: 1 addition & 0 deletions protocols/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ protocols = [
wl_protocol_dir / 'unstable/tablet/tablet-unstable-v2.xml',
wl_protocol_dir / 'unstable/linux-dmabuf/linux-dmabuf-unstable-v1.xml',
wl_protocol_dir / 'staging/content-type/content-type-v1.xml',
wl_protocol_dir / 'staging/cursor-shape/cursor-shape-v1.xml',
'wlr-layer-shell-unstable-v1.xml',
'idle.xml',
'wlr-input-inhibitor-unstable-v1.xml',
Expand Down
24 changes: 24 additions & 0 deletions sway/input/cursor.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include <time.h>
#include <strings.h>
#include <wlr/types/wlr_cursor.h>
#include <wlr/types/wlr_cursor_shape_v1.h>
#include <wlr/types/wlr_idle.h>
#include <wlr/types/wlr_pointer.h>
#include <wlr/types/wlr_touch.h>
Expand Down Expand Up @@ -1467,3 +1468,26 @@ void sway_cursor_constrain(struct sway_cursor *cursor,
wl_signal_add(&constraint->surface->events.commit,
&cursor->constraint_commit);
}

void handle_request_set_cursor_shape(struct wl_listener *listener, void *data) {
const struct wlr_cursor_shape_manager_v1_request_set_shape_event *event = data;
struct sway_seat *seat = event->seat_client->seat->data;

if (!seatop_allows_set_cursor(seat)) {
return;
}

struct wl_client *focused_client = NULL;
struct wlr_surface *focused_surface = seat->wlr_seat->pointer_state.focused_surface;
if (focused_surface != NULL) {
focused_client = wl_resource_get_client(focused_surface->resource);
}

// TODO: check cursor mode
if (focused_client == NULL || event->seat_client->client != focused_client) {
sway_log(SWAY_DEBUG, "denying request to set cursor from unfocused client");
return;
}

cursor_set_image(seat->cursor, wlr_cursor_shape_v1_name(event->shape), focused_client);
}
7 changes: 7 additions & 0 deletions sway/server.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include <wlr/render/wlr_renderer.h>
#include <wlr/types/wlr_compositor.h>
#include <wlr/types/wlr_content_type_v1.h>
#include <wlr/types/wlr_cursor_shape_v1.h>
#include <wlr/types/wlr_data_control_v1.h>
#include <wlr/types/wlr_drm.h>
#include <wlr/types/wlr_export_dmabuf_v1.h>
Expand Down Expand Up @@ -44,6 +45,7 @@
#include "sway/input/input-manager.h"
#include "sway/output.h"
#include "sway/server.h"
#include "sway/input/cursor.h"
#include "sway/tree/root.h"

#if HAVE_XWAYLAND
Expand Down Expand Up @@ -235,6 +237,11 @@ bool server_init(struct sway_server *server) {
wl_signal_add(&server->xdg_activation_v1->events.new_token,
&server->xdg_activation_v1_new_token);

struct wlr_cursor_shape_manager_v1 *cursor_shape_manager =
wlr_cursor_shape_manager_v1_create(server->wl_display, 1);
server->request_set_cursor_shape.notify = handle_request_set_cursor_shape;
wl_signal_add(&cursor_shape_manager->events.request_set_shape, &server->request_set_cursor_shape);

wl_list_init(&server->pending_launcher_ctxs);

// Avoid using "wayland-0" as display socket
Expand Down