diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2016-10-23 11:59:26 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2016-10-23 11:59:26 (GMT) |
commit | 3f05bacd4fec23824489b51d964a7ce3565bb85b (patch) | |
tree | 486cb1d96c11a33385a2155d2f326b88aae08e16 /src/gtkext/gtkbufferview.c | |
parent | fa30b0fb42d2e229de9f760bfa842f25738efc18 (diff) |
Memorized all creators of line content at the line level and saved memory.
Diffstat (limited to 'src/gtkext/gtkbufferview.c')
-rw-r--r-- | src/gtkext/gtkbufferview.c | 41 |
1 files changed, 23 insertions, 18 deletions
diff --git a/src/gtkext/gtkbufferview.c b/src/gtkext/gtkbufferview.c index 2032547..2d1b51c 100644 --- a/src/gtkext/gtkbufferview.c +++ b/src/gtkext/gtkbufferview.c @@ -80,7 +80,7 @@ static const vmpa2t *gtk_buffer_view_get_caret_location(const GtkBufferView *); static bool gtk_buffer_view_get_address_coordinates(const GtkBufferView *, const vmpa2t *, gint *, gint *, ScrollPositionTweak); /* Fournit des éléments liés à la position courante dans la vue. */ -static bool gtk_buffer_view_get_position(const GtkBufferView *, GBufferLine **, GBufferSegment **); +static bool gtk_buffer_view_get_position(const GtkBufferView *, GBufferLine **, GObject **); /* Place en cache un rendu destiné à l'aperçu graphique rapide. */ static void gtk_buffer_view_cache_glance(GtkBufferView *, cairo_t *, const GtkAllocation *, double); @@ -557,11 +557,11 @@ static gboolean gtk_buffer_view_key_press(GtkWidget *widget, GdkEventKey *event) static gboolean gtk_buffer_view_query_tooltip(GtkWidget *widget, gint x, gint y, gboolean keyboard, GtkTooltip *tooltip) { + gboolean result; /* Bilan à retourner */ GtkBufferView *view; /* Autre version du composant */ gint real_x; /* Abscisse absolue réelle */ gint real_y; /* Ordonnée absolue réelle */ GBufferLine *line; /* Ligne en cours de survol */ - GBufferSegment *segment; /* Segment actif s'il existe */ GObject *creator; /* Créateur à l'orgine du seg. */ virt_t virt; /* Adresse virtuelle */ vmpa2t addr; /* Adresse de destination */ @@ -579,6 +579,8 @@ static gboolean gtk_buffer_view_query_tooltip(GtkWidget *widget, gint x, gint y, if (keyboard) return FALSE; + result = FALSE; + view = GTK_BUFFER_VIEW(widget); /* Récupération de la destination pointée */ @@ -587,14 +589,11 @@ static gboolean gtk_buffer_view_query_tooltip(GtkWidget *widget, gint x, gint y, real_y = y; gtk_view_panel_compute_real_coord(GTK_VIEW_PANEL(view), &real_x, &real_y); - line = g_buffer_view_find_line_and_segment_at(view->buffer_view, + line = g_buffer_view_find_line_and_creator_at(view->buffer_view, &real_x, real_y, NULL, - GTK_VIEW_PANEL(view)->display, &segment); - - if (line == NULL || segment == NULL) goto no_tooltip; + GTK_VIEW_PANEL(view)->display, &creator); - creator = g_buffer_segment_get_creator(segment); - if (creator == NULL) goto no_tooltip; + if (line == NULL || creator == NULL) goto no_tooltip; /** * On fait le pari de reposer uniquement sur des adresses virtuelles ! @@ -677,14 +676,20 @@ static gboolean gtk_buffer_view_query_tooltip(GtkWidget *widget, gint x, gint y, /* Impression finale */ + result = TRUE; + gtk_tooltip_set_markup(tooltip, markup); free(markup); - return TRUE; - no_tooltip: - return FALSE; + if (creator != NULL) + g_object_unref(creator); + + if (line != NULL) + g_object_unref(G_OBJECT(line)); + + return result; } @@ -862,7 +867,7 @@ static bool gtk_buffer_view_get_address_coordinates(const GtkBufferView *view, c * * * Paramètres : view = composant GTK à consulter. * * line = ligne de tampon où se trouve le curseur. [OUT] * -* segment = eventuel segment de ligne actif. [OUT] * +* creator = instance à l'origine de la représentation. [OUT] * * * * Description : Fournit des éléments liés à la position courante dans la vue.* * * @@ -872,20 +877,20 @@ static bool gtk_buffer_view_get_address_coordinates(const GtkBufferView *view, c * * ******************************************************************************/ -static bool gtk_buffer_view_get_position(const GtkBufferView *view, GBufferLine **line, GBufferSegment **segment) +static bool gtk_buffer_view_get_position(const GtkBufferView *view, GBufferLine **line, GObject **creator) { - GBufferSegment *seg; /* Segment à récupérer */ + GObject *obj; /* Elément à récupérer */ /* Si aucune position n'est définie... */ if (view->caret_addr == NULL) return false; - *line = g_buffer_view_find_line_and_segment_at(view->buffer_view, + *line = g_buffer_view_find_line_and_creator_at(view->buffer_view, (gint []){ view->caret.x }, view->caret.y, NULL, - GTK_VIEW_PANEL(view)->display, &seg); + GTK_VIEW_PANEL(view)->display, &obj); - if (segment != NULL) - *segment = seg; + if (creator != NULL) + *creator = obj; return (line != NULL); |