summaryrefslogtreecommitdiff
path: root/libxklavier
diff options
context:
space:
mode:
authorSergey Udaltsov <svu@gnome.org>2010-01-11 02:11:42 +0000
committerSergey Udaltsov <svu@gnome.org>2010-01-11 02:11:42 +0000
commit9368d980d296ccc90ffc662675545221edf68c2a (patch)
tree3d550ae784c2fdf86b53cd9ab833667cbaaf051e /libxklavier
parentca09f48e2207cf9eb67b6d9afb5a038fa5654bfd (diff)
downloadlibxklavier-9368d980d296ccc90ffc662675545221edf68c2a.tar.gz
Counting start/stop masks, changed API
Diffstat (limited to 'libxklavier')
-rw-r--r--libxklavier/xkl_engine.h6
-rw-r--r--libxklavier/xklavier.c40
-rw-r--r--libxklavier/xklavier_private.h9
3 files changed, 46 insertions, 9 deletions
diff --git a/libxklavier/xkl_engine.h b/libxklavier/xkl_engine.h
index db40828..b92e741 100644
--- a/libxklavier/xkl_engine.h
+++ b/libxklavier/xkl_engine.h
@@ -217,7 +217,7 @@ extern "C" {
typedef enum {
XKLL_MANAGE_WINDOW_STATES = 0x01,
XKLL_TRACK_KEYBOARD_STATE = 0x02,
- XKLL_MANAGE_LAYOUTS = 0x04
+ XKLL_MANAGE_LAYOUTS = 0x04,
} XklEngineListenModes;
/**
@@ -235,11 +235,13 @@ extern "C" {
/**
* xkl_engine_stop_listen:
* @engine: the engine
+ * @flags: any combination of XKLL_* constants
*
* Stops listening for XKB-related events
* Returns: 0
*/
- extern gint xkl_engine_stop_listen(XklEngine * engine);
+ extern gint xkl_engine_stop_listen(XklEngine * engine,
+ guint flags);
/**
* xkl_engine_pause_listen:
diff --git a/libxklavier/xklavier.c b/libxklavier/xklavier.c
index 1dbd1fb..3d55451 100644
--- a/libxklavier/xklavier.c
+++ b/libxklavier/xklavier.c
@@ -174,7 +174,13 @@ xkl_set_log_appender(XklLogAppender func)
gint
xkl_engine_start_listen(XklEngine * engine, guint what)
{
- xkl_engine_priv(engine, listener_type) = what;
+ int i;
+ guchar *cntr = xkl_engine_priv(engine, listener_type_counters);
+ for (i = 0; i < XKL_NUMBER_OF_LISTEN_MODES; i++, cntr++)
+ if (what & (1 << i))
+ (*cntr)++;
+
+ xkl_engine_priv(engine, listener_type) |= what;
if (!
(xkl_engine_priv(engine, features) &
@@ -191,9 +197,20 @@ xkl_engine_start_listen(XklEngine * engine, guint what)
}
gint
-xkl_engine_stop_listen(XklEngine * engine)
+xkl_engine_stop_listen(XklEngine * engine, guint what)
{
+ int i;
xkl_engine_pause_listen(engine);
+ guchar *cntr = xkl_engine_priv(engine, listener_type_counters);
+ for (i = 0; i < XKL_NUMBER_OF_LISTEN_MODES; i++, cntr++) {
+ int mask = 1 << i;
+ if (what & mask) {
+ if (!--(*cntr))
+ xkl_engine_priv(engine, listener_type) &=
+ !mask;
+ }
+ }
+
return 0;
}
@@ -560,6 +577,8 @@ xkl_engine_lock_group(XklEngine * engine, int group)
gint
xkl_engine_pause_listen(XklEngine * engine)
{
+ xkl_debug(150, "Pause listening (listenerType: %x)\n",
+ xkl_engine_priv(engine, listener_type));
xkl_engine_ensure_vtable_inited(engine);
return xkl_engine_vcall(engine, pause_listen) (engine);
}
@@ -568,8 +587,15 @@ gint
xkl_engine_resume_listen(XklEngine * engine)
{
xkl_engine_ensure_vtable_inited(engine);
- xkl_debug(150, "listenerType: %x\n",
- xkl_engine_priv(engine, listener_type));
+ int listener_type = xkl_engine_priv(engine, listener_type);
+ xkl_debug(150, "Resume listening, listenerType: %x (%s%s%s)\n",
+ listener_type,
+ (listener_type & XKLL_MANAGE_WINDOW_STATES) ?
+ "XKLL_MANAGE_WINDOW_STATES " : "",
+ (listener_type & XKLL_TRACK_KEYBOARD_STATE) ?
+ "XKLL_TRACK_KEYBOARD_STATE " : "",
+ (listener_type & XKLL_MANAGE_LAYOUTS) ?
+ "XKLL_MANAGE_LAYOUTS " : "");
if (xkl_engine_vcall(engine, resume_listen) (engine))
return 1;
@@ -624,8 +650,7 @@ xkl_engine_constructor(GType type,
engine = XKL_ENGINE(obj);
- display =
- (Display *)
+ display = (Display *)
g_value_peek_pointer(construct_properties[0].value);
xkl_engine_priv(engine, display) = display;
@@ -671,7 +696,8 @@ xkl_engine_constructor(GType type,
xkl_engine_get_backend_name(engine));
} else {
xkl_debug(0, "All backends failed, last result: %d\n", rv);
- XSetErrorHandler(xkl_engine_priv(engine, default_error_handler));
+ XSetErrorHandler(xkl_engine_priv
+ (engine, default_error_handler));
xkl_engine_priv(engine, display) = NULL;
g_object_unref(G_OBJECT(engine));
return NULL;
diff --git a/libxklavier/xklavier_private.h b/libxklavier/xklavier_private.h
index 4c120a1..4fbbbd9 100644
--- a/libxklavier/xklavier_private.h
+++ b/libxklavier/xklavier_private.h
@@ -36,6 +36,9 @@ enum { WM_NAME,
#define XKL_NUMBER_OF_REGISTRY_DOCS 2
+/* We have 3 values in XklEngineListenModes */
+#define XKL_NUMBER_OF_LISTEN_MODES 3
+
struct _XklEnginePrivate {
gboolean group_per_toplevel_window;
@@ -48,6 +51,11 @@ struct _XklEnginePrivate {
guint listener_type;
+ /*
+ * Separate counter for each of XklEngineListenModes!
+ */
+ guchar listener_type_counters[XKL_NUMBER_OF_LISTEN_MODES];
+
guint secondary_groups_mask;
Window root_window;
@@ -446,6 +454,7 @@ extern void
+
xkl_config_registry_foreach_in_xpath_with_param(XklConfigRegistry * config,
const gchar * format,
const gchar * value,