]> rtime.felk.cvut.cz Git - sojka/lightdm.git/commitdiff
Check if can do power options and implement power d-bus calls
authorunknown <robert.ancell@gmail.com>
Mon, 10 May 2010 16:00:37 +0000 (18:00 +0200)
committerunknown <robert.ancell@gmail.com>
Mon, 10 May 2010 16:00:37 +0000 (18:00 +0200)
src/greeter.c
src/greeter.h
src/ldmgreeter.c

index 9c80dada89c2efeb1ecdff889687a87f9628190f..885263aab3dfa68bc06c22a206bdc4dc1b2cac5d 100644 (file)
@@ -344,28 +344,152 @@ greeter_get_is_authenticated (Greeter *greeter)
     return greeter->priv->is_authenticated;
 }
 
+gboolean
+greeter_get_can_suspend (Greeter *greeter)
+{
+    DBusGProxy *proxy;
+    gboolean result = FALSE;
+    GError *error = NULL;
+
+    proxy = dbus_g_proxy_new_for_name (greeter->priv->bus,
+                                       "org.freedesktop.UPower",
+                                       "/org/freedesktop/UPower",
+                                       "org.freedesktop.UPower");
+    if (!dbus_g_proxy_call (proxy, "SuspendAllowed", &error, G_TYPE_INVALID, G_TYPE_BOOLEAN, &result, G_TYPE_INVALID))
+        g_warning ("Error checking for suspend authority: %s", error->message);
+    g_clear_error (&error);
+
+    g_object_unref (proxy);
+
+    return result;
+}
+
 void
 greeter_suspend (Greeter *greeter)
 {
-    // FIXME
+    DBusGProxy *proxy;
+    GError *error = NULL;
+
+    proxy = dbus_g_proxy_new_for_name (greeter->priv->bus,
+                                       "org.freedesktop.UPower",
+                                       "/org/freedesktop/UPower",
+                                       "org.freedesktop.UPower");
+    if (!dbus_g_proxy_call (proxy, "Suspend", &error, G_TYPE_INVALID, G_TYPE_INVALID))
+        g_warning ("Failed to hibernate: %s", error->message);
+    g_clear_error (&error);
+
+    g_object_unref (proxy);
+}
+
+gboolean
+greeter_get_can_hibernate (Greeter *greeter)
+{
+    DBusGProxy *proxy;
+    gboolean result = FALSE;
+    GError *error = NULL;
+
+    proxy = dbus_g_proxy_new_for_name (greeter->priv->bus,
+                                       "org.freedesktop.UPower",
+                                       "/org/freedesktop/UPower",
+                                       "org.freedesktop.UPower");
+    if (!dbus_g_proxy_call (proxy, "HibernateAllowed", &error, G_TYPE_INVALID, G_TYPE_BOOLEAN, &result, G_TYPE_INVALID))
+        g_warning ("Error checking for hibernate authority: %s", error->message);
+    g_clear_error (&error);
+
+    g_object_unref (proxy);
+
+    return result;
 }
 
 void
 greeter_hibernate (Greeter *greeter)
 {
-    // FIXME
+    DBusGProxy *proxy;
+    GError *error = NULL;
+
+    proxy = dbus_g_proxy_new_for_name (greeter->priv->bus,
+                                       "org.freedesktop.UPower",
+                                       "/org/freedesktop/UPower",
+                                       "org.freedesktop.UPower");
+    if (!dbus_g_proxy_call (proxy, "Hibernate", &error, G_TYPE_INVALID, G_TYPE_INVALID))
+        g_warning ("Failed to hibernate: %s", error->message);
+    g_clear_error (&error);
+
+    g_object_unref (proxy);
+}
+
+gboolean
+greeter_get_can_restart (Greeter *greeter)
+{
+    DBusGProxy *proxy;
+    gboolean result = FALSE;
+    GError *error = NULL;
+
+    proxy = dbus_g_proxy_new_for_name (greeter->priv->bus,
+                                       "org.freedesktop.ConsoleKit",
+                                       "/org/freedesktop/ConsoleKit/Manager",
+                                       "org.freedesktop.ConsoleKit.Manager");
+    if (!dbus_g_proxy_call (proxy, "CanRestart", &error, G_TYPE_INVALID, G_TYPE_BOOLEAN, &result, G_TYPE_INVALID))
+        g_warning ("Error checking for restart authority: %s", error->message);
+    g_clear_error (&error);
+
+    g_object_unref (proxy);
+
+    return result; 
 }
 
 void
 greeter_restart (Greeter *greeter)
 {
-    // FIXME
+    DBusGProxy *proxy;
+    GError *error = NULL;
+
+    proxy = dbus_g_proxy_new_for_name (greeter->priv->bus,
+                                       "org.freedesktop.ConsoleKit",
+                                       "/org/freedesktop/ConsoleKit/Manager",
+                                       "org.freedesktop.ConsoleKit.Manager");
+    if (!dbus_g_proxy_call (proxy, "Restart", &error, G_TYPE_INVALID, G_TYPE_INVALID))
+        g_warning ("Failed to restart: %s", error->message);
+    g_clear_error (&error);
+
+    g_object_unref (proxy);
+}
+
+gboolean
+greeter_get_can_shutdown (Greeter *greeter)
+{
+    DBusGProxy *proxy;
+    gboolean result = FALSE;
+    GError *error = NULL;
+
+    proxy = dbus_g_proxy_new_for_name (greeter->priv->bus,
+                                       "org.freedesktop.ConsoleKit",
+                                       "/org/freedesktop/ConsoleKit/Manager",
+                                       "org.freedesktop.ConsoleKit.Manager");
+    if (!dbus_g_proxy_call (proxy, "CanStop", &error, G_TYPE_INVALID, G_TYPE_BOOLEAN, &result, G_TYPE_INVALID))
+        g_warning ("Error checking for shutdown authority: %s", error->message);
+    g_clear_error (&error);
+
+    g_object_unref (proxy);
+
+    return result; 
 }
 
 void
 greeter_shutdown (Greeter *greeter)
 {
-    // FIXME
+    DBusGProxy *proxy;
+    GError *error = NULL;
+
+    proxy = dbus_g_proxy_new_for_name (greeter->priv->bus,
+                                       "org.freedesktop.ConsoleKit",
+                                       "/org/freedesktop/ConsoleKit/Manager",
+                                       "org.freedesktop.ConsoleKit.Manager");
+    if (!dbus_g_proxy_call (proxy, "Stop", &error, G_TYPE_INVALID, G_TYPE_INVALID))
+        g_warning ("Failed to shutdown: %s", error->message);
+    g_clear_error (&error);
+
+    g_object_unref (proxy);
 }
 
 static void
