rpms/gnome-system-monitor/devel session.patch,1.1,1.2

Matthias Clasen (mclasen) fedora-extras-commits at redhat.com
Wed Aug 13 21:28:40 UTC 2008


Author: mclasen

Update of /cvs/extras/rpms/gnome-system-monitor/devel
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv21507

Modified Files:
	session.patch 
Log Message:
update patch


session.patch:

Index: session.patch
===================================================================
RCS file: /cvs/extras/rpms/gnome-system-monitor/devel/session.patch,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- session.patch	13 Aug 2008 21:04:41 -0000	1.1
+++ session.patch	13 Aug 2008 21:28:10 -0000	1.2
@@ -1,477 +1,93 @@
---- gnome-system-monitor-2.23.5/src/proctable.cpp	2008-05-31 14:38:57.000000000 -0400
-+++ hacked/src/proctable.cpp	2008-08-07 14:20:34.000000000 -0400
-@@ -51,6 +51,7 @@
- #include "util.h"
- #include "interface.h"
- #include "selinux.h"
-+#include "gsm-session-manager.h"
- 
- 
- ProcInfo::UserMap ProcInfo::users;
-@@ -225,6 +226,7 @@
- 		N_("Memory"),
- 		/* xgettext: wchan, see ps(1) or top(1) */
- 		N_("Waiting Channel"),
-+		N_("Session"),
- 		NULL,
- 		"POINTER"
- 	};
-@@ -254,9 +256,12 @@
- 				    G_TYPE_STRING,	/* Arguments	*/
- 				    G_TYPE_ULONG,	/* Memory       */
- 				    G_TYPE_STRING,	/* wchan	*/
-+				    G_TYPE_UINT,        /* Session state */
-+				    G_TYPE_UINT,        /* Restart style */
- 				    GDK_TYPE_PIXBUF,	/* Icon		*/
- 				    G_TYPE_POINTER,	/* ProcInfo	*/
--				    G_TYPE_STRING	/* Sexy tooltip */
-+				    G_TYPE_STRING	/* Sexy tooltip */
-+				    
- 		);
- 
- 	proctree = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model));
-@@ -295,7 +300,6 @@
- 	gtk_tree_view_append_column (GTK_TREE_VIEW (proctree), column);
- 	gtk_tree_view_set_expander_column (GTK_TREE_VIEW (proctree), column);
- 
--
- 	for (i = COL_USER; i <= COL_WCHAN; i++) {
- 
- 		GtkCellRenderer *cell;
-@@ -385,6 +389,26 @@
- 		}
- 	}
- 
-+	column = gtk_tree_view_column_new();
-+	gtk_tree_view_column_set_title(column, _(titles[COL_SESSION_STATE]));
-+	gtk_tree_view_column_set_resizable(column, FALSE);
-+	gtk_tree_view_column_set_reorderable(column, TRUE);
-+	gtk_tree_view_column_set_sort_column_id (column, COL_SESSION_STATE);
-+	gtk_tree_view_append_column(GTK_TREE_VIEW(proctree), column);
-+	cell_renderer = gtk_cell_renderer_pixbuf_new ();
-+	gtk_tree_view_column_pack_start (column, cell_renderer, FALSE);
-+	gtk_tree_view_column_set_cell_data_func(column, cell_renderer,
-+						&procman::session_state_cell_data_func,
-+						GUINT_TO_POINTER(COL_SESSION_STATE),
-+						NULL);
+diff -up /dev/null gnome-system-monitor-2.23.6/src/gsm-session-manager.c
+--- /dev/null	2008-08-13 11:36:43.974262811 -0400
++++ gnome-system-monitor-2.23.6/src/gsm-session-manager.c	2008-08-13 17:23:15.000000000 -0400
+@@ -0,0 +1,528 @@
++/* gsm-session-manager.h - functions for monitoring the session
++ *
++ * Copyright (C) 2008 Red Hat, Inc
++ * Author: Matthias Clasen
++ *
++ * 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, 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.  
++ */
 +
-+	cell_renderer = gtk_cell_renderer_pixbuf_new ();
-+	gtk_tree_view_column_pack_start (column, cell_renderer, FALSE);
-+	gtk_tree_view_column_set_cell_data_func(column, cell_renderer,
-+						&procman::restart_style_cell_data_func,
-+						GUINT_TO_POINTER(COL_RESTART_STYLE),
-+						NULL);
++#include <dbus/dbus-glib.h>
++#include <gsm-session-manager.h>
++#include <string.h>
 +
- 	gtk_container_add (GTK_CONTAINER (scrolled), proctree);
- 
- 	procdata->tree = proctree;
-@@ -834,6 +858,59 @@
- 		update_info_mutable_cols(it->second);
- }
- 
-+static gboolean
-+clear_session_data (GtkTreeModel *model,
-+		    GtkTreePath  *path,
-+		    GtkTreeIter  *iter,
-+		    gpointer      data)
++struct _GsmSessionManagerPrivate
 +{
-+	gtk_tree_store_set (GTK_TREE_STORE (model),
-+			    iter,
-+			    COL_SESSION_STATE, 0,
-+			    COL_RESTART_STYLE, 0,
-+			    -1);
-+	
-+	return FALSE;
-+}
++	DBusGConnection  *dbus_connection;
++        DBusGProxy       *bus_proxy;
++        DBusGProxy       *sm_proxy;
++	guint		  is_connected :1;
 +
-+static void
-+update_session_data (const char *obj_path, 
-+		     guint       pid,
-+		     guint       status,
-+		     guint	 restart_style_hint,
-+		     gpointer    data)
-+{
-+	GtkTreeModel *model = (GtkTreeModel*)data;
-+	GtkTreeIter iter;
-+	guint pid2;
++	GHashTable	 *clients;
++};
 +
