summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/common/extstr.c4
-rw-r--r--src/editor.c667
-rw-r--r--src/gtkext/gtkviewpanel.c17
3 files changed, 26 insertions, 662 deletions
diff --git a/src/common/extstr.c b/src/common/extstr.c
index 87d0b13..8249515 100644
--- a/src/common/extstr.c
+++ b/src/common/extstr.c
@@ -176,6 +176,8 @@ char *strrpl(char *haystack, const char *needle1, const char *needle2)
}
+ regfree(&preg);
+
return haystack;
}
@@ -267,6 +269,8 @@ char *escape_crlf(char *input)
}
+ regfree(&preg);
+
return input;
}
diff --git a/src/editor.c b/src/editor.c
index 85763bb..c533a64 100644
--- a/src/editor.c
+++ b/src/editor.c
@@ -28,39 +28,14 @@
#include <i18n.h>
-#include "gtkext/support.h"
-
-
-
-
-
-/** exemple GTK **/
-#include <stdio.h>
-#include <stdlib.h>
-#include <signal.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <unistd.h>
-/** exemple GTK **/
-
-
#include "project.h"
-
-#include "analysis/binary.h"
#include "gtkext/easygtk.h"
-#include "gtkext/gtkextstatusbar.h"
-#include "gtkext/gtkblockview.h"
#include "gtkext/gtkdockstation.h"
-#include "gtkext/gtkviewpanel.h"
-
-#include "debug/debugger.h"
-//#include "dialogs/add_shellcode.h"
-#include "dialogs/binparts.h"
-#include "dialogs/plugins.h"
+#include "gtkext/gtkextstatusbar.h"
+#include "gtkext/support.h"
#include "gui/menus/menubar.h"
#include "gui/panels/panel.h"
#include "gui/tb/source.h"
-#include "panels/panel.h"
@@ -79,36 +54,6 @@ static gboolean on_delete_editor(GtkWidget *, GdkEvent *, gpointer);
/* Quitte le programme en sortie de la boucle de GTK. */
static void on_destroy_editor(GtkWidget *, gpointer);
-/* Charge un projet récent et met à jour la liste. */
-void mcb_open_recent_project(GtkMenuItem *, GObject *);
-
-
-
-
-/* Réagit avec le menu "Binaire -> Sélectionner les parties...". */
-static void mcb_binary_select_parts(GtkMenuItem *, GObject *);
-
-/* Réagit avec le menu "Binaire -> Sélectionner les greffons...". */
-static void mcb_binary_select_plugins(GtkMenuItem *, GObject *);
-
-
-/* Réagit avec le menu "Débogage -> Démarrer". */
-void mcb_debug_start(GtkCheckMenuItem *, gpointer);
-
-/* Réagit avec le menu "Débogage -> Mettre en pause". */
-void mcb_debug_pause(GtkCheckMenuItem *, gpointer);
-
-/* Réagit avec le menu "Débogage -> Reprendre". */
-void mcb_debug_resume(GtkCheckMenuItem *, gpointer);
-
-/* Réagit avec le menu "Débogage -> Tuer". */
-void mcb_debug_kill(GtkCheckMenuItem *, gpointer);
-
-/* Met à jour l'accessibilité aux éléments du menu "Debogage". */
-void update_debug_menu_items(GObject *, gboolean);
-
-
-
@@ -122,16 +67,6 @@ static void on_dock_item_switch(GtkDockStation *, GtkWidget *, GObject *);
-/* ------------------------- PARTIE DEDIEE AU MODE DEBOGAGE ------------------------- */
-
-
-/* Prend note d'une pause dans le débogage. */
-static void on_debugger_halted(GBinaryDebugger *, int, vmpa_t, pid_t, GObject *);
-
-
-
-
-
/* ------------------------ INTEGRATION DE LA BARRE D'OUTILS ------------------------ */
@@ -198,44 +133,14 @@ GtkWidget *create_editor(void)
GObject *ref; /* Version de référence */
GEditorItem *editem; /* Menus réactifs principaux */
GtkWidget *menuboard; /* Barre de menus principale */
- GtkWidget *menuitem; /* Elément de menu */
- GtkWidget *menubar; /* Support pour éléments */
- GtkWidget *submenuitem; /* Sous-élément de menu */
- GtkWidget *submenubar; /* Support pour sous-éléments */
- GSList *rgroup; /* Groupe des boutons radio */
-
-
- GtkWidget *ssubmenuitem; /* Sous-élément de menu */
-
GtkWidget *toolbar; /* Barre d'outils */
- GtkWidget *vbox1;
- GtkWidget *vpaned1;
- GtkWidget *hpaned1;
- GtkWidget *scrolledwindow2;
- GtkWidget *snippet;
- GtkWidget *statusbar;
-
- GtkWidget *view;
-
- GtkWidget *panel;
-
-
-
+ GtkWidget *vbox1;
+ GtkWidget *statusbar;
-#if 0
- GtkWidget *vbox; /* Support à divisions vert. */
- GtkWidget *notebook; /* Support à onglets */
- GtkWidget *panel; /* Panneau de configuration */
- GtkWidget *label; /* Etiquette pour onglet */
- GtkWidget *hseparator; /* Barre de séparation */
- GtkWidget *hbuttonbox; /* Support horizontal de btns. */
- GtkWidget *button; /* Btn. de commande inférieur */
-#endif
- GtkWidget *button; /* Btn. de commande inférieur */
GtkAccelGroup *accgroup;
@@ -250,6 +155,7 @@ GtkWidget *create_editor(void)
icons = build_editor_icons_list();
gtk_window_set_icon_list(GTK_WINDOW(result), icons);
+ g_list_free_full(icons, (GDestroyNotify)g_object_unref);
g_signal_connect(G_OBJECT(result), "delete-event", G_CALLBACK(on_delete_editor), NULL);
g_signal_connect(G_OBJECT(result), "destroy", G_CALLBACK(on_destroy_editor), NULL);
@@ -261,9 +167,9 @@ GtkWidget *create_editor(void)
- vbox1 = gtk_vbox_new (FALSE, 0);
- gtk_widget_show (vbox1);
- gtk_container_add (GTK_CONTAINER (result), vbox1);
+ vbox1 = gtk_vbox_new(FALSE, 0);
+ gtk_widget_show(vbox1);
+ gtk_container_add(GTK_CONTAINER(result), vbox1);
/* Intégration des menus */
@@ -277,95 +183,6 @@ GtkWidget *create_editor(void)
- menuboard = gtk_menu_bar_new();
- gtk_widget_show(menuboard);
- //gtk_box_pack_start(GTK_BOX(vbox1), menuboard, FALSE, FALSE, 0);
-
- /* Affichage */
-
- menuitem = gtk_menu_item_new_with_mnemonic(_("_View"));
- gtk_widget_show(menuitem);
- gtk_container_add(GTK_CONTAINER(menuboard), menuitem);
-
- menubar = gtk_menu_new();
- gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), menubar);
-
- submenuitem = qck_create_menu_separator();
- gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
-
- submenuitem = qck_create_menu_separator();
- gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
-
- submenuitem = qck_create_menu_item(NULL, NULL, _("Toolbar"), NULL, NULL);
- gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
-
- submenubar = gtk_menu_new();
- gtk_menu_item_set_submenu(GTK_MENU_ITEM(submenuitem), submenubar);
-
- ssubmenuitem = qck_create_check_menu_item(NULL, NULL, _("Source file"), G_CALLBACK(NULL), result);
- gtk_container_add(GTK_CONTAINER(submenubar), ssubmenuitem);
-
-
-
-
-
- menuitem = gtk_menu_item_new_with_mnemonic(_("_Binary"));
- gtk_widget_show(menuitem);
- gtk_container_add(GTK_CONTAINER(menuboard), menuitem);
-
- menubar = gtk_menu_new();
- gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), menubar);
-
- submenuitem = qck_create_menu_item(NULL, NULL, _("Select parts..."), G_CALLBACK(mcb_binary_select_parts), ref);
- gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
-
- submenuitem = qck_create_menu_item(NULL, NULL, _("Select plugins..."), G_CALLBACK(mcb_binary_select_plugins), ref);
- gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
-
-
- menuitem = gtk_menu_item_new_with_mnemonic(_("_Debug"));
- gtk_widget_show(menuitem);
- gtk_container_add(GTK_CONTAINER(menuboard), menuitem);
-
- menubar = gtk_menu_new();
- gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), menubar);
-
- submenuitem = qck_create_menu_item(ref, "mnu_debug_start", _("Start process"), G_CALLBACK(mcb_debug_start), result);
- gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
-
- submenuitem = qck_create_menu_item(ref, "mnu_debug_pause", _("Pause process"), G_CALLBACK(mcb_debug_pause), result);
- gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
-
- submenuitem = qck_create_menu_item(ref, "mnu_debug_resume", _("Resume process"), G_CALLBACK(mcb_debug_resume), result);
- gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
-
- submenuitem = qck_create_menu_item(ref, "mnu_debug_kill", _("Kill process"), G_CALLBACK(mcb_debug_kill), result);
- gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
-
- submenuitem = qck_create_menu_separator();
- gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
-
- submenuitem = qck_create_menu_item(ref, "mnu_debug_into", _("Step into"), NULL/*G_CALLBACK()*/, result);
- gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
-
- submenuitem = qck_create_menu_item(ref, "mnu_debug_over", _("Step over"), NULL/*G_CALLBACK()*/, result);
- gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
-
- submenuitem = qck_create_menu_item(ref, "mnu_debug_ret", _("Run until ret"), NULL/*G_CALLBACK()*/, result);
- gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
-
- submenuitem = qck_create_menu_separator();
- gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
-
-
-
- update_debug_menu_items(ref, FALSE);
-
-
-
-
-
-
@@ -389,114 +206,6 @@ GtkWidget *create_editor(void)
-
-#if 0
- vpaned1 = gtk_vpaned_new ();
- gtk_widget_show (vpaned1);
- //gtk_box_pack_start (GTK_BOX (vbox1), vpaned1, TRUE, TRUE, 0);
- gtk_paned_set_position (GTK_PANED (vpaned1), 400);
-
- hpaned1 = gtk_hpaned_new ();
- gtk_widget_show (hpaned1);
- gtk_paned_pack1 (GTK_PANED (vpaned1), hpaned1, FALSE, TRUE);
- gtk_paned_set_position (GTK_PANED (hpaned1), 600);
-
-
- init_panels(ref);
-
-
- dpanel = gtk_dock_panel_new();
- g_object_set_data(G_OBJECT(result), "binpanel", dpanel);
- gtk_widget_show(dpanel);
-
-
-
- g_signal_connect(dpanel, "switch-item", G_CALLBACK(on_dock_item_switch), ref);
-
-
-
- gtk_paned_pack1(GTK_PANED(hpaned1), dpanel, TRUE, TRUE);
-
-
-
-
-
-
- dpanel = gtk_dock_panel_new();
- gtk_widget_show(dpanel);
-
- g_signal_connect(dpanel, "switch-item", G_CALLBACK(on_dock_item_switch), ref);
-
- gtk_paned_pack2(GTK_PANED(hpaned1), dpanel, TRUE, TRUE);
-
-
- place_all_panels_in_editor(dpanel);
-
-
- ditem = g_dock_item_new(_("Registers"), get_panel(PNT_REGISTERS));
- gtk_dock_panel_add_item(dpanel, ditem);
-
-
-
-
- /* Panneau inférieur */
-
-
-
- dpanel = gtk_dock_panel_new();
- gtk_widget_show(dpanel);
-
- printf("bottom :: %p\n", dpanel);
-
- gtk_paned_pack2(GTK_PANED(vpaned1), dpanel, FALSE, FALSE);
-
- //ditem = g_dock_item_new(_("Messages"), get_panel(PNT_LOG));
- //gtk_dock_panel_add_item(dpanel, ditem);
-
- ditem = g_dock_item_new(_("Strings"), get_panel(PNT_STRINGS));
- gtk_dock_panel_add_item(dpanel, ditem);
-
-
-
- //panel = build_shell_panel(G_OBJECT(result));
-
- //ditem = g_dock_item_new(_("Shell"), panel);
- //gtk_dock_panel_add_item(dpanel, ditem);
-
-
-
- /*
-
- notebook = qck_create_notebook(NULL, NULL);
- gtk_paned_pack2(GTK_PANED(vpaned1), notebook, FALSE, FALSE);
-
- panel = build_strings_panel(G_OBJECT(result));
- gtk_container_add(GTK_CONTAINER(notebook), panel);
-
- label = qck_create_label(NULL, NULL, _("Strings"));
- gtk_notebook_set_tab_label(GTK_NOTEBOOK(notebook), gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), 0), label);
-
- */
-
-
-
-
- /*
-
- scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL);
- gtk_widget_show (scrolledwindow1);
- gtk_paned_pack2 (GTK_PANED (vpaned1), scrolledwindow1, TRUE, TRUE);
-
- textview1 = gtk_text_view_new ();
- gtk_widget_show (textview1);
- gtk_container_add (GTK_CONTAINER (scrolledwindow1), textview1);
-
-
- */
-
-
-#endif
-
statusbar = gtk_extended_status_bar_new();
g_object_set_data(ref, "statusbar", statusbar);
@@ -542,7 +251,7 @@ static gboolean on_delete_editor(GtkWidget *widget, GdkEvent *event, gpointer da
if (g_study_project_get_filename(project) == NULL)
{
- dialog = gtk_message_dialog_new(widget,
+ dialog = gtk_message_dialog_new(GTK_WINDOW(widget),
GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_QUESTION,
GTK_BUTTONS_NONE,
@@ -606,334 +315,15 @@ static void on_destroy_editor(GtkWidget *widget, gpointer data)
-/******************************************************************************
-* *
-* Paramètres : menuitem = élément de menu sélectionné. *
-* ref = adresse de l'espace de référencement global. *
-* *
-* Description : Charge un projet récent et met à jour la liste. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-void mcb_open_recent_project(GtkMenuItem *menuitem, GObject *ref)
-{
-#if 0
- const gchar *caption; /* Etiquette du menu */
- openida_project *project; /* Nouveau projet chargé */
-
- caption = gtk_label_get_text(GTK_LABEL(gtk_bin_get_child(GTK_BIN(menuitem))));
-
- project = g_openida_project_new_from_xml(ref, caption);
-
- if (project != NULL)
- {
- push_openida_project_into_recent_list(project);
- load_recent_openida_projects_list(ref, G_CALLBACK(mcb_open_recent_project));
-
- set_current_project(project);
-
- /* TODO ... */
-
- }
-#endif
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-/******************************************************************************
-* *
-* Paramètres : menuitem = élément de menu sélectionné. *
-* ref = adresse de l'espace de référencement global. *
-* *
-* Description : Réagit avec le menu "Binaire -> Sélectionner les parties...".*
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void mcb_binary_select_parts(GtkMenuItem *menuitem, GObject *ref)
-{
- GLoadedBinary *binary; /* Binaire courant à l'écran */
- GtkWidget *dialog; /* Boîte de dialogue à montrer */
-
- binary = G_LOADED_BINARY(g_object_get_data(ref, "current_binary"));
-
- dialog = create_sections_dialog(binary, GTK_WINDOW(ref));
- gtk_widget_show(dialog);
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : menuitem = élément de menu sélectionné. *
-* ref = adresse de l'espace de référencement global. *
-* *
-* Description : Réagit avec le menu "Binaire -> Sélectionner les greffons..."*
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void mcb_binary_select_plugins(GtkMenuItem *menuitem, GObject *ref)
-{
- GLoadedBinary *binary; /* Binaire courant à l'écran */
- GtkWidget *dialog; /* Boîte de dialogue à montrer */
-
- binary = G_LOADED_BINARY(g_object_get_data(ref, "current_binary"));
-
- dialog = create_plugins_selection_dialog(binary, GTK_WINDOW(ref));
- gtk_widget_show(dialog);
-
-}
-
-
-
-
-
-void debugger_stopped_cb(GBinaryDebugger *debugger, uint64_t last, uint64_t cur, gpointer data)
-{
-#if 0
- GObject *ref;
-
- GLoadedBinary *binary;
- GRenderingLine *line;
-
-
- GtkWidget *submenuitem; /* Menu à rendre accessible */
-
- register_value *values;
- size_t count;
-
-
- ref = G_OBJECT(data);
-
-
- binary = g_object_get_data(ref, "current_binary");
-
-
- if (last != cur)
- {
- line = g_rendering_line_find_by_address(g_loaded_binary_get_lines(binary), NULL/* FIXME */, last);
-
- if (line != NULL)
- g_rendering_line_remove_flag(line, RLF_RUNNING_BP);
-
- }
-
-
- printf("bp at 0x%016llx\n", cur);
-
- line = g_rendering_line_find_by_address(g_loaded_binary_get_lines(binary), NULL/* FIXME */, cur);
-
- if (line != NULL)
- g_rendering_line_add_flag(line, RLF_RUNNING_BP);
- else
- printf("no line at address !\n");
-
-
- values = g_binary_debugger_get_registers(debugger, &count);
-
-
-
-
-
- /* Mises à jour */
-
- update_debug_menu_items(ref, TRUE);
-
-
-
-
-
-
-
- refresh_registers_panel_with_registers(get_panel(PNT_REGISTERS), values, count);
-
-#endif
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : menuitem = élément de menu ayant basculé. *
-* data = adresse de l'espace de référencement global. *
-* *
-* Description : Réagit avec le menu "Débogage -> Démarrer". *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-void mcb_debug_start(GtkCheckMenuItem *menuitem, gpointer data)
-{
- GLoadedBinary *binary; /* Binaire à analyser */
- GBinaryDebugger *debugger; /* Débogueur offrant l'analyse */
-
-
- binary = g_object_get_data(G_OBJECT(data), "current_binary");
-
-
-
- debugger = g_new_binary_debugger(DGT_JDWP, binary);
- g_object_set_data(G_OBJECT(data), "current_debugger", debugger);
-
- //
- g_binary_debugger_attach(debugger);
-
- g_signal_connect(debugger, "debugger-stopped", G_CALLBACK(debugger_stopped_cb), data);
-
- g_signal_connect(debugger, "halted", G_CALLBACK(on_debugger_halted), data);
-
- // g_binary_debugger_run(debugger);
-
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : menuitem = élément de menu ayant basculé. *
-* data = adresse de l'espace de référencement global. *
-* *
-* Description : Réagit avec le menu "Débogage -> Mettre en pause". *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-void mcb_debug_pause(GtkCheckMenuItem *menuitem, gpointer data)
-{
- GBinaryDebugger *debugger; /* Débogueur offrant l'analyse */
-
-
- debugger = g_object_get_data(G_OBJECT(data), "current_debugger");
-
-
-
- //g_binary_debugger_resume(debugger);
-
-
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : menuitem = élément de menu ayant basculé. *
-* data = adresse de l'espace de référencement global. *
-* *
-* Description : Réagit avec le menu "Débogage -> Reprendre". *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-void mcb_debug_resume(GtkCheckMenuItem *menuitem, gpointer data)
-{
- GBinaryDebugger *debugger; /* Débogueur offrant l'analyse */
-
-
- debugger = g_object_get_data(G_OBJECT(data), "current_debugger");
-
-
-
- g_binary_debugger_resume(debugger);
-
-
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : menuitem = élément de menu ayant basculé. *
-* data = adresse de l'espace de référencement global. *
-* *
-* Description : Réagit avec le menu "Débogage -> Tuer". *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-void mcb_debug_kill(GtkCheckMenuItem *menuitem, gpointer data)
-{
- GBinaryDebugger *debugger; /* Débogueur offrant l'analyse */
-
- debugger = g_object_get_data(G_OBJECT(data), "current_debugger");
-
- g_binary_debugger_kill(debugger);
-
- /* TODO : retirer l'association binary <-> debugger */
-
-}
-/******************************************************************************
-* *
-* Paramètres : ref = adresse de l'espace de référencement global. *
-* stopped = indique l'état d'accessibilité des menus. *
-* *
-* Description : Met à jour l'accessibilité aux éléments du menu "Debogage". *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-void update_debug_menu_items(GObject *ref, gboolean stopped)
-{
- GtkWidget *submenuitem; /* Menu à rendre accessible */
- submenuitem = GTK_WIDGET(g_object_get_data(ref, "mnu_debug_pause"));
- gtk_widget_set_sensitive(submenuitem, stopped);
- submenuitem = GTK_WIDGET(g_object_get_data(ref, "mnu_debug_resume"));
- gtk_widget_set_sensitive(submenuitem, stopped);
- submenuitem = GTK_WIDGET(g_object_get_data(ref, "mnu_debug_into"));
- gtk_widget_set_sensitive(submenuitem, stopped);
- submenuitem = GTK_WIDGET(g_object_get_data(ref, "mnu_debug_over"));
- gtk_widget_set_sensitive(submenuitem, stopped);
- submenuitem = GTK_WIDGET(g_object_get_data(ref, "mnu_debug_ret"));
- gtk_widget_set_sensitive(submenuitem, stopped);
-}
@@ -998,45 +388,6 @@ static void on_dock_item_switch(GtkDockStation *station, GtkWidget *widget, GObj
-/* ---------------------------------------------------------------------------------- */
-/* PARTIE DEDIEE AU MODE DEBOGAGE */
-/* ---------------------------------------------------------------------------------- */
-
-
-/******************************************************************************
-* *
-* Paramètres : debugger = débogueur intervenant dans l'action. *
-* sig = identifiant du signal source (nul si indéterminé).*
-* addr = adresse de l'instruction courante. *
-* thread = identifiant du thread concerné. *
-* ref = espace de référencement global. *
-* *
-* Description : Prend note d'une pause dans le débogage. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void on_debugger_halted(GBinaryDebugger *debugger, int sig, vmpa_t addr, pid_t thread, GObject *ref)
-{
-
- printf("HALT (sig=%d) at 0x%016llx\n", sig, addr);
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
/* ---------------------------------------------------------------------------------- */
diff --git a/src/gtkext/gtkviewpanel.c b/src/gtkext/gtkviewpanel.c
index 3c9ef6b..a3bf747 100644
--- a/src/gtkext/gtkviewpanel.c
+++ b/src/gtkext/gtkviewpanel.c
@@ -125,14 +125,23 @@ static void gtk_view_panel_init(GtkViewPanel *panel)
static void gtk_view_panel_set_scroll_adjustments(GtkViewPanel *panel, GtkAdjustment *hadjustment, GtkAdjustment *vadjustment)
{
+ /* TODO : déconnecter les anciens ? */
+
panel->hadjustment = hadjustment;
panel->vadjustment = vadjustment;
- g_signal_connect(hadjustment, "value_changed",
- G_CALLBACK(gtk_view_panel_adj_value_changed), panel);
+ /**
+ * On vérifie que le support n'est pas en train de nous libérer,
+ * avant de se connecter...
+ */
+
+ if (hadjustment != NULL)
+ g_signal_connect(hadjustment, "value_changed",
+ G_CALLBACK(gtk_view_panel_adj_value_changed), panel);
- g_signal_connect(vadjustment, "value_changed",
- G_CALLBACK(gtk_view_panel_adj_value_changed), panel);
+ if (vadjustment != NULL)
+ g_signal_connect(vadjustment, "value_changed",
+ G_CALLBACK(gtk_view_panel_adj_value_changed), panel);
}