From 84790a5b420d0a9ce658013573b180ce059db325 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Sun, 26 Jan 2014 23:00:18 +0000
Subject: Saved the first steps of the migration to GTK+ v3.

git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@367 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
---
 ChangeLog                     |  44 +++
 configure.ac                  |   4 +-
 src/arch/archbase.h           |   4 +-
 src/dialogs/Makefile.am       |   4 +-
 src/dialogs/about.c           |   6 +-
 src/dialogs/add_shellcode.c   | 832 ------------------------------------------
 src/dialogs/add_shellcode.h   |  37 --
 src/dialogs/binparts.c        |   6 +-
 src/dialogs/export.c          |   2 +-
 src/dialogs/export.h          |   2 +-
 src/dialogs/goto.c            |   4 +-
 src/dialogs/shellcode.c       | 825 +++++++++++++++++++++++++++++++++++++++++
 src/dialogs/shellcode.h       |  37 ++
 src/editor.h                  |   2 +-
 src/glibext/gbufferline.h     |   3 -
 src/glibext/gcodebuffer.c     | 111 +++---
 src/glibext/gcodebuffer.h     |  12 +-
 src/glibext/gfontcache.h      |   2 +-
 src/gtkext/graph/edge.c       |  29 +-
 src/gtkext/graph/edge.h       |   5 +-
 src/gtkext/graph/layout.c     |  28 +-
 src/gtkext/graph/layout.h     |   5 +-
 src/gtkext/gtkbinarystrip.c   |  55 ++-
 src/gtkext/gtkblockview.h     |   2 +-
 src/gtkext/gtkbufferview.c    | 182 +++++----
 src/gtkext/gtkbufferview.h    |   2 +-
 src/gtkext/gtkdockstation.c   |   6 +-
 src/gtkext/gtkdockstation.h   |   8 +-
 src/gtkext/gtkgraphview.c     | 154 ++++----
 src/gtkext/gtkgraphview.h     |   2 +-
 src/gtkext/gtklinkrenderer.c  |  14 +-
 src/gtkext/gtklinkrenderer.h  |   6 +-
 src/gtkext/gtksourceview.h    |   2 +-
 src/gtkext/gtkviewpanel-int.h |   3 +-
 src/gtkext/gtkviewpanel.c     |  84 +++--
 src/gui/menus/project.c       |  94 +++++
 src/gui/panels/glance.c       |  47 +--
 src/gui/panels/panel.c        |   4 +
 src/gui/panels/welcome.c      |   2 +-
 src/panels/panel.h            |   2 +-
 src/project.h                 |   3 +-
 41 files changed, 1425 insertions(+), 1251 deletions(-)
 delete mode 100644 src/dialogs/add_shellcode.c
 delete mode 100644 src/dialogs/add_shellcode.h
 create mode 100644 src/dialogs/shellcode.c
 create mode 100644 src/dialogs/shellcode.h

diff --git a/ChangeLog b/ChangeLog
index 05b898d..2952edb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,47 @@
+14-01-26  Cyrille Bagard <nocbos@gmail.com>
+
+	* configure.ac:
+	* src/arch/archbase.h:
+	* src/dialogs/about.c:
+	* src/dialogs/add_shellcode.c:
+	* src/dialogs/add_shellcode.h:
+	* src/dialogs/binparts.c:
+	* src/dialogs/export.c:
+	* src/dialogs/export.h:
+	* src/dialogs/goto.c:
+	* src/dialogs/Makefile.am:
+	* src/dialogs/shellcode.c:
+	* src/dialogs/shellcode.h:
+	* src/editor.h:
+	* src/glibext/gbufferline.h:
+	* src/glibext/gcodebuffer.c:
+	* src/glibext/gcodebuffer.h:
+	* src/glibext/gfontcache.h:
+	* src/gtkext/graph/edge.c:
+	* src/gtkext/graph/edge.h:
+	* src/gtkext/graph/layout.c:
+	* src/gtkext/graph/layout.h:
+	* src/gtkext/gtkbinarystrip.c:
+	* src/gtkext/gtkblockview.h:
+	* src/gtkext/gtkbufferview.c:
+	* src/gtkext/gtkbufferview.h:
+	* src/gtkext/gtkdockstation.c:
+	* src/gtkext/gtkdockstation.h:
+	* src/gtkext/gtkgraphview.c:
+	* src/gtkext/gtkgraphview.h:
+	* src/gtkext/gtklinkrenderer.c:
+	* src/gtkext/gtklinkrenderer.h:
+	* src/gtkext/gtksourceview.h:
+	* src/gtkext/gtkviewpanel.c:
+	* src/gtkext/gtkviewpanel-int.h:
+	* src/gui/menus/project.c:
+	* src/gui/panels/glance.c:
+	* src/gui/panels/panel.c:
+	* src/gui/panels/welcome.c:
+	* src/panels/panel.h:
+	* src/project.h:
+	Save the first steps of the migration to GTK+ v3.
+
 14-01-13  Cyrille Bagard <nocbos@gmail.com>
 
 	* src/common/Makefile.am:
diff --git a/configure.ac b/configure.ac
index 1041850..6ce670a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -160,10 +160,10 @@ AC_SUBST(COMPLIANCE_FLAGS)
 
 #--- Checks for GTK 2.0
 
-PKG_CHECK_MODULES(LIBGTK,gtk+-2.0 >= 2.4.3,[libgtk_found=yes],[libgtk_found=no])
+PKG_CHECK_MODULES(LIBGTK,gtk+-3.0 >= 3.8.6,[libgtk_found=yes],[libgtk_found=no])
 
 if test "$libgtk_found" = "yes"; then
-   libgtk_version=`pkg-config gtk+-2.0 --modversion`
+   libgtk_version=`pkg-config gtk+-3.0 --modversion`
 else
    libgtk_version='-'
 fi
diff --git a/src/arch/archbase.h b/src/arch/archbase.h
index 5ef412c..407d66c 100644
--- a/src/arch/archbase.h
+++ b/src/arch/archbase.h
@@ -30,8 +30,8 @@
 
 
 
-#define OFF_FMT     "%ld"
-#define OFF_CAST(v) ((long)v)
+#define OFF_FMT     "%llu"
+#define OFF_CAST(v) ((unsigned long long)v)
 
 
 /* Octet de données binaires */
diff --git a/src/dialogs/Makefile.am b/src/dialogs/Makefile.am
index 70642b2..05bd50e 100644
--- a/src/dialogs/Makefile.am
+++ b/src/dialogs/Makefile.am
@@ -3,11 +3,11 @@ noinst_LTLIBRARIES  = libdialogs.la
 
 libdialogs_la_SOURCES =					\
 	about.h about.c						\
-	add_shellcode.h add_shellcode.c		\
 	binparts.h binparts.c				\
 	export.h export.c					\
 	goto.h goto.c						\
-	plugins.h plugins.c
+	plugins.h plugins.c					\
+	shellcode.h shellcode.c
 
 libdialogs_la_LDFLAGS = 
 
