Как умудрились насрать в такую базовую вещь, как ввод с клавиатуры?

Шинда

Ввод с клавиаутуры в Windows имеет несколько уровней абстракции: scan_code virtual_key Symbol ну дальше там может другие символы, аля shift, altgr и т.д.

, где scan_code неизменяем, присваивается драйвером (ну в современных дровах можно ремапить матрицу, но не суть) virtual_key - бесполезное говно, которое родилось от тупости разрабов ОС, но не пропадает из-за тупости разрабов прог, которые к нему привязались. Изначально создан для поддержки хоткеев на всех языках, т.е. в него мапится обычная раскладка qwerty, чтоб на условном йцукен работли хоткеи (the right way: привязывать инпут к sc, а не vk) Symbol - ну уже букавки совершенно любые в соответсвии раскладки.

Игры?

Ебучий устаревший DirectInput мапит по VK - всё что на нём - всё говно.

Сраный Unity придумал свой Input Manager, где Input.getKey анально привязан к Symbol Вродь они обновили систему инпута - теперь можно хапать клавиши через скан коды типа Keyboard.current.wKey, но серавно в каких то ситуациях происходит хуйня в случае с кастомными раскладками.

в UE если разраб не въебёт по калочке аля “use scan code” - инпут будет через vk.

Вот только, дядушка Габен в сурсе юзает scan_code для ввода мувмента.

Есть и другие норм примеры

Где-то до 1.9-1.12 (точно не помню) В майне был другой код инпута - всё привязывалось к vk. Т.е. условно, если у тебя он изменён (а в некоторых раскладках он изменён, вроде в fr и de если не ошибаюсь, я уж не говорю про нормальные) - тебе приходилось ребиндить.

Потом в более новых версиях переписали на sc - всё стало пиздато работать.

в миникрафт бедроке пошли нахуй, у нас directinput йоу

А программы?

А ебучий aseprite блять по Symbol хуярит и искренне непонимает что нахуй происходит, когда ты меняешь раскладку на йцукен или любую другую. Хоткеи у тебя улетают куда-то хуй пойми куда. Так многие на vk, нормальные ребята на sc

В оснтальном все ходят через WinAPI - соответсвенно vk

А линупс

А там тоже насрали, и кабуда даже сильнее. На аппаратном уровне ядра scan_code Ядро даёт абстракцию такого же типа, акы переваривает scan_code в условные key_q, key_w, key_e (linux_keycode) Какой-нить xkb берёт чо ядро высрало и высерает свои позиции акы <AE01>, <AE02><AB01>, <AB02><AC01>, <AC02> И уже эту координату XKB мапит напрямую в символы (Keysyms) - типа <AD01> == q, иль в русиш == Cyrillic_shorti (й).

Может, когда-нибудь, операционные системы начнут поддерживать другие языки, помимо англиского.
Но видимо пока рано.