Airblader / i3

A fork of the i3 window manager with gaps and some other features. :warning: i3-gaps has been merged into i3.
BSD 3-Clause "New" or "Revised" License
5.88k stars 321 forks source link

glitchy focus changing in a 3x3 grid #258

Closed wis closed 5 years ago

wis commented 5 years ago

I'm submitting a…

[x] Bug
[ ] Feature Request
[ ] Documentation Request
[ ] Other (Please describe in detail)

Current Behavior

moves focus to wrong window, seems random to me.

Expected Behavior

not taking overlapping movement into account: move focus to the nearest window on the right/left without moving upwards or downwards. move focus to the nearest upper/lower window without moving to left/right.

Reproduction Instructions

open 9 windows in a 3x3 gird and move focus

Environment

Output of i3 --moreversion 2>&-:

Binary i3 version:  4.16 (2018-11-04) © 2009 Michael Stapelberg and contributors
Running i3 version: 4.16 (2018-11-04) (pid 680)to abort…)
Loaded i3 config: /home/e/.config/i3/config (Last modified: Sun 25 Nov 2018 03:59:08 PM IST, 4293 seconds ago)

The i3 binary you just called: /usr/bin/i3
The i3 binary you are running: i3
# vim: filetype=i3
#  _        _    ____  ____ ____
# | |      / \  |  _ \| __ ) ___|
# | |     / _ \ | |_) |  _ \___ \
# | |___ / ___ \|  _ <| |_) |__) |
# |_____/_/   \_\_| \_\____/____/
#
# File originally by Luke Smith
# Website: http://lukesmith.xyz
# Email: luke@lukesmith.xyz
# YouTube: https://youtube.com/c/LukeSmithxyz
# Github: https://github.com/LukeSmithxyz

# This config file will use environmental variables such as $BROWSER and $TERMINAL.
# You can set these variables in ~/.profile or ~/.bash_profile if you have it as below:
#
# export BROWSER="chromium"
# export TERMINAL="st"

# #---Basic Definitions---# #
# Needed for i3-gaps
for_window [class="^.*"] border pixel 2
gaps inner 5
gaps outer 5
set $term --no-startup-id $TERMINAL
set $mod Mod4
set $stoprec --no-startup-id dmenurecord kill
set $shutdown sudo -A shutdown -h now
set $reboot sudo -A reboot
set $netrefresh --no-startup-id sudo -A systemctl restart NetworkManager
set $hibernate sudo -A systemctl suspend

# #---Dropdown Windows---# #

# First I have a tmux window used for background scripts.
# I'll later bind this to mod+u.
for_window [instance="tmuxdd"] floating enable
for_window [instance="tmuxdd"] resize set 625 400
for_window [instance="tmuxdd"] move scratchpad
for_window [instance="tmuxdd"] border pixel 3
for_window [instance="tmuxdd"] sticky enable

# Then I have a window running R I use for basic arithmetic
# I'll later bind this to mod+a.
for_window [instance="dropdowncalc"] floating enable
for_window [instance="dropdowncalc"] resize set 800 300
for_window [instance="dropdowncalc"] move scratchpad
for_window [instance="dropdowncalc"] border pixel 2
for_window [instance="dropdowncalc"] sticky enable

# #---Starting External Scripts---# #
# Setting the background and colorscheme:
exec --no-startup-id wal -i ~/.config/wall.png >/dev/null
# Starts dunst for notifications:
exec --no-startup-id dunst
# Composite manager:
exec --no-startup-id xcompmgr
# Runs the key remapping scripts
exec --no-startup-id remaps
# Unclutter makes the mouse invisible after a brief period
exec --no-startup-id unclutter
# Run the script to update the mpd i3block on change.
exec --no-startup-id i3mpdupdate
# Remove recording icon if not properly closed on last shutdown.
exec --no-startup-id rm -f ~/.larbs/.recording
# Network manager applet
exec --no-startup-id nm-applet
# mpd startup
exec --no-startup-id mpd

# Set Xresources colors:
set_from_resource $darkblack    color0  #000000
set_from_resource $black    color8  #000000
set_from_resource $darkred  color1  #000000
set_from_resource $red      color9  #000000
set_from_resource $darkgreen    color2  #000000
set_from_resource $green    color10 #000000
set_from_resource $darkyellow   color3  #000000
set_from_resource $yellow   color11 #000000
set_from_resource $darkblue color4  #000000
set_from_resource $blue     color12 #000000
set_from_resource $darkmagenta  color5  #000000
set_from_resource $magenta  color13 #000000
set_from_resource $darkcyan color6  #000000
set_from_resource $cyan     color14 #000000
set_from_resource $darkwhite    color7  #000000
set_from_resource $white    color15 #000000
set $transparent        #00000000

