Saturday, January 31, 2015

Adventures In Tiling

Alternate title: "Love Affair With i3wm - a tiling window manager" :)

The last couple of weeks I've been in ecstasy experimenting with i3wm, which is a tiling window manager. You Linux nerds will likely know what I'm talking about.

One tiny personal experience. When I have two bordering windows, why can't I resize both of them at the same time? I actually had those thoughts a few days ago using Ubuntu's default Unity desktop. There it requires resizing each window. In other words, doing it just once cannot be done. Enter i3wm. Now it can be done!

I prefer "natural scrolling", so I implemented that as well.

I have multiple environments with varying monitors that I use dependant on Laptop, Work, or Studio. So I use j4-make-config to allow for automatic custom config of i3wm including the theme / colors. Related to the color / theme stuff, I use GNOME Color Chooser because I really love green. I also love black as a contrast to green / grey etc. So I am using tango-jungo theme, customized with every $black and every $darkgrey replaced with just "black". The effect is beautiful. My active window is surrounded by bright green while all other windows are surrounded by jet black. Sorry no screenshots. Sensitive information on these screens. Use your creative mind to imagine the beauty of it!

I prefer the behavior of the following commands which do not require root password while still doing clean poweroff and reboot.
lrwxrwxrwx   1 cwitt cwitt   27 Feb 16 13:00 Poweroff.sh -> /home/cwitt/bin/Poweroff.sh
lrwxrwxrwx   1 cwitt cwitt   25 Feb 16 13:00 Reboot.sh -> /home/cwitt/bin/Reboot.sh
cwitt@cwittUbuntuDB:~/.i3$ cat Poweroff.sh Reboot.sh 
#!/bin/bash
# poweroff without password

dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" \
/org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop

#
#!/bin/bash
# reboot without password

dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" \
/org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Restart

#

I like nm-applet for Network Manager ethernet / wifi / vpn stuff. So I added a file in /etc/sudoers.d like this. It needs to run as root to be able to do everything you want to do.
sudo visudo -f /etc/sudoers.d/custom
cwitt@cwittUbuntuDB:~/.i3$ sudo cat /etc/sudoers.d/custom 
cwitt cwittUbuntuDB = NOPASSWD: /usr/bin/nm-applet
#

In my i3wm config, you will see that I use F12 for typing commands using dmenu, $mod+F12 for rofi window switcher, and $mod+Shift+F12 for file manager (in my case nautilus). Nautilus by the way required and alias to avoid Nautilus controlling my desktop, just want the file manager please.
alias nautilus='nautilus --no-desktop --new-window'

Ok, here is my i3wm config for Studio which is where I am at the moment.
cwitt@cwittUbuntuDB:~/.i3$ cat config
# This file has been auto-generated by i3-config-wizard(1).
# It will not be overwritten, so edit it as you like.
#
# Should you change your keyboard layout some time, delete
# this file and re-run i3-config-wizard(1).
#

# i3 config file (v4)
#
# Please see http://i3wm.org/docs/userguide.html for a complete reference!

# default border is 1pixel - too small :)
new_window normal

# wallpaper
exec_always --no-startup-id feh --bg-max ~/.i3/wallpaper.jpg

# [class="Google-chrome" id=58720604 instance="crx_eggkanocgddhmamlbiijnphhppkpkmkl" title="Tabs Outliner" window_role="pop-up"]
assign [class="Google-chrome" instance="crx_eggkanocgddhmamlbiijnphhppkpkmkl" window_role="pop-up"] 1
for_window [class="Google-chrome" instance="crx_eggkanocgddhmamlbiijnphhppkpkmkl" window_role="pop-up"] focus

# [class="Vncviewer" id=67108881 instance="vncviewer" title="TightVNC: nocmonitor1:0"]
assign [class="Vncviewer"] 10
for_window [class="Vncviewer"] focus

# Rdio Pause
# bindsym $mod+control+space exec xdotool search --name Rdio && xdotool key --window $(xdotool search --name Rdio) space
# bindsym F1 exec xdotool search --name Google-chrome && xdotool key --window $(xdotool search --name Google-chrome) alt+t

