diff options
-rw-r--r-- | include/swaybar/input.h | 4 | ||||
-rw-r--r-- | swaybar/bar.c | 22 | ||||
-rw-r--r-- | swaybar/input.c | 38 |
3 files changed, 33 insertions, 31 deletions
diff --git a/include/swaybar/input.h b/include/swaybar/input.h index 390309a0..f480d009 100644 --- a/include/swaybar/input.h +++ b/include/swaybar/input.h | |||
@@ -4,6 +4,7 @@ | |||
4 | #include <wayland-client.h> | 4 | #include <wayland-client.h> |
5 | #include "list.h" | 5 | #include "list.h" |
6 | 6 | ||
7 | struct swaybar; | ||
7 | struct swaybar_output; | 8 | struct swaybar_output; |
8 | 9 | ||
9 | struct swaybar_pointer { | 10 | struct swaybar_pointer { |
@@ -13,6 +14,7 @@ struct swaybar_pointer { | |||
13 | struct wl_surface *cursor_surface; | 14 | struct wl_surface *cursor_surface; |
14 | struct swaybar_output *current; | 15 | struct swaybar_output *current; |
15 | int x, y; | 16 | int x, y; |
17 | uint32_t serial; | ||
16 | }; | 18 | }; |
17 | 19 | ||
18 | enum x11_button { | 20 | enum x11_button { |
@@ -45,6 +47,8 @@ struct swaybar_hotspot { | |||
45 | 47 | ||
46 | extern const struct wl_seat_listener seat_listener; | 48 | extern const struct wl_seat_listener seat_listener; |
47 | 49 | ||
50 | void update_cursor(struct swaybar *bar); | ||
51 | |||
48 | void free_hotspots(struct wl_list *list); | 52 | void free_hotspots(struct wl_list *list); |
49 | 53 | ||
50 | #endif | 54 | #endif |
diff --git a/swaybar/bar.c b/swaybar/bar.c index 47c89a39..53e798bc 100644 --- a/swaybar/bar.c +++ b/swaybar/bar.c | |||
@@ -196,6 +196,10 @@ static void output_scale(void *data, struct wl_output *wl_output, | |||
196 | int32_t factor) { | 196 | int32_t factor) { |
197 | struct swaybar_output *output = data; | 197 | struct swaybar_output *output = data; |
198 | output->scale = factor; | 198 | output->scale = factor; |
199 | if (output == output->bar->pointer.current) { | ||
200 | update_cursor(output->bar); | ||
201 | render_frame(output); | ||
202 | } | ||
199 | } | 203 | } |
200 | 204 | ||
201 | struct wl_output_listener output_listener = { | 205 | struct wl_output_listener output_listener = { |
@@ -273,7 +277,7 @@ static void handle_global(void *data, struct wl_registry *registry, | |||
273 | struct swaybar *bar = data; | 277 | struct swaybar *bar = data; |
274 | if (strcmp(interface, wl_compositor_interface.name) == 0) { | 278 | if (strcmp(interface, wl_compositor_interface.name) == 0) { |
275 | bar->compositor = wl_registry_bind(registry, name, | 279 | bar->compositor = wl_registry_bind(registry, name, |
276 | &wl_compositor_interface, 3); | 280 | &wl_compositor_interface, 4); |
277 | } else if (strcmp(interface, wl_seat_interface.name) == 0) { | 281 | } else if (strcmp(interface, wl_seat_interface.name) == 0) { |
278 | bar->seat = wl_registry_bind(registry, name, | 282 | bar->seat = wl_registry_bind(registry, name, |
279 | &wl_seat_interface, 3); | 283 | &wl_seat_interface, 3); |
@@ -355,22 +359,6 @@ bool bar_setup(struct swaybar *bar, const char *socket_path) { | |||
355 | wl_display_roundtrip(bar->display); | 359 | wl_display_roundtrip(bar->display); |
356 | 360 | ||
357 | struct swaybar_pointer *pointer = &bar->pointer; | 361 | struct swaybar_pointer *pointer = &bar->pointer; |
358 | |||
359 | int max_scale = 1; | ||
360 | struct swaybar_output *output; | ||
361 | wl_list_for_each(output, &bar->outputs, link) { | ||
362 | if (output->scale > max_scale) { | ||
363 | max_scale = output->scale; | ||
364 | } | ||
365 | } | ||
366 | |||
367 | pointer->cursor_theme = | ||
368 | wl_cursor_theme_load(NULL, 24 * max_scale, bar->shm); | ||
369 | assert(pointer->cursor_theme); | ||
370 | struct wl_cursor *cursor; | ||
371 | cursor = wl_cursor_theme_get_cursor(pointer->cursor_theme, "left_ptr"); | ||
372 | assert(cursor); | ||
373 | pointer->cursor_image = cursor->images[0]; | ||
374 | pointer->cursor_surface = wl_compositor_create_surface(bar->compositor); | 362 | pointer->cursor_surface = wl_compositor_create_surface(bar->compositor); |
375 | assert(pointer->cursor_surface); | 363 | assert(pointer->cursor_surface); |
376 | 364 | ||
diff --git a/swaybar/input.c b/swaybar/input.c index 1f8491f6..7d219be3 100644 --- a/swaybar/input.c +++ b/swaybar/input.c | |||
@@ -55,11 +55,34 @@ static enum x11_button wl_axis_to_x11_button(uint32_t axis, wl_fixed_t value) { | |||
55 | } | 55 | } |
56 | } | 56 | } |
57 | 57 | ||
58 | void update_cursor(struct swaybar *bar) { | ||
59 | struct swaybar_pointer *pointer = &bar->pointer; | ||
60 | if (pointer->cursor_theme) { | ||
61 | wl_cursor_theme_destroy(pointer->cursor_theme); | ||
62 | } | ||
63 | int scale = pointer->current ? pointer->current->scale : 1; | ||
64 | pointer->cursor_theme = wl_cursor_theme_load(NULL, 24 * scale, bar->shm); | ||
65 | struct wl_cursor *cursor; | ||
66 | cursor = wl_cursor_theme_get_cursor(pointer->cursor_theme, "left_ptr"); | ||
67 | pointer->cursor_image = cursor->images[0]; | ||
68 | wl_surface_set_buffer_scale(pointer->cursor_surface, scale); | ||
69 | wl_surface_attach(pointer->cursor_surface, | ||
70 | wl_cursor_image_get_buffer(pointer->cursor_image), 0, 0); | ||
71 | wl_pointer_set_cursor(pointer->pointer, pointer->serial, | ||
72 | pointer->cursor_surface, | ||
73 | pointer->cursor_image->hotspot_x / scale, | ||
74 | pointer->cursor_image->hotspot_y / scale); | ||
75 | wl_surface_damage_buffer(pointer->cursor_surface, 0, 0, | ||
76 | INT32_MAX, INT32_MAX); | ||
77 | wl_surface_commit(pointer->cursor_surface); | ||
78 | } | ||
79 | |||
58 | static void wl_pointer_enter(void *data, struct wl_pointer *wl_pointer, | 80 | static void wl_pointer_enter(void *data, struct wl_pointer *wl_pointer, |
59 | uint32_t serial, struct wl_surface *surface, | 81 | uint32_t serial, struct wl_surface *surface, |
60 | wl_fixed_t surface_x, wl_fixed_t surface_y) { | 82 | wl_fixed_t surface_x, wl_fixed_t surface_y) { |
61 | struct swaybar *bar = data; | 83 | struct swaybar *bar = data; |
62 | struct swaybar_pointer *pointer = &bar->pointer; | 84 | struct swaybar_pointer *pointer = &bar->pointer; |
85 | pointer->serial = serial; | ||
63 | struct swaybar_output *output; | 86 | struct swaybar_output *output; |
64 | wl_list_for_each(output, &bar->outputs, link) { | 87 | wl_list_for_each(output, &bar->outputs, link) { |
65 | if (output->surface == surface) { | 88 | if (output->surface == surface) { |
@@ -67,20 +90,7 @@ static void wl_pointer_enter(void *data, struct wl_pointer *wl_pointer, | |||
67 | break; | 90 | break; |
68 | } | 91 | } |
69 | } | 92 | } |
70 | int max_scale = 1; | 93 | update_cursor(bar); |
71 | struct swaybar_output *_output; | ||
72 | wl_list_for_each(_output, &bar->outputs, link) { | ||
73 | if (_output->scale > max_scale) { | ||
74 | max_scale = _output->scale; | ||
75 | } | ||
76 | } | ||
77 | wl_surface_set_buffer_scale(pointer->cursor_surface, max_scale); | ||
78 | wl_surface_attach(pointer->cursor_surface, | ||
79 | wl_cursor_image_get_buffer(pointer->cursor_image), 0, 0); | ||
80 | wl_pointer_set_cursor(wl_pointer, serial, pointer->cursor_surface, | ||
81 | pointer->cursor_image->hotspot_x / max_scale, | ||
82 | pointer->cursor_image->hotspot_y / max_scale); | ||
83 | wl_surface_commit(pointer->cursor_surface); | ||
84 | } | 94 | } |
85 | 95 | ||
86 | static void wl_pointer_leave(void *data, struct wl_pointer *wl_pointer, | 96 | static void wl_pointer_leave(void *data, struct wl_pointer *wl_pointer, |