почему 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));
}}