From 085fef16a819cb321fd38e7e0926d3cca863777a Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Tue, 21 Oct 2014 23:11:30 +0000
Subject: Cleaned, fixed and improved the rules for the display of view
 columns.

git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@416 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
---
 ChangeLog                     |  22 +++++++++
 configure.ac                  |   2 +-
 src/analysis/binary-int.h     |   3 +-
 src/analysis/binary.c         |  86 ++++++++++++++++++++------------
 src/analysis/binary.h         |  12 ++---
 src/glibext/gbufferline.c     |  20 +++-----
 src/glibext/gbufferline.h     |   6 ++-
 src/glibext/gcodebuffer.c     |  47 +++++++-----------
 src/glibext/gcodebuffer.h     |   4 +-
 src/gtkext/gtkblockview.c     |   8 ++-
 src/gtkext/gtkbufferview.c    |  15 ++----
 src/gtkext/gtkbufferview.h    |   2 +-
 src/gtkext/gtkgraphview.c     |   9 +---
 src/gtkext/gtksourceview.c    |   8 ++-
 src/gtkext/gtkviewpanel-int.h |   8 ++-
 src/gtkext/gtkviewpanel.c     | 111 ++++++++++++------------------------------
 src/gtkext/gtkviewpanel.h     |  11 ++---
 src/gui/menus/view.c          |  87 ++++++++++++++++++---------------
 src/project.c                 |   4 +-
 19 files changed, 215 insertions(+), 250 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 36b047b..78fb8ea 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,25 @@
+14-10-22  Cyrille Bagard <nocbos@gmail.com>
+
+	* configure.ac:
+	* src/analysis/binary.c:
+	* src/analysis/binary.h:
+	* src/analysis/binary-int.h:
+	* src/glibext/gbufferline.c:
+	* src/glibext/gbufferline.h:
+	* src/glibext/gcodebuffer.c:
+	* src/glibext/gcodebuffer.h:
+	* src/gtkext/gtkblockview.c:
+	* src/gtkext/gtkbufferview.c:
+	* src/gtkext/gtkbufferview.h:
+	* src/gtkext/gtkgraphview.c:
+	* src/gtkext/gtksourceview.c:
+	* src/gtkext/gtkviewpanel.c:
+	* src/gtkext/gtkviewpanel.h:
+	* src/gtkext/gtkviewpanel-int.h:
+	* src/gui/menus/view.c:
+	* src/project.c:
+	Clean, fix and improve the rules for the display of view columns.
+
 14-10-17  Cyrille Bagard <nocbos@gmail.com>
 
 	* src/analysis/binary.c:
diff --git a/configure.ac b/configure.ac
index 4f900ac..85ab307 100644
--- a/configure.ac
+++ b/configure.ac
@@ -264,7 +264,7 @@ AC_SUBST(LIBGRAPH_LIBS)
 
 AC_CONFIG_FILES([stamp-h po/Makefile.in], [echo timestamp > stamp-h])
 
-AC_CONFIG_COMMANDS([marshal], [echo -e "VOID:UINT64\nVOID:UINT64,UINT64\nVOID:INT,UINT64,INT\nVOID:OBJECT\nVOID:OBJECT,OBJECT\nVOID:ENUM,OBJECT" > src/glibext/chrysamarshal.list])
+AC_CONFIG_COMMANDS([marshal], [echo -e "VOID:UINT64\nVOID:UINT64,UINT64\nVOID:INT,UINT64,INT\nVOID:OBJECT\nVOID:OBJECT,OBJECT\nVOID:ENUM,OBJECT\nVOID:ENUM,ENUM" > src/glibext/chrysamarshal.list])
 
 AC_CONFIG_FILES([Makefile
                  pixmaps/Makefile
diff --git a/src/analysis/binary-int.h b/src/analysis/binary-int.h
index 28d4594..fa06a25 100644
--- a/src/analysis/binary-int.h
+++ b/src/analysis/binary-int.h
@@ -77,7 +77,7 @@ struct _GLoadedBinary
     size_t decbuf_count;                    /* Taille des tableaux         */
     size_t defsrc;                          /* Fichier source principal    */
 
-    bool text_display[BVW_COUNT][2];        /* Position et code binaire #1 */
+    bool col_display[BVW_COUNT][BLC_DISPLAY];/* Position et code binaire   */
     bool lines_display;                     /* Affichage des lignes        */
 
 };
@@ -90,6 +90,7 @@ struct _GLoadedBinaryClass
     /* Signaux */
 
     void (* disassembly_done) (GLoadedBinary *);
+    void (* display_changed) (GLoadedBinary *, BinaryView, BufferLineColumn);
 
 };
 
diff --git a/src/analysis/binary.c b/src/analysis/binary.c
index 18dca8c..6c8bcba 100644
--- a/src/analysis/binary.c
+++ b/src/analysis/binary.c
@@ -41,6 +41,7 @@
 #include "../common/extstr.h"
 #include "../common/cpp.h"
 #include "../core/params.h"
+#include "../glibext/chrysamarshal.h"
 
 
 
@@ -117,6 +118,14 @@ static void g_loaded_binary_class_init(GLoadedBinaryClass *klass)
                  g_cclosure_marshal_VOID__VOID,
                  G_TYPE_NONE, 0);
 
+    g_signal_new("display-changed",
+                 G_TYPE_LOADED_BINARY,
+                 G_SIGNAL_RUN_LAST,
+                 G_STRUCT_OFFSET(GLoadedBinaryClass, display_changed),
+                 NULL, NULL,
+                 g_cclosure_user_marshal_VOID__ENUM_ENUM,
+                 G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT);
+
 }
 
 
@@ -144,12 +153,15 @@ static void g_loaded_binary_init(GLoadedBinary *binary)
     binary->storages[DBF_SEGMENTS_DISPLAY] = DBS_ALL_LOCAL;
     binary->storages[DBF_BOOKMARKS] = DBS_ALL_LOCAL;
 
-    binary->text_display[BVW_BLOCK][0] = true;
-    binary->text_display[BVW_BLOCK][1] = true;
-    binary->text_display[BVW_BLOCK][2] = true;
-    binary->text_display[BVW_GRAPH][0] = false;
-    binary->text_display[BVW_GRAPH][1] = false;
-    binary->text_display[BVW_GRAPH][2] = false;
+    binary->col_display[BVW_BLOCK][BLC_PHYSICAL] = true;
+    binary->col_display[BVW_BLOCK][BLC_VIRTUAL] = true;
+    binary->col_display[BVW_BLOCK][BLC_BINARY] = true;
+    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->col_display[BVW_SOURCE][BLC_PHYSICAL] = false;
+    binary->col_display[BVW_SOURCE][BLC_VIRTUAL] = false;
+    binary->col_display[BVW_SOURCE][BLC_BINARY] = false;
 
     binary->lines_display = true;
 
