moving all dots

This commit is contained in:
Barak Michener 2024-05-18 19:08:15 -07:00
parent 6fcf9ba919
commit d9b6fdfc1b
349 changed files with 34598 additions and 34727 deletions

240
dot_i3/config Normal file
View file

@ -0,0 +1,240 @@
# This file has been auto-generated by i4-config-wizard(1).
# It will not be overwritten, so edit it as you like.
#jk
# Should you change your keyboard layout some time, delete
# this file and re-run i3-config-wizard(1).
#
# i3 config file (v4)
#
# Please see http://i3wm.org/docs/userguide.html for a complete reference!
set $mod Mod1
set $win Mod4
# Font for window titles. Will also be used by the bar unless a different font
# is used in the bar {} block below.
# This font is widely installed, provides lots of unicode glyphs, right-to-left
# text rendering and scalability on retina/hidpi displays (thanks to pango).
font pango:DejaVu Sans Mono 13
# Before i3 v4.8, we used to recommend this one as the default:
# font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
# The font above is very space-efficient, that is, it looks good, sharp and
# clear in small sizes. However, its unicode glyph coverage is limited, the old
# X core fonts rendering does not support right-to-left and this being a bitmap
# font, it doesnt scale on retina/hidpi displays.
#
new_window pixel 2
# class border backgr. text indicator
#client.focused #4c7899 #285577 #ffffff #2e9ef4
client.focused #00bfff #00bfff #ffffff #2e9ef4
client.focused_inactive #333333 #5f676a #ffffff #484e50
client.unfocused #333333 #222222 #888888 #292d2e
client.urgent #2f343a #900000 #ffffff #900000
#client.placeholder #000000 #0c0c0c #ffffff #000000
#force_focus_wrapping yes
# Use Mouse+$mod to drag floating windows to their wanted position
floating_modifier $mod
#gaps inner 10
# start a terminal
bindsym $mod+Shift+Return exec alacritty
#bindsym Control+space exec rofi -show run -fuzzy -terminal run_terminal
#bindsym Control+space exec rofi -combi-modi window,run,ssh -modi combi -show combi
bindsym Control+space exec "rofi -combi-modi run,drun -modi combi -show combi -terminal run_terminal -fuzzy"
# kill focused window
bindsym $mod+Shift+c kill
# start dmenu (a program launcher)
#bindsym $mod+d exec dmenu_run
bindsym $mod+d exec i3-dmenu-desktop --dmenu='rofi -dmenu'
bindsym $mod+F12 exec xscreensaver-command -lock
bindsym $mod+Shift+y exec xinput-toggle -r yubikey -n -e -t 10
bindsym $mod+Shift+f exec --no-startup-id xmodmap ~/.Xmodmap
bindsym $mod+Shift+s exec xfce4-screenshooter
# There also is the (new) i3-dmenu-desktop which only displays applications
# shipping a .desktop file. It is a wrapper around dmenu, so you need that
# installed.
# bindsym $mod+d exec --no-startup-id i3-dmenu-desktop
# change focus
bindsym $mod+h focus left
bindsym $mod+j focus down
bindsym $mod+k focus up
bindsym $mod+l focus right
#bindsym $mod+j exec --no-startup-id ~/.i3/i3-focus-next
#bindsym $mod+k exec --no-startup-id ~/.i3/i3-focus-next --reverse
bindsym $mod+y move workspace to output left
bindsym $mod+Return exec --no-startup-id ~/.i3/i3-barak-tool.py promote
# alternatively, you can use the cursor keys:
#bindsym $mod+Left focus left
#bindsym $mod+Down focus down
#bindsym $mod+Up focus up
#bindsym $mod+Right focus right
# move focused window
bindsym $mod+Shift+h move left
bindsym $mod+Shift+j move down
bindsym $mod+Shift+k move up
bindsym $mod+Shift+l move right
# alternatively, you can use the cursor keys:
#bindsym $mod+Shift+Left move left
#bindsym $mod+Shift+Down move down
#bindsym $mod+Shift+Up move up
#bindsym $mod+Shift+Right move right
# split in vim-horizontal (vertical) orientation
bindsym $mod+i split v
# split in vim-vertical (horizontal) orientation
bindsym $mod+v split h
# enter fullscreen mode for the focused container
bindsym $mod+f fullscreen
# change container layout (stacked, tabbed, toggle split)
bindsym $mod+s layout stacking
bindsym $mod+w layout tabbed
bindsym $mod+e layout toggle split
# toggle tiling / floating
bindsym $mod+Shift+space floating toggle
# change focus between tiling / floating windows
bindsym $mod+space focus mode_toggle
# focus the parent container
bindsym $mod+a focus parent
# focus the child container
bindsym $mod+z focus child
# switch to workspace
bindsym $mod+1 workspace 1
bindsym $mod+2 workspace 2
bindsym $mod+3 workspace 3
bindsym $mod+4 workspace 4
bindsym $mod+5 workspace 5
bindsym $mod+6 workspace 6
bindsym $mod+7 workspace 7
bindsym $mod+8 workspace 8
bindsym $mod+9 workspace 9
bindsym $mod+0 workspace 10
bindsym $mod+Tab workspace back_and_forth
# move focused container to workspace
bindsym $mod+Shift+1 move container to workspace 1
bindsym $mod+Shift+2 move container to workspace 2
bindsym $mod+Shift+3 move container to workspace 3
bindsym $mod+Shift+4 move container to workspace 4
bindsym $mod+Shift+5 move container to workspace 5
bindsym $mod+Shift+6 move container to workspace 6
bindsym $mod+Shift+7 move container to workspace 7
bindsym $mod+Shift+8 move container to workspace 8
bindsym $mod+Shift+9 move container to workspace 9
bindsym $mod+Shift+0 move container to workspace 10
# reload the configuration file
bindsym $mod+Shift+t reload
# restart i3 inplace (preserves your layout/session, can be used to upgrade i3)
bindsym $mod+Shift+r restart
# exit i3 (logs you out of your X session)
bindsym $mod+Shift+q exec "i3-nagbar -t warning -m 'You pressed the exit shortcut. Do you really want to exit i3? This will end your X session.' -b 'Yes, exit i3' 'i3-msg exit'"
bindsym $mod+u resize set width 62ppt
# resize window (you can also use the mouse for that)
mode "resize" {
# These bindings trigger as soon as you enter the resize mode
# Pressing left will shrink the windows width.
# Pressing right will grow the windows width.
# Pressing up will shrink the windows height.
# Pressing down will grow the windows height.
bindsym h resize shrink width 5 px or 5 ppt
bindsym j resize grow height 5 px or 5 ppt
bindsym k resize shrink height 5 px or 5 ppt
bindsym l resize grow width 5 px or 5 ppt
# same bindings, but for the arrow keys
#bindsym Left resize shrink width 10 px or 10 ppt
#bindsym Down resize grow height 10 px or 10 ppt
#bindsym Up resize shrink height 10 px or 10 ppt
#bindsym Right resize grow width 10 px or 10 ppt
# back to normal: Enter or Escape
bindsym Return mode "default"
bindsym Escape mode "default"
bindsym $mod+r mode "default"
}
bindsym $mod+r mode "resize"
mode "moveworkspace" {
# These bindings trigger as soon as you enter the resize mode
# Pressing left will shrink the windows width.
# Pressing right will grow the windows width.
# Pressing up will shrink the windows height.
# Pressing down will grow the windows height.
bindsym h move workspace to output left
bindsym j move workspace to output down
bindsym k move workspace to output up
bindsym l move workspace to output right
# same bindings, but for the arrow keys
#bindsym Left resize shrink width 10 px or 10 ppt
#bindsym Down resize grow height 10 px or 10 ppt
#bindsym Up resize shrink height 10 px or 10 ppt
#bindsym Right resize grow width 10 px or 10 ppt
# back to normal: Enter or Escape
bindsym Return mode "default"
bindsym Escape mode "default"
}
bindsym $mod+t mode "moveworkspace"
mode "goremote" {
bindsym g exec "remmina -c ~/.local/share/remmina/1523485448993.remmina"; mode "default"
bindsym t exec "run_terminal -x ssh -p 2222 barak@rack.0b100.net"; mode "default"
bindsym p exec "run_terminal -x ssh -p 2222 barak@barakmich.com"; mode "default"
bindsym Return mode "default"
bindsym Escape mode "default"
}
bindsym $mod+Shift+Control+r mode "goremote"
# Media controls
bindsym $win+Shift+k exec "playerctl play-pause"
bindsym $win+Shift+h exec "playerctl previous"
bindsym $win+Shift+l exec "playerctl next"
# Spotify doesn't understand volume controls?
#bindsym $win+Shift+j exec "playerctl volume 0.1-"
#bindsym $win+Shift+k exec "playerctl volume 0.1+"
# Start i3bar to display a workspace bar (plus the system information i3status
# finds out, if available)
#bar {
## status_command i3status
#status_command i3-wrapper
#position top
#tray_output primary
#}
#exec --no-startup-id xfce4-panel --disable-wm-check
#exec polybar HDMI1
#exec --no-startup-id nitrogen --restore
#exec --no-startup-id picom -b --config ~/.compton.conf

