From 11395d684736467fb010b93b0eaeefcc06bf0f5e Mon Sep 17 00:00:00 2001 From: Cyrille Bagard 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 + + * 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 * 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