diff --git a/eek/eek-xkl-layout.c b/eek/eek-xkl-layout.c index 8ca520da..2ff18066 100644 --- a/eek/eek-xkl-layout.c +++ b/eek/eek-xkl-layout.c @@ -441,6 +441,65 @@ eek_xkl_layout_set_options (EekXklLayout *layout, return success; } +/** + * eek_xkl_layout_enable_option: + * @layout: an #EekXklLayout + * @option: option name + * + * Set the option of @layout (in the Libxklavier terminology). + * Returns: %TRUE if the option is successfully set, %FALSE otherwise + */ +gboolean +eek_xkl_layout_enable_option (EekXklLayout *layout, + const gchar *option) +{ + gchar **options, **_options; + gint i, j; + + options = eek_xkl_layout_get_options (layout); + for (i = 0; options && options[i]; i++) + if (g_strcmp0 (options[i], option) == 0) + return TRUE; + _options = g_new0 (gchar *, (i + 2)); + for (j = 0; j < i; j++) + _options[j] = g_strdup (options[j]); + _options[i] = g_strdup (option); + /* eek_xkl_layout_set_options() will free _options and its elements. */ + return eek_xkl_layout_set_options (layout, _options); +} + +/** + * eek_xkl_layout_disable_option: + * @layout: an #EekXklLayout + * @option: option name + * + * Unset the option of @layout (in the Libxklavier terminology). + * Returns: %TRUE if the option is successfully unset, %FALSE otherwise + */ +gboolean +eek_xkl_layout_disable_option (EekXklLayout *layout, + const gchar *option) +{ + gchar **options, **_options; + gint i, j, k; + + options = eek_xkl_layout_get_options (layout); + if (!options) + return TRUE; + for (i = 0, k = 0; options[i]; i++) + if (g_strcmp0 (options[i], option) == 0) + k = i; + if (options[k] == NULL) + return TRUE; + _options = g_new0 (gchar *, i); + for (j = 0; j < k; j++) + _options[j] = g_strdup (options[j]); + for (j = k + 1; j < i; j++) + _options[j] = g_strdup (options[j]); + /* eek_xkl_layout_set_options() will free _options and its elements. */ + return eek_xkl_layout_set_options (layout, _options); +} + /** * eek_xkl_layout_get_model: * @layout: an #EekXklLayout @@ -552,3 +611,25 @@ set_xkb_component_names (EekXklLayout *layout, XklConfigRec *config) } return success; } + +/** + * eek_xkl_layout_get_option: + * @layout: an #EekXklLayout + * @option: option name + * + * Tell if the option of @layout (in the Libxklavier terminology) is set. + * Returns: %TRUE if the option is set, %FALSE otherwise + */ +gboolean +eek_xkl_layout_get_option (EekXklLayout *layout, + const gchar *option) +{ + gchar **options; + gint i; + + options = eek_xkl_layout_get_options (layout); + for (i = 0; options && options[i]; i++) + if (g_strcmp0 (options[i], option) == 0) + return TRUE; + return FALSE; +} diff --git a/eek/eek-xkl-layout.h b/eek/eek-xkl-layout.h index 242c8833..6e777a0e 100644 --- a/eek/eek-xkl-layout.h +++ b/eek/eek-xkl-layout.h @@ -53,27 +53,32 @@ struct _EekXklLayoutClass gpointer pdummy[24]; }; -GType eek_xkl_layout_get_type (void) G_GNUC_CONST; +GType eek_xkl_layout_get_type (void) G_GNUC_CONST; -EekLayout *eek_xkl_layout_new (void); +EekLayout *eek_xkl_layout_new (void); -gboolean eek_xkl_layout_set_config (EekXklLayout *layout, - XklConfigRec *config); +gboolean eek_xkl_layout_set_config (EekXklLayout *layout, + XklConfigRec *config); -gboolean eek_xkl_layout_set_model (EekXklLayout *layout, - const gchar *model); -gboolean eek_xkl_layout_set_layouts (EekXklLayout *layout, - gchar **layouts); -gboolean eek_xkl_layout_set_variants (EekXklLayout *layout, - gchar **variants); -gboolean eek_xkl_layout_set_options (EekXklLayout *layout, - gchar **options); +gboolean eek_xkl_layout_set_model (EekXklLayout *layout, + const gchar *model); +gboolean eek_xkl_layout_set_layouts (EekXklLayout *layout, + gchar **layouts); +gboolean eek_xkl_layout_set_variants (EekXklLayout *layout, + gchar **variants); +gboolean eek_xkl_layout_set_options (EekXklLayout *layout, + gchar **options); +gboolean eek_xkl_layout_enable_option (EekXklLayout *layout, + const gchar *option); +gboolean eek_xkl_layout_disable_option (EekXklLayout *layout, + const gchar *option); -gchar *eek_xkl_layout_get_model (EekXklLayout *layout); -gchar **eek_xkl_layout_get_layouts (EekXklLayout *layout); -gchar **eek_xkl_layout_get_variants - (EekXklLayout *layout); -gchar **eek_xkl_layout_get_options (EekXklLayout *layout); +gchar *eek_xkl_layout_get_model (EekXklLayout *layout); +gchar **eek_xkl_layout_get_layouts (EekXklLayout *layout); +gchar **eek_xkl_layout_get_variants (EekXklLayout *layout); +gchar **eek_xkl_layout_get_options (EekXklLayout *layout); +gboolean eek_xkl_layout_get_option (EekXklLayout *layout, + const gchar *option); G_END_DECLS #endif /* #ifndef EEK_XKL_LAYOUT_H */