about summary refs log tree commit diff
path: root/configs/shared/.config/i3
diff options
context:
space:
mode:
authorWilliam Carroll <wpcarro@gmail.com>2019-10-09T11·13+0100
committerWilliam Carroll <wpcarro@gmail.com>2019-12-24T15·21+0000
commit6b456c1b7a4f6899f063a6e65355af51901d9c7a (patch)
treecfc70d74818ae9fabdbbfb0cf16cce092e4c1a09 /configs/shared/.config/i3
parenta7c72adb2ebec1e497fc040eaf3551d564d61a5b (diff)
Massive configuration overhaul
Currently paying the price of months of non-diligent git usage.

Here's what has changed.

- Theming support in Gvcci and wpgtk
- Dropping support for i3
- Supporting EXWM
- Many Elisp modules
- Collapsed redundant directories in ./configs
Diffstat (limited to 'configs/shared/.config/i3')
-rw-r--r--configs/shared/.config/i3/config329
-rw-r--r--configs/shared/.config/i3/config.bak330
-rwxr-xr-xconfigs/shared/.config/i3/dmenu_timer.sh113
-rwxr-xr-xconfigs/shared/.config/i3/passmenu25
-rw-r--r--configs/shared/.config/i3/workspace_1.json76
5 files changed, 873 insertions, 0 deletions
diff --git a/configs/shared/.config/i3/config b/configs/shared/.config/i3/config
new file mode 100644
index 000000000000..e52bf23b3d96
--- /dev/null
+++ b/configs/shared/.config/i3/config
@@ -0,0 +1,329 @@
+# Keymapping philosophy:
+# When I feel it's appropriate, I try to borrow existing KBDs from OSX or
+# Windows. For example, I use Ctrl+Alt+Del to start the screen lock, since this
+# is a really well-known KBD. One notable difference is that when I'm borrowing
+# OSX KBDs, I prefer using Alt instead of Super since the keyboard that I'm
+# using has the Alt key in the same location as the Super key on my mac
+# keyboard. I could rebind this, and I just may. But for now, that's worth
+# pointing out.
+# The reason behind borrowing from Windows and OSX is that some of these
+# keybindings are hardwired into my muscle memory. I also tend to work between
+# Linux and OSX quite often. Since OSX is much more difficult to remap KBDs
+# than it is in Linux, I prefer to support the OSX KBDs to reduce the number of
+# KBDs my feeble memory needs to store.
+
+set $mod Mod1
+set $window Mod1+Ctrl
+set $super Mod4
+set $terminal terminator
+set $browser  google-chrome
+
+# Font for window titles. Will also be used by the bar unless a different font
+# is used in the bar block below.
+font pango:Monospace 10px
+
+# Use Mouse+$mod to drag floating windows to their wanted position
+floating_modifier $mod
+
+# i3-gaps (depends on i3-gaps installation)
+# gaps inner 7
+# gaps outer 0
+# smart_gaps on
+#
+# bindsym $mod+Ctrl+plus   gaps outer current plus  5
+# bindsym $mod+Ctrl+minus  gaps outer current minus 5
+# bindsym $mod+Shift+plus  gaps inner current plus  5
+# bindsym $mod+Shift+minus gaps inner current minus 5
+
+# Support XF86 keys for audio playback and volume control
+bindsym XF86AudioMute        exec --no-startup-id pactl set-sink-mute   @DEFAULT_SINK@ toggle
+bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ -10%
+bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ +10%
+bindsym XF86AudioPrev        exec --no-startup-id playerctl previous
+bindsym XF86AudioNext        exec --no-startup-id playerctl next
+bindsym XF86AudioStop        exec --no-startup-id playerctl play-pause
+bindsym XF86AudioPlay        exec --no-startup-id playerctl play-pause
+
+# KBD Principles:
+# $mod+Ctrl+<app_char>       = starting an application
+# where <app_char> is a reserved character for a commonly used application.
+#
+# <app_char> definitions:
+# terminal = t, Return
+# emacs    = e
+# chrome   = c
+# spotify  = s
+# intellij = i
+bindsym $mod+Ctrl+t exec $terminal
+bindsym $mod+Return exec $terminal
+bindsym $mod+Ctrl+e exec emacsclient --create-frame
+bindsym $mod+Ctrl+c exec $browser
+bindsym $mod+Ctrl+s exec spotify
+bindsym $mod+Ctrl+i exec zsh -i -c intellij
+
+# support dmenu-based bookmarks
+# bindsym $mod+Ctrl+b exec rofi -dmenu <$DOTFILES/bookmarks.txt | xargs $browser
+
+set $bookmarks_mode Bookmarks (a) add, (d) delete, (b) browse
+mode "$bookmarks_mode" {
+     bindsym a exec zsh -i -c add_bookmark,  mode "default"
+     bindsym d exec zsh -i -c rm_bookmark,   mode "default"
+     bindsym b exec zsh -i -c open_bookmark, mode "default"
+
+     bindsym Escape mode "default"
+     bindsym Ctrl+g mode "default"
+     bindsym Ctrl+c mode "default"
+}
+bindsym $mod+Ctrl+b mode "$bookmarks_mode"
+
+# pass integration
+bindsym $mod+Ctrl+backslash exec ~/.config/i3/passmenu # mirroring the 1password KBD
+
+# integrate with Emacs's org-mode
+bindsym $mod+o exec zsh -i -c org_capture
+# TODO: Support "coding size", "dialog-size" (for org_capture)
+# TODO: Support way to cycle through predefined sizes.
+for_window [class="GoogleEmacs" instance="floating"] floating enable, resize set height 1200px, resize set width 780px
+
+# Here is a sketch of the cycle sizes idea.
+# TODO: Support this.
+# mode "cycle_sizes_floating_mode" {
+#      # coding mode
+#      bindsym a for_window [mode="floating", class="actively-selected"] resize set height 1200px, resize set width 780px
+#      bindsym b for_window [mode="floating", class="actively-selected"] resize set height 500px, resize set width 500px
+#
+#      bindsym Escape mode "default"
+#      bindsym Ctrl+g mode "default"
+#      bindsym Ctrl+c mode "default"
+# }
+
+# ensure Spotify windows float
+for_window [class="Spotify"] floating enable
+
+# ensure system service that run through XDG start
+exec --no-startup-id dex -ae i3
+
+# rofi configuration
+bindsym $mod+space exec --no-startup-id rofi -show combi
+bindsym $mod+t     exec --no-startup-id ~/.config/i3/dmenu_timer.sh ~/.local/share/sounds/gong.mp3
+
+# switch workspaces
+bindsym $mod+Tab       workspace next
+bindsym $mod+Shift+Tab workspace prev
+
+# file manager
+bindsym $mod+n exec $terminal -x lf ~/Dropbox
+
+# clipboard manager
+# NOTE: Ctrl-c is already covered since `clipmenu` listens for X clipboard
+# events using `clipnotify`.
+# NOTE: `clipmenud` is started in `.xsessionrc.shared`
+# NOTE: This is a bit of a hack intended to support pasting in both the terminal
+# and in GUI applications. `st` expects `ctrl+Shift+v` while GUIs expect
+# `ctrl+v`. In the instances where GUIs don't support `ctrl+Shift+v` already, it
+# acts like `ctrl+v`, so it should "just work".
+bindsym Ctrl+$mod+v exec clipmenu && xdotool key --clearmodifiers ctrl+Shift+v
+
+# Screenshot
+# TODO: Support variants: (a) App (r) Region (f) Fullscreen.
+# TODO: Support hosting to third-party image hosting.
+set $screenshot_mode Screenshot (g) googleplex (l) local
+mode "$screenshot_mode" {
+     bindsym g exec zsh -i -c snipit,     mode "default"
+     bindsym l exec zsh -i -c screenshot, mode "default"
+
+     bindsym Escape mode "default"
+     bindsym Ctrl+g mode "default"
+     bindsym Ctrl+c mode "default"
+}
+bindsym $mod+s mode "$screenshot_mode"
+
+# online documentation
+bindsym $mod+Shift+slash exec $browser https://i3wm.org/docs/userguide.html
+
+# no title bars
+for_window [class="^.*"] border pixel 1
+
+# disable mouse hover focus
+focus_follows_mouse no
+
+# kill focused window
+bindsym $window+q kill
+
+# Toggle focus
+bindsym $window+f floating toggle
+
+# GTK Themes
+exec --no-startup-id gnome-settings-daemon
+
+# wireless selection mechanism
+exec --no-startup-id nm-applet
+
+# set the split direction
+bindsym $mod+v split vertical
+# cannot bind $mod+h because of movement commands
+bindsym $mod+Shift+v split horizontal
+
+# sound applet
+exec --no-startup-id gnome-sound-applet
+
+# change focus
+bindsym $window+h focus left
+bindsym $window+j focus down
+bindsym $window+k focus up
+bindsym $window+l focus right
+
+# move focused window
+bindsym $mod+Shift+h move left  100
+bindsym $mod+Shift+j move down  100
+bindsym $mod+Shift+k move up    100
+bindsym $mod+Shift+l move right 100
+
+# enter fullscreen mode for the focused container
+bindsym $window+z fullscreen toggle
+
+# change container layout (stacked, tabbed, toggle split)
+bindsym $super+e layout toggle split
+bindsym $super+s layout stacking
+bindsym $super+t layout tabbed
+
+# toggle tiling / floating
+bindsym $mod+Shift+f floating toggle
+
+# toggle stickiness
+bindsym $mod+Shift+s sticky toggle
+
+# focus the parent container
+# bindsym $mod+a focus parent
+bindsym $mod+Shift+a focus child
+
+# Define names for default workspaces for which we configure key bindings later on.
+# We use variables to avoid repeating the names in multiple places.
+set $ws1  "1"
+set $ws2  "2"
+set $ws3  "3"
+set $ws4  "4"
+set $ws5  "5"
+set $ws6  "6"
+set $ws7  "7"
+set $ws8  "8"
+set $ws9  "9"
+set $ws10 "10"
+
+# jump to workspace
+bindsym $mod+1 workspace $ws1
+bindsym $mod+2 workspace $ws2
+bindsym $mod+3 workspace $ws3
+bindsym $mod+4 workspace $ws4
+bindsym $mod+5 workspace $ws5
+bindsym $mod+6 workspace $ws6
+bindsym $mod+7 workspace $ws7
+bindsym $mod+8 workspace $ws8
+bindsym $mod+9 workspace $ws9
+bindsym $mod+0 workspace $ws10
+
+# edit configuration files
+# TODO: Standardize KBDs for C,R,U,D operations.
+# TODO: Move shell script to /usr/local/bin
+# Create
+# TODO: Choose another KBD. This is temporary.
+bindsym $mod+a       exec zsh -i -c add_config
+# Read
+bindsym $mod+c       exec zsh -i -c edit_config
+# Update
+# TODO: Support operation to update_config label and path
+# Delete
+bindsym $mod+Shift+c exec zsh -i -c rm_config
+
+# move and follow focused container to workspace
+bindsym $mod+Shift+1 move container to workspace $ws1;  workspace $ws1
+bindsym $mod+Shift+2 move container to workspace $ws2;  workspace $ws2
+bindsym $mod+Shift+3 move container to workspace $ws3;  workspace $ws3
+bindsym $mod+Shift+4 move container to workspace $ws4;  workspace $ws4
+bindsym $mod+Shift+5 move container to workspace $ws5;  workspace $ws5
+bindsym $mod+Shift+6 move container to workspace $ws6;  workspace $ws6
+bindsym $mod+Shift+7 move container to workspace $ws7;  workspace $ws7
+bindsym $mod+Shift+8 move container to workspace $ws8;  workspace $ws8
+bindsym $mod+Shift+9 move container to workspace $ws9;  workspace $ws9
+bindsym $mod+Shift+0 move container to workspace $ws10; workspace $ws10
+
+# move focused container to workspace
+bindsym $mod+Ctrl+1 move container to workspace $ws1
+bindsym $mod+Ctrl+2 move container to workspace $ws2
+bindsym $mod+Ctrl+3 move container to workspace $ws3
+bindsym $mod+Ctrl+4 move container to workspace $ws4
+bindsym $mod+Ctrl+5 move container to workspace $ws5
+bindsym $mod+Ctrl+6 move container to workspace $ws6
+bindsym $mod+Ctrl+7 move container to workspace $ws7
+bindsym $mod+Ctrl+8 move container to workspace $ws8
+bindsym $mod+Ctrl+9 move container to workspace $ws9
+bindsym $mod+Ctrl+0 move container to workspace $ws10
+
+# reload, restart i3
+bindsym $super+r       exec cat ~/.config/i3/config.shared ~/.config/i3/config.device >~/.config/i3/config; reload
+bindsym $super+Shift+r exec cat ~/.config/i3/config.shared ~/.config/i3/config.device >~/.config/i3/config; restart
+
+# logout dialog
+set $mode_system System (l) lock, (e) logout, (s) suspend, (h) hibernate, (r) reboot, (Shift+s) shutdown
+mode "$mode_system" {
+    bindsym l       exec --no-startup-id xsecurelock,                        mode "default"
+    bindsym e       exit,                                                    mode "default"
+    bindsym s       exec --no-startup-id xsecurelock && systemctl suspend,   mode "default"
+    bindsym h       exec --no-startup-id xsecurelock && systemctl hibernate, mode "default"
+    bindsym r       exec --no-startup-id systemctl reboot,                   mode "default"
+    bindsym Shift+s exec --no-startup-id systemctl poweroff,                 mode "default"
+
+    # back to normal: Enter or Escape
+    bindsym Escape mode "default"
+    bindsym Ctrl+g mode "default"
+    bindsym Ctrl+c mode "default"
+}
+bindsym Ctrl+Mod1+Delete mode "$mode_system"
+
+# resize window (you can also use the mouse for that)
+mode "resize" {
+        bindsym h resize shrink width  10 px or 10 ppt
+        bindsym j resize shrink height 10 px or 10 ppt
+        bindsym k resize grow   height 10 px or 10 ppt
+        bindsym l resize grow   width  10 px or 10 ppt
+
+        bindsym Escape mode "default"
+        bindsym Ctrl+g mode "default"
+        bindsym Ctrl+c mode "default"
+}
+bindsym $mod+Shift+r mode "resize"
+
+# passthrough mode to support Emacs, Tmux, Vim KBDs for window and pane management
+mode "passthrough" {
+     bindsym $mod+Escape mode "default"
+}
+bindsym $mod+Escape mode "passthrough"
+
+# class                 border     backgr     text      indicator child_border
+client.focused          #83526a   #83526a   #8de0e1 #E8C35F  #83526a
+client.focused_inactive #83526a   #83526a   #8de0e1 #E8C35F  #5a3849
+client.unfocused        #5a3849 #5a3849 #8de0e1 #E8C35F  #5a3849
+client.urgent           #E8C35F   #E8C35F   #8de0e1 #E8C35F  #E8C35F
+client.placeholder      #31213f   #629c9d   #8de0e1 #31213f  #629c9d
+client.background       #31213f
+
+bar {
+    status_command i3status
+    font pango:Monospace 10px
+    position top
+    # disable system tray icons
+    tray_output none
+    colors {
+           background #31213f
+           statusline #83526a # text color in status line
+           separator  #83526a
+           # class            border     text       indicator
+           focused_workspace  #83526a   #8de0e1  #31213f
+           active_workspace   #83526a   #5a3849 #83526a
+           inactive_workspace #5a3849 #83526a   #5a3849
+           urgent_workspace   #5a3849 #83526a   #5a3849
+    }
+}
+
+# wpg integration
+exec --no-startup-id ~/.config/wpg/wp_init.sh
\ No newline at end of file
diff --git a/configs/shared/.config/i3/config.bak b/configs/shared/.config/i3/config.bak
new file mode 100644
index 000000000000..ccfae1d453b8
--- /dev/null
+++ b/configs/shared/.config/i3/config.bak
@@ -0,0 +1,330 @@
+# Keymapping philosophy:
+# When I feel it's appropriate, I try to borrow existing KBDs from OSX or
+# Windows. For example, I use Ctrl+Alt+Del to start the screen lock, since this
+# is a really well-known KBD. One notable difference is that when I'm borrowing
+# OSX KBDs, I prefer using Alt instead of Super since the keyboard that I'm
+# using has the Alt key in the same location as the Super key on my mac
+# keyboard. I could rebind this, and I just may. But for now, that's worth
+# pointing out.
+# The reason behind borrowing from Windows and OSX is that some of these
+# keybindings are hardwired into my muscle memory. I also tend to work between
+# Linux and OSX quite often. Since OSX is much more difficult to remap KBDs
+# than it is in Linux, I prefer to support the OSX KBDs to reduce the number of
+# KBDs my feeble memory needs to store.
+
+set $mod Mod1
+set $window Mod1+Ctrl
+set $super Mod4
+# TODO: Support alacritty or another fast terminal.
+set $terminal terminator
+set $browser  google-chrome
+
+# Font for window titles. Will also be used by the bar unless a different font
+# is used in the bar block below.
+font pango:Monospace 10px
+
+# Use Mouse+$mod to drag floating windows to their wanted position
+floating_modifier $mod
+
+# i3-gaps (depends on i3-gaps installation)
+# gaps inner 7
+# gaps outer 0
+# smart_gaps on
+#
+# bindsym $mod+Ctrl+plus   gaps outer current plus  5
+# bindsym $mod+Ctrl+minus  gaps outer current minus 5
+# bindsym $mod+Shift+plus  gaps inner current plus  5
+# bindsym $mod+Shift+minus gaps inner current minus 5
+
+# Support XF86 keys for audio playback and volume control
+bindsym XF86AudioMute        exec --no-startup-id pactl set-sink-mute   @DEFAULT_SINK@ toggle
+bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ -10%
+bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ +10%
+bindsym XF86AudioPrev        exec --no-startup-id playerctl previous
+bindsym XF86AudioNext        exec --no-startup-id playerctl next
+bindsym XF86AudioStop        exec --no-startup-id playerctl play-pause
+bindsym XF86AudioPlay        exec --no-startup-id playerctl play-pause
+
+# KBD Principles:
+# $mod+Ctrl+<app_char>       = starting an application
+# where <app_char> is a reserved character for a commonly used application.
+#
+# <app_char> definitions:
+# terminal = t, Return
+# emacs    = e
+# chrome   = c
+# spotify  = s
+# intellij = i
+bindsym $mod+Ctrl+t exec $terminal
+bindsym $mod+Return exec $terminal
+bindsym $mod+Ctrl+e exec emacsclient --create-frame
+bindsym $mod+Ctrl+c exec $browser
+bindsym $mod+Ctrl+s exec spotify
+bindsym $mod+Ctrl+i exec zsh -i -c intellij
+
+# support dmenu-based bookmarks
+# bindsym $mod+Ctrl+b exec rofi -dmenu <$DOTFILES/bookmarks.txt | xargs $browser
+
+set $bookmarks_mode Bookmarks (a) add, (d) delete, (b) browse
+mode "$bookmarks_mode" {
+     bindsym a exec zsh -i -c add_bookmark,  mode "default"
+     bindsym d exec zsh -i -c rm_bookmark,   mode "default"
+     bindsym b exec zsh -i -c open_bookmark, mode "default"
+
+     bindsym Escape mode "default"
+     bindsym Ctrl+g mode "default"
+     bindsym Ctrl+c mode "default"
+}
+bindsym $mod+Ctrl+b mode "$bookmarks_mode"
+
+# pass integration
+bindsym $mod+Ctrl+backslash exec ~/.config/i3/passmenu # mirroring the 1password KBD
+
+# integrate with Emacs's org-mode
+bindsym $mod+o exec zsh -i -c org_capture
+# TODO: Support "coding size", "dialog-size" (for org_capture)
+# TODO: Support way to cycle through predefined sizes.
+for_window [class="GoogleEmacs" instance="floating"] floating enable, resize set height 1200px, resize set width 780px
+
+# Here is a sketch of the cycle sizes idea.
+# TODO: Support this.
+# mode "cycle_sizes_floating_mode" {
+#      # coding mode
+#      bindsym a for_window [mode="floating", class="actively-selected"] resize set height 1200px, resize set width 780px
+#      bindsym b for_window [mode="floating", class="actively-selected"] resize set height 500px, resize set width 500px
+#
+#      bindsym Escape mode "default"
+#      bindsym Ctrl+g mode "default"
+#      bindsym Ctrl+c mode "default"
+# }
+
+# ensure Spotify windows float
+for_window [class="Spotify"] floating enable
+
+# ensure system service that run through XDG start
+exec --no-startup-id dex -ae i3
+
+# rofi configuration
+bindsym $mod+space exec --no-startup-id rofi -show combi
+bindsym $mod+t     exec --no-startup-id ~/.config/i3/dmenu_timer.sh ~/.local/share/sounds/gong.mp3
+
+# switch workspaces
+bindsym $mod+Tab       workspace next
+bindsym $mod+Shift+Tab workspace prev
+
+# file manager
+bindsym $mod+n exec $terminal -x lf ~/Dropbox
+
+# clipboard manager
+# NOTE: Ctrl-c is already covered since `clipmenu` listens for X clipboard
+# events using `clipnotify`.
+# NOTE: `clipmenud` is started in `.xsessionrc.shared`
+# NOTE: This is a bit of a hack intended to support pasting in both the terminal
+# and in GUI applications. `st` expects `ctrl+Shift+v` while GUIs expect
+# `ctrl+v`. In the instances where GUIs don't support `ctrl+Shift+v` already, it
+# acts like `ctrl+v`, so it should "just work".
+bindsym Ctrl+$mod+v exec clipmenu && xdotool key --clearmodifiers ctrl+Shift+v
+
+# Screenshot
+# TODO: Support variants: (a) App (r) Region (f) Fullscreen.
+# TODO: Support hosting to third-party image hosting.
+set $screenshot_mode Screenshot (g) googleplex (l) local
+mode "$screenshot_mode" {
+     bindsym g exec zsh -i -c snipit,     mode "default"
+     bindsym l exec zsh -i -c screenshot, mode "default"
+
+     bindsym Escape mode "default"
+     bindsym Ctrl+g mode "default"
+     bindsym Ctrl+c mode "default"
+}
+bindsym $mod+s mode "$screenshot_mode"
+
+# online documentation
+bindsym $mod+Shift+slash exec $browser https://i3wm.org/docs/userguide.html
+
+# no title bars
+for_window [class="^.*"] border pixel 1
+
+# disable mouse hover focus
+focus_follows_mouse no
+
+# kill focused window
+bindsym $window+q kill
+
+# Toggle focus
+bindsym $window+f floating toggle
+
+# GTK Themes
+exec --no-startup-id gnome-settings-daemon
+
+# wireless selection mechanism
+exec --no-startup-id nm-applet
+
+# set the split direction
+bindsym $mod+v split vertical
+# cannot bind $mod+h because of movement commands
+bindsym $mod+Shift+v split horizontal
+
+# sound applet
+exec --no-startup-id gnome-sound-applet
+
+# change focus
+bindsym $window+h focus left
+bindsym $window+j focus down
+bindsym $window+k focus up
+bindsym $window+l focus right
+
+# move focused window
+bindsym $mod+Shift+h move left  100
+bindsym $mod+Shift+j move down  100
+bindsym $mod+Shift+k move up    100
+bindsym $mod+Shift+l move right 100
+
+# enter fullscreen mode for the focused container
+bindsym $window+z fullscreen toggle
+
+# change container layout (stacked, tabbed, toggle split)
+bindsym $super+e layout toggle split
+bindsym $super+s layout stacking
+bindsym $super+t layout tabbed
+
+# toggle tiling / floating
+bindsym $mod+Shift+f floating toggle
+
+# toggle stickiness
+bindsym $mod+Shift+s sticky toggle
+
+# focus the parent container
+# bindsym $mod+a focus parent
+bindsym $mod+Shift+a focus child
+
+# Define names for default workspaces for which we configure key bindings later on.
+# We use variables to avoid repeating the names in multiple places.
+set $ws1  "1"
+set $ws2  "2"
+set $ws3  "3"
+set $ws4  "4"
+set $ws5  "5"
+set $ws6  "6"
+set $ws7  "7"
+set $ws8  "8"
+set $ws9  "9"
+set $ws10 "10"
+
+# jump to workspace
+bindsym $mod+1 workspace $ws1
+bindsym $mod+2 workspace $ws2
+bindsym $mod+3 workspace $ws3
+bindsym $mod+4 workspace $ws4
+bindsym $mod+5 workspace $ws5
+bindsym $mod+6 workspace $ws6
+bindsym $mod+7 workspace $ws7
+bindsym $mod+8 workspace $ws8
+bindsym $mod+9 workspace $ws9
+bindsym $mod+0 workspace $ws10
+
+# edit configuration files
+# TODO: Standardize KBDs for C,R,U,D operations.
+# TODO: Move shell script to /usr/local/bin
+# Create
+# TODO: Choose another KBD. This is temporary.
+bindsym $mod+a       exec zsh -i -c add_config
+# Read
+bindsym $mod+c       exec zsh -i -c edit_config
+# Update
+# TODO: Support operation to update_config label and path
+# Delete
+bindsym $mod+Shift+c exec zsh -i -c rm_config
+
+# move and follow focused container to workspace
+bindsym $mod+Shift+1 move container to workspace $ws1;  workspace $ws1
+bindsym $mod+Shift+2 move container to workspace $ws2;  workspace $ws2
+bindsym $mod+Shift+3 move container to workspace $ws3;  workspace $ws3
+bindsym $mod+Shift+4 move container to workspace $ws4;  workspace $ws4
+bindsym $mod+Shift+5 move container to workspace $ws5;  workspace $ws5
+bindsym $mod+Shift+6 move container to workspace $ws6;  workspace $ws6
+bindsym $mod+Shift+7 move container to workspace $ws7;  workspace $ws7
+bindsym $mod+Shift+8 move container to workspace $ws8;  workspace $ws8
+bindsym $mod+Shift+9 move container to workspace $ws9;  workspace $ws9
+bindsym $mod+Shift+0 move container to workspace $ws10; workspace $ws10
+
+# move focused container to workspace
+bindsym $mod+Ctrl+1 move container to workspace $ws1
+bindsym $mod+Ctrl+2 move container to workspace $ws2
+bindsym $mod+Ctrl+3 move container to workspace $ws3
+bindsym $mod+Ctrl+4 move container to workspace $ws4
+bindsym $mod+Ctrl+5 move container to workspace $ws5
+bindsym $mod+Ctrl+6 move container to workspace $ws6
+bindsym $mod+Ctrl+7 move container to workspace $ws7
+bindsym $mod+Ctrl+8 move container to workspace $ws8
+bindsym $mod+Ctrl+9 move container to workspace $ws9
+bindsym $mod+Ctrl+0 move container to workspace $ws10
+
+# reload, restart i3
+bindsym $super+r       exec cat ~/.config/i3/config.shared ~/.config/i3/config.device >~/.config/i3/config; reload
+bindsym $super+Shift+r exec cat ~/.config/i3/config.shared ~/.config/i3/config.device >~/.config/i3/config; restart
+
+# logout dialog
+set $mode_system System (l) lock, (e) logout, (s) suspend, (h) hibernate, (r) reboot, (Shift+s) shutdown
+mode "$mode_system" {
+    bindsym l       exec --no-startup-id xsecurelock,                        mode "default"
+    bindsym e       exit,                                                    mode "default"
+    bindsym s       exec --no-startup-id xsecurelock && systemctl suspend,   mode "default"
+    bindsym h       exec --no-startup-id xsecurelock && systemctl hibernate, mode "default"
+    bindsym r       exec --no-startup-id systemctl reboot,                   mode "default"
+    bindsym Shift+s exec --no-startup-id systemctl poweroff,                 mode "default"
+
+    # back to normal: Enter or Escape
+    bindsym Escape mode "default"
+    bindsym Ctrl+g mode "default"
+    bindsym Ctrl+c mode "default"
+}
+bindsym Ctrl+Mod1+Delete mode "$mode_system"
+
+# resize window (you can also use the mouse for that)
+mode "resize" {
+        bindsym h resize shrink width  10 px or 10 ppt
+        bindsym j resize shrink height 10 px or 10 ppt
+        bindsym k resize grow   height 10 px or 10 ppt
+        bindsym l resize grow   width  10 px or 10 ppt
+
+        bindsym Escape mode "default"
+        bindsym Ctrl+g mode "default"
+        bindsym Ctrl+c mode "default"
+}
+bindsym $mod+Shift+r mode "resize"
+
+# passthrough mode to support Emacs, Tmux, Vim KBDs for window and pane management
+mode "passthrough" {
+     bindsym $mod+Escape mode "default"
+}
+bindsym $mod+Escape mode "passthrough"
+
+# class                 border     backgr     text      indicator child_border
+# client.focused          {active}   {active}   {color15} {color2}  {active}
+# client.focused_inactive {active}   {active}   {color15} {color2}  {inactive}
+# client.unfocused        {inactive} {inactive} {color15} {color2}  {inactive}
+# client.urgent           {color2}   {color2}   {color15} {color2}  {color2}
+# client.placeholder      {color0}   {color8}   {color15} {color0}  {color8}
+# client.background       {color0}
+
+bar {
+    status_command i3status
+    font pango:Monospace 10px
+    position top
+    # disable system tray icons
+    tray_output none
+    colors {
+           # background {color0}
+           # statusline {inactive}
+           # separator  {active}
+           # class            border     text       indicator
+           # focused_workspace  {active}   {color15}  {color0}
+           # active_workspace   {active}   {inactive} {active}
+           # inactive_workspace {inactive} {active}   {inactive}
+           # urgent_workspace   {inactive} {active}   {inactive}
+    }
+}
+
+# wpg integration
+exec --no-startup-id ~/.config/wpg/wp_init.sh
\ No newline at end of file
diff --git a/configs/shared/.config/i3/dmenu_timer.sh b/configs/shared/.config/i3/dmenu_timer.sh
new file mode 100755
index 000000000000..9d62ead73091
--- /dev/null
+++ b/configs/shared/.config/i3/dmenu_timer.sh
@@ -0,0 +1,113 @@
+#!/usr/bin/env bash
+
+# Select common timer intervals with dmenu and play an alarm sound when
+# finished. Useful if you bind a KBD in a window manager such as i3. Pass the
+# path to the alarm mp3 as the only argument.
+#
+# Usage: ./dmenu_timer.sh path/to/alarm.mp3
+
+times=$(cat <<EOF
+1 minute
+2 minutes
+3 minutes
+4 minutes
+5 minutes
+10 minutes
+15 minutes
+20 minutes
+30 minutes
+45 minutes
+1 hour
+2 hours
+EOF
+)
+selection=$(echo "$times" | dmenu)
+
+case $selection in
+  '1 minute')
+    notify-send 'Timer' 'Set for 1 minute' && \
+      sleep 1m && \
+      notify-send 'Timer' 'Finished.' && \
+      mpg123 $1 && \
+      exit 0
+    ;;
+  '2 minutes')
+    notify-send 'Timer' 'Set for 2 minute' && \
+      sleep 2m && \
+      notify-send 'Timer' 'Finished.' && \
+      mpg123 $1 && \
+      exit 0
+    ;;
+  '3 minutes')
+    notify-send 'Timer' 'Set for 3 minutes' && \
+      sleep 3m && \
+      notify-send 'Timer' 'Finished.' && \
+      mpg123 $1 && \
+      exit 0
+    ;;
+  '4 minutes')
+    notify-send 'Timer' 'Set for 4 minutes' && \
+      sleep 4m && \
+      notify-send 'Timer' 'Finished.' && \
+      mpg123 $1 && \
+      exit 0
+    ;;
+  '5 minutes')
+    notify-send 'Timer' 'Set for 5 minutes' && \
+      sleep 5m && \
+      notify-send 'Timer' 'Finished.' && \
+      mpg123 $1 && \
+      exit 0
+    ;;
+  '10 minutes')
+    notify-send 'Timer' 'Set for 10 minutes' && \
+      sleep 10m && \
+      notify-send 'Timer' 'Finished.' && \
+      mpg123 $1 && \
+      exit 0
+    ;;
+  '15 minutes')
+    notify-send 'Timer' 'Set for 15 minutes' && \
+      sleep 15m && \
+      notify-send 'Timer' 'Finished.' && \
+      mpg123 $1 && \
+      exit 0
+    ;;
+  '20 minutes')
+    notify-send 'Timer' 'Set for 20 minutes' && \
+      sleep 20m && \
+      notify-send 'Timer' 'Finished.' && \
+      mpg123 $1 && \
+      exit 0
+    ;;
+  '30 minutes')
+    notify-send 'Timer' 'Set for 30 minutes' && \
+      sleep 30m && \
+      notify-send 'Timer' 'Finished.' && \
+      mpg123 $1 && \
+      exit 0
+    ;;
+  '45 minutes')
+    notify-send 'Timer' 'Set for 45 minutes' && \
+      sleep 45m && \
+      notify-send 'Timer' 'Finished.' && \
+      mpg123 $1 && \
+      exit 0
+    ;;
+  '1 hour')
+    notify-send 'Timer' 'Set for 1 hour' && \
+      sleep 1h && \
+      notify-send 'Timer' 'Finished.' && \
+      mpg123 $1 && \
+      exit 0
+    ;;
+  '2 hours')
+    notify-send 'Timer' 'Set for 2 hours' && \
+      sleep 2h && \
+      notify-send 'Timer' 'Finished.' && \
+      mpg123 $1 && \
+      exit 0
+    ;;
+  *)
+    notify-send 'Timer' 'No supported time selected. Exiting...' && exit 1
+esac
diff --git a/configs/shared/.config/i3/passmenu b/configs/shared/.config/i3/passmenu
new file mode 100755
index 000000000000..71c4538fa61a
--- /dev/null
+++ b/configs/shared/.config/i3/passmenu
@@ -0,0 +1,25 @@
+#!/usr/bin/env bash
+
+shopt -s nullglob globstar
+
+typeit=0
+if [[ $1 == "--type" ]]; then
+	typeit=1
+	shift
+fi
+
+prefix=${PASSWORD_STORE_DIR-~/.password-store}
+password_files=( "$prefix"/**/*.gpg )
+password_files=( "${password_files[@]#"$prefix"/}" )
+password_files=( "${password_files[@]%.gpg}" )
+
+password=$(printf '%s\n' "${password_files[@]}" | dmenu "$@")
+
+[[ -n $password ]] || exit
+
+if [[ $typeit -eq 0 ]]; then
+	pass show -c "$password" 2>/dev/null
+else
+	pass show "$password" | { IFS= read -r pass; printf %s "$pass"; } |
+		xdotool type --clearmodifiers --file -
+fi
\ No newline at end of file
diff --git a/configs/shared/.config/i3/workspace_1.json b/configs/shared/.config/i3/workspace_1.json
new file mode 100644
index 000000000000..b5d3f9d8c53f
--- /dev/null
+++ b/configs/shared/.config/i3/workspace_1.json
@@ -0,0 +1,76 @@
+// vim:ts=4:sw=4:et
+{
+    // splitv split container with 2 children
+    "border": "normal",
+    "floating": "auto_off",
+    "layout": "splitv",
+    "percent": 0.5,
+    "type": "con",
+    "nodes": [
+        {
+            "border": "pixel",
+            "current_border_width": 3,
+            "floating": "auto_off",
+            "geometry": {
+               "height": 925,
+               "width": 1072,
+               "x": 0,
+               "y": 0
+            },
+            "name": "emacs@wpcarro.lon.corp.google.com",
+            "percent": 0.5,
+            "swallows": [
+               {
+               "class": "^GoogleEmacs$",
+               "instance": "^emacs$",
+               "title": "^google-emacs$"
+               }
+            ],
+            "type": "con"
+        },
+        {
+            "border": "pixel",
+            "current_border_width": 3,
+            "floating": "auto_off",
+            "geometry": {
+               "height": 484,
+               "width": 724,
+               "x": 0,
+               "y": 0
+            },
+            "name": "i3-save-tree",
+            "percent": 0.5,
+            "swallows": [
+               {
+               "class": "^st\\-256color$",
+               "instance": "^st\\-256color$",
+               "title": "^st-term$"
+               }
+            ],
+            "type": "con"
+        }
+    ]
+}
+
+{
+    "border": "pixel",
+    "current_border_width": 3,
+    "floating": "auto_off",
+    "geometry": {
+       "height": 2125,
+       "width": 1914,
+       "x": 1923,
+       "y": 32
+    },
+    "name": "i3: Layout saving in i3 - Google Chrome",
+    "percent": 0.5,
+    "swallows": [
+       {
+       "class": "^Google\\-chrome$",
+       "instance": "^google\\-chrome$",
+       "title": "Chrome",
+       "window_role": "^browser$"
+       }
+    ],
+    "type": "con"
+}