From 10b620c3f7d6a9e78aa1e9d6dabef466d0b9e3af Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Tue, 26 Aug 2014 22:41:12 +0000 Subject: Looked for coordinates using the new addresses definitions. git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@394 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a --- ChangeLog | 32 ++++++++++++++++ src/arch/vmpa.c | 87 +++++++++++++++++++++++++++++++++++++++++++ src/arch/vmpa.h | 9 +++++ src/dialogs/goto.c | 41 ++++++++++++++++---- src/dialogs/goto.h | 4 +- src/glibext/gbufferline.c | 4 +- src/glibext/gbufferline.h | 2 +- src/glibext/gcodebuffer.c | 27 +++++++------- src/glibext/gcodebuffer.h | 6 +-- src/gtkext/easygtk.c | 39 +++++++++++++++++++ src/gtkext/easygtk.h | 3 ++ src/gtkext/gtkbufferview.c | 7 +++- src/gtkext/gtkgraphview.c | 2 +- src/gtkext/gtkviewpanel-int.h | 2 +- src/gtkext/gtkviewpanel.c | 6 ++- src/gtkext/gtkviewpanel.h | 2 +- src/gui/menus/edition.c | 4 +- 17 files changed, 241 insertions(+), 36 deletions(-) diff --git a/ChangeLog b/ChangeLog index 12ac1f3..656de9f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,35 @@ +14-08-27 Cyrille Bagard + + * src/arch/vmpa.c: + * src/arch/vmpa.h: + Compare vmpa_t types (by physical offset first). Convert strings to vmpa_t. + + * src/dialogs/goto.c: + * src/dialogs/goto.h: + Update the dialog by asking for physical or virtual property. + Clean the code. + + * src/glibext/gbufferline.c: + * src/glibext/gbufferline.h: + Provide the real and existing new address of a line. + + * src/glibext/gcodebuffer.c: + * src/glibext/gcodebuffer.h: + Look for coordinates using the new addresses definitions, used when + scrolling to a given address. + + * src/gtkext/easygtk.c: + * src/gtkext/easygtk.h: + Add the ability to quickly create radio buttons. + + * src/gtkext/gtkbufferview.c: + * src/gtkext/gtkgraphview.c: + * src/gtkext/gtkviewpanel.c: + * src/gtkext/gtkviewpanel.h: + * src/gtkext/gtkviewpanel-int.h: + * src/gui/menus/edition.c: + Disable or update some code. + 14-08-25 Cyrille Bagard * src/analysis/binary.h: diff --git a/src/arch/vmpa.c b/src/arch/vmpa.c index edff789..297a0ca 100644 --- a/src/arch/vmpa.c +++ b/src/arch/vmpa.c @@ -26,6 +26,7 @@ #include #include +#include #include @@ -174,6 +175,46 @@ int cmp_vmpa_by_virt(const vmpa2t *a, const vmpa2t *b) /****************************************************************************** * * +* Paramètres : a = première définition à analyser. * +* b = seconde définition à analyser. * +* * +* Description : Compare deux localisations selon leurs parties définies. * +* * +* Retour : Bilan de la comparaison : -1, 0 ou 1 (-1 par défaut). * +* * +* Remarques : - * +* * +******************************************************************************/ + +int cmp_vmpa(const vmpa2t *a, const vmpa2t *b) +{ + int result; /* Bilan à retourner */ + bool half; /* Comparaison débutée */ + + result = -1; + + half = false; + + if (a->physical != VMPA_NO_PHYSICAL && b->physical != VMPA_NO_PHYSICAL) + { + result = cmp_vmpa_by_phy(a, b); + half = true; + } + + if (a->virtual != VMPA_NO_VIRTUAL && b->virtual != VMPA_NO_VIRTUAL + && (!half || (half && result == 0))) + { + result = cmp_vmpa_by_virt(a, b); + } + + return result; + +} + + + +/****************************************************************************** +* * * Paramètres : addr = élément à modifier. * * qty = quantité d'unités de décallage. * * * @@ -389,3 +430,49 @@ char *vmpa2_virt_to_string(const vmpa2t *addr, MemoryDataSize msize, char buffer return buffer; } + + +/****************************************************************************** +* * +* Paramètres : buffer = chaîne de caractères à consulter. * +* * +* Description : Transforme une chaîne de caractères en position physique. * +* * +* Retour : Adresse obtenue. * +* * +* Remarques : - * +* * +******************************************************************************/ + +vmpa2t *string_to_vmpa_phy(const char *buffer) +{ + off_t physical; /* Position à retrouver */ + + physical = strtoull(buffer, NULL, 16); + + return make_vmpa(physical, VMPA_NO_VIRTUAL); + +} + + +/****************************************************************************** +* * +* Paramètres : buffer = chaîne de caractères à consulter. * +* * +* Description : Transforme une chaîne de caractères en adresse virtuelle. * +* * +* Retour : Adresse obtenue. * +* * +* Remarques : - * +* * +******************************************************************************/ + +vmpa2t *string_to_vmpa_virt(const char *buffer) +{ + uint64_t virtual; /* Adresse à retrouver */ + + virtual = strtoull(buffer, NULL, 16); + + return make_vmpa(VMPA_NO_PHYSICAL, virtual); + +} diff --git a/src/arch/vmpa.h b/src/arch/vmpa.h index d89c290..85ff6b4 100644 --- a/src/arch/vmpa.h +++ b/src/arch/vmpa.h @@ -74,6 +74,9 @@ int cmp_vmpa_by_phy(const vmpa2t *, const vmpa2t *); /* Compare entre elles deux adresses virtuelles. */ int cmp_vmpa_by_virt(const vmpa2t *, const vmpa2t *); +/* Compare deux localisations selon leurs parties définies. */ +int cmp_vmpa(const vmpa2t *, const vmpa2t *); + #define are_equal(a, b) \ (cmp_vmpa_by_phy(a, b) == 0 && cmp_vmpa_by_virt(a, b) == 0) @@ -101,6 +104,12 @@ char *vmpa2_phys_to_string(const vmpa2t *, MemoryDataSize, char [VMPA_MAX_LEN], /* Transforme une adresse virtuelle en chaîne de caractères. */ char *vmpa2_virt_to_string(const vmpa2t *, MemoryDataSize, char [VMPA_MAX_LEN], size_t *); +/* Transforme une chaîne de caractères en position physique. */ +vmpa2t *string_to_vmpa_phy(const char *); + +/* Transforme une chaîne de caractères en adresse virtuelle. */ +vmpa2t *string_to_vmpa_virt(const char *); + #endif /* _ARCH_VMPA_H */ diff --git a/src/dialogs/goto.c b/src/dialogs/goto.c index 42c032d..5322260 100644 --- a/src/dialogs/goto.c +++ b/src/dialogs/goto.c @@ -144,11 +144,13 @@ GtkWidget *create_goto_dialog(GtkWindow *parent) { GtkWidget *result; /* Fenêtre à renvoyer */ GtkWidget *dlgvbox; /* Zone principale de la boîte */ - GtkWidget *vbox; /* Support à construire */ + GtkWidget *vbox; /* Support à construire #1 */ GtkWidget *label; /* Message d'introduction */ GtkWidget *combobox; /* Liste de sélection */ GtkWidget *entry; /* Zone de saisie principale */ - GtkWidget *dialog_action_area1; + GtkWidget *hbox; /* Support à construire #2 */ + GtkWidget *radio; /* Définition de localisation */ + GtkWidget *action_area; /* Zone de contrôle */ GtkWidget *button; /* Bouton de contrôle */ result = gtk_dialog_new(); @@ -165,6 +167,8 @@ GtkWidget *create_goto_dialog(GtkWindow *parent) gtk_box_pack_start(GTK_BOX(dlgvbox), vbox, TRUE, TRUE, 0); gtk_container_set_border_width(GTK_CONTAINER(vbox), 8); + /* Zone de saisie principale */ + label = qck_create_label(NULL, NULL, _("Enter the value of the target address:")); gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0); @@ -183,11 +187,26 @@ GtkWidget *create_goto_dialog(GtkWindow *parent) //gtk_combo_box_append_text(combobox, "test"); + /* Propriétés de la localisation */ + + hbox = gtk_hbox_new(FALSE, 8); + gtk_widget_show(hbox); + gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0); + gtk_container_set_border_width(GTK_CONTAINER(hbox), 8); + + radio = qck_create_radio_button(G_OBJECT(result), "phy", _("Address is physical"), + NULL, NULL, NULL); + gtk_box_pack_start(GTK_BOX(hbox), radio, TRUE, TRUE, 0); - dialog_action_area1 = gtk_dialog_get_action_area(GTK_DIALOG(result)); - gtk_widget_show(dialog_action_area1); - gtk_button_box_set_layout(GTK_BUTTON_BOX(dialog_action_area1), GTK_BUTTONBOX_END); + radio = qck_create_radio_button(G_OBJECT(result), "virt", _("Address is virtual"), + GTK_RADIO_BUTTON(radio), NULL, NULL); + gtk_box_pack_start(GTK_BOX(hbox), radio, TRUE, TRUE, 0); + /* Zone de validation */ + + action_area = gtk_dialog_get_action_area(GTK_DIALOG(result)); + gtk_widget_show(action_area); + gtk_button_box_set_layout(GTK_BUTTON_BOX(action_area), GTK_BUTTONBOX_END); button = qck_create_button_from_stock(NULL, NULL, "gtk-cancel", NULL, NULL); gtk_dialog_add_action_widget(GTK_DIALOG(result), button, GTK_RESPONSE_CANCEL); @@ -216,11 +235,12 @@ GtkWidget *create_goto_dialog(GtkWindow *parent) * * ******************************************************************************/ -vmpa_t get_address_from_goto_dialog(GtkWidget *dialog) +vmpa2t *get_address_from_goto_dialog(GtkWidget *dialog) { - vmpa_t result; /* Adresse à retourner */ + vmpa2t *result; /* Adresse à retourner */ GtkWidget *combobox; /* Liste de sélection */ GtkWidget *entry; /* Zone de saisie principale */ + GtkToggleButton *radio; /* Définition de localisation */ const gchar *text; /* Adresse en version texte */ combobox = GTK_WIDGET(g_object_get_data(G_OBJECT(dialog), "combobox")); @@ -228,7 +248,12 @@ vmpa_t get_address_from_goto_dialog(GtkWidget *dialog) text = gtk_entry_get_text(GTK_ENTRY(entry)); - result = string_to_vmpa(text); + radio = GTK_TOGGLE_BUTTON(g_object_get_data(G_OBJECT(dialog), "phy")); + + if (gtk_toggle_button_get_active(radio)) + result = string_to_vmpa_phy(text); + else + result = string_to_vmpa_virt(text); return result; diff --git a/src/dialogs/goto.h b/src/dialogs/goto.h index 549516f..7bb57b5 100644 --- a/src/dialogs/goto.h +++ b/src/dialogs/goto.h @@ -28,7 +28,7 @@ #include -#include "../arch/archbase.h" +#include "../arch/vmpa.h" @@ -36,7 +36,7 @@ GtkWidget *create_goto_dialog(GtkWindow *); /* Fournit l'adresse obtenue par la saisie de l'utilisateur. */ -vmpa_t get_address_from_goto_dialog(GtkWidget *); +vmpa2t *get_address_from_goto_dialog(GtkWidget *); diff --git a/src/glibext/gbufferline.c b/src/glibext/gbufferline.c index 6e06fe4..ac6dc23 100644 --- a/src/glibext/gbufferline.c +++ b/src/glibext/gbufferline.c @@ -391,9 +391,9 @@ GBufferLine *g_buffer_line_new(const vmpa2t *addr, BufferLineColumn main) * * ******************************************************************************/ -vmpa_t g_buffer_line_get_address(const GBufferLine *line) +const vmpa2t *g_buffer_line_get_address(const GBufferLine *line) { - return 0/* FIXME line->addr*/; + return line->addr; } diff --git a/src/glibext/gbufferline.h b/src/glibext/gbufferline.h index fa64fe1..4ca07ca 100644 --- a/src/glibext/gbufferline.h +++ b/src/glibext/gbufferline.h @@ -86,7 +86,7 @@ GType g_buffer_line_get_type(void); GBufferLine *g_buffer_line_new(const vmpa2t *, BufferLineColumn); /* Indique l'adresse à laquelle se situe la ligne. */ -vmpa_t g_buffer_line_get_address(const GBufferLine *); +const vmpa2t *g_buffer_line_get_address(const GBufferLine *); /* Construit le tronc commun d'une ligne d'instruction. */ void g_buffer_line_fill_for_instr(GBufferLine *, MemoryDataSize, MemoryDataSize, const bin_t *, off_t, bool); diff --git a/src/glibext/gcodebuffer.c b/src/glibext/gcodebuffer.c index 708a089..6a21222 100644 --- a/src/glibext/gcodebuffer.c +++ b/src/glibext/gcodebuffer.c @@ -1083,13 +1083,13 @@ gint g_buffer_view_get_height(const GBufferView *view) * * * Description : Calcule la position idéale de curseur pour un point donné. * * * -* Retour : Adresse si une a pu être déterminée, VMPA_INVALID sinon. * +* Retour : Adresse si une a pu être déterminée, NULL sinon. * * * * Remarques : - * * * ******************************************************************************/ -vmpa_t g_buffer_view_compute_caret(GBufferView *view, GBufferLine *line, size_t index, gint x, GdkRectangle *caret) +const vmpa2t *g_buffer_view_compute_caret(GBufferView *view, GBufferLine *line, size_t index, gint x, GdkRectangle *caret) { gint tmp_x; /* Copie de travail modifiable */ GBufferSegment *segment; /* Segment visé par le pointeur*/ @@ -1098,10 +1098,10 @@ vmpa_t g_buffer_view_compute_caret(GBufferView *view, GBufferLine *line, size_t tmp_x = x; tmp_x -= view->left_text; - if (tmp_x < 0) return VMPA_INVALID; + if (tmp_x < 0) return NULL; segment = g_buffer_line_get_segment_at(line, view->max_widths, &tmp_x, true); - if (segment == NULL) return VMPA_INVALID; + if (segment == NULL) return NULL; caret->x = (x - tmp_x) + g_buffer_segment_get_caret_position(segment, tmp_x); @@ -1456,19 +1456,22 @@ GBufferLine *g_buffer_view_find_line_at(GBufferView *view, gint y, size_t *idx) * * ******************************************************************************/ -bool g_buffer_view_get_address_coordinates(GBufferView *view, vmpa_t addr, gint *x, gint *y) +bool g_buffer_view_get_address_coordinates(GBufferView *view, const vmpa2t *addr, gint *x, gint *y) { + bool result; /* Bilan à retourner */ gint lheight; /* Hauteur d'une ligne */ - vmpa_t current; /* Adresse parcourue */ size_t first; /* Première ligne intégrée */ size_t last; /* Dernière ligne intégrée */ size_t i; /* Boucle de parcours */ + const vmpa2t *current; /* Adresse parcourue */ + int ret; /* Bilan d'une comparaison */ + + result = false; *x = 0; *y = 0; lheight = g_buffer_view_get_line_height(view); - current = VMPA_MAX; first = g_code_buffer_get_index_from_address(view->buffer, view->start, true); last = g_code_buffer_get_index_from_address(view->buffer, view->end, false); @@ -1477,17 +1480,15 @@ bool g_buffer_view_get_address_coordinates(GBufferView *view, vmpa_t addr, gint for (i = first; i <= last; i++) { current = g_buffer_line_get_address(view->buffer->lines[i]); + ret = cmp_vmpa(current, addr); - if (current == addr) - break; - - if (current > addr) - return false; + result = (ret == 0); + if (ret >= 0) break; *y += lheight; } - return (current == addr); + return result; } diff --git a/src/glibext/gcodebuffer.h b/src/glibext/gcodebuffer.h index 3167d41..5be0084 100644 --- a/src/glibext/gcodebuffer.h +++ b/src/glibext/gcodebuffer.h @@ -57,7 +57,7 @@ GType g_code_buffer_get_type(void); GCodeBuffer *g_code_buffer_new(BufferLineColumn); /* FIXME */ -#define g_code_buffer_append_new_line_fixme(b) g_code_buffer_append_new_line(b, 0ull) +#define g_code_buffer_append_new_line_fixme(b) g_code_buffer_append_new_line(b, make_vmpa(VMPA_NO_PHYSICAL, VMPA_NO_VIRTUAL)) /* Ajoute une nouvelle ligne à un tampon pour code désassemblé. */ GBufferLine *g_code_buffer_append_new_line(GCodeBuffer *, const vmpa2t *); @@ -128,7 +128,7 @@ gint g_buffer_view_get_width(GBufferView *, bool, bool, bool); gint g_buffer_view_get_height(const GBufferView *); /* Calcule la position idéale de curseur pour un point donné. */ -vmpa_t g_buffer_view_compute_caret(GBufferView *, GBufferLine *, size_t, gint, GdkRectangle *); +const vmpa2t *g_buffer_view_compute_caret(GBufferView *, GBufferLine *, size_t, gint, GdkRectangle *); /* Déplace le curseur au sein d'une vue de tampon. */ vmpa_t g_buffer_view_move_caret(GBufferView *, GdkRectangle *, bool, GdkScrollDirection, bool, bool, bool); @@ -146,7 +146,7 @@ void g_buffer_view_draw(const GBufferView *, cairo_t *, gint, gint, const cairo_ GBufferLine *g_buffer_view_find_line_at(GBufferView *, gint, size_t *); /* Indique la position d'affichage d'une adresse donnée. */ -bool g_buffer_view_get_address_coordinates(GBufferView *, vmpa_t, gint *, gint *); +bool g_buffer_view_get_address_coordinates(GBufferView *, const vmpa2t *, gint *, gint *); diff --git a/src/gtkext/easygtk.c b/src/gtkext/easygtk.c index fb623ab..d4f01e3 100644 --- a/src/gtkext/easygtk.c +++ b/src/gtkext/easygtk.c @@ -477,6 +477,45 @@ GtkWidget *qck_create_check_button(GObject *object, const char *name, const char * * * Paramètres : object = espace dédié à l'inscription de références. * * name = nom à donner au nouveau composant. * +* caption = désignation apparaîssant sur le corps de l'objet. * +* member = membre de la liste des autres boutons. * +* handler = éventuelle fonction de sélection associée. * +* data = données à transmettre avec l'événement si besoin. * +* * +* Description : Crée et enregistre un composant 'GtkRadioButton'. * +* * +* Retour : Composant mis en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GtkWidget *qck_create_radio_button(GObject *object, const char *name, const char *caption, GtkRadioButton *member, GCallback handler, gpointer data) +{ + GtkWidget *result; /* Résultat à renvoyer */ + + result = gtk_radio_button_new_with_label_from_widget(member, caption); + + if (G_IS_OBJECT(object) && name != NULL) + { + g_object_ref(G_OBJECT(result)); + g_object_set_data_full(object, name, result, (GDestroyNotify)g_object_unref); + } + + gtk_widget_show(result); + + if (handler != NULL) + g_signal_connect(result, "toggled", handler, data); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : object = espace dédié à l'inscription de références. * +* name = nom à donner au nouveau composant. * * handler = éventuelle fonction de sélection associée. * * data = données à transmettre avec l'événement si besoin. * * * diff --git a/src/gtkext/easygtk.h b/src/gtkext/easygtk.h index 2dcd821..12de4d3 100644 --- a/src/gtkext/easygtk.h +++ b/src/gtkext/easygtk.h @@ -68,6 +68,9 @@ GtkWidget *qck_create_button_with_img(GObject *, const char *, const char *, GCa /* Crée et enregistre un composant 'GtkCheckButton'. */ GtkWidget *qck_create_check_button(GObject *, const char *, const char *, GCallback, gpointer); +/* Crée et enregistre un composant 'GtkRadioButton'. */ +GtkWidget *qck_create_radio_button(GObject *, const char *, const char *, GtkRadioButton *, GCallback, gpointer); + /* Crée et enregistre un composant 'GtkComboBox'. */ GtkWidget *qck_create_combobox(GObject *, const char *, GCallback, gpointer); diff --git a/src/gtkext/gtkbufferview.c b/src/gtkext/gtkbufferview.c index e58ae5c..032fcf9 100644 --- a/src/gtkext/gtkbufferview.c +++ b/src/gtkext/gtkbufferview.c @@ -62,7 +62,7 @@ static gboolean gtk_buffer_view_draw(GtkWidget *, cairo_t *); static gboolean gtk_buffer_view_key_press(GtkWidget *, GdkEventKey *); /* Indique la position d'affichage d'une adresse donnée. */ -static bool gtk_buffer_view_get_address_coordinates(const GtkBufferView *, vmpa_t, gint *, gint *); +static bool gtk_buffer_view_get_address_coordinates(const GtkBufferView *, const vmpa2t *, gint *, gint *); /* Place en cache un rendu destiné à l'aperçu graphique rapide. */ static void gtk_buffer_view_cache_glance(GtkBufferView *, cairo_t *, const GtkAllocation *, double); @@ -246,8 +246,11 @@ static gboolean gtk_buffer_view_button_press(GtkWidget *widget, GdkEventButton * } else { + return FALSE; + /* addr = g_buffer_view_compute_caret(view->buffer_view, line, index, real_x, &new); if (addr == VMPA_INVALID) return FALSE; + */ gtk_buffer_view_compute_relative_coords(view, &view->caret.x, &view->caret.y); @@ -586,7 +589,7 @@ static gboolean gtk_buffer_view_key_press(GtkWidget *widget, GdkEventKey *event) * * ******************************************************************************/ -static bool gtk_buffer_view_get_address_coordinates(const GtkBufferView *view, vmpa_t addr, gint *x, gint *y) +static bool gtk_buffer_view_get_address_coordinates(const GtkBufferView *view, const vmpa2t *addr, gint *x, gint *y) { return g_buffer_view_get_address_coordinates(view->buffer_view, addr, x, y); diff --git a/src/gtkext/gtkgraphview.c b/src/gtkext/gtkgraphview.c index 3b4fb78..f34cf21 100644 --- a/src/gtkext/gtkgraphview.c +++ b/src/gtkext/gtkgraphview.c @@ -154,7 +154,7 @@ static void gtk_graph_view_init(GtkGraphView *view) viewpanel->define = (define_address_fc)gtk_graph_view_define_main_address; viewpanel->resize = (prepare_resize_fc)gtk_graph_view_prepare_resize; - viewpanel->get_coordinates = (get_addr_coordinates_fc)gtk_graph_view_get_address_coordinates; + ////////viewpanel->get_coordinates = (get_addr_coordinates_fc)gtk_graph_view_get_address_coordinates; viewpanel->cache_glance = (cache_glance_fc)gtk_graph_view_cache_glance; //binview = GTK_BIN_VIEW(view); diff --git a/src/gtkext/gtkviewpanel-int.h b/src/gtkext/gtkviewpanel-int.h index b3a6cf6..1970402 100644 --- a/src/gtkext/gtkviewpanel-int.h +++ b/src/gtkext/gtkviewpanel-int.h @@ -43,7 +43,7 @@ typedef void (* define_address_fc) (GtkViewPanel *, vmpa_t); typedef void (* prepare_resize_fc) (GtkViewPanel *); /* Indique la position d'affichage d'une adresse donnée. */ -typedef bool (* get_addr_coordinates_fc) (const GtkViewPanel *, vmpa_t, gint *, gint *); +typedef bool (* get_addr_coordinates_fc) (const GtkViewPanel *, const vmpa2t *, gint *, gint *); /* Place en cache un rendu destiné à l'aperçu graphique rapide. */ typedef void (* cache_glance_fc) (GtkViewPanel *, cairo_t *, const GtkAllocation *, double); diff --git a/src/gtkext/gtkviewpanel.c b/src/gtkext/gtkviewpanel.c index 739fde7..e4e73a4 100644 --- a/src/gtkext/gtkviewpanel.c +++ b/src/gtkext/gtkviewpanel.c @@ -468,7 +468,7 @@ bool gtk_view_panel_contain_address(const GtkViewPanel *panel, vmpa_t addr) * * ******************************************************************************/ -void gtk_view_panel_scroll_to_address(GtkViewPanel *panel, vmpa_t addr) +void gtk_view_panel_scroll_to_address(GtkViewPanel *panel, const vmpa2t *addr) { gint x; /* Abscisse à garantir */ gint y; /* Ordonnée à garantir */ @@ -476,8 +476,12 @@ void gtk_view_panel_scroll_to_address(GtkViewPanel *panel, vmpa_t addr) GtkAdjustment *adj; /* Défilement à mettre à jour */ double limit; /* Limite à ne pas dépasser */ + + /* if (panel->define != NULL) panel->define(panel, addr); + */ + if (panel->get_coordinates(panel, addr, &x, &y)) { diff --git a/src/gtkext/gtkviewpanel.h b/src/gtkext/gtkviewpanel.h index 5867634..c8d0f6c 100644 --- a/src/gtkext/gtkviewpanel.h +++ b/src/gtkext/gtkviewpanel.h @@ -75,7 +75,7 @@ GLoadedBinary *gtk_view_panel_get_binary(const GtkViewPanel *); bool gtk_view_panel_contain_address(const GtkViewPanel *, vmpa_t); /* S'assure qu'une adresse donnée est visible à l'écran. */ -void gtk_view_panel_scroll_to_address(GtkViewPanel *, vmpa_t); +void gtk_view_panel_scroll_to_address(GtkViewPanel *, const vmpa2t *); /* Place en cache un rendu destiné à l'aperçu graphique rapide. */ void gtk_view_panel_cache_glance(GtkViewPanel *, cairo_t *, const GtkAllocation *, double); diff --git a/src/gui/menus/edition.c b/src/gui/menus/edition.c index 5e7b003..fc23f49 100644 --- a/src/gui/menus/edition.c +++ b/src/gui/menus/edition.c @@ -91,7 +91,7 @@ static void mcb_edition_goto(GtkMenuItem *menuitem, GMenuBar *bar) { GObject *ref; /* Espace de référencements */ GtkWidget *dialog; /* Boîte de dialogue à montrer */ - vmpa_t addr; /* Adresse de destination */ + vmpa2t *addr; /* Adresse de destination */ GtkViewPanel *vpanel; /* Afficheur effectif de code */ ref = g_editor_item_get_global_ref(G_EDITOR_ITEM(bar)); @@ -104,6 +104,8 @@ static void mcb_edition_goto(GtkMenuItem *menuitem, GMenuBar *bar) vpanel = g_editor_item_get_current_view(G_EDITOR_ITEM(bar)); gtk_view_panel_scroll_to_address(vpanel, addr); + delete_vmpa(addr); + } gtk_widget_destroy(dialog); -- cgit v0.11.2-87-g4458