From 5825ee31cce95572ba34049aebcd0ec81704637a Mon Sep 17 00:00:00 2001 From: nullableVoidPtr <30564701+nullableVoidPtr@users.noreply.github.com> Date: Sun, 3 Dec 2023 17:23:51 +0800 Subject: [PATCH] chase(output): support fractional scaling manually notify scaling at some surfaces like xdg popups and xwayland --- include/labwc.h | 1 + src/server.c | 3 +++ src/xdg.c | 16 ++++++++++++++++ src/xwayland.c | 8 ++++++++ 4 files changed, 28 insertions(+) diff --git a/include/labwc.h b/include/labwc.h index f288de35..6537c6a5 100644 --- a/include/labwc.h +++ b/include/labwc.h @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include diff --git a/src/server.c b/src/server.c index bd21d775..ae9c69c9 100644 --- a/src/server.c +++ b/src/server.c @@ -31,6 +31,7 @@ #include "xwayland.h" #define LAB_WLR_COMPOSITOR_VERSION (5) +#define LAB_WLR_FRACTIONAL_SCALE_MANAGER_VERSION (1) static struct wlr_compositor *compositor; static struct wl_event_source *sighup_source; @@ -377,6 +378,8 @@ server_init(struct server *server) wlr_data_control_manager_v1_create(server->wl_display); wlr_viewporter_create(server->wl_display); wlr_single_pixel_buffer_manager_v1_create(server->wl_display); + wlr_fractional_scale_manager_v1_create( + server->wl_display, LAB_WLR_FRACTIONAL_SCALE_MANAGER_VERSION); idle_manager_create(server->wl_display, server->seat.seat); diff --git a/src/xdg.c b/src/xdg.c index 713eccd1..5fb8dca0 100644 --- a/src/xdg.c +++ b/src/xdg.c @@ -125,6 +125,14 @@ handle_commit(struct wl_listener *listener, void *data) } if (update_required) { + wlr_fractional_scale_v1_notify_scale( + view->surface, + view->output->wlr_output->scale + ); + wlr_surface_set_preferred_buffer_scale( + view->surface, + ceil(view->output->wlr_output->scale) + ); view_impl_apply_geometry(view, size.width, size.height); } } @@ -307,6 +315,14 @@ xdg_toplevel_view_configure(struct view *view, struct wlr_box geo) * glitches during resize, we apply the same position * adjustments here as in handle_commit(). */ + wlr_fractional_scale_v1_notify_scale( + view->surface, + view->output->wlr_output->scale + ); + wlr_surface_set_preferred_buffer_scale( + view->surface, + ceil(view->output->wlr_output->scale) + ); view_impl_apply_geometry(view, view->current.width, view->current.height); } diff --git a/src/xwayland.c b/src/xwayland.c index 30277c06..403b3459 100644 --- a/src/xwayland.c +++ b/src/xwayland.c @@ -199,6 +199,14 @@ handle_commit(struct wl_listener *listener, void *data) * reducing visual glitches. */ if (current->width != state->width || current->height != state->height) { + wlr_fractional_scale_v1_notify_scale( + view->surface, + view->output->wlr_output->scale + ); + wlr_surface_set_preferred_buffer_scale( + view->surface, + ceil(view->output->wlr_output->scale) + ); view_impl_apply_geometry(view, state->width, state->height); } }