// Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "InputCoreTypes.h" /** * Traduction d'une touche de reference vers la disposition clavier du systeme. * * LE PROBLEME. Un IMC stocke des FKey -- EKeys::W --, c'est-a-dire des LETTRES. * Or Windows livre au moteur un virtual key code deja traduit par la disposition * active : sur un clavier AZERTY, la touche en haut a gauche du bloc de * deplacement envoie VK_Z, qu'Unreal lit donc comme EKeys::Z. Le mapping "W" ne * se declenche jamais, et le joueur pousse son personnage en arriere en croyant * avancer. Rien de tout ca n'est visible en developpant sur un clavier QWERTY. * * LA REPONSE. On ne raisonne plus en lettres mais en POSITIONS. Chaque touche * par defaut de l'IMC est lue comme une position physique sur un clavier QWERTY * US -- c'est le referentiel dans lequel les IMC sont ecrits -- et l'on demande * a l'OS quelle touche occupe cette position sur la disposition courante. La * geometrie de la main est preservee : le bloc WASD devient ZQSD en AZERTY, * reste WASD en QWERTZ (seuls Y et Z y sont echanges), et suit les positions en * Dvorak ou Colemak. Aucune table par pays a maintenir, et les dispositions * qu'on n'a jamais vues sont traitees comme les autres. * * PORTEE. Seule la zone alphanumerique bouge d'une disposition a l'autre. Les * modificateurs, la barre d'espace, Echap, les fonctions, les fleches, le pave * numerique et la manette occupent la meme position partout : ils ne figurent * pas dans la table de reference et ressortent donc inchanges. C'est aussi ce * qui garantit qu'on ne casse rien -- une touche inconnue est rendue telle quelle. * * WINDOWS UNIQUEMENT pour l'instant. Sur les autres plateformes la touche est * rendue inchangee, soit exactement le comportement d'avant. */ namespace KeyboardLayout { /** * Rend la touche qui occupe, sur la disposition active, la position que * ReferenceKey occupe sur un clavier QWERTY US. * * Rend ReferenceKey inchangee si la touche n'est pas concernee par la * disposition (espace, modificateurs, manette...), si la plateforme n'est pas * geree, ou si l'OS ne sait pas repondre. Jamais de touche invalide en sortie. */ SURVIVAL_PROJET_API FKey RemapKeyToActiveLayout(const FKey& ReferenceKey); /** * L'identifiant de la disposition active, pour le journal : "0000040C" pour * le francais, "00000409" pour l'anglais US. Sert au diagnostic quand un * testeur signale des touches inattendues -- c'est la premiere chose a lire. */ SURVIVAL_PROJET_API FString GetActiveLayoutId(); }