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
GtkAllocation allocation;
GtkWidget *menu_bar, *menu, *item;
GdkColor background_color;
+ gint n_power_items = 0;
gtk_init (&argc, &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);