Edit

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

Branch :

  • Show log

    Commit

  • Author : Pierre Le Marre
    Date : 2025-06-17 16:43:05
    Hash : 69c3d257
    Message : keymap: Add parameter `latchOnPress` for LatchMods() Some keyboard layouts use `ISO_Level3_Latch` or `ISO_Level5_Latch` to define “built-in” dead keys: - they do not rely on the installation of custom Compose file; - they do not clash with other layouts. However, layout projects usually want the exact same behavior on all OS, but the XKB latch behavior (often misunderstood) also acts as a *set* modifier, which is not expected. The usual behavior of a dead key on Linux, macOS and Windows is: - latch on press; - deactivate as soon as another (non-modifier) key is pressed. Added the parameter `latchOnPress` to `LatchMods()` to enable the aforementioned behavior. As it is incompatible with X11, this feature is available only using the keymap text format v2. [XKB protocol key actions]: https://www.x.org/releases/current/doc/kbproto/xkbproto.html#Key_Actions

  • src/xkbcomp/action.h
  • /*
     * Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
     * SPDX-License-Identifier: HPND
     */
    #pragma once
    
    #include "ast.h"
    #include "keymap.h"
    
    /*
     * This struct contains the default values which every new action
     * (e.g. in an interpret statement) starts off with. It can be
     * modified within the files (see calls to SetDefaultActionField).
     */
    typedef struct {
        union xkb_action actions[_ACTION_TYPE_NUM_ENTRIES];
    } ActionsInfo;
    
    void
    InitActionsInfo(ActionsInfo *info);
    
    bool
    HandleActionDef(struct xkb_context *ctx, enum xkb_keymap_format format,
                    ActionsInfo *info, const struct xkb_mod_set *mods, ExprDef *def,
                    union xkb_action *action);
    
    bool
    SetDefaultActionField(struct xkb_context *ctx, enum xkb_keymap_format format,
                          ActionsInfo *info, struct xkb_mod_set *mods,
                          const char *elem, const char *field, ExprDef *array_ndx,
                          ExprDef *value, enum merge_mode merge);
    
    static inline bool
    isModsUnLockOnPressSupported(enum xkb_keymap_format format)
    {
        /* Lax bound */
        return format >= XKB_KEYMAP_FORMAT_TEXT_V2;
    }
    
    static inline bool
    isGroupLockOnReleaseSupported(enum xkb_keymap_format format)
    {
        /* Lax bound */
        return format >= XKB_KEYMAP_FORMAT_TEXT_V2;
    }
    
    static inline bool
    isModsLatchOnPressSupported(enum xkb_keymap_format format)
    {
        /* Lax bound */
        return format >= XKB_KEYMAP_FORMAT_TEXT_V2;
    }