menu item не активна, когда указываешь action
появляется popover menu, но выбрать item не могу. не могу найти правильного решения в документации.
#include <gtk/gtk.h>
GtkApplication *app;
static void window_destroy_cb ( GtkWidget *window, gpointer data ) {
( void ) data;
g_application_quit ( ( GApplication * ) app );
exit ( EXIT_SUCCESS );
}
static void action_test_activate_cb ( GSimpleAction *action, GVariant *parameter, gpointer data ) {
g_application_quit ( ( GApplication * ) app );
exit ( EXIT_SUCCESS );
}
static void action_new_file_cb ( GSimpleAction *simple, GVariant *parameter, gpointer data ) {
g_application_quit ( ( GApplication * ) app );
exit ( EXIT_SUCCESS );
}
static GSimpleActionGroup *create_actions ( ) {
const GActionEntry entries[] = {
{ "action_new_file", action_new_file_cb }
};
GSimpleActionGroup *group;
group = g_simple_action_group_new ( );
g_action_map_add_action_entries ( ( GActionMap * ) group, entries, G_N_ELEMENTS ( entries ), NULL );
return group;
}
static void app_activate_cb ( GtkApplication *app, gpointer data ) {
( void ) data;
GtkWidget *widget_window = gtk_application_window_new ( app );
g_signal_connect ( widget_window, "destroy", G_CALLBACK ( window_destroy_cb ), NULL );
GSimpleActionGroup *g_action_group = create_actions ( );
GMenu *gmenu_menu = g_menu_new ( );
g_menu_append ( gmenu_menu, "Создать файл", "action_new_file" );
GtkWidget *widget_menu = gtk_menu_button_new ( );
GtkWidget *widget_popover = gtk_popover_new_from_model ( widget_menu, ( GMenuModel * ) gmenu_menu );
gtk_menu_button_set_popover ( ( GtkMenuButton * ) widget_menu, widget_popover );
GtkWidget *widget_header = gtk_header_bar_new ( );
gtk_header_bar_set_title ( ( GtkHeaderBar * ) widget_header, "db_network_guard" );
gtk_header_bar_set_show_close_button ( ( GtkHeaderBar * ) widget_header, TRUE );
gtk_header_bar_set_decoration_layout ( ( GtkHeaderBar * ) widget_header, "menu:minimize,maximize,close" );
gtk_header_bar_pack_end ( ( GtkHeaderBar * ) widget_header, widget_menu );
gtk_window_set_titlebar ( ( GtkWindow * ) widget_window, widget_header );
gtk_widget_show_all ( widget_window );
}
int main ( int argc, char **argv ) {
app = gtk_application_new ( "org.xverizex.db_nguard", G_APPLICATION_FLAGS_NONE );
g_application_register ( ( GApplication * ) app, NULL, NULL );
g_signal_connect ( app, "activate", G_CALLBACK ( app_activate_cb ), NULL );
return g_application_run ( ( GApplication * ) app, argc, argv );
}
Ответы (1 шт):
Автор решения: xverizex
→ Ссылка
наконецто нашел в чем дело. У action_map должно быть окно. и указывать в меню действия как win.action.
static GActionEntry entries[] = {
{ "action_new_file", action_new_file_cb, NULL, NULL, NULL }
};
static void create_actions ( GtkWidget *window ) {
g_action_map_add_action_entries ( ( GActionMap * ) window, entries, G_N_ELEMENTS ( entries ), NULL );
}
static void app_activate_cb ( GtkApplication *app, gpointer data ) {
( void ) data;
GtkWidget *widget_window = gtk_application_window_new ( app );
g_signal_connect ( widget_window, "destroy", G_CALLBACK ( window_destroy_cb ), NULL );
create_actions ( widget_window );
GMenu *gmenu_menu = g_menu_new ( );
g_menu_append ( gmenu_menu, "Создать файл", "win.action_new_file" );
gtk_application_set_app_menu ( app, ( GMenuModel * ) gmenu_menu );
GtkWidget *widget_menu = gtk_menu_button_new ( );