Quick Quality-of-Life Improvements

Original forum link
https://forum.qubes-os.org/t/23380
Original poster
fiftyfourthparallel
Editors
Bearillo, ludovic, SteveC
Created at
2024-01-02 10:42:16
Last wiki edit
2025-01-25 13:42:30
Revisions
48 revisions
Posts count
100
Likes count
129

VM Management

halt-vm-by-window.sh
#!/bin/bash

CUR_WIN_ID=`xdotool getwindowfocus`
CUR_VM=`xprop _QUBES_VMNAME -id $CUR_WIN_ID |cut -d \" -f2`

qvm-run $CUR_VM 'xdotool search --name "Mozilla Firefox" key ctrl+q'
qvm-run $CUR_VM 'xdotool search --name "Mozilla Thunderbird" key ctrl+q'
sleep 4
/usr/bin/qvm-shutdown $CUR_VM  --wait --timeout=40
open_terminal.sh
#!/bin/bash

ID=`xdotool getwindowfocus`
QUBE=`xprop _QUBES_VMNAME -id $ID|cut -f2 -d\" `
if [[ "$QUBE" == "_QUBES_VMNAME:  not found." ]]; then
  exit
else
  qvm-run $QUBE /usr/bin/qubes-run-terminal &
fi
open_template_terminal.sh
#!/bin/bash

CUR_WIN_ID=`xdotool getwindowfocus`
CUR_VM=`xprop _QUBES_VMNAME -id $CUR_WIN_ID |cut -d \" -f2`
CUR_VM_TEMP=`qvm-prefs $CUR_VM template`

qvm-run -q -a --service -- $CUR_VM_TEMP qubes.StartApp+qubes-run-terminal

exit 0

 

Performance

/bin/dom0-Memory-Notification
#!/bin/bash

FREE_MEMORY=$((`free -m | grep '^Mem' | awk '{print $7}'`))
if (( $FREE_MEMORY < 500 )); then
    notify-send  --expire-time=360000 --urgency=critical 'dom0: Low memory' "Remaining: $FREE_MEMORY MBs"
fi
/bin/Xen-Memory-Notification
#!/bin/bash

FREE_MEMORY=$((`xl info | grep free_memory | sed 's/^.*:\([0-9]*\)/\1/'` / 1000))
if (( $FREE_MEMORY < 8 )); then
    notify-send --expire-time=360000 --urgency=critical 'Xen: Low memory' "Remaining: 
$FREE_MEMORY GBs"
fi

 

Input Devices

Hide cursor (dom0)
mkdir $HOME/bin
cat << 'EOF' | tee $HOME/bin/toggle-unclutter.sh

#! /bin/sh
if pgrep unclutter &> /dev/null 2>&1
then
   killall unclutter
else
   unclutter -idle 1 &
fi
EOF

chmod +x $HOME/bin/toggle-unclutter.sh

 

Storage

In destination qube:

In the following instructions [ORIGIN QUBE] is the qube name without brackets or slashes!

mkdir ~/QubesIncoming
mv ~/QubesIncoming/[ORIGIN QUBE] ~/QubesIncoming/[ORIGIN QUBE]_backup
ln -s [MOUNT POINT] ~/QubesIncoming/[ORIGIN QUBE]

 

Networking

vm-give-default-network
#!/bin/bash

