[epiphany] EphyEncodingDialog: Inherit from GtkDialog, not from EphyEmbedDialog.



commit 67747b961cbc1cadb028c4f5189a64a74f9e9f42
Author: Arnaud Bonatti <arnaud bonatti gmail com>
Date:   Sun Nov 8 03:58:36 2015 +0100

    EphyEncodingDialog: Inherit from GtkDialog, not from EphyEmbedDialog.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=757487

 src/ephy-encoding-dialog.c       |  250 +++++++++++++++++++++-----------------
 src/ephy-encoding-dialog.h       |    8 +-
 src/ephy-encoding-menu.c         |    4 +-
 src/resources/encoding-dialog.ui |    6 +-
 4 files changed, 149 insertions(+), 119 deletions(-)
---
diff --git a/src/ephy-encoding-dialog.c b/src/ephy-encoding-dialog.c
index 27a52ec..810d10d 100644
--- a/src/ephy-encoding-dialog.c
+++ b/src/ephy-encoding-dialog.c
@@ -37,8 +37,6 @@
 #include <gtk/gtk.h>
 #include <webkit2/webkit2.h>
 
-#define EPHY_ENCODING_DIALOG_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), 
EPHY_TYPE_ENCODING_DIALOG, EphyEncodingDialogPrivate))
-
 struct _EphyEncodingDialogPrivate
 {
        EphyEncodings *encodings;
@@ -47,6 +45,11 @@ struct _EphyEncodingDialogPrivate
        GtkWidget *enc_view;
        gboolean update_tag;
        char *selected_encoding;
+
+       /* from the UI file */
+       GtkRadioButton    *automatic_button;
+       GtkRadioButton    *manual_button;
+       GtkScrolledWindow *scrolled_window;
 };
 
 enum {
@@ -54,8 +57,14 @@ enum {
        COL_ENCODING,
        NUM_COLS
 };
-       
-G_DEFINE_TYPE (EphyEncodingDialog, ephy_encoding_dialog, EPHY_TYPE_EMBED_DIALOG)
+
+enum
+{
+       PROP_0,
+       PROP_PARENT_WINDOW
+};
+
+G_DEFINE_TYPE_WITH_PRIVATE (EphyEncodingDialog, ephy_encoding_dialog, GTK_TYPE_DIALOG)
 
 static void
 select_encoding_row (GtkTreeView *view, EphyEncoding *encoding)
@@ -97,11 +106,9 @@ select_encoding_row (GtkTreeView *view, EphyEncoding *encoding)
 static void
 sync_encoding_against_embed (EphyEncodingDialog *dialog)
 {
-       EphyEmbed *embed;
-        GtkTreeSelection *selection;
-        GtkTreeModel *model;
-        GList *rows;
-       GtkWidget *button;
+       GtkTreeSelection *selection;
+       GtkTreeModel *model;
+       GList *rows;
        const char *encoding;
        gboolean is_automatic = FALSE;
        WebKitWebView *view;
@@ -109,10 +116,8 @@ sync_encoding_against_embed (EphyEncodingDialog *dialog)
 
        dialog->priv->update_tag = TRUE;
 
-       embed = ephy_embed_dialog_get_embed (EPHY_EMBED_DIALOG (dialog));
-       g_return_if_fail (EPHY_IS_EMBED (embed));
-
-       view = EPHY_GET_WEBKIT_WEB_VIEW_FROM_EMBED (embed);
+       g_return_if_fail (EPHY_IS_EMBED (dialog->priv->embed));
+       view = EPHY_GET_WEBKIT_WEB_VIEW_FROM_EMBED (dialog->priv->embed);
 
        encoding = webkit_web_view_get_custom_charset (view);
        if (encoding == NULL) goto out;
@@ -140,14 +145,11 @@ sync_encoding_against_embed (EphyEncodingDialog *dialog)
                g_list_free (rows);
        }
 
-       button = ephy_dialog_get_control (EPHY_DIALOG (dialog),
-                                         "automatic_button");
-       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), is_automatic);
+       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->automatic_button), is_automatic);
 out:
        dialog->priv->update_tag = FALSE;
 }
 
