diff options
Diffstat (limited to '')
-rw-r--r-- | main.c | 39 | ||||
-rw-r--r-- | meson.build | 3 |
2 files changed, 40 insertions, 2 deletions
@@ -14,6 +14,7 @@ #include "wlr-layer-shell-unstable-v1-client-protocol.h" #include "viewporter-client-protocol.h" #include "single-pixel-buffer-v1-client-protocol.h" +#include "fractional-scale-v1-client-protocol.h" /* * If `color` is a hexadecimal string of the form 'rrggbb' or '#rrggbb', @@ -47,6 +48,7 @@ struct swaybg_state { struct zwlr_layer_shell_v1 *layer_shell; struct wp_viewporter *viewporter; struct wp_single_pixel_buffer_manager_v1 *single_pixel_buffer_manager; + struct wp_fractional_scale_manager_v1 *fract_scale_manager; struct wl_list configs; // struct swaybg_output_config::link struct wl_list outputs; // struct swaybg_output::link struct wl_list images; // struct swaybg_image::link @@ -80,9 +82,11 @@ struct swaybg_output { struct wl_surface *surface; struct zwlr_layer_surface_v1 *layer_surface; struct wp_viewport *viewport; + struct wp_fractional_scale_v1 *fract_scale; uint32_t width, height; int32_t scale; + uint32_t pref_fract_scale; uint32_t configure_serial; bool dirty, needs_ack; @@ -146,6 +150,8 @@ static struct wl_buffer *draw_buffer(const struct swaybg_output *output, return wl_buf; } +#define FRACT_DENOM 120 + // Return the size of the buffer that should be attached to this output static void get_buffer_size(const struct swaybg_output *output, uint32_t *buffer_width, uint32_t *buffer_height) { @@ -153,6 +159,12 @@ static void get_buffer_size(const struct swaybg_output *output, output->state->viewporter) { *buffer_width = 1; *buffer_height = 1; + } else if (output->fract_scale && output->state->viewporter) { + // rounding mode is 'round half up' + *buffer_width = (output->width * output->pref_fract_scale + + FRACT_DENOM / 2) / FRACT_DENOM; + *buffer_height = (output->height * output->pref_fract_scale + + FRACT_DENOM / 2) / FRACT_DENOM; } else { *buffer_width = output->width * output->scale; *buffer_height = output->height * output->scale; @@ -223,6 +235,9 @@ static void destroy_swaybg_output(struct swaybg_output *output) { if (output->viewport != NULL) { wp_viewport_destroy(output->viewport); } + if (output->fract_scale != NULL) { + wp_fractional_scale_v1_destroy(output->fract_scale); + } wl_output_destroy(output->wl_output); free(output->name); free(output->identifier); @@ -253,6 +268,16 @@ static const struct zwlr_layer_surface_v1_listener layer_surface_listener = { .closed = layer_surface_closed, }; +static void fract_preferred_scale(void *data, struct wp_fractional_scale_v1 *f, + uint32_t scale) { + struct swaybg_output *output = data; + output->pref_fract_scale = scale; +} + +static const struct wp_fractional_scale_v1_listener fract_scale_listener = { + .preferred_scale = fract_preferred_scale +}; + static void output_geometry(void *data, struct wl_output *output, int32_t x, int32_t y, int32_t width_mm, int32_t height_mm, int32_t subpixel, const char *make, const char *model, int32_t transform) { @@ -275,8 +300,17 @@ static void create_layer_surface(struct swaybg_output *output) { wl_surface_set_input_region(output->surface, input_region); wl_region_destroy(input_region); + if (output->state->fract_scale_manager) { + output->fract_scale = wp_fractional_scale_manager_v1_get_fractional_scale( + output->state->fract_scale_manager, output->surface); + assert(output->fract_scale); + wp_fractional_scale_v1_add_listener(output->fract_scale, + &fract_scale_listener, output); + } + if (output->state->viewporter && - output->config->mode == BACKGROUND_MODE_SOLID_COLOR) { + (output->config->mode == BACKGROUND_MODE_SOLID_COLOR || + output->state->fract_scale_manager)) { output->viewport = wp_viewporter_get_viewport( output->state->viewporter, output->surface); } @@ -400,6 +434,9 @@ static void handle_global(void *data, struct wl_registry *registry, wp_single_pixel_buffer_manager_v1_interface.name) == 0) { state->single_pixel_buffer_manager = wl_registry_bind(registry, name, &wp_single_pixel_buffer_manager_v1_interface, 1); + } else if (strcmp(interface, wp_fractional_scale_manager_v1_interface.name) == 0) { + state->fract_scale_manager = wl_registry_bind(registry, name, + &wp_fractional_scale_manager_v1_interface, 1); } } diff --git a/meson.build b/meson.build index 8b005da..87a513c 100644 --- a/meson.build +++ b/meson.build @@ -30,7 +30,7 @@ endif rt = cc.find_library('rt') wayland_client = dependency('wayland-client') -wayland_protos = dependency('wayland-protocols', version: '>=1.26') +wayland_protos = dependency('wayland-protocols', version: '>=1.31') wayland_scanner = dependency('wayland-scanner', version: '>=1.14.91', native: true) cairo = dependency('cairo') gdk_pixbuf = dependency('gdk-pixbuf-2.0', required: get_option('gdk-pixbuf')) @@ -74,6 +74,7 @@ client_protocols = [ wl_protocol_dir / 'stable/xdg-shell/xdg-shell.xml', wl_protocol_dir / 'stable/viewporter/viewporter.xml', wl_protocol_dir / 'staging/single-pixel-buffer/single-pixel-buffer-v1.xml', + wl_protocol_dir / 'staging/fractional-scale/fractional-scale-v1.xml', 'wlr-layer-shell-unstable-v1.xml', ] |