diff options
author | Tony Vroon <chainsaw@gentoo.org> | 2008-11-13 17:25:55 +0000 |
---|---|---|
committer | Tony Vroon <chainsaw@gentoo.org> | 2008-11-13 17:25:55 +0000 |
commit | e22a7ad35a3cc902e3ef9e8f9941e0ac281bd2b6 (patch) | |
tree | fa30bb757e28eedc76db807096baf99444241788 /gnome-base/gnome-session | |
parent | general cleanup (diff) | |
download | gentoo-2-e22a7ad35a3cc902e3ef9e8f9941e0ac281bd2b6.tar.gz gentoo-2-e22a7ad35a3cc902e3ef9e8f9941e0ac281bd2b6.tar.bz2 gentoo-2-e22a7ad35a3cc902e3ef9e8f9941e0ac281bd2b6.zip |
Debian patch identified by Marcin Kurek <morgoth6@gmail.com> resolves intermittent gnome-session-manager failures on login (only SMP systems appear to be affected). First step towards closing bug #239293.
(Portage version: 2.2_rc14/cvs/Linux 2.6.28-rc4-00305-g4ffaf86-dirty x86_64)
Diffstat (limited to 'gnome-base/gnome-session')
-rw-r--r-- | gnome-base/gnome-session/ChangeLog | 11 | ||||
-rw-r--r-- | gnome-base/gnome-session/files/gnome-session-2.22.3-gsd-spawn.patch | 252 | ||||
-rw-r--r-- | gnome-base/gnome-session/gnome-session-2.22.3-r1.ebuild | 74 |
3 files changed, 336 insertions, 1 deletions
diff --git a/gnome-base/gnome-session/ChangeLog b/gnome-base/gnome-session/ChangeLog index bb3380830899..3d10f2ccd7b1 100644 --- a/gnome-base/gnome-session/ChangeLog +++ b/gnome-base/gnome-session/ChangeLog @@ -1,6 +1,15 @@ # ChangeLog for gnome-base/gnome-session # Copyright 2002-2008 Gentoo Foundation; Distributed under the GPL v2 -# $Header: /var/cvsroot/gentoo-x86/gnome-base/gnome-session/ChangeLog,v 1.222 2008/09/25 15:22:59 jer Exp $ +# $Header: /var/cvsroot/gentoo-x86/gnome-base/gnome-session/ChangeLog,v 1.223 2008/11/13 17:25:54 chainsaw Exp $ + +*gnome-session-2.22.3-r1 (13 Nov 2008) + + 13 Nov 2008; <chainsaw@gentoo.org> + +files/gnome-session-2.22.3-gsd-spawn.patch, + +gnome-session-2.22.3-r1.ebuild: + Debian patch identified by Marcin Kurek <morgoth6@gmail.com> resolves + intermittent gnome-session-manager failures on login (only SMP systems + appear to be affected). First step towards closing bug #239293. 25 Sep 2008; Jeroen Roovers <jer@gentoo.org> gnome-session-2.22.3.ebuild: Stable for HPPA (bug #236971). diff --git a/gnome-base/gnome-session/files/gnome-session-2.22.3-gsd-spawn.patch b/gnome-base/gnome-session/files/gnome-session-2.22.3-gsd-spawn.patch new file mode 100644 index 000000000000..20b5ec00a512 --- /dev/null +++ b/gnome-base/gnome-session/files/gnome-session-2.22.3-gsd-spawn.patch @@ -0,0 +1,252 @@ + +Debian #339785 +GNOME #500216 +Spawn gnome-settings-daemon with g_spawn instead of DBus. + +The underlying problem fixed by this change is that gnome-settings-daemon +handles the configured multimedia keys shortcuts which can launch any app; +these apps will inherit gnome-settings-daemon's env, which might miss things +such as GnuPG or SSH agent information. Spawning instead of using dbus +activation gnome-settings-daemon makes it possible to inherit the env vars. +The better long term solution might be in the gnome-session dbus rewrite, which +might mean apps are started by gnome-session, but this hasn't been confirmed. + +Index: gnome-session-2.22.1/configure.in +=================================================================== +--- gnome-session-2.22.1.orig/configure.in 2008-04-07 23:45:59.000000000 +0100 ++++ gnome-session-2.22.1/configure.in 2008-05-07 00:29:18.000000000 +0100 +@@ -393,6 +393,20 @@ + ]) + AC_SUBST(RSH_COMMAND) + ++AC_MSG_CHECKING([for gnome-settings-daemon]) ++AC_ARG_WITH(settings-daemon, ++ AC_HELP_STRING([--with-settings-daemon=PATH], ++ [Specify the path to gnome-settings-daemon]), ++ [SETTINGS_DAEMON_PATH="$with_settings_daemon"], ++ [SETTINGS_DAEMON_PATH=`pkg-config --variable=binary gnome-settings-daemon` ++ if test x$SETTINGS_DAEMON_PATH = x ; then ++ AC_MSG_ERROR([No path found to gnome-settings-daemon.]) ++ fi ++]) ++AC_MSG_RESULT($SETTINGS_DAEMON_PATH) ++AC_DEFINE_UNQUOTED(SETTINGS_DAEMON_PATH, "$SETTINGS_DAEMON_PATH", ++ [Defines the path to the gnome-settings-daemon binary]) ++ + + GNOME_SESSION_TARBALL=`date +%e` + AC_DEFINE_UNQUOTED(GNOME_SESSION_TARBALL_DAY, $GNOME_SESSION_TARBALL, +Index: gnome-session-2.22.1/gnome-session/gsm-gsd.c +=================================================================== +--- gnome-session-2.22.1.orig/gnome-session/gsm-gsd.c 2008-04-07 23:45:55.000000000 +0100 ++++ gnome-session-2.22.1/gnome-session/gsm-gsd.c 2008-05-07 00:29:18.000000000 +0100 +@@ -11,11 +11,13 @@ + #include <dbus/dbus-glib-lowlevel.h> + + #include <gtk/gtkmessagedialog.h> ++#include <gtk/gtkmain.h> + + #include <gnome-settings-daemon/gnome-settings-client.h> + + typedef struct { +- DBusGProxy *dbus_proxy; ++ DBusGProxy *dbus_proxy; ++ GPid pid; + gboolean activating; + time_t start_time; + guint attempts; +@@ -80,6 +82,8 @@ + gtk_widget_show (dialog); + } + ++static void gsd_spawn (gboolean wait_activated); ++ + static void + name_owner_changed (DBusGProxy *proxy, + const char *name, +@@ -102,7 +106,7 @@ + + gsd->dbus_proxy = NULL; + +- gsm_gsd_start (); ++ gsd_spawn (FALSE); + } + } + else +@@ -128,15 +132,29 @@ + G_CALLBACK(plugin_activated), gsd); + } + +-void +-gsm_gsd_start (void) ++static void ++gsd_died_cb (GPid pid, gint status, GnomeSettingsData *gsd) ++{ ++ gsd->pid = 0; ++ /* gsd terminated before registering to dbus */ ++ if (gsd->activating) ++ { ++ gsd->activating = FALSE; ++ gsd_spawn (FALSE); ++ } ++} ++ ++static void ++gsd_spawn (gboolean wait_activated) + { + static GnomeSettingsData gsd = { NULL }; + time_t now; + DBusGConnection *connection; ++ DBusGProxy *dbus_service; + GError *error = NULL; ++ const gchar *const argv[] = { SETTINGS_DAEMON_PATH, "gnome-settings-daemon", NULL }; + +- gsm_verbose ("gsm_gsd_start(): starting\n"); ++ gsm_verbose ("gsd_spawn(): starting\n"); + + if (gsd.activating) + return; +@@ -171,67 +189,89 @@ + gsd_set_error (&gsd, error->message); + gsd_error_dialog (&gsd, NULL); + g_error_free (error); ++ return; ++ } ++ ++ dbus_connection_set_exit_on_disconnect (dbus_g_connection_get_connection (connection), ++ FALSE); ++ ++ gsd.dbus_proxy = dbus_g_proxy_new_for_name (connection, ++ "org.gnome.SettingsDaemon", ++ "/org/gnome/SettingsDaemon", ++ "org.gnome.SettingsDaemon"); ++ ++ if (gsd.dbus_proxy == NULL) ++ { ++ gsd_set_error (&gsd, "Could not obtain DBUS proxy"); ++ gsd_error_dialog (&gsd, NULL); ++ return; ++ } ++ ++ if (g_spawn_async (NULL, (gchar **) argv, NULL, ++ G_SPAWN_DO_NOT_REAP_CHILD | G_SPAWN_FILE_AND_ARGV_ZERO, ++ NULL, NULL, &gsd.pid, &error)) ++ { ++ g_child_watch_add (gsd.pid, (GChildWatchFunc) gsd_died_cb, &gsd); + } + else + { +- dbus_connection_set_exit_on_disconnect (dbus_g_connection_get_connection (connection), +- FALSE); ++ gsd_set_error (&gsd, error->message); ++ gsd_error_dialog (&gsd, NULL); ++ g_error_free (error); ++ return; ++ } + +- gsd.dbus_proxy = dbus_g_proxy_new_for_name (connection, +- "org.gnome.SettingsDaemon", +- "/org/gnome/SettingsDaemon", +- "org.gnome.SettingsDaemon"); ++ dbus_service = dbus_g_proxy_new_for_name (connection, ++ DBUS_SERVICE_DBUS, ++ DBUS_PATH_DBUS, ++ DBUS_INTERFACE_DBUS); ++ dbus_g_proxy_add_signal (dbus_service, ++ "NameOwnerChanged", ++ G_TYPE_STRING, ++ G_TYPE_STRING, ++ G_TYPE_STRING, ++ G_TYPE_INVALID); ++ dbus_g_proxy_connect_signal (dbus_service, ++ "NameOwnerChanged", ++ G_CALLBACK (name_owner_changed), ++ &gsd, ++ NULL); + +- if (gsd.dbus_proxy == NULL) +- { +- gsd_set_error (&gsd, "Could not obtain DBUS proxy"); +- gsd_error_dialog (&gsd, NULL); +- } +- else ++ if (wait_activated) ++ { ++ while (gsd.activating) + { +- /* Connect to the signal before we wake the settings daemon +- * up, otherwise, it might have the sound system ready before +- * we're actually listening */ +- dbus_g_proxy_add_signal (gsd.dbus_proxy, +- "PluginActivated", +- G_TYPE_STRING, +- G_TYPE_INVALID); +- +- dbus_g_proxy_connect_signal (gsd.dbus_proxy, +- "PluginActivated", +- G_CALLBACK (plugin_activated), +- &gsd, +- NULL); ++ gtk_main_iteration (); ++ } + +- if (!org_gnome_SettingsDaemon_awake(gsd.dbus_proxy, &error)) +- { +- /* Method failed, the GError is set, let's warn everyone */ +- gsd_set_error (&gsd, error->message); +- gsd_error_dialog (&gsd, NULL); +- g_error_free (error); +- } +- else +- { +- DBusGProxy *dbusService; +- dbusService = dbus_g_proxy_new_for_name (connection, +- DBUS_SERVICE_DBUS, +- DBUS_PATH_DBUS, +- DBUS_INTERFACE_DBUS); +- +- dbus_g_proxy_add_signal (dbusService, +- "NameOwnerChanged", +- G_TYPE_STRING, +- G_TYPE_STRING, +- G_TYPE_STRING, +- G_TYPE_INVALID); +- +- dbus_g_proxy_connect_signal (dbusService, +- "NameOwnerChanged", +- G_CALLBACK (name_owner_changed), +- &gsd, +- NULL); ++ /* Connect to the signal before we wake the settings daemon ++ * up, otherwise, it might have the sound system ready before ++ * we're actually listening */ ++ dbus_g_proxy_add_signal (gsd.dbus_proxy, ++ "PluginActivated", ++ G_TYPE_STRING, ++ G_TYPE_INVALID); ++ ++ dbus_g_proxy_connect_signal (gsd.dbus_proxy, ++ "PluginActivated", ++ G_CALLBACK (plugin_activated), ++ &gsd, ++ NULL); + +- } ++ /* if gsd.pid is 0, something broke havoc and the user has already been warned */ ++ if (gsd.pid && !org_gnome_SettingsDaemon_awake(gsd.dbus_proxy, &error)) ++ { ++ /* Method failed, the GError is set, let's warn everyone */ ++ gsd_set_error (&gsd, error->message); ++ gsd_error_dialog (&gsd, NULL); ++ g_error_free (error); + } + } + } ++ ++void ++gsm_gsd_start (void) ++{ ++ gsd_spawn (TRUE); ++} ++ + diff --git a/gnome-base/gnome-session/gnome-session-2.22.3-r1.ebuild b/gnome-base/gnome-session/gnome-session-2.22.3-r1.ebuild new file mode 100644 index 000000000000..b257f4375aeb --- /dev/null +++ b/gnome-base/gnome-session/gnome-session-2.22.3-r1.ebuild @@ -0,0 +1,74 @@ +# Copyright 1999-2008 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/gnome-base/gnome-session/gnome-session-2.22.3-r1.ebuild,v 1.1 2008/11/13 17:25:54 chainsaw Exp $ + +inherit eutils gnome2 autotools + +DESCRIPTION="Gnome session manager" +HOMEPAGE="http://www.gnome.org/" +SRC_URI="${SRC_URI} + branding? ( mirror://gentoo/gentoo-splash.png )" + +LICENSE="GPL-2 LGPL-2 FDL-1.1" +SLOT="0" +KEYWORDS="~alpha ~amd64 ~hppa ~ia64 ~ppc ~ppc64 ~sparc ~x86 ~x86-fbsd" +IUSE="branding ipv6 tcpd" + +RDEPEND=">=dev-libs/glib-2.13 + >=gnome-base/libgnomeui-2.2 + >=x11-libs/gtk+-2.11.1 + >=dev-libs/dbus-glib-0.71 + >=gnome-base/gnome-keyring-2.21.92 + gnome-base/gnome-settings-daemon + >=x11-libs/libnotify-0.2.1 + x11-libs/libXau + x11-apps/xdpyinfo + gnome-base/gnome-settings-daemon + >=gnome-base/gconf-2 + tcpd? ( >=sys-apps/tcp-wrappers-7.6 )" +DEPEND="${RDEPEND} + x11-apps/xrdb + >=sys-devel/gettext-0.10.40 + >=dev-util/pkgconfig-0.17 + >=dev-util/intltool-0.35 + !gnome-base/gnome-core + !<gnome-base/gdm-2.20.4" + +# gnome-base/gnome-core overwrite /usr/bin/gnome-session +# gnome-base/gdm does not provide gnome.desktop anymore + +DOCS="AUTHORS ChangeLog HACKING NEWS README" + +pkg_setup() { + # TODO: convert libnotify to a configure option + G2CONF="${G2CONF} $(use_enable ipv6) $(use_enable tcpd tcp-wrappers) --with-settings-daemon=/usr/libexec/gnome-settings-daemon" +} + +src_unpack() { + gnome2_src_unpack + + # Patch for Gentoo Branding (bug #42687) + use branding && epatch "${FILESDIR}/${PN}-2.17.90.1-gentoo-branding.patch" + + # Get rid of random asserts in tons of programs due to development versions + epatch "${FILESDIR}/${PN}-2.19.2-no-asserts.patch" + + # Spawn GSD instead of relying on D-Bus, as this falls down quite + # spectacularly on SMP systems (bug #239293) + epatch "${FILESDIR}/${P}-gsd-spawn.patch" + eautoreconf +} + +src_install() { + gnome2_src_install + + dodir /etc/X11/Sessions + exeinto /etc/X11/Sessions + doexe "${FILESDIR}/Gnome" + + # Our own splash for world domination + if use branding ; then + insinto /usr/share/pixmaps/splash/ + doins "${DISTDIR}/gentoo-splash.png" + fi +} |