[gdm: 4/70] Hook into gnome-session presence support.
- From: Ray Strode <halfline src gnome org>
- To: svn-commits-list gnome org
- Subject: [gdm: 4/70] Hook into gnome-session presence support.
- Date: Tue, 31 Mar 2009 14:51:06 -0400 (EDT)
commit 88a63d4fc7a521de9dd3701ad0ca9376e9356b21
Author: William Jon McCann <jmccann redhat com>
Date: Mon Jan 12 02:38:35 2009 +0000
Hook into gnome-session presence support.
2009-01-11 William Jon McCann <jmccann redhat com>
* gui/user-switch-applet/applet.c (gdm_applet_data_free),
(set_status), (on_status_available_activate),
(on_status_busy_activate), (on_status_invisible_activate),
(save_status_text), (on_user_item_deselect), (create_sub_menu),
(on_presence_status_changed), (on_presence_status_text_changed),
(fill_applet):
* gui/user-switch-applet/gdm-entry-menu-item.c
(gdm_entry_menu_item_init):
Hook into gnome-session presence support.
svn path=/trunk/; revision=6659
---
ChangeLog | 12 ++
gui/user-switch-applet/applet.c | 183 +++++++++++++++++++++++---
gui/user-switch-applet/gdm-entry-menu-item.c | 2 +-
3 files changed, 179 insertions(+), 18 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 872e9af..3894bd0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2009-01-11 William Jon McCann <jmccann redhat com>
+
+ * gui/user-switch-applet/applet.c (gdm_applet_data_free),
+ (set_status), (on_status_available_activate),
+ (on_status_busy_activate), (on_status_invisible_activate),
+ (save_status_text), (on_user_item_deselect), (create_sub_menu),
+ (on_presence_status_changed), (on_presence_status_text_changed),
+ (fill_applet):
+ * gui/user-switch-applet/gdm-entry-menu-item.c
+ (gdm_entry_menu_item_init):
+ Hook into gnome-session presence support.
+
2008-12-27 Luca Ferretti,,, <luca redrum>
* docs/gdm.omf.in: Added ODF file for documentation.
diff --git a/gui/user-switch-applet/applet.c b/gui/user-switch-applet/applet.c
index a234a5f..d129f80 100644
--- a/gui/user-switch-applet/applet.c
+++ b/gui/user-switch-applet/applet.c
@@ -21,6 +21,8 @@
#include "config.h"
#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
#include <glib/gi18n.h>
#include <gdk/gdkkeysyms.h>
@@ -30,6 +32,7 @@
#include <gconf/gconf-client.h>
#include <glade/glade-xml.h>
+#include <dbus/dbus-glib.h>
#include <bonobo/bonobo-main.h>
#include <bonobo/bonobo-ui-util.h>
@@ -45,12 +48,12 @@
#define LOCKDOWN_DIR "/desktop/gnome/lockdown"
#define LOCKDOWN_KEY LOCKDOWN_DIR "/disable_user_switching"
-enum {
- GDM_USER_STATUS_AVAILABLE,
- GDM_USER_STATUS_BUSY,
- GDM_USER_STATUS_INVISIBLE,
- GDM_USER_STATUS_AWAY,
-};
+typedef enum {
+ GSM_PRESENCE_STATUS_AVAILABLE = 0,
+ GSM_PRESENCE_STATUS_INVISIBLE,
+ GSM_PRESENCE_STATUS_BUSY,
+ GSM_PRESENCE_STATUS_IDLE,
+} GsmPresenceStatus;
typedef struct _GdmAppletData
{
@@ -80,6 +83,7 @@ typedef struct _GdmAppletData
gint8 pixel_size;
gint panel_size;
GtkIconSize icon_size;
+ DBusGProxy *presence_proxy;
} GdmAppletData;
typedef struct _SelectorResponseData
@@ -476,6 +480,10 @@ gdm_applet_data_free (GdmAppletData *adata)
g_signal_handler_disconnect (adata->user, adata->user_notify_id);
g_signal_handler_disconnect (adata->user, adata->user_icon_changed_id);
+ if (adata->presence_proxy) {
+ g_object_unref (adata->presence_proxy);
+ }
+
if (adata->user != NULL) {
g_object_unref (adata->user);
}
@@ -893,7 +901,25 @@ static void
set_status (GdmAppletData *adata,
guint status)
{
- adata->current_status = status;
+ if (adata->current_status != status) {
+ GError *error;
+
+ adata->current_status = status;
+
+ error = NULL;
+ dbus_g_proxy_call (adata->presence_proxy,
+ "SetStatus",
+ &error,
+ G_TYPE_UINT, status,
+ G_TYPE_INVALID,
+ G_TYPE_INVALID);
+
+ if (error != NULL) {
+ g_warning ("Couldn't set presence status: %s", error->message);
+ g_error_free (error);
+ }
+ }
+
update_label (adata);
}
@@ -901,32 +927,33 @@ static void
on_status_available_activate (GtkWidget *widget,
GdmAppletData *adata)
{
- set_status (adata, GDM_USER_STATUS_AVAILABLE);
+ set_status (adata, GSM_PRESENCE_STATUS_AVAILABLE);
}
static void
on_status_busy_activate (GtkWidget *widget,
GdmAppletData *adata)
{
- set_status (adata, GDM_USER_STATUS_BUSY);
+ set_status (adata, GSM_PRESENCE_STATUS_BUSY);
}
static void
on_status_invisible_activate (GtkWidget *widget,
GdmAppletData *adata)
{
- set_status (adata, GDM_USER_STATUS_INVISIBLE);
+ set_status (adata, GSM_PRESENCE_STATUS_INVISIBLE);
}
static struct {
- char *icon_name;
- char *display_name;
- void *menu_callback;
+ char *icon_name;
+ char *display_name;
+ void *menu_callback;
+ GtkWidget *widget;
} statuses[] = {
- { "user-online", N_("Available"), on_status_available_activate },
- { "user-busy", N_("Busy"), on_status_busy_activate },
- { "user-invisible", N_("Invisible"), on_status_invisible_activate },
- { "user-away", N_("Away"), NULL },
+ { "user-online", N_("Available"), on_status_available_activate, NULL },
+ { "user-invisible", N_("Invisible"), on_status_invisible_activate, NULL },
+ { "user-busy", N_("Busy"), on_status_busy_activate, NULL },
+ { "user-away", N_("Away"), NULL, NULL },
};
static void
@@ -945,6 +972,49 @@ update_label (GdmAppletData *adata)
}
static void
+save_status_text (GdmAppletData *adata)
+{
+ GtkWidget *entry;
+ GtkTextBuffer *buffer;
+ char *escaped_text;
+ char *text;
+ GtkTextIter start, end;
+
+ entry = gdm_entry_menu_item_get_entry (GDM_ENTRY_MENU_ITEM (adata->user_item));
+ buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (entry));
+ gtk_text_buffer_get_bounds (buffer, &start, &end);
+ text = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
+ escaped_text = g_markup_escape_text (text, -1);
+
+ if (escaped_text != NULL) {
+ GError *error;
+
+ error = NULL;
+ dbus_g_proxy_call (adata->presence_proxy,
+ "SetStatusText",
+ &error,
+ G_TYPE_STRING, escaped_text,
+ G_TYPE_INVALID,
+ G_TYPE_INVALID);
+
+ if (error != NULL) {
+ g_warning ("Couldn't set presence status text: %s", error->message);
+ g_error_free (error);
+ }
+ }
+
+ g_free (text);
+ g_free (escaped_text);
+}
+
+static void
+on_user_item_deselect (GtkWidget *item,
+ GdmAppletData *adata)
+{
+ save_status_text (adata);
+}
+
+static void
create_sub_menu (GdmAppletData *adata)
{
GtkWidget *item;
@@ -982,6 +1052,10 @@ create_sub_menu (GdmAppletData *adata)
gtk_widget_show (adata->user_item);
g_signal_connect (adata->user_item, "activate",
G_CALLBACK (on_user_item_activate), adata);
+ g_signal_connect (adata->user_item,
+ "deselect",
+ G_CALLBACK (on_user_item_deselect),
+ adata);
item = gtk_separator_menu_item_new ();
gtk_menu_shell_append (GTK_MENU_SHELL (adata->menu), item);
@@ -1017,6 +1091,8 @@ create_sub_menu (GdmAppletData *adata)
g_signal_connect (item, "activate",
G_CALLBACK (statuses[i].menu_callback), adata);
gtk_widget_show (item);
+
+ statuses[i].widget = item;
}
item = gtk_separator_menu_item_new ();
@@ -1202,6 +1278,42 @@ setup_current_user (GdmAppletData *adata)
}
}
+static void
+on_presence_status_changed (DBusGProxy *presence_proxy,
+ guint status,
+ GdmAppletData *adata)
+{
+ int i;
+
+ g_debug ("Status changed: %u", status);
+
+ adata->current_status = status;
+ for (i = 0; i < G_N_ELEMENTS (statuses); i++) {
+ if (statuses[i].widget == NULL) {
+ continue;
+ }
+ gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (statuses[i].widget),
+ (i == status));
+ }
+
+ update_label (adata);
+}
+
+static void
+on_presence_status_text_changed (DBusGProxy *presence_proxy,
+ const char *status_text,
+ GdmAppletData *adata)
+{
+ GtkWidget *entry;
+ GtkTextBuffer *buffer;
+
+ g_debug ("Status text changed: %s", status_text);
+
+ entry = gdm_entry_menu_item_get_entry (GDM_ENTRY_MENU_ITEM (adata->user_item));
+ buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (entry));
+ gtk_text_buffer_set_text (buffer, status_text, -1);
+}
+
static gboolean
fill_applet (PanelApplet *applet)
{
@@ -1215,6 +1327,8 @@ fill_applet (PanelApplet *applet)
char *tmp;
BonoboUIComponent *popup_component;
GdmAppletData *adata;
+ GError *error;
+ DBusGConnection *bus;
if (!first_time) {
first_time = TRUE;
@@ -1339,6 +1453,41 @@ fill_applet (PanelApplet *applet)
set_menu_visibility (adata, TRUE);
}
+ error = NULL;
+ bus = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
+ if (bus == NULL) {
+ g_warning ("Unable to get session bus: %s", error->message);
+ g_error_free (error);
+ goto done;
+ }
+
+ adata->presence_proxy = dbus_g_proxy_new_for_name (bus,
+ "org.gnome.SessionManager",
+ "/org/gnome/SessionManager/Presence",
+ "org.gnome.SessionManager.Presence");
+ if (adata->presence_proxy) {
+ dbus_g_proxy_add_signal (adata->presence_proxy,
+ "StatusChanged",
+ G_TYPE_UINT,
+ G_TYPE_INVALID);
+ dbus_g_proxy_connect_signal (adata->presence_proxy,
+ "StatusChanged",
+ G_CALLBACK (on_presence_status_changed),
+ adata,
+ NULL);
+ dbus_g_proxy_add_signal (adata->presence_proxy,
+ "StatusTextChanged",
+ G_TYPE_STRING,
+ G_TYPE_INVALID);
+ dbus_g_proxy_connect_signal (adata->presence_proxy,
+ "StatusTextChanged",
+ G_CALLBACK (on_presence_status_text_changed),
+ adata,
+ NULL);
+ } else {
+ g_warning ("Failed to get session presence proxy");
+ }
+ done:
gtk_widget_show (GTK_WIDGET (adata->applet));
return TRUE;
diff --git a/gui/user-switch-applet/gdm-entry-menu-item.c b/gui/user-switch-applet/gdm-entry-menu-item.c
index 9a320b2..ae258e2 100644
--- a/gui/user-switch-applet/gdm-entry-menu-item.c
+++ b/gui/user-switch-applet/gdm-entry-menu-item.c
@@ -258,7 +258,7 @@ gdm_entry_menu_item_init (GdmEntryMenuItem *item)
item);
buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (item->entry));
- gtk_text_buffer_set_text (buffer, _("Status"), 0);
+ gtk_text_buffer_set_text (buffer, _("Status"), -1);
g_signal_connect (buffer,
"changed",
G_CALLBACK (on_text_buffer_changed),
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]