Add xkl options to eekboard-desktop-client.
This commit is contained in:
@ -32,10 +32,14 @@ static gboolean opt_session = FALSE;
|
||||
static gchar *opt_address = NULL;
|
||||
|
||||
#ifdef HAVE_CSPI
|
||||
gboolean opt_focus = FALSE;
|
||||
gboolean opt_keystroke = FALSE;
|
||||
static gboolean opt_focus = FALSE;
|
||||
static gboolean opt_keystroke = FALSE;
|
||||
#endif /* HAVE_CSPI */
|
||||
|
||||
static gchar *opt_model = NULL;
|
||||
static gchar *opt_layouts = NULL;
|
||||
static gchar *opt_options = NULL;
|
||||
|
||||
static const GOptionEntry options[] = {
|
||||
{"system", 'y', 0, G_OPTION_ARG_NONE, &opt_system,
|
||||
N_("Connect to the system bus")},
|
||||
@ -49,6 +53,12 @@ static const GOptionEntry options[] = {
|
||||
{"listen-keystroke", 's', 0, G_OPTION_ARG_NONE, &opt_keystroke,
|
||||
N_("Listen keystroke events with AT-SPI")},
|
||||
#endif /* HAVE_CSPI */
|
||||
{"model", '\0', 0, G_OPTION_ARG_STRING, &opt_model,
|
||||
N_("Specify model")},
|
||||
{"layouts", '\0', 0, G_OPTION_ARG_STRING, &opt_layouts,
|
||||
N_("Specify layouts")},
|
||||
{"options", '\0', 0, G_OPTION_ARG_STRING, &opt_options,
|
||||
N_("Specify options")},
|
||||
{NULL}
|
||||
};
|
||||
|
||||
@ -161,7 +171,15 @@ main (int argc, char **argv)
|
||||
}
|
||||
#endif /* HAVE_CSPI */
|
||||
|
||||
if (!eekboard_desktop_client_enable_xkl (client)) {
|
||||
if (opt_model || opt_layouts || opt_options) {
|
||||
if (!eekboard_desktop_client_set_xkl_config (client,
|
||||
opt_model,
|
||||
opt_layouts,
|
||||
opt_options)) {
|
||||
g_printerr ("Can't set xklavier config\n");
|
||||
exit (1);
|
||||
}
|
||||
} else if (!eekboard_desktop_client_enable_xkl (client)) {
|
||||
g_printerr ("Can't register xklavier event listeners\n");
|
||||
exit (1);
|
||||
}
|
||||
|
||||
@ -103,8 +103,11 @@ static SPIBoolean keystroke_listener_cb
|
||||
(const AccessibleKeystroke *stroke,
|
||||
void *user_data);
|
||||
#endif /* HAVE_CSPI */
|
||||
static void set_keyboard (EekboardDesktopClient *client,
|
||||
gboolean show);
|
||||
static gboolean set_keyboard (EekboardDesktopClient *client,
|
||||
gboolean show,
|
||||
const gchar *model,
|
||||
const gchar *layouts,
|
||||
const gchar *options);
|
||||
|
||||
static void
|
||||
eekboard_desktop_client_set_property (GObject *object,
|
||||
@ -258,6 +261,27 @@ eekboard_desktop_client_init (EekboardDesktopClient *client)
|
||||
#endif /* HAVE_FAKEKEY */
|
||||
}
|
||||
|
||||
gboolean
|
||||
eekboard_desktop_client_set_xkl_config (EekboardDesktopClient *client,
|
||||
const gchar *model,
|
||||
const gchar *layouts,
|
||||
const gchar *options)
|
||||
{
|
||||
#ifdef HAVE_CSPI
|
||||
return set_keyboard (client,
|
||||
client->focus_listener ? FALSE : TRUE,
|
||||
model,
|
||||
layouts,
|
||||
options);
|
||||
#else
|
||||
return set_keyboard (client,
|
||||
TRUE,
|
||||
model,
|
||||
layouts,
|
||||
options);
|
||||
#endif
|
||||
}
|
||||
|
||||
gboolean
|
||||
eekboard_desktop_client_enable_xkl (EekboardDesktopClient *client)
|
||||
{
|
||||
@ -295,12 +319,11 @@ eekboard_desktop_client_enable_xkl (EekboardDesktopClient *client)
|
||||
xkl_engine_start_listen (client->xkl_engine, XKLL_TRACK_KEYBOARD_STATE);
|
||||
|
||||
#ifdef HAVE_CSPI
|
||||
set_keyboard (client, client->focus_listener ? FALSE : TRUE);
|
||||
return set_keyboard (client, client->focus_listener ? FALSE : TRUE,
|
||||
NULL, NULL, NULL);
|
||||
#else
|
||||
set_keyboard (client, TRUE);
|
||||
return set_keyboard (client, TRUE, NULL, NULL, NULL);
|
||||
#endif
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
@ -458,8 +481,10 @@ on_xkl_config_changed (XklEngine *xklengine,
|
||||
gpointer user_data)
|
||||
{
|
||||
EekboardDesktopClient *client = user_data;
|
||||
gboolean retval;
|
||||
|
||||
set_keyboard (client, FALSE);
|
||||
retval = set_keyboard (client, FALSE, NULL, NULL, NULL);
|
||||
g_return_if_fail (retval);
|
||||
|
||||
#ifdef HAVE_FAKEKEY
|
||||
if (client->fakekey)
|
||||
@ -467,9 +492,12 @@ on_xkl_config_changed (XklEngine *xklengine,
|
||||
#endif /* HAVE_FAKEKEY */
|
||||
}
|
||||
|
||||
static void
|
||||
static gboolean
|
||||
set_keyboard (EekboardDesktopClient *client,
|
||||
gboolean show)
|
||||
gboolean show,
|
||||
const gchar *model,
|
||||
const gchar *layouts,
|
||||
const gchar *options)
|
||||
{
|
||||
EekLayout *layout;
|
||||
gchar *keyboard_name;
|
||||
@ -479,6 +507,46 @@ set_keyboard (EekboardDesktopClient *client,
|
||||
if (client->keyboard)
|
||||
g_object_unref (client->keyboard);
|
||||
layout = eek_xkl_layout_new ();
|
||||
|
||||
if (model) {
|
||||
if (!eek_xkl_layout_set_model (EEK_XKL_LAYOUT(layout), model)) {
|
||||
g_object_unref (layout);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
if (layouts) {
|
||||
XklConfigRec *rec;
|
||||
|
||||
rec = eekboard_xkl_config_rec_new_from_string (layouts);
|
||||
if (!eek_xkl_layout_set_layouts (EEK_XKL_LAYOUT(layout),
|
||||
rec->layouts)) {
|
||||
g_object_unref (rec);
|
||||
g_object_unref (layout);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (!eek_xkl_layout_set_variants (EEK_XKL_LAYOUT(layout),
|
||||
rec->variants)) {
|
||||
g_object_unref (rec);
|
||||
g_object_unref (layout);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
g_object_unref (rec);
|
||||
}
|
||||
|
||||
if (options) {
|
||||
gchar **options;
|
||||
|
||||
options = g_strsplit (options, ",", -1);
|
||||
if (!eek_xkl_layout_set_options (EEK_XKL_LAYOUT(layout), options)) {
|
||||
g_strfreev (options);
|
||||
g_object_unref (layout);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
client->keyboard = eek_keyboard_new (layout, CSW, CSH);
|
||||
eek_keyboard_set_modifier_behavior (client->keyboard,
|
||||
EEK_MODIFIER_BEHAVIOR_LATCH);
|
||||
@ -492,6 +560,8 @@ set_keyboard (EekboardDesktopClient *client,
|
||||
eekboard_context_set_keyboard (client->context, keyboard_id, NULL);
|
||||
if (show)
|
||||
eekboard_context_show_keyboard (client->context, NULL);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
@ -32,27 +32,33 @@ G_BEGIN_DECLS
|
||||
typedef struct _EekboardDesktopClient EekboardDesktopClient;
|
||||
|
||||
EekboardDesktopClient * eekboard_desktop_client_new
|
||||
(GDBusConnection *connection);
|
||||
(GDBusConnection *connection);
|
||||
|
||||
gboolean eekboard_desktop_client_enable_xkl
|
||||
(EekboardDesktopClient *client);
|
||||
void eekboard_desktop_client_disable_xkl
|
||||
(EekboardDesktopClient *client);
|
||||
gboolean eekboard_desktop_client_set_xkl_config
|
||||
(EekboardDesktopClient *client,
|
||||
const gchar *model,
|
||||
const gchar *layouts,
|
||||
const gchar *options);
|
||||
|
||||
gboolean eekboard_desktop_client_enable_cspi_focus
|
||||
(EekboardDesktopClient *client);
|
||||
void eekboard_desktop_client_disable_cspi_focus
|
||||
(EekboardDesktopClient *client);
|
||||
gboolean eekboard_desktop_client_enable_xkl
|
||||
(EekboardDesktopClient *client);
|
||||
void eekboard_desktop_client_disable_xkl
|
||||
(EekboardDesktopClient *client);
|
||||
|
||||
gboolean eekboard_desktop_client_enable_cspi_keystroke
|
||||
(EekboardDesktopClient *client);
|
||||
void eekboard_desktop_client_disable_cspi_keystroke
|
||||
(EekboardDesktopClient *client);
|
||||
gboolean eekboard_desktop_client_enable_cspi_focus
|
||||
(EekboardDesktopClient *client);
|
||||
void eekboard_desktop_client_disable_cspi_focus
|
||||
(EekboardDesktopClient *client);
|
||||
|
||||
gboolean eekboard_desktop_client_enable_fakekey
|
||||
(EekboardDesktopClient *client);
|
||||
void eekboard_desktop_client_disable_fakekey
|
||||
(EekboardDesktopClient *client);
|
||||
gboolean eekboard_desktop_client_enable_cspi_keystroke
|
||||
(EekboardDesktopClient *client);
|
||||
void eekboard_desktop_client_disable_cspi_keystroke
|
||||
(EekboardDesktopClient *client);
|
||||
|
||||
gboolean eekboard_desktop_client_enable_fakekey
|
||||
(EekboardDesktopClient *client);
|
||||
void eekboard_desktop_client_disable_fakekey
|
||||
(EekboardDesktopClient *client);
|
||||
|
||||
G_END_DECLS
|
||||
#endif /* EEKBOARD_DESKTOP_CLIENT_H */
|
||||
|
||||
Reference in New Issue
Block a user