summaryrefslogtreecommitdiff
path: root/src/glibext/bufferview.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/glibext/bufferview.c')
-rw-r--r--src/glibext/bufferview.c380
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