mirror of
https://codeberg.org/dnkl/yambar.git
synced 2025-04-22 12:25:38 +02:00
bar/wayland: let compositor choose output if user didn't
Instead of us selecting an output randomly (we used to select that "last" output) when the user hasn't configured one, let the compositor choose one for us.
This commit is contained in:
parent
e05d586f17
commit
baee3924e4
1 changed files with 28 additions and 34 deletions
|
@ -81,6 +81,8 @@ struct wayland_backend {
|
|||
tll(struct monitor) monitors;
|
||||
const struct monitor *monitor;
|
||||
|
||||
int scale;
|
||||
|
||||
struct zxdg_output_manager_v1 *xdg_output_manager;
|
||||
|
||||
/* TODO: set directly in bar instead */
|
||||
|
@ -122,18 +124,17 @@ update_cursor_surface(struct wayland_backend *backend)
|
|||
if (backend->pointer.cursor == NULL)
|
||||
return;
|
||||
|
||||
const int scale = backend->monitor->scale;
|
||||
|
||||
struct wl_cursor_image *image = backend->pointer.cursor->images[0];
|
||||
|
||||
wl_surface_set_buffer_scale(backend->pointer.surface, scale);
|
||||
wl_surface_set_buffer_scale(backend->pointer.surface, backend->scale);
|
||||
|
||||
wl_surface_attach(
|
||||
backend->pointer.surface, wl_cursor_image_get_buffer(image), 0, 0);
|
||||
|
||||
wl_pointer_set_cursor(
|
||||
backend->pointer.pointer, backend->pointer.serial,
|
||||
backend->pointer.surface, image->hotspot_x / scale, image->hotspot_y / scale);
|
||||
backend->pointer.surface,
|
||||
image->hotspot_x / backend->scale, image->hotspot_y / backend->scale);
|
||||
|
||||
|
||||
wl_surface_damage_buffer(
|
||||
|
@ -149,8 +150,8 @@ wl_pointer_enter(void *data, struct wl_pointer *wl_pointer,
|
|||
{
|
||||
struct wayland_backend *backend = data;
|
||||
backend->pointer.serial = serial;
|
||||
backend->pointer.x = wl_fixed_to_int(surface_x) * backend->monitor->scale;
|
||||
backend->pointer.y = wl_fixed_to_int(surface_y) * backend->monitor->scale;
|
||||
backend->pointer.x = wl_fixed_to_int(surface_x) * backend->scale;
|
||||
backend->pointer.y = wl_fixed_to_int(surface_y) * backend->scale;
|
||||
|
||||
update_cursor_surface(backend);
|
||||
}
|
||||
|
@ -167,8 +168,8 @@ wl_pointer_motion(void *data, struct wl_pointer *wl_pointer,
|
|||
{
|
||||
struct wayland_backend *backend = data;
|
||||
|
||||
backend->pointer.x = wl_fixed_to_int(surface_x) * backend->monitor->scale;
|
||||
backend->pointer.y = wl_fixed_to_int(surface_y) * backend->monitor->scale;
|
||||
backend->pointer.x = wl_fixed_to_int(surface_x) * backend->scale;
|
||||
backend->pointer.y = wl_fixed_to_int(surface_y) * backend->scale;
|
||||
|
||||
backend->bar_on_mouse(
|
||||
backend->bar, ON_MOUSE_MOTION, backend->pointer.x, backend->pointer.y);
|
||||
|
@ -449,8 +450,8 @@ layer_surface_configure(void *data, struct zwlr_layer_surface_v1 *surface,
|
|||
uint32_t serial, uint32_t w, uint32_t h)
|
||||
{
|
||||
struct wayland_backend *backend = data;
|
||||
backend->width = w * backend->monitor->scale;
|
||||
backend->height = h * backend->monitor->scale;
|
||||
backend->width = w * backend->scale;
|
||||
backend->height = h * backend->scale;
|
||||
|
||||
zwlr_layer_surface_v1_ack_configure(surface, serial);
|
||||
}
|
||||
|
@ -626,22 +627,13 @@ setup(struct bar *_bar)
|
|||
mon->name, mon->width_px, mon->height_px,
|
||||
mon->x, mon->y, mon->width_mm, mon->height_mm);
|
||||
|
||||
if (bar->monitor == NULL) {
|
||||
/* User didn't specify a monitor */
|
||||
backend->monitor = mon;
|
||||
}
|
||||
|
||||
else if (bar->monitor != NULL && strcmp(bar->monitor, mon->name) == 0) {
|
||||
if (bar->monitor != NULL && strcmp(bar->monitor, mon->name) == 0) {
|
||||
/* User specified a monitor, and this is one */
|
||||
backend->monitor = mon;
|
||||
}
|
||||
}
|
||||
|
||||
if (backend->monitor == NULL) {
|
||||
LOG_ERR("failed to find the specified monitor: %s",
|
||||
bar->monitor != NULL ? bar->monitor : "default");
|
||||
return false;
|
||||
}
|
||||
backend->scale = backend->monitor != NULL ? backend->monitor->scale : 1;
|
||||
|
||||
backend->surface = wl_compositor_create_surface(backend->compositor);
|
||||
if (backend->surface == NULL) {
|
||||
|
@ -670,14 +662,15 @@ setup(struct bar *_bar)
|
|||
LOG_INFO("cursor theme: %s, size: %u", cursor_theme, cursor_size);
|
||||
|
||||
backend->pointer.theme = wl_cursor_theme_load(
|
||||
cursor_theme, cursor_size * backend->monitor->scale, backend->shm);
|
||||
cursor_theme, cursor_size * backend->scale, backend->shm);
|
||||
if (backend->pointer.theme == NULL) {
|
||||
LOG_ERR("failed to load cursor theme");
|
||||
return false;
|
||||
}
|
||||
|
||||
backend->layer_surface = zwlr_layer_shell_v1_get_layer_surface(
|
||||
backend->layer_shell, backend->surface, backend->monitor->output,
|
||||
backend->layer_shell, backend->surface,
|
||||
backend->monitor != NULL ? backend->monitor->output : NULL,
|
||||
ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM, "yambar");
|
||||
if (backend->layer_surface == NULL) {
|
||||
LOG_ERR("failed to create layer shell surface");
|
||||
|
@ -696,26 +689,26 @@ setup(struct bar *_bar)
|
|||
top_or_bottom);
|
||||
|
||||
int height = bar->height_with_border;
|
||||
height /= backend->monitor->scale;
|
||||
height *= backend->monitor->scale;
|
||||
height /= backend->scale;
|
||||
height *= backend->scale;
|
||||
bar->height = height - 2 * bar->border.width;
|
||||
bar->height_with_border = height;
|
||||
|
||||
zwlr_layer_surface_v1_set_size(
|
||||
backend->layer_surface, 0, bar->height_with_border / backend->monitor->scale);
|
||||
backend->layer_surface, 0, bar->height_with_border / backend->scale);
|
||||
zwlr_layer_surface_v1_set_exclusive_zone(
|
||||
backend->layer_surface,
|
||||
(bar->height_with_border + (bar->location == BAR_TOP
|
||||
? bar->border.bottom_margin
|
||||
: bar->border.top_margin))
|
||||
/ backend->monitor->scale);
|
||||
/ backend->scale);
|
||||
|
||||
zwlr_layer_surface_v1_set_margin(
|
||||
backend->layer_surface,
|
||||
bar->border.top_margin / backend->monitor->scale,
|
||||
bar->border.right_margin / backend->monitor->scale,
|
||||
bar->border.bottom_margin / backend->monitor->scale,
|
||||
bar->border.left_margin / backend->monitor->scale
|
||||
bar->border.top_margin / backend->scale,
|
||||
bar->border.right_margin / backend->scale,
|
||||
bar->border.bottom_margin / backend->scale,
|
||||
bar->border.left_margin / backend->scale
|
||||
);
|
||||
|
||||
zwlr_layer_surface_v1_add_listener(
|
||||
|
@ -731,7 +724,8 @@ setup(struct bar *_bar)
|
|||
return false;
|
||||
}
|
||||
|
||||
assert(backend->width / backend->monitor->scale <= backend->monitor->width_px);
|
||||
assert(backend->monitor == NULL ||
|
||||
backend->width / backend->monitor->scale <= backend->monitor->width_px);
|
||||
bar->width = backend->width;
|
||||
|
||||
if (pipe(backend->pipe_fds) == -1) {
|
||||
|
@ -917,7 +911,7 @@ frame_callback(void *data, struct wl_callback *wl_callback, uint32_t callback_da
|
|||
struct buffer *buffer = backend->pending_buffer;
|
||||
assert(buffer->busy);
|
||||
|
||||
wl_surface_set_buffer_scale(backend->surface, backend->monitor->scale);
|
||||
wl_surface_set_buffer_scale(backend->surface, backend->scale);
|
||||
wl_surface_attach(backend->surface, buffer->wl_buf, 0, 0);
|
||||
wl_surface_damage(backend->surface, 0, 0, backend->width, backend->height);
|
||||
|
||||
|
@ -956,7 +950,7 @@ commit(const struct bar *_bar)
|
|||
struct buffer *buffer = backend->next_buffer;
|
||||
assert(buffer->busy);
|
||||
|
||||
wl_surface_set_buffer_scale(backend->surface, backend->monitor->scale);
|
||||
wl_surface_set_buffer_scale(backend->surface, backend->scale);
|
||||
wl_surface_attach(backend->surface, buffer->wl_buf, 0, 0);
|
||||
wl_surface_damage(backend->surface, 0, 0, backend->width, backend->height);
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue