почему gapplication не работает в цикле без g_main_loop?

Щас пробую писать делая свои классы. Посматриваю в документацию и в код thunar. Если делать по быстрому gtk, то там указываешь в сигнале startup и это вызывается и работает, то есть приложение не завершается. Если делать тоже самое в gobject, то мне помогало g_application_hold. Но щас я делаю свой класс приложения и у меня возникли трудности. Например в документации написано вот что ( я просто думал что может это должно вызываться последним ).

run_mainloop ()
Used to be invoked on the primary instance from g_application_run() if the use-count is non-zero. Since 2.32, GApplication is iterating the main context directly and is not using run_mainloop anymore

Как она может вызываться напрямую не пойму. Вообще не пойму. Вот код. если запустить, то startup вызывается до command_line. но в command_line обрабатываются только параметры командной строки. как же получить доступ к функции и к какой, чтобы программа не завершалась после вызова g_application_run.

#include "app.h"
#include "app_dbus_service.h"
#include <glib-2.0/glib.h>
#include <stdio.h>

struct _AppWatcher {
    GApplication parent_instance;

    char *interface;
    char *file_match;
    int dbus_owner_app;
    AppService *dbus_service;
};

G_DEFINE_TYPE (AppWatcher, app_watcher, G_TYPE_APPLICATION);

static const GOptionEntry option_entries[] =
{
    { "interface", 'i', 0, G_OPTION_ARG_STRING, NULL, "set name's interface." },
    { "matchfile", 'm', 0, G_OPTION_ARG_NONE, NULL, "set file mac matching employee." },
    { NULL, },
};

static void
app_watcher_constructed (GObject *obj) {
    G_OBJECT_CLASS (app_watcher_parent_class)->constructed (obj);
}

static void
app_watcher_finalize (GObject *obj) {
    AppWatcher *self = APP_WATCHER (obj);

    G_OBJECT_CLASS (app_watcher_parent_class)->finalize (obj);
}

static void
app_watcher_startup (GApplication *app) {
    g_print("startup\n");
    

    G_APPLICATION_CLASS (app_watcher_parent_class)->startup (app);
    
    g_print("startup %s\n", APP_WATCHER (app)->interface);
}

static void
app_watcher_activate (GApplication *app) {
    g_application_hold(app);
    G_APPLICATION_CLASS (app_watcher_parent_class)->activate (app);
    g_print("activate:\n");
}

static void
app_watcher_shutdown (GApplication *app) {
    AppWatcher *application = APP_WATCHER (app);

    G_APPLICATION_CLASS (app_watcher_parent_class)->shutdown (app);
}


static int
app_watcher_command_line (GApplication *gapp, GApplicationCommandLine *command_line) {
    g_print("command line\n");

    AppWatcher *watcher = APP_WATCHER (gapp);

    GVariantDict *options_dict = g_application_command_line_get_options_dict (command_line);
    char *interface = NULL;
    char *match = NULL;

    g_variant_dict_lookup (options_dict, "interface", "s", &interface);
    g_variant_dict_lookup (options_dict, "matchfile", "s", &match);


    if(G_UNLIKELY(interface)) {
        watcher->interface = interface;
        g_print("interface is %s\n", interface);
    }

    if(G_UNLIKELY(match)) {
        watcher->file_match = match;
        g_print("match file is %s\n", match);
    }


    return EXIT_SUCCESS;
}

static gboolean
app_watcher_dbus_register (GApplication *gapp,
                            GDBusConnection *connection,
                            const char *object_path,
                            GError **error) {
    g_print("register\n");
    AppWatcher *watcher = APP_WATCHER (gapp);
    if (watcher->dbus_service) {
        return TRUE;
    }

    watcher->dbus_service = g_object_new (APP_TYPE_SERVICE, NULL);

    //return app_dbus_service_export_on_connection (watcher->dbus_service, connection, error);
}
                            

static int
app_watcher_handle_local_options (GApplication *app, GVariantDict *options) {
    
    return -1;  
}

static void
app_watcher_class_init (AppWatcherClass *klass) {
    GObjectClass *object_class = G_OBJECT_CLASS (klass);
    GApplicationClass *gapplication_class = G_APPLICATION_CLASS (klass);

    object_class->constructed = app_watcher_constructed;
    object_class->finalize = app_watcher_finalize;

    gapplication_class->startup = app_watcher_startup;
    gapplication_class->activate = app_watcher_activate;
    gapplication_class->shutdown = app_watcher_shutdown;
    gapplication_class->command_line = app_watcher_command_line;
    //gapplication_class->dbus_register = app_watcher_dbus_register;
    gapplication_class->handle_local_options = app_watcher_handle_local_options;
}

static void app_watcher_dbus_acquired_cb (GDBusConnection *connection, 
                                    const char *name,
                                    gpointer data) {

}
static void app_watcher_dbus_name_acquired_cb (GDBusConnection *connection, 
                                    const char *name,
                                    gpointer data) {

}
static void app_watcher_dbus_name_lost_cb (GDBusConnection *connection, 
                                    const char *name,
                                    gpointer data) {

}

                                    

static void
app_watcher_dbus_init (AppWatcher *app) {
    app->dbus_owner_app = g_bus_own_name (G_BUS_TYPE_SESSION,
                            "com.xverizex.watcher_for_employee",
                            G_BUS_NAME_OWNER_FLAGS_NONE,
                            app_watcher_dbus_acquired_cb,
                            app_watcher_dbus_name_acquired_cb,
                            app_watcher_dbus_name_lost_cb,
                            app,
                            NULL);
}

static void
app_watcher_init (AppWatcher *self) {

    g_application_set_flags (G_APPLICATION(self), G_APPLICATION_HANDLES_COMMAND_LINE);
    g_application_add_main_option_entries(G_APPLICATION(self), option_entries);

    app_watcher_dbus_init (self);
    g_print ( "!!!\n" );
}

AppWatcher *app_watcher_new ( ) {
    GApplication *default_app = g_application_get_default ( );
    if(default_app) {
        return APP_WATCHER (g_object_ref (default_app));
    } else {
        return g_object_ref_sink (g_object_new (APP_TYPE_WATCHER, "application-id", "com.xverizex.app_watcher", NULL));
    }}


Ответы (0 шт):