#include #include #include #ifdef G_OS_UNIX #include #include #endif static gboolean action3_added = FALSE; static void on_app_action (GApplication *application, const gchar *action_name, GVariant *platform_data) { if (strcmp (action_name, "action1") == 0) exit (1); else if (strcmp (action_name, "action2") == 0) { if (action3_added) g_application_remove_action (application, "action3"); else g_application_add_action (application, "action3", "An extra action"); action3_added = !action3_added; } } static void on_app_activated (GApplication *application, GVariant *args, GVariant *platform_data) { GVariantIter iter; const char *key; GVariant *value; char *cwd; cwd = g_get_current_dir (); g_variant_iter_init (&iter, platform_data); while (g_variant_iter_next (&iter, "{&sv}", &key, &value)) { const char *activate_cwd; if (strcmp (key, "cwd") != 0) continue; activate_cwd = g_variant_get_bytestring (value); g_assert_cmpstr (cwd, ==, activate_cwd); g_variant_unref (value); } g_free (cwd); } static gboolean on_monitor_fd_io (GIOChannel *source, GIOCondition condition, gpointer data) { exit (0); return FALSE; } int main (int argc, char *argv[]) { GApplication *app; #ifdef G_OS_UNIX { const char *slave_fd_env = g_getenv ("_G_TEST_SLAVE_FD"); if (slave_fd_env) { int slave_fd = atoi (slave_fd_env); fcntl (slave_fd, F_SETFD, FD_CLOEXEC); g_io_add_watch (g_io_channel_unix_new (slave_fd), G_IO_HUP | G_IO_ERR, on_monitor_fd_io, NULL); } } #endif app = g_application_unregistered_try_new ("org.gtk.test.app", argc, argv, NULL); if (!(argc > 1 && strcmp (argv[1], "--non-unique") == 0)) { if (!g_application_register (app)) exit (0); } if (g_application_is_remote (app)) { g_application_invoke_action (app, "action1", 0); } else { g_application_add_action (app, "action1", "Action1"); g_application_add_action (app, "action2", "Action2"); g_signal_connect (app, "action-with-data", G_CALLBACK (on_app_action), NULL); g_signal_connect (app, "prepare-activation", G_CALLBACK (on_app_activated), NULL); g_application_run (app); } return 0; }