151
dot_i3/i3-barak-tool.py Executable file
View file

@ -0,0 +1,151 @@
#!/usr/bin/env python3
import json
import subprocess
import socket
import struct
import sys
_struct_header = '=6sII'
RUN_COMMAND = 0
GET_WORKSPACES = 1
SUBSCRIBE = 4
GET_OUTPUTS=3
GET_TREE = 4
def get_i3_socketpath():
socketpath = subprocess.check_output(["i3", "--get-socketpath"])
return socketpath.decode().rstrip()
def format_i3_command(kind: int, cmd: str):
b = cmd.encode()
return b"i3-ipc" + struct.pack("=II", len(b), kind) + b
def _ipc_recv(sock):
data = sock.recv(14)
if len(data) == 0:
raise EOFError('got EOF from ipc socket')
_, msg_length, msg_type = _unpack_header(data)
msg_size = 6 + msg_length
while len(data) < msg_size:
data += sock.recv(msg_length)
payload = _unpack(data)
return payload, msg_type
def _unpack(data):
_, msg_length, _ = _unpack_header(data)
size = struct.calcsize(_struct_header)
msg_size = size + msg_length
payload = data[size:msg_size]
return payload.decode('utf-8', 'replace')
def _unpack_header(data: bytes):
return struct.unpack(_struct_header, data[:struct.calcsize(_struct_header)])
def open_i3_socket():
client = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
client.connect(get_i3_socketpath())
return client
def send_command(client, kind, data):
client.sendall(format_i3_command(kind, data))
result, _ = _ipc_recv(client)
return json.loads(result)
class TreeNode:
def __init__(self, json):
self.id = None
self.rect = None
self.focused = False
self.name = ""
for k, v in json.items():
if k != "nodes":
self.__setattr__(k, v)
self.parent = None
self.nodes = list(map(TreeNode, json["nodes"]))
for n in self.nodes:
n.parent = self
def find(self, where=None):
if where is None:
where = lambda _: True
if where(self):
yield self
for n in self.nodes:
yield from n.find(where)
def __repr__(self) -> str:
return "TreeNode(%d, %s, focused=%s, rect=%s)" % (self.id, self.name, self.focused, str(self.rect))
def find_parent(self, where=None):
if self.parent is None:
return None
if where is None or where(self.parent):
return self.parent
return self.parent.find_parent(where)
def leaves(self):
if len(self.nodes) == 0:
yield self
else:
for n in self.nodes:
yield from n.leaves()
def find_biggest_window(tree: TreeNode):
max_leaf = None
max_area = 0
max_x = -1
for leaf in tree.leaves():
rect = leaf.rect
area = rect["width"] * rect["height"]
if area > max_area or (area == max_area and max_x > rect["x"]):
max_area = area
max_leaf = leaf
max_x = rect["x"]
return max_leaf
def current_workspace(tree):
focused = list(tree.find(where=lambda n: n.focused is True))
if len(focused) == 0:
print("not found")
sys.exit(1)
focused = focused[0]
ws = focused.find_parent(lambda n: n.type == "workspace")
return ws
def promote(client):
json = send_command(client, GET_TREE, "")
tree = TreeNode(json)
ws = current_workspace(tree)
master = find_biggest_window(ws)
send_command(client, RUN_COMMAND, "swap container with con_id %s" % master.id)
def main():
if len(sys.argv) < 2:
print("needs an argument")
return
command = sys.argv[1]
client = open_i3_socket()
if command == "promote":
promote(client)
client.close()
if __name__ == "__main__":
main()

