)]}'
{
  "log": [
    {
      "commit": "991f1caa678cbb5e486c5d847e1617f275e7184b",
      "tree": "c00b83d33da277e359e57c817fd6827b4bbb2b15",
      "parents": [
        "9c3a59b5ba52e065e5a5398e728e2b1a41c4983e"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Mon Oct 19 18:32:59 2026 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Mon Oct 19 18:32:59 2026 +0200"
      },
      "message": "vlock: ensure locked VT is active when locking all consoles\n\nvlock -a is documented to lock all console sessions and disable VT\nswitching, telling the user that the entire console display is locked.\nThis guarantee relies entirely on holding VT_PROCESS mode on the active\nVT because vlock refuses switch requests only when its own VT is in the\nforeground (change_console() in the kernel consults only fg_console).\n\nIf a VT switch occurs before VT_SETMODE takes effect during startup,\nor if vlock -a is invoked on a background VT (e.g. \"chvt 2; vlock -a\" or\nvia an idle timer), VT_SETMODE succeeds on the background terminal\nwithout protecting anything. Another console remains active with\nunrestricted switching, while vlock reports success and falsely claims\nthe display is locked.\n\nResolve the current VT number via TIOCGDEV and pull the terminal to\nthe foreground using VT_ACTIVATE and VT_WAITACTIVE after entering\nVT_PROCESS mode. If the VT is already active, the kernel performs no\nswitch. If activation or waiting fails, restore the previous VT mode and\nfail rather than claiming a lock that is not enforced.\n\nReported-by: Vitezslav Crhonek \u003cvcrhonek@redhat.com\u003e\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "9c3a59b5ba52e065e5a5398e728e2b1a41c4983e",
      "tree": "1b2ff2bd607f774ff449cca227d224d2f434ccb5",
      "parents": [
        "a7d8a8a418b6dddbd675d9a7bc4617f101433910"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sun Sep 27 18:28:04 2026 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sun Sep 27 18:28:04 2026 +0200"
      },
      "message": "loadkeys: Select the previous XKB group instead of locking Shift\n\nISO_Prev_Group falls through the generic symbol conversion path, where\nit maps to ShiftL_Lock. Since ShiftL is reserved for group selection,\nthe walker replaces that action with Shift_Lock. Pressing a key bound\nto ISO_Prev_Group therefore locks ordinary Shift instead of selecting\nthe previous layout.\n\nHandle ISO_Prev_Group according to its standard XKB interpretation,\nLockGroup(group\u003d-1). Compute the previous locked group with wraparound\nand reuse the group-selection helper to choose the console action.\nFor a single layout, emit VoidSymbol without changing any lock bits.\n\nEnable the additional KG_CTRLL tables for previous-group selectors in\nkeymaps with three or four layouts. These allow transitions requiring\nboth decoded group bits to change in one console action. Ordinary\nControl keys continue to use KG_CTRL.\n\nCompute the target from the locked group, excluding the temporary\noffset applied by grp:switch. The held switch then continues to select\nthe next group relative to the new locked group, and releasing it\nreveals the selected previous group.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "a7d8a8a418b6dddbd675d9a7bc4617f101433910",
      "tree": "9deae76726e5469387d7f50c12cc44ab4b342c80",
      "parents": [
        "01f608c3f245aaabfb45b49106afe850694efb5e"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sun Sep 27 17:54:32 2026 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sun Sep 27 17:54:32 2026 +0200"
      },
      "message": "loadkeys: Reject grp:shifts_toggle to prevent stuck Shift\n\ngrp:shifts_toggle gives each Shift key two roles: holding Shift and\nswitching groups when the other Shift is held. With us,ru, pressing\nLeftShift, pressing RightShift, then releasing both keys can leave\nthe console Shift modifier active.\n\nThe linux console resolves releases through the current modifier\ntable without remembering the action selected at key press. Releasing\nthe first Shift can therefore invoke a group-switch action, whose\nhandler ignores releases, instead of clearing the modifier. Replacing\nthat binding with Shift would fix release handling but prevent the\nsecond Shift press from switching groups.\n\nReject grp:shifts_toggle before generating any console tables and\nexplain the stuck-modifier risk. Silently dropping the option would\nleave users with a keymap that lacks their requested switching method.\n\nCheck complete option names in comma-separated lists, including\nsurrounding whitespace and group suffixes. Also check options inherited\nfrom XKB_DEFAULT_OPTIONS, while preserving the ability to override that\ndefault with an explicit empty list.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "01f608c3f245aaabfb45b49106afe850694efb5e",
      "tree": "a1e1e5eb81491de87cccb986b53b1a80fe2c4f27",
      "parents": [
        "30c2b6ddf1dc278544eaac54c30d5b44d6e24009"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sun Sep 27 17:35:22 2026 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sun Sep 27 17:35:22 2026 +0200"
      },
      "message": "loadkeys: Prevent XKB Unicode characters from becoming console actions\n\nXKB Unicode keysyms in U+F000..U+FFFF can produce console actions\ninstead of characters. For example, U+F701 becomes 0x0701 after the\nUnicode XOR encoding, which libkeymap interprets as K_ALTGR. Loading\nsuch a binding therefore turns a printable private-use character into\nan AltGr modifier. U+F001 similarly becomes a control character.\n\nChecking that the encoded value fits in an unsigned short does not\ndetect these collisions. Console key bindings use 16-bit values and\nreserve part of that space for actions, so U+F000..U+FFFF cannot be\nrepresented as Unicode characters. Supplementary Unicode characters\nalso exceed the available range.\n\nReject these characters using the original Unicode value before name\nlookup and numeric fallbacks can reinterpret them. Leave unsupported\nbindings unbound without failing conversion of the remaining keymap.\nKeep representable private-use characters below U+F000 and genuine\nmodifier keysyms, including ISO_Level3_Shift, unchanged. Document the\nconsole limitation.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "30c2b6ddf1dc278544eaac54c30d5b44d6e24009",
      "tree": "c06ef4884251dd3aa53825693d3f1ae6badf8ccf",
      "parents": [
        "17a858ce77506891ea49315121b552ba53b8359d"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sun Sep 27 14:14:15 2026 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sun Sep 27 14:14:15 2026 +0200"
      },
      "message": "loadkeys: Accept XKB compose tables without rules\n\nA valid XCOMPOSEFILE containing only comments produces an empty compose\ntable. The importer initializes its return value to -1 and updates it\nonly while processing entries, so an empty iterator makes loadkeys fail\nwithout a diagnostic. Missing compose files already allow conversion\nto continue, but a successfully parsed file without rules does not.\n\nTreat an empty iteration as successful and leave the kernel compose\ntable unchanged. Skip candidate sorting when fewer than two entries\nexist, avoiding qsort() calls with a NULL array for an empty result.\n\nExtend the compose fallback test with a file containing only a comment.\nVerify that libxkbcommon accepts it and exposes no entries before\nchecking that conversion succeeds, preserves key bindings, and adds\nno compose rules. This ensures the test exercises the importer rather\nthan passing through the missing-file fallback.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "17a858ce77506891ea49315121b552ba53b8359d",
      "tree": "b90cb3f7a5e882d0e633fd079933d798a2202206",
      "parents": [
        "88f314686b3c4560f62bf482d43ee50c4ebb70cf"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sun Sep 27 12:18:31 2026 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sun Sep 27 12:18:31 2026 +0200"
      },
      "message": "loadkeys: Preserve absolute XKB group selection\n\ngrp:shift_caps_switch assigns ISO_First_Group to CapsLock and\nISO_Last_Group to Shift+CapsLock. Their standard XKB interpretations\nlock groups 1 and 2, respectively. The converter instead resolves both\nsymbols to ShiftL_Lock and then replaces that action with Shift_Lock.\nConsequently, Shift+CapsLock with us,ru locks Shift instead of selecting\nRussian. The existing test incorrectly expects this behavior.\n\nAbsolute selection cannot be implemented by assigning the same group\ntoggle in every table: selecting an already active group must leave it\nunchanged. Choose the action according to the currently locked group\nand emit VoidSymbol when the requested group is already selected.\nFollow the standard interpretation of ISO_Last_Group as group 2,\nincluding keymaps with more than two groups.\n\nThere is a further limitation with three or four groups. The converter\nencodes group selection using KG_SHIFTL and KG_SHIFTR, while a console\nlock action can toggle only one bit. Some absolute selections require\nboth bits to change. For example, in the four-group encoding, group 3\nuses both bits and group 1 uses neither; neither ShiftL_Lock nor\nShiftR_Lock alone can make that transition.\n\nReserve KG_CTRLL as an additional locked group bit for these keymaps.\nWhen set, it inverts both bits in the decoded group index. The available\nactions then cover all possible changes to that index:\n\n    ShiftL_Lock: toggle the first group bit\n    ShiftR_Lock: toggle the second group bit\n    CtrlL_Lock:  invert both group bits\n\nThis makes the requested group reachable in one console action without\nrequiring a sequence of key presses or changing the kernel interface.\nBoth physical Control keys continue to use KG_CTRL.\n\nKeep KG_CTRLR independent as the temporary group-switch modifier.\nAbsolute selection changes the locked group while the held next-group\noffset remains applied. Releasing the temporary switch therefore\nreturns to the newly selected locked group. Continue resolving per-key\nlayout fallback through libxkbcommon.\n\nAllocate the additional KG_CTRLL tables only when an absolute selector\nis present and the keymap has more than two groups. Such keymaps use\ntables 0-127, or all 256 tables when temporary switching is also needed.\nOne- and two-group keymaps require no additional locked group bit.\n\nReplace the incorrect Shift_Lock expectations with comparisons against\nxkb_state for one through four layouts. Cover every encoded locked\nstate, repeated selections, both Shift/CapsLock release orders, and\nselection while a temporary group switch is held. Check that ordinary\nmodifiers retain their actions throughout the generated tables.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "88f314686b3c4560f62bf482d43ee50c4ebb70cf",
      "tree": "eb071a5a37a4d8d2dea35b056c6ed0552c2c8f13",
      "parents": [
        "d61ce12ce225ce663615870649ab28cc36a98c35"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sat Sep 26 13:03:12 2026 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sat Sep 26 13:03:12 2026 +0200"
      },
      "message": "loadkeys: Support momentary XKB group switching\n\ngrp:switch assigns Mode_switch to RightAlt, but the converter maps it\nto AltGr. With us,ru this selects another symbol level instead of\ntemporarily switching to Russian.\n\nUse KG_CTRLR to distinguish a held group switch from the locked group\nencoded by KG_SHIFTL/KG_SHIFTR. Ordinary Control keys already use\nKG_CTRL, so this does not change their behavior. Generate additional\ntables only when Mode_switch is present, selecting the next group\nwith wraparound while preserving XKB per-key layout fallback.\n\nThe console resolves key releases through the current table rather\nthan remembering the action used on press. Keep CtrlR on group-switch\nkeys throughout the additional tables so that pressing Shift or\nchanging the locked group cannot prevent release of the switch.\nPreserve the original bindings in ordinary tables, including Compose\nwhen Shift is pressed before RightAlt.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "d61ce12ce225ce663615870649ab28cc36a98c35",
      "tree": "fa10fd0fe6516882723a89365664968cc54d06d5",
      "parents": [
        "17668b8a8a629af6facec9ec28aa79c690734f44"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Fri Sep 25 10:29:14 2026 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Fri Sep 25 10:29:14 2026 +0200"
      },
      "message": "loadkeys: Apply CapsLock to shifted XKB letters\n\nOnly unshifted bindings were tagged as KT_LETTER. The shifted binding\nremained KT_LATIN, so Shift+CapsLock produced an uppercase letter\ninstead of returning to lowercase.\n\nThe console handles CapsLock for KT_LETTER by selecting the keymap\nwith KG_SHIFT inverted. Tag eligible letters in shifted tables too,\nallowing both directions of this lookup. Only KG_SHIFT is inverted;\nKG_SHIFTL and KG_SHIFTR retain the selected layout.\n\nCover all four Shift/CapsLock combinations in ordinary and Unicode\nmodes, including checks that digits and punctuation keep their normal\nbehavior. Update the affected snapshots to reflect the letter types.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "17668b8a8a629af6facec9ec28aa79c690734f44",
      "tree": "d48383809d09fe2e83fca6c9b7e5a76abda14d82",
      "parents": [
        "467eace89ae2ab9b171e66b005d17ed0896304f3"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Thu Sep 24 13:41:34 2026 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Fri Sep 25 10:17:21 2026 +0200"
      },
      "message": "docs: Add information about xkb compose conversion\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "467eace89ae2ab9b171e66b005d17ed0896304f3",
      "tree": "11ea5a9254e6c35ae70d2bb311d00ca27b2a2818",
      "parents": [
        "671e9fed371d7b43d2df2571d7aa4d494eabfa52"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Fri Sep 25 10:16:39 2026 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Fri Sep 25 10:17:21 2026 +0200"
      },
      "message": "loadkeys: Preserve named XKB characters across charset fallbacks\n\nThe 8-bit libkeymap name lookup can return a byte from another charset\nwithout retaining its encoding. Interpreting that byte in the current\ncharset changes the character, affecting both key bindings and compose\nresults even when Unicode output is requested.\n\nFor example, ccaron resolves to the ISO-8859-2 byte 0xe8, which becomes\negrave under Latin-1. Similarly, breve becomes cent, and oe/OE become\nonehalf/onequarter.\n\nKeep an 8-bit character code only when its Unicode value in the current\ncharset matches the Unicode name resolution. Otherwise, retain the\nUnicode code. Restrict this check to non-ASCII KT_LATIN symbols so kernel\nactions keep their types and correctly represented bytes remain intact.\n\nCover named characters under ISO-8859-1 and ISO-8859-2, named compose\nresults, and preservation of action types. Correct the four-layout test\nexpectations for oe/OE and update the affected XKB snapshots.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "671e9fed371d7b43d2df2571d7aa4d494eabfa52",
      "tree": "84fad28a6571f1618dfcd1b02efa9abf1f9745bc",
      "parents": [
        "37ecfdddca19e8e796f2ca6617f98b838eed70b8"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Thu Sep 24 13:58:56 2026 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Thu Sep 24 13:59:59 2026 +0200"
      },
      "message": "loadkeys: Keep negative XKB compose scores below higher priorities\n\nCompose scoring subtracts penalties from an unsigned value. When the\ntotal is negative, it wraps around and outranks preferred rules. For\nexample, a + space producing č scores 4294967196 instead of -100,\nplacing it ahead of dead_acute + a, which scores 1750.\n\nThis can select the wrong result for a duplicated XKB sequence and\ndisplace useful rules when the kernel compose table reaches its limit.\n\nUse signed scores and signed comparisons in both sequence selection\nand global priority ordering. Keep keysym and character comparisons\nunsigned.\n\nAdd regression coverage for negative, zero and positive scores,\nincluding competing results for the same input sequence.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "37ecfdddca19e8e796f2ca6617f98b838eed70b8",
      "tree": "4e175ef14d5a65b698ab8967602b09cc5a960a2c",
      "parents": [
        "bc3aee18d3424ce48b62c765481746781dd9cc08"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Thu Sep 24 09:35:29 2026 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Thu Sep 24 09:35:29 2026 +0200"
      },
      "message": "libkeymap: Preserve Unicode compose inputs in text dumps\n\nCompose inputs are printed with %c, which truncates Unicode values\nto a byte. For example, Greek alpha (U+03B1) becomes 0xB1, so reading\nthe dump back changes the base character and breaks the compose rule.\n\nPrint non-ASCII inputs as U+XXXX when LK_FLAG_PREFER_UNICODE is set.\nUse this notation for both the accent and base, including values in\nU+0080..U+00FF: emitting those as raw bytes would make their meaning\ndepend on the charset selected when reading the dump. Preserve the\nexisting ASCII escaping and 8-bit output.\n\nAdd round-trip coverage that compares all three numeric fields after\nreparsing with ISO-8859-2 selected, and update the Greek XKB snapshot.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "bc3aee18d3424ce48b62c765481746781dd9cc08",
      "tree": "b14ce31f9066bbcaea22401173678eb199d3ce4f",
      "parents": [
        "16809e290db0e4faa21636ddf1c6df4f24423d8b"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Thu Sep 24 09:07:24 2026 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Thu Sep 24 09:07:24 2026 +0200"
      },
      "message": "loadkeys: Resolve conflicting XKB compose rules by input pair\n\nThe console looks up compose rules by accent and base character and\nuses the first matching result. Keeping rules with identical inputs\nbut different results leaves unreachable entries that consume space\nin the limited kernel compose table.\n\nCompare input pairs after conversion to the encoding used by\nlk_append_compose(), keeping the highest-ranked candidate for each\npair. This also catches collisions between different libkeymap\nrepresentations of the same character.\n\nDo not award base-letter priority to a second dead keysym merely\nbecause its kernel accent is an ASCII letter. Otherwise,\ndead_caron + dead_caron competes with dead_caron + c as (\u0027c\u0027, \u0027c\u0027)\nand can displace the rule producing č. The same problem affects\ndead_breve + U and the result Ŭ.\n\nPrefer the accented-letter rules in these cases. The console cannot\ndistinguish the original sequences once their inputs have collapsed,\nso repeated dead keys necessarily use the selected result too.\n\nExtend tests to cover conflicting results after encoding conversion\nin both 8-bit and Unicode modes, and repeated caron and breve keys.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "16809e290db0e4faa21636ddf1c6df4f24423d8b",
      "tree": "11f44596eafe977ecedd57b53dffc1f6fdaebcab",
      "parents": [
        "bfe9e881394503047ecbba44dbff11dbe7f0ee1e"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Thu Sep 24 08:52:32 2026 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Thu Sep 24 08:52:32 2026 +0200"
      },
      "message": "loadkeys: Preserve distinct XKB dead-key actions\n\nThe libkeymap names dead_caron, dead_breve, dead_doubleacute and\ndead_ogonek are historical aliases retained for old console keymaps.\nResolving XKB keysyms through these aliases merges accents that XKB\ntreats as distinct.\n\nFor example, dead_caron and dead_circumflex both become K_DCIRCM,\ncausing their compose rules for \u0027c\u0027 to share the same input pair\ndespite producing different characters, č and ĉ.\n\nResolve these four XKB keysyms to the corresponding dead_k* names\nbefore ordinary name lookup. This preserves the distinct kernel\nactions and their compose accent characters while retaining the\nlegacy aliases for existing console keymaps.\n\nAdd regression coverage for the actions and imported compose rules,\nand update the affected snapshots. Collisions between repeated dead\nkeys and literal accent characters still require separate handling.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "bfe9e881394503047ecbba44dbff11dbe7f0ee1e",
      "tree": "340c538dd77913543b0c771f3c33c6dda5f3efe3",
      "parents": [
        "f76bb24065554899bdd4d3dd10e49d1d5fe7fb68"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Thu Sep 24 08:38:59 2026 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Thu Sep 24 08:38:59 2026 +0200"
      },
      "message": "loadkeys: Use accent characters in imported XKB compose rules\n\nThe console resolves dead-key actions to accent characters before\nlooking up compose rules. Importing the action codes themselves leaves\nrules that cannot match: \u003cdead_acute\u003e \u003ca\u003e stores K_DACUTE (0x401), while\nthe kernel looks for an apostrophe (0x27) followed by \u0027a\u0027.\n\nTranslate KT_DEAD and KT_DEAD2 actions to the characters passed to\nk_deadunicode(). Apply this to both compose inputs, since the second\nkeysym can also be a dead key. Keep insertion through lk_append_compose()\nso the resulting characters follow the selected libkeymap encoding.\n\nCover dead_acute followed by a letter and by another dead_acute in both\n8-bit and Unicode modes, and update the affected compose snapshots.\nConflicting rules caused by historical dead-key aliases and Unicode\ntruncation in text dumps remain separate issues\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "f76bb24065554899bdd4d3dd10e49d1d5fe7fb68",
      "tree": "2b28ec62a70adc593a6a552d05693310bc519a37",
      "parents": [
        "0bb93f7bfcb31e9682912de9f4ac3df4aa64ccb3"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Wed Sep 23 23:53:42 2026 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Wed Sep 23 23:59:46 2026 +0200"
      },
      "message": "loadkeys: Resolve XKB bindings for each console modifier state\n\nLoading the US XKB layout leaves Ctrl+C, Shift+Enter and Shift+Space\nunbound. The importer selects one modifier mask per XKB level, but the\nconsole needs an entry for every supported modifier combination. A\nmissing entry does not inherit the symbol from the unmodified table.\n\nxkb_keymap_key_get_mods_for_level() answers which masks can select a\nlevel. It does not enumerate every combination of modifiers ignored by\nthe key type, and its default-level handling may return only the empty\nmask. Iterating all returned masks would therefore still leave holes.\nIt also does not provide the Control character transformation needed\nto turn Ctrl+C into ETX.\n\nResolve each combination of Shift, AltGr, Control and Alt through\nxkb_state for every console group. This asks the forward question the\nimporter actually needs: which layout and level does this key select\nunder these modifiers? It also delegates per-key layout fallback and\nconsumed-modifier handling to libxkbcommon.\n\nKeep the existing keysym-to-console conversion so keypad symbols and\nconsole actions retain their kernel meaning. Apply Control character\nconversion and Alt/Meta handling only when those modifiers were not\nconsumed in selecting the XKB level. Resolve each binding directly in\nthe key walk, without choosing a representative table and copying its\ncontents into other tables.\n\nThe state object is private to the conversion. Each lookup starts with\nxkb_state_update_mask(), supplying all six modifier and group\ncomponents explicitly: the requested depressed modifiers and group,\nwith the remaining components set to zero. These assignments replace\nthe previous components, so one lookup does not accumulate modifier\nor group state from an earlier lookup.\n\nThe walk never calls xkb_state_update_key() on this object. It does not\nsimulate key presses or execute their latch and lock actions. Updating\nthe masks only recomputes the object\u0027s internal effective state,\nincluding its logical LED state; it does not change physical LEDs,\nthe active VT or the system keymap. The existing modifier-discovery\nprobes use a separate state object. This remains a conversion of\nexplicit modifier states, not an emulation of arbitrary XKB action\nsequences.\n\nDisable automatic alt_is_meta insertion while building the tables.\nOtherwise a synthesized Meta entry can precede the explicit XKB\nbinding and make the result depend on insertion order. Also continue\nprocessing other states after ISO_Next_Group, allowing Shift+CapsLock\nto retain Caps_Lock with grp:caps_toggle.\n\nExtend regression coverage for Control and Meta combinations, ignored\nmodifiers, AltGr, modifier release and group fallback. Refresh the\nsnapshots for the completed tables; their compose rules are unchanged.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "0bb93f7bfcb31e9682912de9f4ac3df4aa64ccb3",
      "tree": "9ba55235ed37aebe90784560368ca2ae3f45d428",
      "parents": [
        "d778c47c3a94a677463aad6e56080cda81696cf8"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Wed Sep 23 13:14:01 2026 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Wed Sep 23 23:59:46 2026 +0200"
      },
      "message": "loadkeys: Fix AltGr table selection for XKB layouts\n\nXKB LevelThree bindings are stored in the kernel Alt tables, but\nISO_Level3_Shift is converted to the AltGr action. Pressing AltGr\ntherefore selects a different table from the one holding those symbols.\nFor example, loading the German layout leaves AltGr+7 unable to\nproduce \u0027{\u0027 and AltGr+Q unable to produce \u0027@\u0027.\n\nMap LevelThree to KG_ALTGR so its bindings match the modifier action.\nCover the reported German combinations with both pc104 and pc105,\nincluding Shift+AltGr and modifier release bindings. Correct existing\ntest expectations that encoded the same mismatch.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "d778c47c3a94a677463aad6e56080cda81696cf8",
      "tree": "562323137bbc71506cff066e683028da87c8b17c",
      "parents": [
        "534d71ede7a968b29490e24da73e345791ff3f2c"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Wed Sep 23 23:58:22 2026 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Wed Sep 23 23:59:46 2026 +0200"
      },
      "message": "loadkeys: Accept layouts and variants from the extra XKB registry\n\nxkeyboard-config lists some valid layouts and variants only in\nevdev.extras.xml. The registry does not load these entries by default,\nso RMLVO validation rejects names that libxkbcommon can compile.  For\nexample, --xkb-layout\u003dapl is rejected as an unknown layout.\n\nLoad the extra registry entries so validation accepts these layouts and\nvariants while continuing to reject unrecognized names. Add a regression\ncase for us(intl-unicode), which is listed only in the extra registry\nshipped with the test fixtures.\n\nFixes: b4b26fbb (\"loadkeys: Reject unrecognized xkb model, layout, and variant\")\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "534d71ede7a968b29490e24da73e345791ff3f2c",
      "tree": "04d1baf75c30d2a5d66f0556b280ed1c3c22b526",
      "parents": [
        "b4b26fbb2d659acb53e5d69e9cdba535aa00f65e",
        "defe9ea8775115eea97411c1fffd3bf6727a16c0"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Tue Sep 22 16:05:54 2026 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Tue Sep 22 16:05:54 2026 +0200"
      },
      "message": "* github-pull-161:\n  Fix spelling error of \"allows doing\"\n"
    },
    {
      "commit": "b4b26fbb2d659acb53e5d69e9cdba535aa00f65e",
      "tree": "9318be4e5afb32ed97514a292cabf80855842457",
      "parents": [
        "a8cd4254f215dda61baf45d14f2af7fc4750cdee"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Tue Sep 22 16:00:42 2026 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Tue Sep 22 16:02:46 2026 +0200"
      },
      "message": "loadkeys: Reject unrecognized xkb model, layout, and variant\n\nEvdev rules are model-independent (every model maps to the same\nkeycodes component) and layout/variant are resolved through\nwildcard substitution, so `loadkeys --xkb-model\u003dfoobar` exited with\nstatus 0 despite the model not existing.\n\nLink: https://github.com/legionus/kbd/issues/163\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "a8cd4254f215dda61baf45d14f2af7fc4750cdee",
      "tree": "330d20f79a54787da8ea55e9c1a8b415e1798137",
      "parents": [
        "81b0e2479dac487ff90d42df7ad96d71855688b6"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Mon Sep 21 21:05:03 2026 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Mon Sep 21 21:10:08 2026 +0200"
      },
      "message": "configure: Fail when a compression library is requested but missing\n\n--with-zlib, --with-bzip2, --with-lzma and --with-zstd each fell\nthrough to no support when their library was not available, while\nadvertising \"default\u003dauto\" in --help.  The options were therefore\nsilently ignored: a build with an explicit --with-zlib request\ncompleted successfully and shipped without zlib decompression, the\nsame problem class as --enable-xkb previously.\n\nTreat an explicit --with-* as a hard requirement and fail with a\nclear error when the library cannot be found.  The default stays an\nunconditional probe (the previous behavior), so unrequested builds\ncontinue to degrade gracefully, and --without-* is unchanged.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "81b0e2479dac487ff90d42df7ad96d71855688b6",
      "tree": "4cd0dc380a165c7ee58315ddc10784009c3cd5c3",
      "parents": [
        "dccf225644c3c44510079e12e0a64099a2547169"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Mon Sep 21 18:39:17 2026 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Mon Sep 21 21:10:08 2026 +0200"
      },
      "message": "configure: Fail when compress program is missing\n\nOption --enable-compress\u003d\u003cprog\u003e quietly fell back to no compression when\nthe requested program was not found, so a build with an explicit\ncompression choice completed successfully while installing uncompressed\ndata.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "dccf225644c3c44510079e12e0a64099a2547169",
      "tree": "0085c79ea2796dabe7d3893643a2ead0ca2a166a",
      "parents": [
        "6ff3161c1e5d448920d412a269716cf42be155b5"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Mon Sep 21 18:23:18 2026 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Mon Sep 21 21:09:54 2026 +0200"
      },
      "message": "configure: Fail when xkb support is requested but xkbcommon is missing\n\nOption --enable-xkb unconditionally fell back to USE_XKB\u003dno when\nPKG_CHECK_MODULES could not find xkbcommon, so configure completed\nsuccessfully while silently building without the very support the\nuser had explicitly asked for.\n\nRun the check with a hard AC_MSG_ERROR when xkb is explicitly enabled,\nwhile keeping the auto default and --disable-xkb gracefully degrading\nto no xkb support.\n\nLink: https://github.com/legionus/kbd/issues/160\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "defe9ea8775115eea97411c1fffd3bf6727a16c0",
      "tree": "4f1a184209acdc4a21f744931dc85874824fff56",
      "parents": [
        "6ff3161c1e5d448920d412a269716cf42be155b5"
      ],
      "author": {
        "name": "Benjamin Drung",
        "email": "benjamin.drung@canonical.com",
        "time": "Mon Sep 21 16:48:31 2026 +0200"
      },
      "committer": {
        "name": "Benjamin Drung",
        "email": "benjamin.drung@canonical.com",
        "time": "Mon Sep 21 16:48:31 2026 +0200"
      },
      "message": "Fix spelling error of \"allows doing\"\n\nThe phrase \"allows to do\" is incorrect. It must either be \"allows one to do\"\nor \"allows doing\".\n\nSigned-off-by: Benjamin Drung \u003cbenjamin.drung@canonical.com\u003e\n"
    },
    {
      "commit": "6ff3161c1e5d448920d412a269716cf42be155b5",
      "tree": "a1680388fd6eaa1d1b29e9d8e4d9ca81d2e25084",
      "parents": [
        "1c155cf921142f8636d7056f03f261fb4f2b6607"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Mon Sep 21 12:15:00 2026 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Mon Sep 21 12:35:30 2026 +0200"
      },
      "message": "libkbdfile: Require dlopen and memfd_create for library decompressors\n\nThe library decompressors need dlopen() to load compression libraries\nand memfd_create() to hold decompressed data. Building them without\nthese facilities can fail even though external decompression commands\nremain available.\n\nEnable the library backends and ELF note support only when both\nrequirements are met, and apply the same condition to the ELF note\ntest. Otherwise, retain the external-command fallback.\n\nAlso restrict the libbz2 fallback probe to failed pkg-config lookups\nso that --without-bzip2 does not inadvertently enable bzip2 support.\n\nLink: https://github.com/legionus/kbd/issues/159\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "1c155cf921142f8636d7056f03f261fb4f2b6607",
      "tree": "998383b36b554df7e947880b376c26d83611f8dc",
      "parents": [
        "e2e406e650e85c7cf5c4cf45eb3ad7f70580bab5"
      ],
      "author": {
        "name": "Simon Lederhilger",
        "email": "simon.lederhilger@gmail.com",
        "time": "Tue Aug 25 14:04:26 2026 +0200"
      },
      "committer": {
        "name": "Simon Lederhilger",
        "email": "simon.lederhilger@gmail.com",
        "time": "Tue Aug 25 14:04:26 2026 +0200"
      },
      "message": "Enabling Alt+Shift as Meta for no.map.\n\nThe majority Norwegian keyboards use the left Alt button as Meta.\nAdd map 9 and enable alt_is_meta.\n\nSigned-off-by: Simon Lederhilger \u003csimon.lederhilger@gmail.com\u003e\n"
    },
    {
      "commit": "e2e406e650e85c7cf5c4cf45eb3ad7f70580bab5",
      "tree": "f76fcb4aa7eb9510d856c63d7d50f8a44399ea24",
      "parents": [
        "7173c687f5fe790cb38c398fecbc6c33dd50153a"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Mon Aug 17 13:23:31 2026 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Mon Aug 17 13:23:31 2026 +0200"
      },
      "message": "Use reallocarray if available\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "7173c687f5fe790cb38c398fecbc6c33dd50153a",
      "tree": "fd50abed1fe088bf0da6791146f9d21bcd2ff108",
      "parents": [
        "20d0a5922a8db37ad27e8c6974155b10cc97ae8a"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Mon Aug 17 11:46:05 2026 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Mon Aug 17 11:46:05 2026 +0200"
      },
      "message": "libkfont: Fix buffer overflow in add_unipair\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "20d0a5922a8db37ad27e8c6974155b10cc97ae8a",
      "tree": "5c3211746be975e9d72f40a98eaca67094e5a50d",
      "parents": [
        "1ec337d795b120ad7f95c2a119ea668152979f41"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Mon Aug 17 11:32:40 2026 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Mon Aug 17 11:32:40 2026 +0200"
      },
      "message": "libkfont: Add validation for font parameters\n\nSome parameter values may cause an unsigned integer overflow or division\nby zero.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "1ec337d795b120ad7f95c2a119ea668152979f41",
      "tree": "67b3e395311525b41f199102d2dee8c85bffdf08",
      "parents": [
        "bdba2e6cc69842cf5a1a9754ae8cc2ddfc2d97b5",
        "07fde764e803f7ab5feb0d80466e4b9e6a21a5ae"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Fri Jun 26 11:23:43 2026 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Fri Jun 26 11:23:43 2026 +0200"
      },
      "message": "Merge branch \u0027github-pull-155\u0027\n\nIn Brazillian Lenovo Thinkpads there\u0027s no right control key, and\nkeycode\u003d97 is (slash question degree). All the other keys are mapped\nexactly like br-abnt2.map.\n\nLink: https://github.com/legionus/kbd/pull/155\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "bdba2e6cc69842cf5a1a9754ae8cc2ddfc2d97b5",
      "tree": "1576158fe6de673ed846fe753669a4233de75b69",
      "parents": [
        "85011c479f11ce1761b6f9fc0d3cb8c143687221"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Thu Jun 25 17:42:08 2026 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Thu Jun 25 17:42:08 2026 +0200"
      },
      "message": "loadkeys: Allow tkeymap to dump numeric values\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "07fde764e803f7ab5feb0d80466e4b9e6a21a5ae",
      "tree": "c8200b41ff59d1b0447d13afdb9bb4d0f1c74f15",
      "parents": [
        "85011c479f11ce1761b6f9fc0d3cb8c143687221"
      ],
      "author": {
        "name": "Eduardo Lopes",
        "email": "eduol1975@gmail.com",
        "time": "Sat Jun 20 23:24:00 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jun 20 23:24:00 2026 -0400"
      },
      "message": "Map for the thinkpad variant of br-abnt2 keyboard\n\nSigned-off-by: Eduardo Lopes  \u003ceduol1975@gmail.com\u003e"
    },
    {
      "commit": "85011c479f11ce1761b6f9fc0d3cb8c143687221",
      "tree": "a626eb6f879aa2d55927d91b30be5ac32a241ab5",
      "parents": [
        "8eff1ed9100ed14e455f5438101037d6320474bd"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sat May 30 15:14:16 2026 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sat May 30 15:14:16 2026 +0200"
      },
      "message": "docs: Document XKB keymap conversion\n\nExplain how loadkeys can use XKB layout descriptions as input for Linux\nvirtual console keymaps when kbd is built with libxkbcommon support.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "8eff1ed9100ed14e455f5438101037d6320474bd",
      "tree": "fe241dcded1861ddd3ce83c5c50048c8d3fa3c87",
      "parents": [
        "7ca0bf04622a03eb0398ce88a2a94ea438c5d6f3"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sun May 24 17:32:42 2026 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Mon May 25 09:23:43 2026 +0200"
      },
      "message": "v2.10.0\n\nutils:\n+ openvt: make -u process matching more conservative.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "7ca0bf04622a03eb0398ce88a2a94ea438c5d6f3",
      "tree": "1c27a4398845738ebd7eeecb822bfe16ba1865d8",
      "parents": [
        "78d5ae119742e87baa7dbe0f5c4107e7533fd698"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sun May 24 17:31:34 2026 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Mon May 25 09:14:59 2026 +0200"
      },
      "message": "po: Update translations (from translationproject.org)\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "78d5ae119742e87baa7dbe0f5c4107e7533fd698",
      "tree": "d078b864645050bd400f08550a5889965e81e06a",
      "parents": [
        "433c3c7f7ec72ddc66860b34b8f0d1f68bd1a184"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Tue May 12 10:20:50 2026 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Tue May 12 10:20:50 2026 +0200"
      },
      "message": "openvt: make -u process matching more conservative\n\nThe -u mode relies on the current VT owner to decide which user should\nbe used for the new login session. Make that check stricter by requiring\na matching process owner and controlling terminal instead of relying on\nthe ownership of an inherited file descriptor.\n\nAlso reject root as a pre-authenticated target and document the tighter\nbehavior in the man page.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "433c3c7f7ec72ddc66860b34b8f0d1f68bd1a184",
      "tree": "207e60a5c634efacad8f53efa83b5c7612f21c3c",
      "parents": [
        "8dbe02cb90976f565edb7bc381f0d41ff0fc4038"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sat May 09 18:47:28 2026 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sun May 10 12:37:52 2026 +0200"
      },
      "message": "v2.10-rc1\n\nkeymaps:\n+ Add Backtab keysym and update keymaps to use it for Shift+Tab.\n+ Add keymap for Norwegian Apple ISO keyboard.\n+ Adjust Swiss German keyboard mappings.\n\nlibkeymap:\n+ Add API to validate keysyms.\n+ Add XKB-aware symbol aliases through the normal synonym tables.\n+ Fix compose table upload limit handling.\n\nutils:\n+ loadkeys: Add support for generating console keymaps from XKB.\n+ loadkeys: Add XKB compose import support.\n+ loadkeys: Add support for XKB group switching, modifier handling,\n  virtual console switching and keypad/editing remaps.\n+ loadkeys: Add diagnostics for XKB keysym coverage.\n\ncontrib:\n+ Add an XKB keysym coverage diagnostic tool.\n+ Add a VT layout indicator using keyboard LED lock triggers.\n\nbuild:\n+ Add a project-level coverage-report target.\n+ Keep coverage flags and gcov runtime linking consistent.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "8dbe02cb90976f565edb7bc381f0d41ff0fc4038",
      "tree": "cf42d915ec2e410e0a34276c972dce7b347d0ebd",
      "parents": [
        "49ab4915f1220ec029f4e18f7abebe95a4d5618e"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sun May 10 12:37:17 2026 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sun May 10 12:37:52 2026 +0200"
      },
      "message": "CI: add packages for xkb tests\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "49ab4915f1220ec029f4e18f7abebe95a4d5618e",
      "tree": "c8a10fb31fa0292818d9acb5296cc31a19fc204f",
      "parents": [
        "dd838555e69c2bfd37d04f7315b8aee9bff075d6"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sun May 10 11:42:45 2026 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sun May 10 11:43:07 2026 +0200"
      },
      "message": "xkb: fix xkbcommon detection\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "dd838555e69c2bfd37d04f7315b8aee9bff075d6",
      "tree": "dd187e594b5f654c5b5291621f8c37c418dde7f7",
      "parents": [
        "1e8ae79bc6e408a2092fa24b7b11c4d59eb46457"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sat May 09 18:45:54 2026 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sat May 09 18:45:54 2026 +0200"
      },
      "message": "Update gitignore\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "1e8ae79bc6e408a2092fa24b7b11c4d59eb46457",
      "tree": "1dc353c0c9e63e4b7531b60708a069f44662d766",
      "parents": [
        "b6d77d6be520d666c666cb5e8df6a4ecdda4f46a"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sat May 09 18:44:35 2026 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sat May 09 18:44:35 2026 +0200"
      },
      "message": "fixup! po: Update translations (from translationproject.org)\n"
    },
    {
      "commit": "b6d77d6be520d666c666cb5e8df6a4ecdda4f46a",
      "tree": "dba91aff18276b3901e3e09d7db4d2444b909965",
      "parents": [
        "d1a43f29fd29a783b4b044a77ae5bdc86f8484c4"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sat May 09 18:30:58 2026 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sat May 09 18:30:58 2026 +0200"
      },
      "message": "build: test fortify redefinition under optimization\n\nSome toolchains, including gentoo configurations, define _FORTIFY_SOURCE\nthrough compiler specs only when optimization is enabled.\n\nAX_ADD_FORTIFY_SOURCE checked whether _FORTIFY_SOURCE was already\ndefined before the project added its normal -O2 flag. That made the\nconfigure test run in a different mode from the real build: the test saw\nno existing fortify definition and added -D_FORTIFY_SOURCE\u003d3 to\nCPPFLAGS, while the later optimized build also got toolchain-provided\ndefinition. The result was a repeated warning on every compile:\n\n    warning: \u0027_FORTIFY_SOURCE\u0027 redefined\n\nRun the probe with -O2 and include a system header so compiler-provided\nfortify is visible during the check. If the toolchain already defines it\nin optimized builds, leave CPPFLAGS unchanged instead of adding another\ndefinition.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "d1a43f29fd29a783b4b044a77ae5bdc86f8484c4",
      "tree": "7940fda634c949470153b9c70646909bceae89ee",
      "parents": [
        "427e682ff3c976517aec58ed04b9af484feefabd"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sat May 09 14:33:28 2026 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sat May 09 14:33:28 2026 +0200"
      },
      "message": "po: Update translations (from translationproject.org)\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "427e682ff3c976517aec58ed04b9af484feefabd",
      "tree": "6554e4e6d961006cc6995be1bbf797b4cc023813",
      "parents": [
        "7719a6e7d81e162d06652eafb3c295043763ba08"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sat May 09 13:45:08 2026 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sat May 09 13:45:08 2026 +0200"
      },
      "message": "tests: fix check without xkb support\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "7719a6e7d81e162d06652eafb3c295043763ba08",
      "tree": "9e9f2756f82fd2c9249c278d2c0301f845589776",
      "parents": [
        "32810105f55a289c80ed77a0b7bb756a73d5791d"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Fri May 08 18:24:57 2026 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sat May 09 10:06:06 2026 +0200"
      },
      "message": "nls: mark libkbdfile and XKB diagnostics for translation\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "32810105f55a289c80ed77a0b7bb756a73d5791d",
      "tree": "3912c5e0087c49c2ceb0e89904fa68c57a1dc85d",
      "parents": [
        "50e3189fb21423964d314a5b21b8b0e6017a7e8d",
        "3d56314ce4342cf975978ad2f36c63f8fd81d994"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Wed May 06 18:18:33 2026 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Wed May 06 18:18:33 2026 +0200"
      },
      "message": "Merge branch \u0027xkb\u0027\n\nInitial support for XKB has been added to loadkeys. The idea is to let\n`loadkeys` build a linux console keymap directly from xkb settings such\nas model, layout, variant and options.\n\n* xkbcommon-v4: (51 commits)\n  contrib: add a VT layout indicator driven by keyboard LED locks\n  xkbsupport: drop noisy keycode range warning\n  libkeymap: clamp compose uploads below MAX_DIACR\n  xkbsupport: probe semantic modifier masks across XKB layouts\n  tests: stress mixed XKB group semantics in one keymap\n  xkbsupport: simplify compose ordering helpers\n  tests: cover XKB group select and VT remaps explicitly\n  xkbsupport: separate semantic actions from VT approximations\n  xkbsupport: derive semantic modifier masks from the compiled XKB map\n  tests: add an xkb keyword for xkbsupport coverage\n  xkbsupport: document why modifier release stays a final pass\n  xkbsupport: stop folding LevelFive into Alt tables\n  xkbsupport: ignore prefer-unicode during lexical XKB lookup\n  tests: refresh XKB snapshots after Shift semantics fix\n  xkbsupport: guard _GNU_SOURCE against redefinition\n  xkbsupport: keep Shift release and CapsLock semantics stable\n  xkbsupport: canonicalize equivalent masks per XKB level\n  contrib: add an XKB keysym coverage diagnostic tool\n  xkbsupport: restore semantic handling for Delete keypad aliases\n  tests: cover multi-symbol XKB levels and renumber autotest cases\n  ...\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "3d56314ce4342cf975978ad2f36c63f8fd81d994",
      "tree": "3912c5e0087c49c2ceb0e89904fa68c57a1dc85d",
      "parents": [
        "9de5931e357278ce09623582e423aa970593dd3e"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Tue Mar 24 10:43:36 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Tue Mar 24 10:43:36 2026 +0100"
      },
      "message": "contrib: add a VT layout indicator driven by keyboard LED locks\n\nDebugging XKB-derived console layouts is awkward once group switching is\nimplemented through the VT lock bits. dumpkeys shows the loaded tables,\nbut it does not show which group state is active right now, and probing\nby typing sample letters is slow and error-prone.\n\nAdd a small proof-of-concept helper that infers the current layout from\nthe kbd-shiftllock and kbd-shiftrlock LED triggers and displays the\nresult directly on the active virtual console. The helper auto-detects\nusable LED devices, binds the required triggers, and restores their\nprevious settings on exit.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "9de5931e357278ce09623582e423aa970593dd3e",
      "tree": "d5bd3654ee526bb468dc4e3b27085096a9215b5a",
      "parents": [
        "2ff8eac5b6d01b163b0c50f19ae15b3a732c05d5"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Mon Mar 23 15:55:08 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Mon Mar 23 15:55:08 2026 +0100"
      },
      "message": "xkbsupport: drop noisy keycode range warning\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "2ff8eac5b6d01b163b0c50f19ae15b3a732c05d5",
      "tree": "65dc9270a6a54364f03d5023116ff635fc135e95",
      "parents": [
        "9e419a3320e61eca01d5056e42246a7069d674d4"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Mon Mar 23 15:46:44 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Mon Mar 23 15:46:44 2026 +0100"
      },
      "message": "libkeymap: clamp compose uploads below MAX_DIACR\n\nBoth KDSKBDIACR and KDSKBDIACRUC reject counts greater than or equal to\nMAX_DIACR, so hitting the limit still turns an oversized compose table\ninto EINVAL instead of loading the largest acceptable prefix.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "9e419a3320e61eca01d5056e42246a7069d674d4",
      "tree": "14666b5c6243e7563e455a4ae030165514908df5",
      "parents": [
        "0b0c26ddb7025251e70c9ec0d6a1e03bc4ec9160"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Mon Mar 23 13:54:33 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Mon Mar 23 13:54:33 2026 +0100"
      },
      "message": "xkbsupport: probe semantic modifier masks across XKB layouts\n\nThe semantic modifier mask discovery code assumed that keys such as\nISO_Level3_Shift would always be visible on layout 0. That is too narrow\nfor compiled XKB maps.\n\nSome rulesets expose the effective LevelThree chooser only in another\ngroup. In that case xkbsupport failed to find the modifier mask at all,\nand later treated reachable third-level symbols as if they had no safe\nkernel-table representation.\n\nlibxkbcommon does not expose a direct query for \"which real modifier\nmask implements this semantic keysym in the compiled keymap\", so derive\nit indirectly by probing candidate keys through xkb_state. Extend that\nprobe across all layouts, select the probed layout before pressing the\nkey, and keep the simplest resulting mask as the canonical one.\n\nAdd a local XKB fixture and a regression test that places the relevant\nLevelThree path in the second group and verifies that third-level\nsymbols remain reachable after conversion.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "0b0c26ddb7025251e70c9ec0d6a1e03bc4ec9160",
      "tree": "ca343ef360d6e6c42b7fed5e6b75646953e5a00b",
      "parents": [
        "67ceb3791c54a5b3d9a4948764561946c8d3440b"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sun Mar 22 18:52:48 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Mon Mar 23 08:59:17 2026 +0100"
      },
      "message": "tests: stress mixed XKB group semantics in one keymap\n\nThe current XKB coverage checks individual layouts and a few two-group\ncombinations well, but it still leaves a gap around mixed multi-group\nmaps.\n\nThat gap matters because xkbsupport collapses up to four XKB layouts\ninto the kernel group tables, and failures there are more likely to show\nup only when very different symbol families and level semantics coexist\nin one import. A regression can keep the simple us,ru cases working\nwhile still dropping late-group symbols, Cyrillic aliases, polytonic\nGreek levels, or dead-key bindings once the map grows more diverse.\n\nAdd a focused four-layout stress test that combines us(altgr-intl),\nru(srp), gr(polytonic), and de(neo) in one keymap and checks that each\ngroup still keeps a characteristic binding. This gives xkbsupport a\ntargeted regression test for mixed Latin, Cyrillic, Greek, AltGr, and\ndead-key semantics without relying on another large snapshot.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "67ceb3791c54a5b3d9a4948764561946c8d3440b",
      "tree": "1f934c79197303f1bf0e2c528642c7224d7abeb5",
      "parents": [
        "a2e549aac14fff1f44f4935855f55a8ab8969aa7"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sun Mar 22 13:43:38 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sun Mar 22 18:07:31 2026 +0100"
      },
      "message": "xkbsupport: simplify compose ordering helpers\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "a2e549aac14fff1f44f4935855f55a8ab8969aa7",
      "tree": "29a453578b6409775883bdcd23e64de6663ddddd",
      "parents": [
        "2388299fec1e6bfd971b9f52639fa38a4836baa5"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sun Mar 22 13:35:58 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sun Mar 22 13:35:58 2026 +0100"
      },
      "message": "tests: cover XKB group select and VT remaps explicitly\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "2388299fec1e6bfd971b9f52639fa38a4836baa5",
      "tree": "f76356023ab8d267fb9c4635e6fa79f8887bfce8",
      "parents": [
        "03376e26135d37adf241ac6ef3a0fc7d7b8c33bc"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sun Mar 22 13:28:30 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sun Mar 22 13:28:30 2026 +0100"
      },
      "message": "xkbsupport: separate semantic actions from VT approximations\n\nNot every XKB-only keysym is the same kind of mapping.\n\nSome symbols correspond to direct semantic actions that the kernel\nkeymap model can represent reasonably well, such as modifiers, level\nchanges, and group switching. Others are already approximations on the\nLinux VT side, such as mapping Delete to Remove, collapsing keypad\nnavigation aliases to keypad digits, or turning VT switching symbols\ninto Console_* actions.\n\nKeeping both classes in one flat lookup table makes the intent harder to\nreview and makes it easier to treat policy decisions as if they were\nplain semantic equivalents.\n\nSplit the semantic remap table into direct semantic actions and Linux\nVT-specific approximations, and document why the semantic path is looked\nup first. This keeps the current behavior unchanged while making the\npolicy boundary in xkbsupport easier to see.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "03376e26135d37adf241ac6ef3a0fc7d7b8c33bc",
      "tree": "42c8addab6573a4b21d38181c419b6c793d2ebb5",
      "parents": [
        "31e1397e45a33422d2cbb31f68951ba3ee15fa4c"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sun Mar 22 12:26:42 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sun Mar 22 12:26:42 2026 +0100"
      },
      "message": "xkbsupport: derive semantic modifier masks from the compiled XKB map\n\nThe XKB importer still treated several modifier semantics as if they\nwere tied to fixed real ModN bits. That is not a safe assumption.\n\nxkb_keymap_key_get_mods_for_level() reports masks in the compiled\nkeymap\u0027s real modifier encoding, not in a stable semantic namespace.\nThe usual xkeyboard-config convention often makes it look as if\nLevelThree means Mod3 and LevelFive means Mod5, but alternate rulesets\nare free to bind those semantics differently. The test XKB data does\nexactly that: LevelThree is reachable through one real modifier bit,\nwhile LevelFive uses another.\n\nThat meant xkbsupport could interpret a correct level mask with the\nwrong kernel meaning. In practice the importer either dropped reachable\nthird-level symbols or merged them into the wrong kernel tables because\nit was decoding the mask by hardcoded Mod3/Mod5 expectations instead of\nthe compiled keymap\u0027s actual modifier bindings.\n\nThe failure was visible in the Serbian alias coverage test. The\nru(srp) layout exposes Serbian letters on the third level, for example:\n\n    AD01 level 3 -\u003e U+0458\n    AD06 level 3 -\u003e U+045A\n    AC08 level 3 -\u003e U+0459\n    AC09 level 3 -\u003e U+045F\n    AC10 level 3 -\u003e U+0452\n    AB02 level 3 -\u003e U+045B\n\nThese are expected to land in the same kernel tables that xkbsupport\nuses for XKB third-level access. With the hardcoded Mod3/Mod5 decoding,\nthose bindings disappeared from the imported keymap and\nlibkeymap-test64 failed with:\n\n    Missing keycode 16 in table 8\n\nThe same underlying mistake also changed the shape of the exported XKB\ndump snapshots. Once the semantic modifier mask was decoded correctly,\nthe converter again emitted the expected third-level Alt/Shift+Alt\ntables, so the stored dump fixtures had to be refreshed as well.\n\nFix this by deriving semantic modifier masks from the compiled XKB\nkeymap itself instead of from fixed ModN names:\n\n- Shift, Lock, and Control still use the named real modifiers.\n- Alt, LevelThree, and LevelFive are resolved from the effective\n  modifier state produced by their semantic keys.\n\nThis keeps the importer aligned with actual XKB semantics even when a\nruleset binds LevelThree and LevelFive to unexpected real modifiers, and\nit restores third-level symbol import for layouts such as ru(srp).\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "31e1397e45a33422d2cbb31f68951ba3ee15fa4c",
      "tree": "3b8ac4b462d29197547df421fd333be2fcdffe22",
      "parents": [
        "1a8e82a8654c132dc6841a10d0fe8fb1989f0442"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sat Mar 21 23:49:59 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sat Mar 21 23:49:59 2026 +0100"
      },
      "message": "tests: add an xkb keyword for xkbsupport coverage\n\nThe XKB conversion tests are useful as a focused regression set, but\nthey could only be selected indirectly through broader libkeymap\nkeywords.\n\nTag the xkbsupport-related tests with a dedicated xkb keyword and\nrefresh the XKB dump snapshots to match the current converter output\nafter the recent LevelFive handling change.\n\nThis makes `make -C tests check CHECK_KEYWORDS\u003d\u0027xkb\u0027` a reliable way to\nrun the whole XKB import test set without tripping over stale expected\ndumps.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "1a8e82a8654c132dc6841a10d0fe8fb1989f0442",
      "tree": "b200b4b931027e9819ddc88aeb82ad4ab6bed558",
      "parents": [
        "10a55ab3d3412cc93f3052c220fe73230d5bd92c"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sat Mar 21 23:35:06 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sat Mar 21 23:35:06 2026 +0100"
      },
      "message": "xkbsupport: document why modifier release stays a final pass\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "10a55ab3d3412cc93f3052c220fe73230d5bd92c",
      "tree": "1942289751f0bcc80a7dbec22816cd4a1c1e201d",
      "parents": [
        "2f9b59fea989aa4d18f3dbf5a0fe63615cd7f02c"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sat Mar 21 23:07:48 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sat Mar 21 23:07:48 2026 +0100"
      },
      "message": "xkbsupport: stop folding LevelFive into Alt tables\n\nThe Linux VT has no separate modifier state for XKB LevelFive.\n\nMapping Mod5 and LevelFive to Alt makes the converter silently merge\nfifth-level bindings into the Alt tables, which changes the meaning of\nthe imported layout instead of reporting that the state cannot be\nrepresented. A real LevelFive layout can then look valid in the kernel\ndump while producing the wrong bindings.\n\nTreat LevelFive-only masks like the other unsupported XKB modifiers and\nskip them during import. Add a regression test with a local eight-level\nfixture to make sure fifth-level symbols no longer appear as Alt\nbindings.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "2f9b59fea989aa4d18f3dbf5a0fe63615cd7f02c",
      "tree": "d75f5665359b9f6329999a9406d644ca935d0251",
      "parents": [
        "e0ebb800895c3d194747c3d79ccb83da63ff879e"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sat Mar 21 22:48:49 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sat Mar 21 22:48:49 2026 +0100"
      },
      "message": "xkbsupport: ignore prefer-unicode during lexical XKB lookup\n\nXKB import needs a stable lookup in the kernel key symbol namespace.\n\nUsing TO_AUTO for lexical symbol resolution lets LK_FLAG_PREFER_UNICODE\nchange how ordinary XKB names are interpreted. That makes the result\ndepend on parser mode and can turn shifted Latin bindings back into the\nwrong symbol class, undoing the recent CapsLock and Shift handling fix.\n\nResolve lexical XKB names explicitly in the 8-bit kernel code space and\ncover that behavior with a regression test that enables\nLK_FLAG_PREFER_UNICODE while importing a normal XKB layout.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "e0ebb800895c3d194747c3d79ccb83da63ff879e",
      "tree": "69caa76148f2d1afec329c803cdd83d52189d836",
      "parents": [
        "f6bc58602d826d37673e38b90467774ac499bc4d"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sat Mar 21 22:46:13 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sat Mar 21 22:46:13 2026 +0100"
      },
      "message": "tests: refresh XKB snapshots after Shift semantics fix\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "f6bc58602d826d37673e38b90467774ac499bc4d",
      "tree": "be11e18d319d07f7009c615c3e03760585ea58c7",
      "parents": [
        "9d15ac84518e23332a56d9c39954d6ab56cb66c5"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sat Mar 21 19:50:00 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sat Mar 21 19:50:00 2026 +0100"
      },
      "message": "xkbsupport: guard _GNU_SOURCE against redefinition\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "9d15ac84518e23332a56d9c39954d6ab56cb66c5",
      "tree": "774031ca006c08797b0dcf138e7df4258b6629cd",
      "parents": [
        "0f3fd3c619f514765fac84e12890f6637d806555"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sat Mar 21 19:39:58 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sat Mar 21 19:39:58 2026 +0100"
      },
      "message": "xkbsupport: keep Shift release and CapsLock semantics stable\n\nXKB conversion was generating kernel bindings that looked reasonable in\na dump, but still did not match how the Linux VT actually resolves key\nstate.\n\nFor ASCII letters, the lexical lookup path normalized keysyms through\nthe Unicode conversion path and could turn an explicit shifted Latin\nsymbol into KT_LETTER. That made dumps come out as \"+a +A\" and let\nCapsLock invert an already-shifted binding. The result was wrong case\nhandling for ordinary Latin keys.\n\nModifier keys had a second problem. The VT resolves key release using\nthe current modifier state, so a modifier key must remain bound in the\ntables reachable while it is still active. Leaving pure modifiers\nundefined in those tables turns release into VoidSymbol and makes\nmodifiers such as Shift appear to stick.\n\nSwitch lexical XKB lookup to a public libkeymap code-space conversion\nAPI, mark only the non-shifted Latin binding as CapsLock-able, and\nmirror pure modifier bindings into already-allocated tables so key\nrelease remains visible to the VT state machine.\n\nThis keeps Latin keys at \"+a A\" instead of \"+a +A\" and prevents Shift,\nControl, and Alt from getting stuck after XKB import.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "0f3fd3c619f514765fac84e12890f6637d806555",
      "tree": "eaa015544a7e2cf3c60d160d8e540fd3e4d9454a",
      "parents": [
        "c7a3ffc9df08c68166f86dfa1c6f2693f6819ad2"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sat Mar 21 18:22:33 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Sat Mar 21 18:22:33 2026 +0100"
      },
      "message": "xkbsupport: canonicalize equivalent masks per XKB level\n\nOlder XKB key types can preserve modifiers while still resolving to the\nsame symbol. That makes libxkbcommon report several equivalent modifier\nmasks for one level.\n\nThe converter used every representable mask it saw. In the kernel keymap\nmodel those masks compete for the same table slots, so a plain function\nkey could claim Ctrl+Alt before the VT switching level was processed.\nWith legacy CTRL+ALT types this broke XF86_Switch_VT_* import and moved\nor dropped Console_* bindings.\n\nPick only the simplest representable mask for each XKB level and treat\nit as the canonical kernel binding. This keeps Ctrl+Alt+Fn on the VT\nswitching symbols while leaving the normal function-key levels in their\nown tables.\n\nAdd a regression test with a local legacy CTRL+ALT type fixture so the\nold preserve-modifier behaviour stays covered.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "c7a3ffc9df08c68166f86dfa1c6f2693f6819ad2",
      "tree": "5213cd960e0b3ca703410e0db2e79713c931f89d",
      "parents": [
        "9b14fcddb45d97107e0b20cab6f408f684136d0e"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Fri Mar 20 14:39:46 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Fri Mar 20 14:39:46 2026 +0100"
      },
      "message": "contrib: add an XKB keysym coverage diagnostic tool\n\nThe XKB import path now relies on a layered resolver with separate\nsemantic, lexical, unicode and hex fallbacks, but there is no simple way\nto see which path a given keysym actually takes. That makes cleanup and\nreview of xkbsupport changes harder than necessary, especially when a\nrefactor shifts symbols between semantic handling and normal libkeymap\nlookup.\n\nAdd a small developer tool that scans the libxkbcommon keysym header and\nclassifies each explicit keysym according to the current xkbsupport\nresolution path. This gives a quick coverage report for semantic, name,\nunicode, hex and unresolved cases and makes it much easier to spot\nunexpected gaps in the converter without reintroducing a separate XKB\ntranslation table.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "9b14fcddb45d97107e0b20cab6f408f684136d0e",
      "tree": "e1534d0c5893b126dcef0c95e3bb82bfc3993f46",
      "parents": [
        "62900d0fa9bca8e428768024d8f7b6d5f991e06d"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Fri Mar 20 13:59:54 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Fri Mar 20 13:59:54 2026 +0100"
      },
      "message": "xkbsupport: restore semantic handling for Delete keypad aliases\n\nThe split between lexical aliases and semantic XKB mappings accidentally\ndropped a few keys that do not have safe direct ksym equivalents in\nlibkeymap. That leaves Delete resolving to ASCII DEL instead of the\nkernel\u0027s Remove action, and it loses the keypad aliases that XKB uses\nfor the center and delete keys when NumLock is off.\n\nHandle Delete, KP_Begin and KP_Delete on the semantic path so the\nconverted keymap keeps the expected editing and keypad behavior instead\nof falling back to unrelated lexical names. Extend the multi-symbol XKB\nregression test to cover those cases directly.\n\nFixes: 8e91af9d (\"xkbsupport: keep lexical aliases off the semantic XKB path\")\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "62900d0fa9bca8e428768024d8f7b6d5f991e06d",
      "tree": "acd376a9f3c7f96bc4ea6929540420dba7792395",
      "parents": [
        "8e91af9d4cbeca6dd4606c2f7aeac4fbec32a654"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Fri Mar 20 13:38:12 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Fri Mar 20 13:38:12 2026 +0100"
      },
      "message": "tests: cover multi-symbol XKB levels and renumber autotest cases\n\nThe current XKB fixtures never exercise levels that resolve to more than\none keysym, even though libxkbcommon supports that case and xkbsupport\ncurrently handles it by taking the first symbol. Without a dedicated\ntest, that behavior is easy to change accidentally and any failure would\nonly show up when an unusual keymap reaches users.\n\nAdd a focused XKB test layout with multi-symbol levels and verify that\nthe converted kernel keymap still comes out usable by keeping the first\nkeysym for each affected level.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "8e91af9d4cbeca6dd4606c2f7aeac4fbec32a654",
      "tree": "8bc0e1bcfac05daccba8a2fea7abb7531f81a1cb",
      "parents": [
        "628370f6006b1ca1b827198c70d72eee0da92ede"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Fri Mar 20 13:27:45 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Fri Mar 20 13:27:45 2026 +0100"
      },
      "message": "xkbsupport: keep lexical aliases off the semantic XKB path\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "628370f6006b1ca1b827198c70d72eee0da92ede",
      "tree": "96c37495b759efd555040bb4b84bd17d4623124c",
      "parents": [
        "5f122796ec3ee6ce56de43ec4a070fddafac6e34"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Fri Mar 20 13:00:41 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Fri Mar 20 13:00:41 2026 +0100"
      },
      "message": "xkbsupport: drop the external XKB names table\n\nThe XKB import path no longer needs a separate xkbtrans dictionary to\ntranslate symbol names before they reach libkeymap. Keeping that extra\ndata file and its loader around now only preserves a second resolution\npath, forces the tests to carry explicit table setup, and leaves install\nlogic in place for data that is no longer part of the real conversion\nmodel.\n\nRemove the external translation table and resolve XKB names through the\nnormal libkeymap paths only. Keep the remaining digit aliases in the\nsynonym layer so Meta_0..9 bindings continue to match the existing\nkernel dumps, and simplify the XKB tests to verify import directly\nwithout LK_XKB_TRANSLATION_TABLE.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "5f122796ec3ee6ce56de43ec4a070fddafac6e34",
      "tree": "03b7d086ba42fcf844e3b193562984e20612211e",
      "parents": [
        "926f5fe364b8010109253793fdf837d8d95f54b6"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Fri Mar 20 12:19:06 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Fri Mar 20 12:19:06 2026 +0100"
      },
      "message": "libkeymap: fold Greek XKB symbol remnants into synonyms\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "926f5fe364b8010109253793fdf837d8d95f54b6",
      "tree": "4562c0dfcda5973475c934e8d395607ee63a8467",
      "parents": [
        "07e7b2c2b4dacdf9cfc7e5b585a9c1b3e3b4de5d"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Fri Mar 20 12:12:49 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Fri Mar 20 12:12:49 2026 +0100"
      },
      "message": "libkeymap: resolve Greek XKB aliases through symbol synonyms\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "07e7b2c2b4dacdf9cfc7e5b585a9c1b3e3b4de5d",
      "tree": "b8e4bea850048e514e128f3d030dfd2ee495e37c",
      "parents": [
        "a1f2323c50d7609a636941f60c06dd63b2a5a33e"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Fri Mar 20 12:04:42 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Fri Mar 20 12:04:42 2026 +0100"
      },
      "message": "tests: cover Serbian XKB aliases through Unicode fallback\n\nThe XKB names table still carried Serbian_* aliases even though the\ncurrent import path can already resolve those symbols from their Unicode\nvalues. Leaving them in the table hides which translations are still\nneeded and makes the remaining legacy mappings harder to justify.\n\nDrop the Serbian_* rows from data/xkbtrans/names and add a regression\ntest that removes only those aliases before importing ru(srp). This\nkeeps the check focused on the current question and verifies that the\nexisting Unicode-based path still produces the expected kernel symbols\nfor JE, LJE, NJE, DZE, DJE and TSHE without depending on the external\ntranslation table.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "a1f2323c50d7609a636941f60c06dd63b2a5a33e",
      "tree": "fcca1ea0849015c9095824634ecdbb94f7b145ff",
      "parents": [
        "362ececebbf05156f24aeb4a4c5f6120bb721626"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Fri Mar 20 11:53:20 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Fri Mar 20 11:53:20 2026 +0100"
      },
      "message": "tests: cover Cyrillic XKB aliases through Unicode fallback\n\nThe XKB names table still carried Macedonia_* and Ukrainian_* aliases\neven though those symbols no longer need explicit translation entries to\nreach the kernel keymap. Keeping them in the table makes it harder to\ntell which mappings are still required and which ones already fall\nthrough the normal unicode-based import path.\n\nDrop those aliases from data/xkbtrans/names and add a regression test\nthat removes only the Macedonia_* and Ukrainian_* rows from the\ntranslation table before importing ru(chu). This verifies that the\ncurrent XKB conversion path still resolves those symbols correctly\nthrough libxkbcommon unicode decoding and libkeymap\u0027s existing Cyrillic\nsymbol handling.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "362ececebbf05156f24aeb4a4c5f6120bb721626",
      "tree": "ea1c87efaaa4c1995e6b471f7a7b2ae25fcfae33",
      "parents": [
        "6842be3b2bb8b28627c73dc9ab152d8ee9725ef0"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Fri Mar 20 11:35:04 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Fri Mar 20 11:35:04 2026 +0100"
      },
      "message": "xkbsupport: cut redundant aliases from the XKB names table\n\nThe XKB importer still relied on data/xkbtrans/names for several classes\nof symbols whose meaning is already stable enough to resolve directly in\ncode. Keeping those entries in the external table makes the import path\nlook more data-driven than it really is and leaves the remaining legacy\naliases harder to distinguish from the mappings that are still required.\n\nResolve the common semantic keysyms in xkeymap_get_code() first, so\ngroup selectors, Compose, virtual console switches and keypad decimal\nstop depending on the translation table. With that builtin coverage in\nplace, drop the aliases that no longer affect the conversion result,\nincluding the now-redundant Print mapping.\n\nThis shrinks the table toward the legacy XKB-to-kbd mismatches that are\nstill genuinely needed, while keeping the current libkeymap XKB tests\nunchanged.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "6842be3b2bb8b28627c73dc9ab152d8ee9725ef0",
      "tree": "4bbf57b85f43da67fa5f86d4ee15e3dfef9359d9",
      "parents": [
        "1ed93947932f66da5327b470d228b2919a7297e6"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Fri Mar 20 11:06:31 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Fri Mar 20 11:06:31 2026 +0100"
      },
      "message": "xkbsupport: resolve common XKB symbols without the names table\n\nThe XKB import path still relies on data/xkbtrans/names for many symbols\nthat already have stable, well-known semantics in kbd. Keeping those\nlookups in the external table makes the conversion path more fragile\nthan it needs to be and leaves the translation file responsible for\naliases that can be handled directly in code.\n\nTeach xkeymap_get_code() to resolve a small builtin set of common\nnon-printing XKB keysyms first, then fall back to direct kbd names, and\nonly use unicode or raw name parsing when neither name-based path works.\nThis keeps the existing output stable while letting the importer handle\nmodifiers, group selectors and keypad navigation aliases without going\nthrough the translation table.\n\nWith those aliases resolved internally, drop the redundant entries from\ndata/xkbtrans/names. The remaining table keeps only the legacy mappings\nthat are still needed by the current import path.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "1ed93947932f66da5327b470d228b2919a7297e6",
      "tree": "2619bf4e356d0361028ebb9fdd1fb24055e079c2",
      "parents": [
        "2e9c7ef2de41693ad6a715e5ac14018f075d67f2"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Thu Mar 19 20:11:15 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Thu Mar 19 20:11:15 2026 +0100"
      },
      "message": "xkbsupport: keep compose import in the kernel\u0027s code space\n\nXKB compose import should follow the same conversion rules as the rest of\nkbd.  Appending raw diacritic entries bypasses the normal compose path,\nso the imported table no longer reflects the code space selected for the\ncurrent keymap context and the tests end up validating an ad hoc dump\nformat instead of the real library behavior.\n\nFeed imported compose rules through lk_append_compose() and extend the\ninternal compose test to catch that conversion path.  Update the XKB\ncompose snapshots to use lk_dump_diacs() under preferred-Unicode mode so\nthey match the way kbd actually stores and reports compose tables.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "2e9c7ef2de41693ad6a715e5ac14018f075d67f2",
      "tree": "5cf30127bfb78267fea172a09cad3a56a0519960",
      "parents": [
        "f4f33737d4dc07ec44c67346a83bd72a9759e9df"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Thu Mar 19 17:35:22 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Thu Mar 19 17:35:22 2026 +0100"
      },
      "message": "tests: refresh us,ru XKB dump after group fallback fix\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "f4f33737d4dc07ec44c67346a83bd72a9759e9df",
      "tree": "27b13114e425ba3a376aebaf218f30051a659044",
      "parents": [
        "a06b45b67e9ffb03fbed2a94c9d8d149dbc4cac3"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Thu Mar 19 17:26:36 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Thu Mar 19 17:26:36 2026 +0100"
      },
      "message": "tests: align libkeymap case numbers with test binaries\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "a06b45b67e9ffb03fbed2a94c9d8d149dbc4cac3",
      "tree": "d0129da6b00b243808f426b6b0d124d99c3fbf55",
      "parents": [
        "b98bf6012f435945b88c0b12c1945305aee3748c"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Thu Mar 19 17:18:33 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Thu Mar 19 17:18:33 2026 +0100"
      },
      "message": "xkbsupport: preserve XKB group fallback per key\n\nA key may define fewer groups than the keymap as a whole while XKB still\nmakes that key reachable in later groups by normalizing out-of-range\ngroup lookups back into range. Restricting the import walk to the groups\nexplicitly present on each key drops that fallback and leaves otherwise\nvalid multi-layout mappings incomplete in the kernel table.\n\nWalk every global layout when querying a key and let libxkbcommon apply\nits per-key group fallback rules. Add a regression test with a us,empty\nlayout pair to verify that a key defined only in the first group remains\nreachable after switching to the second group.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "b98bf6012f435945b88c0b12c1945305aee3748c",
      "tree": "7dc35069befeb55667f99240c0e75b44d7eb3f59",
      "parents": [
        "d2a461559bb2890c2b4d0939fb704a741cff9e43"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Thu Mar 19 16:48:10 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Thu Mar 19 16:48:10 2026 +0100"
      },
      "message": "xkbsupport: keep XKB import working without compose data\n\nMissing compose data should not make --xkb-* unusable. The keymap import\nitself is still valid when libxkbcommon cannot resolve a compose table\nfor the selected locale, so treating that lookup failure as fatal breaks\notherwise usable XKB layouts.\n\nContinue without compose support when the locale-specific Compose file\ncannot be found and add a regression test for that fallback. The new\ntest forces compose lookup to fail and verifies that XKB import still\nproduces a usable kernel keymap without writing to stderr.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "d2a461559bb2890c2b4d0939fb704a741cff9e43",
      "tree": "2bf911dc344020d519e108085eff961317c0b986",
      "parents": [
        "9eb0afb442ca519c582c48cad738a78f5ae8327d"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Thu Mar 19 11:37:03 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Thu Mar 19 11:37:03 2026 +0100"
      },
      "message": "xkbsupport: drop ad-hoc debug paths now that import is test-covered\n\nThe temporary debug output in the XKB conversion path was useful while\nthe import logic was still being shaped, but it has become a liability\nnow that the behaviour is pinned down by focused unit tests and full\nsnapshot coverage.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "9eb0afb442ca519c582c48cad738a78f5ae8327d",
      "tree": "b363c2ecb305dc7190552b8e266b3d81289967d0",
      "parents": [
        "b75e5661b386004f2ec2eca4f2c8f4ee5532ebdf"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Thu Mar 19 11:30:47 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Thu Mar 19 11:31:16 2026 +0100"
      },
      "message": "tests: cover XKB import with a non-Latin compose snapshot\n\nThe current XKB compose policy is already constrained by kernel limits\nand shaped by Latin dead-key expectations from existing console maps.\nChecking it only against us-intl, Czech and German still leaves too much\nroom for regressions that look fine on Latin layouts while quietly\nbreaking very different compose behaviour.\n\nAdd a Greek XKB snapshot so the import path is exercised on a layout\nwith a different alphabet and a different compose model.  This gives the\ntests a way to catch policy changes that accidentally overfit the kernel\nsubset to Latin accent handling and miss the behaviour users expect from\nnon-Latin XKB layouts.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "b75e5661b386004f2ec2eca4f2c8f4ee5532ebdf",
      "tree": "f8fd643e866393a9fea3bd72b371c5a209731f3c",
      "parents": [
        "6e833a7f0f3275cd30dca5f5b35f673327e58b00"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Thu Mar 19 11:14:40 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Thu Mar 19 11:31:16 2026 +0100"
      },
      "message": "xkbsupport: bias compose selection toward console-style dead keys\n\nThe kernel compose table is far too small for the locale-wide compose\nspace exposed by XKB, so the converter has to choose which rules are\nworth keeping.  Ranking only by generic \"dead key + letter\" heuristics\nstill leaves too much room for incidental XKB data to displace the\naccent combinations users actually expect from established console\nkeymaps.\n\nTeach the selector to favour the compact dead-key repertoires that\ntraditional console maps and console-setup keep for Latin layouts.  This\nmakes the limited kernel compose space track long-standing console\nbehaviour more closely, instead of being shaped by whichever extra XKB\nsequences happen to score similarly.\n\nAdd a German snapshot alongside the existing XKB compose snapshots so\nthe policy is exercised on more than one language and does not quietly\ndrift into being Czech-specific.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "6e833a7f0f3275cd30dca5f5b35f673327e58b00",
      "tree": "5108ac33c9ddb9dd84fe9c86786c95b6069ae725",
      "parents": [
        "2590c802b23e654be7aed1fa48e38471452536ef"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Thu Mar 19 10:43:31 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Thu Mar 19 11:31:16 2026 +0100"
      },
      "message": "xkbsupport: keep useful dead-key compose rules under kernel limits\n\nThe kernel compose table is too small for the full XKB compose space, so\nthe converter has to drop a large part of it.  Simply preferring rules\nthat introduce otherwise unreachable symbols turns out to be the wrong\npolicy for console layouts with established dead-key semantics: important\naccent combinations for national letters can disappear even though users\nstill expect those dead keys to work in the traditional way.\n\nBias compose selection toward letter-based dead-key sequences and treat\nalready reachable results as lower-value rather than worthless.  This\nkeeps compact kernel compose tables closer to existing console keymaps,\nin particular for layouts such as Czech where accented letters may be\ntyped directly but their dead-key combinations are still part of the\nexpected console behaviour.\n\nRefresh the XKB compose snapshots to match the new prioritisation.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "2590c802b23e654be7aed1fa48e38471452536ef",
      "tree": "0013c118a31e260aa879cfea85ac3d8a70eeb063",
      "parents": [
        "80f4577cfd1e54008bb6d8ba69b5b7dcc0dc5fc1"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Thu Mar 19 10:10:41 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Thu Mar 19 10:10:41 2026 +0100"
      },
      "message": "tests: make XKB coverage survive distcheck without test-only noise\n\nThe new XKB conversion tests are only useful if they keep working from a\nrelease tarball and continue to verify the actual converted keymaps\ninstead of incidental diagnostics.  In their previous form, distcheck\neither lost XKB runtime data needed by the converter or treated expected\nwarnings as test failures, which made the release build look broken\ndespite the conversion itself working.\n\nKeep the XKB test environment self-contained in dist archives, install\nthe extra runtime translation data only when XKB support is enabled, and\nlet tests silence non-essential XKB warnings explicitly.  This preserves\nreadable snapshot-style coverage for XKB import while keeping distcheck\nfocused on real regressions rather than packaging gaps or stderr noise.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "80f4577cfd1e54008bb6d8ba69b5b7dcc0dc5fc1",
      "tree": "917cfb67ea11a08a42c20c4cbb0290e0d8e999f1",
      "parents": [
        "aeb13460146947d9861327418a66a802d363eec4"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Wed Mar 18 20:45:59 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Wed Mar 18 20:45:59 2026 +0100"
      },
      "message": "tests: pin XKB conversion against a readable full-keymap snapshot\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "aeb13460146947d9861327418a66a802d363eec4",
      "tree": "217b246bd426b1e500bc0afb7eeef1d208bd2843",
      "parents": [
        "7ed8d4e1150f01d625787aef699edfe222482637"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Wed Mar 18 20:20:25 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Wed Mar 18 20:20:25 2026 +0100"
      },
      "message": "xkbsupport: interpret XKB modifier masks in their native width\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "7ed8d4e1150f01d625787aef699edfe222482637",
      "tree": "49f14d2773706cf5a0596027586bd37df1f429ec",
      "parents": [
        "98e20c49074daf43a0aa856a76f3f4e61122ef11"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Wed Mar 18 20:08:58 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Wed Mar 18 20:08:58 2026 +0100"
      },
      "message": "xkbsupport: make compose selection deterministic under kernel limits\n\nThe kernel compose table is too small for locale-wide XKB compose data,\nso loadkeys has to choose a useful subset instead of depending on the\nincidental order of the XKB iterator.  If that choice is not stable, the\nsame keymap can keep different rules across refactorings and subtle\nduplicates can waste scarce compose slots.\n\nSelect compose entries in a deterministic order, keep only the strongest\ncandidate for each XKB sequence, and account for collisions only after\nthe rules are projected into the kernel format.  Add focused tests so\nfuture changes do not silently reintroduce unstable or misleading\ncompose selection.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "98e20c49074daf43a0aa856a76f3f4e61122ef11",
      "tree": "0a69d95d8775e1409958db63a6d1f7ab5da55d27",
      "parents": [
        "fd2b91a6a976e8d7b89bae0c1e246c37890a2951"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Wed Mar 18 20:04:24 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Wed Mar 18 20:04:24 2026 +0100"
      },
      "message": "xkbsupport: choose compose rules in the kernel\u0027s terms\n\nThe compose table shipped with XKB is much larger than the kernel can\nstore, so importing it blindly is not useful for the console.  In order\nto keep the limited kernel compose space for sequences that actually\nmatter, compose selection has to follow the same representation that\nloadkeys will finally install.\n\nBase reachability, deduplication and ranking on the kernel-facing result\nof the XKB conversion instead of treating the raw XKB compose data as\nthe source of truth.  This keeps filtering aligned with what the console\ncan really express, avoids wasting slots on entries that collapse to the\nsame kernel rule, and makes the compose limit meaningful for the\ngenerated keymap.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "fd2b91a6a976e8d7b89bae0c1e246c37890a2951",
      "tree": "9c5720087c21e1b698ef616d2deb900f674a8f23",
      "parents": [
        "00b88b6e8976be86be9a12d9f7fe1f60b200a66b"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Wed Mar 18 18:17:38 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Wed Mar 18 18:17:38 2026 +0100"
      },
      "message": "xkbsupport: base compose reachability on XKB symbols\n\nCompose rules are expressed in XKB keysyms, but the current filtering\nlogic decides reachability only after collapsing symbols into kernel key\ncodes.  That loses information too early and can make compose selection\nlook at the wrong notion of \"available\", especially when different XKB\nsymbols map to the same console representation.\n\nTrack which XKB symbols actually survive keymap generation and use that\nas the source of truth for compose filtering.  This keeps the compose\npath aligned with the XKB data it is consuming and prepares it for\nchoosing only the entries that are truly relevant to the generated\nconsole layout.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "00b88b6e8976be86be9a12d9f7fe1f60b200a66b",
      "tree": "fbc421b741bb05ccdfd388963c7206eb3b0e0578",
      "parents": [
        "c3f2d856a9f7912989c2c190c3cdc6bd90523017"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Wed Mar 18 17:53:09 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Wed Mar 18 17:53:09 2026 +0100"
      },
      "message": "xkbsupport: prepare compose import for policy-based filtering\n\nThe current compose path mixes table traversal, rule selection and kernel\ninsertion in one pass.  That makes it hard to teach loadkeys to keep\nonly the compose sequences that are actually useful for the generated\nconsole keymap, which is necessary because XKB compose data is far\nlarger than the kernel can store.\n\nSeparate candidate collection from installation so the next steps can\nfilter, rank and trim compose entries before they consume scarce kernel\nslots.  This keeps the current behaviour working while making the\ncompose import path ready for a smaller and more relevant policy.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "c3f2d856a9f7912989c2c190c3cdc6bd90523017",
      "tree": "28a22a45a49879920b56fd68ca6e4815a1643b43",
      "parents": [
        "e476fd61b984617b418c4fc7b5654c620b70ece6"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Wed Mar 18 16:48:57 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Wed Mar 18 16:48:57 2026 +0100"
      },
      "message": "xkbsupport: keep XKB import from breaking on valid keymaps\n\nReal XKB keymaps do not always fit the kernel keyboard model cleanly:\nsome keys expose fewer groups than the whole keymap, some levels produce\nmultiple symbols, and compose tables can legitimately fill the kernel\nlimit.  Treating these cases as hard failures makes loadkeys reject\nlayouts that are otherwise usable and leaves users with no console map\nfor common XKB configurations.\n\nHandle those mismatches defensively so conversion degrades instead of\nfailing.  This keeps valid multi-layout XKB setups importable, avoids\ndropping the last compose entry the kernel can still accept, and makes\nerror reporting around the translation table reliable when the default\nmapping data is missing.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "e476fd61b984617b418c4fc7b5654c620b70ece6",
      "tree": "2f705a2e1fbf1a816c95e6e35b03773b78661c88",
      "parents": [
        "829e8c511d55a1249d52a1f73d5ccd45ddc607be"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Wed Mar 18 16:22:16 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Wed Mar 18 16:25:26 2026 +0100"
      },
      "message": "xkbsupport: preserve usable console semantics when importing xkb\n\nXKB layouts can reach the same level through multiple modifier masks and\nmay expose combinations that have no meaningful kernel equivalent.  The\ncurrent conversion path treated those masks too loosely, so the result\ndepended on iteration order and could assign symbols to the wrong kernel\ntables or fail outright on multi-layout setups such as us,ru with group\nswitching.\n\nMake the conversion prefer the simplest reachable modifier state, ignore\nmasks that cannot be represented safely by the kernel keymap model, and\navoid manufacturing CapsLock behaviour for symbols that are not really\ncapslockable in the console.  This keeps layout switching usable and\nmakes the generated keymap closer to what users expect from the original\nXKB layout.\n\nAdd a focused libkeymap test so regressions in XKB import are caught\nbefore they break real loadkeys workflows.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "829e8c511d55a1249d52a1f73d5ccd45ddc607be",
      "tree": "f720aba789ddaaa7c5700012d4a90dc8e2ffa26e",
      "parents": [
        "e83858eb1450d0e51beb00fbab7195d0b7a7173f"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Thu Jan 04 18:13:27 2024 +0000"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Wed Mar 18 15:18:03 2026 +0100"
      },
      "message": "xkbsupport: Add xkb compose\n\nThe approach to using compose differs between libxkbcommon and kernel.\nCompose in the kernel has stricter restrictions.\n\n1. Length of sequence.\n\nxkb: The length of the compose sequence can be any (or very long).\nkbd: The length of the sequence is 2.\n\n2. Length of result.\n\nxkb: Again, the result of the sequence can be anything.\nkbd: The result of compose restricted by unsigned int.\n\n3. How to use compose.\n\nxkb: The libxkbcommon library loads the entire table for all locales\n(more than 5000 combinations) and as characters are typed, it narrows\nthe number of variants until there is only one sequence left. The\nlibrary is not limited by the amount of memory by the number of stored\nvariants.\n\nkbd: Compose sequences are loaded into the kernel (ioctl KDGKBDIACR) and\nafter that it is applied in the kernel without our participation. A table\nin the kernel is limited to 256 records.\n\nTo reduce the number of combinations:\n\n1. We must ignore all xkb compose sequences longer than 2.\n2. We should ignore sequences that use unicodes that are not used in the\n   generated keymap.\n\nSuch tricks allow you to reduce 5000+ to ~220 (for en,ru keymap).\nUnfortunately, there is no guarantee yet that the amount of compose will\nbe within the limit and there is no way to control it yet.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "e83858eb1450d0e51beb00fbab7195d0b7a7173f",
      "tree": "c36d468909072f4cd94ec55612c9b583896a10b7",
      "parents": [
        "71dc51a0ff157ace7e9486bbb35affe7d8511cdb"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Thu Jan 04 18:12:43 2024 +0000"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Wed Mar 18 15:03:24 2026 +0100"
      },
      "message": "xkbsupport: Extract translation table\n\nAn external table allows it to be expanded without recompilation.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "71dc51a0ff157ace7e9486bbb35affe7d8511cdb",
      "tree": "13e635bfeb62c7bb23616470c3efb8d3d1ea27d3",
      "parents": [
        "533b72f1a7acc649ddc239e247c11cd759be691a"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Thu Jan 04 18:12:34 2024 +0000"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Wed Mar 18 15:03:24 2026 +0100"
      },
      "message": "xkbsupport: Create a list of used codes\n\nA binary search tree is created with all the unicodes that are used in\nthe generated keymap so that it can be checked later whether the unicode\nsymbol is used or not.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "533b72f1a7acc649ddc239e247c11cd759be691a",
      "tree": "e2b3ce20ce514d8a8ab4c10029f75e000735a466",
      "parents": [
        "6c8c2abfa5dd720b053c9b5bdacfbf2898d689e7"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Thu Jan 04 18:12:05 2024 +0000"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Wed Mar 18 15:03:20 2026 +0100"
      },
      "message": "xkbsupport: Add keymap generation from the xkb database\n\nXorg/Wayland uses its own keyboard configuration mechanism. Because of\nthis, the configuration of the text console and Xorg layouts may differ.\nNot all combinations of Xorg layouts have a keymap in the kbd database.\nIt\u0027s inconvenient for users.\n\nTo solve this problem, it is possible to try convert the Xorg keymap\nto the kernel keymap.\n\nThe XKB (X Keyboard Extension) database can be accessed with\nlibxkbcommon, which does not depend on the X11 libraries.\n\nlibxkbcommon is a keyboard keymap compiler and support library which\nprocesses a reduced subset of keymaps as defined by the XKB\nspecification [1].\n\nlibxkbcommon does not distribute a keymap dataset itself, other than for\ntesting purposes. The most common dataset is xkeyboard-config, which is\nused by all current distributions for their X11 XKB data [2].\n\nThere is a project that uses a similar approach to unify configurations.\nThis is console-setup [3].\n\nI talked with Anton Zinoviev and he helped me figure out their idea of\nswitching multiple layouts with a single key combination:\n\n  \u003e how you solved the problem of switching more than two layouts with\n  \u003e one key combination ?\n\n  The keys with ISO_Next_Group, for example the right Alt (keynumber\n  100), are defined like this:\n\n  keycode 100 \u003d ShiftL_lock\n  ShiftL keycode 100 \u003d ShiftR_lock\n  ShiftR keycode 100 \u003d ShiftR_lock\n  ShiftL ShiftR keycode 100 \u003d ShiftL_lock\n\n  So this key will work in the following way:\n\n  no modifiers are active -\u003e ShiftL is active\n  ShiftL is active -\u003e ShiftL and ShiftR are active\n  ShiftL and ShiftR are active -\u003e ShiftR is active\n  ShiftR is active -\u003e no modifiers are active\n\n  The groups (the layouts) are placed in the following way:\n\n  active modifiers  1 group    2 groups    3 groups    4 groups\n  ----------------  -------    --------    --------    --------\n  no modifier       group 1    group 1     group 1     group 1\n  ShiftL            group 1    group 2     group 2     group 2\n  ShiftR            group 1    group 2     group 3     group 4\n  ShiftL+ShiftR     group 1    group 1     group 1     group 3\n\n  In this way we have the following cycles:\n\n  1 group: gr1-\u003egr1-\u003egr1-\u003e...\n  2 groups: gr1-\u003egr2-\u003egr1-\u003egr2-\u003e...\n  3 groups: gr1-\u003egr2-\u003egr1-\u003egr4-\u003egr1-\u003egr2-\u003egr1-\u003egr4-\u003e...\n  4 groups: gr1-\u003egr2-\u003egr3-\u003egr4-\u003egr1-\u003egr2-\u003egr3-\u003egr4-\u003e...\n\n  --\n  Anton Zinoviev\n\nThe difference with this implementation is that I am not trying to read\nand parse the XKB base files. I analyze the resulting xkb keymap.\n\n[1] https://xkbcommon.org/doc/current/index.html\n[2] https://www.freedesktop.org/wiki/Software/XKeyboardConfig/\n[3] https://salsa.debian.org/installer-team/console-setup.git\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "6c8c2abfa5dd720b053c9b5bdacfbf2898d689e7",
      "tree": "30e9fbd905aed98fc4ed4269f9a3f6b8ea0ccc59",
      "parents": [
        "50e3189fb21423964d314a5b21b8b0e6017a7e8d"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Wed Jun 19 10:48:58 2024 +0200"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Wed Mar 18 14:54:20 2026 +0100"
      },
      "message": "keymap: Add API to verify ksym\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "50e3189fb21423964d314a5b21b8b0e6017a7e8d",
      "tree": "e62384520bbf665c2e586440a713044ffcc46879",
      "parents": [
        "9720d5cf307089a5e62417fcb3835272d258f668"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Tue Mar 17 13:41:19 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Tue Mar 17 13:41:19 2026 +0100"
      },
      "message": "tests: catch libkeymap round-trip regressions earlier\n\nlibkeymap already has good parser and dump coverage, but it lacked a\ntest for the invariant that matters when both sides evolve together:\na keymap should still describe the same canonical state after\nparse -\u003e dump -\u003e parse.\n\nAdd a dedicated round-trip test over representative parser constructs,\nincluding keymaps ranges, alt_is_meta, strings, compose rules,\nmodifiers, +rvalues and a real file-backed keymap. This protects the\ncanonical dump format against regressions that would not be caught by\nparser-only or dump-only tests.\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "9720d5cf307089a5e62417fcb3835272d258f668",
      "tree": "824de9725d93d008e5e11154f446042cf919c5ac",
      "parents": [
        "07e5b4c71c8ee235cf9b332708e4ac11b30cce54"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Mon Mar 16 12:58:32 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Tue Mar 17 11:39:32 2026 +0100"
      },
      "message": "data: Do not compress files twice\n\nLink: https://github.com/legionus/kbd/issues/154\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    },
    {
      "commit": "07e5b4c71c8ee235cf9b332708e4ac11b30cce54",
      "tree": "a0caa86da7d23bde5f1ca220e08ae3aa17ebd3ea",
      "parents": [
        "bc085c0161d309e2b7e42988250d4843c93ca1a5"
      ],
      "author": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Mon Mar 16 18:13:43 2026 +0100"
      },
      "committer": {
        "name": "Alexey Gladkov",
        "email": "legion@kernel.org",
        "time": "Tue Mar 17 11:38:23 2026 +0100"
      },
      "message": "CI: report library coverage in workflow summaries\n\nSigned-off-by: Alexey Gladkov \u003clegion@kernel.org\u003e\n"
    }
  ],
  "next": "bc085c0161d309e2b7e42988250d4843c93ca1a5"
}
