How to scale the desktop's resolution?
While using Xorg X11, on KDE/Gnome/XFCE how can we scale the display/resolution for the whole desktop and/or per application? (when this is not available on the settings GUI)
The purpose of this guide is to keep the screen resolution unchanged (at max) while scaling the size (bigger/smaller) of the desktop/applications.
The Linux display
This is detailed in depth on how does Linux’s display works? article.
On most desktops system (like KDE or Gnome) there are settings available on their respective settings panel, this guide is for additional/manual settings that can be applied to scale an application or the whole desktop. This reference article have many valuable informations for the matter.
Scaling applications
Scaling application can be done mainly via DPI, specific environment variable (explained bellow), application own setting or some specific desktop setting (out of scope of this QA).
-
Qt applications can be scaled with the following environment variables, note that many applications are hard-coding sizing and font and thus the result on such app may not be as expected.
export QT_AUTO_SCREEN_SET_FACTOR=0 export QT_SCALE_FACTOR=2 export QT_FONT_DPI=96
-
Gnome/GTK applications can be scaled with the following environment variables
export GDK_SCALE=2 export GDK_DPI_SCALE=0.5
-
Gnome/GTK can as well be scaled globally with this Gnome setting
gsettings set org.gnome.desktop.interface text-scaling-factor 2.0
-
Chromium, can be scaled with the following command
chromium --high-dpi-support=1 --force-device-scale-factor=1.5
-
Xpra (python) can be used along with Run scaled to achieve a per app scaling.
-
Environment variables modification can be placed in
~/.profile
for a global and automatic appliance after login.
Scaling the desktop with Xorg X11
Xorg’s extension RandR have a scaling feature and can be configured with xrandr
. This can be used to scale the desktop to display a bigger environment, this can be useful for HiDPI (High Dots Per Inch) displays.
RandR can also be used the other way around, example making a screen with 1366x768 max resolution support a greater resolution like 1920x1080. This is achieved by simulating the new greater resolution while rendering it for the supported max resolution, similar to when we watch a Full-HD video on a screen that is not Full-HD.
Scaling the desktop without changing the resolution
-
Getting the screen name:
xrandr | grep connected | grep -v disconnected | awk '{print $1}'
-
Reduce the screen size by 20% (zoom-in)
xrandr --output screen-name --scale 0.8x0.8
-
Increase the screen size by 20% (zoom-out)
xrandr --output screen-name --scale 1.2x1.2
-
Reset
xrandr
changesxrandr --output screen-name --scale 1x1
Scaling the desktop and simulate/render a new resolution
When using xrandr
to “zoom-in” with the previous method, the desktop remain full screen but when we “zoom-out” with for instance xrandr --output screen-name --scale 1.2x1.2
(to get an unsupported resolution) the desktop is not displayed in full screen because this require updating the resolution (to probably a higher unsupported resolution by the screen), we can use a combinaison of --mode
, --panning
and --scale
, xrandr’s parameters to achieve a full screen “zoom-out” scaling (simulate a new resolution), example:
-
Get the current setup
xdpyinfo | grep -B 2 resolution # or xdpyinfo
-
Configuration example
Scaling at: 120% Used/max screen resolution: 1366 x 768 Resolution at 120% (res x 1.2): 1640 x 922 (round) Scaling factor (new res / res): 1.20058565 x 1.20208604
-
The idea here is to increase the screen resolution virtually (because we are limited to 1366x768 physically) the command would be (replace
screen-name
):xrandr --output screen-name --mode 1366x768 --panning 1640x922 --scale 1.20058565x1.20208604
-
Reset the changes with
xrandr --output screen-name --mode 1366x768 --panning 1366x768 --scale 1x1 # restarting the desktop may be required example with KDE # kquitapp5 plasmashell # plasmashell &
Making xrandr changes persistant
There is a multitude of methods to make xrandr
changes persistant, this and this QA have many examples.
Experiments notes
As a side note and experiments result while using SDDM + KDE, and after many tests to achieve a persistant config, I ended up loading a script with ~/.config/autostart
(systemsettings5
> Startup… > Autostart), and naming my script 00-scriptname
to make it run first.
# 00-scriptname
# Applying the main xrandr suited changes (scaling at x1.15)
xrandr --output eDP1 --mode 1366x768 --panning 1574x886 --scale 1.15226939x1.15364583
# This is where it get odd/complicated, sometimes the screen resolution is not applied correctly or not applied at all...
# Note that "xrandr --fb" can be used alone to change the screen resolution on a normal situation...
# Here we will be taking advantage of xrandr's "--fb" feature to make the config appliance stable and works every-time.
# The odd thing here is while re-applying the new resolution 1574x886 with "--fb" nothing happen, but
# if we use use an unsupported resolution like 1574x884 (vs 1574x886) then xrandr force the resolution
# to "reset itself" to the configured resolution (1574x886)...
# In short just re-apply the setting with "--fb" and an unsupported resolution to force a reset.
# ("--fb" can be used alone here without re-applying everything)
#xrandr --fb 1574x884
xrandr --fb 1574x884 --output eDP1 --mode 1366x768 --panning 1574x886 --scale 1.15226939x1.15364583
References
Some KDE’s gui tools: systemsettings5
> display, kcmshell5 xserver
and kinfocenter
.
Links and sources:
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11 and
12.