From 5acd4ab2dd059c81a333ed630686f6aa78f38a1e Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Thu, 25 Oct 2018 00:18:23 +0200 Subject: Created bookmarks using a Glade UI. --- src/gui/dialogs/Makefile.am | 1 + src/gui/dialogs/bookmark.c | 275 ++++++------------------------------------ src/gui/dialogs/bookmark.h | 4 +- src/gui/dialogs/bookmark.ui | 106 ++++++++++++++++ src/gui/dialogs/gresource.xml | 3 +- src/gui/dialogs/identity.ui | 21 ++-- src/gui/menus/edition.c | 12 +- 7 files changed, 168 insertions(+), 254 deletions(-) create mode 100644 src/gui/dialogs/bookmark.ui diff --git a/src/gui/dialogs/Makefile.am b/src/gui/dialogs/Makefile.am index 77b97ac..bfda8ad 100644 --- a/src/gui/dialogs/Makefile.am +++ b/src/gui/dialogs/Makefile.am @@ -5,6 +5,7 @@ noinst_LTLIBRARIES = libguidialogs.la UI_FILES = \ binadmin.ui \ + bookmark.ui \ identity.ui libguidialogs_la_SOURCES = \ diff --git a/src/gui/dialogs/bookmark.c b/src/gui/dialogs/bookmark.c index b10a601..08df391 100644 --- a/src/gui/dialogs/bookmark.c +++ b/src/gui/dialogs/bookmark.c @@ -24,250 +24,77 @@ #include "bookmark.h" -#include -#include - - -#include - - #include "../../analysis/db/items/bookmark.h" -#include "../../gtkext/easygtk.h" - -/* Filtre les adresses en hexadécimal pendant l'édition. */ -static void filter_addresses(GtkEntry *, const gchar *, gint, gint *, gpointer); -/* Clôture l'édition d'une adresse. */ -static void validate_addresses(GtkEntry *, GtkDialog *); +/* Clôture l'édition d'un signet. */ +static void validate_address(GtkEntry *entry, GtkDialog *); /****************************************************************************** * * -* Paramètres : entry = composant GTK concerné par la procédure. * -* text = nouveau texte inséré. * -* length = taille de ce texte. * -* position = point d'insertion. * -* data = adresse non utilisée ici. * +* Paramètres : parent = fenêtre parente à surpasser. * +* outb = constructeur à détruire après usage. [OUT] * * * -* Description : Filtre les adresses en hexadécimal pendant l'édition. * +* Description : Construit la fenêtre de création de signet. * * * -* Retour : - * +* Retour : Adresse de la fenêtre mise en place. * * * * Remarques : - * * * ******************************************************************************/ -static void filter_addresses(GtkEntry *entry, const gchar *text, gint length, gint *position, gpointer data) +GtkWidget *create_bookmark_dialog(GtkWindow *parent, GtkBuilder **outb) { - gboolean has_hex; /* Préfixe '0x' déjà présent ? */ - gchar *filtered; /* Contenu nouveau approuvé */ - gint count; /* Nouvelle taille validée */ - gint i; /* Boucle de parcours */ - - /** - * On cherche à empêcher l'édition avant un '0x' présent, - * ce qui viendrait fausser le fitrage. - */ - has_hex = g_str_has_prefix(gtk_entry_get_text(entry), "0x"); - - filtered = g_new(gchar, length); - - count = 0; - - for (i = 0; i < length; i++) - switch (text[i]) - { - case '0' ... '9': - case 'a' ... 'f': - if (!has_hex || ((i + *position) >= 2)) - filtered[count++] = text[i]; - break; - case 'A' ... 'F': - if (!has_hex || ((i + *position) >= 2)) - filtered[count++] = tolower(text[i]); - break; - case 'x': - case 'X': - if ((i + *position) == 1) - filtered[count++] = 'x'; - break; - } - - if (count > 0) - { - g_signal_handlers_block_by_func(G_OBJECT(entry), G_CALLBACK(filter_addresses), data); - gtk_editable_insert_text(GTK_EDITABLE(entry), filtered, count, position); - g_signal_handlers_unblock_by_func(G_OBJECT(entry), G_CALLBACK(filter_addresses), data); - } - - g_signal_stop_emission_by_name(G_OBJECT(entry), "insert_text"); - - g_free(filtered); + GtkWidget *result; /* Fenêtre à renvoyer */ + GtkBuilder *builder; /* Constructeur utilisé */ -} + builder = gtk_builder_new_from_resource("/org/chrysalide/gui/dialogs/bookmark.ui"); + *outb = builder; + result = GTK_WIDGET(gtk_builder_get_object(builder, "window")); -/****************************************************************************** -* * -* Paramètres : entry = composant GTK concerné par la procédure. * -* dialog = boîte de dialogue à valider. * -* * -* Description : Clôture l'édition d'une adresse. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ + gtk_window_set_transient_for(GTK_WINDOW(result), parent); -static void validate_addresses(GtkEntry *entry, GtkDialog *dialog) -{ - gtk_dialog_response(dialog, GTK_RESPONSE_OK); + /* Connexion des signaux */ + + gtk_builder_add_callback_symbols(builder, + "validate_address", G_CALLBACK(validate_address), + NULL); + + gtk_builder_connect_signals(builder, result); + + return result; } /****************************************************************************** * * -* Paramètres : parent = fenêtre parente à surpasser. * -* addr = localisation du point à consigner. * +* Paramètres : entry = composant GTK concerné par la procédure. * +* dialog = boîte de dialogue à valider. * * * -* Description : Construit la fenêtre de création de signet. * +* Description : Clôture l'édition d'un signet. * * * -* Retour : Adresse de la fenêtre mise en place. * +* Retour : - * * * * Remarques : - * * * ******************************************************************************/ -GtkWidget *create_bookmark_dialog(GtkWindow *parent, const vmpa2t *addr) +static void validate_address(GtkEntry *entry, GtkDialog *dialog) { - GtkWidget *result; /* Fenêtre à renvoyer */ - GtkWidget *dlgvbox; /* Zone principale de la boîte */ - GtkWidget *vbox; /* Support à construire #1 */ - GtkWidget *frame; /* Support avec encadrement */ - GtkWidget *sub_vbox; /* Support à construire #2 */ - GtkWidget *hbox; /* Support à construire #3 */ - GtkWidget *label; /* Message d'introduction */ - GtkWidget *entry; /* Zone de saisie principale */ - GtkWidget *radio; /* Définition de localisation */ - VMPA_BUFFER(target); /* Désignation humaine de cible*/ - - result = gtk_dialog_new(); - gtk_window_set_title(GTK_WINDOW(result), _("Add a bookmark")); - gtk_window_set_position(GTK_WINDOW(result), GTK_WIN_POS_CENTER); - gtk_window_set_type_hint(GTK_WINDOW(result), GDK_WINDOW_TYPE_HINT_DIALOG); - - gtk_window_set_transient_for(GTK_WINDOW(result), parent); - - dlgvbox = gtk_dialog_get_content_area(GTK_DIALOG(result)); - gtk_widget_show(dlgvbox); - - vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); - gtk_widget_show(vbox); - gtk_box_pack_start(GTK_BOX(dlgvbox), vbox, TRUE, TRUE, 0); - gtk_container_set_border_width(GTK_CONTAINER(vbox), 8); - - /* Localisation dans l'espace */ - - sub_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); - gtk_widget_show(sub_vbox); - - frame = qck_create_frame(_("Localisation"), sub_vbox, 8, 0, 12, 0); - gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0); - - /* 1) Adresse */ - - hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); - gtk_widget_show(hbox); - gtk_box_pack_start(GTK_BOX(sub_vbox), hbox, FALSE, TRUE, 0); - - label = qck_create_label(NULL, NULL, _("Target:")); - gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); - - entry = qck_create_entry(G_OBJECT(result), "addr", NULL); - //g_signal_connect(G_OBJECT(entry), "changed", G_CALLBACK(forbid_text_empty_entry), assistant); - gtk_box_pack_start(GTK_BOX(hbox), entry, FALSE, TRUE, 0); - - /* 2) Type d'adresse */ - - hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 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), "phys", _("Value is physical offset"), - NULL, NULL, NULL); - gtk_box_pack_start(GTK_BOX(hbox), radio, TRUE, TRUE, 0); - - radio = qck_create_radio_button(G_OBJECT(result), "virt", _("Value is virtual address"), - GTK_RADIO_BUTTON(radio), NULL, NULL); - gtk_box_pack_start(GTK_BOX(hbox), radio, TRUE, TRUE, 0); - - /* Commentaire éventuel */ - - entry = qck_create_entry(G_OBJECT(result), "comment", NULL); - - frame = qck_create_frame(_("Optional comment"), entry, 8, 0, 12, 0); - gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0); - - /* Zone de validation */ - - gtk_dialog_add_button(GTK_DIALOG(result), _("_Cancel"), GTK_RESPONSE_CANCEL); - gtk_dialog_add_button(GTK_DIALOG(result), _("_Ok"), GTK_RESPONSE_OK); - - /* Remplissage avec les valeurs fournies */ - - entry = GTK_WIDGET(g_object_get_data(G_OBJECT(result), "addr")); - - if (addr != NULL && has_virt_addr(addr)) - { - vmpa2_virt_to_string(addr, MDS_UNDEFINED, target, NULL); - radio = GTK_WIDGET(g_object_get_data(G_OBJECT(result), "virt")); - } - - else if (addr != NULL && has_phys_addr(addr)) - { - vmpa2_virt_to_string(addr, MDS_UNDEFINED, target, NULL); - radio = GTK_WIDGET(g_object_get_data(G_OBJECT(result), "virt")); - } - - else - radio = NULL; - - if (radio == NULL) - { - gtk_entry_set_text(GTK_ENTRY(entry), "0x"); - gtk_editable_set_position(GTK_EDITABLE(entry), -1); - gtk_widget_grab_focus(entry); - } - - else - { - gtk_entry_set_text(GTK_ENTRY(entry), target); - gtk_editable_set_position(GTK_EDITABLE(entry), -1); - - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio), TRUE); - - } - - if (radio != NULL) - { - entry = GTK_WIDGET(g_object_get_data(G_OBJECT(result), "comment")); - gtk_widget_grab_focus(entry); - } - - return result; + gtk_dialog_response(dialog, GTK_RESPONSE_OK); } /****************************************************************************** * * -* Paramètres : dialog = boîte de dialogue ayant reçu une validation. * +* Paramètres : builder = espace de référencement global. * +* addr = localisation du point à consigner. * * * * Description : Fournit le signet conçu via la saisie de l'utilisateur. * * * @@ -277,52 +104,24 @@ GtkWidget *create_bookmark_dialog(GtkWindow *parent, const vmpa2t *addr) * * ******************************************************************************/ -GDbItem *get_item_from_bookmark_dialog(GtkWidget *dialog) +GDbItem *get_item_from_bookmark_dialog(GtkBuilder *builder, const vmpa2t *addr) { GDbItem *result; /* Signet nouveau à retourner */ - GObject *ref; /* Espace de référencements */ - vmpa2t *orig; /* Copie de valeur originale */ - vmpa2t addr; /* Localisation finale utilisée*/ - GtkWidget *entry; /* Zone de saisie principale */ + GtkEntry *entry; /* Zone de saisie principale */ const gchar *text; /* Adresse en version texte */ - GtkToggleButton *radio; /* Définition de localisation */ - - ref = G_OBJECT(dialog); - - /* Si la valeur d'origine a été conservée intacte... */ - - orig = (vmpa2t *)g_object_get_data(ref, "orig"); - - if (orig == NULL) - { - entry = GTK_WIDGET(g_object_get_data(ref, "addr")); - text = gtk_entry_get_text(GTK_ENTRY(entry)); - - radio = GTK_TOGGLE_BUTTON(g_object_get_data(ref, "phys")); - - if (gtk_toggle_button_get_active(radio)) - orig = string_to_vmpa_phy(text); - else - orig = string_to_vmpa_virt(text); - - - - } - - copy_vmpa(&addr, orig); - delete_vmpa(orig); /* Récupération du commentaire éventuel */ - entry = GTK_WIDGET(g_object_get_data(ref, "comment")); - text = gtk_entry_get_text(GTK_ENTRY(entry)); + entry = GTK_ENTRY(gtk_builder_get_object(builder, "comment")); + + text = gtk_entry_get_text(entry); /* Mise en place du signet défini */ if (strlen(text) > 0) - result = G_DB_ITEM(g_db_bookmark_new(&addr, text)); + result = G_DB_ITEM(g_db_bookmark_new(addr, text)); else - result = G_DB_ITEM(g_db_bookmark_new(&addr, NULL)); + result = G_DB_ITEM(g_db_bookmark_new(addr, NULL)); return result; diff --git a/src/gui/dialogs/bookmark.h b/src/gui/dialogs/bookmark.h index 047f915..fb910bd 100644 --- a/src/gui/dialogs/bookmark.h +++ b/src/gui/dialogs/bookmark.h @@ -34,10 +34,10 @@ /* Construit la fenêtre de création de signet. */ -GtkWidget *create_bookmark_dialog(GtkWindow *, const vmpa2t *); +GtkWidget *create_bookmark_dialog(GtkWindow *, GtkBuilder **); /* Fournit le signet conçu via la saisie de l'utilisateur. */ -GDbItem *get_item_from_bookmark_dialog(GtkWidget *); +GDbItem *get_item_from_bookmark_dialog(GtkBuilder *, const vmpa2t *); diff --git a/src/gui/dialogs/bookmark.ui b/src/gui/dialogs/bookmark.ui new file mode 100644 index 0000000..85c026b --- /dev/null +++ b/src/gui/dialogs/bookmark.ui @@ -0,0 +1,106 @@ + + + + + + False + Add a bookmark + True + center-on-parent + 350 + dialog + + + False + vertical + 2 + + + False + 8 + end + + + Cancel + True + True + True + + + True + True + 0 + + + + + Ok + True + True + True + + + True + True + 1 + + + + + False + False + 0 + + + + + True + False + 4 + 4 + 4 + 4 + 0 + none + + + True + False + 12 + + + True + True + True + 8 + 8 + + + + + + + + True + False + Optional comment: + + + + + False + True + 1 + + + + + + button1 + button2 + + + + + + diff --git a/src/gui/dialogs/gresource.xml b/src/gui/dialogs/gresource.xml index d1ba8b6..4c2f30a 100644 --- a/src/gui/dialogs/gresource.xml +++ b/src/gui/dialogs/gresource.xml @@ -2,8 +2,7 @@ binadmin.ui - - + bookmark.ui identity.ui diff --git a/src/gui/dialogs/identity.ui b/src/gui/dialogs/identity.ui index f622a91..25d398f 100644 --- a/src/gui/dialogs/identity.ui +++ b/src/gui/dialogs/identity.ui @@ -1,5 +1,5 @@ - + @@ -7,7 +7,7 @@ False Identity True - center + center-on-parent 515 dialog @@ -87,12 +87,12 @@ 500 True False - 0 All the following information is used to create your authentication certifcate. This certificate grants you access to database servers and identifies each analysis change. <b>Warning: </b> updating this information drives to new signing requests for remote servers! True True + 0 0 @@ -104,8 +104,8 @@ True False - 1 Common name (required): + 1 0 @@ -142,8 +142,8 @@ True False - 1 Organisational unit: + 1 0 @@ -174,8 +174,8 @@ True False - 1 Organisation: + 1 0 @@ -199,8 +199,8 @@ True False - 1 Locality: + 1 0 @@ -231,8 +231,8 @@ True False - 1 State: + 1 0 @@ -243,8 +243,8 @@ True False - 1 Country (two letters): + 1 0 @@ -274,5 +274,8 @@ button1 button2 + + + diff --git a/src/gui/menus/edition.c b/src/gui/menus/edition.c index 04dd9df..1742616 100644 --- a/src/gui/menus/edition.c +++ b/src/gui/menus/edition.c @@ -678,6 +678,7 @@ static void mcb_edition_bookmarks_toggle(GtkMenuItem *menuitem, GMenuBar *bar) GDbCollection *collec; /* Collection à manipuler */ GDbItem *exist; /* Sens du basculement courant */ GObject *ref; /* Espace de référencements */ + GtkBuilder *builder; /* Constructeur utilisé */ GtkWidget *dialog; /* Boîte de dialogue à montrer */ GDbItem *bookmark; /* Nouveau signet défini */ gint ret; /* Retour de confirmation */ @@ -714,11 +715,14 @@ static void mcb_edition_bookmarks_toggle(GtkMenuItem *menuitem, GMenuBar *bar) 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) + dialog = create_bookmark_dialog(GTK_WINDOW(ref), &builder); + + ret = gtk_dialog_run(GTK_DIALOG(dialog)); + + if (ret == GTK_RESPONSE_OK) { - bookmark = get_item_from_bookmark_dialog(dialog); + bookmark = get_item_from_bookmark_dialog(builder, curloc); g_db_collection_wlock(G_DB_COLLECTION(collec)); @@ -744,6 +748,8 @@ static void mcb_edition_bookmarks_toggle(GtkMenuItem *menuitem, GMenuBar *bar) gtk_widget_destroy(dialog); + g_object_unref(G_OBJECT(builder)); + } g_object_unref(G_OBJECT(collec)); -- cgit v0.11.2-87-g4458