feat(client): add client_update_scale and layersurface_update_scale

- client_update_scale(): re-notifies clients when output scale changes
  using current_outputs max scale (avoids stale c->mon for floating windows)
- layersurface_update_scale(): same logic for layer shell surfaces (static)
- Initialize current_scale on initial commit for both surface types
- Uses 0.001f tolerance for float comparison to prevent redundant events
- Falls back to c->mon->wlr_output->scale if no current_outputs
This commit is contained in:
2026-07-05 21:36:41 -04:00
parent 8b91bc939c
commit 4e388d9f4f
3 changed files with 61 additions and 0 deletions
+1
View File
@@ -130,6 +130,7 @@ void client_send_close(Client *c);
void client_set_border_color(Client *c, const float color[static 4]); void client_set_border_color(Client *c, const float color[static 4]);
void client_set_fullscreen(Client *c, int fullscreen); void client_set_fullscreen(Client *c, int fullscreen);
void client_set_scale(struct wlr_surface *s, float scale); void client_set_scale(struct wlr_surface *s, float scale);
void client_update_scale(Client *c);
uint32_t client_set_size(Client *c, uint32_t width, uint32_t height); uint32_t client_set_size(Client *c, uint32_t width, uint32_t height);
void client_set_tiled(Client *c, uint32_t edges); void client_set_tiled(Client *c, uint32_t edges);
void client_set_suspended(Client *c, int suspended); void client_set_suspended(Client *c, int suspended);
+27
View File
@@ -414,6 +414,33 @@ client_wants_focus(Client *c)
#endif #endif
} }
void
client_update_scale(Client *c)
{
struct wlr_surface_output *surface_output;
float scale;
if (!c || !client_surface(c)->mapped)
return;
scale = 0.0f;
wl_list_for_each(surface_output, &client_surface(c)->current_outputs, link)
if (surface_output->output->scale > scale)
scale = surface_output->output->scale;
if (scale <= 0.0f)
scale = c->mon ? c->mon->wlr_output->scale : 1.0f;
if (scale <= 0.0f)
return;
if (fabsf(scale - c->current_scale) > 0.001f) {
wlr_fractional_scale_v1_notify_scale(client_surface(c), (double)scale);
wlr_surface_set_preferred_buffer_scale(client_surface(c), (int32_t)ceilf(scale));
c->current_scale = scale;
}
}
int int
client_wants_fullscreen(Client *c) client_wants_fullscreen(Client *c)
{ {
+33
View File
@@ -909,6 +909,37 @@ static void closemon(Monitor *m) {
// ── Compositor Lifecycle ──────────────────────────────────── // ── Compositor Lifecycle ────────────────────────────────────
__attribute__((unused)) static void
layersurface_update_scale(LayerSurface *l)
{
struct wlr_surface_output *surface_output;
float scale;
if (!l || !l->layer_surface->surface->mapped)
return;
scale = 0.0f;
wl_list_for_each(surface_output,
&l->layer_surface->surface->current_outputs, link)
if (surface_output->output->scale > scale)
scale = surface_output->output->scale;
/* Fallback to assigned monitor if surface is not on any output */
if (scale <= 0.0f)
scale = l->mon ? l->mon->wlr_output->scale : 1.0f;
if (scale <= 0.0f)
return;
if (fabsf(scale - l->current_scale) > 0.001f) {
wlr_fractional_scale_v1_notify_scale(l->layer_surface->surface,
(double)scale);
wlr_surface_set_preferred_buffer_scale(l->layer_surface->surface,
(int32_t)ceilf(scale));
l->current_scale = scale;
}
}
static void commitlayersurfacenotify(struct wl_listener *listener, void *data) { static void commitlayersurfacenotify(struct wl_listener *listener, void *data) {
LayerSurface *l = wl_container_of(listener, l, surface_commit); LayerSurface *l = wl_container_of(listener, l, surface_commit);
struct wlr_layer_surface_v1 *layer_surface = l->layer_surface; struct wlr_layer_surface_v1 *layer_surface = l->layer_surface;
@@ -918,6 +949,7 @@ static void commitlayersurfacenotify(struct wl_listener *listener, void *data) {
if (l->layer_surface->initial_commit) { if (l->layer_surface->initial_commit) {
client_set_scale(layer_surface->surface, l->mon->wlr_output->scale); client_set_scale(layer_surface->surface, l->mon->wlr_output->scale);
l->current_scale = l->mon->wlr_output->scale;
/* Temporarily set the layer's current state to pending /* Temporarily set the layer's current state to pending
* so that we can easily arrange it */ * so that we can easily arrange it */
@@ -960,6 +992,7 @@ static void commitnotify(struct wl_listener *listener, void *data) {
applyrules(c); applyrules(c);
if (c->mon) { if (c->mon) {
client_set_scale(client_surface(c), c->mon->wlr_output->scale); client_set_scale(client_surface(c), c->mon->wlr_output->scale);
c->current_scale = c->mon->wlr_output->scale;
} }
setmon(c, nullptr, 0); /* Make sure to reapply rules in mapnotify() */ setmon(c, nullptr, 0); /* Make sure to reapply rules in mapnotify() */