From 247315fa10b4228c4e0feb173f02c3f5d08fce33 Mon Sep 17 00:00:00 2001 From: Sergey Udaltsov Date: Mon, 11 Jan 2010 10:00:25 +0000 Subject: removing listeners masks field - counters have that info anyway --- ChangeLog | 7 +++- libxklavier/xklavier.c | 30 +++++++--------- libxklavier/xklavier_evt.c | 79 ++++++++++++++++++------------------------ libxklavier/xklavier_evt_xkb.c | 14 ++++---- libxklavier/xklavier_evt_xmm.c | 22 ++++++------ libxklavier/xklavier_private.h | 14 +++++--- libxklavier/xklavier_util.c | 4 +-- libxklavier/xklavier_xmm.c | 4 +-- 8 files changed, 86 insertions(+), 88 deletions(-) diff --git a/ChangeLog b/ChangeLog index 860f607..3f7929d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -5,7 +5,12 @@ listen operations: in one process (actually g-s-d) start and stop can be called several times, with different masks. The API is incompatibly changed! - * configure.in: preparing 4.1 with new API + * configure.in: preparing 5.0 with new API + * libxklavier/xklavier.c, libxklavier/xklavier_evt.c, + libxklavier/xklavier_evt_xkb.c, libxklavier/xklavier_evt_xmm.c, + libxklavier/xklavier_private.h, libxklavier/xklavier_util.c, + libxklavier/xklavier_xmm.c: removing listener mask field, it is enough + to use counters 2009-10-12 svu diff --git a/libxklavier/xklavier.c b/libxklavier/xklavier.c index 3d55451..154208c 100644 --- a/libxklavier/xklavier.c +++ b/libxklavier/xklavier.c @@ -176,12 +176,10 @@ xkl_engine_start_listen(XklEngine * engine, guint what) { int i; guchar *cntr = xkl_engine_priv(engine, listener_type_counters); - for (i = 0; i < XKL_NUMBER_OF_LISTEN_MODES; i++, cntr++) + for (i = 0; i < XKLL_NUMBER_OF_LISTEN_MODES; i++, cntr++) if (what & (1 << i)) (*cntr)++; - xkl_engine_priv(engine, listener_type) |= what; - if (! (xkl_engine_priv(engine, features) & XKLF_REQUIRES_MANUAL_LAYOUT_MANAGEMENT) @@ -202,12 +200,10 @@ 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++) { + for (i = 0; i < XKLL_NUMBER_OF_LISTEN_MODES; i++, cntr++) { int mask = 1 << i; if (what & mask) { - if (!--(*cntr)) - xkl_engine_priv(engine, listener_type) &= - !mask; + (*cntr)--; } } @@ -358,8 +354,7 @@ xkl_engine_load_window_tree(XklEngine * engine) int revert; gboolean retval = TRUE, have_toplevel_win; - if (xkl_engine_priv(engine, listener_type) & - XKLL_MANAGE_WINDOW_STATES) + if (xkl_engine_is_listening_for(engine, XKLL_MANAGE_WINDOW_STATES)) retval = xkl_engine_load_subtree(engine, xkl_engine_priv(engine, @@ -577,8 +572,7 @@ 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_debug(150, "Pause listening\n"); xkl_engine_ensure_vtable_inited(engine); return xkl_engine_vcall(engine, pause_listen) (engine); } @@ -587,14 +581,16 @@ gint xkl_engine_resume_listen(XklEngine * engine) { xkl_engine_ensure_vtable_inited(engine); - 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) ? + guchar *listener_type_counters = + xkl_engine_priv(engine, listener_type_counters); + xkl_debug(150, "Resume listening, listenerType: (%s%s%s)\n", + (listener_type_counters + [XKLL_MANAGE_WINDOW_STATES_OFFSET]) ? "XKLL_MANAGE_WINDOW_STATES " : "", - (listener_type & XKLL_TRACK_KEYBOARD_STATE) ? + (listener_type_counters + [XKLL_TRACK_KEYBOARD_STATE_OFFSET]) ? "XKLL_TRACK_KEYBOARD_STATE " : "", - (listener_type & XKLL_MANAGE_LAYOUTS) ? + (listener_type_counters[XKLL_MANAGE_LAYOUTS_OFFSET]) ? "XKLL_MANAGE_LAYOUTS " : ""); if (xkl_engine_vcall(engine, resume_listen) (engine)) return 1; diff --git a/libxklavier/xklavier_evt.c b/libxklavier/xklavier_evt.c index 85949a0..6f5f2ce 100644 --- a/libxklavier/xklavier_evt.c +++ b/libxklavier/xklavier_evt.c @@ -50,8 +50,7 @@ xkl_engine_filter_events(XklEngine * engine, XEvent * xev) break; case CreateNotify: xkl_engine_process_create_window_evt(engine, - &xev-> - xcreatewindow); + &xev->xcreatewindow); break; case DestroyNotify: xkl_debug(150, @@ -107,8 +106,8 @@ xkl_engine_process_focus_in_evt(XklEngine * engine, XklState selected_window_state; if (! - (xkl_engine_priv(engine, listener_type) & - XKLL_MANAGE_WINDOW_STATES)) + (xkl_engine_is_listening_for + (engine, XKLL_MANAGE_WINDOW_STATES))) return; win = fev->window; @@ -234,10 +233,8 @@ xkl_engine_process_focus_in_evt(XklEngine * engine, "Restoring the group from %d to %d after gaining focus\n", xkl_engine_priv (engine, - curr_state). - group, - selected_window_state. - group); + curr_state).group, + selected_window_state.group); /* * For fast mouse movements - the state is probably not updated yet * (because of the group change notification being late). @@ -245,21 +242,17 @@ xkl_engine_process_focus_in_evt(XklEngine * engine, */ xkl_engine_update_current_state (engine, - selected_window_state. - group, - selected_window_state. - indicators, + selected_window_state.group, + selected_window_state.indicators, "Enforcing fast update of the current state"); xkl_engine_lock_group (engine, - selected_window_state. - group); + selected_window_state.group); } else { xkl_debug(150, "Both old and new focused window " "have group %d so no point restoring it\n", - selected_window_state. - group); + selected_window_state.group); xkl_engine_one_switch_to_secondary_group_performed (engine); } @@ -273,10 +266,8 @@ xkl_engine_process_focus_in_evt(XklEngine * engine, xkl_debug(150, "Restoring the indicators from %X to %X after gaining focus\n", xkl_engine_priv(engine, - curr_state). - indicators, - selected_window_state. - indicators); + curr_state).indicators, + selected_window_state.indicators); xkl_engine_ensure_vtable_inited (engine); xkl_engine_vcall(engine, @@ -287,14 +278,12 @@ xkl_engine_process_focus_in_evt(XklEngine * engine, xkl_debug(150, "Not restoring the indicators %X after gaining focus: indicator handling is not enabled\n", xkl_engine_priv(engine, - curr_state). - indicators); + curr_state).indicators); } else xkl_debug(150, "Not restoring the group %d after gaining focus: global layout (xor transparent window)\n", xkl_engine_priv(engine, - curr_state). - group); + curr_state).group); } else xkl_debug(150, "Same app window - just do nothing\n"); @@ -336,8 +325,8 @@ xkl_engine_process_focus_out_evt(XklEngine * engine, XFocusChangeEvent * fev) { if (! - (xkl_engine_priv(engine, listener_type) & - XKLL_MANAGE_WINDOW_STATES)) + (xkl_engine_is_listening_for + (engine, XKLL_MANAGE_WINDOW_STATES))) return; if (fev->mode != NotifyNormal) { @@ -380,7 +369,6 @@ xkl_engine_process_focus_out_evt(XklEngine * engine, void xkl_engine_process_property_evt(XklEngine * engine, XPropertyEvent * pev) { - guint listener_type = xkl_engine_priv(engine, listener_type); if (400 <= xkl_debug_level) { char *atom_name = XGetAtomName(xkl_engine_get_display(engine), @@ -399,7 +387,8 @@ xkl_engine_process_property_evt(XklEngine * engine, XPropertyEvent * pev) } if (pev->atom == xkl_engine_priv(engine, atoms)[WM_STATE]) { - if (listener_type & XKLL_MANAGE_WINDOW_STATES) { + if (xkl_engine_is_listening_for + (engine, XKLL_MANAGE_WINDOW_STATES)) { gboolean has_xkl_state = xkl_engine_get_state(engine, pev->window, NULL); @@ -420,21 +409,22 @@ xkl_engine_process_property_evt(XklEngine * engine, XPropertyEvent * pev) "Something (%d) happened to WM_STATE of window 0x%x\n", pev->state, pev->window); xkl_engine_select_input_merging(engine, - pev-> - window, + pev->window, PropertyChangeMask); if (has_xkl_state) { xkl_engine_delete_state(engine, - pev-> - window); + pev->window); } } } /* XKLL_MANAGE_WINDOW_STATES */ } else if (pev->atom == xkl_engine_priv(engine, base_config_atom) && pev->window == xkl_engine_priv(engine, root_window)) { - if (listener_type & - (XKLL_MANAGE_WINDOW_STATES | - XKLL_TRACK_KEYBOARD_STATE)) { + if (xkl_engine_is_listening_for + (engine, + XKLL_MANAGE_WINDOW_STATES) | + xkl_engine_is_listening_for(engine, + XKLL_TRACK_KEYBOARD_STATE)) + { if (pev->state == PropertyNewValue) { /* If root window got new *_NAMES_PROP_ATOM - it most probably means new keyboard config is loaded by somebody */ @@ -453,9 +443,8 @@ void xkl_engine_process_create_window_evt(XklEngine * engine, XCreateWindowEvent * cev) { - if (! - (xkl_engine_priv(engine, listener_type) & - XKLL_MANAGE_WINDOW_STATES)) + if (!xkl_engine_is_listening_for + (engine, XKLL_MANAGE_WINDOW_STATES)) return; xkl_debug(200, @@ -584,15 +573,14 @@ xkl_engine_process_state_modification(XklEngine * engine, */ if (!xkl_engine_find_toplevel_window (engine, focused, &focused_toplevel) - && xkl_engine_priv(engine, - listener_type) & XKLL_MANAGE_WINDOW_STATES) + && xkl_engine_is_listening_for(engine, + XKLL_MANAGE_WINDOW_STATES)) focused_toplevel = xkl_engine_priv(engine, curr_toplvl_win); /* what else can I do */ xkl_debug(150, "Focused window: " WINID_FORMAT ", '%s'\n", focused_toplevel, xkl_get_debug_window_title(engine, focused_toplevel)); - if (xkl_engine_priv(engine, listener_type) & - XKLL_MANAGE_WINDOW_STATES) { + if (xkl_engine_is_listening_for(engine, XKLL_MANAGE_WINDOW_STATES)) { xkl_debug(150, "CurClient: " WINID_FORMAT ", '%s'\n", xkl_engine_priv(engine, curr_toplvl_win), xkl_get_debug_window_title(engine, @@ -610,8 +598,8 @@ xkl_engine_process_state_modification(XklEngine * engine, xkl_engine_update_current_state(engine, grp, inds, "Updating the state from new focused window"); - if (xkl_engine_priv(engine, listener_type) - & XKLL_MANAGE_WINDOW_STATES) + if (xkl_engine_is_listening_for + (engine, XKLL_MANAGE_WINDOW_STATES)) xkl_engine_add_toplevel_window (engine, focused_toplevel, (Window) NULL, FALSE, @@ -665,8 +653,7 @@ xkl_engine_process_state_modification(XklEngine * engine, xkl_engine_try_call_state_func(engine, change_type, &old_state); - if (xkl_engine_priv(engine, listener_type) & - XKLL_MANAGE_WINDOW_STATES) + if (xkl_engine_is_listening_for(engine, XKLL_MANAGE_WINDOW_STATES)) xkl_engine_save_toplevel_window_state(engine, xkl_engine_priv (engine, diff --git a/libxklavier/xklavier_evt_xkb.c b/libxklavier/xklavier_evt_xkb.c index a06874a..f2e6dfc 100644 --- a/libxklavier/xklavier_evt_xkb.c +++ b/libxklavier/xklavier_evt_xkb.c @@ -56,8 +56,10 @@ xkl_xkb_process_x_event(XklEngine * engine, XEvent * xev) guint inds; XkbEvent *kev = (XkbEvent *) xev; - if (!(xkl_engine_priv(engine, listener_type) & - (XKLL_MANAGE_WINDOW_STATES | XKLL_TRACK_KEYBOARD_STATE))) + if (! + (xkl_engine_is_listening_for(engine, XKLL_MANAGE_WINDOW_STATES) + | xkl_engine_is_listening_for(engine, + XKLL_TRACK_KEYBOARD_STATE))) return 0; #ifdef HAVE_XINPUT @@ -87,8 +89,8 @@ xkl_xkb_process_x_event(XklEngine * engine, XEvent * xev) if (kev->state.changed & GROUP_CHANGE_MASK) xkl_engine_process_state_modification(engine, GROUP_CHANGED, - kev->state. - locked_group, + kev-> + state.locked_group, 0, FALSE); else { /* ...not interested... */ @@ -99,8 +101,8 @@ xkl_xkb_process_x_event(XklEngine * engine, XEvent * xev) xkl_debug(0, "ATTENTION! Currently cached group %d is not equal to the current group from the event: %d\n!", xkl_engine_priv(engine, - curr_state). - group, kev->state.locked_group); + curr_state).group, + kev->state.locked_group); } break; diff --git a/libxklavier/xklavier_evt_xmm.c b/libxklavier/xklavier_evt_xmm.c index e24d47f..3b5ecb3 100644 --- a/libxklavier/xklavier_evt_xmm.c +++ b/libxklavier/xklavier_evt_xmm.c @@ -30,7 +30,7 @@ static gint xkl_xmm_process_keypress_event(XklEngine * engine, XKeyPressedEvent * kpe) { - if (xkl_engine_priv(engine, listener_type) & XKLL_MANAGE_LAYOUTS) { + if (xkl_engine_is_listening_for(engine, XKLL_MANAGE_LAYOUTS)) { gint current_shortcut = 0; const XmmSwitchOption *sop; xkl_debug(200, "Processing the KeyPress event\n"); @@ -44,12 +44,11 @@ xkl_xmm_process_keypress_event(XklEngine * engine, XKeyPressedEvent * kpe) if (state.group != -1) { gint new_group = (state.group + - sop-> - shortcut_steps[current_shortcut]) % + sop->shortcut_steps[current_shortcut]) + % g_strv_length(xkl_engine_backend (engine, XklXmm, - current_config). - layouts); + current_config).layouts); xkl_debug(150, "Setting new xmm group %d\n", new_group); @@ -72,12 +71,11 @@ xkl_xmm_process_property_event(XklEngine * engine, XPropertyEvent * kpe) */ if (kpe->atom == state_atom) { XklState state; - guint listener_type = - xkl_engine_priv(engine, listener_type); xkl_xmm_get_server_state(engine, &state); - if (listener_type & XKLL_MANAGE_LAYOUTS) { + if (xkl_engine_is_listening_for + (engine, XKLL_MANAGE_LAYOUTS)) { xkl_debug(150, "Current group from the root window property %d\n", state.group); @@ -87,8 +85,12 @@ xkl_xmm_process_property_event(XklEngine * engine, XPropertyEvent * kpe) return 1; } - if (listener_type & (XKLL_MANAGE_WINDOW_STATES | - XKLL_TRACK_KEYBOARD_STATE)) { + if (xkl_engine_is_listening_for + (engine, + XKLL_MANAGE_WINDOW_STATES) | + xkl_engine_is_listening_for(engine, + XKLL_TRACK_KEYBOARD_STATE)) + { xkl_debug(150, "XMM state changed, new 'group' %d\n", state.group); diff --git a/libxklavier/xklavier_private.h b/libxklavier/xklavier_private.h index 4fbbbd9..e270ef0 100644 --- a/libxklavier/xklavier_private.h +++ b/libxklavier/xklavier_private.h @@ -37,7 +37,13 @@ enum { WM_NAME, #define XKL_NUMBER_OF_REGISTRY_DOCS 2 /* We have 3 values in XklEngineListenModes */ -#define XKL_NUMBER_OF_LISTEN_MODES 3 +enum { + XKLL_MANAGE_WINDOW_STATES_OFFSET = 0, + XKLL_TRACK_KEYBOARD_STATE_OFFSET, + XKLL_MANAGE_LAYOUTS_OFFSET, + XKLL_NUMBER_OF_LISTEN_MODES +}; + struct _XklEnginePrivate { @@ -49,12 +55,11 @@ struct _XklEnginePrivate { gint default_group; - guint listener_type; - /* * Separate counter for each of XklEngineListenModes! */ - guchar listener_type_counters[XKL_NUMBER_OF_LISTEN_MODES]; + guchar listener_type_counters[XKLL_NUMBER_OF_LISTEN_MODES]; +#define xkl_engine_is_listening_for(engine, type) (xkl_engine_priv((engine), listener_type_counters)[type##_OFFSET] > 0) guint secondary_groups_mask; @@ -455,6 +460,7 @@ extern void + xkl_config_registry_foreach_in_xpath_with_param(XklConfigRegistry * config, const gchar * format, const gchar * value, diff --git a/libxklavier/xklavier_util.c b/libxklavier/xklavier_util.c index 913afb8..578f408 100644 --- a/libxklavier/xklavier_util.c +++ b/libxklavier/xklavier_util.c @@ -100,8 +100,8 @@ xkl_engine_save_state(XklEngine * engine, Window win, XklState * state) Window app_win; if (! - (xkl_engine_priv(engine, listener_type) & - XKLL_MANAGE_WINDOW_STATES)) + (xkl_engine_is_listening_for + (engine, XKLL_MANAGE_WINDOW_STATES))) return; if (xkl_engine_find_toplevel_window(engine, win, &app_win)) diff --git a/libxklavier/xklavier_xmm.c b/libxklavier/xklavier_xmm.c index 3353961..8600ca9 100755 --- a/libxklavier/xklavier_xmm.c +++ b/libxklavier/xklavier_xmm.c @@ -149,7 +149,7 @@ xkl_xmm_find_switch_option(XklEngine * engine, gint keycode, gint xkl_xmm_resume_listen(XklEngine * engine) { - if (xkl_engine_priv(engine, listener_type) & XKLL_MANAGE_LAYOUTS) + if (xkl_engine_is_listening_for(engine, XKLL_MANAGE_LAYOUTS)) xkl_xmm_shortcuts_grab(engine); return 0; } @@ -157,7 +157,7 @@ xkl_xmm_resume_listen(XklEngine * engine) gint xkl_xmm_pause_listen(XklEngine * engine) { - if (xkl_engine_priv(engine, listener_type) & XKLL_MANAGE_LAYOUTS) + if (xkl_engine_is_listening_for(engine, XKLL_MANAGE_LAYOUTS)) xkl_xmm_shortcuts_ungrab(engine); return 0; } -- cgit v1.2.1