From 0a845fddc147c328ee7e54e1f67daaa8c825ead4 Mon Sep 17 00:00:00 2001 From: Maximilian Wagner Date: Fri, 23 Feb 2024 23:41:24 +0100 Subject: [PATCH] changed color and positioning --- config | 17 +++++++ config.power | 9 ++++ config.screenshot | 9 ++++ style.css | 47 ++++++++++++++++++ style.widgets.css | 32 +++++++++++++ windows.py | 119 ++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 233 insertions(+) create mode 100644 config create mode 100644 config.power create mode 100644 config.screenshot create mode 100644 style.css create mode 100644 style.widgets.css create mode 100755 windows.py diff --git a/config b/config new file mode 100644 index 0000000..dd49a10 --- /dev/null +++ b/config @@ -0,0 +1,17 @@ +hide_scroll=true +show=drun +width=25% +lines=10 +line_wrap=word +term=kitty +allow_markup=true +always_parse_args=true +show_all=true +print_command=true +layer=overlay +allow_images=true +insensitive=true +prompt= +image_size=15 +display_generic=true +location=center diff --git a/config.power b/config.power new file mode 100644 index 0000000..1eaf798 --- /dev/null +++ b/config.power @@ -0,0 +1,9 @@ +hide_search=true +hide_scroll=true +insensitive=true +show=dmenu +width=100 +lines=4 +location=top_right +x=-100 +y=0 diff --git a/config.screenshot b/config.screenshot new file mode 100644 index 0000000..b8ba54d --- /dev/null +++ b/config.screenshot @@ -0,0 +1,9 @@ +hide_search=true +hide_scroll=true +insensitive=true +width=100 +show=dmenu +lines=5 +location=top_left +x=0 +y=0 diff --git a/style.css b/style.css new file mode 100644 index 0000000..d50d073 --- /dev/null +++ b/style.css @@ -0,0 +1,47 @@ +/* +Arc-Dark Color Scheme +*/ + +/* +Catppuccin Color Scheme +*/ + +@define-color highlight #585b70 ; +@define-color background #1E1E2E ; +@define-color border #B4BEFE ; +@define-color chars #cdd6f4 ; + +*{ + font-family: UbuntuMono; +} + +window { + border: 1px solid @highlight; +} + +#input { + margin-bottom: 15px; + padding:3px; + border-radius: 5px; + border: 0px solid @border; + color: @chars; +} + +#inner-box { + background-color: @background; +} + +#outer-box { + padding: 15px; + border: 1px solid @border; + background-color: @background; +} + +#text { + padding: 5px; + color: @chars; +} + +#entry:selected { + background-color: @highlight; +} diff --git a/style.widgets.css b/style.widgets.css new file mode 100644 index 0000000..2e24827 --- /dev/null +++ b/style.widgets.css @@ -0,0 +1,32 @@ +/* +Arc-Dark Color Scheme +*/ + +@define-color highlight #585b70 ; +@define-color background #1E1E2E ; +@define-color border #B4BEFE ; +@define-color chars #cdd6f4 ; + +*{ + font-family: UbuntuMono; +} + +#inner-box { + background-color: @background; +} + +#outer-box { + padding: 15px; + margin-top: -22px; + border: 1px solid @border; + background-color: @background; +} + +#text { + padding: 5px; + color: @chars; +} + +#entry:selected { + background-color: @highlight; +} diff --git a/windows.py b/windows.py new file mode 100755 index 0000000..6b41a60 --- /dev/null +++ b/windows.py @@ -0,0 +1,119 @@ +#!/bin/python3 +import json +import subprocess +from argparse import ArgumentParser + +ENTER = "\n" + + +def get_windows(): + + command = "swaymsg -t get_tree" + process = subprocess.Popen( + command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE + ) + + process = subprocess.Popen( + command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE + ) + data = json.loads(process.communicate()[0]) + + # Select outputs that are active + windows = [] + for output in data["nodes"]: + + # The scratchpad (under __i3) is not supported + if output.get("name") != "__i3" and output.get("type") == "output": + workspaces = output.get("nodes", []) + for ws in workspaces: + if ws.get("type") == "workspace": + windows.extend(extract_nodes_iterative(ws)) + return windows + + +# Extracts all windows from a sway workspace json object +def extract_nodes_iterative(workspace): + all_nodes = [] + + floating_nodes = workspace.get("floating_nodes", []) + + for floating_node in floating_nodes: + all_nodes.append(floating_node) + + nodes = workspace.get("nodes", []) + + for node in nodes: + + # Leaf node + if not node.get("nodes"): + all_nodes.append(node) + # Nested node, handled iterative + else: + for inner_node in node.get("nodes"): + nodes.append(inner_node) + + return all_nodes + + +# Returns an array of all windows +def parse_windows(windows): + return [window.get("name") for window in windows] + + +# Returns a newline seperated UFT-8 encoded string of all windows for wofi +def build_wofi_string(windows): + return ENTER.join(windows).encode("UTF-8") + + +# Executes wofi with the given input string +def show_wofi(windows): + + command = 'wofi -c ~/.config/wofi/menu -s ~/.config/wofi/style.css -p "Windows: " -d -i --hide-scroll' + + process = subprocess.Popen( + command, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE + ) + return process.communicate(input=windows)[0] + + +# Returns the sway window id of the window that was selected by the user inside wofi +def parse_id(windows, parsed_windows, selected): + if not selected: + return None + else: + selected = (selected.decode("UTF-8"))[:-1] # Remove new line character + window_index = int( + parsed_windows.index(selected) + ) # Get index of selected window in the parsed window array + return str( + windows[window_index].get("id") + ) # Get sway window id based on the index + + +# Switches the focus to the given id +def switch_window(id): + command = "swaymsg [con_id={}] focus".format(id) + + process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE) + process.communicate()[0] + + +# Entry point +if __name__ == "__main__": + + parser = ArgumentParser(description="Wofi based window switcher") + + windows = get_windows() + + parsed_windows = parse_windows(windows) + + wofi_string = build_wofi_string(parsed_windows) + + selected = show_wofi(wofi_string) + + # Otherwise no point in running + if selected: + + selected_id = parse_id(windows, parsed_windows, selected) + + switch_window(selected_id)