# nm-applet for wifi, ethernet, vpn
exec_always --no-startup-id "sleep 20 && pgrep nm-applet || sudo /usr/bin/nm-applet"
# duplicati does versioned backups
exec_always --no-startup-id "sleep 3 && pgrep duplicati || ~/bin/duplicati.sh"
# insync syncs with Google Drive (most recent version only) - hence duplicati for versioning of some things
# insync notify applet seems to disappear upon i3wm restart, so always quit and start it
exec_always --no-startup-id "sleep 3 && insync quit && insync start"
# /usr/NX/bin/: nxserver.bin nxd nxnode.bin nxclient.bin start w/o my help, so far so good

# natural scrolling for touchpad
exec --no-startup-id xinput set-prop 11 "Synaptics Scrolling Distance" -101, -101

# use Mod4 (Windows / Super) as mod
set $mod Mod4

# Font for window titles. Will also be used by the bar unless a different font
# is used in the bar {} block below.
font pango:Ubuntu 16

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

# start a terminal
bindsym $mod+Return exec i3-sensible-terminal

# kill focused window
bindsym $mod+Escape kill

# reName workspace
bindsym $mod+n exec i3-input -F 'rename workspace to "%s"' -P 'New name: '

# start a file manager
bindsym $mod+Shift+F12 exec nautilus
# start dmenu (a program launcher)
bindsym F12 exec dmenu_run
# rofi is good window switcher and also alternative to dmenu
exec_always --no-startup-id "killall rofi;rofi -key $mod+F12"
# There also is the (new) i3-dmenu-desktop which only displays applications
# shipping a .desktop file. It is a wrapper around dmenu, so you need that
# installed.
# bindsym $mod+d exec --no-startup-id i3-dmenu-desktop

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

# 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+semicolon 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+Shift+s layout stacking
bindsym $mod+Shift+w layout tabbed
bindsym $mod+Shift+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+c 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

# cwwitt: create new ~/.i3/config
bindsym $mod+Shift+c exec ~/.i3/i3config.sh
# cwwitt: will restart and use current ~/.i3/config
bindsym $mod+Shift+r restart
# lock screen Ctrl-Alt-l
bindsym Control+mod1+l exec i3lock
# BEGIN Create Log out, Reboot, Poweroff bindings
set $mode_system (Enter) logout, (r) reboot, (Esc) poweroff
mode "$mode_system" {
    # Poweroff no password
    bindsym Escape exec ~/bin/Poweroff.sh
    # Logout
    bindsym Return exit
    # Reboot no password
    bindsym r exec ~/bin/Reboot.sh
    # back to normal: very rare, so do Shift+Escape
    bindsym Shift+Escape mode "default"
}
bindsym $mod+Shift+Escape mode "$mode_system"
# END Create Log out, Reboot, Poweroff bindings

# 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 semicolon 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)
exec_always "pgrep stalonetray && sleep 5 && killall stalonetray && sleep 5 && stalonetray || stalonetray"
bar {
        tray_output none
        position top
        status_command i3status
colors {
    # tango jungle <workclass> <border> <backg> <text>
    focused_workspace $green $darkgreen $white
    active_workspace $brown $darkbrown $grey
    inactive_workspace $black $darkblack $grey
    urgent_workspace $yellow $darkyellow $white
  background #222222
separator  #444444
statusline $darkgrey
}
}

# tango dark
set $darkblue #204A87
set $darkbrown #8F5902
set $darkgreen #4E9A06
set $darkmagenta #5C3566
set $darkred #A40000
set $darkyellow #C4A000
set $darkorange #CE5C00

# tango light
set $lightblue #729FCF
set $lightbrown #E9B96E
set $lightgreen #8AE234
set $lightmagenta #AD7FA8
set $lightred #EF2929
set $lightyellow #FCE94F
set $lightorange #FCAF3E

# tango normal
set $blue #3465A4
set $brown #C17D11
set $green #73D216
set $magenta #75507B
set $red #CC0000
set $yellow #EDD400
set $orange #F57900

# tango mono
set $black #555753
set $grey #BABDB6
set $white #EEEEEC
set $darkblack #2E3436
set $darkgrey #888A85
set $darkwhite #D3D7CF

# $i3-background
exec_always --no-startup-id xsetroot -solid '#2E3436'

# tango jungle <clientclass> <border> <backg> <text> <indicator>
client.focused          $green $darkgreen $white $lightgreen
client.focused_inactive $darkgrey $black $grey $darkgrey
client.unfocused        $black $darkblack $grey $darkgrey
client.urgent           $yellow $darkyellow $white $lightyellow

