January 06, 2017

My i3 configuration for Qubes-OS

Here you can find some useful tips on the configuration of i3 (a windows manager) and it’s integration with qubes. This post is mostly a reference for random walkers on google who happend to search the right keyword, and me, since I tend to forget quickly how I achieved certain configuration which is edited for:

  1. Toggle/untoggle keyboard backlight with $mod+n
  2. Exec i3lock with $mod+b
  3. Open a terminal in qubes appvm with $mod+t
  4. Up & Down volume keys (keyboard dependent)
  5. I can name my workspaces with $mod+y. If the name start with a number, than I can treat them like they were just numbered and switch between workspaces and move container as before. Last but not least, I have enabled shortcut to move between previously used workspaces.

Ready?

set $mod Mod1

# Font for window titles. Will also be used by the bar unless a different font
# is used in the bar {} block below.
# This font is widely installed, provides lots of unicode glyphs, right-to-left
# text rendering and scalability on retina/hidpi displays (thanks to pango).
font pango:DejaVu Sans Mono 10
# Before i3 v4.8, we used to recommend this one as the default:
# font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
# The font above is very space-efficient, that is, it looks good, sharp and
# clear in small sizes. However, its unicode glyph coverage is limited, the old
# X core fonts rendering does not support right-to-left and this being a bitmap
# font, it doesn’t scale on retina/hidpi displays.

# Use Mouse+$mod to drag floating windows to their wanted position
floating_modifier $mod

# start a terminal in the domain of the currently active window
bindsym $mod+Return exec qubes-i3-sensible-terminal

# kill focused window
bindsym $mod+Shift+q kill

# start dmenu (a program launcher)
bindsym $mod+d exec --no-startup-id i3-dmenu-desktop --dmenu="dmenu -nb #d2d2d2 -nf #000000 -sb #63a0ff"

# change focus
bindsym $mod+j focus left
bindsym $mod+k focus down
bindsym $mod+l focus up
bindsym $mod+ograve focus right

bindsym $mod+t exec "qvm-run Home gnome-terminal"

# alternatively, you can use the cursor keys:
bindsym $mod+Left focus left
bindsym $mod+Down focus down
bindsym $mod+Up focus up
bindsym $mod+Right focus right

# move focused window
bindsym $mod+Shift+j move left
bindsym $mod+Shift+k move down
bindsym $mod+Shift+l move up
bindsym $mod+Shift+ograve move right

# alternatively, you can use the cursor keys:
bindsym $mod+Shift+Left move left
bindsym $mod+Shift+Down move down
bindsym $mod+Shift+Up move up
bindsym $mod+Shift+Right move right

# split in horizontal orientation
bindsym $mod+h split h

# split in vertical orientation
bindsym $mod+v split v

# enter fullscreen mode for the focused container
bindsym $mod+f fullscreen

# change container layout (stacked, tabbed, toggle split)
bindsym $mod+s layout stacking
bindsym $mod+w layout tabbed
bindsym $mod+e layout toggle split

# toggle tiling / floating
bindsym $mod+Shift+space floating toggle

# change focus between tiling / floating windows
bindsym $mod+space focus mode_toggle

# focus the parent container
bindsym $mod+a focus parent

# focus the child container
#bindsym $mod+d focus child

# switch to workspace
bindsym $mod+1 workspace number 1
bindsym $mod+2 workspace number 2
bindsym $mod+3 workspace number 3
bindsym $mod+4 workspace number 4
bindsym $mod+5 workspace number 5
bindsym $mod+6 workspace number 6
bindsym $mod+7 workspace number 7
bindsym $mod+8 workspace number 8
bindsym $mod+9 workspace number 9
bindsym $mod+0 workspace number 10




# move focused container to workspace
bindsym $mod+Shift+1 move container to workspace number 1
bindsym $mod+Shift+2 move container to workspace number 2
bindsym $mod+Shift+3 move container to workspace number 3
bindsym $mod+Shift+4 move container to workspace number 4
bindsym $mod+Shift+5 move container to workspace number 5
bindsym $mod+Shift+6 move container to workspace number 6
bindsym $mod+Shift+7 move container to workspace number 7
bindsym $mod+Shift+8 move container to workspace number 8
bindsym $mod+Shift+9 move container to workspace number 9
bindsym $mod+Shift+0 move container to workspace number 10

bindsym $mod+y exec i3-input -F 'rename workspace to "%s"' -P ' New name for this workspace'