#                       BORDER      BACKGROUND  TEXT        INDICATOR   CHILD_BORDER
client.focused      $red        $red        $magenta    $darkmagenta        $darkblue
client.unfocused    $transparent    $blue       $white      $darkblue       $darkblack
client.focused_inactive $transparent    $blue       $white      $darkblue       $darkblack
client.urgent       $darkred    $darkred    $black      $darkred        $darkred
client.background $black

bar {
    font pango:mono 10
    colors {
            background $darkblack
            statusline $darkwhite
            separator $cyan
            focused_workspace  $blue $darkblue $darkblack
                active_workspace   $blue $blue $darkwhite
                inactive_workspace $darkblack $darkblack $white
                urgent_workspace   $darkblack $darkblack $white
        }
    status_command i3blocks
    position top
    mode dock
    modifier None
}

# #---Basic Bindings---# #
bindsym $mod+Return         exec $term
bindsym $mod+Shift+Return   exec --no-startup-id samedir

bindsym $mod+Shift+space    floating toggle
bindsym $mod+space      focus mode_toggle

bindsym $mod+Escape     workspace prev
bindsym $mod+Shift+Escape   exec --no-startup-id prompt "Exit i3?" "i3-msg exit"

# bindsym $mod+BackSpace
bindsym $mod+Shift+BackSpace    exec --no-startup-id prompt "Reboot computer?" "$reboot"

bindsym $mod+grave      exec --no-startup-id dmenuunicode
##bindsym $mod+asciitilde

#STOP/HIDE EVERYTHING:
bindsym $mod+Shift+Delete   exec --no-startup-id lmc truemute ; exec $truepause ; exec --no-startup-id pauseallmpv; workspace 0; exec $term -e htop ; exec $term -e ranger

# Show selection:
bindsym $mod+Shift+Insert   exec --no-startup-id showclip

# #---Letter Key Bindings---# #
bindsym $mod+q          [con_id="__focused__" instance="^(?!dropdowncalc|tmuxdd).*$"] kill
bindsym $mod+Shift+q        [con_id="__focused__" instance="^(?!dropdowncalc|tmuxdd).*$"] kill

#bindsym $mod+k         exec $term -e nmtui

#bindsym $mod+e         exec $term -e neomutt
#bindsym $mod+Shift+e       exec --no-startup-id tutorialvids

bindsym $mod+r          exec $term -e ranger
bindsym $mod+Shift+r        exec $term -e sudo ranger /

bindsym $mod+t          exec --no-startup-id mmimic
#split toggle
bindsym $mod+Shift+t        gaps inner current set 15; gaps outer current set 15

bindsym $mod+c          exec $term -e calcurse
bindsym $mod+Shift+c        exec --no-startup-id camtoggle

bindsym $mod+Shift+u            exec --no-startup-id ddspawn tmuxdd

bindsym $mod+Shift+p            exec $term -e htop
bindsym $mod+k          sticky toggle

bindsym $mod+p          exec --no-startup-id lmc toggle
#bindsym $mod+Shift+p       exec --no-startup-id lmc pause

bindsym $mod+a          exec --no-startup-id ddspawn dropdowncalc -f mono:pixelsize=24
bindsym $mod+Shift+a        exec $term -e pulsemixer

bindsym $mod+s          gaps inner current plus 5
bindsym $mod+Shift+s        gaps inner current minus 5

bindsym $mod+d          exec --no-startup-id dmenu_run
bindsym $mod+Shift+d        gaps inner current set 0; gaps outer current set 0

set $freeze Distraction-free mode (mod+shift+esc to exit)
mode "$freeze" { bindsym $mod+Shift+Escape mode "default"
}

bindsym $mod+f          fullscreen toggle
bindsym $mod+Shift+f        mode "$freeze"

bindsym $mod+w          workspace prev

bindsym $mod+n          focus left
bindsym $mod+Shift+n        move left

bindsym $mod+e          focus down
bindsym $mod+Shift+e        move down

bindsym $mod+i          focus up
bindsym $mod+Shift+i        move up

bindsym $mod+o          focus right
bindsym $mod+Shift+o        move right