diff --git a/src/dialogs/about.c b/src/dialogs/about.c
index 8773e31..1a1b064 100644
--- a/src/dialogs/about.c
+++ b/src/dialogs/about.c
@@ -52,7 +52,7 @@
 GtkWidget *create_about_dialog(GtkWindow *parent)
 {
     GtkWidget *result;                      /* Fenêtre à renvoyer          */
-    GtkStyle *style;                        /* Style associé à la fenêtre  */
+    GdkRGBA color;                          /* Couleur de fond noire       */
     GtkWidget *fixed;                       /* Support global              */
     gchar *filename;                        /* Chemin d'accès au fichier   */
     GtkWidget *image;                       /* Image chargée               */
@@ -71,8 +71,8 @@ GtkWidget *create_about_dialog(GtkWindow *parent)
     gtk_window_set_default_size(GTK_WINDOW(result), 350, 430);
     gtk_window_set_type_hint(GTK_WINDOW(result), GDK_WINDOW_TYPE_HINT_DIALOG);
 
-    style = gtk_widget_get_style(result);
-    gtk_widget_modify_bg(result, GTK_STATE_NORMAL, &style->black);
+    gdk_rgba_parse(&color, "black");
+    gtk_widget_override_background_color(GTK_WIDGET(result), GTK_STATE_FLAG_NORMAL, &color);
 
     fixed = gtk_fixed_new();
     gtk_widget_show(fixed);
diff --git a/src/dialogs/add_shellcode.c b/src/dialogs/add_shellcode.c
deleted file mode 100644
index ab59b36..0000000
--- a/src/dialogs/add_shellcode.c
+++ /dev/null
@@ -1,832 +0,0 @@
-
-/* OpenIDA - Outil d'analyse de fichiers binaires
- * export.c - assistant d'exportation de contenu binaire
- *
- * Copyright (C) 2011-2012 Cyrille Bagard
- *
- *  This file is part of OpenIDA.
- *
- *  OpenIDA 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.
- *
- *  OpenIDA 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 Foobar.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#include "add_shellcode.h"
-
-
-#include <malloc.h>
-#include <regex.h>
-#include <stdio.h>
-#include <string.h>
-
-
-#include "../gtkext/easygtk.h"
-
-
-
-
-#include "../analysis/roptions.h"     // A garder ?
-
-
-#ifndef _
-#   define _(str) str
-#endif
-
-
-
-
-/* ------------------------ PARTIE PRINCIPALE DE L'ASSISTANT ------------------------ */
-
-
-/* Ferme l'assistant sans dérouler la procédure. */
-static void export_assistant_cancel(GtkAssistant *, gpointer);
-
-/* Ferme l'assistant et déroule la procédure. */
-static void export_assistant_close(GtkAssistant *, GObject *);
-
-
-
-/* -------------------------- RECUPERATION DU CODE BINAIRE -------------------------- */
-
-
-/* Ajoute le panneau de consitution du code binaire. */
-static void register_bincode_panel(GtkAssistant *);
-
-/* Fournit si possible le code binaire utilisateur. */
-static bool extract_shell_code(GObject *, bin_t **, off_t *);
-
-/* Réagit à une modification du code binaire. */
-static void on_bincode_changed(GtkTextBuffer *, GObject *);
-
-
-
-/* ----------------------- DEFINITION DE L'ARCHITECTURE VISEE ----------------------- */
-
-
-/* Ajoute le panneau de spécification de l'architecture. */
-static void register_archi_panel(GtkAssistant *);
-
-
-
-
-
-/* -------------------- DEFINITION DES REGLAGES DE L'EXPORTATION -------------------- */
-
-
-/* Ajoute le panneau de choix du type de sortie. */
-static void register_output_panel(GtkAssistant *);
-
-/* Réagit un changement du nom de fichier pour l'exportation. */
-static void on_export_filename_changed(GtkEntry *, GtkAssistant *);
-
-/* Sélectionne ou non un nouveau fichier de sortie. */
-static void on_filename_browsing_clicked(GtkButton *, GObject *);
-
-
-
-/* ------------------------- SELECTION DU CONTENU A TRAITER ------------------------- */
-
-
-/* Ajoute le panneau de sélection du contenu à exporter. */
-static void register_content_panel(GtkAssistant *);
-
-
-
-/* ---------------------------------------------------------------------------------- */
-/*                          PARTIE PRINCIPALE DE L'ASSISTANT                          */
-/* ---------------------------------------------------------------------------------- */
-
-
-/******************************************************************************
-*                                                                             *
-*  Paramètres  : project = projet courant à compléter.                        *
-*                parent  = fenêtre principale de l'éditeur.                   *
-*                                                                             *
-*  Description : Crée et affiche un assistant d'ajout de binaire.             *
-*                                                                             *
-*  Retour      : -                                                            *
-*                                                                             *
-*  Remarques   : -                                                            *
-*                                                                             *
-******************************************************************************/
-
-void run_add_shellcode_assistant(GStudyProject *project, GtkWindow *parent)
-{
-    GtkWidget *assistant;                   /* Fenêtre à afficher          */
-    GObject *ref;                           /* Espace de référencement     */
-
-    assistant = gtk_assistant_new();
-    gtk_widget_set_size_request(assistant, 450, 300);
-    gtk_window_set_position(GTK_WINDOW(assistant), GTK_WIN_POS_CENTER);
-    gtk_window_set_title(GTK_WINDOW(assistant), _("Shellcode assistant"));
-
-    gtk_window_set_modal(GTK_WINDOW(assistant), TRUE);
-    gtk_window_set_transient_for(GTK_WINDOW(assistant), parent);
-
-    ref = G_OBJECT(assistant);
-    //g_object_set_data(ref, "binary", binary);
-
-    register_bincode_panel(GTK_ASSISTANT(assistant));
-    register_archi_panel(GTK_ASSISTANT(assistant));
-    //register_output_panel(GTK_ASSISTANT(assistant));
-    //register_content_panel(GTK_ASSISTANT(assistant));
-
-    g_signal_connect(G_OBJECT(assistant), "cancel", G_CALLBACK(export_assistant_cancel), NULL);
-    g_signal_connect(G_OBJECT(assistant), "close", G_CALLBACK(export_assistant_close), ref);
-
-    gtk_widget_show_all(assistant);
-
-}
-
-
-/******************************************************************************
-*                                                                             *
-*  Paramètres  : assistant = fenêtre à compléter et référencement global.     *
-*                data      = adresse non utilisée ici.                        *
-*                                                                             *
-*  Description : Ferme l'assistant sans dérouler la procédure.                *
-*                                                                             *
-*  Retour      : -                                                            *
-*                                                                             *
-*  Remarques   : -                                                            *
-*                                                                             *
-******************************************************************************/
-
-static void export_assistant_cancel(GtkAssistant *assistant, gpointer data)
-{
-    gtk_widget_destroy(GTK_WIDGET(assistant));
-
-}
-
-
-/******************************************************************************
-*                                                                             *
-*  Paramètres  : assistant = fenêtre à compléter et référencement global.     *
-*                ref       = adresse de l'espace de référencement global.     *
-*                                                                             *
-*  Description : Ferme l'assistant et déroule la procédure.                   *
-*                                                                             *
-*  Retour      : -                                                            *
-*                                                                             *
-*  Remarques   : -                                                            *
-*                                                                             *
-******************************************************************************/
-
-static void export_assistant_close(GtkAssistant *assistant, GObject *ref)
-{
-    GLoadedBinary *binary;                  /* Binaire chargé à parcourir  */
-    GExeFormat *format;                     /* Format du binaire           */
-    GRenderingOptions *options;             /* Options d'exportation       */
-    GtkToggleButton *checkbutton;           /* Coche à retrouver           */
-    gboolean state;                         /* Valeur à prendre en compte  */
-    GtkEntry *entry;                        /* Zone de saisie              */
-    const gchar *filename;                  /* Chemin d'accès du fichier   */
-
-    //binary = G_LOADED_BINARY(g_object_get_data(ref, "binary"));
-
-    format = g_loaded_binary_get_format(binary);
-    options = g_rendering_options_new(format);
-
-    /* Eléments à afficher */
-
-    checkbutton = GTK_TOGGLE_BUTTON(g_object_get_data(ref, "virtual_addr"));
-    state = gtk_toggle_button_get_active(checkbutton);
-    g_rendering_options_show_address(options, MRD_BLOCK, state);
-
-    checkbutton = GTK_TOGGLE_BUTTON(g_object_get_data(ref, "binary_code"));
-    state = gtk_toggle_button_get_active(checkbutton);
-    g_rendering_options_show_code(options, MRD_BLOCK, state);
-
-    checkbutton = GTK_TOGGLE_BUTTON(g_object_get_data(ref, "assembly_code"));
-    state = gtk_toggle_button_get_active(checkbutton);
-
-    /* Programmation de la tâche */
-    /*
-    entry = GTK_ENTRY(g_object_get_data(ref, "filename"));
-    filename = gtk_entry_get_text(entry);
-
-    export = g_delayed_export_new(filename, binary, options);
-
-    queue = get_work_queue();
-    g_work_queue_schedule_work(queue, G_DELAYED_WORK(export));
-    */
-    gtk_widget_destroy(GTK_WIDGET(assistant));
-
-}
-
-
-
-/* ---------------------------------------------------------------------------------- */
-/*                            RECUPERATION DU CODE BINAIRE                            */
-/* ---------------------------------------------------------------------------------- */
-
-
-/******************************************************************************
-*                                                                             *
-*  Paramètres  : assistant = fenêtre à compléter et référencement global.     *
-*                                                                             *
-*  Description : Ajoute le panneau de consitution du code binaire.            *
-*                                                                             *
-*  Retour      : -                                                            *
-*                                                                             *
-*  Remarques   : -                                                            *
-*                                                                             *
-******************************************************************************/
-
-static void register_bincode_panel(GtkAssistant *assistant)
-{
-    GtkWidget *alignment;                   /* Disposition sur le support  */
-    GtkWidget *vbox;                        /* Support principal           */
-    GtkWidget *scrolledwindow;              /* Support avec défilement     */
-    GtkWidget *textview;                    /* Zone de texte               */
-    GtkWidget *label;                       /* Etiquette du bilan          */
-
-    alignment = qck_create_padded_alignment(8, 8, 8, 8);
-
-    vbox = gtk_vbox_new(FALSE, 0);
-    gtk_widget_show(vbox);
-    gtk_container_add(GTK_CONTAINER(alignment), vbox);
-
-    /* Réception du code */
-
-    scrolledwindow = gtk_scrolled_window_new(NULL, NULL);
-    gtk_widget_show(scrolledwindow);
-    gtk_box_pack_start(GTK_BOX(vbox), scrolledwindow, TRUE, TRUE, 0);
-    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-    gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwindow), GTK_SHADOW_IN);
-
-    textview = qck_create_textview(G_OBJECT(assistant), "bincode",
-                                   G_CALLBACK(on_bincode_changed), assistant);
-    gtk_container_add(GTK_CONTAINER(scrolledwindow), textview);
-
-    /* Validation */
-
-    label = qck_create_label(G_OBJECT(assistant), "status", _("No code"));
-    gtk_misc_set_alignment(GTK_MISC(label), 0.5, 0.5);
-    gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
-
-    /* Intégration */
-
-    gtk_assistant_append_page(assistant, alignment);
-    gtk_assistant_set_page_title(assistant, alignment, _("Code"));
-    gtk_assistant_set_page_type(assistant, alignment, GTK_ASSISTANT_PAGE_INTRO);
-
-    gtk_assistant_set_page_complete(assistant, alignment, TRUE);
-
-    /* Choix par défaut */
-    /*
-    binary = G_LOADED_BINARY(g_object_get_data(G_OBJECT(assistant), "binary"));
-    filename = g_loaded_binary_get_filename(binary);
-
-    gtk_entry_set_text(GTK_ENTRY(entry), filename);
-    gtk_entry_append_text(GTK_ENTRY(entry), ".txt");
-
-    g_signal_connect(G_OBJECT(entry), "changed", G_CALLBACK(on_export_filename_changed), assistant);
-    */
-}
-
-
-/******************************************************************************
-*                                                                             *
-*  Paramètres  : ref    = espace de référencement global.                     *
-*                code   = code binaire recomposé. [OUT]                       *
-*                length = taille de ce code. [OUT]                            *
-*                                                                             *
-*  Description : Fournit si possible le code binaire utilisateur.             *
-*                                                                             *
-*  Retour      : Bilan de l'opération.                                        *
-*                                                                             *
-*  Remarques   : -                                                            *
-*                                                                             *
-******************************************************************************/
-
-static bool extract_shell_code(GObject *ref, bin_t **code, off_t *length)
-{
-    bool result;                            /* Bilan à retourner           */
-    GtkTextView *textview;                  /* Zone de texte               */
-    GtkTextBuffer *buffer;                  /* Tampon gérant le texte      */
-    GtkTextIter start;                      /* Début de la zone à traiter  */
-    GtkTextIter end;                        /* Fin de la zone à traiter    */
-    gchar *bincode;                         /* Code à filtrer              */ 
-    regex_t preg;                           /* Recherche d'un bloc         */
-    int ret;                                /* Bilan d'un appel            */
-    regoff_t pos;                           /* Point de départ de lecture  */
-    regmatch_t pmatch[3];                   /* Localisation de trouvailles */
-    regoff_t i;                             /* Boucle de parcours          */
-    char hex[3];                            /* Valeur hexadécimale         */
-
-    result = true;
-
-    *code = NULL;
-    *length = 0;
-
-
-    /* Constitution du contexte */
-
-    textview = GTK_TEXT_VIEW(g_object_get_data(ref, "bincode"));
-    buffer = gtk_text_view_get_buffer(textview);
-
-    gtk_text_buffer_get_bounds(buffer, &start, &end);
-    bincode = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
-
-
-    printf("---- %s ----\n", bincode);
-
-
-
-    /* Détermination des cibles */
-
-
-
-    ret = regcomp(&preg, "[^'\"]*(['\"])([^'\"]*)\\1", REG_EXTENDED);
-
-
-    printf("comp :: %d\n", ret);
-
-
-    /* Recomposition du code */
-
-
-    pos = 0;
-
-
-    ret = regexec(&preg, &bincode[pos], 3, pmatch, 0);
-
-    while (ret != REG_NOMATCH && result)
-    {
-
-
-        bincode[pos + pmatch[2].rm_eo] = '\0';
-
-        printf(" trouvé :: (%d ; %d) <=> %s\n",
-               pmatch[2].rm_so, pmatch[2].rm_eo, &bincode[pos + pmatch[2].rm_so]);
-
-
-
-        for (i = pos + pmatch[2].rm_so; i < (pos + pmatch[2].rm_eo) && result; i++)
-        {
-            *code = (bin_t *)realloc(*code, ++(*length) * sizeof(bin_t));
-
-            printf("Trying... %d < %d\n", i, pos + pmatch[2].rm_eo);
-
-            switch (bincode[i])
-            {
-                case '\\':
-                    if (++i >= (pos + pmatch[2].rm_eo))
-                    {
-                        printf("Exit !\n");
-                        result = false;
-                        break;
-                    }
-
-                    if (bincode[i] == 'x')
-                    {
-                        if (++i >= (pos + pmatch[2].rm_eo))
-                        {
-                            printf("Exit2 !\n");
-                            result = false;
-                            break;
-                        }
-
-                        if ((i + 2) > (pos + pmatch[2].rm_eo))
-                        {
-                            printf("Exit3 !\n");
-                            result = false;
-                            break;
-                        }
-
-                        memcpy(hex, &bincode[i], 2);
-                        hex[2] = '\0';
-
-                        (*code)[*length - 1] = strtol(hex, NULL, 16);
-
-                        i++;
-
-                    }
-                    else (*code)[*length - 1] = bincode[i];
-
-                    break;
-
-                default:
-                    (*code)[*length - 1] = bincode[i];
-                    break;
-
-            }
-
-        }
-
-        if (result)
-        {
-            pos += pmatch[2].rm_eo + 1;
-            ret = regexec(&preg, &bincode[pos], 3, pmatch, 0);
-        }
-
-    }
-
-
-
-
-    g_free(bincode);
-
-    if (!result && *code != NULL)
-    {
-        *length = 0;
-        free(*code);
-    }
-    /*
-    else if (*code != NULL)
-    {
-        *code = (bin_t *)realloc(*code, ++(*length) * sizeof(bin_t));
-        (*code)[*length - 1] = '\0';
-
-        printf(">>> code == '%s' <<<\n", *code);
-
-    }
-    */
-    return result;
-
-}
-
-
-/******************************************************************************
-*                                                                             *
-*  Paramètres  : textbuffer = composant concerné par l'action.                *
-*                ref        = espace de référencement global.                 *
-*                                                                             *
-*  Description : Réagit à une modification du code binaire.                   *
-*                                                                             *
-*  Retour      : -                                                            *
-*                                                                             *
-*  Remarques   : -                                                            *
-*                                                                             *
-******************************************************************************/
-
-static void on_bincode_changed(GtkTextBuffer *textbuffer, GObject *ref)
-{
-    bin_t *code;                            /* Code binaire extrait        */
-    off_t length;                           /* Taille des données lues     */
-    bool status;                            /* Bilan de l'extraction       */
-    GtkLabel *label;                        /* Etiquette à mettre à jour   */
-    char *markup;                           /* Affichage étendu            */
-
-    status = extract_shell_code(ref, &code, &length);
-
-    printf("extracted ! ==> %p %d -> %d\n", code, length, status);
-
-    label = GTK_LABEL(g_object_get_data(ref, "status"));
-
-    if (!status)
-        gtk_label_set_markup(label, _("<span color=\"red\"><b>Error while decoding</b></span>"));
-
-    else if (length > 0)
-    {
-        markup = g_markup_printf_escaped(_("<span color=\"#00cc00\"><b>Decoding OK (%d %s)</b></span>"),
-                                         length, length > 1 ? _("bytes") : _("byte"));
-        gtk_label_set_markup(label, markup);
-        g_free(markup);
-    }
-
-    else
-        gtk_label_set_markup(label, _("No code"));
-
-    if (length > 0)
-        free(code);
-
-}
-
-
-
-/* ---------------------------------------------------------------------------------- */
-/*                         DEFINITION DE L'ARCHITECTURE VISEE                         */
-/* ---------------------------------------------------------------------------------- */
-
-
-/******************************************************************************
-*                                                                             *
-*  Paramètres  : assistant = fenêtre à compléter et référencement global.     *
-*                                                                             *
-*  Description : Ajoute le panneau de spécification de l'architecture.        *
-*                                                                             *
-*  Retour      : -                                                            *
-*                                                                             *
-*  Remarques   : -                                                            *
-*                                                                             *
-******************************************************************************/
-
-static void register_archi_panel(GtkAssistant *assistant)
-{
-    GtkWidget *alignment;                   /* Disposition sur le support  */
-    GtkWidget *vbox;                        /* Support principal           */
-    GtkWidget *label;                       /* Etiquette d'indication      */
-    GtkWidget *combobox;                    /* Sélection du format         */
-
-
-
-
-
-
-    alignment = qck_create_padded_alignment(8, 8, 8, 8);
-
-    vbox = gtk_vbox_new(FALSE, 0);
-    gtk_widget_show(vbox);
-    gtk_container_add(GTK_CONTAINER(alignment), vbox);
-
-    /* Choix de l'architecture */
-
-    label = qck_create_label(NULL, NULL, _("Architecture:"));
-    gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
-
-    combobox = qck_create_combobox(G_OBJECT(assistant), "archi", G_CALLBACK(NULL), NULL);
-    gtk_box_pack_start(GTK_BOX(vbox), combobox, TRUE, TRUE, 0);
-
-    gtk_combo_box_append_text(GTK_COMBO_BOX(combobox), _("x86"));
-
-    gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0);
-
-    /* Taille de registre */
-
-    label = qck_create_label(NULL, NULL, _("Register size:"));
-    gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
-
-    combobox = qck_create_combobox(G_OBJECT(assistant), "rsize", G_CALLBACK(NULL), NULL);
-    gtk_box_pack_start(GTK_BOX(vbox), combobox, TRUE, TRUE, 0);
-
-    gtk_combo_box_append_text(GTK_COMBO_BOX(combobox), _("32 bits"));
-    gtk_combo_box_append_text(GTK_COMBO_BOX(combobox), _("16 bits"));
-
-    gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0);
-
-    /* Intégration */
-
-    gtk_assistant_append_page(assistant, alignment);
-    gtk_assistant_set_page_title(assistant, alignment, _("Architecture"));
-    gtk_assistant_set_page_type(assistant, alignment, GTK_ASSISTANT_PAGE_CONFIRM);
-
-    gtk_assistant_set_page_complete(assistant, alignment, TRUE);
-
-}
-
-
-
-
-
-
-
-
-
-
-/* ---------------------------------------------------------------------------------- */
-/*                      DEFINITION DES REGLAGES DE L'EXPORTATION                      */
-/* ---------------------------------------------------------------------------------- */
-
-
-/******************************************************************************
-*                                                                             *
-*  Paramètres  : assistant = fenêtre à compléter et référencement global.     *
-*                                                                             *
-*  Description : Ajoute le panneau de choix du type de sortie.                *
-*                                                                             *
-*  Retour      : -                                                            *
-*                                                                             *
-*  Remarques   : -                                                            *
-*                                                                             *
-******************************************************************************/
-
-static void register_output_panel(GtkAssistant *assistant)
-{
-    GtkWidget *alignment;                   /* Disposition sur le support  */
-    GtkWidget *vbox;                        /* Support principal #1        */
-    GtkWidget *hbox;                        /* Support principal #2        */
-    GtkWidget *label;                       /* Etiquette d'indication      */
-    GtkWidget *combobox;                    /* Sélection du format         */
-    GtkWidget *entry;                       /* Zone de saisie de texte     */
-    GtkWidget *button;                      /* Sélection de fichier        */
-    GLoadedBinary *binary;                  /* Binaire chargé à parcourir  */
-    const char *filename;                   /* Chemin d'accès par défaut   */
-
-    alignment = qck_create_padded_alignment(8, 8, 8, 8);
-
-    vbox = gtk_vbox_new(TRUE, 0);
-    gtk_widget_show(vbox);
-    gtk_container_add(GTK_CONTAINER(alignment), vbox);
-
-    /* Format de sortie */
-
-    hbox = gtk_hbox_new(FALSE, 0);
-    gtk_widget_show(hbox);
-    gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
-
-    label = qck_create_label(NULL, NULL, _("Format : "));
-    gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
-
-    combobox = qck_create_combobox(NULL, NULL, G_CALLBACK(NULL), NULL);
-    gtk_box_pack_start(GTK_BOX(hbox), combobox, TRUE, TRUE, 0);
-
-    gtk_combo_box_append_text(GTK_COMBO_BOX(combobox), _("Simple text"));
-
-    gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0);
-
-    /* Fichier de sortie */
-
-    hbox = gtk_hbox_new(FALSE, 0);
-    gtk_widget_show(hbox);
-    gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
-
-    label = qck_create_label(NULL, NULL, _("File : "));
-    gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
-
-    entry = qck_create_entry(G_OBJECT(assistant), "filename", NULL);
-    gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0);
-
-    button = qck_create_button(NULL, NULL, "...", G_CALLBACK(on_filename_browsing_clicked), assistant);
-    gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
-
-    /* Intégration */
-
-    gtk_assistant_append_page(assistant, alignment);
-    gtk_assistant_set_page_title(assistant, alignment, _("Output"));
-    gtk_assistant_set_page_type(assistant, alignment, GTK_ASSISTANT_PAGE_CONTENT);
-
-    gtk_assistant_set_page_complete(assistant, alignment, TRUE);
-
-    /* Choix par défaut */
-    /*
-    binary = G_LOADED_BINARY(g_object_get_data(G_OBJECT(assistant), "binary"));
-    filename = g_loaded_binary_get_filename(binary);
-
-    gtk_entry_set_text(GTK_ENTRY(entry), filename);
-    gtk_entry_append_text(GTK_ENTRY(entry), ".txt");
-
-    g_signal_connect(G_OBJECT(entry), "changed", G_CALLBACK(on_export_filename_changed), assistant);
-    */
-}
-
-
-/******************************************************************************
-*                                                                             *
-*  Paramètres  : entry     = zone de texte dont le contenu vient de changer.  *
-*                assistant = fenêtre affichée et référencement global.        *
-*                                                                             *
-*  Description : Réagit un changement du nom de fichier pour l'exportation.   *
-*                                                                             *
-*  Retour      : -                                                            *
-*                                                                             *
-*  Remarques   : -                                                            *
-*                                                                             *
-******************************************************************************/
-
-static void on_export_filename_changed(GtkEntry *entry, GtkAssistant *assistant)
-{
-    const gchar *text;                      /* Texte saisi dans la zone    */
-    gint num;                               /* Etape courante              */
-    GtkWidget *page;                        /* Support de cette étape      */
-
-    text = gtk_entry_get_text(entry);
-
-    num = gtk_assistant_get_current_page(assistant);
-    page = gtk_assistant_get_nth_page(assistant, num);
-
-    gtk_assistant_set_page_complete(assistant, page, (strlen(text) > 0));
-
-}
-
-
-/******************************************************************************
-*                                                                             *
-*  Paramètres  : button = bouton d'édition de la sélection.                   *
-*                ref    = espace de référencement principal.                  *
-*                                                                             *
-*  Description : Sélectionne ou non un nouveau fichier de sortie.             *
-*                                                                             *
-*  Retour      : -                                                            *
-*                                                                             *
-*  Remarques   : -                                                            *
-*                                                                             *
-******************************************************************************/
-
-static void on_filename_browsing_clicked(GtkButton *button, GObject *ref)
-{
-    GtkWidget *dialog;                      /* Boîte à afficher            */
-    gchar *filename;                        /* Nom du fichier à intégrer   */
-    GtkEntry *entry;                        /* Zone de saisie à maj.       */
-
-    dialog = gtk_file_chooser_dialog_new(_("Choose an output filename"), GTK_WINDOW(ref),
-                                         GTK_FILE_CHOOSER_ACTION_SAVE,
-                                         GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-                                         GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
-                                         NULL);
-
-    entry = GTK_ENTRY(g_object_get_data(ref, "filename"));
-    gtk_file_chooser_set_filename(dialog, gtk_entry_get_text(entry));
-
-    if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
-    {
-        filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
-
-        gtk_entry_set_text(GTK_ENTRY(entry), filename);
-
-        g_free(filename);
-
-    }
-
-    gtk_widget_destroy(dialog);
-
-}
-
-
-
-/* ---------------------------------------------------------------------------------- */
-/*                           SELECTION DU CONTENU A TRAITER                           */
-/* ---------------------------------------------------------------------------------- */
-
-
-/******************************************************************************
-*                                                                             *
-*  Paramètres  : assistant = fenêtre à compléter et référencement global.     *
-*                                                                             *
-*  Description : Ajoute le panneau de sélection du contenu à exporter.        *
-*                                                                             *
-*  Retour      : -                                                            *
-*                                                                             *
-*  Remarques   : -                                                            *
-*                                                                             *
-******************************************************************************/
-
-static void register_content_panel(GtkAssistant *assistant)
-{
-    GtkWidget *alignment;                   /* Disposition sur le support  */
-    GtkWidget *vbox;                        /* Support principal           */
-    GtkWidget *frame;                       /* Support avec encadrement    */
-    GtkWidget *subalign;                    /* Disposition des options     */
-
-    GtkWidget *vbox3;
-    GtkWidget *checkbutton;                 /* Coche pour une option       */
-    GtkWidget *vbox4;
-
-    alignment = qck_create_padded_alignment(8, 8, 8, 8);
-
-    vbox = gtk_vbox_new(TRUE, 0);
-    gtk_widget_show(vbox);
-    gtk_container_add(GTK_CONTAINER(alignment), vbox);
-
-    /* Lignes à traiter */
-
-    frame = qck_create_frame(_("<b>Lines to process</b>"), &subalign, 0, 0, 12, 0);
-    gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0);
-
-    vbox3 = gtk_vbox_new(FALSE, 0);
-    gtk_widget_show(vbox3);
-    gtk_container_add(GTK_CONTAINER(subalign), vbox3);
-
-    checkbutton = qck_create_check_button(G_OBJECT(assistant), "prologue", _("Prologue"), NULL, NULL);
-    gtk_box_pack_start(GTK_BOX(vbox3), checkbutton, FALSE, FALSE, 0);
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), TRUE);
-
-    checkbutton = qck_create_check_button(G_OBJECT(assistant), "code", _("Code"), NULL, NULL);
-    gtk_box_pack_start(GTK_BOX(vbox3), checkbutton, FALSE, FALSE, 0);
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), TRUE);
-
-    checkbutton = qck_create_check_button(G_OBJECT(assistant), "comments", _("Comments"), NULL, NULL);
-    gtk_box_pack_start(GTK_BOX(vbox3), checkbutton, FALSE, FALSE, 0);
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), TRUE);
-
-    /* Eléments à afficher */
-
-    frame = qck_create_frame(_("<b>Items to display</b>"), &subalign, 0, 0, 12, 0);
-    gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0);
-
-    vbox4 = gtk_vbox_new(FALSE, 0);
-    gtk_widget_show(vbox4);
-    gtk_container_add(GTK_CONTAINER(subalign), vbox4);
-
-    checkbutton = qck_create_check_button(G_OBJECT(assistant), "virtual_addr", _("Virtual address"), NULL, NULL);
-    gtk_box_pack_start(GTK_BOX(vbox4), checkbutton, FALSE, FALSE, 0);
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), TRUE);
-
-    checkbutton = qck_create_check_button(G_OBJECT(assistant), "binary_code", _("Binary code"), NULL, NULL);
-    gtk_box_pack_start(GTK_BOX(vbox4), checkbutton, FALSE, FALSE, 0);
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), TRUE);
-
-    checkbutton = qck_create_check_button(G_OBJECT(assistant), "assembly_code", _("Assembly code"), NULL, NULL);
-    gtk_box_pack_start(GTK_BOX(vbox4), checkbutton, FALSE, FALSE, 0);
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), TRUE);
-
-    /* Intégration */
-
-    gtk_assistant_append_page(assistant, alignment);
-    gtk_assistant_set_page_title(assistant, alignment, _("Exported content"));
-    gtk_assistant_set_page_type(assistant, alignment, GTK_ASSISTANT_PAGE_CONFIRM);
-
-    gtk_assistant_set_page_complete(assistant, alignment, TRUE);
-
-}
diff --git a/src/dialogs/add_shellcode.h b/src/dialogs/add_shellcode.h
deleted file mode 100644
index 115507c..0000000
--- a/src/dialogs/add_shellcode.h
+++ /dev/null
@@ -1,37 +0,0 @@
-
-/* OpenIDA - Outil d'analyse de fichiers binaires
- * export.h - prototypes pour l'assistant d'exportation de contenu binaire
- *
- * Copyright (C) 2011-2012 Cyrille Bagard
- *
- *  This file is part of OpenIDA.
- *
- *  OpenIDA 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.
- *
- *  OpenIDA 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 Foobar.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#ifndef _DIALOGS_EXPORT_H
-#define _DIALOGS_EXPORT_H
-
-
-#include "../project.h"
-
-
-
-/* Crée et affiche un assistant d'ajout de binaire. */
-void run_add_shellcode_assistant(GStudyProject *, GtkWindow *);
-
-
-
-#endif  /* _DIALOGS_EXPORT_H */
diff --git a/src/dialogs/binparts.c b/src/dialogs/binparts.c
index 14e1422..6df3d0a 100644
--- a/src/dialogs/binparts.c
+++ b/src/dialogs/binparts.c
@@ -279,9 +279,9 @@ GtkWidget *create_sections_dialog(GLoadedBinary *binary, GtkWindow *parent)
 
     g_signal_connect(G_OBJECT(comboboxentry), "changed", G_CALLBACK(on_model_change), ref);
 
