Files
Unreal_EmberWild/Source/EmberWild/Public/KeyboardLayout.h
T

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();
}