-
 static void
 embed_net_stop_cb (EphyWebView *view,
                   WebKitLoadEvent load_event,
@@ -158,74 +160,59 @@ embed_net_stop_cb (EphyWebView *view,
 }
 
 static void
-sync_embed_cb (EphyEncodingDialog *dialog, GParamSpec *pspec, gpointer dummy)
+ephy_encoding_dialog_detach_embed (EphyEncodingDialog *dialog)
 {
-       EphyEmbed *embed;
-       embed = ephy_embed_dialog_get_embed (EPHY_EMBED_DIALOG (dialog));
-
-       if (dialog->priv->embed != NULL)
-       {
-               g_signal_handlers_disconnect_by_func (dialog->priv->embed,
-                                                     G_CALLBACK (embed_net_stop_cb),
-                                                     dialog);
-       }
+       EphyEmbed **embedptr;
 
-       g_signal_connect (G_OBJECT (ephy_embed_get_web_view (embed)), "load-changed",
-                         G_CALLBACK (embed_net_stop_cb), dialog);
+       g_signal_handlers_disconnect_by_func (ephy_embed_get_web_view (dialog->priv->embed),
+                                             G_CALLBACK (embed_net_stop_cb),
+                                             dialog);
 
-       dialog->priv->embed = embed;
-
-       sync_encoding_against_embed (dialog);
+       embedptr = &dialog->priv->embed;
+       g_object_remove_weak_pointer (G_OBJECT (dialog->priv->embed),
+                                     (gpointer *) embedptr);
+       dialog->priv->embed = NULL;
 }
 
 static void
-sync_active_tab (EphyWindow *window, GParamSpec *pspec, EphyEncodingDialog *dialog)
+ephy_encoding_dialog_attach_embed (EphyEncodingDialog *dialog)
 {
        EphyEmbed *embed;
+       EphyEmbed **embedptr;
 
        embed = ephy_embed_container_get_active_child (EPHY_EMBED_CONTAINER (dialog->priv->window));
+       g_return_if_fail (EPHY_IS_EMBED (embed));
 
-       g_object_set (G_OBJECT (dialog), "embed", embed, NULL);
-}
-
-static void
-sync_parent_window_cb (EphyEncodingDialog *dialog, GParamSpec *pspec, gpointer dummy)
-{
-       EphyWindow *window;
-       GValue value = { 0, };
-
-       g_return_if_fail (dialog->priv->window == NULL);
+       g_signal_connect (G_OBJECT (ephy_embed_get_web_view (embed)), "load-changed",
+                         G_CALLBACK (embed_net_stop_cb), dialog);
 
-       g_value_init (&value, GTK_TYPE_WIDGET);
-       g_object_get_property (G_OBJECT (dialog), "parent-window", &value);
-       window = EPHY_WINDOW (g_value_get_object (&value));
-       g_value_unset (&value);
+       dialog->priv->embed = embed;
 
-       g_return_if_fail (EPHY_IS_WINDOW (window));
+       embedptr = &dialog->priv->embed;
+       g_object_add_weak_pointer (G_OBJECT (dialog->priv->embed),
+                                  (gpointer *) embedptr);
 
-       dialog->priv->window = window;
+       sync_encoding_against_embed (dialog);
+}
 
-       sync_active_tab (window, NULL, dialog);
-       g_signal_connect (G_OBJECT (window), "notify::active-child",
-                         G_CALLBACK (sync_active_tab), dialog);
+static void
+ephy_encoding_dialog_sync_embed (EphyWindow *window, GParamSpec *pspec, EphyEncodingDialog *dialog)
+{
+       ephy_encoding_dialog_detach_embed (dialog);
+       ephy_encoding_dialog_attach_embed (dialog);
 }
 
 static void
 activate_choice (EphyEncodingDialog *dialog)
 {
-       EphyEmbed *embed;
-       GtkWidget *button;
        gboolean is_automatic;
        WebKitWebView *view;
 
-       embed = ephy_embed_dialog_get_embed (EPHY_EMBED_DIALOG (dialog));
-       g_return_if_fail (EPHY_IS_EMBED (embed));
+       g_return_if_fail (EPHY_IS_EMBED (dialog->priv->embed));
 
-       button = ephy_dialog_get_control (EPHY_DIALOG (dialog),
-                                         "automatic_button");
-       is_automatic = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button));
+       is_automatic = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->priv->automatic_button));
 
