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

Monday, January 26, 2015

Play It Again Sam

Tired and Blue - Up Since Midnight

Current audiobook project:
The Wanderer Section One (The Godsend Series)

Previous audiobook project:
Rise of the Supreme

done Section One CHAPTER TWO - again :)

I got 3 reviews complaining of "choppiness" in CHAPTER TWO. So I modified the "Truncate Silence" plugin. I set the max silence to 1.5 seconds and the silence compress ratio to 1.8:1. Previously it was 3 seconds and 1:1, depending entirely on me manually editing each section of silence.

I had a couple of people listen to it at a more middle ground setting. One said the "choppiness" is no longer a distraction. That was the 2nd time she listened to it. The other person listened to it for the first time and said "the silence is distracting" but he also said he may be overly critical because he was "looking for problems".

Because of the review of the 2nd person, I went ahead and tweaked it further to the settings I mentioned.

The overall time of the mp3 went from 3:25 to 2:36.

In other news, I think I finally pinpointed the persistent source of the upload errors. My filtering router, "The Clean Router", was somehow causing it. I can get around it by excluding my computer's MAC address from filtering. I also put in a support ticket with the router manufacturer.

Posted via Blogaway

Monday, January 19, 2015

Ambition minus Mediocrity plus Determination equals Quality

Current audiobook project:

The Wanderer Section One (The Godsend Series)

The raw formula: 4-4+1=1

:) In other words, I recorded 4 chapters. All 4 were mediocre. 2nd try at the first chapter nailed it. Discarded the final three chapters because initial editing seemed like they were mediocre at best. Out of time and energy until next weekend folks!

Another chapter done, another week gone.

Monday, January 5, 2015

A job to pay the bills, and a job that makes me happy!

Once upon a time
Finished Section One Chapter One today. It is from my current audiobook project The Wanderer Section One (The Godsend Series). The author is kind enough to trust me with all three books in the series Section One, Section Two, and Section Three! The author is Timothious Clayton Smith!
There was one F word in the chapter. I traded that word out for "damn". We shall see if the author gets upset about me doing that little trade?.
I think I nailed that chapter! I also nailed the Introduction chapter before it! However, let's see if the author agrees with my assessment. :-)
In other news, I've earned nearly one whole dollar in royalties from my audio book that I finished a few months ago! The caveat is, that royalty came from my purchase of the audiobook. So far I am the only one who bought it. :-) That book is Rise Of The Supreme by Lonzo Lucas Jr! https://mobile.audible.com/pd/Teens/Rise-of-the-Supreme-Audiobook/B00PCK9QHG?s=s
I am producer / narrator of these books!
I am narrator of a reference book on CPR and First Aid! You can find it if you search for Charles Witt as a narrator on Amazon or Audible. I did not make a dime on that book, so far. Producer was supposed to pay me per finished hour, so no royalties will be coming my way, sadly! :-) The producer of that book so far pays me no attention when I request payment from him. My payment should be about $70 for narration services.
That is 70 dollars well spent though! That inspired me to become a producer / narrator and go for the 50% of the royalties. I suppose, for now, :-) I have joined the ranks of broke artists everywhere! Disclaimer: I have a job that pays my bills. Praise God! I'm not kidding.