Change the type of gsettings key "keyboard" from s to as.
Also rename it to "keyboards".
This commit is contained in:
		@ -1,10 +1,10 @@
 | 
				
			|||||||
<?xml version="1.0"?>
 | 
					<?xml version="1.0"?>
 | 
				
			||||||
<schemalist>
 | 
					<schemalist>
 | 
				
			||||||
  <schema id="org.fedorahosted.eekboard" path="/org/fedorahosted/eekboard/">
 | 
					  <schema id="org.fedorahosted.eekboard" path="/org/fedorahosted/eekboard/">
 | 
				
			||||||
    <key name="keyboard" type="s">
 | 
					    <key name="keyboards" type="as">
 | 
				
			||||||
      <default>'us'</default>
 | 
					      <default>['us']</default>
 | 
				
			||||||
      <summary>Keyboard types</summary>
 | 
					      <summary>Keyboard types</summary>
 | 
				
			||||||
      <description>keyboard types (comma separated).</description>
 | 
					      <description>keyboard types.</description>
 | 
				
			||||||
    </key>
 | 
					    </key>
 | 
				
			||||||
    <key name="ui-toolkit" type="s">
 | 
					    <key name="ui-toolkit" type="s">
 | 
				
			||||||
      <default>'gtk'</default>
 | 
					      <default>'gtk'</default>
 | 
				
			||||||
 | 
				
			|||||||