-       view = EPHY_GET_WEBKIT_WEB_VIEW_FROM_EMBED (embed);
+       view = EPHY_GET_WEBKIT_WEB_VIEW_FROM_EMBED (dialog->priv->embed);
 
        if (is_automatic)
        {
@@ -248,14 +235,13 @@ ephy_encoding_dialog_response_cb (GtkWidget *widget,
                                  int response,
                                  EphyEncodingDialog *dialog)
 {
-       g_object_unref (dialog);
+       gtk_widget_destroy (GTK_WIDGET (dialog));
 }
 
 static void
 view_row_selected_cb (GtkTreeSelection *selection,
                      EphyEncodingDialog *dialog)
 {
-       GtkWidget *button;
        GtkTreeModel *model;
        GtkTreeIter iter;
        EphyEncodingDialogPrivate *priv = dialog->priv;
@@ -275,8 +261,7 @@ view_row_selected_cb (GtkTreeSelection *selection,
        if (dialog->priv->update_tag) 
                return;
 
-       button = ephy_dialog_get_control (EPHY_DIALOG (dialog), "manual_button");
-       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
+       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->manual_button), TRUE);
 
        activate_choice (dialog);
 }
@@ -287,7 +272,6 @@ view_row_activated_cb (GtkTreeView *treeview,
                       GtkTreeViewColumn *column,
                       EphyEncodingDialog *dialog)
 {
-       GtkWidget *button;
        GtkTreeIter iter;
        char *encoding;
        GtkTreeModel *model;
@@ -306,8 +290,7 @@ view_row_activated_cb (GtkTreeView *treeview,
        if (dialog->priv->update_tag) 
                return;
 
-       button = ephy_dialog_get_control (EPHY_DIALOG (dialog), "manual_button");
-       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
+       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->manual_button), TRUE);
 
        activate_choice (dialog);
 
@@ -327,29 +310,20 @@ automatic_toggled_cb (GtkToggleButton *button, EphyEncodingDialog *dialog)
 static void
 ephy_encoding_dialog_init (EphyEncodingDialog *dialog)
 {
-       GtkWidget *treeview, *scroller, *button, *window, *child;
+       GtkWidget *treeview;
        GtkTreeSelection *selection;
        GList *encodings, *p;
        GtkListStore *store;
        GtkTreeIter iter;
        GtkCellRenderer *renderer;
 
-       dialog->priv = EPHY_ENCODING_DIALOG_GET_PRIVATE (dialog);
+       dialog->priv = ephy_encoding_dialog_get_instance_private (dialog);
+       gtk_widget_init_template (GTK_WIDGET (dialog));
 
        dialog->priv->encodings =
                EPHY_ENCODINGS (ephy_embed_shell_get_encodings
                                (EPHY_EMBED_SHELL (ephy_shell_get_default ())));
 
-       ephy_dialog_construct (EPHY_DIALOG (dialog),
-                              "/org/gnome/epiphany/encoding-dialog.ui",
-                              "encoding_dialog",
-                              NULL);
-
-       window = ephy_dialog_get_control (EPHY_DIALOG (dialog),
-                                         "encoding_dialog");
-       g_signal_connect (window, "response",
-                         G_CALLBACK (ephy_encoding_dialog_response_cb), dialog);
-
        encodings = ephy_encodings_get_all (dialog->priv->encodings);
        store = gtk_list_store_new (NUM_COLS, G_TYPE_STRING, G_TYPE_STRING);
        for (p = encodings; p; p = p->next) 
@@ -395,27 +369,24 @@ ephy_encoding_dialog_init (EphyEncodingDialog *dialog)
 
        gtk_widget_show (treeview);
 
-       scroller = ephy_dialog_get_control (EPHY_DIALOG (dialog),
-                                           "scrolled_window");
-       gtk_container_add (GTK_CONTAINER (scroller), treeview);
+       gtk_container_add (GTK_CONTAINER (dialog->priv->scrolled_window), treeview);
 
-       button = ephy_dialog_get_control (EPHY_DIALOG (dialog),
-                                         "automatic_button");
-       child = gtk_bin_get_child (GTK_BIN (button));
-       gtk_label_set_use_markup (GTK_LABEL (child), TRUE);
-       g_signal_connect (button, "toggled",
-                         G_CALLBACK (automatic_toggled_cb), dialog);
+       dialog->priv->enc_view = treeview;
+}
+
+static void
+ephy_encoding_dialog_dispose (GObject *object)
+{
+       EphyEncodingDialog *dialog = EPHY_ENCODING_DIALOG (object);
 
-       button = ephy_dialog_get_control (EPHY_DIALOG (dialog), "manual_button");
-       child = gtk_bin_get_child (GTK_BIN (button));
-       gtk_label_set_use_markup (GTK_LABEL (child), TRUE);
+       g_signal_handlers_disconnect_by_func (dialog->priv->window,
+                                             G_CALLBACK (ephy_encoding_dialog_sync_embed),
+                                             dialog);
 
-       dialog->priv->enc_view = treeview;
+       if (dialog->priv->embed != NULL)
+               ephy_encoding_dialog_detach_embed (dialog);
 
-       g_signal_connect (G_OBJECT (dialog), "notify::parent-window",
-                         G_CALLBACK (sync_parent_window_cb), NULL);
-       g_signal_connect (G_OBJECT (dialog), "notify::embed",
-                         G_CALLBACK (sync_embed_cb), NULL);
+       G_OBJECT_CLASS (ephy_encoding_dialog_parent_class)->dispose (object);
 }
 
 static void