-    gtk_combo_box_append_text(GTK_COMBO_BOX(comboboxentry), _("Default"));
-    gtk_combo_box_append_text(GTK_COMBO_BOX(comboboxentry), _("Routines"));
-    gtk_combo_box_append_text(GTK_COMBO_BOX(comboboxentry), _("User"));
+    gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(comboboxentry), _("Default"));
+    gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(comboboxentry), _("Routines"));
+    gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(comboboxentry), _("User"));
 
     load_binary_current_parts(binary, ref);
 
diff --git a/src/dialogs/export.c b/src/dialogs/export.c
index 317ada4..a7af141 100644
--- a/src/dialogs/export.c
+++ b/src/dialogs/export.c
@@ -298,7 +298,7 @@ static void register_output_panel(GtkAssistant *assistant)
     combobox = qck_create_combobox(NULL, NULL, G_CALLBACK(NULL), NULL);
     gtk_box_pack_start(GTK_BOX(hbox), combobox, TRUE, TRUE, 0);
 
-    gtk_combo_box_append_text(GTK_COMBO_BOX(combobox), _("Simple text"));
+    gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combobox), _("Simple text"));
 
     gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0);
 
diff --git a/src/dialogs/export.h b/src/dialogs/export.h
index fc7e1bd..dff409a 100644
--- a/src/dialogs/export.h
+++ b/src/dialogs/export.h
@@ -25,7 +25,7 @@
 #define _DIALOGS_EXPORT_H
 
 
-#include <gtk/gtkwindow.h>
+#include <gtk/gtk.h>
 
 
 #include "../analysis/binary.h"
diff --git a/src/dialogs/goto.c b/src/dialogs/goto.c
index 18c364d..8a64e7e 100644
--- a/src/dialogs/goto.c
+++ b/src/dialogs/goto.c
@@ -157,7 +157,7 @@ GtkWidget *create_goto_dialog(GtkWindow *parent)
     gtk_window_set_modal(GTK_WINDOW(result), TRUE);
     gtk_window_set_type_hint(GTK_WINDOW(result), GDK_WINDOW_TYPE_HINT_DIALOG);
 
-    dlgvbox = GTK_DIALOG(result)->vbox;
+    dlgvbox = gtk_dialog_get_content_area(GTK_DIALOG(result));
     gtk_widget_show(dlgvbox);
 
     vbox = gtk_vbox_new(FALSE, 8);
@@ -184,7 +184,7 @@ GtkWidget *create_goto_dialog(GtkWindow *parent)
 
 
 
-    dialog_action_area1 = GTK_DIALOG(result)->action_area;
+    dialog_action_area1 = gtk_dialog_get_action_area(GTK_DIALOG(result));
     gtk_widget_show(dialog_action_area1);
     gtk_button_box_set_layout(GTK_BUTTON_BOX(dialog_action_area1), GTK_BUTTONBOX_END);
 
diff --git a/src/dialogs/shellcode.c b/src/dialogs/shellcode.c
new file mode 100644
index 0000000..bfde921
--- /dev/null
+++ b/src/dialogs/shellcode.c
@@ -0,0 +1,825 @@
+
+/* OpenIDA - Outil d'analyse de fichiers binaires
+ * export.c - assistant d'exportation de contenu binaire
+ *
+ * Copyright (C) 2011-2012 Cyrille Bagard
+ *
+ *  This file is part of OpenIDA.
+ *
+ *  OpenIDA 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.
+ *
+ *  OpenIDA 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 Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include "shellcode.h"
+
+
+#include <i18n.h>
+
+
+#include <malloc.h>
+#include <regex.h>
+#include <stdio.h>
+#include <string.h>
+
+
+#include "../gtkext/easygtk.h"
+
+
+
+
+#include "../analysis/roptions.h"     // A garder ?
+
+
+
+
+
+
+/* ------------------------ PARTIE PRINCIPALE DE L'ASSISTANT ------------------------ */
+
+
+/* Ferme l'assistant sans dérouler la procédure. */
+static void export_assistant_cancel(GtkAssistant *, gpointer);
+
+/* Ferme l'assistant et déroule la procédure. */
+static void export_assistant_close(GtkAssistant *, GObject *);
+
+
+
+/* -------------------------- RECUPERATION DU CODE BINAIRE -------------------------- */
+
+
+/* Ajoute le panneau de consitution du code binaire. */
+static void register_bincode_panel(GtkAssistant *);
+
+/* Fournit si possible le code binaire utilisateur. */
+static bool extract_shell_code(GObject *, bin_t **, off_t *);
+
+/* Réagit à une modification du code binaire. */
+static void on_bincode_changed(GtkTextBuffer *, GObject *);
+
+
+
+/* ----------------------- DEFINITION DE L'ARCHITECTURE VISEE ----------------------- */
+
+
+/* Ajoute le panneau de spécification de l'architecture. */
+static void register_archi_panel(GtkAssistant *);
+
+
+
+
+
+/* -------------------- DEFINITION DES REGLAGES DE L'EXPORTATION -------------------- */
+
+
+/* Ajoute le panneau de choix du type de sortie. */
+static void register_output_panel(GtkAssistant *);
+
+/* Réagit un changement du nom de fichier pour l'exportation. */
+static void on_export_filename_changed(GtkEntry *, GtkAssistant *);
+
+/* Sélectionne ou non un nouveau fichier de sortie. */
+static void on_filename_browsing_clicked(GtkButton *, GObject *);
+
+
+
+/* ------------------------- SELECTION DU CONTENU A TRAITER ------------------------- */
+
+
+/* Ajoute le panneau de sélection du contenu à exporter. */
+static void register_content_panel(GtkAssistant *);
+
+
+
+/* ---------------------------------------------------------------------------------- */
+/*                          PARTIE PRINCIPALE DE L'ASSISTANT                          */
+/* ---------------------------------------------------------------------------------- */
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : project = projet courant à compléter.                        *
+*                parent  = fenêtre principale de l'éditeur.                   *
+*                                                                             *
+*  Description : Crée et affiche un assistant d'ajout de binaire.             *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+void run_shellcode_assistant(GStudyProject *project, GtkWindow *parent)
+{
+    GtkWidget *assistant;                   /* Fenêtre à afficher          */
+    GObject *ref;                           /* Espace de référencement     */
+
+    assistant = gtk_assistant_new();
+    gtk_widget_set_size_request(assistant, 450, 300);
+    gtk_window_set_position(GTK_WINDOW(assistant), GTK_WIN_POS_CENTER);
+    gtk_window_set_title(GTK_WINDOW(assistant), _("Shellcode assistant"));
+
+    gtk_window_set_modal(GTK_WINDOW(assistant), TRUE);
+    gtk_window_set_transient_for(GTK_WINDOW(assistant), parent);
+
+    ref = G_OBJECT(assistant);
+    //g_object_set_data(ref, "binary", binary);
+
+    register_bincode_panel(GTK_ASSISTANT(assistant));
+    register_archi_panel(GTK_ASSISTANT(assistant));
+    //register_output_panel(GTK_ASSISTANT(assistant));
+    //register_content_panel(GTK_ASSISTANT(assistant));
+
+    g_signal_connect(G_OBJECT(assistant), "cancel", G_CALLBACK(export_assistant_cancel), NULL);
+    g_signal_connect(G_OBJECT(assistant), "close", G_CALLBACK(export_assistant_close), ref);
+
+    gtk_widget_show_all(assistant);
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : assistant = fenêtre à compléter et référencement global.     *
+*                data      = adresse non utilisée ici.                        *
+*                                                                             *
+*  Description : Ferme l'assistant sans dérouler la procédure.                *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void export_assistant_cancel(GtkAssistant *assistant, gpointer data)
+{
+    gtk_widget_destroy(GTK_WIDGET(assistant));
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : assistant = fenêtre à compléter et référencement global.     *
+*                ref       = adresse de l'espace de référencement global.     *
+*                                                                             *
+*  Description : Ferme l'assistant et déroule la procédure.                   *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void export_assistant_close(GtkAssistant *assistant, GObject *ref)
+{
+    GLoadedBinary *binary;                  /* Binaire chargé à parcourir  */
+    GExeFormat *format;                     /* Format du binaire           */
+    GRenderingOptions *options;             /* Options d'exportation       */
+    GtkToggleButton *checkbutton;           /* Coche à retrouver           */
+    gboolean state;                         /* Valeur à prendre en compte  */
+    GtkEntry *entry;                        /* Zone de saisie              */
+    const gchar *filename;                  /* Chemin d'accès du fichier   */
+
+    //binary = G_LOADED_BINARY(g_object_get_data(ref, "binary"));
+
+    format = g_loaded_binary_get_format(binary);
+    options = g_rendering_options_new(format);
+
+    /* Eléments à afficher */
+
+    checkbutton = GTK_TOGGLE_BUTTON(g_object_get_data(ref, "virtual_addr"));
+    state = gtk_toggle_button_get_active(checkbutton);
+    g_rendering_options_show_address(options, MRD_BLOCK, state);
+
+    checkbutton = GTK_TOGGLE_BUTTON(g_object_get_data(ref, "binary_code"));
+    state = gtk_toggle_button_get_active(checkbutton);
+    g_rendering_options_show_code(options, MRD_BLOCK, state);
+
+    checkbutton = GTK_TOGGLE_BUTTON(g_object_get_data(ref, "assembly_code"));
+    state = gtk_toggle_button_get_active(checkbutton);
+
+    /* Programmation de la tâche */
+    /*
+    entry = GTK_ENTRY(g_object_get_data(ref, "filename"));
+    filename = gtk_entry_get_text(entry);
+
+    export = g_delayed_export_new(filename, binary, options);
+
+    queue = get_work_queue();
+    g_work_queue_schedule_work(queue, G_DELAYED_WORK(export));
+    */
+    gtk_widget_destroy(GTK_WIDGET(assistant));
+
+}
+
+
+
+/* ---------------------------------------------------------------------------------- */
+/*                            RECUPERATION DU CODE BINAIRE                            */
+/* ---------------------------------------------------------------------------------- */
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : assistant = fenêtre à compléter et référencement global.     *
+*                                                                             *
+*  Description : Ajoute le panneau de consitution du code binaire.            *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void register_bincode_panel(GtkAssistant *assistant)
+{
+    GtkWidget *alignment;                   /* Disposition sur le support  */
+    GtkWidget *vbox;                        /* Support principal           */
+    GtkWidget *scrolledwindow;              /* Support avec défilement     */
+    GtkWidget *textview;                    /* Zone de texte               */
+    GtkWidget *label;                       /* Etiquette du bilan          */
+
+    alignment = qck_create_padded_alignment(8, 8, 8, 8);
+
+    vbox = gtk_vbox_new(FALSE, 0);
+    gtk_widget_show(vbox);
+    gtk_container_add(GTK_CONTAINER(alignment), vbox);
+
+    /* Réception du code */
+
+    label = qck_create_label(NULL, NULL, _("Paste here the raw C code containing the shellcode.\r\n"
+                                           "All content between quotes will be extracted."));
+    gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
+
+    scrolledwindow = gtk_scrolled_window_new(NULL, NULL);
+    gtk_widget_show(scrolledwindow);
+    gtk_box_pack_start(GTK_BOX(vbox), scrolledwindow, TRUE, TRUE, 0);
+    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow),
+                                   GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+    gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwindow), GTK_SHADOW_IN);
+
+    textview = qck_create_textview(G_OBJECT(assistant), "bincode",
+                                   G_CALLBACK(on_bincode_changed), assistant);
+    gtk_container_add(GTK_CONTAINER(scrolledwindow), textview);
+
+    /* Validation */
+
+    label = qck_create_label(G_OBJECT(assistant), "status", _("No code"));
+    gtk_misc_set_alignment(GTK_MISC(label), 0.5, 0.5);
+    gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
+
+    /* Intégration */
+
+    gtk_assistant_append_page(assistant, alignment);
+    gtk_assistant_set_page_title(assistant, alignment, _("Code"));
+    gtk_assistant_set_page_type(assistant, alignment, GTK_ASSISTANT_PAGE_INTRO);
+
+    gtk_assistant_set_page_complete(assistant, alignment, TRUE);
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : ref    = espace de référencement global.                     *
+*                code   = code binaire recomposé. [OUT]                       *
+*                length = taille de ce code. [OUT]                            *
+*                                                                             *
+*  Description : Fournit si possible le code binaire utilisateur.             *
+*                                                                             *
+*  Retour      : Bilan de l'opération.                                        *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static bool extract_shell_code(GObject *ref, bin_t **code, off_t *length)
+{
+    bool result;                            /* Bilan à retourner           */
+    GtkTextView *textview;                  /* Zone de texte               */
+    GtkTextBuffer *buffer;                  /* Tampon gérant le texte      */
+    GtkTextIter start;                      /* Début de la zone à traiter  */
+    GtkTextIter end;                        /* Fin de la zone à traiter    */
+    gchar *bincode;                         /* Code à filtrer              */ 
+    regex_t preg;                           /* Recherche d'un bloc         */
+    int ret;                                /* Bilan d'un appel            */
+    regoff_t pos;                           /* Point de départ de lecture  */
+    regmatch_t pmatch[3];                   /* Localisation de trouvailles */
+    regoff_t i;                             /* Boucle de parcours          */
+    char hex[3];                            /* Valeur hexadécimale         */
+
+    result = true;
+
+    *code = NULL;
+    *length = 0;
+
+    /* Détermination des cibles */
+
+    ret = regcomp(&preg, "[^'\"]*(['\"])([^'\"]*)\\1", REG_EXTENDED);
+    if (ret != 0) return false;
+
+    /* Constitution du contexte */
+
+    textview = GTK_TEXT_VIEW(g_object_get_data(ref, "bincode"));
+    buffer = gtk_text_view_get_buffer(textview);
+
+    gtk_text_buffer_get_bounds(buffer, &start, &end);
+    bincode = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
+
+    /* Recomposition du code */
+
+    pos = 0;
+
+    ret = regexec(&preg, &bincode[pos], 3, pmatch, 0);
+
+    while (ret != REG_NOMATCH && result)
+    {
+        bincode[pos + pmatch[2].rm_eo] = '\0';
+
+        for (i = pos + pmatch[2].rm_so; i < (pos + pmatch[2].rm_eo) && result; i++)
+        {
+            *code = (bin_t *)realloc(*code, ++(*length) * sizeof(bin_t));
+
+            switch (bincode[i])
+            {
+                case '\\':
+                    if (++i >= (pos + pmatch[2].rm_eo))
+                    {
+                        result = false;
+                        break;
+                    }
+
+                    if (bincode[i] == 'x')
+                    {
+                        if (++i >= (pos + pmatch[2].rm_eo))
+                        {
+                            result = false;
+                            break;
+                        }
+
+                        if ((i + 2) > (pos + pmatch[2].rm_eo))
+                        {
+                            result = false;
+                            break;
+                        }
+
+                        memcpy(hex, &bincode[i], 2);
+                        hex[2] = '\0';
+
+                        (*code)[*length - 1] = strtol(hex, NULL, 16);
+
+                        i++;
+
+                    }
+                    else (*code)[*length - 1] = bincode[i];
+
+                    break;
+
+                default:
+                    (*code)[*length - 1] = bincode[i];
+                    break;
+
+            }
+
+        }
+
+        if (result)
+        {
+            pos += pmatch[2].rm_eo + 1;
+            ret = regexec(&preg, &bincode[pos], 3, pmatch, 0);
+        }
+
+    }
+
+    g_free(bincode);
+
+    if (!result && *code != NULL)
+    {
+        *length = 0;
+        free(*code);
+    }
+
+    return result;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : textbuffer = composant concerné par l'action.                *
+*                ref        = espace de référencement global.                 *
+*                                                                             *
+*  Description : Réagit à une modification du code binaire.                   *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void on_bincode_changed(GtkTextBuffer *textbuffer, GObject *ref)
+{
+    bin_t *code;                            /* Code binaire extrait        */
+    off_t length;                           /* Taille des données lues     */
+    bool status;                            /* Bilan de l'extraction       */
+    GtkLabel *label;                        /* Etiquette à mettre à jour   */
+    char *markup;                           /* Affichage étendu            */
+    GtkAssistant *assistant;                /* Assistant en première ligne */
+    gint index;                             /* Indice de la page courante  */
+    GtkWidget *page;                        /* Cotenu de la page courante  */
+
+    status = extract_shell_code(ref, &code, &length);
+
+    label = GTK_LABEL(g_object_get_data(ref, "status"));
+
+    if (!status)
+        gtk_label_set_markup(label, _("<span color=\"red\"><b>Error while decoding</b></span>"));
+
+    else if (length > 0)
+    {
+        markup = g_markup_printf_escaped(_("<span color=\"#00cc00\"><b>Decoding OK ("
+                                           OFF_FMT " %s)</b></span>"),
+                                         OFF_CAST(length), length > 1 ? _("bytes") : _("byte"));
+        gtk_label_set_markup(label, markup);
+        g_free(markup);
+    }
+
+    else
+    {
+        gtk_label_set_markup(label, _("No code"));
+        status = false;
+    }
+
+    if (length > 0)
+        free(code);
+
+    /* Poursuite des opérations ? */
+
+    assistant = GTK_ASSISTANT(ref);
+
+    index = gtk_assistant_get_current_page(assistant);
+    page = gtk_assistant_get_nth_page(assistant, index);
+
+    gtk_assistant_set_page_complete(assistant, page, status);
+
+}
+
+
+
+/* ---------------------------------------------------------------------------------- */
+/*                         DEFINITION DE L'ARCHITECTURE VISEE                         */
+/* ---------------------------------------------------------------------------------- */
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : assistant = fenêtre à compléter et référencement global.     *
+*                                                                             *
+*  Description : Ajoute le panneau de spécification de l'architecture.        *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void register_archi_panel(GtkAssistant *assistant)
+{
+    GtkWidget *alignment;                   /* Disposition sur le support  */
+    GtkWidget *vbox;                        /* Support principal           */
+    GtkWidget *label;                       /* Etiquette d'indication      */
+    GtkWidget *combobox;                    /* Sélection du format         */
+
+
+
+
+
+
+    alignment = qck_create_padded_alignment(8, 8, 8, 8);
+
+    vbox = gtk_vbox_new(FALSE, 0);
+    gtk_widget_show(vbox);
+    gtk_container_add(GTK_CONTAINER(alignment), vbox);
+
+    /* Choix de l'architecture */
+
+    label = qck_create_label(NULL, NULL, _("Architecture:"));
+    gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
+
+    combobox = qck_create_combobox(G_OBJECT(assistant), "archi", G_CALLBACK(NULL), NULL);
+    gtk_box_pack_start(GTK_BOX(vbox), combobox, TRUE, FALSE, 0);
+
+    gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combobox), _("x86"));
+
+    gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0);
+
+    /* Taille de registre */
+
+    label = qck_create_label(NULL, NULL, _("Register size:"));
+    gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
+
+    combobox = qck_create_combobox(G_OBJECT(assistant), "rsize", G_CALLBACK(NULL), NULL);
+    gtk_box_pack_start(GTK_BOX(vbox), combobox, TRUE, FALSE, 0);
+
+    gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combobox), _("32 bits"));
+    gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combobox), _("16 bits"));
+
+    gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0);
+
+    /* Intégration */
+
+    gtk_assistant_append_page(assistant, alignment);
+    gtk_assistant_set_page_title(assistant, alignment, _("Architecture"));
+    gtk_assistant_set_page_type(assistant, alignment, GTK_ASSISTANT_PAGE_CONFIRM);
+
+    gtk_assistant_set_page_complete(assistant, alignment, TRUE);
+
+}
+
+
+
+
+
+
+
+
+
+
+/* ---------------------------------------------------------------------------------- */
+/*                      DEFINITION DES REGLAGES DE L'EXPORTATION                      */
+/* ---------------------------------------------------------------------------------- */
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : assistant = fenêtre à compléter et référencement global.     *
+*                                                                             *
+*  Description : Ajoute le panneau de choix du type de sortie.                *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void register_output_panel(GtkAssistant *assistant)
+{
+    GtkWidget *alignment;                   /* Disposition sur le support  */
+    GtkWidget *vbox;                        /* Support principal #1        */
+    GtkWidget *hbox;                        /* Support principal #2        */
+    GtkWidget *label;                       /* Etiquette d'indication      */
+    GtkWidget *combobox;                    /* Sélection du format         */
+    GtkWidget *entry;                       /* Zone de saisie de texte     */
+    GtkWidget *button;                      /* Sélection de fichier        */
+    GLoadedBinary *binary;                  /* Binaire chargé à parcourir  */
+    const char *filename;                   /* Chemin d'accès par défaut   */
+
+    alignment = qck_create_padded_alignment(8, 8, 8, 8);
+
+    vbox = gtk_vbox_new(TRUE, 0);
+    gtk_widget_show(vbox);
+    gtk_container_add(GTK_CONTAINER(alignment), vbox);
+
+    /* Format de sortie */
+
+    hbox = gtk_hbox_new(FALSE, 0);
+    gtk_widget_show(hbox);
+    gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
+
+    label = qck_create_label(NULL, NULL, _("Format : "));
+    gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
+
+    combobox = qck_create_combobox(NULL, NULL, G_CALLBACK(NULL), NULL);
+    gtk_box_pack_start(GTK_BOX(hbox), combobox, TRUE, TRUE, 0);
+
+    gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combobox), _("Simple text"));
+
+    gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0);
+
+    /* Fichier de sortie */
+
+    hbox = gtk_hbox_new(FALSE, 0);
+    gtk_widget_show(hbox);
+    gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
+
+    label = qck_create_label(NULL, NULL, _("File : "));
+    gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
+
+    entry = qck_create_entry(G_OBJECT(assistant), "filename", NULL);
+    gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0);
+
+    button = qck_create_button(NULL, NULL, "...", G_CALLBACK(on_filename_browsing_clicked), assistant);
+    gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+
+    /* Intégration */
+
+    gtk_assistant_append_page(assistant, alignment);
+    gtk_assistant_set_page_title(assistant, alignment, _("Output"));
+    gtk_assistant_set_page_type(assistant, alignment, GTK_ASSISTANT_PAGE_CONTENT);
+
+    gtk_assistant_set_page_complete(assistant, alignment, TRUE);
+
+    /* Choix par défaut */
+    /*
+    binary = G_LOADED_BINARY(g_object_get_data(G_OBJECT(assistant), "binary"));
+    filename = g_loaded_binary_get_filename(binary);
+
+    gtk_entry_set_text(GTK_ENTRY(entry), filename);
+    gtk_entry_append_text(GTK_ENTRY(entry), ".txt");
+
+    g_signal_connect(G_OBJECT(entry), "changed", G_CALLBACK(on_export_filename_changed), assistant);
+    */
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : entry     = zone de texte dont le contenu vient de changer.  *
+*                assistant = fenêtre affichée et référencement global.        *
+*                                                                             *
+*  Description : Réagit un changement du nom de fichier pour l'exportation.   *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void on_export_filename_changed(GtkEntry *entry, GtkAssistant *assistant)
+{
+    const gchar *text;                      /* Texte saisi dans la zone    */
+    gint num;                               /* Etape courante              */
+    GtkWidget *page;                        /* Support de cette étape      */
+
+    text = gtk_entry_get_text(entry);
+
+    num = gtk_assistant_get_current_page(assistant);
+    page = gtk_assistant_get_nth_page(assistant, num);
+
+    gtk_assistant_set_page_complete(assistant, page, (strlen(text) > 0));
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : button = bouton d'édition de la sélection.                   *
+*                ref    = espace de référencement principal.                  *
+*                                                                             *
+*  Description : Sélectionne ou non un nouveau fichier de sortie.             *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void on_filename_browsing_clicked(GtkButton *button, GObject *ref)
+{
+    GtkWidget *dialog;                      /* Boîte à afficher            */
+    gchar *filename;                        /* Nom du fichier à intégrer   */
+    GtkEntry *entry;                        /* Zone de saisie à maj.       */
+
+    dialog = gtk_file_chooser_dialog_new(_("Choose an output filename"), GTK_WINDOW(ref),
+                                         GTK_FILE_CHOOSER_ACTION_SAVE,
+                                         GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                                         GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
+                                         NULL);
+
+    entry = GTK_ENTRY(g_object_get_data(ref, "filename"));
+    gtk_file_chooser_set_filename(dialog, gtk_entry_get_text(entry));
+
+    if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
+    {
+        filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
+
+        gtk_entry_set_text(GTK_ENTRY(entry), filename);
+
+        g_free(filename);
+
+    }
+
+    gtk_widget_destroy(dialog);
+
+}
+
+
+
+/* ---------------------------------------------------------------------------------- */
+/*                           SELECTION DU CONTENU A TRAITER                           */
+/* ---------------------------------------------------------------------------------- */
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : assistant = fenêtre à compléter et référencement global.     *
+*                                                                             *
+*  Description : Ajoute le panneau de sélection du contenu à exporter.        *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void register_content_panel(GtkAssistant *assistant)
+{
+    GtkWidget *alignment;                   /* Disposition sur le support  */
+    GtkWidget *vbox;                        /* Support principal           */
+    GtkWidget *frame;                       /* Support avec encadrement    */
+    GtkWidget *subalign;                    /* Disposition des options     */
+
+    GtkWidget *vbox3;
+    GtkWidget *checkbutton;                 /* Coche pour une option       */
+    GtkWidget *vbox4;
+
+    alignment = qck_create_padded_alignment(8, 8, 8, 8);
+
+    vbox = gtk_vbox_new(TRUE, 0);
+    gtk_widget_show(vbox);
+    gtk_container_add(GTK_CONTAINER(alignment), vbox);
+
+    /* Lignes à traiter */
+
+    frame = qck_create_frame(_("<b>Lines to process</b>"), &subalign, 0, 0, 12, 0);
+    gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0);
+
+    vbox3 = gtk_vbox_new(FALSE, 0);
+    gtk_widget_show(vbox3);
+    gtk_container_add(GTK_CONTAINER(subalign), vbox3);
+
+    checkbutton = qck_create_check_button(G_OBJECT(assistant), "prologue", _("Prologue"), NULL, NULL);
+    gtk_box_pack_start(GTK_BOX(vbox3), checkbutton, FALSE, FALSE, 0);
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), TRUE);
+
+    checkbutton = qck_create_check_button(G_OBJECT(assistant), "code", _("Code"), NULL, NULL);
+    gtk_box_pack_start(GTK_BOX(vbox3), checkbutton, FALSE, FALSE, 0);
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), TRUE);
+
+    checkbutton = qck_create_check_button(G_OBJECT(assistant), "comments", _("Comments"), NULL, NULL);
+    gtk_box_pack_start(GTK_BOX(vbox3), checkbutton, FALSE, FALSE, 0);
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), TRUE);
+
+    /* Eléments à afficher */
+
+    frame = qck_create_frame(_("<b>Items to display</b>"), &subalign, 0, 0, 12, 0);
+    gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0);
+
+    vbox4 = gtk_vbox_new(FALSE, 0);
+    gtk_widget_show(vbox4);
+    gtk_container_add(GTK_CONTAINER(subalign), vbox4);
+
+    checkbutton = qck_create_check_button(G_OBJECT(assistant), "virtual_addr", _("Virtual address"), NULL, NULL);
+    gtk_box_pack_start(GTK_BOX(vbox4), checkbutton, FALSE, FALSE, 0);
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), TRUE);
+
+    checkbutton = qck_create_check_button(G_OBJECT(assistant), "binary_code", _("Binary code"), NULL, NULL);
+    gtk_box_pack_start(GTK_BOX(vbox4), checkbutton, FALSE, FALSE, 0);
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), TRUE);
+
+    checkbutton = qck_create_check_button(G_OBJECT(assistant), "assembly_code", _("Assembly code"), NULL, NULL);
+    gtk_box_pack_start(GTK_BOX(vbox4), checkbutton, FALSE, FALSE, 0);
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), TRUE);
+
+    /* Intégration */
+
+    gtk_assistant_append_page(assistant, alignment);
+    gtk_assistant_set_page_title(assistant, alignment, _("Exported content"));
+    gtk_assistant_set_page_type(assistant, alignment, GTK_ASSISTANT_PAGE_CONFIRM);
+
+    gtk_assistant_set_page_complete(assistant, alignment, TRUE);
+
+}
+
+
+
+
+
+
+
+
+    /* Choix par défaut */
+    /*
+    binary = G_LOADED_BINARY(g_object_get_data(G_OBJECT(assistant), "binary"));
+    filename = g_loaded_binary_get_filename(binary);
+
+    gtk_entry_set_text(GTK_ENTRY(entry), filename);
+    gtk_entry_append_text(GTK_ENTRY(entry), ".txt");
+
+    g_signal_connect(G_OBJECT(entry), "changed", G_CALLBACK(on_export_filename_changed), assistant);
+    */
+
+
+
diff --git a/src/dialogs/shellcode.h b/src/dialogs/shellcode.h
new file mode 100644
index 0000000..0a3c51a
--- /dev/null
+++ b/src/dialogs/shellcode.h
@@ -0,0 +1,37 @@
+
+/* OpenIDA - Outil d'analyse de fichiers binaires
+ * export.h - prototypes pour l'assistant d'exportation de contenu binaire
+ *
+ * Copyright (C) 2011-2012 Cyrille Bagard
+ *
+ *  This file is part of OpenIDA.
+ *
+ *  OpenIDA 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.
+ *
+ *  OpenIDA 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 Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef _DIALOGS_EXPORT_H
+#define _DIALOGS_EXPORT_H
+
+
+#include "../project.h"
+
+
+
+/* Crée et affiche un assistant d'ajout de binaire. */
+void run_shellcode_assistant(GStudyProject *, GtkWindow *);
+
+
+
+#endif  /* _DIALOGS_EXPORT_H */
diff --git a/src/editor.h b/src/editor.h
index 1862dbc..45b002f 100644
--- a/src/editor.h
+++ b/src/editor.h
@@ -26,7 +26,7 @@
 #define _EDITOR_H
 
 
