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:
Daniel Eklöf 2019-12-31 11:39:33 +01:00
parent e05d586f17
commit baee3924e4
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F

View file

@ -81,6 +81,8 @@ struct wayland_backend {
tll(struct monitor) monitors; tll(struct monitor) monitors;
const struct monitor *monitor; const struct monitor *monitor;
int scale;
struct zxdg_output_manager_v1 *xdg_output_manager; struct zxdg_output_manager_v1 *xdg_output_manager;
/* TODO: set directly in bar instead */ /* TODO: set directly in bar instead */
@ -122,18 +124,17 @@ update_cursor_surface(struct wayland_backend *backend)
if (backend->pointer.cursor == NULL) if (backend->pointer.cursor == NULL)
return; return;
const int scale = backend->monitor->scale;
struct wl_cursor_image *image = backend->pointer.cursor->images[0]; 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( wl_surface_attach(
backend->pointer.surface, wl_cursor_image_get_buffer(image), 0, 0); backend->pointer.surface, wl_cursor_image_get_buffer(image), 0, 0);
wl_pointer_set_cursor( wl_pointer_set_cursor(
backend->pointer.pointer, backend->pointer.serial, 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( wl_surface_damage_buffer(
@ -149,8 +150,8 @@ wl_pointer_enter(void *data, struct wl_pointer *wl_pointer,
{ {
struct wayland_backend *backend = data; struct wayland_backend *backend = data;
backend->pointer.serial = serial; backend->pointer.serial = serial;
backend->pointer.x = wl_fixed_to_int(surface_x) * backend->monitor->scale; backend->pointer.x = wl_fixed_to_int(surface_x) * backend->scale;
backend->pointer.y = wl_fixed_to_int(surface_y) * backend->monitor->scale; backend->pointer.y = wl_fixed_to_int(surface_y) * backend->scale;
update_cursor_surface(backend); update_cursor_surface(backend);
} }
@ -167,8 +168,8 @@ wl_pointer_motion(void *data, struct wl_pointer *wl_pointer,
{ {
struct wayland_backend *backend = data; struct wayland_backend *backend = data;
backend->pointer.x = wl_fixed_to_int(surface_x) * backend->monitor->scale; backend->pointer.x = wl_fixed_to_int(surface_x) * backend->scale;
backend->pointer.y = wl_fixed_to_int(surface_y) * backend->monitor->scale; backend->pointer.y = wl_fixed_to_int(surface_y) * backend->scale;
backend->bar_on_mouse( backend->bar_on_mouse(
backend->bar, ON_MOUSE_MOTION, backend->pointer.x, backend->pointer.y); 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) uint32_t serial, uint32_t w, uint32_t h)
{ {
struct wayland_backend *backend = data; struct wayland_backend *backend = data;
backend->width = w * backend->monitor->scale; backend->width = w * backend->scale;
backend->height = h * backend->monitor->scale; backend->height = h * backend->scale;
zwlr_layer_surface_v1_ack_configure(surface, serial); 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->name, mon->width_px, mon->height_px,
mon->x, mon->y, mon->width_mm, mon->height_mm); mon->x, mon->y, mon->width_mm, mon->height_mm);
if (bar->monitor == NULL) { if (bar->monitor != NULL && strcmp(bar->monitor, mon->name) == 0) {
/* User didn't specify a monitor */
backend->monitor = mon;
}
else if (bar->monitor != NULL && strcmp(bar->monitor, mon->name) == 0) {
/* User specified a monitor, and this is one */ /* User specified a monitor, and this is one */
backend->monitor = mon; backend->monitor = mon;
} }
} }
if (backend->monitor == NULL) { backend->scale = backend->monitor != NULL ? backend->monitor->scale : 1;
LOG_ERR("failed to find the specified monitor: %s",
bar->monitor != NULL ? bar->monitor : "default");
return false;
}
backend->surface = wl_compositor_create_surface(backend->compositor); backend->surface = wl_compositor_create_surface(backend->compositor);
if (backend->surface == NULL) { if (backend->surface == NULL) {
@ -670,14 +662,15 @@ setup(struct bar *_bar)
LOG_INFO("cursor theme: %s, size: %u", cursor_theme, cursor_size); LOG_INFO("cursor theme: %s, size: %u", cursor_theme, cursor_size);
backend->pointer.theme = wl_cursor_theme_load( 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) { if (backend->pointer.theme == NULL) {
LOG_ERR("failed to load cursor theme"); LOG_ERR("failed to load cursor theme");
return false; return false;
} }
backend->layer_surface = zwlr_layer_shell_v1_get_layer_surface( 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"); ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM, "yambar");
if (backend->layer_surface == NULL) { if (backend->layer_surface == NULL) {
LOG_ERR("failed to create layer shell surface"); LOG_ERR("failed to create layer shell surface");
@ -696,26 +689,26 @@ setup(struct bar *_bar)
top_or_bottom); top_or_bottom);
int height = bar->height_with_border; int height = bar->height_with_border;
height /= backend->monitor->scale; height /= backend->scale;
height *= backend->monitor->scale; height *= backend->scale;
bar->height = height - 2 * bar->border.width; bar->height = height - 2 * bar->border.width;
bar->height_with_border = height; bar->height_with_border = height;
zwlr_layer_surface_v1_set_size( 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( zwlr_layer_surface_v1_set_exclusive_zone(
backend->layer_surface, backend->layer_surface,
(bar->height_with_border + (bar->location == BAR_TOP (bar->height_with_border + (bar->location == BAR_TOP
? bar->border.bottom_margin ? bar->border.bottom_margin
: bar->border.top_margin)) : bar->border.top_margin))
/ backend->monitor->scale); / backend->scale);
zwlr_layer_surface_v1_set_margin( zwlr_layer_surface_v1_set_margin(
backend->layer_surface, backend->layer_surface,
bar->border.top_margin / backend->monitor->scale, bar->border.top_margin / backend->scale,
bar->border.right_margin / backend->monitor->scale, bar->border.right_margin / backend->scale,
bar->border.bottom_margin / backend->monitor->scale, bar->border.bottom_margin / backend->scale,
bar->border.left_margin / backend->monitor->scale bar->border.left_margin / backend->scale
); );
zwlr_layer_surface_v1_add_listener( zwlr_layer_surface_v1_add_listener(
@ -731,7 +724,8 @@ setup(struct bar *_bar)
return false; 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; bar->width = backend->width;
if (pipe(backend->pipe_fds) == -1) { 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; struct buffer *buffer = backend->pending_buffer;
assert(buffer->busy); 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_attach(backend->surface, buffer->wl_buf, 0, 0);
wl_surface_damage(backend->surface, 0, 0, backend->width, backend->height); 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; struct buffer *buffer = backend->next_buffer;
assert(buffer->busy); 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_attach(backend->surface, buffer->wl_buf, 0, 0);
wl_surface_damage(backend->surface, 0, 0, backend->width, backend->height); wl_surface_damage(backend->surface, 0, 0, backend->width, backend->height);