summaryrefslogtreecommitdiff
path: root/src/glibext
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2015-05-06 00:07:18 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2015-05-06 00:07:18 (GMT)
commitd76e89e102aacfe945b44eb3150cb9f4bbf7b613 (patch)
tree7dda55fabeddcd0dbd1813d9ceef4b905a056c7f /src/glibext
parent2c6e4f3f3f15d1568e9dae407e32a217d8f7ab19 (diff)
Displayed a tooltip for strings or code symbols in buffer views.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@530 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/glibext')
-rw-r--r--src/glibext/gcodebuffer.c109
-rw-r--r--src/glibext/gcodebuffer.h8
2 files changed, 106 insertions, 11 deletions
diff --git a/src/glibext/gcodebuffer.c b/src/glibext/gcodebuffer.c
index 8633461..c9abf4e 100644
--- a/src/glibext/gcodebuffer.c
+++ b/src/glibext/gcodebuffer.c
@@ -145,8 +145,8 @@ struct _GBufferView
GCodeBuffer *buffer; /* Tampon de code visualisé */
vmpa2t *start; /* Première ligne intégrée */
vmpa2t *end; /* Dernière ligne intégrée */
- size_t first_index; /* Indice de la première ligne */
- size_t last_index; /* Indice de la dernière ligne */
+ size_t first_index; /* Indice de la première ligne */ /* FIXME : utiliser partout ? */
+ size_t last_index; /* Indice de la dernière ligne */ /* FIXME : idem */
gint line_height; /* Hauteur maximale des lignes */
gint max_widths[BLC_COUNT]; /* Taille cachée des colonnes */
@@ -744,6 +744,8 @@ GBufferLine *g_code_buffer_insert_after(GCodeBuffer *buffer, GBufferLine *line)
* *
* Paramètres : buffer = composant GTK à mettre à jour. *
* addr = adresse où retrouver la ligne recherchée. *
+* flags = propriétés à vérifier en tout ou partie. *
+* idx = indice de la ligne trouvée ou NULL. [OUT] *
* *
* Description : Retrouve une ligne au sein d'un tampon avec une adresse. *
* *
@@ -753,7 +755,7 @@ GBufferLine *g_code_buffer_insert_after(GCodeBuffer *buffer, GBufferLine *line)
* *
******************************************************************************/
-GBufferLine *g_code_buffer_find_line_by_addr(const GCodeBuffer *buffer, const vmpa2t *addr)
+GBufferLine *g_code_buffer_find_line_by_addr(const GCodeBuffer *buffer, const vmpa2t *addr, BufferLineFlags flags, size_t *idx)
{
GBufferLine *result; /* Instance à retourner */
size_t index; /* Indice de la ligne visée */
@@ -765,18 +767,24 @@ GBufferLine *g_code_buffer_find_line_by_addr(const GCodeBuffer *buffer, const vm
else
{
+ if (idx != NULL)
+ *idx = index;
+
result = buffer->lines[index];
- while ((g_buffer_line_get_flags(result) & BLF_HAS_CODE) == 0)
- {
- if ((index + 1) == buffer->used) break;
+ if (flags != BLF_NONE)
+ while ((g_buffer_line_get_flags(result) & flags) == 0)
+ {
+ if ((index + 1) == buffer->used) break;
- /* FIXME : vérifier que l'adresse est toujours celle recherchée ! */
- /* TODO : passer la recherche de code en option via argument ? */
+ /* FIXME : vérifier que l'adresse est toujours celle recherchée ! */
- result = buffer->lines[++index];
+ if (idx != NULL)
+ (*idx)++;
- }
+ result = buffer->lines[++index];
+
+ }
g_object_ref(G_OBJECT(result));
@@ -1943,6 +1951,87 @@ void g_buffer_view_export(const GBufferView *view, buffer_export_context *ctx, B
/******************************************************************************
* *
+* Paramètres : view = visualisation à consulter. *
+* addr = adresse où retrouver la ligne recherchée. *
+* flags = propriétés à vérifier en tout ou partie. *
+* idx = indice de la ligne trouvée ou NULL. [OUT] *
+* *
+* Description : Retrouve une ligne au sein d'un tampon avec une adresse. *
+* *
+* Retour : Line retrouvée ou NULL en cas d'échec. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GBufferLine *g_buffer_view_find_line_by_addr(const GBufferView *view, const vmpa2t *addr, BufferLineFlags flags, size_t *idx)
+{
+ GBufferLine *result; /* Ligne trouvée à retourner */
+ phys_t length; /* Taille de la vue */
+ mrange_t vrange; /* Couverture de la vue */
+ bool allowed; /* Rechercher validée ? */
+
+ /* Vérification des bornes */
+
+ if (view->start != NULL/* && view->end != NULL*/)
+ {
+ length = compute_vmpa_diff(view->start, view->end);
+
+ init_mrange(&vrange, view->start, length);
+
+ allowed = mrange_contains_addr_inclusive(&vrange, addr);
+
+ }
+ else allowed = true;
+
+ /* Lancement des recherches ? */
+
+ if (allowed)
+ result = g_code_buffer_find_line_by_addr(view->buffer, addr, flags, idx);
+ else
+ result = NULL;
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : view = visualisation à consulter. *
+* index = indice de la ligne recherchée. *
+* *
+* Description : Retrouve une ligne au sein d'un tampon avec un indice. *
+* *
+* Retour : Line retrouvée ou NULL en cas d'échec. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GBufferLine *g_buffer_view_find_line_by_index(const GBufferView *view, size_t index)
+{
+ GBufferLine *result; /* Ligne trouvée à retourner */
+ bool allowed; /* Rechercher validée ? */
+
+ /* Vérification des bornes */
+
+ allowed = (view->first_index <= index && index < view->last_index);
+
+ /* Lancement des recherches ? */
+
+ if (allowed)
+ result = view->buffer->lines[index];
+ else
+ result = NULL;
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : view = visualisation à consulter. *
* y = ordonnée comprise dans la ligne recherchée. *
* idx = indice de la ligne trouvée ou NULL. [OUT] *
diff --git a/src/glibext/gcodebuffer.h b/src/glibext/gcodebuffer.h
index a248df3..652ea23 100644
--- a/src/glibext/gcodebuffer.h
+++ b/src/glibext/gcodebuffer.h
@@ -70,7 +70,7 @@ GBufferLine *g_code_buffer_insert_at(GCodeBuffer *, vmpa_t, bool);
GBufferLine *g_code_buffer_insert_after(GCodeBuffer *, GBufferLine *);
/* Retrouve une ligne au sein d'un tampon avec une adresse. */
-GBufferLine *g_code_buffer_find_line_by_addr(const GCodeBuffer *, const vmpa2t *);
+GBufferLine *g_code_buffer_find_line_by_addr(const GCodeBuffer *, const vmpa2t *, BufferLineFlags, size_t *);
/* Augmente l'indentation des prochaines lignes. */
void g_code_buffer_inc_indentation(GCodeBuffer *);
@@ -152,6 +152,12 @@ void g_buffer_view_draw(const GBufferView *, cairo_t *, gint, gint, const cairo_
/* Exporte le contenu du tampon de code désassemblé. */
void g_buffer_view_export(const GBufferView *, buffer_export_context *, BufferExportType, const bool *);
+/* Retrouve une ligne au sein d'un tampon avec une adresse. */
+GBufferLine *g_buffer_view_find_line_by_addr(const GBufferView *, const vmpa2t *, BufferLineFlags, size_t *);
+
+/* Retrouve une ligne au sein d'un tampon avec un indice. */
+GBufferLine *g_buffer_view_find_line_by_index(const GBufferView *, size_t );
+
/* Fournit la ligne présente à une ordonnée donnée. */
GBufferLine *g_buffer_view_find_line_at(GBufferView *, gint, size_t *) __attribute__ ((deprecated));