-+	gtk_tree_model_get_iter_first (model, &iter);
-+	do {
-+		gtk_tree_model_get (model, &iter, COL_PID, &pid2, -1);
-+		if (pid == pid2) {
-+			gtk_tree_store_set (GTK_TREE_STORE (model),
-+					    &iter,
-+					    COL_SESSION_STATE, status,
-+					    COL_RESTART_STYLE, restart_style_hint + 1,
-+					    -1);
-+			return;
-+		}
-+	} while (gtk_tree_model_iter_next (model, &iter));
-+}
++static void gsm_session_manager_finalize                 (GObject *object);
++static void gsm_session_manager_class_install_signals    (GsmSessionManagerClass *manager_class);
 +
-+static void
-+add_session_data (ProcData * const procdata)
-+{
-+	GsmSessionManager *manager;
-+	GtkTreeModel *model;
++static void gsm_session_manager_class_install_properties (GsmSessionManagerClass *manager_class);
 +
-+	model = gtk_tree_view_get_model (GTK_TREE_VIEW (procdata->tree));
-+	gtk_tree_model_foreach (model, clear_session_data, NULL);
++static void gsm_session_manager_get_property (GObject    *object,
++                                              guint       prop_id,
++                                              GValue     *value,
++                                              GParamSpec *pspec);
 +
-+	manager = gsm_session_manager_get ();
-+	gsm_session_manager_foreach (manager, update_session_data, model);
-+	g_object_unref (manager);
-+}
- 
- void
- proctable_update_list (ProcData * const procdata)
-@@ -880,6 +957,7 @@
- 	procdata->cpu_total_time_last = cpu.total;
- 
- 	refresh_list (procdata, pid_list, proclist.number);
-+ 	add_session_data (procdata);
- 
- 	selection.restore(procdata->tree);
- 
---- gnome-system-monitor-2.23.5/src/proctable.h	2008-05-24 17:58:27.000000000 -0400
-+++ hacked/src/proctable.h	2008-08-07 13:29:23.000000000 -0400
-@@ -43,6 +43,8 @@
- 	COL_ARGS,
- 	COL_MEM,
- 	COL_WCHAN,
-+	COL_SESSION_STATE,
-+	COL_RESTART_STYLE,
- 	COL_PIXBUF,
- 	COL_POINTER,
- 	COL_TOOLTIP,
---- gnome-system-monitor-2.23.5/src/util.h	2008-07-21 12:18:47.000000000 -0400
-+++ hacked/src/util.h	2008-07-29 23:40:25.000000000 -0400
-@@ -94,6 +94,14 @@
- 			     GtkTreeModel *model, GtkTreeIter *iter,
- 			     gpointer user_data);
- 
-+  void session_state_cell_data_func(GtkTreeViewColumn *col, GtkCellRenderer *renderer,
-+	 			    GtkTreeModel *model, GtkTreeIter *iter,
-+				    gpointer user_data);
++static gboolean ensure_connection            (GsmSessionManager  *manager,
++                                              GError            **error);
++static void     get_all_clients              (GsmSessionManager *manager);
 +
-+  void restart_style_cell_data_func(GtkTreeViewColumn *col, GtkCellRenderer *renderer,
-+	 			      GtkTreeModel *model, GtkTreeIter *iter,
-+				      gpointer user_data);
++enum {
++        PROP_0 = 0,
++        PROP_IS_CONNECTED
++};
 +
-   template<typename T>
-   void poison(T &t, char c)
-   {
---- gnome-system-monitor-2.23.5/src/util.cpp	2008-07-21 12:18:47.000000000 -0400
-+++ hacked/src/util.cpp	2008-08-07 13:36:43.000000000 -0400
-@@ -50,7 +50,81 @@
-   return status;
- }
- 
-+typedef enum {
-+        GSM_CLIENT_RESTART_NEVER = 1,
-+        GSM_CLIENT_RESTART_IF_RUNNING,
-+        GSM_CLIENT_RESTART_ANYWAY,
-+        GSM_CLIENT_RESTART_IMMEDIATELY,
-+} GsmClientRestartStyle;
- 
-+static const char*
-+format_restart_style (guint state)
-+{
-+  const char *status;
++enum {
++	CLIENT_ADDED = 0,
++	CLIENT_REMOVED,
++	LAST_SIGNAL
++};
 +
-+  switch (state)
-+    {
-+    case GSM_CLIENT_RESTART_IF_RUNNING: 
-+      status = NULL;
-+      break;
++static guint signals[LAST_SIGNAL];
 +
-+    case GSM_CLIENT_RESTART_ANYWAY: 
-+      status = GTK_STOCK_PREFERENCES;
-+      break;
++G_DEFINE_TYPE (GsmSessionManager, gsm_session_manager, G_TYPE_OBJECT);
 +
-+    case GSM_CLIENT_RESTART_IMMEDIATELY: 
-+      status = GTK_STOCK_REFRESH;
-+      break;
++static void
++gsm_session_manager_class_init (GsmSessionManagerClass *manager_class)
++{
++	GObjectClass *object_class;
 +
-+    case GSM_CLIENT_RESTART_NEVER:
-+      status = GTK_STOCK_DELETE;
-+      break;
++	object_class = G_OBJECT_CLASS (manager_class);
 +
-+    default:
-+      status = NULL;
-+      break;
-+    }
++	object_class->finalize = gsm_session_manager_finalize;
 +
-+  return status;
-+}
++        gsm_session_manager_class_install_properties (manager_class);
++        gsm_session_manager_class_install_signals (manager_class);
 +
-+typedef enum {
-+        GSM_CLIENT_UNREGISTERED = 0,
-+        GSM_CLIENT_REGISTERED,
-+        GSM_CLIENT_FINISHED,
-+        GSM_CLIENT_FAILED,
-+} GsmClientStatus;
++	g_type_class_add_private (manager_class,
++				  sizeof (GsmSessionManagerPrivate));
++}
 +