index 21620dbdf658d415828e3f60f7ad7b1a1a9bd6a8..078c1294d6da084cfbfea30b5aff9bb4e2d2de36 100644 (file)
@@ -83,12 +83,20 @@ void greeter_cancel_authentication (Greeter *greeter);
 
 gboolean greeter_get_is_authenticated (Greeter *greeter);
 
+gboolean greeter_get_can_suspend (Greeter *greeter);
+
 void greeter_suspend (Greeter *greeter);
 
+gboolean greeter_get_can_hibernate (Greeter *greeter);
+
 void greeter_hibernate (Greeter *greeter);
 
+gboolean greeter_get_can_restart (Greeter *greeter);
+
 void greeter_restart (Greeter *greeter);
 
+gboolean greeter_get_can_shutdown (Greeter *greeter);
+
 void greeter_shutdown (Greeter *greeter);
 
 G_END_DECLS
index fcff7f6d25824ab3896aad6f1fb76b53dca28353..81954d4340a15ef33f68cf0eb0854963cb4ccc63 100644 (file)
@@ -101,6 +101,7 @@ main(int argc, char **argv)
     GtkAllocation allocation;
     GtkWidget *menu_bar, *menu, *item;
     GdkColor background_color;
+    gint n_power_items = 0;
 
     gtk_init (&argc, &argv);
   
@@ -248,20 +249,38 @@ main(int argc, char **argv)
         g_object_set_data (G_OBJECT (item), "key", g_strdup (session->key));
         g_signal_connect (item, "toggled", G_CALLBACK (session_changed_cb), NULL);
     }
-
-    item = gtk_image_menu_item_new ();
-    gtk_image_menu_item_set_always_show_image (GTK_IMAGE_MENU_ITEM (item), TRUE);
-    gtk_menu_item_set_right_justified (GTK_MENU_ITEM (item), TRUE);
-    gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), gtk_image_new_from_icon_name ("system-shutdown", GTK_ICON_SIZE_LARGE_TOOLBAR));
-    gtk_menu_item_set_label (GTK_MENU_ITEM (item), ""); // NOTE: Needed to make the icon show as selected
-    gtk_menu_shell_append (GTK_MENU_SHELL (menu_bar), item);
-  
     menu = gtk_menu_new ();
-    gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), menu);
-    gtk_menu_shell_append (GTK_MENU_SHELL (menu), gtk_menu_item_new_with_label ("Suspend"));
-    gtk_menu_shell_append (GTK_MENU_SHELL (menu), gtk_menu_item_new_with_label ("Hibernate"));
-    gtk_menu_shell_append (GTK_MENU_SHELL (menu), gtk_menu_item_new_with_label ("Restart..."));
-    gtk_menu_shell_append (GTK_MENU_SHELL (menu), gtk_menu_item_new_with_label ("Shutdown..."));
+    if (greeter_get_can_suspend (greeter))
+    {
+        gtk_menu_shell_append (GTK_MENU_SHELL (menu), gtk_menu_item_new_with_label ("Suspend"));
+        n_power_items++;
+    }
+    if (greeter_get_can_hibernate (greeter))
+    {
+        gtk_menu_shell_append (GTK_MENU_SHELL (menu), gtk_menu_item_new_with_label ("Hibernate"));
+        n_power_items++;
+    }
+    if (greeter_get_can_restart (greeter))
+    {
+        gtk_menu_shell_append (GTK_MENU_SHELL (menu), gtk_menu_item_new_with_label ("Restart..."));
+        n_power_items++;
+    }
+    if (greeter_get_can_shutdown (greeter))
+    {
+        gtk_menu_shell_append (GTK_MENU_SHELL (menu), gtk_menu_item_new_with_label ("Shutdown..."));
+        n_power_items++;
+    }
+    if (n_power_items > 0)
+    {
+        item = gtk_image_menu_item_new ();
+        gtk_image_menu_item_set_always_show_image (GTK_IMAGE_MENU_ITEM (item), TRUE);
+        gtk_menu_item_set_right_justified (GTK_MENU_ITEM (item), TRUE);
+        gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), gtk_image_new_from_icon_name ("system-shutdown", GTK_ICON_SIZE_LARGE_TOOLBAR));
+        gtk_menu_item_set_label (GTK_MENU_ITEM (item), ""); // NOTE: Needed to make the icon show as selected
+        gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), menu);
+        gtk_menu_shell_append (GTK_MENU_SHELL (menu_bar), item);
+    }
 
     gtk_widget_show_all (panel_window);