Hi, You do some async work? Read about: g_timeout_add_full();
and g_main_context_iteration(); You, can callback the to the UI forwarded event. I do something similar as reading a file from a different thread: http://git.savannah.nongnu.org/cgit/gsequencer.git/tree/ags/X/file/ags_simple_file.c?h=1.4.x#n1957 FYI: the UI thread shall run always by gtk_main(). Bests, Joël On Thu, Jan 25, 2018 at 11:10 PM, Alexander Koeppe <alexander@koeppe.rocks> wrote: > Thanks Lucky, > > Good idea to create the widget right away and hide it until it's time. > > However, just by accident, I got back the app-menu in the window. > > Try this with the code below: > > 1. After I selected "Restart" simulating the pause and resume, the > app-menu disappeared. > 2. Then I double-clicked the header-bar to maximise the window and the > app-menu reappeared. > 3. Again double-clicked the header-bar to restore the original geometry > the app-menu is still there. > > This is what I want. Question is, what happens when I double click the > header-bar and can I emulate this event in code? > > I feel being just 1 grain off my goal.... > > Thanks > > -Alex > > > Am 23.01.2018 um 22:37 schrieb Lucky B.C: >> Wow, I see your problem is that you did not understand what GtkBuilder >> and Gtk are doing, Because If I'm not wrong, each choice (entry) is a >> function to start something you want to do after the user/you clicked >> to the button called "restart". Here's my solution, it's maybe help >> you. >> >> *) You can use gtk_widget_hide (target) function to hide any widget, >> in this case it's the main window. Then you can do your low-level >> functions what the other can see at the time after the signal >> "clicked" activated. >> >> Note: Some programs I saw the program did not exit when it's called to >> restart, there's only the changed/related data must be reload to >> buffer/ram, and the program must stop rendering/running at the time, >> after the reloading's done the program continues to render/display the >> new data in the screen. The reloading can be done in a new thread too, >> after used you can delete it too. >> >> On Wed, Jan 24, 2018 at 2:52 AM, Alexander Koeppe >> <alexander@koeppe.rocks> wrote: >>> I know about the possiblity to fire the low-level functions using an button >>> callback. However this would draw an exception for other UI choices the >>> application has: e.g. text, deamon. >>> >>> Therefore I'm looking for a way to keep the application structure for all >>> UIs the same. >>> >>> There is the test app I'm playing with: >>> >>> >>> #include <gtk/gtk.h> >>> >>> GtkApplication *app; >>> GtkWidget *window; >>> int initialized = 0; >>> >>> void quit_cb(GSimpleAction *action, GVariant *value, gpointer data) >>> { >>> g_print("quit!\n"); >>> g_object_unref(app); >>> exit(0); >>> } >>> >>> void restart_cb(GSimpleAction *action, GVariant *value, gpointer data) >>> { >>> g_print("restart!\n"); >>> g_application_quit(G_APPLICATION(app)); >>> } >>> >>> void test_cb(GSimpleAction *action, GVariant *value, gpointer data) >>> { >>> GtkWidget *dialog; >>> GtkDialogFlags flags = GTK_DIALOG_DESTROY_WITH_PARENT; >>> >>> >>> dialog = gtk_message_dialog_new(GTK_WINDOW(window), >>> flags, >>> GTK_MESSAGE_ERROR, >>> GTK_BUTTONS_CLOSE, >>> "TEst Message"); >>> g_signal_connect_swapped(dialog, "response", >>> G_CALLBACK(gtk_widget_destroy), >>> dialog); >>> gtk_dialog_run(GTK_DIALOG(dialog)); >>> } >>> >>> static void shutdown(GtkApplication *app, gpointer data) >>> { >>> initialized = 1; >>> } >>> >>> static void >>> activate (GtkApplication *app, >>> gpointer user_data) >>> { >>> GtkWidget *header, *menubutton, *frame, *overlay, *combo, *box; >>> GtkBuilder *builder; >>> >>> GActionEntry actions[] = { >>> {"test_action", test_cb, NULL, NULL, NULL,{}}, >>> {"restart", restart_cb, NULL, NULL, NULL, {}}, >>> {"quit", quit_cb, NULL, NULL, NULL, {}} >>> }; >>> >>> >>> g_action_map_add_action_entries(G_ACTION_MAP(app), actions, >>> G_N_ELEMENTS(actions), app); >>> >>> >>> >>> if (initialized == 0) { >>> window = gtk_application_window_new (app); >>> gtk_window_set_default_size (GTK_WINDOW (window), 500, 300); >>> } >>> else { >>> gtk_application_add_window(app, GTK_WINDOW(window)); >>> } >>> gtk_window_set_title (GTK_WINDOW (window), "buildertest"); >>> >>> /* Header Bar */ >>> header = gtk_header_bar_new(); >>> gtk_header_bar_set_title(GTK_HEADER_BAR(header), "Yeah"); >>> gtk_header_bar_set_show_close_button(GTK_HEADER_BAR(header), TRUE); >>> gtk_window_set_titlebar(GTK_WINDOW(window), header); >>> >>> /* Menu Button */ >>> menubutton = gtk_menu_button_new(); >>> >>> /* Menu for Menubutton */ >>> builder = gtk_builder_new(); >>> gtk_builder_add_from_string(builder, >>> "<interface>" >>> " <menu id='app-menu'>" >>> " <section>" >>> " <item>" >>> " <attribute name='label' >>> translatable='yes'>Restart</attribute>" >>> " <attribute name='action'>app.restart</attribute>" >>> " </item>" >>> " <item>" >>> " <attribute name='label' >>> translatable='yes'>Quit</attribute>" >>> " <attribute name='action'>app.quit</attribute>" >>> " </item>" >>> " </section>" >>> " </menu>" >>> " <menu id='test-menu'>" >>> " <section>" >>> " <attribute name='label' translatable='yes'>Test</attribute>" >>> " <item>" >>> " <attribute name='label' translatable='yes'>Test >>> Entry</attribute>" >>> " <attribute name='action'>app.test_action</attribute>" >>> " <attribute name='accel'>t</attribute>" >>> " </item>" >>> " </section>" >>> " </menu>" >>> "</interface>", -1, NULL); >>> >>> gtk_application_set_app_menu(GTK_APPLICATION(app), >>> G_MENU_MODEL(gtk_builder_get_object(builder, "app-menu"))); >>> >>> gtk_menu_button_set_menu_model(GTK_MENU_BUTTON(menubutton), >>> G_MENU_MODEL(gtk_builder_get_object(builder, "test-menu"))); >>> >>> gtk_button_set_image(GTK_BUTTON(menubutton), >>> gtk_image_new_from_icon_name("open-menu-symbolic", >>> GTK_ICON_SIZE_MENU)); >>> gtk_header_bar_pack_end(GTK_HEADER_BAR(header), menubutton); >>> >>> /* content area */ >>> if (initialized) { >>> overlay = gtk_bin_get_child(GTK_BIN(window)); >>> gtk_container_remove(GTK_CONTAINER(window), overlay); >>> } >>> >>> overlay = gtk_overlay_new(); >>> gtk_container_add(GTK_CONTAINER(window), overlay); >>> >>> frame = gtk_frame_new("Rahmen"); >>> gtk_container_add(GTK_CONTAINER(overlay), frame); >>> >>> box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); >>> gtk_container_add(GTK_CONTAINER(frame), box); >>> >>> combo = gtk_combo_box_text_new(); >>> gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(combo), "id1", "Entry 1"); >>> gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(combo), "id2", "Entry 2"); >>> gtk_combo_box_set_active(GTK_COMBO_BOX(combo), 0); >>> gtk_widget_set_hexpand(combo, TRUE); >>> >>> gtk_box_pack_start(GTK_BOX(box), combo, FALSE, FALSE, 0); >>> >>> >>> >>> gtk_widget_show_all(window); >>> } >>> >>> int main(int argc, >>> char *argv[]) >>> { >>> app = NULL; >>> int status; >>> >>> app = gtk_application_new ("org.gnome.Buildertest", >>> G_APPLICATION_FLAGS_NONE); >>> g_signal_connect (app, "activate", G_CALLBACK (activate), NULL); >>> g_signal_connect (app, "shutdown", G_CALLBACK(shutdown), NULL); >>> status = g_application_run (G_APPLICATION (app), argc, argv); >>> >>> g_print("some things happen here\n"); >>> >>> g_object_unref(G_OBJECT(app)); >>> >>> app = gtk_application_new ("org.gnome.Buildertest", >>> G_APPLICATION_FLAGS_NONE); >>> g_signal_connect (app, "activate", G_CALLBACK (activate), NULL); >>> status = g_application_run (G_APPLICATION (app), argc, argv); >>> >>> return status; >>> } >>> >>> >>> Am 22.01.2018 um 22:09 schrieb Lucky B.C: >>> >>> Hi, can you show your demo about the way you did? But I think you should >>> keep the gtk_main() runs, because you can run your low-level functions by >>> "clicked" signal on button. >>> >>> On Jan 23, 2018 03:44, "Alexander Koeppe" <alexander@koeppe.rocks> wrote: >>> >>> Hi, >>> >>> I have an application where some things need to be setup in the UI, then >>> some low-level routines to be executed using the setup values and then >>> resuming the UI loop for further operation. >>> >>> Since I'm migrating the GTK code from GTK2/3 compatible to GNOME/GTK3, I >>> make use of g_application_run(). >>> >>> However, I find no simialar way to interrupt the loop (e.g. >>> gtk_main_quit()) and resuming the UI later (gtk_main()). >>> >>> The only way I found yet is to quit the application using >>> g_application_quit() but keep the window widget, clearing the >>> application (g_object_unref()) and creating a new application after >>> executing the low-level routines and finally adding the still existing >>> window widget to this new application using >>> gtk_application_add_window(). This way I can reuse the window and avoid >>> any flickering which is the required effect. >>> >>> The only caveat is, the added window is not considered being the primary >>> instance of the second application, hence the app-menu isn't displayed. >>> >>> Is there any way to define a window added being the primary instance of >>> the application or to show the app-menu (set using >>> gtk_application_set_app_menu()) in such an non-primary window, or even a >>> complete different approach? >>> >>> >>> Thanks and regards >>> >>> - Alex >>> >>> >>> _______________________________________________ >>> gtk-app-devel-list mailing list >>> gtk-app-devel-list@gnome.org >>> https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list >>> >>> >>> > > > _______________________________________________ > gtk-app-devel-list mailing list > gtk-app-devel-list@gnome.org > https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list _______________________________________________ gtk-app-devel-list mailing list gtk-app-devel-list@gnome.org https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list