bindsym $mod+l      exec --no-startup-id i3resize left
bindsym $mod+u      exec --no-startup-id i3resize down
bindsym $mod+y      exec --no-startup-id i3resize up
bindsym $mod+j      exec --no-startup-id i3resize right

bindsym $mod+Shift+l        exec --no-startup-id $BROWSER
bindsym $mod+Shift+y            exec $term -e newspod

bindsym $mod+z          gaps outer current plus 5
bindsym $mod+Shift+z        gaps outer current minus 5

bindsym $mod+x          exec --no-startup-id lockscreen
bindsym $mod+Shift+x        exec --no-startup-id prompt "Shutdown computer?" "$shutdown"

#bindsym $mod+c         exec --no-startup-id freealf
bindsym $mod+g      exec --no-startup-id gimp; workspace $ws5

bindsym $mod+v          exec $term -e ncmpcpp -s visualizer
bindsym $mod+Shift+v        exec --no-startup-id projectM-pulseaudio

bindsym $mod+b          bar mode toggle
bindsym $mod+Shift+b        floating toggle; sticky toggle; exec --no-startup-id bottomleft

##bindsym $mod+Shift+n

bindsym $mod+m          exec --no-startup-id $term -e ncmpcpp
bindsym $mod+Shift+m        exec --no-startup-id lmc mute

# #---Workspace Bindings---# #
bindsym $mod+Home       workspace $ws1
bindsym $mod+Shift+Home     move container to workspace $ws1
bindsym $mod+End        workspace $ws10
bindsym $mod+Shift+End      move container to workspace $ws10
bindsym $mod+Prior      workspace prev
bindsym $mod+Shift+Prior    move container to workspace prev
bindsym $mod+Next       workspace next
bindsym $mod+Shift+Next     move container to workspace next
bindsym $mod+Tab        workspace back_and_forth
bindsym $mod+XF86Back       workspace prev
bindsym $mod+Shift+XF86Back move container to workspace prev
bindsym $mod+XF86Forward    workspace next
bindsym $mod+Shift+XF86Forward  move container to workspace next
bindsym $mod+semicolon      workspace next
bindsym $mod+apostrophe     split horizontal ;; exec $term
bindsym $mod+slash      split vertical ;; exec $term
bindsym $mod+Shift+slash    kill
bindsym $mod+backslash      workspace back_and_forth

set $ws1 "1"
set $ws2 "2"
set $ws3 "3"
set $ws4 "4"
set $ws5 "5"
set $ws6 "6"
set $ws7 "7"
set $ws8 "8"
set $ws9 "9"
set $ws10 "10"

# switch to workspace
bindsym $mod+1      workspace $ws1
bindsym $mod+2      workspace $ws2
bindsym $mod+3      workspace $ws3
bindsym $mod+4      workspace $ws4
bindsym $mod+5      workspace $ws5
bindsym $mod+6      workspace $ws6
bindsym $mod+7      workspace $ws7
bindsym $mod+8      workspace $ws8
bindsym $mod+9      workspace $ws9
bindsym $mod+0      workspace $ws10

# move focused container to workspace
bindsym $mod+Shift+1    move container to workspace $ws1
bindsym $mod+Shift+2    move container to workspace $ws2
bindsym $mod+Shift+3    move container to workspace $ws3
bindsym $mod+Shift+4    move container to workspace $ws4
bindsym $mod+Shift+5    move container to workspace $ws5
bindsym $mod+Shift+6    move container to workspace $ws6
bindsym $mod+Shift+7    move container to workspace $ws7
bindsym $mod+Shift+8    move container to workspace $ws8
bindsym $mod+Shift+9    move container to workspace $ws9
bindsym $mod+Shift+0    move container to workspace $ws10

for_window [class="Pinentry"] sticky enable
for_window [class="sent"] border pixel 0px
for_window [class="Blender"] move to workspace $ws6
for_window [class="marble"] move to workspace $ws7
for_window [title="GIMP Startup"] move workspace $ws5
for_window [class="Gimp"] move workspace $ws5
for_window [window_role="GtkFileChooserDialog"] resize shrink height 10 px
for_window [title="Default - Wine desktop"] floating enable

# Bindings to make the webcam float and stick.
for_window [title="mpvfloat"] floating enable
for_window [title="mpvfloat"] sticky enable
for_window [title="mpvfloat"] border pixel 0
no_focus [title="mpvfloat"]

# #---Function Buttons---# #
bindsym $mod+F1     exec --no-startup-id zathura ~/.config/i3/i3_guide.pdf
bindsym $mod+F2     restart
bindsym $mod+F3     exec --no-startup-id displayselect
bindsym $mod+F4     exec --no-startup-id prompt "Hibernate computer?" "$hibernate"
bindsym $mod+F5     exec --no-startup-id $netrefresh
bindsym $mod+F6     exec --no-startup-id $term -e transmission-remote-cli
bindsym $mod+F7     exec --no-startup-id td-toggle
bindsym $mod+F8     exec --no-startup-id ~/.config/mutt/etc/mailsync.sh
bindsym $mod+F9     exec --no-startup-id dmenumount
bindsym $mod+F10    exec --no-startup-id dmenuumount
bindsym $mod+F11    exec --no-startup-id ducksearch
bindsym $mod+F12    exec $term -e sudo -A wifi-menu

# #---Arrow Keys---# #
bindsym $mod+Left       focus left
bindsym $mod+Down       focus down
bindsym $mod+Up         focus up
bindsym $mod+Right      focus right
bindsym $mod+Shift+Left     move left
bindsym $mod+Shift+Down     move down
bindsym $mod+Shift+Up       move up
bindsym $mod+Shift+Right    move right

# #---Media Keys---# #

# Volume keys
bindsym $mod+plus       exec --no-startup-id lmc up 5
bindsym $mod+Shift+plus     exec --no-startup-id lmc up 15
bindsym $mod+minus      exec --no-startup-id lmc down 5
bindsym $mod+Shift+minus    exec --no-startup-id lmc down 15
bindsym $mod+less       exec --no-startup-id lmc prev
bindsym $mod+Shift+less     exec --no-startup-id lmc replay
bindsym $mod+greater        exec --no-startup-id lmc next
bindsym $mod+Shift+greater  exec --no-startup-id lmc next

# For advancing forward/backward in an mpd song
bindsym $mod+bracketleft    exec --no-startup-id lmc back 10
bindsym $mod+Shift+bracketleft  exec --no-startup-id lmc back 120
bindsym $mod+bracketright   exec --no-startup-id lmc forward 10
bindsym $mod+Shift+bracketright exec --no-startup-id lmc forward 120

# For screenshots and recording
bindsym Print           exec --no-startup-id scrot
bindsym Shift+Print         exec --no-startup-id scrot -u
bindsym $mod+Print      exec --no-startup-id dmenurecord
bindsym $mod+Scroll_Lock    exec --no-startup-id "killall screenkey || screenkey"
bindsym $mod+Delete     exec $stoprec
bindsym XF86Launch1     exec $stoprec & xset dpms force off

