moving all dots
This commit is contained in:
parent
6fcf9ba919
commit
d9b6fdfc1b
349 changed files with 34598 additions and 34727 deletions
240
dot_i3/config
Normal file
240
dot_i3/config
Normal 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 doesn’t 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 window’s width.
|
||||
# Pressing right will grow the window’s width.
|
||||
# Pressing up will shrink the window’s height.
|
||||
# Pressing down will grow the window’s 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 window’s width.
|
||||
# Pressing right will grow the window’s width.
|
||||
# Pressing up will shrink the window’s height.
|
||||
# Pressing down will grow the window’s 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
151
dot_i3/i3-barak-tool.py
Executable 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
196
dot_i3/i3-focus-next
Executable 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);
|
||||
}
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue