From 11395d684736467fb010b93b0eaeefcc06bf0f5e Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Wed, 4 Jun 2014 22:44:21 +0000
Subject: Fixed bugs when dealing with views and updated the code for GTK3.

git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@378 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
---
 ChangeLog                     | 15 ++++++++
 src/gtkext/gtkbufferview.c    | 36 +++++++-----------
 src/gtkext/gtkgraphview.c     | 25 -------------
 src/gtkext/gtkviewpanel-int.h |  8 ----
 src/gtkext/gtkviewpanel.c     | 85 +++----------------------------------------
 src/gui/menus/view.c          | 14 ++++++-
 src/gui/status.c              |  7 ----
 7 files changed, 46 insertions(+), 144 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index c2ab5aa..83dcb63 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+14-06-05  Cyrille Bagard <nocbos@gmail.com>
+
+	* src/gtkext/gtkbufferview.c:
+	* src/gtkext/gtkgraphview.c:
+	* src/gtkext/gtkviewpanel.c:
+	* src/gtkext/gtkviewpanel-int.h:
+	Avoid to rely on the now deprecated set-scroll-adjustments signal.
+	Remove all the relative dead code.
+
+	* src/gui/menus/view.c:
+	Fix a bug when changing views: one level was missing in widgets stack.
+
+	* src/gui/status.c:
+	Clean the code.
+
 14-06-04  Cyrille Bagard <nocbos@gmail.com>
 
 	* src/gtkext/gtkbufferview.c
diff --git a/src/gtkext/gtkbufferview.c b/src/gtkext/gtkbufferview.c
index 38fff5a..26f67c1 100644
--- a/src/gtkext/gtkbufferview.c
+++ b/src/gtkext/gtkbufferview.c
@@ -64,9 +64,6 @@ static gboolean gtk_buffer_view_key_press(GtkWidget *, GdkEventKey *);
 /* Indique la position d'affichage d'une adresse donnée. */
 static bool gtk_buffer_view_get_address_coordinates(const GtkBufferView *, vmpa_t, gint *, gint *);
 
-/* Réagit à un défilement quelconque. */
-static void gtk_buffer_view_scroll(GtkBufferView *);
-
 /* Place en cache un rendu destiné à l'aperçu graphique rapide. */
 static void gtk_buffer_view_cache_glance(GtkBufferView *, cairo_t *, const GtkAllocation *, double);
 
@@ -148,7 +145,6 @@ static void gtk_buffer_view_init(GtkBufferView *view)
     viewpanel = GTK_VIEW_PANEL(view);
 
     viewpanel->get_coordinates = (get_addr_coordinates_fc)gtk_buffer_view_get_address_coordinates;
-    viewpanel->scroll = (scroll_fc)gtk_buffer_view_scroll;
     viewpanel->cache_glance = (cache_glance_fc)gtk_buffer_view_cache_glance;
 
     view->caret.x = 10;
@@ -598,25 +594,6 @@ static bool gtk_buffer_view_get_address_coordinates(const GtkBufferView *view, v
 
 /******************************************************************************
 *                                                                             *
-*  Paramètres  : view  = composant GTK à mettre à jour.                       *
-*                                                                             *
-*  Description : Réagit à un défilement quelconque.                           *
-*                                                                             *
-*  Retour      : -                                                            *
-*                                                                             *
-*  Remarques   : -                                                            *
-*                                                                             *
-******************************************************************************/
-
-static void gtk_buffer_view_scroll(GtkBufferView *view)
-{
-    gtk_widget_queue_draw(GTK_WIDGET(view));
-
-}
-
-
-/******************************************************************************
-*                                                                             *
 *  Paramètres  : view  = composant GTK à manipuler.                           *
 *                cairo = assistant pour la création de rendus.                *
 *                area  = taille de la surface réduite à disposition.          *
@@ -799,11 +776,24 @@ static void restart_caret_blinking(GtkBufferView *view)
 static gboolean gtk_buffer_view_refresh_caret(GtkBufferView *view)
 {
     GtkWidget *widget;                      /* Autre version du composant  */
+    GdkWindow *window;                      /* Fenêtre de support associée */
     GdkRectangle area;                      /* Région adaptée à traiter    */
     cairo_t *cr;                            /* Contexte graphique          */
     GdkRGBA *color;                         /* Couleur du curseur          */
 
     widget = GTK_WIDGET(view);
+    window = gtk_widget_get_window(widget);
+
+    /**
+     * Si le composant n'est pas encore réalisé (ou caché, en cas de
+     * basculement entre les types de vues), gdk_cairo_create() ne va
+     * pas apprécier l'argument NULL. Donc on écourte l'opération.
+     */
+    if (window == NULL)
+    {
+        view->show_caret = !view->show_caret;
+        return TRUE;
+    }
 
     area = view->caret;
     gtk_buffer_view_compute_relative_coords(view, &area.x, &area.y);
diff --git a/src/gtkext/gtkgraphview.c b/src/gtkext/gtkgraphview.c
index 530de74..3b4fb78 100644
--- a/src/gtkext/gtkgraphview.c
+++ b/src/gtkext/gtkgraphview.c
@@ -90,9 +90,6 @@ static void gtk_graph_view_prepare_resize(GtkGraphView *);
 /* Indique la position d'affichage d'une adresse donnée. */
 static bool gtk_graph_view_get_address_coordinates(const GtkGraphView *, vmpa_t, gint *, gint *);
 
-/* Réagit à un défilement quelconque. */
-static void gtk_graph_view_scroll(GtkGraphView *);
-
 /* Place en cache un rendu destiné à l'aperçu graphique rapide. */
 static void gtk_graph_view_cache_glance(GtkGraphView *, cairo_t *, const GtkAllocation *, double);
 
@@ -158,7 +155,6 @@ static void gtk_graph_view_init(GtkGraphView *view)
     viewpanel->define = (define_address_fc)gtk_graph_view_define_main_address;
     viewpanel->resize = (prepare_resize_fc)gtk_graph_view_prepare_resize;
     viewpanel->get_coordinates = (get_addr_coordinates_fc)gtk_graph_view_get_address_coordinates;
-    viewpanel->scroll = (scroll_fc)gtk_graph_view_scroll;
     viewpanel->cache_glance = (cache_glance_fc)gtk_graph_view_cache_glance;
 
     //binview = GTK_BIN_VIEW(view);
@@ -523,27 +519,6 @@ static bool gtk_graph_view_get_address_coordinates(const GtkGraphView *view, vmp
 
 /******************************************************************************
 *                                                                             *
-*  Paramètres  : view  = composant GTK à mettre à jour.                       *
-*                                                                             *
-*  Description : Réagit à un défilement quelconque.                           *
-*                                                                             *
-*  Retour      : -                                                            *
-*                                                                             *
-*  Remarques   : -                                                            *
-*                                                                             *
-******************************************************************************/
-
-static void gtk_graph_view_scroll(GtkGraphView *view)
-{
-    gtk_fixed_move(GTK_FIXED(view), GTK_WIDGET(view->support),
-                   -gtk_adjustment_get_value(GTK_VIEW_PANEL(view)->hadjustment),
-                   -gtk_adjustment_get_value(GTK_VIEW_PANEL(view)->vadjustment));
-
-}
-
-
-/******************************************************************************
-*                                                                             *
 *  Paramètres  : view  = composant GTK à manipuler.                           *
 *                cairo = assistant pour la création de rendus.                *
 *                area  = taille de la surface réduite à disposition.          *
diff --git a/src/gtkext/gtkviewpanel-int.h b/src/gtkext/gtkviewpanel-int.h
index 36d5050..63a6a5b 100644
--- a/src/gtkext/gtkviewpanel-int.h
+++ b/src/gtkext/gtkviewpanel-int.h
@@ -45,9 +45,6 @@ typedef void (* prepare_resize_fc) (GtkViewPanel *);
 /* Indique la position d'affichage d'une adresse donnée. */
 typedef bool (* get_addr_coordinates_fc) (const GtkViewPanel *, vmpa_t, gint *, gint *);
 
-/* Réagit à un défilement quelconque. */
-typedef void (* scroll_fc) (GtkViewPanel *);
-
 /* Place en cache un rendu destiné à l'aperçu graphique rapide. */
 typedef void (* cache_glance_fc) (GtkViewPanel *, cairo_t *, const GtkAllocation *, double);
 
@@ -69,7 +66,6 @@ struct _GtkViewPanel
     define_address_fc define;               /* Centrage sur une partie     */
     prepare_resize_fc resize;               /* Prépare une nouvelle taille */
     get_addr_coordinates_fc get_coordinates;/* Conversion adresse <-> pos. */
-    scroll_fc scroll;                       /* Défilement du contenu       */
     cache_glance_fc cache_glance;           /* Cache de la mignature       */
 
     bool *display_addr;                     /* Affichage des adresses ?    */
@@ -82,10 +78,6 @@ struct _GtkViewPanelClass
 {
     GtkFixedClass parent;                   /* A laisser en premier        */
 
-    /* Signaux */
-
-    void (* set_scroll_adjustments) (GtkViewPanel *, GtkAdjustment *, GtkAdjustment *);
-
 };
 
 
diff --git a/src/gtkext/gtkviewpanel.c b/src/gtkext/gtkviewpanel.c
index f10713f..2b1aa97 100644
--- a/src/gtkext/gtkviewpanel.c
+++ b/src/gtkext/gtkviewpanel.c
@@ -35,12 +35,6 @@ static void gtk_view_panel_class_init(GtkViewPanelClass *);
 /* Procède à l'initialisation de l'afficheur générique. */
 static void gtk_view_panel_init(GtkViewPanel *);
 
-/* Enregistre les défilements à associer au composant GTK. */
-static void gtk_view_panel_set_scroll_adjustments(GtkViewPanel *, GtkAdjustment *, GtkAdjustment *);
-
-/* Prend acte d'un nouveau défilement. */
-static void gtk_view_panel_adj_value_changed(GtkAdjustment *, GtkViewPanel *);
-
 /* Encadre la construction graphique initiale de l'affichage. */
 static void gtk_view_panel_realize(GtkWidget *);
 
@@ -74,21 +68,6 @@ static void gtk_view_panel_class_init(GtkViewPanelClass *class)
     widget_class->realize = gtk_view_panel_realize;
     widget_class->draw = gtk_view_panel_draw;
 
-    class->set_scroll_adjustments = gtk_view_panel_set_scroll_adjustments;
-
-    /*
-    widget_class->set_scroll_adjustments_signal =
-        g_signal_new(("set_scroll_adjustments"),
-                     GTK_TYPE_VIEW_PANEL,
-                     G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
-                     G_STRUCT_OFFSET(GtkViewPanelClass, set_scroll_adjustments),
-                     NULL, NULL,
-                     g_cclosure_user_marshal_VOID__OBJECT_OBJECT,
-                     G_TYPE_NONE, 2,
-                     GTK_TYPE_ADJUSTMENT,
-                     GTK_TYPE_ADJUSTMENT);
-    */
-
 }
 
 
@@ -114,63 +93,6 @@ static void gtk_view_panel_init(GtkViewPanel *panel)
 
 /******************************************************************************
 *                                                                             *
-*  Paramètres  : panel       = vue à compléter.                               *
-*                hadjustment = nouveau défilement horizontal à intégrer.      *
-*                vadjustment = nouveau défilement vertical à intégrer.        *
-*                                                                             *
-*  Description : Enregistre les défilements à associer au composant GTK.      *
-*                                                                             *
-*  Retour      : -                                                            *
-*                                                                             *
-*  Remarques   : -                                                            *
-*                                                                             *
-******************************************************************************/
-
-static void gtk_view_panel_set_scroll_adjustments(GtkViewPanel *panel, GtkAdjustment *hadjustment, GtkAdjustment *vadjustment)
-{
-    /* TODO : déconnecter les anciens ? */
-
-    panel->hadjustment = hadjustment;
-    panel->vadjustment = vadjustment;
-
-    /**
-     * On vérifie que le support n'est pas en train de nous libérer,
-     * avant de se connecter...
-     */
-
-    if (hadjustment != NULL)
-        g_signal_connect(hadjustment, "value_changed",
-                         G_CALLBACK(gtk_view_panel_adj_value_changed), panel);
-
-    if (vadjustment != NULL)
-        g_signal_connect(vadjustment, "value_changed",
-                         G_CALLBACK(gtk_view_panel_adj_value_changed), panel);
-
-}
-
-
-/******************************************************************************
-*                                                                             *
-*  Paramètres  : adj   = défilement à l'origine de l'action.                  *
-*                panel = composant GTK à redessiner.                          *
-*                                                                             *
-*  Description : Prend acte d'un nouveau défilement.                          *
-*                                                                             *
-*  Retour      : -                                                            *
-*                                                                             *
-*  Remarques   : -                                                            *
-*                                                                             *
-******************************************************************************/
-
-static void gtk_view_panel_adj_value_changed(GtkAdjustment *adj, GtkViewPanel *panel)
-{
-    panel->scroll(panel);
-
-}
-
-
-/******************************************************************************
-*                                                                             *
 *  Paramètres  : adj     = valeurs de défilement à consulter.                 *
 *                changed = note une mise à jour de valeur. [OUT]              *
 *                                                                             *
@@ -549,6 +471,7 @@ void gtk_view_panel_scroll_to_address(GtkViewPanel *panel, vmpa_t addr)
 {
     gint x;                                 /* Abscisse à garantir         */
     gint y;                                 /* Ordonnée à garantir         */
+    GtkWidget *viewport;                    /* Parent avec défilement      */
     GtkAdjustment *adj;                     /* Défilement à mettre à jour  */
     double limit;                           /* Limite à ne pas dépasser    */
 
@@ -557,7 +480,9 @@ void gtk_view_panel_scroll_to_address(GtkViewPanel *panel, vmpa_t addr)
 
     if (panel->get_coordinates(panel, addr, &x, &y))
     {
-        adj = panel->hadjustment;
+        viewport = gtk_widget_get_parent(GTK_WIDGET(panel));
+
+        g_object_get(G_OBJECT(viewport), "hadjustment", &adj, NULL);
         limit = gtk_adjustment_get_upper(adj) - gtk_adjustment_get_page_size(adj);
 
         if (x > limit)
@@ -565,7 +490,7 @@ void gtk_view_panel_scroll_to_address(GtkViewPanel *panel, vmpa_t addr)
 
         gtk_adjustment_set_value(adj, x);
 
-        adj = panel->vadjustment;
+        g_object_get(G_OBJECT(viewport), "vadjustment", &adj, NULL);
         limit = gtk_adjustment_get_upper(adj) - gtk_adjustment_get_page_size(adj);
 
         if (y > limit)
diff --git a/src/gui/menus/view.c b/src/gui/menus/view.c
index 0bcc2fe..511d9db 100644
--- a/src/gui/menus/view.c
+++ b/src/gui/menus/view.c
@@ -192,8 +192,20 @@ static void mcb_view_change_support(GtkRadioMenuItem *menuitem, GMenuBar *bar)
 
         view = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(iter->data), "kind_of_view"));
 
