Hi Just some explanation. Your timeout is is dispatched by gtk_main(). As doing your call to the backend, you have to listen on message and then forward the event to the UI.
AgsAudio::set-pads() actually is part of my backend. Sends the message. Here you need some async non-blocking call to your backend, at your own taste. E.g. this call invokes ags_audio_set_pads(). The timeout function polls your messages and forwards the event: AgsMachine::resize-pads() is part of the UI. You listen to this event within UI. Connect as usual, note the callback does modify is_available to TRUE: do_wait = TRUE; is_available = FALSE; g_signal_connect_after(machine, "resize-pads", G_CALLBACK(pads_resized_callback), &is_available); Meanwhile you pause execution of UI by calling within gtk_main(). while((do_wait && !is_available[0])){ usleep(1000000 / 30); g_main_context_iteration(NULL, FALSE); } Your source is dispatched but gtk_main() is still within the loop shown above. Bests, Joël On Thu, Jan 25, 2018 at 11:54 PM, Joël Krähemann <jkraehem...@gmail.com> wrote: > Hi, > > Well there was some redundant code. This actually fixes it: > > http://git.savannah.nongnu.org/cgit/gsequencer.git/tree/ags/X/file/ags_simple_file.c?h=1.5.x#n1904 > > Bests, > Joël > > > On Thu, Jan 25, 2018 at 11:16 PM, Joël Krähemann <jkraehem...@gmail.com> > wrote: >> 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