-#include <gtk/gtkwidget.h>
+#include <gtk/gtk.h>
 
 
 
diff --git a/src/glibext/gbufferline.h b/src/glibext/gbufferline.h
index 2a46b5a..7b063ac 100644
--- a/src/glibext/gbufferline.h
+++ b/src/glibext/gbufferline.h
@@ -113,9 +113,6 @@ typedef enum _RenderingTagType
 #define COL_MARGIN 23
 
 
-/* Accompagnement du dessin pour compléments */
-typedef void (* buffer_line_draw_fc) (GBufferLine *, GdkDrawable *, GdkGC *, gint, gint, void *);
-
 
 /* Détermine le type de la représentation de fragments de texte en ligne. */
 GType g_buffer_line_get_type(void);
diff --git a/src/glibext/gcodebuffer.c b/src/glibext/gcodebuffer.c
index 70064e3..8a70ad5 100644
--- a/src/glibext/gcodebuffer.c
+++ b/src/glibext/gcodebuffer.c
@@ -151,8 +151,6 @@ struct _GBufferView
     gint last_width;                        /* Plus grande col. de fusion  */
     BufferLineColumn last_merge;            /* Colonne de fusion extrême   */
 
-    buffer_line_draw_fc drawing_extra;      /* Fonction d'accompagnement   */
-    void *drawing_data;                     /* Donnée utilisateur          */
     GSList *highlighted;                    /* Segments mis en évidence    */
 
 };
@@ -978,33 +976,29 @@ gint g_buffer_view_get_line_height(GBufferView *view)
 
 /******************************************************************************
 *                                                                             *
-*  Paramètres  : view   = visualisation à consulter.                          *
-*                width  = largeur requise pour une pleine visualisation. [OUT]*
-*                height = hauteur requise pour une pleine visualisation. [OUT]*
-*                addr   = indique si les positions doivent être affichées.    *
-*                code   = indique si le code binaire doit être affiché.       *
+*  Paramètres  : view = visualisation à consulter.                            *
+*                addr = indique si les positions doivent être affichées.      *
+*                code = indique si le code binaire doit être affiché.         *
 *                                                                             *
-*  Description : Fournit les dimensions requises par une visualisation.       *
+*  Description : Fournit la largeur requise par une visualisation.            *
 *                                                                             *
-*  Retour      : -                                                            *
+*  Retour      : Dimension calculée.                                          *
 *                                                                             *
 *  Remarques   : -                                                            *
 *                                                                             *
 ******************************************************************************/
 
