Соедините DE с XMonad

Поскольку MATE — это всего лишь ответвление GNOME2, по-видимому, можно заменить оконный менеджер другим (например, xmonad) с помощью команды: mateconftool-2 -s /desktop/mate/session/required_components/windowmanager xmonad --type string. Это работает в том смысле, что XMonad запускается, когда я вхожу в MATE, однако похоже, что xmonad пытается расположить панели мозаикой или что-то в этом роде. Одна из панелей занимает буквально все пространство, которого не должно быть (оставляя верх и низ пустыми), и система полностью непригодна для использования (пора перезагружаться).

Мой xmonad.hs:

{-# LANGUAGE OverloadedStrings #-}

import XMonad
import XMonad.Hooks.DynamicLog
import XMonad.Hooks.SetWMName
import Control.Monad
import qualified XMonad.StackSet as W
import XMonad.Util.EZConfig
import qualified XMonad.Actions.FlexibleResize as Flex
import XMonad.Hooks.EwmhDesktops

import XMonad.Config.Desktop
import XMonad.Hooks.ManageDocks
import XMonad.Layout.NoBorders
import XMonad.Layout.LayoutHints

import XMonad.Util.Run (safeSpawn)

import System.Environment (getEnvironment)

main = xmonad mateConfig

mateConfig = desktopConfig
            { logHook = spawn "wmname LG3D"
            , manageHook = myManageHook <+> manageHook mateConfig
            , workspaces = ["1", "2", "3", "4", "5", "="]
            , modMask = mod4Mask
            , terminal = "gnome-terminal"
            , startupHook = takeTopFocus >> setWMName "LG3D"
            , handleEventHook = fullscreenEventHook
            --, layoutHook = layoutHints $ avoidStruts (noBorders Full) ||| Mirror (Tall (1 (3/100) (1/2))) 
            , layoutHook = avoidStruts ((noBorders Full) ||| Mirror (Tall 1 (3/100) (1/2)))
         }

         `additionalKeys` [ ((mod4Mask, xK_d), spawn "dmenu_run -fn \"Ubuntu_Mono-13:Normal\" -nb black -nf skyblue -sb skyblue -sf black")
                           ,((mod4Mask, xK_v), spawn "gvim")
                           ,((mod4Mask, xK_x), spawn "gvim ~/.xmonad/xmonad.hs")
                           ,((mod4Mask, xK_p), spawn "gnome-terminal")
                           -- ,((0       , xF86XK_AudioPlay), spawn "echo \"PLAY\" > ~/Desktop/hi")
                            ]

         `additionalMouseBindings` [ ((mod4Mask, button3), (\w -> focus w >> Flex.mouseResizeWindow w))
                                    ]


myManageHook = composeAll
    [ className =? "Amarok" --> doShift "="
    , manageDocks
    ]


{--- DBus Stuff-}
-- | Register xmonad with mate. 'dbus-send' must be in the $PATH with which
-- xmonad is started.
--
-- This action reduces a delay on startup only only if you have configured
-- mate-session>=2.26: to start xmonad with a command as such:
--
-- > mateconftool-2 -s /desktop/mate/session/required_components/windowmanager xmonad --type string
mateRegister :: MonadIO m => m ()
mateRegister = io $ do
    x <- lookup "DESKTOP_AUTOSTART_ID" `fmap` getEnvironment
    whenJust x $ \sessionId -> safeSpawn "dbus-send"
            ["--session"
            ,"--print-reply=string"
            ,"--dest=org.mate.SessionManager"
            ,"/org/mate/SessionManager"
            ,"org.mate.SessionManager.RegisterClient"
            ,"string:xmonad"
            ,"string:"++sessionId]




atom_WM_TAKE_FOCUS ::
  X Atom
atom_WM_TAKE_FOCUS =
  getAtom "WM_TAKE_FOCUS"

takeFocusX ::
  Window
  -> X ()
takeFocusX w =
  withWindowSet . const $ do
    dpy       <- asks display
    wmtakef   <- atom_WM_TAKE_FOCUS
    wmprot    <- atom_WM_PROTOCOLS
    protocols <- io $ getWMProtocols dpy w
    when (wmtakef `elem` protocols) $
      io . allocaXEvent $ \ev -> do
          setEventType ev clientMessage
          setClientMessageEvent ev w wmprot 32 wmtakef currentTime
          sendEvent dpy w False noEventMask ev

takeTopFocus ::
  X ()
takeTopFocus =
  withWindowSet $ maybe (setFocusX =<< asks theRoot) takeFocusX . W.peek

Моя единственная гипотеза заключается в том, что xmonad неправильно игнорирует панели.

Я использую Ubuntu x64 12.10, обновленную с 12.04.

РЕДАКТИРОВАТЬ: я попытался добавить className =? "mate-panel" --> doIgnore для управления хуками в xmonad.hs. Нет разницы.


person geniass    schedule 27.10.2012    source источник


Ответы (2)


Я запускаю MATE с XMonad. Проверьте конфиг. в этом репозитории

person bsnux    schedule 21.01.2013
comment
Спасибо! Комфорт рабочего стола с эффективностью мозаичного оконного менеджера! Это круто! Большое спасибо за конфиги, я не знаю никакого хаскеля и немного ленив =) - person Lesik2008; 16.04.2014

Ах, я нашел это. Я сделал глупую ошибку в части manageHook раздела mateConfig. Строка manageHook = myManageHook <+> manageHook mateConfig на самом деле не имеет смысла, потому что она относится к mateConfig, который все еще определяется этой строкой. На самом деле это должно быть manageHook = myManageHook <+> manageHook desktopConfig. mateConfig должен быть desktopConfig.

Кроме того, в logHook, handleEventHook и т. д. отсутствует часть <+> *Hook desktopConfig, которая ломает целую кучу вещей.

person geniass    schedule 06.11.2012