# #---Extra XF86 Keys---# #
# These are the extra media keys that some keyboards have.
bindsym XF86AudioMute       exec --no-startup-id lmc mute
bindsym XF86AudioLowerVolume    exec --no-startup-id lmc down 5
bindsym Shift+XF86AudioLowerVolume  exec --no-startup-id lmc down 10
bindsym Control+XF86AudioLowerVolume    exec --no-startup-id lmc down 1
bindsym XF86AudioRaiseVolume    exec --no-startup-id lmc up 5
bindsym Shift+XF86AudioRaiseVolume  exec --no-startup-id lmc up 10
bindsym Control+XF86AudioRaiseVolume    exec --no-startup-id lmc up 1
bindsym XF86PowerOff        exec --no-startup-id prompt "Shutdown computer?" "$shutdown"
##bindsym XF86Copy      exec
##bindsym XF86Open      exec
##bindsym XF86Paste     exec
##bindsym XF86Cut       exec
##bindsym XF86MenuKB        exec
bindsym XF86Calculator      exec $term -e R -q --no-save
##bindsym XF86Sleep     This binding is typically mapped by systemd automatically.
##bindsym XF86WakeUp        exec
bindsym XF86Explorer        exec $term -e ranger
##bindsym XF86Send      exec
##bindsym XF86Xfer      exec
bindsym XF86WWW         exec --no-startup-id $BROWSER
##bindsym XF86DOS       exec
bindsym XF86ScreenSaver     exec exec --no-startup-id lockscreen
##bindsym XF86RotateWindows exec
##bindsym XF86TaskPane      exec
##bindsym XF86Favorites     exec
bindsym XF86MyComputer      exec $term -e ranger
##bindsym XF86Back      exec
##bindsym XF86Forward       exec
bindsym XF86Eject       exec --no-startup-id dmenuumount
bindsym XF86AudioNext       exec --no-startup-id lmc next
bindsym XF86AudioPlay       exec --no-startup-id lmc toggle
bindsym XF86AudioPrev       exec --no-startup-id lmc prev
bindsym XF86AudioStop       exec --no-startup-id lmc toggle
##bindsym XF86AudioRecord
bindsym XF86AudioRewind     exec --no-startup-id lmc back 10
bindsym XF86AudioForward    exec --no-startup-id lmc forward 10
##bindsym XF86Phone     exec
##bindsym XF86Tools     exec
bindsym XF86HomePage        exec $BROWSER https://lukesmith.xyz
bindsym XF86Reload      restart
##bindsym XF86ScrollUp      exec
##bindsym XF86ScrollDown        exec
##bindsym XF86New       exec
##bindsym XF86LaunchA       exec
##bindsym XF86LaunchB       exec
##bindsym XF86Launch2       exec
##bindsym XF86Launch3       exec
##bindsym XF86Launch4       exec
##bindsym XF86Launch5       exec
##bindsym XF86Launch6       exec
##bindsym XF86Launch7       exec
##bindsym XF86Launch8       exec
##bindsym XF86Launch9       exec
#bindsym XF86AudioMicMute   exec $micmute
bindsym XF86TouchpadToggle  exec --no-startup-id toggletouchpad
bindsym XF86TouchpadOn      exec --no-startup-id synclient TouchpadOff=0
bindsym XF86TouchpadOff     exec --no-startup-id synclient TouchpadOff=1
bindsym XF86Close       kill
bindsym XF86WebCam      exec --no-startup-id camtoggle
bindsym XF86Mail        exec $term -e neomutt
bindsym XF86Messenger       exec $term -e weechat
bindsym XF86Search      exec $BROWSER https://duckduckgo.com
##bindsym XF86Go            exec
##bindsym XF86Finance       exec
##bindsym XF86Game      exec
bindsym XF86Shop        exec $BROWSER https://ebay.com
bindsym XF86MonBrightnessDown   exec --no-startup-id xbacklight -dec 15
bindsym XF86MonBrightnessUp exec --no-startup-id xbacklight -inc 15
bindsym XF86AudioMedia      exec --no-startup-id $term -e ncmpcpp
bindsym XF86Display     exec --no-startup-id arandr
#bindsym XF86KbdLightOnOff  exec
#bindsym XF86KbdBrightnessDown  exec
#bindsym XF86KbdBrightnessUp    exec
##bindsym XF86Reply     exec
##bindsym XF86MailForward   exec
##bindsym XF86Save      exec
bindsym XF86Documents       exec $term -e ranger ~/Documents
##bindsym XF86Battery       exec
##bindsym XF86Bluetooth     exec
bindsym XF86WLAN        exec $netrefresh

vid.zip

- Linux Distribution & Version:   Linux version 4.19.2-arch1-1-ARCH (builduser@heftig-16038) (gcc version 8.2.1 20180831 (GCC)) #1 SMP PREEMPT Tue Nov 13 21:16:19 UTC 2018
- Are you using a compositor (e.g., xcompmgr or compton): xcompmgr v1.1.7
Airblader commented 5 years ago

Thanks for opening this issue. Usually I'd close this since it doesn't affect i3-gaps specifically, but i3 in general and should thus be reported upstream.

However, this is actually the expected behavior. The layout in your video is H[V[A B C] V[D E F]] and thus the focus behavior is exactly as intended by going to the last focused window within the parent when switching between the containers. Please see the userguide for a detailed explanation of the tree hierarchy in i3, it helps understanding this when you realize that the layout isn't a grid, but a tree.

if you want the focus behavior to be different, you'll need to implement your own custom logic of how to find the container you want to focus. Thanks for understanding!

orestisfl commented 5 years ago

Also see: https://i3wm.org/docs/userguide.html#_tree

The layout actually seems to be H[V[1 V[2 3]] V[4 V[5 6]] V[7 V[8 9]]]

Airblader commented 5 years ago

(I was just simplifying the layout a bit :-) )

orestisfl commented 5 years ago

Just mentioning it because it might be important to understand how focus moves between containers

wis commented 5 years ago

these are the nicest RTFM replies 😄, I should admit that the userguide seemed intimidatingly huge. I tried using mod v and h, I had mod+v binded to something else, h is not though and it's not working.