Переключатель сжатия и расширения на основе REFLECTX

Я использую XMonad.Layout.Reflect вместе с XMonad.Layout.MultiToggle, чтобы при необходимости переворачивать мой макет влево-вправо. Однако, когда отображается какой-либо макет, мои клавиши для сжатия и расширения макета, например.

...

((modm,  xK_h), sendMessage Shrink),
((modm,  xK_l), sendMessage Expand),

...

ведет себя так, как будто они перевернуты.

Итак, мне нужен способ переназначить мои ключи или, возможно, использовать функцию вместо sendMessage, которая каким-то образом определяет состояние макета и выбирает Shrink / Expand в зависимости от этого.

Теперь я знаю, что проверка, например. глобальные переменные состояния (которых, как я полагаю, не существует) не очень-то хаскелли, поэтому я немного не понимаю, как это сделать. Я рассмотрел XMonad.Actions.PerWorkspaceKeys, но, похоже, он соответствует всему имени рабочей области. Другой путь может заключаться в добавлении / удалении привязок клавиш в defaultConfig, но опять же - я не уверен, что это вообще выполнимо (в любом случае это кажется беспорядочным).

Есть идеи о том, как подойти к этому кому-нибудь? Я знаю Haskell на уровне того, что прочитал книгу «Learn you a Haskell ...» от начала до конца и создал небольшие программы на ее основе.


person Tor Andre Myrvoll    schedule 09.06.2020    source источник


Ответы (1)


Один из способов сделать это - использовать описание макета, чтобы узнать, было ли оно отражено, следуя это сообщение в блоге Томаса Черчмана:

import qualified XMonad.StackSet as S
import Data.List (isInfixOf)

getActiveLayoutDescription :: X String
getActiveLayoutDescription = do
    workspaces <- gets windowset
    return $ description . S.layout . S.workspace . S.current $ workspaces

Тогда привязки клавиш будут выглядеть так:

((modm,  xK_h), do
    layoutDesc <- getActiveLayoutDescription
    if "ReflectX" `isInfixOf` layoutDesc
        then sendMessage Expand
        else sendMessage Shrink
,
((modm,  xK_l), do
    layoutDesc <- getActiveLayoutDescription
    if "ReflectX" `isInfixOf` layoutDesc
        then sendMessage Shrink
        else sendMessage Expand
    ),

Боковые примечания:

мои сочетания клавиш для сжатия и расширения макета [...] ведут себя так, как будто они перевернуты.

Хотя то, что вы хотите сделать, имеет смысл, стоит упомянуть, что такое поведение происходит потому, что отображение макета также будет отражать положение главной панели. Поскольку Shrink и Expand действуют на главной панели, они будут казаться перевернутыми в отношении абсолютных горизонтальных координат, если вы используете макет, подобный Tall, в котором главная панель находится в левой части экрана. На разные макеты это может повлиять по-разному.

Теперь я знаю, что проверка, например. глобальные переменные состояния (которых, как я полагаю, не существует) не очень-то хаскелли, поэтому я немного не понимаю, как это сделать.

Такой подход немыслим, и _6 _ предназначен для настройки такого рода вещей. В этом случае, однако, я считаю, что использование флага с отслеживанием состояния - больше проблем, чем оно того стоит.

person duplode    schedule 09.06.2020