Edit

kc3-lang/libxkbcommon/src/xkbcomp/rules.h

Branch :

  • Show log

    Commit

  • Author : Pierre Le Marre
    Date : 2025-06-17 11:43:22
    Hash : fab9d25b
    Message : rules: Add support for layout-specific options Enabled specifying a layout index for each option, so that it applies only if the layout matches. The layout index is specified by appending immediately after the option name the `!` specifier delimiter and then the layout index, in decimal form and 1-indexed. Note that `!` was chosen instead of the usual `:` specifier delimiter, because some options contains `:`, e.g. `grp:menu_toggle`. `!` *cannot* clash with component names, because `!` is a token in the rules files and thus cannot be used as in component names. It is also vaguely similar to `:`, compared to e.g. `@` or `#`. Example: given the following rules: ! layout[any] option = symbol * opt1 = +s1:%i l2 opt2 = +s2:%i it may result in the following configurations: | Layout | Option | Symbols | | -------- | -------- | ------------ | | `l1` | `opt1` | `+s1:1` | | `l2` | `opt1` | `+s1:1` | | `l1` | `opt2` | `` | | `l2` | `opt2` | `+s2:1` | | `l1,l2` | `opt1` | `+s1:1+s1:2` | | `l1,l2` | `opt1!1` | `+s1:1` | | `l1,l2` | `opt1!2` | `+s1:2` | | `l1,l2` | `opt2` | `+s2:2` | | `l1,l2` | `opt2!1` | `` | | `l1,l2` | `opt2!2` | `+s2:2` |

  • src/xkbcomp/rules.h
  • /*
     * Copyright © 2009 Dan Nicholson
     * SPDX-License-Identifier: MIT
     */
    #pragma once
    
    #include <stdbool.h>
    
    #include "xkbcomp-priv.h"
    #include "rmlvo.h"
    
    XKB_EXPORT_PRIVATE bool
    xkb_components_from_rmlvo_builder(const struct xkb_rmlvo_builder *rmlvo,
                                      struct xkb_component_names *out,
                                      xkb_layout_index_t *explicit_layouts);
    
    XKB_EXPORT_PRIVATE bool
    xkb_components_from_rules_names(struct xkb_context *ctx,
                                    const struct xkb_rule_names *rmlvo,
                                    struct xkb_component_names *out,
                                    xkb_layout_index_t *explicit_layouts);
    
    /* Maximum length of a layout index string:
     *
     * length = ceiling (bitsize(xkb_layout_index_t) * logBase 10 2)
     *        < ceiling (bitsize(xkb_layout_index_t) * 5 / 16)
     *        < 1 + floor (bitsize(xkb_layout_index_t) * 5 / 16)
     */
    #define MAX_LAYOUT_INDEX_STR_LENGTH \
            (1 + ((sizeof(xkb_layout_index_t) * CHAR_BIT * 5) >> 4))
    
    #define OPTIONS_GROUP_SPECIFIER_PREFIX '!'