diff options
-rw-r--r-- | ChangeLog | 12 | ||||
-rw-r--r-- | src/common/extstr.c | 4 | ||||
-rw-r--r-- | src/editor.c | 667 | ||||
-rw-r--r-- | src/gtkext/gtkviewpanel.c | 17 |
4 files changed, 38 insertions, 662 deletions
@@ -1,3 +1,15 @@ +12-12-05 Cyrille Bagard <nocbos@gmail.com> + + * src/common/extstr.c: + Fix memory leaks. + + * src/editor.c: + Clean the code (back to early versions!). + + * src/gtkext/gtkviewpanel.c: + Fix an ending crash: GtkScrolledWindow sends NULL GtkAdjustments when + terminating. + 12-12-04 Cyrille Bagard <nocbos@gmail.com> * src/gtkext/gtkbufferview.c: 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); } |