gnome-panel r11134 - in trunk/gnome-panel: . libpanel-util



Author: vuntz
Date: Fri Jun  6 00:49:23 2008
New Revision: 11134
URL: http://svn.gnome.org/viewvc/gnome-panel?rev=11134&view=rev

Log:
2008-06-06  Vincent Untz  <vuntz gnome org>

	Use the gnome-session DBus API to log out/shut down. The dialog is also
	displayed by gnome-session.
	Fix bug #507391

	* Makefile.am: remove files
	* panel-gdm.[ch]: killed, not used anymore
	* panel-logout.[ch]: killed, not used anymore
	* panel-session.[ch]: remove panel_session_request_logout()
	* libpanel-util/Makefile.am: add new files
	* libpanel-util/panel-session-manager.[ch]: new, object to interact
	with the session manager
	* panel-action-button.c: (panel_action_logout): use PanelSessionManager
	API
	(panel_action_shutdown): ditto
	(panel_action_shutdown_reboot_is_disabled): updated, with a comment
	about a regression
	* libpanel-util/panel-power-manager.c: remove useless includes
	(panel_power_manager_can_suspend): add g_return_val_if_fail
	(panel_power_manager_can_hibernate): add g_return_val_if_fail
	(panel_power_manager_attempt_suspend): add g_return_if_fail
	(panel_power_manager_attempt_hibernate): add g_return_if_fail


Added:
   trunk/gnome-panel/libpanel-util/panel-session-manager.c
   trunk/gnome-panel/libpanel-util/panel-session-manager.h
Removed:
   trunk/gnome-panel/panel-gdm.c
   trunk/gnome-panel/panel-gdm.h
   trunk/gnome-panel/panel-logout.c
   trunk/gnome-panel/panel-logout.h
Modified:
   trunk/gnome-panel/ChangeLog
   trunk/gnome-panel/Makefile.am
   trunk/gnome-panel/libpanel-util/Makefile.am
   trunk/gnome-panel/libpanel-util/panel-power-manager.c
   trunk/gnome-panel/panel-action-button.c
   trunk/gnome-panel/panel-session.c
   trunk/gnome-panel/panel-session.h

Modified: trunk/gnome-panel/Makefile.am
==============================================================================
--- trunk/gnome-panel/Makefile.am	(original)
+++ trunk/gnome-panel/Makefile.am	Fri Jun  6 00:49:23 2008
@@ -97,8 +97,6 @@
 	panel-force-quit.c	\
 	panel-lockdown.c	\
 	panel-addto.c		\
-	panel-logout.c		\
-	panel-gdm.c		\
 	panel-ditem-editor.c	\
 	panel-mount-operation.c	\
 	$(NULL)
@@ -146,8 +144,6 @@
 	panel-force-quit.h	\
 	panel-lockdown.h	\
 	panel-addto.h		\
-	panel-logout.h		\
-	panel-gdm.h		\
 	panel-ditem-editor.h	\
 	panel-icon-names.h	\
 	panel-mount-operation.h	\

Modified: trunk/gnome-panel/libpanel-util/Makefile.am
==============================================================================
--- trunk/gnome-panel/libpanel-util/Makefile.am	(original)
+++ trunk/gnome-panel/libpanel-util/Makefile.am	Fri Jun  6 00:49:23 2008
@@ -28,4 +28,6 @@
 	panel-keyfile.h			\
 	panel-power-manager.c		\
 	panel-power-manager.h		\
+	panel-session-manager.c		\
+	panel-session-manager.h		\
 	$(NULL)

Modified: trunk/gnome-panel/libpanel-util/panel-power-manager.c
==============================================================================
--- trunk/gnome-panel/libpanel-util/panel-power-manager.c	(original)
+++ trunk/gnome-panel/libpanel-util/panel-power-manager.c	Fri Jun  6 00:49:23 2008
@@ -24,13 +24,6 @@
  *      Vincent Untz <vuntz gnome org>
  */
 
-#include <errno.h>
-#include <string.h>
-
-#include <glib.h>
-#include <glib-object.h>
-#include <glib/gi18n.h>
-
 #include <dbus/dbus-glib.h>
 
 #include <libpanel-util/panel-cleanup.h>
@@ -146,6 +139,8 @@
 	gboolean can_suspend;
 	DBusGProxy *proxy;
 