#
# BEGIN config.Studio to be appended to config.base

# Laptop Monitor(LVDS1) logically ABOVE Big Monitor(VGA1) AND aligned at LEFT edge
# fake-outputs 
# Top: LVDS1: skinny, big
# Bottom: VGA1: big, skinny
fake-outputs 466x768+0+0,900x768+466+0,1000x1050+0+768,680x1050+1000+768

# END config.Studio
#

Following are some key files.
This one helps to gather info for application specific window / workspace behavior.
cwitt@cwittUbuntuDB:~/.i3$ cat i3GetWindowCriteria.sh 
#!/bin/sh

# i3-get-window-criteria.sh - Get criteria for use with i3 config commands

# To use, run this script, then click on a window.
# Output is in the format: [<name>=<value> <name>=<value> ...]

# Known problem: when WM_NAME is used as fallback for the 'title="<string>"' criterion,
# quotes in "<string>" are not escaped properly. This is a problem with the output of `xprop`,
# reported upstream: https://bugs.freedesktop.org/show_bug.cgi?id=66807

PROGNAME=`basename "$0"`

# Check for xwininfo and xprop
for cmd in xwininfo xprop; do
    if ! which $cmd > /dev/null 2>&1; then
        echo "$PROGNAME: $cmd: command not found" >&2
        exit 1
    fi
done

match_int='[0-9][0-9]*'
match_string='".*"'
match_qstring='"[^"\\]*(\\.[^"\\]*)*"' # NOTE: Adds 1 backreference

{
    # Run xwininfo, get window id
    window_id=`xwininfo -int | sed -nre "s/^xwininfo: Window id: ($match_int) .*$/\1/p"`
    echo "id=$window_id"

    # Run xprop, transform its output into i3 criteria. Handle fallback to
    # WM_NAME when _NET_WM_NAME isn't set
    xprop -id $window_id |
        sed -nr \
            -e "s/^WM_CLASS\(STRING\) = ($match_qstring), ($match_qstring)$/instance=\1\nclass=\3/p" \
            -e "s/^WM_WINDOW_ROLE\(STRING\) = ($match_qstring)$/window_role=\1/p" \
            -e "/^WM_NAME\(STRING\) = ($match_string)$/{s//title=\1/; h}" \
            -e "/^_NET_WM_NAME\(UTF8_STRING\) = ($match_qstring)$/{s//title=\1/; h}" \
            -e '${g; p}'
} | sort | tr "\n" " " | sed -r 's/^(.*) $/[\1]\n/'

#

These are my config.base and Laptop / Work / Studio config files.
cwitt@cwittUbuntuDB:~/.i3$ for file in config.base config.Laptop config.Work config.Studio;do echo ${file};cat ${file};echo;done
config.base
# This file has been auto-generated by i3-config-wizard(1).
# It will not be overwritten, so edit it as you like.
#
# Should you change your keyboard layout some time, delete
# this file and re-run i3-config-wizard(1).
#

# i3 config file (v4)
#
# Please see http://i3wm.org/docs/userguide.html for a complete reference!

# default border is 1pixel - too small :)
new_window normal

# wallpaper
exec_always --no-startup-id feh --bg-max ~/.i3/wallpaper.jpg

# [class="Google-chrome" id=58720604 instance="crx_eggkanocgddhmamlbiijnphhppkpkmkl" title="Tabs Outliner" window_role="pop-up"]
assign [class="Google-chrome" instance="crx_eggkanocgddhmamlbiijnphhppkpkmkl" window_role="pop-up"] 1
for_window [class="Google-chrome" instance="crx_eggkanocgddhmamlbiijnphhppkpkmkl" window_role="pop-up"] focus

# [class="Vncviewer" id=67108881 instance="vncviewer" title="TightVNC: nocmonitor1:0"]
assign [class="Vncviewer"] 10
for_window [class="Vncviewer"] focus

# Rdio Pause
# bindsym $mod+control+space exec xdotool search --name Rdio && xdotool key --window $(xdotool search --name Rdio) space
# bindsym F1 exec xdotool search --name Google-chrome && xdotool key --window $(xdotool search --name Google-chrome) alt+t

