diff --git a/cinnamon-session.spec b/cinnamon-session.spec index 2338236..ec2ed3f 100644 --- a/cinnamon-session.spec +++ b/cinnamon-session.spec @@ -4,13 +4,14 @@ Summary: Cinnamon session manager Name: cinnamon-session Version: 2.0.0 -Release: 1%{?dist} +Release: 2%{?dist} URL: http://cinnamon.linuxmint.com # To generate tarball # wget https://github.com/linuxmint/cinnamon-session/tarball/%%{_internal_version} -O cinnamon-session-%%{version}.git%%{_internal_version}.tar.gz Source0: http://leigh123linux.fedorapeople.org/pub/cinnamon-session/source/cinnamon-session-%{version}.tar.gz Patch0: remove_sessionmigration.patch +Patch1: lightdm_userswitch.patch License: GPLv2+ and LGPLv2+ Group: User Interface/Desktops @@ -67,6 +68,7 @@ the other core components and handles logout and saving the session. %prep %setup -q %patch0 -p1 +%patch1 -p1 NOCONFIGURE=1 ./autogen.sh %build @@ -121,6 +123,9 @@ fi %{_datadir}/glib-2.0/schemas/org.cinnamon.SessionManager.gschema.xml %changelog +* Sun Oct 06 2013 Leigh Scott - 2.0.0-2 +- add patch so user switch works in lightdm + * Wed Oct 02 2013 Leigh Scott - 2.0.0-1 - update to 2.0.0 - drop upstream patches diff --git a/lightdm_userswitch.patch b/lightdm_userswitch.patch new file mode 100644 index 0000000..2fc9fe1 --- /dev/null +++ b/lightdm_userswitch.patch @@ -0,0 +1,153 @@ +diff --git a/cinnamon-session/csm-manager.c b/cinnamon-session/csm-manager.c +index e3388b1..a8e63c5 100644 +--- a/cinnamon-session/csm-manager.c ++++ b/cinnamon-session/csm-manager.c +@@ -1097,44 +1097,20 @@ cancel_end_session (CsmManager *manager) + start_phase (manager); + } + +- +-static void +-manager_switch_user (GdkDisplay *display, +- CsmManager *manager) +-{ +- GError *error; +- char *command; +- GAppLaunchContext *context; +- GAppInfo *app; +- +- /* We have to do this here and in request_switch_user() because this +- * function can be called at a later time, not just directly after +- * request_switch_user(). */ +- if (_switch_user_is_locked_down (manager)) { +- g_warning ("Unable to switch user: User switching has been locked down"); +- return; +- } +- +- command = g_strdup_printf ("%s %s", +- MDM_FLEXISERVER_COMMAND, +- MDM_FLEXISERVER_ARGS); +- +- error = NULL; +- context = (GAppLaunchContext*) gdk_display_get_app_launch_context (display); +- app = g_app_info_create_from_commandline (command, MDM_FLEXISERVER_COMMAND, 0, &error); +- +- if (app) { +- g_app_info_launch (app, NULL, context, &error); +- g_object_unref (app); +- } +- +- g_free (command); +- g_object_unref (context); +- +- if (error) { +- g_debug ("CsmManager: Unable to start MDM greeter: %s", error->message); +- g_error_free (error); +- } ++static gboolean ++process_is_running (const char * name) ++{ ++ int num_processes; ++ char * command = g_strdup_printf ("pidof %s | wc -l", name); ++ FILE *fp = popen(command, "r"); ++ fscanf(fp, "%d", &num_processes); ++ pclose(fp); ++ if (num_processes > 0) { ++ return TRUE; ++ } ++ else { ++ return FALSE; ++ } + } + + static gboolean +@@ -1157,7 +1133,7 @@ manager_perhaps_lock (CsmManager *manager) + + /* do this sync to ensure it's on the screen when we start suspending */ + error = NULL; +- ret = g_spawn_command_line_sync ("gnome-screensaver-command --lock", NULL, NULL, NULL, &error); ++ ret = g_spawn_command_line_sync ("cinnamon-screensaver-command --lock", NULL, NULL, NULL, &error); + if (!ret) { + g_warning ("Couldn't lock screen: %s", error->message); + g_error_free (error); +@@ -1165,6 +1141,80 @@ manager_perhaps_lock (CsmManager *manager) + } + + static void ++manager_switch_user (GdkDisplay *display, ++ CsmManager *manager) ++{ ++ GError *error; ++ char *command; ++ GAppLaunchContext *context; ++ GAppInfo *app; ++ ++ /* We have to do this here and in request_switch_user() because this ++ * function can be called at a later time, not just directly after ++ * request_switch_user(). */ ++ if (_switch_user_is_locked_down (manager)) { ++ g_warning ("Unable to switch user: User switching has been locked down"); ++ return; ++ } ++ ++ if (process_is_running("mdm")) { ++ command = g_strdup_printf ("%s %s", ++ MDM_FLEXISERVER_COMMAND, ++ MDM_FLEXISERVER_ARGS); ++ ++ error = NULL; ++ context = (GAppLaunchContext*) gdk_display_get_app_launch_context (display); ++ app = g_app_info_create_from_commandline (command, MDM_FLEXISERVER_COMMAND, 0, &error); ++ ++ if (app) { ++ g_app_info_launch (app, NULL, context, &error); ++ g_object_unref (app); ++ } ++ ++ g_free (command); ++ g_object_unref (context); ++ ++ if (error) { ++ g_debug ("CsmManager: Unable to start MDM greeter: %s", error->message); ++ g_error_free (error); ++ } ++ } ++ else if (process_is_running("lightdm")) { ++ const gchar *xdg_seat_path = g_getenv ("XDG_SEAT_PATH"); ++ if (xdg_seat_path != NULL) { ++ GDBusProxyFlags flags = G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START; ++ GDBusProxy *proxy = NULL; ++ error = NULL; ++ ++ proxy = g_dbus_proxy_new_for_bus_sync(G_BUS_TYPE_SYSTEM, ++ flags, ++ NULL, ++ "org.freedesktop.DisplayManager", ++ xdg_seat_path, ++ "org.freedesktop.DisplayManager.Seat", ++ NULL, ++ &error); ++ if (proxy != NULL) { ++ manager_perhaps_lock (manager); ++ g_dbus_proxy_call (proxy, ++ "SwitchToGreeter", ++ g_variant_new ("()"), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ NULL, ++ NULL, ++ NULL); ++ g_object_unref (proxy); ++ } ++ else { ++ g_debug ("GsmManager: Unable to start LightDM greeter: %s", error->message); ++ g_error_free (error); ++ } ++ } ++ } ++} ++ ++static void + manager_attempt_hibernate (CsmManager *manager) + { + if (csm_system_can_hibernate (manager->priv->system)) {