更新(2015 年 11 月 16 日)

更新(2015 年 11 月 16 日)

升级到 14.10 后,gnome-settings-daemon 无法正确加载 /usr/share/gnome-session/sessions/xmonad.session。有谁遇到同样的问题吗?

答案1

以下是基于 Jianingy 回答的更详细的解决方案。它修复了我升级到 Ubuntu 14.10 后遇到的一些问题。它修复的问题包括:

  • 多媒体键不起作用
  • Gnome 控制中心中的显示设置不起作用

您需要添加DesktopName=Unity/usr/share/gnome-session/sessions/xmonad.session

[GNOME Session]
Name=Xmonad/GNOME
RequiredComponents=gnome-settings-daemon;gnome-panel;xmonad
DesktopName=Unity

此外,关于dbus-sendUbuntu 14.10 中的变化,您必须使用--print-reply=literal而不是--print-reply=string。我已将其添加到我的 中xmonad.hs,并将 main 定义为main = xmonad $ gnomeConfig2

import XMonad.Config.Desktop
import XMonad.Util.Run (safeSpawn)

import qualified Data.Map as M

import System.Environment (getEnvironment)

data RescreenToggleState = RescreenToggleState Bool deriving Typeable
instance ExtensionClass RescreenToggleState where
  initialValue = RescreenToggleState True

gnomeConfig2 = desktopConfig
    { terminal = "gnome-terminal"
    , keys     = gnomeKeys <+> keys desktopConfig
    , startupHook = gnomeRegister2 >> startupHook desktopConfig }

gnomeKeys (XConfig {modMask = modm}) = M.fromList $
    [ ((modm, xK_p), gnomeRun)
    , ((modm .|. shiftMask, xK_q), spawn "gnome-session-save --kill") ]

-- | Register xmonad with gnome. '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
-- gnome-session>=2.26: to start xmonad with a command as such:
--
-- > gconftool-2 -s /desktop/gnome/session/required_components/windowmanager xmonad --type string
gnomeRegister2 :: MonadIO m => m ()
gnomeRegister2 = io $ do
    x <- lookup "DESKTOP_AUTOSTART_ID" `fmap` getEnvironment
    whenJust x $ \sessionId -> safeSpawn "dbus-send"
            ["--session"
            ,"--print-reply=literal"
            ,"--dest=org.gnome.SessionManager"
            ,"/org/gnome/SessionManager"
            ,"org.gnome.SessionManager.RegisterClient"
            ,"string:xmonad"
            ,"string:"++sessionId]

答案2

好的,我找到解决方案了。

首先,从 14.10 开始,许多 unity 和 gnome 应用程序配置(/usr/share/applications 和 /etc/xdg/autostart 中的 *.desktop)开始包含“OnlyShowIn=Unity”。因此,我们必须在 /usr/share/gnome-session/sessions/xmonad.session 中添加一个desktopname=unity,才能让这些应用程序运行。

其次,cmd“dbus-send --print-reply=string”现在必须是“dbus-send --print-reply=literal”。因此,旧的 xmonad gnomeConfig 无法将 xmonad 注册为 wm。我们必须将 dbus-send 命令从 =string 更改为 =literal。

答案3

语法--print-reply=string导致错误。需要“注册”的应用程序名称不是xmonad,而是xmonad.desktop。我最终创建了一个~/.xmonad/hooks包含以下命令的文件:

dbus-send --session --print-reply --dest=org.gnome.SessionManager /org/gnome/SessionManager org.gnome.SessionManager.RegisterClient string:xmonad.desktop string:$DESKTOP_AUTO_START_ID

我还发现了之前的修复,设置DesktopName=Unity使得gnome-control-center可以正常使用。

答案4

这是一个非常简单的方法来解决“xmonad 注册失败”问题(在其他答案中通过使用 xmonad 钩子或写入来解决gnomeRegister2):在xmonad.desktop文件中,替换Exec=xmonadExec=sh -c "xmonad &"。这会导致非常快速的启动——我明白了这里——但它可能会破坏其他东西。

DesktopName=Unity部分仍然很重要。

更新(2015 年 11 月 16 日)

每次升级 Ubuntu 时,我都会遇到 XMonad + Gnome 的问题。我的配置文件是可在 GitHub 上获取,以防有人想看看我最近如何让 XMonad 和 Gnome 一起协同运行。

截至 2015 年 11 月 16 日,重要文件如下

对于 Ubuntu 15.04 和 15.10,最重要的,也是最难发现的变化是添加export XDG_CURRENT_DESKTOP=Unity到我的~/.xsession

# Without setting this explicitly, it gets te value "Gnome", which
# makes `unity-settings-daemon` fail to start and we get
# `gnome-settings-daemon` instead. Not sure what this variable does,
# but I got the hint here:
# https://bugzilla.gnome.org/show_bug.cgi?id=729575.
#
# Setting to values other than "Unity" -- e.g. "default", which `env`
# tells me is the value of related variables, or "GNOME-Flashback",
# which is the `DesktopName` I might suspect here -- I get weird
# behavior, e.g. none of the dock items appear in the Gnome panel.
export XDG_CURRENT_DESKTOP=Unity

另外,为了获得有关音量按键和屏幕亮度调整等的图形通知,我需要安装该notify-osd软件包。

相关内容