[gnome-session] gsm: Add a UI to the fail whale for enabling and disabling Shell Extensions
- From: Jasper St. Pierre <jstpierre src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-session] gsm: Add a UI to the fail whale for enabling and disabling Shell Extensions
- Date: Fri, 26 Aug 2011 23:01:28 +0000 (UTC)
commit 0b80e1ac1f2d2cc6be09390d344676d7610e432d
Author: Jasper St. Pierre <jstpierre mecheye net>
Date: Wed Aug 17 02:23:22 2011 -0400
gsm: Add a UI to the fail whale for enabling and disabling Shell Extensions
When the session puts up the fail whale after a failed restart, the user now
has the opportunity to disable/enable extensions.
https://bugzilla.gnome.org/show_bug.cgi?id=656747
gnome-session/gsm-fail-whale-dialog.c | 102 ++++++++++++++++++++++++++++++++-
1 files changed, 100 insertions(+), 2 deletions(-)
---
diff --git a/gnome-session/gsm-fail-whale-dialog.c b/gnome-session/gsm-fail-whale-dialog.c
index a4b3e61..270a925 100644
--- a/gnome-session/gsm-fail-whale-dialog.c
+++ b/gnome-session/gsm-fail-whale-dialog.c
@@ -32,6 +32,7 @@
#include "gsm-icon-names.h"
#include "gsm-manager.h"
#include "gsm-util.h"
+#include "gsm-shell-extensions.h"
#define GSM_FAIL_WHALE_DIALOG_GET_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE ((o), GSM_TYPE_FAIL_WHALE_DIALOG, GsmFailWhaleDialogPrivate))
@@ -40,6 +41,8 @@ struct _GsmFailWhaleDialogPrivate
{
gboolean debug_mode;
GdkRectangle geometry;
+ GsmShellExtensions *extensions;
+ GtkWidget *extensions_box;
};
G_DEFINE_TYPE (GsmFailWhaleDialog, gsm_fail_whale_dialog, GTK_TYPE_WINDOW);
@@ -127,6 +130,18 @@ on_screen_size_changed (GdkScreen *screen,
}
static void
+gsm_fail_whale_dialog_finalize (GObject *object)
+{
+ GsmFailWhaleDialog *fail_dialog = GSM_FAIL_WHALE_DIALOG (object);
+ GsmFailWhaleDialogPrivate *priv = fail_dialog->priv;
+
+ if (priv->extensions != NULL) {
+ g_object_unref (priv->extensions);
+ priv->extensions = NULL;
+ }
+}
+
+static void
gsm_fail_whale_dialog_realize (GtkWidget *widget)
{
if (GTK_WIDGET_CLASS (gsm_fail_whale_dialog_parent_class)->realize) {
@@ -229,6 +244,8 @@ gsm_fail_whale_dialog_class_init (GsmFailWhaleDialogClass *klass)
GtkWidgetClass *widget_class;
object_class = G_OBJECT_CLASS (klass);
+ object_class->finalize = gsm_fail_whale_dialog_finalize;
+
widget_class = GTK_WIDGET_CLASS (klass);
widget_class->realize = gsm_fail_whale_dialog_realize;
@@ -255,6 +272,61 @@ on_logout_clicked (GtkWidget *button,
}
static void
+on_extension_switched (GObject *object,
+ GParamSpec *spec,
+ GsmFailWhaleDialog *fail_dialog)
+{
+ gchar *uuid;
+ gboolean enabled;
+
+ uuid = g_object_get_data (object, "uuid");
+ g_object_get (object, "active", &enabled, NULL);
+
+ gsm_shell_extensions_set_enabled (fail_dialog->priv->extensions,
+ uuid,
+ enabled);
+}
+
+static void
+build_extension_toggle (GsmShellExtensions *extensions,
+ GsmShellExtension *extension,
+ gpointer data)
+{
+ GsmFailWhaleDialog *fail_dialog = GSM_FAIL_WHALE_DIALOG (data);
+ GtkWidget *hbox;
+ GtkWidget *label;
+ GtkWidget *sw;
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_widget_set_size_request (hbox, 600, -1);
+ gtk_widget_set_halign (hbox, GTK_ALIGN_CENTER);
+ gtk_widget_show (hbox);
+ gtk_box_pack_start (GTK_BOX (fail_dialog->priv->extensions_box),
+ hbox, FALSE, FALSE, 0);
+
+ label = gtk_label_new (gsm_shell_extension_get_name (extension));
+
+ gtk_widget_show (label);
+ gtk_widget_set_halign (label, GTK_ALIGN_START);
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+
+ sw = gtk_switch_new ();
+ gtk_switch_set_active (GTK_SWITCH (sw),
+ gsm_shell_extension_get_is_enabled (extension));
+
+ g_object_set_data (G_OBJECT (sw),
+ "uuid",
+ gsm_shell_extension_get_uuid (extension));
+ g_signal_connect (G_OBJECT (sw),
+ "notify::active",
+ G_CALLBACK (on_extension_switched),
+ fail_dialog);
+ gtk_widget_set_halign (label, GTK_ALIGN_END);
+ gtk_widget_show (sw);
+ gtk_box_pack_end (GTK_BOX (hbox), sw, FALSE, FALSE, 0);
+}
+
+static void
setup_window (GsmFailWhaleDialog *fail_dialog)
{
GtkWidget *alignment;
@@ -264,7 +336,12 @@ setup_window (GsmFailWhaleDialog *fail_dialog)
GtkWidget *message_label;
GtkWidget *button_box;
GtkWidget *button;
+ GtkWidget *extensions_scroll;
+ GtkWidget *extensions_vbox;
char *markup;
+ GsmShellExtensions *extensions;
+
+ extensions = fail_dialog->priv->extensions;
gtk_window_set_title (GTK_WINDOW (fail_dialog), "");
gtk_window_set_icon_name (GTK_WINDOW (fail_dialog), GSM_ICON_COMPUTER_FAIL);
@@ -299,14 +376,34 @@ setup_window (GsmFailWhaleDialog *fail_dialog)
gtk_widget_show (label);
gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0);
- /* make this changable at some point */
- message_label = gtk_label_new (_("A problem has occurred and the system can't recover.\nPlease log out and try again."));
+ if (priv->show_extensions && gsm_shell_extensions_n_extensions (priv->extensions) > 0)
+ message_label = gtk_label_new (_("A problem has occurred and the system can't recover. Some of the extensions below may have caused this.\nPlease try disabling some of these, and then log out and try again."));
+ else
+ message_label = gtk_label_new (_("A problem has occurred and the system can't recover.\nPlease log out and try again."));
+
gtk_label_set_justify (GTK_LABEL (message_label), GTK_JUSTIFY_CENTER);
gtk_label_set_line_wrap (GTK_LABEL (message_label), TRUE);
gtk_widget_show (message_label);
gtk_box_pack_start (GTK_BOX (box),
message_label, FALSE, FALSE, 0);
+ extensions_vbox = gtk_vbox_new (TRUE, 6);
+ gtk_widget_show (extensions_vbox);
+ fail_dialog->priv->extensions_box = extensions_vbox;
+
+ extensions_scroll = gtk_scrolled_window_new (NULL, NULL);
+ gtk_widget_show (extensions_scroll);
+
+ gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (extensions_scroll),
+ extensions_vbox);
+
+ gtk_box_pack_start (GTK_BOX (box),
+ extensions_scroll, FALSE, FALSE, 0);
+
+ gsm_shell_extensions_foreach (extensions,
+ build_extension_toggle,
+ (gpointer) fail_dialog);
+
button_box = gtk_hbutton_box_new ();
gtk_container_set_border_width (GTK_CONTAINER (button_box), 20);
gtk_widget_show (button_box);
@@ -325,6 +422,7 @@ static void
gsm_fail_whale_dialog_init (GsmFailWhaleDialog *fail_dialog)
{
fail_dialog->priv = GSM_FAIL_WHALE_DIALOG_GET_PRIVATE (fail_dialog);
+ fail_dialog->priv->extensions = g_object_new (GSM_TYPE_SHELL_EXTENSIONS, NULL);
}
void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]