EekKey#set_keysym_index(): fallback to level 0 when level exceeds num_levels
This commit is contained in:
		@ -338,38 +338,6 @@ compare_component_name (gchar *name0, gchar *name1)
 | 
			
		||||
        return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
eek_xkb_layout_real_set_names (EekXkbLayout *self, XkbComponentNamesRec *names)
 | 
			
		||||
{
 | 
			
		||||
    EekXkbLayoutPrivate *priv = EEK_XKB_LAYOUT_GET_PRIVATE (self);
 | 
			
		||||
    gboolean is_changed;
 | 
			
		||||
 | 
			
		||||
    g_return_if_fail (priv);
 | 
			
		||||
 | 
			
		||||
    /* keycodes */
 | 
			
		||||
    if (compare_component_name (names->keycodes, priv->names.keycodes) != 0)
 | 
			
		||||
        is_changed = TRUE;
 | 
			
		||||
    g_free (priv->names.keycodes);
 | 
			
		||||
    priv->names.keycodes = g_strdup (names->keycodes);
 | 
			
		||||
 | 
			
		||||
    /* geometry */
 | 
			
		||||
    if (compare_component_name (names->geometry, priv->names.geometry) != 0)
 | 
			
		||||
        is_changed = TRUE;
 | 
			
		||||
    g_free (priv->names.geometry);
 | 
			
		||||
    priv->names.geometry = g_strdup (names->geometry);
 | 
			
		||||
 | 
			
		||||
    /* symbols */
 | 
			
		||||
    if (compare_component_name (names->symbols, priv->names.symbols) != 0)
 | 
			
		||||
        is_changed = TRUE;
 | 
			
		||||
    g_free (priv->names.symbols);
 | 
			
		||||
    priv->names.symbols = g_strdup (names->symbols);
 | 
			
		||||
 | 
			
		||||
    get_keyboard (self);
 | 
			
		||||
 | 
			
		||||
    if (is_changed)
 | 
			
		||||
        g_signal_emit_by_name (self, "changed");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
eek_xkb_layout_finalize (GObject *object)
 | 
			
		||||
{
 | 
			
		||||
@ -469,7 +437,6 @@ eek_xkb_layout_class_init (EekXkbLayoutClass *klass)
 | 
			
		||||
 | 
			
		||||
    g_type_class_add_private (gobject_class, sizeof (EekXkbLayoutPrivate));
 | 
			
		||||
 | 
			
		||||
    klass->set_names = eek_xkb_layout_real_set_names;
 | 
			
		||||
    gobject_class->finalize = eek_xkb_layout_finalize;
 | 
			
		||||
    gobject_class->set_property = eek_xkb_layout_set_property;
 | 
			
		||||
    gobject_class->get_property = eek_xkb_layout_get_property;
 | 
			
		||||
@ -609,29 +576,68 @@ eek_xkb_layout_new (const gchar *keycodes,
 | 
			
		||||
    return EEK_LAYOUT(layout);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * eek_xkb_layout_set_names:
 | 
			
		||||
 * @layout: an #EekXkbLayout
 | 
			
		||||
 * @names: XKB component names
 | 
			
		||||
 *
 | 
			
		||||
 * Set the XKB component names to @layout.
 | 
			
		||||
 * Returns: %TRUE if the component name is successfully set, %FALSE otherwise
 | 
			
		||||
 */
 | 
			
		||||
gboolean
 | 
			
		||||
eek_xkb_layout_set_names (EekXkbLayout *layout, XkbComponentNamesRec *names)
 | 
			
		||||
{
 | 
			
		||||
    EekXkbLayoutPrivate *priv = EEK_XKB_LAYOUT_GET_PRIVATE (layout);
 | 
			
		||||
    gboolean is_changed;
 | 
			
		||||
 | 
			
		||||
    g_return_val_if_fail (priv, FALSE);
 | 
			
		||||
 | 
			
		||||
    /* keycodes */
 | 
			
		||||
    if (compare_component_name (names->keycodes, priv->names.keycodes) != 0)
 | 
			
		||||
        is_changed = TRUE;
 | 
			
		||||
    g_free (priv->names.keycodes);
 | 
			
		||||
    priv->names.keycodes = g_strdup (names->keycodes);
 | 
			
		||||
 | 
			
		||||
    /* geometry */
 | 
			
		||||
    if (compare_component_name (names->geometry, priv->names.geometry) != 0)
 | 
			
		||||
        is_changed = TRUE;
 | 
			
		||||
    g_free (priv->names.geometry);
 | 
			
		||||
    priv->names.geometry = g_strdup (names->geometry);
 | 
			
		||||
 | 
			
		||||
    /* symbols */
 | 
			
		||||
    if (compare_component_name (names->symbols, priv->names.symbols) != 0)
 | 
			
		||||
        is_changed = TRUE;
 | 
			
		||||
    g_free (priv->names.symbols);
 | 
			
		||||
    priv->names.symbols = g_strdup (names->symbols);
 | 
			
		||||
 | 
			
		||||
    get_keyboard (layout);
 | 
			
		||||
    if (!priv->xkb)
 | 
			
		||||
        return FALSE;
 | 
			
		||||
 | 
			
		||||
    if (is_changed)
 | 
			
		||||
        g_signal_emit_by_name (layout, "changed");
 | 
			
		||||
 | 
			
		||||
    return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * eek_xkb_layout_set_keycodes:
 | 
			
		||||
 * @layout: an #EekXkbLayout
 | 
			
		||||
 * @keycodes: component name for keycodes
 | 
			
		||||
 *
 | 
			
		||||
 * Set the keycodes component (in the XKB terminology).
 | 
			
		||||
 * Returns: %TRUE if the component name is successfully set, %FALSE otherwise
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
gboolean
 | 
			
		||||
eek_xkb_layout_set_keycodes (EekXkbLayout *layout, const gchar *keycodes)
 | 
			
		||||
{
 | 
			
		||||
    EekXkbLayoutPrivate *priv = EEK_XKB_LAYOUT_GET_PRIVATE (layout);
 | 
			
		||||
    gboolean is_changed = TRUE;
 | 
			
		||||
    XkbComponentNamesRec names;
 | 
			
		||||
 | 
			
		||||
    g_return_if_fail (priv);
 | 
			
		||||
    if (keycodes && priv->names.keycodes)
 | 
			
		||||
        is_changed = g_strcmp0 (keycodes, priv->names.keycodes) != 0;
 | 
			
		||||
    else if (keycodes == NULL && priv->names.keycodes == NULL)
 | 
			
		||||
        is_changed = FALSE;
 | 
			
		||||
    g_free (priv->names.keycodes);
 | 
			
		||||
    priv->names.keycodes = g_strdup (keycodes);
 | 
			
		||||
    get_keyboard (layout);
 | 
			
		||||
    if (is_changed)
 | 
			
		||||
        g_signal_emit_by_name (layout, "changed");
 | 
			
		||||
    g_return_val_if_fail (priv, FALSE);
 | 
			
		||||
    memcpy (&names, &priv->names, sizeof names);
 | 
			
		||||
    names.keycodes = (gchar *)keycodes;
 | 
			
		||||
    return eek_xkb_layout_set_names (layout, &names);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@ -639,24 +645,18 @@ eek_xkb_layout_set_keycodes (EekXkbLayout *layout, const gchar *keycodes)
 | 
			
		||||
 * @layout: an #EekXkbLayout
 | 
			
		||||
 * @geometry: component name for geometry
 | 
			
		||||
 *
 | 
			
		||||
 * Set the keycodes component (in the XKB terminology).
 | 
			
		||||
 * Returns: %TRUE if the component name is successfully set, %FALSE otherwise
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
gboolean
 | 
			
		||||
eek_xkb_layout_set_geometry (EekXkbLayout *layout, const gchar *geometry)
 | 
			
		||||
{
 | 
			
		||||
    EekXkbLayoutPrivate *priv = EEK_XKB_LAYOUT_GET_PRIVATE (layout);
 | 
			
		||||
    gboolean is_changed = TRUE;
 | 
			
		||||
    XkbComponentNamesRec names;
 | 
			
		||||
 | 
			
		||||
    g_return_if_fail (priv);
 | 
			
		||||
    if (geometry && priv->names.geometry)
 | 
			
		||||
        is_changed = g_strcmp0 (geometry, priv->names.geometry) != 0;
 | 
			
		||||
    else if (geometry == NULL && priv->names.geometry == NULL)
 | 
			
		||||
        is_changed = FALSE;
 | 
			
		||||
    g_free (priv->names.geometry);
 | 
			
		||||
    priv->names.geometry = g_strdup (geometry);
 | 
			
		||||
    get_keyboard (layout);
 | 
			
		||||
    if (is_changed)
 | 
			
		||||
        g_signal_emit_by_name (layout, "changed");
 | 
			
		||||
    g_return_val_if_fail (priv, FALSE);
 | 
			
		||||
    memcpy (&names, &priv->names, sizeof names);
 | 
			
		||||
    names.geometry = (gchar *)geometry;
 | 
			
		||||
    return eek_xkb_layout_set_names (layout, &names);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@ -665,23 +665,18 @@ eek_xkb_layout_set_geometry (EekXkbLayout *layout, const gchar *geometry)
 | 
			
		||||
 * @symbols: component name for symbols
 | 
			
		||||
 *
 | 
			
		||||
 * Set the symbols component (in the XKB terminology).
 | 
			
		||||
 * Returns: %TRUE if the component name is successfully set, %FALSE otherwise
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
gboolean
 | 
			
		||||
eek_xkb_layout_set_symbols (EekXkbLayout *layout, const gchar *symbols)
 | 
			
		||||
{
 | 
			
		||||
    EekXkbLayoutPrivate *priv = EEK_XKB_LAYOUT_GET_PRIVATE (layout);
 | 
			
		||||
    gboolean is_changed = TRUE;
 | 
			
		||||
    XkbComponentNamesRec names;
 | 
			
		||||
 | 
			
		||||
    g_return_if_fail (priv);
 | 
			
		||||
    if (symbols && priv->names.symbols)
 | 
			
		||||
        is_changed = g_strcmp0 (symbols, priv->names.symbols) != 0;
 | 
			
		||||
    else if (symbols == NULL && priv->names.symbols == NULL)
 | 
			
		||||
        is_changed = FALSE;
 | 
			
		||||
    g_free (priv->names.symbols);
 | 
			
		||||
    priv->names.symbols = g_strdup (symbols);
 | 
			
		||||
    get_keyboard (layout);
 | 
			
		||||
    if (is_changed)
 | 
			
		||||
        g_signal_emit_by_name (layout, "changed");
 | 
			
		||||
    g_return_val_if_fail (priv, FALSE);
 | 
			
		||||
    memcpy (&names, &priv->names, sizeof names);
 | 
			
		||||
    names.symbols = (gchar *)symbols;
 | 
			
		||||
    return eek_xkb_layout_set_names (layout, &names);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user