@ -103,17 +103,19 @@ enum FocusListenerType {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static gboolean
 | 
					static gboolean
 | 
				
			||||||
set_keyboard (Client *client,
 | 
					set_keyboards (Client *client,
 | 
				
			||||||
              const gchar    *keyboard)
 | 
					               gchar **keyboards)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if (g_strcmp0 (keyboard, "system") == 0) {
 | 
					    if (g_strv_length (keyboards) == 0) {
 | 
				
			||||||
        if (!client_enable_xkl (client)) {
 | 
					        if (!client_enable_xkl (client)) {
 | 
				
			||||||
            g_printerr ("Can't register xklavier event listeners\n");
 | 
					            g_printerr ("Can't register xklavier event listeners\n");
 | 
				
			||||||
            return FALSE;
 | 
					            return FALSE;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        if (!client_set_keyboard (client, keyboard)) {
 | 
					        if (!client_set_keyboards (client, keyboards)) {
 | 
				
			||||||
            g_printerr ("Can't set keyboard \"%s\"\n", keyboard);
 | 
					            gchar *str = g_strjoinv (", ", keyboards);
 | 
				
			||||||
 | 
					            g_printerr ("Can't set keyboards \"%s\"\n", str);
 | 
				
			||||||
 | 
					            g_free (str);
 | 
				
			||||||
            return FALSE;
 | 
					            return FALSE;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -133,7 +135,7 @@ main (int argc, char **argv)
 | 
				
			|||||||
    GMainLoop *loop = NULL;
 | 
					    GMainLoop *loop = NULL;
 | 
				
			||||||
    gint focus;
 | 
					    gint focus;
 | 
				
			||||||
    GSettings *settings = NULL;
 | 
					    GSettings *settings = NULL;
 | 
				
			||||||
    gchar *keyboard;
 | 
					    gchar **keyboards;
 | 
				
			||||||
    gint retval = 0;
 | 
					    gint retval = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!gtk_init_check (&argc, &argv)) {
 | 
					    if (!gtk_init_check (&argc, &argv)) {
 | 
				
			||||||
@ -312,13 +314,13 @@ main (int argc, char **argv)
 | 
				
			|||||||
                      G_CALLBACK(on_destroyed), loop);
 | 
					                      G_CALLBACK(on_destroyed), loop);
 | 
				
			||||||
    g_object_unref (eekboard);
 | 
					    g_object_unref (eekboard);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    keyboard = g_settings_get_string (settings, "keyboard");
 | 
					    keyboards = g_settings_get_strv (settings, "keyboards");
 | 
				
			||||||
    if (!set_keyboard (client, keyboard)) {
 | 
					    if (!set_keyboards (client, keyboards)) {
 | 
				
			||||||
        g_free (keyboard);
 | 
					        g_strfreev (keyboards);
 | 
				
			||||||
        retval = 1;
 | 
					        retval = 1;
 | 
				
			||||||
        goto out;
 | 
					        goto out;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    g_free (keyboard);
 | 
					    g_strfreev (keyboards);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_main_loop_run (loop);
 | 
					    g_main_loop_run (loop);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										58
									
								
								src/client.c
									
									
									
									
									
								
							
							
						
						
									
										58
									
								
								src/client.c
									
									
									
									
									
								
							@ -127,12 +127,13 @@ static void            focus_listener_cb    (const AtspiEvent       *event,
 | 
				
			|||||||
static gboolean        keystroke_listener_cb (const AtspiDeviceEvent *stroke,
 | 
					static gboolean        keystroke_listener_cb (const AtspiDeviceEvent *stroke,
 | 
				
			||||||
                                              void                   *user_data);
 | 
					                                              void                   *user_data);
 | 
				
			||||||
#endif  /* HAVE_ATSPI */
 | 
					#endif  /* HAVE_ATSPI */
 | 
				
			||||||
static gboolean        set_keyboard         (Client         *client,
 | 
					static gboolean        set_keyboards        (Client                 *client,
 | 
				
			||||||
                                             const gchar            *keyboard);
 | 
					                                             const gchar           **keyboard);
 | 
				
			||||||
static gboolean        set_keyboard_from_xkl (Client         *client);
 | 
					static gboolean        set_keyboards_from_xkl
 | 
				
			||||||
 | 
					                                            (Client                 *client);
 | 
				
			||||||
#ifdef HAVE_XTEST
 | 
					#ifdef HAVE_XTEST
 | 
				
			||||||
static void            update_modifier_keycodes
 | 
					static void            update_modifier_keycodes
 | 
				
			||||||
(Client         *client);
 | 
					                                            (Client                 *client);
 | 
				
			||||||
#endif  /* HAVE_XTEST */
 | 
					#endif  /* HAVE_XTEST */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
@ -297,11 +298,11 @@ client_init (Client *client)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
gboolean
 | 
					gboolean
 | 
				
			||||||
client_set_keyboard (Client *client,
 | 
					client_set_keyboards (Client       *client,
 | 
				
			||||||
                     const gchar    *keyboard)
 | 
					                      const gchar **keyboards)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    gboolean retval;
 | 
					    gboolean retval;
 | 
				
			||||||
    retval = set_keyboard (client, keyboard);
 | 
					    retval = set_keyboards (client, keyboards);
 | 
				
			||||||
    if (retval && IS_KEYBOARD_VISIBLE (client))
 | 
					    if (retval && IS_KEYBOARD_VISIBLE (client))
 | 
				
			||||||
        eekboard_context_show_keyboard (client->context, NULL);
 | 
					        eekboard_context_show_keyboard (client->context, NULL);
 | 
				
			||||||
    return retval;
 | 
					    return retval;
 | 
				
			||||||
@ -343,7 +344,7 @@ client_enable_xkl (Client *client)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    xkl_engine_start_listen (client->xkl_engine, XKLL_TRACK_KEYBOARD_STATE);
 | 
					    xkl_engine_start_listen (client->xkl_engine, XKLL_TRACK_KEYBOARD_STATE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    retval = set_keyboard_from_xkl (client);
 | 
					    retval = set_keyboards_from_xkl (client);
 | 
				
			||||||
    if (IS_KEYBOARD_VISIBLE (client))
 | 
					    if (IS_KEYBOARD_VISIBLE (client))
 | 
				
			||||||
        eekboard_context_show_keyboard (client->context, NULL);
 | 
					        eekboard_context_show_keyboard (client->context, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -697,7 +698,7 @@ on_xkl_config_changed (XklEngine *xklengine,
 | 
				
			|||||||
    Client *client = user_data;
 | 
					    Client *client = user_data;
 | 
				
			||||||
    gboolean retval;
 | 
					    gboolean retval;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    retval = set_keyboard_from_xkl (client);
 | 
					    retval = set_keyboards_from_xkl (client);
 | 
				
			||||||
    g_return_if_fail (retval);
 | 
					    g_return_if_fail (retval);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef HAVE_XTEST
 | 
					#ifdef HAVE_XTEST
 | 
				
			||||||
@ -706,46 +707,39 @@ on_xkl_config_changed (XklEngine *xklengine,
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static gboolean
 | 
					static gboolean
 | 
				
			||||||
set_keyboard (Client *client,
 | 
					set_keyboards (Client       *client,
 | 
				
			||||||
              const gchar *keyboard)
 | 
					               const gchar **keyboards)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    GSList *keyboards = NULL;
 | 
					    guint keyboard_id;
 | 
				
			||||||
    gchar **strv, **p;
 | 
					    gchar **p;
 | 
				
			||||||
 | 
					    GSList *head = NULL;
 | 
				
			||||||
    g_return_val_if_fail (keyboard != NULL, FALSE);
 | 
					 | 
				
			||||||
    g_return_val_if_fail (*keyboard != '\0', FALSE);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (client->keyboards)
 | 
					    if (client->keyboards)
 | 
				
			||||||
        g_slist_free (client->keyboards);
 | 
					        g_slist_free (client->keyboards);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    strv = g_strsplit (keyboard, ",", -1);
 | 
					    for (p = keyboards; *p != NULL; p++) {
 | 
				
			||||||
    for (p = strv; *p != NULL; p++) {
 | 
					        keyboard_id = eekboard_context_add_keyboard (client->context, *p, NULL);
 | 
				
			||||||
        guint keyboard_id;
 | 
					        if (keyboard_id == 0) {
 | 
				
			||||||
 | 
					            g_slist_free (head);
 | 
				
			||||||
        keyboard_id = eekboard_context_add_keyboard (client->context,
 | 
					 | 
				
			||||||
                                                     *p,
 | 
					 | 
				
			||||||
                                                     NULL);
 | 
					 | 
				
			||||||
        if (keyboard_id == 0)
 | 
					 | 
				
			||||||
            return FALSE;
 | 
					            return FALSE;
 | 
				
			||||||
        keyboards = g_slist_prepend (keyboards,
 | 
					 | 
				
			||||||
                                     GUINT_TO_POINTER(keyboard_id));
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    g_strfreev (strv);
 | 
					        head = g_slist_prepend (head, GUINT_TO_POINTER(keyboard_id));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* make a cycle */
 | 
					    /* make a cycle */
 | 
				
			||||||
    keyboards = g_slist_reverse (keyboards);
 | 
					    head = g_slist_reverse (head);
 | 
				
			||||||
    g_slist_last (keyboards)->next = keyboards;
 | 
					    g_slist_last (head)->next = head;
 | 
				
			||||||
    client->keyboards = keyboards;
 | 
					    client->keyboards = head;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* select the first keyboard */
 | 
					    /* select the first keyboard */
 | 
				
			||||||
    eekboard_context_set_keyboard (client->context,
 | 
					    eekboard_context_set_keyboard (client->context,
 | 
				
			||||||
                                   GPOINTER_TO_UINT(keyboards->data),
 | 
					                                   GPOINTER_TO_UINT(head->data),
 | 
				
			||||||
                                   NULL);
 | 
					                                   NULL);
 | 
				
			||||||
    return TRUE;
 | 
					    return TRUE;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static gboolean
 | 
					static gboolean
 | 
				
			||||||
set_keyboard_from_xkl (Client *client)
 | 
					set_keyboards_from_xkl (Client *client)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    XklConfigRec *rec;
 | 
					    XklConfigRec *rec;
 | 
				
			||||||
    gchar *layout, *keyboard;
 | 
					    gchar *layout, *keyboard;
 | 
				
			||||||
 | 
				
			|||||||
@ -33,8 +33,8 @@ typedef struct _Client Client;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Client  *client_new                     (GDBusConnection *connection);
 | 
					Client  *client_new                     (GDBusConnection *connection);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
gboolean client_set_keyboard            (Client          *client,
 | 
					gboolean client_set_keyboards           (Client          *client,
 | 
				
			||||||
                                         const gchar     *keyboard);
 | 
					                                         const gchar    **keyboard);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
gboolean client_enable_xkl              (Client          *client);
 | 
					gboolean client_enable_xkl              (Client          *client);
 | 
				
			||||||
void     client_disable_xkl             (Client          *client);
 | 
					void     client_disable_xkl             (Client          *client);
 | 
				
			||||||
 | 
				
			|||||||
@ -62,6 +62,35 @@ set_rate (const GValue       *value,
 | 
				
			|||||||
    return g_variant_new_uint32 (msecs);
 | 
					    return g_variant_new_uint32 (msecs);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static gboolean
 | 
				
			||||||
 | 
					get_strv (GValue   *value,
 | 
				
			||||||
 | 
					          GVariant *variant,
 | 
				
			||||||
 | 
					          gpointer  user_data)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    gchar *strv = g_variant_get_strv (variant, NULL);
 | 
				
			||||||
 | 
					    gchar *text = g_strjoinv (", ", strv);
 | 
				
			||||||
 | 
					    g_free (strv);
 | 
				
			||||||
 | 
					    g_value_set_string (value, text);
 | 
				
			||||||
 | 
					    return TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static GVariant *
 | 
				
			||||||
 | 
					set_strv (const GValue       *value,
 | 
				
			||||||
 | 
					          const GVariantType *expected_type,
 | 
				
			||||||
 | 
					          gpointer            user_data)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    gchar *text = g_value_get_string (value);
 | 
				
			||||||
 | 
					    gchar **strv = g_strsplit (text, ",", -1), **p;
 | 
				
			||||||
 | 
					    GVariant *variant;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (p = strv; *p != NULL; p++)
 | 
				
			||||||
 | 
					        g_strstrip (*p);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    variant = g_variant_new_strv (strv, -1);
 | 
				
			||||||
 | 
					    g_strfreev (strv);
 | 
				
			||||||
 | 
					    return variant;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PreferencesDialog *
 | 
					PreferencesDialog *
 | 
				
			||||||
preferences_dialog_new (void)
 | 
					preferences_dialog_new (void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -138,9 +167,10 @@ preferences_dialog_new (void)
 | 
				
			|||||||
        gtk_builder_get_object (builder, "keyboard_entry");
 | 
					        gtk_builder_get_object (builder, "keyboard_entry");
 | 
				
			||||||
    dialog->keyboard_entry = GTK_WIDGET(object);
 | 
					    dialog->keyboard_entry = GTK_WIDGET(object);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_settings_bind (dialog->settings, "keyboard",
 | 
					    g_settings_bind_with_mapping (dialog->settings, "keyboards",
 | 
				
			||||||
                                  GTK_ENTRY(dialog->keyboard_entry), "text",
 | 
					                                  GTK_ENTRY(dialog->keyboard_entry), "text",
 | 
				
			||||||
                     G_SETTINGS_BIND_DEFAULT);
 | 
					                                  G_SETTINGS_BIND_DEFAULT,
 | 
				
			||||||
 | 
					                                  get_strv, set_strv, NULL, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return dialog;
 | 
					    return dialog;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user