ANDROID: Fix shifted keys and key combos

This commit is contained in:
antoniou 2020-10-17 19:02:28 +03:00
parent 5118c76ce0
commit 87a76f4a56
6 changed files with 238 additions and 123 deletions

View File

@ -20,6 +20,7 @@ import android.net.wifi.WifiManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.SystemClock;
import android.util.DisplayMetrics;
import android.util.Log;
import android.util.TypedValue;
@ -51,6 +52,7 @@ import java.io.OutputStream;
import java.io.Reader;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Properties;
@ -147,6 +149,7 @@ public class ScummVMActivity extends Activity implements OnKeyboardVisibilityLis
public boolean shift = false;
public boolean alt = false;
public final TreeSet<Integer> stickyKeys = new TreeSet<>();
public long mEventTime = -1;
public BuiltInKeyboardView(Context context, android.util.AttributeSet attrs) {
super(context, attrs);
@ -162,6 +165,76 @@ public class ScummVMActivity extends Activity implements OnKeyboardVisibilityLis
return false;
}
public int getCompiledMetaState() {
int retCompiledMetaState = 0;
// search in the list of currently "ON" sticky keys to set the meta flags
for (int stickyActiveKeyCode : stickyKeys) {
switch (stickyActiveKeyCode) {
case KeyEvent.KEYCODE_SHIFT_LEFT:
retCompiledMetaState|= KeyEvent.META_SHIFT_LEFT_ON;
break;
case KeyEvent.KEYCODE_SHIFT_RIGHT:
retCompiledMetaState|= KeyEvent.META_SHIFT_RIGHT_ON;
break;
case KeyEvent.KEYCODE_CTRL_LEFT:
retCompiledMetaState|= KeyEvent.META_CTRL_LEFT_ON;
break;
case KeyEvent.KEYCODE_CTRL_RIGHT:
retCompiledMetaState|= KeyEvent.META_CTRL_RIGHT_ON;
break;
case KeyEvent.KEYCODE_ALT_LEFT:
retCompiledMetaState|= KeyEvent.META_ALT_LEFT_ON;
break;
case KeyEvent.KEYCODE_ALT_RIGHT:
retCompiledMetaState|= KeyEvent.META_ALT_RIGHT_ON;
break;
case KeyEvent.KEYCODE_META_LEFT:
retCompiledMetaState|= KeyEvent.META_META_LEFT_ON;
break;
case KeyEvent.KEYCODE_META_RIGHT:
retCompiledMetaState|= KeyEvent.META_META_RIGHT_ON;
break;
case KeyEvent.KEYCODE_CAPS_LOCK:
retCompiledMetaState|= KeyEvent.META_CAPS_LOCK_ON;
break;
case KeyEvent.KEYCODE_NUM_LOCK:
retCompiledMetaState|= KeyEvent.META_NUM_LOCK_ON;
break;
case KeyEvent.KEYCODE_SCROLL_LOCK:
retCompiledMetaState|= KeyEvent.META_SCROLL_LOCK_ON;
break;
case KeyEvent.KEYCODE_SYM:
// TODO Do we have or need a SYM key?
retCompiledMetaState|= KeyEvent.META_SYM_ON;
break;
default: break;
}
}
if (shift && !alt) {
retCompiledMetaState |= KeyEvent.META_SHIFT_LEFT_ON;
}
return retCompiledMetaState;
}
public void recheckStickyKeys() {
// setting sticky keys to their proper on or off state
// h
boolean atLeastOneStickyKeyWasChanged = false;
for (CustomKeyboard.CustomKey k: getKeyboard().getKeys()) {
if (stickyKeys.contains(k.codes[0]) && !k.on) {
k.on = true;
atLeastOneStickyKeyWasChanged = true;
} else if (!stickyKeys.contains(k.codes[0]) && k.sticky && k.on) {
k.on = false;
atLeastOneStickyKeyWasChanged = true;
}
}
if (atLeastOneStickyKeyWasChanged) {
invalidateAllKeys();
}
}
public void ChangeKeyboard() {
// Called when bringing up the keyboard
// or pressing one of the special keyboard keys that change the layout (eg "123...")
@ -170,12 +243,12 @@ public class ScummVMActivity extends Activity implements OnKeyboardVisibilityLis
setKeyboard(new CustomKeyboard(ScummVMActivity.this, TextInputKeyboardList[idx][keyboard]));
setPreviewEnabled(false);
setProximityCorrectionEnabled(false);
for (CustomKeyboard.CustomKey k: getKeyboard().getKeys()) {
if (stickyKeys.contains(k.codes[0])) {
k.on = true;
invalidateAllKeys();
}
}
// setKeyboard() already invalidates all keys,
// here we check for our memory of sticky keys state (and any that changed to on and were added to stickyKeys Set)
recheckStickyKeys();
//ScummVMActivity.this._scummvm.displayMessageOnOSD ("NEW KEYBOARD LAYOUT: QWERTY"
// + (alt ? " ALT " : "") + (shift? " SHIFT" : ""));
}
}
@ -185,93 +258,131 @@ public class ScummVMActivity extends Activity implements OnKeyboardVisibilityLis
builtinKeyboard.setOnKeyboardActionListener(new CustomKeyboardView.OnKeyboardActionListener() {
public void onPress(int key) {
Log.d(ScummVM.LOG_TAG, "SHOW KEYBOARD - 001 - onPress key: " + key ); // CALLED
//Log.d(ScummVM.LOG_TAG, "SHOW KEYBOARD - 001 - onPress key: " + key ); // CALLED
if (key == KeyEvent.KEYCODE_BACK) {
return;
}
if (key < 0) {
if (key <= 0) {
return;
}
for (CustomKeyboard.CustomKey k: builtinKeyboard.getKeyboard().getKeys()) {
if (k.sticky && key == k.codes[0])
if (k.sticky && key == k.codes[0]) {
return;
}
}
int compiledMetaState = builtinKeyboard.getCompiledMetaState();
// keys with keyCode greater than 100000, should be submitted with a LEFT_SHIFT_ modifier (and decreased by 100000 to get their proper code)
if (key > 100000) {
key -= 100000;
_main_surface.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_SHIFT_LEFT));
compiledMetaState |= KeyEvent.META_SHIFT_LEFT_ON;
}
_main_surface.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, key));
//
// downTime (long) - The time (in SystemClock.uptimeMillis()) at which this key code originally went down.
// ** Since this is a down event, this will be the same as getEventTime(). **
// Note that when chording keys, this value is the down time of the most recently pressed key, which may not be the same physical key of this event.
// eventTime (long) - The time (in SystemClock.uptimeMillis()) at which this event happened.
// TODO update repeat and event time? with
builtinKeyboard.mEventTime = SystemClock.uptimeMillis();
KeyEvent compiledKeyEvent = new KeyEvent(builtinKeyboard.mEventTime,
builtinKeyboard.mEventTime,
KeyEvent.ACTION_DOWN,
key,
0,
compiledMetaState);
_main_surface.dispatchKeyEvent(compiledKeyEvent);
}
public void onRelease(int key) {
Log.d(ScummVM.LOG_TAG, "SHOW KEYBOARD - 001 - onRelease key: " + key );
//Log.d(ScummVM.LOG_TAG, "SHOW KEYBOARD - 001 - onRelease key: " + key );
if (key == KeyEvent.KEYCODE_BACK) {
builtinKeyboard.setOnKeyboardActionListener(null);
showScreenKeyboardWithoutTextInputField(0); // Hide keyboard
return;
}
// CustomKeyboard.KEYCODE_SHIFT is a special button (negative value)
// which basically changes the keyboard to a another,"SHIFTED", layout (other keys)
// In this layout, if it's NOT also an "ALT" layout, keys are assumed to get the LEFT SHIFT modifier by default
if (key == CustomKeyboard.KEYCODE_SHIFT) {
builtinKeyboard.shift = ! builtinKeyboard.shift;
if (builtinKeyboard.shift && !builtinKeyboard.alt) {
_main_surface.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_SHIFT_LEFT));
} else {
_main_surface.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_SHIFT_LEFT));
}
builtinKeyboard.shift = !builtinKeyboard.shift;
builtinKeyboard.ChangeKeyboard();
return;
}
if (key == CustomKeyboard.KEYCODE_ALT) {
builtinKeyboard.alt = ! builtinKeyboard.alt;
if (builtinKeyboard.alt) {
_main_surface.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_SHIFT_LEFT));
} else {
builtinKeyboard.alt = !builtinKeyboard.alt;
if (!builtinKeyboard.alt) {
builtinKeyboard.shift = false;
}
builtinKeyboard.ChangeKeyboard();
return;
}
if (key < 0) {
if (key <= 0) {
return;
}
//
// TODO - Probably remove keys like caps lock, scroll lock, num lock, print etc...
//
for (CustomKeyboard.CustomKey k: builtinKeyboard.getKeyboard().getKeys()) {
if (k.sticky && key == k.codes[0]) {
if (k.on) {
builtinKeyboard.stickyKeys.add(key);
_main_surface.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, key));
} else {
if (builtinKeyboard.stickyKeys.contains(key)) {
// if it was "remembered" (in stickyKeys set) as ON
// (and it off by removing them from stickyKeys set)
builtinKeyboard.stickyKeys.remove(key);
_main_surface.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, key));
} else {
// if it was "remembered" (in stickyKeys set) as OFF
// (turn it on by adding them to stickyKeys set)
builtinKeyboard.stickyKeys.add(key);
}
builtinKeyboard.recheckStickyKeys();
return;
}
}
boolean shifted = false;
int compiledMetaState = builtinKeyboard.getCompiledMetaState();
//boolean shifted = false;
if (key > 100000) {
key -= 100000;
shifted = true;
//shifted = true;
compiledMetaState |= KeyEvent.META_SHIFT_LEFT_ON;
}
_main_surface.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, key));
// TODO properly set repeat value?
KeyEvent compiledKeyEvent = new KeyEvent(builtinKeyboard.mEventTime,
SystemClock.uptimeMillis(),
KeyEvent.ACTION_UP,
key,
0,
compiledMetaState);
if (shifted) {
_main_surface.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_SHIFT_LEFT));
builtinKeyboard.stickyKeys.remove(KeyEvent.KEYCODE_SHIFT_LEFT);
for (CustomKeyboard.CustomKey k: builtinKeyboard.getKeyboard().getKeys())
{
if (k.sticky && k.codes[0] == KeyEvent.KEYCODE_SHIFT_LEFT && k.on)
{
k.on = false;
builtinKeyboard.invalidateAllKeys();
_main_surface.dispatchKeyEvent(compiledKeyEvent);
builtinKeyboard.mEventTime = -1; // reset event time
// Excluding the CAPS LOCK NUM LOCK AND SCROLL LOCK keys,
// clear the state of all other sticky keys that are used in a key combo
// when we reach this part of the code
if (builtinKeyboard.stickyKeys.size() > 0) {
HashSet<Integer> stickiesToReleaseSet = new HashSet<>();
for (int tmpKeyCode : builtinKeyboard.stickyKeys) {
if (tmpKeyCode != KeyEvent.KEYCODE_CAPS_LOCK
&& tmpKeyCode != KeyEvent.KEYCODE_NUM_LOCK
&& tmpKeyCode != KeyEvent.KEYCODE_SCROLL_LOCK) {
stickiesToReleaseSet.add(tmpKeyCode);
}
}
if (stickiesToReleaseSet.size() > 0) {
builtinKeyboard.stickyKeys.removeAll(stickiesToReleaseSet);
builtinKeyboard.recheckStickyKeys();
}
}
}
@ -324,11 +435,11 @@ public class ScummVMActivity extends Activity implements OnKeyboardVisibilityLis
if (bGlobalsCompatibilityHacksTextInputEmulatesHwKeyboard) {
showScreenKeyboardWithoutTextInputField(dGlobalsTextInputKeyboard);
Log.d(ScummVM.LOG_TAG, "showScreenKeyboard - showScreenKeyboardWithoutTextInputField()");
//Log.d(ScummVM.LOG_TAG, "showScreenKeyboard - showScreenKeyboardWithoutTextInputField()");
_main_surface.captureMouse(false);
return;
}
Log.d(ScummVM.LOG_TAG, "showScreenKeyboard: YOU SHOULD NOT SEE ME!!!");
//Log.d(ScummVM.LOG_TAG, "showScreenKeyboard: YOU SHOULD NOT SEE ME!!!");
// // TODO redundant ?
// if (_screenKeyboard != null) {

View File

@ -289,6 +289,7 @@ public class ScummVMEventsBase implements
break;
}
// look in events.cpp for how this is handled
_scummvm.pushEvent(type, action, keyCode,
e.getUnicodeChar() & KeyCharacterMap.COMBINING_ACCENT_MASK,
e.getMetaState(), e.getRepeatCount(),

View File

@ -6,7 +6,7 @@
scummvm:verticalGap="0px"
scummvm:keyHeight="10%p">
<CustomRow>
<CustomKey scummvm:codes="45" scummvm:keyLabel="q" scummvm:keyEdgeFlags="left" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="45" scummvm:keyLabel="q" scummvm:isRepeatable="true" scummvm:keyEdgeFlags="left"/>
<CustomKey scummvm:codes="51" scummvm:keyLabel="w" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="33" scummvm:keyLabel="e" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="46" scummvm:keyLabel="r" scummvm:isRepeatable="true"/>
@ -15,10 +15,10 @@
<CustomKey scummvm:codes="49" scummvm:keyLabel="u" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="37" scummvm:keyLabel="i" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="43" scummvm:keyLabel="o" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="44" scummvm:keyLabel="p" scummvm:keyEdgeFlags="right" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="44" scummvm:keyLabel="p" scummvm:isRepeatable="true" scummvm:keyEdgeFlags="right"/>
</CustomRow>
<CustomRow>
<CustomKey scummvm:codes="29" scummvm:keyLabel="a" scummvm:keyEdgeFlags="left" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="29" scummvm:keyLabel="a" scummvm:isRepeatable="true" scummvm:keyEdgeFlags="left"/>
<CustomKey scummvm:codes="47" scummvm:keyLabel="s" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="32" scummvm:keyLabel="d" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="34" scummvm:keyLabel="f" scummvm:isRepeatable="true"/>
@ -27,7 +27,7 @@
<CustomKey scummvm:codes="38" scummvm:keyLabel="j" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="39" scummvm:keyLabel="k" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="40" scummvm:keyLabel="l" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="74" scummvm:keyLabel=";" scummvm:keyEdgeFlags="right" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="74" scummvm:keyLabel=";" scummvm:isRepeatable="true" scummvm:keyEdgeFlags="right"/>
</CustomRow>
<CustomRow>
<CustomKey scummvm:codes="-1" scummvm:keyLabel="⇪" scummvm:keyEdgeFlags="left"/>
@ -38,16 +38,16 @@
<CustomKey scummvm:codes="30" scummvm:keyLabel="b" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="42" scummvm:keyLabel="n" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="41" scummvm:keyLabel="m" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="67" scummvm:keyLabel="⬅" scummvm:keyWidth="20%p" scummvm:keyEdgeFlags="right" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="67" scummvm:keyLabel="⬅" scummvm:isRepeatable="true" scummvm:keyWidth="20%p" scummvm:keyEdgeFlags="right"/>
</CustomRow>
<CustomRow rowEdgeFlags="bottom">
<CustomKey scummvm:codes="-6" scummvm:keyLabel="123…" scummvm:keyEdgeFlags="left"/>
<CustomKey scummvm:codes="71" scummvm:keyLabel="[" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="72" scummvm:keyLabel="]" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="76" scummvm:keyLabel="/" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="62" scummvm:keyLabel="Space" scummvm:keyWidth="20%p" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="55" scummvm:keyLabel="," scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="56" scummvm:keyLabel="." scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="66" scummvm:keyLabel="Enter" scummvm:keyWidth="20%p" scummvm:keyEdgeFlags="right" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="-6" scummvm:keyLabel="123…" scummvm:keyEdgeFlags="left"/>
<CustomKey scummvm:codes="71" scummvm:keyLabel="[" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="72" scummvm:keyLabel="]" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="76" scummvm:keyLabel="/" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="62" scummvm:keyLabel="Space" scummvm:isRepeatable="true" scummvm:keyWidth="20%p"/>
<CustomKey scummvm:codes="55" scummvm:keyLabel="," scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="56" scummvm:keyLabel="." scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="66" scummvm:keyLabel="Enter" scummvm:isRepeatable="true" scummvm:keyWidth="20%p" scummvm:keyEdgeFlags="right"/>
</CustomRow>
</CustomKeyboard>

View File

@ -6,7 +6,7 @@
scummvm:verticalGap="0px"
scummvm:keyHeight="10%p">
<CustomRow>
<CustomKey scummvm:codes="8" scummvm:keyLabel="1" scummvm:keyEdgeFlags="left" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="8" scummvm:keyLabel="1" scummvm:isRepeatable="true" scummvm:keyEdgeFlags="left"/>
<CustomKey scummvm:codes="9" scummvm:keyLabel="2" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="10" scummvm:keyLabel="3" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="11" scummvm:keyLabel="4" scummvm:isRepeatable="true"/>
@ -15,41 +15,44 @@
<CustomKey scummvm:codes="14" scummvm:keyLabel="7" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="15" scummvm:keyLabel="8" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="16" scummvm:keyLabel="9" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="7" scummvm:keyLabel="0" scummvm:keyEdgeFlags="right" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="7" scummvm:keyLabel="0" scummvm:isRepeatable="true" scummvm:keyEdgeFlags="right"/>
</CustomRow>
<CustomRow>
<CustomKey scummvm:codes="111" scummvm:keyLabel="Esc" scummvm:keyEdgeFlags="left" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="68" scummvm:keyLabel="`" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="69" scummvm:keyLabel="-" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="70" scummvm:keyLabel="=" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="73" scummvm:keyLabel="\\" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="124" scummvm:keyLabel="Ins" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="111" scummvm:keyLabel="Esc" scummvm:isRepeatable="true" scummvm:keyEdgeFlags="left"/>
<CustomKey scummvm:codes="68" scummvm:keyLabel="`" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="69" scummvm:keyLabel="-" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="70" scummvm:keyLabel="=" scummvm:isRepeatable="true"/>
<!-- The "\" character is used as a special key to fix a bug with backspace usage,
so it's ignored in the input and thus we don't show it on the virtual keyboard either -->
<!-- <CustomKey scummvm:codes="73" scummvm:keyLabel="\\" scummvm:isRepeatable="true"/> -->
<CustomKey scummvm:codes="76" scummvm:keyLabel="/" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="124" scummvm:keyLabel="Ins" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="92" scummvm:keyLabel="PgUp" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="122" scummvm:keyLabel="Home" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="19" scummvm:keyLabel="↑" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="123" scummvm:keyLabel="End" scummvm:isRepeatable="true" scummvm:keyEdgeFlags="right" />
<CustomKey scummvm:codes="19" scummvm:keyLabel="↑" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="123" scummvm:keyLabel="End" scummvm:isRepeatable="true" scummvm:keyEdgeFlags="right" />
</CustomRow>
<CustomRow>
<CustomKey scummvm:codes="-1" scummvm:keyLabel="!@#…" scummvm:keyEdgeFlags="left"/>
<CustomKey scummvm:codes="75" scummvm:keyLabel="'" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="100075" scummvm:keyLabel="&quot;" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="61" scummvm:keyLabel="Tab" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="115" scummvm:keyLabel="CapsLk" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="112" scummvm:keyLabel="Del" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="93" scummvm:keyLabel="PgDn" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="21" scummvm:keyLabel="←" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="20" scummvm:keyLabel="↓" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="22" scummvm:keyLabel="→" scummvm:keyEdgeFlags="right" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="-1" scummvm:keyLabel="!@#…" scummvm:keyEdgeFlags="left"/>
<CustomKey scummvm:codes="75" scummvm:keyLabel="'" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="100075" scummvm:keyLabel="&quot;" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="61" scummvm:keyLabel="Tab" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="115" scummvm:keyLabel="CapsLk" scummvm:isSticky="true" />
<CustomKey scummvm:codes="112" scummvm:keyLabel="Del" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="93" scummvm:keyLabel="PgDn" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="21" scummvm:keyLabel="←" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="20" scummvm:keyLabel="↓" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="22" scummvm:keyLabel="→" scummvm:isRepeatable="true" scummvm:keyEdgeFlags="right"/>
</CustomRow>
<CustomRow rowEdgeFlags="bottom">
<CustomKey scummvm:codes="-6" scummvm:keyLabel="abc…" scummvm:keyEdgeFlags="left"/>
<CustomKey scummvm:codes="59" scummvm:keyLabel="Shift" scummvm:isSticky="true"/>
<CustomKey scummvm:codes="113" scummvm:keyLabel="Ctrl" scummvm:isSticky="true"/>
<CustomKey scummvm:codes="117" scummvm:keyLabel="Meta" scummvm:isSticky="true"/>
<CustomKey scummvm:codes="117" scummvm:keyLabel="Meta" scummvm:isSticky="true"/>
<CustomKey scummvm:codes="57" scummvm:keyLabel="Alt" scummvm:isSticky="true"/>
<CustomKey scummvm:codes="58" scummvm:keyLabel="Alt" scummvm:isSticky="true"/>
<CustomKey scummvm:codes="118" scummvm:keyLabel="Meta" scummvm:isSticky="true"/>
<CustomKey scummvm:codes="226" scummvm:keyLabel="Menu" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="118" scummvm:keyLabel="Meta" scummvm:isSticky="true"/>
<CustomKey scummvm:codes="226" scummvm:keyLabel="Menu" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="114" scummvm:keyLabel="Ctrl" scummvm:isSticky="true"/>
<CustomKey scummvm:codes="60" scummvm:keyLabel="Shift" scummvm:isSticky="true"/>
</CustomRow>

View File

@ -6,40 +6,40 @@
scummvm:verticalGap="0px"
scummvm:keyHeight="10%p">
<CustomRow>
<CustomKey scummvm:codes="100008" scummvm:keyLabel="!" scummvm:keyEdgeFlags="left" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="100009" scummvm:keyLabel="\@" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="100010" scummvm:keyLabel="#" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="100011" scummvm:keyLabel="$" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="100012" scummvm:keyLabel="%" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="100013" scummvm:keyLabel="^" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="100008" scummvm:keyLabel="!" scummvm:isRepeatable="true" scummvm:keyEdgeFlags="left"/>
<CustomKey scummvm:codes="100009" scummvm:keyLabel="\@" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="100010" scummvm:keyLabel="#" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="100011" scummvm:keyLabel="$" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="100012" scummvm:keyLabel="%" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="100013" scummvm:keyLabel="^" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="100014" scummvm:keyLabel="&amp;" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="100015" scummvm:keyLabel="*" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="100016" scummvm:keyLabel="(" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="100007" scummvm:keyLabel=")" scummvm:keyEdgeFlags="right" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="100015" scummvm:keyLabel="*" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="100016" scummvm:keyLabel="(" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="100007" scummvm:keyLabel=")" scummvm:isRepeatable="true" scummvm:keyEdgeFlags="right"/>
</CustomRow>
<CustomRow>
<CustomKey scummvm:codes="111" scummvm:keyLabel="Esc" scummvm:keyEdgeFlags="left" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="100068" scummvm:keyLabel="~" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="100069" scummvm:keyLabel="_" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="100070" scummvm:keyLabel="+" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="100073" scummvm:keyLabel="|" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="111" scummvm:keyLabel="Esc" scummvm:isRepeatable="true" scummvm:keyEdgeFlags="left"/>
<CustomKey scummvm:codes="100068" scummvm:keyLabel="~" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="100069" scummvm:keyLabel="_" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="100070" scummvm:keyLabel="+" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="100073" scummvm:keyLabel="|" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="100075" scummvm:keyLabel="&quot;" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="131" scummvm:keyLabel="F1" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="132" scummvm:keyLabel="F2" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="133" scummvm:keyLabel="F3" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="134" scummvm:keyLabel="F4" scummvm:isRepeatable="true" scummvm:keyEdgeFlags="right" />
<CustomKey scummvm:codes="131" scummvm:keyLabel="F1" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="132" scummvm:keyLabel="F2" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="133" scummvm:keyLabel="F3" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="134" scummvm:keyLabel="F4" scummvm:isRepeatable="true" scummvm:keyEdgeFlags="right"/>
</CustomRow>
<CustomRow>
<CustomKey scummvm:codes="-1" scummvm:keyLabel="123…" scummvm:keyEdgeFlags="left"/>
<CustomKey scummvm:codes="143" scummvm:keyLabel="NumLk" scummvm:isSticky="true"/>
<CustomKey scummvm:codes="120" scummvm:keyLabel="Print" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="116" scummvm:keyLabel="ScrollLk" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="121" scummvm:keyLabel="Pause" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="158" scummvm:keyLabel="Kp ." scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="135" scummvm:keyLabel="F5" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="136" scummvm:keyLabel="F6" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="137" scummvm:keyLabel="F7" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="138" scummvm:keyLabel="F8" scummvm:keyEdgeFlags="right" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="-1" scummvm:keyLabel="123…" scummvm:keyEdgeFlags="left"/>
<CustomKey scummvm:codes="143" scummvm:keyLabel="NumLk" scummvm:isSticky="true"/>
<CustomKey scummvm:codes="120" scummvm:keyLabel="Print" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="116" scummvm:keyLabel="ScrollLk" scummvm:isSticky="true"/>
<CustomKey scummvm:codes="121" scummvm:keyLabel="Pause" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="158" scummvm:keyLabel="Kp ." scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="135" scummvm:keyLabel="F5" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="136" scummvm:keyLabel="F6" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="137" scummvm:keyLabel="F7" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="138" scummvm:keyLabel="F8" scummvm:isRepeatable="true" scummvm:keyEdgeFlags="right"/>
</CustomRow>
<CustomRow rowEdgeFlags="bottom">
<CustomKey scummvm:codes="-6" scummvm:keyLabel="abc…" scummvm:keyEdgeFlags="left"/>
@ -48,9 +48,9 @@
<CustomKey scummvm:codes="156" scummvm:keyLabel="Kp -" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="157" scummvm:keyLabel="Kp +" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="160" scummvm:keyLabel="Kp ↵" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="139" scummvm:keyLabel="F9" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="140" scummvm:keyLabel="F10" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="141" scummvm:keyLabel="F11" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="142" scummvm:keyLabel="F12" scummvm:keyEdgeFlags="right" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="139" scummvm:keyLabel="F9" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="140" scummvm:keyLabel="F10" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="141" scummvm:keyLabel="F11" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="142" scummvm:keyLabel="F12" scummvm:isRepeatable="true" scummvm:keyEdgeFlags="right" />
</CustomRow>
</CustomKeyboard>

View File

@ -6,7 +6,7 @@
scummvm:verticalGap="0px"
scummvm:keyHeight="10%p">
<CustomRow>
<CustomKey scummvm:codes="45" scummvm:keyLabel="Q" scummvm:keyEdgeFlags="left" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="45" scummvm:keyLabel="Q" scummvm:isRepeatable="true" scummvm:keyEdgeFlags="left"/>
<CustomKey scummvm:codes="51" scummvm:keyLabel="W" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="33" scummvm:keyLabel="E" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="46" scummvm:keyLabel="R" scummvm:isRepeatable="true"/>
@ -15,10 +15,10 @@
<CustomKey scummvm:codes="49" scummvm:keyLabel="U" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="37" scummvm:keyLabel="I" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="43" scummvm:keyLabel="O" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="44" scummvm:keyLabel="P" scummvm:keyEdgeFlags="right" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="44" scummvm:keyLabel="P" scummvm:isRepeatable="true" scummvm:keyEdgeFlags="right"/>
</CustomRow>
<CustomRow>
<CustomKey scummvm:codes="29" scummvm:keyLabel="A" scummvm:keyEdgeFlags="left" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="29" scummvm:keyLabel="A" scummvm:isRepeatable="true" scummvm:keyEdgeFlags="left"/>
<CustomKey scummvm:codes="47" scummvm:keyLabel="S" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="32" scummvm:keyLabel="D" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="34" scummvm:keyLabel="F" scummvm:isRepeatable="true"/>
@ -27,7 +27,7 @@
<CustomKey scummvm:codes="38" scummvm:keyLabel="J" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="39" scummvm:keyLabel="K" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="40" scummvm:keyLabel="L" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="74" scummvm:keyLabel=":" scummvm:keyEdgeFlags="right" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="74" scummvm:keyLabel=":" scummvm:isRepeatable="true" scummvm:keyEdgeFlags="right"/>
</CustomRow>
<CustomRow>
<CustomKey scummvm:codes="-1" scummvm:keyLabel="⇫" scummvm:keyEdgeFlags="left"/>
@ -38,16 +38,16 @@
<CustomKey scummvm:codes="30" scummvm:keyLabel="B" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="42" scummvm:keyLabel="N" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="41" scummvm:keyLabel="M" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="67" scummvm:keyLabel="⬅" scummvm:keyWidth="20%p" scummvm:keyEdgeFlags="right" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="67" scummvm:keyLabel="⬅" scummvm:isRepeatable="true" scummvm:keyWidth="20%p" scummvm:keyEdgeFlags="right"/>
</CustomRow>
<CustomRow rowEdgeFlags="bottom">
<CustomKey scummvm:codes="-6" scummvm:keyLabel="!@#…" scummvm:keyEdgeFlags="left"/>
<CustomKey scummvm:codes="71" scummvm:keyLabel="{" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="72" scummvm:keyLabel="}" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="76" scummvm:keyLabel="\?" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="62" scummvm:keyLabel="Space" scummvm:keyWidth="20%p" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="55" scummvm:keyLabel="&lt;" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="56" scummvm:keyLabel="&gt;" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="66" scummvm:keyLabel="Enter" scummvm:keyWidth="20%p" scummvm:keyEdgeFlags="right" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="-6" scummvm:keyLabel="!@#…" scummvm:keyEdgeFlags="left"/>
<CustomKey scummvm:codes="71" scummvm:keyLabel="{" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="72" scummvm:keyLabel="}" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="76" scummvm:keyLabel="\?" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="62" scummvm:keyLabel="Space" scummvm:isRepeatable="true" scummvm:keyWidth="20%p"/>
<CustomKey scummvm:codes="55" scummvm:keyLabel="&lt;" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="56" scummvm:keyLabel="&gt;" scummvm:isRepeatable="true"/>
<CustomKey scummvm:codes="66" scummvm:keyLabel="Enter" scummvm:isRepeatable="true" scummvm:keyWidth="20%p" scummvm:keyEdgeFlags="right"/>
</CustomRow>
</CustomKeyboard>