-+static const char*
-+format_session_state (guint state)
++static void
++gsm_session_manager_class_install_signals (GsmSessionManagerClass *manager_class)
 +{
-+  const char *status;
-+
-+  switch (state)
-+    {
-+    case GSM_CLIENT_UNREGISTERED:
-+      status = NULL;
-+      break;
++        GObjectClass *object_class;
 +
-+    case GSM_CLIENT_REGISTERED:
-+      status = GTK_STOCK_EXECUTE;
-+      break;
-+
-+    case GSM_CLIENT_FINISHED:
-+      status = GTK_STOCK_QUIT;
-+      break;
-+
-+    case GSM_CLIENT_FAILED:
-+      status = GTK_STOCK_HELP;
-+      break;
-+
-+    default:
-+      status = NULL;
-+      break;
-+    }
-+
-+  return status;
-+}
- 
- static char *
- mnemonic_safe_process_name(const char *process_name)
-@@ -441,6 +515,58 @@
-     g_object_set(renderer, "text", str, NULL);
-   }
- 
-+  void restart_style_cell_data_func(GtkTreeViewColumn *, GtkCellRenderer *renderer,
-+	 		 	    GtkTreeModel *model, GtkTreeIter *iter,
-+				    gpointer user_data)
-+  {
-+    const guint index = GPOINTER_TO_UINT(user_data);
-+
-+    guint state;
-+    GValue value = { 0 };
-+
-+    gtk_tree_model_get_value(model, iter, index, &value);
-+
-+    switch (G_VALUE_TYPE(&value)) {
-+    case G_TYPE_UINT:
-+      state = g_value_get_uint(&value);
-+      break;
-+
-+    default:
-+      g_assert_not_reached();
-+    }
-+
-+    g_value_unset(&value);
-+
-+    const char *str = format_restart_style(state);
-+    g_object_set(renderer, "icon-name", str, NULL);
-+  }
-+
-+  void session_state_cell_data_func(GtkTreeViewColumn *, GtkCellRenderer *renderer,
-+	 		 	    GtkTreeModel *model, GtkTreeIter *iter,
-+				    gpointer user_data)
-+  {
-+    const guint index = GPOINTER_TO_UINT(user_data);
-+
-+    guint state;
-+    GValue value = { 0 };
-+
-+    gtk_tree_model_get_value(model, iter, index, &value);
-+
-+    switch (G_VALUE_TYPE(&value)) {
-+    case G_TYPE_UINT:
-+      state = g_value_get_uint(&value);
-+      break;
-+
-+    default:
-+      g_assert_not_reached();
-+    }
-+
-+    g_value_unset(&value);
-+
-+    const char *str = format_session_state(state);
-+    g_object_set(renderer, "icon-name", str, NULL);
-+  }
-+
- 
-   template<>
-   void tree_store_update<const char>(GtkTreeModel* model, GtkTreeIter* iter, int column, const char* new_value)
---- /dev/null	2008-08-07 10:02:05.591005357 -0400
-+++ hacked/src/gsm-session-manager.h	2008-08-07 14:18:33.000000000 -0400
-@@ -0,0 +1,76 @@
-+/* gsm-session-manager.h - functions for monitoring the session
-+ *
-+ * Copyright (C) 2008 Red Hat, Inc
-+ * Author: Matthias Clasen
-+ *
-+ * 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, 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.  
-+ */
-+#ifndef GSM_SESSION_MANAGER_H
-+#define GSM_SESSION_MANAGER_H
-+
-+#include <glib-object.h>
-+
-+G_BEGIN_DECLS
-+
-+#define GSM_TYPE_SESSION_MANAGER		(gsm_session_manager_get_type ())
-+#define GSM_SESSION_MANAGER(obj)		(G_TYPE_CHECK_INSTANCE_CAST ((obj), GSM_TYPE_SESSION_MANAGER, GsmSessionManager))
-+#define GSM_SESSION_MANAGER_CLASS(klass)	(G_TYPE_CHECK_CLASS_CAST ((klass), GSM_TYPE_SESSION_MANAGER, GsmSessionManagerClass))
-+#define GSM_IS_SESSION_MANAGER(obj)		(G_TYPE_CHECK_INSTANCE_TYPE ((obj), GSM_TYPE_SESSION_MANAGER))
-+#define GSM_IS_SESSION_MANAGER_CLASS(klass)	(G_TYPE_CHECK_CLASS_TYPE ((klass), GSM_TYPE_SESSION_MANAGER))
-+#define GSM_SESSION_MANAGER_GET_CLASS(obj)	(G_TYPE_INSTANCE_GET_CLASS((obj), GSM_TYPE_SESSION_MANAGER, GsmSessionManagerClass))
-+
-+typedef struct _GsmSessionManager		GsmSessionManager;
-+typedef struct _GsmSessionManagerClass		GsmSessionManagerClass;
-+typedef struct _GsmSessionManagerPrivate	GsmSessionManagerPrivate;
-+
-+struct _GsmSessionManager {
-+	GObject parent_instance;
-+
-+	GsmSessionManagerPrivate *priv;
-+};
-+
-+struct _GsmSessionManagerClass {
-+	GObjectClass parent_class;
-+
-+	/* signals */
-+	void (* client_added) (GsmSessionManager *manager, 
-+			       const char        *obj_path);
-+	void (*client_removed) (GsmSessionManager *manager,
-+				const char        *obj_path);
-+};
-+
-+typedef void (*GsmClientDetailsCallback) (const char *obj_path,
-+                                          guint       pid,
-+                                          guint       status,
-+                                          guint       restart_style_hint,
-+                                          gpointer    data);
-+
-+GType gsm_session_manager_get_type (void);
-+
-+GsmSessionManager *gsm_session_manager_new (void) G_GNUC_MALLOC;
-+GsmSessionManager *gsm_session_manager_get (void);
-+void               gsm_session_manager_foreach (GsmSessionManager        *manager,
-+                                                GsmClientDetailsCallback  callbac,
-+                                                gpointer                  data);
-+gboolean	   gsm_session_manager_get_details (GsmSessionManager    *manager,
-+						    const char           *obj_path,
-+						    guint                *pid,
-+						    guint		 *status,
-+						    guint		 *restart_style);
-+
-+G_END_DECLS
-+
-+#endif /* GSM_SESSION_MANAGER_H */
---- /dev/null	2008-08-07 10:02:05.591005357 -0400
-+++ hacked/src/gsm-session-manager.c	2008-08-07 14:37:00.000000000 -0400
-@@ -0,0 +1,528 @@
-+/* gsm-session-manager.h - functions for monitoring the session
-+ *
-+ * Copyright (C) 2008 Red Hat, Inc
-+ * Author: Matthias Clasen
-+ *
-+ * 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, 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.  
-+ */
-+
-+#include <dbus/dbus-glib.h>
-+#include <gsm-session-manager.h>
-+#include <string.h>
-+
-+struct _GsmSessionManagerPrivate
-+{
-+	DBusGConnection  *dbus_connection;
-+        DBusGProxy       *bus_proxy;
-+        DBusGProxy       *sm_proxy;
-+	guint		  is_connected :1;
-+
-+	GHashTable	 *clients;
-+};
-+
-+static void gsm_session_manager_finalize                 (GObject *object);
-+static void gsm_session_manager_class_install_signals    (GsmSessionManagerClass *manager_class);
-+
-+static void gsm_session_manager_class_install_properties (GsmSessionManagerClass *manager_class);
-+
-+static void gsm_session_manager_get_property (GObject    *object,
-+                                              guint       prop_id,
-+                                              GValue     *value,
-+                                              GParamSpec *pspec);
-+
-+static gboolean ensure_connection            (GsmSessionManager  *manager,
-+                                              GError            **error);
-+static void     get_all_clients              (GsmSessionManager *manager);
-+
-+enum {
-+        PROP_0 = 0,
-+        PROP_IS_CONNECTED
-+};
-+
-+enum {
-+	CLIENT_ADDED = 0,
-+	CLIENT_REMOVED,
-+	LAST_SIGNAL
-+};
-+
-+static guint signals[LAST_SIGNAL];
-+
-+G_DEFINE_TYPE (GsmSessionManager, gsm_session_manager, G_TYPE_OBJECT);
-+
-+static void
-+gsm_session_manager_class_init (GsmSessionManagerClass *manager_class)
-+{
-+	GObjectClass *object_class;
-+
-+	object_class = G_OBJECT_CLASS (manager_class);
-+
-+	object_class->finalize = gsm_session_manager_finalize;
-+
-+        gsm_session_manager_class_install_properties (manager_class);
-+        gsm_session_manager_class_install_signals (manager_class);
-+
-+	g_type_class_add_private (manager_class,
-+				  sizeof (GsmSessionManagerPrivate));
-+}
-+
-+static void
-+gsm_session_manager_class_install_signals (GsmSessionManagerClass *manager_class)
-+{
-+        GObjectClass *object_class;
-+
-+        object_class = G_OBJECT_CLASS (manager_class);
++        object_class = G_OBJECT_CLASS (manager_class);
 +
 +	signals[CLIENT_ADDED] =
 +		g_signal_new ("client-added",
@@ -765,164 +381,554 @@
 +					     G_CALLBACK (on_client_added), 
 +					     manager, NULL);
 +
-+        	dbus_g_proxy_add_signal (manager->priv->sm_proxy, 
-+					 "ClientRemoved", 
-+					 DBUS_TYPE_G_OBJECT_PATH, 
-+					 G_TYPE_INVALID);
-+		dbus_g_proxy_connect_signal (manager->priv->sm_proxy, 
-+					     "ClientRemoved", 
-+					     G_CALLBACK (on_client_removed), 
-+					     manager, NULL);
-+        }
++        	dbus_g_proxy_add_signal (manager->priv->sm_proxy, 
++					 "ClientRemoved", 
++					 DBUS_TYPE_G_OBJECT_PATH, 
++					 G_TYPE_INVALID);
++		dbus_g_proxy_connect_signal (manager->priv->sm_proxy, 
++					     "ClientRemoved", 
++					     G_CALLBACK (on_client_removed), 
++					     manager, NULL);
++        }
++
++        is_connected = TRUE;
++
++ out:
++        if (manager->priv->is_connected != is_connected) {
++                manager->priv->is_connected = is_connected;
++                g_object_notify (G_OBJECT (manager), "is-connected");
++        }
++
++        if (!is_connected) {
++                if (manager->priv->dbus_connection == NULL) {
++                        if (manager->priv->bus_proxy != NULL) {
++                                g_object_unref (manager->priv->bus_proxy);
++                                manager->priv->bus_proxy = NULL;
++                        }
++
++                        if (manager->priv->sm_proxy != NULL) {
++                                g_object_unref (manager->priv->sm_proxy);
++                                manager->priv->sm_proxy = NULL;
++                        }
++                } else if (manager->priv->bus_proxy == NULL) {
++                        if (manager->priv->sm_proxy != NULL) {
++                                g_object_unref (manager->priv->sm_proxy);
++                                manager->priv->sm_proxy = NULL;
++                        }
++                }
++        }
++
++        return is_connected;
++}
++
++
++static void
++gsm_session_manager_init (GsmSessionManager *manager)
++{
++	GError *error;
++
++	manager->priv = G_TYPE_INSTANCE_GET_PRIVATE (manager, GSM_TYPE_SESSION_MANAGER,
++		 				     GsmSessionManagerPrivate);
++
++	manager->priv->dbus_connection = NULL;
++	manager->priv->bus_proxy = NULL;
++	manager->priv->sm_proxy = NULL;
++	manager->priv->is_connected = FALSE;
++
++	manager->priv->clients = g_hash_table_new_full (g_str_hash, g_str_equal,
++							g_free, g_free);
++	error = NULL;
++
++        if (ensure_connection (manager, &error)) {
++		get_all_clients (manager);
++	}
++	else {
++                g_message ("Could not connect to session manager: %s",
++                           error->message);
++                g_error_free (error);
++        }
++}
++
++static void
++gsm_session_manager_finalize (GObject *object)
++{
++        GsmSessionManager *manager;
++        GObjectClass      *parent_class;
++
++        manager = GSM_SESSION_MANAGER (object);
++
++	g_hash_table_destroy (manager->priv->clients);
++
++        parent_class = G_OBJECT_CLASS (gsm_session_manager_parent_class);
++
++        if (parent_class->finalize != NULL) {
++                parent_class->finalize (object);
++        }
++}
++
++static void
++gsm_session_manager_get_property (GObject    *object,
++                                  guint       prop_id,
++                                  GValue     *value,
++                                  GParamSpec *pspec)
++{
++        GsmSessionManager *manager = GSM_SESSION_MANAGER (object);
++
++        switch (prop_id) {
++        case PROP_IS_CONNECTED:
++                g_value_set_boolean (value,
++                                     manager->priv->is_connected);
++                break;
++
++        default:
++                G_OBJECT_WARN_INVALID_PROPERTY_ID (object,
++                                                   prop_id,
++                                                   pspec);
++        }
++}
++
++GsmSessionManager *
++gsm_session_manager_new (void)
++{
++        GsmSessionManager *manager;
++
++        manager = g_object_new (GSM_TYPE_SESSION_MANAGER, NULL);
++
++        return manager;
++}
++
++GsmSessionManager *
++gsm_session_manager_get (void)
++{
++        static GsmSessionManager *manager = NULL;
++
++        if (manager == NULL) {
++                manager = gsm_session_manager_new ();
++        }
++
++        return g_object_ref (manager);
++}
++
++gboolean
++gsm_session_manager_get_details (GsmSessionManager *manager,
++				 const char        *obj_path,
++				 guint             *pid,
++				 guint 		   *status,
++				 guint		   *restart_style_hint)
++{
++	ClientDetails *details;
++
++	details = (ClientDetails *)g_hash_table_lookup (manager->priv->clients, obj_path);
++
++	if (details) {
++		*pid = details->pid;
++		*status = details->status;
++		*restart_style_hint = details->restart_style_hint;
++		return TRUE;
++	}
++	
++	return FALSE;
++}
++ 
+diff -up /dev/null gnome-system-monitor-2.23.6/src/gsm-session-manager.h
+--- /dev/null	2008-08-13 11:36:43.974262811 -0400
++++ gnome-system-monitor-2.23.6/src/gsm-session-manager.h	2008-08-13 17:23:15.000000000 -0400
+@@ -0,0 +1,76 @@
++/* gsm-session-manager.h - functions for monitoring the session
++ *
++ * Copyright (C) 2008 Red Hat, Inc
++ * Author: Matthias Clasen
++ *
++ * 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, 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.  
++ */
++#ifndef GSM_SESSION_MANAGER_H
++#define GSM_SESSION_MANAGER_H
++
++#include <glib-object.h>
++
++G_BEGIN_DECLS
++
++#define GSM_TYPE_SESSION_MANAGER		(gsm_session_manager_get_type ())
++#define GSM_SESSION_MANAGER(obj)		(G_TYPE_CHECK_INSTANCE_CAST ((obj), GSM_TYPE_SESSION_MANAGER, GsmSessionManager))
++#define GSM_SESSION_MANAGER_CLASS(klass)	(G_TYPE_CHECK_CLASS_CAST ((klass), GSM_TYPE_SESSION_MANAGER, GsmSessionManagerClass))
++#define GSM_IS_SESSION_MANAGER(obj)		(G_TYPE_CHECK_INSTANCE_TYPE ((obj), GSM_TYPE_SESSION_MANAGER))
++#define GSM_IS_SESSION_MANAGER_CLASS(klass)	(G_TYPE_CHECK_CLASS_TYPE ((klass), GSM_TYPE_SESSION_MANAGER))
++#define GSM_SESSION_MANAGER_GET_CLASS(obj)	(G_TYPE_INSTANCE_GET_CLASS((obj), GSM_TYPE_SESSION_MANAGER, GsmSessionManagerClass))
++
++typedef struct _GsmSessionManager		GsmSessionManager;
++typedef struct _GsmSessionManagerClass		GsmSessionManagerClass;
++typedef struct _GsmSessionManagerPrivate	GsmSessionManagerPrivate;
++
++struct _GsmSessionManager {
++	GObject parent_instance;
++
++	GsmSessionManagerPrivate *priv;
++};
++
++struct _GsmSessionManagerClass {
++	GObjectClass parent_class;
++
++	/* signals */
++	void (* client_added) (GsmSessionManager *manager, 
++			       const char        *obj_path);
++	void (*client_removed) (GsmSessionManager *manager,
++				const char        *obj_path);
++};
++
++typedef void (*GsmClientDetailsCallback) (const char *obj_path,
++                                          guint       pid,
++                                          guint       status,
++                                          guint       restart_style_hint,
++                                          gpointer    data);
++
++GType gsm_session_manager_get_type (void);
++
++GsmSessionManager *gsm_session_manager_new (void) G_GNUC_MALLOC;
++GsmSessionManager *gsm_session_manager_get (void);
++void               gsm_session_manager_foreach (GsmSessionManager        *manager,
++                                                GsmClientDetailsCallback  callbac,
++                                                gpointer                  data);
++gboolean	   gsm_session_manager_get_details (GsmSessionManager    *manager,
++						    const char           *obj_path,
++						    guint                *pid,
++						    guint		 *status,
++						    guint		 *restart_style);
++
++G_END_DECLS
++
++#endif /* GSM_SESSION_MANAGER_H */
+diff -up gnome-system-monitor-2.23.6/src/Makefile.am.session gnome-system-monitor-2.23.6/src/Makefile.am
+--- gnome-system-monitor-2.23.6/src/Makefile.am.session	2008-08-13 17:23:15.000000000 -0400
++++ gnome-system-monitor-2.23.6/src/Makefile.am	2008-08-13 17:24:35.000000000 -0400
+@@ -35,7 +35,8 @@ gnome_system_monitor_SOURCES = \
+ 	gconf-keys.cpp gconf-keys.h \
+ 	iconthemewrapper.cpp iconthemewrapper.h \
+ 	e_date.c e_date.h \
+-        gsm_color_button.c gsm_color_button.h
++        gsm_color_button.c gsm_color_button.h \
++	gsm-session-manager.c gsm-session-manager.h
+ 
+ if HAVE_POLKIT
+ gnome_system_monitor_SOURCES += gnome-system-monitor-mechanism-client-glue.h
+diff -up gnome-system-monitor-2.23.6/src/proctable.cpp.session gnome-system-monitor-2.23.6/src/proctable.cpp
+--- gnome-system-monitor-2.23.6/src/proctable.cpp.session	2008-05-31 14:38:57.000000000 -0400
++++ gnome-system-monitor-2.23.6/src/proctable.cpp	2008-08-13 17:23:15.000000000 -0400
+@@ -51,6 +51,7 @@
+ #include "util.h"
+ #include "interface.h"
+ #include "selinux.h"
++#include "gsm-session-manager.h"
+ 
+ 
+ ProcInfo::UserMap ProcInfo::users;
+@@ -225,6 +226,7 @@ proctable_new (ProcData * const procdata
+ 		N_("Memory"),
+ 		/* xgettext: wchan, see ps(1) or top(1) */
+ 		N_("Waiting Channel"),
++		N_("Session"),
+ 		NULL,
+ 		"POINTER"
+ 	};
+@@ -254,9 +256,12 @@ proctable_new (ProcData * const procdata
+ 				    G_TYPE_STRING,	/* Arguments	*/
+ 				    G_TYPE_ULONG,	/* Memory       */
+ 				    G_TYPE_STRING,	/* wchan	*/
++				    G_TYPE_UINT,        /* Session state */
++				    G_TYPE_UINT,        /* Restart style */
+ 				    GDK_TYPE_PIXBUF,	/* Icon		*/
+ 				    G_TYPE_POINTER,	/* ProcInfo	*/
+ 				    G_TYPE_STRING	/* Sexy tooltip */
++				    
+ 		);
+ 
+ 	proctree = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model));
+@@ -295,7 +300,6 @@ proctable_new (ProcData * const procdata
+ 	gtk_tree_view_append_column (GTK_TREE_VIEW (proctree), column);
+ 	gtk_tree_view_set_expander_column (GTK_TREE_VIEW (proctree), column);
+ 
+-
+ 	for (i = COL_USER; i <= COL_WCHAN; i++) {
+ 
+ 		GtkCellRenderer *cell;
+@@ -385,6 +389,26 @@ proctable_new (ProcData * const procdata
+ 		}
+ 	}
+ 
++	column = gtk_tree_view_column_new();
++	gtk_tree_view_column_set_title(column, _(titles[COL_SESSION_STATE]));
++	gtk_tree_view_column_set_resizable(column, FALSE);
++	gtk_tree_view_column_set_reorderable(column, TRUE);
++	gtk_tree_view_column_set_sort_column_id (column, COL_SESSION_STATE);
++	gtk_tree_view_append_column(GTK_TREE_VIEW(proctree), column);
++	cell_renderer = gtk_cell_renderer_pixbuf_new ();
++	gtk_tree_view_column_pack_start (column, cell_renderer, FALSE);
++	gtk_tree_view_column_set_cell_data_func(column, cell_renderer,
++						&procman::session_state_cell_data_func,
++						GUINT_TO_POINTER(COL_SESSION_STATE),
++						NULL);
++
++	cell_renderer = gtk_cell_renderer_pixbuf_new ();
++	gtk_tree_view_column_pack_start (column, cell_renderer, FALSE);
++	gtk_tree_view_column_set_cell_data_func(column, cell_renderer,
++						&procman::restart_style_cell_data_func,
++						GUINT_TO_POINTER(COL_RESTART_STYLE),
++						NULL);
++
+ 	gtk_container_add (GTK_CONTAINER (scrolled), proctree);
+ 
+ 	procdata->tree = proctree;
+@@ -834,6 +858,59 @@ refresh_list (ProcData *procdata, const 
+ 		update_info_mutable_cols(it->second);
+ }
+ 
++static gboolean
++clear_session_data (GtkTreeModel *model,
++		    GtkTreePath  *path,
++		    GtkTreeIter  *iter,
++		    gpointer      data)
++{
++	gtk_tree_store_set (GTK_TREE_STORE (model),
++			    iter,
++			    COL_SESSION_STATE, 0,
++			    COL_RESTART_STYLE, 0,
++			    -1);
++	
++	return FALSE;
++}
++
++static void
++update_session_data (const char *obj_path, 
++		     guint       pid,
++		     guint       status,
++		     guint	 restart_style_hint,
++		     gpointer    data)
++{
++	GtkTreeModel *model = (GtkTreeModel*)data;
++	GtkTreeIter iter;
++	guint pid2;
++
++	gtk_tree_model_get_iter_first (model, &iter);
++	do {
++		gtk_tree_model_get (model, &iter, COL_PID, &pid2, -1);
++		if (pid == pid2) {
++			gtk_tree_store_set (GTK_TREE_STORE (model),
++					    &iter,
++					    COL_SESSION_STATE, status,
++					    COL_RESTART_STYLE, restart_style_hint + 1,
++					    -1);
++			return;
++		}
++	} while (gtk_tree_model_iter_next (model, &iter));
++}
++
++static void
++add_session_data (ProcData * const procdata)
++{
++	GsmSessionManager *manager;
++	GtkTreeModel *model;
++
++	model = gtk_tree_view_get_model (GTK_TREE_VIEW (procdata->tree));
++	gtk_tree_model_foreach (model, clear_session_data, NULL);
++
++	manager = gsm_session_manager_get ();
++	gsm_session_manager_foreach (manager, update_session_data, model);
++	g_object_unref (manager);
++}
+ 
+ void
+ proctable_update_list (ProcData * const procdata)
+@@ -880,6 +957,7 @@ proctable_update_list (ProcData * const 
+ 	procdata->cpu_total_time_last = cpu.total;
+ 
+ 	refresh_list (procdata, pid_list, proclist.number);
++ 	add_session_data (procdata);
+ 
+ 	selection.restore(procdata->tree);
+ 
+diff -up gnome-system-monitor-2.23.6/src/proctable.h.session gnome-system-monitor-2.23.6/src/proctable.h
+--- gnome-system-monitor-2.23.6/src/proctable.h.session	2008-05-24 17:58:27.000000000 -0400
++++ gnome-system-monitor-2.23.6/src/proctable.h	2008-08-13 17:23:15.000000000 -0400
+@@ -43,6 +43,8 @@ enum
+ 	COL_ARGS,
+ 	COL_MEM,
+ 	COL_WCHAN,
++	COL_SESSION_STATE,
++	COL_RESTART_STYLE,
+ 	COL_PIXBUF,
+ 	COL_POINTER,
+ 	COL_TOOLTIP,
+diff -up gnome-system-monitor-2.23.6/src/util.cpp.session gnome-system-monitor-2.23.6/src/util.cpp
+--- gnome-system-monitor-2.23.6/src/util.cpp.session	2008-07-21 12:18:47.000000000 -0400
++++ gnome-system-monitor-2.23.6/src/util.cpp	2008-08-13 17:23:15.000000000 -0400
+@@ -50,7 +50,81 @@ format_process_state(guint state)
+   return status;
+ }
+ 
++typedef enum {
++        GSM_CLIENT_RESTART_NEVER = 1,
++        GSM_CLIENT_RESTART_IF_RUNNING,
++        GSM_CLIENT_RESTART_ANYWAY,
++        GSM_CLIENT_RESTART_IMMEDIATELY,
++} GsmClientRestartStyle;
+ 
++static const char*
++format_restart_style (guint state)
++{
++  const char *status;
++
++  switch (state)
++    {
++    case GSM_CLIENT_RESTART_IF_RUNNING: 
++      status = NULL;
++      break;
 +
-+        is_connected = TRUE;
++    case GSM_CLIENT_RESTART_ANYWAY: 
++      status = GTK_STOCK_PREFERENCES;
++      break;
 +
-+ out:
-+        if (manager->priv->is_connected != is_connected) {
-+                manager->priv->is_connected = is_connected;
-+                g_object_notify (G_OBJECT (manager), "is-connected");
-+        }
++    case GSM_CLIENT_RESTART_IMMEDIATELY: 
++      status = GTK_STOCK_REFRESH;
++      break;
 +
-+        if (!is_connected) {
-+                if (manager->priv->dbus_connection == NULL) {
-+                        if (manager->priv->bus_proxy != NULL) {
-+                                g_object_unref (manager->priv->bus_proxy);
-+                                manager->priv->bus_proxy = NULL;
-+                        }
++    case GSM_CLIENT_RESTART_NEVER:
++      status = GTK_STOCK_DELETE;
++      break;
 +
-+                        if (manager->priv->sm_proxy != NULL) {
-+                                g_object_unref (manager->priv->sm_proxy);
-+                                manager->priv->sm_proxy = NULL;
-+                        }
-+                } else if (manager->priv->bus_proxy == NULL) {
-+                        if (manager->priv->sm_proxy != NULL) {
-+                                g_object_unref (manager->priv->sm_proxy);
-+                                manager->priv->sm_proxy = NULL;
-+                        }
-+                }
-+        }
++    default:
++      status = NULL;
++      break;
++    }
 +
-+        return is_connected;
++  return status;
 +}
 +
++typedef enum {
++        GSM_CLIENT_UNREGISTERED = 0,
++        GSM_CLIENT_REGISTERED,
++        GSM_CLIENT_FINISHED,
++        GSM_CLIENT_FAILED,
++} GsmClientStatus;
 +
-+static void
-+gsm_session_manager_init (GsmSessionManager *manager)
++static const char*
++format_session_state (guint state)
 +{
-+	GError *error;
-+
-+	manager->priv = G_TYPE_INSTANCE_GET_PRIVATE (manager, GSM_TYPE_SESSION_MANAGER,
-+		 				     GsmSessionManagerPrivate);
++  const char *status;
 +
-+	manager->priv->dbus_connection = NULL;
-+	manager->priv->bus_proxy = NULL;
-+	manager->priv->sm_proxy = NULL;
-+	manager->priv->is_connected = FALSE;
++  switch (state)
++    {
++    case GSM_CLIENT_UNREGISTERED:
++      status = NULL;
++      break;
 +
-+	manager->priv->clients = g_hash_table_new_full (g_str_hash, g_str_equal,
-+							g_free, g_free);
-+	error = NULL;
++    case GSM_CLIENT_REGISTERED:
++      status = GTK_STOCK_EXECUTE;
++      break;
 +
-+        if (ensure_connection (manager, &error)) {
-+		get_all_clients (manager);
-+	}
-+	else {
-+                g_message ("Could not connect to session manager: %s",
-+                           error->message);
-+                g_error_free (error);
-+        }
-+}
++    case GSM_CLIENT_FINISHED:
++      status = GTK_STOCK_QUIT;
++      break;
 +
-+static void
-+gsm_session_manager_finalize (GObject *object)
-+{
-+        GsmSessionManager *manager;
-+        GObjectClass      *parent_class;
++    case GSM_CLIENT_FAILED:
++      status = GTK_STOCK_HELP;
++      break;
 +
-+        manager = GSM_SESSION_MANAGER (object);
++    default:
++      status = NULL;
++      break;
++    }
 +
-+	g_hash_table_destroy (manager->priv->clients);
++  return status;
++}
+ 
+ static char *
+ mnemonic_safe_process_name(const char *process_name)
+@@ -441,6 +515,58 @@ namespace procman
+     g_object_set(renderer, "text", str, NULL);
+   }
+ 
++  void restart_style_cell_data_func(GtkTreeViewColumn *, GtkCellRenderer *renderer,
++	 		 	    GtkTreeModel *model, GtkTreeIter *iter,
++				    gpointer user_data)
++  {
++    const guint index = GPOINTER_TO_UINT(user_data);
 +
-+        parent_class = G_OBJECT_CLASS (gsm_session_manager_parent_class);
++    guint state;
++    GValue value = { 0 };
 +
-+        if (parent_class->finalize != NULL) {
-+                parent_class->finalize (object);
-+        }
-+}
++    gtk_tree_model_get_value(model, iter, index, &value);
 +
