From 9368d980d296ccc90ffc662675545221edf68c2a Mon Sep 17 00:00:00 2001 From: Sergey Udaltsov Date: Mon, 11 Jan 2010 02:11:42 +0000 Subject: Counting start/stop masks, changed API --- libxklavier/xkl_engine.h | 6 ++++-- libxklavier/xklavier.c | 40 +++++++++++++++++++++++++++++++++------- libxklavier/xklavier_private.h | 9 +++++++++ 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, -- cgit v1.2.1