XMonad中实现同一快捷键切换创建/关闭居中浮动终端窗口
在XMonad中实现“创建/关闭中心浮动终端”的快捷键方案
你可以通过自定义窗口属性标记+查找匹配窗口的方式实现需求,这也是最可靠的方案,避免误操作其他终端窗口。以下是具体实现:
实现步骤
1. 导入必要模块
确保你的XMonad配置文件中导入这些依赖模块:
import XMonad.Util.WindowProperties (findWindow, Property(..)) import XMonad.Util.Run (spawnAndDo) import Data.List (intercalate) import XMonad (X, gets, windowset, killWindow) import XMonad.StackSet (screenRect, screenDetail, current, RationalRect(..), Rectangle(..)) import Graphics.X11.Xlib.Extras (setTextProperty)
2. 修改runInCenterTerm函数
更新原函数,添加“先查后动”的逻辑:存在标记窗口则关闭,否则创建并标记:
runInCenterTerm :: String -> String -> X () runInCenterTerm t cmd = do -- 查找带有自定义标记的中心终端窗口 mTargetWin <- findWindow (Property "CENTER_TERM" "1") case mTargetWin of Just win -> killWindow win -- 存在则关闭目标窗口 Nothing -> do -- 不存在则创建新终端并标记 screenRect <- fmap (screenRect . screenDetail . current) (gets windowset) spawnAndDo (\newWin -> do doRectFloat (adjustRect screenRect) newWin -- 给新窗口添加自定义属性标记 setTextProperty newWin "1" "CENTER_TERM") $ intercalate " " [t, cmd] where adjustRect (Rectangle sx sy sw sh) = RationalRect x y w h where w = min (1200 / fromIntegral sw) 1 h = min (600 / fromIntegral sh) 1 x = (1 - w) / 2 y = (1 - h) / 2
逻辑说明
- 自定义属性标记:通过
setTextProperty给新创建的浮动终端添加CENTER_TERM=1的X窗口属性,作为唯一识别标记,避免和其他终端混淆。 - 窗口查找:每次触发快捷键时,先用
findWindow查找带有该标记的窗口,确保只操作我们创建的中心浮动终端。 - 分支处理:找到窗口则调用
killWindow关闭;没找到则执行原有的创建逻辑,同时给新窗口打上标记。
内容的提问来源于stack exchange,提问作者Roberto Huelga
相关产品推荐
相关产品推荐

