summaryrefslogtreecommitdiff
path: root/src/gui
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2014-09-21 21:26:42 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2014-09-21 21:26:42 (GMT)
commit15c0cc127f0f4551c88de6c0d46b7d38f4b3ed4b (patch)
tree5ae9be5d45152486b7cc594c192216bd393dd5b0 /src/gui
parent65768127dea4c2760fe07cf843da7b4ad9e67da5 (diff)
Showed information about a selected address in the status bar.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@407 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/gui')
-rw-r--r--src/gui/editem-int.h2
-rw-r--r--src/gui/editem.c9
-rw-r--r--src/gui/editem.h2
-rw-r--r--src/gui/status.c102
-rw-r--r--src/gui/tb/portions.c2
5 files changed, 111 insertions, 6 deletions
diff --git a/src/gui/editem-int.h b/src/gui/editem-int.h
index eafac04..7dc3ad4 100644
--- a/src/gui/editem-int.h
+++ b/src/gui/editem-int.h
@@ -43,7 +43,7 @@ typedef void (* update_item_binary_fc) (GEditorItem *, GLoadedBinary *);
typedef void (* update_item_view_fc) (GEditorItem *, GtkViewPanel *);
/* Concentre l'attention de l'ensemble sur une adresse donnée. */
-typedef void (* focus_addr_fc) (GEditorItem *, vmpa_t, GtkWidget *);
+typedef void (* focus_addr_fc) (GEditorItem *, GLoadedBinary *, const vmpa2t *);
/* Lance une actualisation relative à l'étendue du projet. */
typedef void (* update_project_fc) (GEditorItem *, GStudyProject *);
diff --git a/src/gui/editem.c b/src/gui/editem.c
index c8befec..cde5d7f 100644
--- a/src/gui/editem.c
+++ b/src/gui/editem.c
@@ -292,7 +292,8 @@ void change_editor_items_current_view_content(GtkViewPanel *view)
/******************************************************************************
* *
-* Paramètres : addr = adresse mémoire à mettre en avant. *
+* Paramètres : binary = binaire contenant l'adresse à représenter. *
+* addr = adresse mémoire à mettre en avant. *
* source = composant à l'origine du changement. *
* *
* Description : Concentre l'attention de l'ensemble sur une adresse donnée. *
@@ -303,7 +304,7 @@ void change_editor_items_current_view_content(GtkViewPanel *view)
* *
******************************************************************************/
-void focus_address_in_editor_items(vmpa_t addr, GtkWidget *source)
+void focus_address_in_editor_items(GLoadedBinary *binary, const vmpa2t *addr, GEditorItem *source)
{
GEditorItem *iter; /* Boucle de parcours */
GEditorItemClass *klass; /* Classe correspondante */
@@ -312,8 +313,8 @@ void focus_address_in_editor_items(vmpa_t addr, GtkWidget *source)
{
klass = G_EDITOR_ITEM_GET_CLASS(iter);
- if (klass->focus_addr != NULL && iter->widget != source)
- klass->focus_addr(iter, addr, source);
+ if (klass->focus_addr != NULL && iter != source)
+ klass->focus_addr(iter, binary, addr);
}
diff --git a/src/gui/editem.h b/src/gui/editem.h
index 1d64534..d1b91a5 100644
--- a/src/gui/editem.h
+++ b/src/gui/editem.h
@@ -86,7 +86,7 @@ void change_editor_items_current_view(GObject *, GtkViewPanel *);
void change_editor_items_current_view_content(GtkViewPanel *);
/* Concentre l'attention de l'ensemble sur une adresse donnée. */
-void focus_address_in_editor_items(vmpa_t, GtkWidget *);
+void focus_address_in_editor_items(GLoadedBinary *, const vmpa2t *, GEditorItem *);
/* Lance une actualisation relative à l'étendue du projet. */
void update_project_area(GStudyProject *);
diff --git a/src/gui/status.c b/src/gui/status.c
index c29a69e..2633ba6 100644
--- a/src/gui/status.c
+++ b/src/gui/status.c
@@ -25,6 +25,7 @@
#include "status.h"
+#include <ctype.h>
#include <string.h>
@@ -76,6 +77,8 @@ static void update_status_info_for_view(GStatusInfo *, GtkViewPanel *);
/* Imprime la position du parcours courant dans le statut. */
static void track_caret_address_on_buffer_views(GtkBufferView *, vmpa_t, GStatusInfo *);
+/* Concentre l'attention de l'ensemble sur une adresse donnée. */
+static void focus_address_in_status_info(GStatusInfo *, GLoadedBinary *, const vmpa2t *);
@@ -108,6 +111,7 @@ static void g_status_info_class_init(GStatusInfoClass *klass)
editem = G_EDITOR_ITEM_CLASS(klass);
editem->update_view = (update_item_view_fc)update_status_info_for_view;
+ editem->focus_addr = (focus_addr_fc)focus_address_in_status_info;
}
@@ -318,3 +322,101 @@ static void track_caret_address_on_buffer_views(GtkBufferView *view, vmpa_t addr
free(msg);
}
+
+
+/******************************************************************************
+* *
+* Paramètres : info = composant réactif à mettre à jour. *
+* binary = binaire contenant l'adresse à représenter. *
+* addr = adresse mémoire à mettre en avant. *
+* *
+* Description : Concentre l'attention de l'ensemble sur une adresse donnée. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void focus_address_in_status_info(GStatusInfo *info, GLoadedBinary *binary, const vmpa2t *addr)
+{
+ GExeFormat *format; /* Format associé au binaire */
+ GArchProcessor *proc; /* Architecture du binaire */
+ MemoryDataSize msize; /* Taille du bus d'adresses */
+ char *msg; /* Message à transmettre */
+ VMPA_BUFFER(tmp); /* Traduction d'adresses */
+ GBinSymbol *symbol; /* Symbole présent à l'adresse */
+ phys_t diff; /* Décallage de l'adresse */
+ const char *label; /* Description d'un symbole */
+ GBinPortion *portions; /* Portions binaires existantes*/
+ GBinPortion *portion; /* Zone mémoire d'appartenance */
+ size_t len; /* Caractère à faire basculer */
+
+ format = g_loaded_binary_get_format(binary);
+ proc = get_arch_processor_from_format(format);
+ msize = g_arch_processor_get_memory_size(proc);
+
+ msg = strdup(_("Localisation:"));
+
+ /* Adresses de base */
+
+ msg = stradd(msg, " phys:");
+ vmpa2_phys_to_string(addr, msize, tmp, NULL);
+ msg = stradd(msg, tmp);
+
+ msg = stradd(msg, " virt:");
+ vmpa2_virt_to_string(addr, msize, tmp, NULL);
+ msg = stradd(msg, tmp);
+
+ /* Symbole présent ? */
+
+ if (g_binary_format_resolve_symbol(G_BIN_FORMAT(format), addr, &symbol, &diff))
+ {
+ label = g_binary_symbol_to_string(symbol);
+
+ if (label != NULL)
+ {
+ msg = stradd(msg, _(" at "));
+ msg = stradd(msg, label);
+ msg = stradd(msg, _("+"));
+
+ snprintf(tmp, VMPA_MAX_SIZE, "0x%x", diff);
+ msg = stradd(msg, tmp);
+
+ }
+
+ g_object_unref(G_OBJECT(symbol));
+
+ }
+
+ /* Zone d'appartenance */
+
+ portions = g_exe_format_get_portions(format);
+
+ portion = g_binary_portion_find_at_addr(portions, addr, (GdkRectangle []) { });
+
+ label = g_binary_portion_get_desc(portion);
+
+ msg = stradd(msg, _(" ("));
+
+ /**
+ * Pas très propre : on bascule de majuscule en minuscule ici...
+ * FIXME ?
+ */
+
+ len = strlen(msg);
+ msg = stradd(msg, label);
+ msg[len] = tolower(msg[len]);
+
+ msg = stradd(msg, _(")"));
+
+ /* Impression */
+
+ if (info->msg_id > 0)
+ gtk_extended_status_bar_remove(GTK_EXT_STATUS_BAR(G_EDITOR_ITEM(info)->widget), info->msg_id);
+
+ info->msg_id = gtk_extended_status_bar_push(GTK_EXT_STATUS_BAR(G_EDITOR_ITEM(info)->widget), msg, FALSE);
+
+ free(msg);
+
+}
diff --git a/src/gui/tb/portions.c b/src/gui/tb/portions.c
index 53c7dea..3d30a9e 100644
--- a/src/gui/tb/portions.c
+++ b/src/gui/tb/portions.c
@@ -253,4 +253,6 @@ static void track_address_on_binary_strip(GtkBinaryStrip *strip, GEditorItem *it
vpanel = g_editor_item_get_current_view(item);
gtk_view_panel_scroll_to_address(vpanel, addr);
+ focus_address_in_editor_items(g_editor_item_get_current_binary(item), addr, item);
+
}