summaryrefslogtreecommitdiff
path: root/.config/sway/config
blob: e258f6b5385b08c7d2b0c42196fe5d735d584cf6 (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
388
389
390
391
392
393
394
395
396
397
398
399
400
include /etc/sway/config.d/*

font pango:Hack 10

# class                 border  bground text    indicator child_border
client.focused          #000000 #B4EEB4 #000000 #B4EEB4   #000000
client.focused_inactive #000000 #FFFFF6 #000000 #AA9E9F   #AA9E9F
client.unfocused        #000000 #E5E5E5 #000000 #AA9E9F   #AA9E9F
client.urgent           #000000 #702020 #FFFFF6 #AA9E9F   #AA9E9F
client.placeholder      #000000 #000000 #FFFFF6 #AA9E9F   #AA9E9F

client.background       #FFFFF6

# 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

# Key binding strategy:
#
# Use Ctrl+N and Mod1+Ctrl+N, which will never be bound in Emacs, for bindings
# I will often need to type more than once in a row.  Otherwise put the
# bindings under the C-i prefix map, which will never be bound by Emacs
# because text terminals typically can't distinguish between C-i and TAB.
# If we need it, we can bind C-i Ctrl+N, C-i Mod1+Ctrl+N to pass the keys
# through, like C-\ \ in tmux.
#
# Previously we used Mod4 modifying a key on the right side of the keyboard
# instead of Ctrl+N and Mod1+Ctrl+N; there are enough of these that we can
# still avoid any one-handed chording with only a single Super key.  However,
# this means using the weak little finger to hold down a modifier key for more
# than one keypress with the other hand, which is worth avoiding.

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"

	# special daemon instance for debugging primary instance & Gnus
	bindsym Mod1+e exec emacsclient -nc -sgdbmacs --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 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"

	bindsym Mod1+g exec makoctl dismiss --all

        # 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 Mod1+1 move container to workspace 1, mode "default"
        bindsym Mod1+2 move container to workspace 2, mode "default"
        bindsym Mod1+3 move container to workspace 3, mode "default"
        bindsym Mod1+4 move container to workspace 4, mode "default"
        bindsym Mod1+5 move container to workspace 5, mode "default"
        bindsym Mod1+6 move container to workspace 6, mode "default"
        bindsym Mod1+7 move container to workspace 7, mode "default"
        bindsym Mod1+8 move container to workspace 8, mode "default"
        bindsym Mod1+9 move container to workspace 9, mode "default"
        bindsym Mod1+0 move container to workspace 10, mode "default"
        bindsym Mod1+F1 move container to workspace 11:F1, mode "default"
        bindsym Mod1+F2 move container to workspace 12:F2, mode "default"
        bindsym Mod1+F3 move container to workspace 13:F3, mode "default"
        bindsym Mod1+F4 move container to workspace 14:F4, mode "default"
        bindsym Mod1+F5 move container to workspace 15:F5, mode "default"
        bindsym Mod1+F6 move container to workspace 16:F6, mode "default"
        bindsym Mod1+F7 move container to workspace 17:F7, mode "default"
        bindsym Mod1+F8 move container to workspace 18:F8, mode "default"
        bindsym Mod1+F9 move container to workspace 19:F9, mode "default"
        bindsym Mod1+F10 move container to workspace 20:F10, mode "default"
        bindsym Mod1+F11 move container to workspace 21:F11, mode "default"
        bindsym Mod1+F12 move container to workspace 22:F12, mode "default"
        bindsym Mod1+semicolon move container to workspace back_and_forth, \
                mode "default"
        bindsym Mod1+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 Mod1+j exec \
                ~/src/dotfiles/scripts/desktop/fresh-workspace --send, \
                mode "default"
	# sends window to next unused and changes view
	bindsym Mod1+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; mode "default"
	bindsym Shift+c [con_mark=caffeinated] inhibit_idle none; \
		[con_mark=caffeinated] mark --toggle caffeinated; 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"

        bindsym Ctrl+y exec ~/src/dotfiles/scripts/desktop/sway-ftp-master-cut-note , mode "default"

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

}
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 Ctrl+7 focus left
bindsym Ctrl+0 focus right
bindsym Ctrl+8 focus down
bindsym Ctrl+9 focus up

# move focused window
bindsym Mod1+Ctrl+7 move left
bindsym Mod1+Ctrl+0 move right
bindsym Mod1+Ctrl+8 move down
bindsym Mod1+Ctrl+9 move up

bindsym Mod1+Ctrl+i kill

bindsym Ctrl+minus layout toggle split

# Cycle through all workspaces on monitor.
# 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 Ctrl+3 seat - cursor set 0 0, workspace prev_on_output
bindsym Ctrl+4 seat - cursor set 0 0, workspace next_on_output
bindsym Mod1+Ctrl+3 seat - cursor set 0 0, \
        move container to workspace prev_on_output, \
        workspace prev_on_output
bindsym Mod1+Ctrl+4 seat - cursor set 0 0, \
        move container to workspace next_on_output, \
        workspace next_on_output

bindsym Ctrl+1 focus output left
bindsym Mod1+Ctrl+1 move workspace to output left
bindsym Ctrl+2 focus output right
bindsym Mod1+Ctrl+2 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 #FFFFF6
            statusline #000000
            separator  #000000

            focused_workspace  #000000 #B4EEB4 #000000
            active_workspace   #000000 #FFFFF6 #000000
            inactive_workspace #000000 #E5E5E5 #000000
            urgent_workspace   #000000 #702020 #FFFFF6
            binding_mode       #000000 #EECD82 #000000
        }

	# We don't set workspace_buttons to "no" even though we start off with
	# a single workspace (see i3status-wrapper) because under Sway that
	# can trigger a bug which means the button display doesn't get
	# properly updated.

        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"

        # connect to Debian's ftp-master server for ftpteam work
	bindsym f exec ~/src/dotfiles/scripts/desktop/sway-ftp-master , 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 emacsclient -sgdbmacs --spw/no-start --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)/*