diff options
Diffstat (limited to 'config/sway')
| -rw-r--r-- | config/sway/config | 298 | ||||
| -rwxr-xr-x | config/sway/otherwindow | 81 | ||||
| -rwxr-xr-x | config/sway/switch.py | 101 | ||||
| -rwxr-xr-x | config/sway/switch.sh | 11 | ||||
| -rwxr-xr-x | config/sway/toEmacs.sh | 12 |
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 |
