55 lines
2.6 KiB
C++
55 lines
2.6 KiB
C++
// 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.
|
|
*/
|
|
EMBERWILD_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.
|
|
*/
|
|
EMBERWILD_API FString GetActiveLayoutId();
|
|
}
|