[Xfce4-commits] <xfce4-settings:nick/settings-manager> Readd support for pluggable dialogs.

Nick Schermer noreply at xfce.org
Tue Jan 24 22:20:01 CET 2012


Updating branch refs/heads/nick/settings-manager
         to 9e12688aab7b649a9baa6c52b40037796d30a5d5 (commit)
       from 14f91ef07f34cd99e077ff049dc6fda261fadf9b (commit)

commit 9e12688aab7b649a9baa6c52b40037796d30a5d5
Author: Nick Schermer <nick at xfce.org>
Date:   Tue Jan 24 22:18:07 2012 +0100

    Readd support for pluggable dialogs.

 .../xfce-settings-manager-dialog.c                 |  245 +++++++++++++++++---
 1 files changed, 213 insertions(+), 32 deletions(-)

diff --git a/xfce4-settings-manager/xfce-settings-manager-dialog.c b/xfce4-settings-manager/xfce-settings-manager-dialog.c
index e668e7b..e5bcd7a 100644
--- a/xfce4-settings-manager/xfce-settings-manager-dialog.c
+++ b/xfce4-settings-manager/xfce-settings-manager-dialog.c
@@ -3,6 +3,7 @@
  *
  *  Copyright (c) 2008 Brian Tarricone <bjt23 at cornell.edu>
  *                     Jannis Pohlmann <jannis at xfce.org>
+ *  Copyright (c) 2012 Nick Schermer <nick at xfce.org>
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -40,7 +41,8 @@
 #include "xfce-settings-manager-dialog.h"
 #include "xfce-text-renderer.h"
 
-#define ITEM_WIDTH (128)
+#define TEXT_WIDTH (128)
+#define ICON_WIDTH (48)
 
 
 
@@ -48,14 +50,23 @@ struct _XfceSettingsManagerDialog
 {
     XfceTitledDialog __parent__;
 
-    GarconMenu   *menu;
+    GarconMenu     *menu;
 
-    GtkListStore *store;
+    GtkListStore   *store;
 
-    GtkWidget    *category_box;
-    GList        *category_iconviews;
+    GtkWidget      *category_scroll;
+    GtkWidget      *category_box;
+    GList          *category_iconviews;
 
-    GtkWidget    *button_previous;
+    GtkWidget      *socket_scroll;
+    GtkWidget      *socket_viewport;
+    GarconMenuItem *socket_item;
+
+    GtkWidget      *button_back;
+    GtkWidget      *button_help;
+
+    gchar          *help_page;
+    gchar          *help_component;
 };
 
 struct _XfceSettingsManagerDialogClass
@@ -82,6 +93,7 @@ static void xfce_settings_manager_dialog_set_title   (XfceSettingsManagerDialog
                                                       const gchar               *title,
                                                       const gchar               *icon_name,
                                                       const gchar               *subtitle);
+static void xfce_settings_manager_dialog_go_back     (XfceSettingsManagerDialog *dialog);
 static void xfce_settings_manager_dialog_menu_reload (XfceSettingsManagerDialog *dialog);
 
 
