This repository has been archived on 2023-02-21. You can view files and clone it, but cannot push or open issues or pull requests.
quick-text-bar/modules/fcitx4.c

90 lines
2.7 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "fcitx4.h"
#include "../util.h"
#include <gio/gio.h>
#include <stdio.h>
#include <string.h>
struct input_method {
const char *name;
const char *symbol;
};
const struct input_method input_methods[] = {
{"fcitx-keyboard-us", ""},
{"kkc", ""},
{"mozc", ""}
};
static const size_t im_count = sizeof(input_methods) / sizeof(struct input_method);
static const struct input_method *current_im = NULL;
static const struct input_method *find_im(const char *name) {
size_t i;
for (i = 0; i < im_count; ++i) {
if (strcmp(name, input_methods[i].name) == 0) {
return &input_methods[i];
}
}
return NULL;
}
static void set_current_im(GDBusConnection *dbus) {
current_im = NULL;
GVariant *tuple = g_dbus_connection_call_sync(
dbus, "org.fcitx.Fcitx", "/inputmethod", "org.fcitx.Fcitx.InputMethod",
"GetCurrentIM", NULL, G_VARIANT_TYPE_TUPLE, G_DBUS_CALL_FLAGS_NONE, -1,
NULL, NULL);
if (tuple) {
GVariant *response = g_variant_get_child_value(tuple, 0);
size_t response_len;
const char *response_im = g_variant_get_string(response, &response_len);
current_im = find_im(response_im);
g_variant_unref(response);
g_variant_unref(tuple);
}
}
static void im_changed_callback(GDBusConnection *dbus, const char *sender_name,
const char *object_path, const char *interface_name,
const char *signal_name, GVariant *params,
gpointer user_data) {
set_current_im(dbus);
qtb_signal_modules(3);
}
static void *thread_action(gpointer user_data) {
GMainContext *context = g_main_context_new();
g_main_context_push_thread_default(context);
GError *err = NULL;
GDBusConnection *dbus = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, &err);
if (err) {
qtb_log("could not connect to fcitx on dbus: %s", err->message);
qtb_die();
}
set_current_im(dbus);
qtb_signal_modules(3);
g_dbus_connection_signal_subscribe(
dbus, NULL, "org.freedesktop.DBus.Properties", "PropertiesChanged",
"/inputmethod", "org.fcitx.Fcitx.InputMethod", G_DBUS_SIGNAL_FLAGS_NONE,
&im_changed_callback, NULL, NULL);
GMainLoop *main_loop = g_main_loop_new(context, FALSE);
g_main_loop_run(main_loop);
return NULL;
}
void fcitx4_module_init() {
g_thread_new("fcitx-module", &thread_action, NULL);
}
char *fcitx4_module_poll() {
const char *symbol;
if (current_im) {
symbol = current_im->symbol;
} else {
symbol = "";
}
size_t sym_len = strlen(symbol);
char *output = qtb_malloc(sizeof("") + sym_len);
sprintf(output, " %s", symbol);
return output;
}