summaryrefslogtreecommitdiff
path: root/config/sway
diff options
context:
space:
mode:
authorThomas Ulmer <thomasmulmer02@gmail.com>2026-02-04 14:24:16 -0800
committerThomas Ulmer <thomasmulmer02@gmail.com>2026-02-04 14:24:16 -0800
commit9139a1b136fa2b5adfcac0ac09a4f61aa1ee1ff4 (patch)
treede82bc4776b87f1fbb86f14b4a15d35d009ddd28 /config/sway
parenta9bf8f30c746f5b28bb7eb6938e8390127081a32 (diff)
full reorg
Diffstat (limited to 'config/sway')
-rw-r--r--config/sway/config298
-rwxr-xr-xconfig/sway/otherwindow81
-rwxr-xr-xconfig/sway/switch.py101
-rwxr-xr-xconfig/sway/switch.sh11
-rwxr-xr-xconfig/sway/toEmacs.sh12
5 files changed, 503 insertions, 0 deletions
diff --git a/config/sway/config b/config/sway/config
new file mode 100644
index 0000000..7150e18
--- /dev/null
+++ b/config/sway/config
@@ -0,0 +1,298 @@
+# Default config for sway
+#
+# Copy this to ~/.config/sway/config and edit it to your liking.
+#
+# Read `man 5 sway` for a complete reference.
+
+### Variables
+#
+# Logo key. Use Mod1 for Alt.
+set $mod Mod4
+# Your preferred terminal emulator
+set $term foot
+# Your preferred application launcher
+# Note: pass the final command to swaymsg so that the resulting window can be opened
+# on the original workspace that the command was run on.
+set $menu exec wofi -G --show run,drun
+
+
+#general preferences
+focus_follows_mouse no
+seat * hide_cursor when-typing enable
+
+input type:keyboard {
+ repeat_delay 210
+ repeat_rate 35
+# xkb_file ~/.xkb/symbols/tmucustom.xkb
+# xkb_options compose:ralt
+ #,grp:rctrl_toggle
+ xkb_numlock enabled
+# xkb_layout us,us
+# xkb_variant ,dvorak
+}
+input type:touchpad {
+ dwt disabled
+ tap enabled
+ drag disabled
+ drag_lock disabled
+ middle_emulation disabled
+ tap_button_map lrm
+}
+
+#specfically the little red one
+input "1739:52619:SYNA8006:00_06CB:CD8B_Mouse" {
+# pointer_accel -1
+# accel_profile flat
+# scroll_factor 0.25
+ dwt disabled
+}
+
+for_window [app_id=mpv] floating enable
+
+#start language switcher
+exec fcitx6 -d
+
+#notifs
+exec mako
+
+#handle monitors properly
+exec_always bash -c 'if $(swaymsg -t get_outputs | grep -q -F "HDMI"); then swaymsg output eDP-1 disable; swaymsg output HDMI-A-1 enable; swaymsg output DP-2 enable; else swaymsg output eDP-1 enable; swaymsg output HDMI-A-1 disable; swaymsg output DP-2 disable; fi'
+
+#get me a background
+#exec_always bash -c 'sleep 0.5s ;systemctl --user start background.service'
+exec_always bash -c 'setwallpaper ~/Pictures/capture/aesthetic/turquoiseCity.jpg'
+
+output HDMI-A-1 {
+# background ~/Pictures/tree.jpg fill
+ pos 0 0
+ mode 1920x1080@60Hz
+}
+
+output eDP-1 {
+# background ~/Pictures/tree.jpg fill
+ pos 0 0
+ mode 1920x1080@60Hz
+}
+
+output DP-2 {
+# background ~/Pictures/tree.jpg fill
+ pos 1920 0
+ mode 1920x1080@60Hz
+}
+
+
+#
+# Status Bar:
+#
+# Read `man 5 sway-bar` for more information about this section.
+bar {
+ swaybar_command waybar
+# position bottom
+# height 20
+
+# # When the status_command prints a new line to stdout, swaybar updates.
+# # The default just shows the current date and time.
+# # status_command while date +'%Y-%m-%d %I:%M:%S %p'; do sleep 1; done
+
+# # colors {
+# # statusline #ffffff
+# # background #323232
+# # inactive_workspace #32323200 #32323200 #d0d0d0
+# # }
+}
+
+#theming stuff
+#titlebar_border_thickness 2
+#no extra padding
+# titlebar_padding 2
+#hide_edge_borders both
+#smart_borders on
+workspace_layout stacking
+focus_wrapping yes
+show_marks on
+# start in normal state
+default_border none
+titlebar_border_thickness 0
+titlebar_padding 2
+font monospace 10
+# bar mode dock
+# two modes, with and without metadata
+bindsym $mod+g default_border none, titlebar_border_thickness 0, titlebar_padding 2, font monospace 10, bar mode dock
+bindsym $mod+Shift+g default_border pixel 0, titlebar_border_thickness 0, titlebar_padding 0, font monospace 0, bar mode hide
+# more jumping stuff
+bindsym --to-code $mod+m exec sway-marker mark
+bindsym --to-code $mod+Shift+m exec sway-marker goto
+
+### 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
+
+# get me to emacs
+bindsym $mod+Shift+p exec ~/.config/sway/toEmacs.sh
+
+# make a new emacs frame here
+bindsym $mod+p exec emacsclient -c --alternate-editor=emacs
+
+# start browser
+bindsym $mod+e exec firefox
+
+# start quick-open menu
+#bindsym $mod+o exec $term --title quicklauncher -e bash -c 'read line; eval $line | less -r'
+#for_window [title="quicklauncher"] floating enable, resize set 30 ppt 35 ppt, border pixel 2
+
+#other window swap
+bindsym $mod+o exec swaymsg [con_id=$(~/.config/sway/otherwindow f)] focus
+
+# Drag floating windows by holding down $mod and left mouse button.
+# Resize them with right mouse button + $mod.
+# Despite the name, also works for non-floating windows.
+# Change normal to inverse to use left mouse button for resizing and right
+# mouse button for dragging.
+floating_modifier $mod normal
+
+# Reload the configuration file
+bindsym $mod+Shift+c reload
+
+# Exit sway (logs you out of your Wayland session)
+bindsym $mod+Shift+e exit
+
+# media keys
+bindsym XF86AudioRaiseVolume exec pactl set-sink-volume @DEFAULT_SINK@ +5% && $refresh_i3status
+bindsym XF86AudioLowerVolume exec pactl set-sink-volume @DEFAULT_SINK@ -5% && $refresh_i3status
+bindsym XF86AudioMute exec pactl set-sink-mute @DEFAULT_SINK@ toggle && $refresh_i3status
+bindsym XF86AudioMicMute exec pactl set-source-mute @DEFAULT_SOURCE@ toggle && $refresh_i3status
+
+bindsym XF86MonBrightnessDown exec brightnessctl -e s 10%-
+bindsym XF86MonBrightnessUp exec brightnessctl -e s +10%
+
+# other bindings
+bindsym $mod+grave exec systemctl suspend
+bindsym $mod+Escape exec sh -c 'swaylock -i /home/tmu/Pictures/capture/installsource.png -l -e -t --indicator-radius 100 & systemctl suspend'
+
+bindsym $mod+w exec sh -c '/home/tmu/.config/sway/switch.py'
+
+
+#
+# Moving around:
+#
+# 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
+
+bindsym $mod+h focus left
+bindsym $mod+j focus down
+bindsym $mod+k focus up
+bindsym $mod+l 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
+
+bindsym $mod+Shift+h move left
+bindsym $mod+Shift+j move down
+bindsym $mod+Shift+k move up
+bindsym $mod+Shift+l move right
+#
+# Workspaces:
+#
+# Switch to workspace
+bindsym $mod+1 workspace number 1
+bindsym $mod+2 workspace number 2
+bindsym $mod+3 workspace number 3
+bindsym $mod+4 workspace number 4
+bindsym $mod+5 workspace number 5
+bindsym $mod+6 workspace number 6
+bindsym $mod+7 workspace number 7
+bindsym $mod+8 workspace number 8
+bindsym $mod+9 workspace number 9
+bindsym $mod+0 workspace number 10
+# Move focused container to workspace
+bindsym $mod+Shift+1 move container to workspace number 1
+bindsym $mod+Shift+2 move container to workspace number 2
+bindsym $mod+Shift+3 move container to workspace number 3
+bindsym $mod+Shift+4 move container to workspace number 4
+bindsym $mod+Shift+5 move container to workspace number 5
+bindsym $mod+Shift+6 move container to workspace number 6
+bindsym $mod+Shift+7 move container to workspace number 7
+bindsym $mod+Shift+8 move container to workspace number 8
+bindsym $mod+Shift+9 move container to workspace number 9
+bindsym $mod+Shift+0 move container to workspace number 10
+
+# move workspaces between monitors
+bindsym $mod+Prior focus output left
+bindsym $mod+Next focus output right
+bindsym $mod+Shift+Prior move workspace output left
+bindsym $mod+Shift+Next move workspace output right
+
+# 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 #not sure I need, I'll leave it
+bindsym $mod+y layout tabbed
+bindsym $mod+t 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
+
+ # Return to default mode
+ bindsym Return mode "default"
+ bindsym Escape mode "default"
+}
+bindsym $mod+r mode "resize"
+
+include /etc/sway/config.d/*
diff --git a/config/sway/otherwindow b/config/sway/otherwindow
new file mode 100755
index 0000000..e75c40d
--- /dev/null
+++ b/config/sway/otherwindow
@@ -0,0 +1,81 @@
+#!/usr/bin/env python3
+
+import sys
+import json
+import subprocess
+
+swaymsg = subprocess.run(['swaymsg', '-t', 'get_tree'], stdout=subprocess.PIPE)
+data = json.loads(swaymsg.stdout)
+current = data["nodes"][1]["current_workspace"]
+
+def iterdict(d, pred):
+ for sub in d["nodes"]:
+ # print("sub", sub)
+ if isinstance(sub, dict):
+ # print("check 1", sub)
+ if pred(sub):
+ # print("check 2", sub)
+ return sub
+ else:
+ rec = iterdict(sub, pred)
+ if rec != None:
+ return d
+ return None
+
+def focused(d):
+ # print("tested", d)
+ if "focused" in d:
+ return bool(d["focused"])
+ return False
+ # return (("focused" in d) and d["focused"])
+
+def getWorkspace():
+ for output in data["nodes"]:
+ for workspace in output["nodes"]:
+ possible = iterdict(workspace, focused)
+ # print("pos", possible)
+ if possible != None:
+ #not None, must have been some focused
+ return possible
+ #maybe gives all the visible ones in multi monitor mode?
+ return None
+
+
+#workspace = int(data["nodes"][1]["current_workspace"])-1
+#roi = data["nodes"][1]["nodes"][workspace]
+#print(roi)
+temp = getWorkspace()
+windows = list()
+
+def getNextWindow():
+ if focus < len(windows) - 1:
+ return focus+1
+ else:
+ return 0
+
+def getPrevWindow():
+ if focus > 0:
+ return focus-1
+ else:
+ return len(windows)-1
+
+def makelist(temp):
+ for nodes in "floating_nodes", "nodes":
+ for i in range(len(temp[nodes])):
+ # print(temp[nodes][i]["name"])
+ # print()
+ if temp[nodes][i]["name"] is None:
+ makelist(temp[nodes][i])
+ elif temp[nodes][i]["visible"]:
+ windows.append(temp[nodes][i])
+
+def focused(temp_win):
+ for i in range(len(temp_win)):
+ if temp_win[i]["focused"] == True:
+ return i
+
+makelist(temp)
+#print(windows)
+# print(len(windows))
+focus = focused(windows)
+print(windows[getNextWindow()]["id"])
diff --git a/config/sway/switch.py b/config/sway/switch.py
new file mode 100755
index 0000000..479cf74
--- /dev/null
+++ b/config/sway/switch.py
@@ -0,0 +1,101 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+import subprocess
+import json
+import re
+import gi
+gi.require_version('Gtk', '3.0')
+from gi.repository import Gtk
+
+def parse_icon_name(app_name):
+ app_name = app_name.lower()
+ if app_name in icon_names:
+ return icon_names[app_name]
+ if app_name.endswith('telegram_desktop'):
+ return 'telegram'
+ if app_name.startswith('gimp'):
+ return 'gimp'
+ return app_name
+
+def get_icon(app_name):
+ icon_info = icon_theme.lookup_icon(parse_icon_name(app_name), 48, 0)
+ if icon_info == None:
+ print("Failed to get icon for: " + app_name)
+ # return icon_info.get_filename() if icon_info != None else default_icon_file
+ return default_icon_file
+
+def get_cons(tree):
+ if len(tree.get('nodes')) == 0 and len(tree.get('floating_nodes')) == 0 and (tree.get('type') == 'con' or tree.get('type') == 'floating_con'):
+ return [tree]
+ nodes = []
+ for node in tree.get('floating_nodes'):
+ cons = get_cons(node)
+ nodes += cons
+ for node in tree.get('nodes'):
+ cons = get_cons(node)
+ nodes += cons
+ return nodes
+
+def show_wofi(windows):
+ # command = 'wofi -W 600 -L ' + str(len(windows)) + ' -I -d -i -b -k /dev/null -p "Window" 2>/dev/null'
+ command = 'wofi -G -L ' + str(len(windows)) + ' -I -d -i -b -p "Window" 2>/dev/null'
+ process = subprocess.Popen(command, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
+ (result, _) = process.communicate(input='\n'.join(windows).encode())
+ return result
+
+
+def get_tree():
+ sway_tree = subprocess.check_output(['swaymsg', '-rt', 'get_tree'])
+ return json.loads(sway_tree)
+
+def get_windows():
+ cons = get_cons(get_tree())
+ windows = []
+ for con in cons:
+ name = con['name']
+ if len(name) > 70:
+ name = name[:67]+"..."
+ app_id = con.get('app_id')
+ if app_id == None:
+ window_prop = con.get('window_properties')
+ if window_prop != None:
+ app_id = window_prop.get('instance')
+
+ if app_id != None:
+ app_icon = get_icon(app_id)
+ else:
+ app_icon = default_icon_file
+
+ # windows.append("img:id=" + str(con.get('id')) +":img:" + app_icon + ":text:" + name)
+ windows.append("img:id=" + str(con.get('id')) +":img:" + app_icon + ":text:" + app_id + ": " + name)
+ return windows
+
+def parse_selection(selection):
+ id_search = re.search('id=([0-9]*):', selection, re.IGNORECASE)
+ if id_search:
+ return id_search.group(1)
+ return None
+
+def switch_window(id):
+ command="swaymsg [con_id={}] focus".format(id)
+ process = subprocess.Popen(command,shell=True,stdout=subprocess.PIPE)
+ process.communicate()
+
+if __name__ == "__main__":
+ icon_theme = Gtk.IconTheme.get_default()
+ default_icon = icon_theme.lookup_icon("preferences-system-windows", 48, 0)
+ default_icon_file = ""
+ if default_icon:
+ default_icon_file = default_icon.get_filename()
+
+ icon_names = {
+ "code": "visual-studio-code",
+ "qt5ct": "preferences-desktop-theme"
+ }
+
+ windows = get_windows()
+ selection = show_wofi(windows)
+ con_id = parse_selection(str(selection))
+ if con_id:
+ switch_window(con_id)
diff --git a/config/sway/switch.sh b/config/sway/switch.sh
new file mode 100755
index 0000000..62751b8
--- /dev/null
+++ b/config/sway/switch.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+a="$(swaymsg -t get_tree | jq '.. | objects | select(.type == "con") | select(.focused == true) | .marks | index("t") != null')"
+
+#echo $a
+if [ $a = "true" ]; then
+ swaymsg '[con_mark="l"] focus'
+else
+ swaymsg 'mark --add "l"; [con_mark="t"] focus'
+fi
+
diff --git a/config/sway/toEmacs.sh b/config/sway/toEmacs.sh
new file mode 100755
index 0000000..aacf2c1
--- /dev/null
+++ b/config/sway/toEmacs.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+
+#get be to emacs and back
+
+f=$(swaymsg -t get_tree | jq '.. | objects | select(.focused) | .app_id')
+
+
+if [ $f = '"emacs"' ]; then
+ swaymsg '[con_mark="E"] focus'
+else
+ swaymsg 'mark --add "E"; [app_id="emacs"] focus'
+fi