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