196
dot_i3/i3-focus-next Executable file
View file

@ -0,0 +1,196 @@
#!/usr/bin/env perl
#
# needs package perl-json
#
use IO::Socket::UNIX;
use JSON;
use Encode;
use Getopt::Long;
use constant MAGIC_STRING => 'i3-ipc';
use constant TYPE_COMMAND => 0;
use constant TYPE_GET_WORKSPACES => 1;
use constant TYPE_GET_TREE => 4;
#
# ipc functions
#
sub message {
my ($type, $content) = @_;
my $payload = '';
if ($content) {
$payload = encode_utf8($content);
}
return(MAGIC_STRING . pack('LL', length($payload), $type) . $payload);
}
sub ipc_request {
my ($sock, $type, $content) = @_;
# send request
$sock->write(message($type, $content));
# read response header
my $header = '';
$sock->read($header, length(MAGIC_STRING) + 4 + 4);
# get payload length
my ($len, $type) = unpack('LL', substr($header, length(MAGIC_STRING)));
# read payload
my $payload = '';
$sock->read($payload, $len);
# return decoded json
return decode_json $payload;
}
#
# tree functions
#
sub get_node_by_name {
my ($ref, $name) = @_;
# search for a direct child node by name
foreach my $node (@{${${ref}}{'nodes'}}) {
if (${${node}}{'name'} eq $name) {
return $node;
}
}
}
sub pop_window_array {
my ($ref, $arr) = @_;
my @node_types = qw(nodes floating_nodes);
# iterate through all child nodes
foreach my $node_type (@node_types) {
foreach my $node (@{${${ref}}{$node_type}}) {
# if child node is not a window
if (${${node}}{'window'} eq undef) {
# go one level down
pop_window_array($node, \@{$arr});
} else {
# add window id to array
push(@{$arr}, ${${node}}{'id'});
}
}
}
}
sub get_focused_node {
my $ref = shift;
my $ret = '';
my @node_types = qw(nodes floating_nodes);
# iterate through all child nodes
foreach my $node_type (@node_types) {
foreach my $node (@{${${ref}}{$node_type}}) {
# if child node is not a window
if (${${node}}{'window'} eq undef) {
# go one level down
$ret = get_focused_node($node);
if ($ret != '') {
return $ret;
}
} else {
# return focused window id
if (${${node}}{'focused'}) {
return ${${node}}{'id'};
}
}
}
}
return '';
}
#
# main
#
my $reverse;
GetOptions("reverse" => \$reverse);
# get socket path
chomp(my $path = qx(i3 --get-socketpath));
# open connection
my $sock = IO::Socket::UNIX->new(Peer => $path);
# get current workspaces
my $response = '';
$response = ipc_request($sock, TYPE_GET_WORKSPACES);
# get focused output and workspace
my $i3output = '';
my $i3workspace = '';
foreach my $node (@{$response}) {
if (${$node}{'focused'}) {
$i3output = ${$node}{output};
$i3workspace = ${$node}{num};
}
}
# get layout tree
my $response = '';
$response = ipc_request($sock, TYPE_GET_TREE);
my @windows, $focused, $prev, $next;
if (${$response}{'name'} eq 'root') {
my $output = get_node_by_name($response, $i3output);
my $content = get_node_by_name($output, 'content');
my $workspace = get_node_by_name($content, $i3workspace);
# populate window array
pop_window_array($workspace, \@windows);
# get focused window
$focused = get_focused_node($workspace);
# find window key for focused window
my $focused_key;
while (my ($key, $val) = each @windows) {
if ($val eq $focused) {
# get previous window
if ($key == 0) {
$prev = $windows[$#windows];
} else {
$prev = $windows[$key-1];
}
# get next window
if ($key == $#windows) {
$next = $windows[0];
} else {
$next = $windows[$key+1];
}
}
}
}
#print $prev . "\n" . $focused . "\n" . $next . "\n";
my $response = '';
if ($reverse) {
# set focus to previous window
$response = ipc_request($sock, TYPE_COMMAND, '[con_id="' . $prev . '"] focus');
} else {
# set focus to next window
$response = ipc_request($sock, TYPE_COMMAND, '[con_id="' . $next . '"] focus');
}
close($sock);
# exit with ipc command status
if (${$response}[0]{'success'}) {
exit(0);
} else {
exit(1);
}