diff options
Diffstat (limited to 'src/glibext/bufferview.c')
-rw-r--r-- | src/glibext/bufferview.c | 380 |
1 files changed, 291 insertions, 89 deletions
diff --git a/src/glibext/bufferview.c b/src/glibext/bufferview.c index 72740b1..3747e2c 100644 --- a/src/glibext/bufferview.c +++ b/src/glibext/bufferview.c @@ -2,7 +2,7 @@ /* Chrysalide - Outil d'analyse de fichiers binaires * bufferview.c - affichage d'une vue particulière d'un tampon de lignes * - * Copyright (C) 2016-2019 Cyrille Bagard + * Copyright (C) 2016-2024 Cyrille Bagard * * This file is part of Chrysalide. * @@ -24,46 +24,17 @@ #include "bufferview.h" -#include <assert.h> - +#include "bufferview-int.h" -/* Vue d'un tampon pour code désassemblé (instance) */ -struct _GBufferView -{ - GObject parent; /* A laisser en premier */ - GBufferCache *cache; /* Tampon du contenu visualisé */ - - segcnt_list *highlighted; /* Segments mis en évidence */ - - bool unrestricted; /* Validité des informations */ - GLineCursor *start; /* Première ligne intégrée */ - GLineCursor *end; /* Dernière ligne intégrée */ - - size_t first; /* Indice de la première ligne */ - size_t last; /* Indice de la dernière ligne */ - - GWidthTracker *tracker; /* Suivi des largeurs */ - -}; - -/* Vue d'un tampon pour code désassemblé (classe) */ -struct _GBufferViewClass -{ - GObjectClass parent; /* A laisser en premier */ - - /* Signaux */ - - void (* need_redraw) (GBufferView *); - -}; +/* -------------------------- DEFINITION D'UN NOUVEL OBJET -------------------------- */ /* Procède à l'initialisation d'une classe de vue de tampon. */ static void g_buffer_view_class_init(GBufferViewClass *); -/* Procède à l'initialisation d'une vue d'un tampon pour code. */ +/* Procède à l'initialisation d'une vue d'un tampon. */ static void g_buffer_view_init(GBufferView *); /* Supprime toutes les références externes. */ @@ -75,23 +46,15 @@ static void g_buffer_view_finalize(GBufferView *); /* Accompagne une variation de la quantité de lignes du tampon. */ static void on_buffer_cache_size_changed(const GBufferCache *, bool, size_t, size_t, GBufferView *); -/* Réagit à la modification d'une ligne du tampon. */ -static void on_buffer_cache_line_updated(const GBufferCache *, size_t, GBufferView *); - -/* Calcule la position idéale de curseur pour un point donné. */ -static bool _g_buffer_view_compute_caret_full(GBufferView *, gint, GBufferLine *, size_t, const GDisplayOptions *, cairo_rectangle_int_t *, GLineCursor **); - -/* Fournit la ligne présente à une ordonnée donnée. */ -static GBufferLine *g_buffer_view_find_line_at(GBufferView *, gint, size_t *); - -/* Déplace le curseur au sein d'une vue de tampon. */ -static bool _g_buffer_view_move_caret(GBufferView *, const GBufferLine *, size_t, cairo_rectangle_int_t *, bool, GdkScrollDirection, const GDisplayOptions *); +/* ---------------------------------------------------------------------------------- */ +/* DEFINITION D'UN NOUVEL OBJET */ +/* ---------------------------------------------------------------------------------- */ /* Détermine le type de la vue d'un tampon pour code désassemblé. */ @@ -100,7 +63,7 @@ G_DEFINE_TYPE(GBufferView, g_buffer_view, G_TYPE_OBJECT); /****************************************************************************** * * -* Paramètres : class = classe de composant GTK à initialiser. * +* Paramètres : class = classe de composant GLib à initialiser. * * * * Description : Procède à l'initialisation d'une classe de vue de tampon. * * * @@ -136,7 +99,7 @@ static void g_buffer_view_class_init(GBufferViewClass *class) * * * Paramètres : view = composant GLib à initialiser. * * * -* Description : Procède à l'initialisation d'une vue d'un tampon pour code. * +* Description : Procède à l'initialisation d'une vue d'un tampon. * * * * Retour : - * * * @@ -147,22 +110,26 @@ static void g_buffer_view_class_init(GBufferViewClass *class) static void g_buffer_view_init(GBufferView *view) { view->cache = NULL; - - view->highlighted = NULL; + view->tracker = NULL; + view->style = NULL; /** * Inversion du statut pour forcer l'actualisation lors de la création. */ view->unrestricted = false; +#if 0 + view->start = NULL; view->end = NULL; +#endif + + + view->first = 0; view->last = 0; - view->tracker = NULL; - } @@ -181,11 +148,13 @@ static void g_buffer_view_init(GBufferView *view) static void g_buffer_view_dispose(GBufferView *view) { g_clear_object(&view->cache); + g_clear_object(&view->tracker); + g_clear_object(&view->style); +#if 0 g_clear_object(&view->start); g_clear_object(&view->end); - - g_clear_object(&view->tracker); +#endif G_OBJECT_CLASS(g_buffer_view_parent_class)->dispose(G_OBJECT(view)); @@ -206,9 +175,6 @@ static void g_buffer_view_dispose(GBufferView *view) static void g_buffer_view_finalize(GBufferView *view) { - if (view->highlighted != NULL) - unref_segment_content_list(view->highlighted); - G_OBJECT_CLASS(g_buffer_view_parent_class)->finalize(G_OBJECT(view)); } @@ -216,38 +182,25 @@ static void g_buffer_view_finalize(GBufferView *view) /****************************************************************************** * * -* Paramètres : buffer = tampon à représenter à l'écran. * -* highlighted = gestionnaire de surbrillance pour segments. * +* Paramètres : cache = cache de lignes à présenter à la vue. * +* style = modèles de rendus pour tous les types de bribes. * * * -* Description : Crée une nouvelle vue d'un tampon pour code désassemblé. * +* Description : Crée une nouvelle vue d'un tampon de texte. * * * -* Retour : Composant GTK créé. * +* Retour : Vue de tampon mise en place ou NULL en cas d'erreur. * * * * Remarques : - * * * ******************************************************************************/ -GBufferView *g_buffer_view_new(GBufferCache *cache, segcnt_list *highlighted) +GBufferView *g_buffer_view_new(GBufferCache *cache, GTokenStyle *style) { GBufferView *result; /* Composant à retourner */ result = g_object_new(G_TYPE_BUFFER_VIEW, NULL); - result->cache = cache; - g_object_ref_sink(G_OBJECT(cache)); - - g_buffer_view_restrict(result, NULL, NULL); - - g_signal_connect(cache, "size-changed", G_CALLBACK(on_buffer_cache_size_changed), result); - g_signal_connect(cache, "line-updated", G_CALLBACK(on_buffer_cache_line_updated), result); - - if (highlighted != NULL) - { - ref_segment_content_list(highlighted); - result->highlighted = highlighted; - } - else - result->highlighted = init_segment_content_list(); + if (!g_buffer_view_create(result, cache, style)) + g_clear_object(&result); return result; @@ -256,21 +209,50 @@ GBufferView *g_buffer_view_new(GBufferCache *cache, segcnt_list *highlighted) /****************************************************************************** * * -* Paramètres : cache = tampon de lignes cohérentes à manipuler. * -* index = indice de la première ligne actualisée. * +* Paramètres : view = vue de tampon à initialiser. * +* cache = cache de lignes à présenter à la vue. * +* style = modèles de rendus pour tous les types de bribes. * * * -* Description : Réagit à la modification d'une ligne du tampon. * +* Description : Met en place une nouvelle vue pour un tampon de texte. * * * -* Retour : - * +* Retour : Bilan de l'opération. * * * * Remarques : - * * * ******************************************************************************/ -static void on_buffer_cache_line_updated(const GBufferCache *cache, size_t index, GBufferView *view) +bool g_buffer_view_create(GBufferView *view, GBufferCache *cache, GTokenStyle *style) { - if (view->first <= index && index <= view->last) - g_signal_emit_by_name(view, "need-redraw"); + bool result; /* Bilan à retourner */ + + result = true; + + view->cache = cache; + ref_object(cache); + + view->tracker = g_width_tracker_new(cache); + + view->style = style; + ref_object(style); + + g_buffer_view_restrict(view, NULL, NULL); + + g_signal_connect(cache, "size-changed", G_CALLBACK(on_buffer_cache_size_changed), view); + + +#if 0 + g_signal_connect(cache, "line-updated", G_CALLBACK(on_buffer_cache_line_updated), result); + + if (highlighted != NULL) + { + ref_segment_content_list(highlighted); + result->highlighted = highlighted; + } + else + result->highlighted = init_segment_content_list(); +#endif + + return result; } @@ -411,7 +393,32 @@ GBufferCache *g_buffer_view_get_cache(const GBufferView *view) result = view->cache; - g_object_ref(G_OBJECT(result)); + ref_object(result); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : view = visualisateur à consulter. * +* * +* Description : Fournit le collecteur de largeurs associé au tampon lié. * +* * +* Retour : Collecteur de largeurs des lignes du tampon représenté. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GWidthTracker *g_buffer_view_get_tracker(const GBufferView *view) +{ + GWidthTracker *result; /* Instance à retourner */ + + result = view->tracker; + + ref_object(result); return result; @@ -432,10 +439,10 @@ GBufferCache *g_buffer_view_get_cache(const GBufferView *view) * * ******************************************************************************/ -void g_buffer_view_restrict(GBufferView *view, GLineCursor *start, GLineCursor *end) +void g_buffer_view_restrict(GBufferView *view, /*GLineCursor*/void *start, /*GLineCursor*/void *end) { bool state; /* Nouvel état à proclamer */ - GWidthTracker *template; /* Suivi déjà en place */ + //GWidthTracker *template; /* Suivi déjà en place */ state = (start == NULL || end == NULL); @@ -443,11 +450,11 @@ void g_buffer_view_restrict(GBufferView *view, GLineCursor *start, GLineCursor * { view->unrestricted = state; - template = g_buffer_cache_get_width_tracker(view->cache); + //template = g_buffer_cache_get_width_tracker(view->cache); /* Vérification pour le cas particulier du démarrage */ - if (view->tracker != NULL) - g_object_unref(G_OBJECT(view->tracker)); + //if (view->tracker != NULL) + // g_object_unref(G_OBJECT(view->tracker)); g_buffer_cache_rlock(view->cache); @@ -456,12 +463,14 @@ void g_buffer_view_restrict(GBufferView *view, GLineCursor *start, GLineCursor * view->first = 0; view->last = g_buffer_cache_count_lines(view->cache) - 1; - view->tracker = template; + //view->tracker = template; } else { + /* + g_object_ref_sink(G_OBJECT(start)); g_object_ref_sink(G_OBJECT(end)); @@ -475,6 +484,8 @@ void g_buffer_view_restrict(GBufferView *view, GLineCursor *start, GLineCursor * g_object_unref(G_OBJECT(template)); + */ + } g_buffer_cache_runlock(view->cache); @@ -484,6 +495,156 @@ void g_buffer_view_restrict(GBufferView *view, GLineCursor *start, GLineCursor * } + + + + + + +/****************************************************************************** +* * +* Paramètres : view = visualisation à consulter. * +* style = style de rendu pour les bribes de texte. * +* width = largeur requise pour un affichage complet. [OUT] * +* height = hauteur requise pour un affichage complet. [OUT] * +* * +* Description : Détermine la taille nécessaire à une représentation complète.* +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_buffer_view_compute_size(const GBufferView *view, int *width, int *height) +{ + size_t last; /* Dernière ligne à dessiner */ + + /* Largeur de l'ensemble des colonnes */ + + g_width_tracker_compute_width(view->tracker, width); + + /* Hauteur de l'ensemble des lignes */ + + *height = g_token_style_get_line_height(view->style) * (view->last + 1); + +} + + + + + +/****************************************************************************** +* * +* Paramètres : view = visualisation à représenter. * +* cr = contexte graphique dédié à la procédure. * +* column = (première) colonne à traiter. * +* virt_top = ordonnée présentée au point 0 à l'écran. * +* height = hauteur disponible pour les représentations. * +* * +* Description : Imprime la visualisation du tampon de lignes quelconques. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_buffer_view_draw(const GBufferView *view, cairo_t *cr, size_t column, int virt_top, int height) +{ + int line_height; /* Hauteur d'une ligne */ + gint cr_y; /* Ordonnée pour le dessin */ + size_t first; /* Première ligne visée */ + size_t last; /* Dernière ligne visée */ + + line_height = g_token_style_get_line_height(view->style); + + /* Indice et point de départ */ + + first = view->first; + first += (virt_top / line_height); + + cr_y = -(virt_top % line_height); + + /* Indice de d'arrivée */ + + last = first + (height / line_height); + if (height % line_height > 0) last++; + + last = MIN(last, view->last); + + /* Phase de dessin ! */ + + g_buffer_cache_draw(view->cache, cr, column, cr_y, first, last, view->style); + +} + + + + + + + + + + + + + +#if 0 + +#include <assert.h> + + + + +/* Accompagne une variation de la quantité de lignes du tampon. */ +//static void on_buffer_cache_size_changed(const GBufferCache *, bool, size_t, size_t, GBufferView *); + +/* Réagit à la modification d'une ligne du tampon. */ +static void on_buffer_cache_line_updated(const GBufferCache *, size_t, GBufferView *); + +/* Calcule la position idéale de curseur pour un point donné. */ +static bool _g_buffer_view_compute_caret_full(GBufferView *, gint, GBufferLine *, size_t, const GDisplayOptions *, cairo_rectangle_int_t *, GLineCursor **); + +/* Fournit la ligne présente à une ordonnée donnée. */ +static GBufferLine *g_buffer_view_find_line_at(GBufferView *, gint, size_t *); + +/* Déplace le curseur au sein d'une vue de tampon. */ +static bool _g_buffer_view_move_caret(GBufferView *, const GBufferLine *, size_t, cairo_rectangle_int_t *, bool, GdkScrollDirection, const GDisplayOptions *); + + + + + + + + + +/****************************************************************************** +* * +* Paramètres : cache = tampon de lignes cohérentes à manipuler. * +* index = indice de la première ligne actualisée. * +* * +* Description : Réagit à la modification d'une ligne du tampon. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void on_buffer_cache_line_updated(const GBufferCache *cache, size_t index, GBufferView *view) +{ + if (view->first <= index && index <= view->last) + g_signal_emit_by_name(view, "need-redraw"); + +} + + + + + /****************************************************************************** * * * Paramètres : view = visualisateur à consulter. * @@ -1313,3 +1474,44 @@ bool g_buffer_view_get_cursor_coordinates(GBufferView *view, const GLineCursor * return result; } + + + +#endif + + + + + +#if 0 + + +/****************************************************************************** +* * +* Paramètres : view = visualisation à consulter. * +* cursor = emplacement à présenter à l'écran. * +* code = s'arrête si possible à une ligne avec code. * +* x = position horizontale au sein du composant. [OUT] * +* y = position verticale au sein du composant. [OUT] * +* * +* Description : Indique la position d'affichage d'une adresse donnée. * +* * +* Retour : true si l'adresse fait partie du composant, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool g_buffer_view_allocate_widths(GBufferView *view, int width, int height, int fill, int *out) +{ + + + + + + +} + + + +#endif |