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 *); | 