-+static void
-+gsm_session_manager_get_property (GObject    *object,
-+                                  guint       prop_id,
-+                                  GValue     *value,
-+                                  GParamSpec *pspec)
-+{
-+        GsmSessionManager *manager = GSM_SESSION_MANAGER (object);
++    switch (G_VALUE_TYPE(&value)) {
++    case G_TYPE_UINT:
++      state = g_value_get_uint(&value);
++      break;
 +
-+        switch (prop_id) {
-+        case PROP_IS_CONNECTED:
-+                g_value_set_boolean (value,
-+                                     manager->priv->is_connected);
-+                break;
++    default:
++      g_assert_not_reached();
++    }
 +
-+        default:
-+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object,
-+                                                   prop_id,
-+                                                   pspec);
-+        }
-+}
++    g_value_unset(&value);
 +
-+GsmSessionManager *
-+gsm_session_manager_new (void)
-+{
-+        GsmSessionManager *manager;
++    const char *str = format_restart_style(state);
++    g_object_set(renderer, "icon-name", str, NULL);
++  }
 +
-+        manager = g_object_new (GSM_TYPE_SESSION_MANAGER, NULL);
++  void session_state_cell_data_func(GtkTreeViewColumn *, GtkCellRenderer *renderer,
++	 		 	    GtkTreeModel *model, GtkTreeIter *iter,
++				    gpointer user_data)
++  {
++    const guint index = GPOINTER_TO_UINT(user_data);
 +
-+        return manager;
-+}
++    guint state;
++    GValue value = { 0 };
 +