@@ -423,39 +394,96 @@ ephy_encoding_dialog_finalize (GObject *object)
 {
        EphyEncodingDialog *dialog = EPHY_ENCODING_DIALOG (object);
 
-       if (dialog->priv->window != NULL)
+       g_free (dialog->priv->selected_encoding);
+
+       G_OBJECT_CLASS (ephy_encoding_dialog_parent_class)->finalize (object);
+}
+
+static void
+ephy_encoding_dialog_set_parent_window (EphyEncodingDialog *dialog,
+                                        EphyWindow *window)
+{
+       g_return_if_fail (EPHY_IS_WINDOW (window));
+
+       g_signal_connect (G_OBJECT (window), "notify::active-child",
+                         G_CALLBACK (ephy_encoding_dialog_sync_embed), dialog);
+
+       dialog->priv->window = window;
+
+       ephy_encoding_dialog_attach_embed (dialog);
+}
+
+static void
+ephy_encoding_dialog_set_property (GObject      *object,
+                                   guint         prop_id,
+                                   const GValue *value,
+                                   GParamSpec   *pspec)
+{
+       switch (prop_id)
        {
-               g_signal_handlers_disconnect_by_func (dialog->priv->window,
-                                                     G_CALLBACK (sync_active_tab),
-                                                     dialog);
+       case PROP_PARENT_WINDOW:
+               ephy_encoding_dialog_set_parent_window (EPHY_ENCODING_DIALOG (object),
+                                                       g_value_get_object (value));
+               break;
+       default:
+               G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+               break;
        }
+}
 
