diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2015-04-12 22:07:56 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2015-04-12 22:07:56 (GMT) |
commit | 90923fccb863075722d2ed17360e2c330b262e04 (patch) | |
tree | b7588517a6437efa2d4cd885984e0b87ef8307fe /src/gtkext/gtkbufferview.c | |
parent | 054d2d76f1951c20822286bce0128e60c26c4b9b (diff) |
Highlighted the current segment on caret location changes.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@511 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/gtkext/gtkbufferview.c')
-rw-r--r-- | src/gtkext/gtkbufferview.c | 81 |
1 files changed, 73 insertions, 8 deletions
diff --git a/src/gtkext/gtkbufferview.c b/src/gtkext/gtkbufferview.c index 1c2c7a9..1a1f6f1 100644 --- a/src/gtkext/gtkbufferview.c +++ b/src/gtkext/gtkbufferview.c @@ -41,6 +41,12 @@ static void gtk_buffer_view_class_init(GtkBufferViewClass *); /* Procède à l'initialisation de l'afficheur de tampons. */ static void gtk_buffer_view_init(GtkBufferView *); +/* Supprime toutes les références externes. */ +static void gtk_buffer_view_dispose(GtkBufferView *); + +/* Procède à la libération totale de la mémoire. */ +static void gtk_buffer_view_finalize(GtkBufferView *); + /* Intègre le focus dans le rendu du composant. */ static gboolean gtk_buffer_view_focus(GtkWidget *, GtkDirectionType); @@ -110,12 +116,17 @@ G_DEFINE_TYPE(GtkBufferView, gtk_buffer_view, GTK_TYPE_VIEW_PANEL) static void gtk_buffer_view_class_init(GtkBufferViewClass *class) { + GObjectClass *object; /* Autre version de la classe */ GtkWidgetClass *widget_class; /* Classe version Widget */ GtkViewPanelClass *panel_class; /* Classe parente */ + object = G_OBJECT_CLASS(class); widget_class = GTK_WIDGET_CLASS(class); panel_class = GTK_VIEW_PANEL_CLASS(class); + object->dispose = (GObjectFinalizeFunc/* ! */)gtk_buffer_view_dispose; + object->finalize = (GObjectFinalizeFunc)gtk_buffer_view_finalize; + widget_class->focus = gtk_buffer_view_focus; widget_class->button_press_event = gtk_buffer_view_button_press; widget_class->draw = gtk_buffer_view_draw; @@ -163,6 +174,44 @@ static void gtk_buffer_view_init(GtkBufferView *view) /****************************************************************************** * * +* Paramètres : view = instance d'objet GLib à traiter. * +* * +* Description : Supprime toutes les références externes. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void gtk_buffer_view_dispose(GtkBufferView *view) +{ + G_OBJECT_CLASS(gtk_buffer_view_parent_class)->dispose(G_OBJECT(view)); + +} + + +/****************************************************************************** +* * +* Paramètres : view = instance d'objet GLib à traiter. * +* * +* Description : Procède à la libération totale de la mémoire. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void gtk_buffer_view_finalize(GtkBufferView *view) +{ + G_OBJECT_CLASS(gtk_buffer_view_parent_class)->finalize(G_OBJECT(view)); + +} + + +/****************************************************************************** +* * * Paramètres : widget = composant GTK visé par l'opération. * * dir = sens de l'opération : perte ou gain de focus. * * * @@ -826,21 +875,37 @@ void gtk_buffer_view_compute_relative_coords(GtkBufferView *view, gint *x, gint static void gtk_buffer_view_relocate_caret(GtkBufferView *view, const GdkRectangle *area, const vmpa2t *addr) { + bool clear_old; /* Effacement chirurgical */ + GdkRectangle old_area; /* Mémorisation de l'ancien */ + bool need_redraw; /* Besoin de rafraîchissement ?*/ + if (view->caret_addr != NULL) { - gtk_buffer_view_compute_relative_coords(view, &view->caret.x, &view->caret.y); + clear_old = true; + old_area = view->caret; + } + else + clear_old = false; + + view->caret = *area; + view->caret_addr = addr; - /* - gtk_widget_queue_draw_area(GTK_WIDGET(view), view->caret.x, view->caret.y, - view->caret.width, view->caret.height); - */ + if (GTK_BUFFER_VIEW_GET_CLASS(view)->notify_caret != NULL) + need_redraw = GTK_BUFFER_VIEW_GET_CLASS(view)->notify_caret(view, area, addr); + else + need_redraw = false; + if (need_redraw) gtk_widget_queue_draw(GTK_WIDGET(view)); - } + else if (clear_old) + { + gtk_buffer_view_compute_relative_coords(view, &old_area.x, &old_area.y); - view->caret = *area; - view->caret_addr = addr; + gtk_widget_queue_draw_area(GTK_WIDGET(view), old_area.x, old_area.y, + old_area.width, old_area.height); + + } restart_caret_blinking(view); |