This section contains the configuration files (dotfiles) of various
programs I use.
-** [[https://github.com/afewmail/afew][afew]]
-:PROPERTIES:
-:header-args+: :tangle ~/.config/afew/config
-:END:
-
-#+begin_quote
-an initial tagging script for notmuch mail
-#+end_quote
-
-#+begin_src conf
-# This is the default filter chain
-[SpamFilter]
-#[ClassifyingFilter]
-[KillThreadsFilter]
-#[ListMailsFilter]
-[ArchiveSentMailsFilter]
-sent_tag = sent
-[InboxFilter]
-
-#[Filter.1]
-#query = 'folder:amin/lists/.haskell-cafe'
-#tags = +lists;+lists/haskell-cafe
-#message = lists/haskell-cafe
-
-#[Filter.2]
-#query = 'folder:amin/lists/.haskell-weekly'
-#tags = +lists;+lists/haskell-weekly
-#message = lists/haskell-weekly
-
-#[Filter.3]
-#query = 'folder:amin/lists/.hackernewsletter'
-#tags = +lists;+lists/hackernewsletter
-#message = lists/hackernewsletter
-
-
-#[FolderNameFilter]
-#folder_blacklist = Inbox
-#maildir_separator = /.
-#folder_transforms = Drafts:draft Junk:spam Trash:deleted Sent:sent Archive:archive lists/haskell-cafe:lists/haskell-cafe
-#+end_src
-
** bspwm
*** bspwmrc
:header-args+: :tangle ~/.config/bspwm/bspwmrc :shebang "#!/bin/sh"
:END:
-#+begin_src sh
+#+begin_src sh :tangle no
sxhkd &
sh ~/.fehbg &
xfce4-panel -d &
:header-args+: :tangle ~/.config/sxhkd/sxhkdrc
:END:
-#+begin_src conf
+#+begin_src conf :tangle no
#
# wm independent hotkeys
#
XF86AudioMute
pamixer --toggle-mute
+XF86AudioMicMute
+ pactl set-source-mute 1 toggle
+
# playback control
XF86Audio{Play,Prev,Next}
mpc {toggle,prev,next}
#XF86KbdBrightness{Up,Down}
# kbdlight {up,down}
+XF86RotateWindows
+ toggle-tablet
+
#
# bspwm hotkeys
#
:header-args+: :tangle ~/.config/compton.conf
:END:
-#+begin_src conf
+#+begin_src conf :tangle no
# Shadow
shadow = false; # Enabled client-side shadows on windows.
no-dock-shadow = true; # Avoid drawing shadows on dock/panel windows.
[user]
name = Amin Bandali
email = amin@aminb.org
- # signingkey = 4E05246AB0BF7FFB
+ signingkey = 4E05246AB0BF7FFB
#+end_src
**** signing
#+begin_src conf
-# [commit]
-# gpgsign = true
+[commit]
+ gpgsign = true
# [format]
# signoff = true
#+end_src
user = aminb
#+end_src
+**** send-email
+#+begin_src conf
+[sendemail]
+ smtpuser = amin@aminb.org
+ smtpserver = nix.aminb.org
+ smtpserverport = 587
+ smtpencryption = tls
+ annotate = yes
+#+end_src
+
*** gitignore
:PROPERTIES:
:header-args+: :tangle ~/.gitignore_global
*-autoloads.el
#+end_src
+** [[https://github.com/Leinnan/i3gs][i3gs]]
+:PROPERTIES:
+:header-args+: :tangle ~/.config/i3gs/config
+:END:
+
+#+begin_src conf :comments none
+borders_width=0 0 2 0
+separator_width=10
+
+[mpd]
+preset=MPD
+title=<span weight='heavy' fgcolor='#7FDBFF'> </span>
+borders_color=#7FDBFF
+
+[ram]
+preset=RAM
+title=<span weight='heavy' fgcolor='#3D9970'> </span>
+borders_color=#3D9970
+
+[cpu]
+preset=CPU
+title=<span weight='heavy' fgcolor='#2ECC40'> </span>
+borders_color=#2ECC40
+
+[hdd]
+preset=HDD
+title=<span weight='heavy' fgcolor='#01FF70'> </span>
+borders_color=#01FF70
+
+[battery]
+preset=BAT
+command=battery-percentage-time
+title=<span weight='heavy' fgcolor='#39CCCC'> </span>
+borders_color=#39CCCC
+
+[wifi]
+preset=WIFI
+title=<span weight='heavy' fgcolor='#01FF70'> </span>
+borders_color=#01FF70
+
+[date]
+preset=DATE
+command=date '+%-I:%M, %a %b %d'
+title=<span weight='heavy' fgcolor='#FFDC00'> </span>
+borders_color=#FFDC00
+separator_width=0
+#+end_src
** Latexmk
:PROPERTIES:
:header-args+: :tangle ~/.latexmkrc
Improve XPS 15 9560's touchpad experience.
-#+begin_src conf :tangle (when (and (eq system-type 'gnu/linux) (string= (system-name) "plasma")) "/sudo::/etc/X11/xorg.conf.d/30-touchpad.conf")
+# begin_src conf :tangle (when (and (eq system-type 'gnu/linux) (string= (system-name) "plasma")) "/sudo::/etc/X11/xorg.conf.d/30-touchpad.conf")
+#+begin_src conf :tangle no
Section "InputClass"
Identifier "libinput touchpad catchall"
Driver "libinput"
type = SimplePOP3SSLRetriever
server = fencepost.gnu.org
username = aminb
-password_command = ("gpg2", "--no-tty", "-q", "-d", "~/.passwd/gnu.gpg")
+password_command = ("gpg2", "--no-tty", "-q", "-d", "/home/amin/.passwd/gnu.gpg")
port = 995
use_apop = True
# aminb
account aminb
host nix.aminb.org
-tls_fingerprint BB:98:B3:02:83:B0:E0:C3:49:3E:C2:B2:A8:60:62:78:03:B3:5D:B3:BD:B8:0A:39:BB:E4:B0:66:D1:CF:D1:6B
+tls_fingerprint 65:DD:B8:32:D8:CD:F1:DC:B6:34:EE:35:04:18:AC:09:F3:1D:6D:20:F2:4A:E2:BD:64:48:B7:1F:90:BD:C4:BA
tls_starttls on
from amin@aminb.org
user amin@aminb.org
# gnu
account gnu
host fencepost.gnu.org
-tls_fingerprint 94:0E:37:EB:EA:44:5A:4B:B6:6F:16:3D:6C:7E:7E:44:2D:93:61:C1:FE:82:A8:29:5E:3C:12:4E:2D:BE:0E:2C
+# use `msmtp -a gnu --serverinfo --tls --tls-certcheck=off --tls-fingerprint=` to get the current fingerprint
+tls_fingerprint 28:70:42:76:1C:EC:91:5F:D1:B3:27:A1:CD:3B:32:A4:8B:0B:DC:3A:CD:CA:F6:6F:E4:61:BA:69:D7:4D:0D:0B
tls_starttls on
from aminb@gnu.org
user aminb
[user]
name=Amin Bandali
primary_email=amin@aminb.org
-other_email=amin.bandali@uwaterloo.ca;mbandali@uwaterloo.ca;aminb@gnu.org;
+other_email=abandali@uwaterloo.ca;amin.bandali@uwaterloo.ca;aminb@gnu.org;
# Configuration for "notmuch new"
#
[new]
tags=new;
#tags=unread;inbox;
-ignore=.uidvalidity;.mbsyncstate
+ignore=.uidvalidity;.mbsyncstate;/.*/dovecot*/
# Search configuration
#
gpg_path=gpg
#+end_src
+*** pre-new hook
+:PROPERTIES:
+:header-args+: :tangle ~/mail/.notmuch/hooks/pre-new :shebang "#!/bin/sh"
+:END:
+
+#+begin_src sh
+touch /tmp/gnusieve.log
+sieve-filter -eW -o postmaster_address=postmaster@aminb.org \
+ -o mail_location=maildir:$MAILDIR/gnu:LAYOUT=fs:INBOX=$MAILDIR/gnu/Inbox ~/sieve/gnu.sieve INBOX delete &>>/tmp/gnusieve.log
+#+end_src
+
*** post-new hook
:PROPERTIES:
:header-args+: :tangle ~/mail/.notmuch/hooks/post-new :shebang "#!/bin/sh"
:END:
#+begin_src sh
-afew -tn
+# apply sent tag to messages sent by me
+notmuch tag -new +sent -- from:amin@aminb.org or from:aminb@gnu.org or from:abandali@uwaterloo.ca or from:amin.bandali@uwaterloo.ca
+
+# initial tagging
+notmuch tag -latest -- tag:latest
+notmuch tag +inbox +unread +latest -new -- tag:new
+
# apply tags to lists
-notmuch tag +lists +lists/deepspec -- folder:amin/lists/deepspec
-notmuch tag +lists +lists/haskell-cafe -- folder:amin/lists/haskell-cafe
-notmuch tag +lists +lists/haskell-weekly -- folder:amin/lists/haskell-weekly
-notmuch tag +lists +lists/hackernewsletter -- folder:amin/lists/hackernewsletter
-notmuch tag +lists +lists/notmuch -- folder:amin/lists/notmuch
-notmuch tag +lists +lists/info-gnu-emacs -- folder:amin/lists/info-gnu-emacs
-notmuch tag +lists +lists/help-gnu-emacs -- folder:amin/lists/help-gnu-emacs
-notmuch tag +lists +lists/emacs-devel -- folder:amin/lists/emacs-devel
+
+# <aminb>
+notmuch tag -inbox +lists/~sircmpwn/srht-admins -- folder:amin/lists/~sircmpwn/srht-admins
+notmuch tag -inbox +lists/~sircmpwn/srht-announce -- folder:amin/lists/~sircmpwn/srht-announce
+notmuch tag -inbox +lists/~sircmpwn/srht-dev -- folder:amin/lists/~sircmpwn/srht-dev
+notmuch tag -inbox +lists/~sircmpwn/srht-discuss -- folder:amin/lists/~sircmpwn/srht-discuss
+
+notmuch tag -inbox +lists/hackernewsletter -- folder:amin/lists/hackernewsletter
+notmuch tag -inbox +lists/haskell-weekly -- folder:amin/lists/haskell-weekly
+
+notmuch tag -inbox +pay -- folder:amin/pay
+# </aminb>
+
+# <uw>
+notmuch tag -inbox +uw/cs136 -- folder:uwaterloo/lists/cs136
+notmuch tag -inbox +uw/se463 -- folder:uwaterloo/lists/se463
+
+notmuch tag -inbox +lists/clvsingle -- folder:uwaterloo/lists/Clvsingle
+notmuch tag -inbox +lists/gsa -- folder:uwaterloo/lists/GSA
+notmuch tag -inbox +lists/math-grad -- folder:uwaterloo/lists/Math-grad
+notmuch tag -inbox +lists/scs-grads -- folder:uwaterloo/lists/scs-grads
+notmuch tag -inbox +lists/watform-students -- folder:uwaterloo/lists/Watform-students
+# </uw>
+
+# <gnu>
+notmuch tag -inbox +lists/emacs-devel -- folder:gnu/l/emacs-devel
+notmuch tag -inbox +lists/emacs-orgmode -- folder:gnu/l/emacs-orgmode
+notmuch tag -inbox +lists/emacsconf-discuss -- folder:gnu/l/emacsconf-discuss
+notmuch tag -inbox +lists/fencepost-users -- folder:gnu/l/fencepost-users
+notmuch tag -inbox +lists/guix-devel -- folder:gnu/l/guix-devel
+notmuch tag -inbox +lists/guile-devel -- folder:gnu/l/guile-devel
+notmuch tag -inbox +lists/help-gnu-emacs -- folder:gnu/l/help-gnu-emacs
+notmuch tag -inbox +lists/info-gnu-emacs -- folder:gnu/l/info-gnu-emacs
+notmuch tag -inbox +lists/www-commits -- folder:gnu/l/www-commits
+notmuch tag -inbox +lists/www-discuss -- folder:gnu/l/www-discuss
+notmuch tag -inbox +webmasters -- folder:gnu/webmasters
+
+notmuch tag -inbox +lists/deepspec -- folder:gnu/l/deepspec
+notmuch tag -inbox +lists/haskell-cafe -- folder:gnu/l/haskell-cafe
+notmuch tag -inbox +lists/haskell-art -- folder:gnu/l/haskell-art
+notmuch tag -inbox +lists/notmuch -- folder:gnu/l/notmuch
+# </gnu>
+
+notmuch tag -inbox -unread +archive/notmuch -- path:archive/notmuch/**
+notmuch tag -inbox -unread +archive/emacs-devel -- path:archive/emacs-devel/**
#+end_src
*** notmuch.service
prime_gpg_agent()
#+end_src
+** pigeonhole
+*** gnu.sieve
+:PROPERTIES:
+:header-args+: :tangle ~/sieve/gnu.sieve :comments none
+:END:
+
+#+begin_src conf
+require [ "regex", "variables", "fileinto", "envelope", "mailbox", "imap4flags", "include" ];
+
+if anyof (
+ address :is "from" "webmasters@gnu.org",
+ address :is "from" "webmasters-comment@gnu.org") {
+ fileinto :create "webmasters";
+ stop;
+}
+
+include :personal "lists";
+#+end_src
+
+*** lists.sieve
+:PROPERTIES:
+:header-args+: :tangle ~/sieve/lists.sieve :comments none
+:END:
+
+#+begin_src conf
+require [ "regex", "variables", "fileinto", "envelope", "mailbox", "imap4flags",
+ "include" ];
+
+if anyof (
+ header :contains "list-id" "<emacs-devel.gnu.org>",
+ header :contains "list-id" "<emacs-orgmode.gnu.org>",
+ header :contains "list-id" "<emacsconf-discuss.gnu.org>",
+ header :contains "list-id" "<fencepost-users.gnu.org>",
+ header :contains "list-id" "<guix-devel.gnu.org>",
+ header :contains "list-id" "<guile-devel.gnu.org>",
+ header :contains "list-id" "<help-gnu-emacs.gnu.org>",
+ header :contains "list-id" "<info-gnu-emacs.gnu.org>",
+ header :contains "list-id" "<www-commits.gnu.org>",
+ header :contains "list-id" "<www-discuss.gnu.org>",
+ header :contains "list-id" "<deepspec.lists.cs.princeton.edu>",
+ header :contains "list-id" "<haskell-cafe.haskell.org>",
+ header :contains "list-id" "<haskell-art.we.lurk.org>",
+ header :contains "list-id" "<notmuch.notmuchmail.org>") {
+ if header :regex "list-id" "<([a-z_0-9-]+)[.@]" {
+ set :lower "listname" "${1}";
+ fileinto :create "l/${listname}";
+ }
+}
+#+end_src
+
** polybar
*** config
insert_pass="Alt+n"
#+end_src
+** sway
+:PROPERTIES:
+:header-args+: :tangle ~/.config/sway/config
+:END:
+
+#+begin_src conf
+exec xrdb .Xresources
+exec dunst
+### Variables
+# super
+set $mod Mod4
+# alt
+set $mod2 Mod1
+set $left h
+set $down j
+set $up k
+set $right l
+set $term urxvt
+set $menu rofi -show run -display-run '> ' -display-window ' 🗔 '
+
+### Output configuration
+#
+# Default wallpaper (more resolutions are available in __DATADIR__/backgrounds/sway/)
+output * bg /usr/share/backgrounds/sway/Sway_Wallpaper_Blue_1920x1080.png fill
+#
+# Example configuration:
+#
+# output HDMI-A-1 resolution 1920x1080 position 1920,0
+#
+# You can get the names of your outputs by running: swaymsg -t get_outputs
+
+### Idle configuration
+#
+# Example configuration:
+#
+#exec swayidle \
+# timeout 300 'swaylock -c 000000' \
+# timeout 600 'swaymsg "output * dpms off"' \
+# resume 'swaymsg "output * dpms on"' \
+# before-sleep 'swaylock -c 000000'
+#
+# This will lock your screen after 300 seconds of inactivity, then turn off
+# your displays after another 600 seconds, and turn your screens back on when
+# resumed. It will also lock your screen before your computer goes to sleep.
+
+### Input configuration
+
+input "1739:31251:DLL07BE:01_06CB:7A13_Touchpad" {
+ dwt enabled
+ tap enabled
+ natural_scroll enabled
+ middle_emulation enabled
+ click_method clickfinger
+}
+
+input "1:1:AT_Translated_Set_2_keyboard" {
+ repeat_delay 200
+ repeat_rate 45
+ xkb_layout us,ir
+ xkb_options ctrl:nocaps,altwin:swap_alt_win,ctrl:rctrl_ralt,grp:shifts_toggle
+}
+
+
+### Key bindings
+#
+# Basics:
+#
+ # start a terminal
+ bindsym $mod+Return exec $term
+
+ # kill focused window
+ bindsym $mod+Shift+q kill
+
+ # start your launcher
+ bindsym $mod+d exec $menu
+
+ # Drag floating windows by holding down $mod and left mouse button.
+ # Resize them with right mouse button + $mod.
+ floating_modifier $mod
+
+ # reload the configuration file
+ bindsym $mod+Shift+c reload
+
+ # exit sway (logs you out of your wayland session)
+ bindsym $mod+Shift+e exit
+
+ bindsym $mod+apostrophe exec rofi-light # rofi-based brightness chooser
+ bindsym XF86MonBrightnessUp exec light -A 5 # increase screen brightness
+ bindsym XF86MonBrightnessDown exec light -U 5 # decrease screen brightness
+
+ bindsym XF86AudioRaiseVolume exec pamixer --allow-boost --increase 5
+ bindsym XF86AudioLowerVolume exec pamixer --allow-boost --decrease 5
+ bindsym XF86AudioMute exec pamixer --toggle-mute
+ bindsym XF86AudioMicMute exec pactl set-source-mute 1 toggle
+
+ # original sway workspace switch and window move
+ bindsym $mod+bracketleft workspace prev
+ bindsym $mod+bracketright workspace next
+ bindsym $mod+braceleft move container to workspace prev
+ bindsym $mod+braceright move container to workspace next
+
+ # bspwm-esque workspace switch and window move
+ bindsym $mod2+bracketleft exec sway-ws-util switch prev
+ bindsym $mod2+bracketright exec sway-ws-util switch next
+ bindsym $mod2+braceleft exec sway-ws-util move prev follow
+ bindsym $mod2+braceright exec sway-ws-util move next follow
+#
+# Moving around:
+#
+ # Move your focus around
+ bindsym $mod+$left focus left
+ bindsym $mod+$down focus down
+ bindsym $mod+$up focus up
+ bindsym $mod+$right focus right
+ # or use $mod+[up|down|left|right]
+ bindsym $mod+Left focus left
+ bindsym $mod+Down focus down
+ bindsym $mod+Up focus up
+ bindsym $mod+Right focus right
+
+ # _move_ the focused window with the same, but add Shift
+ bindsym $mod+Shift+$left move left
+ bindsym $mod+Shift+$down move down
+ bindsym $mod+Shift+$up move up
+ bindsym $mod+Shift+$right move right
+ # ditto, with arrow 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
+#
+# Workspaces:
+#
+ # switch to workspace
+ bindsym $mod+1 workspace 1
+ bindsym $mod+2 workspace 2
+ bindsym $mod+3 workspace 3
+ bindsym $mod+4 workspace 4
+ bindsym $mod+5 workspace 5
+ bindsym $mod+6 workspace 6
+ bindsym $mod+7 workspace 7
+ bindsym $mod+8 workspace 8
+ bindsym $mod+9 workspace 9
+ bindsym $mod+0 workspace 10
+ # move focused container to workspace
+ bindsym $mod+Shift+1 move container to workspace 1
+ bindsym $mod+Shift+2 move container to workspace 2
+ bindsym $mod+Shift+3 move container to workspace 3
+ bindsym $mod+Shift+4 move container to workspace 4
+ bindsym $mod+Shift+5 move container to workspace 5
+ bindsym $mod+Shift+6 move container to workspace 6
+ bindsym $mod+Shift+7 move container to workspace 7
+ bindsym $mod+Shift+8 move container to workspace 8
+ bindsym $mod+Shift+9 move container to workspace 9
+ bindsym $mod+Shift+0 move container to workspace 10
+ # Note: workspaces can have any name you want, not just numbers.
+ # We just use 1-10 as the default.
+#
+# Layout stuff:
+#
+ # You can "split" the current object of your focus with
+ # $mod+b or $mod+v, for horizontal and vertical splits
+ # respectively.
+ bindsym $mod+b splith
+ bindsym $mod+v splitv
+
+ # Switch the current container between different layout styles
+ bindsym $mod+s layout stacking
+ bindsym $mod+w layout tabbed
+ bindsym $mod+e layout toggle split
+
+ # Make the current focus fullscreen
+ bindsym $mod+f fullscreen
+
+ # Toggle the current focus between tiling and floating mode
+ bindsym $mod+Shift+space floating toggle
+
+ # Swap focus between the tiling area and the floating area
+ bindsym $mod+space focus mode_toggle
+
+ # move focus to the parent container
+ bindsym $mod+a focus parent
+#
+# Scratchpad:
+#
+ # Sway has a "scratchpad", which is a bag of holding for windows.
+ # You can send windows there and get them back later.
+
+ # Move the currently focused window to the scratchpad
+ bindsym $mod+Shift+minus move scratchpad
+
+ # Show the next scratchpad window or hide the focused scratchpad window.
+ # If there are multiple scratchpad windows, this command cycles through them.
+ bindsym $mod+minus scratchpad show
+#
+# Resizing containers:
+#
+mode "resize" {
+ # left will shrink the containers width
+ # right will grow the containers width
+ # up will shrink the containers height
+ # down will grow the containers height
+ bindsym $left resize shrink width 10px
+ bindsym $down resize grow height 10px
+ bindsym $up resize shrink height 10px
+ bindsym $right resize grow width 10px
+
+ # ditto, with arrow keys
+ bindsym Left resize shrink width 10px
+ bindsym Down resize grow height 10px
+ bindsym Up resize shrink height 10px
+ bindsym Right resize grow width 10px
+
+ # return to default mode
+ bindsym Return mode "default"
+ bindsym Escape mode "default"
+}
+bindsym $mod+Shift+r mode "resize"
+
+#
+# Status Bar:
+#
+# Read `man 5 sway-bar` for more information about this section.
+bar {
+ position bottom
+ colors {
+ statusline #ffffff
+ background #323232
+ inactive_workspace #32323200 #32323200 #5c5c5c
+ }
+ status_command i3gs ~/.config/i3gs/config
+}
+
+include /etc/sway/config.d/*
+#+end_src
+
** TLP
*** TODO enigma
contrary, it's automatically sourced by LightDM, my display manager of
choice.
-#+begin_src sh
+#+begin_src sh :tangle no
xset -b # disable bell
+xset r rate 200 45 # repeat delay (ms) and rate (repeats/sec)
# setxkbmap -option compose:ralt
alias jcl=journalctl
alias m="mbsync -Va; getmail; notmuch new"
alias best="youtube-dl -f best"
-alias ace="mosh amin@ace.aminb.org"
+alias nixx="ssh amin@nix.aminb.org"
+alias fence="ssh aminb@fencepost.gnu.org"
aur() {
cd ~/usr/build
=rofi-light= a small utility that uses [[https://github.com/DaveDavenport/rofi][Rofi]] to ask and [[https://github.com/haikarainen/light][light]] to set an
exact brightness value.
+** battery-percentage-time
+:PROPERTIES:
+:header-args+: :tangle ~/.local/bin/battery-percentage-time :shebang "#!/bin/bash"
+:END:
+
+#+begin_src bash
+pct=$(upower -i /org/freedesktop/UPower/devices/battery_BAT0 | grep percentage | awk '{print $2}')
+time=$(upower -i /org/freedesktop/UPower/devices/battery_BAT0 | grep time | awk '{print $4,$5}')
+echo "$pct ($time)"
+#+end_src
+
** rofi-light
:PROPERTIES:
:header-args+: :tangle ~/.local/bin/rofi-light :shebang "#!/bin/bash"
light -S $val
#+end_src
+** s (run sway)
+:PROPERTIES:
+:header-args+: :tangle ~/.local/bin/s :shebang "#!/bin/bash"
+:END:
+
+#+begin_src bash
+export _JAVA_AWT_WM_NONREPARENTING=1
+export _JAVA_OPTIONS='-Dawt.useSystemAAFontSettings=on -Dswing.aatext=true'
+light -Scrs "intel_backlight" 2
+source $HOME/.zprofile
+sway
+#+end_src
+
+** sway-ws-util
+:PROPERTIES:
+:header-args+: :tangle ~/.local/bin/sway-ws-util :shebang "#!/bin/bash"
+:END:
+
+#+begin_src bash
+curr_ws=$(swaymsg -t get_workspaces | jq -r '.[] | select(.focused==true).name')
+[[ $curr_ws -eq 1 ]] && prev_ws=10 || prev_ws=$((curr_ws-1))
+[[ $curr_ws -eq 10 ]] && next_ws=1 || next_ws=$((curr_ws+1))
+dest_ws=-1
+op=-1
+
+if [ "$1" = "switch" ] || [ "$1" = "move" ]; then
+ op="$1"
+ if [ "$2" = "prev" ]; then
+ dest_ws="$prev_ws"
+ elif [ "$2" = "next" ]; then
+ dest_ws="$next_ws"
+ else
+ echo "Usage: $0 $1 {prev|next} [follow]"
+ exit 1
+ fi
+else
+ echo "Usage: $0 {switch|move} {prev|next} [follow]"
+ exit 1
+fi
+
+if [ "$op" = "switch" ]; then
+ sway workspace "$dest_ws"
+elif [ "$op" = "move" ]; then
+ sway move container to workspace "$dest_ws"
+ if [ "$3" = "follow" ]; then
+ sway workspace "$dest_ws"
+ fi
+fi
+#+end_src
+
** toggle-layout
:PROPERTIES:
:header-args+: :tangle ~/.local/bin/toggle-layout :shebang "#!/bin/bash"
xfconf-query -c xfce4-power-manager -p /xfce4-power-manager/presentation-mode -T
#+end_src
+** toggle-tablet
+:PROPERTIES:
+:header-args+: :tangle ~/.local/bin/toggle-tablet :shebang "#!/bin/bash"
+:END:
+
+This script toggles between a 'normal' mode and a 'tablet' mode, doing
+a few things:
+
+- rotates the screen using =xrandr=, so that rotating the physical
+ display of my X220t would have the laptop's battery on the right
+ hand side,
+- enables touch screen,
+- properly rotates the stylus pen and touch screen pointers, and
+- toggles between RGB and Vertical BGR sub-pixel order.
+
+#+begin_src bash
+case $(xfconf-query -c pointers -p /Wacom_ISDv4_E6_Pen_stylus/Properties/Wacom_Rotation) in
+ 0) # Screen is not rotated, we should rotate it right (90°)
+ xrandr -o 3
+ xfconf-query -c pointers -p /Wacom_ISDv4_E6_Pen_stylus/Properties/Wacom_Rotation -s 1
+ xfconf-query -c pointers -p /Wacom_ISDv4_E6_Finger_touch/Properties/Device_Enabled -s 1
+ xfconf-query -c pointers -p /Wacom_ISDv4_E6_Finger_touch/Properties/Wacom_Rotation -s 1
+ xfconf-query -c xsettings -p /Xft/RGBA -s vbgr
+ ;;
+ 1) # Currently top is rotated right, we should set it normal (0°)
+ xrandr -o 0
+ xfconf-query -c pointers -p /Wacom_ISDv4_E6_Pen_stylus/Properties/Wacom_Rotation -s 0
+ xfconf-query -c pointers -p /Wacom_ISDv4_E6_Finger_touch/Properties/Wacom_Rotation -s 0
+ xfconf-query -c pointers -p /Wacom_ISDv4_E6_Finger_touch/Properties/Device_Enabled -s 0
+ xfconf-query -c xsettings -p /Xft/RGBA -s rgb
+ ;;
+ *)
+ echo "Unknown result from 'xfconf-query -c pointers -p /Wacom_ISDv4_E6_Pen_stylus/Properties/Wacom_Rotation'" >&2
+ exit 1
+ ;;
+esac
+#+end_src
+
** unlock-def-gk.py
:PROPERTIES:
:header-args+: :tangle ~/.local/bin/unlock-def-gk.py :shebang "#!/usr/bin/env python2"