# nm-applet for wifi, ethernet, vpn
exec_always --no-startup-id "sleep 20 && pgrep nm-applet || sudo /usr/bin/nm-applet"
# duplicati does versioned backups
exec_always --no-startup-id "sleep 3 && pgrep duplicati || ~/bin/duplicati.sh"
# insync syncs with Google Drive (most recent version only) - hence duplicati for versioning of some things
# insync notify applet seems to disappear upon i3wm restart, so always quit and start it
exec_always --no-startup-id "sleep 3 && insync quit && insync start"
# /usr/NX/bin/: nxserver.bin nxd nxnode.bin nxclient.bin start w/o my help, so far so good

# natural scrolling for touchpad
exec --no-startup-id xinput set-prop 11 "Synaptics Scrolling Distance" -101, -101

# use Mod4 (Windows / Super) as mod
set $mod Mod4

# Font for window titles. Will also be used by the bar unless a different font
# is used in the bar {} block below.
font pango:Ubuntu 16

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

# start a terminal
bindsym $mod+Return exec i3-sensible-terminal

# kill focused window
bindsym $mod+Escape kill

# reName workspace
bindsym $mod+n exec i3-input -F 'rename workspace to "%s"' -P 'New name: '

# start a file manager
bindsym $mod+Shift+F12 exec nautilus
# start dmenu (a program launcher)
bindsym F12 exec dmenu_run
# rofi is good window switcher and also alternative to dmenu
exec_always --no-startup-id "killall rofi;rofi -key $mod+F12"
# There also is the (new) i3-dmenu-desktop which only displays applications
# shipping a .desktop file. It is a wrapper around dmenu, so you need that
# installed.
# bindsym $mod+d exec --no-startup-id i3-dmenu-desktop

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

# 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+semicolon 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+Shift+s layout stacking
bindsym $mod+Shift+w layout tabbed
bindsym $mod+Shift+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+c 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

# cwwitt: create new ~/.i3/config
bindsym $mod+Shift+c exec ~/.i3/i3config.sh
# cwwitt: will restart and use current ~/.i3/config
bindsym $mod+Shift+r restart
# lock screen Ctrl-Alt-l
bindsym Control+mod1+l exec i3lock
# BEGIN Create Log out, Reboot, Poweroff bindings
set $mode_system (Enter) logout, (r) reboot, (Esc) poweroff
mode "$mode_system" {
    # Poweroff no password
    bindsym Escape exec ~/bin/Poweroff.sh
    # Logout
    bindsym Return exit
    # Reboot no password
    bindsym r exec ~/bin/Reboot.sh
    # back to normal: very rare, so do Shift+Escape
    bindsym Shift+Escape mode "default"
}
bindsym $mod+Shift+Escape mode "$mode_system"
# END Create Log out, Reboot, Poweroff bindings

# 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 semicolon 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)
exec_always "pgrep stalonetray && sleep 5 && killall stalonetray && sleep 5 && stalonetray || stalonetray"
bar {
        tray_output none
        position top
        status_command i3status
        # $i3-theme-bar
}

# $i3-theme-window

config.Laptop
#
# BEGIN config.Laptop to be appended to config.base

# Laptop Monitor(LVDS1)
# fake-outputs: LVDS1: skinny, big
fake-outputs 466x768+0+0,900x768+466+0

# END config.Laptop
#

config.Work
#
#
# BEGIN config.Work to be appended to config.base

# Left Monitor(VGA1) LEFT OF Big Monitor(HDMI3) AND aligned at TOP edge
# fake-outputs: 
# VGA1: All: thunderbird 
# HDMI3: Top Half: tiny pidgin, tiny keepassx, big pac Bottom Half: google-chrome
# fake-outputs 1600x900+0+0,1920x1080+0+0
# fake-outputs 1600x900+0+0,500x540+1600+0,500x540+2100+0,920x540+2600+0,1920x540+1600+540
# fake-outputs 1600x900+0+0,300x440+1600+0,300x440+1900+0,1320x440+2200+0,1920x640+1600+640
# fake-outputs 1600x900+0+0,1920x640+1600+440,300x440+1600+0,300x440+1900+0,1320x440+2200+0
# fake-outputs 1600x900+0+0,960x640+1600+440,960x640+2560+440,300x440+1600+0,300x440+1900+0,1320x440+2200+0
# fake-outputs 960x640+1600+440,960x640+2560+440,300x440+1600+0,300x440+1900+0,1320x440+2200+0,1600x900+0+0
fake-outputs 1600x900+0+0,960x640+1600+440,960x640+2560+440,300x440+1600+0,300x440+1900+0,1320x440+2200+0

