diff options
Diffstat (limited to 'src/glibext')
-rw-r--r-- | src/glibext/gcodebuffer.c | 140 | ||||
-rw-r--r-- | src/glibext/gcodebuffer.h | 9 |
2 files changed, 137 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); } diff --git a/src/glibext/gcodebuffer.h b/src/glibext/gcodebuffer.h index 74e376c..3fc6155 100644 --- a/src/glibext/gcodebuffer.h +++ b/src/glibext/gcodebuffer.h @@ -94,6 +94,15 @@ GType g_buffer_view_get_type(void); /* Crée une nouvelle vue d'un tampon pour code désassemblé. */ GBufferView *g_buffer_view_new(GCodeBuffer *); +/* Restreint le champ d'application de l'affichage. */ +void g_buffer_view_restrict(GBufferView *, vmpa_t, vmpa_t); + +/* Indique le champ d'application de l'affichage. */ +void g_buffer_view_get_restrictions(GBufferView *, vmpa_t *, vmpa_t *); + +/* Fournit le tampon de code lié à un visualisateur donné. */ +GCodeBuffer *g_buffer_view_get_buffer(const GBufferView *); + /* Fournit la hauteur d'impression d'une ligne visualisée. */ gint g_buffer_view_get_line_height(GBufferView *); |