-+GsmSessionManager *
-+gsm_session_manager_get (void)
-+{
-+        static GsmSessionManager *manager = NULL;
++    gtk_tree_model_get_value(model, iter, index, &value);
 +
-+        if (manager == NULL) {
-+                manager = gsm_session_manager_new ();
-+        }
++    switch (G_VALUE_TYPE(&value)) {
++    case G_TYPE_UINT:
++      state = g_value_get_uint(&value);
++      break;
 +
-+        return g_object_ref (manager);
-+}
++    default:
++      g_assert_not_reached();
++    }
 +
-+gboolean
-+gsm_session_manager_get_details (GsmSessionManager *manager,
-+				 const char        *obj_path,
-+				 guint             *pid,
-+				 guint 		   *status,
-+				 guint		   *restart_style_hint)
-+{
-+	ClientDetails *details;
++    g_value_unset(&value);
 +
-+	details = (ClientDetails *)g_hash_table_lookup (manager->priv->clients, obj_path);
++    const char *str = format_session_state(state);
++    g_object_set(renderer, "icon-name", str, NULL);
++  }
 +
-+	if (details) {
-+		*pid = details->pid;
-+		*status = details->status;
-+		*restart_style_hint = details->restart_style_hint;
-+		return TRUE;
-+	}
-+	
-+	return FALSE;
-+}
-+ 
---- gnome-system-monitor-2.23.5/src/Makefile.am	2008-03-18 17:37:00.000000000 -0400
-+++ hacked/src/Makefile.am	2008-08-07 14:41:21.000000000 -0400
-@@ -33,7 +33,8 @@
- 	gconf-keys.cpp gconf-keys.h \
- 	iconthemewrapper.cpp iconthemewrapper.h \
- 	e_date.c e_date.h \
--        gsm_color_button.c gsm_color_button.h
-+        gsm_color_button.c gsm_color_button.h \
-+	gsm-session-manager.c gsm-session-manager.h
  