@@ -109,7 +121,8 @@ static void
 xfce_settings_manager_dialog_init (XfceSettingsManagerDialog *dialog)
 {
     GtkWidget *scroll;
-    GtkWidget *area;
+    GtkWidget *dialog_vbox;
+    GtkWidget *bbox;
     GtkWidget *viewport;
     GtkWidget *vbox;
     gchar     *path;
@@ -127,23 +140,25 @@ xfce_settings_manager_dialog_init (XfceSettingsManagerDialog *dialog)
 
     gtk_window_set_default_size (GTK_WINDOW (dialog), 640, 500);
     xfce_settings_manager_dialog_set_title (dialog, NULL, NULL, NULL);
-
-    dialog->button_previous = xfce_gtk_button_new_mixed (GTK_STOCK_GO_BACK, _("_All Settings"));
-    area = gtk_dialog_get_action_area (GTK_DIALOG (dialog));
-    gtk_container_add (GTK_CONTAINER (area), dialog->button_previous);
-    gtk_button_box_set_child_secondary (GTK_BUTTON_BOX (area), dialog->button_previous, TRUE);
-    gtk_widget_set_sensitive (dialog->button_previous, FALSE);
-    gtk_widget_show (dialog->button_previous);
-
-    gtk_dialog_add_buttons (GTK_DIALOG (dialog),
-                            GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
-                            GTK_STOCK_HELP, GTK_RESPONSE_HELP, NULL);
-
-    scroll = gtk_scrolled_window_new (NULL, NULL);
+    dialog_vbox = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
+
+    dialog->button_back = xfce_gtk_button_new_mixed (GTK_STOCK_GO_BACK, _("_All Settings"));
+    bbox = gtk_dialog_get_action_area (GTK_DIALOG (dialog));
+    gtk_container_add (GTK_CONTAINER (bbox), dialog->button_back);
+    gtk_button_box_set_child_secondary (GTK_BUTTON_BOX (bbox), dialog->button_back, TRUE);
+    gtk_widget_set_sensitive (dialog->button_back, FALSE);
+    gtk_widget_show (dialog->button_back);
+    g_signal_connect_swapped (G_OBJECT (dialog->button_back), "clicked",
+        G_CALLBACK (xfce_settings_manager_dialog_go_back), dialog);
+
+    dialog->button_help = gtk_dialog_add_button (GTK_DIALOG (dialog),
+                                                 GTK_STOCK_HELP, GTK_RESPONSE_HELP);
+    gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE);
+
+    dialog->category_scroll = scroll = gtk_scrolled_window_new (NULL, NULL);
     gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scroll), GTK_SHADOW_ETCHED_IN);
     gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
-    area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
-    gtk_container_add (GTK_CONTAINER (area), scroll);
+    gtk_container_add (GTK_CONTAINER (dialog_vbox), scroll);
     gtk_container_set_border_width (GTK_CONTAINER (scroll), 6);
     gtk_widget_show (scroll);
 
@@ -156,11 +171,24 @@ xfce_settings_manager_dialog_init (XfceSettingsManagerDialog *dialog)
     dialog->category_box = vbox = gtk_vbox_new (FALSE, 6);
     gtk_container_add (GTK_CONTAINER (viewport), vbox);
     gtk_container_set_border_width (GTK_CONTAINER (vbox), 6);
-    gtk_widget_set_size_request (vbox,
-                                 ITEM_WIDTH /* text */
-                                 + 48       /* icon */
-                                 + (5 * 6)  /* borders */, -1);
     gtk_widget_show (vbox);
+    gtk_widget_set_size_request (vbox,
+                                 TEXT_WIDTH   /* text */
+                                 + ICON_WIDTH /* icon */
+                                 + (5 * 6)    /* borders */, -1);
+
+    /* pluggable dialog scrolled window and viewport */
+    dialog->socket_scroll = scroll = gtk_scrolled_window_new (NULL, NULL);
+    gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scroll), GTK_SHADOW_NONE);
+    gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+    gtk_container_add (GTK_CONTAINER (dialog_vbox), scroll);
+    gtk_container_set_border_width (GTK_CONTAINER (scroll), 0);
+
+    dialog->socket_viewport = viewport = gtk_viewport_new (NULL, NULL);
+    gtk_container_add (GTK_CONTAINER (scroll), viewport);
+    gtk_viewport_set_shadow_type (GTK_VIEWPORT (viewport), GTK_SHADOW_NONE);
+    gtk_widget_modify_bg (viewport, GTK_STATE_NORMAL, &viewport->style->white);
+    gtk_widget_show (viewport);
 
     xfce_settings_manager_dialog_menu_reload (dialog);
 
