diff options
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/menus/edition.c | 122 | ||||
-rw-r--r-- | src/gui/panels/bookmarks.c | 89 |
2 files changed, 207 insertions, 4 deletions
diff --git a/src/gui/menus/edition.c b/src/gui/menus/edition.c index fc23f49..eec3016 100644 --- a/src/gui/menus/edition.c +++ b/src/gui/menus/edition.c @@ -28,11 +28,16 @@ #include <i18n.h> +#include "../../dialogs/bookmark.h" #include "../../dialogs/goto.h" #include "../../gtkext/easygtk.h" +#include "../../gtkext/gtkbufferview.h" +/* Réagit avec le menu "Edition -> Signets -> Basculer...". */ +static void mcb_edition_bookmarks_toggle(GtkMenuItem *, GMenuBar *); + /* Réagit avec le menu "Edition -> Aller à l'adresse...". */ static void mcb_edition_goto(GtkMenuItem *, GMenuBar *); @@ -56,7 +61,9 @@ GtkWidget *build_menu_edition(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *b { GtkWidget *result; /* Support à retourner */ GtkWidget *menubar; /* Support pour éléments */ - GtkWidget *submenuitem; /* Sous-élément de menu */ + GtkWidget *submenuitem; /* Sous-élément de menu #1 */ + GtkWidget *deepmenubar; /* Support pour éléments #2 */ + GtkWidget *deepmenuitem; /* Sous-élément de menu #2 */ result = gtk_menu_item_new_with_mnemonic(_("_Edition")); gtk_widget_show(result); @@ -64,6 +71,20 @@ GtkWidget *build_menu_edition(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *b menubar = gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(result), menubar); + submenuitem = qck_create_menu_item(NULL, NULL, _("Bookmarks"), NULL, NULL); + gtk_container_add(GTK_CONTAINER(menubar), submenuitem); + + deepmenubar = gtk_menu_new(); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(submenuitem), deepmenubar); + + deepmenuitem = qck_create_menu_item(NULL, NULL, _("Toggle at current location"), + G_CALLBACK(mcb_edition_bookmarks_toggle), bar); + add_accelerator_to_menu_item(deepmenuitem, "<Ctrl>D", accgroup); + gtk_container_add(GTK_CONTAINER(deepmenubar), deepmenuitem); + + submenuitem = qck_create_menu_separator(); + gtk_container_add(GTK_CONTAINER(menubar), submenuitem); + submenuitem = qck_create_menu_item(NULL, NULL, _("Go to address..."), G_CALLBACK(mcb_edition_goto), bar); add_accelerator_to_menu_item(submenuitem, "<Ctrl>G", accgroup); @@ -79,6 +100,105 @@ GtkWidget *build_menu_edition(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *b * Paramètres : menuitem = élément de menu sélectionné. * * bar = barre de menu parente. * * * +* Description : Réagit avec le menu "Edition -> Signets -> Basculer...". * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void mcb_edition_bookmarks_toggle(GtkMenuItem *menuitem, GMenuBar *bar) +{ + GEditorItem *editem; /* Autre version de la barre */ + GtkViewPanel *panel; /* Vue offrant l'affichage */ + const vmpa2t *curloc; /* Localisation d'un curseur */ + GLoadedBinary *binary; /* Binaire en cours d'étude */ + GDbCollection *collec; /* Collection à manipuler */ + GDbItem *exist; /* Sens du basculement courant */ + GObject *ref; /* Espace de référencements */ + GtkWidget *dialog; /* Boîte de dialogue à montrer */ + GDbItem *bookmark; /* Nouveau signet défini */ + gint ret; /* Retour de confirmation */ + + editem = G_EDITOR_ITEM(bar); + + /* Détermination de l'adresse visée */ + + panel = g_editor_item_get_current_view(editem); + + if (!GTK_IS_BUFFER_VIEW(panel)) + curloc = NULL; + else + curloc = gtk_buffer_view_get_caret_location(GTK_BUFFER_VIEW(panel)); + + /* Accès à la collection */ + + binary = g_editor_item_get_current_binary(editem); + collec = g_loaded_binary_find_collection(binary, DBF_BOOKMARKS); + + /** + * On choisit de se passer de verrou ici : + * - si l'élément existe, la suppression prend en compte le fait + * que l'élément puisse disparaître entre temps. + * - si l'élément n'existe pas, une boîte de dialogue est prévue + * au moment de l'insertion finale. Dans ce cas, l'utilisateur + * peut de plus modifier la position pendant la définition. + */ + + if (curloc == NULL) + exist = NULL; + else + exist = NULL;//g_db_collection_has_key(collec, curloc); + + if (exist != NULL) + g_loaded_binary_remove_from_collection(binary, DBF_BOOKMARKS, exist); + + else + { + ref = g_editor_item_get_global_ref(G_EDITOR_ITEM(bar)); + dialog = create_bookmark_dialog(GTK_WINDOW(ref), curloc); + + if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK) + { + bookmark = get_item_from_bookmark_dialog(dialog); + + g_db_collection_wlock(G_DB_COLLECTION(collec)); + + if (g_db_collection_has_item(collec, G_DB_ITEM(bookmark))) + { + ret = qck_show_question(GTK_WINDOW(ref), + _("Location already bookmarked!"), + _("A bookmark has been defined at the same location.\n" \ + "Do you want to replace it ?")); + + if (ret != GTK_RESPONSE_YES) + goto mcb_ebt_add_finish; + + } + + _g_loaded_binary_add_to_collection(binary, DBF_BOOKMARKS, G_DB_ITEM(bookmark), false); + + mcb_ebt_add_finish: + + g_db_collection_wunlock(G_DB_COLLECTION(collec)); + + } + + gtk_widget_destroy(dialog); + + } + + g_object_unref(G_OBJECT(collec)); + +} + + +/****************************************************************************** +* * +* Paramètres : menuitem = élément de menu sélectionné. * +* bar = barre de menu parente. * +* * * Description : Réagit avec le menu "Edition -> Aller à l'adresse...". * * * * Retour : - * diff --git a/src/gui/panels/bookmarks.c b/src/gui/panels/bookmarks.c index 9239203..7397ef5 100644 --- a/src/gui/panels/bookmarks.c +++ b/src/gui/panels/bookmarks.c @@ -110,6 +110,9 @@ static void g_bookmarks_panel_finalize(GBookmarksPanel *); /* Recharge une collection de signets à l'affichage. */ static void reload_bookmarks_into_treeview(GBookmarksPanel *, GLoadedBinary *); +/* Met à jour une collection suite à une modification. */ +static void on_collection_content_changed(GDbCollection *, DBAction, GDbBookmark *, GBookmarksPanel *); + /* Réagit au changement de sélection des signets. */ static void on_bookmarks_selection_change(GtkTreeSelection *, GBookmarksPanel *); @@ -471,8 +474,8 @@ GPanelItem *create_bookmarks_panel(GObject *ref) static void reload_bookmarks_into_treeview(GBookmarksPanel *panel, GLoadedBinary *binary) { - GtkTreeStore *store; /* Modèle de gestion */ GDbCollection *collec; /* Collection à lister ici */ + GtkTreeStore *store; /* Modèle de gestion */ GArchProcessor *proc; /* Architecture du binaire */ MemoryDataSize msize; /* Taille par défaut */ GList *items; /* Liste des éléments groupés */ @@ -486,13 +489,25 @@ static void reload_bookmarks_into_treeview(GBookmarksPanel *panel, GLoadedBinary /* Basculement du binaire utilisé */ if (panel->binary != NULL) + { + collec = g_loaded_binary_find_collection(panel->binary, DBF_BOOKMARKS); + g_signal_handlers_disconnect_by_func(collec, G_CALLBACK(on_collection_content_changed), panel); + g_object_unref(G_OBJECT(panel->binary)); + } + panel->binary = binary; if (panel->binary != NULL) + { g_object_ref(G_OBJECT(binary)); + collec = g_loaded_binary_find_collection(binary, DBF_BOOKMARKS); + g_signal_connect(collec, "content-changed", G_CALLBACK(on_collection_content_changed), panel); + + } + store = GTK_TREE_STORE(gtk_tree_view_get_model(panel->treeview)); gtk_tree_store_clear(store); @@ -506,8 +521,6 @@ static void reload_bookmarks_into_treeview(GBookmarksPanel *panel, GLoadedBinary msize = g_arch_processor_get_memory_size(proc); g_object_unref(G_OBJECT(proc)); - collec = g_loaded_binary_find_collection(binary, DBF_BOOKMARKS); - g_db_collection_rlock(collec); items = g_db_collection_list_items(collec); @@ -539,6 +552,76 @@ static void reload_bookmarks_into_treeview(GBookmarksPanel *panel, GLoadedBinary /****************************************************************************** * * +* Paramètres : collec = collection dont le contenu vient de changer. * +* action = type de modification notifiée par la collection. * +* bookmark = élément en cause dans le changement survenu. * +* pane = structure contenant les informations maîtresses. * +* * +* Description : Met à jour une collection suite à une modification. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void on_collection_content_changed(GDbCollection *collec, DBAction action, GDbBookmark *bookmark, GBookmarksPanel *panel) +{ + + GtkTreeStore *store; /* Modèle de gestion */ + + + GExeFormat *format; /* Format du fichier binaire */ + GArchProcessor *proc; /* Architecture du binaire */ + MemoryDataSize msize; /* Taille par défaut */ + + const vmpa2t *addr; /* Adressse associée au signet */ + VMPA_BUFFER(phys); /* Position physique */ + VMPA_BUFFER(virt); /* Adresse virtuelle */ + GtkTreeIter iter; /* Point d'insertion */ + + + + + printf(" Passage :: %d\n", action); + + + store = GTK_TREE_STORE(gtk_tree_view_get_model(panel->treeview)); + + format = g_loaded_binary_get_format(panel->binary); + + + proc = g_loaded_binary_get_processor(panel->binary); + msize = g_arch_processor_get_memory_size(proc); + g_object_unref(G_OBJECT(proc)); + + + + + + + addr = g_db_bookmark_get_address(bookmark); + + vmpa2_phys_to_string(addr, msize, phys, NULL); + vmpa2_virt_to_string(addr, msize, virt, NULL); + + gtk_tree_store_append(store, &iter, NULL); + gtk_tree_store_set(store, &iter, + BMC_BOOKMARK, bookmark, + BMC_PICTURE, G_BOOKMARKS_PANEL_GET_CLASS(panel)->bookmark_img, + BMC_PHYSICAL, phys, + BMC_VIRTUAL, virt, + BMC_COMMENT, g_db_bookmark_get_comment(bookmark), + -1); + + + + +} + + +/****************************************************************************** +* * * Paramètres : selection = sélection modifiée. * * panel = structure contenant les informations maîtresses. * * * |