# [class="Google-chrome" id=58720509 instance="Google-chrome" title="Case: New - Microsoft Dynamics CRM - Google Chrome" window_role="pop-up"]
assign [class="Google-chrome" instance="Google-chrome" window_role="pop-up"] 3
for_window [class="Google-chrome" instance="Google-chrome" window_role="pop-up"] focus
# [class="Google-chrome" id=58720605 instance="Google-chrome" title="Pentaho Stats for NOC - Google Chrome" window_role="browser"]
assign [class="Google-chrome" instance="Google-chrome" window_role="browser"] 3
for_window [class="Google-chrome" instance="Google-chrome" window_role="browser"] focus
# [class="Google-chrome" id=58720604 instance="crx_eggkanocgddhmamlbiijnphhppkpkmkl" title="Tabs Outliner" window_role="pop-up"]
# assign [class="Google-chrome" instance="crx_eggkanocgddhmamlbiijnphhppkpkmkl" window_role="pop-up"] 1
# for_window [class="Google-chrome" instance="crx_eggkanocgddhmamlbiijnphhppkpkmkl" window_role="pop-up"] focus

# END config.Work
#

config.Studio
#
# BEGIN config.Studio to be appended to config.base

# Laptop Monitor(LVDS1) logically ABOVE Big Monitor(VGA1) AND aligned at LEFT edge
# fake-outputs 
# Top: LVDS1: skinny, big
# Bottom: VGA1: big, skinny
fake-outputs 466x768+0+0,900x768+466+0,1000x1050+0+768,680x1050+1000+768

# END config.Studio
#

Remember j4-make-config makes this easy dynamic customization possible.
cwitt@cwittUbuntuDB:~/.i3$ which j4-make-config 
/home/cwitt/bin/j4-make-config

The fake-outputs in the config is awesome. That allows a physical monitor to be subdivided into smaller fake monitors that i3wm will automatically configure as individual workspaces.

Well, I got other things to do. But this should help some of you that might be interested.
By the way xrandr / arandr will help you figure out your monitors for fake-outputs and j4-make-config use. Happy tiling!

Update: This is so cool! You can move a workspace left, right, up, or down to another monitor or fake-output in my case.

# move focused workspace
bindsym $mod+Shift+Control+j move workspace to output left
bindsym $mod+Shift+Control+k move workspace to output down
bindsym $mod+Shift+Control+l move workspace to output up
bindsym $mod+Shift+Control+semicolon move workspace to output right

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

This may be useful. My mute button already works. But these two enabled the volume up / down.
# Pulse Audio controls
bindsym XF86AudioRaiseVolume exec pactl set-sink-volume 0 +5% #increase sound volume
bindsym XF86AudioLowerVolume exec pactl set-sink-volume 0 -- -5% #decrease sound volume

Update: Again, cooool! In terminals I often copy paste. Unfortunately Ctrl-c is already used to break / stop software. So terminals instead make you do Shift-Ctrl-c and Shift-Ctrl-v to copy paste. It turns out that Ctrl-Super-c also will break / stop software. So, using Autokey, I remapped Ctrl-c and Ctrl-v to do copy / paste.

Super-C.py
# "<ctrl>+<super>+c" also sends "<ctrl>+<c>" 
keyboard.send_keys("<shift>+<ctrl>+c")
Window Filter: .*Pac|.*terminal

Super-V.py
keyboard.send_keys("<shift>+<ctrl>+v")
Window Filter: .*Pac|.*terminal

So, :), I always can use Ctrl-c / Ctrl-v for copy / paste.
I do Ctrl-Super-c to break / stop software.

Update: I only want the i3status and stalonetrayrc stuff on the first workspace. So I changed the bar sections to:
# Start i3bar to display a workspace bar (plus the system information i3status
# finds out, if available)
exec_always "pgrep stalonetray && sleep 5 && killall stalonetray && sleep 5 && stalonetray || stalonetray"
bar {
        output fake-0
        tray_output none
        position top
        status_command i3status
}

bar {
        output fake-1
        output fake-2
        output fake-3
        output fake-4
        output fake-5
        output fake-6
        output fake-7
        tray_output none
        position top
        # $i3-theme-bar
}

Update: See i3wm for an up-to-date list and copy of related configuration files

No comments:

Post a Comment

This is Charles Weldon Witt. Thank you for commenting on my blog.