changed color and positioning
This commit is contained in:
commit
0a845fddc1
17
config
Normal file
17
config
Normal file
@ -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
|
9
config.power
Normal file
9
config.power
Normal file
@ -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
|
9
config.screenshot
Normal file
9
config.screenshot
Normal file
@ -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
|
47
style.css
Normal file
47
style.css
Normal file
@ -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;
|
||||
}
|
32
style.widgets.css
Normal file
32
style.widgets.css
Normal file
@ -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;
|
||||
}
|
119
windows.py
Executable file
119
windows.py
Executable file
@ -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)
|
Loading…
x
Reference in New Issue
Block a user