diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/analysis/Makefile.am | 1 | ||||
-rw-r--r-- | src/analysis/binary.c | 101 | ||||
-rw-r--r-- | src/analysis/binary.h | 3 | ||||
-rw-r--r-- | src/analysis/loaded-int.h | 10 | ||||
-rw-r--r-- | src/analysis/loaded.c | 48 | ||||
-rw-r--r-- | src/analysis/loaded.h | 6 | ||||
-rw-r--r-- | src/analysis/roptions.h | 101 | ||||
-rw-r--r-- | src/glibext/Makefile.am | 1 | ||||
-rw-r--r-- | src/glibext/gbuffercache.c | 6 | ||||
-rw-r--r-- | src/glibext/gbuffercache.h | 3 | ||||
-rw-r--r-- | src/glibext/gbufferline.c | 59 | ||||
-rw-r--r-- | src/glibext/gbufferline.h | 11 | ||||
-rw-r--r-- | src/glibext/gbufferview.c | 70 | ||||
-rw-r--r-- | src/glibext/gbufferview.h | 15 | ||||
-rw-r--r-- | src/glibext/gdisplayoptions.c (renamed from src/analysis/roptions.c) | 209 | ||||
-rw-r--r-- | src/glibext/gdisplayoptions.h | 68 | ||||
-rw-r--r-- | src/glibext/glinecursor.h | 6 | ||||
-rw-r--r-- | src/glibext/gwidthtracker.c | 32 | ||||
-rw-r--r-- | src/glibext/gwidthtracker.h | 5 | ||||
-rw-r--r-- | src/gtkext/gtkblockdisplay.c | 8 | ||||
-rw-r--r-- | src/gtkext/gtkbufferdisplay.c | 12 | ||||
-rw-r--r-- | src/gtkext/gtkdisplaypanel-int.h | 2 | ||||
-rw-r--r-- | src/gtkext/gtkdisplaypanel.c | 95 | ||||
-rw-r--r-- | src/gui/menus/view.c | 19 |
24 files changed, 475 insertions, 416 deletions
diff --git a/src/analysis/Makefile.am b/src/analysis/Makefile.am index 20a02b6..3ba21a3 100644 --- a/src/analysis/Makefile.am +++ b/src/analysis/Makefile.am @@ -11,7 +11,6 @@ libanalysis_la_SOURCES = \ loaded.h loaded.c \ loading.h loading.c \ project.h project.c \ - roptions.h roptions.c \ routine.h routine.c \ type-int.h \ type.h type.c \ diff --git a/src/analysis/binary.c b/src/analysis/binary.c index 222bafc..89370b2 100644 --- a/src/analysis/binary.c +++ b/src/analysis/binary.c @@ -89,8 +89,7 @@ struct _GLoadedBinary size_t decbuf_count; /* Taille des tableaux */ size_t defsrc; /* Fichier source principal */ - bool col_display[BVW_COUNT][BLC_DISPLAY];/* Position et code binaire */ - bool lines_display; /* Affichage des lignes */ + GDisplayOptions *options[BVW_COUNT]; /* Options d'affichage */ }; @@ -173,10 +172,7 @@ static GtkWidget *g_loaded_binary_build_view(GLoadedBinary *, unsigned int); static unsigned int g_loaded_binary_get_view_index(GLoadedBinary *, GtkWidget *); /* Fournit toutes les options d'affichage pour un contenu. */ -bool * const g_loaded_binary_get_all_display_options(const GLoadedBinary *, unsigned int); - -/* Définit une option d'affichage pour un contenu chargé. */ -static bool g_loaded_binary_set_display_option(GLoadedBinary *, unsigned int, unsigned int, bool); +static GDisplayOptions *g_loaded_binary_get_display_options(const GLoadedBinary *, unsigned int); @@ -242,14 +238,17 @@ static void g_loaded_binary_init(GLoadedBinary *binary) binary->collections = create_collections_list(); attach_binary_to_collections(binary->collections, binary); - binary->col_display[BVW_BLOCK][BLC_PHYSICAL] = true; - binary->col_display[BVW_BLOCK][BLC_VIRTUAL] = true; - binary->col_display[BVW_BLOCK][BLC_BINARY] = false; - binary->col_display[BVW_GRAPH][BLC_PHYSICAL] = false; - binary->col_display[BVW_GRAPH][BLC_VIRTUAL] = false; - binary->col_display[BVW_GRAPH][BLC_BINARY] = false; + binary->options[BVW_BLOCK] = g_display_options_new(); + + g_display_options_add(binary->options[BVW_BLOCK], _("Physical offset"), true); + g_display_options_add(binary->options[BVW_BLOCK], _("Virtual address"), true); + g_display_options_add(binary->options[BVW_BLOCK], _("Binary code"), false); + + binary->options[BVW_GRAPH] = g_display_options_new(); - binary->lines_display = true; + g_display_options_add(binary->options[BVW_GRAPH], _("Physical offset"), false); + g_display_options_add(binary->options[BVW_GRAPH], _("Virtual address"), false); + g_display_options_add(binary->options[BVW_GRAPH], _("Binary code"), false); } @@ -282,8 +281,7 @@ static void g_loaded_binary_interface_init(GLoadedContentInterface *iface) iface->build_view = (build_loaded_view_fc)g_loaded_binary_build_view; iface->get_view_index = (get_loaded_view_index_fc)g_loaded_binary_get_view_index; - iface->get_all_options = (get_all_loaded_options_fc)g_loaded_binary_get_all_display_options; - iface->set_option = (set_loaded_option_fc)g_loaded_binary_set_display_option; + iface->get_options = (get_loaded_options_fc)g_loaded_binary_get_display_options; } @@ -302,6 +300,8 @@ static void g_loaded_binary_interface_init(GLoadedContentInterface *iface) static void g_loaded_binary_dispose(GLoadedBinary *binary) { + BinaryView i; /* Boucle de parcours */ + if (binary->format != NULL) g_object_unref(G_OBJECT(binary->format)); @@ -310,6 +310,11 @@ static void g_loaded_binary_dispose(GLoadedBinary *binary) /* TODO... */ + + + for (i = 0; i < BVW_COUNT; i++) + g_object_unref(G_OBJECT(binary->options[i])); + G_OBJECT_CLASS(g_loaded_binary_parent_class)->dispose(G_OBJECT(binary)); } @@ -1379,25 +1384,6 @@ GCodeBuffer *g_loaded_binary_get_decompiled_buffer(const GLoadedBinary *binary, #endif -/****************************************************************************** -* * -* Paramètres : binary = élément binaire à consulter. * -* * -* Description : Indique si les lignes doivent apparaître dans le rendu. * -* * -* Retour : Consigne d'affichage. [OUT] * -* * -* Remarques : - * -* * -******************************************************************************/ - -bool *g_loaded_binary_display_decomp_lines(GLoadedBinary *binary) -{ - return &binary->lines_display; - -} - - /* ---------------------------------------------------------------------------------- */ /* GESTION SOUS FORME DE CONTENU CHARGE */ @@ -1536,6 +1522,7 @@ static bool g_loaded_binary_analyze(GLoadedBinary *binary, wgroup_id_t gid, GtkS GBinFormat *format; /* Format lié au binaire */ const char *arch; /* Architecture d'exécution */ const char *desc; /* Description humaine associée*/ + bool has_virt; /* Présence de virtuel ? */ GProcContext *context; /* Contexte de suivi dédié */ GWidthTracker *tracker; /* Gestionnaire de largeur */ @@ -1567,7 +1554,10 @@ static bool g_loaded_binary_analyze(GLoadedBinary *binary, wgroup_id_t gid, GtkS goto glba_exit; } - binary->col_display[BVW_BLOCK][BLC_VIRTUAL] = g_arch_processor_has_virtual_space(binary->proc); + has_virt = g_arch_processor_has_virtual_space(binary->proc); + + g_display_options_set(binary->options[BVW_BLOCK], BLC_VIRTUAL, has_virt); + g_display_options_set(binary->options[BVW_GRAPH], BLC_VIRTUAL, has_virt); /* Phase de désassemblage pur */ @@ -1741,42 +1731,19 @@ static unsigned int g_loaded_binary_get_view_index(GLoadedBinary *binary, GtkWid * * ******************************************************************************/ -bool * const g_loaded_binary_get_all_display_options(const GLoadedBinary *binary, unsigned int index) +static GDisplayOptions *g_loaded_binary_get_display_options(const GLoadedBinary *binary, unsigned int index) { - return binary->col_display[index]; - -} + GDisplayOptions *result; /* Instance à renvoyer */ + assert(index < BVW_COUNT); -/****************************************************************************** -* * -* Paramètres : binary = contenu chargé à consulter. * -* index = composant graphique à cibler. * -* option = type de paramètre à manipuler. * -* state = valeur dudit paramètre. * -* * -* Description : Définit une option d'affichage pour un contenu chargé. * -* * -* Retour : true si un changement a été effectué, false sinon. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static bool g_loaded_binary_set_display_option(GLoadedBinary *binary, unsigned int index, unsigned int option, bool state) -{ - bool result; /* Variation à faire remonter */ - bool old; /* Ancien état à remplacer */ - - old = binary->col_display[index][option]; - - if (state != old) - { - binary->col_display[index][option] = state; - result = true; - } + if (index < BVW_COUNT) + result = binary->options[index]; + else + result = NULL; - else result = false; + if (result != NULL) + g_object_ref(G_OBJECT(result)); return result; diff --git a/src/analysis/binary.h b/src/analysis/binary.h index 906469a..cbaab41 100644 --- a/src/analysis/binary.h +++ b/src/analysis/binary.h @@ -167,9 +167,6 @@ GBufferCache *g_loaded_binary_get_disassembled_cache(const GLoadedBinary *); /* Fournit le tampon associé au contenu d'un fichier source. */ //GCodeBuffer *g_loaded_binary_get_decompiled_buffer(const GLoadedBinary *, size_t); -/* Indique si les lignes doivent apparaître dans le rendu. */ -bool *g_loaded_binary_display_decomp_lines(GLoadedBinary *); - diff --git a/src/analysis/loaded-int.h b/src/analysis/loaded-int.h index 7d4bb19..044dad7 100644 --- a/src/analysis/loaded-int.h +++ b/src/analysis/loaded-int.h @@ -58,10 +58,7 @@ typedef GtkWidget * (* build_loaded_view_fc) (GLoadedContent *, unsigned int); typedef unsigned int (* get_loaded_view_index_fc) (GLoadedContent *, GtkWidget *); /* Fournit toutes les options d'affichage pour un contenu. */ -typedef bool * const (* get_all_loaded_options_fc) (const GLoadedContent *, unsigned int); - -/* Définit une option d'affichage pour un contenu. */ -typedef bool ( * set_loaded_option_fc) (GLoadedContent *, unsigned int, unsigned int, bool); +typedef GDisplayOptions * (* get_loaded_options_fc) (const GLoadedContent *, unsigned int); /* Accès à un contenu binaire quelconque (interface) */ @@ -85,15 +82,12 @@ struct _GLoadedContentIface build_loaded_view_fc build_view; /* Mise en place de vues */ get_loaded_view_index_fc get_view_index;/* Récupération d'indice de vue*/ - get_all_loaded_options_fc get_all_options; /* Obtention de liste brute*/ - set_loaded_option_fc set_option; /* Définition d'affichage */ + get_loaded_options_fc get_options; /* Obtention de liste d'options*/ /* Signaux */ void (* analyzed) (GLoadedContent *, gboolean); - void (* display_changed) (GLoadedContent *, unsigned int, unsigned int); - }; diff --git a/src/analysis/loaded.c b/src/analysis/loaded.c index 5359103..28aea43 100644 --- a/src/analysis/loaded.c +++ b/src/analysis/loaded.c @@ -135,14 +135,6 @@ static void g_loaded_content_default_init(GLoadedContentInterface *iface) g_cclosure_marshal_VOID__BOOLEAN, G_TYPE_NONE, 1, G_TYPE_BOOLEAN); - g_signal_new("display-changed", - G_TYPE_LOADED_CONTENT, - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET(GLoadedContentIface, display_changed), - NULL, NULL, - g_cclosure_user_marshal_VOID__ENUM_ENUM, - G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); - } @@ -471,60 +463,28 @@ unsigned int g_loaded_content_get_view_index(GLoadedContent *content, GtkWidget * * * Description : Fournit toutes les options d'affichage pour un contenu. * * * -* Retour : Tableau de paramètres en accès libre. * +* Retour : Gestionnaire de paramètres. * * * * Remarques : - * * * ******************************************************************************/ -bool * const g_loaded_content_get_all_display_options(const GLoadedContent *content, unsigned int index) +GDisplayOptions *g_loaded_content_get_display_options(const GLoadedContent *content, unsigned int index) { - bool const *result; /* Accès aux options à renvoyer*/ + GDisplayOptions *result; /* Accès aux options à renvoyer*/ GLoadedContentIface *iface; /* Interface utilisée */ assert(index <= g_loaded_content_count_views(content)); iface = G_LOADED_CONTENT_GET_IFACE(content); - result = iface->get_all_options(content, index); + result = iface->get_options(content, index); return result; } -/****************************************************************************** -* * -* Paramètres : content = contenu chargé à consulter. * -* index = composant graphique à cibler. * -* option = type de paramètre à manipuler. * -* state = valeur dudit paramètre. * -* * -* Description : Définit une option d'affichage pour un contenu chargé. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void g_loaded_content_set_display_option(GLoadedContent *content, unsigned int index, unsigned int option, bool state) -{ - GLoadedContentIface *iface; /* Interface utilisée */ - bool changed; /* Note un changement */ - - assert(index <= g_loaded_content_count_views(content)); - - iface = G_LOADED_CONTENT_GET_IFACE(content); - - changed = iface->set_option(content, index, option, state); - - if (changed) - g_signal_emit_by_name(content, "display-changed", index, option); - -} - - /* ---------------------------------------------------------------------------------- */ /* PHASE D'ANALYSE EN PARALLELE */ diff --git a/src/analysis/loaded.h b/src/analysis/loaded.h index 344d102..66d448a 100644 --- a/src/analysis/loaded.h +++ b/src/analysis/loaded.h @@ -32,6 +32,7 @@ #include "content.h" #include "../common/xml.h" +#include "../glibext/gdisplayoptions.h" #include "../gtkext/gtkdockstation.h" @@ -93,10 +94,7 @@ GtkWidget *g_loaded_content_build_view(GLoadedContent *, unsigned int); unsigned int g_loaded_content_get_view_index(GLoadedContent *, GtkWidget *); /* Fournit toutes les options d'affichage pour un contenu. */ -bool * const g_loaded_content_get_all_display_options(const GLoadedContent *, unsigned int); - -/* Définit une option d'affichage pour un contenu chargé. */ -void g_loaded_content_set_display_option(GLoadedContent *, unsigned int, unsigned int, bool); +GDisplayOptions *g_loaded_content_get_display_options(const GLoadedContent *, unsigned int); diff --git a/src/analysis/roptions.h b/src/analysis/roptions.h deleted file mode 100644 index 1f27ff5..0000000 --- a/src/analysis/roptions.h +++ /dev/null @@ -1,101 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * roptions.h - prototypes pour les options de rendus des lignes de code - * - * Copyright (C) 2009-2017 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * Chrysalide is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * Chrysalide is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Chrysalide. If not, see <http://www.gnu.org/licenses/>. - */ - - -#ifndef _ANALYSIS_ROPTIONS_H -#define _ANALYSIS_ROPTIONS_H - - -#include <glib-object.h> -#include <stdbool.h> - - -#include "../arch/processor.h" -#include "../format/executable.h" - - - -/* Support principal de rendu */ -typedef enum _MainRendering -{ - MRD_BLOCK, /* Unique bloc de code */ - MRD_GRAPH, /* Graphique de blocs de code */ - - MRD_COUNT - -} MainRendering; - - -/* Zone de rendu */ -typedef enum _ShowingArea -{ - SAR_ADDRESS, /* Adresse d'une ligne */ - SAR_CODE, /* Code brut d'une ligne */ - SAR_INSTRUCTION, /* Instruction d'une ligne */ - - SAR_COUNT - -} ShowingArea; - - -#define G_TYPE_RENDERING_OPTIONS g_rendering_options_get_type() -#define G_RENDERING_OPTIONS(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_RENDERING_OPTIONS, GRenderingOptions)) -#define G_IS_RENDERING_OPTIONS(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_RENDERING_OPTIONS)) -#define G_RENDERING_OPTIONS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_RENDERING_OPTIONS, GRenderingOptionsClass)) -#define G_IS_RENDERING_OPTIONS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_RENDERING_OPTIONS)) -#define G_RENDERING_OPTIONS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_RENDERING_OPTIONS, GRenderingOptionsClass)) - - -/* Options de représentation (instance) */ -typedef struct _GRenderingOptions GRenderingOptions; - -/* Options de représentation (classe) */ -typedef struct _GRenderingOptionsClass GRenderingOptionsClass; - - -/* Indique le type défini pour des options de représentation. */ -GType g_rendering_options_get_type(void); - -/* Crée un un groupe d'options pour le rendu des lignes. */ -GRenderingOptions *g_rendering_options_new(GExeFormat *); - -/* Fournit le format du contenu binaire représenté. */ -GExeFormat *g_rendering_options_get_format(const GRenderingOptions *); - -/* Fournit l'architecture du contenu binaire représenté. */ -GArchProcessor *g_rendering_options_get_processor(const GRenderingOptions *); - -/* Affiche (ou non) les adresses des instructions. */ -void g_rendering_options_show_address(GRenderingOptions *, MainRendering, bool); - -/* Indique si les adresses des instructions sont à afficher. */ -bool g_rendering_options_has_to_show_address(const GRenderingOptions *, MainRendering); - -/* Affiche (ou non) le code des instructions. */ -void g_rendering_options_show_code(GRenderingOptions *, MainRendering, bool); - -/* Indique si le code des instructions est à afficher. */ -bool g_rendering_options_has_to_show_code(const GRenderingOptions *, MainRendering); - - - -#endif /* _ANALYSIS_ROPTIONS_H */ diff --git a/src/glibext/Makefile.am b/src/glibext/Makefile.am index 9efc138..f2292d9 100644 --- a/src/glibext/Makefile.am +++ b/src/glibext/Makefile.am @@ -13,6 +13,7 @@ libglibext_la_SOURCES = \ gbuffercache.h gbuffercache.c \ gbufferline.h gbufferline.c \ gbufferview.h gbufferview.c \ + gdisplayoptions.h gdisplayoptions.c \ glinecursor-int.h \ glinecursor.h glinecursor.c \ gloadedpanel-int.h \ diff --git a/src/glibext/gbuffercache.c b/src/glibext/gbuffercache.c index 91f3a6d..7293e7c 100644 --- a/src/glibext/gbuffercache.c +++ b/src/glibext/gbuffercache.c @@ -1415,7 +1415,7 @@ void g_buffer_cache_collect_widths(GBufferCache *cache, size_t index, line_width * first = première ligne à dessiner. * * last = dernière ligne à dessiner. * * area = position et surface à traiter. * -* display = règles d'affichage des colonnes modulables. * +* options = règles d'affichage des colonnes modulables. * * selected = ordonnée d'une ligne sélectionnée ou NULL. * * list = liste de contenus à mettre en évidence. * * * @@ -1427,7 +1427,7 @@ void g_buffer_cache_collect_widths(GBufferCache *cache, size_t index, line_width * * ******************************************************************************/ -void g_buffer_cache_draw(const GBufferCache *cache, cairo_t *cr, size_t first, size_t last, const cairo_rectangle_int_t *area, const bool *display, const gint *selected, const segcnt_list *list) +void g_buffer_cache_draw(const GBufferCache *cache, cairo_t *cr, size_t first, size_t last, const cairo_rectangle_int_t *area, const GDisplayOptions *options, const gint *selected, const segcnt_list *list) { GBufferCacheClass *class; /* Classe des tampons */ gint y; /* Point de départ en ordonnée */ @@ -1465,7 +1465,7 @@ void g_buffer_cache_draw(const GBufferCache *cache, cairo_t *cr, size_t first, s line = get_cache_info_line(info, i, cache->content); - g_buffer_line_draw(line, cr, &summary, class->text_pos, y, display, list); + g_buffer_line_draw(line, cr, &summary, class->text_pos, y, options, list); g_object_unref(G_OBJECT(line)); diff --git a/src/glibext/gbuffercache.h b/src/glibext/gbuffercache.h index 453588e..7a0d250 100644 --- a/src/glibext/gbuffercache.h +++ b/src/glibext/gbuffercache.h @@ -30,6 +30,7 @@ #include <gdk/gdk.h> +#include "gdisplayoptions.h" #include "gwidthtracker.h" #include "linegen.h" @@ -102,7 +103,7 @@ GBufferLine *g_buffer_cache_find_line_by_index(const GBufferCache *, size_t); void g_buffer_cache_collect_widths(GBufferCache *, size_t, line_width_summary *); /* Imprime une partie choisie du tampon contenant des lignes. */ -void g_buffer_cache_draw(const GBufferCache *, cairo_t *, size_t, size_t, const cairo_rectangle_int_t *, const bool *, const gint *, const segcnt_list *); +void g_buffer_cache_draw(const GBufferCache *, cairo_t *, size_t, size_t, const cairo_rectangle_int_t *, const GDisplayOptions *, const gint *, const segcnt_list *); /* Indique l'indice correspondant à une adresse donnée. */ size_t _g_buffer_cache_find_index_by_cursor(const GBufferCache *, const GLineCursor *, bool, size_t, size_t); diff --git a/src/glibext/gbufferline.c b/src/glibext/gbufferline.c index 95af21a..39ef0ce 100644 --- a/src/glibext/gbufferline.c +++ b/src/glibext/gbufferline.c @@ -1050,7 +1050,7 @@ const line_segment *g_buffer_line_get_segment_from_coord(const GBufferLine *line * * * Paramètres : line = ligne à venir consulter. * * summary = résumé des largeurs maximales. * -* display = règles d'affichage des colonnes modulables. * +* options = règles d'affichage des colonnes modulables. * * base = position jusqu'au segment trouvé. [OUT] * * offset = position à la colonne visée. [OUT] * * dir = direction d'un éventuel déplacement en cours. * @@ -1065,12 +1065,13 @@ const line_segment *g_buffer_line_get_segment_from_coord(const GBufferLine *line * * ******************************************************************************/ -bool g_buffer_line_get_coord_at(const GBufferLine *line, const line_width_summary *summary, const bool *display, gint *base, gint *offset, GdkScrollDirection dir, bool force, col_coord_t *coord) +bool g_buffer_line_get_coord_at(const GBufferLine *line, const line_width_summary *summary, const GDisplayOptions *options, gint *base, gint *offset, GdkScrollDirection dir, bool force, col_coord_t *coord) { bool result; /* Bilan à retourner */ BufferLineColumn last; /* Dernière colonne remplie */ gint last_base; /* Dernière abscisse associée */ - BufferLineColumn i; /* Boucle de parcours */ + size_t count; /* Qté de colonnes en option */ + size_t i; /* Boucle de parcours */ gint width; /* Largeur d'une colonne donnée*/ gint limit; /* Limite d'appartenance */ gint consumed; /* Distance vers le segment */ @@ -1085,9 +1086,15 @@ bool g_buffer_line_get_coord_at(const GBufferLine *line, const line_width_summar /* On cible déjà la colonne idéale */ + count = g_display_options_count(options); + for (i = 0; i < BLC_COUNT; i++) { - if (i < BLC_DISPLAY && !display[i]) continue; + if (i < count) + { + if (!g_display_options_get(options, i)) + continue; + } /* Mémorisation de la dernière colonne contenant quelque chose... */ if (get_column_width(&line->columns[i]) > 0) @@ -1249,7 +1256,7 @@ bool g_buffer_line_get_coord_at(const GBufferLine *line, const line_width_summar * * * Paramètres : line = ligne à venir consulter. * * summary = résumé des largeurs maximales. * -* display = règles d'affichage des colonnes modulables. * +* options = règles d'affichage des colonnes modulables. * * base = position jusqu'au segment trouvé. [OUT] * * offset = position à la colonne visée. [OUT] * * dir = direction d'un éventuel déplacement en cours. * @@ -1263,13 +1270,13 @@ bool g_buffer_line_get_coord_at(const GBufferLine *line, const line_width_summar * * ******************************************************************************/ -const line_segment *g_buffer_line_get_segment_at(const GBufferLine *line, const line_width_summary *summary, const bool *display, gint *base, gint *offset, GdkScrollDirection dir, bool force) +const line_segment *g_buffer_line_get_segment_at(const GBufferLine *line, const line_width_summary *summary, const GDisplayOptions *options, gint *base, gint *offset, GdkScrollDirection dir, bool force) { const line_segment *result; /* Trouvaille à retourner */ col_coord_t coord; /* Emplacement du contenu visé */ bool status; /* Bilan de la localisation */ - status = g_buffer_line_get_coord_at(line, summary, display, base, offset, dir, force, &coord); + status = g_buffer_line_get_coord_at(line, summary, options, base, offset, dir, force, &coord); if (status) result = g_buffer_line_get_segment_from_coord(line, &coord); @@ -1285,7 +1292,7 @@ const line_segment *g_buffer_line_get_segment_at(const GBufferLine *line, const * * * Paramètres : line = ligne à venir consulter. * * summary = résumé des largeurs maximales. * -* display = règles d'affichage des colonnes modulables. * +* options = règles d'affichage des colonnes modulables. * * base = position jusqu'au segment trouvé. [OUT] * * offset = position à la colonne visée. [OUT] * * dir = direction d'un éventuel déplacement en cours. * @@ -1299,7 +1306,7 @@ const line_segment *g_buffer_line_get_segment_at(const GBufferLine *line, const * * ******************************************************************************/ -GObject *g_buffer_line_get_creator_at(const GBufferLine *line, const line_width_summary *summary, const bool *display, gint *base, gint *offset, GdkScrollDirection dir, bool force) +GObject *g_buffer_line_get_creator_at(const GBufferLine *line, const line_width_summary *summary, const GDisplayOptions *options, gint *base, gint *offset, GdkScrollDirection dir, bool force) { GObject *result; /* Trouvaille à retourner */ col_coord_t target; /* Emplacement du contenu visé */ @@ -1309,7 +1316,7 @@ GObject *g_buffer_line_get_creator_at(const GBufferLine *line, const line_width_ result = NULL; - status = g_buffer_line_get_coord_at(line, summary, display, base, offset, dir, force, &target); + status = g_buffer_line_get_coord_at(line, summary, options, base, offset, dir, force, &target); if (status) { @@ -1337,7 +1344,7 @@ GObject *g_buffer_line_get_creator_at(const GBufferLine *line, const line_width_ * Paramètres : line = ligne à venir consulter. * * coord = cordonnées à consulter puis renseigner. [OUT] * * summary = résumé des largeurs maximales. * -* display = règles d'affichage des colonnes modulables. * +* options = règles d'affichage des colonnes modulables. * * dir = orientation des recherches. * * offset = décalage pour amener à l'extrémité nouvelle. [OUT] * * * @@ -1349,12 +1356,13 @@ GObject *g_buffer_line_get_creator_at(const GBufferLine *line, const line_width_ * * ******************************************************************************/ -bool g_buffer_line_find_near_coord(const GBufferLine *line, col_coord_t *coord, const line_width_summary *summary, const bool *display, GdkScrollDirection dir, gint *offset) +bool g_buffer_line_find_near_coord(const GBufferLine *line, col_coord_t *coord, const line_width_summary *summary, const GDisplayOptions *options, GdkScrollDirection dir, gint *offset) { bool result; /* Bilan à retourner */ - BufferLineColumn i; /* Boucle de parcours #1 */ + size_t count; /* Qté de colonnes en option */ + size_t i; /* Boucle de parcours #1 */ bool displayed; /* Confort de lecture */ - BufferLineColumn k; /* Boucle de parcours #2 */ + size_t k; /* Boucle de parcours #2 */ gint width; /* Largeur d'une colonne donnée*/ result = false; @@ -1369,6 +1377,8 @@ bool g_buffer_line_find_near_coord(const GBufferLine *line, col_coord_t *coord, /* Recherche dans la direction des colonnes voisines */ + count = g_display_options_count(options); + if (!result) switch (dir) { @@ -1380,7 +1390,7 @@ bool g_buffer_line_find_near_coord(const GBufferLine *line, col_coord_t *coord, /* On s'assure que la colonne précédente est visible et peuplée */ for (; i > BLC_FIRST && !result; i--) { - displayed = (i <= BLC_DISPLAY ? display[i - 1] : true); + displayed = (i <= count ? g_display_options_get(options, i - 1) : true); if (displayed) { @@ -1400,7 +1410,7 @@ bool g_buffer_line_find_near_coord(const GBufferLine *line, col_coord_t *coord, /* On s'assure que la colonne suivante est visible et peuplée */ for (; (i + 1) < BLC_COUNT && !result; i++) { - displayed = ((i + 1) < BLC_DISPLAY ? display[i + 1] : true); + displayed = ((i + 1) < count ? g_display_options_get(options, i + 1) : true); if (displayed) { @@ -1428,7 +1438,7 @@ bool g_buffer_line_find_near_coord(const GBufferLine *line, col_coord_t *coord, for (k = 0; k < i; k++) { - displayed = (k < BLC_DISPLAY ? display[k] : true); + displayed = (k < count ? g_display_options_get(options, k) : true); if (displayed) { @@ -1473,7 +1483,7 @@ bool g_buffer_line_find_near_coord(const GBufferLine *line, col_coord_t *coord, * summary = résumé des largeurs maximales. * * x_init = abscisse du point d'impression de départ. * * y = ordonnée du point d'impression. * -* display = règles d'affichage des colonnes modulables. * +* options = règles d'affichage des colonnes modulables. * * list = liste de contenus à mettre en évidence. * * * * Description : Imprime la ligne de texte représentée. * @@ -1484,12 +1494,13 @@ bool g_buffer_line_find_near_coord(const GBufferLine *line, col_coord_t *coord, * * ******************************************************************************/ -void g_buffer_line_draw(GBufferLine *line, cairo_t *cairo, const line_width_summary *summary, gint x_init, gint y, const bool *display, const segcnt_list *list) +void g_buffer_line_draw(GBufferLine *line, cairo_t *cairo, const line_width_summary *summary, gint x_init, gint y, const GDisplayOptions *options, const segcnt_list *list) { GBufferLineClass *class; /* Stockage de briques de base */ bool has_src_surface; /* Note une présence définie */ gint x; /* Point de départ d'impression*/ - BufferLineColumn i; /* Boucle de parcours */ + size_t count; /* Qté de colonnes en option */ + size_t i; /* Boucle de parcours */ gint max_width; /* Largeur maximale de colonne */ if (line->flags != BLF_NONE && line->flags != BLF_HAS_CODE) @@ -1516,9 +1527,15 @@ void g_buffer_line_draw(GBufferLine *line, cairo_t *cairo, const line_width_summ x = x_init; + count = g_display_options_count(options); + for (i = 0; i < BLC_COUNT; i++) { - if (i < BLC_DISPLAY && !display[i]) continue; + if (i < count) + { + if (!g_display_options_get(options, i)) + continue; + } draw_line_column_segments(&line->columns[i], cairo, x, y, list); diff --git a/src/glibext/gbufferline.h b/src/glibext/gbufferline.h index 835c0dd..21b3ec9 100644 --- a/src/glibext/gbufferline.h +++ b/src/glibext/gbufferline.h @@ -29,6 +29,7 @@ #include <stdbool.h> +#include "gdisplayoptions.h" #include "linesegment.h" #include "../analysis/content.h" #include "../arch/vmpa.h" @@ -198,19 +199,19 @@ gint g_buffer_line_compute_max_width(const GBufferLine *, BufferLineColumn, cons const line_segment *g_buffer_line_get_segment_from_coord(const GBufferLine *, const col_coord_t *); /* Fournit les coordonnées correspondant à une abscisse donnée. */ -bool g_buffer_line_get_coord_at(const GBufferLine *, const line_width_summary *, const bool *, gint *, gint *, GdkScrollDirection, bool, col_coord_t *); +bool g_buffer_line_get_coord_at(const GBufferLine *, const line_width_summary *, const GDisplayOptions *, gint *, gint *, GdkScrollDirection, bool, col_coord_t *); /* Donne le segment présent à une abscisse donnée. */ -const line_segment *g_buffer_line_get_segment_at(const GBufferLine *, const line_width_summary *, const bool *, gint *, gint *, GdkScrollDirection, bool); +const line_segment *g_buffer_line_get_segment_at(const GBufferLine *, const line_width_summary *, const GDisplayOptions *, gint *, gint *, GdkScrollDirection, bool); /* Donne le créateur présent à une abscisse donnée. */ -GObject *g_buffer_line_get_creator_at(const GBufferLine *, const line_width_summary *, const bool *, gint *, gint *, GdkScrollDirection, bool); +GObject *g_buffer_line_get_creator_at(const GBufferLine *, const line_width_summary *, const GDisplayOptions *, gint *, gint *, GdkScrollDirection, bool); /* Fournit des coordonnées voisines selon une direction donnée. */ -bool g_buffer_line_find_near_coord(const GBufferLine *, col_coord_t *, const line_width_summary *, const bool *, GdkScrollDirection, gint *); +bool g_buffer_line_find_near_coord(const GBufferLine *, col_coord_t *, const line_width_summary *, const GDisplayOptions *, GdkScrollDirection, gint *); /* Imprime la ligne de texte représentée. */ -void g_buffer_line_draw(GBufferLine *, cairo_t *, const line_width_summary *, gint, gint, const bool *, const segcnt_list *); +void g_buffer_line_draw(GBufferLine *, cairo_t *, const line_width_summary *, gint, gint, const GDisplayOptions *, const segcnt_list *); diff --git a/src/glibext/gbufferview.c b/src/glibext/gbufferview.c index c5bd81e..f3b0147 100644 --- a/src/glibext/gbufferview.c +++ b/src/glibext/gbufferview.c @@ -77,10 +77,10 @@ static void g_buffer_view_finalize(GBufferView *); static void on_buffer_cache_size_changed(const GBufferCache *, bool, size_t, size_t, GBufferView *); /* Calcule la position idéale de curseur pour un point donné. */ -bool _g_buffer_view_compute_caret_full(GBufferView *, gint, GBufferLine *, size_t, const bool *, cairo_rectangle_int_t *, GLineCursor **); +bool _g_buffer_view_compute_caret_full(GBufferView *, gint, GBufferLine *, size_t, const GDisplayOptions *, cairo_rectangle_int_t *, GLineCursor **); /* 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 bool *); +static bool _g_buffer_view_move_caret(GBufferView *, const GBufferLine *, size_t, cairo_rectangle_int_t *, bool, GdkScrollDirection, const GDisplayOptions *); /* Fournit la ligne présente à une ordonnée donnée. */ @@ -488,7 +488,7 @@ bool g_buffer_view_get_restrictions(const GBufferView *view, GLineCursor **start /****************************************************************************** * * * Paramètres : view = visualisation à consulter. * -* display = règles d'affichage des colonnes modulables. * +* options = règles d'affichage des colonnes modulables. * * * * Description : Fournit la largeur requise par une visualisation. * * * @@ -498,13 +498,13 @@ bool g_buffer_view_get_restrictions(const GBufferView *view, GLineCursor **start * * ******************************************************************************/ -gint g_buffer_view_get_width(GBufferView *view, const bool *display) +gint g_buffer_view_get_width(GBufferView *view, const GDisplayOptions *options) { gint result; /* Taille à retourner */ result = g_buffer_cache_get_text_position(view->cache); - result += g_width_tracker_get_width(view->tracker, display); + result += g_width_tracker_get_width(view->tracker, options); return result; @@ -514,7 +514,7 @@ gint g_buffer_view_get_width(GBufferView *view, const bool *display) /****************************************************************************** * * * Paramètres : view = visualisation à consulter. * -* display = règles d'affichage des colonnes modulables. * +* options = règles d'affichage des colonnes modulables. * * * * Description : Fournit la largeur requise pour dépasser les marges gauches. * * * @@ -524,13 +524,13 @@ gint g_buffer_view_get_width(GBufferView *view, const bool *display) * * ******************************************************************************/ -gint g_buffer_view_get_margin(GBufferView *view, const bool *display) +gint g_buffer_view_get_margin(GBufferView *view, const GDisplayOptions *options) { gint result; /* Taille à retourner */ result = g_buffer_cache_get_text_position(view->cache); - result += g_width_tracker_get_margin(view->tracker, display); + result += g_width_tracker_get_margin(view->tracker, options); return result; @@ -578,7 +578,7 @@ gint g_buffer_view_get_height(const GBufferView *view) * Paramètres : view = vue de tampon à mettre à jour. * * x = abscisse proposée pour le nouvel emplacement. * * y = ordonnée proposée pour le nouvel emplacement. * -* display = règles d'affichage des colonnes modulables. * +* options = règles d'affichage des colonnes modulables. * * caret = position du curseur à construire. [OUT] * * cursor = emplacement correspondant à cette position. [OUT] * * * @@ -590,7 +590,7 @@ gint g_buffer_view_get_height(const GBufferView *view) * * ******************************************************************************/ -bool g_buffer_view_compute_caret_full(GBufferView *view, gint x, gint y, const bool *display, cairo_rectangle_int_t *caret, GLineCursor **cursor) +bool g_buffer_view_compute_caret_full(GBufferView *view, gint x, gint y, const GDisplayOptions *options, cairo_rectangle_int_t *caret, GLineCursor **cursor) { bool result; /* Bilan à retourner */ gint lheight; /* Hauteur d'une ligne */ @@ -615,7 +615,7 @@ bool g_buffer_view_compute_caret_full(GBufferView *view, gint x, gint y, const b /* Calcul d'une position */ - result = _g_buffer_view_compute_caret_full(view, x, line, index, display, caret, cursor); + result = _g_buffer_view_compute_caret_full(view, x, line, index, options, caret, cursor); g_object_unref(G_OBJECT(line)); @@ -632,7 +632,7 @@ bool g_buffer_view_compute_caret_full(GBufferView *view, gint x, gint y, const b * x = abscisse proposée pour le nouvel emplacement. * * line = ligne correspondant à la position. * * index = indice de cette même ligne dans le tampon. * -* display = règles d'affichage des colonnes modulables. * +* options = règles d'affichage des colonnes modulables. * * caret = position du curseur à construire. [OUT] * * cursor = emplacement correspondant à cette position. [OUT] * * * @@ -644,7 +644,7 @@ bool g_buffer_view_compute_caret_full(GBufferView *view, gint x, gint y, const b * * ******************************************************************************/ -bool _g_buffer_view_compute_caret_full(GBufferView *view, gint x, GBufferLine *line, size_t index, const bool *display, cairo_rectangle_int_t *caret, GLineCursor **cursor) +bool _g_buffer_view_compute_caret_full(GBufferView *view, gint x, GBufferLine *line, size_t index, const GDisplayOptions *options, cairo_rectangle_int_t *caret, GLineCursor **cursor) { bool result; /* Bilan à retourner */ gint text_pos; /* Abscisse de départ du texte */ @@ -668,7 +668,7 @@ bool _g_buffer_view_compute_caret_full(GBufferView *view, gint x, GBufferLine *l x -= text_pos; - status = g_buffer_line_get_coord_at(line, &summary, display, &base, &x, + status = g_buffer_line_get_coord_at(line, &summary, options, &base, &x, GDK_SCROLL_LEFT, true, (col_coord_t []) { { 0 } }); if (!status) @@ -704,7 +704,7 @@ bool _g_buffer_view_compute_caret_full(GBufferView *view, gint x, GBufferLine *l * caret = position du curseur à faire évoluer. * * ctrl = indique la demande d'un parcours rapide. * * dir = direction du parcours. * -* display = règles d'affichage des colonnes modulables. * +* options = règles d'affichage des colonnes modulables. * * * * Description : Déplace le curseur au sein d'une vue de tampon. * * * @@ -714,7 +714,7 @@ bool _g_buffer_view_compute_caret_full(GBufferView *view, gint x, GBufferLine *l * * ******************************************************************************/ -static bool _g_buffer_view_move_caret(GBufferView *view, const GBufferLine *line, size_t index, cairo_rectangle_int_t *caret, bool ctrl, GdkScrollDirection dir, const bool *display) +static bool _g_buffer_view_move_caret(GBufferView *view, const GBufferLine *line, size_t index, cairo_rectangle_int_t *caret, bool ctrl, GdkScrollDirection dir, const GDisplayOptions *options) { bool result; /* Bilan à retourner */ gint text_pos; /* Abscisse de départ du texte */ @@ -740,7 +740,7 @@ static bool _g_buffer_view_move_caret(GBufferView *view, const GBufferLine *line /* Déplacement au sein du segment courant ? */ - result = g_buffer_line_get_coord_at(line, &summary, display, &base, &offset, dir, false, &coord); + result = g_buffer_line_get_coord_at(line, &summary, options, &base, &offset, dir, false, &coord); if (result) { @@ -756,7 +756,7 @@ static bool _g_buffer_view_move_caret(GBufferView *view, const GBufferLine *line { base = 0; - result = g_buffer_line_find_near_coord(line, &coord, &summary, display, dir, &offset); + result = g_buffer_line_find_near_coord(line, &coord, &summary, options, dir, &offset); } @@ -777,7 +777,7 @@ static bool _g_buffer_view_move_caret(GBufferView *view, const GBufferLine *line * Paramètres : view = vue de tampon à mettre à jour. * * ctrl = indique la demande d'un parcours rapide. * * dir = direction du parcours. * -* display = règles d'affichage des colonnes modulables. * +* options = règles d'affichage des colonnes modulables. * * caret = position du curseur à faire évoluer. [OUT] * * cursor = emplacement correspondant à cette position. [OUT] * * * @@ -789,7 +789,7 @@ static bool _g_buffer_view_move_caret(GBufferView *view, const GBufferLine *line * * ******************************************************************************/ -bool g_buffer_view_move_caret(GBufferView *view, bool ctrl, GdkScrollDirection dir, const bool *display, cairo_rectangle_int_t *caret, GLineCursor **cursor) +bool g_buffer_view_move_caret(GBufferView *view, bool ctrl, GdkScrollDirection dir, const GDisplayOptions *options, cairo_rectangle_int_t *caret, GLineCursor **cursor) { bool result; /* Bilan à retourner */ size_t index; /* Indice de ligne de tampon */ @@ -817,7 +817,7 @@ bool g_buffer_view_move_caret(GBufferView *view, bool ctrl, GdkScrollDirection d index--; other = g_buffer_cache_find_line_by_index(view->cache, index); - result = _g_buffer_view_compute_caret_full(view, caret->x, other, index, display, caret, cursor); + result = _g_buffer_view_compute_caret_full(view, caret->x, other, index, options, caret, cursor); g_object_unref(G_OBJECT(other)); } @@ -831,7 +831,7 @@ bool g_buffer_view_move_caret(GBufferView *view, bool ctrl, GdkScrollDirection d index++; other = g_buffer_cache_find_line_by_index(view->cache, index); - result = _g_buffer_view_compute_caret_full(view, caret->x, other, index, display, caret, cursor); + result = _g_buffer_view_compute_caret_full(view, caret->x, other, index, options, caret, cursor); g_object_unref(G_OBJECT(other)); } @@ -840,7 +840,7 @@ bool g_buffer_view_move_caret(GBufferView *view, bool ctrl, GdkScrollDirection d case GDK_SCROLL_LEFT: - moved = _g_buffer_view_move_caret(view, line, index, caret, ctrl, GDK_SCROLL_LEFT, display); + moved = _g_buffer_view_move_caret(view, line, index, caret, ctrl, GDK_SCROLL_LEFT, options); if (moved) { @@ -853,7 +853,7 @@ bool g_buffer_view_move_caret(GBufferView *view, bool ctrl, GdkScrollDirection d index--; other = g_buffer_cache_find_line_by_index(view->cache, index); - result = _g_buffer_view_compute_caret_full(view, INT_MAX, other, index, display, caret, cursor); + result = _g_buffer_view_compute_caret_full(view, INT_MAX, other, index, options, caret, cursor); g_object_unref(G_OBJECT(other)); } @@ -862,7 +862,7 @@ bool g_buffer_view_move_caret(GBufferView *view, bool ctrl, GdkScrollDirection d case GDK_SCROLL_RIGHT: - moved = _g_buffer_view_move_caret(view, line, index, caret, ctrl, GDK_SCROLL_RIGHT, display); + moved = _g_buffer_view_move_caret(view, line, index, caret, ctrl, GDK_SCROLL_RIGHT, options); if (moved) { @@ -877,7 +877,7 @@ bool g_buffer_view_move_caret(GBufferView *view, bool ctrl, GdkScrollDirection d text_pos = g_buffer_cache_get_text_position(view->cache); other = g_buffer_cache_find_line_by_index(view->cache, index); - result = _g_buffer_view_compute_caret_full(view, text_pos, other, index, display, caret, cursor); + result = _g_buffer_view_compute_caret_full(view, text_pos, other, index, options, caret, cursor); g_object_unref(G_OBJECT(other)); } @@ -909,7 +909,7 @@ bool g_buffer_view_move_caret(GBufferView *view, bool ctrl, GdkScrollDirection d * Paramètres : view = vue de tampon à mettre à jour. * * x = abscisse de la zone principale à traiter. * * y = ordonnée de la zone principale à traiter. * -* display = règles d'affichage des colonnes modulables. * +* options = règles d'affichage des colonnes modulables. * * * * Description : Trouve le créateur à l'origine d'un emplacement donné. * * * @@ -919,7 +919,7 @@ bool g_buffer_view_move_caret(GBufferView *view, bool ctrl, GdkScrollDirection d * * ******************************************************************************/ -GObject *g_buffer_view_find_creator(GBufferView *view, gint x, gint y, const bool *display) +GObject *g_buffer_view_find_creator(GBufferView *view, gint x, gint y, const GDisplayOptions *options) { GObject *result; /* Trouvaille à faire remonter */ gint text_pos; /* Abscisse de départ du texte */ @@ -957,7 +957,7 @@ GObject *g_buffer_view_find_creator(GBufferView *view, gint x, gint y, const boo x -= text_pos; - result = g_buffer_line_get_creator_at(line, &summary, display, (gint []) { 0 }, &x, GDK_SCROLL_LEFT, false); + result = g_buffer_line_get_creator_at(line, &summary, options, (gint []) { 0 }, &x, GDK_SCROLL_LEFT, false); g_object_unref(G_OBJECT(line)); @@ -1002,7 +1002,7 @@ bool g_buffer_view_unhighlight_segments(GBufferView *view) * Paramètres : view = vue de tampon à mettre à jour. * * x = abscisse de la zone principale à traiter. * * y = ordonnée de la zone principale à traiter. * -* display = règles d'affichage des colonnes modulables. * +* options = règles d'affichage des colonnes modulables. * * * * Description : Surligne tous les segments similaires à celui sous la souris.* * * @@ -1012,7 +1012,7 @@ bool g_buffer_view_unhighlight_segments(GBufferView *view) * * ******************************************************************************/ -bool g_buffer_view_highlight_segments(GBufferView *view, gint x, gint y, const bool *display) +bool g_buffer_view_highlight_segments(GBufferView *view, gint x, gint y, const GDisplayOptions *options) { bool result; /* Besoin à faire remonter */ gint text_pos; /* Abscisse de départ du texte */ @@ -1056,7 +1056,7 @@ bool g_buffer_view_highlight_segments(GBufferView *view, gint x, gint y, const b x -= text_pos; - segment = g_buffer_line_get_segment_at(line, &summary, display, + segment = g_buffer_line_get_segment_at(line, &summary, options, (gint []) { 0 }, &x, GDK_SCROLL_LEFT, true); g_object_unref(G_OBJECT(line)); @@ -1082,7 +1082,7 @@ bool g_buffer_view_highlight_segments(GBufferView *view, gint x, gint y, const b * cr = contexte graphique dédié à la procédure. * * virt_y = ordonnée réelle du point 0 à l'écran. * * area = position et surface à traiter. * -* display = règles d'affichage des colonnes modulables. * +* options = règles d'affichage des colonnes modulables. * * selected = ordonnée d'une ligne sélectionnée ou NULL. * * * * Description : Imprime la visualisation du tampon de lignes quelconques. * @@ -1093,7 +1093,7 @@ bool g_buffer_view_highlight_segments(GBufferView *view, gint x, gint y, const b * * ******************************************************************************/ -void g_buffer_view_draw(const GBufferView *view, cairo_t *cr, gint virt_y, const cairo_rectangle_int_t *area, const bool *display, gint *selected) +void g_buffer_view_draw(const GBufferView *view, cairo_t *cr, gint virt_y, const cairo_rectangle_int_t *area, const GDisplayOptions *options, gint *selected) { gint line_height; /* Hauteur d'une ligne */ gint cr_y; /* Ordonnée pour le dessin */ @@ -1128,7 +1128,7 @@ void g_buffer_view_draw(const GBufferView *view, cairo_t *cr, gint virt_y, const if (selected != NULL) *selected -= cr_y; - g_buffer_cache_draw(view->cache, cr, first, last, area, display, selected, view->highlighted); + g_buffer_cache_draw(view->cache, cr, first, last, area, options, selected, view->highlighted); } diff --git a/src/glibext/gbufferview.h b/src/glibext/gbufferview.h index 6b5ef45..04e4bbb 100644 --- a/src/glibext/gbufferview.h +++ b/src/glibext/gbufferview.h @@ -29,6 +29,7 @@ #include "gbuffercache.h" +#include "gdisplayoptions.h" @@ -65,10 +66,10 @@ bool g_buffer_view_get_restrictions(const GBufferView *, GLineCursor **, GLineCu /* Fournit la largeur requise par une visualisation. */ -gint g_buffer_view_get_width(GBufferView *, const bool *); +gint g_buffer_view_get_width(GBufferView *, const GDisplayOptions *); /* Fournit la largeur requise pour dépasser les marges gauches. */ -gint g_buffer_view_get_margin(GBufferView *, const bool *); +gint g_buffer_view_get_margin(GBufferView *, const GDisplayOptions *); /* Fournit la hauteur requise par une visualisation. */ gint g_buffer_view_get_height(const GBufferView *); @@ -78,15 +79,15 @@ gint g_buffer_view_get_height(const GBufferView *); /* Calcule la position idéale de curseur pour un point donné. */ -bool g_buffer_view_compute_caret_full(GBufferView *, gint, gint, const bool *, cairo_rectangle_int_t *, GLineCursor **); +bool g_buffer_view_compute_caret_full(GBufferView *, gint, gint, const GDisplayOptions *, cairo_rectangle_int_t *, GLineCursor **); /* Déplace le curseur au sein d'une vue de tampon. */ -bool g_buffer_view_move_caret(GBufferView *, bool, GdkScrollDirection, const bool *, cairo_rectangle_int_t *, GLineCursor **); +bool g_buffer_view_move_caret(GBufferView *, bool, GdkScrollDirection, const GDisplayOptions *, cairo_rectangle_int_t *, GLineCursor **); /* Trouve le créateur à l'origine d'un emplacement donné. */ -GObject *g_buffer_view_find_creator(GBufferView *, gint, gint, const bool *); +GObject *g_buffer_view_find_creator(GBufferView *, gint, gint, const GDisplayOptions *); @@ -94,10 +95,10 @@ GObject *g_buffer_view_find_creator(GBufferView *, gint, gint, const bool *); bool g_buffer_view_unhighlight_segments(GBufferView *); /* Surligne tous les segments similaires à celui sous la souris. */ -bool g_buffer_view_highlight_segments(GBufferView *, gint, gint, const bool *); +bool g_buffer_view_highlight_segments(GBufferView *, gint, gint, const GDisplayOptions *); /* Imprime la visualisation du tampon de lignes quelconques. */ -void g_buffer_view_draw(const GBufferView *, cairo_t *, gint, const cairo_rectangle_int_t *, const bool *, gint *); +void g_buffer_view_draw(const GBufferView *, cairo_t *, gint, const cairo_rectangle_int_t *, const GDisplayOptions *, gint *); diff --git a/src/analysis/roptions.c b/src/glibext/gdisplayoptions.c index b9e4b96..8641f59 100644 --- a/src/analysis/roptions.c +++ b/src/glibext/gdisplayoptions.c @@ -1,8 +1,8 @@ /* Chrysalide - Outil d'analyse de fichiers binaires - * roptions.c - options de rendus des lignes de code + * gdisplayoptions.h - options de rendus des lignes de code * - * Copyright (C) 2009-2017 Cyrille Bagard + * Copyright (C) 2018 Cyrille Bagard * * This file is part of Chrysalide. * @@ -21,39 +21,57 @@ */ -#include "roptions.h" +#include "gdisplayoptions.h" + + +#include <assert.h> +#include <malloc.h> +#include <string.h> + + +#include "chrysamarshal.h" /* Options de représentation (instance) */ -struct _GRenderingOptions +struct _GDisplayOptions { - GExeFormat *format; /* Format du contenu bianire */ - GArchProcessor *proc; /* Architecture utilisée */ + GObject parent; /* A laisser en premier */ - bool show_address[MRD_COUNT]; /* Affichage de l'adresse ? */ - bool show_code[MRD_COUNT]; /* Affichage du code brut ? */ + char **names; /* Désignations des options */ + bool *values; /* Valeurs des options */ + size_t count; /* Nombre de ces options */ }; /* Options de représentation (classe) */ -struct _GRenderingOptionsClass +struct _GDisplayOptionsClass { GObjectClass parent; /* A laisser en premier */ + /* Signaux */ + + void (* value_changed) (const GDisplayOptions *, gsize, gboolean); + }; /* Initialise la classe des options pour le rendu des lignes. */ -static void g_rendering_options_class_init(GRenderingOptionsClass *); +static void g_display_options_class_init(GDisplayOptionsClass *); /* Initialise une instance d'options pour le rendu des lignes. */ -static void g_rendering_options_init(GRenderingOptions *); +static void g_display_options_init(GDisplayOptions *); + +/* Supprime toutes les références externes. */ +static void g_display_options_dispose(GDisplayOptions *); + +/* Procède à la libération totale de la mémoire. */ +static void g_display_options_finalize(GDisplayOptions *); /* Indique le type définit pour une ligne de représentation. */ -G_DEFINE_TYPE(GRenderingOptions, g_rendering_options, G_TYPE_OBJECT); +G_DEFINE_TYPE(GDisplayOptions, g_display_options, G_TYPE_OBJECT); /****************************************************************************** @@ -68,8 +86,31 @@ G_DEFINE_TYPE(GRenderingOptions, g_rendering_options, G_TYPE_OBJECT); * * ******************************************************************************/ -static void g_rendering_options_class_init(GRenderingOptionsClass *klass) +static void g_display_options_class_init(GDisplayOptionsClass *klass) { + GObjectClass *object; /* Autre version de la classe */ + + object = G_OBJECT_CLASS(klass); + + object->dispose = (GObjectFinalizeFunc/* ! */)g_display_options_dispose; + object->finalize = (GObjectFinalizeFunc)g_display_options_finalize; + + /** + * Note : il n'existe pas de G_TYPE_GSIZE. + * + * Or la documentation précise : + * + * typedef unsigned long gsize; + * + */ + + g_signal_new("value-changed", + G_TYPE_DISPLAY_OPTIONS, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET(GDisplayOptionsClass, value_changed), + NULL, NULL, + g_cclosure_user_marshal_VOID__ULONG_BOOLEAN, + G_TYPE_NONE, 2, G_TYPE_ULONG, G_TYPE_BOOLEAN); } @@ -86,153 +127,197 @@ static void g_rendering_options_class_init(GRenderingOptionsClass *klass) * * ******************************************************************************/ -static void g_rendering_options_init(GRenderingOptions *options) +static void g_display_options_init(GDisplayOptions *options) { + options->names = NULL; + options->values = NULL; + options->count = 0; } /****************************************************************************** * * -* Paramètres : format = format du contenu binaire. * +* Paramètres : options = instance d'objet GLib à traiter. * * * -* Description : Crée un un groupe d'options pour le rendu des lignes. * +* Description : Supprime toutes les références externes. * * * -* Retour : Adresse de la structure mise en place. * +* Retour : - * * * * Remarques : - * * * ******************************************************************************/ -GRenderingOptions *g_rendering_options_new(GExeFormat *format) +static void g_display_options_dispose(GDisplayOptions *options) { - GRenderingOptions *result; /* Structure à retourner */ - - result = g_object_new(G_TYPE_RENDERING_OPTIONS, NULL); - - result->format = format; - result->proc = NULL;//get_arch_processor_from_format(format); - - return result; + G_OBJECT_CLASS(g_display_options_parent_class)->dispose(G_OBJECT(options)); } /****************************************************************************** * * -* Paramètres : options = options à consulter. * +* Paramètres : options = instance d'objet GLib à traiter. * * * -* Description : Fournit le format du contenu binaire représenté. * +* Description : Procède à la libération totale de la mémoire. * * * -* Retour : Format du contenu binaire. * +* Retour : - * * * * Remarques : - * * * ******************************************************************************/ -GExeFormat *g_rendering_options_get_format(const GRenderingOptions *options) +static void g_display_options_finalize(GDisplayOptions *options) { - return options->format; + size_t i; /* Boucle de parcours */ + + for (i = 0; i < options->count; i++) + free(options->names[i]); + + if (options->names != NULL) + free(options->names); + + if (options->values != NULL) + free(options->values); + + G_OBJECT_CLASS(g_display_options_parent_class)->finalize(G_OBJECT(options)); } /****************************************************************************** * * -* Paramètres : options = options à consulter. * +* Paramètres : - * * * -* Description : Fournit l'architecture du contenu binaire représenté. * +* Description : Crée un un groupe d'options pour le rendu des lignes. * * * -* Retour : Architecture utilisée par le binaire. * +* Retour : Adresse de la structure mise en place. * * * * Remarques : - * * * ******************************************************************************/ -GArchProcessor *g_rendering_options_get_processor(const GRenderingOptions *options) +GDisplayOptions *g_display_options_new(void) { - return options->proc; + GDisplayOptions *result; /* Structure à retourner */ + + result = g_object_new(G_TYPE_DISPLAY_OPTIONS, NULL); + + return result; } /****************************************************************************** * * -* Paramètres : options = options à mettre à jour. * -* rendering = type de rendu impliqué. * -* state = nouvel état de l'option visée. * +* Paramètres : options = options à consulter. * * * -* Description : Affiche (ou non) les adresses des instructions. * +* Description : Dénombre la quantité d'options représentées. * * * -* Retour : - * +* Retour : Quantité positive ou nulle. * * * * Remarques : - * * * ******************************************************************************/ -void g_rendering_options_show_address(GRenderingOptions *options, MainRendering rendering, bool state) +size_t g_display_options_count(const GDisplayOptions *options) { - options->show_address[rendering] = state; + size_t result; /* Quantité à retourner */ + + result = options->count; + + return result; } /****************************************************************************** * * -* Paramètres : options = options à consulter. * -* rendering = type de rendu impliqué. * +* Paramètres : options = options à compléter. * +* name = désignation humaine de la nouvelle option. * +* value = valeur initiale de l'option à ajouter. * * * -* Description : Indique si les adresses des instructions sont à afficher. * +* Description : Ajoute une nouvelle option à l'ensemble. * * * -* Retour : Etat courant de l'option visée. * +* Retour : - * * * * Remarques : - * * * ******************************************************************************/ -bool g_rendering_options_has_to_show_address(const GRenderingOptions *options, MainRendering rendering) +void g_display_options_add(GDisplayOptions *options, const char *name, bool value) { - return options->show_address[rendering]; + options->count++; + + options->names = (char **)realloc(options->names, options->count * sizeof(char *)); + options->values = (bool *)realloc(options->values, options->count * sizeof(bool)); + + options->names[options->count - 1] = strdup(name); + options->values[options->count - 1] = value; } /****************************************************************************** * * -* Paramètres : options = options à mettre à jour. * -* rendering = type de rendu impliqué. * -* state = nouvel état de l'option visée. * +* Paramètres : options = options à consulter. * +* index = indice de l'option concernée. * * * -* Description : Affiche (ou non) le code des instructions. * +* Description : Fournit la valeur d'une option donnée. * * * -* Retour : - * +* Retour : Valeur attribuée. * * * * Remarques : - * * * ******************************************************************************/ -void g_rendering_options_show_code(GRenderingOptions *options, MainRendering rendering, bool state) +bool g_display_options_get(const GDisplayOptions *options, size_t index) { - options->show_code[rendering] = state; + bool result; /* Valeur à renvoyer */ + + assert(index < options->count); + + if (index < options->count) + result = options->values[index]; + + else + result = false; + + return result; } /****************************************************************************** * * -* Paramètres : options = options à consulter. * -* rendering = type de rendu impliqué. * +* Paramètres : options = options à mettre à jour. * +* index = indice de l'option concernée. * +* value = nouvelle valeur à intégrer. * * * -* Description : Indique si le code des instructions est à afficher. * +* Description : Définit la valeur d'une option donnée. * * * -* Retour : Etat courant de l'option visée. * +* Retour : - * * * * Remarques : - * * * ******************************************************************************/ -bool g_rendering_options_has_to_show_code(const GRenderingOptions *options, MainRendering rendering) +void g_display_options_set(GDisplayOptions *options, size_t index, bool value) { - return options->show_code[rendering]; + bool changed; /* Note un changement */ + + assert(index < options->count); + + if (index < options->count) + { + changed = (options->values[index] != value); + options->values[index] = value; + } + + else + changed = false; + + if (changed) + g_signal_emit_by_name(options, "value-changed", index, value); } diff --git a/src/glibext/gdisplayoptions.h b/src/glibext/gdisplayoptions.h new file mode 100644 index 0000000..5697385 --- /dev/null +++ b/src/glibext/gdisplayoptions.h @@ -0,0 +1,68 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * gdisplayoptions.h - prototypes pour les options de rendus des lignes de code + * + * Copyright (C) 2018 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * Chrysalide is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * Chrysalide is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Chrysalide. If not, see <http://www.gnu.org/licenses/>. + */ + + +#ifndef _GLIBEXT_GDISPLAYOPTIONS_H +#define _GLIBEXT_GDISPLAYOPTIONS_H + + +#include <glib-object.h> +#include <stdbool.h> + + + +#define G_TYPE_DISPLAY_OPTIONS g_display_options_get_type() +#define G_DISPLAY_OPTIONS(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_DISPLAY_OPTIONS, GDisplayOptions)) +#define G_IS_DISPLAY_OPTIONS(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_DISPLAY_OPTIONS)) +#define G_DISPLAY_OPTIONS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_DISPLAY_OPTIONS, GDisplayOptionsClass)) +#define G_IS_DISPLAY_OPTIONS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_DISPLAY_OPTIONS)) +#define G_DISPLAY_OPTIONS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_DISPLAY_OPTIONS, GDisplayOptionsClass)) + + +/* Options de représentation (instance) */ +typedef struct _GDisplayOptions GDisplayOptions; + +/* Options de représentation (classe) */ +typedef struct _GDisplayOptionsClass GDisplayOptionsClass; + + +/* Indique le type défini pour des options de représentation. */ +GType g_display_options_get_type(void); + +/* Crée un un groupe d'options pour le rendu des lignes. */ +GDisplayOptions *g_display_options_new(void); + +/* Dénombre la quantité d'options représentées. */ +size_t g_display_options_count(const GDisplayOptions *); + +/* Ajoute une nouvelle option à l'ensemble. */ +void g_display_options_add(GDisplayOptions *, const char *, bool); + +/* Fournit la valeur d'une option donnée. */ +bool g_display_options_get(const GDisplayOptions *, size_t); + +/* Définit la valeur d'une option donnée. */ +void g_display_options_set(GDisplayOptions *, size_t, bool); + + + +#endif /* _GLIBEXT_GDISPLAYOPTIONS_H */ diff --git a/src/glibext/glinecursor.h b/src/glibext/glinecursor.h index 1cf8d47..4fa93c1 100644 --- a/src/glibext/glinecursor.h +++ b/src/glibext/glinecursor.h @@ -21,8 +21,8 @@ */ -#ifndef _GLIBEXT_LINECURSOR_H -#define _GLIBEXT_LINECURSOR_H +#ifndef _GLIBEXT_GLINECURSOR_H +#define _GLIBEXT_GLINECURSOR_H #include <glib-object.h> @@ -106,4 +106,4 @@ bool g_line_cursor_prepare_db_statement(const GLineCursor *, const char *, bound -#endif /* _GLIBEXT_LINECURSOR_H */ +#endif /* _GLIBEXT_GLINECURSOR_H */ diff --git a/src/glibext/gwidthtracker.c b/src/glibext/gwidthtracker.c index 0741133..44a7ff0 100644 --- a/src/glibext/gwidthtracker.c +++ b/src/glibext/gwidthtracker.c @@ -1149,7 +1149,7 @@ void g_width_tracker_get_local_width_summary(GWidthTracker *tracker, size_t inde /****************************************************************************** * * * Paramètres : tracker = suivi de largeurs à consulter. * -* display = règles d'affichage des colonnes modulables. * +* options = règles d'affichage des colonnes modulables. * * * * Description : Fournit la largeur requise par une visualisation. * * * @@ -1159,13 +1159,14 @@ void g_width_tracker_get_local_width_summary(GWidthTracker *tracker, size_t inde * * ******************************************************************************/ -gint g_width_tracker_get_width(GWidthTracker *tracker, const bool *display) +gint g_width_tracker_get_width(GWidthTracker *tracker, const GDisplayOptions *options) { gint result; /* Taille à retourner */ const line_width_summary *summary; /* Accès rapide aux mesures */ gint col_width; /* Calcul selon les colonnes */ gint full_width; /* Calcul selon les fusions */ - BufferLineColumn i; /* Boucle de parcours */ + size_t count; /* Qté de colonnes en option */ + size_t i; /* Boucle de parcours */ g_width_tracker_ensure_valid_required_widths(tracker); @@ -1176,11 +1177,17 @@ gint g_width_tracker_get_width(GWidthTracker *tracker, const bool *display) col_width = 0; full_width = 0; + count = g_display_options_count(options); + /* Première méthode */ for (i = 0; i < BLC_COUNT; i++) { - if (i < BLC_DISPLAY && !display[i]) continue; + if (i < count) + { + if (!g_display_options_get(options, i)) + continue; + } col_width += summary->max_widths[i]; @@ -1191,9 +1198,10 @@ gint g_width_tracker_get_width(GWidthTracker *tracker, const bool *display) /* Seconde méthode */ - for (i = 0; i < BLC_DISPLAY; i++) + for (i = 0; i < count; i++) { - if (!display[i]) continue; + if (!g_display_options_get(options, i)) + continue; full_width += summary->max_widths[i] + COL_MARGIN; @@ -1223,11 +1231,12 @@ gint g_width_tracker_get_width(GWidthTracker *tracker, const bool *display) * * ******************************************************************************/ -gint g_width_tracker_get_margin(GWidthTracker *tracker, const bool *display) +gint g_width_tracker_get_margin(GWidthTracker *tracker, const GDisplayOptions *options) { gint result; /* Taille à retourner */ const line_width_summary *summary; /* Accès rapide aux mesures */ - BufferLineColumn i; /* Boucle de parcours */ + size_t count; /* Qté de colonnes en option */ + size_t i; /* Boucle de parcours */ g_width_tracker_ensure_valid_required_widths(tracker); @@ -1235,9 +1244,12 @@ gint g_width_tracker_get_margin(GWidthTracker *tracker, const bool *display) summary = &tracker->summary; - for (i = 0; i < BLC_DISPLAY; i++) + count = g_display_options_count(options); + + for (i = 0; i < count; i++) { - if (!display[i]) continue; + if (!g_display_options_get(options, i)) + continue; result += summary->max_widths[i] + COL_MARGIN; diff --git a/src/glibext/gwidthtracker.h b/src/glibext/gwidthtracker.h index 2d9aef6..65e3df2 100644 --- a/src/glibext/gwidthtracker.h +++ b/src/glibext/gwidthtracker.h @@ -31,6 +31,7 @@ #include "delayed.h" #include "gbufferline.h" +#include "gdisplayoptions.h" @@ -84,10 +85,10 @@ const line_width_summary *g_width_tracker_get_width_summary(GWidthTracker *); void g_width_tracker_get_local_width_summary(GWidthTracker *, size_t, line_width_summary *); /* Fournit la largeur requise par une visualisation. */ -gint g_width_tracker_get_width(GWidthTracker *, const bool *); +gint g_width_tracker_get_width(GWidthTracker *, const GDisplayOptions *); /* Fournit la largeur requise pour dépasser les marges gauches. */ -gint g_width_tracker_get_margin(GWidthTracker *, const bool *); +gint g_width_tracker_get_margin(GWidthTracker *, const GDisplayOptions *); diff --git a/src/gtkext/gtkblockdisplay.c b/src/gtkext/gtkblockdisplay.c index 1e677ca..bc189a2 100644 --- a/src/gtkext/gtkblockdisplay.c +++ b/src/gtkext/gtkblockdisplay.c @@ -260,7 +260,7 @@ static gboolean gtk_block_display_button_press(GtkWidget *widget, GdkEventButton view = gtk_buffer_display_get_view(GTK_BUFFER_DISPLAY(display)); - changed = g_buffer_view_highlight_segments(view, real_x, real_y, GTK_DISPLAY_PANEL(display)->display_options); + changed = g_buffer_view_highlight_segments(view, real_x, real_y, GTK_DISPLAY_PANEL(display)->options); g_object_unref(G_OBJECT(view)); @@ -311,7 +311,7 @@ static gboolean gtk_block_display_query_tooltip(GtkWidget *widget, gint x, gint real_y = y; gtk_display_panel_compute_real_coord(panel, &real_x, &real_y); - creator = g_buffer_view_find_creator(GTK_BUFFER_DISPLAY(display)->view, real_x, real_y, panel->display_options); + creator = g_buffer_view_find_creator(GTK_BUFFER_DISPLAY(display)->view, real_x, real_y, panel->options); if (creator != NULL) { @@ -458,7 +458,7 @@ static bool gtk_block_display_notify_caret_relocation(GtkBlockDisplay *display, view = gtk_buffer_display_get_view(GTK_BUFFER_DISPLAY(display)); - result = g_buffer_view_highlight_segments(view, area->x, area->y, GTK_DISPLAY_PANEL(display)->display_options); + result = g_buffer_view_highlight_segments(view, area->x, area->y, GTK_DISPLAY_PANEL(display)->options); g_object_unref(G_OBJECT(view)); @@ -490,6 +490,6 @@ void gtk_block_display_override_view_index(GtkBlockDisplay *display, unsigned in panel = GTK_DISPLAY_PANEL(display); panel->view_index = index; - panel->display_options = g_loaded_content_get_all_display_options(G_LOADED_CONTENT(panel->binary), index); + panel->options = g_loaded_content_get_display_options(G_LOADED_CONTENT(panel->binary), index); } diff --git a/src/gtkext/gtkbufferdisplay.c b/src/gtkext/gtkbufferdisplay.c index 4a2c814..ea391bb 100644 --- a/src/gtkext/gtkbufferdisplay.c +++ b/src/gtkext/gtkbufferdisplay.c @@ -438,7 +438,7 @@ static gboolean gtk_buffer_display_draw(GtkWidget *widget, cairo_t *cr) area.x -= virt_x; virt_y += area.y; - g_buffer_view_draw(display->view, cr, virt_y, &area, parent->display_options, selected); + g_buffer_view_draw(display->view, cr, virt_y, &area, parent->options, selected); } @@ -516,7 +516,7 @@ static gboolean gtk_buffer_display_key_press(GtkWidget *widget, GdkEventKey *eve ctrl = (event->state & GDK_CONTROL_MASK); area = display->caret; - status = g_buffer_view_move_caret(display->view, ctrl, dir, panel->display_options, &area, &cursor); + status = g_buffer_view_move_caret(display->view, ctrl, dir, panel->options, &area, &cursor); if (status) { @@ -552,7 +552,7 @@ static void gtk_buffer_display_compute_requested_size(GtkBufferDisplay *display, if (width != NULL) { if (display->view != NULL) - *width = g_buffer_view_get_width(display->view, GTK_DISPLAY_PANEL(display)->display_options); + *width = g_buffer_view_get_width(display->view, GTK_DISPLAY_PANEL(display)->options); else *width = 0; } @@ -682,7 +682,7 @@ static bool gtk_buffer_display_get_cursor_coordinates(const GtkBufferDisplay *di if (result) { - *x += g_buffer_view_get_margin(display->view, GTK_DISPLAY_PANEL(display)->display_options); + *x += g_buffer_view_get_margin(display->view, GTK_DISPLAY_PANEL(display)->options); height = gtk_widget_get_allocated_height(GTK_WIDGET(display)); @@ -737,7 +737,7 @@ GObject *gtk_buffer_display_get_active_object(const GtkBufferDisplay *display) else result = g_buffer_view_find_creator(display->view, display->caret.x, display->caret.y, - GTK_DISPLAY_PANEL(display)->display_options); + GTK_DISPLAY_PANEL(display)->options); return result; @@ -849,7 +849,7 @@ static bool _gtk_buffer_display_move_caret_to(GtkBufferDisplay *display, gint x, panel = GTK_DISPLAY_PANEL(display); - result = g_buffer_view_compute_caret_full(display->view, x, y, panel->display_options, &new, &cursor); + result = g_buffer_view_compute_caret_full(display->view, x, y, panel->options, &new, &cursor); if (result) gtk_buffer_display_relocate_caret(display, &new, cursor); diff --git a/src/gtkext/gtkdisplaypanel-int.h b/src/gtkext/gtkdisplaypanel-int.h index ffed3b1..9fdb702 100644 --- a/src/gtkext/gtkdisplaypanel-int.h +++ b/src/gtkext/gtkdisplaypanel-int.h @@ -90,7 +90,7 @@ struct _GtkDisplayPanel bool show_border; /* Affichage d'une bordure ? */ unsigned int view_index; /* Indice du type de contenu */ - bool *display_options; /* Affichage des colonnes ? */ + GDisplayOptions *options; /* Affichage des colonnes ? */ GLoadedBinary *binary; /* Binaire à visualiser */ diff --git a/src/gtkext/gtkdisplaypanel.c b/src/gtkext/gtkdisplaypanel.c index 24436ca..706e8f7 100644 --- a/src/gtkext/gtkdisplaypanel.c +++ b/src/gtkext/gtkdisplaypanel.c @@ -46,6 +46,12 @@ static void gtk_display_panel_init(GtkDisplayPanel *); /* Procède à l'initialisation de l'interface d'affichage. */ static void gtk_display_panel_loaded_interface_init(GLoadedPanelInterface *); +/* Supprime toutes les références externes. */ +static void gtk_display_panel_dispose(GtkDisplayPanel *); + +/* Procède à la libération totale de la mémoire. */ +static void gtk_display_panel_finalize(GtkDisplayPanel *); + /* Définit une propriété du composant d'affichage. */ static void gtk_display_panel_set_property(GObject *, guint, const GValue *, GParamSpec *); @@ -86,7 +92,7 @@ static void gtk_display_panel_update_adjustment(GtkDisplayPanel *, GtkOrientatio static void gtk_display_panel_adjustment_value_changed(GtkAdjustment *, GtkDisplayPanel *); /* Réagit à un changement des règles d'affichage. */ -static void on_view_panel_binary_display_change(GLoadedBinary *, BinaryView, BufferLineColumn, GtkDisplayPanel *); +static void on_view_panel_binary_option_change(GLoadedBinary *, BinaryView, BufferLineColumn, GtkDisplayPanel *); @@ -133,30 +139,34 @@ G_DEFINE_TYPE_WITH_CODE(GtkDisplayPanel, gtk_display_panel, GTK_TYPE_FIXED, static void gtk_display_panel_class_init(GtkDisplayPanelClass *class) { - GObjectClass *gobject_class; /* Plus haut niveau équivalent */ - GtkWidgetClass *widget_class; /* Classe de haut niveau */ - GtkDisplayPanelClass *panel_class; /* Classe de lus bas niveau */ + GObjectClass *object; /* Plus haut niveau équivalent */ + GtkWidgetClass *widget; /* Classe de haut niveau */ + GtkDisplayPanelClass *panel; /* Classe de lus bas niveau */ - gobject_class = G_OBJECT_CLASS(class); - widget_class = GTK_WIDGET_CLASS(class); - panel_class = GTK_DISPLAY_PANEL_CLASS(class); + object = G_OBJECT_CLASS(class); - gobject_class->set_property = gtk_display_panel_set_property; - gobject_class->get_property = gtk_display_panel_get_property; + object->dispose = (GObjectFinalizeFunc/* ! */)gtk_display_panel_dispose; + object->finalize = (GObjectFinalizeFunc)gtk_display_panel_finalize; + object->set_property = gtk_display_panel_set_property; + object->get_property = gtk_display_panel_get_property; /* Implémentation de l'interface "GtkScrollable" */ - g_object_class_override_property(gobject_class, VPP_HADJUSTMENT, "hadjustment"); - g_object_class_override_property(gobject_class, VPP_VADJUSTMENT, "vadjustment"); - g_object_class_override_property(gobject_class, VPP_HSCROLL_POLICY, "hscroll-policy"); - g_object_class_override_property(gobject_class, VPP_VSCROLL_POLICY, "vscroll-policy"); + g_object_class_override_property(object, VPP_HADJUSTMENT, "hadjustment"); + g_object_class_override_property(object, VPP_VADJUSTMENT, "vadjustment"); + g_object_class_override_property(object, VPP_HSCROLL_POLICY, "hscroll-policy"); + g_object_class_override_property(object, VPP_VSCROLL_POLICY, "vscroll-policy"); + + widget = GTK_WIDGET_CLASS(class); - widget_class->destroy = gtk_display_panel_destroy; - widget_class->realize = gtk_display_panel_realize; - widget_class->size_allocate = gtk_display_panel_size_allocate; - widget_class->get_preferred_height = gtk_display_panel_get_preferred_height; - widget_class->get_preferred_width = gtk_display_panel_get_preferred_width; + widget->destroy = gtk_display_panel_destroy; + widget->realize = gtk_display_panel_realize; + widget->size_allocate = gtk_display_panel_size_allocate; + widget->get_preferred_height = gtk_display_panel_get_preferred_height; + widget->get_preferred_width = gtk_display_panel_get_preferred_width; - panel_class->compute_inc = gtk_display_panel_compute_scroll_inc; + panel = GTK_DISPLAY_PANEL_CLASS(class); + + panel->compute_inc = gtk_display_panel_compute_scroll_inc; } @@ -209,6 +219,47 @@ static void gtk_display_panel_loaded_interface_init(GLoadedPanelInterface *iface /****************************************************************************** * * +* Paramètres : panel = instance d'objet GLib à traiter. * +* * +* Description : Supprime toutes les références externes. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void gtk_display_panel_dispose(GtkDisplayPanel *panel) +{ + if (panel->options != NULL) + g_object_unref(G_OBJECT(panel->options)); + + G_OBJECT_CLASS(gtk_display_panel_parent_class)->dispose(G_OBJECT(panel)); + +} + + +/****************************************************************************** +* * +* Paramètres : panel = instance d'objet GLib à traiter. * +* * +* Description : Procède à la libération totale de la mémoire. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void gtk_display_panel_finalize(GtkDisplayPanel *panel) +{ + G_OBJECT_CLASS(gtk_display_panel_parent_class)->finalize(G_OBJECT(panel)); + +} + + +/****************************************************************************** +* * * Paramètres : object = instance de composant GTK à manipuler. * * prop_id = identifiant de la propriété concernée. * * value = valeur attribuée. * @@ -822,7 +873,7 @@ void gtk_display_panel_draw_border(GtkDisplayPanel *panel, cairo_t *cr) * * ******************************************************************************/ -static void on_view_panel_binary_display_change(GLoadedBinary *binary, BinaryView view, BufferLineColumn col, GtkDisplayPanel *panel) +static void on_view_panel_binary_option_change(GLoadedBinary *binary, BinaryView view, BufferLineColumn col, GtkDisplayPanel *panel) { if (panel->view_index == view) { @@ -1011,14 +1062,14 @@ static void gtk_display_panel_set_content(GtkDisplayPanel *panel, GLoadedContent { panel->view_index = g_loaded_content_get_view_index(content, GTK_WIDGET(panel)); - panel->display_options = g_loaded_content_get_all_display_options(content, panel->view_index); + panel->options = g_loaded_content_get_display_options(content, panel->view_index); panel->binary = G_LOADED_BINARY(content); if (GTK_DISPLAY_PANEL_GET_CLASS(panel)->attach != NULL) /* REMME */ GTK_DISPLAY_PANEL_GET_CLASS(panel)->attach(panel, panel->binary); - g_signal_connect(content, "display-changed", G_CALLBACK(on_view_panel_binary_display_change), panel); + g_signal_connect(content, "value-changed", G_CALLBACK(on_view_panel_binary_option_change), panel); } diff --git a/src/gui/menus/view.c b/src/gui/menus/view.c index d446278..31726c7 100644 --- a/src/gui/menus/view.c +++ b/src/gui/menus/view.c @@ -199,7 +199,7 @@ void rebuild_menu_view(GtkWidget *widget, GLoadedPanel *panel, GMenuBar *bar) GSList *found; /* Elément de menu à activer */ GLoadedContent *content; /* Contenu global représenté */ unsigned int view_index; /* Indice de représentation */ - const bool *display; /* Règles d'affichage courantes*/ + GDisplayOptions *options; /* Règles d'affichage courantes*/ GtkWidget *submenuitem; /* Sous-élément de menu */ bool status; /* Consigne d'affichage */ @@ -252,7 +252,7 @@ void rebuild_menu_view(GtkWidget *widget, GLoadedPanel *panel, GMenuBar *bar) view_index = g_loaded_content_get_view_index(content, GTK_WIDGET(panel)); - display = g_loaded_content_get_all_display_options(content, view_index); + options = g_loaded_content_get_display_options(content, view_index); g_object_unref(G_OBJECT(content)); @@ -262,7 +262,7 @@ void rebuild_menu_view(GtkWidget *widget, GLoadedPanel *panel, GMenuBar *bar) g_signal_handlers_disconnect_by_func(submenuitem, G_CALLBACK(mcb_view_display_column), NULL); - status = display[BLC_PHYSICAL]; + status = g_display_options_get(options, BLC_PHYSICAL); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(submenuitem), status); g_signal_connect(submenuitem, "toggled", G_CALLBACK(mcb_view_display_column), NULL); @@ -273,7 +273,7 @@ void rebuild_menu_view(GtkWidget *widget, GLoadedPanel *panel, GMenuBar *bar) g_signal_handlers_disconnect_by_func(submenuitem, G_CALLBACK(mcb_view_display_column), NULL); - status = display[BLC_VIRTUAL]; + status = g_display_options_get(options, BLC_VIRTUAL); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(submenuitem), status); g_signal_connect(submenuitem, "toggled", G_CALLBACK(mcb_view_display_column), NULL); @@ -284,11 +284,13 @@ void rebuild_menu_view(GtkWidget *widget, GLoadedPanel *panel, GMenuBar *bar) g_signal_handlers_disconnect_by_func(submenuitem, G_CALLBACK(mcb_view_display_column), NULL); - status = display[BLC_BINARY]; + status = g_display_options_get(options, BLC_BINARY); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(submenuitem), status); g_signal_connect(submenuitem, "toggled", G_CALLBACK(mcb_view_display_column), NULL); + g_object_unref(G_OBJECT(options)); + } @@ -708,6 +710,7 @@ static void mcb_view_display_column(GtkCheckMenuItem *menuitem, gpointer unused) GLoadedPanel *panel; /* Afficheur effectif de code */ GLoadedContent *content; /* Contenu représenté */ unsigned int index; /* Indice de la vue courante */ + GDisplayOptions *options; /* Ensemble à mettre à jour */ option = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(menuitem), "kind_of_opt")); @@ -718,7 +721,11 @@ static void mcb_view_display_column(GtkCheckMenuItem *menuitem, gpointer unused) index = g_loaded_content_get_view_index(content, GTK_WIDGET(panel)); - g_loaded_content_set_display_option(content, index, option, active); + options = g_loaded_content_get_display_options(content, index); + + g_display_options_set(options, option, active); + + g_object_unref(G_OBJECT(options)); g_object_unref(G_OBJECT(content)); g_object_unref(G_OBJECT(panel)); |