summaryrefslogtreecommitdiff
path: root/src/glibext/gcodebuffer.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2012-06-24 15:04:46 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2012-06-24 15:04:46 (GMT)
commita4b70be160203f0c0c50e9ba4d8ab07db08bdeb6 (patch)
tree88eff9a8ccb6bcab73ef5a823fef632c38d0a24b /src/glibext/gcodebuffer.c
parent923776410a0b4d847f09428d93101a8b63c9ae60 (diff)
Updated code to prepare the return of graph views.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@245 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/glibext/gcodebuffer.c')
-rw-r--r--src/glibext/gcodebuffer.c140
1 files changed, 128 insertions, 12 deletions
diff --git a/src/glibext/gcodebuffer.c b/src/glibext/gcodebuffer.c
index 3dfb10e..de92b71 100644
--- a/src/glibext/gcodebuffer.c
+++ b/src/glibext/gcodebuffer.c
@@ -118,6 +118,9 @@ static void g_code_buffer_class_init(GCodeBufferClass *);
/* Procède à l'initialisation d'un tampon pour code désassemblé. */
static void g_code_buffer_init(GCodeBuffer *);
+/* Convertit une adresse en indice de ligne. */
+static size_t g_code_buffer_get_index_from_address(GCodeBuffer *, vmpa_t);
+
/* ---------------------- VUE PARTICULIERE D'UN TAMPON DE CODE ---------------------- */
@@ -129,8 +132,8 @@ struct _GBufferView
GObject parent; /* A laisser en premier */
GCodeBuffer *buffer; /* Tampon de code visualisé */
- size_t first; /* Première ligne intégrée */
- size_t last; /* Dernière ligne intégrée */
+ vmpa_t start; /* Première ligne intégrée */
+ vmpa_t end; /* Dernière ligne intégrée */
gint line_height; /* Hauteur maximale des lignes */
gint max_widths[BLC_COUNT]; /* Taille cachée des colonnes */
@@ -273,8 +276,10 @@ static void g_buffer_scan_process(GBufferScan *scan, GtkExtStatusBar *statusbar)
guint id; /* Identifiant de statut */
size_t i; /* Boucle de parcours */
- first = 0;
- last = (scan->buffer->used > 0 ? scan->buffer->used - 1 : 0);
+ /* TODO : lock scan->buffer->lines */
+
+ first = g_code_buffer_get_index_from_address(scan->buffer, scan->start);
+ last = g_code_buffer_get_index_from_address(scan->buffer, scan->end);
lines = scan->buffer->lines;
@@ -290,6 +295,8 @@ static void g_buffer_scan_process(GBufferScan *scan, GtkExtStatusBar *statusbar)
}
+ /* TODO : unlock scan->buffer->lines */
+
gtk_extended_status_bar_remove(statusbar, id);
/* Avertit le commanditaire... */
@@ -366,6 +373,32 @@ GCodeBuffer *g_code_buffer_new(void)
}
+/******************************************************************************
+* *
+* Paramètres : buffer = composant GTK à mettre à jour. *
+* addr = adresse où va se situer la ligne. *
+* *
+* Description : Convertit une adresse en indice de ligne. *
+* *
+* Retour : Indice de l'adresse trouvée, ou buffer->used en cas d'échec, *
+* pour assurer la prise en compte de VMPA_MAX. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static size_t g_code_buffer_get_index_from_address(GCodeBuffer *buffer, vmpa_t addr)
+{
+ size_t result; /* Indice à retourner */
+
+ for (result = 0; result < buffer->used; result++)
+ if (g_buffer_line_get_address(buffer->lines[result]) == addr)
+ break;
+
+ return result;
+
+}
+
/******************************************************************************
* *
@@ -477,7 +510,7 @@ static void g_buffer_view_init(GBufferView *buffer)
/******************************************************************************
* *
-* Paramètres : buffer = tamon à représenter à l'écran. *
+* Paramètres : buffer = tampon à représenter à l'écran. *
* *
* Description : Crée une nouvelle vue d'un tampon pour code désassemblé. *
* *
@@ -493,9 +526,11 @@ GBufferView *g_buffer_view_new(GCodeBuffer *buffer)
result = g_object_new(G_TYPE_BUFFER_VIEW, NULL);
+ g_object_ref(G_OBJECT(buffer));
+
result->buffer = buffer;
- result->first = 0;
- result->last = buffer->used;
+ result->start = 0;
+ result->end = VMPA_MAX;
g_buffer_view_reset_required_widths(result);
@@ -506,6 +541,69 @@ GBufferView *g_buffer_view_new(GCodeBuffer *buffer)
/******************************************************************************
* *
+* Paramètres : view = visualisateur à mettre à jour. *
+* first = première ligne à imprimer. *
+* last = première ligne hors cadre. *
+* *
+* Description : Restreint le champ d'application de l'affichage. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_buffer_view_restrict(GBufferView *view, vmpa_t start, vmpa_t end)
+{
+ view->start = start;
+ view->end = end;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : view = visualisateur à mettre à jour. *
+* first = première ligne à imprimer ou NULL. [OUT] *
+* last = première ligne hors cadre ou NULL. [OUT] *
+* *
+* Description : Indique le champ d'application de l'affichage. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_buffer_view_get_restrictions(GBufferView *view, vmpa_t *start, vmpa_t *end)
+{
+ if (start != NULL) *start = view->start;
+ if (end != NULL) *end = view->end;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : view = visualisateur à consulter. *
+* *
+* Description : Fournit le tampon de code lié à un visualisateur donné. *
+* *
+* Retour : Tampon de code associé au gestionnaire d'affichage. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GCodeBuffer *g_buffer_view_get_buffer(const GBufferView *view)
+{
+ return view->buffer;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : view = visualisation à consulter. *
* *
* Description : Réinitialise le cache des largeurs de colonne calculées. *
@@ -541,18 +639,25 @@ static void g_buffer_view_reset_required_widths(GBufferView *view)
static void g_buffer_view_compute_required_widths(GBufferView *view)
{
GBufferLine **lines; /* Liste des lignes à traiter */
+ size_t first; /* Première ligne intégrée */
+ size_t last; /* Dernière ligne intégrée */
size_t i; /* Boucle de parcours #1 */
unsigned int j; /* Boucle de parcours #2 */
gint width; /* Largeur d'une colonne */
lines = view->buffer->lines;
+ first = g_code_buffer_get_index_from_address(view->buffer, view->start);
+ last = g_code_buffer_get_index_from_address(view->buffer, view->end);
+
+ last = MIN(last, view->buffer->used > 0 ? view->buffer->used - 1 : 0);
+
view->line_height = 17;
view->left_margin = 2 * view->line_height;
view->left_text = 2.5 * view->line_height;
- for (i = view->first; i < view->last; i++)
+ for (i = first; i <= last; i++)
for (j = 0; j < BLC_COUNT; j++)
{
width = g_buffer_line_get_width(lines[i], j);
@@ -603,6 +708,8 @@ gint g_buffer_view_get_line_height(GBufferView *view)
void g_buffer_view_get_size(GBufferView *view, gint *width, gint *height, bool addr, bool code)
{
unsigned int i; /* Boucle de parcours */
+ size_t first; /* Première ligne intégrée */
+ size_t last; /* Dernière ligne intégrée */
*width = 0;
*height = view->line_height;
@@ -619,7 +726,10 @@ void g_buffer_view_get_size(GBufferView *view, gint *width, gint *height, bool a
}
- *height *= (view->last - view->first);
+ first = g_code_buffer_get_index_from_address(view->buffer, view->start);
+ last = g_code_buffer_get_index_from_address(view->buffer, view->end);
+
+ *height *= (last - first);
}
@@ -760,15 +870,21 @@ GBufferLine *g_buffer_view_find_line_at(GBufferView *view, gint y)
bool g_buffer_view_get_address_coordinates(GBufferView *view, vmpa_t addr, gint *x, gint *y)
{
gint lheight; /* Hauteur d'une ligne */
- size_t i; /* Boucle de parcours */
vmpa_t current; /* Adresse parcourue */
+ size_t first; /* Première ligne intégrée */
+ size_t last; /* Dernière ligne intégrée */
+ size_t i; /* Boucle de parcours */
*x = 0;
*y = 0;
lheight = g_buffer_view_get_line_height(view);
+ current = VMPA_MAX;
+
+ first = g_code_buffer_get_index_from_address(view->buffer, view->start);
+ last = g_code_buffer_get_index_from_address(view->buffer, view->end);
- for (i = 0; i < view->buffer->used; i++)
+ for (i = first; i < last; i++)
{
current = g_buffer_line_get_address(view->buffer->lines[i]);
@@ -782,6 +898,6 @@ bool g_buffer_view_get_address_coordinates(GBufferView *view, vmpa_t addr, gint
}
- return true;
+ return (current == addr);
}