diff options
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/editem-int.h | 2 | ||||
-rw-r--r-- | src/gui/editem.c | 9 | ||||
-rw-r--r-- | src/gui/editem.h | 2 | ||||
-rw-r--r-- | src/gui/status.c | 102 | ||||
-rw-r--r-- | src/gui/tb/portions.c | 2 |
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); + } |