summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Udaltsov <svu@gnome.org>2006-03-05 01:53:43 +0000
committerSergey Udaltsov <svu@gnome.org>2006-03-05 01:53:43 +0000
commitc0ae2dd8ddee3f69c4bda217df11ddcdb3b6ddb7 (patch)
tree25b03f47ad27c693a4a882fc0a7dbc96c48653aa
parentc5842939cfa5e43def4040c3fc6c586df7fbdd68 (diff)
downloadlibxklavier-c0ae2dd8ddee3f69c4bda217df11ddcdb3b6ddb7.tar.gz
xmm hashtable used, some polish
-rw-r--r--libxklavier/xklavier.c22
-rw-r--r--libxklavier/xklavier_evt_xkb.c6
-rw-r--r--libxklavier/xklavier_private.h10
-rw-r--r--libxklavier/xklavier_private_xkb.h13
-rw-r--r--libxklavier/xklavier_private_xmm.h13
-rw-r--r--libxklavier/xklavier_xkb.c9
-rwxr-xr-xlibxklavier/xklavier_xmm.c34
-rw-r--r--libxklavier/xklavier_xmm_opts.c203
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;
+}