@@ -1305,39 +1317,60 @@ GCodeBuffer *g_loaded_binary_get_disassembled_buffer(const GLoadedBinary *binary
 /******************************************************************************
 *                                                                             *
 *  Paramètres  : binary = élément binaire à consulter.                        *
-*                view   = type de représentation visée.                       *
+*                index  = indice du fichier à retrouver.                      *
 *                                                                             *
-*  Description : Indique si les adresses doivent apparaître dans le rendu.    *
+*  Description : Fournit le tampon associé au contenu d'un fichier source.    *
 *                                                                             *
-*  Retour      : Consigne d'affichage. [OUT]                                  *
+*  Retour      : Tampon mis en place ou NULL si aucun (!).                    *
 *                                                                             *
 *  Remarques   : -                                                            *
 *                                                                             *
 ******************************************************************************/
 
-bool *g_loaded_binary_display_addresses_in_text(GLoadedBinary *binary, BinaryView view)
+GCodeBuffer *g_loaded_binary_get_decompiled_buffer(const GLoadedBinary *binary, size_t index)
 {
-    return &binary->text_display[view][0];
+    GCodeBuffer *result;                    /* Tampon à retourner          */
+
+    if (binary->decbuf_count == 0)
+        result = NULL;
+
+    else if (index >= binary->decbuf_count)
+        result = binary->dec_buffers[binary->defsrc];
+
+    else
+        result = binary->dec_buffers[index];
+
+    return result;
 
 }
 
 
 /******************************************************************************
 *                                                                             *
-*  Paramètres  : binary = élément binaire à consulter.                        *
+*  Paramètres  : binary = élément binaire à mettre à jour.                    *
 *                view   = type de représentation visée.                       *
+*                col    = indice de colonne dont l'affichage est à modifier.  *
+*                state  = nouvel état de l'affichage.                         *
 *                                                                             *
-*  Description : Indique si le code doit apparaître dans le rendu.            *
+*  Description : Définit si une colonne donnée doit apparaître dans le rendu. *
 *                                                                             *
-*  Retour      : Consigne d'affichage. [OUT]                                  *
+*  Retour      : -                                                            *
 *                                                                             *
 *  Remarques   : -                                                            *
 *                                                                             *
 ******************************************************************************/
 
-bool *g_loaded_binary_display_code_in_text(GLoadedBinary *binary, BinaryView view)
+void g_loaded_binary_set_column_display(GLoadedBinary *binary, BinaryView view, BufferLineColumn col, bool state)
 {
-    return &binary->text_display[view][1];
+    bool old;                               /* Ancien état à remplacer     */
+
+    old = binary->col_display[view][col];
+
+    if (state != old)
+    {
+        binary->col_display[view][col] = state;
+        g_signal_emit_by_name(binary, "display-changed", view, col);
+    }
 
 }
 
@@ -1345,30 +1378,19 @@ bool *g_loaded_binary_display_code_in_text(GLoadedBinary *binary, BinaryView vie
 /******************************************************************************
 *                                                                             *
 *  Paramètres  : binary = élément binaire à consulter.                        *
-*                index  = indice du fichier à retrouver.                      *
+*                view   = type de représentation visée.                       *
 *                                                                             *
-*  Description : Fournit le tampon associé au contenu d'un fichier source.    *
+*  Description : Indique quelles colonnes doivent apparaître dans le rendu.   *
 *                                                                             *
-*  Retour      : Tampon mis en place ou NULL si aucun (!).                    *
+*  Retour      : Consigne d'affichage. [OUT]                                  *
 *                                                                             *
 *  Remarques   : -                                                            *
 *                                                                             *
 ******************************************************************************/
 
-GCodeBuffer *g_loaded_binary_get_decompiled_buffer(const GLoadedBinary *binary, size_t index)
+const bool *g_loaded_binary_get_column_display(GLoadedBinary *binary, BinaryView view)
 {
-    GCodeBuffer *result;                    /* Tampon à retourner          */
-
-    if (binary->decbuf_count == 0)
-        result = NULL;
-
-    else if (index >= binary->decbuf_count)
-        result = binary->dec_buffers[binary->defsrc];
-
-    else
-        result = binary->dec_buffers[index];
-
-    return result;
+    return binary->col_display[view];
 
 }
 
diff --git a/src/analysis/binary.h b/src/analysis/binary.h
index 17da200..8574f28 100644
--- a/src/analysis/binary.h
+++ b/src/analysis/binary.h
@@ -169,15 +169,15 @@ GArchInstruction *g_loaded_binary_get_instructions(const GLoadedBinary *);
 /* Fournit le tampon associé au contenu assembleur d'un binaire. */
 GCodeBuffer *g_loaded_binary_get_disassembled_buffer(const GLoadedBinary *);
 
-/* Indique si les adresses doivent apparaître dans le rendu. */
-bool *g_loaded_binary_display_addresses_in_text(GLoadedBinary *, BinaryView);
-
-/* Indique si le code doit apparaître dans le rendu. */
-bool *g_loaded_binary_display_code_in_text(GLoadedBinary *, BinaryView);
-
 /* Fournit le tampon associé au contenu d'un fichier source. */
 GCodeBuffer *g_loaded_binary_get_decompiled_buffer(const GLoadedBinary *, size_t);
 
+/* Définit si une colonne donnée doit apparaître dans le rendu. */
+void g_loaded_binary_set_column_display(GLoadedBinary *, BinaryView, BufferLineColumn, bool);
+
+/* Indique quelles colonnes doivent apparaître dans le rendu. */
+const bool *g_loaded_binary_get_column_display(GLoadedBinary *, BinaryView);
+
 /* Indique si les lignes doivent apparaître dans le rendu. */
 bool *g_loaded_binary_display_decomp_lines(GLoadedBinary *);
 
diff --git a/src/glibext/gbufferline.c b/src/glibext/gbufferline.c
index 758dff7..cb5c267 100644
--- a/src/glibext/gbufferline.c
+++ b/src/glibext/gbufferline.c
@@ -717,11 +717,9 @@ gint g_buffer_line_get_column_width(GBufferLine *line, BufferLineColumn index)
 
 /******************************************************************************
 *                                                                             *
-*  Paramètres  : line  = ligne à venir compléter.                             *
-*                merge = précise la première colonne marquant la fusion. [OUT]*
-*                phys  = indique si les positions doivent être affichées.     *
-*                virt  = indique si les adresses doivent être affichées.      *
-*                code  = indique si le code binaire doit être affiché.        *
+*  Paramètres  : line    = ligne à venir compléter.                           *
+*                merge   = précise la première colonne marquant la fusion. [OUT]*
+*                display = règles d'affichage des colonnes modulables.        *
 *                                                                             *
 *  Description : Fournit la dernière largeur d'une ligne avec fusion.         *
 *                                                                             *
@@ -731,7 +729,7 @@ gint g_buffer_line_get_column_width(GBufferLine *line, BufferLineColumn index)
 *                                                                             *
 ******************************************************************************/
 
-gint g_buffer_line_get_merge_width(GBufferLine *line, BufferLineColumn *merge, bool phys, bool virt, bool code)
+gint g_buffer_line_get_merge_width(GBufferLine *line, BufferLineColumn *merge, const bool *display)
 {
     gint result;                            /* Largeur à retourner         */
 
@@ -779,9 +777,7 @@ void g_buffer_line_start_merge_at(GBufferLine *line, BufferLineColumn start)
 *                max_widths = largeurs de colonne à respecter.                *
 *                x_init     = abscisse du point d'impression de départ.       *
 *                y          = ordonnée du point d'impression.                 *
-*                phys       = indique si les positions doivent être affichées.*
-*                virt       = indique si les adresses doivent être affichées. *
-*                code       = indique si le code binaire doit être affiché.   *
+*                display    = règles d'affichage des colonnes modulables.     *
 *                                                                             *
 *  Description : Imprime la ligne de texte représentée.                       *
 *                                                                             *
@@ -791,7 +787,7 @@ void g_buffer_line_start_merge_at(GBufferLine *line, BufferLineColumn start)
 *                                                                             *
 ******************************************************************************/
 
-void g_buffer_line_draw(GBufferLine *line, cairo_t *cairo, const gint max_widths[BLC_COUNT], gint x_init, gint y, bool phys, bool virt, bool code)
+void g_buffer_line_draw(GBufferLine *line, cairo_t *cairo, const gint max_widths[BLC_COUNT], gint x_init, gint y, const bool *display)
 {
     GBufferLineClass *class;                /* Stockage de briques de base */
     gint x;                                 /* Point de départ d'impression*/
@@ -806,9 +802,7 @@ void g_buffer_line_draw(GBufferLine *line, cairo_t *cairo, const gint max_widths
 
     for (i = 0; i < BLC_COUNT; i++)
     {
-        if (i == BLC_PHYSICAL && !phys) continue;
-        if (i == BLC_VIRTUAL && !virt) continue;
-        if (i == BLC_BINARY && !code) continue;
+        if (i < BLC_DISPLAY && !display[i]) continue;
 
         draw_segments_of_column(&line->columns[i], cairo, x, y);
 
diff --git a/src/glibext/gbufferline.h b/src/glibext/gbufferline.h
index b96f7a6..8e436d9 100644
--- a/src/glibext/gbufferline.h
+++ b/src/glibext/gbufferline.h
@@ -69,6 +69,8 @@ typedef enum _BufferLineColumn
 
 } BufferLineColumn;
 
+/* Première colonne toujours affichée */
+#define BLC_DISPLAY BLC_ASSEMBLY_HEAD
 
 
 /* Confort pour l'insertion de texte */
@@ -113,13 +115,13 @@ char *g_buffer_line_get_text(const GBufferLine *);
 gint g_buffer_line_get_column_width(GBufferLine *, BufferLineColumn);
 
 /* Fournit la dernière largeur d'une ligne avec fusion. */
-gint g_buffer_line_get_merge_width(GBufferLine *, BufferLineColumn *, bool, bool, bool);
+gint g_buffer_line_get_merge_width(GBufferLine *, BufferLineColumn *, const bool *);
 
 /* Définit la colonne à partir de laquelle la fusion opère. */
 void g_buffer_line_start_merge_at(GBufferLine *, BufferLineColumn);
 
 /* Imprime la ligne de texte représentée. */
-void g_buffer_line_draw(GBufferLine *, cairo_t *, const gint [BLC_COUNT], gint, gint, bool, bool, bool);
+void g_buffer_line_draw(GBufferLine *, cairo_t *, const gint [BLC_COUNT], gint, gint, const bool *);
 
 /* Exporte la ligne de texte représentée. */
 void g_buffer_line_export(GBufferLine *, int, BufferExportType, bool, bool, bool, bool);
diff --git a/src/glibext/gcodebuffer.c b/src/glibext/gcodebuffer.c
index 0ac3bb3..1ea8f69 100644
--- a/src/glibext/gcodebuffer.c
+++ b/src/glibext/gcodebuffer.c
@@ -182,7 +182,7 @@ static void g_buffer_view_reset_required_height(GBufferView *);
 static void g_buffer_view_reset_required_widths(GBufferView *);
 
 /* Calcule les largeurs requises par une visualisation. */
-static void g_buffer_view_compute_required_widths(GBufferView *, bool, bool, bool);
+static void g_buffer_view_compute_required_widths(GBufferView *, const bool *);
 
 
 
@@ -893,9 +893,7 @@ static void g_buffer_view_compute_required_height(GBufferView *view)
 /******************************************************************************
 *                                                                             *
 *  Paramètres  : view = visualisation à mettre à jour.                        *
-*                phys = indique si les positions doivent être affichées.      *
-*                virt = indique si les adresses doivent être affichées.       *
-*                code = indique si le code binaire doit être affiché.         *
+*                display = règles d'affichage des colonnes modulables.        *
 *                                                                             *
 *  Description : Calcule les largeurs requises par une visualisation.         *
 *                                                                             *
@@ -905,7 +903,7 @@ static void g_buffer_view_compute_required_height(GBufferView *view)
 *                                                                             *
 ******************************************************************************/
 
-static void g_buffer_view_compute_required_widths(GBufferView *view, bool phys, bool virt, bool code)
+static void g_buffer_view_compute_required_widths(GBufferView *view, const bool *display)
 {
     GBufferLine **lines;                    /* Liste des lignes à traiter  */
     size_t first;                           /* Première ligne intégrée     */
@@ -938,7 +936,7 @@ static void g_buffer_view_compute_required_widths(GBufferView *view, bool phys,
                 view->max_widths[j] = MAX(view->max_widths[j], width);
             }
 
-            width = g_buffer_line_get_merge_width(lines[i], &merge, phys, virt, code);
+            width = g_buffer_line_get_merge_width(lines[i], &merge, display);
             view->last_width = MAX(view->last_width, width);
             if (merge != BLC_COUNT)
             {
@@ -980,10 +978,8 @@ gint g_buffer_view_get_line_height(GBufferView *view)
 
 /******************************************************************************
 *                                                                             *
-*  Paramètres  : view = visualisation à consulter.                            *
-*                phys = indique si les positions doivent être affichées.      *
-*                virt = indique si les adresses doivent être affichées.       *
-*                code = indique si le code binaire doit être affiché.         *
+*  Paramètres  : view    = visualisation à consulter.                         *
+*                display = règles d'affichage des colonnes modulables.        *
 *                                                                             *
 *  Description : Fournit la largeur requise par une visualisation.            *
 *                                                                             *
@@ -993,7 +989,7 @@ gint g_buffer_view_get_line_height(GBufferView *view)
 *                                                                             *
 ******************************************************************************/
 
-gint g_buffer_view_get_width(GBufferView *view, bool phys, bool virt, bool code)
+gint g_buffer_view_get_width(GBufferView *view, const bool *display)
 {
     gint result;                            /* Taille à retourner          */
     gint col_width;                         /* Calcul selon les colonnes   */
@@ -1001,7 +997,7 @@ gint g_buffer_view_get_width(GBufferView *view, bool phys, bool virt, bool code)
     BufferLineColumn i;                     /* Boucle de parcours          */
 
     if (!WIDTHS_CACHED(view))
-        g_buffer_view_compute_required_widths(view, phys, virt, code);
+        g_buffer_view_compute_required_widths(view, display);
 
     result = view->left_text;
 
@@ -1012,9 +1008,7 @@ gint g_buffer_view_get_width(GBufferView *view, bool phys, bool virt, bool code)
 
     for (i = 0; i < BLC_COUNT; i++)
     {
-        if (i == BLC_PHYSICAL && !phys) continue;
-        if (i == BLC_VIRTUAL && !virt) continue;
-        if (i == BLC_BINARY && !code) continue;
+        if (i < BLC_DISPLAY && !display[i]) continue;
 
         col_width += view->max_widths[i];
 
@@ -1027,9 +1021,7 @@ gint g_buffer_view_get_width(GBufferView *view, bool phys, bool virt, bool code)
 
     for (i = 0; i < view->last_merge; i++)
     {
-        if (i == BLC_PHYSICAL && !phys) continue;
-        if (i == BLC_VIRTUAL && !virt) continue;
-        if (i == BLC_BINARY && !code) continue;
+        if (i < BLC_DISPLAY && !display[i]) continue;
 
         full_width += view->max_widths[i];
 
@@ -1344,14 +1336,12 @@ void g_buffer_view_highlight_segments(GBufferView *view, gint x, gint y)
 
 /******************************************************************************
 *                                                                             *
-*  Paramètres  : view   = visualisation à représenter.                        *
-*                cr     = contexte graphique dédié à la procédure.            *
-*                fake_x = abscisse réelle du point 0 à l'écran.               *
-*                fake_y = ordonnée réelle du point 0 à l'écran.               *
-*                area   = position et surface à traiter.                      *
-*                phys   = indique si les positions doivent être affichées.    *
-*                virt   = indique si les adresses doivent être affichées.     *
-*                code   = indique si le code binaire doit être affiché.       *
+*  Paramètres  : view    = visualisation à représenter.                       *
+*                cr      = contexte graphique dédié à la procédure.           *
+*                fake_x  = abscisse réelle du point 0 à l'écran.              *
+*                fake_y  = ordonnée réelle du point 0 à l'écran.              *
+*                area    = position et surface à traiter.                     *
+*                display = règles d'affichage des colonnes modulables.        *
 *                                                                             *
 *  Description : Imprime la visualisation du tampon de code désassemblé.      *
 *                                                                             *
@@ -1361,7 +1351,7 @@ void g_buffer_view_highlight_segments(GBufferView *view, gint x, gint y)
 *                                                                             *
 ******************************************************************************/
 
-void g_buffer_view_draw(const GBufferView *view, cairo_t *cr, gint fake_x, gint fake_y, const cairo_rectangle_int_t *area, bool phys, bool virt, bool code)
+void g_buffer_view_draw(const GBufferView *view, cairo_t *cr, gint fake_x, gint fake_y, const cairo_rectangle_int_t *area, const bool *display)
 {
     gint real_x;                            /* Abscisse réelle pour tampon */
     gint real_y;                            /* Ordonnée réelle pour tampon */
@@ -1397,8 +1387,7 @@ void g_buffer_view_draw(const GBufferView *view, cairo_t *cr, gint fake_x, gint
                 view->drawing_extra(lines[i], drawable, gc, fake_x, y, view->drawing_data);
             */
 
-            g_buffer_line_draw(lines[i], cr,
-                               view->max_widths, real_x, y, phys, virt, code);
+            g_buffer_line_draw(lines[i], cr, view->max_widths, real_x, y, display);
 
             y += view->line_height;
 
diff --git a/src/glibext/gcodebuffer.h b/src/glibext/gcodebuffer.h
index 472d403..1387eb9 100644
--- a/src/glibext/gcodebuffer.h
+++ b/src/glibext/gcodebuffer.h
@@ -123,7 +123,7 @@ GCodeBuffer *g_buffer_view_get_buffer(const GBufferView *);
 gint g_buffer_view_get_line_height(GBufferView *);
 
 /* Fournit la largeur requise par une visualisation. */
-gint g_buffer_view_get_width(GBufferView *, bool, bool, bool);
+gint g_buffer_view_get_width(GBufferView *, const bool *);
 
 /* Fournit la hauteur requise par une visualisation. */
 gint g_buffer_view_get_height(const GBufferView *);
@@ -141,7 +141,7 @@ bool g_buffer_view_unhighlight_segments(GBufferView *);
 void g_buffer_view_highlight_segments(GBufferView *, gint, gint);
 
 /* Imprime la visualisation du tampon de code désassemblé. */
-void g_buffer_view_draw(const GBufferView *, cairo_t *, gint, gint, const cairo_rectangle_int_t *, bool, bool, bool);
+void g_buffer_view_draw(const GBufferView *, cairo_t *, gint, gint, const cairo_rectangle_int_t *, const bool *);
 
 /* Fournit la ligne présente à une ordonnée donnée. */
 GBufferLine *g_buffer_view_find_line_at(GBufferView *, gint, size_t *);
diff --git a/src/gtkext/gtkblockview.c b/src/gtkext/gtkblockview.c
index 5e0a4cf..c0004b5 100644
--- a/src/gtkext/gtkblockview.c
+++ b/src/gtkext/gtkblockview.c
@@ -59,7 +59,7 @@ static gboolean gtk_block_view_button_press_event(GtkBlockView *, GdkEventButton
 static gboolean gtk_block_view_need_redraw(GBufferView *, GtkBlockView *);
 
 /* Prend acte de l'association d'un binaire chargé. */
-static void gtk_block_view_attach_binary(GtkBlockView *, GLoadedBinary *, bool *, bool *);
+static void gtk_block_view_attach_binary(GtkBlockView *, GLoadedBinary *);
 
 
 
@@ -212,8 +212,6 @@ static gboolean gtk_block_view_need_redraw(GBufferView *view, GtkBlockView *bloc
 *                                                                             *
 *  Paramètres  : view   = composant GTK à mettre à jour.                      *
 *                binary = binaire associé à intégrer.                         *
-*                addr   = indique si les positions doivent être affichées.    *
-*                code   = indique si le code binaire doit être affiché.       *
 *                                                                             *
 *  Description : Prend acte de l'association d'un binaire chargé.             *
 *                                                                             *
@@ -223,7 +221,7 @@ static gboolean gtk_block_view_need_redraw(GBufferView *view, GtkBlockView *bloc
 *                                                                             *
 ******************************************************************************/
 
-static void gtk_block_view_attach_binary(GtkBlockView *view, GLoadedBinary *binary, bool *addr, bool *code)
+static void gtk_block_view_attach_binary(GtkBlockView *view, GLoadedBinary *binary)
 {
     GCodeBuffer *buffer;                    /* Tampon par défaut           */
     GBufferView *bview;                     /* Vue sur ce même tampon      */
@@ -231,7 +229,7 @@ static void gtk_block_view_attach_binary(GtkBlockView *view, GLoadedBinary *bina
     buffer = g_loaded_binary_get_disassembled_buffer(binary);
     bview = g_buffer_view_new(buffer);
 
-    gtk_buffer_view_attach_buffer(GTK_BUFFER_VIEW(view), bview, addr, code);
+    gtk_buffer_view_attach_buffer(GTK_BUFFER_VIEW(view), bview);
 
     g_signal_connect(G_OBJECT(bview), "need-redraw",
                      G_CALLBACK(gtk_block_view_need_redraw), view);
diff --git a/src/gtkext/gtkbufferview.c b/src/gtkext/gtkbufferview.c
index 4b515b4..d5780ed 100644
--- a/src/gtkext/gtkbufferview.c
+++ b/src/gtkext/gtkbufferview.c
@@ -380,8 +380,7 @@ static gboolean gtk_buffer_view_draw(GtkWidget *widget, cairo_t *cr)
         fake_y = 0;
         gtk_buffer_view_compute_fake_coord(view, &fake_x, &fake_y);
 
-        g_buffer_view_draw(view->buffer_view, cr, fake_x, fake_y, &area,
-                           *pview->display_phys, *pview->display_addr, *pview->display_code);
+        g_buffer_view_draw(view->buffer_view, cr, fake_x, fake_y, &area, pview->display);
 
     }
 
@@ -459,10 +458,7 @@ static gboolean gtk_buffer_view_key_press(GtkWidget *widget, GdkEventKey *event)
 static void gtk_buffer_view_compute_requested_size(GtkBufferView *view, gint *width, gint *height)
 {
     if (width != NULL && view->buffer_view != NULL)
-        *width = g_buffer_view_get_width(view->buffer_view,
-                                         *GTK_VIEW_PANEL(view)->display_phys,
-                                         *GTK_VIEW_PANEL(view)->display_addr,
-                                         *GTK_VIEW_PANEL(view)->display_code);
+        *width = g_buffer_view_get_width(view->buffer_view, GTK_VIEW_PANEL(view)->display);
 
     if (height != NULL && view->buffer_view != NULL)
         *height = g_buffer_view_get_height(view->buffer_view);
@@ -528,9 +524,6 @@ static void gtk_buffer_view_cache_glance(GtkBufferView *view, cairo_t *cairo, co
 *                                                                             *
 *  Paramètres  : view   = composant GTK à mettre à jour.                      *
 *                buffer = tampon de lignes à encadrer.                        *
-*                phys   = indique si les positions doivent être affichées.    *
-*                virt   = indique si les adresses doivent être affichées.     *
-*                code   = indique si le code binaire doit être affiché.       *
 *                                                                             *
 *  Description : Prend acte de l'association d'un tampon de lignes.           *
 *                                                                             *
@@ -540,7 +533,7 @@ static void gtk_buffer_view_cache_glance(GtkBufferView *view, cairo_t *cairo, co
 *                                                                             *
 ******************************************************************************/
 
-void gtk_buffer_view_attach_buffer(GtkBufferView *view, GBufferView *buffer, /*bool *phys, */bool *addr, bool *code)
+void gtk_buffer_view_attach_buffer(GtkBufferView *view, GBufferView *buffer)
 {
     gint width;                             /* Largeur de l'objet actuelle */
     gint height;                            /* Hauteur de l'objet actuelle */
@@ -564,7 +557,7 @@ void gtk_buffer_view_attach_buffer(GtkBufferView *view, GBufferView *buffer, /*b
 
     /* Validation finale */
 
-    width = g_buffer_view_get_width(view->buffer_view, true/* FIXME : *phys*/, *addr, *code);
+    width = g_buffer_view_get_width(view->buffer_view, GTK_VIEW_PANEL(view)->display);
     height = g_buffer_view_get_height(view->buffer_view);
 
     width += -view->left_text + 1;
diff --git a/src/gtkext/gtkbufferview.h b/src/gtkext/gtkbufferview.h
index 7505cdd..1ee17fe 100644
--- a/src/gtkext/gtkbufferview.h
+++ b/src/gtkext/gtkbufferview.h
@@ -52,7 +52,7 @@ typedef struct _GtkBufferViewClass GtkBufferViewClass;
 GType gtk_buffer_view_get_type(void);
 
 /* Prend acte de l'association d'un tampon de lignes. */
-void gtk_buffer_view_attach_buffer(GtkBufferView *, GBufferView *, bool *, bool *);
+void gtk_buffer_view_attach_buffer(GtkBufferView *, GBufferView *);
 
 /* Fournit la vue associée au tampon de lignes courant. */
 GBufferView *gtk_buffer_view_get_buffer(const GtkBufferView *);
diff --git a/src/gtkext/gtkgraphview.c b/src/gtkext/gtkgraphview.c
index 7919b32..0265518 100644
--- a/src/gtkext/gtkgraphview.c
+++ b/src/gtkext/gtkgraphview.c
@@ -661,8 +661,6 @@ static GtkViewPanel **gtk_graph_view_load_nodes(GtkGraphView *view, GLoadedBinar
 {
     GtkViewPanel **result;                  /* Liste à retourner           */
     GCodeBuffer *buffer;                    /* Tampon brut à découper      */
-    bool *addr;                             /* Affichage des adresses ?    */
-    bool *code;                             /* Affichage du binaire ?      */
     size_t *count;                          /* Nombre d'éléments créés.    */
     GInstrBlock *main_block;                /* Premier bloc rattaché       */
     GInstrBlock **blocks;                   /* Liste des blocs basiques    */
@@ -673,9 +671,6 @@ static GtkViewPanel **gtk_graph_view_load_nodes(GtkGraphView *view, GLoadedBinar
 
     buffer = g_loaded_binary_get_disassembled_buffer(binary);
 
-    addr = GTK_VIEW_PANEL(view)->display_addr;
-    code = GTK_VIEW_PANEL(view)->display_code;
-
     count = &view->children_count;
 
     main_block = g_binary_routine_get_basic_blocks(routine);
@@ -690,7 +685,7 @@ static GtkViewPanel **gtk_graph_view_load_nodes(GtkGraphView *view, GLoadedBinar
     {
         result[i] = GTK_VIEW_PANEL(gtk_block_view_new());
         gtk_widget_show(GTK_WIDGET(result[i]));
-        gtk_view_panel_attach_binary(result[i], binary, addr, code);
+        gtk_view_panel_attach_binary(result[i], binary, BVW_BLOCK);
 
         gtk_view_panel_show_border(result[i], true);
 
@@ -698,7 +693,7 @@ static GtkViewPanel **gtk_graph_view_load_nodes(GtkGraphView *view, GLoadedBinar
 
         subview = g_buffer_view_new(buffer);
         g_buffer_view_restrict(subview, first, last);
-        gtk_buffer_view_attach_buffer(GTK_BUFFER_VIEW(result[i]), subview, addr, code);
+        gtk_buffer_view_attach_buffer(GTK_BUFFER_VIEW(result[i]), subview);
 
     }
 
diff --git a/src/gtkext/gtksourceview.c b/src/gtkext/gtksourceview.c
index 4a04427..0b008fa 100644
--- a/src/gtkext/gtksourceview.c
+++ b/src/gtkext/gtksourceview.c
@@ -53,7 +53,7 @@ static void gtk_source_view_class_init(GtkSourceViewClass *);
 static void gtk_source_view_init(GtkSourceView *);
 
 /* Prend acte de l'association d'un binaire chargé. */
-static void gtk_source_view_attach_binary(GtkSourceView *, GLoadedBinary *, bool *, bool *);
+static void gtk_source_view_attach_binary(GtkSourceView *, GLoadedBinary *);
 
 
 
@@ -134,8 +134,6 @@ GtkWidget *gtk_source_view_new(void)
 *                                                                             *
 *  Paramètres  : view   = composant GTK à mettre à jour.                      *
 *                binary = binaire associé à intégrer.                         *
-*                addr   = indique si les positions doivent être affichées.    *
-*                code   = indique si le code binaire doit être affiché.       *
 *                                                                             *
 *  Description : Prend acte de l'association d'un binaire chargé.             *
 *                                                                             *
@@ -145,7 +143,7 @@ GtkWidget *gtk_source_view_new(void)
 *                                                                             *
 ******************************************************************************/
 
-static void gtk_source_view_attach_binary(GtkSourceView *view, GLoadedBinary *binary, bool *addr, bool *code)
+static void gtk_source_view_attach_binary(GtkSourceView *view, GLoadedBinary *binary)
 {
     GCodeBuffer *buffer;                    /* Tampon par défaut           */
 
@@ -153,6 +151,6 @@ static void gtk_source_view_attach_binary(GtkSourceView *view, GLoadedBinary *bi
 
     /* Si une source existe... */
     if (buffer != NULL)
-        gtk_buffer_view_attach_buffer(GTK_BUFFER_VIEW(view), g_buffer_view_new(buffer), addr, code);
+        gtk_buffer_view_attach_buffer(GTK_BUFFER_VIEW(view), g_buffer_view_new(buffer));
 
 }
diff --git a/src/gtkext/gtkviewpanel-int.h b/src/gtkext/gtkviewpanel-int.h
index f89fdcf..49b5195 100644
--- a/src/gtkext/gtkviewpanel-int.h
+++ b/src/gtkext/gtkviewpanel-int.h
@@ -37,7 +37,7 @@
 typedef void (* compute_requested_size) (GtkViewPanel *, gint *, gint *);
 
 /* Prend acte de l'association d'un binaire chargé. */
-typedef void (* attach_binary_fc) (GtkViewPanel *, GLoadedBinary *, bool *, bool *);
+typedef void (* attach_binary_fc) (GtkViewPanel *, GLoadedBinary *);
 
 /* Réagit à la sélection externe d'une adresse. */
 typedef void (* define_address_fc) (GtkViewPanel *, vmpa_t);
@@ -64,6 +64,8 @@ struct _GtkViewPanel
     GtkScrollablePolicy vscroll_policy;     /* Politique verticale         */           
 
     bool show_border;                       /* Affichage d'une bordure ?   */
+    BinaryView content;                     /* Type de contenu             */
+    const bool *display;                    /* Affichage des colonnes ?    */
 
     GLoadedBinary *binary;                  /* Binaire à visualiser        */
 
@@ -72,10 +74,6 @@ struct _GtkViewPanel
     prepare_resize_fc resize;               /* Prépare une nouvelle taille */
     cache_glance_fc cache_glance;           /* Cache de la mignature       */
 
-    bool *display_phys;                     /* Affichage des adresses ?    */
-    bool *display_addr;                     /* Affichage des adresses ?    */
-    bool *display_code;                     /* Affichage du code binaire ? */
-
 };
 
 /* Composant d'affichage générique (classe) */
diff --git a/src/gtkext/gtkviewpanel.c b/src/gtkext/gtkviewpanel.c
index 1933add..27799b5 100644
--- a/src/gtkext/gtkviewpanel.c
+++ b/src/gtkext/gtkviewpanel.c
@@ -68,7 +68,8 @@ static void gtk_view_panel_update_adjustment(GtkViewPanel *, GtkOrientation);
 /* Réagit à un défilement chez une barre associée au composant.*/
 static void gtk_view_panel_adjustment_value_changed(GtkAdjustment *, GtkViewPanel *);
 
-
+/* Réagit à un changement des règles d'affichage. */
+static void on_view_panel_binary_display_change(GLoadedBinary *, BinaryView, BufferLineColumn, GtkViewPanel *);
 
 
 
@@ -576,32 +577,29 @@ static void gtk_view_panel_adjustment_value_changed(GtkAdjustment *adj, GtkViewP
 
 /******************************************************************************
 *                                                                             *
-*  Paramètres  : panel = composant GTK à mettre à jour.                       *
-*                show  = état de l'affichage auquel parvenir.                 *
+*  Paramètres  : panel = composant GTK à consulter.                           *
 *                                                                             *
-*  Description : Définit si une bordure est à afficher.                       *
+*  Description : Indique le type de contenu représenté par le composant.      *
 *                                                                             *
-*  Retour      : -                                                            *
+*  Retour      : Identifiant d'un type de représentation de contenu.          *
 *                                                                             *
 *  Remarques   : -                                                            *
 *                                                                             *
 ******************************************************************************/
 
-void gtk_view_panel_show_border(GtkViewPanel *panel, bool show)
+BinaryView gtk_view_panel_describe_content(const GtkViewPanel *panel)
 {
-    panel->show_border = show;
+    return panel->content;
 
 }
 
 
 /******************************************************************************
 *                                                                             *
-*  Paramètres  : panel  = composant GTK à mettre à jour.                      *
-*                binary = binaire associé à intégrer.                         *
-*                addr   = indique si les positions doivent être affichées.    *
-*                code   = indique si le code binaire doit être affiché.       *
+*  Paramètres  : panel = composant GTK à mettre à jour.                       *
+*                show  = état de l'affichage auquel parvenir.                 *
 *                                                                             *
-*  Description : Associe à un panneau d'affichage un binaire chargé.          *
+*  Description : Définit si une bordure est à afficher.                       *
 *                                                                             *
 *  Retour      : -                                                            *
 *                                                                             *
@@ -609,46 +607,20 @@ void gtk_view_panel_show_border(GtkViewPanel *panel, bool show)
 *                                                                             *
 ******************************************************************************/
 
-void gtk_view_panel_attach_binary(GtkViewPanel *panel, GLoadedBinary *binary, bool *addr, bool *code)
-{
-    g_object_ref(G_OBJECT(binary));
-    panel->binary = binary;
-
-    panel->display_phys = addr;
-    panel->display_addr = addr;
-    panel->display_code = code;
-
-    if (panel->attach != NULL) /* REMME ? */
-        panel->attach(panel, binary, addr, code);
-
-}
-
-
-/******************************************************************************
-*                                                                             *
-*  Paramètres  : panel = composant GTK à consulter.                           *
-*                                                                             *
-*  Description : Indique si les adresses doivent apparaître dans le rendu.    *
-*                                                                             *
-*  Retour      : Consigne d'affichage.                                        *
-*                                                                             *
-*  Remarques   : -                                                            *
-*                                                                             *
-******************************************************************************/
-
-bool gtk_view_panel_get_addresses_display(const GtkViewPanel *panel)
+void gtk_view_panel_show_border(GtkViewPanel *panel, bool show)
 {
-    return *panel->display_addr;
+    panel->show_border = show;
 
 }
 
 
 /******************************************************************************
 *                                                                             *
-*  Paramètres  : panel = composant GTK à consulter.                           *
-*                state = nouvel état à prendre en compte.                     *
+*  Paramètres  : panel  = composant GTK à mettre à jour.                      *
+*                binary = binaire associé à intégrer.                         *
+*                view   = aspect du binaire à présenter.                      *
 *                                                                             *
-*  Description : Définit si les adresses doivent apparaître dans le rendu.    *
+*  Description : Associe à un panneau d'affichage un binaire chargé.          *
 *                                                                             *
 *  Retour      : -                                                            *
 *                                                                             *
@@ -656,49 +628,30 @@ bool gtk_view_panel_get_addresses_display(const GtkViewPanel *panel)
 *                                                                             *
 ******************************************************************************/
 
-void gtk_view_panel_set_addresses_display(GtkViewPanel *panel, bool state)
+void gtk_view_panel_attach_binary(GtkViewPanel *panel, GLoadedBinary *binary, BinaryView view)
 {
-    if (*panel->display_addr != state)
-    {
-        *panel->display_addr = state;
-
-        if (panel->resize != NULL)
-            panel->resize(panel);
-
-        gtk_widget_queue_resize(gtk_widget_get_parent(GTK_WIDGET(panel)));
-        gtk_widget_queue_resize(GTK_WIDGET(panel));
-        gtk_widget_queue_draw(GTK_WIDGET(panel));
-
-    }
-
-}
+    g_object_ref(G_OBJECT(binary));
+    panel->binary = binary;
 
+    panel->content = view;
+    panel->display = g_loaded_binary_get_column_display(binary, view);
 
-/******************************************************************************
-*                                                                             *
-*  Paramètres  : panel = composant GTK à consulter.                           *
-*                                                                             *
-*  Description : Indique si le code doit apparaître dans le rendu.            *
-*                                                                             *
-*  Retour      : Consigne d'affichage.                                        *
-*                                                                             *
-*  Remarques   : -                                                            *
-*                                                                             *
-******************************************************************************/
+    if (panel->attach != NULL) /* REMME */
+        panel->attach(panel, binary);
 
-bool gtk_view_panel_get_code_display(const GtkViewPanel *panel)
-{
-    return *panel->display_code;
+    g_signal_connect(binary, "display-changed", G_CALLBACK(on_view_panel_binary_display_change), panel);
 
 }
 
 
 /******************************************************************************
 *                                                                             *
-*  Paramètres  : panel = composant GTK à consulter.                           *
-*                state = nouvel état à prendre en compte.                     *
+*  Paramètres  : binary = bianire dont les consignes d'affichage ont évolué.  *
+*                view   = type d'affichage à considérer.                      *
+*                col    = colonne dont le statut a changé.                    *
+*                panel  = composant GTK à consulter.                          *
 *                                                                             *
-*  Description : Définit si le code doit apparaître dans le rendu.            *
+*  Description : Réagit à un changement des règles d'affichage.               *
 *                                                                             *
 *  Retour      : -                                                            *
 *                                                                             *
@@ -706,12 +659,10 @@ bool gtk_view_panel_get_code_display(const GtkViewPanel *panel)
 *                                                                             *
 ******************************************************************************/
 
-void gtk_view_panel_set_code_display(GtkViewPanel *panel, bool state)
+static void on_view_panel_binary_display_change(GLoadedBinary *binary, BinaryView view, BufferLineColumn col, GtkViewPanel *panel)
 {
-    if (*panel->display_code != state)
+    if (panel->content == view)
     {
-        *panel->display_code = state;
-
         if (panel->resize != NULL)
             panel->resize(panel);
 
diff --git a/src/gtkext/gtkviewpanel.h b/src/gtkext/gtkviewpanel.h
index c8d0f6c..95f2084 100644
--- a/src/gtkext/gtkviewpanel.h
+++ b/src/gtkext/gtkviewpanel.h
@@ -50,21 +50,18 @@ typedef struct _GtkViewPanelClass GtkViewPanelClass;
 /* Détermine le type du composant d'affichage générique. */
 GType gtk_view_panel_get_type(void);
 
+/* Indique le type de contenu représenté par le composant. */
+BinaryView gtk_view_panel_describe_content(const GtkViewPanel *);
+
 /* Définit si une bordure est à afficher. */
 void gtk_view_panel_show_border(GtkViewPanel *, bool);
 
 /* Associe à un panneau d'affichage un binaire chargé. */
-void gtk_view_panel_attach_binary(GtkViewPanel *, GLoadedBinary *, bool *, bool *);
-
-/* Indique si les adresses doivent apparaître dans le rendu. */
-bool gtk_view_panel_get_addresses_display(const GtkViewPanel *);
+void gtk_view_panel_attach_binary(GtkViewPanel *, GLoadedBinary *, BinaryView);
 
 /* Définit si les adresses doivent apparaître dans le rendu. */
 void gtk_view_panel_set_addresses_display(GtkViewPanel *, bool);
 
-/* Indique si le code doit apparaître dans le rendu. */
-bool gtk_view_panel_get_code_display(const GtkViewPanel *);
-
 /* Définit si le code doit apparaître dans le rendu. */
 void gtk_view_panel_set_code_display(GtkViewPanel *, bool);
 
diff --git a/src/gui/menus/view.c b/src/gui/menus/view.c
index 511d9db..9abcbd3 100644
--- a/src/gui/menus/view.c
+++ b/src/gui/menus/view.c
@@ -38,11 +38,8 @@
 /* Réagit avec le menu "Affichage -> Vue xxx". */
 static void mcb_view_change_support(GtkRadioMenuItem *, GMenuBar *);
 
-/* Réagit avec le menu "Affichage -> Adresse virtuelle". */
-static void mcb_view_addresses(GtkCheckMenuItem *, GMenuBar *);
-
-/* Réagit avec le menu "Affichage -> code binaire". */
-static void mcb_view_code(GtkCheckMenuItem *, GMenuBar *);
+/* Réagit avec le menu "Affichage -> (colonne xxx)". */
+static void mcb_view_display_column(GtkCheckMenuItem *, GMenuBar *);
 
 
 
@@ -98,12 +95,19 @@ GtkWidget *build_menu_view(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *bar)
     submenuitem = qck_create_menu_separator();
     gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
 
+    submenuitem = qck_create_check_menu_item(G_OBJECT(result), "off", _("Physical offset"),
+                                             G_CALLBACK(mcb_view_display_column), bar);
+    g_object_set_data(G_OBJECT(submenuitem), "kind_of_col", GUINT_TO_POINTER(BLC_PHYSICAL));
+    gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
+
     submenuitem = qck_create_check_menu_item(G_OBJECT(result), "addr", _("Virtual address"),
-                                             G_CALLBACK(mcb_view_addresses), bar);
+                                             G_CALLBACK(mcb_view_display_column), bar);
+    g_object_set_data(G_OBJECT(submenuitem), "kind_of_col", GUINT_TO_POINTER(BLC_VIRTUAL));
     gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
 
     submenuitem = qck_create_check_menu_item(G_OBJECT(result), "code", _("Binary code"),
-                                             G_CALLBACK(mcb_view_code), bar);
+                                             G_CALLBACK(mcb_view_display_column), bar);
+    g_object_set_data(G_OBJECT(submenuitem), "kind_of_col", GUINT_TO_POINTER(BLC_BINARY));
     gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
 
     submenuitem = qck_create_menu_separator();
@@ -130,30 +134,50 @@ GtkWidget *build_menu_view(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *bar)
 
 void update_menu_view_for_view(GtkWidget *widget, GtkViewPanel *view, GMenuBar *bar)
 {
+    GLoadedBinary *binary;                  /* Binaire courant             */
+    BinaryView content;                     /* Type de vue active          */
+    const bool *display;                    /* Règles d'affichage courantes*/
     GtkWidget *submenuitem;                 /* Sous-élément de menu        */
     bool status;                            /* Consigne d'affichage        */
 
+    binary = g_editor_item_get_current_binary(G_EDITOR_ITEM(bar));
+
+    content = gtk_view_panel_describe_content(view);
+
+    display = g_loaded_binary_get_column_display(binary, content);
+
+    /* Positions physiques */
+
+    submenuitem = g_object_get_data(G_OBJECT(widget), "off");
+
+    g_signal_handlers_disconnect_by_func(submenuitem, G_CALLBACK(mcb_view_display_column), bar);
+
+    status = display[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), bar);
+
     /* Adresses virtuelles */
 
     submenuitem = g_object_get_data(G_OBJECT(widget), "addr");
 
-    g_signal_handlers_disconnect_by_func(submenuitem, G_CALLBACK(mcb_view_addresses), bar);
+    g_signal_handlers_disconnect_by_func(submenuitem, G_CALLBACK(mcb_view_display_column), bar);
 
-    status = gtk_view_panel_get_addresses_display(view);
+    status = display[BLC_VIRTUAL];
     gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(submenuitem), status);
 
-    g_signal_connect(submenuitem, "toggled", G_CALLBACK(mcb_view_addresses), bar);
+    g_signal_connect(submenuitem, "toggled", G_CALLBACK(mcb_view_display_column), bar);
 
     /* Code binaire */
 
     submenuitem = g_object_get_data(G_OBJECT(widget), "code");
 
-    g_signal_handlers_disconnect_by_func(submenuitem, G_CALLBACK(mcb_view_code), bar);
+    g_signal_handlers_disconnect_by_func(submenuitem, G_CALLBACK(mcb_view_display_column), bar);
 
-    status = gtk_view_panel_get_code_display(view);
+    status = display[BLC_BINARY];
     gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(submenuitem), status);
 
-    g_signal_connect(submenuitem, "toggled", G_CALLBACK(mcb_view_code), bar);
+    g_signal_connect(submenuitem, "toggled", G_CALLBACK(mcb_view_display_column), bar);
 
 }
 
@@ -227,7 +251,7 @@ static void mcb_view_change_support(GtkRadioMenuItem *menuitem, GMenuBar *bar)
 *  Paramètres  : menuitem = élément de menu ayant basculé.                    *
 *                bar      = barre de menu parente.                            *
 *                                                                             *
-*  Description : Réagit avec le menu "Affichage -> Adresse virtuelle".        *
+*  Description : Réagit avec le menu "Affichage -> (colonne xxx)".            *
 *                                                                             *
 *  Retour      : -                                                            *
 *                                                                             *
@@ -235,40 +259,23 @@ static void mcb_view_change_support(GtkRadioMenuItem *menuitem, GMenuBar *bar)
 *                                                                             *
 ******************************************************************************/
 
-static void mcb_view_addresses(GtkCheckMenuItem *menuitem, GMenuBar *bar)
+static void mcb_view_display_column(GtkCheckMenuItem *menuitem, GMenuBar *bar)
 {
+    BufferLineColumn col;                   /* Colonne à traiter           */
+    GLoadedBinary *binary;                  /* Binaire courant             */
     GtkViewPanel *panel;                    /* Affichage courant           */
+    BinaryView view;                        /* Type de vue représentée     */
     gboolean active;                        /* Etat de sélection du menu   */
 
-    panel = g_editor_item_get_current_view(G_EDITOR_ITEM(bar));
-    active = gtk_check_menu_item_get_active(menuitem);
-
-    gtk_view_panel_set_addresses_display(panel, active);
-
-}
-
+    col = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(menuitem), "kind_of_col"));
 
-/******************************************************************************
-*                                                                             *
-*  Paramètres  : menuitem = élément de menu ayant basculé.                    *
-*                bar      = barre de menu parente.                            *
-*                                                                             *
-*  Description : Réagit avec le menu "Affichage -> code binaire".             *
-*                                                                             *
-*  Retour      : -                                                            *
-*                                                                             *
-*  Remarques   : -                                                            *
-*                                                                             *
-******************************************************************************/
-
-static void mcb_view_code(GtkCheckMenuItem *menuitem, GMenuBar *bar)
-{
-    GtkViewPanel *panel;                    /* Affichage courant           */
-    gboolean active;                        /* Etat de sélection du menu   */
+    binary = g_editor_item_get_current_binary(G_EDITOR_ITEM(bar));
 
     panel = g_editor_item_get_current_view(G_EDITOR_ITEM(bar));
+    view = gtk_view_panel_describe_content(panel);
+
     active = gtk_check_menu_item_get_active(menuitem);
 
-    gtk_view_panel_set_code_display(panel, active);
+    g_loaded_binary_set_column_display(binary, view, col, active);
 
 }
diff --git a/src/project.c b/src/project.c
index dc0c446..7c98d96 100644
--- a/src/project.c
+++ b/src/project.c
@@ -382,9 +382,7 @@ size_t g_study_project_attach_binary(GStudyProject *project, GLoadedBinary *bina
 
         loaded->views[i] = GTK_VIEW_PANEL(view);
 
-        gtk_view_panel_attach_binary(loaded->views[i], binary,
-                                     g_loaded_binary_display_addresses_in_text(binary, i),
-                                     g_loaded_binary_display_code_in_text(binary, i));
+        gtk_view_panel_attach_binary(loaded->views[i], binary, i);
 
         /* Intégration finale dans un support défilant */
 
-- 
cgit v0.11.2-87-g4458