summaryrefslogtreecommitdiff
path: root/src/gui
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui')
-rw-r--r--src/gui/menus/edition.c122
-rw-r--r--src/gui/panels/bookmarks.c89
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. *
* *