diff options
author | Sergey Udaltsov <svu@gnome.org> | 2006-03-05 01:53:43 +0000 |
---|---|---|
committer | Sergey Udaltsov <svu@gnome.org> | 2006-03-05 01:53:43 +0000 |
commit | c0ae2dd8ddee3f69c4bda217df11ddcdb3b6ddb7 (patch) | |
tree | 25b03f47ad27c693a4a882fc0a7dbc96c48653aa | |
parent | c5842939cfa5e43def4040c3fc6c586df7fbdd68 (diff) | |
download | libxklavier-c0ae2dd8ddee3f69c4bda217df11ddcdb3b6ddb7.tar.gz |
xmm hashtable used, some polish
-rw-r--r-- | libxklavier/xklavier.c | 22 | ||||
-rw-r--r-- | libxklavier/xklavier_evt_xkb.c | 6 | ||||
-rw-r--r-- | libxklavier/xklavier_private.h | 10 | ||||
-rw-r--r-- | libxklavier/xklavier_private_xkb.h | 13 | ||||
-rw-r--r-- | libxklavier/xklavier_private_xmm.h | 13 | ||||
-rw-r--r-- | libxklavier/xklavier_xkb.c | 9 | ||||
-rwxr-xr-x | libxklavier/xklavier_xmm.c | 34 | ||||
-rw-r--r-- | libxklavier/xklavier_xmm_opts.c | 203 |
8 files changed, 150 insertions, 160 deletions
diff --git a/libxklavier/xklavier.c b/libxklavier/xklavier.c index b318dea..3b2ce2a 100644 --- a/libxklavier/xklavier.c +++ b/libxklavier/xklavier.c @@ -557,20 +557,6 @@ xkl_engine_resume_listen(XklEngine * engine) return 0; } -gboolean -xkl_engine_load_all_info(XklEngine * engine) -{ - xkl_engine_ensure_vtable_inited(engine); - return xkl_engine_vcall(engine, load_all_info) (engine); -} - -void -xkl_engine_free_all_info(XklEngine * engine) -{ - xkl_engine_ensure_vtable_inited(engine); - xkl_engine_vcall(engine, free_all_info) (engine); -} - guint xkl_engine_get_max_num_groups(XklEngine * engine) { @@ -659,7 +645,8 @@ xkl_engine_constructor(GType type, return NULL; } - if (!xkl_engine_load_all_info(engine)) { + xkl_engine_ensure_vtable_inited(engine); + if (!xkl_engine_vcall(engine, load_all_info) (engine)) { g_object_unref(G_OBJECT(engine)); return NULL; } @@ -735,7 +722,10 @@ xkl_engine_finalize(GObject * obj) XSetErrorHandler((XErrorHandler) xkl_engine_priv(engine, default_error_handler)); - xkl_engine_free_all_info(engine); + xkl_engine_ensure_vtable_inited(engine); + xkl_engine_vcall(engine, free_all_info) (engine); + + xkl_engine_vcall(engine, finalize) (engine); gpointer backend = xkl_engine_priv(engine, backend); if (backend != NULL) diff --git a/libxklavier/xklavier_evt_xkb.c b/libxklavier/xklavier_evt_xkb.c index 59694c6..4901e79 100644 --- a/libxklavier/xklavier_evt_xkb.c +++ b/libxklavier/xklavier_evt_xkb.c @@ -131,9 +131,9 @@ xkl_xkb_set_indicators(XklEngine * engine, const XklState * window_state) xkl_engine_backend(engine, XklXkb, cached_desc); ForPhysIndicators(i, bit) if (cached->names->indicators[i] != None) { gboolean status; - status = xkl_engine_set_indicator(engine, i, - (window_state-> - indicators & bit) != 0); + status = xkl_xkb_set_indicator(engine, i, + (window_state-> + indicators & bit) != 0); xkl_debug(150, "Set indicator \"%s\"/%d to %d: %d\n", xkl_engine_backend(engine, XklXkb, indicator_names)[i], diff --git a/libxklavier/xklavier_private.h b/libxklavier/xklavier_private.h index c027ff8..ed1ff59 100644 --- a/libxklavier/xklavier_private.h +++ b/libxklavier/xklavier_private.h @@ -176,6 +176,11 @@ struct _XklEnginePrivate { void (*set_indicators) (XklEngine * engine, const XklState * window_state); + /** + * Perform the cleanup + */ + void (*finalize) (XklEngine * engine); + /* all data is private - no direct access */ /** * The base configuration atom. @@ -238,8 +243,6 @@ extern void xkl_engine_process_state_modification(XklEngine * engine, extern Window xkl_engine_get_registered_parent(XklEngine * engine, Window win); -extern gboolean xkl_engine_load_all_info(XklEngine * engine); -extern void xkl_engine_free_all_info(XklEngine * engine); extern void xkl_engine_reset_all_info(XklEngine * engine, const gchar reason[]); extern gboolean xkl_engine_load_window_tree(XklEngine * engine); @@ -300,9 +303,6 @@ extern Status xkl_engine_query_tree(XklEngine * engine, Window ** children_out, guint * nchildren_out); -extern gboolean xkl_engine_set_indicator(XklEngine * engine, - gint indicator_num, gboolean set); - extern void xkl_engine_try_call_state_func(XklEngine * engine, XklStateChange change_type, XklState * old_state); diff --git a/libxklavier/xklavier_private_xkb.h b/libxklavier/xklavier_private_xkb.h index 5f3d399..1e1153e 100644 --- a/libxklavier/xklavier_private_xkb.h +++ b/libxklavier/xklavier_private_xkb.h @@ -43,19 +43,22 @@ extern void xkl_xkb_config_native_cleanup(XklEngine * engine, XkbComponentNamesPtr component_names); +extern gboolean xkl_xkb_set_indicator(XklEngine * engine, + gint indicator_num, gboolean set); + /* Start VTable methods */ extern gboolean xkl_xkb_activate_config_rec(XklEngine * engine, - const XklConfigRec * data); + const XklConfigRec * data); extern void xkl_xkb_init_config_registry(XklConfigRegistry * config); extern gboolean xkl_xkb_load_config_registry(XklConfigRegistry * config); extern gboolean xkl_xkb_write_config_rec_to_file(XklEngine * engine, - const char *file_name, - const XklConfigRec * data, - const gboolean binary); + const char *file_name, + const XklConfigRec * data, + const gboolean binary); extern gint xkl_xkb_process_x_event(XklEngine * engine, XEvent * kev); @@ -83,6 +86,8 @@ extern gint xkl_xkb_resume_listen(XklEngine * engine); extern void xkl_xkb_set_indicators(XklEngine * engine, const XklState * window_state); +extern void xkl_xkb_term(XklEngine * engine); + /* End of VTable methods */ #else diff --git a/libxklavier/xklavier_private_xmm.h b/libxklavier/xklavier_private_xmm.h index 1e2e1ce..178e7d2 100644 --- a/libxklavier/xklavier_private_xmm.h +++ b/libxklavier/xklavier_private_xmm.h @@ -8,7 +8,6 @@ typedef struct _XmmShortcut { #define MAX_SHORTCUTS_PER_OPTION 4 typedef struct _XmmSwitchOption { - const gchar *option_name; XmmShortcut shortcuts[MAX_SHORTCUTS_PER_OPTION + 1]; gint shortcut_steps[MAX_SHORTCUTS_PER_OPTION + 1]; } XmmSwitchOption; @@ -19,11 +18,11 @@ typedef struct _XklXmm { XklConfigRec current_config; Atom state_atom; + + GHashTable *switch_options; } XklXmm; /* in the ideal world this should be a hashmap */ -extern XmmSwitchOption all_switch_options[]; - extern void xkl_xmm_grab_ignoring_indicators(XklEngine * engine, gint keycode, guint modifiers); @@ -49,6 +48,9 @@ const XmmSwitchOption *xkl_xmm_find_switch_option(XklEngine * engine, gint * current_shortcut_out); +extern void xkl_xmm_init_switch_options(XklXmm * xmm); + +extern void xkl_xmm_term_switch_options(XklXmm * xmm); /* Start VTable methods */ extern gboolean xkl_xmm_activate_config_rec(XklEngine * engine, @@ -81,6 +83,11 @@ extern gint xkl_xmm_listen_pause(XklEngine * engine); extern gint xkl_xmm_listen_resume(XklEngine * engine); +extern void xkl_xmm_set_indicators(XklEngine * engine, + const XklState * window_state); + +extern void xkl_xmm_term(XklEngine * engine); + /* End of VTable methods */ #endif diff --git a/libxklavier/xklavier_xkb.c b/libxklavier/xklavier_xkb.c index 73dad6f..fda8bee 100644 --- a/libxklavier/xklavier_xkb.c +++ b/libxklavier/xklavier_xkb.c @@ -315,8 +315,7 @@ xkl_xkb_get_server_state(XklEngine * engine, XklState * current_state_out) * Actually taken from mxkbledpanel, valueChangedProc */ gboolean -xkl_engine_set_indicator(XklEngine * engine, gint indicator_num, - gboolean set) +xkl_xkb_set_indicator(XklEngine * engine, gint indicator_num, gboolean set) { XkbIndicatorMapPtr map; Display *display = xkl_engine_get_display(engine); @@ -514,6 +513,7 @@ xkl_xkb_init(XklEngine * engine) xkl_engine_priv(engine, pause_listen) = xkl_xkb_pause_listen; xkl_engine_priv(engine, resume_listen) = xkl_xkb_resume_listen; xkl_engine_priv(engine, set_indicators) = xkl_xkb_set_indicators; + xkl_engine_priv(engine, finalize) = xkl_xkb_term; if (getenv("XKL_XKB_DISABLE") != NULL) return -1; @@ -567,6 +567,11 @@ xkl_xkb_init(XklEngine * engine) #endif } +void +xkl_xkb_term(XklEngine * engine) +{ +} + #ifdef XKB_HEADERS_PRESENT const gchar * xkl_xkb_event_get_name(gint xkb_type) diff --git a/libxklavier/xklavier_xmm.c b/libxklavier/xklavier_xmm.c index dd5deec..9761aa9 100755 --- a/libxklavier/xklavier_xmm.c +++ b/libxklavier/xklavier_xmm.c @@ -70,17 +70,16 @@ xkl_xmm_shortcut_get_current(XklEngine * engine) { const gchar *option_name = xkl_xmm_shortcut_get_current_option_name(engine); - XmmSwitchOption *switch_option = all_switch_options; + xkl_debug(150, "Configured switch option: [%s]\n", option_name); + if (option_name == NULL) return NULL; - while (switch_option->option_name != NULL) { - if (!g_ascii_strcasecmp - (switch_option->option_name, option_name)) - return switch_option; - switch_option++; - } - return NULL; + + return (XmmSwitchOption *) + g_hash_table_lookup(xkl_engine_backend + (engine, XklXmm, switch_options), + (gconstpointer) option_name); } const gchar * @@ -269,6 +268,12 @@ xkl_xmm_lock_group(XklEngine * engine, gint group) XSync(display, False); } +void +xkl_xmm_set_indicators(XklEngine * engine, const XklState * window_state) +{ +} + + gint xkl_xmm_init(XklEngine * engine) { @@ -300,7 +305,8 @@ xkl_xmm_init(XklEngine * engine) xkl_xmm_get_server_state; xkl_engine_priv(engine, pause_listen) = xkl_xmm_pause_listen; xkl_engine_priv(engine, resume_listen) = xkl_xmm_resume_listen; - xkl_engine_priv(engine, set_indicators) = NULL; + xkl_engine_priv(engine, set_indicators) = xkl_xmm_set_indicators; + xkl_engine_priv(engine, finalize) = xkl_xmm_term; if (getenv("XKL_XMODMAP_DISABLE") != NULL) return -1; @@ -319,5 +325,15 @@ xkl_xmm_init(XklEngine * engine) xkl_engine_priv(engine, default_model) = "generic"; xkl_engine_priv(engine, default_layout) = "us"; + xkl_xmm_init_switch_options((XklXmm *) + xkl_engine_priv(engine, backend)); + return 0; } + +void +xkl_xmm_term(XklEngine * engine) +{ + xkl_xmm_term_switch_options((XklXmm *) + xkl_engine_priv(engine, backend)); +} diff --git a/libxklavier/xklavier_xmm_opts.c b/libxklavier/xklavier_xmm_opts.c index ea3bbd3..2e6c0f3 100644 --- a/libxklavier/xklavier_xmm_opts.c +++ b/libxklavier/xklavier_xmm_opts.c @@ -15,72 +15,42 @@ #define SHORTCUT_OPTION_PREFIX "grp:" -XmmSwitchOption all_switch_options[] = { - { - "ralt_toggle", - {{XK_Alt_R, 0} - , {XK_VoidSymbol} - } - , {1} - } - , - { - "lalt_toggle", - {{XK_Alt_L, 0} - , {XK_VoidSymbol} - } - , {1} - } - , - { - "caps_toggle", - {{XK_Caps_Lock, 0} - , {XK_VoidSymbol} - } - , {1} - } - , - { - "shift_caps_toggle", - {{XK_Caps_Lock, ShiftMask} - , {XK_VoidSymbol} - } - , {1} - } - , - { - "shifts_toggle", - {{XK_Shift_R, ShiftMask} +static XmmSwitchOption options[] = { + {{{XK_Alt_R, 0} + , {XK_VoidSymbol} + } + , {1}}, + {{{XK_Alt_L, 0} + , {XK_VoidSymbol} + } + , {1}}, + {{{XK_Caps_Lock, 0} + , {XK_VoidSymbol} + } + , {1}}, + {{{XK_Caps_Lock, ShiftMask} + , {XK_VoidSymbol} + } + , {1}}, + {{{XK_Shift_R, ShiftMask} , {XK_Shift_L, ShiftMask} , {XK_VoidSymbol} } - , {1, -1} - } - , - { - "alts_toggle", - {{XK_Alt_R, Mod1Mask} + , {1, -1}}, + {{{XK_Alt_R, Mod1Mask} , {XK_Alt_L, Mod1Mask} , {XK_VoidSymbol} } - , {1, -1} - } - , - { - "ctrls_toggle", - {{XK_Control_R, ControlMask} + , {1, -1}}, + {{{XK_Control_R, ControlMask} , {XK_Control_L, ControlMask} , {XK_VoidSymbol} } - , {1, -1} - } - , - { - "ctrl_shift_toggle", - {{XK_Control_R, ShiftMask} + , {1, -1}}, + {{{XK_Control_R, ShiftMask} , {XK_Control_L, ShiftMask} , @@ -89,12 +59,8 @@ XmmSwitchOption all_switch_options[] = { {XK_Shift_L, ControlMask} , {XK_VoidSymbol} } - , {1, -1, 1, -1} - } - , - { - "ctrl_alt_toggle", - {{XK_Control_R, Mod1Mask} + , {1, -1, 1, -1}}, + {{{XK_Control_R, Mod1Mask} , {XK_Control_L, Mod1Mask} , @@ -103,12 +69,8 @@ XmmSwitchOption all_switch_options[] = { {XK_Alt_L, ControlMask} , {XK_VoidSymbol} } - , {1, -1, 1, -1} - } - , - { - "alt_shift_toggle", - {{XK_Shift_R, Mod1Mask} + , {1, -1, 1, -1}}, + {{{XK_Shift_R, Mod1Mask} , {XK_Shift_L, Mod1Mask} , @@ -117,70 +79,75 @@ XmmSwitchOption all_switch_options[] = { {XK_Alt_L, ShiftMask} , {XK_VoidSymbol} } - , {1, -1, 1, -1} - } - , - { - "menu_toggle", - {{XK_Menu, 0} + , {1, -1, 1, -1}}, + {{{XK_Menu, 0} , {XK_VoidSymbol} } - , {1} - } - , - { - "lwin_toggle", - {{XK_Super_L, 0} + , {1}}, + {{{XK_Super_L, 0} , {XK_VoidSymbol} } - , {1} - } - , - { - "rwin_toggle", - {{XK_Super_R, 0} + , {1}}, + {{{XK_Super_R, 0} , {XK_VoidSymbol} } - , {1} - } - , - { - "lshift_toggle", - {{XK_Shift_L, 0} + , {1}}, + {{{XK_Shift_L, 0} , {XK_VoidSymbol} } - , {1} - } - , - { - "rshift_toggle", - {{XK_Shift_R, 0} + , {1}}, + {{{XK_Shift_R, 0} , {XK_VoidSymbol} } - , {1} - } - , - { - "lctrl_toggle", - {{XK_Control_L, 0} + , {1}}, + {{{XK_Control_L, 0} , {XK_VoidSymbol} } - , {1} - } - , - { - "rctrl_toggle", - {{XK_Control_R, 0} + , {1}}, + {{{XK_Control_R, 0} , {XK_VoidSymbol} } - , {1} - } - , - { - NULL, - {{0, 0} - , {XK_VoidSymbol} - } - , {1} - } + , {1}} +}; + +static const gchar *option_names[] = { + "ralt_toggle", + "lalt_toggle", + "caps_toggle", + "shift_caps_toggle", + "shifts_toggle", + "alts_toggle", + "ctrls_toggle", + "ctrl_shift_toggle", + "ctrl_alt_toggle", + "alt_shift_toggle", + "menu_toggle", + "lwin_toggle", + "rwin_toggle", + "lshift_toggle", + "rshift_toggle", + "lctrl_toggle", + "rctrl_toggle" }; + +void +xkl_xmm_init_switch_options(XklXmm * xmm) +{ + int i; + const gchar **pname = option_names; + const XmmSwitchOption *poption = options; + + xmm->switch_options = g_hash_table_new(g_str_hash, g_str_equal); + + for (i = sizeof(option_names) / sizeof(option_names[0]); --i >= 0;) + g_hash_table_insert(xmm->switch_options, + (gpointer) (*pname++), + (gpointer) (poption++)); +} + +void +xkl_xmm_term_switch_options(XklXmm * xmm) +{ + g_hash_table_destroy(xmm->switch_options); + xmm->switch_options = NULL; +} |