# reload the configuration file
bindsym $mod+Shift+c reload
# restart i3 inplace (preserves your layout/session, can be used to upgrade i3)
bindsym $mod+Shift+r restart
# exit i3 (logs you out of your X session)
bindsym $mod+Shift+e exec "i3-nagbar -t warning -m 'You pressed the exit shortcut. Do you really want to exit i3? This will end your X session.' -b 'Yes, exit i3' 'i3-msg exit'"

# resize window (you can also use the mouse for that)
mode "resize" {
        # These bindings trigger as soon as you enter the resize mode

        # Pressing left will shrink the window’s width.
        # Pressing right will grow the window’s width.
        # Pressing up will shrink the window’s height.
        # Pressing down will grow the window’s height.
        bindsym j resize shrink width 10 px or 10 ppt
        bindsym k resize grow height 10 px or 10 ppt
        bindsym l resize shrink height 10 px or 10 ppt
        bindsym ograve resize grow width 10 px or 10 ppt

        # same bindings, but for the arrow keys
        bindsym Left resize shrink width 10 px or 10 ppt
        bindsym Down resize grow height 10 px or 10 ppt
        bindsym Up resize shrink height 10 px or 10 ppt
        bindsym Right resize grow width 10 px or 10 ppt

        # back to normal: Enter or Escape
        bindsym Return mode "default"
        bindsym Escape mode "default"
}

bindsym $mod+r mode "resize"
# Start i3bar to display a workspace bar (plus the system information i3status
# finds out, if available)
bar {
        status_command qubes-i3status
        font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1

        colors {
            background #d2d2d2
            statusline #00000

            #class               #border #backgr #text
            focused_workspace    #4c7899 #63a0ff #000000
            active_workspace     #333333 #5f676a #ffffff
            inactive_workspace   #222222 #333333 #888888
            urgent_workspace     #BD2727 #E79E27 #000000
        }
}

# Use a screen locker
exec --no-startup-id "xautolock -detectsleep -time 6 -locker 'i3lock -d -c 008000' -notify 30 -notifier \"notify-send -t 2000 'Locking screen in 30 seconds'\""

# Make sure all xdg autostart entries are started, this is (among other things)
# necessary to make sure transient vm's come up
exec --no-startup-id qubes-i3-xdg-autostart

# bindsym XF86AudioRaiseVolume exec "amixer -q sset Master,0 1+ unmute"
# bindsym XF86AudioLowerVolume exec "amixer -q sset Master,0 1- unmute"

#bindsym $mod+p exec "amixer -q sset Master,0 1+ unmute"
bindsym $mod+m exec "amixer -q sset Master,0 1- unmute"

bindsym XF86AudioMute exec "amixer -q sset Master,0 toggle"

bindsym $mod+Shift+n exec "sudo bash /home/scinawa/.i3/keybacklight.sh"
bindsym $mod+Shift+b exec "i3lock -c 045347"

bindsym $mod+n workspace next
bindsym $mod+p workspace prev





Bash script for backlight of keyboard.

The bash script I’m calling with $mod+n is the following, which is copied from [1]

#!/bin/sh
STATUS=`xset -q | grep "LED" | awk '{print $10}'`
if [ "${STATUS}" = "00000000" ]
then 
    xset led 3
else
    xset -led 3
fi
exit 0

Creating shortcut-wise calls to browser profiles

I find cozy to have specific browser shortcut in my i3 menu, where I can lunch specific firefox profile. In this way, I can call specific browser profiles (banking, social, cloud stuff, etc..) with a name that is faster to type than $appvm-firefox$ and than switching profile.

This is what I did recently to get a fast shortcut for my web app of calendar I’m currently using:

In dom0:

vim /home/`whoami`/.local/share/applications/$APPVM-name.desktop

Edit it and specify:

  1. A mnemonic name which is also fast to type, like “CAL”.
  2. The proper link to your appvm menu file: something like /usr/share/application/calendar.desktop

In the AppVM you want to lunch the application:

cd /usr/share/application/
cp firefox.desktop calendar.desktop
vim calendar.desktop

Scroll down and modify the exec line like this:

X-Desktop-File-Install-Version=0.22

[Desktop Action new-window]
Name=Open a New Window
Exec=firefox -P calendar %u

[Desktop Action new-private-window]
Name=Open a New Private Window
Exec=firefox --private-window %u

When I type “CAL” in the i3 menu, I open a specific firefox profile with the homepage that I have specified. Voilà!

References

[1] https://m.reddit.com/r/i3wm/comments/3sumks/cant_get_scrolllock_and_mod_key_to_work/