diff options
Diffstat (limited to 'swaybar')
-rw-r--r-- | swaybar/bar.c | 22 | ||||
-rw-r--r-- | swaybar/input.c | 38 |
2 files changed, 29 insertions, 31 deletions
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, |