hyprwm / Hyprland

Hyprland is an independent, highly customizable, dynamic tiling Wayland compositor that doesn't sacrifice on its looks.
https://hyprland.org
BSD 3-Clause "New" or "Revised" License
21.41k stars 899 forks source link

Per-Window Scaling #3861

Open chaorace opened 11 months ago

chaorace commented 11 months ago

Description

I'd like to be able to set custom scaling for specific windows. In other words: I'd like to be able to use different Wayland scaling multipliers between individual windows within the same workspace.

I feel that such a feature would improve workspace management when using applications which support Wayland scaling but otherwise lack a built-in "zoom" mechanism. The value-add would come from being able to fit otherwise unreasonably bulky applications into a given workspace layout without sacrificing unacceptable amounts of screen real-estate.

Off the top of my head, I can imagine the following possible implementations:

A. As a dispatcher (e.g.: scalewindow +0.2 / scalewindow exact 2.0) -- does the spec allow for changing scale on the fly? B. As a window rule (e.g.: scale 2.0 / scale 0.5)

vaxerski commented 11 months ago

worth noting this is impossible for xwayland windows

loki1368 commented 11 months ago

I'd really like "PerWindow scaling" ability too. Because wlfreerdp works bad with global scaling(i have 1.75) and i need an option to drop scale to 1.0 for it(per-window or per-workspace).

https://github.com/FreeRDP/FreeRDP/issues/7608

So, short answer: Can´t work that way, you always need FreeRDP without scale factor if you want the proper resolution for the RDP session.

DrShadow34 commented 11 months ago

I second that, this feature would be nice to see. Right now I'm using some wacky stuff with script combined with keybinding hotkeys, to change scaling in config on the fly, or for xwindow I'm just using gamescope with custom resolution. All of this could be avoided if I could set for xwindow and certain apps own scaling.

ildar commented 11 months ago

this FR is really critical for those using RDP. I just have to manually set the scale globally for the moments I use RDP. 😞

ildar commented 10 months ago

BTW, can a wayland application choose its scaling factor?

vaxerski commented 10 months ago

yes

1over137 commented 10 months ago

One more potential use of this is to use the native fractional scaling present in some programs (firefox's layout.css.devPixelsPerPx) instead of Wayland's 2x then downscale method, which can save resources and produce clearer text.

droc12345 commented 10 months ago

I started out, in wayland, using wayfire and there are 2 features that I really liked and used a fair amount, One was being able to set alpha per window, binding to a key and I can make that work with hyprland. The other was the built in zoom (magnification) where it would apply to a window or even the wallpaper. That would be similar to what's being asked for here, and I'm not sure how easy it is to implement.

1over137 commented 10 months ago

@DrShadow34 Did changing the global scale work for all apps for you? For me, lots of applications (Qt and Alacritty) are still in the original scale and is stretched out to become blurry. I assume this is a bug(https://github.com/hyprwm/Hyprland/issues/4363) because if you move the window between monitors with different scaling they do get rescaled properly.

DrShadow34 commented 10 months ago

@DrShadow34 Did changing the global scale work for all apps for you? For me, lots of applications (Qt and Alacritty) are still in the original scale and is stretched out to become blurry. I assume this is a bug(#4363) because if you move the window between monitors with different scaling they do get rescaled properly.

Yes, changing it globally works with Qt apps for me both ways. Most of blurry apps - only one that working thru xwayland, like steam, changing it scaling to 1 solves issue with blur. But have in mind, that I only have one monitor.

ibrahimkettaneh commented 9 months ago

This feature would be very helpful. The feature is so helpful that, as others have said, we have been using keybinds and scripts to adjust it on the fly. I used to have this keybind working, which somewhat addressed this need:

bind = $mainMod shift,      O,      exec, hyprctl keyword monitor "$(hyprctl monitors -j | jq -r '.[] | select(.focused = = true) | "\(.name), \(.width)x\(.height), \(.x)x\(.y),"')" "$(echo "$(hyprctl monitors -j | jq -r '.[] | select(.focused = = true) | "\(.scale)"') - 0.1" | bc)"
bind = $mainMod ctrl,       O,      exec, hyprctl keyword monitor $(hyprctl monitors -j | jq -r '.[] | select(.focused = = true) | "\(.name), \(.width)x\(.height), \(.x)x\(.y),"') $(echo "$(hyprctl monitors -j | jq -r '.[] | select(.focused = = true) | "\(.scale)"') + 0.1" | bc)

Though the issue is that now the other windows are not scaled in a readable or usable way. It would be great if it were a hyprctl dispatcher. Your continued work and efforts are sincerely appreciated.

Hubro commented 8 months ago

I would love this for screen sharing. It would be great to be able to blow a specific window up to 2x scaling, so viewers can read the text, without affecting the rest of the DE.

simaotwx commented 7 months ago

My use case is that some apps, like electron apps, look kind of pixelated with a scale of 1.6 and I'd like to change that to make it look better but only for that window, because the rest works fine.

nrvale0 commented 4 days ago

I started out, in wayland, using wayfire and there are 2 features that I really liked and used a fair amount, One was being able to set alpha per window, binding to a key and I can make that work with hyprland. The other was the built in zoom (magnification) where it would apply to a window or even the wallpaper. That would be similar to what's being asked for here, and I'm not sure how easy it is to implement.

@droc12345 Can you point me to how one might do this with Wayfire? I'm not seeing it in the docs but I'm curious to experience it. Thx.