+   template<>
+   void tree_store_update<const char>(GtkTreeModel* model, GtkTreeIter* iter, int column, const char* new_value)
+diff -up gnome-system-monitor-2.23.6/src/util.h.session gnome-system-monitor-2.23.6/src/util.h
+--- gnome-system-monitor-2.23.6/src/util.h.session	2008-07-21 12:18:47.000000000 -0400
++++ gnome-system-monitor-2.23.6/src/util.h	2008-08-13 17:23:15.000000000 -0400
+@@ -94,6 +94,14 @@ namespace procman
+ 			     GtkTreeModel *model, GtkTreeIter *iter,
+ 			     gpointer user_data);
  
- gnome_system_monitor_LDADD = @PROCMAN_LIBS@ libbacon.la
++  void session_state_cell_data_func(GtkTreeViewColumn *col, GtkCellRenderer *renderer,
++	 			    GtkTreeModel *model, GtkTreeIter *iter,
++				    gpointer user_data);
++
++  void restart_style_cell_data_func(GtkTreeViewColumn *col, GtkCellRenderer *renderer,
++	 			      GtkTreeModel *model, GtkTreeIter *iter,
++				      gpointer user_data);
++
+   template<typename T>
+   void poison(T &t, char c)
+   {




More information about the fedora-extras-commits mailing list