From a36493af4afb4e46d307291c896faf6409c94019 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 8 Jun 2009 14:20:47 -0500 Subject: Adding in new deps and a version bump --- configure.ac | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index ec22ca2..84df5c8 100644 --- a/configure.ac +++ b/configure.ac @@ -4,7 +4,7 @@ AC_INIT(src/indicator-fusa.c) AC_PREREQ(2.53) AM_CONFIG_HEADER(config.h) -AM_INIT_AUTOMAKE(indicator-fusa, 0.1) +AM_INIT_AUTOMAKE(indicator-fusa, 0.1dev) AM_MAINTAINER_MODE @@ -22,9 +22,12 @@ AC_CONFIG_MACRO_DIR([m4]) ########################### GTK_REQUIRED_VERSION=2.12 -PANEL_REQUIRED_VERSION=2.0.0 +INDICATOR_REQUIRED_VERSION=0.2.0 +DBUSMENUGTK_REQUIRED_VERSION=0.0.0 -PKG_CHECK_MODULES(APPLET, gtk+-2.0 >= $GTK_REQUIRED_VERSION) +PKG_CHECK_MODULES(APPLET, gtk+-2.0 >= $GTK_REQUIRED_VERSION + indicator >= $INDICATOR_REQUIRED_VERSION + dbusmenu-gtk >= $DBUSMENUGTK_REQUIRED_VERSION) AC_SUBST(APPLET_CFLAGS) AC_SUBST(APPLET_LIBS) -- cgit v1.2.3 From 95ed5305c6ea74655085c70b413de68391226a1b Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 8 Jun 2009 14:37:40 -0500 Subject: Changing the build stuff for ye ol' fusa indicator --- src/dbus-shared-names.h | 3 +++ src/indicator-fusa.c | 54 +++++++++++++++++++++++++++++++++++-------------- 2 files changed, 42 insertions(+), 15 deletions(-) create mode 100644 src/dbus-shared-names.h diff --git a/src/dbus-shared-names.h b/src/dbus-shared-names.h new file mode 100644 index 0000000..35839a4 --- /dev/null +++ b/src/dbus-shared-names.h @@ -0,0 +1,3 @@ + +#define INDICATOR_FUSA_DBUS_NAME "org.indicators.fusa" +#define INDICATOR_FUSA_DBUS_OBJECT "/org/fusa" diff --git a/src/indicator-fusa.c b/src/indicator-fusa.c index 21c0817..8815fb5 100644 --- a/src/indicator-fusa.c +++ b/src/indicator-fusa.c @@ -1,26 +1,50 @@ #include +#include -GtkWidget * -get_menu_item (void) +#include +#include + +#include +INDICATOR_SET_VERSION +INDICATOR_SET_NAME("users-status-shutdown") + +#include "dbus-shared-names.h" + +GtkLabel * +get_label (void) { - GtkWidget * mainmenu = gtk_menu_item_new(); + GtkLabel * returnval = gtk_label_new("Ted Gould"); + return returnval; +} - GtkWidget * hbox = gtk_hbox_new(FALSE, 3); +GtkImage * +get_icon (void) +{ + return NULL; +} + +GtkMenu * +get_menu (void) +{ + guint returnval = 0; + GError * error = NULL; - GtkWidget * label = gtk_label_new("Ted Gould"); - gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 3); - gtk_widget_show(label); + DBusGConnection * connection = dbus_g_bus_get(DBUS_BUS_SESSION, NULL); + DBusGProxy * proxy = dbus_g_proxy_new_for_name(connection, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS); - GtkWidget * icon = gtk_image_new_from_icon_name("gnome-logout", - GTK_ICON_SIZE_MENU); - gtk_box_pack_start(GTK_BOX(hbox), icon, FALSE, FALSE, 0); - gtk_widget_show(icon); + if (!org_freedesktop_DBus_start_service_by_name (proxy, INDICATOR_FUSA_DBUS_NAME, 0, &returnval, &error)) { + g_error("Unable to send message to DBus to start service: %s", error != NULL ? error->message : "(NULL error)" ); + g_error_free(error); + return NULL; + } - gtk_container_add(GTK_CONTAINER(mainmenu), hbox); - gtk_widget_show(hbox); + if (returnval != DBUS_START_REPLY_SUCCESS && returnval != DBUS_START_REPLY_ALREADY_RUNNING) { + g_error("Return value isn't indicative of success: %d", returnval); + return NULL; + } - gtk_widget_show(mainmenu); - return mainmenu; + return GTK_MENU(dbusmenu_gtkmenu_new(INDICATOR_FUSA_DBUS_NAME, INDICATOR_FUSA_DBUS_OBJECT)); } + -- cgit v1.2.3 From d68a776f7c88fc1304572e4739a65ee1b93688e4 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 8 Jun 2009 14:45:38 -0500 Subject: Switching the pkgconfig based directory. --- configure.ac | 7 +++++++ src/Makefile.am | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 84df5c8..09aabfb 100644 --- a/configure.ac +++ b/configure.ac @@ -31,6 +31,13 @@ PKG_CHECK_MODULES(APPLET, gtk+-2.0 >= $GTK_REQUIRED_VERSION AC_SUBST(APPLET_CFLAGS) AC_SUBST(APPLET_LIBS) +########################### +# Indicator Info +########################### + +INDICATORDIR=`$PKG_CONFIG --variable=indicatordir indicator` +AC_SUBST(INDICATORDIR) + ########################### # Files ########################### diff --git a/src/Makefile.am b/src/Makefile.am index c29d179..3bae3f2 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,5 +1,5 @@ -fusalibdir = $(libdir)/indicators/1 +fusalibdir = $(INDICATORDIR) fusalib_LTLIBRARIES = libfusa.la libfusa_la_SOURCES = indicator-fusa.c libfusa_la_CFLAGS = $(APPLET_CFLAGS) -- cgit v1.2.3 From 80b3de3f554b9d9fc60d20c4835026017465b61c Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 8 Jun 2009 16:25:14 -0500 Subject: Making things into a set of three user-daemons. --- src/Makefile.am | 2 +- src/dbus-shared-names.h | 15 +++++++++++++-- src/indicator-fusa.c | 43 +++++++++++++++++++++++++++++++++++++++---- 3 files changed, 53 insertions(+), 7 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index 3bae3f2..325e351 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -2,5 +2,5 @@ fusalibdir = $(INDICATORDIR) fusalib_LTLIBRARIES = libfusa.la libfusa_la_SOURCES = indicator-fusa.c -libfusa_la_CFLAGS = $(APPLET_CFLAGS) +libfusa_la_CFLAGS = $(APPLET_CFLAGS) -Wall -Werror libfusa_la_LIBADD = $(APPLET_LIBS) diff --git a/src/dbus-shared-names.h b/src/dbus-shared-names.h index 35839a4..f56e9cb 100644 --- a/src/dbus-shared-names.h +++ b/src/dbus-shared-names.h @@ -1,3 +1,14 @@ -#define INDICATOR_FUSA_DBUS_NAME "org.indicators.fusa" -#define INDICATOR_FUSA_DBUS_OBJECT "/org/fusa" +#ifndef __DBUS_SHARED_NAMES_H__ +#define __DBUS_SHARED_NAMES_H__ 1 + +#define INDICATOR_STATUS_DBUS_NAME "com.ubuntu.indicator.status" +#define INDICATOR_STATUS_DBUS_OBJECT "/com/ubuntu/indicator/status" + +#define INDICATOR_USERS_DBUS_NAME "com.ubuntu.indicator.users" +#define INDICATOR_USERS_DBUS_OBJECT "/com/ubuntu/indicator/users" + +#define INDICATOR_SESSION_DBUS_NAME "com.ubuntu.indicator.session" +#define INDICATOR_SESSION_DBUS_OBJECT "/com/ubuntu/indicator/session" + +#endif /* __DBUS_SHARED_NAMES_H__ */ diff --git a/src/indicator-fusa.c b/src/indicator-fusa.c index 8815fb5..4c1c163 100644 --- a/src/indicator-fusa.c +++ b/src/indicator-fusa.c @@ -7,14 +7,19 @@ #include INDICATOR_SET_VERSION -INDICATOR_SET_NAME("users-status-shutdown") +INDICATOR_SET_NAME("users-status-session") #include "dbus-shared-names.h" +static GtkMenu * status_menu = NULL; +static GtkMenu * users_menu = NULL; +static GtkMenu * session_menu = NULL; +static GtkMenu * main_menu = NULL; + GtkLabel * get_label (void) { - GtkLabel * returnval = gtk_label_new("Ted Gould"); + GtkLabel * returnval = GTK_LABEL(gtk_label_new("Ted Gould")); return returnval; } @@ -33,7 +38,7 @@ get_menu (void) DBusGConnection * connection = dbus_g_bus_get(DBUS_BUS_SESSION, NULL); DBusGProxy * proxy = dbus_g_proxy_new_for_name(connection, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS); - if (!org_freedesktop_DBus_start_service_by_name (proxy, INDICATOR_FUSA_DBUS_NAME, 0, &returnval, &error)) { + if (!org_freedesktop_DBus_start_service_by_name (proxy, INDICATOR_STATUS_DBUS_NAME, 0, &returnval, &error)) { g_error("Unable to send message to DBus to start service: %s", error != NULL ? error->message : "(NULL error)" ); g_error_free(error); return NULL; @@ -44,7 +49,37 @@ get_menu (void) return NULL; } - return GTK_MENU(dbusmenu_gtkmenu_new(INDICATOR_FUSA_DBUS_NAME, INDICATOR_FUSA_DBUS_OBJECT)); + status_menu = GTK_MENU(dbusmenu_gtkmenu_new(INDICATOR_STATUS_DBUS_NAME, INDICATOR_STATUS_DBUS_OBJECT)); + + if (!org_freedesktop_DBus_start_service_by_name (proxy, INDICATOR_USERS_DBUS_NAME, 0, &returnval, &error)) { + g_error("Unable to send message to DBus to start service: %s", error != NULL ? error->message : "(NULL error)" ); + g_error_free(error); + return NULL; + } + + if (returnval != DBUS_START_REPLY_SUCCESS && returnval != DBUS_START_REPLY_ALREADY_RUNNING) { + g_error("Return value isn't indicative of success: %d", returnval); + return NULL; + } + + users_menu = GTK_MENU(dbusmenu_gtkmenu_new(INDICATOR_USERS_DBUS_NAME, INDICATOR_USERS_DBUS_OBJECT)); + + if (!org_freedesktop_DBus_start_service_by_name (proxy, INDICATOR_SESSION_DBUS_NAME, 0, &returnval, &error)) { + g_error("Unable to send message to DBus to start service: %s", error != NULL ? error->message : "(NULL error)" ); + g_error_free(error); + return NULL; + } + + if (returnval != DBUS_START_REPLY_SUCCESS && returnval != DBUS_START_REPLY_ALREADY_RUNNING) { + g_error("Return value isn't indicative of success: %d", returnval); + return NULL; + } + + session_menu = GTK_MENU(dbusmenu_gtkmenu_new(INDICATOR_SESSION_DBUS_NAME, INDICATOR_SESSION_DBUS_OBJECT)); + + main_menu = GTK_MENU(gtk_menu_new()); + + return main_menu; } -- cgit v1.2.3 From 770526c7bb912c8f04a82293c6d49e1c060edeb7 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 8 Jun 2009 16:57:56 -0500 Subject: Changing the name to get rid of FUSA, which doesn't really make sense anymore. --- .bzrignore | 2 ++ src/Makefile.am | 10 +++++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/.bzrignore b/.bzrignore index 69e9e68..ff78cee 100644 --- a/.bzrignore +++ b/.bzrignore @@ -14,3 +14,5 @@ debian/indicator-messages.postrm.debhelper debian/indicator-messages.substvars debian/stamp-autotools-files debian/stamp-makefile-build +libstatus-users-session.la +libstatus_users_session_la-indicator-fusa.lo diff --git a/src/Makefile.am b/src/Makefile.am index 325e351..45400c3 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,6 +1,6 @@ -fusalibdir = $(INDICATORDIR) -fusalib_LTLIBRARIES = libfusa.la -libfusa_la_SOURCES = indicator-fusa.c -libfusa_la_CFLAGS = $(APPLET_CFLAGS) -Wall -Werror -libfusa_la_LIBADD = $(APPLET_LIBS) +status_users_sessionlibdir = $(INDICATORDIR) +status_users_sessionlib_LTLIBRARIES = libstatus-users-session.la +libstatus_users_session_la_SOURCES = indicator-fusa.c +libstatus_users_session_la_CFLAGS = $(APPLET_CFLAGS) -Wall -Werror +libstatus_users_session_la_LIBADD = $(APPLET_LIBS) -- cgit v1.2.3 From a94e5d414a44af3c3f4ae2bb0c00978c0270dd1a Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 8 Jun 2009 16:59:12 -0500 Subject: Renaming the C file as well. --- .bzrignore | 1 + src/Makefile.am | 2 +- src/indicator-fusa.c | 85 ---------------------------------------------------- src/indicator-sus.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 87 insertions(+), 86 deletions(-) delete mode 100644 src/indicator-fusa.c create mode 100644 src/indicator-sus.c diff --git a/.bzrignore b/.bzrignore index ff78cee..3eac215 100644 --- a/.bzrignore +++ b/.bzrignore @@ -16,3 +16,4 @@ debian/stamp-autotools-files debian/stamp-makefile-build libstatus-users-session.la libstatus_users_session_la-indicator-fusa.lo +libstatus_users_session_la-indicator-sus.lo diff --git a/src/Makefile.am b/src/Makefile.am index 45400c3..4fe35ff 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,6 +1,6 @@ status_users_sessionlibdir = $(INDICATORDIR) status_users_sessionlib_LTLIBRARIES = libstatus-users-session.la -libstatus_users_session_la_SOURCES = indicator-fusa.c +libstatus_users_session_la_SOURCES = indicator-sus.c dbus-shared-names.h libstatus_users_session_la_CFLAGS = $(APPLET_CFLAGS) -Wall -Werror libstatus_users_session_la_LIBADD = $(APPLET_LIBS) diff --git a/src/indicator-fusa.c b/src/indicator-fusa.c deleted file mode 100644 index 4c1c163..0000000 --- a/src/indicator-fusa.c +++ /dev/null @@ -1,85 +0,0 @@ - -#include -#include - -#include -#include - -#include -INDICATOR_SET_VERSION -INDICATOR_SET_NAME("users-status-session") - -#include "dbus-shared-names.h" - -static GtkMenu * status_menu = NULL; -static GtkMenu * users_menu = NULL; -static GtkMenu * session_menu = NULL; -static GtkMenu * main_menu = NULL; - -GtkLabel * -get_label (void) -{ - GtkLabel * returnval = GTK_LABEL(gtk_label_new("Ted Gould")); - return returnval; -} - -GtkImage * -get_icon (void) -{ - return NULL; -} - -GtkMenu * -get_menu (void) -{ - guint returnval = 0; - GError * error = NULL; - - DBusGConnection * connection = dbus_g_bus_get(DBUS_BUS_SESSION, NULL); - DBusGProxy * proxy = dbus_g_proxy_new_for_name(connection, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS); - - if (!org_freedesktop_DBus_start_service_by_name (proxy, INDICATOR_STATUS_DBUS_NAME, 0, &returnval, &error)) { - g_error("Unable to send message to DBus to start service: %s", error != NULL ? error->message : "(NULL error)" ); - g_error_free(error); - return NULL; - } - - if (returnval != DBUS_START_REPLY_SUCCESS && returnval != DBUS_START_REPLY_ALREADY_RUNNING) { - g_error("Return value isn't indicative of success: %d", returnval); - return NULL; - } - - status_menu = GTK_MENU(dbusmenu_gtkmenu_new(INDICATOR_STATUS_DBUS_NAME, INDICATOR_STATUS_DBUS_OBJECT)); - - if (!org_freedesktop_DBus_start_service_by_name (proxy, INDICATOR_USERS_DBUS_NAME, 0, &returnval, &error)) { - g_error("Unable to send message to DBus to start service: %s", error != NULL ? error->message : "(NULL error)" ); - g_error_free(error); - return NULL; - } - - if (returnval != DBUS_START_REPLY_SUCCESS && returnval != DBUS_START_REPLY_ALREADY_RUNNING) { - g_error("Return value isn't indicative of success: %d", returnval); - return NULL; - } - - users_menu = GTK_MENU(dbusmenu_gtkmenu_new(INDICATOR_USERS_DBUS_NAME, INDICATOR_USERS_DBUS_OBJECT)); - - if (!org_freedesktop_DBus_start_service_by_name (proxy, INDICATOR_SESSION_DBUS_NAME, 0, &returnval, &error)) { - g_error("Unable to send message to DBus to start service: %s", error != NULL ? error->message : "(NULL error)" ); - g_error_free(error); - return NULL; - } - - if (returnval != DBUS_START_REPLY_SUCCESS && returnval != DBUS_START_REPLY_ALREADY_RUNNING) { - g_error("Return value isn't indicative of success: %d", returnval); - return NULL; - } - - session_menu = GTK_MENU(dbusmenu_gtkmenu_new(INDICATOR_SESSION_DBUS_NAME, INDICATOR_SESSION_DBUS_OBJECT)); - - main_menu = GTK_MENU(gtk_menu_new()); - - return main_menu; -} - - diff --git a/src/indicator-sus.c b/src/indicator-sus.c new file mode 100644 index 0000000..4c1c163 --- /dev/null +++ b/src/indicator-sus.c @@ -0,0 +1,85 @@ + +#include +#include + +#include +#include + +#include +INDICATOR_SET_VERSION +INDICATOR_SET_NAME("users-status-session") + +#include "dbus-shared-names.h" + +static GtkMenu * status_menu = NULL; +static GtkMenu * users_menu = NULL; +static GtkMenu * session_menu = NULL; +static GtkMenu * main_menu = NULL; + +GtkLabel * +get_label (void) +{ + GtkLabel * returnval = GTK_LABEL(gtk_label_new("Ted Gould")); + return returnval; +} + +GtkImage * +get_icon (void) +{ + return NULL; +} + +GtkMenu * +get_menu (void) +{ + guint returnval = 0; + GError * error = NULL; + + DBusGConnection * connection = dbus_g_bus_get(DBUS_BUS_SESSION, NULL); + DBusGProxy * proxy = dbus_g_proxy_new_for_name(connection, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS); + + if (!org_freedesktop_DBus_start_service_by_name (proxy, INDICATOR_STATUS_DBUS_NAME, 0, &returnval, &error)) { + g_error("Unable to send message to DBus to start service: %s", error != NULL ? error->message : "(NULL error)" ); + g_error_free(error); + return NULL; + } + + if (returnval != DBUS_START_REPLY_SUCCESS && returnval != DBUS_START_REPLY_ALREADY_RUNNING) { + g_error("Return value isn't indicative of success: %d", returnval); + return NULL; + } + + status_menu = GTK_MENU(dbusmenu_gtkmenu_new(INDICATOR_STATUS_DBUS_NAME, INDICATOR_STATUS_DBUS_OBJECT)); + + if (!org_freedesktop_DBus_start_service_by_name (proxy, INDICATOR_USERS_DBUS_NAME, 0, &returnval, &error)) { + g_error("Unable to send message to DBus to start service: %s", error != NULL ? error->message : "(NULL error)" ); + g_error_free(error); + return NULL; + } + + if (returnval != DBUS_START_REPLY_SUCCESS && returnval != DBUS_START_REPLY_ALREADY_RUNNING) { + g_error("Return value isn't indicative of success: %d", returnval); + return NULL; + } + + users_menu = GTK_MENU(dbusmenu_gtkmenu_new(INDICATOR_USERS_DBUS_NAME, INDICATOR_USERS_DBUS_OBJECT)); + + if (!org_freedesktop_DBus_start_service_by_name (proxy, INDICATOR_SESSION_DBUS_NAME, 0, &returnval, &error)) { + g_error("Unable to send message to DBus to start service: %s", error != NULL ? error->message : "(NULL error)" ); + g_error_free(error); + return NULL; + } + + if (returnval != DBUS_START_REPLY_SUCCESS && returnval != DBUS_START_REPLY_ALREADY_RUNNING) { + g_error("Return value isn't indicative of success: %d", returnval); + return NULL; + } + + session_menu = GTK_MENU(dbusmenu_gtkmenu_new(INDICATOR_SESSION_DBUS_NAME, INDICATOR_SESSION_DBUS_OBJECT)); + + main_menu = GTK_MENU(gtk_menu_new()); + + return main_menu; +} + + -- cgit v1.2.3 From 1e2d4592308c3bff63c74c48b9e97b6d246d2b92 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 9 Jun 2009 10:59:51 -0500 Subject: Now we're building services. Snazy. --- .bzrignore | 3 +++ src/Makefile.am | 9 +++++++++ src/session-service.c | 7 +++++++ src/status-service.c | 7 +++++++ src/users-service.c | 7 +++++++ 5 files changed, 33 insertions(+) create mode 100644 src/session-service.c create mode 100644 src/status-service.c create mode 100644 src/users-service.c diff --git a/.bzrignore b/.bzrignore index 3eac215..d7bb9e0 100644 --- a/.bzrignore +++ b/.bzrignore @@ -17,3 +17,6 @@ debian/stamp-makefile-build libstatus-users-session.la libstatus_users_session_la-indicator-fusa.lo libstatus_users_session_la-indicator-sus.lo +indicator-session-service +indicator-status-service +indicator-users-service diff --git a/src/Makefile.am b/src/Makefile.am index 4fe35ff..4e0df47 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,6 +1,15 @@ +libexec_PROGRAMS = indicator-status-service indicator-users-service indicator-session-service + status_users_sessionlibdir = $(INDICATORDIR) status_users_sessionlib_LTLIBRARIES = libstatus-users-session.la libstatus_users_session_la_SOURCES = indicator-sus.c dbus-shared-names.h libstatus_users_session_la_CFLAGS = $(APPLET_CFLAGS) -Wall -Werror libstatus_users_session_la_LIBADD = $(APPLET_LIBS) + +indicator_status_service_SOURCES = status-service.c + +indicator_users_service_SOURCES = users-service.c + +indicator_session_service_SOURCES = session-service.c + diff --git a/src/session-service.c b/src/session-service.c new file mode 100644 index 0000000..63590c7 --- /dev/null +++ b/src/session-service.c @@ -0,0 +1,7 @@ + +int +main (int argc, char ** argv) +{ + + return 0; +} diff --git a/src/status-service.c b/src/status-service.c new file mode 100644 index 0000000..63590c7 --- /dev/null +++ b/src/status-service.c @@ -0,0 +1,7 @@ + +int +main (int argc, char ** argv) +{ + + return 0; +} diff --git a/src/users-service.c b/src/users-service.c new file mode 100644 index 0000000..63590c7 --- /dev/null +++ b/src/users-service.c @@ -0,0 +1,7 @@ + +int +main (int argc, char ** argv) +{ + + return 0; +} -- cgit v1.2.3 From 45361f6e3c6061d4630a630c8b2b48861e4cac57 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 9 Jun 2009 11:35:11 -0500 Subject: Adding in a bunch of service files. We're hip now. --- .bzrignore | 3 +++ Makefile.am | 3 ++- autogen.sh | 2 +- configure.ac | 10 +++++++--- data/Makefile.am | 5 +++++ data/indicator-session.service.in | 3 +++ data/indicator-status.service.in | 3 +++ data/indicator-users.service.in | 3 +++ 8 files changed, 27 insertions(+), 5 deletions(-) create mode 100644 data/Makefile.am create mode 100644 data/indicator-session.service.in create mode 100644 data/indicator-status.service.in create mode 100644 data/indicator-users.service.in diff --git a/.bzrignore b/.bzrignore index d7bb9e0..31aa919 100644 --- a/.bzrignore +++ b/.bzrignore @@ -20,3 +20,6 @@ libstatus_users_session_la-indicator-sus.lo indicator-session-service indicator-status-service indicator-users-service +indicator-session.service +indicator-status.service +indicator-users.service diff --git a/Makefile.am b/Makefile.am index f0f2247..7220eba 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,4 +1,5 @@ SUBDIRS = \ - src + src \ + data diff --git a/autogen.sh b/autogen.sh index 537d394..3c73a4c 100755 --- a/autogen.sh +++ b/autogen.sh @@ -1,6 +1,6 @@ #!/bin/sh -PKG_NAME="indicator-fusa" +PKG_NAME="indicator-sus" which gnome-autogen.sh || { echo "You need gnome-common from GNOME SVN" diff --git a/configure.ac b/configure.ac index 09aabfb..512914e 100644 --- a/configure.ac +++ b/configure.ac @@ -1,10 +1,10 @@ -AC_INIT(src/indicator-fusa.c) +AC_INIT(src/indicator-sus.c) AC_PREREQ(2.53) AM_CONFIG_HEADER(config.h) -AM_INIT_AUTOMAKE(indicator-fusa, 0.1dev) +AM_INIT_AUTOMAKE(indicator-sus, 0.1dev) AM_MAINTAINER_MODE @@ -45,6 +45,10 @@ AC_SUBST(INDICATORDIR) AC_OUTPUT([ Makefile src/Makefile +data/Makefile +data/indicator-status.service +data/indicator-users.service +data/indicator-session.service ]) ########################### @@ -53,7 +57,7 @@ src/Makefile AC_MSG_NOTICE([ -FUSA Indicator Configuration: +SUS Indicator Configuration: Prefix: $prefix ]) diff --git a/data/Makefile.am b/data/Makefile.am new file mode 100644 index 0000000..de1d603 --- /dev/null +++ b/data/Makefile.am @@ -0,0 +1,5 @@ + +dbus_servicesdir = $(DBUSSERVICEDIR) +dbus_services_DATA = indicator-status.service \ + indicator-users.service \ + indicator-session.service diff --git a/data/indicator-session.service.in b/data/indicator-session.service.in new file mode 100644 index 0000000..8d63285 --- /dev/null +++ b/data/indicator-session.service.in @@ -0,0 +1,3 @@ +[D-BUS Service] +Name=com.ubuntu.indicator.session +Exec=@libexec@/indicator-session-service diff --git a/data/indicator-status.service.in b/data/indicator-status.service.in new file mode 100644 index 0000000..c2b3b28 --- /dev/null +++ b/data/indicator-status.service.in @@ -0,0 +1,3 @@ +[D-BUS Service] +Name=com.ubuntu.indicator.status +Exec=@libexec@/indicator-status-service diff --git a/data/indicator-users.service.in b/data/indicator-users.service.in new file mode 100644 index 0000000..7ffbaa1 --- /dev/null +++ b/data/indicator-users.service.in @@ -0,0 +1,3 @@ +[D-BUS Service] +Name=com.ubuntu.indicator.users +Exec=@libexec@/indicator-users-service -- cgit v1.2.3 From 49c4646f0d2beb676e6d60d971fe7789253c4f38 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 9 Jun 2009 15:35:25 -0500 Subject: Oh, stealing the methods used in PolicyKit for building these. I dislike calling sed directly, but the results are fantastic. --- configure.ac | 3 --- data/Makefile.am | 13 ++++++++++--- data/indicator-session.service.in | 2 +- data/indicator-status.service.in | 2 +- data/indicator-users.service.in | 2 +- 5 files changed, 13 insertions(+), 9 deletions(-) diff --git a/configure.ac b/configure.ac index 512914e..742403a 100644 --- a/configure.ac +++ b/configure.ac @@ -46,9 +46,6 @@ AC_OUTPUT([ Makefile src/Makefile data/Makefile -data/indicator-status.service -data/indicator-users.service -data/indicator-session.service ]) ########################### diff --git a/data/Makefile.am b/data/Makefile.am index de1d603..03e4cb8 100644 --- a/data/Makefile.am +++ b/data/Makefile.am @@ -1,5 +1,12 @@ dbus_servicesdir = $(DBUSSERVICEDIR) -dbus_services_DATA = indicator-status.service \ - indicator-users.service \ - indicator-session.service +service_in_files = indicator-status.service.in \ + indicator-users.service.in \ + indicator-session.service.in +dbus_services_DATA = $(service_in_files:.service.in=.service) + +$(dbus_services_DATA): $(service_in_files) Makefile + @sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@ + +EXTRA_DIST = $(service_in_files) + diff --git a/data/indicator-session.service.in b/data/indicator-session.service.in index 8d63285..790600a 100644 --- a/data/indicator-session.service.in +++ b/data/indicator-session.service.in @@ -1,3 +1,3 @@ [D-BUS Service] Name=com.ubuntu.indicator.session -Exec=@libexec@/indicator-session-service +Exec=@libexecdir@/indicator-session-service diff --git a/data/indicator-status.service.in b/data/indicator-status.service.in index c2b3b28..9fe92ad 100644 --- a/data/indicator-status.service.in +++ b/data/indicator-status.service.in @@ -1,3 +1,3 @@ [D-BUS Service] Name=com.ubuntu.indicator.status -Exec=@libexec@/indicator-status-service +Exec=@libexecdir@/indicator-status-service diff --git a/data/indicator-users.service.in b/data/indicator-users.service.in index 7ffbaa1..2843743 100644 --- a/data/indicator-users.service.in +++ b/data/indicator-users.service.in @@ -1,3 +1,3 @@ [D-BUS Service] Name=com.ubuntu.indicator.users -Exec=@libexec@/indicator-users-service +Exec=@libexecdir@/indicator-users-service -- cgit v1.2.3 From ee013228b486d5b49be2737e90f3e75aded90365 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 9 Jun 2009 16:53:00 -0500 Subject: Adding more dependencies and cflags and stuff to make the builds of the services more complete --- configure.ac | 17 +++++++++++++++++ src/Makefile.am | 6 ++++++ 2 files changed, 23 insertions(+) diff --git a/configure.ac b/configure.ac index 742403a..1d86cac 100644 --- a/configure.ac +++ b/configure.ac @@ -31,6 +31,23 @@ PKG_CHECK_MODULES(APPLET, gtk+-2.0 >= $GTK_REQUIRED_VERSION AC_SUBST(APPLET_CFLAGS) AC_SUBST(APPLET_LIBS) +DBUSMENUGLIB_REQUIRED_VERSION=0.0.0 + +PKG_CHECK_MODULES(STATUSSERVICE, dbusmenu-glib >= $DBUSMENUGLIB_REQUIRED_VERSION) + +AC_SUBST(STATUSERVICE_CFLAGS) +AC_SUBST(STATUSERVICE_LIBS) + +PKG_CHECK_MODULES(USERSSERVICE, dbusmenu-glib >= $DBUSMENUGLIB_REQUIRED_VERSION) + +AC_SUBST(USERSERVICE_CFLAGS) +AC_SUBST(USERSERVICE_LIBS) + +PKG_CHECK_MODULES(SESSIONSERVICE, dbusmenu-glib >= $DBUSMENUGLIB_REQUIRED_VERSION) + +AC_SUBST(SESSIONERVICE_CFLAGS) +AC_SUBST(SESSIONERVICE_LIBS) + ########################### # Indicator Info ########################### diff --git a/src/Makefile.am b/src/Makefile.am index 4e0df47..86bacb8 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -8,8 +8,14 @@ libstatus_users_session_la_CFLAGS = $(APPLET_CFLAGS) -Wall -Werror libstatus_users_session_la_LIBADD = $(APPLET_LIBS) indicator_status_service_SOURCES = status-service.c +indicator_status_service_CFLAGS = $(STATUSSERVICE_CFLAGS) +indicator_status_service_LDADD = $(STATUSSERVICE_LIBS) indicator_users_service_SOURCES = users-service.c +indicator_users_service_CFLAGS = $(USERSSERVICE_CFLAGS) +indicator_users_service_LDADD = $(USERSSERVICE_LIBS) indicator_session_service_SOURCES = session-service.c +indicator_session_service_CFLAGS = $(SESSIONSERVICE_CFLAGS) +indicator_session_service_LDADD = $(SESSIONSERVICE_LIBS) -- cgit v1.2.3 From 21cc4e9079d0cf6b13f8232f10a265ce64fd260c Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 9 Jun 2009 16:58:52 -0500 Subject: Bringing up a dbusmenu item. --- src/users-service.c | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/src/users-service.c b/src/users-service.c index 63590c7..39afe39 100644 --- a/src/users-service.c +++ b/src/users-service.c @@ -1,7 +1,42 @@ +#include +#include + +#include +#include + +#include "dbus-shared-names.h" + +static DbusmenuMenuitem * root_menuitem = NULL; +static GMainLoop * mainloop = NULL; + int main (int argc, char ** argv) { + g_type_init(); + + DBusGConnection * connection = dbus_g_bus_get(DBUS_BUS_SESSION, NULL); + DBusGProxy * bus_proxy = dbus_g_proxy_new_for_name(connection, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS); + GError * error = NULL; + guint nameret = 0; - return 0; + if (!org_freedesktop_DBus_request_name(bus_proxy, INDICATOR_USERS_DBUS_NAME, 0, &nameret, &error)) { + g_error("Unable to call to request name"); + return 1; + } + + if (nameret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) { + g_error("Unable to get name"); + return 1; + } + + root_menuitem = dbusmenu_menuitem_new(); + DbusmenuServer * server = dbusmenu_server_new(INDICATOR_USERS_DBUS_OBJECT); + dbusmenu_server_set_root(server, root_menuitem); + + mainloop = g_main_loop_new(NULL, FALSE); + g_main_loop_run(mainloop); + + return 0; } + -- cgit v1.2.3 From b00bec83c75676a02eb6bebc2c51d5f0376dcf34 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 9 Jun 2009 17:00:07 -0500 Subject: Copying that code into the other two services. Now we're dbus-y. --- src/session-service.c | 37 ++++++++++++++++++++++++++++++++++++- src/status-service.c | 37 ++++++++++++++++++++++++++++++++++++- 2 files changed, 72 insertions(+), 2 deletions(-) diff --git a/src/session-service.c b/src/session-service.c index 63590c7..7a2ad27 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -1,7 +1,42 @@ +#include +#include + +#include +#include + +#include "dbus-shared-names.h" + +static DbusmenuMenuitem * root_menuitem = NULL; +static GMainLoop * mainloop = NULL; + int main (int argc, char ** argv) { + g_type_init(); + + DBusGConnection * connection = dbus_g_bus_get(DBUS_BUS_SESSION, NULL); + DBusGProxy * bus_proxy = dbus_g_proxy_new_for_name(connection, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS); + GError * error = NULL; + guint nameret = 0; - return 0; + if (!org_freedesktop_DBus_request_name(bus_proxy, INDICATOR_SESSION_DBUS_NAME, 0, &nameret, &error)) { + g_error("Unable to call to request name"); + return 1; + } + + if (nameret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) { + g_error("Unable to get name"); + return 1; + } + + root_menuitem = dbusmenu_menuitem_new(); + DbusmenuServer * server = dbusmenu_server_new(INDICATOR_SESSION_DBUS_OBJECT); + dbusmenu_server_set_root(server, root_menuitem); + + mainloop = g_main_loop_new(NULL, FALSE); + g_main_loop_run(mainloop); + + return 0; } + diff --git a/src/status-service.c b/src/status-service.c index 63590c7..19bee49 100644 --- a/src/status-service.c +++ b/src/status-service.c @@ -1,7 +1,42 @@ +#include +#include + +#include +#include + +#include "dbus-shared-names.h" + +static DbusmenuMenuitem * root_menuitem = NULL; +static GMainLoop * mainloop = NULL; + int main (int argc, char ** argv) { + g_type_init(); + + DBusGConnection * connection = dbus_g_bus_get(DBUS_BUS_SESSION, NULL); + DBusGProxy * bus_proxy = dbus_g_proxy_new_for_name(connection, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS); + GError * error = NULL; + guint nameret = 0; - return 0; + if (!org_freedesktop_DBus_request_name(bus_proxy, INDICATOR_STATUS_DBUS_NAME, 0, &nameret, &error)) { + g_error("Unable to call to request name"); + return 1; + } + + if (nameret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) { + g_error("Unable to get name"); + return 1; + } + + root_menuitem = dbusmenu_menuitem_new(); + DbusmenuServer * server = dbusmenu_server_new(INDICATOR_STATUS_DBUS_OBJECT); + dbusmenu_server_set_root(server, root_menuitem); + + mainloop = g_main_loop_new(NULL, FALSE); + g_main_loop_run(mainloop); + + return 0; } + -- cgit v1.2.3 From 4a3887142581168e9eda220bd22c1b9f10073fd1 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 10 Jun 2009 09:48:51 -0500 Subject: Adding a configure flag so that indicators can be installed locally for distcheck purposes. --- Makefile.am | 2 ++ configure.ac | 13 ++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index 7220eba..7d58c6b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -3,3 +3,5 @@ SUBDIRS = \ src \ data +DISTCHECK_CONFIGURE_FLAGS = --enable-localinstall + diff --git a/configure.ac b/configure.ac index 1d86cac..4d656c5 100644 --- a/configure.ac +++ b/configure.ac @@ -48,11 +48,22 @@ PKG_CHECK_MODULES(SESSIONSERVICE, dbusmenu-glib >= $DBUSMENUGLIB_REQUIRED_VERSIO AC_SUBST(SESSIONERVICE_CFLAGS) AC_SUBST(SESSIONERVICE_LIBS) +########################### +# Check to see if we're local +########################### + +with_localinstall="no" +AC_ARG_ENABLE(localinstall, AS_HELP_STRING([--enable-localinstall], [install all of the files localy instead of system directories (for distcheck)]), with_localinstall=$enableval, with_localinstall=no) + ########################### # Indicator Info ########################### -INDICATORDIR=`$PKG_CONFIG --variable=indicatordir indicator` +if test "x$with_localinstall" = "xyes"; then + INDICATORDIR="${libdir}/indicators/2/" +else + INDICATORDIR=`$PKG_CONFIG --variable=indicatordir indicator` +fi AC_SUBST(INDICATORDIR) ########################### -- cgit v1.2.3 From 0909c13dac683fe593e32fedbb682309aabd1a08 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 10 Jun 2009 09:52:00 -0500 Subject: Adding in the DBus services directory with localinstall support --- configure.ac | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/configure.ac b/configure.ac index 4d656c5..d299a0d 100644 --- a/configure.ac +++ b/configure.ac @@ -66,6 +66,17 @@ else fi AC_SUBST(INDICATORDIR) +########################### +# DBus Service Info +########################### + +if test "x$with_localinstall" = "xyes"; then + DBUSSERVICEDIR="${datadir}/dbus-1/services/" +else + DBUSSERVICEDIR=`$PKG_CONFIG --variable=session_bus_services_dir dbus-1` +fi +AC_SUBST(DBUSSERVICEDIR) + ########################### # Files ########################### -- cgit v1.2.3 From 9c50845dce179ffd96bb8f5443a57d08afd91218 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 10 Jun 2009 09:56:54 -0500 Subject: Making sure to clean up the generated service files. Whew. Pass distcheck. --- data/Makefile.am | 1 + 1 file changed, 1 insertion(+) diff --git a/data/Makefile.am b/data/Makefile.am index 03e4cb8..da1bcd2 100644 --- a/data/Makefile.am +++ b/data/Makefile.am @@ -10,3 +10,4 @@ $(dbus_services_DATA): $(service_in_files) Makefile EXTRA_DIST = $(service_in_files) +CLEANFILES = $(dbus_services_DATA) -- cgit v1.2.3 From 913e99f4a2151b57412b1db3e2eb48b5050ff9fb Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 10 Jun 2009 16:17:53 -0500 Subject: =?UTF-8?q?Using=20the=20defines=20and=20strings=20that=20were=20i?= =?UTF-8?q?n=20our=20patches=20to=20FUSA.=20=20I=20wrote=20the=20code,=20s?= =?UTF-8?q?o=20it=20is=20like=20other=20things=20=C2=A9=20Canonical=20so?= =?UTF-8?q?=20there=20is=20no=20issue=20there.=20=20There=20is=20other=20c?= =?UTF-8?q?ode=20in=20FUSA=20that=20is=20not.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/status-service.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/status-service.c b/src/status-service.c index 19bee49..68b5685 100644 --- a/src/status-service.c +++ b/src/status-service.c @@ -1,4 +1,6 @@ +#include + #include #include @@ -7,6 +9,32 @@ #include "dbus-shared-names.h" +typedef enum +{ + STATUS_SERVICE_STATUS_ONLINE, + STATUS_SERVICE_STATUS_AWAY, + STATUS_SERVICE_STATUS_DND, + STATUS_SERVICE_STATUS_OFFLINE, + /* Leave as last */ + STATUS_SERVICE_STATUS_LAST +} +StatusServiceStatus; + +static const gchar * status_strings [STATUS_SERVICE_STATUS_LAST] = { + /* STATUS_SERVICE_STATUS_ONLINE, */ N_("Available"), + /* STATUS_SERVICE_STATUS_AWAY, */ N_("Away"), + /* STATUS_SERVICE_STATUS_DND */ N_("Busy"), + /* STATUS_SERVICE_STATUS_OFFLINE, */ N_("Offline") +}; + +static const gchar * status_icons[STATUS_SERVICE_STATUS_LAST] = { + /* STATUS_SERVICE_STATUS_ONLINE, */ "user-online", + /* STATUS_SERVICE_STATUS_AWAY, */ "user-away", + /* STATUS_SERVICE_STATUS_DND, */ "user-busy", + /* STATUS_SERVICE_STATUS_OFFLINE */ "user-offline" +}; + + static DbusmenuMenuitem * root_menuitem = NULL; static GMainLoop * mainloop = NULL; -- cgit v1.2.3 From bf4f01129a8fcec1b0dc800036ee3990436644bc Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 10 Jun 2009 16:55:12 -0500 Subject: Building the menuitems --- src/status-service.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/status-service.c b/src/status-service.c index 68b5685..1615985 100644 --- a/src/status-service.c +++ b/src/status-service.c @@ -38,6 +38,27 @@ static const gchar * status_icons[STATUS_SERVICE_STATUS_LAST] = { static DbusmenuMenuitem * root_menuitem = NULL; static GMainLoop * mainloop = NULL; +gboolean +build_menu (gpointer data) +{ + DbusmenuMenuitem * root = DBUSMENU_MENUITEM(data); + g_return_val_if_fail(root != NULL, FALSE); + + StatusServiceStatus i; + for (i = STATUS_SERVICE_STATUS_ONLINE; i < STATUS_SERVICE_STATUS_LAST; i++) { + DbusmenuMenuitem * mi = dbusmenu_menuitem_new(); + + dbusmenu_menuitem_property_set(mi, "label", _(status_strings[i])); + dbusmenu_menuitem_property_set(mi, "icon", status_icons[i]); + + dbusmenu_menuitem_child_append(root, mi); + + g_debug("Built %s", status_strings[i]); + } + + return FALSE; +} + int main (int argc, char ** argv) { @@ -62,6 +83,8 @@ main (int argc, char ** argv) DbusmenuServer * server = dbusmenu_server_new(INDICATOR_STATUS_DBUS_OBJECT); dbusmenu_server_set_root(server, root_menuitem); + g_idle_add(build_menu, root_menuitem); + mainloop = g_main_loop_new(NULL, FALSE); g_main_loop_run(mainloop); -- cgit v1.2.3 From 257c07fe3c71a19a116a5d9f64e6ffb4e3f9fb0d Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 10 Jun 2009 17:02:43 -0500 Subject: Connecting in a callback. --- src/status-service.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/status-service.c b/src/status-service.c index 1615985..840e164 100644 --- a/src/status-service.c +++ b/src/status-service.c @@ -38,7 +38,14 @@ static const gchar * status_icons[STATUS_SERVICE_STATUS_LAST] = { static DbusmenuMenuitem * root_menuitem = NULL; static GMainLoop * mainloop = NULL; -gboolean +static void +menu_click (DbusmenuMenuitem * mi, gpointer data) +{ + StatusServiceStatus stat = (StatusServiceStatus)GPOINTER_TO_INT(data); + +} + +static gboolean build_menu (gpointer data) { DbusmenuMenuitem * root = DBUSMENU_MENUITEM(data); @@ -50,6 +57,7 @@ build_menu (gpointer data) dbusmenu_menuitem_property_set(mi, "label", _(status_strings[i])); dbusmenu_menuitem_property_set(mi, "icon", status_icons[i]); + g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, 0, GINT_TO_POINTER(i)); dbusmenu_menuitem_child_append(root, mi); -- cgit v1.2.3 From 6a310124ced26f2753c32ece249ca092214b73ee Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 10 Jun 2009 17:17:25 -0500 Subject: Oops, forgot about invisible. I guess that's kinda expected though, as it's invisible. --- src/status-service.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/status-service.c b/src/status-service.c index 840e164..cd131a4 100644 --- a/src/status-service.c +++ b/src/status-service.c @@ -14,6 +14,7 @@ typedef enum STATUS_SERVICE_STATUS_ONLINE, STATUS_SERVICE_STATUS_AWAY, STATUS_SERVICE_STATUS_DND, + STATUS_SERVICE_STATUS_INVISIBLE, STATUS_SERVICE_STATUS_OFFLINE, /* Leave as last */ STATUS_SERVICE_STATUS_LAST @@ -21,17 +22,19 @@ typedef enum StatusServiceStatus; static const gchar * status_strings [STATUS_SERVICE_STATUS_LAST] = { - /* STATUS_SERVICE_STATUS_ONLINE, */ N_("Available"), - /* STATUS_SERVICE_STATUS_AWAY, */ N_("Away"), - /* STATUS_SERVICE_STATUS_DND */ N_("Busy"), - /* STATUS_SERVICE_STATUS_OFFLINE, */ N_("Offline") + /* STATUS_SERVICE_STATUS_ONLINE, */ N_("Available"), + /* STATUS_SERVICE_STATUS_AWAY, */ N_("Away"), + /* STATUS_SERVICE_STATUS_DND */ N_("Busy"), + /* STATUS_SERVICE_STATUS_INVISIBLE */ N_("Invisible"), + /* STATUS_SERVICE_STATUS_OFFLINE, */ N_("Offline") }; static const gchar * status_icons[STATUS_SERVICE_STATUS_LAST] = { - /* STATUS_SERVICE_STATUS_ONLINE, */ "user-online", - /* STATUS_SERVICE_STATUS_AWAY, */ "user-away", - /* STATUS_SERVICE_STATUS_DND, */ "user-busy", - /* STATUS_SERVICE_STATUS_OFFLINE */ "user-offline" + /* STATUS_SERVICE_STATUS_ONLINE, */ "user-online", + /* STATUS_SERVICE_STATUS_AWAY, */ "user-away", + /* STATUS_SERVICE_STATUS_DND, */ "user-busy", + /* STATUS_SERVICE_STATUS_INVISIBLE, */ "user-invisible", + /* STATUS_SERVICE_STATUS_OFFLINE */ "user-offline" }; -- cgit v1.2.3 From 3fc5dff1de2389211bae97ba54db3c1370dbab0c Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 11 Jun 2009 10:20:46 -0500 Subject: Adding in the basic (generated) framework for the status provider object --- src/Makefile.am | 2 +- src/status-provider.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/status-provider.h | 31 +++++++++++++++++++++++++++++ 3 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 src/status-provider.c create mode 100644 src/status-provider.h diff --git a/src/Makefile.am b/src/Makefile.am index 86bacb8..df51cf5 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -7,7 +7,7 @@ libstatus_users_session_la_SOURCES = indicator-sus.c dbus-shared-names.h libstatus_users_session_la_CFLAGS = $(APPLET_CFLAGS) -Wall -Werror libstatus_users_session_la_LIBADD = $(APPLET_LIBS) -indicator_status_service_SOURCES = status-service.c +indicator_status_service_SOURCES = status-service.c status-provider.h status-provider.c indicator_status_service_CFLAGS = $(STATUSSERVICE_CFLAGS) indicator_status_service_LDADD = $(STATUSSERVICE_LIBS) diff --git a/src/status-provider.c b/src/status-provider.c new file mode 100644 index 0000000..c2f7de2 --- /dev/null +++ b/src/status-provider.c @@ -0,0 +1,55 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "status-provider.h" + +typedef struct _StatusProviderPrivate StatusProviderPrivate; +struct _StatusProviderPrivate { +}; + +#define STATUS_PROVIDER_GET_PRIVATE(o) \ +(G_TYPE_INSTANCE_GET_PRIVATE ((o), STATUS_PROVIDER_TYPE, StatusProviderPrivate)) + +static void status_provider_class_init (StatusProviderClass *klass); +static void status_provider_init (StatusProvider *self); +static void status_provider_dispose (GObject *object); +static void status_provider_finalize (GObject *object); + +G_DEFINE_TYPE (StatusProvider, status_provider, G_TYPE_OBJECT); + +static void +status_provider_class_init (StatusProviderClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (StatusProviderPrivate)); + + object_class->dispose = status_provider_dispose; + object_class->finalize = status_provider_finalize; + + return; +} + +static void +status_provider_init (StatusProvider *self) +{ + + return; +} + +static void +status_provider_dispose (GObject *object) +{ + + G_OBJECT_CLASS (status_provider_parent_class)->dispose (object); + return; +} + +static void +status_provider_finalize (GObject *object) +{ + + G_OBJECT_CLASS (status_provider_parent_class)->finalize (object); + return; +} diff --git a/src/status-provider.h b/src/status-provider.h new file mode 100644 index 0000000..7d36f02 --- /dev/null +++ b/src/status-provider.h @@ -0,0 +1,31 @@ +#ifndef __STATUS_PROVIDER_H__ +#define __STATUS_PROVIDER_H__ + +#include +#include + +G_BEGIN_DECLS + +#define STATUS_PROVIDER_TYPE (status_provider_get_type ()) +#define STATUS_PROVIDER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), STATUS_PROVIDER_TYPE, StatusProvider)) +#define STATUS_PROVIDER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), STATUS_PROVIDER_TYPE, StatusProviderClass)) +#define IS_STATUS_PROVIDER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), STATUS_PROVIDER_TYPE)) +#define IS_STATUS_PROVIDER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), STATUS_PROVIDER_TYPE)) +#define STATUS_PROVIDER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), STATUS_PROVIDER_TYPE, StatusProviderClass)) + + +typedef struct _StatusProviderClass StatusProviderClass; +struct _StatusProviderClass { + GObjectClass parent_class; +}; + +typedef struct _StatusProvider StatusProvider; +struct _StatusProvider { + GObject parent; +}; + +GType status_provider_get_type (void); + +G_END_DECLS + +#endif -- cgit v1.2.3 From 9b6dcf5696d59e6b6004b8631f4a136f5b90c1d5 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 11 Jun 2009 12:01:59 -0500 Subject: Providing the first hints at an API --- src/status-provider.h | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/status-provider.h b/src/status-provider.h index 7d36f02..bbc86f6 100644 --- a/src/status-provider.h +++ b/src/status-provider.h @@ -13,19 +13,32 @@ G_BEGIN_DECLS #define IS_STATUS_PROVIDER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), STATUS_PROVIDER_TYPE)) #define STATUS_PROVIDER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), STATUS_PROVIDER_TYPE, StatusProviderClass)) - -typedef struct _StatusProviderClass StatusProviderClass; -struct _StatusProviderClass { - GObjectClass parent_class; -}; +#define STATUS_PROVIDER_SIGNAL_STATUS_CHANGED "status-changed" typedef struct _StatusProvider StatusProvider; struct _StatusProvider { GObject parent; }; +typedef struct _StatusProviderClass StatusProviderClass; +struct _StatusProviderClass { + /* Signals */ + void (*status_changed) (guint newstatus); + + /* Virtual Functions */ + void (*set_status) (StatusProvider * sp, guint newstatus); + guint (*get_status) (StatusProvider * sp); + + GObjectClass parent_class; +}; + GType status_provider_get_type (void); +void status_provider_set_status (StatusProvider * sp, guint status); +guint status_provider_get_status (StatusProvider * sp); + +void status_provider_emit_status_changed (StatusProvider * sp, guint newstatus); + G_END_DECLS #endif -- cgit v1.2.3 From bac4397f4f402d3588b9fb6153bab8e6f320f8b7 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 11 Jun 2009 12:06:09 -0500 Subject: Moving the enum into the provider object and changing the name everywhere. --- src/status-provider.h | 24 ++++++++++++++++++------ src/status-service.c | 44 +++++++++++++++++--------------------------- 2 files changed, 35 insertions(+), 33 deletions(-) diff --git a/src/status-provider.h b/src/status-provider.h index bbc86f6..b20f4f0 100644 --- a/src/status-provider.h +++ b/src/status-provider.h @@ -13,6 +13,18 @@ G_BEGIN_DECLS #define IS_STATUS_PROVIDER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), STATUS_PROVIDER_TYPE)) #define STATUS_PROVIDER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), STATUS_PROVIDER_TYPE, StatusProviderClass)) +typedef enum +{ + STATUS_PROVIDER_STATUS_ONLINE, + STATUS_PROVIDER_STATUS_AWAY, + STATUS_PROVIDER_STATUS_DND, + STATUS_PROVIDER_STATUS_INVISIBLE, + STATUS_PROVIDER_STATUS_OFFLINE, + /* Leave as last */ + STATUS_PROVIDER_STATUS_LAST +} +StatusProviderStatus; + #define STATUS_PROVIDER_SIGNAL_STATUS_CHANGED "status-changed" typedef struct _StatusProvider StatusProvider; @@ -23,21 +35,21 @@ struct _StatusProvider { typedef struct _StatusProviderClass StatusProviderClass; struct _StatusProviderClass { /* Signals */ - void (*status_changed) (guint newstatus); + void (*status_changed) (StatusProviderStatus newstatus); /* Virtual Functions */ - void (*set_status) (StatusProvider * sp, guint newstatus); - guint (*get_status) (StatusProvider * sp); + void (*set_status) (StatusProvider * sp, StatusProviderStatus newstatus); + StatusProviderStatus (*get_status) (StatusProvider * sp); GObjectClass parent_class; }; GType status_provider_get_type (void); -void status_provider_set_status (StatusProvider * sp, guint status); -guint status_provider_get_status (StatusProvider * sp); +void status_provider_set_status (StatusProvider * sp, StatusProviderStatus status); +StatusProviderStatus status_provider_get_status (StatusProvider * sp); -void status_provider_emit_status_changed (StatusProvider * sp, guint newstatus); +void status_provider_emit_status_changed (StatusProvider * sp, StatusProviderStatus newstatus); G_END_DECLS diff --git a/src/status-service.c b/src/status-service.c index cd131a4..e839b16 100644 --- a/src/status-service.c +++ b/src/status-service.c @@ -9,32 +9,22 @@ #include "dbus-shared-names.h" -typedef enum -{ - STATUS_SERVICE_STATUS_ONLINE, - STATUS_SERVICE_STATUS_AWAY, - STATUS_SERVICE_STATUS_DND, - STATUS_SERVICE_STATUS_INVISIBLE, - STATUS_SERVICE_STATUS_OFFLINE, - /* Leave as last */ - STATUS_SERVICE_STATUS_LAST -} -StatusServiceStatus; - -static const gchar * status_strings [STATUS_SERVICE_STATUS_LAST] = { - /* STATUS_SERVICE_STATUS_ONLINE, */ N_("Available"), - /* STATUS_SERVICE_STATUS_AWAY, */ N_("Away"), - /* STATUS_SERVICE_STATUS_DND */ N_("Busy"), - /* STATUS_SERVICE_STATUS_INVISIBLE */ N_("Invisible"), - /* STATUS_SERVICE_STATUS_OFFLINE, */ N_("Offline") +#include "status-provider.h" + +static const gchar * status_strings [STATUS_PROVIDER_STATUS_LAST] = { + /* STATUS_PROVIDER_STATUS_ONLINE, */ N_("Available"), + /* STATUS_PROVIDER_STATUS_AWAY, */ N_("Away"), + /* STATUS_PROVIDER_STATUS_DND */ N_("Busy"), + /* STATUS_PROVIDER_STATUS_INVISIBLE */ N_("Invisible"), + /* STATUS_PROVIDER_STATUS_OFFLINE, */ N_("Offline") }; -static const gchar * status_icons[STATUS_SERVICE_STATUS_LAST] = { - /* STATUS_SERVICE_STATUS_ONLINE, */ "user-online", - /* STATUS_SERVICE_STATUS_AWAY, */ "user-away", - /* STATUS_SERVICE_STATUS_DND, */ "user-busy", - /* STATUS_SERVICE_STATUS_INVISIBLE, */ "user-invisible", - /* STATUS_SERVICE_STATUS_OFFLINE */ "user-offline" +static const gchar * status_icons[STATUS_PROVIDER_STATUS_LAST] = { + /* STATUS_PROVIDER_STATUS_ONLINE, */ "user-online", + /* STATUS_PROVIDER_STATUS_AWAY, */ "user-away", + /* STATUS_PROVIDER_STATUS_DND, */ "user-busy", + /* STATUS_PROVIDER_STATUS_INVISIBLE, */ "user-invisible", + /* STATUS_PROVIDER_STATUS_OFFLINE */ "user-offline" }; @@ -44,7 +34,7 @@ static GMainLoop * mainloop = NULL; static void menu_click (DbusmenuMenuitem * mi, gpointer data) { - StatusServiceStatus stat = (StatusServiceStatus)GPOINTER_TO_INT(data); + StatusProviderStatus status = (StatusProviderStatus)GPOINTER_TO_INT(data); } @@ -54,8 +44,8 @@ build_menu (gpointer data) DbusmenuMenuitem * root = DBUSMENU_MENUITEM(data); g_return_val_if_fail(root != NULL, FALSE); - StatusServiceStatus i; - for (i = STATUS_SERVICE_STATUS_ONLINE; i < STATUS_SERVICE_STATUS_LAST; i++) { + StatusProviderStatus i; + for (i = STATUS_PROVIDER_STATUS_ONLINE; i < STATUS_PROVIDER_STATUS_LAST; i++) { DbusmenuMenuitem * mi = dbusmenu_menuitem_new(); dbusmenu_menuitem_property_set(mi, "label", _(status_strings[i])); -- cgit v1.2.3 From 01df160c30f98b6833f0e2341edf9ab94b95d801 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 11 Jun 2009 13:43:16 -0500 Subject: Don't need a private or dispose or finalize. This class is more of an interface. --- src/status-provider.c | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/src/status-provider.c b/src/status-provider.c index c2f7de2..e18cc31 100644 --- a/src/status-provider.c +++ b/src/status-provider.c @@ -4,17 +4,8 @@ #include "status-provider.h" -typedef struct _StatusProviderPrivate StatusProviderPrivate; -struct _StatusProviderPrivate { -}; - -#define STATUS_PROVIDER_GET_PRIVATE(o) \ -(G_TYPE_INSTANCE_GET_PRIVATE ((o), STATUS_PROVIDER_TYPE, StatusProviderPrivate)) - static void status_provider_class_init (StatusProviderClass *klass); static void status_provider_init (StatusProvider *self); -static void status_provider_dispose (GObject *object); -static void status_provider_finalize (GObject *object); G_DEFINE_TYPE (StatusProvider, status_provider, G_TYPE_OBJECT); @@ -23,11 +14,6 @@ status_provider_class_init (StatusProviderClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); - g_type_class_add_private (klass, sizeof (StatusProviderPrivate)); - - object_class->dispose = status_provider_dispose; - object_class->finalize = status_provider_finalize; - return; } @@ -38,18 +24,3 @@ status_provider_init (StatusProvider *self) return; } -static void -status_provider_dispose (GObject *object) -{ - - G_OBJECT_CLASS (status_provider_parent_class)->dispose (object); - return; -} - -static void -status_provider_finalize (GObject *object) -{ - - G_OBJECT_CLASS (status_provider_parent_class)->finalize (object); - return; -} -- cgit v1.2.3 From f9aa333e5737ae0fcab56d9f4c5c9ed463011e9f Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 11 Jun 2009 14:17:04 -0500 Subject: Some public funtions and now they can be subclassed --- src/status-provider.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/status-provider.c b/src/status-provider.c index e18cc31..613019b 100644 --- a/src/status-provider.c +++ b/src/status-provider.c @@ -14,6 +14,11 @@ status_provider_class_init (StatusProviderClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); + klass->status_changed = NULL; + + klass->set_status = NULL; + klass->get_status = NULL; + return; } @@ -24,3 +29,31 @@ status_provider_init (StatusProvider *self) return; } +void +status_provider_set_status (StatusProvider * sp, StatusProviderStatus status) +{ + g_return_if_fail(IS_STATUS_PROVIDER(sp)); + + StatusProviderClass * class = STATUS_PROVIDER_CLASS(sp); + g_return_if_fail(class->set_status != NULL); + + return class->set_status(sp, status); +} + +StatusProviderStatus +status_provider_get_status (StatusProvider * sp) +{ + g_return_val_if_fail(IS_STATUS_PROVIDER(sp), STATUS_PROVIDER_STATUS_OFFLINE); + + StatusProviderClass * class = STATUS_PROVIDER_CLASS(sp); + g_return_val_if_fail(class->get_status != NULL, STATUS_PROVIDER_STATUS_OFFLINE); + + return class->get_status(sp); +} + +void +status_provider_emit_status_changed (StatusProvider * sp, StatusProviderStatus newstatus) +{ + + return; +} -- cgit v1.2.3 From 3567cdb657ebf873fc36ab3449ff4cc3e98bd43d Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 11 Jun 2009 14:26:04 -0500 Subject: Adding in a good ol' signal handler and even emits this puppy. Whew. --- src/status-provider.c | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/status-provider.c b/src/status-provider.c index 613019b..cc9eb32 100644 --- a/src/status-provider.c +++ b/src/status-provider.c @@ -4,6 +4,15 @@ #include "status-provider.h" +/* Signals */ +enum { + STATUS_CHANGED, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = { 0 }; + +/* GObject Boilerplate */ static void status_provider_class_init (StatusProviderClass *klass); static void status_provider_init (StatusProvider *self); @@ -19,6 +28,22 @@ status_provider_class_init (StatusProviderClass *klass) klass->set_status = NULL; klass->get_status = NULL; + /** + StatusProvider::status-changed: + @arg0: The #StatusProvider object. + @arg1: The new status #StatusProviderStatus + + Should be emitted by subclasses everytime that the status + changes externally to us. + */ + signals[STATUS_CHANGED] = g_signal_new(STATUS_PROVIDER_SIGNAL_STATUS_CHANGED, + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET(StatusProviderClass, status_changed), + NULL, NULL, + g_cclosure_marshal_VOID__UINT, + G_TYPE_NONE, 1, G_TYPE_UINT); + return; } @@ -54,6 +79,7 @@ status_provider_get_status (StatusProvider * sp) void status_provider_emit_status_changed (StatusProvider * sp, StatusProviderStatus newstatus) { - + g_return_if_fail(IS_STATUS_PROVIDER(sp)); + g_signal_emit(sp, signals[STATUS_CHANGED], 0, newstatus, TRUE); return; } -- cgit v1.2.3 From 963f1418caa6b438d80445b2eb66f5b42e5add06 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 11 Jun 2009 14:47:42 -0500 Subject: Preliminary pidgin wrappers. --- src/Makefile.am | 6 ++++- src/status-provider-pidgin.c | 56 ++++++++++++++++++++++++++++++++++++++++++++ src/status-provider-pidgin.h | 33 ++++++++++++++++++++++++++ 3 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 src/status-provider-pidgin.c create mode 100644 src/status-provider-pidgin.h diff --git a/src/Makefile.am b/src/Makefile.am index df51cf5..a5380ac 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -7,7 +7,11 @@ libstatus_users_session_la_SOURCES = indicator-sus.c dbus-shared-names.h libstatus_users_session_la_CFLAGS = $(APPLET_CFLAGS) -Wall -Werror libstatus_users_session_la_LIBADD = $(APPLET_LIBS) -indicator_status_service_SOURCES = status-service.c status-provider.h status-provider.c +indicator_status_service_SOURCES = status-service.c \ + status-provider.h \ + status-provider.c \ + status-provider-pidgin.h \ + status-provider-pidgin.c indicator_status_service_CFLAGS = $(STATUSSERVICE_CFLAGS) indicator_status_service_LDADD = $(STATUSSERVICE_LIBS) diff --git a/src/status-provider-pidgin.c b/src/status-provider-pidgin.c new file mode 100644 index 0000000..16fbb69 --- /dev/null +++ b/src/status-provider-pidgin.c @@ -0,0 +1,56 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "status-provider.h" +#include "status-provider-pidgin.h" + +typedef struct _StatusProviderPidginPrivate StatusProviderPidginPrivate; +struct _StatusProviderPidginPrivate { +}; + +#define STATUS_PROVIDER_PIDGIN_GET_PRIVATE(o) \ +(G_TYPE_INSTANCE_GET_PRIVATE ((o), STATUS_PROVIDER_PIDGIN_TYPE, StatusProviderPidginPrivate)) + +static void status_provider_pidgin_class_init (StatusProviderPidginClass *klass); +static void status_provider_pidgin_init (StatusProviderPidgin *self); +static void status_provider_pidgin_dispose (GObject *object); +static void status_provider_pidgin_finalize (GObject *object); + +G_DEFINE_TYPE (StatusProviderPidgin, status_provider_pidgin, STATUS_PROVIDER_TYPE); + +static void +status_provider_pidgin_class_init (StatusProviderPidginClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (StatusProviderPidginPrivate)); + + object_class->dispose = status_provider_pidgin_dispose; + object_class->finalize = status_provider_pidgin_finalize; + + return; +} + +static void +status_provider_pidgin_init (StatusProviderPidgin *self) +{ + + return; +} + +static void +status_provider_pidgin_dispose (GObject *object) +{ + + G_OBJECT_CLASS (status_provider_pidgin_parent_class)->dispose (object); + return; +} + +static void +status_provider_pidgin_finalize (GObject *object) +{ + + G_OBJECT_CLASS (status_provider_pidgin_parent_class)->finalize (object); + return; +} diff --git a/src/status-provider-pidgin.h b/src/status-provider-pidgin.h new file mode 100644 index 0000000..5d4459c --- /dev/null +++ b/src/status-provider-pidgin.h @@ -0,0 +1,33 @@ +#ifndef __STATUS_PROVIDER_PIDGIN_H__ +#define __STATUS_PROVIDER_PIDGIN_H__ + +#include +#include + +#include "status-provider.h" + +G_BEGIN_DECLS + +#define STATUS_PROVIDER_PIDGIN_TYPE (status_provider_pidgin_get_type ()) +#define STATUS_PROVIDER_PIDGIN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), STATUS_PROVIDER_PIDGIN_TYPE, StatusProviderPidgin)) +#define STATUS_PROVIDER_PIDGIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), STATUS_PROVIDER_PIDGIN_TYPE, StatusProviderPidginClass)) +#define IS_STATUS_PROVIDER_PIDGIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), STATUS_PROVIDER_PIDGIN_TYPE)) +#define IS_STATUS_PROVIDER_PIDGIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), STATUS_PROVIDER_PIDGIN_TYPE)) +#define STATUS_PROVIDER_PIDGIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), STATUS_PROVIDER_PIDGIN_TYPE, StatusProviderPidginClass)) + + +typedef struct _StatusProviderPidginClass StatusProviderPidginClass; +struct _StatusProviderPidginClass { + StatusProviderClass parent_class; +}; + +typedef struct _StatusProviderPidgin StatusProviderPidgin; +struct _StatusProviderPidgin { + StatusProvider parent; +}; + +GType status_provider_pidgin_get_type (void); + +G_END_DECLS + +#endif -- cgit v1.2.3 From 5ad8f590bc465555aac14f8de3ca17901b8675f3 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 11 Jun 2009 15:54:13 -0500 Subject: Now we're setting the status provider functions of the StatusProvider interface. --- src/status-provider-pidgin.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/status-provider-pidgin.c b/src/status-provider-pidgin.c index 16fbb69..a0a2ba1 100644 --- a/src/status-provider-pidgin.c +++ b/src/status-provider-pidgin.c @@ -12,10 +12,15 @@ struct _StatusProviderPidginPrivate { #define STATUS_PROVIDER_PIDGIN_GET_PRIVATE(o) \ (G_TYPE_INSTANCE_GET_PRIVATE ((o), STATUS_PROVIDER_PIDGIN_TYPE, StatusProviderPidginPrivate)) +/* Prototypes */ +/* GObject stuff */ static void status_provider_pidgin_class_init (StatusProviderPidginClass *klass); static void status_provider_pidgin_init (StatusProviderPidgin *self); static void status_provider_pidgin_dispose (GObject *object); static void status_provider_pidgin_finalize (GObject *object); +/* Internal Funcs */ +static void set_status (StatusProvider * sp, StatusProviderStatus status); +static StatusProviderStatus get_status (StatusProvider * sp); G_DEFINE_TYPE (StatusProviderPidgin, status_provider_pidgin, STATUS_PROVIDER_TYPE); @@ -29,6 +34,11 @@ status_provider_pidgin_class_init (StatusProviderPidginClass *klass) object_class->dispose = status_provider_pidgin_dispose; object_class->finalize = status_provider_pidgin_finalize; + StatusProviderClass * spclass = STATUS_PROVIDER_CLASS(klass); + + spclass->set_status = set_status; + spclass->get_status = get_status; + return; } @@ -54,3 +64,17 @@ status_provider_pidgin_finalize (GObject *object) G_OBJECT_CLASS (status_provider_pidgin_parent_class)->finalize (object); return; } + +static void +set_status (StatusProvider * sp, StatusProviderStatus status) +{ + + return; +} + +static StatusProviderStatus +get_status (StatusProvider * sp) +{ + + return STATUS_PROVIDER_STATUS_OFFLINE; +} -- cgit v1.2.3 From 2cb1046794b8f2ef0a375d1d1061501473d43c73 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 11 Jun 2009 16:27:03 -0500 Subject: Starting to connect things together. Let's get some Pidgin in there. --- src/status-provider-pidgin.c | 6 ++++++ src/status-provider-pidgin.h | 1 + src/status-service.c | 9 +++++++++ 3 files changed, 16 insertions(+) diff --git a/src/status-provider-pidgin.c b/src/status-provider-pidgin.c index a0a2ba1..ef2bc63 100644 --- a/src/status-provider-pidgin.c +++ b/src/status-provider-pidgin.c @@ -65,6 +65,12 @@ status_provider_pidgin_finalize (GObject *object) return; } +StatusProvider * +status_provider_pidgin_new (void) +{ + return STATUS_PROVIDER(g_object_new(STATUS_PROVIDER_PIDGIN_TYPE, NULL)); +} + static void set_status (StatusProvider * sp, StatusProviderStatus status) { diff --git a/src/status-provider-pidgin.h b/src/status-provider-pidgin.h index 5d4459c..85077e8 100644 --- a/src/status-provider-pidgin.h +++ b/src/status-provider-pidgin.h @@ -27,6 +27,7 @@ struct _StatusProviderPidgin { }; GType status_provider_pidgin_get_type (void); +StatusProvider * status_provider_pidgin_new (void); G_END_DECLS diff --git a/src/status-service.c b/src/status-service.c index e839b16..901f46b 100644 --- a/src/status-service.c +++ b/src/status-service.c @@ -10,6 +10,15 @@ #include "dbus-shared-names.h" #include "status-provider.h" +#include "status-provider-pidgin.h" + +typedef StatusProvider * (*newfunc) (void); +#define STATUS_PROVIDER_CNT 1 +newfunc status_provider_newfuncs[STATUS_PROVIDER_CNT] = { + status_provider_pidgin_new +}; + +StatusProvider * status_providers[STATUS_PROVIDER_CNT] = { 0 }; static const gchar * status_strings [STATUS_PROVIDER_STATUS_LAST] = { /* STATUS_PROVIDER_STATUS_ONLINE, */ N_("Available"), -- cgit v1.2.3 From a14bc91016d9e85892cfb52002fe1debca53dc4a Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 11 Jun 2009 16:39:22 -0500 Subject: Okay, let's use these providers. We're 733t now. --- src/status-service.c | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/src/status-service.c b/src/status-service.c index 901f46b..392b23a 100644 --- a/src/status-service.c +++ b/src/status-service.c @@ -14,11 +14,10 @@ typedef StatusProvider * (*newfunc) (void); #define STATUS_PROVIDER_CNT 1 -newfunc status_provider_newfuncs[STATUS_PROVIDER_CNT] = { +static newfunc status_provider_newfuncs[STATUS_PROVIDER_CNT] = { status_provider_pidgin_new }; - -StatusProvider * status_providers[STATUS_PROVIDER_CNT] = { 0 }; +static StatusProvider * status_providers[STATUS_PROVIDER_CNT] = { 0 }; static const gchar * status_strings [STATUS_PROVIDER_STATUS_LAST] = { /* STATUS_PROVIDER_STATUS_ONLINE, */ N_("Available"), @@ -41,10 +40,26 @@ static DbusmenuMenuitem * root_menuitem = NULL; static GMainLoop * mainloop = NULL; static void -menu_click (DbusmenuMenuitem * mi, gpointer data) +status_menu_click (DbusmenuMenuitem * mi, gpointer data) { StatusProviderStatus status = (StatusProviderStatus)GPOINTER_TO_INT(data); + int i; + for (i = 0; i < STATUS_PROVIDER_CNT; i++) { + status_provider_set_status(status_providers[i], status); + } + + return; +} + +static gboolean +build_providers (gpointer data) +{ + int i; + for (i = 0; i < STATUS_PROVIDER_CNT; i++) { + status_providers[i] = status_provider_newfuncs[i](); + } + return FALSE; } static gboolean @@ -59,7 +74,7 @@ build_menu (gpointer data) dbusmenu_menuitem_property_set(mi, "label", _(status_strings[i])); dbusmenu_menuitem_property_set(mi, "icon", status_icons[i]); - g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, 0, GINT_TO_POINTER(i)); + g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(status_menu_click), GINT_TO_POINTER(i)); dbusmenu_menuitem_child_append(root, mi); @@ -89,6 +104,8 @@ main (int argc, char ** argv) return 1; } + g_idle_add(build_providers, NULL); + root_menuitem = dbusmenu_menuitem_new(); DbusmenuServer * server = dbusmenu_server_new(INDICATOR_STATUS_DBUS_OBJECT); dbusmenu_server_set_root(server, root_menuitem); -- cgit v1.2.3 From b89d8f45e6ee34237c4adc12143b97e9afb23094 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 11 Jun 2009 21:12:17 -0500 Subject: Oops, what a mess up. But this sure makes things unhappy. Nasty to debug segfault. --- src/status-provider.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/status-provider.h b/src/status-provider.h index b20f4f0..87a2ea3 100644 --- a/src/status-provider.h +++ b/src/status-provider.h @@ -34,14 +34,14 @@ struct _StatusProvider { typedef struct _StatusProviderClass StatusProviderClass; struct _StatusProviderClass { + GObjectClass parent_class; + /* Signals */ void (*status_changed) (StatusProviderStatus newstatus); /* Virtual Functions */ void (*set_status) (StatusProvider * sp, StatusProviderStatus newstatus); StatusProviderStatus (*get_status) (StatusProvider * sp); - - GObjectClass parent_class; }; GType status_provider_get_type (void); -- cgit v1.2.3 From 54a3bda1d88cf6f72c0d913380b1d574e9b21cb6 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 11 Jun 2009 21:14:22 -0500 Subject: Adding in a proxy to start gettin' us some Pidgin --- src/status-provider-pidgin.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/status-provider-pidgin.c b/src/status-provider-pidgin.c index ef2bc63..4dde758 100644 --- a/src/status-provider-pidgin.c +++ b/src/status-provider-pidgin.c @@ -5,8 +5,11 @@ #include "status-provider.h" #include "status-provider-pidgin.h" +#include + typedef struct _StatusProviderPidginPrivate StatusProviderPidginPrivate; struct _StatusProviderPidginPrivate { + DBusGProxy * proxy; }; #define STATUS_PROVIDER_PIDGIN_GET_PRIVATE(o) \ @@ -45,6 +48,9 @@ status_provider_pidgin_class_init (StatusProviderPidginClass *klass) static void status_provider_pidgin_init (StatusProviderPidgin *self) { + StatusProviderPidginPrivate * priv = STATUS_PROVIDER_PIDGIN_GET_PRIVATE(self); + + priv->proxy = NULL; return; } -- cgit v1.2.3 From f3f762e1bb3c91ef2226ea82982d24c51ee7a39e Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 12 Jun 2009 12:50:02 -0500 Subject: Putting in the status translation tables. --- src/status-provider-pidgin.c | 44 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/src/status-provider-pidgin.c b/src/status-provider-pidgin.c index 4dde758..1f5c5cc 100644 --- a/src/status-provider-pidgin.c +++ b/src/status-provider-pidgin.c @@ -7,9 +7,42 @@ #include +typedef enum { + PG_STATUS_UNKNOWN, + PG_STATUS_OFFLINE, + PG_STATUS_AVAILABLE, + PG_STATUS_UNAVAILABLE, + PG_STATUS_INVISIBLE, + PG_STATUS_AWAY, + PG_STATUS_EXTENDEND_AWAY, + PG_STATUS_MOBILE, + PG_STATUS_TUNE +} pg_status_t; + +static const StatusProviderStatus pg_to_sp_map[] = { + /* PG_STATUS_UNKNOWN, */ STATUS_PROVIDER_STATUS_OFFLINE, + /* PG_STATUS_OFFLINE, */ STATUS_PROVIDER_STATUS_OFFLINE, + /* PG_STATUS_AVAILABLE, */ STATUS_PROVIDER_STATUS_ONLINE, + /* PG_STATUS_UNAVAILABLE, */ STATUS_PROVIDER_STATUS_DND, + /* PG_STATUS_INVISIBLE, */ STATUS_PROVIDER_STATUS_INVISIBLE, + /* PG_STATUS_AWAY, */ STATUS_PROVIDER_STATUS_AWAY, + /* PG_STATUS_EXTENDEND_AWAY, */ STATUS_PROVIDER_STATUS_AWAY, + /* PG_STATUS_MOBILE, */ STATUS_PROVIDER_STATUS_OFFLINE, + /* PG_STATUS_TUNE */ STATUS_PROVIDER_STATUS_OFFLINE +}; + +static const pg_status_t sp_to_pg_map[STATUS_PROVIDER_STATUS_LAST] = { + /* STATUS_PROVIDER_STATUS_ONLINE, */ PG_STATUS_AVAILABLE, + /* STATUS_PROVIDER_STATUS_AWAY, */ PG_STATUS_AWAY, + /* STATUS_PROVIDER_STATUS_DND */ PG_STATUS_UNAVAILABLE, + /* STATUS_PROVIDER_STATUS_INVISIBLE*/ PG_STATUS_INVISIBLE, + /* STATUS_PROVIDER_STATUS_OFFLINE */ PG_STATUS_OFFLINE +}; + typedef struct _StatusProviderPidginPrivate StatusProviderPidginPrivate; struct _StatusProviderPidginPrivate { DBusGProxy * proxy; + pg_status_t pg_status; }; #define STATUS_PROVIDER_PIDGIN_GET_PRIVATE(o) \ @@ -51,6 +84,7 @@ status_provider_pidgin_init (StatusProviderPidgin *self) StatusProviderPidginPrivate * priv = STATUS_PROVIDER_PIDGIN_GET_PRIVATE(self); priv->proxy = NULL; + priv->pg_status = PG_STATUS_OFFLINE; return; } @@ -80,13 +114,17 @@ status_provider_pidgin_new (void) static void set_status (StatusProvider * sp, StatusProviderStatus status) { - + g_return_if_fail(IS_STATUS_PROVIDER_PIDGIN(sp)); + StatusProviderPidginPrivate * priv = STATUS_PROVIDER_PIDGIN_GET_PRIVATE(sp); + pg_status_t pg_status = sp_to_pg_map[status]; + priv->pg_status = pg_status; return; } static StatusProviderStatus get_status (StatusProvider * sp) { - - return STATUS_PROVIDER_STATUS_OFFLINE; + g_return_val_if_fail(IS_STATUS_PROVIDER_PIDGIN(sp), STATUS_PROVIDER_STATUS_OFFLINE); + StatusProviderPidginPrivate * priv = STATUS_PROVIDER_PIDGIN_GET_PRIVATE(sp); + return pg_to_sp_map[priv->pg_status]; } -- cgit v1.2.3 From 922ee2a93ffaebb430d406d787abeb4687657b73 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 12 Jun 2009 12:54:15 -0500 Subject: Some comments describing the intentions of the functions. --- src/status-provider-pidgin.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/status-provider-pidgin.c b/src/status-provider-pidgin.c index 1f5c5cc..600ee79 100644 --- a/src/status-provider-pidgin.c +++ b/src/status-provider-pidgin.c @@ -105,12 +105,22 @@ status_provider_pidgin_finalize (GObject *object) return; } +/** + status_provider_pidgin_new: + + Creates a new #StatusProviderPidgin object. No parameters or anything + like that. Just a convience function. + + Return value: A new instance of #StatusProviderPidgin +*/ StatusProvider * status_provider_pidgin_new (void) { return STATUS_PROVIDER(g_object_new(STATUS_PROVIDER_PIDGIN_TYPE, NULL)); } +/* Takes the status provided generically for Status providers + and turns it into a Pidgin status and sends it to Pidgin. */ static void set_status (StatusProvider * sp, StatusProviderStatus status) { @@ -121,6 +131,8 @@ set_status (StatusProvider * sp, StatusProviderStatus status) return; } +/* Takes the cached Pidgin status and makes it into the generic + Status provider status */ static StatusProviderStatus get_status (StatusProvider * sp) { -- cgit v1.2.3 From d9116a6713e4a7d5bdbf10ba96fc3d34caf4f5eb Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 12 Jun 2009 16:20:47 -0500 Subject: Adding a DBus interface for the status specific stuff --- src/Makefile.am | 33 ++++++++++++++++++++++++++++----- src/status-service.xml | 23 +++++++++++++++++++++++ 2 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 src/status-service.xml diff --git a/src/Makefile.am b/src/Makefile.am index a5380ac..a6ce265 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -7,14 +7,31 @@ libstatus_users_session_la_SOURCES = indicator-sus.c dbus-shared-names.h libstatus_users_session_la_CFLAGS = $(APPLET_CFLAGS) -Wall -Werror libstatus_users_session_la_LIBADD = $(APPLET_LIBS) -indicator_status_service_SOURCES = status-service.c \ - status-provider.h \ - status-provider.c \ - status-provider-pidgin.h \ - status-provider-pidgin.c +indicator_status_service_SOURCES = \ + status-service.c \ + status-service-client.h \ + status-service-server.h \ + status-provider.h \ + status-provider.c \ + status-provider-pidgin.h \ + status-provider-pidgin.c indicator_status_service_CFLAGS = $(STATUSSERVICE_CFLAGS) indicator_status_service_LDADD = $(STATUSSERVICE_LIBS) +status-service-client.h: status-service.xml + dbus-binding-tool \ + --prefix=_status_service_client \ + --mode=glib-client \ + --output=status-service-client.h \ + $(srcdir)/status-service.xml + +status-service-server.h: status-service.xml + dbus-binding-tool \ + --prefix=_status_service_server \ + --mode=glib-server \ + --output=status-service-server.h \ + $(srcdir)/status-service.xml + indicator_users_service_SOURCES = users-service.c indicator_users_service_CFLAGS = $(USERSSERVICE_CFLAGS) indicator_users_service_LDADD = $(USERSSERVICE_LIBS) @@ -23,3 +40,9 @@ indicator_session_service_SOURCES = session-service.c indicator_session_service_CFLAGS = $(SESSIONSERVICE_CFLAGS) indicator_session_service_LDADD = $(SESSIONSERVICE_LIBS) +BUILT_SOURCES = \ + status-service-client.h \ + status-service-server.h + +EXTRA_DIST = \ + status-service.xml diff --git a/src/status-service.xml b/src/status-service.xml new file mode 100644 index 0000000..189df81 --- /dev/null +++ b/src/status-service.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + -- cgit v1.2.3 From 92632f9ebdf278b654c6ad99eabab826e4b32cac Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 12 Jun 2009 16:31:10 -0500 Subject: Actually the client is the indicator. Silly to have one binary be both client and server, heh. --- src/Makefile.am | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index a6ce265..a6a4dd5 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,15 +1,25 @@ libexec_PROGRAMS = indicator-status-service indicator-users-service indicator-session-service +################### +# Indicator Stuff +################### + status_users_sessionlibdir = $(INDICATORDIR) status_users_sessionlib_LTLIBRARIES = libstatus-users-session.la -libstatus_users_session_la_SOURCES = indicator-sus.c dbus-shared-names.h +libstatus_users_session_la_SOURCES = \ + indicator-sus.c \ + dbus-shared-names.h \ + status-service-client.h libstatus_users_session_la_CFLAGS = $(APPLET_CFLAGS) -Wall -Werror libstatus_users_session_la_LIBADD = $(APPLET_LIBS) +################ +# Status Stuff +################ + indicator_status_service_SOURCES = \ status-service.c \ - status-service-client.h \ status-service-server.h \ status-provider.h \ status-provider.c \ @@ -32,14 +42,26 @@ status-service-server.h: status-service.xml --output=status-service-server.h \ $(srcdir)/status-service.xml +############### +# Users Stuff +############### + indicator_users_service_SOURCES = users-service.c indicator_users_service_CFLAGS = $(USERSSERVICE_CFLAGS) indicator_users_service_LDADD = $(USERSSERVICE_LIBS) +################# +# Session Stuff +################# + indicator_session_service_SOURCES = session-service.c indicator_session_service_CFLAGS = $(SESSIONSERVICE_CFLAGS) indicator_session_service_LDADD = $(SESSIONSERVICE_LIBS) +############### +# Other Stuff +############### + BUILT_SOURCES = \ status-service-client.h \ status-service-server.h -- cgit v1.2.3 From 35477b8fb1bd21c4cccf039c4648af47972414a9 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 12 Jun 2009 16:34:22 -0500 Subject: Brining in the client side of the API --- src/indicator-sus.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/indicator-sus.c b/src/indicator-sus.c index 4c1c163..5d6c219 100644 --- a/src/indicator-sus.c +++ b/src/indicator-sus.c @@ -10,6 +10,7 @@ INDICATOR_SET_VERSION INDICATOR_SET_NAME("users-status-session") #include "dbus-shared-names.h" +#include "status-service-client.h" static GtkMenu * status_menu = NULL; static GtkMenu * users_menu = NULL; -- cgit v1.2.3 From 9eb765152122a08ddfa95b150d9a7d5c46559356 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 12 Jun 2009 16:56:08 -0500 Subject: A quickly little object to put itself on DBus. --- src/Makefile.am | 2 ++ src/status-service-dbus.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++ src/status-service-dbus.h | 31 ++++++++++++++++++++++++++ src/status-service.c | 2 ++ 4 files changed, 91 insertions(+) create mode 100644 src/status-service-dbus.c create mode 100644 src/status-service-dbus.h diff --git a/src/Makefile.am b/src/Makefile.am index a6a4dd5..1965fe9 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -20,6 +20,8 @@ libstatus_users_session_la_LIBADD = $(APPLET_LIBS) indicator_status_service_SOURCES = \ status-service.c \ + status-service-dbus.h \ + status-service-dbus.c \ status-service-server.h \ status-provider.h \ status-provider.c \ diff --git a/src/status-service-dbus.c b/src/status-service-dbus.c new file mode 100644 index 0000000..1eb94ca --- /dev/null +++ b/src/status-service-dbus.c @@ -0,0 +1,56 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "status-service-dbus.h" + +static void status_service_dbus_class_init (StatusServiceDbusClass *klass); +static void status_service_dbus_init (StatusServiceDbus *self); +static void status_service_dbus_dispose (GObject *object); +static void status_service_dbus_finalize (GObject *object); +static void _status_service_server_watch (void); + +#include "status-service-server.h" + +G_DEFINE_TYPE (StatusServiceDbus, status_service_dbus, G_TYPE_OBJECT); + +static void +status_service_dbus_class_init (StatusServiceDbusClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->dispose = status_service_dbus_dispose; + object_class->finalize = status_service_dbus_finalize; + + return; +} + +static void +status_service_dbus_init (StatusServiceDbus *self) +{ + + return; +} + +static void +status_service_dbus_dispose (GObject *object) +{ + + G_OBJECT_CLASS (status_service_dbus_parent_class)->dispose (object); + return; +} + +static void +status_service_dbus_finalize (GObject *object) +{ + + G_OBJECT_CLASS (status_service_dbus_parent_class)->finalize (object); + return; +} + +static void +_status_service_server_watch (void) +{ + + return; +} diff --git a/src/status-service-dbus.h b/src/status-service-dbus.h new file mode 100644 index 0000000..1805dc5 --- /dev/null +++ b/src/status-service-dbus.h @@ -0,0 +1,31 @@ +#ifndef __STATUS_SERVICE_DBUS_H__ +#define __STATUS_SERVICE_DBUS_H__ + +#include +#include + +G_BEGIN_DECLS + +#define STATUS_SERVICE_DBUS_TYPE (status_service_dbus_get_type ()) +#define STATUS_SERVICE_DBUS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), STATUS_SERVICE_DBUS_TYPE, StatusServiceDbus)) +#define STATUS_SERVICE_DBUS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), STATUS_SERVICE_DBUS_TYPE, StatusServiceDbusClass)) +#define IS_STATUS_SERVICE_DBUS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), STATUS_SERVICE_DBUS_TYPE)) +#define IS_STATUS_SERVICE_DBUS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), STATUS_SERVICE_DBUS_TYPE)) +#define STATUS_SERVICE_DBUS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), STATUS_SERVICE_DBUS_TYPE, StatusServiceDbusClass)) + +typedef struct _StatusServiceDbus StatusServiceDbus; +typedef struct _StatusServiceDbusClass StatusServiceDbusClass; + +struct _StatusServiceDbusClass { + GObjectClass parent_class; +}; + +struct _StatusServiceDbus { + GObject parent; +}; + +GType status_service_dbus_get_type (void); + +G_END_DECLS + +#endif diff --git a/src/status-service.c b/src/status-service.c index 392b23a..e31a0db 100644 --- a/src/status-service.c +++ b/src/status-service.c @@ -9,6 +9,8 @@ #include "dbus-shared-names.h" +#include "status-service-dbus.h" + #include "status-provider.h" #include "status-provider-pidgin.h" -- cgit v1.2.3 From 094b80fb89c15cc369f4ca50e218cec12efbaadc Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 12 Jun 2009 17:04:48 -0500 Subject: Okay, we need functions as we want a list of icons. --- src/status-service-dbus.c | 16 ++++++++++++++++ src/status-service.xml | 14 ++++++++------ 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/status-service-dbus.c b/src/status-service-dbus.c index 1eb94ca..9ffc6aa 100644 --- a/src/status-service-dbus.c +++ b/src/status-service-dbus.c @@ -9,6 +9,8 @@ static void status_service_dbus_init (StatusServiceDbus *self); static void status_service_dbus_dispose (GObject *object); static void status_service_dbus_finalize (GObject *object); static void _status_service_server_watch (void); +static void _status_service_server_status_icons (void); +static void _status_service_server_pretty_user_name (void); #include "status-service-server.h" @@ -54,3 +56,17 @@ _status_service_server_watch (void) return; } + +static void +_status_service_server_status_icons (void) +{ + + return; +} + +static void +_status_service_server_pretty_user_name (void) +{ + + return; +} diff --git a/src/status-service.xml b/src/status-service.xml index 189df81..df10859 100644 --- a/src/status-service.xml +++ b/src/status-service.xml @@ -2,21 +2,23 @@ - - - - + + + + + + - - + + -- cgit v1.2.3 From 080aa534c8a204cb8a22c71059c9e4f681c5668f Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 16 Jun 2009 17:15:39 -0500 Subject: Building the service files more correctly. --- data/Makefile.am | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/data/Makefile.am b/data/Makefile.am index da1bcd2..e003b0e 100644 --- a/data/Makefile.am +++ b/data/Makefile.am @@ -5,8 +5,11 @@ service_in_files = indicator-status.service.in \ indicator-session.service.in dbus_services_DATA = $(service_in_files:.service.in=.service) -$(dbus_services_DATA): $(service_in_files) Makefile - @sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@ +%.service: %.service.in + sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@ + +#$(dbus_services_DATA): $(service_in_files) Makefile +# sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@ EXTRA_DIST = $(service_in_files) -- cgit v1.2.3 From 377777d3cde780875ab39ffb647e4009153365bc Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 19 Jun 2009 07:21:36 -0500 Subject: Splitting out the menu loading and process starting code to make it lazy and push it into the idle loop. No blocking DBus on startup. --- src/indicator-sus.c | 66 +++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 56 insertions(+), 10 deletions(-) diff --git a/src/indicator-sus.c b/src/indicator-sus.c index 5d6c219..15d4e5a 100644 --- a/src/indicator-sus.c +++ b/src/indicator-sus.c @@ -17,6 +17,9 @@ static GtkMenu * users_menu = NULL; static GtkMenu * session_menu = NULL; static GtkMenu * main_menu = NULL; +static DBusGConnection * connection = NULL; +static DBusGProxy * proxy = NULL; + GtkLabel * get_label (void) { @@ -30,54 +33,97 @@ get_icon (void) return NULL; } -GtkMenu * -get_menu (void) +static gboolean +build_status_menu (gpointer userdata) { guint returnval = 0; GError * error = NULL; - DBusGConnection * connection = dbus_g_bus_get(DBUS_BUS_SESSION, NULL); - DBusGProxy * proxy = dbus_g_proxy_new_for_name(connection, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS); + if (proxy == NULL) { + /* If we don't have DBus, let's stay in the idle loop */ + return TRUE; + } if (!org_freedesktop_DBus_start_service_by_name (proxy, INDICATOR_STATUS_DBUS_NAME, 0, &returnval, &error)) { g_error("Unable to send message to DBus to start service: %s", error != NULL ? error->message : "(NULL error)" ); g_error_free(error); - return NULL; + return FALSE; } if (returnval != DBUS_START_REPLY_SUCCESS && returnval != DBUS_START_REPLY_ALREADY_RUNNING) { g_error("Return value isn't indicative of success: %d", returnval); - return NULL; + return FALSE; } status_menu = GTK_MENU(dbusmenu_gtkmenu_new(INDICATOR_STATUS_DBUS_NAME, INDICATOR_STATUS_DBUS_OBJECT)); + return FALSE; +} + +static gboolean +build_users_menu (gpointer userdata) +{ + guint returnval = 0; + GError * error = NULL; + + if (proxy == NULL) { + /* If we don't have DBus, let's stay in the idle loop */ + return TRUE; + } + if (!org_freedesktop_DBus_start_service_by_name (proxy, INDICATOR_USERS_DBUS_NAME, 0, &returnval, &error)) { g_error("Unable to send message to DBus to start service: %s", error != NULL ? error->message : "(NULL error)" ); g_error_free(error); - return NULL; + return FALSE; } if (returnval != DBUS_START_REPLY_SUCCESS && returnval != DBUS_START_REPLY_ALREADY_RUNNING) { g_error("Return value isn't indicative of success: %d", returnval); - return NULL; + return FALSE; } users_menu = GTK_MENU(dbusmenu_gtkmenu_new(INDICATOR_USERS_DBUS_NAME, INDICATOR_USERS_DBUS_OBJECT)); + return FALSE; +} + +static gboolean +build_session_menu (gpointer userdata) +{ + guint returnval = 0; + GError * error = NULL; + + if (proxy == NULL) { + /* If we don't have DBus, let's stay in the idle loop */ + return TRUE; + } + if (!org_freedesktop_DBus_start_service_by_name (proxy, INDICATOR_SESSION_DBUS_NAME, 0, &returnval, &error)) { g_error("Unable to send message to DBus to start service: %s", error != NULL ? error->message : "(NULL error)" ); g_error_free(error); - return NULL; + return FALSE; } if (returnval != DBUS_START_REPLY_SUCCESS && returnval != DBUS_START_REPLY_ALREADY_RUNNING) { g_error("Return value isn't indicative of success: %d", returnval); - return NULL; + return FALSE; } session_menu = GTK_MENU(dbusmenu_gtkmenu_new(INDICATOR_SESSION_DBUS_NAME, INDICATOR_SESSION_DBUS_OBJECT)); + return FALSE; +} + +GtkMenu * +get_menu (void) +{ + connection = dbus_g_bus_get(DBUS_BUS_SESSION, NULL); + proxy = dbus_g_proxy_new_for_name(connection, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS); + + g_idle_add(build_status_menu, NULL); + g_idle_add(build_users_menu, NULL); + g_idle_add(build_session_menu, NULL); + main_menu = GTK_MENU(gtk_menu_new()); return main_menu; -- cgit v1.2.3 From 310a2c18788756cb5e5a5c321ce6ca918a786c6e Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 19 Jun 2009 10:20:06 -0500 Subject: Adding in separators --- src/indicator-sus.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/indicator-sus.c b/src/indicator-sus.c index 15d4e5a..86c84e2 100644 --- a/src/indicator-sus.c +++ b/src/indicator-sus.c @@ -17,6 +17,10 @@ static GtkMenu * users_menu = NULL; static GtkMenu * session_menu = NULL; static GtkMenu * main_menu = NULL; +static GtkWidget * status_separator = NULL; +static GtkWidget * users_separator = NULL; +#define SEPARATOR_SHOWN(sep) (sep != NULL && GTK_WIDGET_VISIBLE(sep)) + static DBusGConnection * connection = NULL; static DBusGProxy * proxy = NULL; @@ -57,6 +61,9 @@ build_status_menu (gpointer userdata) status_menu = GTK_MENU(dbusmenu_gtkmenu_new(INDICATOR_STATUS_DBUS_NAME, INDICATOR_STATUS_DBUS_OBJECT)); + status_separator = gtk_separator_menu_item_new(); + gtk_widget_hide(status_separator); /* Should be default, I'm just being explicit. $(%*#$ hide already! */ + return FALSE; } @@ -84,6 +91,9 @@ build_users_menu (gpointer userdata) users_menu = GTK_MENU(dbusmenu_gtkmenu_new(INDICATOR_USERS_DBUS_NAME, INDICATOR_USERS_DBUS_OBJECT)); + users_separator = gtk_separator_menu_item_new(); + gtk_widget_hide(users_separator); /* Should be default, I'm just being explicit. $(%*#$ hide already! */ + return FALSE; } -- cgit v1.2.3 From c99e8b57e531374bff266fedb16a3915618af701 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 19 Jun 2009 13:38:01 -0500 Subject: Bubbling up the position information to a final function to put things on the main menu. --- src/indicator-sus.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/src/indicator-sus.c b/src/indicator-sus.c index 86c84e2..b2419b9 100644 --- a/src/indicator-sus.c +++ b/src/indicator-sus.c @@ -37,6 +37,50 @@ get_icon (void) return NULL; } +static void +menu_add (GtkContainer * source, GtkWidget * addee, GtkMenu * addto, guint positionoffset) +{ + + +} + +static void +status_menu_add (GtkContainer * container, GtkWidget * widget, gpointer userdata) +{ + menu_add(container, widget, GTK_MENU(userdata), 0); + gtk_widget_show(status_separator); + return; +} + +static void +users_menu_add (GtkContainer * container, GtkWidget * widget, gpointer userdata) +{ + guint position = 0; + if (SEPARATOR_SHOWN(status_separator)) { + GList * location = g_list_find(GTK_MENU_SHELL(main_menu)->children, status_separator); + position = g_list_position(GTK_MENU_SHELL(main_menu)->children, location) + 1; + } + + menu_add(container, widget, GTK_MENU(userdata), position); + gtk_widget_show(users_separator); + return; +} + +static void +session_menu_add (GtkContainer * container, GtkWidget * widget, gpointer userdata) +{ + guint position = 0; + if (SEPARATOR_SHOWN(users_separator)) { + GList * location = g_list_find(GTK_MENU_SHELL(main_menu)->children, users_separator); + position = g_list_position(GTK_MENU_SHELL(main_menu)->children, location) + 1; + } + + menu_add(container, widget, GTK_MENU(userdata), position); + gtk_widget_show(status_separator); + return; +} + + static gboolean build_status_menu (gpointer userdata) { @@ -60,6 +104,7 @@ build_status_menu (gpointer userdata) } status_menu = GTK_MENU(dbusmenu_gtkmenu_new(INDICATOR_STATUS_DBUS_NAME, INDICATOR_STATUS_DBUS_OBJECT)); + g_signal_connect(G_OBJECT(status_menu), "added", G_CALLBACK(status_menu_add), main_menu); status_separator = gtk_separator_menu_item_new(); gtk_widget_hide(status_separator); /* Should be default, I'm just being explicit. $(%*#$ hide already! */ @@ -90,6 +135,7 @@ build_users_menu (gpointer userdata) } users_menu = GTK_MENU(dbusmenu_gtkmenu_new(INDICATOR_USERS_DBUS_NAME, INDICATOR_USERS_DBUS_OBJECT)); + g_signal_connect(G_OBJECT(users_menu), "added", G_CALLBACK(users_menu_add), main_menu); users_separator = gtk_separator_menu_item_new(); gtk_widget_hide(users_separator); /* Should be default, I'm just being explicit. $(%*#$ hide already! */ @@ -120,6 +166,7 @@ build_session_menu (gpointer userdata) } session_menu = GTK_MENU(dbusmenu_gtkmenu_new(INDICATOR_SESSION_DBUS_NAME, INDICATOR_SESSION_DBUS_OBJECT)); + g_signal_connect(G_OBJECT(session_menu), "added", G_CALLBACK(session_menu_add), main_menu); return FALSE; } -- cgit v1.2.3 From 7f2cb8b3f917ceddd4ebae8dd8e55f966cbd0fcc Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 19 Jun 2009 13:43:01 -0500 Subject: Fleshing out the insertion function. Let's get some menus. --- src/indicator-sus.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/indicator-sus.c b/src/indicator-sus.c index b2419b9..6b69269 100644 --- a/src/indicator-sus.c +++ b/src/indicator-sus.c @@ -40,8 +40,13 @@ get_icon (void) static void menu_add (GtkContainer * source, GtkWidget * addee, GtkMenu * addto, guint positionoffset) { + GList * location = g_list_find(GTK_MENU_SHELL(source)->children, addee); + guint position = g_list_position(GTK_MENU_SHELL(source)->children, location); + position += positionoffset; + gtk_menu_insert(addto, addee, position); + return; } static void -- cgit v1.2.3 From 901278c9c269c5052cf5ebc54ef859c63f0b94f2 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 19 Jun 2009 14:42:15 -0500 Subject: Oh, the signal is 'add' not 'added'. How I love to have random strings without checking, all the elegance of Python. --- src/indicator-sus.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/indicator-sus.c b/src/indicator-sus.c index 6b69269..d8b808a 100644 --- a/src/indicator-sus.c +++ b/src/indicator-sus.c @@ -109,7 +109,7 @@ build_status_menu (gpointer userdata) } status_menu = GTK_MENU(dbusmenu_gtkmenu_new(INDICATOR_STATUS_DBUS_NAME, INDICATOR_STATUS_DBUS_OBJECT)); - g_signal_connect(G_OBJECT(status_menu), "added", G_CALLBACK(status_menu_add), main_menu); + g_signal_connect(G_OBJECT(status_menu), "add", G_CALLBACK(status_menu_add), main_menu); status_separator = gtk_separator_menu_item_new(); gtk_widget_hide(status_separator); /* Should be default, I'm just being explicit. $(%*#$ hide already! */ @@ -140,7 +140,7 @@ build_users_menu (gpointer userdata) } users_menu = GTK_MENU(dbusmenu_gtkmenu_new(INDICATOR_USERS_DBUS_NAME, INDICATOR_USERS_DBUS_OBJECT)); - g_signal_connect(G_OBJECT(users_menu), "added", G_CALLBACK(users_menu_add), main_menu); + g_signal_connect(G_OBJECT(users_menu), "add", G_CALLBACK(users_menu_add), main_menu); users_separator = gtk_separator_menu_item_new(); gtk_widget_hide(users_separator); /* Should be default, I'm just being explicit. $(%*#$ hide already! */ @@ -171,7 +171,7 @@ build_session_menu (gpointer userdata) } session_menu = GTK_MENU(dbusmenu_gtkmenu_new(INDICATOR_SESSION_DBUS_NAME, INDICATOR_SESSION_DBUS_OBJECT)); - g_signal_connect(G_OBJECT(session_menu), "added", G_CALLBACK(session_menu_add), main_menu); + g_signal_connect(G_OBJECT(session_menu), "add", G_CALLBACK(session_menu_add), main_menu); return FALSE; } -- cgit v1.2.3 From 2cb6204a90437626211aa4337942d3f072985756 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 19 Jun 2009 15:32:49 -0500 Subject: Showing the added menu and adding in a loading item. --- src/indicator-sus.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/indicator-sus.c b/src/indicator-sus.c index d8b808a..84eb929 100644 --- a/src/indicator-sus.c +++ b/src/indicator-sus.c @@ -20,6 +20,7 @@ static GtkMenu * main_menu = NULL; static GtkWidget * status_separator = NULL; static GtkWidget * users_separator = NULL; #define SEPARATOR_SHOWN(sep) (sep != NULL && GTK_WIDGET_VISIBLE(sep)) +static GtkWidget * loading_item = NULL; static DBusGConnection * connection = NULL; static DBusGProxy * proxy = NULL; @@ -44,8 +45,13 @@ menu_add (GtkContainer * source, GtkWidget * addee, GtkMenu * addto, guint posit guint position = g_list_position(GTK_MENU_SHELL(source)->children, location); position += positionoffset; + g_debug("Adding a widget: %d", position); gtk_menu_insert(addto, addee, position); + gtk_widget_show(addee); + + gtk_widget_hide(loading_item); + return; } @@ -81,7 +87,6 @@ session_menu_add (GtkContainer * container, GtkWidget * widget, gpointer userdat } menu_add(container, widget, GTK_MENU(userdata), position); - gtk_widget_show(status_separator); return; } @@ -112,6 +117,7 @@ build_status_menu (gpointer userdata) g_signal_connect(G_OBJECT(status_menu), "add", G_CALLBACK(status_menu_add), main_menu); status_separator = gtk_separator_menu_item_new(); + gtk_menu_shell_append(GTK_MENU_SHELL(main_menu), status_separator); gtk_widget_hide(status_separator); /* Should be default, I'm just being explicit. $(%*#$ hide already! */ return FALSE; @@ -143,6 +149,7 @@ build_users_menu (gpointer userdata) g_signal_connect(G_OBJECT(users_menu), "add", G_CALLBACK(users_menu_add), main_menu); users_separator = gtk_separator_menu_item_new(); + gtk_menu_shell_append(GTK_MENU_SHELL(main_menu), users_separator); gtk_widget_hide(users_separator); /* Should be default, I'm just being explicit. $(%*#$ hide already! */ return FALSE; @@ -187,6 +194,8 @@ get_menu (void) g_idle_add(build_session_menu, NULL); main_menu = GTK_MENU(gtk_menu_new()); + loading_item = gtk_menu_item_new_with_label("Loading..."); + gtk_menu_shell_append(GTK_MENU_SHELL(main_menu), loading_item); return main_menu; } -- cgit v1.2.3 From 5a5c1bb4559496948f43d893f17ca84690a847d0 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 22 Jun 2009 13:08:35 -0500 Subject: Removing the .so* stuff --- src/Makefile.am | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Makefile.am b/src/Makefile.am index 1965fe9..b681b5b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -13,6 +13,7 @@ libstatus_users_session_la_SOURCES = \ status-service-client.h libstatus_users_session_la_CFLAGS = $(APPLET_CFLAGS) -Wall -Werror libstatus_users_session_la_LIBADD = $(APPLET_LIBS) +libstatus_users_session_la_LDFLAGS = -module -avoid-version ################ # Status Stuff -- cgit v1.2.3 From 23fa731fafd03ac156f4b2b121250fa7a76a9a53 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 22 Jun 2009 22:49:02 -0500 Subject: Using the new dbusmenu signal for item added --- src/indicator-sus.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/indicator-sus.c b/src/indicator-sus.c index 84eb929..53a0db6 100644 --- a/src/indicator-sus.c +++ b/src/indicator-sus.c @@ -114,7 +114,7 @@ build_status_menu (gpointer userdata) } status_menu = GTK_MENU(dbusmenu_gtkmenu_new(INDICATOR_STATUS_DBUS_NAME, INDICATOR_STATUS_DBUS_OBJECT)); - g_signal_connect(G_OBJECT(status_menu), "add", G_CALLBACK(status_menu_add), main_menu); + g_signal_connect(G_OBJECT(status_menu), DBUSMENU_GTKMENU_SIGNAL_ADD, G_CALLBACK(status_menu_add), main_menu); status_separator = gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(main_menu), status_separator); @@ -146,7 +146,7 @@ build_users_menu (gpointer userdata) } users_menu = GTK_MENU(dbusmenu_gtkmenu_new(INDICATOR_USERS_DBUS_NAME, INDICATOR_USERS_DBUS_OBJECT)); - g_signal_connect(G_OBJECT(users_menu), "add", G_CALLBACK(users_menu_add), main_menu); + g_signal_connect(G_OBJECT(users_menu), DBUSMENU_GTKMENU_SIGNAL_ADD, G_CALLBACK(users_menu_add), main_menu); users_separator = gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(main_menu), users_separator); @@ -178,7 +178,7 @@ build_session_menu (gpointer userdata) } session_menu = GTK_MENU(dbusmenu_gtkmenu_new(INDICATOR_SESSION_DBUS_NAME, INDICATOR_SESSION_DBUS_OBJECT)); - g_signal_connect(G_OBJECT(session_menu), "add", G_CALLBACK(session_menu_add), main_menu); + g_signal_connect(G_OBJECT(session_menu), DBUSMENU_GTKMENU_SIGNAL_ADD, G_CALLBACK(session_menu_add), main_menu); return FALSE; } -- cgit v1.2.3 From 4512d99684ff8d0f009cc69c0351b827dd369988 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 26 Jun 2009 16:48:06 -0500 Subject: Phase one switch to the client instead of the menu --- src/indicator-sus.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/indicator-sus.c b/src/indicator-sus.c index 53a0db6..cd3337d 100644 --- a/src/indicator-sus.c +++ b/src/indicator-sus.c @@ -1,6 +1,6 @@ #include -#include +#include #include #include @@ -12,9 +12,10 @@ INDICATOR_SET_NAME("users-status-session") #include "dbus-shared-names.h" #include "status-service-client.h" -static GtkMenu * status_menu = NULL; -static GtkMenu * users_menu = NULL; -static GtkMenu * session_menu = NULL; +static DbusmenuGtkClient * status_client = NULL; +static DbusmenuGtkClient * users_client = NULL; +static DbusmenuGtkClient * session_client = NULL; + static GtkMenu * main_menu = NULL; static GtkWidget * status_separator = NULL; @@ -113,8 +114,8 @@ build_status_menu (gpointer userdata) return FALSE; } - status_menu = GTK_MENU(dbusmenu_gtkmenu_new(INDICATOR_STATUS_DBUS_NAME, INDICATOR_STATUS_DBUS_OBJECT)); - g_signal_connect(G_OBJECT(status_menu), DBUSMENU_GTKMENU_SIGNAL_ADD, G_CALLBACK(status_menu_add), main_menu); + status_client = dbusmenu_gtkclient_new(INDICATOR_STATUS_DBUS_NAME, INDICATOR_STATUS_DBUS_OBJECT); + g_signal_connect(G_OBJECT(status_client), DBUSMENU_GTKCLIENT_SIGNAL_ROOT_CHANGED, G_CALLBACK(status_menu_add), main_menu); status_separator = gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(main_menu), status_separator); @@ -145,8 +146,8 @@ build_users_menu (gpointer userdata) return FALSE; } - users_menu = GTK_MENU(dbusmenu_gtkmenu_new(INDICATOR_USERS_DBUS_NAME, INDICATOR_USERS_DBUS_OBJECT)); - g_signal_connect(G_OBJECT(users_menu), DBUSMENU_GTKMENU_SIGNAL_ADD, G_CALLBACK(users_menu_add), main_menu); + users_client = dbusmenu_gtkclient_new(INDICATOR_USERS_DBUS_NAME, INDICATOR_USERS_DBUS_OBJECT); + g_signal_connect(G_OBJECT(users_client), DBUSMENU_GTKCLIENT_SIGNAL_ROOT_CHANGED, G_CALLBACK(users_menu_add), main_menu); users_separator = gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(main_menu), users_separator); @@ -177,8 +178,8 @@ build_session_menu (gpointer userdata) return FALSE; } - session_menu = GTK_MENU(dbusmenu_gtkmenu_new(INDICATOR_SESSION_DBUS_NAME, INDICATOR_SESSION_DBUS_OBJECT)); - g_signal_connect(G_OBJECT(session_menu), DBUSMENU_GTKMENU_SIGNAL_ADD, G_CALLBACK(session_menu_add), main_menu); + session_client = dbusmenu_gtkclient_new(INDICATOR_SESSION_DBUS_NAME, INDICATOR_SESSION_DBUS_OBJECT); + g_signal_connect(G_OBJECT(session_client), DBUSMENU_GTKCLIENT_SIGNAL_ROOT_CHANGED, G_CALLBACK(session_menu_add), main_menu); return FALSE; } -- cgit v1.2.3 From 07ad2f2a1125f6b84f5ed71bb6bfa5407522716c Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 30 Jun 2009 11:02:04 -0500 Subject: Working more on changing the style of how things work for clients. This is the session based items. --- src/indicator-sus.c | 74 ++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 59 insertions(+), 15 deletions(-) diff --git a/src/indicator-sus.c b/src/indicator-sus.c index cd3337d..4efc1b2 100644 --- a/src/indicator-sus.c +++ b/src/indicator-sus.c @@ -78,20 +78,6 @@ users_menu_add (GtkContainer * container, GtkWidget * widget, gpointer userdata) return; } -static void -session_menu_add (GtkContainer * container, GtkWidget * widget, gpointer userdata) -{ - guint position = 0; - if (SEPARATOR_SHOWN(users_separator)) { - GList * location = g_list_find(GTK_MENU_SHELL(main_menu)->children, users_separator); - position = g_list_position(GTK_MENU_SHELL(main_menu)->children, location) + 1; - } - - menu_add(container, widget, GTK_MENU(userdata), position); - return; -} - - static gboolean build_status_menu (gpointer userdata) { @@ -156,6 +142,62 @@ build_users_menu (gpointer userdata) return FALSE; } +static void +child_added (DbusmenuMenuitem * parent, DbusmenuMenuitem * child, guint position, guint (*posfunc) (void)) +{ + + +} + +static void +child_moved (DbusmenuMenuitem * parent, DbusmenuMenuitem * child, guint newpos, guint oldpos, guint (*posfunc) (void)) +{ + + +} + +/* Session Menu Stuff */ + +static guint +session_menu_pos_offset (void) +{ + guint position = 0; + if (SEPARATOR_SHOWN(users_separator)) { + GList * location = g_list_find(GTK_MENU_SHELL(main_menu)->children, users_separator); + position = g_list_position(GTK_MENU_SHELL(main_menu)->children, location) + 1; + } + + return position; +} + +static void +session_menu_removed (DbusmenuMenuitem * root, DbusmenuMenuitem * child, gpointer user_data) +{ + return; +} + +static void +session_menu_root_changed(DbusmenuGtkClient * client, DbusmenuMenuitem * newroot, GtkMenu * main) +{ + if (newroot == NULL) { + /* We're assuming this'll crash the least so it doesn't + hide a separator. May be a bad choice. */ + return; + } + + g_signal_connect(G_OBJECT(newroot), DBUSMENU_MENUITEM_SIGNAL_CHILD_ADDED, G_CALLBACK(child_added), session_menu_pos_offset); + g_signal_connect(G_OBJECT(newroot), DBUSMENU_MENUITEM_SIGNAL_CHILD_REMOVED, G_CALLBACK(session_menu_removed), NULL); + g_signal_connect(G_OBJECT(newroot), DBUSMENU_MENUITEM_SIGNAL_CHILD_MOVED, G_CALLBACK(child_moved), session_menu_pos_offset); + + GList * child = NULL; + guint count = 0; + for (child = dbusmenu_menuitem_get_children(newroot); child != NULL; child = g_list_next(child), count++) { + child_added(newroot, DBUSMENU_MENUITEM(child->data), count, session_menu_pos_offset); + } + + return; +} + static gboolean build_session_menu (gpointer userdata) { @@ -179,11 +221,13 @@ build_session_menu (gpointer userdata) } session_client = dbusmenu_gtkclient_new(INDICATOR_SESSION_DBUS_NAME, INDICATOR_SESSION_DBUS_OBJECT); - g_signal_connect(G_OBJECT(session_client), DBUSMENU_GTKCLIENT_SIGNAL_ROOT_CHANGED, G_CALLBACK(session_menu_add), main_menu); + g_signal_connect(G_OBJECT(session_client), DBUSMENU_GTKCLIENT_SIGNAL_ROOT_CHANGED, G_CALLBACK(session_menu_root_changed), main_menu); return FALSE; } +/* Base menu stuff */ + GtkMenu * get_menu (void) { -- cgit v1.2.3 From 23bead1b2a7c60dc8380b7cc7acf30eecf973f45 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 30 Jun 2009 15:20:32 -0500 Subject: Adding in stuff for the users menu. Getting better at this. --- src/indicator-sus.c | 102 ++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 75 insertions(+), 27 deletions(-) diff --git a/src/indicator-sus.c b/src/indicator-sus.c index 4efc1b2..75030b3 100644 --- a/src/indicator-sus.c +++ b/src/indicator-sus.c @@ -57,24 +57,26 @@ menu_add (GtkContainer * source, GtkWidget * addee, GtkMenu * addto, guint posit } static void -status_menu_add (GtkContainer * container, GtkWidget * widget, gpointer userdata) +child_added (DbusmenuMenuitem * parent, DbusmenuMenuitem * child, guint position, guint (*posfunc) (void)) { - menu_add(container, widget, GTK_MENU(userdata), 0); - gtk_widget_show(status_separator); - return; + + } static void -users_menu_add (GtkContainer * container, GtkWidget * widget, gpointer userdata) +child_moved (DbusmenuMenuitem * parent, DbusmenuMenuitem * child, guint newpos, guint oldpos, guint (*posfunc) (void)) { - guint position = 0; - if (SEPARATOR_SHOWN(status_separator)) { - GList * location = g_list_find(GTK_MENU_SHELL(main_menu)->children, status_separator); - position = g_list_position(GTK_MENU_SHELL(main_menu)->children, location) + 1; - } - menu_add(container, widget, GTK_MENU(userdata), position); - gtk_widget_show(users_separator); + +} + + +/* Status Menu */ +static void +status_menu_add (GtkContainer * container, GtkWidget * widget, gpointer userdata) +{ + menu_add(container, widget, GTK_MENU(userdata), 0); + gtk_widget_show(status_separator); return; } @@ -110,6 +112,63 @@ build_status_menu (gpointer userdata) return FALSE; } +/* Users menu */ + +static guint +users_menu_pos_offset (void) +{ + guint position = 0; + if (SEPARATOR_SHOWN(status_separator)) { + GList * location = g_list_find(GTK_MENU_SHELL(main_menu)->children, status_separator); + position = g_list_position(GTK_MENU_SHELL(main_menu)->children, location) + 1; + } + + return position; +} + +static void +users_menu_added (DbusmenuMenuitem * root, DbusmenuMenuitem * child, guint position, gpointer user_data) +{ + gtk_widget_show(GTK_WIDGET(users_separator)); + return; +} + +static void +users_menu_removed (DbusmenuMenuitem * root, DbusmenuMenuitem * child, gpointer user_data) +{ + if (g_list_length(dbusmenu_menuitem_get_children(root)) == 0) { + gtk_widget_hide(GTK_WIDGET(users_separator)); + } + + return; +} + +static void +users_menu_root_changed(DbusmenuGtkClient * client, DbusmenuMenuitem * newroot, GtkMenu * main) +{ + if (newroot == NULL) { + gtk_widget_hide(GTK_WIDGET(users_separator)); + return; + } + + g_signal_connect(G_OBJECT(newroot), DBUSMENU_MENUITEM_SIGNAL_CHILD_ADDED, G_CALLBACK(child_added), users_menu_pos_offset); + g_signal_connect(G_OBJECT(newroot), DBUSMENU_MENUITEM_SIGNAL_CHILD_REMOVED, G_CALLBACK(users_menu_added), NULL); + g_signal_connect(G_OBJECT(newroot), DBUSMENU_MENUITEM_SIGNAL_CHILD_REMOVED, G_CALLBACK(users_menu_removed), NULL); + g_signal_connect(G_OBJECT(newroot), DBUSMENU_MENUITEM_SIGNAL_CHILD_MOVED, G_CALLBACK(child_moved), users_menu_pos_offset); + + GList * child = NULL; + guint count = 0; + for (child = dbusmenu_menuitem_get_children(newroot); child != NULL; child = g_list_next(child), count++) { + child_added(newroot, DBUSMENU_MENUITEM(child->data), count, users_menu_pos_offset); + } + + if (count > 0) { + gtk_widget_show(GTK_WIDGET(users_separator)); + } + + return; +} + static gboolean build_users_menu (gpointer userdata) { @@ -133,7 +192,7 @@ build_users_menu (gpointer userdata) } users_client = dbusmenu_gtkclient_new(INDICATOR_USERS_DBUS_NAME, INDICATOR_USERS_DBUS_OBJECT); - g_signal_connect(G_OBJECT(users_client), DBUSMENU_GTKCLIENT_SIGNAL_ROOT_CHANGED, G_CALLBACK(users_menu_add), main_menu); + g_signal_connect(G_OBJECT(users_client), DBUSMENU_GTKCLIENT_SIGNAL_ROOT_CHANGED, G_CALLBACK(users_menu_root_changed), main_menu); users_separator = gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(main_menu), users_separator); @@ -142,20 +201,6 @@ build_users_menu (gpointer userdata) return FALSE; } -static void -child_added (DbusmenuMenuitem * parent, DbusmenuMenuitem * child, guint position, guint (*posfunc) (void)) -{ - - -} - -static void -child_moved (DbusmenuMenuitem * parent, DbusmenuMenuitem * child, guint newpos, guint oldpos, guint (*posfunc) (void)) -{ - - -} - /* Session Menu Stuff */ static guint @@ -165,6 +210,9 @@ session_menu_pos_offset (void) if (SEPARATOR_SHOWN(users_separator)) { GList * location = g_list_find(GTK_MENU_SHELL(main_menu)->children, users_separator); position = g_list_position(GTK_MENU_SHELL(main_menu)->children, location) + 1; + } else if (SEPARATOR_SHOWN(status_separator)) { + GList * location = g_list_find(GTK_MENU_SHELL(main_menu)->children, status_separator); + position = g_list_position(GTK_MENU_SHELL(main_menu)->children, location) + 1; } return position; -- cgit v1.2.3 From a6afde93e447dc090d0ec245bedc3295441a391c Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 30 Jun 2009 15:27:38 -0500 Subject: Switching over the status menu too. Woot! --- src/indicator-sus.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 46 insertions(+), 5 deletions(-) diff --git a/src/indicator-sus.c b/src/indicator-sus.c index 75030b3..4e7d4b2 100644 --- a/src/indicator-sus.c +++ b/src/indicator-sus.c @@ -59,7 +59,7 @@ menu_add (GtkContainer * source, GtkWidget * addee, GtkMenu * addto, guint posit static void child_added (DbusmenuMenuitem * parent, DbusmenuMenuitem * child, guint position, guint (*posfunc) (void)) { - + menu_add(NULL, NULL, NULL, 0); } @@ -72,11 +72,52 @@ child_moved (DbusmenuMenuitem * parent, DbusmenuMenuitem * child, guint newpos, /* Status Menu */ +static guint +status_menu_pos_offset (void) +{ + return 0; +} + +static void +status_menu_added (DbusmenuMenuitem * root, DbusmenuMenuitem * child, guint position, gpointer user_data) +{ + gtk_widget_show(GTK_WIDGET(status_separator)); + return; +} + static void -status_menu_add (GtkContainer * container, GtkWidget * widget, gpointer userdata) +status_menu_removed (DbusmenuMenuitem * root, DbusmenuMenuitem * child, gpointer user_data) { - menu_add(container, widget, GTK_MENU(userdata), 0); - gtk_widget_show(status_separator); + if (g_list_length(dbusmenu_menuitem_get_children(root)) == 0) { + gtk_widget_hide(GTK_WIDGET(status_separator)); + } + + return; +} + +static void +status_menu_root_changed(DbusmenuGtkClient * client, DbusmenuMenuitem * newroot, GtkMenu * main) +{ + if (newroot == NULL) { + gtk_widget_hide(GTK_WIDGET(status_separator)); + return; + } + + g_signal_connect(G_OBJECT(newroot), DBUSMENU_MENUITEM_SIGNAL_CHILD_ADDED, G_CALLBACK(child_added), status_menu_pos_offset); + g_signal_connect(G_OBJECT(newroot), DBUSMENU_MENUITEM_SIGNAL_CHILD_REMOVED, G_CALLBACK(status_menu_added), NULL); + g_signal_connect(G_OBJECT(newroot), DBUSMENU_MENUITEM_SIGNAL_CHILD_REMOVED, G_CALLBACK(status_menu_removed), NULL); + g_signal_connect(G_OBJECT(newroot), DBUSMENU_MENUITEM_SIGNAL_CHILD_MOVED, G_CALLBACK(child_moved), status_menu_pos_offset); + + GList * child = NULL; + guint count = 0; + for (child = dbusmenu_menuitem_get_children(newroot); child != NULL; child = g_list_next(child), count++) { + child_added(newroot, DBUSMENU_MENUITEM(child->data), count, status_menu_pos_offset); + } + + if (count > 0) { + gtk_widget_show(GTK_WIDGET(status_separator)); + } + return; } @@ -103,7 +144,7 @@ build_status_menu (gpointer userdata) } status_client = dbusmenu_gtkclient_new(INDICATOR_STATUS_DBUS_NAME, INDICATOR_STATUS_DBUS_OBJECT); - g_signal_connect(G_OBJECT(status_client), DBUSMENU_GTKCLIENT_SIGNAL_ROOT_CHANGED, G_CALLBACK(status_menu_add), main_menu); + g_signal_connect(G_OBJECT(status_client), DBUSMENU_GTKCLIENT_SIGNAL_ROOT_CHANGED, G_CALLBACK(status_menu_root_changed), main_menu); status_separator = gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(main_menu), status_separator); -- cgit v1.2.3 From cc19423ef4f8d060d7dfa7ab7eb0655e67be3efa Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 30 Jun 2009 15:51:10 -0500 Subject: Trying to flesh out the add function some more, but this commit doesn't build as apparently switches have to have integers now. This takes half of the fun out of C if you can't use crazy function pointers everywhere! Where's the sport in readable code? --- src/indicator-sus.c | 45 +++++++++++++++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/src/indicator-sus.c b/src/indicator-sus.c index 4e7d4b2..9368300 100644 --- a/src/indicator-sus.c +++ b/src/indicator-sus.c @@ -30,6 +30,7 @@ GtkLabel * get_label (void) { GtkLabel * returnval = GTK_LABEL(gtk_label_new("Ted Gould")); + gtk_widget_show(GTK_WIDGET(returnval)); return returnval; } @@ -40,29 +41,45 @@ get_icon (void) } static void -menu_add (GtkContainer * source, GtkWidget * addee, GtkMenu * addto, guint positionoffset) +child_added (DbusmenuMenuitem * parent, DbusmenuMenuitem * child, guint position, guint (*posfunc) (void)) { - GList * location = g_list_find(GTK_MENU_SHELL(source)->children, addee); - guint position = g_list_position(GTK_MENU_SHELL(source)->children, location); + position += posfunc(); + + DbusmenuGtkClient * client = NULL; + gchar * errorstr = NULL; + switch (posfunc) { + case status_menu_pos_offset: + client = status_client; + errorstr = "Status"; + break; + case users_menu_pos_offset: + client = users_client; + errorstr = "Users"; + break; + case session_menu_pos_offset: + client = session_client; + errorstr = "Session"; + break; + default: + g_warning("Child Added called with an unknown position function!"); + return; + } + + GtkMenuItem * widget = dbusmenu_gtkclient_menuitem_get(client, child); - position += positionoffset; - g_debug("Adding a widget: %d", position); + if (widget == NULL) { + g_warning("Had a menu item added to the %s menu, but yet it didn't have a GtkWidget with it. Can't add that to a menu now can we? You need to figure this @#$# out!", errorstr); + return; + } - gtk_menu_insert(addto, addee, position); - gtk_widget_show(addee); + gtk_menu_insert(main_menu, GTK_WIDGET(widget), position); + gtk_widget_show(GTK_WIDGET(widget)); gtk_widget_hide(loading_item); return; } -static void -child_added (DbusmenuMenuitem * parent, DbusmenuMenuitem * child, guint position, guint (*posfunc) (void)) -{ - menu_add(NULL, NULL, NULL, 0); - -} - static void child_moved (DbusmenuMenuitem * parent, DbusmenuMenuitem * child, guint newpos, guint oldpos, guint (*posfunc) (void)) { -- cgit v1.2.3 From 6bd2d42ccd10366788fc0721b61e0f984cb77543 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 30 Jun 2009 16:14:01 -0500 Subject: Bah, I hate pointers some days. --- src/indicator-sus.c | 48 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/src/indicator-sus.c b/src/indicator-sus.c index 9368300..88bea47 100644 --- a/src/indicator-sus.c +++ b/src/indicator-sus.c @@ -26,6 +26,18 @@ static GtkWidget * loading_item = NULL; static DBusGConnection * connection = NULL; static DBusGProxy * proxy = NULL; +typedef enum { + STATUS_SECTION, + USERS_SECTION, + SESSION_SECTION, + END_OF_SECTIONS +} section_t; + +static void child_added (DbusmenuMenuitem * parent, DbusmenuMenuitem * child, guint position, gpointer section); +static guint status_menu_pos_offset (void); +static guint users_menu_pos_offset (void); +static guint session_menu_pos_offset (void); + GtkLabel * get_label (void) { @@ -41,30 +53,34 @@ get_icon (void) } static void -child_added (DbusmenuMenuitem * parent, DbusmenuMenuitem * child, guint position, guint (*posfunc) (void)) +child_added (DbusmenuMenuitem * parent, DbusmenuMenuitem * child, guint position, gpointer section) { - position += posfunc(); - DbusmenuGtkClient * client = NULL; gchar * errorstr = NULL; - switch (posfunc) { - case status_menu_pos_offset: + guint (*posfunc) (void) = NULL; + + switch (GPOINTER_TO_UINT(section)) { + case STATUS_SECTION: client = status_client; errorstr = "Status"; + posfunc = status_menu_pos_offset; break; - case users_menu_pos_offset: + case USERS_SECTION: client = users_client; errorstr = "Users"; + posfunc = users_menu_pos_offset; break; - case session_menu_pos_offset: + case SESSION_SECTION: client = session_client; errorstr = "Session"; + posfunc = session_menu_pos_offset; break; default: g_warning("Child Added called with an unknown position function!"); return; } + position += posfunc(); GtkMenuItem * widget = dbusmenu_gtkclient_menuitem_get(client, child); if (widget == NULL) { @@ -120,15 +136,15 @@ status_menu_root_changed(DbusmenuGtkClient * client, DbusmenuMenuitem * newroot, return; } - g_signal_connect(G_OBJECT(newroot), DBUSMENU_MENUITEM_SIGNAL_CHILD_ADDED, G_CALLBACK(child_added), status_menu_pos_offset); + g_signal_connect(G_OBJECT(newroot), DBUSMENU_MENUITEM_SIGNAL_CHILD_ADDED, G_CALLBACK(child_added), GUINT_TO_POINTER(STATUS_SECTION)); g_signal_connect(G_OBJECT(newroot), DBUSMENU_MENUITEM_SIGNAL_CHILD_REMOVED, G_CALLBACK(status_menu_added), NULL); g_signal_connect(G_OBJECT(newroot), DBUSMENU_MENUITEM_SIGNAL_CHILD_REMOVED, G_CALLBACK(status_menu_removed), NULL); - g_signal_connect(G_OBJECT(newroot), DBUSMENU_MENUITEM_SIGNAL_CHILD_MOVED, G_CALLBACK(child_moved), status_menu_pos_offset); + g_signal_connect(G_OBJECT(newroot), DBUSMENU_MENUITEM_SIGNAL_CHILD_MOVED, G_CALLBACK(child_moved), GUINT_TO_POINTER(STATUS_SECTION)); GList * child = NULL; guint count = 0; for (child = dbusmenu_menuitem_get_children(newroot); child != NULL; child = g_list_next(child), count++) { - child_added(newroot, DBUSMENU_MENUITEM(child->data), count, status_menu_pos_offset); + child_added(newroot, DBUSMENU_MENUITEM(child->data), count, GUINT_TO_POINTER(STATUS_SECTION)); } if (count > 0) { @@ -209,15 +225,15 @@ users_menu_root_changed(DbusmenuGtkClient * client, DbusmenuMenuitem * newroot, return; } - g_signal_connect(G_OBJECT(newroot), DBUSMENU_MENUITEM_SIGNAL_CHILD_ADDED, G_CALLBACK(child_added), users_menu_pos_offset); + g_signal_connect(G_OBJECT(newroot), DBUSMENU_MENUITEM_SIGNAL_CHILD_ADDED, G_CALLBACK(child_added), GUINT_TO_POINTER(USERS_SECTION)); g_signal_connect(G_OBJECT(newroot), DBUSMENU_MENUITEM_SIGNAL_CHILD_REMOVED, G_CALLBACK(users_menu_added), NULL); g_signal_connect(G_OBJECT(newroot), DBUSMENU_MENUITEM_SIGNAL_CHILD_REMOVED, G_CALLBACK(users_menu_removed), NULL); - g_signal_connect(G_OBJECT(newroot), DBUSMENU_MENUITEM_SIGNAL_CHILD_MOVED, G_CALLBACK(child_moved), users_menu_pos_offset); + g_signal_connect(G_OBJECT(newroot), DBUSMENU_MENUITEM_SIGNAL_CHILD_MOVED, G_CALLBACK(child_moved), GUINT_TO_POINTER(USERS_SECTION)); GList * child = NULL; guint count = 0; for (child = dbusmenu_menuitem_get_children(newroot); child != NULL; child = g_list_next(child), count++) { - child_added(newroot, DBUSMENU_MENUITEM(child->data), count, users_menu_pos_offset); + child_added(newroot, DBUSMENU_MENUITEM(child->data), count, GUINT_TO_POINTER(USERS_SECTION)); } if (count > 0) { @@ -291,14 +307,14 @@ session_menu_root_changed(DbusmenuGtkClient * client, DbusmenuMenuitem * newroot return; } - g_signal_connect(G_OBJECT(newroot), DBUSMENU_MENUITEM_SIGNAL_CHILD_ADDED, G_CALLBACK(child_added), session_menu_pos_offset); + g_signal_connect(G_OBJECT(newroot), DBUSMENU_MENUITEM_SIGNAL_CHILD_ADDED, G_CALLBACK(child_added), GUINT_TO_POINTER(SESSION_SECTION)); g_signal_connect(G_OBJECT(newroot), DBUSMENU_MENUITEM_SIGNAL_CHILD_REMOVED, G_CALLBACK(session_menu_removed), NULL); - g_signal_connect(G_OBJECT(newroot), DBUSMENU_MENUITEM_SIGNAL_CHILD_MOVED, G_CALLBACK(child_moved), session_menu_pos_offset); + g_signal_connect(G_OBJECT(newroot), DBUSMENU_MENUITEM_SIGNAL_CHILD_MOVED, G_CALLBACK(child_moved), GUINT_TO_POINTER(SESSION_SECTION)); GList * child = NULL; guint count = 0; for (child = dbusmenu_menuitem_get_children(newroot); child != NULL; child = g_list_next(child), count++) { - child_added(newroot, DBUSMENU_MENUITEM(child->data), count, session_menu_pos_offset); + child_added(newroot, DBUSMENU_MENUITEM(child->data), count, GUINT_TO_POINTER(SESSION_SECTION)); } return; -- cgit v1.2.3 From f084e851c5ef36e6afa920c9198c4a53e7f7c1c3 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 30 Jun 2009 16:40:46 -0500 Subject: Showing the loading item. Atleast that works now. --- src/indicator-sus.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/indicator-sus.c b/src/indicator-sus.c index 88bea47..7deb6e8 100644 --- a/src/indicator-sus.c +++ b/src/indicator-sus.c @@ -81,6 +81,7 @@ child_added (DbusmenuMenuitem * parent, DbusmenuMenuitem * child, guint position } position += posfunc(); + g_debug("SUS: Adding child: %d", position); GtkMenuItem * widget = dbusmenu_gtkclient_menuitem_get(client, child); if (widget == NULL) { @@ -363,6 +364,7 @@ get_menu (void) main_menu = GTK_MENU(gtk_menu_new()); loading_item = gtk_menu_item_new_with_label("Loading..."); gtk_menu_shell_append(GTK_MENU_SHELL(main_menu), loading_item); + gtk_widget_show(GTK_WIDGET(loading_item)); return main_menu; } -- cgit v1.2.3 From 17e41d8a3a128e07189fd3163900390372c2b07c Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 30 Jun 2009 16:46:42 -0500 Subject: Some debugging info. --- src/indicator-sus.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/indicator-sus.c b/src/indicator-sus.c index 7deb6e8..18b6c44 100644 --- a/src/indicator-sus.c +++ b/src/indicator-sus.c @@ -158,6 +158,7 @@ status_menu_root_changed(DbusmenuGtkClient * client, DbusmenuMenuitem * newroot, static gboolean build_status_menu (gpointer userdata) { + g_debug("Building Status Menu"); guint returnval = 0; GError * error = NULL; @@ -247,6 +248,7 @@ users_menu_root_changed(DbusmenuGtkClient * client, DbusmenuMenuitem * newroot, static gboolean build_users_menu (gpointer userdata) { + g_debug("Building Users Menu"); guint returnval = 0; GError * error = NULL; @@ -324,6 +326,7 @@ session_menu_root_changed(DbusmenuGtkClient * client, DbusmenuMenuitem * newroot static gboolean build_session_menu (gpointer userdata) { + g_debug("Building Session Menu"); guint returnval = 0; GError * error = NULL; @@ -356,6 +359,9 @@ get_menu (void) { connection = dbus_g_bus_get(DBUS_BUS_SESSION, NULL); proxy = dbus_g_proxy_new_for_name(connection, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS); + if (proxy == NULL) { + g_warning("Unable to get proxy for DBus itself. Seriously."); + } g_idle_add(build_status_menu, NULL); g_idle_add(build_users_menu, NULL); -- cgit v1.2.3 From 42644e5fb655c101d553773a29050323d1711a7e Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 30 Jun 2009 16:53:09 -0500 Subject: Getting some menuitems --- src/users-service.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/users-service.c b/src/users-service.c index 39afe39..c3c842f 100644 --- a/src/users-service.c +++ b/src/users-service.c @@ -10,6 +10,19 @@ static DbusmenuMenuitem * root_menuitem = NULL; static GMainLoop * mainloop = NULL; +gchar * dummies[] = { + "Bob", "Jim", "Alvin", "Mary", NULL +}; + +void dummy_users (void) { + int count; + for (count = 0; dummies[count] != NULL; count++) { + DbusmenuMenuitem * mi = dbusmenu_menuitem_new(); + dbusmenu_menuitem_property_set(mi, "label", dummies[count]); + dbusmenu_menuitem_child_append(root_menuitem, mi); + } +} + int main (int argc, char ** argv) { -- cgit v1.2.3 From ee4d58a3a1a25f1264df9c9732a480e1f436790f Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 30 Jun 2009 23:56:13 -0500 Subject: Moving the server to after the items makes things work better, but I'm curious why it's failing. This is more a test for dbusmenu though which'll have better debug. --- src/users-service.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/users-service.c b/src/users-service.c index c3c842f..409a1d0 100644 --- a/src/users-service.c +++ b/src/users-service.c @@ -14,13 +14,18 @@ gchar * dummies[] = { "Bob", "Jim", "Alvin", "Mary", NULL }; -void dummy_users (void) { +static void +dummy_users (DbusmenuMenuitem * root) { int count; for (count = 0; dummies[count] != NULL; count++) { DbusmenuMenuitem * mi = dbusmenu_menuitem_new(); + g_debug("Creating item: %d %s", dbusmenu_menuitem_get_id(mi), dummies[count]); + g_debug("\tRoot ID: %d", dbusmenu_menuitem_get_id(root)); dbusmenu_menuitem_property_set(mi, "label", dummies[count]); - dbusmenu_menuitem_child_append(root_menuitem, mi); + dbusmenu_menuitem_child_add_position(root, mi, count); } + + return; } int @@ -44,6 +49,10 @@ main (int argc, char ** argv) } root_menuitem = dbusmenu_menuitem_new(); + g_debug("Root ID: %d", dbusmenu_menuitem_get_id(root_menuitem)); + + dummy_users(root_menuitem); + DbusmenuServer * server = dbusmenu_server_new(INDICATOR_USERS_DBUS_OBJECT); dbusmenu_server_set_root(server, root_menuitem); -- cgit v1.2.3 From ae5eca7787899d8730fcfe91b0e161724e51bdf0 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 30 Jun 2009 23:58:08 -0500 Subject: Ignoring some autogenerated files. --- .bzrignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.bzrignore b/.bzrignore index 31aa919..2ff5ffb 100644 --- a/.bzrignore +++ b/.bzrignore @@ -23,3 +23,5 @@ indicator-users-service indicator-session.service indicator-status.service indicator-users.service +status-service-client.h +status-service-server.h -- cgit v1.2.3 From 015f1c1636e6c3b3d84375121ed14a760d76ee8e Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 20 Jul 2009 11:28:50 -0500 Subject: Switching from dummy users to useful menuitems --- src/users-service.c | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/src/users-service.c b/src/users-service.c index 409a1d0..66dc86e 100644 --- a/src/users-service.c +++ b/src/users-service.c @@ -1,4 +1,6 @@ +#include + #include #include @@ -10,20 +12,31 @@ static DbusmenuMenuitem * root_menuitem = NULL; static GMainLoop * mainloop = NULL; -gchar * dummies[] = { - "Bob", "Jim", "Alvin", "Mary", NULL -}; +static void +activate_guest_session (DbusmenuMenuitem * mi, gpointer user_data) +{ + +} + +static void +activate_new_session (DbusmenuMenuitem * mi, gpointer user_data) +{ + +} static void -dummy_users (DbusmenuMenuitem * root) { - int count; - for (count = 0; dummies[count] != NULL; count++) { - DbusmenuMenuitem * mi = dbusmenu_menuitem_new(); - g_debug("Creating item: %d %s", dbusmenu_menuitem_get_id(mi), dummies[count]); - g_debug("\tRoot ID: %d", dbusmenu_menuitem_get_id(root)); - dbusmenu_menuitem_property_set(mi, "label", dummies[count]); - dbusmenu_menuitem_child_add_position(root, mi, count); - } +create_items (DbusmenuMenuitem * root) { + DbusmenuMenuitem * mi = NULL; + + mi = dbusmenu_menuitem_new(); + dbusmenu_menuitem_property_set(mi, "label", _("Guest Session")); + dbusmenu_menuitem_child_append(root, mi); + g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(activate_guest_session), NULL); + + mi = dbusmenu_menuitem_new(); + dbusmenu_menuitem_property_set(mi, "label", _("New Session...")); + dbusmenu_menuitem_child_append(root, mi); + g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(activate_new_session), NULL); return; } @@ -51,7 +64,7 @@ main (int argc, char ** argv) root_menuitem = dbusmenu_menuitem_new(); g_debug("Root ID: %d", dbusmenu_menuitem_get_id(root_menuitem)); - dummy_users(root_menuitem); + create_items(root_menuitem); DbusmenuServer * server = dbusmenu_server_new(INDICATOR_USERS_DBUS_OBJECT); dbusmenu_server_set_root(server, root_menuitem); -- cgit v1.2.3 From c1b327315d06e8082dad23380d360a22a0542c4b Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 20 Jul 2009 12:44:32 -0500 Subject: Setting the menu item to activate the guest user session --- src/users-service.c | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/src/users-service.c b/src/users-service.c index 66dc86e..39c30bb 100644 --- a/src/users-service.c +++ b/src/users-service.c @@ -9,13 +9,33 @@ #include "dbus-shared-names.h" +#define GUEST_SESSION_LAUNCHER "/usr/share/gdm/guest-session/guest-session-launch" + static DbusmenuMenuitem * root_menuitem = NULL; static GMainLoop * mainloop = NULL; +static gboolean +check_guest_session (void) +{ + if (geteuid() < 500) { + /* System users shouldn't have guest account shown. Mosly + this would be the case of the guest user itself. */ + return FALSE; + } + if (!g_file_test(GUEST_SESSION_LAUNCHER, G_FILE_TEST_IS_EXECUTABLE)) { + /* It doesn't appear that the Guest session stuff is + installed. So let's not use it then! */ + return FALSE; + } + + return TRUE; +} + static void activate_guest_session (DbusmenuMenuitem * mi, gpointer user_data) { - + gchar *argv[] = {GUEST_SESSION_LAUNCHER, NULL }; + g_spawn_sync (NULL, argv, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL); } static void @@ -28,10 +48,12 @@ static void create_items (DbusmenuMenuitem * root) { DbusmenuMenuitem * mi = NULL; - mi = dbusmenu_menuitem_new(); - dbusmenu_menuitem_property_set(mi, "label", _("Guest Session")); - dbusmenu_menuitem_child_append(root, mi); - g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(activate_guest_session), NULL); + if (check_guest_session()) { + mi = dbusmenu_menuitem_new(); + dbusmenu_menuitem_property_set(mi, "label", _("Guest Session")); + dbusmenu_menuitem_child_append(root, mi); + g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(activate_guest_session), NULL); + } mi = dbusmenu_menuitem_new(); dbusmenu_menuitem_property_set(mi, "label", _("New Session...")); -- cgit v1.2.3 From bde7584ca763892c43a1db195d27a27e231a68fe Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 20 Jul 2009 14:02:40 -0500 Subject: Turning everythign into a check and a way to start a new fancy login session --- src/users-service.c | 58 +++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 50 insertions(+), 8 deletions(-) diff --git a/src/users-service.c b/src/users-service.c index 39c30bb..b8b5c2f 100644 --- a/src/users-service.c +++ b/src/users-service.c @@ -11,6 +11,10 @@ #define GUEST_SESSION_LAUNCHER "/usr/share/gdm/guest-session/guest-session-launch" +static DBusGConnection * session_bus = NULL; +static DBusGConnection * system_bus = NULL; +static DBusGProxy * bus_proxy = NULL; +static DBusGProxy * gdm_proxy = NULL; static DbusmenuMenuitem * root_menuitem = NULL; static GMainLoop * mainloop = NULL; @@ -34,14 +38,50 @@ check_guest_session (void) static void activate_guest_session (DbusmenuMenuitem * mi, gpointer user_data) { - gchar *argv[] = {GUEST_SESSION_LAUNCHER, NULL }; - g_spawn_sync (NULL, argv, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL); + GError * error = NULL; + if (!g_spawn_command_line_async(GUEST_SESSION_LAUNCHER, &error)) { + g_warning("Unable to start guest session: %s", error->message); + g_error_free(error); + } + + return; +} + +static gboolean +check_new_session (void) +{ + if (system_bus == NULL) { + system_bus = dbus_g_bus_get(DBUS_BUS_SYSTEM, NULL); + } + + if (system_bus == NULL) { + return FALSE; + } + + if (gdm_proxy == NULL) { + gdm_proxy = dbus_g_proxy_new_for_name(system_bus, + "org.gnome.DisplayManager", + "/org/gnome/DisplayManager/LocalDisplayFactory", + "org.gnome.DisplayManager.LocalDisplayFactory"); + } + + if (gdm_proxy == NULL) { + return FALSE; + } + + return TRUE; } static void activate_new_session (DbusmenuMenuitem * mi, gpointer user_data) { + GError * error = NULL; + if (!g_spawn_command_line_async("gdmflexiserver -s", &error)) { + g_warning("Unable to start guest session: %s", error->message); + g_error_free(error); + } + return; } static void @@ -55,10 +95,12 @@ create_items (DbusmenuMenuitem * root) { g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(activate_guest_session), NULL); } - mi = dbusmenu_menuitem_new(); - dbusmenu_menuitem_property_set(mi, "label", _("New Session...")); - dbusmenu_menuitem_child_append(root, mi); - g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(activate_new_session), NULL); + if (check_new_session()) { + mi = dbusmenu_menuitem_new(); + dbusmenu_menuitem_property_set(mi, "label", _("New Session...")); + dbusmenu_menuitem_child_append(root, mi); + g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(activate_new_session), NULL); + } return; } @@ -68,8 +110,8 @@ main (int argc, char ** argv) { g_type_init(); - DBusGConnection * connection = dbus_g_bus_get(DBUS_BUS_SESSION, NULL); - DBusGProxy * bus_proxy = dbus_g_proxy_new_for_name(connection, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS); + session_bus = dbus_g_bus_get(DBUS_BUS_SESSION, NULL); + bus_proxy = dbus_g_proxy_new_for_name(session_bus, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS); GError * error = NULL; guint nameret = 0; -- cgit v1.2.3 From fdb5cc0addc4ad4a801854879a2b1869da18073f Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 20 Jul 2009 14:04:15 -0500 Subject: Expanding command line option to make it easier to read --- src/users-service.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/users-service.c b/src/users-service.c index b8b5c2f..731bc4d 100644 --- a/src/users-service.c +++ b/src/users-service.c @@ -76,7 +76,7 @@ static void activate_new_session (DbusmenuMenuitem * mi, gpointer user_data) { GError * error = NULL; - if (!g_spawn_command_line_async("gdmflexiserver -s", &error)) { + if (!g_spawn_command_line_async("gdmflexiserver --startnew", &error)) { g_warning("Unable to start guest session: %s", error->message); g_error_free(error); } -- cgit v1.2.3 From 2c4cdbd4ccf400a537a945c670eb1b8f705a1896 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 21 Jul 2009 10:51:08 -0500 Subject: Adding menu items for session stuff --- src/session-service.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/src/session-service.c b/src/session-service.c index 7a2ad27..80d4172 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -1,4 +1,6 @@ +#include + #include #include @@ -10,6 +12,73 @@ static DbusmenuMenuitem * root_menuitem = NULL; static GMainLoop * mainloop = NULL; +static void +log_out (DbusmenuMenuitem * mi, gpointer userdata) +{ + g_debug("Log Out"); + return; +} + +static void +suspend (DbusmenuMenuitem * mi, gpointer userdata) +{ + g_debug("Suspend"); + return; +} + +static void +hibernate (DbusmenuMenuitem * mi, gpointer userdata) +{ + g_debug("Hibernate"); + return; +} + +static void +restart (DbusmenuMenuitem * mi, gpointer userdata) +{ + g_debug("Restart"); + return; +} + +static void +shutdown (DbusmenuMenuitem * mi, gpointer userdata) +{ + g_debug("Shutdown"); + return; +} + +static void +create_items (DbusmenuMenuitem * root) { + DbusmenuMenuitem * mi = NULL; + + mi = dbusmenu_menuitem_new(); + dbusmenu_menuitem_property_set(mi, "label", _("Log Out")); + dbusmenu_menuitem_child_append(root, mi); + g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(log_out), NULL); + + mi = dbusmenu_menuitem_new(); + dbusmenu_menuitem_property_set(mi, "label", _("Suspend")); + dbusmenu_menuitem_child_append(root, mi); + g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(suspend), NULL); + + mi = dbusmenu_menuitem_new(); + dbusmenu_menuitem_property_set(mi, "label", _("Hibernate")); + dbusmenu_menuitem_child_append(root, mi); + g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(hibernate), NULL); + + mi = dbusmenu_menuitem_new(); + dbusmenu_menuitem_property_set(mi, "label", _("Restart")); + dbusmenu_menuitem_child_append(root, mi); + g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(restart), NULL); + + mi = dbusmenu_menuitem_new(); + dbusmenu_menuitem_property_set(mi, "label", _("Shutdown")); + dbusmenu_menuitem_child_append(root, mi); + g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(shutdown), NULL); + + return; +} + int main (int argc, char ** argv) { @@ -31,6 +100,10 @@ main (int argc, char ** argv) } root_menuitem = dbusmenu_menuitem_new(); + g_debug("Root ID: %d", dbusmenu_menuitem_get_id(root_menuitem)); + + create_items(root_menuitem); + DbusmenuServer * server = dbusmenu_server_new(INDICATOR_SESSION_DBUS_OBJECT); dbusmenu_server_set_root(server, root_menuitem); -- cgit v1.2.3 From 9ac0cedfc49dc8e1b89bf24ac0964cff0195437e Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 21 Jul 2009 10:54:22 -0500 Subject: Adding in lock screen. This is all the menu items now. --- src/status-service.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/status-service.c b/src/status-service.c index e31a0db..314929e 100644 --- a/src/status-service.c +++ b/src/status-service.c @@ -41,6 +41,13 @@ static const gchar * status_icons[STATUS_PROVIDER_STATUS_LAST] = { static DbusmenuMenuitem * root_menuitem = NULL; static GMainLoop * mainloop = NULL; +static void +lock_screen (DbusmenuMenuitem * mi, gpointer data) +{ + g_debug("Lock Screen"); + return; +} + static void status_menu_click (DbusmenuMenuitem * mi, gpointer data) { @@ -83,6 +90,11 @@ build_menu (gpointer data) g_debug("Built %s", status_strings[i]); } + DbusmenuMenuitem * mi = dbusmenu_menuitem_new(); + dbusmenu_menuitem_property_set(mi, "label", _("Lock Screen")); + g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(lock_screen), GINT_TO_POINTER(i)); + dbusmenu_menuitem_child_append(root, mi); + return FALSE; } -- cgit v1.2.3 From 96ca29c44edb5a8b92339d8be7b8b9189cc8863b Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 21 Jul 2009 15:56:01 -0500 Subject: Building a little dialog. Now it's kinda linked into the build system. --- configure.ac | 1 + src/Makefile.am | 1 + src/gtk-dialog/Makefile.am | 8 + src/gtk-dialog/gtk-logout-helper.c | 8 + src/gtk-dialog/logout-dialog.c | 369 +++++++++++++++++++++++++++++++++++++ src/gtk-dialog/logout-dialog.h | 99 ++++++++++ 6 files changed, 486 insertions(+) create mode 100644 src/gtk-dialog/Makefile.am create mode 100644 src/gtk-dialog/gtk-logout-helper.c create mode 100644 src/gtk-dialog/logout-dialog.c create mode 100644 src/gtk-dialog/logout-dialog.h diff --git a/configure.ac b/configure.ac index d299a0d..58fee07 100644 --- a/configure.ac +++ b/configure.ac @@ -84,6 +84,7 @@ AC_SUBST(DBUSSERVICEDIR) AC_OUTPUT([ Makefile src/Makefile +src/gtk-dialog/Makefile data/Makefile ]) diff --git a/src/Makefile.am b/src/Makefile.am index b681b5b..cf18aaa 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,3 +1,4 @@ +SUBDIRS = gtk-dialog libexec_PROGRAMS = indicator-status-service indicator-users-service indicator-session-service diff --git a/src/gtk-dialog/Makefile.am b/src/gtk-dialog/Makefile.am new file mode 100644 index 0000000..20e3d83 --- /dev/null +++ b/src/gtk-dialog/Makefile.am @@ -0,0 +1,8 @@ + +libexec_PROGRAMS = gtk-logout-helper + +gtk_logout_helper_SOURCES = \ + gtk-logout-helper.c \ + logout-dialog.c \ + logout-dialog.h + diff --git a/src/gtk-dialog/gtk-logout-helper.c b/src/gtk-dialog/gtk-logout-helper.c new file mode 100644 index 0000000..f268be4 --- /dev/null +++ b/src/gtk-dialog/gtk-logout-helper.c @@ -0,0 +1,8 @@ + +int +main (int argc, char * argv[]) +{ + + + return 0; +} diff --git a/src/gtk-dialog/logout-dialog.c b/src/gtk-dialog/logout-dialog.c new file mode 100644 index 0000000..0cd0f7a --- /dev/null +++ b/src/gtk-dialog/logout-dialog.c @@ -0,0 +1,369 @@ +/* + * libgksuui -- Gtk+ widget and convenience functions for requesting passwords + * Copyright (C) 2004 Gustavo Noronha Silva + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include +#include + +#include +#include +#include +#include + +#include "../config.h" + +#include "logout-dialog.h" +#include "applet.h" + +enum { + PROP_ZERO, + PROP_ACTION +}; + + +static void +logout_dialog_class_init (LogoutDialogClass *klass); + +static void +logout_dialog_init (LogoutDialog *logout_dialog); + +static void +set_property (GObject * object, guint param_id, const GValue * value, GParamSpec *pspec); + +static void +get_property (GObject * object, guint param_id, GValue * value, GParamSpec *pspec); + +static gboolean +timer_cb (gpointer data); + +static void +show_cb (GtkWidget * widget, gpointer data); + +static void +check_restart (LogoutDialog * dialog); + +static gchar* +get_plural_string (LogoutDialog * dialog); + +static const gchar * title_strings[LOGOUT_DIALOG_ACTION_CNT] = { + /* LOGOUT_DIALOG_LOGOUT, */ NC_("title", "Log Out"), + /* LOGOUT_DIALOG_RESTART, */ NC_("title", "Restart"), + /* LOGOUT_DIALOG_SHUTDOWN, */ NC_("title", "Shut Down") +}; + +static const gchar * button_strings[LOGOUT_DIALOG_ACTION_CNT] = { + /* LOGOUT_DIALOG_LOGOUT, */ NC_("button", "Log Out"), + /* LOGOUT_DIALOG_RESTART, */ NC_("button", "Restart"), + /* LOGOUT_DIALOG_SHUTDOWN, */ NC_("button", "Shut Down") +}; + +static const gchar * restart_auth = N_("Restart..."); + +static const gchar * body_logout_update = N_("You recently installed updates which will only take effect after a restart. Restart to apply software updates."); + +static const gchar * icon_strings[LOGOUT_DIALOG_ACTION_CNT] = { + /* LOGOUT_DIALOG_LOGOUT, */ "system-log-out", + /* LOGOUT_DIALOG_RESTART, */ "system-restart", + /* LOGOUT_DIALOG_SHUTDOWN, */ "system-shutdown" +}; + +GType +logout_dialog_get_type (void) +{ + static GType type = 0; + + if (type == 0) + { + static const GTypeInfo info = + { + sizeof (LogoutDialogClass), /* size of class */ + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc) logout_dialog_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (LogoutDialog), /* size of object */ + 0, /* n_preallocs */ + (GInstanceInitFunc) logout_dialog_init /* instance_init */ + }; + type = g_type_register_static (gtk_dialog_get_type (), + "LogoutDialogType", + &info, 0); + } + + return type; +} + +static gchar* +get_plural_string (LogoutDialog * dialog) +{ + static gchar *plural_string = ""; + + switch (dialog->action) + { + case LOGOUT_DIALOG_LOGOUT: + plural_string = ngettext("You will be logged out in %d second.", + "You will be logged out in %d seconds.", + dialog->timeout); + break; + case LOGOUT_DIALOG_RESTART: + plural_string = ngettext("The computer will restart in %d second.", + "The computer will restart in %d seconds.", + dialog->timeout); + break; + case LOGOUT_DIALOG_SHUTDOWN: + plural_string = ngettext("The computer will be shut down in %d second.", + "The computer will be shut down in %d seconds.", + dialog->timeout); + break; + default: + break; + } + + return plural_string; +} + +static void +logout_dialog_class_init (LogoutDialogClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->set_property = set_property; + gobject_class->get_property = get_property; + + g_object_class_install_property(gobject_class, PROP_ACTION, + g_param_spec_int("action", NULL, NULL, + LOGOUT_DIALOG_LOGOUT, LOGOUT_DIALOG_SHUTDOWN, + LOGOUT_DIALOG_LOGOUT, G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY)); + + return; +} + +static void +set_property (GObject * object, guint param_id, const GValue * value, GParamSpec *pspec) +{ + g_return_if_fail(param_id == PROP_ACTION); + + LogoutDialog * dialog = LOGOUT_DIALOG(object); + dialog->action = (LogoutDialogAction)g_value_get_int(value); + + gtk_image_set_from_icon_name(GTK_IMAGE(dialog->image), icon_strings[dialog->action], GTK_ICON_SIZE_DIALOG); + gtk_window_set_title (GTK_WINDOW(dialog), _(title_strings[dialog->action])); + gtk_widget_hide(dialog->message); + gtk_button_set_label(GTK_BUTTON(dialog->ok_button), _(button_strings[dialog->action])); + + gchar * timeouttxt = g_strdup_printf(get_plural_string(dialog), dialog->timeout); + gtk_label_set_text(GTK_LABEL(dialog->timeout_text), timeouttxt); + g_free(timeouttxt); + + check_restart(dialog); + + return; +} + +static void +get_property (GObject * object, guint param_id, GValue * value, GParamSpec *pspec) +{ + g_return_if_fail(param_id == PROP_ACTION); + g_value_set_int(value, LOGOUT_DIALOG(object)->action); +} + +static gboolean +timer_cb (gpointer data) +{ + LogoutDialog * dialog = LOGOUT_DIALOG(data); + + if (dialog->timeout == 0) { + gtk_dialog_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK); + dialog->timerfunc = 0; + return FALSE; + } else { + dialog->timeout--; + + gchar * timeouttxt = g_strdup_printf(get_plural_string(dialog), dialog->timeout); + gtk_label_set_text(GTK_LABEL(dialog->timeout_text), timeouttxt); + g_free(timeouttxt); + } + + return TRUE; +} + +static void +show_cb (GtkWidget * widget, gpointer data) +{ + LogoutDialog * dialog = LOGOUT_DIALOG(widget); + + if (dialog->timerfunc != 0) { + g_source_remove(dialog->timerfunc); + dialog->timerfunc = 0; + } + + dialog->timerfunc = g_timeout_add_seconds(1, timer_cb, dialog); + return; +} + +static void +check_restart (LogoutDialog * dialog) +{ + if (dialog->action != LOGOUT_DIALOG_LOGOUT) { + return; + } + + if (g_file_test("/var/run/reboot-required", G_FILE_TEST_EXISTS)) { + if (pk_can_do_action("org.freedesktop.consolekit.system.restart", NULL) || + pk_can_do_action("org.freedesktop.consolekit.system.restart-multiple-users", NULL)) { + + gtk_label_set_text(GTK_LABEL(dialog->message), _(body_logout_update)); + gtk_widget_show(dialog->message); + if (pk_require_auth(LOGOUT_DIALOG_RESTART)) { + gtk_button_set_label(GTK_BUTTON(dialog->restart_button), _(restart_auth)); + } else { + gtk_button_set_label(GTK_BUTTON(dialog->restart_button), _(button_strings[LOGOUT_DIALOG_RESTART])); + } + gtk_widget_show(dialog->restart_button); + } + } + + return; +} + +static gboolean +focus_out_cb (GtkWidget *widget, GdkEventFocus *event, gpointer user_data) +{ + gtk_window_present (GTK_WINDOW(widget)); + return TRUE; +} + +static void +logout_dialog_init (LogoutDialog *logout_dialog) +{ + GtkDialog *dialog; + gint border_width = 6; + + logout_dialog->timeout = 60; + logout_dialog->timerfunc = 0; + + /* dialog window */ + dialog = GTK_DIALOG(logout_dialog); + + /* make sure that our window will always have the focus */ + g_signal_connect (G_OBJECT(dialog), "focus-out-event", + G_CALLBACK(focus_out_cb), NULL); + + logout_dialog->main_vbox = dialog->vbox; + + gtk_window_set_title (GTK_WINDOW(logout_dialog), ""); + gtk_dialog_set_has_separator (GTK_DIALOG(logout_dialog), FALSE); + gtk_container_set_border_width (GTK_CONTAINER(logout_dialog), border_width); + gtk_box_set_spacing (GTK_BOX(logout_dialog->main_vbox), 12); + gtk_window_set_resizable (GTK_WINDOW(logout_dialog), FALSE); + + gtk_window_stick(GTK_WINDOW(logout_dialog)); + gtk_window_set_keep_above(GTK_WINDOW(logout_dialog), TRUE); + gtk_widget_realize(GTK_WIDGET(logout_dialog)); + gdk_window_set_functions(GTK_WIDGET(logout_dialog)->window, GDK_FUNC_CLOSE); + + /* center window */ + gtk_window_set_position (GTK_WINDOW(logout_dialog), GTK_WIN_POS_CENTER); + + /* the action buttons */ + /* the cancel button */ + logout_dialog->restart_button = gtk_dialog_add_button (dialog, + GTK_STOCK_HELP, + GTK_RESPONSE_HELP); + gtk_button_set_label(GTK_BUTTON(logout_dialog->restart_button), _(button_strings[LOGOUT_DIALOG_RESTART])); + gtk_widget_hide(logout_dialog->restart_button); + + /* the cancel button */ + logout_dialog->cancel_button = gtk_dialog_add_button (dialog, + GTK_STOCK_CANCEL, + GTK_RESPONSE_CANCEL); + /* the ok button */ + logout_dialog->ok_button = gtk_dialog_add_button (dialog, + GTK_STOCK_OK, + GTK_RESPONSE_OK); + gtk_widget_grab_default (logout_dialog->ok_button); + + /* Title */ + gtk_window_set_title (GTK_WINDOW(logout_dialog), _(title_strings[logout_dialog->action])); + + /* hbox */ + logout_dialog->hbox = gtk_hbox_new (FALSE, 12); + gtk_container_set_border_width (GTK_CONTAINER(logout_dialog->hbox), 6); + gtk_box_pack_start (GTK_BOX(logout_dialog->main_vbox), + logout_dialog->hbox, FALSE, FALSE, 0); + gtk_widget_show (logout_dialog->hbox); + + /* image */ + logout_dialog->image = + gtk_image_new_from_icon_name (icon_strings[logout_dialog->action], + GTK_ICON_SIZE_DIALOG); + gtk_misc_set_alignment (GTK_MISC(logout_dialog->image), 0.5, 0); + gtk_box_pack_start (GTK_BOX(logout_dialog->hbox), logout_dialog->image, + FALSE, FALSE, 0); + gtk_widget_show (logout_dialog->image); + + /* vbox for text */ + logout_dialog->vbox_text = gtk_vbox_new(FALSE, 12); + gtk_box_pack_start(GTK_BOX(logout_dialog->hbox), logout_dialog->vbox_text, TRUE, TRUE, 0); + gtk_widget_show(logout_dialog->vbox_text); + + /* Message */ + logout_dialog->message = gtk_label_new(""); + gtk_label_set_line_wrap(GTK_LABEL(logout_dialog->message), TRUE); + gtk_label_set_single_line_mode(GTK_LABEL(logout_dialog->message), FALSE); + gtk_label_set_selectable(GTK_LABEL(logout_dialog->message), TRUE); + gtk_misc_set_alignment (GTK_MISC(logout_dialog->message), 0.0, 0.0); + gtk_box_pack_start(GTK_BOX(logout_dialog->vbox_text), logout_dialog->message, TRUE, TRUE, 0); + gtk_widget_show(logout_dialog->message); + + /* timeout */ + logout_dialog->timeout_text = gtk_label_new(""); + gtk_label_set_line_wrap(GTK_LABEL(logout_dialog->timeout_text), TRUE); + gtk_label_set_single_line_mode(GTK_LABEL(logout_dialog->timeout_text), FALSE); + gtk_label_set_selectable(GTK_LABEL(logout_dialog->timeout_text), FALSE); + gtk_misc_set_alignment (GTK_MISC(logout_dialog->timeout_text), 0.0, 0.5); + gtk_box_pack_start(GTK_BOX(logout_dialog->vbox_text), logout_dialog->timeout_text, TRUE, TRUE, 0); + gtk_widget_show(logout_dialog->timeout_text); + + g_signal_connect(G_OBJECT(logout_dialog), "show", G_CALLBACK(show_cb), logout_dialog); + + return; +} + +/** + * logout_dialog_new: + * + * Creates a new #LogoutDialog. + * + * Returns: the new #LogoutDialog + */ +GtkWidget* +logout_dialog_new (LogoutDialogAction action) +{ + LogoutDialog * dialog = g_object_new (LOGOUT_TYPE_DIALOG, "action", action, NULL); + return GTK_WIDGET(dialog); +} + +LogoutDialogAction +logout_dialog_get_action (LogoutDialog * dialog) +{ + return dialog->action; +} + diff --git a/src/gtk-dialog/logout-dialog.h b/src/gtk-dialog/logout-dialog.h new file mode 100644 index 0000000..b0e19b7 --- /dev/null +++ b/src/gtk-dialog/logout-dialog.h @@ -0,0 +1,99 @@ +/* + * libgksuui -- Gtk+ widget and convenience functions for requesting passwords + * Copyright (C) 2004 Gustavo Noronha Silva + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __LOGOUT_DIALOG_H__ +#define __LOGOUT_DIALOG_H__ + +#include + +G_BEGIN_DECLS + +#define LOGOUT_TYPE_DIALOG (logout_dialog_get_type ()) +#define LOGOUT_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), LOGOUT_TYPE_DIALOG, LogoutDialog)) +#define LOGOUT_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), LOGOUT_TYPE_DIALOG, LogoutDialogClass)) +#define LOGOUT_IS_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), LOGOUT_TYPE_DIALOG)) +#define LOGOUT_IS_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), LOGOUT_TYPE_CONTEXT)) +#define LOGOUT_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), LOGOUT_TYPE_DIALOG, LogoutDialogClass)) + +typedef struct _LogoutDialogClass LogoutDialogClass; +typedef struct _LogoutDialog LogoutDialog; +typedef enum _LogoutDialogAction LogoutDialogAction; + +enum _LogoutDialogAction { + LOGOUT_DIALOG_LOGOUT, + LOGOUT_DIALOG_RESTART, + LOGOUT_DIALOG_SHUTDOWN, + LOGOUT_DIALOG_ACTION_CNT +}; + +struct _LogoutDialogClass +{ + GtkDialogClass parent_class; +}; + +/** + * LogoutDialog: + * @dialog: parent widget + * @main_vbox: GtkDialog's vbox + * @hbox: box to separate the image of the right-side widgets + * @image: the authorization image, left-side widget + * @entry_vbox: right-side widgets container + * @label: message describing what is required from the user, + * right-side widget + * @entry: place to type the password in, right-side widget + * @ok_button: OK button of the dialog + * @cancel_button: Cancel button of the dialog + * + * Convenience widget based on #GtkDialog to request a password. + */ +struct _LogoutDialog +{ + GtkDialog dialog; + + GtkWidget *main_vbox; + GtkWidget *hbox; + GtkWidget *image; + GtkWidget *ok_button; + GtkWidget *cancel_button; + GtkWidget *restart_button; + GtkWidget *vbox_text; + GtkWidget *message; + GtkWidget *timeout_text; + + LogoutDialogAction action; + + /* private */ + gchar * timeout_result; + guint timeout; + guint timerfunc; +}; + +GType +logout_dialog_get_type (void); + +GtkWidget* +logout_dialog_new (LogoutDialogAction action); + +LogoutDialogAction +logout_dialog_get_action (LogoutDialog * widget); + +G_END_DECLS + +#endif -- cgit v1.2.3 From 472065f301abb41d33573e83eb5bdd5ea018973b Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 21 Jul 2009 16:06:05 -0500 Subject: Bringing in all the GTK includes and libraries --- configure.ac | 5 +++++ src/gtk-dialog/Makefile.am | 3 +++ 2 files changed, 8 insertions(+) diff --git a/configure.ac b/configure.ac index 58fee07..9d64f40 100644 --- a/configure.ac +++ b/configure.ac @@ -48,6 +48,11 @@ PKG_CHECK_MODULES(SESSIONSERVICE, dbusmenu-glib >= $DBUSMENUGLIB_REQUIRED_VERSIO AC_SUBST(SESSIONERVICE_CFLAGS) AC_SUBST(SESSIONERVICE_LIBS) +PKG_CHECK_MODULES(GTKLOGOUTHELPER, gtk+-2.0 >= $GTK_REQUIRED_VERSION) + +AC_SUBST(GTKLOGOUTHELPER_CFLAGS) +AC_SUBST(GTKLOGOUTHELPER_LIBS) + ########################### # Check to see if we're local ########################### diff --git a/src/gtk-dialog/Makefile.am b/src/gtk-dialog/Makefile.am index 20e3d83..07b0915 100644 --- a/src/gtk-dialog/Makefile.am +++ b/src/gtk-dialog/Makefile.am @@ -6,3 +6,6 @@ gtk_logout_helper_SOURCES = \ logout-dialog.c \ logout-dialog.h +gtk_logout_helper_CFLAGS = $(GTKLOGOUTHELPER_CFLAGS) -Wall -Werror +gtk_logout_helper_LDADD = $(GTKLOGOUTHELPER_LIBS) + -- cgit v1.2.3 From 316a59dbcf5f5725ad1bb92d3165d0994ac51df3 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 21 Jul 2009 16:20:31 -0500 Subject: Whoo, hoo, it builds --- .bzrignore | 3 + configure.ac | 3 +- src/gtk-dialog/Makefile.am | 2 + src/gtk-dialog/ck-pk-helper.c | 214 +++++++++++++++++++++++++++++++++++++++++ src/gtk-dialog/ck-pk-helper.h | 6 ++ src/gtk-dialog/logout-dialog.c | 4 +- 6 files changed, 228 insertions(+), 4 deletions(-) create mode 100644 src/gtk-dialog/ck-pk-helper.c create mode 100644 src/gtk-dialog/ck-pk-helper.h diff --git a/.bzrignore b/.bzrignore index 2ff5ffb..ff3cbaf 100644 --- a/.bzrignore +++ b/.bzrignore @@ -25,3 +25,6 @@ indicator-status.service indicator-users.service status-service-client.h status-service-server.h +gtk-logout-helper +.deps +.libs diff --git a/configure.ac b/configure.ac index 9d64f40..1e65958 100644 --- a/configure.ac +++ b/configure.ac @@ -48,7 +48,8 @@ PKG_CHECK_MODULES(SESSIONSERVICE, dbusmenu-glib >= $DBUSMENUGLIB_REQUIRED_VERSIO AC_SUBST(SESSIONERVICE_CFLAGS) AC_SUBST(SESSIONERVICE_LIBS) -PKG_CHECK_MODULES(GTKLOGOUTHELPER, gtk+-2.0 >= $GTK_REQUIRED_VERSION) +PKG_CHECK_MODULES(GTKLOGOUTHELPER, gtk+-2.0 >= $GTK_REQUIRED_VERSION + polkit-gnome) AC_SUBST(GTKLOGOUTHELPER_CFLAGS) AC_SUBST(GTKLOGOUTHELPER_LIBS) diff --git a/src/gtk-dialog/Makefile.am b/src/gtk-dialog/Makefile.am index 07b0915..9aa0097 100644 --- a/src/gtk-dialog/Makefile.am +++ b/src/gtk-dialog/Makefile.am @@ -3,6 +3,8 @@ libexec_PROGRAMS = gtk-logout-helper gtk_logout_helper_SOURCES = \ gtk-logout-helper.c \ + ck-pk-helper.c \ + ck-pk-helper.h \ logout-dialog.c \ logout-dialog.h diff --git a/src/gtk-dialog/ck-pk-helper.c b/src/gtk-dialog/ck-pk-helper.c new file mode 100644 index 0000000..9278905 --- /dev/null +++ b/src/gtk-dialog/ck-pk-helper.c @@ -0,0 +1,214 @@ + +#include +#include +#include +#include + +#include "logout-dialog.h" +#include "ck-pk-helper.h" + +static gboolean +ck_multiple_users (void) +{ + DBusGConnection * sbus = dbus_g_bus_get(DBUS_BUS_SYSTEM, NULL); + g_return_val_if_fail(sbus != NULL, TRUE); /* worst case */ + DBusGProxy * proxy = dbus_g_proxy_new_for_name(sbus, "org.freedesktop.ConsoleKit", + "/org/freedesktop/ConsoleKit/Manager", + "org.freedesktop.ConsoleKit.Manager"); + + if (proxy == NULL) { + return TRUE; + } + + gboolean result; + GPtrArray * seats = NULL; + + result = dbus_g_proxy_call(proxy, "GetSeats", NULL, G_TYPE_INVALID, + dbus_g_type_get_collection("GPtrArray", DBUS_TYPE_G_OBJECT_PATH), &seats, G_TYPE_INVALID); + + if (!result) { + g_warning("Unable to get the seats for ConsoleKit"); + g_object_unref(proxy); + return TRUE; + } + + gchar * this_session_id = NULL; + + result = dbus_g_proxy_call(proxy, "GetCurrentSession", NULL, G_TYPE_INVALID, + DBUS_TYPE_G_OBJECT_PATH, &this_session_id, G_TYPE_INVALID); + + g_object_unref(proxy); + + if (!result) { + g_warning("Unable to get current session from ConsoleKit"); + return TRUE; + } + + proxy = dbus_g_proxy_new_for_name(sbus, "org.freedesktop.ConsoleKit", + this_session_id, "org.freedesktop.ConsoleKit.Session"); + + if (proxy == NULL) { + return TRUE; + } + + guint this_session_uid; + + result = dbus_g_proxy_call(proxy, "GetUnixUser", NULL, G_TYPE_INVALID, + G_TYPE_UINT, &this_session_uid, G_TYPE_INVALID); + + if (!result) { + g_warning("Unable to get UID from ConsoleKit"); + return TRUE; + } + + guint seat; + gboolean multiple_users = FALSE; + for (seat = 0; seat < seats->len; seat++) { + gchar * seat_id = g_ptr_array_index(seats, seat); + DBusGProxy * seat_proxy = dbus_g_proxy_new_for_name(sbus, "org.freedesktop.ConsoleKit", + seat_id, "org.freedesktop.ConsoleKit.Seat"); + g_free(seat_id); + + if (seat_proxy == NULL) { + continue; + } + + GPtrArray * sessions = NULL; + + gboolean result = dbus_g_proxy_call(seat_proxy, + "GetSessions", NULL, G_TYPE_INVALID, + dbus_g_type_get_collection("GPtrArray", DBUS_TYPE_G_OBJECT_PATH), &sessions, G_TYPE_INVALID); + + g_object_unref(seat_proxy); + if (!result) { + continue; + } + + guint session; + for (session = 0; session < sessions->len; session++) { + gchar * session_id = g_ptr_array_index(sessions, session); + if (g_strcmp0(this_session_id, session_id) == 0) { + continue; + } + DBusGProxy * session_proxy = dbus_g_proxy_new_for_name(sbus, "org.freedesktop.ConsoleKit", + session_id, "org.freedesktop.ConsoleKit.Session"); + g_free(session_id); + + if (session_proxy == NULL) { + continue; + } + + guint session_uid; + result = dbus_g_proxy_call(session_proxy, "GetUnixUser", NULL, G_TYPE_INVALID, + G_TYPE_UINT, &session_uid, G_TYPE_INVALID); + g_object_unref(session_proxy); + + if (!result) { + continue; + } + + if (session_uid != this_session_uid) { + multiple_users = TRUE; + break; + } + } + + g_ptr_array_free(sessions, TRUE); + + if (multiple_users) { + break; + } + } + + g_ptr_array_free(seats, TRUE); + g_object_unref(proxy); + g_free(this_session_id); + + return multiple_users; +} + +gboolean +pk_require_auth (LogoutDialogAction action) { + if (action == LOGOUT_DIALOG_LOGOUT) { + return FALSE; + } + + gchar * pk_action; + if (ck_multiple_users()) { + if (action == LOGOUT_DIALOG_RESTART) { + pk_action = "org.freedesktop.consolekit.system.restart-multiple-users"; + } else { + pk_action = "org.freedesktop.consolekit.system.stop-multiple-users"; + } + } else { + if (action == LOGOUT_DIALOG_RESTART) { + pk_action = "org.freedesktop.consolekit.system.restart"; + } else { + pk_action = "org.freedesktop.consolekit.system.stop"; + } + } + + PolKitResult polres; + if (pk_can_do_action(pk_action, &polres)) { + if (polres == POLKIT_RESULT_YES) { + return FALSE; + } + return TRUE; + } + return FALSE; +} + +gboolean +pk_can_do_action (const gchar *action_id, PolKitResult * pol_result) +{ + PolKitGnomeContext *gnome_context; + PolKitAction *action; + PolKitCaller *caller; + DBusError dbus_error; + PolKitError *error; + PolKitResult result; + + gnome_context = polkit_gnome_context_get (NULL); + + if (gnome_context == NULL) { + return FALSE; + } + + if (gnome_context->pk_tracker == NULL) { + return FALSE; + } + + dbus_error_init (&dbus_error); + caller = polkit_tracker_get_caller_from_pid (gnome_context->pk_tracker, + getpid (), + &dbus_error); + dbus_error_free (&dbus_error); + + if (caller == NULL) { + return FALSE; + } + + action = polkit_action_new (); + if (!polkit_action_set_action_id (action, action_id)) { + polkit_action_unref (action); + polkit_caller_unref (caller); + return FALSE; + } + + result = POLKIT_RESULT_UNKNOWN; + error = NULL; + result = polkit_context_is_caller_authorized (gnome_context->pk_context, + action, caller, FALSE, + &error); + if (polkit_error_is_set (error)) { + polkit_error_free (error); + } + polkit_action_unref (action); + polkit_caller_unref (caller); + + if (pol_result != NULL) { + *pol_result = result; + } + + return result != POLKIT_RESULT_NO && result != POLKIT_RESULT_UNKNOWN; +} diff --git a/src/gtk-dialog/ck-pk-helper.h b/src/gtk-dialog/ck-pk-helper.h new file mode 100644 index 0000000..6a3aa5a --- /dev/null +++ b/src/gtk-dialog/ck-pk-helper.h @@ -0,0 +1,6 @@ + +#include + +gboolean pk_require_auth (LogoutDialogAction action); +gboolean pk_can_do_action (const gchar *action_id, PolKitResult * pol_result); + diff --git a/src/gtk-dialog/logout-dialog.c b/src/gtk-dialog/logout-dialog.c index 0cd0f7a..cd49b00 100644 --- a/src/gtk-dialog/logout-dialog.c +++ b/src/gtk-dialog/logout-dialog.c @@ -26,10 +26,8 @@ #include #include -#include "../config.h" - #include "logout-dialog.h" -#include "applet.h" +#include "ck-pk-helper.h" enum { PROP_ZERO, -- cgit v1.2.3 From 6b1103051fa560a06697e7da9a6820deec888b67 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 21 Jul 2009 16:25:00 -0500 Subject: ifdef protection --- src/gtk-dialog/ck-pk-helper.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/gtk-dialog/ck-pk-helper.h b/src/gtk-dialog/ck-pk-helper.h index 6a3aa5a..fb5936e 100644 --- a/src/gtk-dialog/ck-pk-helper.h +++ b/src/gtk-dialog/ck-pk-helper.h @@ -1,6 +1,10 @@ +#ifndef __CK_PK_HELPER_H__ +#define __CK_PK_HELPER_H__ 1 + #include gboolean pk_require_auth (LogoutDialogAction action); gboolean pk_can_do_action (const gchar *action_id, PolKitResult * pol_result); +#endif /* __CK_PK_HELPER__ */ -- cgit v1.2.3 From 54b1242df348e8576b4457ea4297d57807f4ce42 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 22 Jul 2009 10:24:02 -0500 Subject: Switching to having a single handler and then everyone calling it with a parameter. --- src/session-service.c | 41 +++++++---------------------------------- 1 file changed, 7 insertions(+), 34 deletions(-) diff --git a/src/session-service.c b/src/session-service.c index 80d4172..55e60df 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -13,37 +13,10 @@ static DbusmenuMenuitem * root_menuitem = NULL; static GMainLoop * mainloop = NULL; static void -log_out (DbusmenuMenuitem * mi, gpointer userdata) +show_dialog (DbusmenuMenuitem * mi, gchar * type) { - g_debug("Log Out"); - return; -} - -static void -suspend (DbusmenuMenuitem * mi, gpointer userdata) -{ - g_debug("Suspend"); - return; -} + g_debug("Showing dialog '%s'", type); -static void -hibernate (DbusmenuMenuitem * mi, gpointer userdata) -{ - g_debug("Hibernate"); - return; -} - -static void -restart (DbusmenuMenuitem * mi, gpointer userdata) -{ - g_debug("Restart"); - return; -} - -static void -shutdown (DbusmenuMenuitem * mi, gpointer userdata) -{ - g_debug("Shutdown"); return; } @@ -54,27 +27,27 @@ create_items (DbusmenuMenuitem * root) { mi = dbusmenu_menuitem_new(); dbusmenu_menuitem_property_set(mi, "label", _("Log Out")); dbusmenu_menuitem_child_append(root, mi); - g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(log_out), NULL); + g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(show_dialog), "logout"); mi = dbusmenu_menuitem_new(); dbusmenu_menuitem_property_set(mi, "label", _("Suspend")); dbusmenu_menuitem_child_append(root, mi); - g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(suspend), NULL); + g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(show_dialog), "suspend"); mi = dbusmenu_menuitem_new(); dbusmenu_menuitem_property_set(mi, "label", _("Hibernate")); dbusmenu_menuitem_child_append(root, mi); - g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(hibernate), NULL); + g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(show_dialog), "hibernate"); mi = dbusmenu_menuitem_new(); dbusmenu_menuitem_property_set(mi, "label", _("Restart")); dbusmenu_menuitem_child_append(root, mi); - g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(restart), NULL); + g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(show_dialog), "restart"); mi = dbusmenu_menuitem_new(); dbusmenu_menuitem_property_set(mi, "label", _("Shutdown")); dbusmenu_menuitem_child_append(root, mi); - g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(shutdown), NULL); + g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(show_dialog), "shutdown"); return; } -- cgit v1.2.3 From e43d5e49b26a96f1b3f3d16e1a42b3466862d6b1 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 22 Jul 2009 10:24:38 -0500 Subject: Make a dialog pop up. Not really the right one, but one. --- src/gtk-dialog/gtk-logout-helper.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/gtk-dialog/gtk-logout-helper.c b/src/gtk-dialog/gtk-logout-helper.c index f268be4..f6598bc 100644 --- a/src/gtk-dialog/gtk-logout-helper.c +++ b/src/gtk-dialog/gtk-logout-helper.c @@ -1,8 +1,14 @@ +#include +#include "logout-dialog.h" + int main (int argc, char * argv[]) { + gtk_init(&argc, &argv); + GtkWidget * dialog = logout_dialog_new(LOGOUT_DIALOG_LOGOUT); + gtk_dialog_run(GTK_DIALOG(dialog)); return 0; } -- cgit v1.2.3 From c9cfcc8a9aefd2122e80e3674c0da96ffe849a34 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 22 Jul 2009 12:31:39 -0500 Subject: Executing the helper, but it needs to be the one in the libexec path. --- src/Makefile.am | 2 +- src/session-service.c | 14 +++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index cf18aaa..ab79f0f 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -59,7 +59,7 @@ indicator_users_service_LDADD = $(USERSSERVICE_LIBS) ################# indicator_session_service_SOURCES = session-service.c -indicator_session_service_CFLAGS = $(SESSIONSERVICE_CFLAGS) +indicator_session_service_CFLAGS = $(SESSIONSERVICE_CFLAGS) -DLIBEXECDIR=\"$(libexecdir)\" indicator_session_service_LDADD = $(SESSIONSERVICE_LIBS) ############### diff --git a/src/session-service.c b/src/session-service.c index 55e60df..b301baf 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -15,7 +15,19 @@ static GMainLoop * mainloop = NULL; static void show_dialog (DbusmenuMenuitem * mi, gchar * type) { - g_debug("Showing dialog '%s'", type); + gchar * helper = g_build_path(LIBEXECDIR, "gtk-logout-helper", NULL); + gchar * dialog_line = g_strdup_printf("%s --%s", helper, type); + g_free(helper); + + g_debug("Showing dialog '%s'", dialog_line); + + GError * error = NULL; + if (!g_spawn_command_line_async(dialog_line, &error)) { + g_warning("Unable to show dialog: %s", error->message); + g_error_free(error); + } + + g_free(dialog_line); return; } -- cgit v1.2.3 From 93015d3c3439951ecc5019c97bf6a7226983600f Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 22 Jul 2009 17:22:23 -0500 Subject: Damn it, wrong function --- src/session-service.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/session-service.c b/src/session-service.c index b301baf..c8b3170 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -15,7 +15,7 @@ static GMainLoop * mainloop = NULL; static void show_dialog (DbusmenuMenuitem * mi, gchar * type) { - gchar * helper = g_build_path(LIBEXECDIR, "gtk-logout-helper", NULL); + gchar * helper = g_build_filename(LIBEXECDIR, "gtk-logout-helper", NULL); gchar * dialog_line = g_strdup_printf("%s --%s", helper, type); g_free(helper); -- cgit v1.2.3 From 74da0353e9344e80e01464c74a75d0ce0a4ca0dd Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 23 Jul 2009 00:18:28 -0500 Subject: Basic command line parsing. Not working 100% yet. --- src/gtk-dialog/gtk-logout-helper.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/gtk-dialog/gtk-logout-helper.c b/src/gtk-dialog/gtk-logout-helper.c index f6598bc..1564404 100644 --- a/src/gtk-dialog/gtk-logout-helper.c +++ b/src/gtk-dialog/gtk-logout-helper.c @@ -1,12 +1,42 @@ +#include #include #include "logout-dialog.h" +static LogoutDialogAction type = LOGOUT_DIALOG_LOGOUT; + +static gboolean +option_cb (const gchar * arg, const gchar * value, gpointer data, GError * error) +{ + type = GPOINTER_TO_INT(data); + return TRUE; +} + +static GOptionEntry options[] = { + {"logout", 'l', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, option_cb, "Log out of the current session", GINT_TO_POINTER(LOGOUT_DIALOG_LOGOUT)}, + {"shutdown", 's', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, option_cb, "Shutdown the entire system", GINT_TO_POINTER(LOGOUT_DIALOG_RESTART)}, + {"restart", 'r', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, option_cb, "Restart the system", GINT_TO_POINTER(LOGOUT_DIALOG_SHUTDOWN)}, + + {NULL} +}; + int main (int argc, char * argv[]) { gtk_init(&argc, &argv); + GError * error = NULL; + GOptionContext * context = g_option_context_new(" - logout of the current session"); + g_option_context_add_main_entries(context, options, "gtk-logout-helper"); + g_option_context_add_group(context, gtk_get_option_group(TRUE)); + g_option_context_set_help_enabled(context, TRUE); + + if (!g_option_context_parse(context, &argc, &argv, &error)) { + g_debug("Option parsing failed: %s", error->message); + g_error_free(error); + return 1; + } + GtkWidget * dialog = logout_dialog_new(LOGOUT_DIALOG_LOGOUT); gtk_dialog_run(GTK_DIALOG(dialog)); -- cgit v1.2.3 From bf936e17c6ac25344055de4eab06afc8b3893cb2 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 23 Jul 2009 10:19:20 -0500 Subject: Getting all the parameters working so that we can set the dialog type --- src/gtk-dialog/gtk-logout-helper.c | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/gtk-dialog/gtk-logout-helper.c b/src/gtk-dialog/gtk-logout-helper.c index 1564404..505ea16 100644 --- a/src/gtk-dialog/gtk-logout-helper.c +++ b/src/gtk-dialog/gtk-logout-helper.c @@ -6,16 +6,30 @@ static LogoutDialogAction type = LOGOUT_DIALOG_LOGOUT; static gboolean -option_cb (const gchar * arg, const gchar * value, gpointer data, GError * error) +option_logout (const gchar * arg, const gchar * value, gpointer data, GError * error) { - type = GPOINTER_TO_INT(data); + type = LOGOUT_DIALOG_LOGOUT; + return TRUE; +} + +static gboolean +option_shutdown (const gchar * arg, const gchar * value, gpointer data, GError * error) +{ + type = LOGOUT_DIALOG_SHUTDOWN; + return TRUE; +} + +static gboolean +option_restart (const gchar * arg, const gchar * value, gpointer data, GError * error) +{ + type = LOGOUT_DIALOG_RESTART; return TRUE; } static GOptionEntry options[] = { - {"logout", 'l', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, option_cb, "Log out of the current session", GINT_TO_POINTER(LOGOUT_DIALOG_LOGOUT)}, - {"shutdown", 's', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, option_cb, "Shutdown the entire system", GINT_TO_POINTER(LOGOUT_DIALOG_RESTART)}, - {"restart", 'r', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, option_cb, "Restart the system", GINT_TO_POINTER(LOGOUT_DIALOG_SHUTDOWN)}, + {"logout", 'l', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, option_logout, "Log out of the current session", NULL}, + {"shutdown", 's', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, option_shutdown, "Shutdown the entire system", NULL}, + {"restart", 'r', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, option_restart, "Restart the system", NULL}, {NULL} }; @@ -37,7 +51,7 @@ main (int argc, char * argv[]) return 1; } - GtkWidget * dialog = logout_dialog_new(LOGOUT_DIALOG_LOGOUT); + GtkWidget * dialog = logout_dialog_new(type); gtk_dialog_run(GTK_DIALOG(dialog)); return 0; -- cgit v1.2.3 From 624c4acbd0c256f5cf8e7067e8dab935bf6c2b5f Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 23 Jul 2009 15:46:07 -0500 Subject: Now check for the PK dialog and otherwise run ours. If we get restart, restart --- src/gtk-dialog/gtk-logout-helper.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/gtk-dialog/gtk-logout-helper.c b/src/gtk-dialog/gtk-logout-helper.c index 505ea16..c7f67a5 100644 --- a/src/gtk-dialog/gtk-logout-helper.c +++ b/src/gtk-dialog/gtk-logout-helper.c @@ -2,6 +2,7 @@ #include #include #include "logout-dialog.h" +#include "ck-pk-helper.h" static LogoutDialogAction type = LOGOUT_DIALOG_LOGOUT; @@ -51,8 +52,24 @@ main (int argc, char * argv[]) return 1; } - GtkWidget * dialog = logout_dialog_new(type); - gtk_dialog_run(GTK_DIALOG(dialog)); + GtkWidget * dialog = NULL; + if (!pk_require_auth(type)) { + dialog = logout_dialog_new(type); + } + + if (dialog != NULL) { + GtkResponseType response = gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_hide(dialog); + + if (response == GTK_RESPONSE_HELP) { + type = LOGOUT_DIALOG_RESTART; + response = GTK_RESPONSE_OK; + } + + if (response != GTK_RESPONSE_OK) { + return 0; + } + } return 0; } -- cgit v1.2.3 From 04c5db216a561b9232df1e7626a852ff8df9cbf1 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 23 Jul 2009 15:56:04 -0500 Subject: Adding in the action code from our previous patches to FUSA --- src/gtk-dialog/gtk-logout-helper.c | 59 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/src/gtk-dialog/gtk-logout-helper.c b/src/gtk-dialog/gtk-logout-helper.c index c7f67a5..75ab63f 100644 --- a/src/gtk-dialog/gtk-logout-helper.c +++ b/src/gtk-dialog/gtk-logout-helper.c @@ -1,9 +1,66 @@ #include #include +#include #include "logout-dialog.h" #include "ck-pk-helper.h" +static void +session_action (LogoutDialogAction action) +{ + DBusGConnection * sbus; + DBusGProxy * sm_proxy; + GError * error = NULL; + gboolean res = FALSE; + + sbus = dbus_g_bus_get(DBUS_BUS_SESSION, NULL); + if (sbus == NULL) { + g_warning("Unable to get DBus session bus."); + return; + } + sm_proxy = dbus_g_proxy_new_for_name_owner (sbus, + "org.gnome.SessionManager", + "/org/gnome/SessionManager", + "org.gnome.SessionManager", + &error); + if (sm_proxy == NULL) { + g_warning("Unable to get DBus proxy to SessionManager interface: %s", error->message); + g_error_free(error); + return; + } + + g_clear_error (&error); + + if (action == LOGOUT_DIALOG_LOGOUT) { + res = dbus_g_proxy_call_with_timeout (sm_proxy, "Logout", INT_MAX, &error, + G_TYPE_UINT, 1, G_TYPE_INVALID, G_TYPE_INVALID); + } else if (action == LOGOUT_DIALOG_SHUTDOWN) { + res = dbus_g_proxy_call_with_timeout (sm_proxy, "RequestShutdown", INT_MAX, &error, + G_TYPE_INVALID, G_TYPE_INVALID); + } else if (action == LOGOUT_DIALOG_RESTART) { + res = dbus_g_proxy_call_with_timeout (sm_proxy, "RequestReboot", INT_MAX, &error, + G_TYPE_INVALID, G_TYPE_INVALID); + } else { + g_warning ("Unknown session action"); + } + + if (!res) { + if (error != NULL) { + g_warning ("SessionManager action failed: %s", error->message); + } else { + g_warning ("SessionManager action failed: unknown error"); + } + } + + g_object_unref(sm_proxy); + + if (error != NULL) { + g_error_free(error); + } + + return; +} + static LogoutDialogAction type = LOGOUT_DIALOG_LOGOUT; static gboolean @@ -71,5 +128,7 @@ main (int argc, char * argv[]) } } + session_action(type); + return 0; } -- cgit v1.2.3 From 65fe469210b617061b28f2ce83b6fc187a0eb756 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 23 Jul 2009 16:15:04 -0500 Subject: Some comments are always good. --- src/session-service.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/session-service.c b/src/session-service.c index c8b3170..84091c8 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -12,6 +12,10 @@ static DbusmenuMenuitem * root_menuitem = NULL; static GMainLoop * mainloop = NULL; +/* This is the function to show a dialog on actions that + can destroy data. Currently it just calls the GTK version + but it seems that in the future it should figure out + what's going on and something better. */ static void show_dialog (DbusmenuMenuitem * mi, gchar * type) { @@ -32,6 +36,8 @@ show_dialog (DbusmenuMenuitem * mi, gchar * type) return; } +/* This function creates all of the menuitems that the service + provides in the UI. It also connects them to the callbacks. */ static void create_items (DbusmenuMenuitem * root) { DbusmenuMenuitem * mi = NULL; @@ -64,6 +70,8 @@ create_items (DbusmenuMenuitem * root) { return; } +/* Main, is well, main. It brings everything up and throws + us into the mainloop of no return. */ int main (int argc, char ** argv) { -- cgit v1.2.3 From 44fe17857bc3fca0093a83c4d4d4c344d14fca46 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 23 Jul 2009 20:37:51 -0500 Subject: Adding in some DKp defines. --- src/session-service.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/session-service.c b/src/session-service.c index 84091c8..c281a8a 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -9,6 +9,10 @@ #include "dbus-shared-names.h" +#define DKP_ADDRESS "org.freedesktop.DeviceKit.Power" +#define DKP_OBJECT "/org/freedesktop/DeviceKit/Power" +#define DKP_INTERFACE "org.freedesktop.DeviceKit.Power" + static DbusmenuMenuitem * root_menuitem = NULL; static GMainLoop * mainloop = NULL; -- cgit v1.2.3 From 7419d52e1e26079f01c8981306d8fed50fd8c265 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 23 Jul 2009 21:11:50 -0500 Subject: Building the DKP proxies --- src/session-service.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/session-service.c b/src/session-service.c index c281a8a..7b686d5 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -15,6 +15,35 @@ static DbusmenuMenuitem * root_menuitem = NULL; static GMainLoop * mainloop = NULL; +static DBusGProxy * dkp_main_proxy = NULL; +static DBusGProxy * dkp_prop_proxy = NULL; + +/* This function goes through and sets up what we need for + DKp checking. We're even setting up the calls for the props + we need */ +static void +setup_dkp (void) { + DBusGConnection * bus = dbus_g_bus_get(DBUS_BUS_SYSTEM, NULL); + g_return_if_fail(bus != NULL); + + if (dkp_main_proxy == NULL) { + dkp_main_proxy = dbus_g_proxy_new_for_name(bus, + DKP_ADDRESS, + DKP_OBJECT, + DKP_INTERFACE); + } + g_return_if_fail(dkp_main_proxy != NULL); + + if (dkp_prop_proxy == NULL) { + dkp_prop_proxy = dbus_g_proxy_new_for_name(bus, + DKP_ADDRESS, + DKP_OBJECT, + DBUS_INTERFACE_PROPERTIES); + } + g_return_if_fail(dkp_prop_proxy != NULL); + + return; +} /* This is the function to show a dialog on actions that can destroy data. Currently it just calls the GTK version @@ -100,6 +129,7 @@ main (int argc, char ** argv) g_debug("Root ID: %d", dbusmenu_menuitem_get_id(root_menuitem)); create_items(root_menuitem); + setup_dkp(); DbusmenuServer * server = dbusmenu_server_new(INDICATOR_SESSION_DBUS_OBJECT); dbusmenu_server_set_root(server, root_menuitem); -- cgit v1.2.3 From db481c5758ce617524fc8ba373538d8be7ed0c8e Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 23 Jul 2009 21:53:04 -0500 Subject: Adding in the function to make the calls to DKP --- src/session-service.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/session-service.c b/src/session-service.c index 7b686d5..f17a2d6 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -18,6 +18,24 @@ static GMainLoop * mainloop = NULL; static DBusGProxy * dkp_main_proxy = NULL; static DBusGProxy * dkp_prop_proxy = NULL; +/* Hibernate the machine */ +static void +sleep (DbusmenuMenuitem * mi, gpointer userdata) +{ + gchar * type = (gchar *)userdata; + + if (dkp_main_proxy == NULL) { + g_warning("Can not %s as no DeviceKit Power Proxy", type); + } + + dbus_g_proxy_call_no_reply(dkp_main_proxy, + type, + G_TYPE_INVALID, + G_TYPE_INVALID); + + return; +} + /* This function goes through and sets up what we need for DKp checking. We're even setting up the calls for the props we need */ @@ -83,12 +101,12 @@ create_items (DbusmenuMenuitem * root) { mi = dbusmenu_menuitem_new(); dbusmenu_menuitem_property_set(mi, "label", _("Suspend")); dbusmenu_menuitem_child_append(root, mi); - g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(show_dialog), "suspend"); + g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(sleep), "Suspend"); mi = dbusmenu_menuitem_new(); dbusmenu_menuitem_property_set(mi, "label", _("Hibernate")); dbusmenu_menuitem_child_append(root, mi); - g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(show_dialog), "hibernate"); + g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(sleep), "Hibernate"); mi = dbusmenu_menuitem_new(); dbusmenu_menuitem_property_set(mi, "label", _("Restart")); -- cgit v1.2.3 From f97c0f6c6838fcbc536e718f7107ded62e9e5d8b Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 24 Jul 2009 08:28:39 -0500 Subject: Comment update --- src/session-service.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/session-service.c b/src/session-service.c index f17a2d6..431d5ea 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -18,7 +18,8 @@ static GMainLoop * mainloop = NULL; static DBusGProxy * dkp_main_proxy = NULL; static DBusGProxy * dkp_prop_proxy = NULL; -/* Hibernate the machine */ +/* Let's put this machine to sleep, with some info on how + it should sleep. */ static void sleep (DbusmenuMenuitem * mi, gpointer userdata) { -- cgit v1.2.3 From 73a077d2efd6a5465f3927a8b151371315faf041 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 24 Jul 2009 10:42:42 -0500 Subject: TODO list --- src/session-service.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/session-service.c b/src/session-service.c index 431d5ea..30bb5de 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -61,6 +61,12 @@ setup_dkp (void) { } g_return_if_fail(dkp_prop_proxy != NULL); + /* Connect to changed signal */ + + /* Start Async call to see if we can hibernate */ + + /* Start Async call to see if we can suspend */ + return; } -- cgit v1.2.3 From 7892498e5af9af135aab6268ec875384ecf47109 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 24 Jul 2009 13:52:45 -0500 Subject: Setting up change, and issuing a response --- src/session-service.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 72 insertions(+), 4 deletions(-) diff --git a/src/session-service.c b/src/session-service.c index 30bb5de..50e0f13 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -18,6 +18,9 @@ static GMainLoop * mainloop = NULL; static DBusGProxy * dkp_main_proxy = NULL; static DBusGProxy * dkp_prop_proxy = NULL; +static DBusGProxyCall * suspend_call = NULL; +static DBusGProxyCall * hibernate_call = NULL; + /* Let's put this machine to sleep, with some info on how it should sleep. */ static void @@ -37,6 +40,63 @@ sleep (DbusmenuMenuitem * mi, gpointer userdata) return; } +static void +suspend_prop_cb (DBusGProxy * proxy, DBusGProxyCall * call, gpointer userdata) +{ + suspend_call = NULL; + +} + +static void +hibernate_prop_cb (DBusGProxy * proxy, DBusGProxyCall * call, gpointer userdata) +{ + hibernate_call = NULL; + +} + +/* A signal that we need to recheck to ensure we can still + hibernate and/or suspend */ +static void +dpk_changed_cb (DBusGProxy * proxy, gpointer user_data) +{ + /* Start Async call to see if we can hibernate */ + if (suspend_call == NULL) { + suspend_call = dbus_g_proxy_begin_call(dkp_prop_proxy, + "Get", + suspend_prop_cb, + NULL, + NULL, + G_TYPE_STRING, + DKP_INTERFACE, + G_TYPE_STRING, + "can-suspend", + G_TYPE_INVALID, + G_TYPE_BOOLEAN, + G_TYPE_INVALID); + + } + + /* Start Async call to see if we can suspend */ + if (hibernate_call == NULL) { + hibernate_call = dbus_g_proxy_begin_call(dkp_prop_proxy, + "Get", + hibernate_prop_cb, + NULL, + NULL, + G_TYPE_STRING, + DKP_INTERFACE, + G_TYPE_STRING, + "can-hibernate", + G_TYPE_INVALID, + G_TYPE_BOOLEAN, + G_TYPE_INVALID); + + + } + + return; +} + /* This function goes through and sets up what we need for DKp checking. We're even setting up the calls for the props we need */ @@ -62,10 +122,18 @@ setup_dkp (void) { g_return_if_fail(dkp_prop_proxy != NULL); /* Connect to changed signal */ - - /* Start Async call to see if we can hibernate */ - - /* Start Async call to see if we can suspend */ + dbus_g_proxy_add_signal(dkp_main_proxy, + "Changed", + G_TYPE_INVALID); + + dbus_g_proxy_connect_signal(dkp_main_proxy, + "Changed", + G_CALLBACK(dpk_changed_cb), + NULL, + NULL); + + /* Force an original "changed" event */ + dpk_changed_cb(dkp_main_proxy, NULL); return; } -- cgit v1.2.3 From 030273f33da9c1ac7875d7319ffc6d78561719cf Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 24 Jul 2009 15:56:36 -0500 Subject: Checking the suspend and hibernate properties --- src/session-service.c | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/session-service.c b/src/session-service.c index 50e0f13..240f397 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -45,6 +45,18 @@ suspend_prop_cb (DBusGProxy * proxy, DBusGProxyCall * call, gpointer userdata) { suspend_call = NULL; + GValue candoit = {0}; + GError * error = NULL; + dbus_g_proxy_end_call(proxy, call, &error, G_TYPE_VALUE, &candoit, G_TYPE_INVALID); + if (error != NULL) { + g_warning("Unable to check suspend: %s", error->message); + g_error_free(error); + return; + } + g_debug("Got Suspend: %s", g_value_get_boolean(&candoit) ? "true" : "false"); + + + return; } static void @@ -52,6 +64,18 @@ hibernate_prop_cb (DBusGProxy * proxy, DBusGProxyCall * call, gpointer userdata) { hibernate_call = NULL; + GValue candoit = {0}; + GError * error = NULL; + dbus_g_proxy_end_call(proxy, call, &error, G_TYPE_VALUE, &candoit, G_TYPE_INVALID); + if (error != NULL) { + g_warning("Unable to check hibernate: %s", error->message); + g_error_free(error); + return; + } + g_debug("Got Hibernate: %s", g_value_get_boolean(&candoit) ? "true" : "false"); + + + return; } /* A signal that we need to recheck to ensure we can still @@ -71,7 +95,7 @@ dpk_changed_cb (DBusGProxy * proxy, gpointer user_data) G_TYPE_STRING, "can-suspend", G_TYPE_INVALID, - G_TYPE_BOOLEAN, + G_TYPE_VALUE, G_TYPE_INVALID); } @@ -88,7 +112,7 @@ dpk_changed_cb (DBusGProxy * proxy, gpointer user_data) G_TYPE_STRING, "can-hibernate", G_TYPE_INVALID, - G_TYPE_BOOLEAN, + G_TYPE_VALUE, G_TYPE_INVALID); -- cgit v1.2.3 From ec987aaf9598ffa43561e9f3ef9cb4bcf0d21218 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 24 Jul 2009 16:15:09 -0500 Subject: Setting the visiblity of the menu items based on whether DKP reports that we have the functionality. --- src/session-service.c | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/src/session-service.c b/src/session-service.c index 240f397..92e4184 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -21,6 +21,9 @@ static DBusGProxy * dkp_prop_proxy = NULL; static DBusGProxyCall * suspend_call = NULL; static DBusGProxyCall * hibernate_call = NULL; +static DbusmenuMenuitem * hibernate_mi = NULL; +static DbusmenuMenuitem * suspend_mi = NULL; + /* Let's put this machine to sleep, with some info on how it should sleep. */ static void @@ -40,6 +43,7 @@ sleep (DbusmenuMenuitem * mi, gpointer userdata) return; } +/* A response to getting the suspend property */ static void suspend_prop_cb (DBusGProxy * proxy, DBusGProxyCall * call, gpointer userdata) { @@ -55,10 +59,14 @@ suspend_prop_cb (DBusGProxy * proxy, DBusGProxyCall * call, gpointer userdata) } g_debug("Got Suspend: %s", g_value_get_boolean(&candoit) ? "true" : "false"); + if (suspend_mi != NULL) { + dbusmenu_menuitem_property_set(suspend_mi, "visible", g_value_get_boolean(&candoit) ? "true" : "false"); + } return; } +/* Response to getting the hibernate property */ static void hibernate_prop_cb (DBusGProxy * proxy, DBusGProxyCall * call, gpointer userdata) { @@ -74,6 +82,9 @@ hibernate_prop_cb (DBusGProxy * proxy, DBusGProxyCall * call, gpointer userdata) } g_debug("Got Hibernate: %s", g_value_get_boolean(&candoit) ? "true" : "false"); + if (suspend_mi != NULL) { + dbusmenu_menuitem_property_set(hibernate_mi, "visible", g_value_get_boolean(&candoit) ? "true" : "false"); + } return; } @@ -197,15 +208,17 @@ create_items (DbusmenuMenuitem * root) { dbusmenu_menuitem_child_append(root, mi); g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(show_dialog), "logout"); - mi = dbusmenu_menuitem_new(); - dbusmenu_menuitem_property_set(mi, "label", _("Suspend")); - dbusmenu_menuitem_child_append(root, mi); - g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(sleep), "Suspend"); - - mi = dbusmenu_menuitem_new(); - dbusmenu_menuitem_property_set(mi, "label", _("Hibernate")); - dbusmenu_menuitem_child_append(root, mi); - g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(sleep), "Hibernate"); + suspend_mi = dbusmenu_menuitem_new(); + dbusmenu_menuitem_property_set(suspend_mi, "visible", "false"); + dbusmenu_menuitem_property_set(suspend_mi, "label", _("Suspend")); + dbusmenu_menuitem_child_append(root, suspend_mi); + g_signal_connect(G_OBJECT(suspend_mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(sleep), "Suspend"); + + hibernate_mi = dbusmenu_menuitem_new(); + dbusmenu_menuitem_property_set(hibernate_mi, "visible", "false"); + dbusmenu_menuitem_property_set(hibernate_mi, "label", _("Hibernate")); + dbusmenu_menuitem_child_append(root, hibernate_mi); + g_signal_connect(G_OBJECT(hibernate_mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(sleep), "Hibernate"); mi = dbusmenu_menuitem_new(); dbusmenu_menuitem_property_set(mi, "label", _("Restart")); -- cgit v1.2.3 From 4f711cf53d1742f4e08058cc3ca2c02e664fc9e1 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 24 Jul 2009 16:16:14 -0500 Subject: Whitespace, who hoo, I'm earning karma for this --- src/session-service.c | 47 ++++++++++++++++++++++------------------------- 1 file changed, 22 insertions(+), 25 deletions(-) diff --git a/src/session-service.c b/src/session-service.c index 92e4184..235d0bc 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -97,36 +97,33 @@ dpk_changed_cb (DBusGProxy * proxy, gpointer user_data) /* Start Async call to see if we can hibernate */ if (suspend_call == NULL) { suspend_call = dbus_g_proxy_begin_call(dkp_prop_proxy, - "Get", - suspend_prop_cb, - NULL, - NULL, - G_TYPE_STRING, - DKP_INTERFACE, - G_TYPE_STRING, - "can-suspend", - G_TYPE_INVALID, - G_TYPE_VALUE, - G_TYPE_INVALID); - + "Get", + suspend_prop_cb, + NULL, + NULL, + G_TYPE_STRING, + DKP_INTERFACE, + G_TYPE_STRING, + "can-suspend", + G_TYPE_INVALID, + G_TYPE_VALUE, + G_TYPE_INVALID); } /* Start Async call to see if we can suspend */ if (hibernate_call == NULL) { hibernate_call = dbus_g_proxy_begin_call(dkp_prop_proxy, - "Get", - hibernate_prop_cb, - NULL, - NULL, - G_TYPE_STRING, - DKP_INTERFACE, - G_TYPE_STRING, - "can-hibernate", - G_TYPE_INVALID, - G_TYPE_VALUE, - G_TYPE_INVALID); - - + "Get", + hibernate_prop_cb, + NULL, + NULL, + G_TYPE_STRING, + DKP_INTERFACE, + G_TYPE_STRING, + "can-hibernate", + G_TYPE_INVALID, + G_TYPE_VALUE, + G_TYPE_INVALID); } return; -- cgit v1.2.3 From 091902b3d9fc772cdccc7081264799a712451beb Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 24 Jul 2009 16:19:29 -0500 Subject: Changing to the ayatana.org namespace --- src/dbus-shared-names.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/dbus-shared-names.h b/src/dbus-shared-names.h index f56e9cb..bd2f8ab 100644 --- a/src/dbus-shared-names.h +++ b/src/dbus-shared-names.h @@ -2,13 +2,13 @@ #ifndef __DBUS_SHARED_NAMES_H__ #define __DBUS_SHARED_NAMES_H__ 1 -#define INDICATOR_STATUS_DBUS_NAME "com.ubuntu.indicator.status" -#define INDICATOR_STATUS_DBUS_OBJECT "/com/ubuntu/indicator/status" +#define INDICATOR_STATUS_DBUS_NAME "org.ayatana.indicator.status" +#define INDICATOR_STATUS_DBUS_OBJECT "/org/ayatana/indicator/status" -#define INDICATOR_USERS_DBUS_NAME "com.ubuntu.indicator.users" -#define INDICATOR_USERS_DBUS_OBJECT "/com/ubuntu/indicator/users" +#define INDICATOR_USERS_DBUS_NAME "org.ayatana.indicator.users" +#define INDICATOR_USERS_DBUS_OBJECT "/org/ayatana/indicator/users" -#define INDICATOR_SESSION_DBUS_NAME "com.ubuntu.indicator.session" -#define INDICATOR_SESSION_DBUS_OBJECT "/com/ubuntu/indicator/session" +#define INDICATOR_SESSION_DBUS_NAME "org.ayatana.indicator.session" +#define INDICATOR_SESSION_DBUS_OBJECT "/org/ayatana/indicator/session" #endif /* __DBUS_SHARED_NAMES_H__ */ -- cgit v1.2.3 From efaf013ecf6c0bc65e34aaceee1792fc53c37b45 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 24 Jul 2009 16:45:20 -0500 Subject: Adding a debug message --- src/status-service.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/status-service.c b/src/status-service.c index 314929e..e02e70f 100644 --- a/src/status-service.c +++ b/src/status-service.c @@ -52,6 +52,7 @@ static void status_menu_click (DbusmenuMenuitem * mi, gpointer data) { StatusProviderStatus status = (StatusProviderStatus)GPOINTER_TO_INT(data); + g_debug("Setting status: %d", status); int i; for (i = 0; i < STATUS_PROVIDER_CNT; i++) { status_provider_set_status(status_providers[i], status); -- cgit v1.2.3 From ec801dfdbdcc03061728288388d1421aa4d3dd35 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 24 Jul 2009 16:57:58 -0500 Subject: Changing the names in the service files as well. --- data/indicator-session.service.in | 2 +- data/indicator-status.service.in | 2 +- data/indicator-users.service.in | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/data/indicator-session.service.in b/data/indicator-session.service.in index 790600a..50d8635 100644 --- a/data/indicator-session.service.in +++ b/data/indicator-session.service.in @@ -1,3 +1,3 @@ [D-BUS Service] -Name=com.ubuntu.indicator.session +Name=org.ayatana.indicator.session Exec=@libexecdir@/indicator-session-service diff --git a/data/indicator-status.service.in b/data/indicator-status.service.in index 9fe92ad..e920bf2 100644 --- a/data/indicator-status.service.in +++ b/data/indicator-status.service.in @@ -1,3 +1,3 @@ [D-BUS Service] -Name=com.ubuntu.indicator.status +Name=org.ayatana.indicator.status Exec=@libexecdir@/indicator-status-service diff --git a/data/indicator-users.service.in b/data/indicator-users.service.in index 2843743..2dc9062 100644 --- a/data/indicator-users.service.in +++ b/data/indicator-users.service.in @@ -1,3 +1,3 @@ [D-BUS Service] -Name=com.ubuntu.indicator.users +Name=org.ayatana.indicator.users Exec=@libexecdir@/indicator-users-service -- cgit v1.2.3 From a438fcc0a13631228388bacaa5c95d0005c4f84e Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Sun, 26 Jul 2009 20:53:54 -0500 Subject: Using GET_CLASS instead of CLASS. Oops --- src/status-provider.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/status-provider.c b/src/status-provider.c index cc9eb32..97f1798 100644 --- a/src/status-provider.c +++ b/src/status-provider.c @@ -59,7 +59,8 @@ status_provider_set_status (StatusProvider * sp, StatusProviderStatus status) { g_return_if_fail(IS_STATUS_PROVIDER(sp)); - StatusProviderClass * class = STATUS_PROVIDER_CLASS(sp); + StatusProviderClass * class = STATUS_PROVIDER_GET_CLASS(sp); + g_return_if_fail(class != NULL); g_return_if_fail(class->set_status != NULL); return class->set_status(sp, status); @@ -70,7 +71,7 @@ status_provider_get_status (StatusProvider * sp) { g_return_val_if_fail(IS_STATUS_PROVIDER(sp), STATUS_PROVIDER_STATUS_OFFLINE); - StatusProviderClass * class = STATUS_PROVIDER_CLASS(sp); + StatusProviderClass * class = STATUS_PROVIDER_GET_CLASS(sp); g_return_val_if_fail(class->get_status != NULL, STATUS_PROVIDER_STATUS_OFFLINE); return class->get_status(sp); -- cgit v1.2.3 From 2931dc6bf7552849a54f1c1eed83cff275ec63b2 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Sun, 26 Jul 2009 21:45:06 -0500 Subject: Debug message --- src/status-provider-pidgin.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/status-provider-pidgin.c b/src/status-provider-pidgin.c index 600ee79..ebb701b 100644 --- a/src/status-provider-pidgin.c +++ b/src/status-provider-pidgin.c @@ -124,6 +124,7 @@ status_provider_pidgin_new (void) static void set_status (StatusProvider * sp, StatusProviderStatus status) { + g_debug("\tSetting Pidgin Status: %d", status); g_return_if_fail(IS_STATUS_PROVIDER_PIDGIN(sp)); StatusProviderPidginPrivate * priv = STATUS_PROVIDER_PIDGIN_GET_PRIVATE(sp); pg_status_t pg_status = sp_to_pg_map[status]; -- cgit v1.2.3 From a2e7239aa75ffd691adc72372af67808253f5bdc Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Sun, 26 Jul 2009 21:45:37 -0500 Subject: A function to lock the saver --- src/status-service.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/status-service.c b/src/status-service.c index e02e70f..dbb597c 100644 --- a/src/status-service.c +++ b/src/status-service.c @@ -41,10 +41,30 @@ static const gchar * status_icons[STATUS_PROVIDER_STATUS_LAST] = { static DbusmenuMenuitem * root_menuitem = NULL; static GMainLoop * mainloop = NULL; +/* A fun little function to actually lock the screen. If, + that's what you want, let's do it! */ static void lock_screen (DbusmenuMenuitem * mi, gpointer data) { g_debug("Lock Screen"); + + DBusGConnection * session_bus = dbus_g_bus_get(DBUS_BUS_SESSION, NULL); + g_return_if_fail(session_bus != NULL); + + DBusGProxy * proxy = dbus_g_proxy_new_for_name_owner(session_bus, + "org.gnome.ScreenSaver", + "/", + "org.gnome.ScreenSaver", + NULL); + g_return_if_fail(proxy != NULL); + + dbus_g_proxy_call_no_reply(proxy, + "Lock", + G_TYPE_INVALID, + G_TYPE_INVALID); + + g_object_unref(proxy); + return; } -- cgit v1.2.3 From 0417e7049a32ceb45e19705992dfccef5d858893 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Sun, 26 Jul 2009 23:44:19 -0500 Subject: Setting up the Pidgin proxy --- src/status-provider-pidgin.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/status-provider-pidgin.c b/src/status-provider-pidgin.c index ebb701b..529f457 100644 --- a/src/status-provider-pidgin.c +++ b/src/status-provider-pidgin.c @@ -86,6 +86,21 @@ status_provider_pidgin_init (StatusProviderPidgin *self) priv->proxy = NULL; priv->pg_status = PG_STATUS_OFFLINE; + DBusGConnection * bus = dbus_g_bus_get(DBUS_BUS_SESSION, NULL); + g_return_if_fail(bus != NULL); /* Can't do anymore DBus stuff without this, + all non-DBus stuff should be done */ + + GError * error = NULL; + priv->proxy = dbus_g_proxy_new_for_name_owner (bus, + "im.pidgin.purple.PurpleService", + "/im/pidgin/purple/PurpleObject", + "im.pidgin.purple.PurpleInterface", + &error); + if (error != NULL) { + g_debug("Unable to get Pidgin proxy: %s", error->message); + g_error_free(error); + } + return; } -- cgit v1.2.3