From c6238648a41b70b3c1b31aba0d24455518367d5c Mon Sep 17 00:00:00 2001 From: nojhan Date: Fri, 13 Dec 2024 14:38:31 +0100 Subject: [PATCH] feat(i3): shortcut to throw windows to workspaces + balance windows --- .config/i3/config | 16 +++++++++++ .config/i3/tabs_in_split.py | 57 +++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100755 .config/i3/tabs_in_split.py diff --git a/.config/i3/config b/.config/i3/config index f041882..3267468 100644 --- a/.config/i3/config +++ b/.config/i3/config @@ -168,6 +168,18 @@ bindsym $mod+Shift+8 move container to workspace number $ws8 , workspace number bindsym $mod+Shift+9 move container to workspace number $ws9 , workspace number $ws9 bindsym $mod+Shift+0 move container to workspace number $ws10 , workspace number $ws10 +# move focused container to workspace +bindsym $mod+Ctrl+Shift+1 move container to workspace number $ws1 +bindsym $mod+Ctrl+Shift+2 move container to workspace number $ws2 +bindsym $mod+Ctrl+Shift+3 move container to workspace number $ws3 +bindsym $mod+Ctrl+Shift+4 move container to workspace number $ws4 +bindsym $mod+Ctrl+Shift+5 move container to workspace number $ws5 +bindsym $mod+Ctrl+Shift+6 move container to workspace number $ws6 +bindsym $mod+Ctrl+Shift+7 move container to workspace number $ws7 +bindsym $mod+Ctrl+Shift+8 move container to workspace number $ws8 +bindsym $mod+Ctrl+Shift+9 move container to workspace number $ws9 +bindsym $mod+Ctrl+Shift+0 move container to workspace number $ws10 + # reload the configuration file bindsym $mod+Shift+C reload # restart i3 inplace (preserves your layout/session, can be used to upgrade i3) @@ -259,6 +271,8 @@ assign [class="Terminator" window_role="boinc"] $ws1 # Video as background # exec --no-startup-id "mpv --wid=0 --loop --no-terminal --speed=0.5 --video-align-x=0.5 --no-audio --video-sync=display-resample --interpolation --tscale=oversample ~/Vidéos/Blue_Turn_notitle.mp4" +# Wallpaper as background +exec --no-startup-id feh --bg-scale /home/nojhan/Images/Wood.png # Sound controller exec pavucontrol @@ -274,3 +288,5 @@ exec "terminator --profile 'small font' --role btop --command btop" for_window [window_role="scratchpad"] move window to scratchpad exec terminator --role scratchpad# + +bindsym $mod+m exec "i3_balance_workspace" diff --git a/.config/i3/tabs_in_split.py b/.config/i3/tabs_in_split.py new file mode 100755 index 0000000..2fb2e5c --- /dev/null +++ b/.config/i3/tabs_in_split.py @@ -0,0 +1,57 @@ +#/usr/bin/env python3 +import sys + +# From https://github.com/i3/i3/issues/4207#issuecomment-792874108 +# Manage windows as follows: +# - the workspace occupies the full screen, a single container in tabbed mode holding all the current windows +# - one can choose to split that area in half, horizontally or vertically, this creates two new tabbed containers, each occupying half of the screen; one gets the currently-focused window, IIRC, and the other gets the rest of the windows +# - any new window created in any of these new containers ends up as a new tab of one of these containers; new windows don't change the screen layout +# - this process can be repeated on each of these new halves if one so wishes +# In this way, in ion3/notion, the window manager assists you in creating the layout you need, while giving you the possibility of keeping it independent of how many windows you have in a workspace. + +# i3ipc requires installation: +sudo apt install python3-i3ipc +# pip3 install i3ipc + +from i3ipc import Connection + + +def tab_and_move_containers(con1, con2, other_cons): + con1.command('split horizontal') # force creation of a new parent container for this one + con1.command('layout tabbed') + con2.command('split horizontal') # force creation of a new parent container for this one + con2.command('layout tabbed') + + con2.command('mark target') + [con.command('move window to mark target') for con in other_cons] + con2.command('unmark target') + + +def main(): + direction = sys.argv[1] + i3 = Connection() + + con1 = i3.get_tree().find_focused() + cons = con1.parent.descendants() + if len(cons) < 2: + return + + other_cons = [con for con in cons if con.id != con1.id] + con2 = other_cons.pop() + + # "bisect" the area of interest (split it horiz/vert) + if direction == 'h': + i3.command("layout splith") + else: + i3.command("layout splitv") + + # relocate containers so there are only two of them visible; + # con1 will get a tabbed container all to itself, + # con2 and other_cons will go in the other tabbed container + # tab_and_move_containers(con1, con2, other_cons) + tab_and_move_containers(con2, con1, other_cons) + + +if __name__ == '__main__': + main() +