/* OpenIDA - Outils de configurations pour le WM Firebox * editor.c - fichier principal de l'éditeur de configuration * * Copyright (C) 2006-2007 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 this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include /* Fonction main() */ #include /* idem */ #include /* ... */ #include /** exemple GTK **/ #include #include #include #include #include #include /** exemple GTK **/ /** Partie ptrace() **/ #include #include #include #include //#include #include /* For SYS_write etc */ /** Partie ptrace() **/ #include "binary.h" #include "dlg_sections.h" #include "easygtk.h" #include "gtkbinview.h" #include "gtksnippet.h" #include "pan_strings.h" #include "pan_symbols.h" #define _(str) str void sigchld_handler(int num); /* Construit la fenêtre de l'éditeur. */ GtkWidget *create_editor(void); /* Quitte le programme en sortie de la boucle de GTK. */ void destroy_editor(GtkWidget *, gpointer); /* Réagit au menu "Fichier -> Enregistrer le projet". */ void mcb_file_save_project(GtkMenuItem *, gpointer); /* Réagit au menu "Fichier -> Enregistrer le projet sous...". */ void mcb_file_save_project_as(GtkMenuItem *, gpointer); /* Charge un projet récent et met à jour la liste. */ void mcb_open_recent_project(GtkMenuItem *, gpointer); /* Réagit avec le menu "Affichage -> Vue textuelle". */ void mcb_view_as_text(GtkCheckMenuItem *, gpointer); /* Réagit avec le menu "Affichage -> Vue graphique". */ void mcb_view_as_graph(GtkCheckMenuItem *, gpointer); /* Réagit avec le menu "Affichage -> Adresse virtuelle". */ void mcb_view_vaddress(GtkCheckMenuItem *, gpointer); /* Réagit avec le menu "Affichage -> code binaire". */ void mcb_view_code(GtkCheckMenuItem *, gpointer); /* Affiche la boîte d'ajout d'un binaire au projet courant. */ void mcb_project_add_binary(GtkMenuItem *, gpointer); /* Retire un binaire du projet courant. */ void mcb_project_remove_binary(GtkMenuItem *, gpointer); /* Affiche la boîte de sélection des sections. */ void mcb_select_sections(GtkMenuItem *, gpointer); /* Met à jour le contenu du menu 'Projet'. */ void reload_menu_project(GObject *); /****************************************************************************** * * * Paramètres : argc = nombre d'arguments dans la ligne de commande. * * argv = arguments de la ligne de commande. * * * * Description : Point d'entrée du programme. * * * * Retour : EXIT_SUCCESS si le prgm s'est déroulé sans encombres. * * * * Remarques : - * * * ******************************************************************************/ int main(int argc, char **argv) { GtkWidget *editor; /* Fenêtre graphique */ setlocale(LC_ALL, ""); /* bindtextdomain(PACKAGE, LOCALE_DIR); textdomain(PACKAGE); */ /* init threads */ g_thread_init(NULL); gdk_threads_init(); /* Initialisation de GTK */ gtk_set_locale(); gtk_init(&argc, &argv); /* * this initialize the library and check potential ABI mismatches * between the version it was compiled for and the actual shared * library used. */ /*LIBXML_TEST_VERSION*/ /* Initialisation du programme */ editor = create_editor(); gtk_widget_show(editor); gdk_threads_enter(); gtk_main(); gdk_threads_leave(); return EXIT_SUCCESS; } GCond* data_cond = NULL; /* Must be initialized somewhere */ GMutex* data_mutex = NULL; /* Must be initialized somewhere */ gboolean run_again = FALSE; void on_button1_clicked (GtkButton *button, gpointer user_data); GtkLabel *lbl_eax; GtkLabel *lbl_ebx; GtkLabel *lbl_ecx; GtkLabel *lbl_edx; typedef struct _th_info { pid_t child; GtkTextBuffer *buffer; } th_info; #include #include #include #include extern int errno; void *argument_thread(void *args) { th_info *info; long orig_eax, eax; long params; int status; char buffer[12]; pid_t pid; pid = fork(); if (pid > 0) { /*****/ } else ptrace(PTRACE_TRACEME, 0, NULL, NULL); sleep(1); if(pid == -1) { /* ouch, fork() failed */ perror("fork"); exit(-1); } else if(pid == 0) { // ptrace(PTRACE_TRACEME, 0, NULL, NULL); execlp("ls", "ls", "-CF", "/", NULL); /* if exec() returns, there is something wrong */ perror("execlp"); /* exit child. note the use of _exit() instead of exit() */ _exit(-1); } else { info = (th_info *)args; info->child = pid; /* parent */ gtk_text_buffer_insert_at_cursor (info->buffer, "#PARENT# Fork() succeed !\n", -1); while(1) { pid = waitpid(info->child, &status, 0/*WNOHANG*/); //wait(&status); if(WIFEXITED(status)) break; orig_eax = ptrace(PTRACE_PEEKUSER, info->child, 4 * ORIG_EAX, NULL); if (orig_eax == -1) { printf("errno :: %d vs %d\n", errno, ESRCH); perror("ptrace()"); } /* get GTK thread lock */ gdk_threads_enter(); params = ptrace(PTRACE_PEEKUSER, info->child, 4 * EAX, NULL); snprintf(buffer, 11, "0x%08lx", params); gtk_label_set_text(lbl_eax, buffer); params = ptrace(PTRACE_PEEKUSER, info->child, 4 * EBX, NULL); snprintf(buffer, 11, "0x%08lx", params); gtk_label_set_text(lbl_ebx, buffer); params = ptrace(PTRACE_PEEKUSER, info->child, 4 * ECX, NULL); snprintf(buffer, 11, "0x%08lx", params); gtk_label_set_text(lbl_ecx, buffer); params = ptrace(PTRACE_PEEKUSER, info->child, 4 * EDX, NULL); snprintf(buffer, 11, "0x%08lx", params); gtk_label_set_text(lbl_edx, buffer); gtk_text_buffer_insert_at_cursor (info->buffer, "Thread waiting for resume...\n", -1); gdk_flush (); /* release GTK thread lock */ gdk_threads_leave(); g_mutex_lock (data_mutex); while (!run_again) g_cond_wait (data_cond, data_mutex); run_again = FALSE; g_mutex_unlock (data_mutex); ptrace(PTRACE_SYSCALL, info->child, NULL, NULL); } } return NULL; } void on_button1_clicked (GtkButton *button, gpointer data) { GtkTextBuffer *buffer; th_info *info; GError *error = NULL; gtk_widget_set_state(GTK_WIDGET(button), GTK_STATE_INSENSITIVE); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (data)); gtk_text_buffer_insert_at_cursor (buffer, "Hello, this is some text\n", -1); info = (th_info *)calloc(1, sizeof(th_info)); info->child = 0/*pid*/; info->buffer = buffer; data_cond = g_cond_new (); data_mutex = g_mutex_new (); if (!g_thread_create(argument_thread, info, FALSE, &error)) { printf ("Failed to create YES thread: %s\n", error->message); } } void on_button2_clicked (GtkButton *button, gpointer data) { g_mutex_lock (data_mutex); run_again = TRUE; g_cond_signal (data_cond); g_mutex_unlock (data_mutex); } /****************************************************************************** * * * Paramètres : - * * * * Description : Construit la fenêtre de l'éditeur. * * * * Retour : Adresse de la fenêtre mise en place. * * * * Remarques : - * * * ******************************************************************************/ GtkWidget *create_editor(void) { GtkWidget *result; /* Fenêtre à renvoyer */ 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 *vbox1; GtkWidget *vpaned1; GtkWidget *hpaned1; GtkWidget *scrolledwindow2; GtkWidget *snippet; GtkWidget *fixed1; GtkWidget *label1; GtkWidget *button2; GtkWidget *image1; GtkWidget *button1; GtkWidget *table1; GtkWidget *label3; GtkWidget *label4; GtkWidget *label5; GtkWidget *label6; GtkWidget *label7; GtkWidget *label8; GtkWidget *label9; GtkWidget *label10; GtkWidget *label11; GtkWidget *label12; GtkWidget *label14; GtkWidget *label15; GtkWidget *label16; GtkWidget *label17; GtkWidget *label18; GtkWidget *label19; GtkWidget *label20; GtkWidget *label21; GtkWidget *scrolledwindow1; GtkWidget *textview1; GtkWidget *statusbar1; GtkWidget *binview; GtkWidget *panel; GtkWidget *_panel; openida_project *project; GtkWidget *notebook; /* Support à onglets */ GtkWidget *label; /* Etiquette pour onglet */ #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 result = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_widget_set_size_request(result, 800, 600); gtk_window_set_position(GTK_WINDOW(result), GTK_WIN_POS_CENTER); gtk_container_set_border_width(GTK_CONTAINER(result), 4); gtk_window_set_title(GTK_WINDOW(result), _("OpenIDA")); g_signal_connect(G_OBJECT(result), "destroy", G_CALLBACK(destroy_editor), NULL); vbox1 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox1); gtk_container_add (GTK_CONTAINER (result), vbox1); /* Intégration des menus */ menuboard = gtk_menu_bar_new(); gtk_widget_show(menuboard); gtk_box_pack_start(GTK_BOX(vbox1), menuboard, FALSE, FALSE, 0); menuitem = gtk_menu_item_new_with_mnemonic(_("_File")); 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, _("Save project"), G_CALLBACK(mcb_file_save_project), result); gtk_container_add(GTK_CONTAINER(menubar), submenuitem); submenuitem = qck_create_menu_item(NULL, NULL, _("Save project as..."), G_CALLBACK(mcb_file_save_project_as), 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(G_OBJECT(result), "menu_recent_prjs", _("Recent projects..."), NULL, NULL); gtk_container_add(GTK_CONTAINER(menubar), submenuitem); submenubar = gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(submenuitem), submenubar); 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_radio_menu_item(NULL, NULL, NULL, _("Text view"), G_CALLBACK(mcb_view_as_text), result); gtk_container_add(GTK_CONTAINER(menubar), submenuitem); rgroup = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(submenuitem)); submenuitem = qck_create_radio_menu_item(NULL, NULL, rgroup, _("Graph view"), G_CALLBACK(mcb_view_as_graph), result); gtk_container_add(GTK_CONTAINER(menubar), submenuitem); submenuitem = qck_create_menu_separator(); gtk_container_add(GTK_CONTAINER(menubar), submenuitem); submenuitem = qck_create_check_menu_item(NULL, NULL, _("Virtual address"), G_CALLBACK(mcb_view_vaddress), result); gtk_container_add(GTK_CONTAINER(menubar), submenuitem); submenuitem = qck_create_check_menu_item(NULL, NULL, _("Binary code"), G_CALLBACK(mcb_view_code), result); gtk_container_add(GTK_CONTAINER(menubar), submenuitem); menuitem = gtk_menu_item_new_with_mnemonic(_("_Project")); 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, _("Add a binary..."), G_CALLBACK(mcb_project_add_binary), result); gtk_container_add(GTK_CONTAINER(menubar), submenuitem); submenuitem = qck_create_menu_item(G_OBJECT(result), "menu_prj_remove_bin", _("Remove a binary"), NULL, NULL); gtk_container_add(GTK_CONTAINER(menubar), submenuitem); submenubar = gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(submenuitem), submenubar); submenuitem = qck_create_menu_separator(); gtk_container_add(GTK_CONTAINER(menubar), submenuitem); submenuitem = qck_create_menu_item(NULL, NULL, _("Select sections..."), G_CALLBACK(mcb_select_sections), NULL); gtk_container_add(GTK_CONTAINER(menubar), submenuitem); load_recent_openida_projects_list(G_OBJECT(result), G_CALLBACK(mcb_open_recent_project)); project = /*load_openida_project_from_xml("/tmp/test.oip")*/create_empty_openida_project(); set_current_openida_project(project); reload_menu_project(G_OBJECT(result)); 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); scrolledwindow2 = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow2), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_widget_show (scrolledwindow2); gtk_paned_pack1 (GTK_PANED (hpaned1), scrolledwindow2, FALSE, TRUE); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(scrolledwindow2), GTK_SHADOW_IN); binview = gtk_binview_new(); g_object_set_data(G_OBJECT(result), "binview", binview); //gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolledwindow2), binview); //gtk_container_add(GTK_CONTAINER(scrolledwindow2), binview); snippet = gtk_snippet_new(); gtk_widget_show(binview); gtk_snippet_set_sel(GTK_SNIPPET(snippet), 44); /* snippet = gtk_text_view_new (); */ gtk_widget_show (snippet); /*gtk_container_add (GTK_CONTAINER (scrolledwindow2), snippet);*/ //gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolledwindow2), snippet); gtk_container_add(GTK_CONTAINER(binview), snippet); //binview = gtk_fixed_new(); gtk_widget_show(binview); //g_object_set_data(G_OBJECT(result), "binview", binview); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolledwindow2), binview); //gtk_container_add(GTK_CONTAINER(scrolledwindow2), binview); fixed1 = gtk_fixed_new (); gtk_widget_show (fixed1); //gtk_paned_pack2 (GTK_PANED (hpaned1), fixed1, TRUE, TRUE); panel = build_symbols_panel(G_OBJECT(result)); gtk_paned_pack2 (GTK_PANED (hpaned1), panel, TRUE, TRUE); _panel = panel; label1 = gtk_label_new (_("Registres :")); gtk_widget_show (label1); gtk_fixed_put (GTK_FIXED (fixed1), label1, 16, 48); gtk_widget_set_size_request (label1, 128, 16); gtk_misc_set_alignment (GTK_MISC (label1), 0, 0.5); button2 = gtk_button_new (); gtk_widget_show (button2); gtk_fixed_put (GTK_FIXED (fixed1), button2, 80, 8); gtk_widget_set_size_request (button2, 62, 29); image1 = gtk_image_new_from_stock ("gtk-media-play", GTK_ICON_SIZE_BUTTON); gtk_widget_show (image1); gtk_container_add (GTK_CONTAINER (button2), image1); button1 = gtk_button_new_with_mnemonic (_("Run")); gtk_widget_show (button1); gtk_fixed_put (GTK_FIXED (fixed1), button1, 8, 8); gtk_widget_set_size_request (button1, 62, 29); table1 = gtk_table_new (9, 2, FALSE); gtk_widget_show (table1); gtk_fixed_put (GTK_FIXED (fixed1), table1, 8, 64); gtk_widget_set_size_request (table1, 160, 176); gtk_container_set_border_width (GTK_CONTAINER (table1), 8); label3 = gtk_label_new (_("eax :")); gtk_widget_show (label3); gtk_table_attach (GTK_TABLE (table1), label3, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (label3), 0, 0.5); label4 = gtk_label_new (_("ebx :")); gtk_widget_show (label4); gtk_table_attach (GTK_TABLE (table1), label4, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (label4), 0, 0.5); label5 = gtk_label_new (_("ecx :")); gtk_widget_show (label5); gtk_table_attach (GTK_TABLE (table1), label5, 0, 1, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (label5), 0, 0.5); label6 = gtk_label_new (_("edx :")); gtk_widget_show (label6); gtk_table_attach (GTK_TABLE (table1), label6, 0, 1, 3, 4, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (label6), 0, 0.5); label7 = gtk_label_new (_("esp :")); gtk_widget_show (label7); gtk_table_attach (GTK_TABLE (table1), label7, 0, 1, 4, 5, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (label7), 0, 0.5); label8 = gtk_label_new (_("ebp :")); gtk_widget_show (label8); gtk_table_attach (GTK_TABLE (table1), label8, 0, 1, 5, 6, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (label8), 0, 0.5); label9 = gtk_label_new (_("esi :")); gtk_widget_show (label9); gtk_table_attach (GTK_TABLE (table1), label9, 0, 1, 6, 7, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (label9), 0, 0.5); label10 = gtk_label_new (_("edi :")); gtk_widget_show (label10); gtk_table_attach (GTK_TABLE (table1), label10, 0, 1, 7, 8, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (label10), 0, 0.5); label11 = gtk_label_new (_("eip :")); gtk_widget_show (label11); gtk_table_attach (GTK_TABLE (table1), label11, 0, 1, 8, 9, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (label11), 0, 0.5); label12 = gtk_label_new (_("0x00000000")); gtk_widget_show (label12); gtk_table_attach (GTK_TABLE (table1), label12, 1, 2, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (label12), 0, 0.5); lbl_eax = label12; gtk_widget_modify_font(lbl_eax, pango_font_description_from_string ("Monospace")); label14 = gtk_label_new (_("0x00000000")); gtk_widget_show (label14); gtk_table_attach (GTK_TABLE (table1), label14, 1, 2, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (label14), 0, 0.5); lbl_ebx = label14; gtk_widget_modify_font(lbl_ebx, pango_font_description_from_string ("Monospace 10")); label15 = gtk_label_new (_("0x00000000")); gtk_widget_show (label15); gtk_table_attach (GTK_TABLE (table1), label15, 1, 2, 3, 4, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (label15), 0, 0.5); lbl_ecx = label15; gtk_widget_modify_font(lbl_ecx, pango_font_description_from_string ("Monospace 10")); label16 = gtk_label_new (_("0x00000000")); gtk_widget_show (label16); gtk_table_attach (GTK_TABLE (table1), label16, 1, 2, 4, 5, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (label16), 0, 0.5); lbl_edx = label16; gtk_widget_modify_font(lbl_edx, pango_font_description_from_string ("Monospace 10")); label17 = gtk_label_new (_("0x00000000")); gtk_widget_show (label17); gtk_table_attach (GTK_TABLE (table1), label17, 1, 2, 5, 6, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (label17), 0, 0.5); label18 = gtk_label_new (_("0x00000000")); gtk_widget_show (label18); gtk_table_attach (GTK_TABLE (table1), label18, 1, 2, 6, 7, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (label18), 0, 0.5); label19 = gtk_label_new (_("0x00000000")); gtk_widget_show (label19); gtk_table_attach (GTK_TABLE (table1), label19, 1, 2, 7, 8, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (label19), 0, 0.5); label20 = gtk_label_new (_("0x00000000")); gtk_widget_show (label20); gtk_table_attach (GTK_TABLE (table1), label20, 1, 2, 8, 9, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (label20), 0, 0.5); label21 = gtk_label_new (_("0x00000000")); gtk_widget_show (label21); gtk_table_attach (GTK_TABLE (table1), label21, 1, 2, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (label21), 0, 0.5); /* Panneau inférieur */ 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); */ statusbar1 = gtk_statusbar_new (); gtk_widget_show (statusbar1); gtk_box_pack_start (GTK_BOX (vbox1), statusbar1, FALSE, FALSE, 0); /* g_signal_connect ((gpointer) button1, "clicked", G_CALLBACK (on_button1_clicked), textview1); */ g_signal_connect ((gpointer) button2, "clicked", G_CALLBACK (on_button2_clicked), NULL); /* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */ fill_snippet(snippet, _panel, panel); return result; } /****************************************************************************** * * * Paramètres : widget = fenêtre de l'éditeur de préférences. * * data = adresse non utilisée ici. * * * * Description : Quitte le programme en sortie de la boucle de GTK. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ void destroy_editor(GtkWidget *widget, gpointer data) { gtk_main_quit(); } /****************************************************************************** * * * Paramètres : menuitem = élément de menu sélectionné. * * data = adresse de l'espace de référencement global. * * * * Description : Réagit au menu "Fichier -> Enregistrer le projet". * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ void mcb_file_save_project(GtkMenuItem *menuitem, gpointer data) { openida_project *project; /* Projet courant */ project = get_current_openida_project(); if (has_storing_filename(project)) write_openida_project_to_xml(project, NULL); else mcb_file_save_project_as(menuitem, data); } /****************************************************************************** * * * Paramètres : menuitem = élément de menu sélectionné. * * data = adresse de l'espace de référencement global. * * * * Description : Réagit au menu "Fichier -> Enregistrer le projet sous...". * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ void mcb_file_save_project_as(GtkMenuItem *menuitem, gpointer data) { GtkWidget *dialog; /* Boîte à afficher */ gchar *filename; /* Nom du fichier à intégrer */ dialog = gtk_file_chooser_dialog_new (_("Save the project as..."), GTK_WINDOW(data), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); if (gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) { filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); write_openida_project_to_xml(get_current_openida_project(), filename); g_free(filename); } gtk_widget_destroy(dialog); } /****************************************************************************** * * * Paramètres : menuitem = élément de menu sélectionné. * * data = 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, gpointer data) { 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 = load_openida_project_from_xml(caption); if (project != NULL) { set_current_openida_project(project); /* TODO ... */ } } /****************************************************************************** * * * 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 "Affichage -> Vue textuelle". * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ void mcb_view_as_text(GtkCheckMenuItem *menuitem, gpointer data) { gboolean active; /* Etat de sélection du menu */ active = gtk_check_menu_item_get_active(menuitem); printf("View as text ? %d\n", active); } /****************************************************************************** * * * 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 "Affichage -> Vue graphique". * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ void mcb_view_as_graph(GtkCheckMenuItem *menuitem, gpointer data) { gboolean active; /* Etat de sélection du menu */ active = gtk_check_menu_item_get_active(menuitem); printf("View as graph ? %d\n", active); } /****************************************************************************** * * * 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 "Affichage -> Adresse virtuelle". * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ void mcb_view_vaddress(GtkCheckMenuItem *menuitem, gpointer data) { GtkBinview *binview; /* Zone de code principale */ gboolean active; /* Etat de sélection du menu */ binview = GTK_BIN_VIEW(g_object_get_data(G_OBJECT(data), "binview")); active = gtk_check_menu_item_get_active(menuitem); gtk_binview_show_vaddress(binview, active); } /****************************************************************************** * * * 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 "Affichage -> code binaire". * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ void mcb_view_code(GtkCheckMenuItem *menuitem, gpointer data) { GtkBinview *binview; /* Zone de code principale */ gboolean active; /* Etat de sélection du menu */ binview = GTK_BIN_VIEW(g_object_get_data(G_OBJECT(data), "binview")); active = gtk_check_menu_item_get_active(menuitem); gtk_binview_show_code(binview, active); } /****************************************************************************** * * * Paramètres : menuitem = élément de menu sélectionné. * * data = adresse de l'espace de référencement global. * * * * Description : Affiche la boîte d'ajout d'un binaire au projet courant. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ void mcb_project_add_binary(GtkMenuItem *menuitem, gpointer data) { GtkWidget *dialog; /* Boîte à afficher */ gchar *filename; /* Nom du fichier à intégrer */ openida_binary *binary; /* Représentation chargée */ dialog = gtk_file_chooser_dialog_new (_("Open a binary file"), GTK_WINDOW(data), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); if (gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) { filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); binary = load_binary_file(filename); if (binary != NULL) { attach_binary_to_openida_project(get_current_openida_project(), binary); reload_menu_project(G_OBJECT(data)); } g_free(filename); } gtk_widget_destroy(dialog); } /****************************************************************************** * * * Paramètres : menuitem = élément de menu sélectionné. * * data = adresse de l'espace de référencement global. * * * * Description : Retire un binaire du projet courant. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ void mcb_project_remove_binary(GtkMenuItem *menuitem, gpointer data) { openida_binary *binary; /* Représentation chargée */ binary = g_object_get_data(G_OBJECT(menuitem), "binary"); detach_binary_to_openida_project(get_current_openida_project(), binary); unload_binary_file(binary); reload_menu_project(G_OBJECT(data)); } /****************************************************************************** * * * Paramètres : menuitem = élément de menu sélectionné. * * data = adresse de l'espace de référencement global. * * * * Description : Affiche la boîte de sélection des sections. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ void mcb_select_sections(GtkMenuItem *menuitem, gpointer data) { GtkWidget *dialog; /* Boîte de dialogue à montrer */ dialog = create_sections_dialog(create_empty_openida_project()/* FIXME */); gtk_widget_show(dialog); } /****************************************************************************** * * * Paramètres : ref = espace de référencements global. * * * * Description : Met à jour le contenu du menu 'Projet'. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ void reload_menu_project(GObject *ref) { GtkWidget *menuitem; /* Menu principal à compléter */ GtkWidget *menubar; /* Support pour éléments */ GList *list; /* Liste des éléments en place */ GList *iter; /* Boucle de parcours #1 */ size_t count; /* Nombre de binaires attachés */ const openida_binary **binaries; /* Liste de ces binaires */ size_t i; /* Boucle de parcours #2 */ const char *desc; /* Description à afficher */ GtkWidget *submenuitem; /* Sous-menu à ajouter */ menuitem = GTK_WIDGET(g_object_get_data(ref, "menu_prj_remove_bin")); menubar = gtk_menu_item_get_submenu(GTK_MENU_ITEM(menuitem)); /* Remise à zéro */ list = gtk_container_get_children(GTK_CONTAINER(menubar)); for (iter = list; iter != NULL; iter = g_list_next(iter)) gtk_container_remove(GTK_CONTAINER(menubar), GTK_WIDGET(iter->data)); g_list_free(list); /* Ajout des entrées */ binaries = get_openida_project_binaries(get_current_openida_project(), &count); for (i = 0; i < count; i++) { desc = openida_binary_to_string(binaries[i]); submenuitem = qck_create_menu_item(NULL, NULL, desc, G_CALLBACK(mcb_project_remove_binary), ref); g_object_set_data(G_OBJECT(submenuitem), "binary", binaries[i]); gtk_container_add(GTK_CONTAINER(menubar), submenuitem); } gtk_widget_set_sensitive(menuitem, count > 0); }