summaryrefslogtreecommitdiff
path: root/.config/sway/config
blob: daba575b834f87d5a5e2c5bf7252fcc449ed96a0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
include /etc/sway/config.d/*

font pango:Hack 10

# class                 border    bground   text      indicator   child_border
client.focused          #000000FF #B4EEB4BB #000000BB #B4EEB4BB   #000000BB
client.focused_inactive #000000FF #FFFFF6DD #000000BB #BFBFBFBB   #E5E5E5BB
client.unfocused        #000000FF #E5E5E5BB #000000BB #E5E5E5BB   #E5E5E5BB
client.urgent           #000000FF #900000BB #FFFFF6BB #900000BB   #900000BB
client.placeholder      #000000FF #000000BB #FFFFF6BB #000000BB   #000000BB

client.background       #FFFFF6FF

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

# default workspace layout
workspace_layout tabbed

# this is so that C-i o will stay within the same output; I have convenient
# bindings to get to other outputs so no need for directional movement to
# permit moving between outputs (it would be even better if we could just
# toggle this setting around the execution of C-i o, however)
focus_wrapping workspace

mouse_warping output

# Put bindings I don't need to repeat under C-i, so that we have enough keys
# left on the right hand that caps lock can be our only Super modifier, yet we
# do not need any one-handed chording.  *Only* bindings I might want to hit more
# than once in a row should be outside of this C-i map
mode "C-i-" {
	# make a fresh Emacs frame -- typically this gets invoked only on
	# empty workspaces, as otherwise I use commands under `C-x 5` to get
	# more Emacs frames
	bindsym e exec emacsclient -nc, mode "default"

	# override the script's usual logic to start a fresh, non-debug daemon
	bindsym Shift+e exec emacsclient -nc --spw/installed, mode "default"

	# Fresh Emacs frame and get a shell in HOME.  Without this it's
	# C-i e M-& which is too many keys esp. compared to C-i DEL
        bindsym Return exec emacsclient -nce                             \
		"(let ((default-directory (expand-file-name "'"'~/'"'")) \
		       (display-buffer-overriding-action                 \
		        '(display-buffer-same-window                     \
			  . ((inhibit-same-window . nil)))))             \
		   (transient-cycles-cmd-spw/eshell-jump-from-here))",   \
		mode "default"

        # start a terminal emulator
        bindsym BackSpace exec foot, mode "default"

        # make a fresh browser window
        bindsym b exec firefox -new-window, mode "default"

        # lock screen -- relies on swayidle
        # note that this won't lock other VTs (lock-session*s*
        # requires root password)
        bindsym l exec loginctl lock-session, mode "default"

        # go to sleep -- swayidle will lock screen
        bindsym --locked Shift+l exec systemctl suspend, mode "default"

        # kill focused window
        bindsym k exec pkill -u $USER -f --signal USR1 i3status-wrapper, kill, mode "default"

	# sway sample config says to pipe dmenu into `xargs swaymsg exec --`
	# but doesn't seem necessary with wofi

        bindsym p exec wofi --show=drun -i, mode "default"

        bindsym Shift+p exec wofi --show=run -i, mode "default"

	bindsym s exec ~/src/dotfiles/scripts/desktop/wofi_ssh, mode "default"

        # split in horizontal orientation
        bindsym h split h, mode "default"

        # split in vertical orientation
        bindsym v split v, mode "default"

        # enter fullscreen mode for the focused container
        bindsym f fullscreen toggle, mode "default"

        # change container layout (stacked, tabbed, toggle split)
        # bindsym s layout stacking, mode "default"
        bindsym w layout tabbed, mode "default"

	# make a container independently tabbed
	bindsym q split v, layout tabbed, mode "default"

        # toggle tiling / floating
        bindsym t floating toggle, mode "default"

        # change focus between tiling / floating windows
        bindsym Tab focus mode_toggle, mode "default"

        # focus the parent container
        bindsym a focus parent, mode "default"
	bindsym u focus parent, mode "default"

        # focus the child container
        bindsym d focus child, mode "default"

        # when screen is divided into two containers where at least one has
        # several tabs, as I usually have it on a small laptop screen, this
        # works well to go back and forth
        bindsym o focus parent, focus right, mode "default"

        # switch to workspace
        bindsym 1 workspace 1, mode "default"
        bindsym 2 workspace 2, mode "default"
        bindsym 3 workspace 3, mode "default"
        bindsym 4 workspace 4, mode "default"
        bindsym 5 workspace 5, mode "default"
        bindsym 6 workspace 6, mode "default"
        bindsym 7 workspace 7, mode "default"
        bindsym 8 workspace 8, mode "default"
        bindsym 9 workspace 9, mode "default"
        bindsym 0 workspace 10, mode "default"
        bindsym F1 workspace 11:F1, mode "default"
        bindsym F2 workspace 12:F2, mode "default"
        bindsym F3 workspace 13:F3, mode "default"
        bindsym F4 workspace 14:F4, mode "default"
        bindsym F5 workspace 15:F5, mode "default"
        bindsym F6 workspace 16:F6, mode "default"
        bindsym F7 workspace 17:F7, mode "default"
        bindsym F8 workspace 18:F8, mode "default"
        bindsym F9 workspace 19:F9, mode "default"
        bindsym F10 workspace 20:F10, mode "default"
        bindsym F11 workspace 21:F11, mode "default"
        bindsym F12 workspace 22:F12, mode "default"
        bindsym semicolon workspace back_and_forth, mode "default"

        # move focused container to workspace
        bindsym Shift+1 move container to workspace 1, mode "default"
        bindsym Shift+2 move container to workspace 2, mode "default"
        bindsym Shift+3 move container to workspace 3, mode "default"
        bindsym Shift+4 move container to workspace 4, mode "default"
        bindsym Shift+5 move container to workspace 5, mode "default"
        bindsym Shift+6 move container to workspace 6, mode "default"
        bindsym Shift+7 move container to workspace 7, mode "default"
        bindsym Shift+8 move container to workspace 8, mode "default"
        bindsym Shift+9 move container to workspace 9, mode "default"
        bindsym Shift+0 move container to workspace 10, mode "default"
        bindsym Shift+F1 move container to workspace 11:F1, mode "default"
        bindsym Shift+F2 move container to workspace 12:F2, mode "default"
        bindsym Shift+F3 move container to workspace 13:F3, mode "default"
        bindsym Shift+F4 move container to workspace 14:F4, mode "default"
        bindsym Shift+F5 move container to workspace 15:F5, mode "default"
        bindsym Shift+F6 move container to workspace 16:F6, mode "default"
        bindsym Shift+F7 move container to workspace 17:F7, mode "default"
        bindsym Shift+F8 move container to workspace 18:F8, mode "default"
        bindsym Shift+F9 move container to workspace 19:F9, mode "default"
        bindsym Shift+F10 move container to workspace 20:F10, mode "default"
        bindsym Shift+F11 move container to workspace 21:F11, mode "default"
        bindsym Shift+F12 move container to workspace 22:F12, mode "default"
        bindsym Shift+semicolon move container to workspace back_and_forth, \
                mode "default"
        bindsym Shift+Ctrl+semicolon move container to workspace back_and_forth, \
                workspace back_and_forth, mode "default"

        # next unused workspace
        bindsym j exec \
                ~/src/dotfiles/scripts/desktop/fresh-workspace, \
                mode "default"
	# sends window to next unused but doesn't change view
        bindsym Shift+j exec \
                ~/src/dotfiles/scripts/desktop/fresh-workspace --send, \
                mode "default"
	# sends window to next unused and changes view
	bindsym Shift+Ctrl+j exec \
                ~/src/dotfiles/scripts/desktop/fresh-workspace --take, \
		mode "default"

	# go to windows for tasks without needing to know the workspace
	bindsym slash exec ~/src/dotfiles/scripts/desktop/wofi_window, mode "default"

        # reload the configuration file
        bindsym Ctrl+Shift+c reload, mode "default"
        # exit i3 (logs you out of your X session)
        bindsym Ctrl+Shift+e exit

        bindsym g mode "C-i g-"

        # bindsym bracketleft exec debian-ftp-master-cut-note, mode "default"
        # bindsym Shift+bracketleft exec xdo-evince-highlight, mode "default"

        # Workspaces do not ever get assigned to particular purposes / windows
        # don't get assigned to particular workspaces.  If I can't find where
        # I was working on something, there's my bindings to `workspace
        # {next,prev}_on_output`.  Long-running processes like builds, for
        # example, stay in the workspace(s) where I'm working on that
        # task/project
        #
        # Previously I thought that instead of having them on a dedicated
        # workspace, windows that are almost always open should be put on the
        # scratcpad:
        #
        #     Note that we have to move to scratchpad at startup ('move to
        #     scratchpad' below), or the toggle key won't work.
        #
        #     Once every so often I'll have to launch the program, and then
        #     immediately use the toggle key to make it visible.  This is a
        #     bit inelegant, but much more reliable than binding the key to a
        #     script which starts the program if it's not around and otherwise
        #     toggles
	#
	# However, I now think that scratchpad windows are unwieldy for
	# various reasons, so just having them as regular windows with
	# shortcuts to get back to them is better.

        # chat
	# Foot in Debian bullseye doesn't have an option to set a persistent
        # title.  See <https://codeberg.org/dnkl/foot/issues/386> regarding
        # using the app ID for this purpose.  For bookworm, use new --override
        # locked-title=yes feature.
        bindsym Shift+n exec foot --app-id="foot-irssi" \
	        /bin/sh -c "mosh athena /home/spwhitton/src/dotfiles/bin/ii", \
                mode "default"
        bindsym n [app_id="foot-irssi"] focus, mode "default"

	bindsym c [con_mark=caffeinated] inhibit_idle none; \
	        mark --toggle caffeinated; \
		exec pkill -u $USER -f --signal USR1 i3status-wrapper; \
		mode "default"
	bindsym Shift+c [con_mark=caffeinated] inhibit_idle none; \
		[con_mark=caffeinated] mark --toggle caffeinated; \
		exec pkill -u $USER -f --signal USR1 i3status-wrapper; \
		mode "default"

	# The two % values are for melete.  Cf. `spw/maybe-scale-basic-faces'.
	#
	# This says: shrink such that an Emacs frame taking up the rest of the
	# width can fit two 80-column windows, with Debian's fonts-hack at
	# height 105.  So should be <33.  Sometimes we'll be able to fit an
	# 80-column frame in the smaller part of the split, but usually we
	# won't: the point is to ensure we can use Emacs with two 80-column
	# windows, as is usual, while also displaying something narrower.
	bindsym minus resize set width 31 ppt, mode "default"
	# And this says: ensure that the current window can be an Emacs frame
	# with at least 80 columns.  Based on Debian's fonts-hack scaled up to
	# height 120 by `spw/maybe-scale-basic-faces'.
	bindsym equal resize set width 43 ppt, mode "default"

        # connect to Debian's ftp-master server for ftpteam work
	bindsym Shift+f exec ~/src/dotfiles/scripts/desktop/sway-ftp-master , mode "default"
        bindsym y exec ~/src/dotfiles/scripts/desktop/sway-ftp-master-cut-note , mode "default"

        bindsym --locked space mode "default"
        bindsym --locked Ctrl+g mode "default"

}
# C-i is perfect for window manager bindings because it will never be
# bound in my Emacs config, as text terminals typically cannot
# distinguish between <tab> and C-i
bindsym --locked Ctrl+i mode "C-i-"

for_window [con_mark=caffeinated] inhibit_idle open

for_window [title="ftp-master GNU mc session"] mark mc
for_window [title="ftp-master dak command session"] mark dak

# change focus
bindsym Mod4+j focus left
bindsym Mod4+k focus right
bindsym Mod4+n focus down
bindsym Mod4+p focus up

# move focused window
bindsym Mod4+Ctrl+j move left
bindsym Mod4+Ctrl+k move right
bindsym Mod4+Ctrl+n move down
bindsym Mod4+Ctrl+p move up

bindsym Mod4+apostrophe layout toggle split

bindsym Mod1+Ctrl+i exec pkill -u $USER -f --signal USR1 i3status-wrapper, kill

# Cycle through all workspaces on monitor.  Unlike C-i j and C-i [0-9]+, these
# move the container *and* switch view to the other workspace, because there
# are more like Mod4+Ctrl+j/k than they are like the C-i bindings.
#
# Warp the cursor to a point on the screen which is hopefully a titlebar.
# This means that cycling through workspaces does not abruptly stop because,
# e.g., a VNC client has grabbed the keyboard upon entry to the workspace.
bindsym Mod4+comma seat - cursor set 0 0, workspace prev_on_output
bindsym Mod4+period seat - cursor set 0 0, workspace next_on_output
bindsym Mod4+Ctrl+comma seat - cursor set 0 0, \
        move container to workspace prev_on_output, \
        workspace prev_on_output
bindsym Mod4+Ctrl+period seat - cursor set 0 0, \
        move container to workspace next_on_output, \
        workspace next_on_output

bindsym Mod4+i focus output left
bindsym Mod4+Ctrl+i move workspace to output left
bindsym Mod4+o focus output right
bindsym Mod4+Ctrl+o move workspace to output right

# Start swaybar to display a workspace bar (plus the system information
# i3status finds out, if available)
bar {
        # i3status is designed to be highly performant so it continues
        # to be refreshed when the system is under load; we're giving
        # up some of that with i3status-wrapper, but let's see if it
        # actually matters
        status_command ~/src/dotfiles/scripts/desktop/i3status-wrapper

        # default behaviour is to cycle through workspaces when scroll
        # wheel is used on the bar.  However, don't think I've ever
        # used this deliberately, and often I do it by mistake, so
        # let's disable it
        bindsym button4 nop
	bindsym button5 nop

        colors {
            background #FFFFF6BB
            statusline #000000BB
            separator  #000000BB

            focused_workspace  #000000BB #B4EEB4BB #000000BB
            active_workspace   #000000BB #FFFFF6BB #000000BB
            inactive_workspace #000000BB #E5E5E5BB #000000BB
            urgent_workspace   #000000BB #900000BB #FFFFF6BB
            binding_mode       #000000BB #900000BB #FFFFF6BB
        }

        position bottom
        strip_workspace_numbers yes
	status_edge_padding 11

	tray_output primary
}

# single key launching
mode "C-i g-" {
        # start a graphical file manager
        bindsym g exec thunar , mode "default"

        # open virt-viewer pointed at develacc
        bindsym d exec develacc-please , mode "default"

	bindsym y exec foot yapet , mode "default"
	bindsym w exec ~/src/dotfiles/scripts/desktop/whitenoise , mode "default"

	bindsym x exec wdisplays , mode "default"

        bindsym Ctrl+g mode "default"
}

bindsym --locked XF86AudioRaiseVolume exec pactl set-sink-volume @DEFAULT_SINK@ +10%
bindsym --locked XF86AudioLowerVolume exec pactl set-sink-volume @DEFAULT_SINK@ -10%
bindsym --locked XF86AudioMute exec pactl set-sink-mute @DEFAULT_SINK@ toggle

bindsym --locked XF86MonBrightnessUp exec brightnessctl set +10%
bindsym --locked XF86MonBrightnessDown exec brightnessctl set 10%-

popup_during_fullscreen leave_fullscreen

# windows that should always float
for_window [title="^Ediff"] floating enable

input type:keyboard repeat_rate 25
input type:keyboard repeat_delay 380

seat * hide_cursor 5000

exec mako
exec emacsclient --spw/update-environment

exec_always fcitx5 -d --replace

output * bg ~/src/dotfiles/lib-src/img/green_gobbler.png tile

# Ideally we wouldn't try to call swaylock if the screen is already locked,
# but discovering whether swaylock is already running in a way that avoids
# races is difficult or impossible because swaylock doesn't have a mechanism
# to report that it's successfully locked the screen other than daemonising.
# So, until it does, the following means a lot of "failed to lock; already
# locked?"  messages on stderr.
exec swayidle -w \
 lock 'swaylock -f' before-sleep 'swaylock -f' timeout 300 'swaylock -f' \
 timeout 300 'swaymsg "output * dpms off"' resume 'swaymsg "output * dpms on"'

include ~/.config/sway/$(hostname)/*