+        /**
+         * La hiérarchie des composants empilés est la suivante :
+         *
+         *  - GtkBlockView / GtkGraphView / GtkSourceView
+         *  - GtkViewport
+         *  - GtkScrolledWindow
+         *  - GtkNotebook
+         *  - GtkDockStation
+         *
+         */
+
         vpanel = g_editor_item_get_current_view(G_EDITOR_ITEM(bar));
-        station = gtk_widget_get_parent(GTK_WIDGET(vpanel));    /* ScrollWindow */
+        station = gtk_widget_get_parent(GTK_WIDGET(vpanel));    /* GtkViewport */
+        station = gtk_widget_get_parent(GTK_WIDGET(station));   /* ScrollWindow */
         station = gtk_widget_get_parent(station);   /* NoteBook */
         station = gtk_widget_get_parent(station);   /* DockStation */
 
diff --git a/src/gui/status.c b/src/gui/status.c
index 50424de..c059f4e 100644
--- a/src/gui/status.c
+++ b/src/gui/status.c
@@ -169,10 +169,6 @@ GEditorItem *g_status_info_new(GObject *ref)
 
 static void update_status_info_for_view(GStatusInfo *info, GtkViewPanel *view)
 {
-    printf("new view :: %p\n", view);
-
-    //track_caret_address_on_buffer_views
-
     if (info->caret_instance != NULL)
     {
         g_signal_handlers_disconnect_by_func(info->caret_instance,
@@ -186,9 +182,6 @@ static void update_status_info_for_view(GStatusInfo *info, GtkViewPanel *view)
                          G_CALLBACK(track_caret_address_on_buffer_views),
                          info);
 
-    else
-        return;
-
     info->caret_instance = G_OBJECT(view);
     g_object_ref(info->caret_instance);
 
-- 
cgit v0.11.2-87-g4458