-       if (dialog->priv->embed)
+static void
+ephy_encoding_dialog_get_property (GObject    *object,
+                                   guint       prop_id,
+                                   GValue     *value,
+                                   GParamSpec *pspec)
+{
+       switch (prop_id)
        {
-               g_signal_handlers_disconnect_by_func (ephy_embed_get_web_view (dialog->priv->embed),
-                                                     G_CALLBACK (embed_net_stop_cb),
-                                                     dialog);
+       case PROP_PARENT_WINDOW:
+               g_value_set_object (value, EPHY_ENCODING_DIALOG (object)->priv->window);
+               break;
+       default:
+               G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+               break;
        }
-
-       g_free (dialog->priv->selected_encoding);
-
-       G_OBJECT_CLASS (ephy_encoding_dialog_parent_class)->finalize (object);
 }
 
 static void
 ephy_encoding_dialog_class_init (EphyEncodingDialogClass *klass)
 {
        GObjectClass *object_class = G_OBJECT_CLASS (klass);
+       GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
+       /* class creation */
        object_class->finalize = ephy_encoding_dialog_finalize;
-
-       g_type_class_add_private (object_class, sizeof(EphyEncodingDialogPrivate));
+       object_class->set_property = ephy_encoding_dialog_set_property;
+       object_class->get_property = ephy_encoding_dialog_get_property;
+       object_class->dispose = ephy_encoding_dialog_dispose;
+
+       g_object_class_install_property (object_class,
+                                        PROP_PARENT_WINDOW,
+                                        g_param_spec_object ("parent-window",
+                                                             "Parent window",
+                                                             "Parent window",
+                                                             EPHY_TYPE_WINDOW,
+                                                             G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | 
G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
+
+       /* load from UI file */
+       gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/epiphany/encoding-dialog.ui");
+
+       gtk_widget_class_bind_template_child_private (widget_class, EphyEncodingDialog, automatic_button);
+       gtk_widget_class_bind_template_child_private (widget_class, EphyEncodingDialog, manual_button);
+       gtk_widget_class_bind_template_child_private (widget_class, EphyEncodingDialog, scrolled_window);
+
+       gtk_widget_class_bind_template_callback (widget_class, automatic_toggled_cb);
+       gtk_widget_class_bind_template_callback (widget_class, ephy_encoding_dialog_response_cb);
 }
-               
+
 EphyEncodingDialog *
 ephy_encoding_dialog_new (EphyWindow *parent)
 {
        return g_object_new (EPHY_TYPE_ENCODING_DIALOG,
+                            "use-header-bar" , TRUE,
                             "parent-window", parent,
                             NULL);
 }
diff --git a/src/ephy-encoding-dialog.h b/src/ephy-encoding-dialog.h
index aec169c..65ec92e 100644
--- a/src/ephy-encoding-dialog.h
+++ b/src/ephy-encoding-dialog.h
@@ -25,11 +25,9 @@
 #ifndef EPHY_ENCODING_DIALOG_H
 #define EPHY_ENCODING_DIALOG_H
 
-#include "ephy-embed-dialog.h"
 #include "ephy-window.h"
 
-#include <glib.h>
-#include <glib-object.h>
+#include <gtk/gtk.h>
 
 G_BEGIN_DECLS
 
@@ -46,7 +44,7 @@ typedef struct _EphyEncodingDialogPrivate     EphyEncodingDialogPrivate;
 
 struct _EphyEncodingDialog
 {
-       EphyEmbedDialog parent;
+       GtkDialog parent;
 
        /*< private >*/
        EphyEncodingDialogPrivate *priv;
@@ -54,7 +52,7 @@ struct _EphyEncodingDialog
 
 struct _EphyEncodingDialogClass
 {
-       EphyEmbedDialogClass parent_class;
+       GtkDialogClass parent_class;
 };
 
 GType                   ephy_encoding_dialog_get_type  (void);
diff --git a/src/ephy-encoding-menu.c b/src/ephy-encoding-menu.c
index 5f95813..4a74ad9 100644
--- a/src/ephy-encoding-menu.c
+++ b/src/ephy-encoding-menu.c
@@ -287,12 +287,14 @@ ephy_encoding_menu_view_dialog_cb (GtkAction *action, EphyEncodingMenu *menu)
                EphyEncodingDialog **dialog = &menu->priv->dialog;
                menu->priv->dialog = ephy_encoding_dialog_new
                                        (menu->priv->window);
+               gtk_window_set_transient_for (GTK_WINDOW (menu->priv->dialog),
+                                             GTK_WINDOW (menu->priv->window));
 
                g_object_add_weak_pointer(G_OBJECT (menu->priv->dialog),
                                          (gpointer *)dialog);
        }
 
-       ephy_dialog_show (EPHY_DIALOG (menu->priv->dialog));
+       gtk_widget_show (GTK_WIDGET (menu->priv->dialog));
 }
 
 static void
diff --git a/src/resources/encoding-dialog.ui b/src/resources/encoding-dialog.ui
index 259ce06..7f2fca7 100644
--- a/src/resources/encoding-dialog.ui
+++ b/src/resources/encoding-dialog.ui
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <!-- interface-requires gtk+ 3.0 -->
-  <object class="GtkDialog" id="encoding_dialog">
+  <template class="EphyEncodingDialog" parent="GtkDialog">
     <property name="border_width">5</property>
     <property name="role">epiphany-encoding-chooser</property>
     <property name="modal">True</property>
@@ -11,6 +11,7 @@
     <property name="type_hint">dialog</property>
     <property name="use_header_bar">1</property>
     <property name="title" translatable="yes">Text Encoding</property>
+    <signal name="response" handler="ephy_encoding_dialog_response_cb"/>
     <child internal-child="vbox">
       <object class="GtkBox">
         <property name="spacing">18</property>
@@ -24,6 +25,7 @@
                 <property name="visible">True</property>
                 <property name="use_underline">True</property>
                 <property name="halign">start</property>
+                <signal name="toggled" handler="automatic_toggled_cb"/>
                 <child>
                   <object class="GtkLabel">
                     <property name="visible">True</property>
@@ -86,5 +88,5 @@
         </child>
       </object>
     </child>
-  </object>
+  </template>
 </interface>


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]