Add option to disable cursor

qemu-extended-key-event
Andri Yngvason 2020-07-14 21:17:36 +00:00
parent a1d455b0c5
commit e7a1460cb8
3 changed files with 53 additions and 9 deletions

View File

@ -20,6 +20,11 @@
struct wl_cursor_theme; struct wl_cursor_theme;
enum pointer_cursor_type {
POINTER_CURSOR_NONE = 0,
POINTER_CURSOR_LEFT_PTR,
};
enum pointer_button_mask { enum pointer_button_mask {
POINTER_BUTTON_LEFT = 1 << 0, POINTER_BUTTON_LEFT = 1 << 0,
POINTER_BUTTON_MIDDLE = 1 << 1, POINTER_BUTTON_MIDDLE = 1 << 1,
@ -37,15 +42,18 @@ struct pointer {
struct wl_cursor_theme* cursor_theme; struct wl_cursor_theme* cursor_theme;
struct wl_surface* cursor_surface; struct wl_surface* cursor_surface;
enum pointer_cursor_type cursor_type;
}; };
struct pointer_collection { struct pointer_collection {
struct wl_list pointers; struct wl_list pointers;
void (*on_frame)(struct pointer_collection*, struct pointer*); void (*on_frame)(struct pointer_collection*, struct pointer*);
enum pointer_cursor_type cursor_type;
void* userdata; 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*); void pointer_collection_destroy(struct pointer_collection*);
int pointer_collection_add_wl_pointer(struct pointer_collection* self, int pointer_collection_add_wl_pointer(struct pointer_collection* self,

View File

@ -456,6 +456,7 @@ Usage: wlvncc <address> [port]\n\
Supported values: tight, zrle, ultra, copyrect,\n\ Supported values: tight, zrle, ultra, copyrect,\n\
hextile, zlib, corre, rre, raw.\n\ hextile, zlib, corre, rre, raw.\n\
-h,--help Get help.\n\ -h,--help Get help.\n\
-n,--hide-cursor Hide the client-side cursor.\n\
-q,--quality Quality level (0 - 9).\n\ -q,--quality Quality level (0 - 9).\n\
\n\ \n\
"); ");
@ -466,10 +467,11 @@ int main(int argc, char* argv[])
{ {
int rc = -1; int rc = -1;
enum pointer_cursor_type cursor_type = POINTER_CURSOR_LEFT_PTR;
const char* encodings = NULL; const char* encodings = NULL;
int quality = -1; int quality = -1;
int compression = -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[] = { static const struct option longopts[] = {
{ "app-id", required_argument, NULL, 'a' }, { "app-id", required_argument, NULL, 'a' },
@ -477,6 +479,7 @@ int main(int argc, char* argv[])
{ "encodings", required_argument, NULL, 'e' }, { "encodings", required_argument, NULL, 'e' },
{ "help", no_argument, NULL, 'h' }, { "help", no_argument, NULL, 'h' },
{ "quality", required_argument, NULL, 'q' }, { "quality", required_argument, NULL, 'q' },
{ "hide-cursor", no_argument, NULL, 'n' },
{ NULL, 0, NULL, 0 } { NULL, 0, NULL, 0 }
}; };
@ -498,6 +501,9 @@ int main(int argc, char* argv[])
case 'e': case 'e':
encodings = optarg; encodings = optarg;
break; break;
case 'n':
cursor_type = POINTER_CURSOR_NONE;
break;
case 'h': case 'h':
return usage(0); return usage(0);
default: default:
@ -531,7 +537,7 @@ int main(int argc, char* argv[])
if (init_wayland_event_handler() < 0) if (init_wayland_event_handler() < 0)
goto event_handler_failure; goto event_handler_failure;
pointers = pointer_collection_new(); pointers = pointer_collection_new(cursor_type);
if (!pointers) if (!pointers)
goto pointer_failure; goto pointer_failure;

View File

@ -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); 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)); struct pointer* self = calloc(1, sizeof(*self));
if (!self) if (!self)
return NULL; return NULL;
self->wl_pointer = wl_pointer; 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); self->cursor_surface = wl_compositor_create_surface(wl_compositor);
return self; return self;
@ -59,18 +64,21 @@ struct pointer* pointer_new(struct wl_pointer* wl_pointer)
void pointer_destroy(struct pointer* self) void pointer_destroy(struct pointer* self)
{ {
wl_pointer_destroy(self->wl_pointer); 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); wl_surface_destroy(self->cursor_surface);
free(self); 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)); struct pointer_collection* self = calloc(1, sizeof(*self));
if (!self) if (!self)
return NULL; return NULL;
wl_list_init(&self->pointers); wl_list_init(&self->pointers);
self->cursor_type = cursor_type;
return self; return self;
} }
@ -99,7 +107,15 @@ struct pointer* pointer_collection_find_wl_pointer(
return NULL; 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( struct wl_cursor* cursor = wl_cursor_theme_get_cursor(
self->cursor_theme, "left_ptr"); self->cursor_theme, "left_ptr");
@ -118,6 +134,20 @@ static void pointer_update_cursor(struct pointer* self)
wl_surface_commit(self->cursor_surface); 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, static void pointer_enter(void* data, struct wl_pointer* wl_pointer,
uint32_t serial, struct wl_surface* surface, wl_fixed_t x, uint32_t serial, struct wl_surface* surface, wl_fixed_t x,
wl_fixed_t y) 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, int pointer_collection_add_wl_pointer(struct pointer_collection* self,
struct wl_pointer* wl_pointer) struct wl_pointer* wl_pointer)
{ {
struct pointer* pointer = pointer_new(wl_pointer); struct pointer* pointer = pointer_new(wl_pointer, self->cursor_type);
if (!pointer) if (!pointer)
return -1; return -1;