Information on keyboard layouts for developers
==============================================

DOSBox-X is not compatible with keyboard layouts it's not prepared for.

DOSBox-X was developed around the US keyboard layout like DOSBox, mainly
due to limitations around the SDL1 library. SDL is responsible for input
handling, and SDL1 in particular only supports US keyboards.

The SDL1 library used in this source tree, unlike the official library,
does not attempt to hack around the issue by forcing Windows to load
the US keyboard layout for itself.

This document serves as a guide to begin modifying the source code in
this project to add support for your keyboard layout.

You can also find a list of supported keyboard layouts and further details
about keyboard layouts and other regional information in the DOSBox-X Wiki:
https://dosbox-x.com/wiki

Below is the source code that handles the keyboard layouts.

VK_* mapping in SDL1 (Windows):
- vs/sdl/src/video/windib/SDL_dibevents.c: DIB_InitOSKeymapPriv()

DOSBox-X keyboard layout enum:
- include/keymap.h (DKM_*) constants
- src/gui/sdlmain.cpp KeyboardLayoutDetect(), DKM_to_string(), DKM_to_descriptive_string()
- src/gui/sdlmain_linux.cpp (if working on Linux)

You may want to familiarize yourself with the Windows LCID for the locale
you'd like to add, as well as the VK_* scan codes generated by the keyboard
for that locale, so that SDL1 mapping can be updated properly.

In Linux, you may want to examine the X11 server keymap table and mod map
table and look at the X11 codes visible in the mapper to determine how
to add support.

The SDL1 library in Windows fills a fixed array used to map VK_* keyboard
codes to SDLK_* scan codes. Filling in the correct SDLK_* values given the
current keyboard locale is an important first step in getting your keyboard
layout to work.

The general rule is to try to pick the SDLK_* code according to the unshifted
unmodded character it would type. On US keyboards for example, the '1' key
enters '1' unshifted and '!' shifted.

If there is no SDLK_* code for the key, modify the SDL1 header where the
SDLK_* enumeration exists, locate the WORLD key enumerations and pick one
not yet already aliased, and define an alias for the new key, then return
that.

It is important for clean DOSBox-X development that DOSBox-X not have to
examine the keyboard locale within itself the meaning of the WORLD code,
and that it can go by the new aliases of the WORLD codes to know what
foreign key to match by.

Example: WORLD_11 and WORLD_21 redefined to represent the Yen and Ro keys
         on Japanese keyboards (see SDL_keysym.h in this source tree).
         Those WORLD code are to be used ONLY for those keys, and not
         anything else!

NOTE:
- To assist with scan codes and keyboard input, the mapper interface will
  show as much extra information as practical on keyboard input.

  Windows builds will show the VK_* code.

  Linux builds will show the X11 keyboard code.

  This information should assist with adding additional keyboard layouts.
