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

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

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

  • Запустите поддельный / минимальный сеанс X для Pulseaudio / dbus
  • Ярлык клавиатуры для SIGTERM в приложении GUI?
  • Как настроить собственный EDID вручную?
  • Переключить Alt и клавишу Windows, кроме случаев, когда используется внешняя клавиатура
  • Как получить ширину границы окна X из командной строки?
  • Создание дополнительного скрипта копирования и вставки
  • В значительной степени упрощенная конфигурация выглядит

    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. Это тоже будет хорошо, и я готов поспорить, что такое решение можно легко модифицировать, основываясь на окне, которое теперь сфокусировано.

  • Переопределите несколько кодов клавиш с XKB
  • Команды X не начинаются с моей работы
  • Общий сброс экрана для дисплея borked X?
  • Проблема Fedora VNC - получение серого экрана с тремя флажками
  • RedHat5 остановить копию при выборе
  • Расширение общей памяти MIT или MIT-SHM над ssh
  • 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 используется как есть.

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

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