i3窗口平铺管理器:创建新工作区后终端未在目标工作区打开的问题解决咨询
解决i3中终端打开在错误工作区的问题
我之前也碰到过一模一样的情况——明明先切换了工作区,终端却还是跑到原来的工作区去。问题的核心在于:直接用bash启动gnome-terminal时,程序会继承当前shell的工作区上下文,而i3的工作区切换和终端启动之间的微小时间差,导致终端启动时目标工作区还没完全成为当前激活的状态(或者说终端没感知到工作区切换)。
下面是两种可靠的解决方法,优先推荐第一种:
方法一:用i3的exec命令启动终端(最稳定)
i3的exec命令会让窗口管理器直接接管程序的启动流程,确保程序在当前激活的工作区打开。只需要把你原来直接启动gnome-terminal的代码,替换成i3-msg exec包裹的形式即可:
修改后的完整脚本:
#!/usr/bin/env bash WS='9:Dashboard' # 切换到目标工作区 i3-msg "workspace $WS" # 用i3 exec启动终端,确保它们在目标工作区打开 i3-msg exec "gnome-terminal --title=MATRIX -- bash -lc 'cmatrix -C green; exec bash'" i3-msg exec "gnome-terminal --title=CLOCK -- bash -lc 'tty-clock -c -C 4; exec bash'" i3-msg exec "gnome-terminal --title=SPOTIFY -- bash -lc 'spotify_player; exec bash'" i3-msg exec "gnome-terminal --title=ASCII -- bash -lc 'cat ~/.config/dashbord_art.txt; exec bash'" # 等待窗口创建完成(可根据系统性能调整时间) sleep 0.3 # 调整窗口位置和大小 i3-msg '[title="^MATRIX$"] floating enable, border none, move position 105 131, resize set 80' i3-msg '[title="^CLOCK$"] floating enable, border none, move position 1304 374, resize set 49' i3-msg '[title="^SPOTIFY$"] floating enable, border none, move position 931 132, resize set 8' i3-msg '[title="^ASCII$"] floating enable, border none, move position 933 373, resize set 354'
方法二:启动终端后手动移动到目标工作区
如果你不想改变终端的启动方式,可以在每个终端启动后,立即用i3命令把它移动到目标工作区。这种方法需要给终端一点时间创建窗口,所以要加短暂的sleep:
示例代码片段:
gnome-terminal --title=MATRIX -- bash -lc 'cmatrix -C green; exec bash' & sleep 0.1 # 等待窗口完成创建 i3-msg '[title="^MATRIX$"] move workspace '"$WS"
这种方法的缺点是sleep的时间需要根据系统性能调整,稳定性不如方法一,所以仅作为备选方案。
额外优化:用wait_for_window替代固定sleep
如果想彻底摆脱固定sleep的不确定性,可以用i3的wait_for_window命令,等待目标窗口真正出现后再执行位置调整:
i3-msg exec "gnome-terminal --title=MATRIX -- bash -lc 'cmatrix -C green; exec bash'" i3-msg wait_for_window '[title="^MATRIX$"]' i3-msg '[title="^MATRIX$"] floating enable, border none, move position 105 131, resize set 80'
这样能确保只有当窗口完全创建后,才会执行后续的调整命令,比固定sleep更可靠。
内容的提问来源于stack exchange,提问作者oumaima
相关产品推荐
相关产品推荐