+	g_return_val_if_fail (PANEL_IS_POWER_MANAGER (manager), FALSE);
+
 	error = NULL;
 
 	if (!panel_dbus_service_ensure_connection (PANEL_DBUS_SERVICE (manager),
@@ -181,6 +176,8 @@
 	gboolean can_hibernate;
 	DBusGProxy *proxy;
 
+	g_return_val_if_fail (PANEL_IS_POWER_MANAGER (manager), FALSE);
+
 	error = NULL;
 
 	if (!panel_dbus_service_ensure_connection (PANEL_DBUS_SERVICE (manager),
@@ -215,6 +212,8 @@
 	GError *error;
 	DBusGProxy *proxy;
 
+	g_return_if_fail (PANEL_IS_POWER_MANAGER (manager));
+
 	error = NULL;
 
 	if (!panel_dbus_service_ensure_connection (PANEL_DBUS_SERVICE (manager),
@@ -248,13 +247,14 @@
 	}
 }
 
-
 void
 panel_power_manager_attempt_hibernate (PanelPowerManager *manager)
 {
 	GError *error;
 	DBusGProxy *proxy;
 
+	g_return_if_fail (PANEL_IS_POWER_MANAGER (manager));
+
 	error = NULL;
 
 	if (!panel_dbus_service_ensure_connection (PANEL_DBUS_SERVICE (manager),
@@ -288,7 +288,6 @@
 	}
 }
 
-
 PanelPowerManager *
 panel_power_manager_get (void)
 {

Added: trunk/gnome-panel/libpanel-util/panel-session-manager.c
==============================================================================
--- (empty file)
+++ trunk/gnome-panel/libpanel-util/panel-session-manager.c	Fri Jun  6 00:49:23 2008
@@ -0,0 +1,156 @@
+/*
+ * panel-session.c:
+ *
+ * Copyright (C) 2008 Novell, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ *
+ * Authors:
+ *	Vincent Untz <vuntz gnome org>
+ */
+
+#include <dbus/dbus-glib.h>
+
+#include <libpanel-util/panel-cleanup.h>
+#include <libpanel-util/panel-dbus-service.h>
+
+#include "panel-session-manager.h"
+
+static GObject *panel_session_manager_constructor (GType                  type,
+						   guint                  n_construct_properties,
+						   GObjectConstructParam *construct_properties);
+
+G_DEFINE_TYPE (PanelSessionManager, panel_session_manager, PANEL_TYPE_DBUS_SERVICE);
+
+static void
+panel_session_manager_class_init (PanelSessionManagerClass *klass)
+{
+	GObjectClass *object_class;
+
+	object_class = G_OBJECT_CLASS (klass);
+
+	object_class->constructor = panel_session_manager_constructor;
+}
+
+static void
+panel_session_manager_init (PanelSessionManager *manager)
+{
+}
+
+static GObject *
+panel_session_manager_constructor (GType                  type,
+				   guint                  n_construct_properties,
+				   GObjectConstructParam *construct_properties)
+{
+	GObject *obj;
+	GError  *error;
+
+	obj = G_OBJECT_CLASS (panel_session_manager_parent_class)->constructor (
+							type,
+							n_construct_properties,
+							construct_properties);
+
+
+	panel_dbus_service_define_service (PANEL_DBUS_SERVICE (obj),
+					   "org.gnome.SessionManager",
+					   "/org/gnome/SessionManager",
+					   "org.gnome.SessionManager");
+
+	error = NULL;
+	if (!panel_dbus_service_ensure_connection (PANEL_DBUS_SERVICE (obj),
+						   &error)) {
+		g_message ("Could not connect to session manager: %s",
+			   error->message);
+		g_error_free (error);
+	}
+
+	return obj;
+}
+
+void
+panel_session_manager_request_logout (PanelSessionManager           *manager,
+				      PanelSessionManagerLogoutType  mode)
+{
+	GError *error;
+	DBusGProxy *proxy;
+
+	g_return_if_fail (PANEL_IS_SESSION_MANAGER (manager));
+
+	error = NULL;
+
+	if (!panel_dbus_service_ensure_connection (PANEL_DBUS_SERVICE (manager),
+						   &error)) {
+		g_warning ("Could not connect to session manager: %s",
+			   error->message);
+		g_error_free (error);
+		return;
+	}
+
+	proxy = panel_dbus_service_get_proxy (PANEL_DBUS_SERVICE (manager));
+
+	if (!dbus_g_proxy_call (proxy, "Logout", &error,
+				G_TYPE_INT, mode, G_TYPE_INVALID,
+				G_TYPE_INVALID) &&
+	    error != NULL) {
+		g_warning ("Could not ask session manager to log out: %s",
+			   error->message);
+		g_error_free (error);
+	}
+}
+
+void
+panel_session_manager_request_shutdown (PanelSessionManager *manager)
+{
+	GError *error;
+	DBusGProxy *proxy;
+
+	g_return_if_fail (PANEL_IS_SESSION_MANAGER (manager));
+
+	error = NULL;
+
+	if (!panel_dbus_service_ensure_connection (PANEL_DBUS_SERVICE (manager),
+						   &error)) {
+		g_warning ("Could not connect to session manager: %s",
+			   error->message);
+		g_error_free (error);
+		return;
+	}
+
+	proxy = panel_dbus_service_get_proxy (PANEL_DBUS_SERVICE (manager));
+
+	if (!dbus_g_proxy_call (proxy, "Shutdown", &error,
+				G_TYPE_INVALID,
+				G_TYPE_INVALID) &&
+	    error != NULL) {
+		g_warning ("Could not ask session manager to shut down: %s",
+			   error->message);
+		g_error_free (error);
+	}
+}
+
+PanelSessionManager *
+panel_session_manager_get (void)
+{
+	static PanelSessionManager *manager = NULL;
+
+	if (manager == NULL) {
+		manager = g_object_new (PANEL_TYPE_SESSION_MANAGER, NULL);
+		panel_cleanup_register (panel_cleanup_unref_and_nullify,
+					&manager);
+	}
+
+	return manager;
+}

Added: trunk/gnome-panel/libpanel-util/panel-session-manager.h
==============================================================================
--- (empty file)
+++ trunk/gnome-panel/libpanel-util/panel-session-manager.h	Fri Jun  6 00:49:23 2008
@@ -0,0 +1,69 @@
+/*
+ * panel-session.h:
+ *
+ * Copyright (C) 2008 Novell, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ *
+ * Authors:
+ *	Vincent Untz <vuntz gnome org>
+ */
+
+#ifndef PANEL_SESSION_MANAGER_H
+#define PANEL_SESSION_MANAGER_H
+
+#include <glib-object.h>
+
+#include <libpanel-util/panel-dbus-service.h>
+
+G_BEGIN_DECLS
+
+#define PANEL_TYPE_SESSION_MANAGER		(panel_session_manager_get_type ())
+#define PANEL_SESSION_MANAGER(obj)		(G_TYPE_CHECK_INSTANCE_CAST ((obj), PANEL_TYPE_SESSION_MANAGER, PanelSessionManager))
+#define PANEL_SESSION_MANAGER_CLASS(klass)	(G_TYPE_CHECK_CLASS_CAST ((klass), PANEL_TYPE_SESSION_MANAGER, PanelSessionManagerClass))
+#define PANEL_IS_SESSION_MANAGER(obj)		(G_TYPE_CHECK_INSTANCE_TYPE ((obj), PANEL_TYPE_SESSION_MANAGER))
+#define PANEL_IS_SESSION_MANAGER_CLASS(klass)	(G_TYPE_CHECK_CLASS_TYPE ((klass), PANEL_TYPE_SESSION_MANAGER))
+#define PANEL_SESSION_MANAGER_GET_CLASS(obj)	(G_TYPE_INSTANCE_GET_CLASS((obj), PANEL_TYPE_SESSION_MANAGER, PanelSessionManagerClass))
+
+typedef struct _PanelSessionManager		PanelSessionManager;
+typedef struct _PanelSessionManagerClass	PanelSessionManagerClass;
+
+struct _PanelSessionManager {
+	PanelDBusService parent;
+};
+
+struct _PanelSessionManagerClass {
+	PanelDBusServiceClass parent_class;
+};
+
+GType panel_session_manager_get_type (void);
+
+/* Keep in sync with the values defined in gnome-session/session.h */
+typedef enum {
+	PANEL_SESSION_MANAGER_LOGOUT_MODE_NORMAL = 0,
+	PANEL_SESSION_MANAGER_LOGOUT_MODE_NO_CONFIRMATION,
+	PANEL_SESSION_MANAGER_LOGOUT_MODE_FORCE
+} PanelSessionManagerLogoutType;
+
+PanelSessionManager *panel_session_manager_get (void);
+
+void panel_session_manager_request_logout   (PanelSessionManager           *session,
+					     PanelSessionManagerLogoutType  mode);
+void panel_session_manager_request_shutdown (PanelSessionManager *session);
+
+G_END_DECLS
+
+#endif /* PANEL_SESSION_MANAGER_H */

Modified: trunk/gnome-panel/panel-action-button.c
==============================================================================
--- trunk/gnome-panel/panel-action-button.c	(original)
+++ trunk/gnome-panel/panel-action-button.c	Fri Jun  6 00:49:23 2008
@@ -32,6 +32,8 @@
 
 #include <glib/gi18n.h>
 
+#include <libpanel-util/panel-session-manager.h>
+
 #include "applet.h"
 #include "panel-config-global.h"
 #include "panel-gconf.h"
@@ -44,9 +46,7 @@
 #include "panel-run-dialog.h"
 #include "panel-a11y.h"
 #include "panel-lockdown.h"
-#include "panel-logout.h"
 #include "panel-compatibility.h"
-#include "panel-gdm.h"
 #include "panel-icon-names.h"
 
 G_DEFINE_TYPE (PanelActionButton, panel_action_button, BUTTON_TYPE_WIDGET);
@@ -155,7 +155,8 @@
 static void
 panel_action_logout (GtkWidget *widget)
 {
-	gboolean not_prompt;
+	PanelSessionManager *manager;
+	gboolean             not_prompt;
 
 	not_prompt = gconf_client_get_bool (panel_gconf_get_client (),
 					    LOGOUT_PROMPT_KEY, NULL);
@@ -163,28 +164,40 @@
 	 * safer */
 	not_prompt = !not_prompt;
 
+	manager = panel_session_manager_get ();
+
 	if (not_prompt)
-		panel_session_request_logout ();
+		panel_session_manager_request_logout (manager,
+						      PANEL_SESSION_MANAGER_LOGOUT_MODE_NO_CONFIRMATION);
 	else
-		panel_logout_new (PANEL_LOGOUT_DIALOG_LOGOUT,
-				  gtk_widget_get_screen (widget),
-				  gtk_get_current_event_time ());
+		/* FIXME: we need to use widget to get the screen for the
+		 * confirmation dialog, see
+		 * http://bugzilla.gnome.org/show_bug.cgi?id=536914 */
+		panel_session_manager_request_logout (manager,
+						      PANEL_SESSION_MANAGER_LOGOUT_MODE_NORMAL);
 }
 
 static void
 panel_action_shutdown (GtkWidget *widget)
 {
-	panel_logout_new (PANEL_LOGOUT_DIALOG_SHUTDOWN,
-			  gtk_widget_get_screen (widget),
-			  gtk_get_current_event_time ());
+	PanelSessionManager *manager;
+
+	manager = panel_session_manager_get ();
+	panel_session_manager_request_shutdown (manager);
 }
 
 static gboolean
 panel_action_shutdown_reboot_is_disabled (void)
 {
+	return panel_lockdown_get_disable_log_out();
+#if 0
+	/* FIXME: waiting for a gnome-session dbus api to know if
+	 * shutdown/reboot is possible:
+	 * http://bugzilla.gnome.org/show_bug.cgi?id=536915 */
 	return (panel_lockdown_get_disable_log_out() ||
 	(!gdm_supports_logout_action (GDM_LOGOUT_ACTION_SHUTDOWN) &&
 	 !gdm_supports_logout_action (GDM_LOGOUT_ACTION_REBOOT)));
+#endif
 }
 
 /* Run Application

Modified: trunk/gnome-panel/panel-session.c
==============================================================================
--- trunk/gnome-panel/panel-session.c	(original)
+++ trunk/gnome-panel/panel-session.c	Fri Jun  6 00:49:23 2008
@@ -32,34 +32,6 @@
 #include "panel-profile.h"
 #include "panel-shell.h"
 
-void
-panel_session_request_logout (void)
-{
-	GnomeClient *client;
-	static int   recursion_guard = 0;
-
-	if (recursion_guard)
-		return;
-
-	recursion_guard++;
-
-	if (!(client = gnome_master_client ()))
-		return;
-
-	/* Only request a Global save. We only want a Local
-	 * save if the user selects 'Save current setup'
-	 * from the dialog.
-	 */
-	gnome_client_request_save (client,
-				   GNOME_SAVE_GLOBAL,
-				   TRUE,
-				   GNOME_INTERACT_ANY,
-				   TRUE, /* do not use the gnome-session gui */
-				   TRUE);
-
-	recursion_guard--;
-}
-
 static void
 panel_session_handle_die_request (GnomeClient *client)
 {

Modified: trunk/gnome-panel/panel-session.h
==============================================================================
--- trunk/gnome-panel/panel-session.h	(original)
+++ trunk/gnome-panel/panel-session.h	Fri Jun  6 00:49:23 2008
@@ -29,7 +29,6 @@
 
 void panel_session_init           (void);
 void panel_session_do_not_restart (void);
-void panel_session_request_logout (void);
 
 G_END_DECLS
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]