int main(int argc, char** argv) { fcitx_utils_init_as_daemon(); if (isRunning()) { exit(1); } QTextCodec::setCodecForTr(QTextCodec::codecForLocale()); QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale()); QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); QTranslator translator; if (translator.load(QString(getQimpanelSharePath("zh_CN.qm"))) == false) qDebug() << "load qm error."; QApplication *app = new QApplication(argc, argv); app->installTranslator(&translator); app->setApplicationName("fcitx-qimpanel"); int waittTick = 0; int waitTime = 10; while (waittTick ++ < waitTime && fcitxIsNotRunning()) { qDebug() << "Fcitx not running."; sleep(1); } qDebug() << "fcitxIsNotRunning():" << fcitxIsNotRunning(); if (waittTick >= waitTime) return -1; MainController *ctrl = MainController::self(); signal(SIGHUP, sigRoutine); app->setQuitOnLastWindowClosed(false); app->exec(); delete ctrl; delete app; return 0; }
boolean ProcessOption(FcitxInstance* instance, int argc, char* argv[]) { struct option longOptions[] = { {"ui", 1, 0, 0}, {"replace", 0, 0, 0}, {"enable", 1, 0, 0}, {"disable", 1, 0, 0}, {"help", 0, 0, 0}, {NULL, 0, 0, 0} }; int optionIndex = 0; int c; char* uiname = NULL; boolean runasdaemon = true; int overrideDelay = -1; while ((c = getopt_long(argc, argv, "ru:dDs:hv", longOptions, &optionIndex)) != EOF) { switch (c) { case 0: { switch (optionIndex) { case 0: uiname = strdup(optarg); break; case 1: instance->tryReplace = true; break; case 2: { if (instance->enableList) fcitx_utils_free_string_list(instance->enableList); instance->enableList = fcitx_utils_split_string(optarg, ','); } break; case 3: { if (instance->disableList) fcitx_utils_free_string_list(instance->disableList); instance->disableList = fcitx_utils_split_string(optarg, ','); } break; default: instance->quietQuit = true; Usage(); return false; } } break; case 'r': instance->tryReplace = true; break; case 'u': uiname = strdup(optarg); break; case 'd': runasdaemon = true; break; case 'D': runasdaemon = false; break; case 's': overrideDelay = atoi(optarg); break; case 'h': Usage(); return false; case 'v': Version(); return false; break; default: Usage(); return false; } } if (uiname) instance->uiname = uiname; else instance->uiname = NULL; if (runasdaemon) fcitx_utils_init_as_daemon(); if (overrideDelay < 0) overrideDelay = instance->config->iDelayStart; if (overrideDelay > 0) sleep(overrideDelay); return true; }
int main (int argc, char* argv[]) { if (argc != 3) return 1; pid_t pid = atoi(argv[2]); if (pid <= 0) return 1; fcitx_utils_init_as_daemon(); asprintf(&servicename, "%s-%d", FCITX_DBUS_SERVICE, fcitx_utils_get_display_number()); DBusError err; dbus_error_init(&err); DBusConnection* conn = dbus_connection_open(argv[1], NULL); if (!conn) goto some_error; FcitxDBusWatch* watches = NULL; if (!dbus_connection_set_watch_functions(conn, DBusAddWatch, DBusRemoveWatch, NULL, &watches, NULL)) { goto some_error; } dbus_connection_set_exit_on_disconnect(conn, TRUE); if (!dbus_bus_register(conn, NULL)) goto some_error; dbus_bus_add_match(conn, "type='signal'," "interface='" DBUS_INTERFACE_DBUS "'," "path='" DBUS_PATH_DBUS "'," "member='NameOwnerChanged'", &err); if (dbus_error_is_set(&err)) goto some_error; if (!dbus_connection_add_filter(conn, WatcherDBusFilter, NULL, NULL)) goto some_error; #ifndef NZERO #define NZERO 20 #endif nice(NZERO - 1); fd_set rfds, wfds, efds; FD_ZERO(&rfds); FD_ZERO(&wfds); FD_ZERO(&efds); do { DBusProcessEventForWatches(watches, &rfds, &wfds, &efds); DBusProcessEventForConnection(conn); if (status != WATCHER_WAITING) break; FD_ZERO(&rfds); FD_ZERO(&wfds); FD_ZERO(&efds); int maxfd = DBusUpdateFDSet(watches, &rfds, &wfds, &efds); if (maxfd == 0) break; select(maxfd + 1, &rfds, &wfds, &efds, NULL); } while(1); if (status == FCITX_DIE) { kill(pid, SIGTERM); } some_error: if (conn) dbus_connection_unref(conn); dbus_error_free(&err); fcitx_utils_free(servicename); return 1; }