create an X Input Method in obt for the app to use for all input
This commit is contained in:
parent
e83803b8b0
commit
6e280e9f53
2 changed files with 62 additions and 0 deletions
|
@ -56,6 +56,8 @@ extern gint obt_display_extension_sync_basep;
|
||||||
|
|
||||||
extern Display* obt_display;
|
extern Display* obt_display;
|
||||||
|
|
||||||
|
/*! Open the X display. You should call g_set_prgname() before calling this
|
||||||
|
function for X Input Methods to work correctly. */
|
||||||
gboolean obt_display_open(const char *display_name);
|
gboolean obt_display_open(const char *display_name);
|
||||||
void obt_display_close(void);
|
void obt_display_close(void);
|
||||||
|
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
#define nth_mask(n) (1 << n)
|
#define nth_mask(n) (1 << n)
|
||||||
|
|
||||||
static void set_modkey_mask(guchar mask, KeySym sym);
|
static void set_modkey_mask(guchar mask, KeySym sym);
|
||||||
|
static void xim_init(void);
|
||||||
void obt_keyboard_shutdown();
|
void obt_keyboard_shutdown();
|
||||||
|
|
||||||
static XModifierKeymap *modmap;
|
static XModifierKeymap *modmap;
|
||||||
|
@ -49,6 +50,9 @@ static gboolean hyper_l = FALSE;
|
||||||
|
|
||||||
static gboolean started = FALSE;
|
static gboolean started = FALSE;
|
||||||
|
|
||||||
|
static XIM xim = NULL;
|
||||||
|
static XIMStyle xim_style = 0;
|
||||||
|
|
||||||
void obt_keyboard_reload(void)
|
void obt_keyboard_reload(void)
|
||||||
{
|
{
|
||||||
gint i, j, k;
|
gint i, j, k;
|
||||||
|
@ -56,6 +60,8 @@ void obt_keyboard_reload(void)
|
||||||
if (started) obt_keyboard_shutdown(); /* free stuff */
|
if (started) obt_keyboard_shutdown(); /* free stuff */
|
||||||
started = TRUE;
|
started = TRUE;
|
||||||
|
|
||||||
|
xim_init();
|
||||||
|
|
||||||
/* reset the keys to not be bound to any masks */
|
/* reset the keys to not be bound to any masks */
|
||||||
for (i = 0; i < OBT_KEYBOARD_NUM_MODKEYS; ++i)
|
for (i = 0; i < OBT_KEYBOARD_NUM_MODKEYS; ++i)
|
||||||
modkeys_keys[i] = 0;
|
modkeys_keys[i] = 0;
|
||||||
|
@ -104,9 +110,63 @@ void obt_keyboard_shutdown(void)
|
||||||
modmap = NULL;
|
modmap = NULL;
|
||||||
XFree(keymap);
|
XFree(keymap);
|
||||||
keymap = NULL;
|
keymap = NULL;
|
||||||
|
if (xim) XCloseIM(xim);
|
||||||
|
xim = NULL;
|
||||||
|
xim_style = 0;
|
||||||
started = FALSE;
|
started = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void xim_init(void)
|
||||||
|
{
|
||||||
|
gchar *aname, *aclass;
|
||||||
|
|
||||||
|
aname = g_strdup(g_get_prgname());
|
||||||
|
if (!aname) aname = g_strdup("obt");
|
||||||
|
|
||||||
|
aclass = g_strdup(aname);
|
||||||
|
if (g_ascii_islower(aclass[0]))
|
||||||
|
aclass[0] = g_ascii_toupper(aclass[0]);
|
||||||
|
|
||||||
|
g_print("Opening Input Method for %s %s\n", aname, aclass);
|
||||||
|
xim = XOpenIM(obt_display, NULL, aname, aclass);
|
||||||
|
|
||||||
|
if (!xim)
|
||||||
|
g_message("Failed to open an Input Method");
|
||||||
|
else {
|
||||||
|
XIMStyles *xim_styles = NULL;
|
||||||
|
char *r;
|
||||||
|
|
||||||
|
/* get the input method styles */
|
||||||
|
r = XGetIMValues(xim, XNQueryInputStyle, &xim_styles, NULL);
|
||||||
|
if (r || !xim_styles)
|
||||||
|
g_message("Input Method does not support any styles");
|
||||||
|
if (xim_styles) {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* find a style that doesnt need preedit or status */
|
||||||
|
for (i = 0; i < xim_styles->count_styles; ++i) {
|
||||||
|
if (xim_styles->supported_styles[i] ==
|
||||||
|
(XIMPreeditNothing | XIMStatusNothing))
|
||||||
|
{
|
||||||
|
xim_style = xim_styles->supported_styles[i];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
XFree(xim_styles);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!xim_style) {
|
||||||
|
g_message("Input Method does not support a usable style");
|
||||||
|
|
||||||
|
XCloseIM(xim);
|
||||||
|
xim = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
g_free(aclass);
|
||||||
|
g_free(aname);
|
||||||
|
}
|
||||||
|
|
||||||
guint obt_keyboard_keycode_to_modmask(guint keycode)
|
guint obt_keyboard_keycode_to_modmask(guint keycode)
|
||||||
{
|
{
|
||||||
gint i, j;
|
gint i, j;
|
||||||
|
|
Loading…
Reference in a new issue