Mate 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. Нет разницы.
2 ответа
Ах, я нашел это. Я сделал глупую ошибку в manageHook
часть mateConfig
раздел. Линия manageHook = myManageHook <+> manageHook mateConfig
на самом деле не имеет смысла, потому что он ссылается на mateConfig, который все еще определяется этой строкой. Это должно быть на самом деле manageHook = myManageHook <+> manageHook desktopConfig
, mateConfig должен быть desktopConfig.
Кроме того, logHook, handleEventHook и т.д... отсутствуют <+> *Hook desktopConfig
часть, которая ломает целую кучу вещей.