summaryrefslogtreecommitdiff
path: root/.config/sway/config
blob: 857f14da4dd432c8e9a250d62c9cbe0557324026 (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
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

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 -ncw15, mode "default"

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

	# special daemon instance for debugging primary instance & Gnus
	bindsym r exec emacsclient -ncw8 -sgdbmacs, 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 -ncw15 -e                        \
		"(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 Ctrl+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 Ctrl+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, mode "default"

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

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

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

        # # when screen is divided into two containers where at least one might
        # # have several tabs, as I usually have it, this works well to go back
        # # and forth
        # bindsym o focus_wrapping workspace, focus parent, focus right, \
        # 	focus_wrapping yes, mode "default"

	bindsym o exec ~/src/dotfiles/scripts/desktop/i3status-wrapper-msg \
		other column, 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/i3status-wrapper-msg \
		fresh-workspace, mode "default"
	# sends window to next unused but doesn't change view
        bindsym Mod1+j exec \
                ~/src/dotfiles/scripts/desktop/i3status-wrapper-msg \
		fresh-workspace send, mode "default"
	# sends window to next unused and changes view
	bindsym Mod1+Ctrl+j exec \
                ~/src/dotfiles/scripts/desktop/i3status-wrapper-msg \
		fresh-workspace take, mode "default"

	bindsym comma exec \
		~/src/dotfiles/scripts/desktop/i3status-wrapper-msg \
		absorb_expel left, mode "default"
	bindsym period exec \
		~/src/dotfiles/scripts/desktop/i3status-wrapper-msg \
		absorb_expel right, mode "default"

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

        bindsym g mode "C-i g-"

        # bindsym bracketleft exec debian-ftp-master-cut-note, mode "default"
        # bindsym Ctrl+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.

        bindsym n exec swaymsg '[title="\[mosh\] tmux default on athena"]' focus \
		|| foot ssh-and-tmux athena.silentflame.com, mode "default"

	bindsym c [con_mark=caffeinated] inhibit_idle none; \
	        mark --toggle caffeinated; mode "default"
	bindsym Ctrl+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 minus exec \
		~/src/dotfiles/scripts/desktop/i3status-wrapper-msg cols decr, \
		mode "default"
	bindsym equal exec \
		~/src/dotfiles/scripts/desktop/i3status-wrapper-msg cols incr, \
		mode "default"

        bindsym Ctrl+y exec ~/src/dotfiles/scripts/desktop/sway-ftp-master-cut-note , 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

focus_wrapping no

# change focus
bindsym Ctrl+7 exec \
	~/src/dotfiles/scripts/desktop/i3status-wrapper-msg focus left \
	|| swaymsg focus left
bindsym Ctrl+0 exec \
	~/src/dotfiles/scripts/desktop/i3status-wrapper-msg focus right \
	|| swaymsg focus right
bindsym Ctrl+8 focus down
bindsym Ctrl+9 focus up

# move focused window
bindsym Mod1+Ctrl+7 exec ~/src/dotfiles/scripts/desktop/i3status-wrapper-msg move left || swaymsg move left
bindsym Mod1+Ctrl+0 exec ~/src/dotfiles/scripts/desktop/i3status-wrapper-msg move right || swaymsg move right
bindsym Mod1+Ctrl+8 move down
bindsym Mod1+Ctrl+9 move up

bindsym Ctrl+5 kill
bindsym Ctrl+6 exec \
	~/src/dotfiles/scripts/desktop/i3status-wrapper-msg monocle toggle

# bindsym Ctrl+apostrophe layout toggle splith splitv tabbed

# 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+1 seat - cursor set 0 0, workspace prev_on_output
bindsym Ctrl+4 seat - cursor set 0 0, workspace next_on_output
bindsym Mod1+Ctrl+1 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+2 focus output left
bindsym Mod1+Ctrl+2 move workspace to output left
bindsym Ctrl+3 focus output right
bindsym Mod1+Ctrl+3 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         #E5E5E5
            focused_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
        }

	# Leave i3status-wrapper to disable the workspace buttons once it has
	# started handling workspaces.

        position bottom
        strip_workspace_numbers yes
	status_edge_padding 11
	tray_padding 0

	workspace_min_width 50
}

# 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 s mode "default", \
		exec grim -c ~/tmp/$(hostname -s)_$(date +%F_%H.%M.%S).png

	bindsym x exec wdisplays , mode "default"

        bindsym Ctrl+g mode "default"
}

bindsym --locked XF86AudioRaiseVolume exec pactl set-sink-volume @DEFAULT_SINK@ +5%
bindsym --locked XF86AudioLowerVolume exec pactl set-sink-volume @DEFAULT_SINK@ -5%
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
no_focus [title="Firefox . Sharing Indicator"]
for_window [title="Firefox . Sharing Indicator"] floating enable, \
	   move position 0 0

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

seat * hide_cursor 5000

exec mako
exec swayidle -w
exec emacsclient --spw/update-environment
exec emacsclient -sgdbmacs --spw/no-start --spw/update-environment

exec_always fcitx5 -d --replace
exec blueman-applet
exec nm-applet --indicator

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

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