From 8e0ef0fdbdb39c51c496a4c0fd80daf0bc080dab Mon Sep 17 00:00:00 2001 From: Jean Sirmai Date: Fri, 19 Jul 2024 10:54:32 +0200 Subject: [PATCH] =?UTF-8?q?Renommage=20+=20cleaning=20apr=C3=A8s=20audit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- To discuss (after audit).txt | 9 -- include/widget.h | 18 +-- src/fsm.c | 9 +- src/main.c | 236 +++-------------------------------- src/signal.c | 24 ++-- src/widget/labo.c | 21 ---- src/widget/topbar.c | 40 +++--- 7 files changed, 70 insertions(+), 287 deletions(-) delete mode 100644 To discuss (after audit).txt diff --git a/To discuss (after audit).txt b/To discuss (after audit).txt deleted file mode 100644 index d485d78..0000000 --- a/To discuss (after audit).txt +++ /dev/null @@ -1,9 +0,0 @@ -les fonctions commençant par get devraient renvoyer des valeurs et non pas des widgets -> "get_..." remplacé par "rec_..." pour les widgets -> "set_..." remplacé par "fix_..." pour les widgets - -ne pas utiliser la taille de fenêtre comme comme référence -> corrigé - - - diff --git a/include/widget.h b/include/widget.h index 6d39219..2d9279d 100644 --- a/include/widget.h +++ b/include/widget.h @@ -35,19 +35,19 @@ /* W I N D O W S */ /******************************************************************************/ -void widget_head_fix_MAIN_WINDOW (GtkApplication *app); -void widget_head_fix_DIALOG_WINDOW (GtkApplication *app); -void widget_head_fix_TEXT_WINDOW (GtkApplication *app); +void widget_topbar_fix_MAIN_WINDOW (GtkApplication *app); +void widget_topbar_fix_DIALOG_WINDOW (GtkApplication *app); +void widget_topbar_fix_TEXT_WINDOW (GtkApplication *app); -void widget_head_MAIN_WINDOW_design (GtkWindow *main_window); -void widget_head_DIALOG_WINDOW_design (GtkWindow *main_window, +void widget_topbar_MAIN_WINDOW_design (GtkWindow *main_window); +void widget_topbar_DIALOG_WINDOW_design (GtkWindow *main_window, GtkWindow *dialog_window); -void widget_head_TEXT_WINDOW_design (GtkWindow *main_window, +void widget_topbar_TEXT_WINDOW_design (GtkWindow *main_window, GtkWindow *text_window); -GtkWindow *widget_head_rec_MAIN_WINDOW(); -GtkWindow *widget_head_rec_DIALOG_WINDOW(); -GtkWindow *widget_head_rec_TEXT_WINDOW(); +GtkWindow *widget_topbar_rec_MAIN_WINDOW(); +GtkWindow *widget_topbar_rec_DIALOG_WINDOW(); +GtkWindow *widget_topbar_rec_TEXT_WINDOW(); /******************************************************************************/ diff --git a/src/fsm.c b/src/fsm.c index 70e9f3b..e03964c 100644 --- a/src/fsm.c +++ b/src/fsm.c @@ -90,7 +90,8 @@ int fsm_get_STATE_RULES_DATA () {return choice_STATE_RULES_DATA;} int fsm_get_OBJECTS_box_RESET_VALUE () {return choice_OBJECTS_box_RESET_VALUE;} int fsm_get_SITUATIONS_box_RESET_VALUE () {return choice_SITUATIONS_box_RESET_VALUE;} -static char *fsm_get_str_EXEC_EDIT (int value) { +static char *fsm_get_str_EXEC_EDIT (int value) +{ switch (value) { case (EXEC) : return "EXEC"; case (EDIT) : return "EDIT"; @@ -98,7 +99,8 @@ static char *fsm_get_str_EXEC_EDIT (int value) { } } -static char *fsm_get_str_STATE_RULES_DATA (int value) { +static char *fsm_get_str_STATE_RULES_DATA (int value) +{ switch (value) { case (STATE) : return "STATE"; case (RULES) : return "RULES"; @@ -107,7 +109,8 @@ static char *fsm_get_str_STATE_RULES_DATA (int value) { } } -static void debug_printing (int value, int sub_automaton) { +static void debug_printing (int value, int sub_automaton) +{ switch (sub_automaton) { // sub_automaton 0 is EXEC_EDIT and // sub_automaton 1 is STATE_RULES_DATA case (0) : printf("switch %5s x %5s > %5s x %5s\n", diff --git a/src/main.c b/src/main.c index bba9887..d041641 100644 --- a/src/main.c +++ b/src/main.c @@ -32,75 +32,39 @@ #include "../include/signal.h" -/* Comment renommer les fonctions ? - * Cette question dépend de plusieurs choix - * nécessairement provisoires mais nécessaires. - * - * - * > Sur quel modèle se guider pour organiser le client gem-graph ? - * Comment l'adapter ? Que faut-il garder ? Que faut-il améliorer ? +/* Sur quel modèle se guider pour structurer le client gem-graph ? * https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmodel * https://en.wikipedia.org/wiki/Multitier_architecture * - * > Quelles structures sont suffisamment individualisées dès aujourd'hui, - * ou ont un développement suffisamment prévisible (modules, interfaces) - * pour qu'on puisse décider de les renommer - * (et comment classer et nommer les autres) ? + * Le nom de toute fonction qui peut être appelée d'un autre module doit comporter : + * - 1) le nom du module auquel elle appartient (widget, graphics, parse,...) + * - 2) une indication sur son action (get, set, rec, fix, create, add,...) + * - 3) une indication sur l'objet de cette action (STATE, RULES, STACK,...) * - * > Comment rendre "human-readable" des noms d'un langage "machine-readable" ? - * - * _________________ - * - * >>> Nous avons à nous choisir des règles de renommage des fonctions - * qui soient conformes aux 'bonnes pratiques' du 'génie logiciel' - * ET soient les plus pertinentes possibles pour notre cas particulier. - * (interrompu le 2024-07-09 à 23h00) - * - * - * >>> Proposition : Toute fonction utilisée par un autre module doit - * - commencer D'ABORD par le nom de ce module, - * - indiquer ENSUITE sa nature (get, set, print,...) - * - et ENFIN son objet (STATE, RULES, STACK,...) - * - * ex: widget_get_RULES_page() - * automat_set_STATE_RULES_DATA() - * on_save_CURRENT_MODEL() + * ex: on_save_CURRENT_MODEL() * model_get_DIM_VALUE() - * model_get_NEXT_ARROW() - * area_get_GRAPH_STACK() ou graph_get_GRAPH_STACK() * - * 'model' == parse ('model' est un alias de 'parse') - * 'graph' == area ('graph' est un alias de 'area') - * 'on_' == callback ('on_' est un alias de 'callbacks') - * Ainsi, TOUS les callbacks sont dans le fichier 'src/callbacks.c' - * Leur nom commence TOUJOURS par: 'on_' - * ET AUCUN AUTRE nom de fonction ne commence par 'on_'. - * - * - * > selon ces règles, get_user_tree_model() - * devrait être renommé : tree_get_USER_TREE_MODEL() - * - * > si, comme c'est prévisible, 'state.c' devient un dossier contenant : - * les fichiers 'controls.c', 'camera.c', 'contrasts.c' et d'autres, - * alors, get_ZOOM_box() - * devrait être renommé : state_camera_get_ZOOM_box() + * Il est prévisible que 'state.c' devienne un dossier contenant + * les fichiers 'controls.c', 'camera.c', 'contrasts.c' et d'autres, + * Une fonction comme : get_ZOOM_box() + * devra alors être renommé : state_camera_get_ZOOM_box() (par exemple) * * _________________ * * - * QUELLE EST L'ORGANISATION ACTUELLE ? + * ORGANISATION ACTUELLE * * 1) Les structures hiérarchiques. * -------------------------------- * - * La description de l'aspect (du 'design') des fenêtres - * se trouve dans le dossier 'widget.c' - * et s'organise naturellement sur le même modèle : en arborescence - * qu'il sera facile de répartir en dossiers et fichiers - * au fur à mesure de leur développement. + * La description du 'design' des fenêtres se trouve dans le dossier 'widget' + * et s'organise naturellement en arborescence, comme les widgets eux-mêmes. + * + * Il sera donc facile de répartir cette description en dossiers et fichiers + * au fur à mesure de son développement. * * Actuellement, par exemple, la fenêtre principale comporte : - * > une barre de titre (décrite dans 'headers.c') et + * > une barre de titre (décrite dans 'topbar') et * > un widget 'child' (la partie sous la barre de titre) * qui peut prendre au moins trois apparences différentes : * - STATE (montre l'état de l'espace et les commandes associées) @@ -119,44 +83,16 @@ * des fichiers (ou des dossiers si besoin) et ainsi de suite... * * - * Dans cette logique, - * sauf s'il y a d'autres arbres que l'arbre des utilisateurs, - * l'actuel ficher 'tree.c' devrait être - * soit inclus dans le fichier 'rules.c' - * (puisque cet arbre est dans la page (le widget) 'rules') - * soit, s'il est trop volumineux, et pour faciliter la lisibilité, - * dans un dossier 'rules.c' (ou 'rules' ?) - * qui regroupera les différents widgets du widget 'rules'. - * - * NB Il est possible qu'il y ait besoin d'autres structures d'arbres: - * dans 'rules', par exemple, il est important de pouvoir visualiser - * l'utilisation (l'activité) des différentes règles - * ou de différents groupes de règles. - * Et donc de disposer d'un ou de plusieurs index vers ces règles. - * - * - * Tous les callbacks sont dans le fichier 'src/callbacks.c' - * et leur nom commence par: 'on_' - * (aucun autre nom de fonction ne commence par 'on_') ('on_' est un alias). - * - * S'ils deviennent trop nombreux, ils seront répartis - * dans des fichiers regroupés dans un dossier: 'src/callbacks.c'. - * (ou 'src/callbacks' ?) - * La description des fonctions devrait plutôt précéder ces fonctions - * pour alléger le fichier 'callbacks.h' (?) - * - * * 2) Les structures transversales. * -------------------------------- * - * Les fonctions 'transversales' comme celles de - * 'graph' 'parse', possiblement 'tree' mais - surtout - 'automat', + * Les fonctions 'transversales' comme celles de 'graphics' 'parse', 'fsm', * doivent pouvoir être accédées directement * sans avoir à passer par la hiérarchie des widgets et/ou callbacks. * Elles restent à la racine: 'src/ * * - * 'state machine' ou 'automat' va centraliser l'identification + * 'finite state machine' ('fsm') va centraliser l'identification * des états (apparences) de la fenêtre et des transitions entre ces apparences; * Elle sera probablement décomposée en de nombreux 'sous-automates' * tels que chaque état de la fenêtre soit une combinaison unique @@ -175,10 +111,6 @@ * - analyses de données... * * - * 'parse' et 'read_file (char *filename)' qui se trouve dans 'base.h' - * font vraisemblablement partie d'un seul ensemble 'entrées / sorties' - * - * * Les préférences des utilisateurs devront être prises en compte. * Leur recueil et leur mémorisation seront probablement des fonctions centrales * mais leur mise en oeuvre suivra probalement les voies hiérarchiques. @@ -192,143 +124,13 @@ * * * - * - * - * - * - * - * - ******************************************************************************* - * L I S T E D E S F O N C T I O N S A R E N O M M E R * - * ***************************************************************************** - * - * Ces fonctions peuvent être énumérées selon leur source ou leur destination. - * Il y a, en tout, à ce jour : - * - (86) fonctions appelées (dont 6 data) - * - (m) appels de fonction - * - (e) enum - * - (s) struct - * - (d) define - * - * NB Seules les fonctions spécifiques de gem-graph-client sont prises en compte. - * Les fonctions 'static' ne sont pas comptées. - * - * (déplacer systématiquement les enum, struct, size_t, etc. vers les include ?) - * - * - * ******************************************************************************* * L I S T E D E S F O N C T I O N S A P P E L É E S * * ***************************************************************************** - * (interrompu le 2024-07-09 à 23h00) - * - * main 1 - * callbacks 18 - * automat 8 + 2 enum - * parse 8 - * 35 - * - * graph / area 11 + 1 struct + 1 size_t - * graph / stack 3 + 1 struct + 2 size_t + 1 int - * graph / draw 5 - * graph / grid 4 - * graph / init 2 - * graph / shader.frag 1 - * graph / shader.vert 1 - * 27 - * - * widget / heads 10 - * widget / rules 1 - * widget / state 1 - * widget / stock 2 - * widget / tree 2 + 1 struct - * widget / labo 1 - * 17 - * - * data / image 5 - * data / text 2 - * - * TOTAL 86 - * - * Tous les fonctions appelées par les fonctions callback() sont dans 'widgets.h' - * SAUF les 8 suivantes qui concernent la 'state machine' et qui sont dans 'automat.h' : - - * set_EXEC_EDIT() get_EXEC_EDIT() - * set_STATE_RULES_DATA() get_STATE_RULES_DATA() - * set_OBJECTS_box_RESET_VALUE() get_OBJECTS_box_RESET_VALUE() - * set_SITUATIONS_box_RESET_VALUE() get_SITUATIONS_box_RESET_VALUE() - * - * - * Les autres fonctions appelées par les fonctions callback() sont : - * - * widget_head_MAIN_WINDOW_design() - * widget_head_DIALOG_WINDOW_design() - * widget_head_TEXT_WINDOW_design() - * - * - * Widgets.c appelle : - * - * on_bind_user_tree_factory() - * on_axis_value_change() - * graph_update_axis_stack() - * - *..... - * - * - * * ******************************************************************************* * L I S T E D E S A P P E L S D E F O N C T I O N S * * ***************************************************************************** - * grep -r "set_EXEC_EDIT" | wc > 5 lignes - * mais il n'y a que 2 appels des fonctions - * - * NB vérifier que tous les accès aux variables - * passent systématiquement par les get / set. (en utilisant 'static') - * - * - * - * - QUOI - - COMBIEN - D'OÙ - - * - * - * on_windows_activation 1 main - * - * - * get_EXEC_EDIT 1 callbacks - * 1 widget / state - * - * set_EXEC_EDIT 2 callbacks - * - * get_STATE_RULES_DATA 1 callbacks - * - * set_STATE_RULES_DATA 3 callbacks - * - * get_OBJECTS_box_RESET_VALUE 1 automat - * - * set_OBJECTS_box_RESET_VALUE 1 callbacks - * - * get_SITUATIONS_box_RESET_VALUE 1 automat - * - * set_SITUATIONS_box_RESET_VALUE 1 callbacks - * - *..... - * - * - * - * - * (interrompu le 2024-07-09 à 23h00) - * - * - * - * - * - * - * Faut-il déplacer systématiquement les enum, struct, size_t, etc. - * vers les include ? - * - * - * - * */ diff --git a/src/signal.c b/src/signal.c index b43d0fd..38d85d8 100644 --- a/src/signal.c +++ b/src/signal.c @@ -64,14 +64,14 @@ static void on_auto_notification (const char *message) void on_windows_activation (GtkApplication *app, gpointer no_user_data) { - widget_head_fix_MAIN_WINDOW (app); - widget_head_MAIN_WINDOW_design (widget_head_rec_MAIN_WINDOW()); + widget_topbar_fix_MAIN_WINDOW (app); + widget_topbar_MAIN_WINDOW_design (widget_topbar_rec_MAIN_WINDOW()); - widget_head_fix_DIALOG_WINDOW (app); - widget_head_DIALOG_WINDOW_design (widget_head_rec_MAIN_WINDOW(), widget_head_rec_DIALOG_WINDOW()); + widget_topbar_fix_DIALOG_WINDOW (app); + widget_topbar_DIALOG_WINDOW_design (widget_topbar_rec_MAIN_WINDOW(), widget_topbar_rec_DIALOG_WINDOW()); - widget_head_fix_TEXT_WINDOW (app); - widget_head_TEXT_WINDOW_design (widget_head_rec_MAIN_WINDOW(), widget_head_rec_TEXT_WINDOW()); + widget_topbar_fix_TEXT_WINDOW (app); + widget_topbar_TEXT_WINDOW_design (widget_topbar_rec_MAIN_WINDOW(), widget_topbar_rec_TEXT_WINDOW()); } @@ -251,17 +251,17 @@ static void switch_STATE_RULES_DATA() switch (fsm_get_STATE_RULES_DATA()) { case (STATE) : - gtk_window_set_child (widget_head_rec_MAIN_WINDOW(), + gtk_window_set_child (widget_topbar_rec_MAIN_WINDOW(), GTK_WIDGET (widget_rec_STATE_page())); break; case (RULES) : - gtk_window_set_child (widget_head_rec_MAIN_WINDOW(), + gtk_window_set_child (widget_topbar_rec_MAIN_WINDOW(), GTK_WIDGET (widget_rec_RULES_page())); break; case (DATA) : - gtk_window_set_child (widget_head_rec_MAIN_WINDOW(), + gtk_window_set_child (widget_topbar_rec_MAIN_WINDOW(), GTK_WIDGET (widget_rec_STOCK_page())); break; @@ -284,7 +284,7 @@ void on_toggle_EXEC_EDIT (GtkWidget *toggled_button, gpointer user_data) "text-editor-symbolic"); // https://docs.gtk.org/gtk4/class.Window.html TODO 2024-06-30 - // gtk_window_present (GTK_WINDOW (widget_head_rec_DIALOG_WINDOW())); // works once only ! + // gtk_window_present (GTK_WINDOW (widget_topbar_rec_DIALOG_WINDOW())); // works once only ! fsm_set_EXEC_EDIT (EDIT); } @@ -350,14 +350,14 @@ void on_SITUATIONS_box_DO_RESET (GtkWidget *btt_reset, gpointer data) void on_clicked_search (GtkWidget *btt_menu, gpointer list_box) { // next line presents the text_window and works only once.\nIt should present a menu.\n"); // TODO - gtk_window_present (GTK_WINDOW (widget_head_rec_TEXT_WINDOW())); + gtk_window_present (GTK_WINDOW (widget_topbar_rec_TEXT_WINDOW())); } void on_clicked_HOME (GtkWidget *btt_reset, gpointer data) { printf ("callback.on_clicked_HOME() button presents the dialog_window\ ( :- ) but it works only once.\n"); // TODO - gtk_window_present (GTK_WINDOW (widget_head_rec_DIALOG_WINDOW())); + gtk_window_present (GTK_WINDOW (widget_topbar_rec_DIALOG_WINDOW())); } diff --git a/src/widget/labo.c b/src/widget/labo.c index 6730b07..b16473b 100644 --- a/src/widget/labo.c +++ b/src/widget/labo.c @@ -54,24 +54,6 @@ /* E X P E R I M E N T A L A R E A */ /******************************************************************************/ - -static void *user_data_free_func() {return NULL;} - -void learning_how_to_create_a_menu (GtkMenuButton* menu_button) { // Je veux que ce bouton ouvre un menu. - -// GtkWidget ex = *gtk_menu_bar_new(); - - GtkWidget* list_box = gtk_list_box_new (); - gtk_list_box_append (GTK_LIST_BOX (menu_button), GTK_WIDGET (list_box)); - gtk_list_box_bind_model (GTK_LIST_BOX (list_box), - NULL, // GListModel* model, - NULL, // GtkListBoxCreateWidgetFunc create_widget_func, - NULL, // gpointer user_data, - (*user_data_free_func) (NULL) // GDestroyNotify user_data_free_func - ); - - gtk_menu_button_set_child (menu_button, list_box); - // https://docs.gtk.org/gtk4/class.ListView.html // https://toshiocp.github.io/Gtk4-tutorial/sec29.html // https://blog.gtk.org/2020/06/07/scalable-lists-in-gtk-4/ @@ -79,9 +61,6 @@ void learning_how_to_create_a_menu (GtkMenuButton* menu_button) { // Je veux qu // https://docs.gtk.org/gtk4/class.MenuButton.html // https://web.mit.edu/barnowl/share/gtk-doc/html/gobject/gobject-Signals.html // https://docs.gtk.org/gio/class.MenuModel.html#a-menu-example -} - - diff --git a/src/widget/topbar.c b/src/widget/topbar.c index 243fd8a..1900e0c 100644 --- a/src/widget/topbar.c +++ b/src/widget/topbar.c @@ -43,17 +43,17 @@ static GtkWindow *main_window, *dialog_window, *text_window; static GtkButton *btt_STATE, *btt_RULES, *btt_DATA; -GtkWindow *widget_head_rec_MAIN_WINDOW() { return main_window; } -GtkWindow *widget_head_rec_DIALOG_WINDOW() { return dialog_window; } -GtkWindow *widget_head_rec_TEXT_WINDOW() { return text_window; } +GtkWindow *widget_topbar_rec_MAIN_WINDOW() { return main_window; } +GtkWindow *widget_topbar_rec_DIALOG_WINDOW() { return dialog_window; } +GtkWindow *widget_topbar_rec_TEXT_WINDOW() { return text_window; } -void widget_head_fix_MAIN_WINDOW (GtkApplication *app) +void widget_topbar_fix_MAIN_WINDOW (GtkApplication *app) { main_window = GTK_WINDOW (gtk_application_window_new (app)); } -void widget_head_fix_DIALOG_WINDOW (GtkApplication *app) +void widget_topbar_fix_DIALOG_WINDOW (GtkApplication *app) { dialog_window = GTK_WINDOW (gtk_application_window_new (app)); } -void widget_head_fix_TEXT_WINDOW (GtkApplication *app) +void widget_topbar_fix_TEXT_WINDOW (GtkApplication *app) { text_window = GTK_WINDOW (gtk_application_window_new (app)); } @@ -62,7 +62,7 @@ void widget_head_fix_TEXT_WINDOW (GtkApplication *app) /* T E X T W I N D O W */ /******************************************************************************/ -void widget_head_TEXT_WINDOW_design (GtkWindow *main_window, GtkWindow *text_window) +void widget_topbar_TEXT_WINDOW_design (GtkWindow *main_window, GtkWindow *text_window) { char *title = " Learn more about Gem Graph. "; GtkWidget *header_bar = GTK_WIDGET (gtk_header_bar_new ()); @@ -85,7 +85,7 @@ void widget_head_TEXT_WINDOW_design (GtkWindow *main_window, GtkWindow *text_win /* D I A L O G W I N D O W */ /******************************************************************************/ -void widget_head_DIALOG_WINDOW_design (GtkWindow *main_window, GtkWindow *dialog_window) +void widget_topbar_DIALOG_WINDOW_design (GtkWindow *main_window, GtkWindow *dialog_window) { char *title = " Save the current model before modifying it? "; GtkWidget *header_bar = GTK_WIDGET (gtk_header_bar_new ()); @@ -129,7 +129,8 @@ static GtkWidget *window_header_bar (GtkWindow *window); static void window_header_bar_left (GtkWidget *header_bar); static void window_header_bar_right (GtkWidget *header_bar); -void widget_head_MAIN_WINDOW_design (GtkWindow *main_window){ +void widget_topbar_MAIN_WINDOW_design (GtkWindow *main_window) +{ GtkWidget *header_bar = window_header_bar (main_window); window_header_bar_left (header_bar); window_header_bar_right (header_bar); @@ -213,13 +214,18 @@ static void window_header_bar_right (GtkWidget *header_bar) + + + +// https://discourse.gnome.org/t/when-do-we-really-have-to-use-gtk-popover-present-to-show-a-popover-at-a-given-widget/17566/5 +// https://stackoverflow.com/questions/69135934/creating-a-simple-menubar-menu-and-menu-item-in-c-using-gtk4 + + GtkWidget* list_box = gtk_list_box_new(); GtkWidget *label_A = GTK_WIDGET (gtk_label_new("A")); gtk_list_box_append (GTK_LIST_BOX (list_box), label_A); GtkWidget *label_B = GTK_WIDGET (gtk_label_new("B")); gtk_list_box_append (GTK_LIST_BOX (list_box), label_B); GtkWidget *label_C = GTK_WIDGET (gtk_label_new("C")); gtk_list_box_append (GTK_LIST_BOX (list_box), label_C); -// gtk_menu_item_activate (label_C); -// https://discourse.gnome.org/t/when-do-we-really-have-to-use-gtk-popover-present-to-show-a-popover-at-a-given-widget/17566/5 GtkWidget *pop = gtk_popover_new (); gtk_popover_set_child (GTK_POPOVER (pop), list_box); gtk_popover_present (GTK_POPOVER (pop)); @@ -227,22 +233,24 @@ static void window_header_bar_right (GtkWidget *header_bar) gtk_popover_set_cascade_popdown (GTK_POPOVER (pop), TRUE); GtkMenuButton *open_menu = GTK_MENU_BUTTON (gtk_menu_button_new ()); -// gtk_menu_button_popup (open_menu); gtk_menu_button_popdown (open_menu); gtk_menu_button_set_icon_name (open_menu, "open-menu-symbolic"); gtk_menu_button_set_always_show_arrow (open_menu, TRUE); gtk_menu_button_set_popover (open_menu, GTK_WIDGET (pop)); gtk_header_bar_pack_end (GTK_HEADER_BAR (header_bar), GTK_WIDGET (open_menu)); -// https://stackoverflow.com/questions/69135934/creating-a-simple-menubar-menu-and-menu-item-in-c-using-gtk4 GSimpleAction *act_connect = g_simple_action_new("connect", NULL); -// g_action_map_add_action(G_ACTION_MAP(app), G_ACTION(act_connect)); g_signal_connect(act_connect, "activate", G_CALLBACK(connect), NULL); -// GMenuItem *label_E = g_menu_item_new("connect", "app.connect"); + g_signal_connect (open_menu, "activate", G_CALLBACK (on_clicked_menu_experiment), list_box); + + +// gtk_menu_button_popup (open_menu); gtk_menu_button_popdown (open_menu); +// gtk_menu_item_activate (label_C); +// g_action_map_add_action(G_ACTION_MAP(app), G_ACTION(act_connect)); +// GMenuItem *label_E = g_menu_item_new("connect", "app.connect"); // gtk_list_box_append (GTK_LIST_BOX (list_box), GTK_WIDGET (label_E)); - g_signal_connect (open_menu, "activate", G_CALLBACK (on_clicked_menu_experiment), list_box);