4

Я только что переключился с metacity на xmonad, и я очень впечатлен концепцией оконного менеджера. Но меня это беспокоит: в gnome "рабочее пространство" состояло из всех трех моих мониторов, но в xmonad каждый физический экран имеет свое рабочее пространство (например, когда я нажимаю mod+1, только один экран меняет свое рабочее пространство).

Есть ли менеджер окон, который реализует концепцию рабочего пространства gnome (metacity)? Может ли xmonad связать все физические экраны в одно рабочее пространство?

1 ответ1

3

XMonad не может использовать все три экрана в качестве единого рабочего пространства, но вы этого не хотите. Я думаю, вам просто нужно знать, как лучше ориентироваться на экранах. У меня есть настройка, которая мне очень нравится, и вы можете увидеть файл конфигурации для этой настройки в разделе XMonad на Haskell Wiki. Все, что я покажу, будет исходить из материала в моем собственном конфиге на моей машине (хотя это не обязательно то, что находится на той странице, на которую я ссылаюсь).

Есть две библиотеки xmonad-contrib, которые делают многоголовую навигацию не только сносной, но и замечательной находкой, и это CycleWS и TagWindows.

CycleWS позволяет циклически перемещаться по рабочим областям на разных физических экранах (с prevScreen и nextScreen), а также позволяет легко перемещать окна между экранами (с помощью shiftPrevScreen и shiftNextScreen). Это означает, что, несмотря на то, что у вас есть разные рабочие области на каждом экране, они могут совместно использовать окна между ними. Если вы не хотите, чтобы одно окно охватывало каждый экран, то у вас все в порядке. Вот как мой xmonad.hs использует команды CycleWS:

-- Alt + Ctrl Left / Right makes the view go left and right
, ((altMask .|. controlMask, xK_Left       ), prevScreen >> windowCenter)
, ((altMask .|. controlMask, xK_Right      ), nextScreen >> windowCenter)
, ((altMask .|. controlMask, xK_Down       ), shiftPrevScreen)
, ((altMask .|. controlMask, xK_Up         ), shiftNextScreen)
, ((altMask .|. controlMask .|. shiftMask, xK_Down       ), shiftPrevScreen >> prevScreen >> windowCenter)
, ((altMask .|. controlMask .|. shiftMask, xK_Up         ), shiftNextScreen >> nextScreen >> windowCenter)

[Примечание: windowCenter = warpToWindow (1% 6) (1% 6)]

TagWindows - это классно, особенно функция viewOnScreen, которая позволяет вам вызывать любую программу с тегами на любом из ваших экранов прямо вперед, хотя мне пришлось немного взломать, чтобы мне это понравилось. Вот ключи, которые я использую:

, ((myModMask,                 xK_g  ), tagPrompt defaultXPConfig (withFocused . addTag))
, ((myModMask .|. shiftMask,   xK_g  ), tagDelPrompt defaultXPConfig)
, ((altMask,                   xK_g  ), tagPrompt defaultXPConfig (`withTaggedGlobalP` gotoWindow))

И здесь определена функция gotoWindow:

-- Warning: This gotoWindow function assumes you made your workspaces
-- with the 'withScreens' function from XMonad.Layout.IndependentScreens    
gotoWindow :: Window -> WindowSet -> WindowSet
gotoWindow window ws = case S.findTag window ws of
                           Just i -> viewOnScreen (screenIdFromTag i) i ws
                           Nothing -> ws
    where
        screenIdFromTag :: WorkspaceId -> ScreenId
        screenIdFromTag = S . read . takeWhile (/= '_')

И это должно позволить вам закрепить многоголовую удивительность в вашем конфигурационном файле XMonad. Не стесняйтесь задавать мне больше вопросов в комментариях, если у вас есть какие-либо. Надеюсь, это поможет.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .