Я использую Xmonad в качестве оконного менеджера. Для автоматической обработки полноэкранного окна я использую XMonad.Hooks.EwmhDesktops.fullscreenEventHook. И поместите это в мой конфиг:
, handleEventHook = handleEventHook def <+> docksEventHook <+> XMonad.Hooks.EwmhDesktops.fullscreenEventHook
Я хотел бы иметь возможность переключать это с помощью привязки клавиш. Таким образом, по умолчанию полноэкранное окно занимает весь экран, но когда я отключаю EwmhDesktops.fullscreenEventHook, это только полноэкранный режим в «плиточном» пространстве, которое занимает окно.
Полный конфиг здесь
Добавить состояние в саму XMonad очень сложно, поэтому нам придется использовать IORef для внешнего состояния. Во-первых, мы создадим полноэкранный обработчик событий, который проверяет логическое значение из IORef и запускает фактический обработчик событий только в том случае, если он истинен:
toggleableFullscreen :: IORef Bool -> Event -> X All
toggleableFullscreen ref evt =
io (readIORef ref) >>= \isOn ->
if isOn
then XMonad.Hooks.EwmhDesktops.fullscreenEventHook evt
else return (All True)
Это использует io :: IO a -> X a , чтобы поднять IO
монаду в X
монаду. Теперь в нашей основной функции мы хотим создать IORef
с newIORef:
main = do
fullscreenRef <- newIORef True -- default to being on
-- rest of main goes here
Теперь мы также отредактируем строку handleEventHook
main, чтобы использовать нашу toggleableFullscreen
с переданным fullscreenRef
:
, handleEventHook = handleEventHook def <+> docksEventHook <+> toggleableFullscreen fullscreenRef
Итак, часть обработчика событий завершена. Теперь нам нужен способ переключить его. Функция myKeys
также должна принимать fullscreenRef
в качестве параметра, поэтому вам нужно добавить его:
myKeys fullscreenRef conf@(XConfig {XMonad.modMask = modm}) = M.fromList $
-- rest of myKeys
(это в строке 125 вашего конфига)
Затем вам нужно добавить новую комбинацию клавиш (скажем, mod+shift+f), которая переключает IORef с помощью modifyIORef
:
, ((modm .|. shiftMask, xK_f), io (modifyIORef fullscreenRef not))
Затем в вашей основной функции передайте fullscreenRef
в myKeys
:
, keys = myKeys fullscreenRef
(строка 400)
И удалите весь этот кусок, так как вы его не используете (и он не будет проверять тип):
defaults = def {
-- simple stuff
terminal = myTerminal,
focusFollowsMouse = myFocusFollowsMouse,
clickJustFocuses = myClickJustFocuses,
borderWidth = myBorderWidth,
modMask = myModMask,
workspaces = myWorkspaces,
normalBorderColor = myNormalBorderColor,
focusedBorderColor = myFocusedBorderColor,
-- key bindings
keys = myKeys,
mouseBindings = myMouseBindings,
-- hooks, layouts
layoutHook = myLayout,
manageHook = myManageHook,
handleEventHook = myEventHook,
logHook = myLogHook,
startupHook = myStartupHook
}
(строки 446-467)
Затем перезапустите xmonad, и вы сможете переключать обработчик полноэкранных событий с помощью mod+shift+f.
Если вы ищете All on hoogle, вы обнаружите, что вам нужно импортировать Data.Monoid или Data.Semigroup.
Я не смог заставить это работать. Я получаю следующую ошибку: «Не в области: конструктор типа или класс «Все» toggleableFullscreen :: IORef Bool -> Event -> X All». С моими очень небольшими знаниями о хаскеле мне еще предстоит выяснить, как заставить его работать.