drama I had a little time today, so I've played around in a VM to figure out all how to get xrandr
to run on boot.
- I've got
xrandr
to successfully change the resolution at boot, however it only effects the Greeter (login screen)
- At login the resolution will reset to what ever the user has selected
- After loging out, the Greeter will reset to the default resolution (
xrandr
will not run again).
Shell Script
We will create a shell script and place it in /usr/local/sbin
. By placing our script in said folder, we can call/execute our script as a command.
By default Solus doesn't have /usr/local/sbin
so we need to create it:
$ mkdir -p /usr/local/sbin
Next we need to make our shell script:
$ gedit /usr/local/sbin/res.sh
#!/bin/bash
# DEBUG OUTPUT
echo "Display: $DISPLAY"
echo "Xauth: $XAUTHORITY"
# wait for DM to start
sleep 1
# xrandr commands to run
xrandr --newmode "1280x720_60.00" 74.50 1280 1344 1472 1664 720 723 728 748 -hsync +vsync
xrandr --addmode VGA-0 "1280x720_60.00"
xrandr --output VGA-0 --mode "1280x720_60.00"
Note: We need to add sleep
to our script. In testing I've found that the shell script may be called to early and fail. Adding a 1 second timeout was enough to ensure that LightDM was fully started before executing the script.
Setup SystemD service
First we need to get the environmental variables for DISPLAY
and XAUTHORITY
.
To get the value for DISPLAY
do the following:
$ echo $DISPLAY
For XAUTHORITY
we need to find the path of the X authority file that our Display Manager uses.
For SDDM (KDE) we do:
$ find /var/run/sddm/ -type f
For LightDM (Budgie) we do:
$ find /var/run/lightdm/root/ -type f
Next we need to create a systemd service script in /etc/systemd/system/
, the name doesn't matter but it must end in .service
. (Change the values as necessary.)
$ sudo gedit /etc/systemd/system/startup.service
[Unit]
Description=Setup VGA Fix
After=graphical.target
[Service]
Environment=DISPLAY=:0
Environment=XAUTHORITY=/var/run/lightdm/root/:0
ExecStart=/usr/local/sbin/res.sh
[Install]
WantedBy=graphical.target
oneshot
If you don't want to use a shell script, another option is to use oneshot
.
oneshot
will execute each comand in series, and if a command fails to run it will abort the service.
For our purposes there is no difference between using oneshot
or running a shell script. \
(I just added it for completeness)
[Service]
Type=oneshot
Environment=DISPLAY=:0
Environment=XAUTHORITY=/var/run/lightdm/root/:0
ExecStart=/bin/sleep 1
ExecStart=/usr/bin/xrandr --newmode "1280x720_60.00" 74.50 1280 1344 1472 1664 720 723 728 748 -hsync +vsync
ExecStart=/usr/bin/xrandr --addmode VGA-0 "1280x720_60.00"
ExecStart=/usr/bin/xrandr --output VGA-0 --mode "1280x720_60.00"
Final Thoughts
Due to the limitations listed above I don't know if this will solve your issue, though this does do what was requested "run a script (a series of commands) at boot" (xrandr
in specific).
Since the change doesn't apply to the user, you may need to follow @brent's suggestion and setup a autostart (you can link to the same res.sh
script).
For the Greeter logout/switch user issue, I don't have any ideas at the moment. I don't really know anything about how Greeters work so I'm currently at a loss for any suggestions.
You may want to look into LightDM (since your on Budgie) there may be a better solution there. It looks like you may be able to run xrandr
directly though/by LightDM, it may be a better solution for what your trying to do (Arch Wiki).
Another option would be to configure x directly, but again I definitely won't be much help there.