JBR-5678: Refactor Wayland keyboard support

(cherry picked from commit 070ec5bb8c)
This commit is contained in:
Nikita Tsarev
2023-11-10 14:34:37 +01:00
committed by jbrbot
parent 6113c02cd6
commit e46a04a8a1
17 changed files with 3246 additions and 1625 deletions

View File

@@ -115,6 +115,18 @@
<arg name="amount" type="int" />
</request>
<request name="set_xkb_rule_names">
<description summary="facilitates switching keyboard layouts">
This requests the compositor to load the specified XKB layout and use it in all
further keyboard handling.
</description>
<arg name="rules" type="string" />
<arg name="model" type="string" />
<arg name="layout" type="string" />
<arg name="variant" type="string" />
<arg name="options" type="string" />
</request>
<enum name="error">
<entry name="no_error" value="0" summary="error code 0 reserved for the absence of error"/>
<entry name="invalid_coordinates" value="1" summary="supplied absolute coordinates point

View File

@@ -24,6 +24,7 @@
#include <weston/weston.h>
#include <libweston/weston-log.h>
#include <xkbcommon/xkbcommon.h>
#include <pixman.h>
#include <assert.h>
@@ -74,10 +75,12 @@ notify_motion_absolute(struct weston_seat *seat, const struct timespec *time,
void
notify_pointer_frame(struct weston_seat *seat);
int
weston_seat_update_keymap(struct weston_seat *seat, struct xkb_keymap *keymap);
static struct weston_output*
get_output_for_point(struct wakefield* wakefield, int32_t x, int32_t y)
{
static struct weston_output *
get_output_for_point(struct wakefield *wakefield, int32_t x, int32_t y) {
struct weston_output *o;
wl_list_for_each(o, &wakefield->compositor->output_list, link) {
if (o->destroying)
@@ -95,8 +98,7 @@ static void
wakefield_get_pixel_color(struct wl_client *client,
struct wl_resource *resource,
int32_t x,
int32_t y)
{
int32_t y) {
struct wakefield *wakefield = wl_resource_get_user_data(resource);
struct weston_compositor *compositor = wakefield->compositor;
@@ -121,7 +123,7 @@ wakefield_get_pixel_color(struct wl_client *client,
wakefield_send_pixel_color(resource, x, y, 0, WAKEFIELD_ERROR_INVALID_COORDINATES);
return;
}
const int output_x = x - output->x;
const int output_y = y - output->y;
weston_log_scope_printf(wakefield->log,
@@ -154,8 +156,7 @@ wakefield_get_pixel_color(struct wl_client *client,
static void
wakefield_get_surface_location(struct wl_client *client,
struct wl_resource *resource,
struct wl_resource *surface_resource)
{
struct wl_resource *surface_resource) {
// See also weston-test.c`move_surface() and the corresponding protocol
struct wakefield *wakefield = wl_resource_get_user_data(resource);
@@ -172,8 +173,8 @@ wakefield_get_surface_location(struct wl_client *client,
float fx;
float fy;
weston_view_to_global_float(view, 0, 0, &fx, &fy);
const int32_t x = (int32_t)fx;
const int32_t y = (int32_t)fy;
const int32_t x = (int32_t) fx;
const int32_t y = (int32_t) fy;
weston_log_scope_printf(wakefield->log, "WAKEFIELD: get_location: %d, %d\n", x, y);
wakefield_send_surface_location(resource, surface_resource, x, y,
@@ -185,8 +186,7 @@ wakefield_move_surface(struct wl_client *client,
struct wl_resource *resource,
struct wl_resource *surface_resource,
int32_t x,
int32_t y)
{
int32_t y) {
struct wakefield *wakefield = wl_resource_get_user_data(resource);
struct weston_surface *surface = wl_resource_get_user_data(surface_resource);
struct weston_view *view = container_of(surface->views.next, struct weston_view, surface_link);
@@ -196,15 +196,14 @@ wakefield_move_surface(struct wl_client *client,
return;
}
weston_view_set_position(view, (float)x, (float)y);
weston_view_set_position(view, (float) x, (float) y);
weston_view_update_transform(view);
weston_log_scope_printf(wakefield->log, "WAKEFIELD: move_surface to (%d, %d)\n", x, y);
}
static pixman_format_code_t
wl_shm_format_to_pixman(uint32_t wl_shm_format)
{
wl_shm_format_to_pixman(uint32_t wl_shm_format) {
pixman_format_code_t rc;
switch (wl_shm_format) {
@@ -225,13 +224,12 @@ wl_shm_format_to_pixman(uint32_t wl_shm_format)
* Returns the number of pixels in the given non-empty region.
*/
static uint64_t
size_in_pixels(pixman_region32_t *region)
{
const pixman_box32_t * const e = pixman_region32_extents(region);
size_in_pixels(pixman_region32_t *region) {
const pixman_box32_t *const e = pixman_region32_extents(region);
assert (e->x2 >= e->x1);
assert (e->y2 >= e->y1);
return ((uint64_t)(e->x2 - e->x1))*(e->y2 - e->y1);
return ((uint64_t) (e->x2 - e->x1)) * (e->y2 - e->y1);
}
/**
@@ -242,8 +240,7 @@ size_in_pixels(pixman_region32_t *region)
* @return largest area size in pixels (could be zero).
*/
static uint64_t
get_largest_area_in_one_output(struct weston_compositor *compositor, pixman_region32_t *region, bool *fits_entirely)
{
get_largest_area_in_one_output(struct weston_compositor *compositor, pixman_region32_t *region, bool *fits_entirely) {
uint64_t area = 0; // in pixels
*fits_entirely = false;
@@ -277,11 +274,10 @@ get_largest_area_in_one_output(struct weston_compositor *compositor, pixman_regi
* Sets every pixel in the given buffer to 0.
*/
static void
clear_buffer(struct wl_shm_buffer *buffer)
{
const int32_t height = wl_shm_buffer_get_height(buffer);
const size_t stride = wl_shm_buffer_get_stride(buffer);
const size_t buffer_byte_size = height*stride;
clear_buffer(struct wl_shm_buffer *buffer) {
const int32_t height = wl_shm_buffer_get_height(buffer);
const size_t stride = wl_shm_buffer_get_stride(buffer);
const size_t buffer_byte_size = height * stride;
wl_shm_buffer_begin_access(buffer);
{
@@ -307,8 +303,7 @@ clear_buffer(struct wl_shm_buffer *buffer)
static void
copy_pixels_to_shm_buffer(struct wl_shm_buffer *buffer, uint32_t *data,
int32_t target_x, int32_t target_y,
int32_t width, int32_t height)
{
int32_t width, int32_t height) {
assert (target_x >= 0 && target_y >= 0);
assert (data);
@@ -316,12 +311,12 @@ copy_pixels_to_shm_buffer(struct wl_shm_buffer *buffer, uint32_t *data,
wl_shm_buffer_begin_access(buffer);
{
uint32_t * const buffer_data = wl_shm_buffer_get_data(buffer);
uint32_t *const buffer_data = wl_shm_buffer_get_data(buffer);
assert (buffer_data);
for (int32_t y = 0; y < height; y++) {
const uint32_t * const src_line = &data[y*width];
uint32_t * const dst_line = &buffer_data[(target_y + y)*buffer_width];
const uint32_t *const src_line = &data[y * width];
uint32_t *const dst_line = &buffer_data[(target_y + y) * buffer_width];
for (int32_t x = 0; x < width; x++) {
dst_line[target_x + x] = src_line[x];
}
@@ -336,8 +331,7 @@ copy_pixels_to_shm_buffer(struct wl_shm_buffer *buffer, uint32_t *data,
*/
static bool
check_buffer_format_supported(struct wakefield *wakefield, struct wl_resource *resource,
struct wl_resource *buffer_resource, uint32_t buffer_format)
{
struct wl_resource *buffer_resource, uint32_t buffer_format) {
if (buffer_format != WL_SHM_FORMAT_ARGB8888
&& buffer_format != WL_SHM_FORMAT_XRGB8888) {
weston_log_scope_printf(wakefield->log,
@@ -357,8 +351,7 @@ check_buffer_format_supported(struct wakefield *wakefield, struct wl_resource *r
*/
static bool
check_buffer_type_supported(struct wakefield *wakefield, struct wl_resource *resource,
struct wl_resource *buffer_resource)
{
struct wl_resource *buffer_resource) {
struct wl_shm_buffer *buffer = wl_shm_buffer_get(buffer_resource);
if (!buffer) {
@@ -376,8 +369,7 @@ check_buffer_type_supported(struct wakefield *wakefield, struct wl_resource *res
*/
static bool
capture_is_empty(struct wakefield *wakefield, struct wl_resource *resource,
struct wl_resource *buffer_resource, uint64_t largest_capture_area)
{
struct wl_resource *buffer_resource, uint64_t largest_capture_area) {
if (largest_capture_area == 0) {
// All outputs might've just disappeared
weston_log_scope_printf(wakefield->log,
@@ -394,8 +386,7 @@ wakefield_capture_create(struct wl_client *client,
struct wl_resource *resource,
struct wl_resource *buffer_resource,
int32_t x,
int32_t y)
{
int32_t y) {
struct wakefield *wakefield = wl_resource_get_user_data(resource);
if (!check_buffer_type_supported(wakefield, resource, buffer_resource)) {
@@ -411,7 +402,7 @@ wakefield_capture_create(struct wl_client *client,
clear_buffer(buffer); // in case some outputs disappear mid-flight or a part of the capture is out of screen
const int32_t width = wl_shm_buffer_get_width(buffer);
const int32_t width = wl_shm_buffer_get_width(buffer);
const int32_t height = wl_shm_buffer_get_height(buffer);
pixman_region32_t region_global; // capture region in global coordinates
@@ -421,7 +412,8 @@ wakefield_capture_create(struct wl_client *client,
pixman_region32_init(&region_in_output);
bool fits_entirely;
const uint64_t largest_capture_area = get_largest_area_in_one_output(wakefield->compositor, &region_global, &fits_entirely);
const uint64_t largest_capture_area = get_largest_area_in_one_output(wakefield->compositor, &region_global,
&fits_entirely);
if (capture_is_empty(wakefield, resource, buffer_resource, largest_capture_area)) {
return;
}
@@ -448,13 +440,14 @@ wakefield_capture_create(struct wl_client *client,
pixman_region32_intersect(&region_in_output, &region_global, &output->region);
if (pixman_region32_not_empty(&region_in_output)) {
const pixman_box32_t * const e = pixman_region32_extents(&region_in_output);
const pixman_box32_t *const e = pixman_region32_extents(&region_in_output);
const int32_t region_x_in_global = e->x1;
const int32_t region_y_in_global = e->y1;
const int32_t width_in_output = e->x2 - e->x1;
const int32_t height_in_output = e->y2 - e->y1;
weston_log_scope_printf(wakefield->log, "WAKEFIELD: output '%s' has a chunk of the image at (%d, %d) sized (%d, %d)\n",
const int32_t width_in_output = e->x2 - e->x1;
const int32_t height_in_output = e->y2 - e->y1;
weston_log_scope_printf(wakefield->log,
"WAKEFIELD: output '%s' has a chunk of the image at (%d, %d) sized (%d, %d)\n",
output->name,
e->x1, e->y1,
width_in_output, height_in_output);
@@ -465,7 +458,7 @@ wakefield_capture_create(struct wl_client *client,
// Now convert region_in_output from global to output-local coordinates.
pixman_region32_translate(&region_in_output, -output->x, -output->y);
const pixman_box32_t * const e_in_output = pixman_region32_extents(&region_in_output);
const pixman_box32_t *const e_in_output = pixman_region32_extents(&region_in_output);
const int32_t x_in_output = e_in_output->x1;
const int32_t y_in_output = e_in_output->y1;
@@ -517,8 +510,7 @@ static void
wakefield_send_key(struct wl_client *client,
struct wl_resource *resource,
uint32_t key,
uint32_t state)
{
uint32_t state) {
struct wakefield *wakefield = wl_resource_get_user_data(resource);
struct weston_compositor *compositor = wakefield->compositor;
@@ -534,10 +526,9 @@ wakefield_send_key(struct wl_client *client,
}
}
static void wakefield_send_cursor(struct wl_client* client,
struct wl_resource* resource,
int32_t x, int32_t y)
{
static void wakefield_send_cursor(struct wl_client *client,
struct wl_resource *resource,
int32_t x, int32_t y) {
struct wakefield *wakefield = wl_resource_get_user_data(resource);
struct weston_compositor *compositor = wakefield->compositor;
@@ -546,16 +537,15 @@ static void wakefield_send_cursor(struct wl_client* client,
struct weston_seat *seat;
wl_list_for_each(seat, &compositor->seat_list, link) {
notify_motion_absolute(seat, &time, (double)x, (double)y);
notify_motion_absolute(seat, &time, (double) x, (double) y);
notify_pointer_frame(seat);
}
}
static void wakefield_send_button(struct wl_client* client,
struct wl_resource* resource,
static void wakefield_send_button(struct wl_client *client,
struct wl_resource *resource,
uint32_t button,
uint32_t state)
{
uint32_t state) {
struct wakefield *wakefield = wl_resource_get_user_data(resource);
struct weston_compositor *compositor = wakefield->compositor;
@@ -564,16 +554,15 @@ static void wakefield_send_button(struct wl_client* client,
struct weston_seat *seat;
wl_list_for_each(seat, &compositor->seat_list, link) {
notify_button(seat, &time, (int32_t)button,
notify_button(seat, &time, (int32_t) button,
state ? WL_POINTER_BUTTON_STATE_PRESSED : WL_POINTER_BUTTON_STATE_RELEASED);
notify_pointer_frame(seat);
}
}
static void wakefield_send_wheel(struct wl_client* client,
struct wl_resource* resource,
int32_t amount)
{
static void wakefield_send_wheel(struct wl_client *client,
struct wl_resource *resource,
int32_t amount) {
struct wakefield *wakefield = wl_resource_get_user_data(resource);
struct weston_compositor *compositor = wakefield->compositor;
@@ -594,6 +583,40 @@ static void wakefield_send_wheel(struct wl_client* client,
}
}
static void
wakefield_set_xkb_rule_names(struct wl_client *client,
struct wl_resource *resource,
const char *rules,
const char *model,
const char *layout,
const char *variant,
const char *options)
{
struct wakefield *wakefield = wl_resource_get_user_data(resource);
struct weston_compositor *compositor = wakefield->compositor;
struct xkb_rule_names rule_names = {
.rules = rules,
.model = model,
.layout = layout,
.variant = variant,
.options = options
};
weston_compositor_set_xkb_rule_names(compositor, &rule_names);
struct xkb_keymap* keymap = xkb_keymap_new_from_names(compositor->xkb_context, &compositor->xkb_names, XKB_KEYMAP_COMPILE_NO_FLAGS);
if (!keymap) {
weston_log_scope_printf(wakefield->log, "WAKEFIELD: failed to create xkb_keymap\n");
return;
}
struct weston_seat *seat;
wl_list_for_each(seat, &compositor->seat_list, link) {
weston_seat_update_keymap(seat, keymap);
}
}
static const struct wakefield_interface wakefield_implementation = {
.get_surface_location = wakefield_get_surface_location,
.move_surface = wakefield_move_surface,
@@ -603,11 +626,11 @@ static const struct wakefield_interface wakefield_implementation = {
.send_cursor = wakefield_send_cursor,
.send_button = wakefield_send_button,
.send_wheel = wakefield_send_wheel,
.set_xkb_rule_names = wakefield_set_xkb_rule_names,
};
static void
wakefield_bind(struct wl_client *client, void *data, uint32_t version, uint32_t id)
{
wakefield_bind(struct wl_client *client, void *data, uint32_t version, uint32_t id) {
struct wakefield *wakefield = data;
struct wl_resource *resource = wl_resource_create(client, &wakefield_interface, 1, id);
@@ -619,8 +642,7 @@ wakefield_bind(struct wl_client *client, void *data, uint32_t version, uint32_t
}
static void
wakefield_destroy(struct wl_listener *listener, void *data)
{
wakefield_destroy(struct wl_listener *listener, void *data) {
struct wakefield *wakefield = container_of(listener, struct wakefield, destroy_listener);
weston_log_scope_printf(wakefield->log, "WAKEFIELD: destroy\n");
@@ -632,8 +654,7 @@ wakefield_destroy(struct wl_listener *listener, void *data)
}
WL_EXPORT int
wet_module_init(struct weston_compositor *wc, int *argc, char *argv[])
{
wet_module_init(struct weston_compositor *wc, int *argc, char *argv[]) {
struct wakefield *wakefield = zalloc(sizeof(struct wakefield));
if (wakefield == NULL)
return -1;

View File

@@ -38,7 +38,6 @@ package sun.awt.wl;
* @param pointerButtonPressedEvent null or the latest PointerButtonEvent such that getIsButtonPressed() == true
* @param modifiers a bit set of modifiers reflecting currently pressed keys (@see WLInputState.getNewModifiers())
* @param surfaceForKeyboardInput represents 'struct wl_surface*' that keyboards events should go to
* @param lockingKeyState a bit set of locking modifiers currently active
*/
record WLInputState(WLPointerEvent eventWithSurface,
WLPointerEvent eventWithSerial,
@@ -47,8 +46,7 @@ record WLInputState(WLPointerEvent eventWithSurface,
PointerButtonEvent pointerButtonPressedEvent,
int modifiers,
long surfaceForKeyboardInput,
boolean isPointerOverSurface,
int lockingKeyState) {
boolean isPointerOverSurface) {
/**
* Groups together information about a mouse pointer button event.
* @param surface 'struct wl_surface*' the button was pressed over
@@ -62,7 +60,7 @@ record WLInputState(WLPointerEvent eventWithSurface,
static WLInputState initialState() {
return new WLInputState(null, null, null, null,
null, 0, 0, false, 0);
null, 0, 0, false);
}
/**
@@ -94,8 +92,7 @@ record WLInputState(WLPointerEvent eventWithSurface,
newPointerButtonEvent,
newModifiers,
surfaceForKeyboardInput,
newPointerOverSurface,
lockingKeyState);
newPointerOverSurface);
}
public WLInputState updatedFromKeyboardEnterEvent(long serial, long surfacePtr) {
@@ -108,11 +105,10 @@ record WLInputState(WLPointerEvent eventWithSurface,
pointerButtonPressedEvent,
modifiers,
surfacePtr,
isPointerOverSurface,
lockingKeyState);
isPointerOverSurface);
}
public WLInputState updatedFromKeyboardModifiersEvent(long serial, int keyboardModifiers, int newLockingKeyState) {
public WLInputState updatedFromKeyboardModifiersEvent(long serial, int keyboardModifiers) {
// "The compositor must send the wl_keyboard.modifiers event after this event".
final int oldPointerModifiers = modifiers & WLPointerEvent.PointerButtonCodes.combinedMask();
final int newModifiers = oldPointerModifiers | keyboardModifiers;
@@ -124,8 +120,7 @@ record WLInputState(WLPointerEvent eventWithSurface,
pointerButtonPressedEvent,
newModifiers,
surfaceForKeyboardInput,
isPointerOverSurface,
newLockingKeyState);
isPointerOverSurface);
}
public WLInputState updatedFromKeyboardLeaveEvent(long serial, long surfacePtr) {
@@ -140,8 +135,7 @@ record WLInputState(WLPointerEvent eventWithSurface,
pointerButtonPressedEvent,
newModifiers,
0,
isPointerOverSurface,
lockingKeyState);
isPointerOverSurface);
}
public WLInputState resetPointerState() {
@@ -153,8 +147,7 @@ record WLInputState(WLPointerEvent eventWithSurface,
pointerButtonPressedEvent,
0,
surfaceForKeyboardInput,
false,
lockingKeyState);
false);
}
private PointerButtonEvent getNewPointerButtonEvent(WLPointerEvent pointerEvent,

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,137 @@
/*
* Copyright 2023 JetBrains s.r.o.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package sun.awt.wl;
import java.awt.*;
import java.lang.reflect.InvocationTargetException;
import java.util.Timer;
import java.awt.event.InputEvent;
import java.util.TimerTask;
class WLKeyboard {
WLKeyboard() {
keyRepeatManager = new KeyRepeatManager();
initialize(keyRepeatManager);
}
private class KeyRepeatManager {
private final Timer timer = new Timer();
private TimerTask currentRepeatTask;
private int delayBeforeRepeatMillis = 500;
private int delayBetweenRepeatMillis = 50;
void setRepeatInfo(int charsPerSecond, int delayMillis) {
this.delayBeforeRepeatMillis = delayMillis;
this.delayBetweenRepeatMillis = (int) (1000.0 / charsPerSecond);
}
void cancelRepeat() {
if (currentRepeatTask != null) {
currentRepeatTask.cancel();
currentRepeatTask = null;
}
}
void startRepeat(long timestamp, int keycode) {
cancelRepeat();
if (keycode == 0) {
return;
}
long delta = timestamp - System.currentTimeMillis();
currentRepeatTask = new TimerTask() {
@Override
public void run() {
try {
EventQueue.invokeAndWait(() -> {
handleKeyPress(delta + System.currentTimeMillis(), keycode, true);
});
} catch (InterruptedException ignored) {
} catch (InvocationTargetException e) {
throw new RuntimeException(e);
}
}
};
timer.scheduleAtFixedRate(currentRepeatTask, delayBeforeRepeatMillis, delayBetweenRepeatMillis);
}
}
public static final int XKB_SHIFT_MASK = 1 << 0;
public static final int XKB_CAPS_LOCK_MASK = 1 << 1;
public static final int XKB_CTRL_MASK = 1 << 2;
public static final int XKB_ALT_MASK = 1 << 3;
public static final int XKB_NUM_LOCK_MASK = 1 << 4;
public static final int XKB_MOD3_MASK = 1 << 5;
public static final int XKB_META_MASK = 1 << 6;
public static final int XKB_MOD5_MASK = 1 << 7;
private final KeyRepeatManager keyRepeatManager;
private native void initialize(KeyRepeatManager keyRepeatManager);
public int getModifiers() {
int result = 0;
int mask = getXKBModifiersMask();
if ((mask & XKB_SHIFT_MASK) != 0) {
result |= InputEvent.SHIFT_DOWN_MASK;
}
if ((mask & XKB_CTRL_MASK) != 0) {
result |= InputEvent.CTRL_DOWN_MASK;
}
if ((mask & XKB_ALT_MASK) != 0) {
result |= InputEvent.ALT_DOWN_MASK;
}
if ((mask & XKB_META_MASK) != 0) {
result |= InputEvent.META_DOWN_MASK;
}
return result;
}
public boolean isCapsLockPressed() {
return (getXKBModifiersMask() & XKB_CAPS_LOCK_MASK) != 0;
}
public boolean isNumLockPressed() {
return (getXKBModifiersMask() & XKB_NUM_LOCK_MASK) != 0;
}
public void onLostFocus() {
keyRepeatManager.cancelRepeat();
cancelCompose();
}
private native void handleKeyPress(long timestamp, int keycode, boolean isRepeat);
private native void cancelCompose();
private native int getXKBModifiersMask();
}

View File

@@ -167,4 +167,6 @@ public class WLRobotPeer implements RobotPeer {
private static native void mouseMoveImpl(int x, int y);
private static native void sendMouseButtonImpl(int buttons, boolean pressed);
private static native void mouseWheelImpl(int amount);
public static native void setXKBLayout(String layout, String variant, String options);
}

View File

@@ -135,9 +135,6 @@ public class WLToolkit extends UNIXToolkit implements Runnable {
private static final int MOUSE_BUTTONS_COUNT = 3;
private static final int AWT_MULTICLICK_DEFAULT_TIME_MS = 500;
private static final int CAPS_LOCK_MASK = 0x01;
private static final int NUM_LOCK_MASK = 0x02;
private static boolean initialized = false;
private static Thread toolkitThread;
private final WLClipboard clipboard;
@@ -147,6 +144,7 @@ public class WLToolkit extends UNIXToolkit implements Runnable {
static {
if (!GraphicsEnvironment.isHeadless()) {
keyboard = new WLKeyboard();
initIDs();
}
initialized = true;
@@ -273,114 +271,8 @@ public class WLToolkit extends UNIXToolkit implements Runnable {
return AWT_MULTICLICK_DEFAULT_TIME_MS;
}
/**
* The rate of repeating keys in characters per second
* Set from the native code by the 'repeat_info' Wayland event (see wayland.xml).
*/
static volatile int keyRepeatRate = 33;
/**
* Delay in milliseconds since key down until repeating starts.
* Set from the native code by the 'repeat_info' Wayland event (see wayland.xml).
*/
static volatile int keyRepeatDelay = 500;
static int getKeyRepeatRate() {
return keyRepeatRate;
}
static int getKeyRepeatDelay() {
return keyRepeatDelay;
}
private static class KeyRepeatManager {
private Timer keyRepeatTimer;
private PostKeyEventTask postKeyEventTask;
KeyRepeatManager() {
}
private void stopKeyRepeat() {
assert EventQueue.isDispatchThread();
if (postKeyEventTask != null) {
postKeyEventTask.cancel();
postKeyEventTask = null;
}
}
private void initiateDelayedKeyRepeat(long keycode,
int keyCodePoint,
WLComponentPeer peer) {
assert EventQueue.isDispatchThread();
assert postKeyEventTask == null;
if (keyRepeatTimer == null) {
// The following starts a dedicated daemon thread.
keyRepeatTimer = new Timer("WLToolkit Key Repeat", true);
}
postKeyEventTask = new PostKeyEventTask(keycode, keyCodePoint, peer);
assert WLToolkit.keyRepeatRate > 0;
assert WLToolkit.keyRepeatDelay > 0;
keyRepeatTimer.schedule(
postKeyEventTask,
WLToolkit.keyRepeatDelay,
(long)(1000.0 / WLToolkit.keyRepeatRate));
}
static boolean xkbCodeRequiresRepeat(long code) {
return !WLKeySym.xkbCodeIsModifier(code);
}
void keyboardEvent(long keycode, int keyCodePoint,
boolean isPressed, WLComponentPeer peer) {
stopKeyRepeat();
if (isPressed && KeyRepeatManager.xkbCodeRequiresRepeat(keycode)) {
initiateDelayedKeyRepeat(keycode, keyCodePoint, peer);
}
}
void windowEvent(WindowEvent event) {
if (event.getID() == WindowEvent.WINDOW_LOST_FOCUS) {
stopKeyRepeat();
}
}
private static class PostKeyEventTask extends TimerTask {
final long keycode;
final int keyCodePoint;
final WLComponentPeer peer;
PostKeyEventTask(long keycode,
int keyCodePoint,
WLComponentPeer peer) {
this.keycode = keycode;
this.keyCodePoint = keyCodePoint;
this.peer = peer;
}
@Override
public void run() {
final long timestamp = System.currentTimeMillis();
try {
EventQueue.invokeAndWait(() -> {
generateKeyEventFrom(timestamp, keycode, keyCodePoint, true, peer);
});
} catch (InterruptedException ignored) {
} catch (InvocationTargetException e) {
throw new RuntimeException(e);
}
}
}
}
private static final KeyRepeatManager keyRepeatManager = new KeyRepeatManager();
private static WLInputState inputState = WLInputState.initialState();
private static WLKeyboard keyboard;
private static void dispatchPointerEvent(WLPointerEvent e) {
// Invoked from the native code
@@ -401,20 +293,16 @@ public class WLToolkit extends UNIXToolkit implements Runnable {
}
}
private static void dispatchKeyboardKeyEvent(long serial,
long timestamp,
long keycode,
int keyCodePoint, // UTF32 character
boolean isPressed) {
private static void dispatchKeyboardKeyEvent(long timestamp,
int id,
int keyCode,
int keyLocation,
int rawCode,
int extendedKeyCode,
char keyChar) {
// Invoked from the native code
assert EventQueue.isDispatchThread();
if (logKeys.isLoggable(PlatformLogger.Level.FINE)) {
logKeys.fine("dispatchKeyboardKeyEvent: keycode " + keycode + ", code point 0x"
+ Integer.toHexString(keyCodePoint) + ", " + (isPressed ? "pressed" : "released")
+ ", serial " + serial + ", timestamp " + timestamp);
}
if (timestamp == 0) {
// Happens when a surface was focused with keys already pressed.
// Fake the timestamp by peeking at the last known event.
@@ -424,39 +312,25 @@ public class WLToolkit extends UNIXToolkit implements Runnable {
final long surfacePtr = inputState.getSurfaceForKeyboardInput();
final WLComponentPeer peer = componentPeerFromSurface(surfacePtr);
if (peer != null) {
generateKeyEventFrom(timestamp, keycode, keyCodePoint, isPressed, peer);
keyRepeatManager.keyboardEvent(keycode, keyCodePoint, isPressed, peer);
}
}
if (extendedKeyCode >= 0x1000000) {
int ch = extendedKeyCode - 0x1000000;
int correctCode = KeyEvent.getExtendedKeyCodeForChar(ch);
if (extendedKeyCode == keyCode) {
keyCode = correctCode;
}
extendedKeyCode = correctCode;
}
private static void generateKeyEventFrom(long timestamp, long keycode, int keyCodePoint,
boolean isPressed, WLComponentPeer peer) {
// See also XWindow.handleKeyPress()
final char keyChar = Character.isBmpCodePoint(keyCodePoint)
? (char) keyCodePoint
: KeyEvent.CHAR_UNDEFINED;
final WLKeySym.KeyDescriptor keyDescriptor = WLKeySym.KeyDescriptor.fromXKBCode(keycode);
final int jkeyExtended = keyDescriptor.javaKeyCode() == KeyEvent.VK_UNDEFINED
? primaryUnicodeToJavaKeycode(keyCodePoint)
: keyDescriptor.javaKeyCode();
postKeyEvent(peer.getTarget(),
isPressed ? KeyEvent.KEY_PRESSED : KeyEvent.KEY_RELEASED,
timestamp,
keyDescriptor.javaKeyCode(),
keyChar,
keyDescriptor.keyLocation(),
keycode,
jkeyExtended);
if (isPressed && keyChar != 0 && keyChar != KeyEvent.CHAR_UNDEFINED) {
postKeyEvent(peer.getTarget(),
KeyEvent.KEY_TYPED,
postKeyEvent(
peer.getTarget(),
id,
timestamp,
KeyEvent.VK_UNDEFINED,
keyCode,
keyChar,
KeyEvent.KEY_LOCATION_UNKNOWN,
keycode,
KeyEvent.VK_UNDEFINED);
keyLocation,
rawCode,
extendedKeyCode
);
}
}
@@ -484,32 +358,9 @@ public class WLToolkit extends UNIXToolkit implements Runnable {
postEvent(keyEvent);
}
private static void dispatchKeyboardModifiersEvent(long serial,
boolean isShiftActive,
boolean isAltActive,
boolean isCtrlActive,
boolean isMetaActive,
boolean isCapsActive,
boolean isNumActive) {
// Invoked from the native code
private static void dispatchKeyboardModifiersEvent(long serial) {
assert EventQueue.isDispatchThread();
final int newModifiers =
(isShiftActive ? InputEvent.SHIFT_DOWN_MASK : 0)
| (isAltActive ? InputEvent.ALT_DOWN_MASK : 0)
| (isCtrlActive ? InputEvent.CTRL_DOWN_MASK : 0)
| (isMetaActive ? InputEvent.META_DOWN_MASK : 0);
final int newLockingKeyState =
(isCapsActive ? CAPS_LOCK_MASK : 0)
| (isNumActive ? NUM_LOCK_MASK : 0);
if (logKeys.isLoggable(PlatformLogger.Level.FINE)) {
logKeys.fine("dispatchKeyboardModifiersEvent: new modifiers 0x"
+ Integer.toHexString(newModifiers));
}
inputState = inputState.updatedFromKeyboardModifiersEvent(serial, newModifiers, newLockingKeyState);
inputState = inputState.updatedFromKeyboardModifiersEvent(serial, keyboard.getModifiers());
}
private static void dispatchKeyboardEnterEvent(long serial, long surfacePtr) {
@@ -540,13 +391,14 @@ public class WLToolkit extends UNIXToolkit implements Runnable {
+ Long.toHexString(surfacePtr));
}
keyboard.onLostFocus();
final WLInputState newInputState = inputState.updatedFromKeyboardLeaveEvent(serial, surfacePtr);
final WLComponentPeer peer = componentPeerFromSurface(surfacePtr);
if (peer != null && peer.getTarget() instanceof Window window) {
final WindowEvent winLostFocusEvent = new WindowEvent(window, WindowEvent.WINDOW_LOST_FOCUS);
WLKeyboardFocusManagerPeer.getInstance().setCurrentFocusedWindow(null);
WLKeyboardFocusManagerPeer.getInstance().setCurrentFocusOwner(null);
keyRepeatManager.windowEvent(winLostFocusEvent);
postEvent(winLostFocusEvent);
}
inputState = newInputState;
@@ -804,8 +656,8 @@ public class WLToolkit extends UNIXToolkit implements Runnable {
@Override
public boolean getLockingKeyState(int key) {
return switch (key) {
case KeyEvent.VK_CAPS_LOCK -> (inputState.lockingKeyState() & CAPS_LOCK_MASK) != 0;
case KeyEvent.VK_NUM_LOCK -> (inputState.lockingKeyState() & NUM_LOCK_MASK) != 0;
case KeyEvent.VK_CAPS_LOCK -> keyboard.isCapsLockPressed();
case KeyEvent.VK_NUM_LOCK -> keyboard.isNumLockPressed();
case KeyEvent.VK_SCROLL_LOCK, KeyEvent.VK_KANA_LOCK ->
throw new UnsupportedOperationException("getting locking key state is not supported for this key");
default -> throw new IllegalArgumentException("invalid key for Toolkit.getLockingKeyState");
@@ -950,7 +802,7 @@ public class WLToolkit extends UNIXToolkit implements Runnable {
*/
@Override
protected boolean syncNativeQueue(long timeout) {
log.info("Not implemented: WLToolkit.syncNativeQueue()");
// log.info("Not implemented: WLToolkit.syncNativeQueue()");
return false;
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,50 @@
// Copyright 2023 JetBrains s.r.o.
// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
//
// This code is free software; you can redistribute it and/or modify it
// under the terms of the GNU General Public License version 2 only, as
// published by the Free Software Foundation. Oracle designates this
// particular file as subject to the "Classpath" exception as provided
// by Oracle in the LICENSE file that accompanied this code.
//
// This code is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// version 2 for more details (a copy is included in the LICENSE file that
// accompanied this code).
//
// You should have received a copy of the GNU General Public License version
// 2 along with this work; if not, write to the Free Software Foundation,
// Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
//
// Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
// or visit www.oracle.com if you need additional information or have any
// questions.
#ifndef WLKEYBOARD_H_INCLUDED
#define WLKEYBOARD_H_INCLUDED
#include <stdbool.h>
#include <stdint.h>
#include <jvm_md.h>
#include <jni_util.h>
bool wlInitKeyboard(JNIEnv* env);
struct WLKeyEvent {
long timestamp;
int id;
int keyCode;
int keyLocation;
int rawCode;
int extendedKeyCode;
uint16_t keyChar;
};
void wlSetKeymap(const char* serializedKeymap);
void wlSetKeyState(long timestamp, uint32_t keycode, bool isPressed);
void wlSetRepeatInfo(int charsPerSecond, int delayMillis);
void wlSetModifiers(uint32_t depressed, uint32_t latched, uint32_t locked, uint32_t group);
void wlPostKeyEvent(const struct WLKeyEvent* event);
#endif

View File

@@ -525,6 +525,28 @@ Java_sun_awt_wl_WLRobotPeer_mouseWheelImpl
#endif
}
JNIEXPORT void JNICALL
Java_sun_awt_wl_WLRobotPeer_setXKBLayout(JNIEnv *env, jclass cls, jstring jLayout, jstring jVariant, jstring jOptions)
{
#ifdef WAKEFIELD_ROBOT
if (!wakefield) {
JNU_ThrowByName(env, "java/awt/AWTError", "no 'wakefield' protocol extension");
return;
}
const char* layout = (*env)->GetStringUTFChars(env, jLayout, NULL);
const char* variant = (*env)->GetStringUTFChars(env, jVariant, NULL);
const char* options = (*env)->GetStringUTFChars(env, jOptions, NULL);
wakefield_set_xkb_rule_names(wakefield, "evdev", "pc105", layout, variant, options);
(*env)->ReleaseStringUTFChars(env, jOptions, options);
(*env)->ReleaseStringUTFChars(env, jVariant, variant);
(*env)->ReleaseStringUTFChars(env, jLayout, layout);
#endif
}
#ifdef WAKEFIELD_ROBOT
static void wakefield_surface_location(void *data, struct wakefield *wakefield,

View File

@@ -28,6 +28,9 @@
#error This file should not be included in headless library
#endif
#include <WLToolkit.h>
#include <WLKeyboard.h>
#include <stdbool.h>
#include <stdlib.h>
#include <dlfcn.h>
@@ -39,6 +42,7 @@
#include <sys/mman.h>
#include <unistd.h>
#include <time.h>
#include <dlfcn.h>
#include "gtk-shell1-client-protocol.h"
@@ -46,10 +50,10 @@
#include "JNIUtilities.h"
#include "awt.h"
#include "sun_awt_wl_WLToolkit.h"
#include "WLToolkit.h"
#include "WLRobotPeer.h"
#include "WLGraphicsEnvironment.h"
#include "memory_utils.h"
#include "java_awt_event_KeyEvent.h"
#ifdef WAKEFIELD_ROBOT
#include "wakefield-client-protocol.h"
@@ -108,129 +112,11 @@ static jfieldID isButtonPressedFID;
static jfieldID axis_0_validFID;
static jfieldID axis_0_valueFID;
static jfieldID keyRepeatRateFID;
static jfieldID keyRepeatDelayFID;
static jmethodID dispatchKeyboardKeyEventMID;
static jmethodID dispatchKeyboardModifiersEventMID;
static jmethodID dispatchKeyboardEnterEventMID;
static jmethodID dispatchKeyboardLeaveEventMID;
struct xkb_state *xkb_state;
struct xkb_context *xkb_context;
struct xkb_keymap *xkb_keymap;
typedef uint32_t xkb_mod_mask_t;
typedef uint32_t xkb_layout_index_t;
typedef uint32_t xkb_keycode_t;
typedef uint32_t xkb_keysym_t;
enum xkb_state_component {
XKB_STATE_MODS_DEPRESSED = (1 << 0),
XKB_STATE_MODS_LATCHED = (1 << 1),
XKB_STATE_MODS_LOCKED = (1 << 2),
XKB_STATE_MODS_EFFECTIVE = (1 << 3),
XKB_STATE_LAYOUT_DEPRESSED = (1 << 4),
XKB_STATE_LAYOUT_LATCHED = (1 << 5),
XKB_STATE_LAYOUT_LOCKED = (1 << 6),
XKB_STATE_LAYOUT_EFFECTIVE = (1 << 7),
XKB_STATE_LEDS = (1 << 8)
};
enum xkb_keymap_format {
XKB_KEYMAP_FORMAT_TEXT_V1 = 1
};
#define XKB_MOD_NAME_SHIFT "Shift"
#define XKB_MOD_NAME_CAPS "Lock"
#define XKB_MOD_NAME_CTRL "Control"
#define XKB_MOD_NAME_ALT "Mod1"
#define XKB_MOD_NAME_NUM "Mod2"
#define XKB_MOD_NAME_LOGO "Mod4"
#define XKB_LED_NAME_CAPS "Caps Lock"
#define XKB_LED_NAME_NUM "Num Lock"
#define XKB_LED_NAME_SCROLL "Scroll Lock"
static struct {
void * handle;
struct xkb_context * (*xkb_context_new)(int);
struct xkb_keymap * (*xkb_keymap_new_from_string)(
struct xkb_context *context,
const char *string,
int format,
int flags);
void (*xkb_keymap_unref)(struct xkb_keymap *keymap);
void (*xkb_state_unref)(struct xkb_state *state);
struct xkb_state * (*xkb_state_new)(struct xkb_keymap *keymap);
xkb_keysym_t (*xkb_state_key_get_one_sym)(struct xkb_state *state, xkb_keycode_t key);
uint32_t (*xkb_state_key_get_utf32)(struct xkb_state *state, xkb_keycode_t key);
int (*xkb_state_update_mask)(
struct xkb_state *state,
xkb_mod_mask_t depressed_mods,
xkb_mod_mask_t latched_mods,
xkb_mod_mask_t locked_mods,
xkb_layout_index_t depressed_layout,
xkb_layout_index_t latched_layout,
xkb_layout_index_t locked_layout);
int (*xkb_state_mod_name_is_active)(
struct xkb_state *state,
const char *name,
enum xkb_state_component type);
} xkb_ifs;
static inline void
clear_dlerror(void)
{
(void)dlerror();
}
static void *
xkbcommon_bind_sym(JNIEnv *env, const char* sym_name)
{
clear_dlerror();
void * sym_addr = dlsym(xkb_ifs.handle, sym_name);
if (!sym_addr) {
const char *dlsym_error = dlerror();
JNU_ThrowByName(env, "java/lang/UnsatisfiedLinkError", dlsym_error);
}
return sym_addr;
}
#define BIND_XKB_SYM(name) xkb_ifs.name = xkbcommon_bind_sym(env, #name); \
if (!xkb_ifs.name) return false;
static bool
xkbcommon_load(JNIEnv *env)
{
void * handle = dlopen(JNI_LIB_NAME("xkbcommon"), RTLD_LAZY | RTLD_LOCAL);
if (!handle) {
handle = dlopen(VERSIONED_JNI_LIB_NAME("xkbcommon", "0"), RTLD_LAZY | RTLD_LOCAL);
}
if (!handle) {
JNU_ThrowByNameWithMessageAndLastError(env, "java/lang/UnsatisfiedLinkError",
JNI_LIB_NAME("xkbcommon"));
return false;
}
xkb_ifs.handle = handle;
BIND_XKB_SYM(xkb_context_new);
BIND_XKB_SYM(xkb_keymap_new_from_string);
BIND_XKB_SYM(xkb_state_key_get_utf32);
BIND_XKB_SYM(xkb_keymap_unref);
BIND_XKB_SYM(xkb_state_unref);
BIND_XKB_SYM(xkb_state_new);
BIND_XKB_SYM(xkb_state_key_get_one_sym);
BIND_XKB_SYM(xkb_state_key_get_utf32);
BIND_XKB_SYM(xkb_state_update_mask);
BIND_XKB_SYM(xkb_state_mod_name_is_active);
return true;
}
JNIEnv *getEnv() {
JNIEnv *env;
// assuming we're always called from a Java thread
@@ -430,34 +316,27 @@ static const struct wl_pointer_listener wl_pointer_listener = {
.axis_discrete = wl_pointer_axis_discrete
};
static void
wl_keyboard_keymap(void *data, struct wl_keyboard *wl_keyboard, uint32_t format,
int32_t fd, uint32_t size)
int32_t fd, uint32_t size)
{
JNIEnv* env = getEnv();
if (format != WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1) {
JNU_ThrowInternalError(getEnv(),
"wl_keyboard_keymap supplied unknown keymap format");
JNU_ThrowInternalError(env, "wl_keyboard_keymap supplied unknown keymap format");
return;
}
char *mapped_data = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0);
if (mapped_data == MAP_FAILED) {
JNU_ThrowInternalError(getEnv(),
"wl_keyboard_keymap: failed to memory-map keymap");
char *serializedKeymap = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0);
if (serializedKeymap == MAP_FAILED) {
JNU_ThrowInternalError(env, "wl_keyboard_keymap: failed to memory-map keymap");
return;
}
struct xkb_keymap *new_xkb_keymap = xkb_ifs.xkb_keymap_new_from_string(
xkb_context, mapped_data, XKB_KEYMAP_FORMAT_TEXT_V1, 0);
munmap(mapped_data, size);
wlSetKeymap(serializedKeymap);
munmap(serializedKeymap, size);
close(fd);
xkb_ifs.xkb_keymap_unref(xkb_keymap);
xkb_ifs.xkb_state_unref(xkb_state);
struct xkb_state *new_xkb_state = xkb_ifs.xkb_state_new(new_xkb_keymap);
xkb_state = new_xkb_state;
xkb_keymap = new_xkb_keymap;
}
static void
@@ -473,47 +352,13 @@ wl_keyboard_enter(void *data, struct wl_keyboard *wl_keyboard,
dispatchKeyboardEnterEventMID,
serial, jlong_to_ptr(surface));
JNU_CHECK_EXCEPTION(env);
uint32_t *key;
wl_array_for_each(key, keys) {
const uint32_t scancode = *key + 8;
const uint32_t keychar32 = xkb_ifs.xkb_state_key_get_utf32(xkb_state, scancode);
const xkb_keysym_t keysym = xkb_ifs.xkb_state_key_get_one_sym(xkb_state, scancode);
(*env)->CallStaticVoidMethod(env,
tkClass,
dispatchKeyboardKeyEventMID,
serial,
0,
keysym,
keychar32,
JNI_TRUE);
JNU_CHECK_EXCEPTION(env);
}
}
static void
wl_keyboard_key(void *data, struct wl_keyboard *wl_keyboard,
uint32_t serial, uint32_t time, uint32_t evdev_key, uint32_t state)
uint32_t serial, uint32_t time, uint32_t keycode, uint32_t state)
{
last_input_or_focus_serial = serial;
const uint32_t scancode = evdev_key + 8;
const uint32_t keychar32 = xkb_ifs.xkb_state_key_get_utf32(xkb_state, scancode);
const xkb_keysym_t keysym = xkb_ifs.xkb_state_key_get_one_sym(xkb_state, scancode);
JNIEnv* env = getEnv();
const bool pressed
= (state == WL_KEYBOARD_KEY_STATE_PRESSED ? JNI_TRUE : JNI_FALSE);
(*env)->CallStaticVoidMethod(env,
tkClass,
dispatchKeyboardKeyEventMID,
serial,
time,
keysym,
keychar32,
pressed);
JNU_CHECK_EXCEPTION(env);
wlSetKeyState(time, keycode, state ? true : false);
}
static void
@@ -537,56 +382,14 @@ wl_keyboard_modifiers(void *data, struct wl_keyboard *wl_keyboard,
uint32_t mods_latched, uint32_t mods_locked,
uint32_t group)
{
last_input_or_focus_serial = serial;
xkb_ifs.xkb_state_update_mask(xkb_state,
mods_depressed,
mods_latched,
mods_locked,
0,
0,
group);
wlSetModifiers(mods_depressed, mods_latched, mods_locked, group);
JNIEnv* env = getEnv();
const bool is_shift_active
= xkb_ifs.xkb_state_mod_name_is_active(xkb_state,
XKB_MOD_NAME_SHIFT,
XKB_STATE_MODS_EFFECTIVE);
// This event for ALT gets delivered only after the key has been released already.
const bool is_alt_active
= xkb_ifs.xkb_state_mod_name_is_active(xkb_state,
XKB_MOD_NAME_ALT,
XKB_STATE_MODS_EFFECTIVE);
const bool is_ctrl_active
= xkb_ifs.xkb_state_mod_name_is_active(xkb_state,
XKB_MOD_NAME_CTRL,
XKB_STATE_MODS_EFFECTIVE);
const bool is_meta_active
= xkb_ifs.xkb_state_mod_name_is_active(xkb_state,
XKB_MOD_NAME_LOGO,
XKB_STATE_MODS_EFFECTIVE);
const bool is_caps_active
= xkb_ifs.xkb_state_mod_name_is_active(xkb_state,
XKB_MOD_NAME_CAPS,
XKB_STATE_MODS_EFFECTIVE);
const bool is_num_active
= xkb_ifs.xkb_state_mod_name_is_active(xkb_state,
XKB_MOD_NAME_NUM,
XKB_STATE_MODS_EFFECTIVE);
(*env)->CallStaticVoidMethod(env,
tkClass,
dispatchKeyboardModifiersEventMID,
serial,
is_shift_active,
is_alt_active,
is_ctrl_active,
is_meta_active,
is_caps_active,
is_num_active);
serial);
JNU_CHECK_EXCEPTION(env);
}
@@ -594,12 +397,28 @@ static void
wl_keyboard_repeat_info(void *data, struct wl_keyboard *wl_keyboard,
int32_t rate, int32_t delay)
{
JNIEnv* env = getEnv();
if (rate > 0 && delay > 0) {
(*env)->SetStaticIntField(env, tkClass, keyRepeatRateFID, rate);
(*env)->SetStaticIntField(env, tkClass, keyRepeatDelayFID, delay);
wlSetRepeatInfo(rate, delay);
}
J2dTrace2(J2D_TRACE_INFO, "WLToolkit: set keyboard repeat rate %d and delay %d\n", rate, delay);
}
void
wlPostKeyEvent(const struct WLKeyEvent* event)
{
JNIEnv* env = getEnv();
(*env)->CallStaticVoidMethod(
env,
tkClass,
dispatchKeyboardKeyEventMID,
event->timestamp,
event->id,
event->keyCode,
event->keyLocation,
event->rawCode,
event->extendedKeyCode,
event->keyChar
);
JNU_CHECK_EXCEPTION(env);
}
static const struct wl_keyboard_listener wl_keyboard_listener = {
@@ -825,18 +644,11 @@ initJavaRefs(JNIEnv *env, jclass clazz)
JNI_FALSE);
CHECK_NULL_RETURN(dispatchKeyboardKeyEventMID = (*env)->GetStaticMethodID(env, tkClass,
"dispatchKeyboardKeyEvent",
"(JJJIZ)V"),
"(JIIIIIC)V"),
JNI_FALSE);
CHECK_NULL_RETURN(dispatchKeyboardModifiersEventMID = (*env)->GetStaticMethodID(env, tkClass,
"dispatchKeyboardModifiersEvent",
"(JZZZZZZ)V"),
JNI_FALSE);
CHECK_NULL_RETURN(keyRepeatRateFID = (*env)->GetStaticFieldID(env, tkClass,
"keyRepeatRate", "I"),
JNI_FALSE);
CHECK_NULL_RETURN(keyRepeatDelayFID = (*env)->GetStaticFieldID(env, tkClass,
"keyRepeatDelay", "I"),
"(J)V"),
JNI_FALSE);
jclass wlgeClass = (*env)->FindClass(env, "sun/awt/wl/WLGraphicsEnvironment");
@@ -845,17 +657,6 @@ initJavaRefs(JNIEnv *env, jclass clazz)
return WLGraphicsEnvironment_initIDs(env, wlgeClass);
}
static bool
initXKB(JNIEnv* env)
{
if (!xkbcommon_load(env)) {
return false;
}
xkb_context = xkb_ifs.xkb_context_new(0);
return true;
}
// Reading cursor theme/size using 'gsettings' command line tool proved to be faster than initializing GTK and reading
// those values using corresponding GLib API (like e.g. com.sun.java.swing.plaf.gtk.GTKEngine.getSetting does). If GTK
// will be required by WLToolkit anyway due to some reason, this code would probably need to be removed.
@@ -938,10 +739,6 @@ Java_sun_awt_wl_WLToolkit_initIDs
return;
}
if (!initXKB(env)) {
return; // an exception has been thrown already
}
struct wl_registry *wl_registry = wl_display_get_registry(wl_display);
if (wl_registry == NULL) {
JNU_ThrowByName(env, "java/awt/AWTError", "Failed to obtain Wayland registry");

View File

@@ -28,6 +28,8 @@
#include "xdg-shell-client-protocol.h"
#include "xdg-activation-v1-client-protocol.h"
#include "primary-selection-client-protocol.h"
#include "jvm_md.h"
#include "jni_util.h"
#define CHECK_NULL_THROW_OOME_RETURN(env, x, msg, z)\
do { \

View File

@@ -46,6 +46,7 @@ static const struct wl_interface *wakefield_types[] = {
NULL,
NULL,
NULL,
NULL,
&wl_surface_interface,
NULL,
NULL,
@@ -63,25 +64,26 @@ static const struct wl_interface *wakefield_types[] = {
static const struct wl_message wakefield_requests[] = {
{ "destroy", "", wakefield_types + 0 },
{ "move_surface", "oii", wakefield_types + 4 },
{ "get_surface_location", "o", wakefield_types + 7 },
{ "move_surface", "oii", wakefield_types + 5 },
{ "get_surface_location", "o", wakefield_types + 8 },
{ "get_pixel_color", "ii", wakefield_types + 0 },
{ "send_key", "uu", wakefield_types + 0 },
{ "send_cursor", "ii", wakefield_types + 0 },
{ "send_button", "uu", wakefield_types + 0 },
{ "send_wheel", "i", wakefield_types + 0 },
{ "capture_create", "oii", wakefield_types + 8 },
{ "set_xkb_rule_names", "sssss", wakefield_types + 0 },
{ "capture_create", "oii", wakefield_types + 9 },
};
static const struct wl_message wakefield_events[] = {
{ "surface_location", "oiiu", wakefield_types + 11 },
{ "surface_location", "oiiu", wakefield_types + 12 },
{ "pixel_color", "iiuu", wakefield_types + 0 },
{ "capture_ready", "ou", wakefield_types + 15 },
{ "capture_ready", "ou", wakefield_types + 16 },
};
WL_PRIVATE const struct wl_interface wakefield_interface = {
"wakefield", 1,
9, wakefield_requests,
10, wakefield_requests,
3, wakefield_events,
};

View File

@@ -146,7 +146,8 @@ wakefield_add_listener(struct wakefield *wakefield,
#define WAKEFIELD_SEND_CURSOR 5
#define WAKEFIELD_SEND_BUTTON 6
#define WAKEFIELD_SEND_WHEEL 7
#define WAKEFIELD_CAPTURE_CREATE 8
#define WAKEFIELD_SET_XKB_RULE_NAMES 8
#define WAKEFIELD_CAPTURE_CREATE 9
/**
* @ingroup iface_wakefield
@@ -193,6 +194,10 @@ wakefield_add_listener(struct wakefield *wakefield,
* @ingroup iface_wakefield
*/
#define WAKEFIELD_SEND_WHEEL_SINCE_VERSION 1
/**
* @ingroup iface_wakefield
*/
#define WAKEFIELD_SET_XKB_RULE_NAMES_SINCE_VERSION 1
/**
* @ingroup iface_wakefield
*/
@@ -317,6 +322,19 @@ wakefield_send_wheel(struct wakefield *wakefield, int32_t amount)
WAKEFIELD_SEND_WHEEL, amount);
}
/**
* @ingroup iface_wakefield
*
* This requests the compositor to load the specified XKB layout and use it in all
* further keyboard handling.
*/
static inline void
wakefield_set_xkb_rule_names(struct wakefield *wakefield, const char *rules, const char *model, const char *layout, const char *variant, const char *options)
{
wl_proxy_marshal((struct wl_proxy *) wakefield,
WAKEFIELD_SET_XKB_RULE_NAMES, rules, model, layout, variant, options);
}
/**
* @ingroup iface_wakefield
*/

View File

@@ -22,24 +22,145 @@
* questions.
*/
import sun.awt.wl.WLRobotPeer;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.List;
import static java.awt.event.KeyEvent.*;
/**
* @test
* @key headful
* @summary JBR-5676 Wayland: support generation of input events by AWT Robot in weston plugin
* @modules java.desktop/sun.awt.wl
* @requires (os.family == "linux")
* @library /test/lib
* @build RobotKeyboard
* @run driver WakefieldTestDriver -timeout 60 RobotKeyboard
* @run driver/timeout=600 WakefieldTestDriver -timeout 600 RobotKeyboard
*/
public class RobotKeyboard {
private record Compose(String dead, String key, String result) {
}
private static class Keys {
final static String DEAD_ABOVERING = "°";
final static String DEAD_DOUBLEACUTE = "˝";
final static String DEAD_MACRON = "¯";
final static String DEAD_CEDILLA = "¸";
final static String DEAD_CIRCUMFLEX = "^";
final static String DEAD_HORN = "\u031b";
final static String DEAD_OGONEK = "˛";
final static String DEAD_BREVE = "˘";
final static String DEAD_ABOVEDOT = "˙";
final static String DEAD_CARON = "ˇ";
final static String DEAD_HOOK = "\u0309";
final static String DEAD_BELOWDOT = "\u0323";
final static String DEAD_ACUTE = "'";
final static String DEAD_DIAERESIS = "\"";
final static String DEAD_GRAVE = "`";
final static String DEAD_TILDE = "~";
final static String DEAD_BELOWMACRON = "\u0331";
final static Compose[] composeSamples = new Compose[]{
new Compose(DEAD_ABOVERING, " ", DEAD_ABOVERING),
new Compose(DEAD_ABOVERING, "a", "å"),
new Compose(DEAD_ABOVERING, "A", "Å"),
new Compose(DEAD_ABOVERING, "b", null),
new Compose(DEAD_DOUBLEACUTE, " ", DEAD_DOUBLEACUTE),
new Compose(DEAD_DOUBLEACUTE, "o", "ő"),
new Compose(DEAD_DOUBLEACUTE, "O", "Ő"),
new Compose(DEAD_DOUBLEACUTE, "a", null),
new Compose(DEAD_MACRON, " ", DEAD_MACRON),
new Compose(DEAD_MACRON, "a", "ā"),
new Compose(DEAD_MACRON, "A", "Ā"),
new Compose(DEAD_MACRON, "и", "ӣ"),
new Compose(DEAD_MACRON, "И", "Ӣ"),
new Compose(DEAD_MACRON, "b", null),
new Compose(DEAD_MACRON, "ы", null),
new Compose(DEAD_CEDILLA, " ", DEAD_CEDILLA),
new Compose(DEAD_CEDILLA, "c", "ç"),
new Compose(DEAD_CEDILLA, "C", "Ç"),
new Compose(DEAD_CEDILLA, "a", null),
new Compose(DEAD_CIRCUMFLEX, " ", DEAD_CIRCUMFLEX),
new Compose(DEAD_CIRCUMFLEX, "a", "â"),
new Compose(DEAD_CIRCUMFLEX, "A", "Â"),
new Compose(DEAD_CIRCUMFLEX, "3", "³"),
new Compose(DEAD_CIRCUMFLEX, "и", "и̂"),
new Compose(DEAD_CIRCUMFLEX, "И", "И̂"),
new Compose(DEAD_CIRCUMFLEX, "b", null),
new Compose(DEAD_CIRCUMFLEX, "ы", null),
new Compose(DEAD_HORN, " ", DEAD_HORN),
new Compose(DEAD_HORN, "u", "ư"),
new Compose(DEAD_HORN, "U", "Ư"),
new Compose(DEAD_HORN, "a", null),
new Compose(DEAD_OGONEK, " ", DEAD_OGONEK),
new Compose(DEAD_OGONEK, "a", "ą"),
new Compose(DEAD_OGONEK, "A", "Ą"),
new Compose(DEAD_OGONEK, "b", null),
new Compose(DEAD_BREVE, " ", DEAD_BREVE),
new Compose(DEAD_BREVE, "a", "ă"),
new Compose(DEAD_BREVE, "A", "Ă"),
new Compose(DEAD_BREVE, "b", null),
new Compose(DEAD_ABOVEDOT, " ", DEAD_ABOVEDOT),
new Compose(DEAD_ABOVEDOT, "a", "ȧ"),
new Compose(DEAD_ABOVEDOT, "A", "Ȧ"),
new Compose(DEAD_ABOVEDOT, "u", null),
new Compose(DEAD_CARON, " ", DEAD_CARON),
new Compose(DEAD_CARON, "a", "ǎ"),
new Compose(DEAD_CARON, "A", "Ǎ"),
new Compose(DEAD_CARON, "b", null),
new Compose(DEAD_HOOK, " ", DEAD_HOOK),
new Compose(DEAD_HOOK, "a", ""),
new Compose(DEAD_HOOK, "A", ""),
new Compose(DEAD_HOOK, ";", null),
new Compose(DEAD_BELOWDOT, " ", DEAD_BELOWDOT),
new Compose(DEAD_BELOWDOT, "a", ""),
new Compose(DEAD_BELOWDOT, "A", ""),
new Compose(DEAD_BELOWDOT, "c", null),
new Compose(DEAD_ACUTE, " ", DEAD_ACUTE),
new Compose(DEAD_ACUTE, "a", "á"),
new Compose(DEAD_ACUTE, "A", "Á"),
new Compose(DEAD_ACUTE, "г", "ѓ"),
new Compose(DEAD_ACUTE, "Г", "Ѓ"),
new Compose(DEAD_ACUTE, "b", null),
new Compose(DEAD_ACUTE, "ы", null),
new Compose(DEAD_DIAERESIS, " ", DEAD_DIAERESIS),
new Compose(DEAD_DIAERESIS, "a", "ä"),
new Compose(DEAD_DIAERESIS, "A", "Ä"),
new Compose(DEAD_DIAERESIS, "b", null),
new Compose(DEAD_GRAVE, " ", DEAD_GRAVE),
new Compose(DEAD_GRAVE, "a", "à"),
new Compose(DEAD_GRAVE, "A", "À"),
new Compose(DEAD_GRAVE, "и", "ѝ"),
new Compose(DEAD_GRAVE, "И", "Ѝ"),
new Compose(DEAD_GRAVE, "b", null),
new Compose(DEAD_GRAVE, "ы", null),
new Compose(DEAD_TILDE, " ", DEAD_TILDE),
new Compose(DEAD_TILDE, "a", "ã"),
new Compose(DEAD_TILDE, "A", "Ã"),
new Compose(DEAD_TILDE, "b", null),
// No DEAD_BELOWMACRON + Space
new Compose(DEAD_BELOWMACRON, "b", ""),
new Compose(DEAD_BELOWMACRON, "B", ""),
new Compose(DEAD_BELOWMACRON, "a", null),
};
}
private static List<Integer> varyingKeys = List.of(
VK_0, VK_1, VK_2, VK_3, VK_4, VK_5, VK_6, VK_7, VK_8, VK_9,
VK_A, VK_B, VK_C, VK_D, VK_E, VK_F, VK_G, VK_H, VK_I, VK_J,
VK_K, VK_L, VK_M, VK_N, VK_O, VK_P, VK_Q, VK_R, VK_S, VK_T,
VK_U, VK_V, VK_W, VK_X, VK_Y, VK_Z, VK_COMMA, VK_PERIOD,
VK_SLASH, VK_LESS, VK_MINUS, VK_EQUALS, VK_OPEN_BRACKET,
VK_CLOSE_BRACKET, VK_SEMICOLON, VK_QUOTE, VK_BACK_QUOTE, VK_BACK_SLASH);
private static String ordinaryKeyNames[] = {
"VK_0",
"VK_1",
@@ -88,19 +209,18 @@ public class RobotKeyboard {
"VK_F10",
"VK_F11",
"VK_F12",
// TODO: WLToolkit ignores F13..F24 due to the XKB issues presumably
// "VK_F13",
// "VK_F14",
// "VK_F15",
// "VK_F16",
// "VK_F17",
// "VK_F18",
// "VK_F19",
// "VK_F20",
// "VK_F21",
// "VK_F22",
// "VK_F23",
// "VK_F24",
"VK_F13",
"VK_F14",
"VK_F15",
"VK_F16",
"VK_F17",
"VK_F18",
"VK_F19",
"VK_F20",
"VK_F21",
"VK_F22",
"VK_F23",
"VK_F24",
"VK_FIND",
"VK_G",
"VK_H",
@@ -152,7 +272,8 @@ public class RobotKeyboard {
"VK_SHIFT",
"VK_SLASH",
"VK_SPACE",
"VK_STOP",
// TODO: WLToolkit reports VK_STOP as VK_CANCEL
// "VK_STOP",
"VK_SUBTRACT",
"VK_T",
"VK_TAB",
@@ -175,68 +296,79 @@ public class RobotKeyboard {
private static Robot robot;
private static JFrame frame;
private static JTextArea textArea;
private static JTextArea infoTextArea;
private static JTextArea eventsTextArea;
private static JTextArea typedTextArea;
private static final List<KeyEvent> events = new ArrayList<>();
private static String typed = "";
private static final StringBuffer stringLog = new StringBuffer();
private static final StringBuffer pendingLog = new StringBuffer();
private static XKBLayoutData.LayoutDescriptor curLayout;
private static XKBLayoutData.LayoutDescriptor curKeyCodeLayout;
public static void main(String[] args) throws Exception {
SwingUtilities.invokeAndWait(() -> {
frame = new JFrame("test");
frame = new JFrame("Robot Keyboard Test");
textArea = new JTextArea("");
textArea.setEditable(false);
frame.add(new JScrollPane(textArea));
frame.setSize(500, 500);
frame.setLayout(new FlowLayout());
infoTextArea = new JTextArea("", 30, 30);
infoTextArea.setEditable(false);
frame.add(new JScrollPane(infoTextArea));
eventsTextArea = new JTextArea("", 30, 30);
eventsTextArea.setEditable(false);
frame.add(new JScrollPane(eventsTextArea));
typedTextArea = new JTextArea("", 30, 30);
frame.add(new JScrollPane(typedTextArea));
frame.pack();
frame.setVisible(true);
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(
new KeyEventDispatcher() {
typedTextArea.addKeyListener(
new KeyListener() {
@Override
public boolean dispatchKeyEvent(KeyEvent e) {
if (e.getID() == KeyEvent.KEY_PRESSED || e.getID() == KeyEvent.KEY_RELEASED) {
events.add(e);
}
return false;
public void keyTyped(KeyEvent e) {
typed = typed + e.getKeyChar();
pendingLog.append("\ttyped: U+" + String.format("%04X", (int) e.getKeyChar()) + "\n");
}
@Override
public void keyPressed(KeyEvent e) {
eventsTextArea.append("press: " + getKeyText(e.getKeyCode()) + "\n");
eventsTextArea.setCaretPosition(eventsTextArea.getDocument().getLength());
events.add(e);
pendingLog.append("\tpress: " + getKeyText(e.getKeyCode()) + "\n");
}
@Override
public void keyReleased(KeyEvent e) {
eventsTextArea.append("release: " + getKeyText(e.getKeyCode()) + "\n");
eventsTextArea.setCaretPosition(eventsTextArea.getDocument().getLength());
events.add(e);
pendingLog.append("\trelease: " + getKeyText(e.getKeyCode()) + "\n");
}
}
);
});
robot = new Robot();
robot.setAutoDelay(50);
robot.setAutoDelay(10);
typedTextArea.requestFocusInWindow();
robot.delay(500);
if (Toolkit.getDefaultToolkit().getLockingKeyState(KeyEvent.VK_CAPS_LOCK)) {
// Disable caps lock
robot.keyPress(KeyEvent.VK_CAPS_LOCK);
robot.keyRelease(KeyEvent.VK_CAPS_LOCK);
}
if (!Toolkit.getDefaultToolkit().getLockingKeyState(KeyEvent.VK_NUM_LOCK)) {
// Enable num lock
robot.keyPress(KeyEvent.VK_NUM_LOCK);
robot.keyRelease(KeyEvent.VK_NUM_LOCK);
}
boolean ok = true;
for (String key : ordinaryKeyNames) {
ok &= processKey(key);
}
for (String key : lockingKeyNames) {
ok &= processKey(key);
// reset the locking state to the previous one
int keyCode = getKeyCodeByName(key);
robot.keyPress(keyCode);
robot.keyRelease(keyCode);
robot.waitForIdle();
for (var layout : XKBLayoutData.layouts) {
if (!runTest(layout)) {
ok = false;
break;
}
}
System.err.println("===== TEST RESULT =====");
System.err.println(ok ? "TEST PASSED" : "TEST FAILED");
System.err.println("===== FULL LOG =====");
System.err.println(textArea.getText());
System.err.println("===== FULL TEST LOG =====");
System.err.println(stringLog.toString());
frame.dispose();
@@ -245,6 +377,55 @@ public class RobotKeyboard {
System.exit(ok ? 0 : 1);
}
static void keyPress(int keyCode) {
pendingLog.append("\tRobot keyPress: " + getKeyText(keyCode) + "\n");
robot.keyPress(keyCode);
}
static void keyRelease(int keyCode) {
pendingLog.append("\tRobot keyRelease: " + getKeyText(keyCode) + "\n");
robot.keyRelease(keyCode);
}
static boolean runTest(XKBLayoutData.LayoutDescriptor layout) {
curLayout = layout;
if (layout.asciiCapable()) {
curKeyCodeLayout = curLayout;
} else {
curKeyCodeLayout = XKBLayoutData.layouts.get(0); // US
}
infoTextArea.setText("");
log("Layout: " + layout.layout() + ", variant: " + layout.variant() + "\n");
frame.setTitle(layout.fullName());
WLRobotPeer.setXKBLayout(layout.layout(), layout.variant(), "lv3:ralt_switch");
robot.delay(500);
if (Toolkit.getDefaultToolkit().getLockingKeyState(VK_CAPS_LOCK)) {
// Disable caps lock
robot.keyPress(VK_CAPS_LOCK);
robot.keyRelease(VK_CAPS_LOCK);
}
if (!Toolkit.getDefaultToolkit().getLockingKeyState(VK_NUM_LOCK)) {
// Enable num lock
robot.keyPress(VK_NUM_LOCK);
robot.keyRelease(VK_NUM_LOCK);
}
robot.delay(500);
boolean ok = true;
for (int key : varyingKeys) {
ok &= processKey(key);
}
robot.delay(100);
return ok;
}
private static int getKeyCodeByName(String name) {
try {
return KeyEvent.class.getDeclaredField(name).getInt(KeyEvent.class);
@@ -253,47 +434,166 @@ public class RobotKeyboard {
}
}
private static void checkKey(String name) {
int keyCode = getKeyCodeByName(name);
private static boolean typeChar(String what) {
for (var desc : curLayout.keys().values()) {
for (int level = 0; level < desc.levels().size(); ++level) {
var sym = desc.levels().get(level);
if ((sym.xkbMods() & 0x81) != sym.xkbMods()) {
// we don't understand those mods
continue;
}
if (!sym.isDead() && sym.value().equals(what)) {
var keys = xkbModsToRobotKeycodes(sym.xkbMods());
keys.add(desc.robotCode());
for (var key : keys) {
keyPress(key);
}
for (var key : keys.reversed()) {
keyRelease(key);
}
robot.waitForIdle();
return true;
}
}
}
return false;
}
private static List<Integer> xkbModsToRobotKeycodes(int xkbMods) {
var result = new ArrayList<Integer>();
if ((xkbMods & 0x01) != 0) {
result.add(VK_SHIFT);
}
if ((xkbMods & 0x80) != 0) {
result.add(VK_ALT_GRAPH);
}
return result;
}
private static void checkKey(int keyCode, int level, XKBLayoutData.KeyDescriptor desc, Compose compose) {
var sym = desc.levels().get(level);
events.clear();
textArea.grabFocus();
robot.waitForIdle();
robot.keyPress(keyCode);
robot.keyRelease(keyCode);
typedTextArea.requestFocusInWindow();
typed = "";
robot.waitForIdle();
if (events.size() != 2) {
var mods = xkbModsToRobotKeycodes(sym.xkbMods());
for (var mod : mods) {
keyPress(mod);
log(getKeyText(mod) + " + ");
}
log(getKeyText(keyCode));
if (compose != null) {
log(", compose ");
log(compose.key);
}
log(": ");
keyPress(keyCode);
keyRelease(keyCode);
for (var mod : mods.reversed()) {
keyRelease(mod);
}
robot.waitForIdle();
List<KeyEvent> cleanEvents = new ArrayList<>();
for (KeyEvent e : events) {
if (mods.contains(e.getKeyCode())) continue;
if (e.getKeyCode() == VK_ALT && mods.contains(VK_ALT_GRAPH)) continue;
cleanEvents.add(e);
}
if (cleanEvents.size() != 2) {
throw new RuntimeException("Expected two events, got: " + events.size());
}
if (events.get(0).getID() != KeyEvent.KEY_PRESSED || events.get(1).getID() != KeyEvent.KEY_RELEASED) {
if (cleanEvents.get(0).getID() != KeyEvent.KEY_PRESSED || cleanEvents.get(1).getID() != KeyEvent.KEY_RELEASED) {
throw new RuntimeException("Expected one KEY_PRESSED and one KEY_RELEASED");
}
if (events.get(0).getKeyCode() != keyCode) {
throw new RuntimeException("KEY_PRESSED keyCode is " + events.get(0).getKeyCode() + ", expected " + keyCode);
int expectedKeyCode = curKeyCodeLayout.keys().get(keyCode).javaKeyCode();
if (cleanEvents.get(0).getKeyCode() != expectedKeyCode) {
throw new RuntimeException("KEY_PRESSED keyCode = " + cleanEvents.get(0).getKeyCode() + ", expected " + expectedKeyCode);
}
if (events.get(1).getKeyCode() != keyCode) {
throw new RuntimeException("KEY_RELEASED keyCode is " + events.get(1).getKeyCode() + ", expected " + keyCode);
if (cleanEvents.get(1).getKeyCode() != expectedKeyCode) {
throw new RuntimeException("KEY_RELEASED keyCode = " + cleanEvents.get(1).getKeyCode() + ", expected " + expectedKeyCode);
}
String value = sym.value();
if (sym.isDead()) {
if (!typeChar(compose.key)) {
keyPress(VK_ESCAPE);
keyRelease(VK_ESCAPE);
robot.waitForIdle();
log("(skipped)\n");
return;
}
value = compose.result == null ? "" : compose.result;
}
if (!typed.equals(value)) {
throw new RuntimeException("KEY_TYPED: expected '" + value + "', got '" + typed + "'");
}
log("OK\n");
}
private static void log(String what) {
textArea.append(what);
textArea.setCaretPosition(textArea.getDocument().getLength());
System.err.print(what);
infoTextArea.append(what);
infoTextArea.setCaretPosition(infoTextArea.getDocument().getLength());
stringLog.append(what);
}
private static boolean processKey(String name) {
log(name + ": ");
try {
checkKey(name);
log("OK\n");
return true;
} catch (RuntimeException e) {
log(e.getMessage() + "\n");
return false;
private static boolean processKey(int keyCode) {
var desc = curLayout.keys().get(keyCode);
int maxLevel = desc.levels().size();
if (maxLevel > 2 && curLayout.layout().equals("us") && curLayout.variant().equals("")) {
// Fix for the 102nd key, which for some reason has 4 levels even though AltGr is not supported?
maxLevel = 2;
}
boolean ok = true;
for (int level = 0; level < maxLevel; ++level) {
typedTextArea.append(getKeyText(keyCode) + ", level " + level + ": ");
typedTextArea.setCaretPosition(typedTextArea.getDocument().getLength());
var sym = desc.levels().get(level);
if ((sym.xkbMods() & 0x81) != sym.xkbMods()) {
// we don't understand those mods, so the test won't work
continue;
}
List<Compose> composes = new ArrayList<>();
if (sym.isDead()) {
for (Compose c : Keys.composeSamples) {
if (c.dead.equals(sym.value())) {
composes.add(c);
}
}
} else {
composes.add(null);
}
for (Compose compose : composes) {
try {
checkKey(keyCode, level, desc, compose);
} catch (RuntimeException e) {
log(e.getMessage());
log("\n");
ok = false;
}
if (!pendingLog.isEmpty()) {
stringLog.append(pendingLog);
pendingLog.setLength(0);
}
}
typedTextArea.append("\n");
typedTextArea.setCaretPosition(typedTextArea.getDocument().getLength());
}
return ok;
}
}

View File

@@ -20,6 +20,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import jdk.test.lib.process.ProcessTools;
import jdk.test.lib.process.OutputAnalyzer;
import java.util.List;
@@ -61,6 +62,7 @@ public class WakefieldTestDriver {
final List<String> jvmArgs = new ArrayList<String>();
jvmArgs.add("-Dawt.toolkit.name=WLToolkit");
jvmArgs.add("-Xcheck:jni");
jvmArgs.add("--add-exports=java.desktop/sun.awt.wl=ALL-UNNAMED");
int nScreens = DEFAULT_NUMBER_OF_SCREENS;
int screenWidth = DEFAULT_SCREEN_WIDTH;

View File

@@ -0,0 +1,962 @@
/*
* Copyright 2023 JetBrains s.r.o.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import java.util.*;
import java.awt.event.KeyEvent;
public class XKBLayoutData {
public record KeySymDescriptor(String value, boolean isDead, int xkbMods) {
}
public record KeyDescriptor(int robotCode, int javaKeyCode, int javaKeyCodeUndead, List<KeySymDescriptor> levels) {
}
public record LayoutDescriptor(String layout, String variant, String fullName, boolean asciiCapable,
Map<Integer, KeyDescriptor> keys) {
}
public static final List<LayoutDescriptor> layouts;
static {
layouts = new ArrayList<>();
{
var layout = new LayoutDescriptor("us", "", "English (US)", true, new HashMap<>());
layout.keys.put(KeyEvent.VK_ESCAPE, new KeyDescriptor(KeyEvent.VK_ESCAPE, KeyEvent.VK_ESCAPE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u001b", false, 0))));
layout.keys.put(KeyEvent.VK_1, new KeyDescriptor(KeyEvent.VK_1, KeyEvent.VK_1, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("1", false, 0), new KeySymDescriptor("!", false, 1))));
layout.keys.put(KeyEvent.VK_2, new KeyDescriptor(KeyEvent.VK_2, KeyEvent.VK_2, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("2", false, 0), new KeySymDescriptor("@", false, 1))));
layout.keys.put(KeyEvent.VK_3, new KeyDescriptor(KeyEvent.VK_3, KeyEvent.VK_3, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("3", false, 0), new KeySymDescriptor("#", false, 1))));
layout.keys.put(KeyEvent.VK_4, new KeyDescriptor(KeyEvent.VK_4, KeyEvent.VK_4, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("4", false, 0), new KeySymDescriptor("$", false, 1))));
layout.keys.put(KeyEvent.VK_5, new KeyDescriptor(KeyEvent.VK_5, KeyEvent.VK_5, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("5", false, 0), new KeySymDescriptor("%", false, 1))));
layout.keys.put(KeyEvent.VK_6, new KeyDescriptor(KeyEvent.VK_6, KeyEvent.VK_6, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("6", false, 0), new KeySymDescriptor("^", false, 1))));
layout.keys.put(KeyEvent.VK_7, new KeyDescriptor(KeyEvent.VK_7, KeyEvent.VK_7, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("7", false, 0), new KeySymDescriptor("&", false, 1))));
layout.keys.put(KeyEvent.VK_8, new KeyDescriptor(KeyEvent.VK_8, KeyEvent.VK_8, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("8", false, 0), new KeySymDescriptor("*", false, 1))));
layout.keys.put(KeyEvent.VK_9, new KeyDescriptor(KeyEvent.VK_9, KeyEvent.VK_9, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("9", false, 0), new KeySymDescriptor("(", false, 1))));
layout.keys.put(KeyEvent.VK_0, new KeyDescriptor(KeyEvent.VK_0, KeyEvent.VK_0, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("0", false, 0), new KeySymDescriptor(")", false, 1))));
layout.keys.put(KeyEvent.VK_MINUS, new KeyDescriptor(KeyEvent.VK_MINUS, KeyEvent.VK_MINUS, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("-", false, 0), new KeySymDescriptor("_", false, 1))));
layout.keys.put(KeyEvent.VK_EQUALS, new KeyDescriptor(KeyEvent.VK_EQUALS, KeyEvent.VK_EQUALS, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("=", false, 0), new KeySymDescriptor("+", false, 1))));
layout.keys.put(KeyEvent.VK_BACK_SPACE, new KeyDescriptor(KeyEvent.VK_BACK_SPACE, KeyEvent.VK_BACK_SPACE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0008", false, 0), new KeySymDescriptor("\u0008", false, 1))));
layout.keys.put(KeyEvent.VK_TAB, new KeyDescriptor(KeyEvent.VK_TAB, KeyEvent.VK_TAB, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\t", false, 0), new KeySymDescriptor("", false, 1))));
layout.keys.put(KeyEvent.VK_Q, new KeyDescriptor(KeyEvent.VK_Q, KeyEvent.VK_Q, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("q", false, 0), new KeySymDescriptor("Q", false, 1))));
layout.keys.put(KeyEvent.VK_W, new KeyDescriptor(KeyEvent.VK_W, KeyEvent.VK_W, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("w", false, 0), new KeySymDescriptor("W", false, 1))));
layout.keys.put(KeyEvent.VK_E, new KeyDescriptor(KeyEvent.VK_E, KeyEvent.VK_E, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("e", false, 0), new KeySymDescriptor("E", false, 1))));
layout.keys.put(KeyEvent.VK_R, new KeyDescriptor(KeyEvent.VK_R, KeyEvent.VK_R, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("r", false, 0), new KeySymDescriptor("R", false, 1))));
layout.keys.put(KeyEvent.VK_T, new KeyDescriptor(KeyEvent.VK_T, KeyEvent.VK_T, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("t", false, 0), new KeySymDescriptor("T", false, 1))));
layout.keys.put(KeyEvent.VK_Y, new KeyDescriptor(KeyEvent.VK_Y, KeyEvent.VK_Y, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("y", false, 0), new KeySymDescriptor("Y", false, 1))));
layout.keys.put(KeyEvent.VK_U, new KeyDescriptor(KeyEvent.VK_U, KeyEvent.VK_U, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("u", false, 0), new KeySymDescriptor("U", false, 1))));
layout.keys.put(KeyEvent.VK_I, new KeyDescriptor(KeyEvent.VK_I, KeyEvent.VK_I, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("i", false, 0), new KeySymDescriptor("I", false, 1))));
layout.keys.put(KeyEvent.VK_O, new KeyDescriptor(KeyEvent.VK_O, KeyEvent.VK_O, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("o", false, 0), new KeySymDescriptor("O", false, 1))));
layout.keys.put(KeyEvent.VK_P, new KeyDescriptor(KeyEvent.VK_P, KeyEvent.VK_P, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("p", false, 0), new KeySymDescriptor("P", false, 1))));
layout.keys.put(KeyEvent.VK_OPEN_BRACKET, new KeyDescriptor(KeyEvent.VK_OPEN_BRACKET, KeyEvent.VK_OPEN_BRACKET, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("[", false, 0), new KeySymDescriptor("{", false, 1))));
layout.keys.put(KeyEvent.VK_CLOSE_BRACKET, new KeyDescriptor(KeyEvent.VK_CLOSE_BRACKET, KeyEvent.VK_CLOSE_BRACKET, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("]", false, 0), new KeySymDescriptor("}", false, 1))));
layout.keys.put(KeyEvent.VK_ENTER, new KeyDescriptor(KeyEvent.VK_ENTER, KeyEvent.VK_ENTER, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\r", false, 0))));
layout.keys.put(KeyEvent.VK_CONTROL, new KeyDescriptor(KeyEvent.VK_CONTROL, KeyEvent.VK_CONTROL, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_A, new KeyDescriptor(KeyEvent.VK_A, KeyEvent.VK_A, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("a", false, 0), new KeySymDescriptor("A", false, 1))));
layout.keys.put(KeyEvent.VK_S, new KeyDescriptor(KeyEvent.VK_S, KeyEvent.VK_S, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("s", false, 0), new KeySymDescriptor("S", false, 1))));
layout.keys.put(KeyEvent.VK_D, new KeyDescriptor(KeyEvent.VK_D, KeyEvent.VK_D, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("d", false, 0), new KeySymDescriptor("D", false, 1))));
layout.keys.put(KeyEvent.VK_F, new KeyDescriptor(KeyEvent.VK_F, KeyEvent.VK_F, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("f", false, 0), new KeySymDescriptor("F", false, 1))));
layout.keys.put(KeyEvent.VK_G, new KeyDescriptor(KeyEvent.VK_G, KeyEvent.VK_G, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("g", false, 0), new KeySymDescriptor("G", false, 1))));
layout.keys.put(KeyEvent.VK_H, new KeyDescriptor(KeyEvent.VK_H, KeyEvent.VK_H, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("h", false, 0), new KeySymDescriptor("H", false, 1))));
layout.keys.put(KeyEvent.VK_J, new KeyDescriptor(KeyEvent.VK_J, KeyEvent.VK_J, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("j", false, 0), new KeySymDescriptor("J", false, 1))));
layout.keys.put(KeyEvent.VK_K, new KeyDescriptor(KeyEvent.VK_K, KeyEvent.VK_K, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("k", false, 0), new KeySymDescriptor("K", false, 1))));
layout.keys.put(KeyEvent.VK_L, new KeyDescriptor(KeyEvent.VK_L, KeyEvent.VK_L, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("l", false, 0), new KeySymDescriptor("L", false, 1))));
layout.keys.put(KeyEvent.VK_SEMICOLON, new KeyDescriptor(KeyEvent.VK_SEMICOLON, KeyEvent.VK_SEMICOLON, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor(";", false, 0), new KeySymDescriptor(":", false, 1))));
layout.keys.put(KeyEvent.VK_QUOTE, new KeyDescriptor(KeyEvent.VK_QUOTE, KeyEvent.VK_QUOTE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("'", false, 0), new KeySymDescriptor("\"", false, 1))));
layout.keys.put(KeyEvent.VK_BACK_QUOTE, new KeyDescriptor(KeyEvent.VK_BACK_QUOTE, KeyEvent.VK_BACK_QUOTE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("`", false, 0), new KeySymDescriptor("~", false, 1))));
layout.keys.put(KeyEvent.VK_SHIFT, new KeyDescriptor(KeyEvent.VK_SHIFT, KeyEvent.VK_SHIFT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_BACK_SLASH, new KeyDescriptor(KeyEvent.VK_BACK_SLASH, KeyEvent.VK_BACK_SLASH, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\\", false, 0), new KeySymDescriptor("|", false, 1))));
layout.keys.put(KeyEvent.VK_Z, new KeyDescriptor(KeyEvent.VK_Z, KeyEvent.VK_Z, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("z", false, 0), new KeySymDescriptor("Z", false, 1))));
layout.keys.put(KeyEvent.VK_X, new KeyDescriptor(KeyEvent.VK_X, KeyEvent.VK_X, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("x", false, 0), new KeySymDescriptor("X", false, 1))));
layout.keys.put(KeyEvent.VK_C, new KeyDescriptor(KeyEvent.VK_C, KeyEvent.VK_C, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("c", false, 0), new KeySymDescriptor("C", false, 1))));
layout.keys.put(KeyEvent.VK_V, new KeyDescriptor(KeyEvent.VK_V, KeyEvent.VK_V, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("v", false, 0), new KeySymDescriptor("V", false, 1))));
layout.keys.put(KeyEvent.VK_B, new KeyDescriptor(KeyEvent.VK_B, KeyEvent.VK_B, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("b", false, 0), new KeySymDescriptor("B", false, 1))));
layout.keys.put(KeyEvent.VK_N, new KeyDescriptor(KeyEvent.VK_N, KeyEvent.VK_N, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("n", false, 0), new KeySymDescriptor("N", false, 1))));
layout.keys.put(KeyEvent.VK_M, new KeyDescriptor(KeyEvent.VK_M, KeyEvent.VK_M, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("m", false, 0), new KeySymDescriptor("M", false, 1))));
layout.keys.put(KeyEvent.VK_COMMA, new KeyDescriptor(KeyEvent.VK_COMMA, KeyEvent.VK_COMMA, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor(",", false, 0), new KeySymDescriptor("<", false, 1))));
layout.keys.put(KeyEvent.VK_PERIOD, new KeyDescriptor(KeyEvent.VK_PERIOD, KeyEvent.VK_PERIOD, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor(".", false, 0), new KeySymDescriptor(">", false, 1))));
layout.keys.put(KeyEvent.VK_SLASH, new KeyDescriptor(KeyEvent.VK_SLASH, KeyEvent.VK_SLASH, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("/", false, 0), new KeySymDescriptor("?", false, 1))));
layout.keys.put(KeyEvent.VK_MULTIPLY, new KeyDescriptor(KeyEvent.VK_MULTIPLY, KeyEvent.VK_MULTIPLY, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("*", false, 0), new KeySymDescriptor("*", false, 1), new KeySymDescriptor("*", false, 128), new KeySymDescriptor("*", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_ALT, new KeyDescriptor(KeyEvent.VK_ALT, KeyEvent.VK_ALT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1))));
layout.keys.put(KeyEvent.VK_SPACE, new KeyDescriptor(KeyEvent.VK_SPACE, KeyEvent.VK_SPACE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor(" ", false, 0))));
layout.keys.put(KeyEvent.VK_CAPS_LOCK, new KeyDescriptor(KeyEvent.VK_CAPS_LOCK, KeyEvent.VK_CAPS_LOCK, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F1, new KeyDescriptor(KeyEvent.VK_F1, KeyEvent.VK_F1, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F2, new KeyDescriptor(KeyEvent.VK_F2, KeyEvent.VK_F2, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F3, new KeyDescriptor(KeyEvent.VK_F3, KeyEvent.VK_F3, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F4, new KeyDescriptor(KeyEvent.VK_F4, KeyEvent.VK_F4, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F5, new KeyDescriptor(KeyEvent.VK_F5, KeyEvent.VK_F5, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F6, new KeyDescriptor(KeyEvent.VK_F6, KeyEvent.VK_F6, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F7, new KeyDescriptor(KeyEvent.VK_F7, KeyEvent.VK_F7, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F8, new KeyDescriptor(KeyEvent.VK_F8, KeyEvent.VK_F8, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F9, new KeyDescriptor(KeyEvent.VK_F9, KeyEvent.VK_F9, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F10, new KeyDescriptor(KeyEvent.VK_F10, KeyEvent.VK_F10, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_NUM_LOCK, new KeyDescriptor(KeyEvent.VK_NUM_LOCK, KeyEvent.VK_NUM_LOCK, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_NUMPAD7, new KeyDescriptor(KeyEvent.VK_NUMPAD7, KeyEvent.VK_HOME, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("7", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD8, new KeyDescriptor(KeyEvent.VK_NUMPAD8, KeyEvent.VK_KP_UP, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("8", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD9, new KeyDescriptor(KeyEvent.VK_NUMPAD9, KeyEvent.VK_PAGE_UP, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("9", false, 16))));
layout.keys.put(KeyEvent.VK_SUBTRACT, new KeyDescriptor(KeyEvent.VK_SUBTRACT, KeyEvent.VK_SUBTRACT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("-", false, 0), new KeySymDescriptor("-", false, 1), new KeySymDescriptor("-", false, 128), new KeySymDescriptor("-", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_NUMPAD4, new KeyDescriptor(KeyEvent.VK_NUMPAD4, KeyEvent.VK_KP_LEFT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("4", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD5, new KeyDescriptor(KeyEvent.VK_NUMPAD5, KeyEvent.VK_BEGIN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("5", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD6, new KeyDescriptor(KeyEvent.VK_NUMPAD6, KeyEvent.VK_KP_RIGHT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("6", false, 16))));
layout.keys.put(KeyEvent.VK_ADD, new KeyDescriptor(KeyEvent.VK_ADD, KeyEvent.VK_ADD, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("+", false, 0), new KeySymDescriptor("+", false, 1), new KeySymDescriptor("+", false, 128), new KeySymDescriptor("+", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_NUMPAD1, new KeyDescriptor(KeyEvent.VK_NUMPAD1, KeyEvent.VK_END, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("1", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD2, new KeyDescriptor(KeyEvent.VK_NUMPAD2, KeyEvent.VK_KP_DOWN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("2", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD3, new KeyDescriptor(KeyEvent.VK_NUMPAD3, KeyEvent.VK_PAGE_DOWN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("3", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD0, new KeyDescriptor(KeyEvent.VK_NUMPAD0, KeyEvent.VK_INSERT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("0", false, 16))));
layout.keys.put(KeyEvent.VK_DECIMAL, new KeyDescriptor(KeyEvent.VK_DECIMAL, KeyEvent.VK_DELETE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor(".", false, 16))));
layout.keys.put(KeyEvent.VK_LESS, new KeyDescriptor(KeyEvent.VK_LESS, KeyEvent.VK_LESS, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("<", false, 0), new KeySymDescriptor(">", false, 1), new KeySymDescriptor("|", false, 128), new KeySymDescriptor("\u00a6", false, 129))));
layout.keys.put(KeyEvent.VK_F11, new KeyDescriptor(KeyEvent.VK_F11, KeyEvent.VK_F11, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F12, new KeyDescriptor(KeyEvent.VK_F12, KeyEvent.VK_F12, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_DIVIDE, new KeyDescriptor(KeyEvent.VK_DIVIDE, KeyEvent.VK_DIVIDE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("/", false, 0), new KeySymDescriptor("/", false, 1), new KeySymDescriptor("/", false, 128), new KeySymDescriptor("/", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_PRINTSCREEN, new KeyDescriptor(KeyEvent.VK_PRINTSCREEN, KeyEvent.VK_PRINTSCREEN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 8))));
layout.keys.put(KeyEvent.VK_ALT_GRAPH, new KeyDescriptor(KeyEvent.VK_ALT_GRAPH, KeyEvent.VK_ALT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1))));
layout.keys.put(KeyEvent.VK_HOME, new KeyDescriptor(KeyEvent.VK_HOME, KeyEvent.VK_HOME, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_UP, new KeyDescriptor(KeyEvent.VK_UP, KeyEvent.VK_UP, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_PAGE_UP, new KeyDescriptor(KeyEvent.VK_PAGE_UP, KeyEvent.VK_PAGE_UP, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_LEFT, new KeyDescriptor(KeyEvent.VK_LEFT, KeyEvent.VK_LEFT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_RIGHT, new KeyDescriptor(KeyEvent.VK_RIGHT, KeyEvent.VK_RIGHT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_END, new KeyDescriptor(KeyEvent.VK_END, KeyEvent.VK_END, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_DOWN, new KeyDescriptor(KeyEvent.VK_DOWN, KeyEvent.VK_DOWN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_PAGE_DOWN, new KeyDescriptor(KeyEvent.VK_PAGE_DOWN, KeyEvent.VK_PAGE_DOWN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_INSERT, new KeyDescriptor(KeyEvent.VK_INSERT, KeyEvent.VK_INSERT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_DELETE, new KeyDescriptor(KeyEvent.VK_DELETE, KeyEvent.VK_DELETE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u007f", false, 0))));
layout.keys.put(KeyEvent.VK_PAUSE, new KeyDescriptor(KeyEvent.VK_PAUSE, KeyEvent.VK_PAUSE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 4))));
layout.keys.put(KeyEvent.VK_META, new KeyDescriptor(KeyEvent.VK_META, KeyEvent.VK_WINDOWS, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_WINDOWS, new KeyDescriptor(KeyEvent.VK_WINDOWS, KeyEvent.VK_WINDOWS, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F13, new KeyDescriptor(KeyEvent.VK_F13, KeyEvent.VK_F13, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F14, new KeyDescriptor(KeyEvent.VK_F14, KeyEvent.VK_F14, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F15, new KeyDescriptor(KeyEvent.VK_F15, KeyEvent.VK_F15, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F16, new KeyDescriptor(KeyEvent.VK_F16, KeyEvent.VK_F16, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F17, new KeyDescriptor(KeyEvent.VK_F17, KeyEvent.VK_F17, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F18, new KeyDescriptor(KeyEvent.VK_F18, KeyEvent.VK_F18, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F20, new KeyDescriptor(KeyEvent.VK_F20, KeyEvent.VK_F20, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F21, new KeyDescriptor(KeyEvent.VK_F21, KeyEvent.VK_F21, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F22, new KeyDescriptor(KeyEvent.VK_F22, KeyEvent.VK_F22, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F23, new KeyDescriptor(KeyEvent.VK_F23, KeyEvent.VK_F23, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layouts.add(layout);
}
{
var layout = new LayoutDescriptor("us", "intl", "English (US, intl., with dead keys)", true, new HashMap<>());
layout.keys.put(KeyEvent.VK_ESCAPE, new KeyDescriptor(KeyEvent.VK_ESCAPE, KeyEvent.VK_ESCAPE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u001b", false, 0))));
layout.keys.put(KeyEvent.VK_1, new KeyDescriptor(KeyEvent.VK_1, KeyEvent.VK_1, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("1", false, 0), new KeySymDescriptor("!", false, 1), new KeySymDescriptor("\u00a1", false, 128), new KeySymDescriptor("\u00b9", false, 129))));
layout.keys.put(KeyEvent.VK_2, new KeyDescriptor(KeyEvent.VK_2, KeyEvent.VK_2, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("2", false, 0), new KeySymDescriptor("@", false, 1), new KeySymDescriptor("\u00b2", false, 128), new KeySymDescriptor("\u02dd", true, 129))));
layout.keys.put(KeyEvent.VK_3, new KeyDescriptor(KeyEvent.VK_3, KeyEvent.VK_3, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("3", false, 0), new KeySymDescriptor("#", false, 1), new KeySymDescriptor("\u00b3", false, 128), new KeySymDescriptor("\u00af", true, 129))));
layout.keys.put(KeyEvent.VK_4, new KeyDescriptor(KeyEvent.VK_4, KeyEvent.VK_4, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("4", false, 0), new KeySymDescriptor("$", false, 1), new KeySymDescriptor("\u00a4", false, 128), new KeySymDescriptor("\u00a3", false, 129))));
layout.keys.put(KeyEvent.VK_5, new KeyDescriptor(KeyEvent.VK_5, KeyEvent.VK_5, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("5", false, 0), new KeySymDescriptor("%", false, 1), new KeySymDescriptor("\u20ac", false, 128), new KeySymDescriptor("\u00b8", true, 129))));
layout.keys.put(KeyEvent.VK_6, new KeyDescriptor(KeyEvent.VK_6, KeyEvent.VK_6, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("6", false, 0), new KeySymDescriptor("^", true, 1), new KeySymDescriptor("\u00bc", false, 128), new KeySymDescriptor("^", false, 129))));
layout.keys.put(KeyEvent.VK_7, new KeyDescriptor(KeyEvent.VK_7, KeyEvent.VK_7, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("7", false, 0), new KeySymDescriptor("&", false, 1), new KeySymDescriptor("\u00bd", false, 128), new KeySymDescriptor("\u031b", true, 129))));
layout.keys.put(KeyEvent.VK_8, new KeyDescriptor(KeyEvent.VK_8, KeyEvent.VK_8, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("8", false, 0), new KeySymDescriptor("*", false, 1), new KeySymDescriptor("\u00be", false, 128), new KeySymDescriptor("\u02db", true, 129))));
layout.keys.put(KeyEvent.VK_9, new KeyDescriptor(KeyEvent.VK_9, KeyEvent.VK_9, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("9", false, 0), new KeySymDescriptor("(", false, 1), new KeySymDescriptor("\u2018", false, 128), new KeySymDescriptor("\u02d8", true, 129))));
layout.keys.put(KeyEvent.VK_0, new KeyDescriptor(KeyEvent.VK_0, KeyEvent.VK_0, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("0", false, 0), new KeySymDescriptor(")", false, 1), new KeySymDescriptor("\u2019", false, 128), new KeySymDescriptor("\u00b0", true, 129))));
layout.keys.put(KeyEvent.VK_MINUS, new KeyDescriptor(KeyEvent.VK_MINUS, KeyEvent.VK_MINUS, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("-", false, 0), new KeySymDescriptor("_", false, 1), new KeySymDescriptor("\u00a5", false, 128), new KeySymDescriptor("\u0323", true, 129))));
layout.keys.put(KeyEvent.VK_EQUALS, new KeyDescriptor(KeyEvent.VK_EQUALS, KeyEvent.VK_EQUALS, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("=", false, 0), new KeySymDescriptor("+", false, 1), new KeySymDescriptor("\u00d7", false, 128), new KeySymDescriptor("\u00f7", false, 129))));
layout.keys.put(KeyEvent.VK_BACK_SPACE, new KeyDescriptor(KeyEvent.VK_BACK_SPACE, KeyEvent.VK_BACK_SPACE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0008", false, 0), new KeySymDescriptor("\u0008", false, 1))));
layout.keys.put(KeyEvent.VK_TAB, new KeyDescriptor(KeyEvent.VK_TAB, KeyEvent.VK_TAB, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\t", false, 0), new KeySymDescriptor("", false, 1))));
layout.keys.put(KeyEvent.VK_Q, new KeyDescriptor(KeyEvent.VK_Q, KeyEvent.VK_Q, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("q", false, 0), new KeySymDescriptor("Q", false, 1), new KeySymDescriptor("\u00e4", false, 128), new KeySymDescriptor("\u00c4", false, 129))));
layout.keys.put(KeyEvent.VK_W, new KeyDescriptor(KeyEvent.VK_W, KeyEvent.VK_W, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("w", false, 0), new KeySymDescriptor("W", false, 1), new KeySymDescriptor("\u00e5", false, 128), new KeySymDescriptor("\u00c5", false, 129))));
layout.keys.put(KeyEvent.VK_E, new KeyDescriptor(KeyEvent.VK_E, KeyEvent.VK_E, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("e", false, 0), new KeySymDescriptor("E", false, 1), new KeySymDescriptor("\u00e9", false, 128), new KeySymDescriptor("\u00c9", false, 129))));
layout.keys.put(KeyEvent.VK_R, new KeyDescriptor(KeyEvent.VK_R, KeyEvent.VK_R, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("r", false, 0), new KeySymDescriptor("R", false, 1), new KeySymDescriptor("\u00ae", false, 128), new KeySymDescriptor("\u2122", false, 129))));
layout.keys.put(KeyEvent.VK_T, new KeyDescriptor(KeyEvent.VK_T, KeyEvent.VK_T, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("t", false, 0), new KeySymDescriptor("T", false, 1), new KeySymDescriptor("\u00fe", false, 128), new KeySymDescriptor("\u00de", false, 129))));
layout.keys.put(KeyEvent.VK_Y, new KeyDescriptor(KeyEvent.VK_Y, KeyEvent.VK_Y, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("y", false, 0), new KeySymDescriptor("Y", false, 1), new KeySymDescriptor("\u00fc", false, 128), new KeySymDescriptor("\u00dc", false, 129))));
layout.keys.put(KeyEvent.VK_U, new KeyDescriptor(KeyEvent.VK_U, KeyEvent.VK_U, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("u", false, 0), new KeySymDescriptor("U", false, 1), new KeySymDescriptor("\u00fa", false, 128), new KeySymDescriptor("\u00da", false, 129))));
layout.keys.put(KeyEvent.VK_I, new KeyDescriptor(KeyEvent.VK_I, KeyEvent.VK_I, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("i", false, 0), new KeySymDescriptor("I", false, 1), new KeySymDescriptor("\u00ed", false, 128), new KeySymDescriptor("\u00cd", false, 129))));
layout.keys.put(KeyEvent.VK_O, new KeyDescriptor(KeyEvent.VK_O, KeyEvent.VK_O, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("o", false, 0), new KeySymDescriptor("O", false, 1), new KeySymDescriptor("\u00f3", false, 128), new KeySymDescriptor("\u00d3", false, 129))));
layout.keys.put(KeyEvent.VK_P, new KeyDescriptor(KeyEvent.VK_P, KeyEvent.VK_P, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("p", false, 0), new KeySymDescriptor("P", false, 1), new KeySymDescriptor("\u00f6", false, 128), new KeySymDescriptor("\u00d6", false, 129))));
layout.keys.put(KeyEvent.VK_OPEN_BRACKET, new KeyDescriptor(KeyEvent.VK_OPEN_BRACKET, KeyEvent.VK_OPEN_BRACKET, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("[", false, 0), new KeySymDescriptor("{", false, 1), new KeySymDescriptor("\u00ab", false, 128), new KeySymDescriptor("\u201c", false, 129))));
layout.keys.put(KeyEvent.VK_CLOSE_BRACKET, new KeyDescriptor(KeyEvent.VK_CLOSE_BRACKET, KeyEvent.VK_CLOSE_BRACKET, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("]", false, 0), new KeySymDescriptor("}", false, 1), new KeySymDescriptor("\u00bb", false, 128), new KeySymDescriptor("\u201d", false, 129))));
layout.keys.put(KeyEvent.VK_ENTER, new KeyDescriptor(KeyEvent.VK_ENTER, KeyEvent.VK_ENTER, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\r", false, 0))));
layout.keys.put(KeyEvent.VK_CONTROL, new KeyDescriptor(KeyEvent.VK_CONTROL, KeyEvent.VK_CONTROL, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_A, new KeyDescriptor(KeyEvent.VK_A, KeyEvent.VK_A, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("a", false, 0), new KeySymDescriptor("A", false, 1), new KeySymDescriptor("\u00e1", false, 128), new KeySymDescriptor("\u00c1", false, 129))));
layout.keys.put(KeyEvent.VK_S, new KeyDescriptor(KeyEvent.VK_S, KeyEvent.VK_S, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("s", false, 0), new KeySymDescriptor("S", false, 1), new KeySymDescriptor("\u00df", false, 128), new KeySymDescriptor("\u00a7", false, 129))));
layout.keys.put(KeyEvent.VK_D, new KeyDescriptor(KeyEvent.VK_D, KeyEvent.VK_D, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("d", false, 0), new KeySymDescriptor("D", false, 1), new KeySymDescriptor("\u00f0", false, 128), new KeySymDescriptor("\u00d0", false, 129))));
layout.keys.put(KeyEvent.VK_F, new KeyDescriptor(KeyEvent.VK_F, KeyEvent.VK_F, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("f", false, 0), new KeySymDescriptor("F", false, 1), new KeySymDescriptor("f", false, 128), new KeySymDescriptor("F", false, 129))));
layout.keys.put(KeyEvent.VK_G, new KeyDescriptor(KeyEvent.VK_G, KeyEvent.VK_G, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("g", false, 0), new KeySymDescriptor("G", false, 1), new KeySymDescriptor("g", false, 128), new KeySymDescriptor("G", false, 129))));
layout.keys.put(KeyEvent.VK_H, new KeyDescriptor(KeyEvent.VK_H, KeyEvent.VK_H, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("h", false, 0), new KeySymDescriptor("H", false, 1), new KeySymDescriptor("h", false, 128), new KeySymDescriptor("H", false, 129))));
layout.keys.put(KeyEvent.VK_J, new KeyDescriptor(KeyEvent.VK_J, KeyEvent.VK_J, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("j", false, 0), new KeySymDescriptor("J", false, 1), new KeySymDescriptor("j", false, 128), new KeySymDescriptor("J", false, 129))));
layout.keys.put(KeyEvent.VK_K, new KeyDescriptor(KeyEvent.VK_K, KeyEvent.VK_K, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("k", false, 0), new KeySymDescriptor("K", false, 1), new KeySymDescriptor("\u0153", false, 128), new KeySymDescriptor("\u0152", false, 129))));
layout.keys.put(KeyEvent.VK_L, new KeyDescriptor(KeyEvent.VK_L, KeyEvent.VK_L, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("l", false, 0), new KeySymDescriptor("L", false, 1), new KeySymDescriptor("\u00f8", false, 128), new KeySymDescriptor("\u00d8", false, 129))));
layout.keys.put(KeyEvent.VK_SEMICOLON, new KeyDescriptor(KeyEvent.VK_SEMICOLON, KeyEvent.VK_SEMICOLON, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor(";", false, 0), new KeySymDescriptor(":", false, 1), new KeySymDescriptor("\u00b6", false, 128), new KeySymDescriptor("\u00b0", false, 129))));
layout.keys.put(KeyEvent.VK_QUOTE, new KeyDescriptor(KeyEvent.VK_QUOTE, KeyEvent.VK_DEAD_ACUTE, KeyEvent.VK_QUOTE, List.of(new KeySymDescriptor("'", true, 0), new KeySymDescriptor("\"", true, 1), new KeySymDescriptor("'", false, 128), new KeySymDescriptor("\"", false, 129))));
layout.keys.put(KeyEvent.VK_BACK_QUOTE, new KeyDescriptor(KeyEvent.VK_BACK_QUOTE, KeyEvent.VK_DEAD_GRAVE, KeyEvent.VK_BACK_QUOTE, List.of(new KeySymDescriptor("`", true, 0), new KeySymDescriptor("~", true, 1), new KeySymDescriptor("`", false, 128), new KeySymDescriptor("~", false, 129))));
layout.keys.put(KeyEvent.VK_SHIFT, new KeyDescriptor(KeyEvent.VK_SHIFT, KeyEvent.VK_SHIFT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_BACK_SLASH, new KeyDescriptor(KeyEvent.VK_BACK_SLASH, KeyEvent.VK_BACK_SLASH, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\\", false, 0), new KeySymDescriptor("|", false, 1), new KeySymDescriptor("\u00ac", false, 128), new KeySymDescriptor("\u00a6", false, 129))));
layout.keys.put(KeyEvent.VK_Z, new KeyDescriptor(KeyEvent.VK_Z, KeyEvent.VK_Z, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("z", false, 0), new KeySymDescriptor("Z", false, 1), new KeySymDescriptor("\u00e6", false, 128), new KeySymDescriptor("\u00c6", false, 129))));
layout.keys.put(KeyEvent.VK_X, new KeyDescriptor(KeyEvent.VK_X, KeyEvent.VK_X, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("x", false, 0), new KeySymDescriptor("X", false, 1), new KeySymDescriptor("x", false, 128), new KeySymDescriptor("X", false, 129))));
layout.keys.put(KeyEvent.VK_C, new KeyDescriptor(KeyEvent.VK_C, KeyEvent.VK_C, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("c", false, 0), new KeySymDescriptor("C", false, 1), new KeySymDescriptor("\u00a9", false, 128), new KeySymDescriptor("\u00a2", false, 129))));
layout.keys.put(KeyEvent.VK_V, new KeyDescriptor(KeyEvent.VK_V, KeyEvent.VK_V, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("v", false, 0), new KeySymDescriptor("V", false, 1), new KeySymDescriptor("v", false, 128), new KeySymDescriptor("V", false, 129))));
layout.keys.put(KeyEvent.VK_B, new KeyDescriptor(KeyEvent.VK_B, KeyEvent.VK_B, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("b", false, 0), new KeySymDescriptor("B", false, 1), new KeySymDescriptor("b", false, 128), new KeySymDescriptor("B", false, 129))));
layout.keys.put(KeyEvent.VK_N, new KeyDescriptor(KeyEvent.VK_N, KeyEvent.VK_N, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("n", false, 0), new KeySymDescriptor("N", false, 1), new KeySymDescriptor("\u00f1", false, 128), new KeySymDescriptor("\u00d1", false, 129))));
layout.keys.put(KeyEvent.VK_M, new KeyDescriptor(KeyEvent.VK_M, KeyEvent.VK_M, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("m", false, 0), new KeySymDescriptor("M", false, 1), new KeySymDescriptor("\u00b5", false, 128), new KeySymDescriptor("\u00b5", false, 129))));
layout.keys.put(KeyEvent.VK_COMMA, new KeyDescriptor(KeyEvent.VK_COMMA, KeyEvent.VK_COMMA, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor(",", false, 0), new KeySymDescriptor("<", false, 1), new KeySymDescriptor("\u00e7", false, 128), new KeySymDescriptor("\u00c7", false, 129))));
layout.keys.put(KeyEvent.VK_PERIOD, new KeyDescriptor(KeyEvent.VK_PERIOD, KeyEvent.VK_PERIOD, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor(".", false, 0), new KeySymDescriptor(">", false, 1), new KeySymDescriptor("\u02d9", true, 128), new KeySymDescriptor("\u02c7", true, 129))));
layout.keys.put(KeyEvent.VK_SLASH, new KeyDescriptor(KeyEvent.VK_SLASH, KeyEvent.VK_SLASH, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("/", false, 0), new KeySymDescriptor("?", false, 1), new KeySymDescriptor("\u00bf", false, 128), new KeySymDescriptor("\u0309", true, 129))));
layout.keys.put(KeyEvent.VK_MULTIPLY, new KeyDescriptor(KeyEvent.VK_MULTIPLY, KeyEvent.VK_MULTIPLY, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("*", false, 0), new KeySymDescriptor("*", false, 1), new KeySymDescriptor("*", false, 128), new KeySymDescriptor("*", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_ALT, new KeyDescriptor(KeyEvent.VK_ALT, KeyEvent.VK_ALT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1))));
layout.keys.put(KeyEvent.VK_SPACE, new KeyDescriptor(KeyEvent.VK_SPACE, KeyEvent.VK_SPACE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor(" ", false, 0))));
layout.keys.put(KeyEvent.VK_CAPS_LOCK, new KeyDescriptor(KeyEvent.VK_CAPS_LOCK, KeyEvent.VK_CAPS_LOCK, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F1, new KeyDescriptor(KeyEvent.VK_F1, KeyEvent.VK_F1, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F2, new KeyDescriptor(KeyEvent.VK_F2, KeyEvent.VK_F2, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F3, new KeyDescriptor(KeyEvent.VK_F3, KeyEvent.VK_F3, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F4, new KeyDescriptor(KeyEvent.VK_F4, KeyEvent.VK_F4, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F5, new KeyDescriptor(KeyEvent.VK_F5, KeyEvent.VK_F5, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F6, new KeyDescriptor(KeyEvent.VK_F6, KeyEvent.VK_F6, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F7, new KeyDescriptor(KeyEvent.VK_F7, KeyEvent.VK_F7, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F8, new KeyDescriptor(KeyEvent.VK_F8, KeyEvent.VK_F8, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F9, new KeyDescriptor(KeyEvent.VK_F9, KeyEvent.VK_F9, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F10, new KeyDescriptor(KeyEvent.VK_F10, KeyEvent.VK_F10, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_NUM_LOCK, new KeyDescriptor(KeyEvent.VK_NUM_LOCK, KeyEvent.VK_NUM_LOCK, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_NUMPAD7, new KeyDescriptor(KeyEvent.VK_NUMPAD7, KeyEvent.VK_HOME, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("7", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD8, new KeyDescriptor(KeyEvent.VK_NUMPAD8, KeyEvent.VK_KP_UP, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("8", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD9, new KeyDescriptor(KeyEvent.VK_NUMPAD9, KeyEvent.VK_PAGE_UP, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("9", false, 16))));
layout.keys.put(KeyEvent.VK_SUBTRACT, new KeyDescriptor(KeyEvent.VK_SUBTRACT, KeyEvent.VK_SUBTRACT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("-", false, 0), new KeySymDescriptor("-", false, 1), new KeySymDescriptor("-", false, 128), new KeySymDescriptor("-", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_NUMPAD4, new KeyDescriptor(KeyEvent.VK_NUMPAD4, KeyEvent.VK_KP_LEFT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("4", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD5, new KeyDescriptor(KeyEvent.VK_NUMPAD5, KeyEvent.VK_BEGIN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("5", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD6, new KeyDescriptor(KeyEvent.VK_NUMPAD6, KeyEvent.VK_KP_RIGHT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("6", false, 16))));
layout.keys.put(KeyEvent.VK_ADD, new KeyDescriptor(KeyEvent.VK_ADD, KeyEvent.VK_ADD, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("+", false, 0), new KeySymDescriptor("+", false, 1), new KeySymDescriptor("+", false, 128), new KeySymDescriptor("+", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_NUMPAD1, new KeyDescriptor(KeyEvent.VK_NUMPAD1, KeyEvent.VK_END, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("1", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD2, new KeyDescriptor(KeyEvent.VK_NUMPAD2, KeyEvent.VK_KP_DOWN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("2", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD3, new KeyDescriptor(KeyEvent.VK_NUMPAD3, KeyEvent.VK_PAGE_DOWN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("3", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD0, new KeyDescriptor(KeyEvent.VK_NUMPAD0, KeyEvent.VK_INSERT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("0", false, 16))));
layout.keys.put(KeyEvent.VK_DECIMAL, new KeyDescriptor(KeyEvent.VK_DECIMAL, KeyEvent.VK_DELETE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor(".", false, 16))));
layout.keys.put(KeyEvent.VK_LESS, new KeyDescriptor(KeyEvent.VK_LESS, KeyEvent.VK_BACK_SLASH, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\\", false, 0), new KeySymDescriptor("|", false, 1), new KeySymDescriptor("\\", false, 128), new KeySymDescriptor("|", false, 129))));
layout.keys.put(KeyEvent.VK_F11, new KeyDescriptor(KeyEvent.VK_F11, KeyEvent.VK_F11, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F12, new KeyDescriptor(KeyEvent.VK_F12, KeyEvent.VK_F12, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_DIVIDE, new KeyDescriptor(KeyEvent.VK_DIVIDE, KeyEvent.VK_DIVIDE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("/", false, 0), new KeySymDescriptor("/", false, 1), new KeySymDescriptor("/", false, 128), new KeySymDescriptor("/", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_PRINTSCREEN, new KeyDescriptor(KeyEvent.VK_PRINTSCREEN, KeyEvent.VK_PRINTSCREEN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 8))));
layout.keys.put(KeyEvent.VK_ALT_GRAPH, new KeyDescriptor(KeyEvent.VK_ALT_GRAPH, KeyEvent.VK_ALT_GRAPH, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_HOME, new KeyDescriptor(KeyEvent.VK_HOME, KeyEvent.VK_HOME, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_UP, new KeyDescriptor(KeyEvent.VK_UP, KeyEvent.VK_UP, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_PAGE_UP, new KeyDescriptor(KeyEvent.VK_PAGE_UP, KeyEvent.VK_PAGE_UP, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_LEFT, new KeyDescriptor(KeyEvent.VK_LEFT, KeyEvent.VK_LEFT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_RIGHT, new KeyDescriptor(KeyEvent.VK_RIGHT, KeyEvent.VK_RIGHT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_END, new KeyDescriptor(KeyEvent.VK_END, KeyEvent.VK_END, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_DOWN, new KeyDescriptor(KeyEvent.VK_DOWN, KeyEvent.VK_DOWN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_PAGE_DOWN, new KeyDescriptor(KeyEvent.VK_PAGE_DOWN, KeyEvent.VK_PAGE_DOWN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_INSERT, new KeyDescriptor(KeyEvent.VK_INSERT, KeyEvent.VK_INSERT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_DELETE, new KeyDescriptor(KeyEvent.VK_DELETE, KeyEvent.VK_DELETE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u007f", false, 0))));
layout.keys.put(KeyEvent.VK_PAUSE, new KeyDescriptor(KeyEvent.VK_PAUSE, KeyEvent.VK_PAUSE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 4))));
layout.keys.put(KeyEvent.VK_META, new KeyDescriptor(KeyEvent.VK_META, KeyEvent.VK_WINDOWS, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_WINDOWS, new KeyDescriptor(KeyEvent.VK_WINDOWS, KeyEvent.VK_WINDOWS, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F13, new KeyDescriptor(KeyEvent.VK_F13, KeyEvent.VK_F13, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F14, new KeyDescriptor(KeyEvent.VK_F14, KeyEvent.VK_F14, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F15, new KeyDescriptor(KeyEvent.VK_F15, KeyEvent.VK_F15, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F16, new KeyDescriptor(KeyEvent.VK_F16, KeyEvent.VK_F16, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F17, new KeyDescriptor(KeyEvent.VK_F17, KeyEvent.VK_F17, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F18, new KeyDescriptor(KeyEvent.VK_F18, KeyEvent.VK_F18, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F20, new KeyDescriptor(KeyEvent.VK_F20, KeyEvent.VK_F20, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F21, new KeyDescriptor(KeyEvent.VK_F21, KeyEvent.VK_F21, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F22, new KeyDescriptor(KeyEvent.VK_F22, KeyEvent.VK_F22, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F23, new KeyDescriptor(KeyEvent.VK_F23, KeyEvent.VK_F23, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layouts.add(layout);
}
{
var layout = new LayoutDescriptor("us", "altgr-intl", "English (intl., with AltGr dead keys)", true, new HashMap<>());
layout.keys.put(KeyEvent.VK_ESCAPE, new KeyDescriptor(KeyEvent.VK_ESCAPE, KeyEvent.VK_ESCAPE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u001b", false, 0))));
layout.keys.put(KeyEvent.VK_1, new KeyDescriptor(KeyEvent.VK_1, KeyEvent.VK_1, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("1", false, 0), new KeySymDescriptor("!", false, 1), new KeySymDescriptor("\u00b9", false, 128), new KeySymDescriptor("\u00a1", false, 129))));
layout.keys.put(KeyEvent.VK_2, new KeyDescriptor(KeyEvent.VK_2, KeyEvent.VK_2, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("2", false, 0), new KeySymDescriptor("@", false, 1), new KeySymDescriptor("\u00b2", false, 128), new KeySymDescriptor("\u02dd", true, 129))));
layout.keys.put(KeyEvent.VK_3, new KeyDescriptor(KeyEvent.VK_3, KeyEvent.VK_3, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("3", false, 0), new KeySymDescriptor("#", false, 1), new KeySymDescriptor("\u00b3", false, 128), new KeySymDescriptor("\u00af", true, 129))));
layout.keys.put(KeyEvent.VK_4, new KeyDescriptor(KeyEvent.VK_4, KeyEvent.VK_4, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("4", false, 0), new KeySymDescriptor("$", false, 1), new KeySymDescriptor("\u00a4", false, 128), new KeySymDescriptor("\u00a3", false, 129))));
layout.keys.put(KeyEvent.VK_5, new KeyDescriptor(KeyEvent.VK_5, KeyEvent.VK_5, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("5", false, 0), new KeySymDescriptor("%", false, 1), new KeySymDescriptor("\u20ac", false, 128), new KeySymDescriptor("\u00b8", true, 129))));
layout.keys.put(KeyEvent.VK_6, new KeyDescriptor(KeyEvent.VK_6, KeyEvent.VK_6, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("6", false, 0), new KeySymDescriptor("^", false, 1), new KeySymDescriptor("^", true, 128), new KeySymDescriptor("\u00bc", false, 129))));
layout.keys.put(KeyEvent.VK_7, new KeyDescriptor(KeyEvent.VK_7, KeyEvent.VK_7, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("7", false, 0), new KeySymDescriptor("&", false, 1), new KeySymDescriptor("\u031b", true, 128), new KeySymDescriptor("\u00bd", false, 129))));
layout.keys.put(KeyEvent.VK_8, new KeyDescriptor(KeyEvent.VK_8, KeyEvent.VK_8, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("8", false, 0), new KeySymDescriptor("*", false, 1), new KeySymDescriptor("\u02db", true, 128), new KeySymDescriptor("\u00be", false, 129))));
layout.keys.put(KeyEvent.VK_9, new KeyDescriptor(KeyEvent.VK_9, KeyEvent.VK_9, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("9", false, 0), new KeySymDescriptor("(", false, 1), new KeySymDescriptor("\u2018", false, 128), new KeySymDescriptor("\u02d8", true, 129))));
layout.keys.put(KeyEvent.VK_0, new KeyDescriptor(KeyEvent.VK_0, KeyEvent.VK_0, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("0", false, 0), new KeySymDescriptor(")", false, 1), new KeySymDescriptor("\u2019", false, 128), new KeySymDescriptor("\u00b0", true, 129))));
layout.keys.put(KeyEvent.VK_MINUS, new KeyDescriptor(KeyEvent.VK_MINUS, KeyEvent.VK_MINUS, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("-", false, 0), new KeySymDescriptor("_", false, 1), new KeySymDescriptor("\u00a5", false, 128), new KeySymDescriptor("\u0323", true, 129))));
layout.keys.put(KeyEvent.VK_EQUALS, new KeyDescriptor(KeyEvent.VK_EQUALS, KeyEvent.VK_EQUALS, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("=", false, 0), new KeySymDescriptor("+", false, 1), new KeySymDescriptor("\u00d7", false, 128), new KeySymDescriptor("\u00f7", false, 129))));
layout.keys.put(KeyEvent.VK_BACK_SPACE, new KeyDescriptor(KeyEvent.VK_BACK_SPACE, KeyEvent.VK_BACK_SPACE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0008", false, 0), new KeySymDescriptor("\u0008", false, 1))));
layout.keys.put(KeyEvent.VK_TAB, new KeyDescriptor(KeyEvent.VK_TAB, KeyEvent.VK_TAB, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\t", false, 0), new KeySymDescriptor("", false, 1))));
layout.keys.put(KeyEvent.VK_Q, new KeyDescriptor(KeyEvent.VK_Q, KeyEvent.VK_Q, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("q", false, 0), new KeySymDescriptor("Q", false, 1), new KeySymDescriptor("\u00e4", false, 128), new KeySymDescriptor("\u00c4", false, 129))));
layout.keys.put(KeyEvent.VK_W, new KeyDescriptor(KeyEvent.VK_W, KeyEvent.VK_W, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("w", false, 0), new KeySymDescriptor("W", false, 1), new KeySymDescriptor("\u00e5", false, 128), new KeySymDescriptor("\u00c5", false, 129))));
layout.keys.put(KeyEvent.VK_E, new KeyDescriptor(KeyEvent.VK_E, KeyEvent.VK_E, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("e", false, 0), new KeySymDescriptor("E", false, 1), new KeySymDescriptor("\u00e9", false, 128), new KeySymDescriptor("\u00c9", false, 129))));
layout.keys.put(KeyEvent.VK_R, new KeyDescriptor(KeyEvent.VK_R, KeyEvent.VK_R, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("r", false, 0), new KeySymDescriptor("R", false, 1), new KeySymDescriptor("\u00eb", false, 128), new KeySymDescriptor("\u00cb", false, 129))));
layout.keys.put(KeyEvent.VK_T, new KeyDescriptor(KeyEvent.VK_T, KeyEvent.VK_T, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("t", false, 0), new KeySymDescriptor("T", false, 1), new KeySymDescriptor("\u00fe", false, 128), new KeySymDescriptor("\u00de", false, 129))));
layout.keys.put(KeyEvent.VK_Y, new KeyDescriptor(KeyEvent.VK_Y, KeyEvent.VK_Y, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("y", false, 0), new KeySymDescriptor("Y", false, 1), new KeySymDescriptor("\u00fc", false, 128), new KeySymDescriptor("\u00dc", false, 129))));
layout.keys.put(KeyEvent.VK_U, new KeyDescriptor(KeyEvent.VK_U, KeyEvent.VK_U, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("u", false, 0), new KeySymDescriptor("U", false, 1), new KeySymDescriptor("\u00fa", false, 128), new KeySymDescriptor("\u00da", false, 129))));
layout.keys.put(KeyEvent.VK_I, new KeyDescriptor(KeyEvent.VK_I, KeyEvent.VK_I, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("i", false, 0), new KeySymDescriptor("I", false, 1), new KeySymDescriptor("\u00ed", false, 128), new KeySymDescriptor("\u00cd", false, 129))));
layout.keys.put(KeyEvent.VK_O, new KeyDescriptor(KeyEvent.VK_O, KeyEvent.VK_O, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("o", false, 0), new KeySymDescriptor("O", false, 1), new KeySymDescriptor("\u00f3", false, 128), new KeySymDescriptor("\u00d3", false, 129))));
layout.keys.put(KeyEvent.VK_P, new KeyDescriptor(KeyEvent.VK_P, KeyEvent.VK_P, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("p", false, 0), new KeySymDescriptor("P", false, 1), new KeySymDescriptor("\u00f6", false, 128), new KeySymDescriptor("\u00d6", false, 129))));
layout.keys.put(KeyEvent.VK_OPEN_BRACKET, new KeyDescriptor(KeyEvent.VK_OPEN_BRACKET, KeyEvent.VK_OPEN_BRACKET, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("[", false, 0), new KeySymDescriptor("{", false, 1), new KeySymDescriptor("\u00ab", false, 128), new KeySymDescriptor("\u201c", false, 129))));
layout.keys.put(KeyEvent.VK_CLOSE_BRACKET, new KeyDescriptor(KeyEvent.VK_CLOSE_BRACKET, KeyEvent.VK_CLOSE_BRACKET, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("]", false, 0), new KeySymDescriptor("}", false, 1), new KeySymDescriptor("\u00bb", false, 128), new KeySymDescriptor("\u201d", false, 129))));
layout.keys.put(KeyEvent.VK_ENTER, new KeyDescriptor(KeyEvent.VK_ENTER, KeyEvent.VK_ENTER, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\r", false, 0))));
layout.keys.put(KeyEvent.VK_CONTROL, new KeyDescriptor(KeyEvent.VK_CONTROL, KeyEvent.VK_CONTROL, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_A, new KeyDescriptor(KeyEvent.VK_A, KeyEvent.VK_A, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("a", false, 0), new KeySymDescriptor("A", false, 1), new KeySymDescriptor("\u00e1", false, 128), new KeySymDescriptor("\u00c1", false, 129))));
layout.keys.put(KeyEvent.VK_S, new KeyDescriptor(KeyEvent.VK_S, KeyEvent.VK_S, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("s", false, 0), new KeySymDescriptor("S", false, 1), new KeySymDescriptor("\u00df", false, 128), new KeySymDescriptor("\u00a7", false, 129))));
layout.keys.put(KeyEvent.VK_D, new KeyDescriptor(KeyEvent.VK_D, KeyEvent.VK_D, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("d", false, 0), new KeySymDescriptor("D", false, 1), new KeySymDescriptor("\u00f0", false, 128), new KeySymDescriptor("\u00d0", false, 129))));
layout.keys.put(KeyEvent.VK_F, new KeyDescriptor(KeyEvent.VK_F, KeyEvent.VK_F, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("f", false, 0), new KeySymDescriptor("F", false, 1), new KeySymDescriptor("f", false, 128), new KeySymDescriptor("F", false, 129))));
layout.keys.put(KeyEvent.VK_G, new KeyDescriptor(KeyEvent.VK_G, KeyEvent.VK_G, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("g", false, 0), new KeySymDescriptor("G", false, 1), new KeySymDescriptor("g", false, 128), new KeySymDescriptor("G", false, 129))));
layout.keys.put(KeyEvent.VK_H, new KeyDescriptor(KeyEvent.VK_H, KeyEvent.VK_H, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("h", false, 0), new KeySymDescriptor("H", false, 1), new KeySymDescriptor("h", false, 128), new KeySymDescriptor("H", false, 129))));
layout.keys.put(KeyEvent.VK_J, new KeyDescriptor(KeyEvent.VK_J, KeyEvent.VK_J, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("j", false, 0), new KeySymDescriptor("J", false, 1), new KeySymDescriptor("\u00ef", false, 128), new KeySymDescriptor("\u00cf", false, 129))));
layout.keys.put(KeyEvent.VK_K, new KeyDescriptor(KeyEvent.VK_K, KeyEvent.VK_K, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("k", false, 0), new KeySymDescriptor("K", false, 1), new KeySymDescriptor("\u0153", false, 128), new KeySymDescriptor("\u0152", false, 129))));
layout.keys.put(KeyEvent.VK_L, new KeyDescriptor(KeyEvent.VK_L, KeyEvent.VK_L, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("l", false, 0), new KeySymDescriptor("L", false, 1), new KeySymDescriptor("\u00f8", false, 128), new KeySymDescriptor("\u00d8", false, 129))));
layout.keys.put(KeyEvent.VK_SEMICOLON, new KeyDescriptor(KeyEvent.VK_SEMICOLON, KeyEvent.VK_SEMICOLON, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor(";", false, 0), new KeySymDescriptor(":", false, 1), new KeySymDescriptor("\u00b6", false, 128), new KeySymDescriptor("\u00b0", false, 129))));
layout.keys.put(KeyEvent.VK_QUOTE, new KeyDescriptor(KeyEvent.VK_QUOTE, KeyEvent.VK_QUOTE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("'", false, 0), new KeySymDescriptor("\"", false, 1), new KeySymDescriptor("'", true, 128), new KeySymDescriptor("\"", true, 129))));
layout.keys.put(KeyEvent.VK_BACK_QUOTE, new KeyDescriptor(KeyEvent.VK_BACK_QUOTE, KeyEvent.VK_BACK_QUOTE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("`", false, 0), new KeySymDescriptor("~", false, 1), new KeySymDescriptor("`", true, 128), new KeySymDescriptor("~", true, 129))));
layout.keys.put(KeyEvent.VK_SHIFT, new KeyDescriptor(KeyEvent.VK_SHIFT, KeyEvent.VK_SHIFT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_BACK_SLASH, new KeyDescriptor(KeyEvent.VK_BACK_SLASH, KeyEvent.VK_BACK_SLASH, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\\", false, 0), new KeySymDescriptor("|", false, 1), new KeySymDescriptor("\u00ac", false, 128), new KeySymDescriptor("\u00a6", false, 129))));
layout.keys.put(KeyEvent.VK_Z, new KeyDescriptor(KeyEvent.VK_Z, KeyEvent.VK_Z, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("z", false, 0), new KeySymDescriptor("Z", false, 1), new KeySymDescriptor("\u00e6", false, 128), new KeySymDescriptor("\u00c6", false, 129))));
layout.keys.put(KeyEvent.VK_X, new KeyDescriptor(KeyEvent.VK_X, KeyEvent.VK_X, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("x", false, 0), new KeySymDescriptor("X", false, 1), new KeySymDescriptor("\u0153", false, 128), new KeySymDescriptor("\u0152", false, 129))));
layout.keys.put(KeyEvent.VK_C, new KeyDescriptor(KeyEvent.VK_C, KeyEvent.VK_C, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("c", false, 0), new KeySymDescriptor("C", false, 1), new KeySymDescriptor("\u00a9", false, 128), new KeySymDescriptor("\u00a2", false, 129))));
layout.keys.put(KeyEvent.VK_V, new KeyDescriptor(KeyEvent.VK_V, KeyEvent.VK_V, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("v", false, 0), new KeySymDescriptor("V", false, 1), new KeySymDescriptor("\u00ae", false, 128), new KeySymDescriptor("\u2122", false, 129))));
layout.keys.put(KeyEvent.VK_B, new KeyDescriptor(KeyEvent.VK_B, KeyEvent.VK_B, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("b", false, 0), new KeySymDescriptor("B", false, 1), new KeySymDescriptor("b", false, 128), new KeySymDescriptor("B", false, 129))));
layout.keys.put(KeyEvent.VK_N, new KeyDescriptor(KeyEvent.VK_N, KeyEvent.VK_N, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("n", false, 0), new KeySymDescriptor("N", false, 1), new KeySymDescriptor("\u00f1", false, 128), new KeySymDescriptor("\u00d1", false, 129))));
layout.keys.put(KeyEvent.VK_M, new KeyDescriptor(KeyEvent.VK_M, KeyEvent.VK_M, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("m", false, 0), new KeySymDescriptor("M", false, 1), new KeySymDescriptor("\u00b5", false, 128), new KeySymDescriptor("\u00b5", false, 129))));
layout.keys.put(KeyEvent.VK_COMMA, new KeyDescriptor(KeyEvent.VK_COMMA, KeyEvent.VK_COMMA, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor(",", false, 0), new KeySymDescriptor("<", false, 1), new KeySymDescriptor("\u00e7", false, 128), new KeySymDescriptor("\u00c7", false, 129))));
layout.keys.put(KeyEvent.VK_PERIOD, new KeyDescriptor(KeyEvent.VK_PERIOD, KeyEvent.VK_PERIOD, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor(".", false, 0), new KeySymDescriptor(">", false, 1), new KeySymDescriptor("\u02d9", true, 128), new KeySymDescriptor("\u02c7", true, 129))));
layout.keys.put(KeyEvent.VK_SLASH, new KeyDescriptor(KeyEvent.VK_SLASH, KeyEvent.VK_SLASH, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("/", false, 0), new KeySymDescriptor("?", false, 1), new KeySymDescriptor("\u00bf", false, 128), new KeySymDescriptor("\u0309", true, 129))));
layout.keys.put(KeyEvent.VK_MULTIPLY, new KeyDescriptor(KeyEvent.VK_MULTIPLY, KeyEvent.VK_MULTIPLY, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("*", false, 0), new KeySymDescriptor("*", false, 1), new KeySymDescriptor("*", false, 128), new KeySymDescriptor("*", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_ALT, new KeyDescriptor(KeyEvent.VK_ALT, KeyEvent.VK_ALT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1))));
layout.keys.put(KeyEvent.VK_SPACE, new KeyDescriptor(KeyEvent.VK_SPACE, KeyEvent.VK_SPACE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor(" ", false, 0))));
layout.keys.put(KeyEvent.VK_CAPS_LOCK, new KeyDescriptor(KeyEvent.VK_CAPS_LOCK, KeyEvent.VK_CAPS_LOCK, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F1, new KeyDescriptor(KeyEvent.VK_F1, KeyEvent.VK_F1, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F2, new KeyDescriptor(KeyEvent.VK_F2, KeyEvent.VK_F2, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F3, new KeyDescriptor(KeyEvent.VK_F3, KeyEvent.VK_F3, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F4, new KeyDescriptor(KeyEvent.VK_F4, KeyEvent.VK_F4, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F5, new KeyDescriptor(KeyEvent.VK_F5, KeyEvent.VK_F5, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F6, new KeyDescriptor(KeyEvent.VK_F6, KeyEvent.VK_F6, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F7, new KeyDescriptor(KeyEvent.VK_F7, KeyEvent.VK_F7, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F8, new KeyDescriptor(KeyEvent.VK_F8, KeyEvent.VK_F8, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F9, new KeyDescriptor(KeyEvent.VK_F9, KeyEvent.VK_F9, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F10, new KeyDescriptor(KeyEvent.VK_F10, KeyEvent.VK_F10, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_NUM_LOCK, new KeyDescriptor(KeyEvent.VK_NUM_LOCK, KeyEvent.VK_NUM_LOCK, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_NUMPAD7, new KeyDescriptor(KeyEvent.VK_NUMPAD7, KeyEvent.VK_HOME, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("7", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD8, new KeyDescriptor(KeyEvent.VK_NUMPAD8, KeyEvent.VK_KP_UP, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("8", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD9, new KeyDescriptor(KeyEvent.VK_NUMPAD9, KeyEvent.VK_PAGE_UP, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("9", false, 16))));
layout.keys.put(KeyEvent.VK_SUBTRACT, new KeyDescriptor(KeyEvent.VK_SUBTRACT, KeyEvent.VK_SUBTRACT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("-", false, 0), new KeySymDescriptor("-", false, 1), new KeySymDescriptor("-", false, 128), new KeySymDescriptor("-", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_NUMPAD4, new KeyDescriptor(KeyEvent.VK_NUMPAD4, KeyEvent.VK_KP_LEFT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("4", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD5, new KeyDescriptor(KeyEvent.VK_NUMPAD5, KeyEvent.VK_BEGIN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("5", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD6, new KeyDescriptor(KeyEvent.VK_NUMPAD6, KeyEvent.VK_KP_RIGHT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("6", false, 16))));
layout.keys.put(KeyEvent.VK_ADD, new KeyDescriptor(KeyEvent.VK_ADD, KeyEvent.VK_ADD, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("+", false, 0), new KeySymDescriptor("+", false, 1), new KeySymDescriptor("+", false, 128), new KeySymDescriptor("+", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_NUMPAD1, new KeyDescriptor(KeyEvent.VK_NUMPAD1, KeyEvent.VK_END, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("1", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD2, new KeyDescriptor(KeyEvent.VK_NUMPAD2, KeyEvent.VK_KP_DOWN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("2", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD3, new KeyDescriptor(KeyEvent.VK_NUMPAD3, KeyEvent.VK_PAGE_DOWN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("3", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD0, new KeyDescriptor(KeyEvent.VK_NUMPAD0, KeyEvent.VK_INSERT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("0", false, 16))));
layout.keys.put(KeyEvent.VK_DECIMAL, new KeyDescriptor(KeyEvent.VK_DECIMAL, KeyEvent.VK_DELETE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor(".", false, 16))));
layout.keys.put(KeyEvent.VK_LESS, new KeyDescriptor(KeyEvent.VK_LESS, KeyEvent.VK_BACK_SLASH, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\\", false, 0), new KeySymDescriptor("|", false, 1), new KeySymDescriptor("\\", false, 128), new KeySymDescriptor("|", false, 129))));
layout.keys.put(KeyEvent.VK_F11, new KeyDescriptor(KeyEvent.VK_F11, KeyEvent.VK_F11, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F12, new KeyDescriptor(KeyEvent.VK_F12, KeyEvent.VK_F12, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_DIVIDE, new KeyDescriptor(KeyEvent.VK_DIVIDE, KeyEvent.VK_DIVIDE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("/", false, 0), new KeySymDescriptor("/", false, 1), new KeySymDescriptor("/", false, 128), new KeySymDescriptor("/", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_PRINTSCREEN, new KeyDescriptor(KeyEvent.VK_PRINTSCREEN, KeyEvent.VK_PRINTSCREEN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 8))));
layout.keys.put(KeyEvent.VK_ALT_GRAPH, new KeyDescriptor(KeyEvent.VK_ALT_GRAPH, KeyEvent.VK_ALT_GRAPH, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_HOME, new KeyDescriptor(KeyEvent.VK_HOME, KeyEvent.VK_HOME, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_UP, new KeyDescriptor(KeyEvent.VK_UP, KeyEvent.VK_UP, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_PAGE_UP, new KeyDescriptor(KeyEvent.VK_PAGE_UP, KeyEvent.VK_PAGE_UP, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_LEFT, new KeyDescriptor(KeyEvent.VK_LEFT, KeyEvent.VK_LEFT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_RIGHT, new KeyDescriptor(KeyEvent.VK_RIGHT, KeyEvent.VK_RIGHT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_END, new KeyDescriptor(KeyEvent.VK_END, KeyEvent.VK_END, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_DOWN, new KeyDescriptor(KeyEvent.VK_DOWN, KeyEvent.VK_DOWN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_PAGE_DOWN, new KeyDescriptor(KeyEvent.VK_PAGE_DOWN, KeyEvent.VK_PAGE_DOWN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_INSERT, new KeyDescriptor(KeyEvent.VK_INSERT, KeyEvent.VK_INSERT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_DELETE, new KeyDescriptor(KeyEvent.VK_DELETE, KeyEvent.VK_DELETE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u007f", false, 0))));
layout.keys.put(KeyEvent.VK_PAUSE, new KeyDescriptor(KeyEvent.VK_PAUSE, KeyEvent.VK_PAUSE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 4))));
layout.keys.put(KeyEvent.VK_META, new KeyDescriptor(KeyEvent.VK_META, KeyEvent.VK_WINDOWS, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_WINDOWS, new KeyDescriptor(KeyEvent.VK_WINDOWS, KeyEvent.VK_WINDOWS, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F13, new KeyDescriptor(KeyEvent.VK_F13, KeyEvent.VK_F13, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F14, new KeyDescriptor(KeyEvent.VK_F14, KeyEvent.VK_F14, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F15, new KeyDescriptor(KeyEvent.VK_F15, KeyEvent.VK_F15, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F16, new KeyDescriptor(KeyEvent.VK_F16, KeyEvent.VK_F16, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F17, new KeyDescriptor(KeyEvent.VK_F17, KeyEvent.VK_F17, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F18, new KeyDescriptor(KeyEvent.VK_F18, KeyEvent.VK_F18, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F20, new KeyDescriptor(KeyEvent.VK_F20, KeyEvent.VK_F20, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F21, new KeyDescriptor(KeyEvent.VK_F21, KeyEvent.VK_F21, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F22, new KeyDescriptor(KeyEvent.VK_F22, KeyEvent.VK_F22, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F23, new KeyDescriptor(KeyEvent.VK_F23, KeyEvent.VK_F23, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layouts.add(layout);
}
{
var layout = new LayoutDescriptor("de", "", "German", true, new HashMap<>());
layout.keys.put(KeyEvent.VK_ESCAPE, new KeyDescriptor(KeyEvent.VK_ESCAPE, KeyEvent.VK_ESCAPE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u001b", false, 0))));
layout.keys.put(KeyEvent.VK_1, new KeyDescriptor(KeyEvent.VK_1, KeyEvent.VK_1, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("1", false, 0), new KeySymDescriptor("!", false, 1), new KeySymDescriptor("\u00b9", false, 128), new KeySymDescriptor("\u00a1", false, 129))));
layout.keys.put(KeyEvent.VK_2, new KeyDescriptor(KeyEvent.VK_2, KeyEvent.VK_2, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("2", false, 0), new KeySymDescriptor("\"", false, 1), new KeySymDescriptor("\u00b2", false, 128), new KeySymDescriptor("\u215b", false, 129))));
layout.keys.put(KeyEvent.VK_3, new KeyDescriptor(KeyEvent.VK_3, KeyEvent.VK_3, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("3", false, 0), new KeySymDescriptor("\u00a7", false, 1), new KeySymDescriptor("\u00b3", false, 128), new KeySymDescriptor("\u00a3", false, 129))));
layout.keys.put(KeyEvent.VK_4, new KeyDescriptor(KeyEvent.VK_4, KeyEvent.VK_4, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("4", false, 0), new KeySymDescriptor("$", false, 1), new KeySymDescriptor("\u00bc", false, 128), new KeySymDescriptor("\u00a4", false, 129))));
layout.keys.put(KeyEvent.VK_5, new KeyDescriptor(KeyEvent.VK_5, KeyEvent.VK_5, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("5", false, 0), new KeySymDescriptor("%", false, 1), new KeySymDescriptor("\u00bd", false, 128), new KeySymDescriptor("\u215c", false, 129))));
layout.keys.put(KeyEvent.VK_6, new KeyDescriptor(KeyEvent.VK_6, KeyEvent.VK_6, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("6", false, 0), new KeySymDescriptor("&", false, 1), new KeySymDescriptor("\u00ac", false, 128), new KeySymDescriptor("\u215d", false, 129))));
layout.keys.put(KeyEvent.VK_7, new KeyDescriptor(KeyEvent.VK_7, KeyEvent.VK_7, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("7", false, 0), new KeySymDescriptor("/", false, 1), new KeySymDescriptor("{", false, 128), new KeySymDescriptor("\u215e", false, 129))));
layout.keys.put(KeyEvent.VK_8, new KeyDescriptor(KeyEvent.VK_8, KeyEvent.VK_8, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("8", false, 0), new KeySymDescriptor("(", false, 1), new KeySymDescriptor("[", false, 128), new KeySymDescriptor("\u2122", false, 129))));
layout.keys.put(KeyEvent.VK_9, new KeyDescriptor(KeyEvent.VK_9, KeyEvent.VK_9, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("9", false, 0), new KeySymDescriptor(")", false, 1), new KeySymDescriptor("]", false, 128), new KeySymDescriptor("\u00b1", false, 129))));
layout.keys.put(KeyEvent.VK_0, new KeyDescriptor(KeyEvent.VK_0, KeyEvent.VK_0, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("0", false, 0), new KeySymDescriptor("=", false, 1), new KeySymDescriptor("}", false, 128), new KeySymDescriptor("\u00b0", false, 129))));
layout.keys.put(KeyEvent.VK_MINUS, new KeyDescriptor(KeyEvent.VK_MINUS, KeyEvent.getExtendedKeyCodeForChar(223), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u00df", false, 0), new KeySymDescriptor("?", false, 1), new KeySymDescriptor("\\", false, 128), new KeySymDescriptor("\u00bf", false, 129), new KeySymDescriptor("\u1e9e", false, 2))));
layout.keys.put(KeyEvent.VK_EQUALS, new KeyDescriptor(KeyEvent.VK_EQUALS, KeyEvent.VK_DEAD_ACUTE, KeyEvent.VK_QUOTE, List.of(new KeySymDescriptor("'", true, 0), new KeySymDescriptor("`", true, 1), new KeySymDescriptor("\u00b8", true, 128), new KeySymDescriptor("\u02db", true, 129))));
layout.keys.put(KeyEvent.VK_BACK_SPACE, new KeyDescriptor(KeyEvent.VK_BACK_SPACE, KeyEvent.VK_BACK_SPACE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0008", false, 0), new KeySymDescriptor("\u0008", false, 1))));
layout.keys.put(KeyEvent.VK_TAB, new KeyDescriptor(KeyEvent.VK_TAB, KeyEvent.VK_TAB, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\t", false, 0), new KeySymDescriptor("", false, 1))));
layout.keys.put(KeyEvent.VK_Q, new KeyDescriptor(KeyEvent.VK_Q, KeyEvent.VK_Q, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("q", false, 0), new KeySymDescriptor("Q", false, 1), new KeySymDescriptor("@", false, 128), new KeySymDescriptor("\u03a9", false, 129))));
layout.keys.put(KeyEvent.VK_W, new KeyDescriptor(KeyEvent.VK_W, KeyEvent.VK_W, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("w", false, 0), new KeySymDescriptor("W", false, 1), new KeySymDescriptor("\u017f", false, 128), new KeySymDescriptor("\u00a7", false, 129))));
layout.keys.put(KeyEvent.VK_E, new KeyDescriptor(KeyEvent.VK_E, KeyEvent.VK_E, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("e", false, 0), new KeySymDescriptor("E", false, 1), new KeySymDescriptor("\u20ac", false, 128), new KeySymDescriptor("\u20ac", false, 129))));
layout.keys.put(KeyEvent.VK_R, new KeyDescriptor(KeyEvent.VK_R, KeyEvent.VK_R, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("r", false, 0), new KeySymDescriptor("R", false, 1), new KeySymDescriptor("\u00b6", false, 128), new KeySymDescriptor("\u00ae", false, 129))));
layout.keys.put(KeyEvent.VK_T, new KeyDescriptor(KeyEvent.VK_T, KeyEvent.VK_T, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("t", false, 0), new KeySymDescriptor("T", false, 1), new KeySymDescriptor("\u0167", false, 128), new KeySymDescriptor("\u0166", false, 129))));
layout.keys.put(KeyEvent.VK_Y, new KeyDescriptor(KeyEvent.VK_Y, KeyEvent.VK_Z, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("z", false, 0), new KeySymDescriptor("Z", false, 1), new KeySymDescriptor("\u2190", false, 128), new KeySymDescriptor("\u00a5", false, 129))));
layout.keys.put(KeyEvent.VK_U, new KeyDescriptor(KeyEvent.VK_U, KeyEvent.VK_U, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("u", false, 0), new KeySymDescriptor("U", false, 1), new KeySymDescriptor("\u2193", false, 128), new KeySymDescriptor("\u2191", false, 129))));
layout.keys.put(KeyEvent.VK_I, new KeyDescriptor(KeyEvent.VK_I, KeyEvent.VK_I, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("i", false, 0), new KeySymDescriptor("I", false, 1), new KeySymDescriptor("\u2192", false, 128), new KeySymDescriptor("\u0131", false, 129))));
layout.keys.put(KeyEvent.VK_O, new KeyDescriptor(KeyEvent.VK_O, KeyEvent.VK_O, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("o", false, 0), new KeySymDescriptor("O", false, 1), new KeySymDescriptor("\u00f8", false, 128), new KeySymDescriptor("\u00d8", false, 129))));
layout.keys.put(KeyEvent.VK_P, new KeyDescriptor(KeyEvent.VK_P, KeyEvent.VK_P, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("p", false, 0), new KeySymDescriptor("P", false, 1), new KeySymDescriptor("\u00fe", false, 128), new KeySymDescriptor("\u00de", false, 129))));
layout.keys.put(KeyEvent.VK_OPEN_BRACKET, new KeyDescriptor(KeyEvent.VK_OPEN_BRACKET, KeyEvent.getExtendedKeyCodeForChar(252), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u00fc", false, 0), new KeySymDescriptor("\u00dc", false, 1), new KeySymDescriptor("\"", true, 128), new KeySymDescriptor("\u00b0", true, 129))));
layout.keys.put(KeyEvent.VK_CLOSE_BRACKET, new KeyDescriptor(KeyEvent.VK_CLOSE_BRACKET, KeyEvent.VK_PLUS, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("+", false, 0), new KeySymDescriptor("*", false, 1), new KeySymDescriptor("~", false, 128), new KeySymDescriptor("\u00af", false, 129))));
layout.keys.put(KeyEvent.VK_ENTER, new KeyDescriptor(KeyEvent.VK_ENTER, KeyEvent.VK_ENTER, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\r", false, 0))));
layout.keys.put(KeyEvent.VK_CONTROL, new KeyDescriptor(KeyEvent.VK_CONTROL, KeyEvent.VK_CONTROL, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_A, new KeyDescriptor(KeyEvent.VK_A, KeyEvent.VK_A, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("a", false, 0), new KeySymDescriptor("A", false, 1), new KeySymDescriptor("\u00e6", false, 128), new KeySymDescriptor("\u00c6", false, 129))));
layout.keys.put(KeyEvent.VK_S, new KeyDescriptor(KeyEvent.VK_S, KeyEvent.VK_S, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("s", false, 0), new KeySymDescriptor("S", false, 1), new KeySymDescriptor("\u017f", false, 128), new KeySymDescriptor("\u1e9e", false, 129))));
layout.keys.put(KeyEvent.VK_D, new KeyDescriptor(KeyEvent.VK_D, KeyEvent.VK_D, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("d", false, 0), new KeySymDescriptor("D", false, 1), new KeySymDescriptor("\u00f0", false, 128), new KeySymDescriptor("\u00d0", false, 129))));
layout.keys.put(KeyEvent.VK_F, new KeyDescriptor(KeyEvent.VK_F, KeyEvent.VK_F, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("f", false, 0), new KeySymDescriptor("F", false, 1), new KeySymDescriptor("\u0111", false, 128), new KeySymDescriptor("\u00aa", false, 129))));
layout.keys.put(KeyEvent.VK_G, new KeyDescriptor(KeyEvent.VK_G, KeyEvent.VK_G, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("g", false, 0), new KeySymDescriptor("G", false, 1), new KeySymDescriptor("\u014b", false, 128), new KeySymDescriptor("\u014a", false, 129))));
layout.keys.put(KeyEvent.VK_H, new KeyDescriptor(KeyEvent.VK_H, KeyEvent.VK_H, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("h", false, 0), new KeySymDescriptor("H", false, 1), new KeySymDescriptor("\u0127", false, 128), new KeySymDescriptor("\u0126", false, 129))));
layout.keys.put(KeyEvent.VK_J, new KeyDescriptor(KeyEvent.VK_J, KeyEvent.VK_J, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("j", false, 0), new KeySymDescriptor("J", false, 1), new KeySymDescriptor("\u0323", true, 128), new KeySymDescriptor("\u02d9", true, 129))));
layout.keys.put(KeyEvent.VK_K, new KeyDescriptor(KeyEvent.VK_K, KeyEvent.VK_K, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("k", false, 0), new KeySymDescriptor("K", false, 1), new KeySymDescriptor("\u0138", false, 128), new KeySymDescriptor("&", false, 129))));
layout.keys.put(KeyEvent.VK_L, new KeyDescriptor(KeyEvent.VK_L, KeyEvent.VK_L, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("l", false, 0), new KeySymDescriptor("L", false, 1), new KeySymDescriptor("\u0142", false, 128), new KeySymDescriptor("\u0141", false, 129))));
layout.keys.put(KeyEvent.VK_SEMICOLON, new KeyDescriptor(KeyEvent.VK_SEMICOLON, KeyEvent.getExtendedKeyCodeForChar(246), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u00f6", false, 0), new KeySymDescriptor("\u00d6", false, 1), new KeySymDescriptor("\u02dd", true, 128), new KeySymDescriptor("\u0323", true, 129))));
layout.keys.put(KeyEvent.VK_QUOTE, new KeyDescriptor(KeyEvent.VK_QUOTE, KeyEvent.getExtendedKeyCodeForChar(228), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u00e4", false, 0), new KeySymDescriptor("\u00c4", false, 1), new KeySymDescriptor("^", true, 128), new KeySymDescriptor("\u02c7", true, 129))));
layout.keys.put(KeyEvent.VK_BACK_QUOTE, new KeyDescriptor(KeyEvent.VK_BACK_QUOTE, KeyEvent.VK_DEAD_CIRCUMFLEX, KeyEvent.VK_CIRCUMFLEX, List.of(new KeySymDescriptor("^", true, 0), new KeySymDescriptor("\u00b0", false, 1), new KeySymDescriptor("\u2032", false, 128), new KeySymDescriptor("\u2033", false, 129))));
layout.keys.put(KeyEvent.VK_SHIFT, new KeyDescriptor(KeyEvent.VK_SHIFT, KeyEvent.VK_SHIFT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_BACK_SLASH, new KeyDescriptor(KeyEvent.VK_BACK_SLASH, KeyEvent.VK_NUMBER_SIGN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("#", false, 0), new KeySymDescriptor("'", false, 1), new KeySymDescriptor("\u2019", false, 128), new KeySymDescriptor("\u02d8", true, 129))));
layout.keys.put(KeyEvent.VK_Z, new KeyDescriptor(KeyEvent.VK_Z, KeyEvent.VK_Y, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("y", false, 0), new KeySymDescriptor("Y", false, 1), new KeySymDescriptor("\u00bb", false, 128), new KeySymDescriptor("\u203a", false, 129))));
layout.keys.put(KeyEvent.VK_X, new KeyDescriptor(KeyEvent.VK_X, KeyEvent.VK_X, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("x", false, 0), new KeySymDescriptor("X", false, 1), new KeySymDescriptor("\u00ab", false, 128), new KeySymDescriptor("\u2039", false, 129))));
layout.keys.put(KeyEvent.VK_C, new KeyDescriptor(KeyEvent.VK_C, KeyEvent.VK_C, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("c", false, 0), new KeySymDescriptor("C", false, 1), new KeySymDescriptor("\u00a2", false, 128), new KeySymDescriptor("\u00a9", false, 129))));
layout.keys.put(KeyEvent.VK_V, new KeyDescriptor(KeyEvent.VK_V, KeyEvent.VK_V, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("v", false, 0), new KeySymDescriptor("V", false, 1), new KeySymDescriptor("\u201e", false, 128), new KeySymDescriptor("\u201a", false, 129))));
layout.keys.put(KeyEvent.VK_B, new KeyDescriptor(KeyEvent.VK_B, KeyEvent.VK_B, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("b", false, 0), new KeySymDescriptor("B", false, 1), new KeySymDescriptor("\u201c", false, 128), new KeySymDescriptor("\u2018", false, 129))));
layout.keys.put(KeyEvent.VK_N, new KeyDescriptor(KeyEvent.VK_N, KeyEvent.VK_N, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("n", false, 0), new KeySymDescriptor("N", false, 1), new KeySymDescriptor("\u201d", false, 128), new KeySymDescriptor("\u2019", false, 129))));
layout.keys.put(KeyEvent.VK_M, new KeyDescriptor(KeyEvent.VK_M, KeyEvent.VK_M, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("m", false, 0), new KeySymDescriptor("M", false, 1), new KeySymDescriptor("\u00b5", false, 128), new KeySymDescriptor("\u00ba", false, 129))));
layout.keys.put(KeyEvent.VK_COMMA, new KeyDescriptor(KeyEvent.VK_COMMA, KeyEvent.VK_COMMA, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor(",", false, 0), new KeySymDescriptor(";", false, 1), new KeySymDescriptor("\u00b7", false, 128), new KeySymDescriptor("\u00d7", false, 129))));
layout.keys.put(KeyEvent.VK_PERIOD, new KeyDescriptor(KeyEvent.VK_PERIOD, KeyEvent.VK_PERIOD, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor(".", false, 0), new KeySymDescriptor(":", false, 1), new KeySymDescriptor("\u2026", false, 128), new KeySymDescriptor("\u00f7", false, 129))));
layout.keys.put(KeyEvent.VK_SLASH, new KeyDescriptor(KeyEvent.VK_SLASH, KeyEvent.VK_MINUS, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("-", false, 0), new KeySymDescriptor("_", false, 1), new KeySymDescriptor("\u2013", false, 128), new KeySymDescriptor("\u2014", false, 129))));
layout.keys.put(KeyEvent.VK_MULTIPLY, new KeyDescriptor(KeyEvent.VK_MULTIPLY, KeyEvent.VK_MULTIPLY, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("*", false, 0), new KeySymDescriptor("*", false, 1), new KeySymDescriptor("*", false, 128), new KeySymDescriptor("*", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_ALT, new KeyDescriptor(KeyEvent.VK_ALT, KeyEvent.VK_ALT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1))));
layout.keys.put(KeyEvent.VK_SPACE, new KeyDescriptor(KeyEvent.VK_SPACE, KeyEvent.VK_SPACE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor(" ", false, 0))));
layout.keys.put(KeyEvent.VK_CAPS_LOCK, new KeyDescriptor(KeyEvent.VK_CAPS_LOCK, KeyEvent.VK_CAPS_LOCK, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F1, new KeyDescriptor(KeyEvent.VK_F1, KeyEvent.VK_F1, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F2, new KeyDescriptor(KeyEvent.VK_F2, KeyEvent.VK_F2, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F3, new KeyDescriptor(KeyEvent.VK_F3, KeyEvent.VK_F3, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F4, new KeyDescriptor(KeyEvent.VK_F4, KeyEvent.VK_F4, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F5, new KeyDescriptor(KeyEvent.VK_F5, KeyEvent.VK_F5, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F6, new KeyDescriptor(KeyEvent.VK_F6, KeyEvent.VK_F6, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F7, new KeyDescriptor(KeyEvent.VK_F7, KeyEvent.VK_F7, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F8, new KeyDescriptor(KeyEvent.VK_F8, KeyEvent.VK_F8, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F9, new KeyDescriptor(KeyEvent.VK_F9, KeyEvent.VK_F9, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F10, new KeyDescriptor(KeyEvent.VK_F10, KeyEvent.VK_F10, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_NUM_LOCK, new KeyDescriptor(KeyEvent.VK_NUM_LOCK, KeyEvent.VK_NUM_LOCK, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_NUMPAD7, new KeyDescriptor(KeyEvent.VK_NUMPAD7, KeyEvent.VK_HOME, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("7", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD8, new KeyDescriptor(KeyEvent.VK_NUMPAD8, KeyEvent.VK_KP_UP, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("8", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD9, new KeyDescriptor(KeyEvent.VK_NUMPAD9, KeyEvent.VK_PAGE_UP, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("9", false, 16))));
layout.keys.put(KeyEvent.VK_SUBTRACT, new KeyDescriptor(KeyEvent.VK_SUBTRACT, KeyEvent.VK_SUBTRACT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("-", false, 0), new KeySymDescriptor("-", false, 1), new KeySymDescriptor("-", false, 128), new KeySymDescriptor("-", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_NUMPAD4, new KeyDescriptor(KeyEvent.VK_NUMPAD4, KeyEvent.VK_KP_LEFT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("4", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD5, new KeyDescriptor(KeyEvent.VK_NUMPAD5, KeyEvent.VK_BEGIN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("5", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD6, new KeyDescriptor(KeyEvent.VK_NUMPAD6, KeyEvent.VK_KP_RIGHT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("6", false, 16))));
layout.keys.put(KeyEvent.VK_ADD, new KeyDescriptor(KeyEvent.VK_ADD, KeyEvent.VK_ADD, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("+", false, 0), new KeySymDescriptor("+", false, 1), new KeySymDescriptor("+", false, 128), new KeySymDescriptor("+", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_NUMPAD1, new KeyDescriptor(KeyEvent.VK_NUMPAD1, KeyEvent.VK_END, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("1", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD2, new KeyDescriptor(KeyEvent.VK_NUMPAD2, KeyEvent.VK_KP_DOWN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("2", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD3, new KeyDescriptor(KeyEvent.VK_NUMPAD3, KeyEvent.VK_PAGE_DOWN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("3", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD0, new KeyDescriptor(KeyEvent.VK_NUMPAD0, KeyEvent.VK_INSERT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("0", false, 16))));
layout.keys.put(KeyEvent.VK_DECIMAL, new KeyDescriptor(KeyEvent.VK_DECIMAL, KeyEvent.VK_DELETE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor(",", false, 16))));
layout.keys.put(KeyEvent.VK_LESS, new KeyDescriptor(KeyEvent.VK_LESS, KeyEvent.VK_LESS, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("<", false, 0), new KeySymDescriptor(">", false, 1), new KeySymDescriptor("|", false, 128), new KeySymDescriptor("\u0331", true, 129))));
layout.keys.put(KeyEvent.VK_F11, new KeyDescriptor(KeyEvent.VK_F11, KeyEvent.VK_F11, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F12, new KeyDescriptor(KeyEvent.VK_F12, KeyEvent.VK_F12, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_DIVIDE, new KeyDescriptor(KeyEvent.VK_DIVIDE, KeyEvent.VK_DIVIDE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("/", false, 0), new KeySymDescriptor("/", false, 1), new KeySymDescriptor("/", false, 128), new KeySymDescriptor("/", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_PRINTSCREEN, new KeyDescriptor(KeyEvent.VK_PRINTSCREEN, KeyEvent.VK_PRINTSCREEN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 8))));
layout.keys.put(KeyEvent.VK_ALT_GRAPH, new KeyDescriptor(KeyEvent.VK_ALT_GRAPH, KeyEvent.VK_ALT_GRAPH, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_HOME, new KeyDescriptor(KeyEvent.VK_HOME, KeyEvent.VK_HOME, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_UP, new KeyDescriptor(KeyEvent.VK_UP, KeyEvent.VK_UP, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_PAGE_UP, new KeyDescriptor(KeyEvent.VK_PAGE_UP, KeyEvent.VK_PAGE_UP, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_LEFT, new KeyDescriptor(KeyEvent.VK_LEFT, KeyEvent.VK_LEFT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_RIGHT, new KeyDescriptor(KeyEvent.VK_RIGHT, KeyEvent.VK_RIGHT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_END, new KeyDescriptor(KeyEvent.VK_END, KeyEvent.VK_END, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_DOWN, new KeyDescriptor(KeyEvent.VK_DOWN, KeyEvent.VK_DOWN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_PAGE_DOWN, new KeyDescriptor(KeyEvent.VK_PAGE_DOWN, KeyEvent.VK_PAGE_DOWN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_INSERT, new KeyDescriptor(KeyEvent.VK_INSERT, KeyEvent.VK_INSERT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_DELETE, new KeyDescriptor(KeyEvent.VK_DELETE, KeyEvent.VK_DELETE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u007f", false, 0))));
layout.keys.put(KeyEvent.VK_PAUSE, new KeyDescriptor(KeyEvent.VK_PAUSE, KeyEvent.VK_PAUSE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 4))));
layout.keys.put(KeyEvent.VK_META, new KeyDescriptor(KeyEvent.VK_META, KeyEvent.VK_WINDOWS, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_WINDOWS, new KeyDescriptor(KeyEvent.VK_WINDOWS, KeyEvent.VK_WINDOWS, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F13, new KeyDescriptor(KeyEvent.VK_F13, KeyEvent.VK_F13, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F14, new KeyDescriptor(KeyEvent.VK_F14, KeyEvent.VK_F14, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F15, new KeyDescriptor(KeyEvent.VK_F15, KeyEvent.VK_F15, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F16, new KeyDescriptor(KeyEvent.VK_F16, KeyEvent.VK_F16, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F17, new KeyDescriptor(KeyEvent.VK_F17, KeyEvent.VK_F17, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F18, new KeyDescriptor(KeyEvent.VK_F18, KeyEvent.VK_F18, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F20, new KeyDescriptor(KeyEvent.VK_F20, KeyEvent.VK_F20, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F21, new KeyDescriptor(KeyEvent.VK_F21, KeyEvent.VK_F21, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F22, new KeyDescriptor(KeyEvent.VK_F22, KeyEvent.VK_F22, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F23, new KeyDescriptor(KeyEvent.VK_F23, KeyEvent.VK_F23, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layouts.add(layout);
}
{
var layout = new LayoutDescriptor("fr", "", "French", true, new HashMap<>());
layout.keys.put(KeyEvent.VK_ESCAPE, new KeyDescriptor(KeyEvent.VK_ESCAPE, KeyEvent.VK_ESCAPE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u001b", false, 0))));
layout.keys.put(KeyEvent.VK_1, new KeyDescriptor(KeyEvent.VK_1, KeyEvent.VK_AMPERSAND, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("&", false, 0), new KeySymDescriptor("1", false, 1), new KeySymDescriptor("\u00b9", false, 128), new KeySymDescriptor("\u00a1", false, 129))));
layout.keys.put(KeyEvent.VK_2, new KeyDescriptor(KeyEvent.VK_2, KeyEvent.getExtendedKeyCodeForChar(233), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u00e9", false, 0), new KeySymDescriptor("2", false, 1), new KeySymDescriptor("~", false, 128), new KeySymDescriptor("\u215b", false, 129))));
layout.keys.put(KeyEvent.VK_3, new KeyDescriptor(KeyEvent.VK_3, KeyEvent.VK_QUOTEDBL, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\"", false, 0), new KeySymDescriptor("3", false, 1), new KeySymDescriptor("#", false, 128), new KeySymDescriptor("\u00a3", false, 129))));
layout.keys.put(KeyEvent.VK_4, new KeyDescriptor(KeyEvent.VK_4, KeyEvent.VK_QUOTE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("'", false, 0), new KeySymDescriptor("4", false, 1), new KeySymDescriptor("{", false, 128), new KeySymDescriptor("$", false, 129))));
layout.keys.put(KeyEvent.VK_5, new KeyDescriptor(KeyEvent.VK_5, KeyEvent.VK_LEFT_PARENTHESIS, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("(", false, 0), new KeySymDescriptor("5", false, 1), new KeySymDescriptor("[", false, 128), new KeySymDescriptor("\u215c", false, 129))));
layout.keys.put(KeyEvent.VK_6, new KeyDescriptor(KeyEvent.VK_6, KeyEvent.VK_MINUS, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("-", false, 0), new KeySymDescriptor("6", false, 1), new KeySymDescriptor("|", false, 128), new KeySymDescriptor("\u215d", false, 129))));
layout.keys.put(KeyEvent.VK_7, new KeyDescriptor(KeyEvent.VK_7, KeyEvent.getExtendedKeyCodeForChar(232), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u00e8", false, 0), new KeySymDescriptor("7", false, 1), new KeySymDescriptor("`", false, 128), new KeySymDescriptor("\u215e", false, 129))));
layout.keys.put(KeyEvent.VK_8, new KeyDescriptor(KeyEvent.VK_8, KeyEvent.VK_UNDERSCORE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("_", false, 0), new KeySymDescriptor("8", false, 1), new KeySymDescriptor("\\", false, 128), new KeySymDescriptor("\u2122", false, 129))));
layout.keys.put(KeyEvent.VK_9, new KeyDescriptor(KeyEvent.VK_9, KeyEvent.getExtendedKeyCodeForChar(231), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u00e7", false, 0), new KeySymDescriptor("9", false, 1), new KeySymDescriptor("^", false, 128), new KeySymDescriptor("\u00b1", false, 129))));
layout.keys.put(KeyEvent.VK_0, new KeyDescriptor(KeyEvent.VK_0, KeyEvent.getExtendedKeyCodeForChar(224), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u00e0", false, 0), new KeySymDescriptor("0", false, 1), new KeySymDescriptor("@", false, 128), new KeySymDescriptor("\u00b0", false, 129))));
layout.keys.put(KeyEvent.VK_MINUS, new KeyDescriptor(KeyEvent.VK_MINUS, KeyEvent.VK_RIGHT_PARENTHESIS, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor(")", false, 0), new KeySymDescriptor("\u00b0", false, 1), new KeySymDescriptor("]", false, 128), new KeySymDescriptor("\u00bf", false, 129))));
layout.keys.put(KeyEvent.VK_EQUALS, new KeyDescriptor(KeyEvent.VK_EQUALS, KeyEvent.VK_EQUALS, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("=", false, 0), new KeySymDescriptor("+", false, 1), new KeySymDescriptor("}", false, 128), new KeySymDescriptor("\u02db", true, 129))));
layout.keys.put(KeyEvent.VK_BACK_SPACE, new KeyDescriptor(KeyEvent.VK_BACK_SPACE, KeyEvent.VK_BACK_SPACE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0008", false, 0), new KeySymDescriptor("\u0008", false, 1))));
layout.keys.put(KeyEvent.VK_TAB, new KeyDescriptor(KeyEvent.VK_TAB, KeyEvent.VK_TAB, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\t", false, 0), new KeySymDescriptor("", false, 1))));
layout.keys.put(KeyEvent.VK_Q, new KeyDescriptor(KeyEvent.VK_Q, KeyEvent.VK_A, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("a", false, 0), new KeySymDescriptor("A", false, 1), new KeySymDescriptor("\u00e6", false, 128), new KeySymDescriptor("\u00c6", false, 129))));
layout.keys.put(KeyEvent.VK_W, new KeyDescriptor(KeyEvent.VK_W, KeyEvent.VK_Z, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("z", false, 0), new KeySymDescriptor("Z", false, 1), new KeySymDescriptor("\u00ab", false, 128), new KeySymDescriptor("<", false, 129))));
layout.keys.put(KeyEvent.VK_E, new KeyDescriptor(KeyEvent.VK_E, KeyEvent.VK_E, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("e", false, 0), new KeySymDescriptor("E", false, 1), new KeySymDescriptor("\u20ac", false, 128), new KeySymDescriptor("\u00a2", false, 129))));
layout.keys.put(KeyEvent.VK_R, new KeyDescriptor(KeyEvent.VK_R, KeyEvent.VK_R, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("r", false, 0), new KeySymDescriptor("R", false, 1), new KeySymDescriptor("\u00b6", false, 128), new KeySymDescriptor("\u00ae", false, 129))));
layout.keys.put(KeyEvent.VK_T, new KeyDescriptor(KeyEvent.VK_T, KeyEvent.VK_T, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("t", false, 0), new KeySymDescriptor("T", false, 1), new KeySymDescriptor("\u0167", false, 128), new KeySymDescriptor("\u0166", false, 129))));
layout.keys.put(KeyEvent.VK_Y, new KeyDescriptor(KeyEvent.VK_Y, KeyEvent.VK_Y, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("y", false, 0), new KeySymDescriptor("Y", false, 1), new KeySymDescriptor("\u2190", false, 128), new KeySymDescriptor("\u00a5", false, 129))));
layout.keys.put(KeyEvent.VK_U, new KeyDescriptor(KeyEvent.VK_U, KeyEvent.VK_U, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("u", false, 0), new KeySymDescriptor("U", false, 1), new KeySymDescriptor("\u2193", false, 128), new KeySymDescriptor("\u2191", false, 129))));
layout.keys.put(KeyEvent.VK_I, new KeyDescriptor(KeyEvent.VK_I, KeyEvent.VK_I, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("i", false, 0), new KeySymDescriptor("I", false, 1), new KeySymDescriptor("\u2192", false, 128), new KeySymDescriptor("\u0131", false, 129))));
layout.keys.put(KeyEvent.VK_O, new KeyDescriptor(KeyEvent.VK_O, KeyEvent.VK_O, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("o", false, 0), new KeySymDescriptor("O", false, 1), new KeySymDescriptor("\u00f8", false, 128), new KeySymDescriptor("\u00d8", false, 129))));
layout.keys.put(KeyEvent.VK_P, new KeyDescriptor(KeyEvent.VK_P, KeyEvent.VK_P, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("p", false, 0), new KeySymDescriptor("P", false, 1), new KeySymDescriptor("\u00fe", false, 128), new KeySymDescriptor("\u00de", false, 129))));
layout.keys.put(KeyEvent.VK_OPEN_BRACKET, new KeyDescriptor(KeyEvent.VK_OPEN_BRACKET, KeyEvent.VK_DEAD_CIRCUMFLEX, KeyEvent.VK_CIRCUMFLEX, List.of(new KeySymDescriptor("^", true, 0), new KeySymDescriptor("\"", true, 1), new KeySymDescriptor("\"", true, 128), new KeySymDescriptor("\u00b0", true, 129))));
layout.keys.put(KeyEvent.VK_CLOSE_BRACKET, new KeyDescriptor(KeyEvent.VK_CLOSE_BRACKET, KeyEvent.VK_DOLLAR, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("$", false, 0), new KeySymDescriptor("\u00a3", false, 1), new KeySymDescriptor("\u00a4", false, 128), new KeySymDescriptor("\u00af", true, 129))));
layout.keys.put(KeyEvent.VK_ENTER, new KeyDescriptor(KeyEvent.VK_ENTER, KeyEvent.VK_ENTER, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\r", false, 0))));
layout.keys.put(KeyEvent.VK_CONTROL, new KeyDescriptor(KeyEvent.VK_CONTROL, KeyEvent.VK_CONTROL, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_A, new KeyDescriptor(KeyEvent.VK_A, KeyEvent.VK_Q, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("q", false, 0), new KeySymDescriptor("Q", false, 1), new KeySymDescriptor("@", false, 128), new KeySymDescriptor("\u03a9", false, 129))));
layout.keys.put(KeyEvent.VK_S, new KeyDescriptor(KeyEvent.VK_S, KeyEvent.VK_S, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("s", false, 0), new KeySymDescriptor("S", false, 1), new KeySymDescriptor("\u00df", false, 128), new KeySymDescriptor("\u1e9e", false, 129))));
layout.keys.put(KeyEvent.VK_D, new KeyDescriptor(KeyEvent.VK_D, KeyEvent.VK_D, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("d", false, 0), new KeySymDescriptor("D", false, 1), new KeySymDescriptor("\u00f0", false, 128), new KeySymDescriptor("\u00d0", false, 129))));
layout.keys.put(KeyEvent.VK_F, new KeyDescriptor(KeyEvent.VK_F, KeyEvent.VK_F, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("f", false, 0), new KeySymDescriptor("F", false, 1), new KeySymDescriptor("\u0111", false, 128), new KeySymDescriptor("\u00aa", false, 129))));
layout.keys.put(KeyEvent.VK_G, new KeyDescriptor(KeyEvent.VK_G, KeyEvent.VK_G, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("g", false, 0), new KeySymDescriptor("G", false, 1), new KeySymDescriptor("\u014b", false, 128), new KeySymDescriptor("\u014a", false, 129))));
layout.keys.put(KeyEvent.VK_H, new KeyDescriptor(KeyEvent.VK_H, KeyEvent.VK_H, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("h", false, 0), new KeySymDescriptor("H", false, 1), new KeySymDescriptor("\u0127", false, 128), new KeySymDescriptor("\u0126", false, 129))));
layout.keys.put(KeyEvent.VK_J, new KeyDescriptor(KeyEvent.VK_J, KeyEvent.VK_J, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("j", false, 0), new KeySymDescriptor("J", false, 1), new KeySymDescriptor("\u0309", true, 128), new KeySymDescriptor("\u031b", true, 129))));
layout.keys.put(KeyEvent.VK_K, new KeyDescriptor(KeyEvent.VK_K, KeyEvent.VK_K, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("k", false, 0), new KeySymDescriptor("K", false, 1), new KeySymDescriptor("\u0138", false, 128), new KeySymDescriptor("&", false, 129))));
layout.keys.put(KeyEvent.VK_L, new KeyDescriptor(KeyEvent.VK_L, KeyEvent.VK_L, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("l", false, 0), new KeySymDescriptor("L", false, 1), new KeySymDescriptor("\u0142", false, 128), new KeySymDescriptor("\u0141", false, 129))));
layout.keys.put(KeyEvent.VK_SEMICOLON, new KeyDescriptor(KeyEvent.VK_SEMICOLON, KeyEvent.VK_M, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("m", false, 0), new KeySymDescriptor("M", false, 1), new KeySymDescriptor("\u00b5", false, 128), new KeySymDescriptor("\u00ba", false, 129))));
layout.keys.put(KeyEvent.VK_QUOTE, new KeyDescriptor(KeyEvent.VK_QUOTE, KeyEvent.getExtendedKeyCodeForChar(249), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u00f9", false, 0), new KeySymDescriptor("%", false, 1), new KeySymDescriptor("^", true, 128), new KeySymDescriptor("\u02c7", true, 129))));
layout.keys.put(KeyEvent.VK_BACK_QUOTE, new KeyDescriptor(KeyEvent.VK_BACK_QUOTE, KeyEvent.getExtendedKeyCodeForChar(178), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u00b2", false, 0), new KeySymDescriptor("~", false, 1), new KeySymDescriptor("\u00ac", false, 128), new KeySymDescriptor("\u00ac", false, 129))));
layout.keys.put(KeyEvent.VK_SHIFT, new KeyDescriptor(KeyEvent.VK_SHIFT, KeyEvent.VK_SHIFT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_BACK_SLASH, new KeyDescriptor(KeyEvent.VK_BACK_SLASH, KeyEvent.VK_ASTERISK, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("*", false, 0), new KeySymDescriptor("\u00b5", false, 1), new KeySymDescriptor("`", true, 128), new KeySymDescriptor("\u02d8", true, 129))));
layout.keys.put(KeyEvent.VK_Z, new KeyDescriptor(KeyEvent.VK_Z, KeyEvent.VK_W, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("w", false, 0), new KeySymDescriptor("W", false, 1), new KeySymDescriptor("\u0142", false, 128), new KeySymDescriptor("\u0141", false, 129))));
layout.keys.put(KeyEvent.VK_X, new KeyDescriptor(KeyEvent.VK_X, KeyEvent.VK_X, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("x", false, 0), new KeySymDescriptor("X", false, 1), new KeySymDescriptor("\u00bb", false, 128), new KeySymDescriptor(">", false, 129))));
layout.keys.put(KeyEvent.VK_C, new KeyDescriptor(KeyEvent.VK_C, KeyEvent.VK_C, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("c", false, 0), new KeySymDescriptor("C", false, 1), new KeySymDescriptor("\u00a2", false, 128), new KeySymDescriptor("\u00a9", false, 129))));
layout.keys.put(KeyEvent.VK_V, new KeyDescriptor(KeyEvent.VK_V, KeyEvent.VK_V, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("v", false, 0), new KeySymDescriptor("V", false, 1), new KeySymDescriptor("\u201e", false, 128), new KeySymDescriptor("\u201a", false, 129))));
layout.keys.put(KeyEvent.VK_B, new KeyDescriptor(KeyEvent.VK_B, KeyEvent.VK_B, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("b", false, 0), new KeySymDescriptor("B", false, 1), new KeySymDescriptor("\u201c", false, 128), new KeySymDescriptor("\u2018", false, 129))));
layout.keys.put(KeyEvent.VK_N, new KeyDescriptor(KeyEvent.VK_N, KeyEvent.VK_N, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("n", false, 0), new KeySymDescriptor("N", false, 1), new KeySymDescriptor("\u201d", false, 128), new KeySymDescriptor("\u2019", false, 129))));
layout.keys.put(KeyEvent.VK_M, new KeyDescriptor(KeyEvent.VK_M, KeyEvent.VK_COMMA, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor(",", false, 0), new KeySymDescriptor("?", false, 1), new KeySymDescriptor("'", true, 128), new KeySymDescriptor("\u02dd", true, 129))));
layout.keys.put(KeyEvent.VK_COMMA, new KeyDescriptor(KeyEvent.VK_COMMA, KeyEvent.VK_SEMICOLON, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor(";", false, 0), new KeySymDescriptor(".", false, 1), new KeySymDescriptor("\u2022", false, 128), new KeySymDescriptor("\u00d7", false, 129))));
layout.keys.put(KeyEvent.VK_PERIOD, new KeyDescriptor(KeyEvent.VK_PERIOD, KeyEvent.VK_COLON, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor(":", false, 0), new KeySymDescriptor("/", false, 1), new KeySymDescriptor("\u00b7", false, 128), new KeySymDescriptor("\u00f7", false, 129))));
layout.keys.put(KeyEvent.VK_SLASH, new KeyDescriptor(KeyEvent.VK_SLASH, KeyEvent.VK_EXCLAMATION_MARK, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("!", false, 0), new KeySymDescriptor("\u00a7", false, 1), new KeySymDescriptor("\u0323", true, 128), new KeySymDescriptor("\u02d9", true, 129))));
layout.keys.put(KeyEvent.VK_MULTIPLY, new KeyDescriptor(KeyEvent.VK_MULTIPLY, KeyEvent.VK_MULTIPLY, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("*", false, 0), new KeySymDescriptor("*", false, 1), new KeySymDescriptor("*", false, 128), new KeySymDescriptor("*", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_ALT, new KeyDescriptor(KeyEvent.VK_ALT, KeyEvent.VK_ALT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1))));
layout.keys.put(KeyEvent.VK_SPACE, new KeyDescriptor(KeyEvent.VK_SPACE, KeyEvent.VK_SPACE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor(" ", false, 0))));
layout.keys.put(KeyEvent.VK_CAPS_LOCK, new KeyDescriptor(KeyEvent.VK_CAPS_LOCK, KeyEvent.VK_CAPS_LOCK, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F1, new KeyDescriptor(KeyEvent.VK_F1, KeyEvent.VK_F1, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F2, new KeyDescriptor(KeyEvent.VK_F2, KeyEvent.VK_F2, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F3, new KeyDescriptor(KeyEvent.VK_F3, KeyEvent.VK_F3, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F4, new KeyDescriptor(KeyEvent.VK_F4, KeyEvent.VK_F4, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F5, new KeyDescriptor(KeyEvent.VK_F5, KeyEvent.VK_F5, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F6, new KeyDescriptor(KeyEvent.VK_F6, KeyEvent.VK_F6, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F7, new KeyDescriptor(KeyEvent.VK_F7, KeyEvent.VK_F7, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F8, new KeyDescriptor(KeyEvent.VK_F8, KeyEvent.VK_F8, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F9, new KeyDescriptor(KeyEvent.VK_F9, KeyEvent.VK_F9, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F10, new KeyDescriptor(KeyEvent.VK_F10, KeyEvent.VK_F10, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_NUM_LOCK, new KeyDescriptor(KeyEvent.VK_NUM_LOCK, KeyEvent.VK_NUM_LOCK, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_NUMPAD7, new KeyDescriptor(KeyEvent.VK_NUMPAD7, KeyEvent.VK_HOME, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("7", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD8, new KeyDescriptor(KeyEvent.VK_NUMPAD8, KeyEvent.VK_KP_UP, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("8", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD9, new KeyDescriptor(KeyEvent.VK_NUMPAD9, KeyEvent.VK_PAGE_UP, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("9", false, 16))));
layout.keys.put(KeyEvent.VK_SUBTRACT, new KeyDescriptor(KeyEvent.VK_SUBTRACT, KeyEvent.VK_SUBTRACT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("-", false, 0), new KeySymDescriptor("-", false, 1), new KeySymDescriptor("-", false, 128), new KeySymDescriptor("-", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_NUMPAD4, new KeyDescriptor(KeyEvent.VK_NUMPAD4, KeyEvent.VK_KP_LEFT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("4", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD5, new KeyDescriptor(KeyEvent.VK_NUMPAD5, KeyEvent.VK_BEGIN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("5", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD6, new KeyDescriptor(KeyEvent.VK_NUMPAD6, KeyEvent.VK_KP_RIGHT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("6", false, 16))));
layout.keys.put(KeyEvent.VK_ADD, new KeyDescriptor(KeyEvent.VK_ADD, KeyEvent.VK_ADD, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("+", false, 0), new KeySymDescriptor("+", false, 1), new KeySymDescriptor("+", false, 128), new KeySymDescriptor("+", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_NUMPAD1, new KeyDescriptor(KeyEvent.VK_NUMPAD1, KeyEvent.VK_END, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("1", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD2, new KeyDescriptor(KeyEvent.VK_NUMPAD2, KeyEvent.VK_KP_DOWN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("2", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD3, new KeyDescriptor(KeyEvent.VK_NUMPAD3, KeyEvent.VK_PAGE_DOWN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("3", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD0, new KeyDescriptor(KeyEvent.VK_NUMPAD0, KeyEvent.VK_INSERT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("0", false, 16))));
layout.keys.put(KeyEvent.VK_DECIMAL, new KeyDescriptor(KeyEvent.VK_DECIMAL, KeyEvent.VK_DELETE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor(".", false, 16))));
layout.keys.put(KeyEvent.VK_LESS, new KeyDescriptor(KeyEvent.VK_LESS, KeyEvent.VK_LESS, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("<", false, 0), new KeySymDescriptor(">", false, 1), new KeySymDescriptor("|", false, 128), new KeySymDescriptor("\u00a6", false, 129))));
layout.keys.put(KeyEvent.VK_F11, new KeyDescriptor(KeyEvent.VK_F11, KeyEvent.VK_F11, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F12, new KeyDescriptor(KeyEvent.VK_F12, KeyEvent.VK_F12, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_DIVIDE, new KeyDescriptor(KeyEvent.VK_DIVIDE, KeyEvent.VK_DIVIDE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("/", false, 0), new KeySymDescriptor("/", false, 1), new KeySymDescriptor("/", false, 128), new KeySymDescriptor("/", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_PRINTSCREEN, new KeyDescriptor(KeyEvent.VK_PRINTSCREEN, KeyEvent.VK_PRINTSCREEN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 8))));
layout.keys.put(KeyEvent.VK_ALT_GRAPH, new KeyDescriptor(KeyEvent.VK_ALT_GRAPH, KeyEvent.VK_ALT_GRAPH, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_HOME, new KeyDescriptor(KeyEvent.VK_HOME, KeyEvent.VK_HOME, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_UP, new KeyDescriptor(KeyEvent.VK_UP, KeyEvent.VK_UP, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_PAGE_UP, new KeyDescriptor(KeyEvent.VK_PAGE_UP, KeyEvent.VK_PAGE_UP, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_LEFT, new KeyDescriptor(KeyEvent.VK_LEFT, KeyEvent.VK_LEFT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_RIGHT, new KeyDescriptor(KeyEvent.VK_RIGHT, KeyEvent.VK_RIGHT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_END, new KeyDescriptor(KeyEvent.VK_END, KeyEvent.VK_END, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_DOWN, new KeyDescriptor(KeyEvent.VK_DOWN, KeyEvent.VK_DOWN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_PAGE_DOWN, new KeyDescriptor(KeyEvent.VK_PAGE_DOWN, KeyEvent.VK_PAGE_DOWN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_INSERT, new KeyDescriptor(KeyEvent.VK_INSERT, KeyEvent.VK_INSERT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_DELETE, new KeyDescriptor(KeyEvent.VK_DELETE, KeyEvent.VK_DELETE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u007f", false, 0))));
layout.keys.put(KeyEvent.VK_PAUSE, new KeyDescriptor(KeyEvent.VK_PAUSE, KeyEvent.VK_PAUSE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 4))));
layout.keys.put(KeyEvent.VK_META, new KeyDescriptor(KeyEvent.VK_META, KeyEvent.VK_WINDOWS, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_WINDOWS, new KeyDescriptor(KeyEvent.VK_WINDOWS, KeyEvent.VK_WINDOWS, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F13, new KeyDescriptor(KeyEvent.VK_F13, KeyEvent.VK_F13, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F14, new KeyDescriptor(KeyEvent.VK_F14, KeyEvent.VK_F14, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F15, new KeyDescriptor(KeyEvent.VK_F15, KeyEvent.VK_F15, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F16, new KeyDescriptor(KeyEvent.VK_F16, KeyEvent.VK_F16, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F17, new KeyDescriptor(KeyEvent.VK_F17, KeyEvent.VK_F17, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F18, new KeyDescriptor(KeyEvent.VK_F18, KeyEvent.VK_F18, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F20, new KeyDescriptor(KeyEvent.VK_F20, KeyEvent.VK_F20, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F21, new KeyDescriptor(KeyEvent.VK_F21, KeyEvent.VK_F21, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F22, new KeyDescriptor(KeyEvent.VK_F22, KeyEvent.VK_F22, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F23, new KeyDescriptor(KeyEvent.VK_F23, KeyEvent.VK_F23, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layouts.add(layout);
}
{
var layout = new LayoutDescriptor("es", "", "Spanish", true, new HashMap<>());
layout.keys.put(KeyEvent.VK_ESCAPE, new KeyDescriptor(KeyEvent.VK_ESCAPE, KeyEvent.VK_ESCAPE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u001b", false, 0))));
layout.keys.put(KeyEvent.VK_1, new KeyDescriptor(KeyEvent.VK_1, KeyEvent.VK_1, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("1", false, 0), new KeySymDescriptor("!", false, 1), new KeySymDescriptor("|", false, 128), new KeySymDescriptor("\u00a1", false, 129))));
layout.keys.put(KeyEvent.VK_2, new KeyDescriptor(KeyEvent.VK_2, KeyEvent.VK_2, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("2", false, 0), new KeySymDescriptor("\"", false, 1), new KeySymDescriptor("@", false, 128), new KeySymDescriptor("\u215b", false, 129))));
layout.keys.put(KeyEvent.VK_3, new KeyDescriptor(KeyEvent.VK_3, KeyEvent.VK_3, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("3", false, 0), new KeySymDescriptor("\u00b7", false, 1), new KeySymDescriptor("#", false, 128), new KeySymDescriptor("\u00a3", false, 129))));
layout.keys.put(KeyEvent.VK_4, new KeyDescriptor(KeyEvent.VK_4, KeyEvent.VK_4, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("4", false, 0), new KeySymDescriptor("$", false, 1), new KeySymDescriptor("~", false, 128), new KeySymDescriptor("$", false, 129))));
layout.keys.put(KeyEvent.VK_5, new KeyDescriptor(KeyEvent.VK_5, KeyEvent.VK_5, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("5", false, 0), new KeySymDescriptor("%", false, 1), new KeySymDescriptor("\u00bd", false, 128), new KeySymDescriptor("\u215c", false, 129))));
layout.keys.put(KeyEvent.VK_6, new KeyDescriptor(KeyEvent.VK_6, KeyEvent.VK_6, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("6", false, 0), new KeySymDescriptor("&", false, 1), new KeySymDescriptor("\u00ac", false, 128), new KeySymDescriptor("\u215d", false, 129))));
layout.keys.put(KeyEvent.VK_7, new KeyDescriptor(KeyEvent.VK_7, KeyEvent.VK_7, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("7", false, 0), new KeySymDescriptor("/", false, 1), new KeySymDescriptor("{", false, 128), new KeySymDescriptor("\u215e", false, 129))));
layout.keys.put(KeyEvent.VK_8, new KeyDescriptor(KeyEvent.VK_8, KeyEvent.VK_8, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("8", false, 0), new KeySymDescriptor("(", false, 1), new KeySymDescriptor("[", false, 128), new KeySymDescriptor("\u2122", false, 129))));
layout.keys.put(KeyEvent.VK_9, new KeyDescriptor(KeyEvent.VK_9, KeyEvent.VK_9, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("9", false, 0), new KeySymDescriptor(")", false, 1), new KeySymDescriptor("]", false, 128), new KeySymDescriptor("\u00b1", false, 129))));
layout.keys.put(KeyEvent.VK_0, new KeyDescriptor(KeyEvent.VK_0, KeyEvent.VK_0, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("0", false, 0), new KeySymDescriptor("=", false, 1), new KeySymDescriptor("}", false, 128), new KeySymDescriptor("\u00b0", false, 129))));
layout.keys.put(KeyEvent.VK_MINUS, new KeyDescriptor(KeyEvent.VK_MINUS, KeyEvent.VK_QUOTE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("'", false, 0), new KeySymDescriptor("?", false, 1), new KeySymDescriptor("\\", false, 128), new KeySymDescriptor("\u00bf", false, 129))));
layout.keys.put(KeyEvent.VK_EQUALS, new KeyDescriptor(KeyEvent.VK_EQUALS, KeyEvent.VK_INVERTED_EXCLAMATION_MARK, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u00a1", false, 0), new KeySymDescriptor("\u00bf", false, 1), new KeySymDescriptor("\u00b8", true, 128), new KeySymDescriptor("\u02db", true, 129))));
layout.keys.put(KeyEvent.VK_BACK_SPACE, new KeyDescriptor(KeyEvent.VK_BACK_SPACE, KeyEvent.VK_BACK_SPACE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0008", false, 0), new KeySymDescriptor("\u0008", false, 1))));
layout.keys.put(KeyEvent.VK_TAB, new KeyDescriptor(KeyEvent.VK_TAB, KeyEvent.VK_TAB, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\t", false, 0), new KeySymDescriptor("", false, 1))));
layout.keys.put(KeyEvent.VK_Q, new KeyDescriptor(KeyEvent.VK_Q, KeyEvent.VK_Q, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("q", false, 0), new KeySymDescriptor("Q", false, 1), new KeySymDescriptor("@", false, 128), new KeySymDescriptor("\u03a9", false, 129))));
layout.keys.put(KeyEvent.VK_W, new KeyDescriptor(KeyEvent.VK_W, KeyEvent.VK_W, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("w", false, 0), new KeySymDescriptor("W", false, 1), new KeySymDescriptor("\u017f", false, 128), new KeySymDescriptor("\u00a7", false, 129))));
layout.keys.put(KeyEvent.VK_E, new KeyDescriptor(KeyEvent.VK_E, KeyEvent.VK_E, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("e", false, 0), new KeySymDescriptor("E", false, 1), new KeySymDescriptor("\u20ac", false, 128), new KeySymDescriptor("\u00a2", false, 129))));
layout.keys.put(KeyEvent.VK_R, new KeyDescriptor(KeyEvent.VK_R, KeyEvent.VK_R, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("r", false, 0), new KeySymDescriptor("R", false, 1), new KeySymDescriptor("\u00b6", false, 128), new KeySymDescriptor("\u00ae", false, 129))));
layout.keys.put(KeyEvent.VK_T, new KeyDescriptor(KeyEvent.VK_T, KeyEvent.VK_T, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("t", false, 0), new KeySymDescriptor("T", false, 1), new KeySymDescriptor("\u0167", false, 128), new KeySymDescriptor("\u0166", false, 129))));
layout.keys.put(KeyEvent.VK_Y, new KeyDescriptor(KeyEvent.VK_Y, KeyEvent.VK_Y, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("y", false, 0), new KeySymDescriptor("Y", false, 1), new KeySymDescriptor("\u2190", false, 128), new KeySymDescriptor("\u00a5", false, 129))));
layout.keys.put(KeyEvent.VK_U, new KeyDescriptor(KeyEvent.VK_U, KeyEvent.VK_U, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("u", false, 0), new KeySymDescriptor("U", false, 1), new KeySymDescriptor("\u2193", false, 128), new KeySymDescriptor("\u2191", false, 129))));
layout.keys.put(KeyEvent.VK_I, new KeyDescriptor(KeyEvent.VK_I, KeyEvent.VK_I, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("i", false, 0), new KeySymDescriptor("I", false, 1), new KeySymDescriptor("\u2192", false, 128), new KeySymDescriptor("\u0131", false, 129))));
layout.keys.put(KeyEvent.VK_O, new KeyDescriptor(KeyEvent.VK_O, KeyEvent.VK_O, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("o", false, 0), new KeySymDescriptor("O", false, 1), new KeySymDescriptor("\u00f8", false, 128), new KeySymDescriptor("\u00d8", false, 129))));
layout.keys.put(KeyEvent.VK_P, new KeyDescriptor(KeyEvent.VK_P, KeyEvent.VK_P, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("p", false, 0), new KeySymDescriptor("P", false, 1), new KeySymDescriptor("\u00fe", false, 128), new KeySymDescriptor("\u00de", false, 129))));
layout.keys.put(KeyEvent.VK_OPEN_BRACKET, new KeyDescriptor(KeyEvent.VK_OPEN_BRACKET, KeyEvent.VK_DEAD_GRAVE, KeyEvent.VK_BACK_QUOTE, List.of(new KeySymDescriptor("`", true, 0), new KeySymDescriptor("^", true, 1), new KeySymDescriptor("[", false, 128), new KeySymDescriptor("\u00b0", true, 129))));
layout.keys.put(KeyEvent.VK_CLOSE_BRACKET, new KeyDescriptor(KeyEvent.VK_CLOSE_BRACKET, KeyEvent.VK_PLUS, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("+", false, 0), new KeySymDescriptor("*", false, 1), new KeySymDescriptor("]", false, 128), new KeySymDescriptor("\u00af", true, 129))));
layout.keys.put(KeyEvent.VK_ENTER, new KeyDescriptor(KeyEvent.VK_ENTER, KeyEvent.VK_ENTER, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\r", false, 0))));
layout.keys.put(KeyEvent.VK_CONTROL, new KeyDescriptor(KeyEvent.VK_CONTROL, KeyEvent.VK_CONTROL, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_A, new KeyDescriptor(KeyEvent.VK_A, KeyEvent.VK_A, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("a", false, 0), new KeySymDescriptor("A", false, 1), new KeySymDescriptor("\u00e6", false, 128), new KeySymDescriptor("\u00c6", false, 129))));
layout.keys.put(KeyEvent.VK_S, new KeyDescriptor(KeyEvent.VK_S, KeyEvent.VK_S, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("s", false, 0), new KeySymDescriptor("S", false, 1), new KeySymDescriptor("\u00df", false, 128), new KeySymDescriptor("\u1e9e", false, 129))));
layout.keys.put(KeyEvent.VK_D, new KeyDescriptor(KeyEvent.VK_D, KeyEvent.VK_D, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("d", false, 0), new KeySymDescriptor("D", false, 1), new KeySymDescriptor("\u00f0", false, 128), new KeySymDescriptor("\u00d0", false, 129))));
layout.keys.put(KeyEvent.VK_F, new KeyDescriptor(KeyEvent.VK_F, KeyEvent.VK_F, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("f", false, 0), new KeySymDescriptor("F", false, 1), new KeySymDescriptor("\u0111", false, 128), new KeySymDescriptor("\u00aa", false, 129))));
layout.keys.put(KeyEvent.VK_G, new KeyDescriptor(KeyEvent.VK_G, KeyEvent.VK_G, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("g", false, 0), new KeySymDescriptor("G", false, 1), new KeySymDescriptor("\u014b", false, 128), new KeySymDescriptor("\u014a", false, 129))));
layout.keys.put(KeyEvent.VK_H, new KeyDescriptor(KeyEvent.VK_H, KeyEvent.VK_H, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("h", false, 0), new KeySymDescriptor("H", false, 1), new KeySymDescriptor("\u0127", false, 128), new KeySymDescriptor("\u0126", false, 129))));
layout.keys.put(KeyEvent.VK_J, new KeyDescriptor(KeyEvent.VK_J, KeyEvent.VK_J, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("j", false, 0), new KeySymDescriptor("J", false, 1), new KeySymDescriptor("\u0309", true, 128), new KeySymDescriptor("\u031b", true, 129))));
layout.keys.put(KeyEvent.VK_K, new KeyDescriptor(KeyEvent.VK_K, KeyEvent.VK_K, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("k", false, 0), new KeySymDescriptor("K", false, 1), new KeySymDescriptor("\u0138", false, 128), new KeySymDescriptor("&", false, 129))));
layout.keys.put(KeyEvent.VK_L, new KeyDescriptor(KeyEvent.VK_L, KeyEvent.VK_L, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("l", false, 0), new KeySymDescriptor("L", false, 1), new KeySymDescriptor("\u0142", false, 128), new KeySymDescriptor("\u0141", false, 129))));
layout.keys.put(KeyEvent.VK_SEMICOLON, new KeyDescriptor(KeyEvent.VK_SEMICOLON, KeyEvent.getExtendedKeyCodeForChar(241), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u00f1", false, 0), new KeySymDescriptor("\u00d1", false, 1), new KeySymDescriptor("~", true, 128), new KeySymDescriptor("\u02dd", true, 129))));
layout.keys.put(KeyEvent.VK_QUOTE, new KeyDescriptor(KeyEvent.VK_QUOTE, KeyEvent.VK_DEAD_ACUTE, KeyEvent.VK_QUOTE, List.of(new KeySymDescriptor("'", true, 0), new KeySymDescriptor("\"", true, 1), new KeySymDescriptor("{", false, 128), new KeySymDescriptor("\u02c7", true, 129))));
layout.keys.put(KeyEvent.VK_BACK_QUOTE, new KeyDescriptor(KeyEvent.VK_BACK_QUOTE, KeyEvent.getExtendedKeyCodeForChar(186), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u00ba", false, 0), new KeySymDescriptor("\u00aa", false, 1), new KeySymDescriptor("\\", false, 128), new KeySymDescriptor("\\", false, 129))));
layout.keys.put(KeyEvent.VK_SHIFT, new KeyDescriptor(KeyEvent.VK_SHIFT, KeyEvent.VK_SHIFT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_BACK_SLASH, new KeyDescriptor(KeyEvent.VK_BACK_SLASH, KeyEvent.getExtendedKeyCodeForChar(231), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u00e7", false, 0), new KeySymDescriptor("\u00c7", false, 1), new KeySymDescriptor("}", false, 128), new KeySymDescriptor("\u02d8", true, 129))));
layout.keys.put(KeyEvent.VK_Z, new KeyDescriptor(KeyEvent.VK_Z, KeyEvent.VK_Z, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("z", false, 0), new KeySymDescriptor("Z", false, 1), new KeySymDescriptor("\u00ab", false, 128), new KeySymDescriptor("<", false, 129))));
layout.keys.put(KeyEvent.VK_X, new KeyDescriptor(KeyEvent.VK_X, KeyEvent.VK_X, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("x", false, 0), new KeySymDescriptor("X", false, 1), new KeySymDescriptor("\u00bb", false, 128), new KeySymDescriptor(">", false, 129))));
layout.keys.put(KeyEvent.VK_C, new KeyDescriptor(KeyEvent.VK_C, KeyEvent.VK_C, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("c", false, 0), new KeySymDescriptor("C", false, 1), new KeySymDescriptor("\u00a2", false, 128), new KeySymDescriptor("\u00a9", false, 129))));
layout.keys.put(KeyEvent.VK_V, new KeyDescriptor(KeyEvent.VK_V, KeyEvent.VK_V, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("v", false, 0), new KeySymDescriptor("V", false, 1), new KeySymDescriptor("\u201e", false, 128), new KeySymDescriptor("\u201a", false, 129))));
layout.keys.put(KeyEvent.VK_B, new KeyDescriptor(KeyEvent.VK_B, KeyEvent.VK_B, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("b", false, 0), new KeySymDescriptor("B", false, 1), new KeySymDescriptor("\u201c", false, 128), new KeySymDescriptor("\u2018", false, 129))));
layout.keys.put(KeyEvent.VK_N, new KeyDescriptor(KeyEvent.VK_N, KeyEvent.VK_N, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("n", false, 0), new KeySymDescriptor("N", false, 1), new KeySymDescriptor("\u201d", false, 128), new KeySymDescriptor("\u2019", false, 129))));
layout.keys.put(KeyEvent.VK_M, new KeyDescriptor(KeyEvent.VK_M, KeyEvent.VK_M, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("m", false, 0), new KeySymDescriptor("M", false, 1), new KeySymDescriptor("\u00b5", false, 128), new KeySymDescriptor("\u00ba", false, 129))));
layout.keys.put(KeyEvent.VK_COMMA, new KeyDescriptor(KeyEvent.VK_COMMA, KeyEvent.VK_COMMA, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor(",", false, 0), new KeySymDescriptor(";", false, 1), new KeySymDescriptor("\u2022", false, 128), new KeySymDescriptor("\u00d7", false, 129))));
layout.keys.put(KeyEvent.VK_PERIOD, new KeyDescriptor(KeyEvent.VK_PERIOD, KeyEvent.VK_PERIOD, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor(".", false, 0), new KeySymDescriptor(":", false, 1), new KeySymDescriptor("\u00b7", false, 128), new KeySymDescriptor("\u00f7", false, 129))));
layout.keys.put(KeyEvent.VK_SLASH, new KeyDescriptor(KeyEvent.VK_SLASH, KeyEvent.VK_MINUS, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("-", false, 0), new KeySymDescriptor("_", false, 1), new KeySymDescriptor("\u0323", true, 128), new KeySymDescriptor("\u02d9", true, 129))));
layout.keys.put(KeyEvent.VK_MULTIPLY, new KeyDescriptor(KeyEvent.VK_MULTIPLY, KeyEvent.VK_MULTIPLY, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("*", false, 0), new KeySymDescriptor("*", false, 1), new KeySymDescriptor("*", false, 128), new KeySymDescriptor("*", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_ALT, new KeyDescriptor(KeyEvent.VK_ALT, KeyEvent.VK_ALT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1))));
layout.keys.put(KeyEvent.VK_SPACE, new KeyDescriptor(KeyEvent.VK_SPACE, KeyEvent.VK_SPACE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor(" ", false, 0))));
layout.keys.put(KeyEvent.VK_CAPS_LOCK, new KeyDescriptor(KeyEvent.VK_CAPS_LOCK, KeyEvent.VK_CAPS_LOCK, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F1, new KeyDescriptor(KeyEvent.VK_F1, KeyEvent.VK_F1, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F2, new KeyDescriptor(KeyEvent.VK_F2, KeyEvent.VK_F2, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F3, new KeyDescriptor(KeyEvent.VK_F3, KeyEvent.VK_F3, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F4, new KeyDescriptor(KeyEvent.VK_F4, KeyEvent.VK_F4, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F5, new KeyDescriptor(KeyEvent.VK_F5, KeyEvent.VK_F5, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F6, new KeyDescriptor(KeyEvent.VK_F6, KeyEvent.VK_F6, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F7, new KeyDescriptor(KeyEvent.VK_F7, KeyEvent.VK_F7, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F8, new KeyDescriptor(KeyEvent.VK_F8, KeyEvent.VK_F8, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F9, new KeyDescriptor(KeyEvent.VK_F9, KeyEvent.VK_F9, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F10, new KeyDescriptor(KeyEvent.VK_F10, KeyEvent.VK_F10, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_NUM_LOCK, new KeyDescriptor(KeyEvent.VK_NUM_LOCK, KeyEvent.VK_NUM_LOCK, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_NUMPAD7, new KeyDescriptor(KeyEvent.VK_NUMPAD7, KeyEvent.VK_HOME, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("7", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD8, new KeyDescriptor(KeyEvent.VK_NUMPAD8, KeyEvent.VK_KP_UP, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("8", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD9, new KeyDescriptor(KeyEvent.VK_NUMPAD9, KeyEvent.VK_PAGE_UP, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("9", false, 16))));
layout.keys.put(KeyEvent.VK_SUBTRACT, new KeyDescriptor(KeyEvent.VK_SUBTRACT, KeyEvent.VK_SUBTRACT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("-", false, 0), new KeySymDescriptor("-", false, 1), new KeySymDescriptor("-", false, 128), new KeySymDescriptor("-", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_NUMPAD4, new KeyDescriptor(KeyEvent.VK_NUMPAD4, KeyEvent.VK_KP_LEFT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("4", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD5, new KeyDescriptor(KeyEvent.VK_NUMPAD5, KeyEvent.VK_BEGIN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("5", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD6, new KeyDescriptor(KeyEvent.VK_NUMPAD6, KeyEvent.VK_KP_RIGHT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("6", false, 16))));
layout.keys.put(KeyEvent.VK_ADD, new KeyDescriptor(KeyEvent.VK_ADD, KeyEvent.VK_ADD, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("+", false, 0), new KeySymDescriptor("+", false, 1), new KeySymDescriptor("+", false, 128), new KeySymDescriptor("+", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_NUMPAD1, new KeyDescriptor(KeyEvent.VK_NUMPAD1, KeyEvent.VK_END, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("1", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD2, new KeyDescriptor(KeyEvent.VK_NUMPAD2, KeyEvent.VK_KP_DOWN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("2", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD3, new KeyDescriptor(KeyEvent.VK_NUMPAD3, KeyEvent.VK_PAGE_DOWN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("3", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD0, new KeyDescriptor(KeyEvent.VK_NUMPAD0, KeyEvent.VK_INSERT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("0", false, 16))));
layout.keys.put(KeyEvent.VK_DECIMAL, new KeyDescriptor(KeyEvent.VK_DECIMAL, KeyEvent.VK_DELETE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor(".", false, 16))));
layout.keys.put(KeyEvent.VK_LESS, new KeyDescriptor(KeyEvent.VK_LESS, KeyEvent.VK_LESS, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("<", false, 0), new KeySymDescriptor(">", false, 1), new KeySymDescriptor("|", false, 128), new KeySymDescriptor("\u00a6", false, 129))));
layout.keys.put(KeyEvent.VK_F11, new KeyDescriptor(KeyEvent.VK_F11, KeyEvent.VK_F11, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F12, new KeyDescriptor(KeyEvent.VK_F12, KeyEvent.VK_F12, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_DIVIDE, new KeyDescriptor(KeyEvent.VK_DIVIDE, KeyEvent.VK_DIVIDE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("/", false, 0), new KeySymDescriptor("/", false, 1), new KeySymDescriptor("/", false, 128), new KeySymDescriptor("/", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_PRINTSCREEN, new KeyDescriptor(KeyEvent.VK_PRINTSCREEN, KeyEvent.VK_PRINTSCREEN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 8))));
layout.keys.put(KeyEvent.VK_ALT_GRAPH, new KeyDescriptor(KeyEvent.VK_ALT_GRAPH, KeyEvent.VK_ALT_GRAPH, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_HOME, new KeyDescriptor(KeyEvent.VK_HOME, KeyEvent.VK_HOME, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_UP, new KeyDescriptor(KeyEvent.VK_UP, KeyEvent.VK_UP, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_PAGE_UP, new KeyDescriptor(KeyEvent.VK_PAGE_UP, KeyEvent.VK_PAGE_UP, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_LEFT, new KeyDescriptor(KeyEvent.VK_LEFT, KeyEvent.VK_LEFT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_RIGHT, new KeyDescriptor(KeyEvent.VK_RIGHT, KeyEvent.VK_RIGHT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_END, new KeyDescriptor(KeyEvent.VK_END, KeyEvent.VK_END, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_DOWN, new KeyDescriptor(KeyEvent.VK_DOWN, KeyEvent.VK_DOWN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_PAGE_DOWN, new KeyDescriptor(KeyEvent.VK_PAGE_DOWN, KeyEvent.VK_PAGE_DOWN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_INSERT, new KeyDescriptor(KeyEvent.VK_INSERT, KeyEvent.VK_INSERT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_DELETE, new KeyDescriptor(KeyEvent.VK_DELETE, KeyEvent.VK_DELETE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u007f", false, 0))));
layout.keys.put(KeyEvent.VK_PAUSE, new KeyDescriptor(KeyEvent.VK_PAUSE, KeyEvent.VK_PAUSE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 4))));
layout.keys.put(KeyEvent.VK_META, new KeyDescriptor(KeyEvent.VK_META, KeyEvent.VK_WINDOWS, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_WINDOWS, new KeyDescriptor(KeyEvent.VK_WINDOWS, KeyEvent.VK_WINDOWS, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F13, new KeyDescriptor(KeyEvent.VK_F13, KeyEvent.VK_F13, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F14, new KeyDescriptor(KeyEvent.VK_F14, KeyEvent.VK_F14, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F15, new KeyDescriptor(KeyEvent.VK_F15, KeyEvent.VK_F15, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F16, new KeyDescriptor(KeyEvent.VK_F16, KeyEvent.VK_F16, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F17, new KeyDescriptor(KeyEvent.VK_F17, KeyEvent.VK_F17, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F18, new KeyDescriptor(KeyEvent.VK_F18, KeyEvent.VK_F18, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F20, new KeyDescriptor(KeyEvent.VK_F20, KeyEvent.VK_F20, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F21, new KeyDescriptor(KeyEvent.VK_F21, KeyEvent.VK_F21, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F22, new KeyDescriptor(KeyEvent.VK_F22, KeyEvent.VK_F22, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F23, new KeyDescriptor(KeyEvent.VK_F23, KeyEvent.VK_F23, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layouts.add(layout);
}
{
var layout = new LayoutDescriptor("ru", "", "Russian", false, new HashMap<>());
layout.keys.put(KeyEvent.VK_ESCAPE, new KeyDescriptor(KeyEvent.VK_ESCAPE, KeyEvent.VK_ESCAPE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u001b", false, 0))));
layout.keys.put(KeyEvent.VK_1, new KeyDescriptor(KeyEvent.VK_1, KeyEvent.VK_1, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("1", false, 0), new KeySymDescriptor("!", false, 1))));
layout.keys.put(KeyEvent.VK_2, new KeyDescriptor(KeyEvent.VK_2, KeyEvent.VK_2, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("2", false, 0), new KeySymDescriptor("\"", false, 1))));
layout.keys.put(KeyEvent.VK_3, new KeyDescriptor(KeyEvent.VK_3, KeyEvent.VK_3, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("3", false, 0), new KeySymDescriptor("\u2116", false, 1))));
layout.keys.put(KeyEvent.VK_4, new KeyDescriptor(KeyEvent.VK_4, KeyEvent.VK_4, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("4", false, 0), new KeySymDescriptor(";", false, 1))));
layout.keys.put(KeyEvent.VK_5, new KeyDescriptor(KeyEvent.VK_5, KeyEvent.VK_5, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("5", false, 0), new KeySymDescriptor("%", false, 1))));
layout.keys.put(KeyEvent.VK_6, new KeyDescriptor(KeyEvent.VK_6, KeyEvent.VK_6, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("6", false, 0), new KeySymDescriptor(":", false, 1))));
layout.keys.put(KeyEvent.VK_7, new KeyDescriptor(KeyEvent.VK_7, KeyEvent.VK_7, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("7", false, 0), new KeySymDescriptor("?", false, 1))));
layout.keys.put(KeyEvent.VK_8, new KeyDescriptor(KeyEvent.VK_8, KeyEvent.VK_8, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("8", false, 0), new KeySymDescriptor("*", false, 1), new KeySymDescriptor("\u20bd", false, 128))));
layout.keys.put(KeyEvent.VK_9, new KeyDescriptor(KeyEvent.VK_9, KeyEvent.VK_9, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("9", false, 0), new KeySymDescriptor("(", false, 1))));
layout.keys.put(KeyEvent.VK_0, new KeyDescriptor(KeyEvent.VK_0, KeyEvent.VK_0, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("0", false, 0), new KeySymDescriptor(")", false, 1))));
layout.keys.put(KeyEvent.VK_MINUS, new KeyDescriptor(KeyEvent.VK_MINUS, KeyEvent.VK_MINUS, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("-", false, 0), new KeySymDescriptor("_", false, 1))));
layout.keys.put(KeyEvent.VK_EQUALS, new KeyDescriptor(KeyEvent.VK_EQUALS, KeyEvent.VK_EQUALS, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("=", false, 0), new KeySymDescriptor("+", false, 1))));
layout.keys.put(KeyEvent.VK_BACK_SPACE, new KeyDescriptor(KeyEvent.VK_BACK_SPACE, KeyEvent.VK_BACK_SPACE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0008", false, 0), new KeySymDescriptor("\u0008", false, 1))));
layout.keys.put(KeyEvent.VK_TAB, new KeyDescriptor(KeyEvent.VK_TAB, KeyEvent.VK_TAB, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\t", false, 0), new KeySymDescriptor("", false, 1))));
layout.keys.put(KeyEvent.VK_Q, new KeyDescriptor(KeyEvent.VK_Q, KeyEvent.getExtendedKeyCodeForChar(1081), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0439", false, 0), new KeySymDescriptor("\u0419", false, 1))));
layout.keys.put(KeyEvent.VK_W, new KeyDescriptor(KeyEvent.VK_W, KeyEvent.getExtendedKeyCodeForChar(1094), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0446", false, 0), new KeySymDescriptor("\u0426", false, 1))));
layout.keys.put(KeyEvent.VK_E, new KeyDescriptor(KeyEvent.VK_E, KeyEvent.getExtendedKeyCodeForChar(1091), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0443", false, 0), new KeySymDescriptor("\u0423", false, 1))));
layout.keys.put(KeyEvent.VK_R, new KeyDescriptor(KeyEvent.VK_R, KeyEvent.getExtendedKeyCodeForChar(1082), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u043a", false, 0), new KeySymDescriptor("\u041a", false, 1))));
layout.keys.put(KeyEvent.VK_T, new KeyDescriptor(KeyEvent.VK_T, KeyEvent.getExtendedKeyCodeForChar(1077), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0435", false, 0), new KeySymDescriptor("\u0415", false, 1))));
layout.keys.put(KeyEvent.VK_Y, new KeyDescriptor(KeyEvent.VK_Y, KeyEvent.getExtendedKeyCodeForChar(1085), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u043d", false, 0), new KeySymDescriptor("\u041d", false, 1))));
layout.keys.put(KeyEvent.VK_U, new KeyDescriptor(KeyEvent.VK_U, KeyEvent.getExtendedKeyCodeForChar(1075), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0433", false, 0), new KeySymDescriptor("\u0413", false, 1))));
layout.keys.put(KeyEvent.VK_I, new KeyDescriptor(KeyEvent.VK_I, KeyEvent.getExtendedKeyCodeForChar(1096), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0448", false, 0), new KeySymDescriptor("\u0428", false, 1))));
layout.keys.put(KeyEvent.VK_O, new KeyDescriptor(KeyEvent.VK_O, KeyEvent.getExtendedKeyCodeForChar(1097), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0449", false, 0), new KeySymDescriptor("\u0429", false, 1))));
layout.keys.put(KeyEvent.VK_P, new KeyDescriptor(KeyEvent.VK_P, KeyEvent.getExtendedKeyCodeForChar(1079), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0437", false, 0), new KeySymDescriptor("\u0417", false, 1))));
layout.keys.put(KeyEvent.VK_OPEN_BRACKET, new KeyDescriptor(KeyEvent.VK_OPEN_BRACKET, KeyEvent.getExtendedKeyCodeForChar(1093), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0445", false, 0), new KeySymDescriptor("\u0425", false, 1))));
layout.keys.put(KeyEvent.VK_CLOSE_BRACKET, new KeyDescriptor(KeyEvent.VK_CLOSE_BRACKET, KeyEvent.getExtendedKeyCodeForChar(1098), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u044a", false, 0), new KeySymDescriptor("\u042a", false, 1))));
layout.keys.put(KeyEvent.VK_ENTER, new KeyDescriptor(KeyEvent.VK_ENTER, KeyEvent.VK_ENTER, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\r", false, 0))));
layout.keys.put(KeyEvent.VK_CONTROL, new KeyDescriptor(KeyEvent.VK_CONTROL, KeyEvent.VK_CONTROL, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_A, new KeyDescriptor(KeyEvent.VK_A, KeyEvent.getExtendedKeyCodeForChar(1092), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0444", false, 0), new KeySymDescriptor("\u0424", false, 1))));
layout.keys.put(KeyEvent.VK_S, new KeyDescriptor(KeyEvent.VK_S, KeyEvent.getExtendedKeyCodeForChar(1099), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u044b", false, 0), new KeySymDescriptor("\u042b", false, 1))));
layout.keys.put(KeyEvent.VK_D, new KeyDescriptor(KeyEvent.VK_D, KeyEvent.getExtendedKeyCodeForChar(1074), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0432", false, 0), new KeySymDescriptor("\u0412", false, 1))));
layout.keys.put(KeyEvent.VK_F, new KeyDescriptor(KeyEvent.VK_F, KeyEvent.getExtendedKeyCodeForChar(1072), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0430", false, 0), new KeySymDescriptor("\u0410", false, 1))));
layout.keys.put(KeyEvent.VK_G, new KeyDescriptor(KeyEvent.VK_G, KeyEvent.getExtendedKeyCodeForChar(1087), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u043f", false, 0), new KeySymDescriptor("\u041f", false, 1))));
layout.keys.put(KeyEvent.VK_H, new KeyDescriptor(KeyEvent.VK_H, KeyEvent.getExtendedKeyCodeForChar(1088), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0440", false, 0), new KeySymDescriptor("\u0420", false, 1))));
layout.keys.put(KeyEvent.VK_J, new KeyDescriptor(KeyEvent.VK_J, KeyEvent.getExtendedKeyCodeForChar(1086), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u043e", false, 0), new KeySymDescriptor("\u041e", false, 1))));
layout.keys.put(KeyEvent.VK_K, new KeyDescriptor(KeyEvent.VK_K, KeyEvent.getExtendedKeyCodeForChar(1083), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u043b", false, 0), new KeySymDescriptor("\u041b", false, 1))));
layout.keys.put(KeyEvent.VK_L, new KeyDescriptor(KeyEvent.VK_L, KeyEvent.getExtendedKeyCodeForChar(1076), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0434", false, 0), new KeySymDescriptor("\u0414", false, 1))));
layout.keys.put(KeyEvent.VK_SEMICOLON, new KeyDescriptor(KeyEvent.VK_SEMICOLON, KeyEvent.getExtendedKeyCodeForChar(1078), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0436", false, 0), new KeySymDescriptor("\u0416", false, 1))));
layout.keys.put(KeyEvent.VK_QUOTE, new KeyDescriptor(KeyEvent.VK_QUOTE, KeyEvent.getExtendedKeyCodeForChar(1101), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u044d", false, 0), new KeySymDescriptor("\u042d", false, 1))));
layout.keys.put(KeyEvent.VK_BACK_QUOTE, new KeyDescriptor(KeyEvent.VK_BACK_QUOTE, KeyEvent.getExtendedKeyCodeForChar(1105), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0451", false, 0), new KeySymDescriptor("\u0401", false, 1))));
layout.keys.put(KeyEvent.VK_SHIFT, new KeyDescriptor(KeyEvent.VK_SHIFT, KeyEvent.VK_SHIFT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_BACK_SLASH, new KeyDescriptor(KeyEvent.VK_BACK_SLASH, KeyEvent.VK_BACK_SLASH, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\\", false, 0), new KeySymDescriptor("/", false, 1))));
layout.keys.put(KeyEvent.VK_Z, new KeyDescriptor(KeyEvent.VK_Z, KeyEvent.getExtendedKeyCodeForChar(1103), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u044f", false, 0), new KeySymDescriptor("\u042f", false, 1))));
layout.keys.put(KeyEvent.VK_X, new KeyDescriptor(KeyEvent.VK_X, KeyEvent.getExtendedKeyCodeForChar(1095), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0447", false, 0), new KeySymDescriptor("\u0427", false, 1))));
layout.keys.put(KeyEvent.VK_C, new KeyDescriptor(KeyEvent.VK_C, KeyEvent.getExtendedKeyCodeForChar(1089), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0441", false, 0), new KeySymDescriptor("\u0421", false, 1))));
layout.keys.put(KeyEvent.VK_V, new KeyDescriptor(KeyEvent.VK_V, KeyEvent.getExtendedKeyCodeForChar(1084), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u043c", false, 0), new KeySymDescriptor("\u041c", false, 1))));
layout.keys.put(KeyEvent.VK_B, new KeyDescriptor(KeyEvent.VK_B, KeyEvent.getExtendedKeyCodeForChar(1080), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0438", false, 0), new KeySymDescriptor("\u0418", false, 1))));
layout.keys.put(KeyEvent.VK_N, new KeyDescriptor(KeyEvent.VK_N, KeyEvent.getExtendedKeyCodeForChar(1090), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0442", false, 0), new KeySymDescriptor("\u0422", false, 1))));
layout.keys.put(KeyEvent.VK_M, new KeyDescriptor(KeyEvent.VK_M, KeyEvent.getExtendedKeyCodeForChar(1100), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u044c", false, 0), new KeySymDescriptor("\u042c", false, 1))));
layout.keys.put(KeyEvent.VK_COMMA, new KeyDescriptor(KeyEvent.VK_COMMA, KeyEvent.getExtendedKeyCodeForChar(1073), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0431", false, 0), new KeySymDescriptor("\u0411", false, 1))));
layout.keys.put(KeyEvent.VK_PERIOD, new KeyDescriptor(KeyEvent.VK_PERIOD, KeyEvent.getExtendedKeyCodeForChar(1102), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u044e", false, 0), new KeySymDescriptor("\u042e", false, 1))));
layout.keys.put(KeyEvent.VK_SLASH, new KeyDescriptor(KeyEvent.VK_SLASH, KeyEvent.VK_PERIOD, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor(".", false, 0), new KeySymDescriptor(",", false, 1))));
layout.keys.put(KeyEvent.VK_MULTIPLY, new KeyDescriptor(KeyEvent.VK_MULTIPLY, KeyEvent.VK_MULTIPLY, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("*", false, 0), new KeySymDescriptor("*", false, 1), new KeySymDescriptor("*", false, 128), new KeySymDescriptor("*", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_ALT, new KeyDescriptor(KeyEvent.VK_ALT, KeyEvent.VK_ALT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1))));
layout.keys.put(KeyEvent.VK_SPACE, new KeyDescriptor(KeyEvent.VK_SPACE, KeyEvent.VK_SPACE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor(" ", false, 0))));
layout.keys.put(KeyEvent.VK_CAPS_LOCK, new KeyDescriptor(KeyEvent.VK_CAPS_LOCK, KeyEvent.VK_CAPS_LOCK, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F1, new KeyDescriptor(KeyEvent.VK_F1, KeyEvent.VK_F1, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F2, new KeyDescriptor(KeyEvent.VK_F2, KeyEvent.VK_F2, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F3, new KeyDescriptor(KeyEvent.VK_F3, KeyEvent.VK_F3, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F4, new KeyDescriptor(KeyEvent.VK_F4, KeyEvent.VK_F4, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F5, new KeyDescriptor(KeyEvent.VK_F5, KeyEvent.VK_F5, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F6, new KeyDescriptor(KeyEvent.VK_F6, KeyEvent.VK_F6, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F7, new KeyDescriptor(KeyEvent.VK_F7, KeyEvent.VK_F7, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F8, new KeyDescriptor(KeyEvent.VK_F8, KeyEvent.VK_F8, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F9, new KeyDescriptor(KeyEvent.VK_F9, KeyEvent.VK_F9, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F10, new KeyDescriptor(KeyEvent.VK_F10, KeyEvent.VK_F10, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_NUM_LOCK, new KeyDescriptor(KeyEvent.VK_NUM_LOCK, KeyEvent.VK_NUM_LOCK, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_NUMPAD7, new KeyDescriptor(KeyEvent.VK_NUMPAD7, KeyEvent.VK_HOME, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("7", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD8, new KeyDescriptor(KeyEvent.VK_NUMPAD8, KeyEvent.VK_KP_UP, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("8", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD9, new KeyDescriptor(KeyEvent.VK_NUMPAD9, KeyEvent.VK_PAGE_UP, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("9", false, 16))));
layout.keys.put(KeyEvent.VK_SUBTRACT, new KeyDescriptor(KeyEvent.VK_SUBTRACT, KeyEvent.VK_SUBTRACT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("-", false, 0), new KeySymDescriptor("-", false, 1), new KeySymDescriptor("-", false, 128), new KeySymDescriptor("-", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_NUMPAD4, new KeyDescriptor(KeyEvent.VK_NUMPAD4, KeyEvent.VK_KP_LEFT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("4", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD5, new KeyDescriptor(KeyEvent.VK_NUMPAD5, KeyEvent.VK_BEGIN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("5", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD6, new KeyDescriptor(KeyEvent.VK_NUMPAD6, KeyEvent.VK_KP_RIGHT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("6", false, 16))));
layout.keys.put(KeyEvent.VK_ADD, new KeyDescriptor(KeyEvent.VK_ADD, KeyEvent.VK_ADD, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("+", false, 0), new KeySymDescriptor("+", false, 1), new KeySymDescriptor("+", false, 128), new KeySymDescriptor("+", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_NUMPAD1, new KeyDescriptor(KeyEvent.VK_NUMPAD1, KeyEvent.VK_END, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("1", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD2, new KeyDescriptor(KeyEvent.VK_NUMPAD2, KeyEvent.VK_KP_DOWN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("2", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD3, new KeyDescriptor(KeyEvent.VK_NUMPAD3, KeyEvent.VK_PAGE_DOWN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("3", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD0, new KeyDescriptor(KeyEvent.VK_NUMPAD0, KeyEvent.VK_INSERT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("0", false, 16))));
layout.keys.put(KeyEvent.VK_DECIMAL, new KeyDescriptor(KeyEvent.VK_DECIMAL, KeyEvent.VK_DELETE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor(",", false, 16))));
layout.keys.put(KeyEvent.VK_LESS, new KeyDescriptor(KeyEvent.VK_LESS, KeyEvent.VK_SLASH, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("/", false, 0), new KeySymDescriptor("|", false, 1), new KeySymDescriptor("|", false, 128), new KeySymDescriptor("\u00a6", false, 129))));
layout.keys.put(KeyEvent.VK_F11, new KeyDescriptor(KeyEvent.VK_F11, KeyEvent.VK_F11, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F12, new KeyDescriptor(KeyEvent.VK_F12, KeyEvent.VK_F12, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_DIVIDE, new KeyDescriptor(KeyEvent.VK_DIVIDE, KeyEvent.VK_DIVIDE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("/", false, 0), new KeySymDescriptor("/", false, 1), new KeySymDescriptor("/", false, 128), new KeySymDescriptor("/", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_PRINTSCREEN, new KeyDescriptor(KeyEvent.VK_PRINTSCREEN, KeyEvent.VK_PRINTSCREEN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 8))));
layout.keys.put(KeyEvent.VK_ALT_GRAPH, new KeyDescriptor(KeyEvent.VK_ALT_GRAPH, KeyEvent.VK_ALT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1))));
layout.keys.put(KeyEvent.VK_HOME, new KeyDescriptor(KeyEvent.VK_HOME, KeyEvent.VK_HOME, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_UP, new KeyDescriptor(KeyEvent.VK_UP, KeyEvent.VK_UP, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_PAGE_UP, new KeyDescriptor(KeyEvent.VK_PAGE_UP, KeyEvent.VK_PAGE_UP, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_LEFT, new KeyDescriptor(KeyEvent.VK_LEFT, KeyEvent.VK_LEFT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_RIGHT, new KeyDescriptor(KeyEvent.VK_RIGHT, KeyEvent.VK_RIGHT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_END, new KeyDescriptor(KeyEvent.VK_END, KeyEvent.VK_END, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_DOWN, new KeyDescriptor(KeyEvent.VK_DOWN, KeyEvent.VK_DOWN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_PAGE_DOWN, new KeyDescriptor(KeyEvent.VK_PAGE_DOWN, KeyEvent.VK_PAGE_DOWN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_INSERT, new KeyDescriptor(KeyEvent.VK_INSERT, KeyEvent.VK_INSERT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_DELETE, new KeyDescriptor(KeyEvent.VK_DELETE, KeyEvent.VK_DELETE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u007f", false, 0))));
layout.keys.put(KeyEvent.VK_PAUSE, new KeyDescriptor(KeyEvent.VK_PAUSE, KeyEvent.VK_PAUSE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 4))));
layout.keys.put(KeyEvent.VK_META, new KeyDescriptor(KeyEvent.VK_META, KeyEvent.VK_WINDOWS, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_WINDOWS, new KeyDescriptor(KeyEvent.VK_WINDOWS, KeyEvent.VK_WINDOWS, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F13, new KeyDescriptor(KeyEvent.VK_F13, KeyEvent.VK_F13, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F14, new KeyDescriptor(KeyEvent.VK_F14, KeyEvent.VK_F14, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F15, new KeyDescriptor(KeyEvent.VK_F15, KeyEvent.VK_F15, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F16, new KeyDescriptor(KeyEvent.VK_F16, KeyEvent.VK_F16, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F17, new KeyDescriptor(KeyEvent.VK_F17, KeyEvent.VK_F17, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F18, new KeyDescriptor(KeyEvent.VK_F18, KeyEvent.VK_F18, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F20, new KeyDescriptor(KeyEvent.VK_F20, KeyEvent.VK_F20, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F21, new KeyDescriptor(KeyEvent.VK_F21, KeyEvent.VK_F21, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F22, new KeyDescriptor(KeyEvent.VK_F22, KeyEvent.VK_F22, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F23, new KeyDescriptor(KeyEvent.VK_F23, KeyEvent.VK_F23, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layouts.add(layout);
}
{
var layout = new LayoutDescriptor("rs", "", "Serbian", false, new HashMap<>());
layout.keys.put(KeyEvent.VK_ESCAPE, new KeyDescriptor(KeyEvent.VK_ESCAPE, KeyEvent.VK_ESCAPE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u001b", false, 0))));
layout.keys.put(KeyEvent.VK_1, new KeyDescriptor(KeyEvent.VK_1, KeyEvent.VK_1, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("1", false, 0), new KeySymDescriptor("!", false, 1))));
layout.keys.put(KeyEvent.VK_2, new KeyDescriptor(KeyEvent.VK_2, KeyEvent.VK_2, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("2", false, 0), new KeySymDescriptor("\"", false, 1))));
layout.keys.put(KeyEvent.VK_3, new KeyDescriptor(KeyEvent.VK_3, KeyEvent.VK_3, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("3", false, 0), new KeySymDescriptor("#", false, 1), new KeySymDescriptor("^", true, 128))));
layout.keys.put(KeyEvent.VK_4, new KeyDescriptor(KeyEvent.VK_4, KeyEvent.VK_4, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("4", false, 0), new KeySymDescriptor("$", false, 1))));
layout.keys.put(KeyEvent.VK_5, new KeyDescriptor(KeyEvent.VK_5, KeyEvent.VK_5, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("5", false, 0), new KeySymDescriptor("%", false, 1))));
layout.keys.put(KeyEvent.VK_6, new KeyDescriptor(KeyEvent.VK_6, KeyEvent.VK_6, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("6", false, 0), new KeySymDescriptor("&", false, 1))));
layout.keys.put(KeyEvent.VK_7, new KeyDescriptor(KeyEvent.VK_7, KeyEvent.VK_7, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("7", false, 0), new KeySymDescriptor("/", false, 1), new KeySymDescriptor("`", true, 128))));
layout.keys.put(KeyEvent.VK_8, new KeyDescriptor(KeyEvent.VK_8, KeyEvent.VK_8, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("8", false, 0), new KeySymDescriptor("(", false, 1), new KeySymDescriptor("\u030f", true, 128))));
layout.keys.put(KeyEvent.VK_9, new KeyDescriptor(KeyEvent.VK_9, KeyEvent.VK_9, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("9", false, 0), new KeySymDescriptor(")", false, 1), new KeySymDescriptor("'", true, 128))));
layout.keys.put(KeyEvent.VK_0, new KeyDescriptor(KeyEvent.VK_0, KeyEvent.VK_0, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("0", false, 0), new KeySymDescriptor("=", false, 1), new KeySymDescriptor("\u0311", true, 128))));
layout.keys.put(KeyEvent.VK_MINUS, new KeyDescriptor(KeyEvent.VK_MINUS, KeyEvent.VK_QUOTE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("'", false, 0), new KeySymDescriptor("?", false, 1), new KeySymDescriptor("\u00af", true, 128))));
layout.keys.put(KeyEvent.VK_EQUALS, new KeyDescriptor(KeyEvent.VK_EQUALS, KeyEvent.VK_PLUS, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("+", false, 0), new KeySymDescriptor("*", false, 1))));
layout.keys.put(KeyEvent.VK_BACK_SPACE, new KeyDescriptor(KeyEvent.VK_BACK_SPACE, KeyEvent.VK_BACK_SPACE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0008", false, 0), new KeySymDescriptor("\u0008", false, 1))));
layout.keys.put(KeyEvent.VK_TAB, new KeyDescriptor(KeyEvent.VK_TAB, KeyEvent.VK_TAB, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\t", false, 0), new KeySymDescriptor("", false, 1))));
layout.keys.put(KeyEvent.VK_Q, new KeyDescriptor(KeyEvent.VK_Q, KeyEvent.getExtendedKeyCodeForChar(1113), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0459", false, 0), new KeySymDescriptor("\u0409", false, 1), new KeySymDescriptor("\\", false, 128))));
layout.keys.put(KeyEvent.VK_W, new KeyDescriptor(KeyEvent.VK_W, KeyEvent.getExtendedKeyCodeForChar(1114), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u045a", false, 0), new KeySymDescriptor("\u040a", false, 1), new KeySymDescriptor("|", false, 128))));
layout.keys.put(KeyEvent.VK_E, new KeyDescriptor(KeyEvent.VK_E, KeyEvent.getExtendedKeyCodeForChar(1077), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0435", false, 0), new KeySymDescriptor("\u0415", false, 1), new KeySymDescriptor("\u20ac", false, 128), new KeySymDescriptor("\u00a3", false, 129))));
layout.keys.put(KeyEvent.VK_R, new KeyDescriptor(KeyEvent.VK_R, KeyEvent.getExtendedKeyCodeForChar(1088), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0440", false, 0), new KeySymDescriptor("\u0420", false, 1), new KeySymDescriptor("\u00b6", false, 128), new KeySymDescriptor("\u00ae", false, 129))));
layout.keys.put(KeyEvent.VK_T, new KeyDescriptor(KeyEvent.VK_T, KeyEvent.getExtendedKeyCodeForChar(1090), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0442", false, 0), new KeySymDescriptor("\u0422", false, 1), new KeySymDescriptor("\u2026", false, 128))));
layout.keys.put(KeyEvent.VK_Y, new KeyDescriptor(KeyEvent.VK_Y, KeyEvent.getExtendedKeyCodeForChar(1079), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0437", false, 0), new KeySymDescriptor("\u0417", false, 1), new KeySymDescriptor("\u2190", false, 128), new KeySymDescriptor("\u00a5", false, 129))));
layout.keys.put(KeyEvent.VK_U, new KeyDescriptor(KeyEvent.VK_U, KeyEvent.getExtendedKeyCodeForChar(1091), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0443", false, 0), new KeySymDescriptor("\u0423", false, 1), new KeySymDescriptor("\u2193", false, 128), new KeySymDescriptor("\u2191", false, 129))));
layout.keys.put(KeyEvent.VK_I, new KeyDescriptor(KeyEvent.VK_I, KeyEvent.getExtendedKeyCodeForChar(1080), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0438", false, 0), new KeySymDescriptor("\u0418", false, 1), new KeySymDescriptor("\u2192", false, 128))));
layout.keys.put(KeyEvent.VK_O, new KeyDescriptor(KeyEvent.VK_O, KeyEvent.getExtendedKeyCodeForChar(1086), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u043e", false, 0), new KeySymDescriptor("\u041e", false, 1), new KeySymDescriptor("\u00a7", false, 128))));
layout.keys.put(KeyEvent.VK_P, new KeyDescriptor(KeyEvent.VK_P, KeyEvent.getExtendedKeyCodeForChar(1087), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u043f", false, 0), new KeySymDescriptor("\u041f", false, 1))));
layout.keys.put(KeyEvent.VK_OPEN_BRACKET, new KeyDescriptor(KeyEvent.VK_OPEN_BRACKET, KeyEvent.getExtendedKeyCodeForChar(1096), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0448", false, 0), new KeySymDescriptor("\u0428", false, 1), new KeySymDescriptor("\u00f7", false, 128))));
layout.keys.put(KeyEvent.VK_CLOSE_BRACKET, new KeyDescriptor(KeyEvent.VK_CLOSE_BRACKET, KeyEvent.getExtendedKeyCodeForChar(1106), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0452", false, 0), new KeySymDescriptor("\u0402", false, 1), new KeySymDescriptor("\u00d7", false, 128))));
layout.keys.put(KeyEvent.VK_ENTER, new KeyDescriptor(KeyEvent.VK_ENTER, KeyEvent.VK_ENTER, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\r", false, 0))));
layout.keys.put(KeyEvent.VK_CONTROL, new KeyDescriptor(KeyEvent.VK_CONTROL, KeyEvent.VK_CONTROL, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_A, new KeyDescriptor(KeyEvent.VK_A, KeyEvent.getExtendedKeyCodeForChar(1072), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0430", false, 0), new KeySymDescriptor("\u0410", false, 1))));
layout.keys.put(KeyEvent.VK_S, new KeyDescriptor(KeyEvent.VK_S, KeyEvent.getExtendedKeyCodeForChar(1089), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0441", false, 0), new KeySymDescriptor("\u0421", false, 1), new KeySymDescriptor("\u201e", false, 128), new KeySymDescriptor("\u00bb", false, 129))));
layout.keys.put(KeyEvent.VK_D, new KeyDescriptor(KeyEvent.VK_D, KeyEvent.getExtendedKeyCodeForChar(1076), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0434", false, 0), new KeySymDescriptor("\u0414", false, 1), new KeySymDescriptor("\u201c", false, 128), new KeySymDescriptor("\u00ab", false, 129))));
layout.keys.put(KeyEvent.VK_F, new KeyDescriptor(KeyEvent.VK_F, KeyEvent.getExtendedKeyCodeForChar(1092), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0444", false, 0), new KeySymDescriptor("\u0424", false, 1), new KeySymDescriptor("[", false, 128))));
layout.keys.put(KeyEvent.VK_G, new KeyDescriptor(KeyEvent.VK_G, KeyEvent.getExtendedKeyCodeForChar(1075), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0433", false, 0), new KeySymDescriptor("\u0413", false, 1), new KeySymDescriptor("]", false, 128))));
layout.keys.put(KeyEvent.VK_H, new KeyDescriptor(KeyEvent.VK_H, KeyEvent.getExtendedKeyCodeForChar(1093), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0445", false, 0), new KeySymDescriptor("\u0425", false, 1))));
layout.keys.put(KeyEvent.VK_J, new KeyDescriptor(KeyEvent.VK_J, KeyEvent.getExtendedKeyCodeForChar(1112), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0458", false, 0), new KeySymDescriptor("\u0408", false, 1))));
layout.keys.put(KeyEvent.VK_K, new KeyDescriptor(KeyEvent.VK_K, KeyEvent.getExtendedKeyCodeForChar(1082), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u043a", false, 0), new KeySymDescriptor("\u041a", false, 1))));
layout.keys.put(KeyEvent.VK_L, new KeyDescriptor(KeyEvent.VK_L, KeyEvent.getExtendedKeyCodeForChar(1083), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u043b", false, 0), new KeySymDescriptor("\u041b", false, 1))));
layout.keys.put(KeyEvent.VK_SEMICOLON, new KeyDescriptor(KeyEvent.VK_SEMICOLON, KeyEvent.getExtendedKeyCodeForChar(1095), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0447", false, 0), new KeySymDescriptor("\u0427", false, 1))));
layout.keys.put(KeyEvent.VK_QUOTE, new KeyDescriptor(KeyEvent.VK_QUOTE, KeyEvent.getExtendedKeyCodeForChar(1115), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u045b", false, 0), new KeySymDescriptor("\u040b", false, 1))));
layout.keys.put(KeyEvent.VK_BACK_QUOTE, new KeyDescriptor(KeyEvent.VK_BACK_QUOTE, KeyEvent.VK_BACK_QUOTE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("`", false, 0), new KeySymDescriptor("~", false, 1), new KeySymDescriptor("\u00b0", false, 128), new KeySymDescriptor("\u00ac", false, 129))));
layout.keys.put(KeyEvent.VK_SHIFT, new KeyDescriptor(KeyEvent.VK_SHIFT, KeyEvent.VK_SHIFT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_BACK_SLASH, new KeyDescriptor(KeyEvent.VK_BACK_SLASH, KeyEvent.getExtendedKeyCodeForChar(1078), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0436", false, 0), new KeySymDescriptor("\u0416", false, 1), new KeySymDescriptor("\u00a4", false, 128))));
layout.keys.put(KeyEvent.VK_Z, new KeyDescriptor(KeyEvent.VK_Z, KeyEvent.getExtendedKeyCodeForChar(1078), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0436", false, 0), new KeySymDescriptor("\u0416", false, 1), new KeySymDescriptor("\u2018", false, 128))));
layout.keys.put(KeyEvent.VK_X, new KeyDescriptor(KeyEvent.VK_X, KeyEvent.getExtendedKeyCodeForChar(1119), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u045f", false, 0), new KeySymDescriptor("\u040f", false, 1), new KeySymDescriptor("\u2019", false, 128))));
layout.keys.put(KeyEvent.VK_C, new KeyDescriptor(KeyEvent.VK_C, KeyEvent.getExtendedKeyCodeForChar(1094), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0446", false, 0), new KeySymDescriptor("\u0426", false, 1), new KeySymDescriptor("\u00a2", false, 128), new KeySymDescriptor("\u00a9", false, 129))));
layout.keys.put(KeyEvent.VK_V, new KeyDescriptor(KeyEvent.VK_V, KeyEvent.getExtendedKeyCodeForChar(1074), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0432", false, 0), new KeySymDescriptor("\u0412", false, 1), new KeySymDescriptor("@", false, 128))));
layout.keys.put(KeyEvent.VK_B, new KeyDescriptor(KeyEvent.VK_B, KeyEvent.getExtendedKeyCodeForChar(1073), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u0431", false, 0), new KeySymDescriptor("\u0411", false, 1), new KeySymDescriptor("{", false, 128))));
layout.keys.put(KeyEvent.VK_N, new KeyDescriptor(KeyEvent.VK_N, KeyEvent.getExtendedKeyCodeForChar(1085), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u043d", false, 0), new KeySymDescriptor("\u041d", false, 1), new KeySymDescriptor("}", false, 128))));
layout.keys.put(KeyEvent.VK_M, new KeyDescriptor(KeyEvent.VK_M, KeyEvent.getExtendedKeyCodeForChar(1084), KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u043c", false, 0), new KeySymDescriptor("\u041c", false, 1), new KeySymDescriptor("^", false, 128))));
layout.keys.put(KeyEvent.VK_COMMA, new KeyDescriptor(KeyEvent.VK_COMMA, KeyEvent.VK_COMMA, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor(",", false, 0), new KeySymDescriptor(";", false, 1), new KeySymDescriptor("<", false, 128))));
layout.keys.put(KeyEvent.VK_PERIOD, new KeyDescriptor(KeyEvent.VK_PERIOD, KeyEvent.VK_PERIOD, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor(".", false, 0), new KeySymDescriptor(":", false, 1), new KeySymDescriptor(">", false, 128))));
layout.keys.put(KeyEvent.VK_SLASH, new KeyDescriptor(KeyEvent.VK_SLASH, KeyEvent.VK_MINUS, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("-", false, 0), new KeySymDescriptor("_", false, 1), new KeySymDescriptor("\u2014", false, 128), new KeySymDescriptor("\u2013", false, 129))));
layout.keys.put(KeyEvent.VK_MULTIPLY, new KeyDescriptor(KeyEvent.VK_MULTIPLY, KeyEvent.VK_MULTIPLY, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("*", false, 0), new KeySymDescriptor("*", false, 1), new KeySymDescriptor("*", false, 128), new KeySymDescriptor("*", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_ALT, new KeyDescriptor(KeyEvent.VK_ALT, KeyEvent.VK_ALT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1))));
layout.keys.put(KeyEvent.VK_SPACE, new KeyDescriptor(KeyEvent.VK_SPACE, KeyEvent.VK_SPACE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor(" ", false, 0))));
layout.keys.put(KeyEvent.VK_CAPS_LOCK, new KeyDescriptor(KeyEvent.VK_CAPS_LOCK, KeyEvent.VK_CAPS_LOCK, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F1, new KeyDescriptor(KeyEvent.VK_F1, KeyEvent.VK_F1, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F2, new KeyDescriptor(KeyEvent.VK_F2, KeyEvent.VK_F2, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F3, new KeyDescriptor(KeyEvent.VK_F3, KeyEvent.VK_F3, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F4, new KeyDescriptor(KeyEvent.VK_F4, KeyEvent.VK_F4, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F5, new KeyDescriptor(KeyEvent.VK_F5, KeyEvent.VK_F5, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F6, new KeyDescriptor(KeyEvent.VK_F6, KeyEvent.VK_F6, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F7, new KeyDescriptor(KeyEvent.VK_F7, KeyEvent.VK_F7, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F8, new KeyDescriptor(KeyEvent.VK_F8, KeyEvent.VK_F8, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F9, new KeyDescriptor(KeyEvent.VK_F9, KeyEvent.VK_F9, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F10, new KeyDescriptor(KeyEvent.VK_F10, KeyEvent.VK_F10, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_NUM_LOCK, new KeyDescriptor(KeyEvent.VK_NUM_LOCK, KeyEvent.VK_NUM_LOCK, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_NUMPAD7, new KeyDescriptor(KeyEvent.VK_NUMPAD7, KeyEvent.VK_HOME, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("7", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD8, new KeyDescriptor(KeyEvent.VK_NUMPAD8, KeyEvent.VK_KP_UP, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("8", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD9, new KeyDescriptor(KeyEvent.VK_NUMPAD9, KeyEvent.VK_PAGE_UP, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("9", false, 16))));
layout.keys.put(KeyEvent.VK_SUBTRACT, new KeyDescriptor(KeyEvent.VK_SUBTRACT, KeyEvent.VK_SUBTRACT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("-", false, 0), new KeySymDescriptor("-", false, 1), new KeySymDescriptor("-", false, 128), new KeySymDescriptor("-", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_NUMPAD4, new KeyDescriptor(KeyEvent.VK_NUMPAD4, KeyEvent.VK_KP_LEFT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("4", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD5, new KeyDescriptor(KeyEvent.VK_NUMPAD5, KeyEvent.VK_BEGIN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("5", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD6, new KeyDescriptor(KeyEvent.VK_NUMPAD6, KeyEvent.VK_KP_RIGHT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("6", false, 16))));
layout.keys.put(KeyEvent.VK_ADD, new KeyDescriptor(KeyEvent.VK_ADD, KeyEvent.VK_ADD, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("+", false, 0), new KeySymDescriptor("+", false, 1), new KeySymDescriptor("+", false, 128), new KeySymDescriptor("+", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_NUMPAD1, new KeyDescriptor(KeyEvent.VK_NUMPAD1, KeyEvent.VK_END, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("1", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD2, new KeyDescriptor(KeyEvent.VK_NUMPAD2, KeyEvent.VK_KP_DOWN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("2", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD3, new KeyDescriptor(KeyEvent.VK_NUMPAD3, KeyEvent.VK_PAGE_DOWN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("3", false, 16))));
layout.keys.put(KeyEvent.VK_NUMPAD0, new KeyDescriptor(KeyEvent.VK_NUMPAD0, KeyEvent.VK_INSERT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("0", false, 16))));
layout.keys.put(KeyEvent.VK_DECIMAL, new KeyDescriptor(KeyEvent.VK_DECIMAL, KeyEvent.VK_DELETE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor(",", false, 16))));
layout.keys.put(KeyEvent.VK_LESS, new KeyDescriptor(KeyEvent.VK_LESS, KeyEvent.VK_LESS, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("<", false, 0), new KeySymDescriptor(">", false, 1), new KeySymDescriptor("|", false, 128), new KeySymDescriptor("\u00a6", false, 129))));
layout.keys.put(KeyEvent.VK_F11, new KeyDescriptor(KeyEvent.VK_F11, KeyEvent.VK_F11, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_F12, new KeyDescriptor(KeyEvent.VK_F12, KeyEvent.VK_F12, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 1), new KeySymDescriptor("", false, 128), new KeySymDescriptor("", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_DIVIDE, new KeyDescriptor(KeyEvent.VK_DIVIDE, KeyEvent.VK_DIVIDE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("/", false, 0), new KeySymDescriptor("/", false, 1), new KeySymDescriptor("/", false, 128), new KeySymDescriptor("/", false, 129), new KeySymDescriptor("", false, 12))));
layout.keys.put(KeyEvent.VK_PRINTSCREEN, new KeyDescriptor(KeyEvent.VK_PRINTSCREEN, KeyEvent.VK_PRINTSCREEN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 8))));
layout.keys.put(KeyEvent.VK_ALT_GRAPH, new KeyDescriptor(KeyEvent.VK_ALT_GRAPH, KeyEvent.VK_ALT_GRAPH, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_HOME, new KeyDescriptor(KeyEvent.VK_HOME, KeyEvent.VK_HOME, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_UP, new KeyDescriptor(KeyEvent.VK_UP, KeyEvent.VK_UP, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_PAGE_UP, new KeyDescriptor(KeyEvent.VK_PAGE_UP, KeyEvent.VK_PAGE_UP, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_LEFT, new KeyDescriptor(KeyEvent.VK_LEFT, KeyEvent.VK_LEFT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_RIGHT, new KeyDescriptor(KeyEvent.VK_RIGHT, KeyEvent.VK_RIGHT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_END, new KeyDescriptor(KeyEvent.VK_END, KeyEvent.VK_END, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_DOWN, new KeyDescriptor(KeyEvent.VK_DOWN, KeyEvent.VK_DOWN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_PAGE_DOWN, new KeyDescriptor(KeyEvent.VK_PAGE_DOWN, KeyEvent.VK_PAGE_DOWN, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_INSERT, new KeyDescriptor(KeyEvent.VK_INSERT, KeyEvent.VK_INSERT, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_DELETE, new KeyDescriptor(KeyEvent.VK_DELETE, KeyEvent.VK_DELETE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("\u007f", false, 0))));
layout.keys.put(KeyEvent.VK_PAUSE, new KeyDescriptor(KeyEvent.VK_PAUSE, KeyEvent.VK_PAUSE, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0), new KeySymDescriptor("", false, 4))));
layout.keys.put(KeyEvent.VK_META, new KeyDescriptor(KeyEvent.VK_META, KeyEvent.VK_WINDOWS, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_WINDOWS, new KeyDescriptor(KeyEvent.VK_WINDOWS, KeyEvent.VK_WINDOWS, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F13, new KeyDescriptor(KeyEvent.VK_F13, KeyEvent.VK_F13, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F14, new KeyDescriptor(KeyEvent.VK_F14, KeyEvent.VK_F14, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F15, new KeyDescriptor(KeyEvent.VK_F15, KeyEvent.VK_F15, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F16, new KeyDescriptor(KeyEvent.VK_F16, KeyEvent.VK_F16, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F17, new KeyDescriptor(KeyEvent.VK_F17, KeyEvent.VK_F17, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F18, new KeyDescriptor(KeyEvent.VK_F18, KeyEvent.VK_F18, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F20, new KeyDescriptor(KeyEvent.VK_F20, KeyEvent.VK_F20, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F21, new KeyDescriptor(KeyEvent.VK_F21, KeyEvent.VK_F21, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F22, new KeyDescriptor(KeyEvent.VK_F22, KeyEvent.VK_F22, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layout.keys.put(KeyEvent.VK_F23, new KeyDescriptor(KeyEvent.VK_F23, KeyEvent.VK_F23, KeyEvent.VK_UNDEFINED, List.of(new KeySymDescriptor("", false, 0))));
layouts.add(layout);
}
}
}