Как изменить modMask в Xmonad, когда определенное окно сосредоточено, или на конкретном рабочем пространстве?

Я использую левый Alt в качестве основного основного кода, но для определенного приложения я хотел бы использовать клавиши Alt + в качестве моих привязок, и для этого конкретного приложения я хочу, чтобы левый подменю был моим modkey.

Кажется, что logHook – это подходящее место для включения этой логики, но у меня есть проблемы с пониманием, как это сделать.

В значительной степени упрощенная конфигурация выглядит

import qualified XMonad.StackSet as W import XMonad import XMonad.Hooks.DynamicLog main = do -- some stuff xmonad $ defaultConfig { modMask = mod1Mask -- left winkey = mod4Mask, left alt = mod1Mask , logHook = do dynamicLogWithPP pp } 

где

 pp = dzenPP { -- more stuff } 

Я мог бы получить имя текущего окна в моем logHook

 winset <- gets windowset let wname = fmap getName (W.peek winset) -- here I have some window identificator in Maybe 

но я не понимаю, как заменить modMask в моей основной функции, в defaultConfig, на лету.

Я также был бы рад, если бы на одном рабочем пространстве было бы иначе. Скажем, на рабочих площадках от 1 до 8 это клавиша Alt, а на 9-м она оставила Winkey. Это тоже будет хорошо, и я готов поспорить, что такое решение можно легко модифицировать, основываясь на окне, которое теперь сфокусировано.

  • Макет XMonad для портретного монитора
  • Выключение системы непосредственно из диспетчера отображения Xmonad - SLiM
  • Xmonad кажется (физически) болезненным опытом
  • Сохранение сеансов в файл xmonad
  • Как изменить обои для рабочего стола из терминала?
  • Запустить стартовый крюк XMonad только при первом запуске
  • Перетаскивание и изменение размеров плавающих окон в xmonad без клавиши
  • Перенос ключей для физических экранов в xmonad
  • One Solution collect form web for “Как изменить modMask в Xmonad, когда определенное окно сосредоточено, или на конкретном рабочем пространстве?”

    Это не удалось. XMonad работает так, как ожидалось, но приложения не получают нажатых клавиш. Я имею в виду, я использую winkey как modKey на 5-м рабочем пространстве и altkey на других рабочих пространствах. Я использовал для переключения рабочих областей с номером modKey +. Когда я нажимаю Alt + 2 на 5-й рабочей области, XMonad ничего не делает (это правильно), и приложение ничего не делает (что неправильно). Chrome не переключается на вторую вкладку и так далее.


    Хорошо, поэтому мне удалось это сделать, используя XMonad.Actions.PerWorkspaceKeys .

    Связанная конфигурация:

     import XMonad.Actions.PerWorkspaceKeys workspaceModkeys = [ (mod1Mask, map show ([1..4] ++ [6..9])) -- use Alt as modkey on all workspaces , (mod4Mask, ["5"]) -- save 5th (use Win there) ] modifiedKeysList conf = [ ((0, xK_Return), spawn $ XMonad.terminal conf) -- launch a terminal , ((shiftMask, xK_c ), kill) -- close focused window ] unmodifiedKeys conf = [ ((0, xF86XK_AudioPlay ), spawn "mpc toggle") , ((0, xF86XK_AudioStop ), spawn "mpc stop") ] keysList conf = concat (map modifyKey (modifiedKeysList conf)) ++ (unmodifiedKeys conf) modifyKey :: ((KeyMask, KeySym), X()) -> [((KeyMask, KeySym), X())] modifyKey k = map (fk) workspaceModkeys where f ((mask, key), action) (mod, workspaces) = ((mask .|. mod, key), bindOn (map (\w -> (w, action)) workspaces)) myKeys conf = M.fromList $ keysList conf main = xmonad $ defaultConfig { keys = myKeys } 

    Список modifiedKeys будет использовать модификатор (в этом примере – Winkey на пятой рабочей области, а слева Alt – на всех остальных), список unmodifiedKeys используется как есть.

    По-прежнему можно заглянуть в окно-специфические ключи позже, но я сейчас закончен.

    Interesting Posts
    Linux и Unix - лучшая ОС в мире.