@@ -175,6 +203,12 @@ xfce_settings_manager_dialog_finalize (GObject *object)
 {
     XfceSettingsManagerDialog *dialog = XFCE_SETTINGS_MANAGER_DIALOG (object);
 
+    g_free (dialog->help_page);
+    g_free (dialog->help_component);
+
+    if (dialog->socket_item != NULL)
+        g_object_unref (G_OBJECT (dialog->socket_item));
+
     g_object_unref (G_OBJECT (dialog->menu));
     g_object_unref (G_OBJECT (dialog->store));
 
@@ -187,9 +221,19 @@ static void
 xfce_settings_manager_dialog_response (GtkDialog *widget,
                                        gint       response_id)
 {
+    XfceSettingsManagerDialog *dialog = XFCE_SETTINGS_MANAGER_DIALOG (widget);
+    const gchar               *help_component;
+
     if (response_id == GTK_RESPONSE_HELP)
     {
+        if (dialog->help_component != NULL)
+            help_component = dialog->help_component;
+        else
+            help_component = "xfce4-settings";
 
+        xfce_dialog_show_help (GTK_WINDOW (widget),
+                               help_component,
+                               dialog->help_page, NULL);
     }
     else
     {
@@ -380,6 +424,79 @@ xfce_settings_manager_dialog_iconview_focus (GtkWidget                 *iconview
 
 
 static void
+xfce_settings_manager_dialog_go_back (XfceSettingsManagerDialog *dialog)
+{
+    GtkWidget *socket;
+
+    /* make sure no cursor is shown */
+    gdk_window_set_cursor (GTK_WIDGET (dialog)->window, NULL);
+
+    /* reset dialog info */
+    xfce_settings_manager_dialog_set_title (dialog, NULL, NULL, NULL);
+
+    gtk_widget_show (dialog->category_scroll);
+    gtk_widget_hide (dialog->socket_scroll);
+
+    g_free (dialog->help_page);
+    dialog->help_page = NULL;
+    g_free (dialog->help_component);
+    dialog->help_component = NULL;
+
+    gtk_widget_set_sensitive (dialog->button_back, FALSE);
+    gtk_widget_set_sensitive (dialog->button_help, TRUE);
+
+    socket = gtk_bin_get_child (GTK_BIN (dialog->socket_viewport));
+    if (G_LIKELY (socket != NULL))
+        gtk_widget_destroy (socket);
+
+    if (dialog->socket_item != NULL)
+    {
+        g_object_unref (G_OBJECT (dialog->socket_item));
+        dialog->socket_item = NULL;
+    }
+}
+
+
+
+static void
+xfce_settings_manager_dialog_plug_added (GtkWidget                 *socket,
+                                         XfceSettingsManagerDialog *dialog)
+{
+    /* set dialog information from desktop file */
+    xfce_settings_manager_dialog_set_title (dialog,
+        garcon_menu_item_get_name (dialog->socket_item),
+        garcon_menu_item_get_icon_name (dialog->socket_item),
+        garcon_menu_item_get_comment (dialog->socket_item));
+
+    /* show socket and hide the categories view */
+    gtk_widget_show (dialog->socket_scroll);
+    gtk_widget_hide (dialog->category_scroll);
+
+    /* button sensitivity */
+    gtk_widget_set_sensitive (dialog->button_back, TRUE);
+    gtk_widget_set_sensitive (dialog->button_help, dialog->help_page != NULL);
+
+    /* plug startup complete */
+    gdk_window_set_cursor (GTK_WIDGET (dialog)->window, NULL);
+}
+
+
+
+static void
+xfce_settings_manager_dialog_plug_removed (GtkWidget                 *socket,
+                                           XfceSettingsManagerDialog *dialog)
+{
+    /* this shouldn't happen */
+    g_critical ("pluggable dialog \"%s\" crashed",
+                garcon_menu_item_get_command (dialog->socket_item));
+
+    /* restore dialog */
+    xfce_settings_manager_dialog_go_back (dialog);
+}
+
+
+
+static void
 xfce_settings_manager_dialog_item_activated (ExoIconView               *iconview,
                                              GtkTreePath               *path,
                                              XfceSettingsManagerDialog *dialog)
@@ -391,6 +508,13 @@ xfce_settings_manager_dialog_item_activated (ExoIconView               *iconview
     gboolean        snotify;
     GdkScreen      *screen;
     GError         *error = NULL;
+    GFile          *desktop_file;
+    gchar          *filename;
+    XfceRc         *rc;
+    gboolean        pluggable = FALSE;
+    gchar          *cmd;
+    GtkWidget      *socket;
+    GdkCursor      *cursor;
 
     model = exo_icon_view_get_model (iconview);
     if (gtk_tree_model_get_iter (model, &iter, path))
@@ -400,14 +524,71 @@ xfce_settings_manager_dialog_item_activated (ExoIconView               *iconview
 
         screen = gtk_window_get_screen (GTK_WINDOW (dialog));
         command = garcon_menu_item_get_command (item);
-        snotify = garcon_menu_item_supports_startup_notification (item);
 
-        if (!xfce_spawn_command_line_on_screen (screen, command, FALSE, snotify, &error))
+        /* we need to read some more info from the desktop
+         *  file that is not supported by garcon */
+        desktop_file = garcon_menu_item_get_file (item);
+        filename = g_file_get_path (desktop_file);
+        g_object_unref (desktop_file);
+
+        rc = xfce_rc_simple_open (filename, TRUE);
+        g_free (filename);
+        if (G_LIKELY (rc != NULL))
         {
-            g_error_free (error);
+            pluggable = xfce_rc_read_bool_entry (rc, "X-XfcePluggable", FALSE);
+            if (pluggable)
+            {
+                dialog->help_page = g_strdup (xfce_rc_read_entry (rc, "X-XfceHelpPage", NULL));
+                dialog->help_component = g_strdup (xfce_rc_read_entry (rc, "X-XfceHelpComponent", NULL));
+            }
+
+            xfce_rc_close (rc);
         }
 
-        g_object_unref (G_OBJECT (item));
+        if (pluggable)
+        {
+            /* create fresh socket */
+            socket = gtk_socket_new ();
+            gtk_container_add (GTK_CONTAINER (dialog->socket_viewport), socket);
+            g_signal_connect (G_OBJECT (socket), "plug-added",
+                G_CALLBACK (xfce_settings_manager_dialog_plug_added), dialog);
+            g_signal_connect (G_OBJECT (socket), "plug-removed",
+                G_CALLBACK (xfce_settings_manager_dialog_plug_removed), dialog);
+            gtk_widget_show (socket);
+
+            /* for info when the plug is attached */
+            dialog->socket_item = g_object_ref (item);
+
+            /* spawn dialog with socket argument */
+            cmd = g_strdup_printf ("%s --socket-id=%d", command, gtk_socket_get_id (GTK_SOCKET (socket)));
+            if (xfce_spawn_command_line_on_screen (screen, cmd, FALSE, FALSE, &error))
+            {
+                /* fake startup notification */
+                cursor = gdk_cursor_new (GDK_WATCH);
+                gdk_window_set_cursor (GTK_WIDGET (dialog)->window, cursor);
+                gdk_cursor_unref (cursor);
+            }
+            else
+            {
+                /* meh... */
+                xfce_dialog_show_error (GTK_WINDOW (dialog), error,
+                                        _("Unable to start \"%s\""), command);
+                g_error_free (error);
+            }
+            g_free (cmd);
+        }
+        else
+        {
+            snotify = garcon_menu_item_supports_startup_notification (item);
+            if (!xfce_spawn_command_line_on_screen (screen, command, FALSE, snotify, &error))
+            {
+                xfce_dialog_show_error (GTK_WINDOW (dialog), error,
+                                        _("Unable to start \"%s\""), command);
+                g_error_free (error);
+            }
+
+            g_object_unref (G_OBJECT (item));
+        }
     }
 }
 
@@ -467,7 +648,7 @@ xfce_settings_manager_dialog_add_category (XfceSettingsManagerDialog *dialog,
     exo_icon_view_set_margin (EXO_ICON_VIEW (iconview), 0);
     exo_icon_view_set_single_click (EXO_ICON_VIEW (iconview), TRUE);
     exo_icon_view_set_enable_search (EXO_ICON_VIEW (iconview), FALSE);
-    exo_icon_view_set_item_width (EXO_ICON_VIEW (iconview), ITEM_WIDTH + 48);
+    exo_icon_view_set_item_width (EXO_ICON_VIEW (iconview), TEXT_WIDTH + ICON_WIDTH);
     gtk_widget_show (iconview);
 
     /* list used for unselecting */
@@ -498,7 +679,7 @@ xfce_settings_manager_dialog_add_category (XfceSettingsManagerDialog *dialog,
     gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (iconview), render, "text", COLUMN_NAME);
     g_object_set (G_OBJECT (render),
                   "wrap-mode", PANGO_WRAP_WORD,
-                  "wrap-width", ITEM_WIDTH,
+                  "wrap-width", TEXT_WIDTH,
                   "follow-prelit", TRUE,
                   "follow-state", TRUE,
                   NULL);


More information about the Xfce4-commits mailing list