CUR_WIN_ID=$(xdotool getwindowfocus)
CUR_VM=$(xprop _QUBES_VMNAME -id $CUR_WIN_ID | cut -d \" -f 2)

if [[ "$CUR_VM" != *"not found"* ]];then
  if ! qvm-prefs "$CUR_VM" netvm | head -c1 | grep -E '.';then

      TEXT="TOR"
      while read -r line
          do
          if [[ "$line" == "anon-vm" ]];then
              TEXT="TOR"
              break
          else
              TEXT="DEFAULT"
          fi
      done <<< $(qvm-tags "$CUR_VM")

      ANSWER=$(notify-send -A Y="Yes" -A N="No" "Grant $TEXT network access to $CUR_VM" "Do you want to grant $TEXT network access to $CUR_VM?")

      if [[ "$ANSWER" == "Y" ]];then
          if [[ "$TEXT" == "DEFAULT" ]];then
              qvm-start --skip-if-running $(qubes-prefs default_netvm) &&
              qvm-prefs "$CUR_VM" netvm -D &&
                      notify-send "Granted $CUR_VM $TEXT network access!" "The netvm of $CUR_VM was set to $(qvm-prefs "$CUR_VM" netvm)."
          else
              qvm-start --skip-if-running sys-whonix &&
              qvm-prefs "$CUR_VM" netvm sys-whonix &&
              notify-send "Granted $CUR_VM $TEXT network access!" "The netvm of $CUR_VM was set to $(qvm-prefs "$CUR_VM" netvm)."
          fi
      fi
  else
          qvm-prefs "$CUR_VM" netvm None
      notify-send "Disconnected $CUR_VM from network!" "The netvm of $CUR_VM was set to None (n/a)."
  fi
fi
NetworkManager.state
[main]
WirelessEnabled=false

 

Video playback - Reduce VLC's CPU usage - [AppVM] In VLC's preferences, open 'Video' and change 'Output' to 'X11 video output (XCB)' @solene

 

Bug workarounds

 

Etc. - View dom0 update history - [dom0] Enter dnf history to view update events; enter dnf history info [EVENT ID] to view event details. Also works for Fedora in general @adw

widget-click.sh

Call this script with either the argument devices (so widget-click.sh devices) or domains to open the respective widget.

#!/bin/bash
# call with argument 'devices' or 'domains'
sleep 0.1
eval $(xdotool search --onlyvisible --name "qui-$1" getwindowgeometry --shell)
xdotool mousemove $X $Y click 1 mousemove restore

qubes-menu.sh

Note that you may need to adjust the numbers if your screen is not 1080p.

#!/bin/bash
eval $(xdotool getmouselocation --shell)
xdotool mousemove 5 5
gdbus call --session --dest org.qubesos.appmenu --object-path "/org/qubesos/appmenu" --method org.freedesktop.Application.Activate "{}"
if [ $X -lt 720 ] && [ $Y -lt 775 ]; then
  X=720   # prevent the mouse from selecting items in the app menu when opening it with the keyboard
fi        # note that these values may need adjusting if using a screen with a resolution other than 1080p
xdotool mousemove $X $Y

config.append
# Replace example appVM and names/commands with your own

set $mode_launcher Launch: [e]macs [m]ail [s]ignal
bindsym $mod+o mode "$mode_launcher"

mode "$mode_launcher" {
bindsym e exec qvm-run app-dev "emacsclient -c -a 'emacs'"
bindsym s exec qvm-run app-signal signal-desktop
bindsym m exec qvm-run app-mail thunderbird

bindsym Escape mode "default"
bindsym Return mode "default"
}
screenshot_VM.sh
#!/bin/sh
# lets the user take a screenshot based on rectangular selection and sends it to the currently focused VM

CUR_WIN_ID=`xdotool getwindowfocus`
CUR_VM=`xprop _QUBES_VMNAME -id $CUR_WIN_ID | cut -d \" -f 2`

if [[ "$CUR_VM" != "_QUBES_VMNAME:  not found." ]]; then
  xfce4-screenshooter -r -o "qvm-copy-to-vm $CUR_VM"
  notify-send "Screenshot sent!" "Your selection has been sent as a screenshot to $CUR_VM!"
fi

 

 


 

This is a thread where we collect quick tips and tricks that can improve the Qubes experience.

Feel free to add your tip to this wiki post (anyone can edit this)

 

Guidelines 1. Your tip should contain as few words as possible   2. If your tip can't be condensed into a few lines, it doesn't belong here   3. If your tip is niche with regard to Qubes users, it doesn't belong here*   4. Follow the established style convention   5. Give credit, even to yourself, and link to the original (if needed, also post your tip as reply so you have a link)

* "What's niche?" is going to spawn a lot of debate and angst, but this constraint is necessary to prevent the post from getting bloated and mostly irrelevant