From e7a1460cb80c93d88f88ab23311eb996aa659774 Mon Sep 17 00:00:00 2001 From: Andri Yngvason Date: Tue, 14 Jul 2020 21:17:36 +0000 Subject: [PATCH] Add option to disable cursor --- include/pointer.h | 10 +++++++++- src/main.c | 10 ++++++++-- src/pointer.c | 42 ++++++++++++++++++++++++++++++++++++------ 3 files changed, 53 insertions(+), 9 deletions(-) diff --git a/include/pointer.h b/include/pointer.h index cca04e7..a426602 100644 --- a/include/pointer.h +++ b/include/pointer.h @@ -20,6 +20,11 @@ struct wl_cursor_theme; +enum pointer_cursor_type { + POINTER_CURSOR_NONE = 0, + POINTER_CURSOR_LEFT_PTR, +}; + enum pointer_button_mask { POINTER_BUTTON_LEFT = 1 << 0, POINTER_BUTTON_MIDDLE = 1 << 1, @@ -37,15 +42,18 @@ struct pointer { struct wl_cursor_theme* cursor_theme; struct wl_surface* cursor_surface; + + enum pointer_cursor_type cursor_type; }; struct pointer_collection { struct wl_list pointers; void (*on_frame)(struct pointer_collection*, struct pointer*); + enum pointer_cursor_type cursor_type; void* userdata; }; -struct pointer_collection* pointer_collection_new(void); +struct pointer_collection* pointer_collection_new(enum pointer_cursor_type); void pointer_collection_destroy(struct pointer_collection*); int pointer_collection_add_wl_pointer(struct pointer_collection* self, diff --git a/src/main.c b/src/main.c index 727e4a8..1e63e96 100644 --- a/src/main.c +++ b/src/main.c @@ -456,6 +456,7 @@ Usage: wlvncc
[port]\n\ Supported values: tight, zrle, ultra, copyrect,\n\ hextile, zlib, corre, rre, raw.\n\ -h,--help Get help.\n\ + -n,--hide-cursor Hide the client-side cursor.\n\ -q,--quality Quality level (0 - 9).\n\ \n\ "); @@ -466,10 +467,11 @@ int main(int argc, char* argv[]) { int rc = -1; + enum pointer_cursor_type cursor_type = POINTER_CURSOR_LEFT_PTR; const char* encodings = NULL; int quality = -1; int compression = -1; - static const char* shortopts = "a:q:c:e:h"; + static const char* shortopts = "a:q:c:e:hn"; static const struct option longopts[] = { { "app-id", required_argument, NULL, 'a' }, @@ -477,6 +479,7 @@ int main(int argc, char* argv[]) { "encodings", required_argument, NULL, 'e' }, { "help", no_argument, NULL, 'h' }, { "quality", required_argument, NULL, 'q' }, + { "hide-cursor", no_argument, NULL, 'n' }, { NULL, 0, NULL, 0 } }; @@ -498,6 +501,9 @@ int main(int argc, char* argv[]) case 'e': encodings = optarg; break; + case 'n': + cursor_type = POINTER_CURSOR_NONE; + break; case 'h': return usage(0); default: @@ -531,7 +537,7 @@ int main(int argc, char* argv[]) if (init_wayland_event_handler() < 0) goto event_handler_failure; - pointers = pointer_collection_new(); + pointers = pointer_collection_new(cursor_type); if (!pointers) goto pointer_failure; diff --git a/src/pointer.c b/src/pointer.c index 18d5078..69fe30d 100644 --- a/src/pointer.c +++ b/src/pointer.c @@ -43,14 +43,19 @@ static struct wl_cursor_theme* pointer_load_cursor_theme(void) return wl_cursor_theme_load(xcursor_theme, xcursor_size, wl_shm); } -struct pointer* pointer_new(struct wl_pointer* wl_pointer) +struct pointer* pointer_new(struct wl_pointer* wl_pointer, + enum pointer_cursor_type cursor_type) { struct pointer* self = calloc(1, sizeof(*self)); if (!self) return NULL; self->wl_pointer = wl_pointer; - self->cursor_theme = pointer_load_cursor_theme(); + self->cursor_type = cursor_type; + + if (cursor_type == POINTER_CURSOR_LEFT_PTR) + self->cursor_theme = pointer_load_cursor_theme(); + self->cursor_surface = wl_compositor_create_surface(wl_compositor); return self; @@ -59,18 +64,21 @@ struct pointer* pointer_new(struct wl_pointer* wl_pointer) void pointer_destroy(struct pointer* self) { wl_pointer_destroy(self->wl_pointer); - wl_cursor_theme_destroy(self->cursor_theme); + if (self->cursor_theme) + wl_cursor_theme_destroy(self->cursor_theme); wl_surface_destroy(self->cursor_surface); free(self); } -struct pointer_collection* pointer_collection_new(void) +struct pointer_collection* pointer_collection_new( + enum pointer_cursor_type cursor_type) { struct pointer_collection* self = calloc(1, sizeof(*self)); if (!self) return NULL; wl_list_init(&self->pointers); + self->cursor_type = cursor_type; return self; } @@ -99,7 +107,15 @@ struct pointer* pointer_collection_find_wl_pointer( return NULL; } -static void pointer_update_cursor(struct pointer* self) +static void pointer_update_cursor_none(struct pointer* self) +{ + wl_surface_attach(self->cursor_surface, NULL, 0, 0); + wl_pointer_set_cursor(self->wl_pointer, self->serial, + self->cursor_surface, 0, 0); + wl_surface_commit(self->cursor_surface); +} + +static void pointer_update_cursor_left_ptr(struct pointer* self) { struct wl_cursor* cursor = wl_cursor_theme_get_cursor( self->cursor_theme, "left_ptr"); @@ -118,6 +134,20 @@ static void pointer_update_cursor(struct pointer* self) wl_surface_commit(self->cursor_surface); } +static void pointer_update_cursor(struct pointer* self) +{ + switch (self->cursor_type) { + case POINTER_CURSOR_NONE: + pointer_update_cursor_none(self); + return; + case POINTER_CURSOR_LEFT_PTR: + pointer_update_cursor_left_ptr(self); + return; + } + + abort(); +} + static void pointer_enter(void* data, struct wl_pointer* wl_pointer, uint32_t serial, struct wl_surface* surface, wl_fixed_t x, wl_fixed_t y) @@ -244,7 +274,7 @@ static struct wl_pointer_listener pointer_listener = { int pointer_collection_add_wl_pointer(struct pointer_collection* self, struct wl_pointer* wl_pointer) { - struct pointer* pointer = pointer_new(wl_pointer); + struct pointer* pointer = pointer_new(wl_pointer, self->cursor_type); if (!pointer) return -1;