-void g_buffer_view_get_size(GBufferView *view, gint *width, gint *height, bool addr, bool code)
+gint g_buffer_view_get_width(GBufferView *view, bool addr, bool code)
 {
+    gint result;                            /* Taille à retourner          */
     gint col_width;                         /* Calcul selon les colonnes   */
     gint full_width;                        /* Calcul selon les fusions    */
     BufferLineColumn i;                     /* Boucle de parcours          */
-    size_t first;                           /* Première ligne intégrée     */
-    size_t last;                            /* Dernière ligne intégrée     */
 
     if (!WIDTHS_CACHED(view))
         g_buffer_view_compute_required_widths(view, addr, code);
 
-    *width = view->left_text;
-    *height = view->line_height;
+    result = view->left_text;
 
     col_width = 0;
     full_width = 0;
@@ -1041,12 +1035,40 @@ void g_buffer_view_get_size(GBufferView *view, gint *width, gint *height, bool a
 
     /* Mise en concurrence et poursuite... */
 
-    *width += + MAX(col_width, full_width);
+    result += + MAX(col_width, full_width);
+
+    return result;
+
+}
+
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : view = visualisation à consulter.                            *
+*                                                                             *
+*  Description : Fournit la hauteur requise par une visualisation.            *
+*                                                                             *
+*  Retour      : Dimension calculée.                                          *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+gint g_buffer_view_get_height(const GBufferView *view)
+{
+    gint result;                            /* Taille à retourner          */
+    size_t first;                           /* Première ligne intégrée     */
+    size_t last;                            /* Dernière ligne intégrée     */
+
+    result = view->line_height;
 
     first = g_code_buffer_get_index_from_address(view->buffer, view->start, true);
     last = g_code_buffer_get_index_from_address(view->buffer, view->end, false);
 
-    *height *= (last - first + 1);
+    result *= (last - first + 1);
+
+    return result;
 
 }
 
@@ -1146,6 +1168,8 @@ vmpa_t g_buffer_view_move_caret(GBufferView *view, GdkRectangle *caret, bool ctr
             for (i = BLC_ASSEMBLY_HEAD; i < BLC_COUNT; i++)
                 right_pos += view->max_widths[i] + COL_MARGIN;
             break;
+        default:    /* GDK_SCROLL_SMOOTH */
+            break;
     }
 
     first = g_code_buffer_get_index_from_address(view->buffer, view->start, true);
@@ -1207,6 +1231,9 @@ vmpa_t g_buffer_view_move_caret(GBufferView *view, GdkRectangle *caret, bool ctr
 
             break;
 
+        default:    /* GDK_SCROLL_SMOOTH */
+            break;
+
     }
 
     if (result && !computed)
@@ -1324,33 +1351,11 @@ void g_buffer_view_highlight_segments(GBufferView *view, gint x, gint y)
 
 /******************************************************************************
 *                                                                             *
-*  Paramètres  : view   = visualisation à mettre à jour.                      *
-*                method = procédure à appeler à chaque dessin de ligne.       *
-*                data   = donnée utilisateur à passer lors des appels.        *
-*                                                                             *
-*  Description : Définit à une procédure à appeler lors des dessins de ligne. *
-*                                                                             *
-*  Retour      : -                                                            *
-*                                                                             *
-*  Remarques   : -                                                            *
-*                                                                             *
-******************************************************************************/
-
-void g_buffer_view_define_extra_drawing(GBufferView *view, buffer_line_draw_fc method, void *data)
-{
-    view->drawing_extra = method;
-    view->drawing_data = data;
-
-}
-
-
-/******************************************************************************
-*                                                                             *
 *  Paramètres  : view   = visualisation à représenter.                        *
-*                event  = informations liées à l'événement.                   *
-*                gc     = contexte graphique à utiliser pour les pinceaux.    *
+*                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.                      *
 *                addr   = indique si les positions doivent être affichées.    *
 *                code   = indique si le code binaire doit être affiché.       *
 *                                                                             *
@@ -1362,42 +1367,30 @@ void g_buffer_view_define_extra_drawing(GBufferView *view, buffer_line_draw_fc m
 *                                                                             *
 ******************************************************************************/
 
-void g_buffer_view_draw(const GBufferView *view, const GdkEventExpose *event, GdkGC *gc, gint fake_x, gint fake_y, bool addr, 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, bool addr, bool code)
 {
-    cairo_t *cairo;                         /* Gestionnaire de rendu       */
     gint real_x;                            /* Abscisse réelle pour tampon */
     gint real_y;                            /* Ordonnée réelle pour tampon */
-
     size_t first;                           /* Première ligne visée        */
     size_t end;                             /* Dernière ligne avant limite */
     size_t last;                            /* Dernière ligne visée + 1    */
     gint y;                                 /* Point de départ + décallage */
-
-
     GBufferLine **lines;                    /* Liste des lignes à traiter  */
     size_t i;                               /* Boucle de parcours          */
 
-
-    cairo = gdk_cairo_create(event->window);
-
-    gdk_cairo_region(cairo, event->region);
-    cairo_clip(cairo);
-
     real_x = fake_x + view->left_text;
-    real_y = fake_y + event->area.y;
-
-
+    real_y = fake_y + area->y;
 
     first = g_code_buffer_get_index_from_address(view->buffer, view->start, true);
     first += (real_y / view->line_height);
 
-    last = first + (event->area.height / view->line_height);
-    if (event->area.height % view->line_height > 0) last++;
+    last = first + (area->height / view->line_height);
+    if (area->height % view->line_height > 0) last++;
 
     end = g_code_buffer_get_index_from_address(view->buffer, view->end, false);
     last = MIN(last, end);
 
-    y = event->area.y - (real_y % view->line_height);
+    y = area->y - (real_y % view->line_height);
 
     lines = view->buffer->lines;
 
@@ -1410,15 +1403,13 @@ void g_buffer_view_draw(const GBufferView *view, const GdkEventExpose *event, Gd
                 view->drawing_extra(lines[i], drawable, gc, fake_x, y, view->drawing_data);
             */
 
-            g_buffer_line_draw(lines[i], cairo, view->fcache,
+            g_buffer_line_draw(lines[i], cr, view->fcache,
                                view->max_widths, real_x, y, addr, code);
 
             y += view->line_height;
 
         }
 
-    cairo_destroy(cairo);
-
 }
 
 
diff --git a/src/glibext/gcodebuffer.h b/src/glibext/gcodebuffer.h
index 4ae5c58..e2ff8b0 100644
--- a/src/glibext/gcodebuffer.h
+++ b/src/glibext/gcodebuffer.h
@@ -121,8 +121,11 @@ GCodeBuffer *g_buffer_view_get_buffer(const GBufferView *);
 /* Fournit la hauteur d'impression d'une ligne visualisée. */
 gint g_buffer_view_get_line_height(GBufferView *);
 
-/* Fournit les dimensions requises par une visualisation. */
-void g_buffer_view_get_size(GBufferView *, gint *, gint *, bool, bool);
+/* Fournit la largeur requise par une visualisation. */
+gint g_buffer_view_get_width(GBufferView *, bool, bool);
+
+/* Fournit la hauteur requise par une visualisation. */
+gint g_buffer_view_get_height(const GBufferView *);
 
 /* Calcule la position idéale de curseur pour un point donné. */
 vmpa_t g_buffer_view_compute_caret(GBufferView *, gint, gint, GdkRectangle *);
@@ -136,11 +139,8 @@ bool g_buffer_view_unhighlight_segments(GBufferView *);
 /* Surligne tous les segments similaires à celui sous la souris. */
 void g_buffer_view_highlight_segments(GBufferView *, gint, gint);
 
-/* Définit à une procédure à appeler lors des dessins de ligne. */
-void g_buffer_view_define_extra_drawing(GBufferView *, buffer_line_draw_fc, void *);
-
 /* Imprime la visualisation du tampon de code désassemblé. */
-void g_buffer_view_draw(const GBufferView *, const GdkEventExpose *, GdkGC *, gint, gint, bool, bool);
+void g_buffer_view_draw(const GBufferView *, cairo_t *, gint, gint, const cairo_rectangle_int_t *, bool, 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/glibext/gfontcache.h b/src/glibext/gfontcache.h
index e6ef2d6..2132a34 100644
--- a/src/glibext/gfontcache.h
+++ b/src/glibext/gfontcache.h
@@ -27,7 +27,7 @@
 
 #include <glib.h>
 #include <glib-object.h>
-#include <gtk/gtkwidget.h>
+#include <gtk/gtk.h>
 #include <pango/pango-context.h>
 #include <pango/pango-font.h>
 
diff --git a/src/gtkext/graph/edge.c b/src/gtkext/graph/edge.c
index 4aedbde..8540c19 100644
--- a/src/gtkext/graph/edge.c
+++ b/src/gtkext/graph/edge.c
@@ -401,33 +401,6 @@ void g_graph_edge_compute(GGraphEdge *edge, GGraphRanks *ranks)
 
 /******************************************************************************
 *                                                                             *
-*  Paramètres  : edge     = ligne de rendu à manipuler.                       *
-*                drawable = surface de rendu à utiliser.                      *
-*                gc       = contexte graphique du dessin.                     *
-*                                                                             *
-*  Description : Dessine les liens graphiques enregistrés dans le moteur.     *
-*                                                                             *
-*  Retour      : -                                                            *
-*                                                                             *
-*  Remarques   : -                                                            *
-*                                                                             *
-******************************************************************************/
-
-void g_graph_edge_draw(const GGraphEdge *edge, GdkDrawable *drawable, GdkGC *gc)
-{
-    cairo_t *cairo;                         /* Gestionnaire de rendu       */
-
-    cairo = gdk_cairo_create(drawable);
-
-    _g_graph_edge_draw(edge, cairo, true);
-
-    cairo_destroy(cairo);
-
-}
-
-
-/******************************************************************************
-*                                                                             *
 *  Paramètres  : edge  = ligne de rendu à manipuler.                          *
 *                cairo = assistant pour le rendu graphique.                   *
 *                arrow = indique le besoin en flèche à l'arrivée.             *
@@ -440,7 +413,7 @@ void g_graph_edge_draw(const GGraphEdge *edge, GdkDrawable *drawable, GdkGC *gc)
 *                                                                             *
 ******************************************************************************/
 
-void _g_graph_edge_draw(const GGraphEdge *edge, cairo_t *cairo, bool arrow)
+void g_graph_edge_draw(const GGraphEdge *edge, cairo_t *cairo, bool arrow)
 {
     size_t i;                               /* Boucle de parcours          */
 
diff --git a/src/gtkext/graph/edge.h b/src/gtkext/graph/edge.h
index 12dcfdc..f6f0acf 100644
--- a/src/gtkext/graph/edge.h
+++ b/src/gtkext/graph/edge.h
@@ -77,10 +77,7 @@ void g_graph_edge_reserve_horizontal_space(GGraphEdge *, GGraphRanks *);
 void g_graph_edge_compute(GGraphEdge *, GGraphRanks *);
 
 /* Dessine les liens graphiques enregistrés dans le moteur. */
-void g_graph_edge_draw(const GGraphEdge *, GdkDrawable *, GdkGC *);
-
-/* Dessine les liens graphiques enregistrés dans le moteur. */
-void _g_graph_edge_draw(const GGraphEdge *, cairo_t *, bool);
+void g_graph_edge_draw(const GGraphEdge *, cairo_t *, bool);
 
 
 
diff --git a/src/gtkext/graph/layout.c b/src/gtkext/graph/layout.c
index 9ac3ee3..0d4f7b3 100644
--- a/src/gtkext/graph/layout.c
+++ b/src/gtkext/graph/layout.c
@@ -789,30 +789,6 @@ void g_graph_layout_size_request(const GGraphLayout *layout, GtkRequisition *req
 
 /******************************************************************************
 *                                                                             *
-*  Paramètres  : layout   = graphique à représenter.                          *
-*                drawable = surface de rendu à utiliser.                      *
-*                gc       = contexte graphique du dessin.                     *
-*                                                                             *
-*  Description : Dessine les liens graphiques enregistrés dans le moteur.     *
-*                                                                             *
-*  Retour      : -                                                            *
-*                                                                             *
-*  Remarques   : -                                                            *
-*                                                                             *
-******************************************************************************/
-
-void g_graph_layout_draw(const GGraphLayout *layout, GdkDrawable *drawable, GdkGC *gc)
-{
-    size_t i;                               /* Boucle de parcours          */
-
-    for (i = 0; i < layout->edges_count; i++)
-        g_graph_edge_draw(layout->edges[i], drawable, gc);
-
-}
-
-
-/******************************************************************************
-*                                                                             *
 *  Paramètres  : layout = graphique à représenter.                            *
 *                cairo  = assistant pour le rendu graphique.                  *
 *                arrow  = indique le besoin en flèche à l'arrivée.            *
@@ -825,11 +801,11 @@ void g_graph_layout_draw(const GGraphLayout *layout, GdkDrawable *drawable, GdkG
 *                                                                             *
 ******************************************************************************/
 
-void _g_graph_layout_draw(const GGraphLayout *layout, cairo_t *cairo, bool arrow)
+void g_graph_layout_draw(const GGraphLayout *layout, cairo_t *cairo, bool arrow)
 {
     size_t i;                               /* Boucle de parcours          */
 
     for (i = 0; i < layout->edges_count; i++)
-        _g_graph_edge_draw(layout->edges[i], cairo, arrow);
+        g_graph_edge_draw(layout->edges[i], cairo, arrow);
 
 }
diff --git a/src/gtkext/graph/layout.h b/src/gtkext/graph/layout.h
index 8aade99..6055a04 100644
--- a/src/gtkext/graph/layout.h
+++ b/src/gtkext/graph/layout.h
@@ -79,10 +79,7 @@ void g_graph_layout_place(GGraphLayout *, GtkGraphView *);
 void g_graph_layout_size_request(const GGraphLayout *, GtkRequisition *);
 
 /* Dessine les liens graphiques enregistrés dans le moteur. */
-void g_graph_layout_draw(const GGraphLayout *, GdkDrawable *, GdkGC *);
-
-/* Dessine les liens graphiques enregistrés dans le moteur. */
-void _g_graph_layout_draw(const GGraphLayout *, cairo_t *, bool);
+void g_graph_layout_draw(const GGraphLayout *, cairo_t *, bool);
 
 
 
diff --git a/src/gtkext/gtkbinarystrip.c b/src/gtkext/gtkbinarystrip.c
index 3f4a6a6..3b36c8b 100644
--- a/src/gtkext/gtkbinarystrip.c
+++ b/src/gtkext/gtkbinarystrip.c
@@ -71,7 +71,7 @@ static void gtk_binary_strip_size_allocate(GtkWidget *, GtkAllocation *);
 static gboolean gtk_binary_strip_button_release(GtkWidget *, GdkEventButton *);
 
 /* Met à jour l'affichage du composant d'affichage. */
-static gboolean gtk_binary_strip_expose(GtkWidget *, GdkEventExpose *);
+static gboolean gtk_binary_strip_draw(GtkWidget *, cairo_t *);
 
 /* Prépare l'affichage d'une astuce. */
 static gboolean gtk_binary_strip_query_tooltip(GtkWidget *, gint, gint, gboolean, GtkTooltip *);
@@ -103,7 +103,7 @@ static void gtk_binary_strip_class_init(GtkBinaryStripClass *class)
     widget_class->realize = gtk_binary_strip_realize;
     widget_class->size_allocate = gtk_binary_strip_size_allocate;
     widget_class->button_release_event = gtk_binary_strip_button_release;
-    widget_class->expose_event = gtk_binary_strip_expose;
+    widget_class->draw = gtk_binary_strip_draw;
     widget_class->query_tooltip = gtk_binary_strip_query_tooltip;
 
     g_signal_new("select-address",
@@ -186,8 +186,8 @@ static void gtk_binary_strip_realize(GtkWidget *widget)
     GTK_WIDGET_CLASS(gtk_binary_strip_parent_class)->realize(widget);
 
     cursor = gdk_cursor_new(GDK_HAND1);
-    gdk_window_set_cursor(widget->window, cursor);
-    gdk_cursor_unref(cursor);
+    gdk_window_set_cursor(gtk_widget_get_window(widget), cursor);
+    g_object_unref(cursor);
 
     gtk_widget_add_events(widget, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK);
 
@@ -250,6 +250,8 @@ static void gtk_binary_strip_size_allocate(GtkWidget *widget, GtkAllocation *all
 
 static gboolean gtk_binary_strip_button_release(GtkWidget *widget, GdkEventButton *event)
 {
+    gint width;                             /* Laugeur du composant        */
+    gint height;                            /* Hauteur du composant        */
     GtkBinaryStrip *strip;                  /* Autre version du composant  */
     GExeFormat *format;                     /* Format du binaire           */
     GBinPortion *portions;                  /* Portions binaires à dessiner*/
@@ -258,7 +260,11 @@ static gboolean gtk_binary_strip_button_release(GtkWidget *widget, GdkEventButto
 
     if (event->x < 0 || event->y < 0)
         return FALSE;
-    if (event->x >= widget->allocation.width || event->y >= widget->allocation.height)
+
+    width = gtk_widget_get_allocated_width(widget);
+    height = gtk_widget_get_allocated_height(widget);
+
+    if (event->x >= width || event->y >= height)
         return FALSE;
 
     strip = GTK_BINARY_STRIP(widget);
@@ -267,8 +273,8 @@ static gboolean gtk_binary_strip_button_release(GtkWidget *widget, GdkEventButto
 
     area.x = 0;
     area.y = 0;
-    area.width = widget->allocation.width;
-    area.height = widget->allocation.height;
+    area.width = width;
+    area.height = height;
 
     if (g_binary_portion_get_addr_from_pos(portions, event->x, &area, &addr))
     {
@@ -289,7 +295,7 @@ static gboolean gtk_binary_strip_button_release(GtkWidget *widget, GdkEventButto
 /******************************************************************************
 *                                                                             *
 *  Paramètres  : widget = composant GTK à redessiner.                         *
-*                event  = informations liées à l'événement.                   *
+*                cr     = contexte graphique associé à l'événement.           *
 *                                                                             *
 *  Description : Met à jour l'affichage du composant d'affichage.             *
 *                                                                             *
@@ -299,13 +305,13 @@ static gboolean gtk_binary_strip_button_release(GtkWidget *widget, GdkEventButto
 *                                                                             *
 ******************************************************************************/
 
-static gboolean gtk_binary_strip_expose(GtkWidget *widget, GdkEventExpose *event)
+static gboolean gtk_binary_strip_draw(GtkWidget *widget, cairo_t *cr)
 {
     GtkBinaryStrip *strip;                  /* Autre vision du composant   */
-    cairo_t *cr;                            /* Contexte graphique          */
     GExeFormat *format;                     /* Format du binaire           */
     GBinPortion *portions;                  /* Portions binaires à dessiner*/
     GdkRectangle full;                      /* Taille totale de la surface */
+    GdkRGBA *color;                         /* Couleur du curseur          */
 
     strip = GTK_BINARY_STRIP(widget);
 
@@ -315,19 +321,12 @@ static gboolean gtk_binary_strip_expose(GtkWidget *widget, GdkEventExpose *event
     format = g_loaded_binary_get_format(strip->binary);
     portions = g_exe_format_get_portions(format);
 
-    cr = gdk_cairo_create(widget->window);
-
-    cairo_rectangle(cr,
-                    event->area.x, event->area.y,
-                    event->area.width, event->area.height);
-    cairo_clip(cr);
-
     /* Dessin des portions de binaire */
 
     full.x = 0;
     full.y = 1;
-    full.width = widget->allocation.width;
-    full.height = widget->allocation.height - 1;
+    full.width = gtk_widget_get_allocated_width(widget);
+    full.height = gtk_widget_get_allocated_height(widget) - 1;
 
     g_binary_portion_draw(portions, cr, &full);
 
@@ -337,10 +336,12 @@ static gboolean gtk_binary_strip_expose(GtkWidget *widget, GdkEventExpose *event
     {
         cairo_set_line_width(cr, 1);
 
-        cairo_set_source_rgb(cr, 
-                             (1.0 * widget->style->bg[GTK_STATE_NORMAL].red) / USHRT_MAX,
-                             (1.0 * widget->style->bg[GTK_STATE_NORMAL].green) / USHRT_MAX,
-                             (1.0 * widget->style->bg[GTK_STATE_NORMAL].blue )/ USHRT_MAX);
+        gtk_style_context_get(gtk_widget_get_style_context(widget), GTK_STATE_FLAG_NORMAL,
+                       GTK_STYLE_PROPERTY_BACKGROUND_COLOR, &color, NULL);
+
+        cairo_set_source_rgb(cr, color->red, color->green, color->blue);
+
+        gdk_rgba_free(color);
 
         cairo_move_to(cr, strip->cursor_pos, STRIP_MARKER_SIZE);
         cairo_line_to(cr, strip->cursor_pos + STRIP_MARKER_SIZE, 0);
@@ -356,10 +357,6 @@ static gboolean gtk_binary_strip_expose(GtkWidget *widget, GdkEventExpose *event
 
     }
 
-    /* Clôture */
-
-    cairo_destroy (cr);
-
     return FALSE;
 
 }
@@ -400,8 +397,8 @@ static gboolean gtk_binary_strip_query_tooltip(GtkWidget *widget, gint x, gint y
 
         area.x = 0;
         area.y = 0;
-        area.width = widget->allocation.width;
-        area.height = widget->allocation.height;
+        area.width = gtk_widget_get_allocated_width(widget);
+        area.height = gtk_widget_get_allocated_height(widget);
 
         result = g_binary_portion_query_tooltip(portions, x, y, &area, tooltip);
 
diff --git a/src/gtkext/gtkblockview.h b/src/gtkext/gtkblockview.h
index c3e04ed..e67b8d5 100644
--- a/src/gtkext/gtkblockview.h
+++ b/src/gtkext/gtkblockview.h
@@ -26,7 +26,7 @@
 
 
 #include <glib-object.h>
-#include <gtk/gtkwidget.h>
+#include <gtk/gtk.h>
 
 
 
diff --git a/src/gtkext/gtkbufferview.c b/src/gtkext/gtkbufferview.c
index 7cb1e9b..877b041 100644
--- a/src/gtkext/gtkbufferview.c
+++ b/src/gtkext/gtkbufferview.c
@@ -46,14 +46,17 @@ static gboolean gtk_buffer_view_focus(GtkWidget *, GtkDirectionType);
 /* Assure la gestion des clics de souris sur le composant. */
 static gboolean gtk_buffer_view_button_press(GtkWidget *, GdkEventButton *);
 
-/* Fournit la taille de composant requise pour un plein rendu. */
-static void gtk_buffer_view_size_request(GtkWidget *, GtkRequisition *);
+/* Fournit la hauteur de composant requise pour un plein rendu. */
+static void gtk_buffer_view_get_preferred_height(GtkWidget *, gint *, gint *);
+
+/* Fournit la largeur de composant requise pour un plein rendu. */
+static void gtk_buffer_view_get_preferred_width(GtkWidget *, gint *, gint *);
 
 /* S'adapte à la surface concédée par le composant parent. */
 static void gtk_buffer_view_size_allocate(GtkWidget *, GtkAllocation *);
 
 /* Met à jour l'affichage de la visualisation de code buffer. */
-static gboolean gtk_buffer_view_expose(GtkWidget *, GdkEventExpose *);
+static gboolean gtk_buffer_view_draw(GtkWidget *, cairo_t *);
 
 /* Prend en compte une frappe de touche sur le composant. */
 static gboolean gtk_buffer_view_key_press(GtkWidget *, GdkEventKey *);
@@ -109,9 +112,10 @@ static void gtk_buffer_view_class_init(GtkBufferViewClass *class)
 
     widget_class->focus = gtk_buffer_view_focus;
     widget_class->button_press_event = gtk_buffer_view_button_press;
-    widget_class->size_request = gtk_buffer_view_size_request;
+    widget_class->get_preferred_height = gtk_buffer_view_get_preferred_height;
+    widget_class->get_preferred_width = gtk_buffer_view_get_preferred_width;
     widget_class->size_allocate = gtk_buffer_view_size_allocate;
-    widget_class->expose_event = gtk_buffer_view_expose;
+    widget_class->draw = gtk_buffer_view_draw;
     widget_class->key_press_event = gtk_buffer_view_key_press;
 
     g_signal_new("caret-moved",
@@ -301,10 +305,11 @@ void gtk_buffer_view_compute_real_coord(GtkBufferView *view, gint *x, gint *y)
 
 /******************************************************************************
 *                                                                             *
-*  Paramètres  : widget      = composant GTK à consulter.                     *
-*                requisition = dimensions souhaitées. [OUT]                   *
+*  Paramètres  : widget  = composant GTK à consulter.                         *
+*                minimal = taille minimale. [OUT]                             *
+*                natural = taille idéale. [OUT]                               *
 *                                                                             *
-*  Description : Fournit la taille de composant requise pour un plein rendu.  *
+*  Description : Fournit la hauteur de composant requise pour un plein rendu. *
 *                                                                             *
 *  Retour      : -                                                            *
 *                                                                             *
@@ -312,17 +317,50 @@ void gtk_buffer_view_compute_real_coord(GtkBufferView *view, gint *x, gint *y)
 *                                                                             *
 ******************************************************************************/
 
-static void gtk_buffer_view_size_request(GtkWidget *widget, GtkRequisition *requisition)
+static void gtk_buffer_view_get_preferred_height(GtkWidget *widget, gint *minimal, gint *natural)
 {
     GtkBufferView *view;                    /* Autre version du composant  */
 
     view = GTK_BUFFER_VIEW(widget);
 
     if (view->buffer_view != NULL)
-        g_buffer_view_get_size(view->buffer_view,
-                               &requisition->width, &requisition->height,
-                               *GTK_VIEW_PANEL(view)->display_addr,
-                               *GTK_VIEW_PANEL(view)->display_code);
+        *minimal = g_buffer_view_get_height(view->buffer_view);
+    else
+        *minimal = 0;
+
+    *natural = *minimal;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : widget  = composant GTK à consulter.                         *
+*                minimal = taille minimale. [OUT]                             *
+*                natural = taille idéale. [OUT]                               *
+*                                                                             *
+*  Description : Fournit la largeur de composant requise pour un plein rendu. *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void gtk_buffer_view_get_preferred_width(GtkWidget *widget, gint *minimal, gint *natural)
+{
+    GtkBufferView *view;                    /* Autre version du composant  */
+
+    view = GTK_BUFFER_VIEW(widget);
+
+    if (view->buffer_view != NULL)
+        *minimal = g_buffer_view_get_width(view->buffer_view,
+                                           *GTK_VIEW_PANEL(view)->display_addr,
+                                           *GTK_VIEW_PANEL(view)->display_code);
+    else
+        *minimal = 0;
+
+    *natural = *minimal;
 
 }
 
@@ -351,10 +389,10 @@ static void gtk_buffer_view_size_allocate(GtkWidget *widget, GtkAllocation *allo
 
     /* Mise à jour GTK */
 
-    widget->allocation = *allocation;
+    gtk_widget_set_allocation(widget, allocation);
 
     if (gtk_widget_get_realized(widget))
-        gdk_window_move_resize(widget->window,
+        gdk_window_move_resize(gtk_widget_get_window(widget),
                                allocation->x, allocation->y,
                                allocation->width, allocation->height);
 
@@ -365,18 +403,18 @@ static void gtk_buffer_view_size_allocate(GtkWidget *widget, GtkAllocation *allo
 
     view = GTK_BUFFER_VIEW(widget);
 
-    g_buffer_view_get_size(view->buffer_view, &width, &height,
-                           *panel->display_addr, *panel->display_code);
+    width = g_buffer_view_get_width(view->buffer_view, *panel->display_addr, *panel->display_code);
+    height = g_buffer_view_get_height(view->buffer_view);
 
     gtk_view_panel_compute_allocation(panel, &valloc);
 
     /* Défilement horizontal */
 
-    panel->hadjustment->page_size = valloc.width;
-    panel->hadjustment->step_increment = valloc.width * 0.1;
-    panel->hadjustment->page_increment = valloc.width * 0.9;
+    gtk_adjustment_set_page_size(panel->hadjustment, valloc.width);
+    gtk_adjustment_set_step_increment(panel->hadjustment, valloc.width * 0.1);
+    gtk_adjustment_set_page_increment(panel->hadjustment, valloc.width * 0.9);
 
-    panel->hadjustment->upper = MAX(width, valloc.width);
+    gtk_adjustment_set_upper(panel->hadjustment, MAX(width, valloc.width));
 
     gtk_view_panel_reclamp_adjustment(panel->hadjustment, &changed);
 
@@ -387,11 +425,11 @@ static void gtk_buffer_view_size_allocate(GtkWidget *widget, GtkAllocation *allo
 
     /* Défilement vertical */
 
-    panel->vadjustment->page_size = valloc.height;
-    panel->vadjustment->step_increment = view->line_height;
-    panel->vadjustment->page_increment = panel->vadjustment->step_increment * 10.0;
+    gtk_adjustment_set_page_size(panel->vadjustment, valloc.height);
+    gtk_adjustment_set_step_increment(panel->vadjustment, view->line_height);
+    gtk_adjustment_set_page_increment(panel->vadjustment, view->line_height * 10.0);
 
-    panel->vadjustment->upper = MAX(height, valloc.height);
+    gtk_adjustment_set_upper(panel->vadjustment, MAX(height, valloc.height));
 
     gtk_view_panel_reclamp_adjustment(panel->vadjustment, &changed);
 
@@ -405,8 +443,8 @@ static void gtk_buffer_view_size_allocate(GtkWidget *widget, GtkAllocation *allo
 
 /******************************************************************************
 *                                                                             *
-*  Paramètres  : view  = composant GTK à redessiner.                          *
-*                event = informations liées à l'événement.                    *
+*  Paramètres  : widget = composant GTK à redessiner.                         *
+*                cr     = contexte graphique associé à l'événement.           *
 *                                                                             *
 *  Description : Met à jour l'affichage de la visualisation de code buffer.   *
 *                                                                             *
@@ -416,62 +454,75 @@ static void gtk_buffer_view_size_allocate(GtkWidget *widget, GtkAllocation *allo
 *                                                                             *
 ******************************************************************************/
 
-static gboolean gtk_buffer_view_expose(GtkWidget *widget, GdkEventExpose *event)
+static gboolean gtk_buffer_view_draw(GtkWidget *widget, cairo_t *cr)
 {
     GtkBufferView *view;                    /* Autre version du composant  */
     GtkViewPanel *pview;                    /* Autre version du composant  */
-    GtkStyle *style;                        /* Style associé au composant  */
-    GdkDrawable *drawable;                  /* Surface de dessin           */
+    cairo_region_t *region;                 /* Région visible à redessiner */
+    cairo_rectangle_int_t area;             /* Surface correspondante      */
     gint fake_x;                            /* Abscisse virtuelle          */
     gint fake_y;                            /* Ordonnée virtuelle          */
-    GtkStateType state;                     /* Etat du composant           */
-    GtkViewPanelClass *parent_class;        /* Version pure du parent      */
+    GtkStateFlags state;                    /* Etat du composant           */
+    GdkRGBA *color;                         /* Couleur du curseur          */
 
     view = GTK_BUFFER_VIEW(widget);
     widget = GTK_WIDGET(view);
     pview = GTK_VIEW_PANEL(widget);
 
-    drawable = GDK_DRAWABLE(event->window);
-
-    gdk_window_begin_paint_region(drawable, event->region);
-
-    //gdk_gc_set_clip_region(pview->gc, event->region);
-
-    style = gtk_widget_get_style(GTK_WIDGET(view));
+    region = gdk_window_get_visible_region(gtk_widget_get_window(widget));
+    cairo_region_get_extents(region, &area);
+    cairo_region_destroy(region);
 
     fake_x = 0;
     fake_y = 0;
     gtk_buffer_view_compute_fake_coord(view, &fake_x, &fake_y);
 
+
+    do
+    {
+
+
+        GtkStyleContext *context;
+
+
+        context = gtk_widget_get_style_context(widget);
+
+        gtk_render_background(context, cr, 0, 0, 250, 250);
+
+        printf("Passage!\n");
+
+
+    } while (0);
+
+
+
     /* Dessin de la marge gauche */
 
-    state = gtk_widget_get_state(widget);
+    state = gtk_widget_get_state_flags(widget);
 
-    gdk_gc_set_foreground(pview->gc, &style->mid[state]);
+    gtk_style_context_get(gtk_widget_get_style_context(widget), state,
+                          GTK_STYLE_PROPERTY_BACKGROUND_COLOR, &color, NULL);
 
-    gdk_draw_rectangle(drawable, pview->gc, TRUE,
-                       fake_x, event->area.y, view->left_margin, event->area.y + event->area.height);
+    cairo_rectangle(cr, fake_x, area.y,view->left_margin, area.y + area.height);
+    cairo_fill(cr);
 
-    gdk_gc_set_foreground(pview->gc, &style->dark[state]);
+    gtk_style_context_get(gtk_widget_get_style_context(widget), state,
+                          GTK_STYLE_PROPERTY_BORDER_COLOR, &color, NULL);
 
-    gdk_draw_line(drawable, pview->gc,
-                  fake_x + view->left_margin, event->area.y,
-                  fake_x + view->left_margin, event->area.y + event->area.height);
+    cairo_move_to(cr, fake_x + view->left_margin, area.y);
+    cairo_line_to(cr, fake_x + view->left_margin, area.y + area.height);
+    cairo_fill(cr);
 
     /* Eventuelle bordure globale */
 
-    parent_class = g_type_class_peek(g_type_parent(GTK_TYPE_BUFFER_VIEW));
-
-    GTK_WIDGET_CLASS(parent_class)->expose_event(widget, event);
+    GTK_WIDGET_CLASS(gtk_buffer_view_parent_class)->draw(widget, cr);
 
     /* Impression du désassemblage */
 
     if (view->buffer_view != NULL)
-        g_buffer_view_draw(view->buffer_view, event, pview->gc, fake_x, fake_y,
+        g_buffer_view_draw(view->buffer_view, cr, fake_x, fake_y, &area,
                            *pview->display_addr, *pview->display_code);
 
-    gdk_window_end_paint(drawable);
-
     return TRUE;
 
 }
@@ -633,7 +684,8 @@ void gtk_buffer_view_attach_buffer(GtkBufferView *view, GBufferView *buffer, boo
 
     /* Validation finale */
 
-    g_buffer_view_get_size(view->buffer_view, &width, &height, *addr, *code);
+    width = g_buffer_view_get_width(view->buffer_view, *addr, *code);
+    height = g_buffer_view_get_height(view->buffer_view);
 
     width += -view->left_text + 1;
     height += 1;
@@ -754,10 +806,8 @@ static gboolean gtk_buffer_view_refresh_caret(GtkBufferView *view)
 {
     GtkWidget *widget;                      /* Autre version du composant  */
     GdkRectangle area;                      /* Région adaptée à traiter    */
-    GdkDrawable *drawable;                  /* Surface de dessin           */
-    GtkStyle *style;                        /* Style associé au composant  */
-    GtkStateType state;                     /* Etat du composant           */
-    GdkGC *gc;                              /* Contexte graphique          */
+    cairo_t *cr;                            /* Contexte graphique          */
+    GdkRGBA *color;                         /* Couleur du curseur          */
 
     widget = GTK_WIDGET(view);
 
@@ -776,16 +826,18 @@ static gboolean gtk_buffer_view_refresh_caret(GtkBufferView *view)
     {
         view->show_caret = true;
 
-        drawable = GDK_DRAWABLE(widget->window);
-        state = gtk_widget_get_state(widget);
-        style = gtk_widget_get_style(widget);
+        cr = gdk_cairo_create(gtk_widget_get_window(widget));
+
+        gtk_style_context_get(gtk_widget_get_style_context(widget),
+                              gtk_widget_get_state_flags(widget),
+                              GTK_STYLE_PROPERTY_COLOR, &color, NULL);
 
-        gc = gdk_gc_new(drawable);
-        gdk_gc_set_foreground(gc, &style->text[state]);
+        cairo_set_source_rgb(cr, color->red, color->green, color->blue);
 
-        gdk_draw_rectangle(drawable, gc, TRUE, area.x, area.y, area.width, area.height);
+        cairo_rectangle(cr, area.x, area.y, area.width, area.height);
+        cairo_fill(cr);
 
-        gdk_gc_destroy(gc);
+        cairo_destroy(cr);
 
     }
 
diff --git a/src/gtkext/gtkbufferview.h b/src/gtkext/gtkbufferview.h
index df34b72..6b95a4c 100644
--- a/src/gtkext/gtkbufferview.h
+++ b/src/gtkext/gtkbufferview.h
@@ -26,7 +26,7 @@
 
 
 #include <glib-object.h>
-#include <gtk/gtkwidget.h>
+#include <gtk/gtk.h>
 
 
 #include "../glibext/gcodebuffer.h"
diff --git a/src/gtkext/gtkdockstation.c b/src/gtkext/gtkdockstation.c
index e087377..532ea2b 100644
--- a/src/gtkext/gtkdockstation.c
+++ b/src/gtkext/gtkdockstation.c
@@ -47,7 +47,7 @@ static gboolean gtk_dock_station_switch_panel(GtkNotebook *, gpointer *, guint,
 
 
 /* Détermine le type du composant d'affichage concentré. */
-G_DEFINE_TYPE(GtkDockStation, gtk_dock_station, GTK_TYPE_VBOX)
+G_DEFINE_TYPE(GtkDockStation, gtk_dock_station, GTK_TYPE_BOX)
 
 
 /******************************************************************************
@@ -110,11 +110,13 @@ static void gtk_dock_station_init(GtkDockStation *station)
     GtkWidget *button;                      /* Bouton de contrôle          */
     GtkWidget *image;                       /* Image associée              */
 
+    gtk_orientable_set_orientation(GTK_ORIENTABLE(station), GTK_ORIENTATION_VERTICAL);
+
     eventbox = gtk_event_box_new();
     gtk_widget_show(eventbox);
     gtk_box_pack_start(GTK_BOX(station), eventbox, FALSE, TRUE, 0);
 
-    hbox = gtk_hbox_new(FALSE, 0);
+    hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
     gtk_widget_show(hbox);
     gtk_container_add(GTK_CONTAINER(eventbox), hbox);
 
diff --git a/src/gtkext/gtkdockstation.h b/src/gtkext/gtkdockstation.h
index 192fdf2..add421a 100644
--- a/src/gtkext/gtkdockstation.h
+++ b/src/gtkext/gtkdockstation.h
@@ -28,7 +28,7 @@
 #include <gtk/gtk.h>
 
 
-G_BEGIN_DECLS
+//G_BEGIN_DECLS
 
 
 #define GTK_TYPE_DOCK_STATION             (gtk_dock_station_get_type())
@@ -47,7 +47,7 @@ typedef struct _GtkDockStationClass GtkDockStationClass;
 /* Station de réception pour concentration d'éléments (instance) */
 struct _GtkDockStation
 {
-    GtkVBox vbox;                           /* Présence obligatoire en 1er */
+    GtkBox vbox;                            /* Présence obligatoire en 1er */
 
     GtkLabel *title;                        /* Title du support principal  */
     GtkNotebook *notebook;                  /* Support à onglets           */
@@ -57,7 +57,7 @@ struct _GtkDockStation
 /* Station de réception pour concentration d'éléments (classe) */
 struct _GtkDockStationClass
 {
-    GtkVBoxClass parent_class;              /* Présence obligatoire en 1er */
+    GtkBoxClass parent_class;               /* Présence obligatoire en 1er */
 
     /* Signaux */
 
@@ -92,7 +92,7 @@ GtkWidget *gtk_dock_panel_get_widget(GtkDockStation *, gint);
 
 
 
-G_END_DECLS
+//G_END_DECLS
 
 
 
diff --git a/src/gtkext/gtkgraphview.c b/src/gtkext/gtkgraphview.c
index 52d718b..817c311 100644
--- a/src/gtkext/gtkgraphview.c
+++ b/src/gtkext/gtkgraphview.c
@@ -69,14 +69,17 @@ static void gtk_graph_view_class_init(GtkGraphViewClass *);
 /* Initialise une instance d'afficheur de code en graphique. */
 static void gtk_graph_view_init(GtkGraphView *);
 
-/* Fournit la taille de composant requise pour un plein rendu. */
-static void gtk_graph_view_size_request(GtkWidget *, GtkRequisition *);
+/* Fournit la hauteur de composant requise pour un plein rendu. */
+static void gtk_graph_view_get_preferred_height(GtkWidget *, gint *, gint *);
+
+/* Fournit la largeur de composant requise pour un plein rendu. */
+static void gtk_graph_view_get_preferred_width(GtkWidget *, gint *, gint *);
 
 /* S'adapte à la surface concédée par le composant parent. */
 static void gtk_graph_view_size_allocate(GtkWidget *, GtkAllocation *);
 
 /*  Met à jour l'affichage de la vue sous forme graphique. */
-static gboolean gtk_graph_view_expose(GtkWidget *, GdkEventExpose *, GtkGraphView *);
+static gboolean gtk_graph_view_draw(GtkWidget *, cairo_t *, GtkGraphView *);
 
 /* Réagit à la sélection externe d'une adresse. */
 static void gtk_graph_view_define_main_address(GtkGraphView *, vmpa_t);
@@ -125,7 +128,8 @@ static void gtk_graph_view_class_init(GtkGraphViewClass *klass)
 
     widget_class = (GtkWidgetClass *)klass;
 
-    widget_class->size_request = gtk_graph_view_size_request;
+    widget_class->get_preferred_height = gtk_graph_view_get_preferred_height;
+    widget_class->get_preferred_width = gtk_graph_view_get_preferred_width;
     widget_class->size_allocate = gtk_graph_view_size_allocate;
 
 }
@@ -166,13 +170,15 @@ static void gtk_graph_view_init(GtkGraphView *view)
     view->support = GTK_FIXED(gtk_fixed_new());
     gtk_widget_set_has_window(GTK_WIDGET(view->support), TRUE);
 
-    g_signal_connect(G_OBJECT(view->support), "expose-event",
-                     G_CALLBACK(gtk_graph_view_expose), view);
+    g_signal_connect(G_OBJECT(view->support), "draw",
+                     G_CALLBACK(gtk_graph_view_draw), view);
 
     gtk_widget_show(GTK_WIDGET(view->support));
 
+    /*
     gdk_color_white(gtk_widget_get_colormap(GTK_WIDGET(view->support)), &white);
     gtk_widget_modify_bg(GTK_WIDGET(view->support), GTK_STATE_NORMAL, &white);
+    */
 
     gtk_fixed_put(GTK_FIXED(view), GTK_WIDGET(view->support), 0, 0);
 
@@ -182,12 +188,23 @@ static void gtk_graph_view_init(GtkGraphView *view)
 }
 
 
+
+
+
+
+
+
+
+
+
+
 /******************************************************************************
 *                                                                             *
-*  Paramètres  : widget      = composant GTK à consulter.                     *
-*                requisition = dimensions souhaitées. [OUT]                   *
+*  Paramètres  : widget  = composant GTK à consulter.                         *
+*                minimal = taille minimale. [OUT]                             *
+*                natural = taille idéale. [OUT]                               *
 *                                                                             *
-*  Description : Fournit la taille de composant requise pour un plein rendu.  *
+*  Description : Fournit la hauteur de composant requise pour un plein rendu. *
 *                                                                             *
 *  Retour      : -                                                            *
 *                                                                             *
@@ -195,63 +212,74 @@ static void gtk_graph_view_init(GtkGraphView *view)
 *                                                                             *
 ******************************************************************************/
 
-static void gtk_graph_view_size_request(GtkWidget *widget, GtkRequisition *requisition)
+static void gtk_graph_view_get_preferred_height(GtkWidget *widget, gint *minimal, gint *natural)
 {
-    gpointer fixed_class;                   /* Classe parente              */
     GtkGraphView *view;                     /* Autre vision du composant   */
-    size_t i;                               /* Boucle de parcours          */
-    gint left_corner;                       /* Abscisse minimale           */
-    gint top_corner;                        /* Ordonnée minimale           */
-
-    fixed_class = g_type_class_peek_parent(GTK_GRAPH_VIEW_GET_CLASS(widget));
-    fixed_class = g_type_class_peek_parent(fixed_class);
-
-    GTK_WIDGET_CLASS(fixed_class)->size_request(widget, requisition);
+    GtkRequisition requisition;             /* Taille requise              */
+    gpointer fixed_class;                   /* Classe parente              */
 
     view = GTK_GRAPH_VIEW(widget);
 
     if (view->layout != NULL)
-        g_graph_layout_size_request(view->layout, requisition);
+    {
+        g_graph_layout_size_request(view->layout, &requisition);
 
+        *minimal = requisition.height;
+        *natural = *minimal;
 
+    }
 
-    //requisition->width += 65;
-    //requisition->height += 65;
+    else
+    {
+        fixed_class = g_type_class_peek_parent(GTK_GRAPH_VIEW_GET_CLASS(widget));
+        fixed_class = g_type_class_peek_parent(fixed_class);
 
-    view = GTK_GRAPH_VIEW(widget);
+        GTK_WIDGET_CLASS(fixed_class)->get_preferred_height(widget, minimal, natural);
 
-    /*
-    requisition->width += GTK_VIEW_PANEL(widget)->hadjustment->value;
-    requisition->height += GTK_VIEW_PANEL(widget)->vadjustment->value;
-    */
+    }
 
-#if 0
-    /**
-     * On s'assure de ne couper aucun lien.
-     */
+}
 
-    /*
-    for (i = 0; i < view->links_count; i++)
-        gtk_link_renderer_size_request(view->links[i], requisition);
-    */
 
-    /**
-     * Traitement purement cosmétique : on ajoute la même bordure aux bords
-     * droit et bas.
-     */
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : widget  = composant GTK à consulter.                         *
+*                minimal = taille minimale. [OUT]                             *
+*                natural = taille idéale. [OUT]                               *
+*                                                                             *
+*  Description : Fournit la largeur de composant requise pour un plein rendu. *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void gtk_graph_view_get_preferred_width(GtkWidget *widget, gint *minimal, gint *natural)
+{
+    GtkGraphView *view;                     /* Autre vision du composant   */
+    GtkRequisition requisition;             /* Taille requise              */
+    gpointer fixed_class;                   /* Classe parente              */
 
-    left_corner = G_MAXINT;
-    top_corner = G_MAXINT;
+    view = GTK_GRAPH_VIEW(widget);
 
-    for (i = 0; i < view->children_count; i++)
+    if (view->layout != NULL)
     {
-        left_corner = MIN(left_corner, view->allocs[i].x);
-        top_corner = MIN(top_corner, view->allocs[i].y);
+        g_graph_layout_size_request(view->layout, &requisition);
+
+        *minimal = requisition.width;
+        *natural = *minimal;
+
     }
 
-    if (left_corner != G_MAXINT) requisition->width += left_corner;
-    if (top_corner != G_MAXINT) requisition->height += top_corner;
-#endif
+    else
+    {
+        fixed_class = g_type_class_peek_parent(GTK_GRAPH_VIEW_GET_CLASS(widget));
+        fixed_class = g_type_class_peek_parent(fixed_class);
+
+        GTK_WIDGET_CLASS(fixed_class)->get_preferred_width(widget, minimal, natural);
+
+    }
 
 }
 
@@ -293,23 +321,23 @@ static void gtk_graph_view_size_allocate(GtkWidget *widget, GtkAllocation *alloc
 
     gtk_view_panel_compute_allocation(panel, &valloc);
 
-    gtk_widget_size_request(widget, &req);
+    gtk_widget_get_preferred_size(widget, NULL, &req);
 
     /* Correction de la taille du support */
 
     view = GTK_GRAPH_VIEW(widget);
-    window = GTK_WIDGET(view->support)->window;
+    window = gtk_widget_get_window(GTK_WIDGET(view->support));
 
     if (gdk_window_get_width(window) != req.width || gdk_window_get_height(window) != req.height)
         gdk_window_resize(window, req.width, req.height);
 
     /* Défilement horizontal */
 
-    panel->hadjustment->page_size = valloc.width;
-    panel->hadjustment->step_increment = valloc.width * 0.1;
-    panel->hadjustment->page_increment = valloc.width * 0.9;
+    gtk_adjustment_set_page_size(panel->hadjustment, valloc.width);
+    gtk_adjustment_set_step_increment(panel->hadjustment, valloc.width * 0.1);
+    gtk_adjustment_set_page_increment(panel->hadjustment, valloc.width * 0.9);
 
-    panel->hadjustment->upper = MAX(req.width, valloc.width);
+    gtk_adjustment_set_upper(panel->hadjustment, MAX(req.width, valloc.width));
 
     gtk_view_panel_reclamp_adjustment(panel->hadjustment, &changed);
 
@@ -320,11 +348,11 @@ static void gtk_graph_view_size_allocate(GtkWidget *widget, GtkAllocation *alloc
 
     /* Défilement vertical */
 
-    panel->vadjustment->page_size = valloc.height;
-    panel->vadjustment->step_increment = valloc.width * 0.1;
-    panel->vadjustment->page_increment = valloc.width * 0.9;
+    gtk_adjustment_set_page_size(panel->vadjustment, valloc.width);
+    gtk_adjustment_set_step_increment(panel->vadjustment, valloc.width * 0.1);
+    gtk_adjustment_set_page_increment(panel->vadjustment, valloc.width * 0.9);
 
-    panel->vadjustment->upper = MAX(req.height, valloc.height);
+    gtk_adjustment_set_upper(panel->vadjustment, MAX(req.height, valloc.height));
 
     gtk_view_panel_reclamp_adjustment(panel->vadjustment, &changed);
 
@@ -339,7 +367,7 @@ static void gtk_graph_view_size_allocate(GtkWidget *widget, GtkAllocation *alloc
 /******************************************************************************
 *                                                                             *
 *  Paramètres  : widget = composant GTK à redessiner.                         *
-*                event  = informations liées à l'événement.                   *
+*                cr  = contexte graphique associé à l'événement.              *
 *                view   = support maître à consulter.                         *
 *                                                                             *
 *  Description : Met à jour l'affichage de la vue sous forme graphique.       *
@@ -350,10 +378,10 @@ static void gtk_graph_view_size_allocate(GtkWidget *widget, GtkAllocation *alloc
 *                                                                             *
 ******************************************************************************/
 
-static gboolean gtk_graph_view_expose(GtkWidget *widget, GdkEventExpose *event, GtkGraphView *view)
+static gboolean gtk_graph_view_draw(GtkWidget *widget, cairo_t *cr, GtkGraphView *view)
 {
     if (view->layout != NULL)
-        g_graph_layout_draw(view->layout, GDK_DRAWABLE(widget->window), GTK_VIEW_PANEL(view)->gc);
+        g_graph_layout_draw(view->layout, cr, true);
 
     return FALSE;
 
@@ -508,8 +536,8 @@ static bool gtk_graph_view_get_address_coordinates(const GtkGraphView *view, vmp
 static void gtk_graph_view_scroll(GtkGraphView *view)
 {
     gtk_fixed_move(GTK_FIXED(view), GTK_WIDGET(view->support),
-                   -GTK_VIEW_PANEL(view)->hadjustment->value,
-                   -GTK_VIEW_PANEL(view)->vadjustment->value);
+                   -gtk_adjustment_get_value(GTK_VIEW_PANEL(view)->hadjustment),
+                   -gtk_adjustment_get_value(GTK_VIEW_PANEL(view)->vadjustment));
 
 }
 
@@ -548,7 +576,7 @@ static void gtk_graph_view_cache_glance(GtkGraphView *view, cairo_t *cairo, cons
     cairo_scale(cairo, scale, scale);
 
     if (view->layout != NULL)
-        _g_graph_layout_draw(view->layout, cairo, false);
+        g_graph_layout_draw(view->layout, cairo, false);
 
 }
 
diff --git a/src/gtkext/gtkgraphview.h b/src/gtkext/gtkgraphview.h
index ca164e8..85371f7 100644
--- a/src/gtkext/gtkgraphview.h
+++ b/src/gtkext/gtkgraphview.h
@@ -25,7 +25,7 @@
 #define _GTKEXT_GTKGRAPHVIEW_H
 
 
-#include <gtk/gtkwidget.h>
+#include <gtk/gtk.h>
 
 
 #include "gtklinkrenderer.h"
diff --git a/src/gtkext/gtklinkrenderer.c b/src/gtkext/gtklinkrenderer.c
index 7ef1c37..cb24b64 100644
--- a/src/gtkext/gtklinkrenderer.c
+++ b/src/gtkext/gtklinkrenderer.c
@@ -31,7 +31,7 @@
 /* Lien entre morceaux de code (instance) */
 struct _GtkLinkRenderer
 {
-    GtkObject parent;                       /* A laisser en premier        */
+    GtkWidget/*Object*/ parent;                       /* A laisser en premier        */
 
     LinkColor color;                        /* Couleur d'impression        */
     GdkPoint *points;                       /* Points de la ligne dessinée */
@@ -43,7 +43,7 @@ struct _GtkLinkRenderer
 /* Lien entre morceaux de code (classe) */
 struct _GtkLinkRendererClass
 {
-    GtkObjectClass parent;                  /* A laisser en premier        */
+    GtkWidgetClass/*ObjectClass*/ parent;                  /* A laisser en premier        */
 
 };
 
@@ -64,7 +64,7 @@ static void draw_link_arrow(cairo_t *, gint, gint, gint, gint);
 
 
 /* Détermine le type du moteur de rendu pour les liens graphiques. */
-G_DEFINE_TYPE(GtkLinkRenderer, gtk_link_renderer, GTK_TYPE_OBJECT)
+G_DEFINE_TYPE(GtkLinkRenderer, gtk_link_renderer, GTK_TYPE_WIDGET/*OBJECT*/)
 
 
 /******************************************************************************
@@ -117,7 +117,7 @@ static void gtk_link_renderer_init(GtkLinkRenderer *view)
 *                                                                             *
 ******************************************************************************/
 
-GtkObject *gtk_link_renderer_new(LinkColor color, GdkPoint *points, size_t count)
+void/*GtkObject*/ *gtk_link_renderer_new(LinkColor color, GdkPoint *points, size_t count)
 {
     GtkLinkRenderer *result;                /* Moteur de rendu à retourner */
 
@@ -127,7 +127,7 @@ GtkObject *gtk_link_renderer_new(LinkColor color, GdkPoint *points, size_t count
     result->points = points;
     result->count = count;
 
-    return GTK_OBJECT(result);
+    return /*GTK_OBJECT*/(result);
 
 }
 
@@ -157,7 +157,7 @@ void gtk_link_renderer_size_request(const GtkLinkRenderer *renderer, GtkRequisit
 
 }
 
-
+#if 0
 /******************************************************************************
 *                                                                             *
 *  Paramètres  : renderer = moteur de rendu à manipuler.                      *
@@ -259,7 +259,7 @@ void _gtk_link_renderer_draw(const GtkLinkRenderer *renderer, cairo_t *cairo, bo
                         renderer->points[renderer->count - 1].y);
 
 }
-
+#endif
 
 /******************************************************************************
 *                                                                             *
diff --git a/src/gtkext/gtklinkrenderer.h b/src/gtkext/gtklinkrenderer.h
index 7b78e5e..165c3b6 100644
--- a/src/gtkext/gtklinkrenderer.h
+++ b/src/gtkext/gtklinkrenderer.h
@@ -64,17 +64,17 @@ typedef enum _LinkColor
 GType gtk_link_renderer_get_type(void);
 
 /* Crée un nouveau moteur de rendu pour les liens graphiques. */
-GtkObject *gtk_link_renderer_new(LinkColor, GdkPoint *, size_t);
+void/*GtkObject*/ *gtk_link_renderer_new(LinkColor, GdkPoint *, size_t);
 
 /* S'assure qu'une zone sera assez grande pour tout contenir. */
 void gtk_link_renderer_size_request(const GtkLinkRenderer *, GtkRequisition *);
-
+#if 0
 /* Dessine les liens graphiques enregistrés dans le moteur. */
 void gtk_link_renderer_draw(const GtkLinkRenderer *, GdkDrawable *, GdkGC *);
 
 /* Dessine les liens graphiques enregistrés dans le moteur. */
 void _gtk_link_renderer_draw(const GtkLinkRenderer *, cairo_t *, bool);
-
+#endif
 
 
 #endif  /* _GTKEXT_GTKLINKRENDERER_H */
diff --git a/src/gtkext/gtksourceview.h b/src/gtkext/gtksourceview.h
index e6cf37b..4ca9a9f 100644
--- a/src/gtkext/gtksourceview.h
+++ b/src/gtkext/gtksourceview.h
@@ -26,7 +26,7 @@
 
 
 #include <glib-object.h>
-#include <gtk/gtkwidget.h>
+#include <gtk/gtk.h>
 
 
 
diff --git a/src/gtkext/gtkviewpanel-int.h b/src/gtkext/gtkviewpanel-int.h
index ee69673..e664d61 100644
--- a/src/gtkext/gtkviewpanel-int.h
+++ b/src/gtkext/gtkviewpanel-int.h
@@ -29,7 +29,7 @@
 
 
 #include <stdbool.h>
-#include <gtk/gtkfixed.h>
+#include <gtk/gtk.h>
 
 
 
@@ -61,7 +61,6 @@ struct _GtkViewPanel
     GtkAdjustment *hadjustment;             /* Barre de défilement horiz.  */
     GtkAdjustment *vadjustment;             /* Barre de défilement vert.   */
 
-    GdkGC *gc;                              /* Contexte graphique du rendu */
     bool show_border;                       /* Affichage d'une bordure ?   */
 
     GLoadedBinary *binary;                  /* Binaire à visualiser        */
diff --git a/src/gtkext/gtkviewpanel.c b/src/gtkext/gtkviewpanel.c
index ef1f94d..ebcd941 100644
--- a/src/gtkext/gtkviewpanel.c
+++ b/src/gtkext/gtkviewpanel.c
@@ -45,7 +45,7 @@ static void gtk_view_panel_adj_value_changed(GtkAdjustment *, GtkViewPanel *);
 static void gtk_view_panel_realize(GtkWidget *);
 
 /* Met à jour l'affichage du composant d'affichage. */
-static gboolean gtk_view_panel_expose(GtkWidget *, GdkEventExpose *);
+static gboolean gtk_view_panel_draw(GtkWidget *, cairo_t *);
 
 
 
@@ -72,10 +72,11 @@ static void gtk_view_panel_class_init(GtkViewPanelClass *class)
     widget_class = GTK_WIDGET_CLASS(class);
 
     widget_class->realize = gtk_view_panel_realize;
-    widget_class->expose_event = gtk_view_panel_expose;
+    widget_class->draw = gtk_view_panel_draw;
 
     class->set_scroll_adjustments = gtk_view_panel_set_scroll_adjustments;
 
+    /*
     widget_class->set_scroll_adjustments_signal =
         g_signal_new(("set_scroll_adjustments"),
                      GTK_TYPE_VIEW_PANEL,
@@ -86,6 +87,7 @@ static void gtk_view_panel_class_init(GtkViewPanelClass *class)
                      G_TYPE_NONE, 2,
                      GTK_TYPE_ADJUSTMENT,
                      GTK_TYPE_ADJUSTMENT);
+    */
 
 }
 
@@ -184,13 +186,13 @@ void gtk_view_panel_reclamp_adjustment(GtkAdjustment *adj, gboolean *changed)
 {
     gdouble value;                          /* Valeur actuelle             */
 
-    value = adj->value;
+    value = gtk_adjustment_get_value(adj);
   
-    value = CLAMP(value, 0, adj->upper - adj->page_size);
+    value = CLAMP(value, 0, gtk_adjustment_get_upper(adj) - gtk_adjustment_get_page_size(adj));
 
-    if (value != adj->value)
+    if (value != gtk_adjustment_get_value(adj))
     {
-        adj->value = value;
+        gtk_adjustment_set_value(adj, value);
         *changed = TRUE;
     }
     else *changed = FALSE;
@@ -214,12 +216,12 @@ void gtk_view_panel_reclamp_adjustment(GtkAdjustment *adj, gboolean *changed)
 void gtk_view_panel_compute_allocation(GtkViewPanel *panel, GtkAllocation *alloc)
 {
     GtkWidget *widget;                      /* Autre version de la vue     */
-    GtkAllocation *allocation;              /* Raccourci d'utilisation #1  */
+    GtkAllocation allocation;               /* Raccourci d'utilisation #1  */
     gint border_width;                      /* Raccourci d'utilisation #2  */
 
     widget = GTK_WIDGET(panel);
-    allocation = &widget->allocation;
-    border_width = GTK_CONTAINER(panel)->border_width;
+    gtk_widget_get_allocation(widget, &allocation);
+    border_width = gtk_container_get_border_width(GTK_CONTAINER(panel));
 
     alloc->x = 0;
     alloc->y = 0;
@@ -232,8 +234,8 @@ void gtk_view_panel_compute_allocation(GtkViewPanel *panel, GtkAllocation *alloc
     }
     */
 
-    alloc->width = MAX(1, allocation->width - alloc->x * 2 - border_width * 2);
-    alloc->height = MAX(1, allocation->height - alloc->y * 2 - border_width * 2);
+    alloc->width = MAX(1, allocation.width - alloc->x * 2 - border_width * 2);
+    alloc->height = MAX(1, allocation.height - alloc->y * 2 - border_width * 2);
 
 }
 
@@ -252,17 +254,21 @@ void gtk_view_panel_compute_allocation(GtkViewPanel *panel, GtkAllocation *alloc
 
 static void gtk_view_panel_realize(GtkWidget *widget)
 {
+    GtkAllocation allocation;               /* Disposition du composant    */
     GdkWindowAttr attributes;               /* Propriétés du composant     */
     guint attributes_mask;                  /* Masque de prise en compte   */
-    GdkColor white;                         /* Couleur de fond normale     */
+    GdkWindow *window;                      /* Fenêtre du composant        */
+    GdkRGBA white;                          /* Couleur de fond normale     */
+
+    gtk_widget_get_allocation(widget, &allocation);
 
     gtk_widget_set_realized(widget, TRUE);
 
     attributes.window_type = GDK_WINDOW_CHILD;
-    attributes.x = widget->allocation.x;
-    attributes.y = widget->allocation.y;
-    attributes.width = widget->allocation.width;
-    attributes.height = widget->allocation.height;
+    attributes.x = allocation.x;
+    attributes.y = allocation.y;
+    attributes.width = allocation.width;
+    attributes.height = allocation.height;
 
     attributes.wclass = GDK_INPUT_OUTPUT;
     attributes.event_mask = gtk_widget_get_events(widget)
@@ -270,10 +276,17 @@ static void gtk_view_panel_realize(GtkWidget *widget)
 
     attributes_mask = GDK_WA_X | GDK_WA_Y;
 
-    widget->window = gdk_window_new(gtk_widget_get_parent_window(widget),
-                                    &attributes, attributes_mask);
+    window = gdk_window_new(gtk_widget_get_parent_window(widget),
+                            &attributes, attributes_mask);
+
+    gtk_widget_set_window(widget, window);
 
-    gdk_window_set_user_data(widget->window, widget);
+    gdk_window_set_user_data(window, widget);
+
+    gdk_rgba_parse(&white, "white");
+    gtk_widget_override_background_color(widget, GTK_STATE_FLAG_NORMAL, &white);
+
+    /*
 
     widget->style = gtk_style_attach(widget->style, widget->window);
 
@@ -281,6 +294,7 @@ static void gtk_view_panel_realize(GtkWidget *widget)
     gtk_widget_modify_bg(widget, GTK_STATE_NORMAL, &white);
 
     GTK_VIEW_PANEL(widget)->gc = gdk_gc_new(GDK_DRAWABLE(widget->window));
+    */
 
 }
 
@@ -288,7 +302,7 @@ static void gtk_view_panel_realize(GtkWidget *widget)
 /******************************************************************************
 *                                                                             *
 *  Paramètres  : widget = composant GTK à redessiner.                         *
-*                event = informations liées à l'événement.                    *
+*                cr     = contexte graphique associé à l'événement.           *
 *                                                                             *
 *  Description : Met à jour l'affichage du composant d'affichage.             *
 *                                                                             *
@@ -298,18 +312,29 @@ static void gtk_view_panel_realize(GtkWidget *widget)
 *                                                                             *
 ******************************************************************************/
 
-static gboolean gtk_view_panel_expose(GtkWidget *widget, GdkEventExpose *event)
+static gboolean gtk_view_panel_draw(GtkWidget *widget, cairo_t *cr)
 {
-    GtkViewPanel *panel;
+    GtkViewPanel *panel;                    /* Autre version du composant  */
+#if 0
     GdkGCValues values;                     /* Propriétés du contexte      */
     GtkStyle *style;                        /* Style associé au composant  */
     GtkRequisition req;                     /* Taille allouée à l'élément  */
     GtkStateType state;                     /* Etat du composant           */
-
+#endif
     panel = GTK_VIEW_PANEL(widget);
 
     if (panel->show_border)
     {
+        GtkStyleContext *context;
+
+
+        context = gtk_widget_get_style_context(widget);
+
+        gtk_render_background(context, cr, 0, 0, 250, 250);
+
+        printf("Passage!\n");
+
+        /*
         gdk_gc_get_values(panel->gc, &values);
         style = gtk_widget_get_style(widget);
 
@@ -322,7 +347,7 @@ static gboolean gtk_view_panel_expose(GtkWidget *widget, GdkEventExpose *event)
                            FALSE, 0, 0, req.width - 1, req.height - 1);
 
         gdk_gc_set_foreground(panel->gc, &values.foreground);
-
+        */
     }
 
     return FALSE;
@@ -539,6 +564,7 @@ void gtk_view_panel_scroll_to_address(GtkViewPanel *panel, vmpa_t addr)
     gint x;                                 /* Abscisse à garantir         */
     gint y;                                 /* Ordonnée à garantir         */
     GtkAdjustment *adj;                     /* Défilement à mettre à jour  */
+    double limit;                           /* Limite à ne pas dépasser    */
 
     if (panel->define != NULL)
         panel->define(panel, addr);
@@ -546,16 +572,18 @@ void gtk_view_panel_scroll_to_address(GtkViewPanel *panel, vmpa_t addr)
     if (panel->get_coordinates(panel, addr, &x, &y))
     {
         adj = panel->hadjustment;
+        limit = gtk_adjustment_get_upper(adj) - gtk_adjustment_get_page_size(adj);
 
-        if (x > (adj->upper - adj->page_size))
-            x = adj->upper - adj->page_size;
+        if (x > limit)
+            x = limit;
 
         gtk_adjustment_set_value(adj, x);
 
         adj = panel->vadjustment;
+        limit = gtk_adjustment_get_upper(adj) - gtk_adjustment_get_page_size(adj);
 
-        if (y > (adj->upper - adj->page_size))
-            y = adj->upper - adj->page_size;
+        if (y > limit)
+            y = limit;
 
         gtk_adjustment_set_value(adj, y);
 
diff --git a/src/gui/menus/project.c b/src/gui/menus/project.c
index dbf61bc..19ced97 100644
--- a/src/gui/menus/project.c
+++ b/src/gui/menus/project.c
@@ -33,10 +33,14 @@
 
 #include "../editem-int.h"
 #include "../../analysis/binaries/file.h"
+#include "../../dialogs/shellcode.h"
 #include "../../gtkext/easygtk.h"
 
 
 
+/* Affiche la boîte d'ajout d'un shellcode au projet courant. */
+static void mcb_project_add_shellcode(GtkMenuItem *, GMenuBar *);
+
 /* Affiche la boîte d'ajout d'un binaire au projet courant. */
 static void mcb_project_add_binary_file(GtkMenuItem *, GMenuBar *);
 
@@ -79,6 +83,10 @@ GtkWidget *build_menu_project(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *b
     deepmenubar = gtk_menu_new();
     gtk_menu_item_set_submenu(GTK_MENU_ITEM(submenuitem), deepmenubar);
 
+    deepmenuitem = qck_create_menu_item(NULL, NULL, _("Shellcode"),
+                                        G_CALLBACK(mcb_project_add_shellcode), bar);
+    gtk_container_add(GTK_CONTAINER(deepmenubar), deepmenuitem);
+
     deepmenuitem = qck_create_menu_item(NULL, NULL, _("File"),
                                         G_CALLBACK(mcb_project_add_binary_file), bar);
     gtk_container_add(GTK_CONTAINER(deepmenubar), deepmenuitem);
@@ -163,6 +171,92 @@ void update_menu_project_for_project(GtkWidget *widget, GStudyProject *project,
 *  Paramètres  : menuitem = élément de menu sélectionné.                      *
 *                bar      = barre de menu parente.                            *
 *                                                                             *
+*  Description : Affiche la boîte d'ajout d'un shellcode au projet courant.   *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void mcb_project_add_shellcode(GtkMenuItem *menuitem, GMenuBar *bar)
+{
+    GStudyProject *project;                 /* Projet courant              */
+    GtkWindow *parent;                      /* Respect de la hiérarchie    */
+    GtkWidget *dialog;                      /* Boîte à afficher            */
+
+    project = get_current_project();
+    parent = GTK_WINDOW(G_EDITOR_ITEM(bar)->ref);
+
+    dialog = NULL;
+
+    run_shellcode_assistant(project, parent);
+
+    //if (run_shellcode_assistant(project, parent)) == GTK_RESPONSE_ACCEPT)
+    {
+
+        ;
+
+
+    }
+
+#if 0
+    GtkWidget *dialog;                      /* Boîte à afficher            */
+    char *dir;                              /* Répertoire courant          */
+    gchar *filename;                        /* Nom du fichier à intégrer   */
+    GLoadedBinary *binary;                  /* Représentation chargée      */
+
+    dialog = gtk_file_chooser_dialog_new(_("Open a binary file"),
+                                         GTK_WINDOW(G_EDITOR_ITEM(bar)->ref),
+                                         GTK_FILE_CHOOSER_ACTION_OPEN,
+                                         GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                                         GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
+                                         NULL);
+
+    if (g_study_project_get_filename(get_current_project()) != NULL)
+    {
+        dir = strdup(g_study_project_get_filename(get_current_project()));
+        dir = dirname(dir);
+        gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), dir);
+        free(dir);
+    }
+
+    if (g_study_project_get_filename(get_current_project()) != NULL)
+    {
+        dir = strdup(g_study_project_get_filename(get_current_project()));
+        dir = dirname(dir);
+        gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), dir);
+        free(dir);
+    }
+
+    if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
+    {
+        filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
+
+        binary = g_file_binary_new_from_file(filename);
+
+        if (binary != NULL)
+        {
+            g_signal_connect(binary, "disassembly-done",
+                             G_CALLBACK(g_study_project_add_loaded_binary), get_current_project());
+            g_loaded_binary_analyse(binary);
+        }
+
+        g_free(filename);
+
+    }
+
+    gtk_widget_destroy(dialog);
+#endif
+}
+
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : menuitem = élément de menu sélectionné.                      *
+*                bar      = barre de menu parente.                            *
+*                                                                             *
 *  Description : Affiche la boîte d'ajout d'un binaire au projet courant.     *
 *                                                                             *
 *  Retour      : -                                                            *
diff --git a/src/gui/panels/glance.c b/src/gui/panels/glance.c
index d6a744e..b344e69 100644
--- a/src/gui/panels/glance.c
+++ b/src/gui/panels/glance.c
@@ -97,7 +97,7 @@ static void compute_glance_scale(GGlancePanel *);
 static void update_glance_panel_for_view_content(GGlancePanel *, GtkViewPanel *);
 
 /* Met à jour l'affichage de l'aperçu rapide à présenter. */
-static gboolean redraw_glance_area(GtkWidget *, GdkEventExpose *, GGlancePanel *);
+static gboolean redraw_glance_area(GtkWidget *, cairo_t *, GGlancePanel *);
 
 /* Assure la gestion des clics de souris sur l'aperçu. */
 static gboolean on_button_press_over_glance(GtkWidget *, GdkEventButton *, GGlancePanel *);
@@ -166,7 +166,7 @@ static void g_glance_panel_init(GGlancePanel *panel)
 
     gtk_widget_set_size_request(base->widget, 300, 300);
 
-    g_signal_connect(G_OBJECT(area), "expose_event",
+    g_signal_connect(G_OBJECT(area), "draw",
                       G_CALLBACK(redraw_glance_area), panel);
     g_signal_connect(G_OBJECT(area), "size-allocate",
                       G_CALLBACK(on_glance_resize), panel);
@@ -221,13 +221,14 @@ GEditorItem *g_glance_panel_new(GObject *ref)
 
 static void define_glance_bg(GtkWidget *widget, GGlancePanel *panel)
 {
+    /*
     gtk_widget_modify_bg(widget, GTK_STATE_NORMAL,
                          &widget->style->mid[GTK_STATE_NORMAL]);
 
     panel->red = widget->style->mid[GTK_STATE_NORMAL].red / USHRT_MAX;
     panel->green = widget->style->mid[GTK_STATE_NORMAL].green / USHRT_MAX;
     panel->blue = widget->style->mid[GTK_STATE_NORMAL].blue / USHRT_MAX;
-
+    */
 }
 
 
@@ -332,7 +333,7 @@ static void on_view_scroll_setup(GtkAdjustment *adj, GGlancePanel *panel)
     hadj = gtk_scrolled_window_get_hadjustment(panel->support);
     vadj = gtk_scrolled_window_get_vadjustment(panel->support);
 
-    if (hadj->page_size == 0 || vadj->page_size == 0)
+    if (gtk_adjustment_get_page_size(hadj) == 0 || gtk_adjustment_get_page_size(vadj) == 0)
         return;
 
     compute_glance_scale(panel);
@@ -367,13 +368,13 @@ static void on_view_scrolled(GtkAdjustment *adj, GGlancePanel *panel)
     hadj = gtk_scrolled_window_get_hadjustment(panel->support);
     vadj = gtk_scrolled_window_get_vadjustment(panel->support);
 
-    if (hadj->page_size == 0 || vadj->page_size == 0)
+    if (gtk_adjustment_get_page_size(hadj) == 0 || gtk_adjustment_get_page_size(vadj) == 0)
         return;
 
-    panel->visible.x = panel->painting.x + hadj->value * panel->scale;
-    panel->visible.y = panel->painting.y + vadj->value * panel->scale;
-    panel->visible.width = hadj->page_size * panel->scale;
-    panel->visible.height = vadj->page_size * panel->scale;
+    panel->visible.x = panel->painting.x + gtk_adjustment_get_value(hadj) * panel->scale;
+    panel->visible.y = panel->painting.y + gtk_adjustment_get_value(vadj) * panel->scale;
+    panel->visible.width = gtk_adjustment_get_page_size(hadj) * panel->scale;
+    panel->visible.height = gtk_adjustment_get_page_size(vadj) * panel->scale;
 
     gtk_widget_queue_draw(G_EDITOR_ITEM(panel)->widget);
 
@@ -427,7 +428,7 @@ static void compute_glance_scale(GGlancePanel *panel)
     /* Superficies niveau GTK... */
 
     gtk_widget_get_allocation(G_EDITOR_ITEM(panel)->widget, &available);
-
+    /*
     border = MIN(2, G_EDITOR_ITEM(panel)->widget->style->xthickness);
     if (border > 0)
     {
@@ -441,7 +442,7 @@ static void compute_glance_scale(GGlancePanel *panel)
         available.y = border;
         available.height -= 2 * border;
     }
-
+    */
     /* Calcul des ratios et emplacements */
 
     sx = (1.0 * available.width) / panel->req.width;
@@ -514,7 +515,7 @@ static void update_glance_panel_for_view_content(GGlancePanel *panel, GtkViewPan
 /******************************************************************************
 *                                                                             *
 *  Paramètres  : widget = composant GTK à redessiner.                         *
-*                event  = informations liées à l'événement.                   *
+*                cr     = contexte graphique liées à l'événement.             *
 *                panel  = informations liées au panneau associé.              *
 *                                                                             *
 *  Description : Met à jour l'affichage de l'aperçu rapide à présenter.       *
@@ -525,11 +526,11 @@ static void update_glance_panel_for_view_content(GGlancePanel *panel, GtkViewPan
 *                                                                             *
 ******************************************************************************/
 
-static gboolean redraw_glance_area(GtkWidget *widget, GdkEventExpose *event, GGlancePanel *panel)
+static gboolean redraw_glance_area(GtkWidget *widget, cairo_t *cr, GGlancePanel *panel)
 {
     GtkAllocation available;                /* Surface disponible totale   */
     cairo_t *cairo;                         /* Gestionnaire de rendu       */
-
+#if 0
     /* Dessin de la bordure */
 
     gtk_widget_get_allocation(widget, &available);
@@ -564,7 +565,7 @@ static gboolean redraw_glance_area(GtkWidget *widget, GdkEventExpose *event, GGl
         cairo_destroy(cairo);
 
     }
-
+#endif
     return TRUE;
 
 }
@@ -598,8 +599,8 @@ static gboolean on_button_press_over_glance(GtkWidget *widget, GdkEventButton *e
         hadj = gtk_scrolled_window_get_hadjustment(panel->support);
         vadj = gtk_scrolled_window_get_vadjustment(panel->support);
 
-        panel->ref_h = hadj->value;
-        panel->ref_v = vadj->value;
+        panel->ref_h = gtk_adjustment_get_value(hadj);
+        panel->ref_v = gtk_adjustment_get_value(vadj);
 
         panel->valid = (panel->visible.x <= panel->start_x
                         && panel->start_x < (panel->visible.x + panel->visible.width)
@@ -609,8 +610,8 @@ static gboolean on_button_press_over_glance(GtkWidget *widget, GdkEventButton *e
         if (panel->valid)
         {
             cursor = gdk_cursor_new(GDK_FLEUR);
-            gdk_window_set_cursor(widget->window, cursor);
-            gdk_cursor_unref(cursor);
+            gdk_window_set_cursor(gtk_widget_get_window(widget), cursor);
+            g_object_unref(G_OBJECT(cursor));
         }
 
     }
@@ -639,7 +640,7 @@ static gboolean on_button_release_over_glance(GtkWidget *widget, GdkEventButton
     if (panel->view != NULL && event->button == 1)
     {
         if (panel->valid)
-            gdk_window_set_cursor(widget->window, NULL);
+            gdk_window_set_cursor(gtk_widget_get_window(widget), NULL);
 
     }
 
@@ -678,10 +679,12 @@ static gboolean on_mouse_motion_over_glance(GtkWidget *widget, GdkEventMotion *e
         hadj = gtk_scrolled_window_get_hadjustment(panel->support);
         vadj = gtk_scrolled_window_get_vadjustment(panel->support);
 
-        value = CLAMP(panel->ref_h + diff_x, hadj->lower, hadj->upper - hadj->page_size);
+        value = CLAMP(panel->ref_h + diff_x, gtk_adjustment_get_lower(hadj),
+                      gtk_adjustment_get_upper(hadj) - gtk_adjustment_get_page_size(hadj));
         gtk_adjustment_set_value(hadj, value);
 
-        value = CLAMP(panel->ref_v + diff_y, vadj->lower, vadj->upper - vadj->page_size);
+        value = CLAMP(panel->ref_v + diff_y, gtk_adjustment_get_lower(vadj),
+                      gtk_adjustment_get_upper(vadj) - gtk_adjustment_get_page_size(vadj));
         gtk_adjustment_set_value(vadj, value);
 
     }
diff --git a/src/gui/panels/panel.c b/src/gui/panels/panel.c
index b178443..a883bfa 100644
--- a/src/gui/panels/panel.c
+++ b/src/gui/panels/panel.c
@@ -41,6 +41,10 @@
 
 
 
+/* Transition vers GTK-3.x claire */
+#define GTK_IS_HPANED(p) gtk_orientable_get_orientation(GTK_ORIENTABLE(p)) == GTK_ORIENTATION_HORIZONTAL
+
+
 /* Support de fond pour les composants. */
 static GtkWidget *_support;
 static panel_node *_nodes = NULL;
diff --git a/src/gui/panels/welcome.c b/src/gui/panels/welcome.c
index 018f12a..8825c52 100644
--- a/src/gui/panels/welcome.c
+++ b/src/gui/panels/welcome.c
@@ -110,7 +110,7 @@ static void g_welcome_panel_init(GWelcomePanel *panel)
     GEditorItem *base;                      /* Version basique d'instance  */
 
     support = gtk_handle_box_new();
-    gtk_widget_modify_bg(support, GTK_STATE_NORMAL, &support->style->bg[GTK_STATE_NORMAL]);
+    //gtk_widget_modify_bg(support, GTK_STATE_NORMAL, &support->style->bg[GTK_STATE_NORMAL]);
     gtk_widget_show(support);
 
     align = gtk_alignment_new(0.5f, 0.5f, 0.0f, 0.0f);
diff --git a/src/panels/panel.h b/src/panels/panel.h
index 65887c7..73ef72b 100644
--- a/src/panels/panel.h
+++ b/src/panels/panel.h
@@ -27,7 +27,7 @@
 
 
 #include <glib-object.h>
-#include <gtk/gtkwidget.h>
+#include <gtk/gtk.h>
 
 
 #include "../analysis/binary.h"
diff --git a/src/project.h b/src/project.h
index 384d1aa..5a8d510 100644
--- a/src/project.h
+++ b/src/project.h
@@ -25,8 +25,7 @@
 #define _PROJECT_H
 
 
-#include <gtk/gtkrecentmanager.h>
-#include <gtk/gtkwidget.h>
+#include <gtk/gtk.h>
 
 
 #include "analysis/binary.h"
-- 
cgit v0.11.2-87-g4458