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. --- src/session-service.c | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/session-service.c (limited to 'src/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; +} -- 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(-) (limited to 'src/session-service.c') 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 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(+) (limited to 'src/session-service.c') 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 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(-) (limited to 'src/session-service.c') 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 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(-) (limited to 'src/session-service.c') 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(-) (limited to 'src/session-service.c') 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 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(+) (limited to 'src/session-service.c') 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(+) (limited to 'src/session-service.c') 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(+) (limited to 'src/session-service.c') 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(-) (limited to 'src/session-service.c') 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(-) (limited to 'src/session-service.c') 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(+) (limited to 'src/session-service.c') 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(-) (limited to 'src/session-service.c') 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(-) (limited to 'src/session-service.c') 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(-) (limited to 'src/session-service.c') 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(-) (limited to 'src/session-service.c') 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