summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--obt/keyboard.c38
-rw-r--r--obt/keyboard.h7
2 files changed, 45 insertions, 0 deletions
diff --git a/obt/keyboard.c b/obt/keyboard.c
index bd7ec7b6..bd5d5dfd 100644
--- a/obt/keyboard.c
+++ b/obt/keyboard.c
@@ -22,6 +22,12 @@
#include <X11/Xlib.h>
#include <X11/keysym.h>
+struct _ObtIC
+{
+ guint ref;
+ XIC xic;
+};
+
/* These masks are constants and the modifier keys are bound to them as
anyone sees fit:
ShiftMask (1<<0), LockMask (1<<1), ControlMask (1<<2), Mod1Mask (1<<3),
@@ -291,3 +297,35 @@ gunichar obt_keyboard_keycode_to_unichar(guint keycode)
g_free(key);
return unikey;
}
+
+ObtIC* obt_keyboard_context_new(Window w)
+{
+ ObtIC *ic = NULL;
+
+ if (w != None) {
+ ic = g_new(ObtIC, 1);
+ ic->ref = 1;
+ ic->xic = NULL;
+
+ if (xim)
+ ic->xic = XCreateIC(xim,
+ XNInputStyle, xim_style,
+ XNClientWindow, w,
+ XNFocusWindow, w,
+ NULL);
+ }
+ return ic;
+}
+
+void obt_keyboard_context_ref(ObtIC *ic)
+{
+ ++ic->ref;
+}
+
+void obt_keyboard_context_unref(ObtIC *ic)
+{
+ if (--ic->ref < 1) {
+ XDestroyIC(ic->xic);
+ g_free(ic);
+ }
+}
diff --git a/obt/keyboard.h b/obt/keyboard.h
index 4fb60186..d166faa4 100644
--- a/obt/keyboard.h
+++ b/obt/keyboard.h
@@ -40,6 +40,8 @@ typedef enum {
OBT_KEYBOARD_NUM_MODKEYS
} ObtModkeysKey;
+typedef struct _ObtIC ObtIC;
+
void obt_keyboard_reload(void);
/*! Get the modifier mask(s) for a KeyCode. (eg. a keycode bound to Alt_L could
@@ -63,6 +65,11 @@ gchar *obt_keyboard_keycode_to_string(guint keycode);
/*! Translate a KeyCode to the unicode character it represents */
gunichar obt_keyboard_keycode_to_unichar(guint keycode);
+/*! Create an input context for a window */
+ObtIC* obt_keyboard_context_new(Window w);
+
+void obt_keyboard_context_ref(ObtIC *ic);
+void obt_keyboard_context_unref(ObtIC *ic);
G_END_DECLS