mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
Revert "Hardware Keyboard: Android (#33113)" (flutter/engine#33507)
This reverts commit 2555d53f05a058bd20c290ab44eaaf11f02afc73.
This commit is contained in:
parent
92092fb01c
commit
a8696c0ef2
@ -1363,10 +1363,7 @@ FILE: ../../../flutter/shell/platform/android/io/flutter/embedding/android/Flutt
|
||||
FILE: ../../../flutter/shell/platform/android/io/flutter/embedding/android/FlutterTextureView.java
|
||||
FILE: ../../../flutter/shell/platform/android/io/flutter/embedding/android/FlutterView.java
|
||||
FILE: ../../../flutter/shell/platform/android/io/flutter/embedding/android/KeyChannelResponder.java
|
||||
FILE: ../../../flutter/shell/platform/android/io/flutter/embedding/android/KeyData.java
|
||||
FILE: ../../../flutter/shell/platform/android/io/flutter/embedding/android/KeyEmbedderResponder.java
|
||||
FILE: ../../../flutter/shell/platform/android/io/flutter/embedding/android/KeyboardManager.java
|
||||
FILE: ../../../flutter/shell/platform/android/io/flutter/embedding/android/KeyboardMap.java
|
||||
FILE: ../../../flutter/shell/platform/android/io/flutter/embedding/android/MotionEventTracker.java
|
||||
FILE: ../../../flutter/shell/platform/android/io/flutter/embedding/android/RenderMode.java
|
||||
FILE: ../../../flutter/shell/platform/android/io/flutter/embedding/android/SplashScreen.java
|
||||
|
||||
@ -146,7 +146,7 @@ class KeyData {
|
||||
|
||||
String? _escapeCharacter() {
|
||||
if (character == null) {
|
||||
return '<none>';
|
||||
return character ?? '<none>';
|
||||
}
|
||||
switch (character!) {
|
||||
case '\n':
|
||||
|
||||
@ -28,9 +28,6 @@ enum class KeyEventType : int64_t {
|
||||
// a different way in KeyDataPacket.
|
||||
//
|
||||
// This structure is unpacked by hooks.dart.
|
||||
//
|
||||
// Changes to this struct must also be made to
|
||||
// io/flutter/embedding/android/KeyData.java.
|
||||
struct alignas(8) KeyData {
|
||||
// Timestamp in microseconds from an arbitrary and consistent start point
|
||||
uint64_t timestamp;
|
||||
|
||||
@ -14,9 +14,6 @@
|
||||
namespace flutter {
|
||||
|
||||
// A byte stream representing a key event, to be sent to the framework.
|
||||
//
|
||||
// Changes to the marshalling format here must also be made to
|
||||
// io/flutter/embedding/android/KeyData.java.
|
||||
class KeyDataPacket {
|
||||
public:
|
||||
// Build the key data packet by providing information.
|
||||
|
||||
@ -185,10 +185,7 @@ android_java_sources = [
|
||||
"io/flutter/embedding/android/FlutterTextureView.java",
|
||||
"io/flutter/embedding/android/FlutterView.java",
|
||||
"io/flutter/embedding/android/KeyChannelResponder.java",
|
||||
"io/flutter/embedding/android/KeyData.java",
|
||||
"io/flutter/embedding/android/KeyEmbedderResponder.java",
|
||||
"io/flutter/embedding/android/KeyboardManager.java",
|
||||
"io/flutter/embedding/android/KeyboardMap.java",
|
||||
"io/flutter/embedding/android/MotionEventTracker.java",
|
||||
"io/flutter/embedding/android/RenderMode.java",
|
||||
"io/flutter/embedding/android/SplashScreen.java",
|
||||
|
||||
@ -4,6 +4,7 @@
|
||||
|
||||
package io.flutter.embedding.android;
|
||||
|
||||
import android.view.KeyCharacterMap;
|
||||
import android.view.KeyEvent;
|
||||
import androidx.annotation.NonNull;
|
||||
import io.flutter.embedding.engine.systemchannels.KeyEventChannel;
|
||||
@ -18,15 +19,66 @@ public class KeyChannelResponder implements KeyboardManager.Responder {
|
||||
private static final String TAG = "KeyChannelResponder";
|
||||
|
||||
@NonNull private final KeyEventChannel keyEventChannel;
|
||||
|
||||
@NonNull
|
||||
private final KeyboardManager.CharacterCombiner characterCombiner =
|
||||
new KeyboardManager.CharacterCombiner();
|
||||
private int combiningCharacter;
|
||||
|
||||
public KeyChannelResponder(@NonNull KeyEventChannel keyEventChannel) {
|
||||
this.keyEventChannel = keyEventChannel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Applies the given Unicode character in {@code newCharacterCodePoint} to a previously entered
|
||||
* Unicode combining character and returns the combination of these characters if a combination
|
||||
* exists.
|
||||
*
|
||||
* <p>This method mutates {@link #combiningCharacter} over time to combine characters.
|
||||
*
|
||||
* <p>One of the following things happens in this method:
|
||||
*
|
||||
* <ul>
|
||||
* <li>If no previous {@link #combiningCharacter} exists and the {@code newCharacterCodePoint}
|
||||
* is not a combining character, then {@code newCharacterCodePoint} is returned.
|
||||
* <li>If no previous {@link #combiningCharacter} exists and the {@code newCharacterCodePoint}
|
||||
* is a combining character, then {@code newCharacterCodePoint} is saved as the {@link
|
||||
* #combiningCharacter} and null is returned.
|
||||
* <li>If a previous {@link #combiningCharacter} exists and the {@code newCharacterCodePoint} is
|
||||
* also a combining character, then the {@code newCharacterCodePoint} is combined with the
|
||||
* existing {@link #combiningCharacter} and null is returned.
|
||||
* <li>If a previous {@link #combiningCharacter} exists and the {@code newCharacterCodePoint} is
|
||||
* not a combining character, then the {@link #combiningCharacter} is applied to the regular
|
||||
* {@code newCharacterCodePoint} and the resulting complex character is returned. The {@link
|
||||
* #combiningCharacter} is cleared.
|
||||
* </ul>
|
||||
*
|
||||
* <p>The following reference explains the concept of a "combining character":
|
||||
* https://en.wikipedia.org/wiki/Combining_character
|
||||
*/
|
||||
Character applyCombiningCharacterToBaseCharacter(int newCharacterCodePoint) {
|
||||
char complexCharacter = (char) newCharacterCodePoint;
|
||||
boolean isNewCodePointACombiningCharacter =
|
||||
(newCharacterCodePoint & KeyCharacterMap.COMBINING_ACCENT) != 0;
|
||||
if (isNewCodePointACombiningCharacter) {
|
||||
// If a combining character was entered before, combine this one with that one.
|
||||
int plainCodePoint = newCharacterCodePoint & KeyCharacterMap.COMBINING_ACCENT_MASK;
|
||||
if (combiningCharacter != 0) {
|
||||
combiningCharacter = KeyCharacterMap.getDeadChar(combiningCharacter, plainCodePoint);
|
||||
} else {
|
||||
combiningCharacter = plainCodePoint;
|
||||
}
|
||||
} else {
|
||||
// The new character is a regular character. Apply combiningCharacter to it, if
|
||||
// it exists.
|
||||
if (combiningCharacter != 0) {
|
||||
int combinedChar = KeyCharacterMap.getDeadChar(combiningCharacter, newCharacterCodePoint);
|
||||
if (combinedChar > 0) {
|
||||
complexCharacter = (char) combinedChar;
|
||||
}
|
||||
combiningCharacter = 0;
|
||||
}
|
||||
}
|
||||
|
||||
return complexCharacter;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleEvent(
|
||||
@NonNull KeyEvent keyEvent, @NonNull OnKeyEventHandledCallback onKeyEventHandledCallback) {
|
||||
@ -40,7 +92,7 @@ public class KeyChannelResponder implements KeyboardManager.Responder {
|
||||
}
|
||||
|
||||
final Character complexCharacter =
|
||||
characterCombiner.applyCombiningCharacterToBaseCharacter(keyEvent.getUnicodeChar());
|
||||
applyCombiningCharacterToBaseCharacter(keyEvent.getUnicodeChar());
|
||||
KeyEventChannel.FlutterKeyEvent flutterEvent =
|
||||
new KeyEventChannel.FlutterKeyEvent(keyEvent, complexCharacter);
|
||||
|
||||
|
||||
@ -1,138 +0,0 @@
|
||||
// Copyright 2013 The Flutter Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
package io.flutter.embedding.android;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.ByteOrder;
|
||||
|
||||
/**
|
||||
* The resulting Flutter key events generated by {@link KeyEmbedderResponder}, and are sent through
|
||||
* the messenger after being marshalled with {@link #toBytes()}.
|
||||
*
|
||||
* <p>This class is the Java adaption of {@code KeyData} and {@code KeyDataPacket} in the C engine.
|
||||
* Changes made to either side must also be made to the other.
|
||||
*
|
||||
* <p>Each {@link KeyData} corresponds to a {@code ui.KeyData} in the framework.
|
||||
*/
|
||||
public class KeyData {
|
||||
private static final String TAG = "KeyData";
|
||||
|
||||
/**
|
||||
* The channel that key data should be sent through.
|
||||
*
|
||||
* <p>Must be kept in sync with kFlutterKeyDataChannel in embedder.cc
|
||||
*/
|
||||
public static final String CHANNEL = "flutter/keydata";
|
||||
|
||||
// The number of fields except for `character`.
|
||||
private static final int FIELD_COUNT = 5;
|
||||
private static final int BYTES_PER_FIELD = 8;
|
||||
|
||||
public enum Type {
|
||||
kDown(0),
|
||||
kUp(1),
|
||||
kRepeat(2);
|
||||
|
||||
private long value;
|
||||
|
||||
private Type(long value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public long getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
static Type fromLong(long value) {
|
||||
switch ((int) value) {
|
||||
case 0:
|
||||
return kDown;
|
||||
case 1:
|
||||
return kUp;
|
||||
case 2:
|
||||
return kRepeat;
|
||||
default:
|
||||
throw new AssertionError("Unexpected Type value");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Creates an empty {@link KeyData}. */
|
||||
public KeyData() {}
|
||||
|
||||
/**
|
||||
* Unmarshal fields from a buffer.
|
||||
*
|
||||
* <p>For the binary format, see {@code lib/ui/window/key_data_packet.h}.
|
||||
*/
|
||||
public KeyData(@NonNull ByteBuffer buffer) {
|
||||
final long charSize = buffer.getLong();
|
||||
this.timestamp = buffer.getLong();
|
||||
this.type = Type.fromLong(buffer.getLong());
|
||||
this.physicalKey = buffer.getLong();
|
||||
this.logicalKey = buffer.getLong();
|
||||
this.synthesized = buffer.getLong() != 0;
|
||||
|
||||
if (buffer.remaining() != charSize)
|
||||
throw new AssertionError(
|
||||
String.format(
|
||||
"Unexpected char length: charSize is %d while buffer has position %d, capacity %d, limit %d",
|
||||
charSize, buffer.position(), buffer.capacity(), buffer.limit()));
|
||||
this.character = null;
|
||||
if (charSize != 0) {
|
||||
final byte[] strBytes = new byte[(int) charSize];
|
||||
buffer.get(strBytes, 0, (int) charSize);
|
||||
try {
|
||||
this.character = new String(strBytes, "UTF-8");
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
throw new AssertionError("UTF-8 unsupported");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
long timestamp;
|
||||
Type type;
|
||||
long physicalKey;
|
||||
long logicalKey;
|
||||
boolean synthesized;
|
||||
|
||||
/** The character of this key data encoded in UTF-8. */
|
||||
@Nullable String character;
|
||||
|
||||
/**
|
||||
* Marshal the key data to a new byte buffer.
|
||||
*
|
||||
* <p>For the binary format, see {@code lib/ui/window/key_data_packet.h}.
|
||||
*
|
||||
* @return the marshalled bytes.
|
||||
*/
|
||||
ByteBuffer toBytes() {
|
||||
byte[] charBytes;
|
||||
try {
|
||||
charBytes = character == null ? null : character.getBytes("UTF-8");
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
throw new AssertionError("UTF-8 not supported");
|
||||
}
|
||||
final int charSize = charBytes == null ? 0 : charBytes.length;
|
||||
final ByteBuffer packet =
|
||||
ByteBuffer.allocateDirect((1 + FIELD_COUNT) * BYTES_PER_FIELD + charSize);
|
||||
packet.order(ByteOrder.LITTLE_ENDIAN);
|
||||
|
||||
packet.putLong(charSize);
|
||||
packet.putLong(timestamp);
|
||||
packet.putLong(type.getValue());
|
||||
packet.putLong(physicalKey);
|
||||
packet.putLong(logicalKey);
|
||||
packet.putLong(synthesized ? 1l : 0l);
|
||||
if (charBytes != null) {
|
||||
packet.put(charBytes);
|
||||
}
|
||||
|
||||
return packet;
|
||||
}
|
||||
}
|
||||
@ -1,365 +0,0 @@
|
||||
// Copyright 2013 The Flutter Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
package io.flutter.embedding.android;
|
||||
|
||||
import android.view.KeyEvent;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import io.flutter.embedding.android.KeyboardMap.PressingGoal;
|
||||
import io.flutter.embedding.android.KeyboardMap.TogglingGoal;
|
||||
import io.flutter.plugin.common.BinaryMessenger;
|
||||
import java.util.HashMap;
|
||||
|
||||
/**
|
||||
* A {@link KeyboardManager.Responder} of {@link KeyboardManager} that handles events by sending
|
||||
* processed information in {@link KeyData}.
|
||||
*
|
||||
* <p>This class corresponds to the HardwareKeyboard API in the framework.
|
||||
*/
|
||||
public class KeyEmbedderResponder implements KeyboardManager.Responder {
|
||||
private static final String TAG = "KeyEmbedderResponder";
|
||||
|
||||
// Maps KeyEvent's action and repeatCount to a KeyData type.
|
||||
private static KeyData.Type getEventType(KeyEvent event) {
|
||||
final boolean isRepeatEvent = event.getRepeatCount() > 0;
|
||||
switch (event.getAction()) {
|
||||
case KeyEvent.ACTION_DOWN:
|
||||
return isRepeatEvent ? KeyData.Type.kRepeat : KeyData.Type.kDown;
|
||||
case KeyEvent.ACTION_UP:
|
||||
return KeyData.Type.kUp;
|
||||
default:
|
||||
throw new AssertionError("Unexpected event type");
|
||||
}
|
||||
}
|
||||
|
||||
// The messenger that is used to send Flutter key events to the framework.
|
||||
//
|
||||
// On `handleEvent`, Flutter events are marshalled into byte buffers in the format specified by
|
||||
// `KeyData.toBytes`.
|
||||
@NonNull private final BinaryMessenger messenger;
|
||||
// The keys being pressed currently, mapped from physical keys to logical keys.
|
||||
@NonNull private final HashMap<Long, Long> pressingRecords = new HashMap<>();
|
||||
// Map from logical key to toggling goals.
|
||||
//
|
||||
// Besides immutable configuration, the toggling goals are also used to store the current enabling
|
||||
// states in their `enabled` field.
|
||||
@NonNull private final HashMap<Long, TogglingGoal> togglingGoals = new HashMap<>();
|
||||
|
||||
@NonNull
|
||||
private final KeyboardManager.CharacterCombiner characterCombiner =
|
||||
new KeyboardManager.CharacterCombiner();
|
||||
|
||||
public KeyEmbedderResponder(BinaryMessenger messenger) {
|
||||
this.messenger = messenger;
|
||||
for (final TogglingGoal goal : KeyboardMap.getTogglingGoals()) {
|
||||
togglingGoals.put(goal.logicalKey, goal);
|
||||
}
|
||||
}
|
||||
|
||||
// Get the physical key for this event.
|
||||
//
|
||||
// The returned value is never null.
|
||||
private Long getPhysicalKey(@NonNull KeyEvent event) {
|
||||
final Long byMapping = KeyboardMap.scanCodeToPhysical.get((long) event.getScanCode());
|
||||
if (byMapping != null) {
|
||||
return byMapping;
|
||||
}
|
||||
return KeyboardMap.kAndroidPlane & event.getScanCode();
|
||||
}
|
||||
|
||||
// Get the logical key for this event.
|
||||
//
|
||||
// The returned value is never null.
|
||||
private Long getLogicalKey(@NonNull KeyEvent event) {
|
||||
final Long byMapping = KeyboardMap.keyCodeToLogical.get((long) event.getKeyCode());
|
||||
if (byMapping != null) {
|
||||
return byMapping;
|
||||
}
|
||||
return KeyboardMap.kAndroidPlane & event.getKeyCode();
|
||||
}
|
||||
|
||||
// Update `pressingRecords`.
|
||||
//
|
||||
// If the key indicated by `physicalKey` is currently not pressed, then `logicalKey` must not be
|
||||
// null and this key will be marked pressed.
|
||||
//
|
||||
// If the key indicated by `physicalKey` is currently pressed, then `logicalKey` must be null
|
||||
// and this key will be marked released.
|
||||
void updatePressingState(@NonNull Long physicalKey, @Nullable Long logicalKey) {
|
||||
if (logicalKey != null) {
|
||||
final Long previousValue = pressingRecords.put(physicalKey, logicalKey);
|
||||
if (previousValue != null) throw new AssertionError("The key was not empty");
|
||||
} else {
|
||||
final Long previousValue = pressingRecords.remove(physicalKey);
|
||||
if (previousValue == null) throw new AssertionError("The key was empty");
|
||||
}
|
||||
}
|
||||
|
||||
// Synchronize for a pressing modifier (such as Shift or Ctrl).
|
||||
//
|
||||
// A pressing modifier is defined by a `PressingGoal`, which consists of a mask to get the true
|
||||
// state out of `KeyEvent.getMetaState`, and a list of keys. The synchronization process
|
||||
// dispatches synthesized events so that the state of these keys matches the true state taking
|
||||
// the current event in consideration.
|
||||
//
|
||||
// Although Android KeyEvent defined bitmasks for sided modifiers (SHIFT_LEFT_ON and
|
||||
// SHIFT_RIGHT_ON),
|
||||
// this function only uses the unsided modifiers (SHIFT_ON), due to the weird behaviors observed
|
||||
// on ChromeOS, where right modifiers produce events with UNSIDED | LEFT_SIDE meta state bits.
|
||||
void synchronizePressingKey(
|
||||
PressingGoal goal, boolean truePressed, long eventLogicalKey, KeyEvent event) {
|
||||
// During an incoming event, there might be a synthesized Flutter event for each key of each
|
||||
// pressing goal, followed by an eventual main Flutter event.
|
||||
//
|
||||
// NowState ----------------> PreEventState --------------> TrueState
|
||||
// Synchronization Event
|
||||
//
|
||||
// The goal of the synchronization algorithm is to derive a pre-event state that can satisfy the
|
||||
// true state (`truePressed`) after the event, and that requires as few synthesized events based
|
||||
// on the current state (`nowStates`) as possible.
|
||||
final boolean[] nowStates = new boolean[goal.keys.length];
|
||||
final Boolean[] preEventStates = new Boolean[goal.keys.length];
|
||||
boolean postEventAnyPressed = false;
|
||||
// 1. Find the current states of all keys.
|
||||
// 2. Derive the pre-event state of the event key (if applicable.)
|
||||
for (int keyIdx = 0; keyIdx < goal.keys.length; keyIdx += 1) {
|
||||
nowStates[keyIdx] = pressingRecords.containsKey(goal.keys[keyIdx].physicalKey);
|
||||
if (goal.keys[keyIdx].logicalKey == eventLogicalKey) {
|
||||
switch (getEventType(event)) {
|
||||
case kDown:
|
||||
preEventStates[keyIdx] = false;
|
||||
postEventAnyPressed = true;
|
||||
if (!truePressed) {
|
||||
throw new AssertionError(
|
||||
String.format(
|
||||
"Unexpected metaState 0 for key 0x%x during an ACTION_down event.",
|
||||
eventLogicalKey));
|
||||
}
|
||||
break;
|
||||
case kUp:
|
||||
// Incoming event is an up. Although the previous state should be pressed, don't
|
||||
// synthesize a down event even if it's not. The later code will handle such cases by
|
||||
// skipping abrupt up events. Obviously don't synthesize up events either.
|
||||
preEventStates[keyIdx] = nowStates[keyIdx];
|
||||
break;
|
||||
case kRepeat:
|
||||
// Incoming event is repeat. The previous state can be either pressed or released. Don't
|
||||
// synthesize a down event here, or there will be a down event *and* a repeat event,
|
||||
// both of which have printable characters. Obviously don't synthesize up events either.
|
||||
if (!truePressed) {
|
||||
throw new AssertionError(
|
||||
String.format(
|
||||
"Unexpected metaState 0 for key 0x%x during an ACTION_down repeat event.",
|
||||
eventLogicalKey));
|
||||
}
|
||||
preEventStates[keyIdx] = nowStates[keyIdx];
|
||||
postEventAnyPressed = true;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
postEventAnyPressed = postEventAnyPressed || nowStates[keyIdx];
|
||||
}
|
||||
}
|
||||
|
||||
// Fill the rest of the pre-event states to match the true state.
|
||||
if (truePressed) {
|
||||
// It is required that at least one key is pressed.
|
||||
for (int keyIdx = 0; keyIdx < goal.keys.length; keyIdx += 1) {
|
||||
if (preEventStates[keyIdx] != null) {
|
||||
continue;
|
||||
}
|
||||
if (postEventAnyPressed) {
|
||||
preEventStates[keyIdx] = nowStates[keyIdx];
|
||||
} else {
|
||||
preEventStates[keyIdx] = true;
|
||||
postEventAnyPressed = true;
|
||||
}
|
||||
}
|
||||
if (!postEventAnyPressed) {
|
||||
preEventStates[0] = true;
|
||||
}
|
||||
} else {
|
||||
for (int keyIdx = 0; keyIdx < goal.keys.length; keyIdx += 1) {
|
||||
if (preEventStates[keyIdx] != null) {
|
||||
continue;
|
||||
}
|
||||
preEventStates[keyIdx] = false;
|
||||
}
|
||||
}
|
||||
|
||||
// Dispatch synthesized events for state differences.
|
||||
for (int keyIdx = 0; keyIdx < goal.keys.length; keyIdx += 1) {
|
||||
if (nowStates[keyIdx] != preEventStates[keyIdx]) {
|
||||
final KeyboardMap.KeyPair key = goal.keys[keyIdx];
|
||||
synthesizeEvent(
|
||||
preEventStates[keyIdx], key.logicalKey, key.physicalKey, event.getEventTime());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Synchronize for a toggling modifier (such as CapsLock).
|
||||
//
|
||||
// A toggling modifier is defined by a `TogglingGoal`, which consists of a mask to get the true
|
||||
// state out of `KeyEvent.getMetaState`, and a key. The synchronization process dispatches
|
||||
// synthesized events so that the state of these keys matches the true state taking the current
|
||||
// event in consideration.
|
||||
//
|
||||
// Although Android KeyEvent defined bitmasks for all "lock" modifiers and define them as the
|
||||
// "lock" state, weird behaviors are observed on ChromeOS. First, ScrollLock and NumLock presses
|
||||
// do not set metaState bits. Second, CapsLock key events set the CapsLock bit as if it is a
|
||||
// pressing modifier (key down having state 1, key up having state 0), while other key events set
|
||||
// the CapsLock bit correctly (locked having state 1, unlocked having state 0). Therefore this
|
||||
// function only synchronizes the CapsLock state, and only does so during non-CapsLock key events.
|
||||
void synchronizeTogglingKey(
|
||||
TogglingGoal goal, boolean trueEnabled, long eventLogicalKey, KeyEvent event) {
|
||||
if (goal.logicalKey == eventLogicalKey) {
|
||||
// Don't synthesize for self events, because the self events have weird metaStates on
|
||||
// ChromeOS.
|
||||
return;
|
||||
}
|
||||
if (goal.enabled != trueEnabled) {
|
||||
final boolean firstIsDown = !pressingRecords.containsKey(goal.physicalKey);
|
||||
if (firstIsDown) {
|
||||
goal.enabled = !goal.enabled;
|
||||
}
|
||||
synthesizeEvent(firstIsDown, goal.logicalKey, goal.physicalKey, event.getEventTime());
|
||||
if (!firstIsDown) {
|
||||
goal.enabled = !goal.enabled;
|
||||
}
|
||||
synthesizeEvent(!firstIsDown, goal.logicalKey, goal.physicalKey, event.getEventTime());
|
||||
}
|
||||
}
|
||||
|
||||
// Implements the core algorithm of `handleEvent`.
|
||||
//
|
||||
// Returns whether any events are dispatched.
|
||||
private boolean handleEventImpl(
|
||||
@NonNull KeyEvent event, @NonNull OnKeyEventHandledCallback onKeyEventHandledCallback) {
|
||||
final Long physicalKey = getPhysicalKey(event);
|
||||
final Long logicalKey = getLogicalKey(event);
|
||||
|
||||
for (final PressingGoal goal : KeyboardMap.pressingGoals) {
|
||||
synchronizePressingKey(goal, (event.getMetaState() & goal.mask) != 0, logicalKey, event);
|
||||
}
|
||||
|
||||
for (final TogglingGoal goal : togglingGoals.values()) {
|
||||
synchronizeTogglingKey(goal, (event.getMetaState() & goal.mask) != 0, logicalKey, event);
|
||||
}
|
||||
|
||||
boolean isDownEvent;
|
||||
switch (event.getAction()) {
|
||||
case KeyEvent.ACTION_DOWN:
|
||||
isDownEvent = true;
|
||||
break;
|
||||
case KeyEvent.ACTION_UP:
|
||||
isDownEvent = false;
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
KeyData.Type type;
|
||||
String character = null;
|
||||
final Long lastLogicalRecord = pressingRecords.get(physicalKey);
|
||||
if (isDownEvent) {
|
||||
if (lastLogicalRecord == null) {
|
||||
type = KeyData.Type.kDown;
|
||||
} else {
|
||||
// A key has been pressed that has the exact physical key as a currently
|
||||
// pressed one.
|
||||
if (event.getRepeatCount() > 0) {
|
||||
type = KeyData.Type.kRepeat;
|
||||
} else {
|
||||
synthesizeEvent(false, lastLogicalRecord, physicalKey, event.getEventTime());
|
||||
type = KeyData.Type.kDown;
|
||||
}
|
||||
}
|
||||
final char complexChar =
|
||||
characterCombiner.applyCombiningCharacterToBaseCharacter(event.getUnicodeChar());
|
||||
if (complexChar != 0) {
|
||||
character = "" + complexChar;
|
||||
}
|
||||
} else { // isDownEvent is false
|
||||
if (lastLogicalRecord == null) {
|
||||
// Ignore abrupt up events.
|
||||
return false;
|
||||
} else {
|
||||
type = KeyData.Type.kUp;
|
||||
}
|
||||
}
|
||||
|
||||
if (type != KeyData.Type.kRepeat) {
|
||||
updatePressingState(physicalKey, isDownEvent ? logicalKey : null);
|
||||
}
|
||||
if (type == KeyData.Type.kDown) {
|
||||
final TogglingGoal maybeTogglingGoal = togglingGoals.get(logicalKey);
|
||||
if (maybeTogglingGoal != null) {
|
||||
maybeTogglingGoal.enabled = !maybeTogglingGoal.enabled;
|
||||
}
|
||||
}
|
||||
|
||||
final KeyData output = new KeyData();
|
||||
output.timestamp = event.getEventTime();
|
||||
output.type = type;
|
||||
output.logicalKey = logicalKey;
|
||||
output.physicalKey = physicalKey;
|
||||
output.character = character;
|
||||
output.synthesized = false;
|
||||
|
||||
sendKeyEvent(output, onKeyEventHandledCallback);
|
||||
return true;
|
||||
}
|
||||
|
||||
private void synthesizeEvent(boolean isDown, Long logicalKey, Long physicalKey, long timestamp) {
|
||||
final KeyData output = new KeyData();
|
||||
output.timestamp = timestamp;
|
||||
output.type = isDown ? KeyData.Type.kDown : KeyData.Type.kUp;
|
||||
output.logicalKey = logicalKey;
|
||||
output.physicalKey = physicalKey;
|
||||
output.character = null;
|
||||
output.synthesized = true;
|
||||
updatePressingState(physicalKey, isDown ? logicalKey : null);
|
||||
sendKeyEvent(output, null);
|
||||
}
|
||||
|
||||
private void sendKeyEvent(KeyData data, OnKeyEventHandledCallback onKeyEventHandledCallback) {
|
||||
final BinaryMessenger.BinaryReply handleMessageReply =
|
||||
onKeyEventHandledCallback == null
|
||||
? null
|
||||
: message -> {
|
||||
Boolean handled = false;
|
||||
message.rewind();
|
||||
if (message.capacity() != 0) {
|
||||
handled = message.get() != 0;
|
||||
}
|
||||
onKeyEventHandledCallback.onKeyEventHandled(handled);
|
||||
};
|
||||
|
||||
messenger.send(KeyData.CHANNEL, data.toBytes(), handleMessageReply);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses an Android key event, performs synchronization, and dispatches Flutter events through
|
||||
* the messenger to the framework with the given callback.
|
||||
*
|
||||
* <p>At least one event will be dispatched. If there are no others, an empty event with 0
|
||||
* physical key and 0 logical key will be synthesized.
|
||||
*
|
||||
* @param event The Android key event to be handled.
|
||||
* @param onKeyEventHandledCallback the method to call when the framework has decided whether to
|
||||
* handle this event. This callback will always be called once and only once. If there are no
|
||||
* non-synthesized out of this event, this callback will be called during this method with
|
||||
* true.
|
||||
*/
|
||||
@Override
|
||||
public void handleEvent(
|
||||
@NonNull KeyEvent event, @NonNull OnKeyEventHandledCallback onKeyEventHandledCallback) {
|
||||
final boolean sentAny = handleEventImpl(event, onKeyEventHandledCallback);
|
||||
if (!sentAny) {
|
||||
synthesizeEvent(true, 0l, 0l, 0l);
|
||||
onKeyEventHandledCallback.onKeyEventHandled(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -4,7 +4,6 @@
|
||||
|
||||
package io.flutter.embedding.android;
|
||||
|
||||
import android.view.KeyCharacterMap;
|
||||
import android.view.KeyEvent;
|
||||
import androidx.annotation.NonNull;
|
||||
import io.flutter.Log;
|
||||
@ -43,69 +42,6 @@ import java.util.HashSet;
|
||||
public class KeyboardManager implements InputConnectionAdaptor.KeyboardDelegate {
|
||||
private static final String TAG = "KeyboardManager";
|
||||
|
||||
/**
|
||||
* Applies the given Unicode character from {@link KeyEvent#getUnicodeChar()} to a previously
|
||||
* entered Unicode combining character and returns the combination of these characters if a
|
||||
* combination exists.
|
||||
*
|
||||
* <p>This class is not used by {@link KeyboardManager}, but by its responders.
|
||||
*/
|
||||
public static class CharacterCombiner {
|
||||
private int combiningCharacter = 0;
|
||||
|
||||
public CharacterCombiner() {}
|
||||
|
||||
/**
|
||||
* This method mutates {@link #combiningCharacter} over time to combine characters.
|
||||
*
|
||||
* <p>One of the following things happens in this method:
|
||||
*
|
||||
* <ul>
|
||||
* <li>If no previous {@link #combiningCharacter} exists and the {@code newCharacterCodePoint}
|
||||
* is not a combining character, then {@code newCharacterCodePoint} is returned.
|
||||
* <li>If no previous {@link #combiningCharacter} exists and the {@code newCharacterCodePoint}
|
||||
* is a combining character, then {@code newCharacterCodePoint} is saved as the {@link
|
||||
* #combiningCharacter} and null is returned.
|
||||
* <li>If a previous {@link #combiningCharacter} exists and the {@code newCharacterCodePoint}
|
||||
* is also a combining character, then the {@code newCharacterCodePoint} is combined with
|
||||
* the existing {@link #combiningCharacter} and null is returned.
|
||||
* <li>If a previous {@link #combiningCharacter} exists and the {@code newCharacterCodePoint}
|
||||
* is not a combining character, then the {@link #combiningCharacter} is applied to the
|
||||
* regular {@code newCharacterCodePoint} and the resulting complex character is returned.
|
||||
* The {@link #combiningCharacter} is cleared.
|
||||
* </ul>
|
||||
*
|
||||
* <p>The following reference explains the concept of a "combining character":
|
||||
* https://en.wikipedia.org/wiki/Combining_character
|
||||
*/
|
||||
Character applyCombiningCharacterToBaseCharacter(int newCharacterCodePoint) {
|
||||
char complexCharacter = (char) newCharacterCodePoint;
|
||||
boolean isNewCodePointACombiningCharacter =
|
||||
(newCharacterCodePoint & KeyCharacterMap.COMBINING_ACCENT) != 0;
|
||||
if (isNewCodePointACombiningCharacter) {
|
||||
// If a combining character was entered before, combine this one with that one.
|
||||
int plainCodePoint = newCharacterCodePoint & KeyCharacterMap.COMBINING_ACCENT_MASK;
|
||||
if (combiningCharacter != 0) {
|
||||
combiningCharacter = KeyCharacterMap.getDeadChar(combiningCharacter, plainCodePoint);
|
||||
} else {
|
||||
combiningCharacter = plainCodePoint;
|
||||
}
|
||||
} else {
|
||||
// The new character is a regular character. Apply combiningCharacter to it, if
|
||||
// it exists.
|
||||
if (combiningCharacter != 0) {
|
||||
int combinedChar = KeyCharacterMap.getDeadChar(combiningCharacter, newCharacterCodePoint);
|
||||
if (combinedChar > 0) {
|
||||
complexCharacter = (char) combinedChar;
|
||||
}
|
||||
combiningCharacter = 0;
|
||||
}
|
||||
}
|
||||
|
||||
return complexCharacter;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct a {@link KeyboardManager}.
|
||||
*
|
||||
@ -115,8 +51,7 @@ public class KeyboardManager implements InputConnectionAdaptor.KeyboardDelegate
|
||||
public KeyboardManager(@NonNull ViewDelegate viewDelegate) {
|
||||
this.viewDelegate = viewDelegate;
|
||||
this.responders =
|
||||
new Responder[] {
|
||||
new KeyEmbedderResponder(viewDelegate.getBinaryMessenger()),
|
||||
new KeyChannelResponder[] {
|
||||
new KeyChannelResponder(new KeyEventChannel(viewDelegate.getBinaryMessenger())),
|
||||
};
|
||||
}
|
||||
|
||||
@ -1,618 +0,0 @@
|
||||
package io.flutter.embedding.android;
|
||||
|
||||
// Copyright 2013 The Flutter Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// DO NOT EDIT -- DO NOT EDIT -- DO NOT EDIT
|
||||
// This file is generated by flutter/flutter@dev/tools/gen_keycodes/bin/gen_keycodes.dart and
|
||||
// should not be edited directly.
|
||||
//
|
||||
// Edit the template dev/tools/gen_keycodes/data/android_keyboard_map_java.tmpl instead.
|
||||
// See dev/tools/gen_keycodes/README.md for more information.
|
||||
|
||||
import android.view.KeyEvent;
|
||||
import java.util.HashMap;
|
||||
|
||||
/** Static information used by {@link KeyEmbedderResponder}. */
|
||||
public class KeyboardMap {
|
||||
/** A physicalKey-logicalKey pair used to define mappings. */
|
||||
public static class KeyPair {
|
||||
public KeyPair(long physicalKey, long logicalKey) {
|
||||
this.physicalKey = physicalKey;
|
||||
this.logicalKey = logicalKey;
|
||||
}
|
||||
|
||||
public long physicalKey;
|
||||
public long logicalKey;
|
||||
}
|
||||
|
||||
/**
|
||||
* An immutable configuration item that defines how to synchronize pressing modifiers (such as
|
||||
* Shift or Ctrl), so that the {@link KeyEmbedderResponder} must synthesize events until the
|
||||
* combined pressing state of {@link keys} matches the true meta state masked by {@link mask}.
|
||||
*/
|
||||
public static class PressingGoal {
|
||||
public PressingGoal(int mask, KeyPair[] keys) {
|
||||
this.mask = mask;
|
||||
this.keys = keys;
|
||||
}
|
||||
|
||||
public final int mask;
|
||||
public final KeyPair[] keys;
|
||||
}
|
||||
|
||||
/**
|
||||
* A configuration item that defines how to synchronize toggling modifiers (such as CapsLock), so
|
||||
* that the {@link KeyEmbedderResponder} must synthesize events until the enabling state of the
|
||||
* key matches the true meta state masked by {@link #mask}.
|
||||
*
|
||||
* <p>The objects of this class are mutable. The {@link #enabled} field will be used to store the
|
||||
* current enabling state.
|
||||
*/
|
||||
public static class TogglingGoal {
|
||||
public TogglingGoal(int mask, long physicalKey, long logicalKey) {
|
||||
this.mask = mask;
|
||||
this.physicalKey = physicalKey;
|
||||
this.logicalKey = logicalKey;
|
||||
}
|
||||
|
||||
public final int mask;
|
||||
public final long physicalKey;
|
||||
public final long logicalKey;
|
||||
/**
|
||||
* Used by {@link KeyEmbedderResponder} to store the current enabling state of this modifier.
|
||||
*
|
||||
* <p>Initialized as false.
|
||||
*/
|
||||
public boolean enabled = false;
|
||||
}
|
||||
|
||||
/** Maps from Android scan codes {@link KeyEvent#getScanCode()} to Flutter physical keys. */
|
||||
public static final HashMap<Long, Long> scanCodeToPhysical =
|
||||
new HashMap<Long, Long>() {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
{
|
||||
put(0x00000001d0L, 0x0000000012L); // fn
|
||||
put(0x00000000cdL, 0x0000000014L); // suspend
|
||||
put(0x000000008eL, 0x0000010082L); // sleep
|
||||
put(0x000000008fL, 0x0000010083L); // wakeUp
|
||||
put(0x0000000100L, 0x000005ff01L); // gameButton1
|
||||
put(0x0000000120L, 0x000005ff01L); // gameButton1
|
||||
put(0x0000000101L, 0x000005ff02L); // gameButton2
|
||||
put(0x0000000121L, 0x000005ff02L); // gameButton2
|
||||
put(0x0000000102L, 0x000005ff03L); // gameButton3
|
||||
put(0x0000000122L, 0x000005ff03L); // gameButton3
|
||||
put(0x0000000103L, 0x000005ff04L); // gameButton4
|
||||
put(0x0000000123L, 0x000005ff04L); // gameButton4
|
||||
put(0x0000000104L, 0x000005ff05L); // gameButton5
|
||||
put(0x0000000124L, 0x000005ff05L); // gameButton5
|
||||
put(0x0000000105L, 0x000005ff06L); // gameButton6
|
||||
put(0x0000000125L, 0x000005ff06L); // gameButton6
|
||||
put(0x0000000106L, 0x000005ff07L); // gameButton7
|
||||
put(0x0000000126L, 0x000005ff07L); // gameButton7
|
||||
put(0x0000000107L, 0x000005ff08L); // gameButton8
|
||||
put(0x0000000127L, 0x000005ff08L); // gameButton8
|
||||
put(0x0000000108L, 0x000005ff09L); // gameButton9
|
||||
put(0x0000000128L, 0x000005ff09L); // gameButton9
|
||||
put(0x0000000109L, 0x000005ff0aL); // gameButton10
|
||||
put(0x0000000129L, 0x000005ff0aL); // gameButton10
|
||||
put(0x000000010aL, 0x000005ff0bL); // gameButton11
|
||||
put(0x000000012aL, 0x000005ff0bL); // gameButton11
|
||||
put(0x000000010bL, 0x000005ff0cL); // gameButton12
|
||||
put(0x000000012bL, 0x000005ff0cL); // gameButton12
|
||||
put(0x000000010cL, 0x000005ff0dL); // gameButton13
|
||||
put(0x000000012cL, 0x000005ff0dL); // gameButton13
|
||||
put(0x000000010dL, 0x000005ff0eL); // gameButton14
|
||||
put(0x000000012dL, 0x000005ff0eL); // gameButton14
|
||||
put(0x000000010eL, 0x000005ff0fL); // gameButton15
|
||||
put(0x000000012eL, 0x000005ff0fL); // gameButton15
|
||||
put(0x000000010fL, 0x000005ff10L); // gameButton16
|
||||
put(0x000000012fL, 0x000005ff10L); // gameButton16
|
||||
put(0x0000000130L, 0x000005ff11L); // gameButtonA
|
||||
put(0x0000000131L, 0x000005ff12L); // gameButtonB
|
||||
put(0x0000000132L, 0x000005ff13L); // gameButtonC
|
||||
put(0x0000000136L, 0x000005ff14L); // gameButtonLeft1
|
||||
put(0x0000000138L, 0x000005ff15L); // gameButtonLeft2
|
||||
put(0x000000013cL, 0x000005ff16L); // gameButtonMode
|
||||
put(0x0000000137L, 0x000005ff17L); // gameButtonRight1
|
||||
put(0x0000000139L, 0x000005ff18L); // gameButtonRight2
|
||||
put(0x000000013aL, 0x000005ff19L); // gameButtonSelect
|
||||
put(0x000000013bL, 0x000005ff1aL); // gameButtonStart
|
||||
put(0x000000013dL, 0x000005ff1bL); // gameButtonThumbLeft
|
||||
put(0x000000013eL, 0x000005ff1cL); // gameButtonThumbRight
|
||||
put(0x0000000133L, 0x000005ff1dL); // gameButtonX
|
||||
put(0x0000000134L, 0x000005ff1eL); // gameButtonY
|
||||
put(0x0000000135L, 0x000005ff1fL); // gameButtonZ
|
||||
put(0x000000001eL, 0x0000070004L); // keyA
|
||||
put(0x0000000030L, 0x0000070005L); // keyB
|
||||
put(0x000000002eL, 0x0000070006L); // keyC
|
||||
put(0x0000000020L, 0x0000070007L); // keyD
|
||||
put(0x0000000012L, 0x0000070008L); // keyE
|
||||
put(0x0000000021L, 0x0000070009L); // keyF
|
||||
put(0x0000000022L, 0x000007000aL); // keyG
|
||||
put(0x0000000023L, 0x000007000bL); // keyH
|
||||
put(0x0000000017L, 0x000007000cL); // keyI
|
||||
put(0x0000000024L, 0x000007000dL); // keyJ
|
||||
put(0x0000000025L, 0x000007000eL); // keyK
|
||||
put(0x0000000026L, 0x000007000fL); // keyL
|
||||
put(0x0000000032L, 0x0000070010L); // keyM
|
||||
put(0x0000000031L, 0x0000070011L); // keyN
|
||||
put(0x0000000018L, 0x0000070012L); // keyO
|
||||
put(0x0000000019L, 0x0000070013L); // keyP
|
||||
put(0x0000000010L, 0x0000070014L); // keyQ
|
||||
put(0x0000000013L, 0x0000070015L); // keyR
|
||||
put(0x000000001fL, 0x0000070016L); // keyS
|
||||
put(0x0000000014L, 0x0000070017L); // keyT
|
||||
put(0x0000000016L, 0x0000070018L); // keyU
|
||||
put(0x000000002fL, 0x0000070019L); // keyV
|
||||
put(0x0000000011L, 0x000007001aL); // keyW
|
||||
put(0x000000002dL, 0x000007001bL); // keyX
|
||||
put(0x0000000015L, 0x000007001cL); // keyY
|
||||
put(0x000000002cL, 0x000007001dL); // keyZ
|
||||
put(0x0000000002L, 0x000007001eL); // digit1
|
||||
put(0x0000000003L, 0x000007001fL); // digit2
|
||||
put(0x0000000004L, 0x0000070020L); // digit3
|
||||
put(0x0000000005L, 0x0000070021L); // digit4
|
||||
put(0x0000000006L, 0x0000070022L); // digit5
|
||||
put(0x0000000007L, 0x0000070023L); // digit6
|
||||
put(0x0000000008L, 0x0000070024L); // digit7
|
||||
put(0x0000000009L, 0x0000070025L); // digit8
|
||||
put(0x000000000aL, 0x0000070026L); // digit9
|
||||
put(0x000000000bL, 0x0000070027L); // digit0
|
||||
put(0x000000001cL, 0x0000070028L); // enter
|
||||
put(0x0000000001L, 0x0000070029L); // escape
|
||||
put(0x000000000eL, 0x000007002aL); // backspace
|
||||
put(0x000000000fL, 0x000007002bL); // tab
|
||||
put(0x0000000039L, 0x000007002cL); // space
|
||||
put(0x000000000cL, 0x000007002dL); // minus
|
||||
put(0x000000000dL, 0x000007002eL); // equal
|
||||
put(0x000000001aL, 0x000007002fL); // bracketLeft
|
||||
put(0x000000001bL, 0x0000070030L); // bracketRight
|
||||
put(0x000000002bL, 0x0000070031L); // backslash
|
||||
put(0x0000000056L, 0x0000070031L); // backslash
|
||||
put(0x0000000027L, 0x0000070033L); // semicolon
|
||||
put(0x0000000028L, 0x0000070034L); // quote
|
||||
put(0x0000000029L, 0x0000070035L); // backquote
|
||||
put(0x0000000033L, 0x0000070036L); // comma
|
||||
put(0x0000000034L, 0x0000070037L); // period
|
||||
put(0x0000000035L, 0x0000070038L); // slash
|
||||
put(0x000000003aL, 0x0000070039L); // capsLock
|
||||
put(0x000000003bL, 0x000007003aL); // f1
|
||||
put(0x000000003cL, 0x000007003bL); // f2
|
||||
put(0x000000003dL, 0x000007003cL); // f3
|
||||
put(0x000000003eL, 0x000007003dL); // f4
|
||||
put(0x000000003fL, 0x000007003eL); // f5
|
||||
put(0x0000000040L, 0x000007003fL); // f6
|
||||
put(0x0000000041L, 0x0000070040L); // f7
|
||||
put(0x0000000042L, 0x0000070041L); // f8
|
||||
put(0x0000000043L, 0x0000070042L); // f9
|
||||
put(0x0000000044L, 0x0000070043L); // f10
|
||||
put(0x0000000057L, 0x0000070044L); // f11
|
||||
put(0x0000000058L, 0x0000070045L); // f12
|
||||
put(0x0000000063L, 0x0000070046L); // printScreen
|
||||
put(0x0000000046L, 0x0000070047L); // scrollLock
|
||||
put(0x0000000077L, 0x0000070048L); // pause
|
||||
put(0x000000019bL, 0x0000070048L); // pause
|
||||
put(0x000000006eL, 0x0000070049L); // insert
|
||||
put(0x0000000066L, 0x000007004aL); // home
|
||||
put(0x0000000068L, 0x000007004bL); // pageUp
|
||||
put(0x00000000b1L, 0x000007004bL); // pageUp
|
||||
put(0x000000006fL, 0x000007004cL); // delete
|
||||
put(0x000000006bL, 0x000007004dL); // end
|
||||
put(0x000000006dL, 0x000007004eL); // pageDown
|
||||
put(0x00000000b2L, 0x000007004eL); // pageDown
|
||||
put(0x000000006aL, 0x000007004fL); // arrowRight
|
||||
put(0x0000000069L, 0x0000070050L); // arrowLeft
|
||||
put(0x000000006cL, 0x0000070051L); // arrowDown
|
||||
put(0x0000000067L, 0x0000070052L); // arrowUp
|
||||
put(0x0000000045L, 0x0000070053L); // numLock
|
||||
put(0x0000000062L, 0x0000070054L); // numpadDivide
|
||||
put(0x0000000037L, 0x0000070055L); // numpadMultiply
|
||||
put(0x000000004aL, 0x0000070056L); // numpadSubtract
|
||||
put(0x000000004eL, 0x0000070057L); // numpadAdd
|
||||
put(0x0000000060L, 0x0000070058L); // numpadEnter
|
||||
put(0x000000004fL, 0x0000070059L); // numpad1
|
||||
put(0x0000000050L, 0x000007005aL); // numpad2
|
||||
put(0x0000000051L, 0x000007005bL); // numpad3
|
||||
put(0x000000004bL, 0x000007005cL); // numpad4
|
||||
put(0x000000004cL, 0x000007005dL); // numpad5
|
||||
put(0x000000004dL, 0x000007005eL); // numpad6
|
||||
put(0x0000000047L, 0x000007005fL); // numpad7
|
||||
put(0x0000000048L, 0x0000070060L); // numpad8
|
||||
put(0x0000000049L, 0x0000070061L); // numpad9
|
||||
put(0x0000000052L, 0x0000070062L); // numpad0
|
||||
put(0x0000000053L, 0x0000070063L); // numpadDecimal
|
||||
put(0x000000007fL, 0x0000070065L); // contextMenu
|
||||
put(0x000000008bL, 0x0000070065L); // contextMenu
|
||||
put(0x0000000074L, 0x0000070066L); // power
|
||||
put(0x0000000098L, 0x0000070066L); // power
|
||||
put(0x0000000075L, 0x0000070067L); // numpadEqual
|
||||
put(0x00000000b7L, 0x0000070068L); // f13
|
||||
put(0x00000000b8L, 0x0000070069L); // f14
|
||||
put(0x00000000b9L, 0x000007006aL); // f15
|
||||
put(0x00000000baL, 0x000007006bL); // f16
|
||||
put(0x00000000bbL, 0x000007006cL); // f17
|
||||
put(0x00000000bcL, 0x000007006dL); // f18
|
||||
put(0x00000000bdL, 0x000007006eL); // f19
|
||||
put(0x00000000beL, 0x000007006fL); // f20
|
||||
put(0x00000000bfL, 0x0000070070L); // f21
|
||||
put(0x00000000c0L, 0x0000070071L); // f22
|
||||
put(0x00000000c1L, 0x0000070072L); // f23
|
||||
put(0x00000000c2L, 0x0000070073L); // f24
|
||||
put(0x0000000086L, 0x0000070074L); // open
|
||||
put(0x000000008aL, 0x0000070075L); // help
|
||||
put(0x0000000161L, 0x0000070077L); // select
|
||||
put(0x0000000081L, 0x0000070079L); // again
|
||||
put(0x0000000083L, 0x000007007aL); // undo
|
||||
put(0x0000000089L, 0x000007007bL); // cut
|
||||
put(0x0000000085L, 0x000007007cL); // copy
|
||||
put(0x0000000087L, 0x000007007dL); // paste
|
||||
put(0x0000000088L, 0x000007007eL); // find
|
||||
put(0x0000000071L, 0x000007007fL); // audioVolumeMute
|
||||
put(0x0000000073L, 0x0000070080L); // audioVolumeUp
|
||||
put(0x0000000072L, 0x0000070081L); // audioVolumeDown
|
||||
put(0x000000005fL, 0x0000070085L); // numpadComma
|
||||
put(0x0000000079L, 0x0000070085L); // numpadComma
|
||||
put(0x0000000059L, 0x0000070087L); // intlRo
|
||||
put(0x000000007cL, 0x0000070089L); // intlYen
|
||||
put(0x000000005cL, 0x000007008aL); // convert
|
||||
put(0x000000005eL, 0x000007008bL); // nonConvert
|
||||
put(0x000000005aL, 0x0000070092L); // lang3
|
||||
put(0x000000005bL, 0x0000070093L); // lang4
|
||||
put(0x0000000082L, 0x00000700a3L); // props
|
||||
put(0x00000000b3L, 0x00000700b6L); // numpadParenLeft
|
||||
put(0x00000000b4L, 0x00000700b7L); // numpadParenRight
|
||||
put(0x000000001dL, 0x00000700e0L); // controlLeft
|
||||
put(0x000000002aL, 0x00000700e1L); // shiftLeft
|
||||
put(0x0000000038L, 0x00000700e2L); // altLeft
|
||||
put(0x000000007dL, 0x00000700e3L); // metaLeft
|
||||
put(0x0000000061L, 0x00000700e4L); // controlRight
|
||||
put(0x0000000036L, 0x00000700e5L); // shiftRight
|
||||
put(0x0000000064L, 0x00000700e6L); // altRight
|
||||
put(0x000000007eL, 0x00000700e7L); // metaRight
|
||||
put(0x0000000166L, 0x00000c0060L); // info
|
||||
put(0x0000000172L, 0x00000c0061L); // closedCaptionToggle
|
||||
put(0x00000000e1L, 0x00000c006fL); // brightnessUp
|
||||
put(0x00000000e0L, 0x00000c0070L); // brightnessDown
|
||||
put(0x0000000195L, 0x00000c0083L); // mediaLast
|
||||
put(0x00000000aeL, 0x00000c0094L); // exit
|
||||
put(0x0000000192L, 0x00000c009cL); // channelUp
|
||||
put(0x0000000193L, 0x00000c009dL); // channelDown
|
||||
put(0x00000000c8L, 0x00000c00b0L); // mediaPlay
|
||||
put(0x00000000cfL, 0x00000c00b0L); // mediaPlay
|
||||
put(0x00000000c9L, 0x00000c00b1L); // mediaPause
|
||||
put(0x00000000a7L, 0x00000c00b2L); // mediaRecord
|
||||
put(0x00000000d0L, 0x00000c00b3L); // mediaFastForward
|
||||
put(0x00000000a8L, 0x00000c00b4L); // mediaRewind
|
||||
put(0x00000000a3L, 0x00000c00b5L); // mediaTrackNext
|
||||
put(0x00000000a5L, 0x00000c00b6L); // mediaTrackPrevious
|
||||
put(0x0000000080L, 0x00000c00b7L); // mediaStop
|
||||
put(0x00000000a6L, 0x00000c00b7L); // mediaStop
|
||||
put(0x00000000a1L, 0x00000c00b8L); // eject
|
||||
put(0x00000000a2L, 0x00000c00b8L); // eject
|
||||
put(0x00000000a4L, 0x00000c00cdL); // mediaPlayPause
|
||||
put(0x00000000d1L, 0x00000c00e5L); // bassBoost
|
||||
put(0x000000009bL, 0x00000c018aL); // launchMail
|
||||
put(0x00000000d7L, 0x00000c018aL); // launchMail
|
||||
put(0x00000001adL, 0x00000c018dL); // launchContacts
|
||||
put(0x000000018dL, 0x00000c018eL); // launchCalendar
|
||||
put(0x0000000247L, 0x00000c01cbL); // launchAssistant
|
||||
put(0x00000000a0L, 0x00000c0203L); // close
|
||||
put(0x00000000ceL, 0x00000c0203L); // close
|
||||
put(0x00000000d2L, 0x00000c0208L); // print
|
||||
put(0x00000000d9L, 0x00000c0221L); // browserSearch
|
||||
put(0x000000009fL, 0x00000c0225L); // browserForward
|
||||
put(0x000000009cL, 0x00000c022aL); // browserFavorites
|
||||
put(0x00000000b6L, 0x00000c0279L); // redo
|
||||
}
|
||||
};
|
||||
|
||||
/** Maps from Android key codes {@link KeyEvent#getKeyCode()} to Flutter logical keys. */
|
||||
public static final HashMap<Long, Long> keyCodeToLogical =
|
||||
new HashMap<Long, Long>() {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
{
|
||||
put(0x000000003eL, 0x0000000020L); // space
|
||||
put(0x000000004bL, 0x0000000022L); // quote
|
||||
put(0x0000000012L, 0x0000000023L); // numberSign
|
||||
put(0x0000000011L, 0x000000002aL); // asterisk
|
||||
put(0x0000000051L, 0x000000002bL); // add
|
||||
put(0x0000000037L, 0x000000002cL); // comma
|
||||
put(0x0000000045L, 0x000000002dL); // minus
|
||||
put(0x0000000038L, 0x000000002eL); // period
|
||||
put(0x000000004cL, 0x000000002fL); // slash
|
||||
put(0x0000000007L, 0x0000000030L); // digit0
|
||||
put(0x0000000008L, 0x0000000031L); // digit1
|
||||
put(0x0000000009L, 0x0000000032L); // digit2
|
||||
put(0x000000000aL, 0x0000000033L); // digit3
|
||||
put(0x000000000bL, 0x0000000034L); // digit4
|
||||
put(0x000000000cL, 0x0000000035L); // digit5
|
||||
put(0x000000000dL, 0x0000000036L); // digit6
|
||||
put(0x000000000eL, 0x0000000037L); // digit7
|
||||
put(0x000000000fL, 0x0000000038L); // digit8
|
||||
put(0x0000000010L, 0x0000000039L); // digit9
|
||||
put(0x000000004aL, 0x000000003bL); // semicolon
|
||||
put(0x0000000046L, 0x000000003dL); // equal
|
||||
put(0x000000004dL, 0x0000000040L); // at
|
||||
put(0x0000000047L, 0x000000005bL); // bracketLeft
|
||||
put(0x0000000049L, 0x000000005cL); // backslash
|
||||
put(0x0000000048L, 0x000000005dL); // bracketRight
|
||||
put(0x0000000044L, 0x0000000060L); // backquote
|
||||
put(0x000000001dL, 0x0000000061L); // keyA
|
||||
put(0x000000001eL, 0x0000000062L); // keyB
|
||||
put(0x000000001fL, 0x0000000063L); // keyC
|
||||
put(0x0000000020L, 0x0000000064L); // keyD
|
||||
put(0x0000000021L, 0x0000000065L); // keyE
|
||||
put(0x0000000022L, 0x0000000066L); // keyF
|
||||
put(0x0000000023L, 0x0000000067L); // keyG
|
||||
put(0x0000000024L, 0x0000000068L); // keyH
|
||||
put(0x0000000025L, 0x0000000069L); // keyI
|
||||
put(0x0000000026L, 0x000000006aL); // keyJ
|
||||
put(0x0000000027L, 0x000000006bL); // keyK
|
||||
put(0x0000000028L, 0x000000006cL); // keyL
|
||||
put(0x0000000029L, 0x000000006dL); // keyM
|
||||
put(0x000000002aL, 0x000000006eL); // keyN
|
||||
put(0x000000002bL, 0x000000006fL); // keyO
|
||||
put(0x000000002cL, 0x0000000070L); // keyP
|
||||
put(0x000000002dL, 0x0000000071L); // keyQ
|
||||
put(0x000000002eL, 0x0000000072L); // keyR
|
||||
put(0x000000002fL, 0x0000000073L); // keyS
|
||||
put(0x0000000030L, 0x0000000074L); // keyT
|
||||
put(0x0000000031L, 0x0000000075L); // keyU
|
||||
put(0x0000000032L, 0x0000000076L); // keyV
|
||||
put(0x0000000033L, 0x0000000077L); // keyW
|
||||
put(0x0000000034L, 0x0000000078L); // keyX
|
||||
put(0x0000000035L, 0x0000000079L); // keyY
|
||||
put(0x0000000036L, 0x000000007aL); // keyZ
|
||||
put(0x0000000043L, 0x0100000008L); // backspace
|
||||
put(0x000000003dL, 0x0100000009L); // tab
|
||||
put(0x0000000042L, 0x010000000dL); // enter
|
||||
put(0x000000006fL, 0x010000001bL); // escape
|
||||
put(0x0000000070L, 0x010000007fL); // delete
|
||||
put(0x0000000073L, 0x0100000104L); // capsLock
|
||||
put(0x0000000077L, 0x0100000106L); // fn
|
||||
put(0x000000008fL, 0x010000010aL); // numLock
|
||||
put(0x0000000074L, 0x010000010cL); // scrollLock
|
||||
put(0x000000003fL, 0x010000010fL); // symbol
|
||||
put(0x0000000014L, 0x0100000301L); // arrowDown
|
||||
put(0x0000000015L, 0x0100000302L); // arrowLeft
|
||||
put(0x0000000016L, 0x0100000303L); // arrowRight
|
||||
put(0x0000000013L, 0x0100000304L); // arrowUp
|
||||
put(0x000000007bL, 0x0100000305L); // end
|
||||
put(0x000000007aL, 0x0100000306L); // home
|
||||
put(0x000000005dL, 0x0100000307L); // pageDown
|
||||
put(0x000000005cL, 0x0100000308L); // pageUp
|
||||
put(0x000000001cL, 0x0100000401L); // clear
|
||||
put(0x0000000116L, 0x0100000402L); // copy
|
||||
put(0x0000000115L, 0x0100000404L); // cut
|
||||
put(0x000000007cL, 0x0100000407L); // insert
|
||||
put(0x0000000117L, 0x0100000408L); // paste
|
||||
put(0x0000000052L, 0x0100000505L); // contextMenu
|
||||
put(0x0000000103L, 0x0100000508L); // help
|
||||
put(0x0000000079L, 0x0100000509L); // pause
|
||||
put(0x0000000017L, 0x010000050cL); // select
|
||||
put(0x00000000a8L, 0x010000050dL); // zoomIn
|
||||
put(0x00000000a9L, 0x010000050eL); // zoomOut
|
||||
put(0x00000000dcL, 0x0100000601L); // brightnessDown
|
||||
put(0x00000000ddL, 0x0100000602L); // brightnessUp
|
||||
put(0x000000001bL, 0x0100000603L); // camera
|
||||
put(0x0000000081L, 0x0100000604L); // eject
|
||||
put(0x000000001aL, 0x0100000606L); // power
|
||||
put(0x0000000078L, 0x0100000608L); // printScreen
|
||||
put(0x00000000e0L, 0x010000060bL); // wakeUp
|
||||
put(0x00000000d6L, 0x0100000705L); // convert
|
||||
put(0x00000000ccL, 0x0100000709L); // groupNext
|
||||
put(0x000000005fL, 0x010000070bL); // modeChange
|
||||
put(0x00000000d5L, 0x010000070dL); // nonConvert
|
||||
put(0x00000000d4L, 0x0100000714L); // eisu
|
||||
put(0x00000000d7L, 0x0100000717L); // hiraganaKatakana
|
||||
put(0x00000000daL, 0x0100000719L); // kanjiMode
|
||||
put(0x00000000d3L, 0x010000071dL); // zenkakuHankaku
|
||||
put(0x0000000083L, 0x0100000801L); // f1
|
||||
put(0x0000000084L, 0x0100000802L); // f2
|
||||
put(0x0000000085L, 0x0100000803L); // f3
|
||||
put(0x0000000086L, 0x0100000804L); // f4
|
||||
put(0x0000000087L, 0x0100000805L); // f5
|
||||
put(0x0000000088L, 0x0100000806L); // f6
|
||||
put(0x0000000089L, 0x0100000807L); // f7
|
||||
put(0x000000008aL, 0x0100000808L); // f8
|
||||
put(0x000000008bL, 0x0100000809L); // f9
|
||||
put(0x000000008cL, 0x010000080aL); // f10
|
||||
put(0x000000008dL, 0x010000080bL); // f11
|
||||
put(0x000000008eL, 0x010000080cL); // f12
|
||||
put(0x0000000080L, 0x0100000a01L); // close
|
||||
put(0x0000000055L, 0x0100000a05L); // mediaPlayPause
|
||||
put(0x0000000056L, 0x0100000a07L); // mediaStop
|
||||
put(0x0000000057L, 0x0100000a08L); // mediaTrackNext
|
||||
put(0x0000000058L, 0x0100000a09L); // mediaTrackPrevious
|
||||
put(0x0000000019L, 0x0100000a0fL); // audioVolumeDown
|
||||
put(0x0000000018L, 0x0100000a10L); // audioVolumeUp
|
||||
put(0x00000000a4L, 0x0100000a11L); // audioVolumeMute
|
||||
put(0x00000000d0L, 0x0100000b02L); // launchCalendar
|
||||
put(0x0000000041L, 0x0100000b03L); // launchMail
|
||||
put(0x00000000d1L, 0x0100000b05L); // launchMusicPlayer
|
||||
put(0x0000000040L, 0x0100000b09L); // launchWebBrowser
|
||||
put(0x00000000cfL, 0x0100000b0cL); // launchContacts
|
||||
put(0x00000000dbL, 0x0100000b0eL); // launchAssistant
|
||||
put(0x00000000aeL, 0x0100000c02L); // browserFavorites
|
||||
put(0x000000007dL, 0x0100000c03L); // browserForward
|
||||
put(0x0000000054L, 0x0100000c06L); // browserSearch
|
||||
put(0x00000000b6L, 0x0100000d08L); // avrInput
|
||||
put(0x00000000b5L, 0x0100000d09L); // avrPower
|
||||
put(0x00000000a7L, 0x0100000d0aL); // channelDown
|
||||
put(0x00000000a6L, 0x0100000d0bL); // channelUp
|
||||
put(0x00000000b7L, 0x0100000d0cL); // colorF0Red
|
||||
put(0x00000000b8L, 0x0100000d0dL); // colorF1Green
|
||||
put(0x00000000b9L, 0x0100000d0eL); // colorF2Yellow
|
||||
put(0x00000000baL, 0x0100000d0fL); // colorF3Blue
|
||||
put(0x00000000afL, 0x0100000d12L); // closedCaptionToggle
|
||||
put(0x00000000acL, 0x0100000d22L); // guide
|
||||
put(0x00000000a5L, 0x0100000d25L); // info
|
||||
put(0x000000005aL, 0x0100000d2cL); // mediaFastForward
|
||||
put(0x00000000e5L, 0x0100000d2dL); // mediaLast
|
||||
put(0x000000007fL, 0x0100000d2eL); // mediaPause
|
||||
put(0x000000007eL, 0x0100000d2fL); // mediaPlay
|
||||
put(0x0000000082L, 0x0100000d30L); // mediaRecord
|
||||
put(0x0000000059L, 0x0100000d31L); // mediaRewind
|
||||
put(0x00000000b0L, 0x0100000d43L); // settings
|
||||
put(0x00000000b4L, 0x0100000d45L); // stbInput
|
||||
put(0x00000000b3L, 0x0100000d46L); // stbPower
|
||||
put(0x00000000e9L, 0x0100000d48L); // teletext
|
||||
put(0x00000000aaL, 0x0100000d49L); // tv
|
||||
put(0x00000000b2L, 0x0100000d4aL); // tvInput
|
||||
put(0x00000000b1L, 0x0100000d4bL); // tvPower
|
||||
put(0x00000000ffL, 0x0100000d4eL); // zoomToggle
|
||||
put(0x00000000adL, 0x0100000d4fL); // dvr
|
||||
put(0x00000000deL, 0x0100000d50L); // mediaAudioTrack
|
||||
put(0x0000000111L, 0x0100000d51L); // mediaSkipBackward
|
||||
put(0x0000000110L, 0x0100000d52L); // mediaSkipForward
|
||||
put(0x0000000113L, 0x0100000d53L); // mediaStepBackward
|
||||
put(0x0000000112L, 0x0100000d54L); // mediaStepForward
|
||||
put(0x00000000e2L, 0x0100000d55L); // mediaTopMenu
|
||||
put(0x0000000106L, 0x0100000d56L); // navigateIn
|
||||
put(0x0000000105L, 0x0100000d57L); // navigateNext
|
||||
put(0x0000000107L, 0x0100000d58L); // navigateOut
|
||||
put(0x0000000104L, 0x0100000d59L); // navigatePrevious
|
||||
put(0x00000000e1L, 0x0100000d5aL); // pairing
|
||||
put(0x000000005bL, 0x0100000e09L); // microphoneVolumeMute
|
||||
put(0x00000000bbL, 0x0100001001L); // appSwitch
|
||||
put(0x0000000005L, 0x0100001002L); // call
|
||||
put(0x0000000050L, 0x0100001003L); // cameraFocus
|
||||
put(0x0000000006L, 0x0100001004L); // endCall
|
||||
put(0x0000000004L, 0x0100001005L); // goBack
|
||||
put(0x0000000003L, 0x0100001006L); // goHome
|
||||
put(0x000000004fL, 0x0100001007L); // headsetHook
|
||||
put(0x0000000053L, 0x0100001009L); // notification
|
||||
put(0x00000000cdL, 0x010000100aL); // mannerMode
|
||||
put(0x00000000ceL, 0x0100001101L); // tv3DMode
|
||||
put(0x00000000f2L, 0x0100001102L); // tvAntennaCable
|
||||
put(0x00000000fcL, 0x0100001103L); // tvAudioDescription
|
||||
put(0x00000000feL, 0x0100001104L); // tvAudioDescriptionMixDown
|
||||
put(0x00000000fdL, 0x0100001105L); // tvAudioDescriptionMixUp
|
||||
put(0x0000000100L, 0x0100001106L); // tvContentsMenu
|
||||
put(0x00000000e6L, 0x0100001107L); // tvDataService
|
||||
put(0x00000000f9L, 0x0100001108L); // tvInputComponent1
|
||||
put(0x00000000faL, 0x0100001109L); // tvInputComponent2
|
||||
put(0x00000000f7L, 0x010000110aL); // tvInputComposite1
|
||||
put(0x00000000f8L, 0x010000110bL); // tvInputComposite2
|
||||
put(0x00000000f3L, 0x010000110cL); // tvInputHDMI1
|
||||
put(0x00000000f4L, 0x010000110dL); // tvInputHDMI2
|
||||
put(0x00000000f5L, 0x010000110eL); // tvInputHDMI3
|
||||
put(0x00000000f6L, 0x010000110fL); // tvInputHDMI4
|
||||
put(0x00000000fbL, 0x0100001110L); // tvInputVGA1
|
||||
put(0x00000000f1L, 0x0100001112L); // tvNetwork
|
||||
put(0x00000000eaL, 0x0100001113L); // tvNumberEntry
|
||||
put(0x00000000e8L, 0x0100001114L); // tvRadioService
|
||||
put(0x00000000edL, 0x0100001115L); // tvSatellite
|
||||
put(0x00000000eeL, 0x0100001116L); // tvSatelliteBS
|
||||
put(0x00000000efL, 0x0100001117L); // tvSatelliteCS
|
||||
put(0x00000000f0L, 0x0100001118L); // tvSatelliteToggle
|
||||
put(0x00000000ebL, 0x0100001119L); // tvTerrestrialAnalog
|
||||
put(0x00000000ecL, 0x010000111aL); // tvTerrestrialDigital
|
||||
put(0x0000000102L, 0x010000111bL); // tvTimer
|
||||
put(0x00000000dfL, 0x0200000002L); // sleep
|
||||
put(0x00000000d9L, 0x0200000021L); // intlRo
|
||||
put(0x00000000d8L, 0x0200000022L); // intlYen
|
||||
put(0x0000000071L, 0x0200000100L); // controlLeft
|
||||
put(0x0000000072L, 0x0200000101L); // controlRight
|
||||
put(0x000000003bL, 0x0200000102L); // shiftLeft
|
||||
put(0x000000003cL, 0x0200000103L); // shiftRight
|
||||
put(0x0000000039L, 0x0200000104L); // altLeft
|
||||
put(0x000000003aL, 0x0200000105L); // altRight
|
||||
put(0x0000000075L, 0x0200000106L); // metaLeft
|
||||
put(0x0000000076L, 0x0200000107L); // metaRight
|
||||
put(0x00000000a0L, 0x020000020dL); // numpadEnter
|
||||
put(0x00000000a2L, 0x0200000228L); // numpadParenLeft
|
||||
put(0x00000000a3L, 0x0200000229L); // numpadParenRight
|
||||
put(0x000000009bL, 0x020000022aL); // numpadMultiply
|
||||
put(0x000000009dL, 0x020000022bL); // numpadAdd
|
||||
put(0x000000009fL, 0x020000022cL); // numpadComma
|
||||
put(0x000000009cL, 0x020000022dL); // numpadSubtract
|
||||
put(0x000000009eL, 0x020000022eL); // numpadDecimal
|
||||
put(0x000000009aL, 0x020000022fL); // numpadDivide
|
||||
put(0x0000000090L, 0x0200000230L); // numpad0
|
||||
put(0x0000000091L, 0x0200000231L); // numpad1
|
||||
put(0x0000000092L, 0x0200000232L); // numpad2
|
||||
put(0x0000000093L, 0x0200000233L); // numpad3
|
||||
put(0x0000000094L, 0x0200000234L); // numpad4
|
||||
put(0x0000000095L, 0x0200000235L); // numpad5
|
||||
put(0x0000000096L, 0x0200000236L); // numpad6
|
||||
put(0x0000000097L, 0x0200000237L); // numpad7
|
||||
put(0x0000000098L, 0x0200000238L); // numpad8
|
||||
put(0x0000000099L, 0x0200000239L); // numpad9
|
||||
put(0x00000000a1L, 0x020000023dL); // numpadEqual
|
||||
put(0x00000000bcL, 0x0200000301L); // gameButton1
|
||||
put(0x00000000bdL, 0x0200000302L); // gameButton2
|
||||
put(0x00000000beL, 0x0200000303L); // gameButton3
|
||||
put(0x00000000bfL, 0x0200000304L); // gameButton4
|
||||
put(0x00000000c0L, 0x0200000305L); // gameButton5
|
||||
put(0x00000000c1L, 0x0200000306L); // gameButton6
|
||||
put(0x00000000c2L, 0x0200000307L); // gameButton7
|
||||
put(0x00000000c3L, 0x0200000308L); // gameButton8
|
||||
put(0x00000000c4L, 0x0200000309L); // gameButton9
|
||||
put(0x00000000c5L, 0x020000030aL); // gameButton10
|
||||
put(0x00000000c6L, 0x020000030bL); // gameButton11
|
||||
put(0x00000000c7L, 0x020000030cL); // gameButton12
|
||||
put(0x00000000c8L, 0x020000030dL); // gameButton13
|
||||
put(0x00000000c9L, 0x020000030eL); // gameButton14
|
||||
put(0x00000000caL, 0x020000030fL); // gameButton15
|
||||
put(0x00000000cbL, 0x0200000310L); // gameButton16
|
||||
put(0x0000000060L, 0x0200000311L); // gameButtonA
|
||||
put(0x0000000061L, 0x0200000312L); // gameButtonB
|
||||
put(0x0000000062L, 0x0200000313L); // gameButtonC
|
||||
put(0x0000000066L, 0x0200000314L); // gameButtonLeft1
|
||||
put(0x0000000068L, 0x0200000315L); // gameButtonLeft2
|
||||
put(0x000000006eL, 0x0200000316L); // gameButtonMode
|
||||
put(0x0000000067L, 0x0200000317L); // gameButtonRight1
|
||||
put(0x0000000069L, 0x0200000318L); // gameButtonRight2
|
||||
put(0x000000006dL, 0x0200000319L); // gameButtonSelect
|
||||
put(0x000000006cL, 0x020000031aL); // gameButtonStart
|
||||
put(0x000000006aL, 0x020000031bL); // gameButtonThumbLeft
|
||||
put(0x000000006bL, 0x020000031cL); // gameButtonThumbRight
|
||||
put(0x0000000063L, 0x020000031dL); // gameButtonX
|
||||
put(0x0000000064L, 0x020000031eL); // gameButtonY
|
||||
put(0x0000000065L, 0x020000031fL); // gameButtonZ
|
||||
}
|
||||
};
|
||||
|
||||
public static final PressingGoal[] pressingGoals =
|
||||
new PressingGoal[] {
|
||||
new PressingGoal(
|
||||
KeyEvent.META_CTRL_ON,
|
||||
new KeyPair[] {
|
||||
new KeyPair(0x000700e0L, 0x0200000100L), // ControlLeft
|
||||
new KeyPair(0x000700e4L, 0x0200000101L), // ControlRight
|
||||
}),
|
||||
new PressingGoal(
|
||||
KeyEvent.META_SHIFT_ON,
|
||||
new KeyPair[] {
|
||||
new KeyPair(0x000700e1L, 0x0200000102L), // ShiftLeft
|
||||
new KeyPair(0x000700e5L, 0x0200000103L), // ShiftRight
|
||||
}),
|
||||
new PressingGoal(
|
||||
KeyEvent.META_ALT_ON,
|
||||
new KeyPair[] {
|
||||
new KeyPair(0x000700e2L, 0x0200000104L), // AltLeft
|
||||
new KeyPair(0x000700e6L, 0x0200000105L), // AltRight
|
||||
}),
|
||||
};
|
||||
|
||||
/**
|
||||
* A list of toggling modifiers that must be synchronized on each key event.
|
||||
*
|
||||
* <p>The list is not a static variable but constructed by a function, because {@link
|
||||
* TogglingGoal} is mutable.
|
||||
*/
|
||||
public static TogglingGoal[] getTogglingGoals() {
|
||||
return new TogglingGoal[] {
|
||||
new TogglingGoal(KeyEvent.META_CAPS_LOCK_ON, 0x00070039L, 0x0100000104L),
|
||||
};
|
||||
}
|
||||
|
||||
public static final long kValueMask = 0x000ffffffffL;
|
||||
public static final long kUnicodePlane = 0x00000000000L;
|
||||
public static final long kAndroidPlane = 0x01100000000L;
|
||||
}
|
||||
@ -5,6 +5,7 @@ import static org.mockito.Mockito.any;
|
||||
import static org.mockito.Mockito.doAnswer;
|
||||
|
||||
import android.annotation.TargetApi;
|
||||
import android.view.KeyCharacterMap;
|
||||
import android.view.KeyEvent;
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||
import io.flutter.embedding.engine.systemchannels.KeyEventChannel;
|
||||
@ -22,6 +23,8 @@ import org.robolectric.annotation.Config;
|
||||
@TargetApi(28)
|
||||
public class KeyChannelResponderTest {
|
||||
|
||||
private static final int DEAD_KEY = '`' | KeyCharacterMap.COMBINING_ACCENT;
|
||||
|
||||
@Mock KeyEventChannel keyEventChannel;
|
||||
KeyChannelResponder channelResponder;
|
||||
|
||||
@ -52,4 +55,27 @@ public class KeyChannelResponderTest {
|
||||
});
|
||||
assertEquals(completionCallbackInvocationCounter[0], 1);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void basicCombingCharactersTest() {
|
||||
assertEquals(0, (int) channelResponder.applyCombiningCharacterToBaseCharacter(0));
|
||||
assertEquals('A', (int) channelResponder.applyCombiningCharacterToBaseCharacter('A'));
|
||||
assertEquals('B', (int) channelResponder.applyCombiningCharacterToBaseCharacter('B'));
|
||||
assertEquals('B', (int) channelResponder.applyCombiningCharacterToBaseCharacter('B'));
|
||||
assertEquals(0, (int) channelResponder.applyCombiningCharacterToBaseCharacter(0));
|
||||
assertEquals(0, (int) channelResponder.applyCombiningCharacterToBaseCharacter(0));
|
||||
|
||||
assertEquals('`', (int) channelResponder.applyCombiningCharacterToBaseCharacter(DEAD_KEY));
|
||||
assertEquals('`', (int) channelResponder.applyCombiningCharacterToBaseCharacter(DEAD_KEY));
|
||||
assertEquals('À', (int) channelResponder.applyCombiningCharacterToBaseCharacter('A'));
|
||||
|
||||
assertEquals('`', (int) channelResponder.applyCombiningCharacterToBaseCharacter(DEAD_KEY));
|
||||
assertEquals(0, (int) channelResponder.applyCombiningCharacterToBaseCharacter(0));
|
||||
// The 0 input should remove the combining state.
|
||||
assertEquals('A', (int) channelResponder.applyCombiningCharacterToBaseCharacter('A'));
|
||||
|
||||
assertEquals(0, (int) channelResponder.applyCombiningCharacterToBaseCharacter(0));
|
||||
assertEquals('`', (int) channelResponder.applyCombiningCharacterToBaseCharacter(DEAD_KEY));
|
||||
assertEquals('À', (int) channelResponder.applyCombiningCharacterToBaseCharacter('A'));
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -103,7 +103,7 @@ public class InputConnectionAdaptorTest {
|
||||
testView, inputTargetId, textInputChannel, mockKeyboardManager, spyEditable, outAttrs);
|
||||
|
||||
// Send an enter key and make sure the Editable received it.
|
||||
FakeKeyEvent keyEvent = new FakeKeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER, '\n');
|
||||
FakeKeyEvent keyEvent = new FakeKeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER);
|
||||
inputConnectionAdaptor.handleKeyEvent(keyEvent);
|
||||
verify(spyEditable, times(1)).insert(eq(0), anyString());
|
||||
}
|
||||
@ -1115,7 +1115,7 @@ public class InputConnectionAdaptorTest {
|
||||
ListenableEditingState editable = sampleEditable(0, 0);
|
||||
InputConnectionAdaptor adaptor = sampleInputConnectionAdaptor(editable);
|
||||
|
||||
FakeKeyEvent keyEvent = new FakeKeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK, '\b');
|
||||
FakeKeyEvent keyEvent = new FakeKeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK);
|
||||
boolean didConsume = adaptor.handleKeyEvent(keyEvent);
|
||||
|
||||
assertFalse(didConsume);
|
||||
|
||||
@ -9,23 +9,10 @@ public class FakeKeyEvent extends KeyEvent {
|
||||
super(action, keyCode);
|
||||
}
|
||||
|
||||
public FakeKeyEvent(int action, int keyCode, char character) {
|
||||
super(action, keyCode);
|
||||
this.character = character;
|
||||
}
|
||||
|
||||
public FakeKeyEvent(
|
||||
int action, int scancode, int code, int repeat, char character, int metaState) {
|
||||
super(0, 0, action, code, repeat, metaState, 0, scancode);
|
||||
this.character = character;
|
||||
}
|
||||
|
||||
private char character = 0;
|
||||
|
||||
public final int getUnicodeChar() {
|
||||
if (getKeyCode() == KeyEvent.KEYCODE_BACK) {
|
||||
return 0;
|
||||
}
|
||||
return character;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,733 +0,0 @@
|
||||
package io.flutter.util;
|
||||
|
||||
// DO NOT EDIT -- DO NOT EDIT -- DO NOT EDIT
|
||||
// This file is generated by
|
||||
// flutter/flutter:dev/tools/gen_keycodes/bin/gen_keycodes.dart and should not
|
||||
// be edited directly.
|
||||
//
|
||||
// Edit the template
|
||||
// flutter/flutter:dev/tools/gen_keycodes/data/key_codes_java.tmpl
|
||||
// instead.
|
||||
//
|
||||
// See flutter/flutter:dev/tools/gen_keycodes/README.md for more information.
|
||||
|
||||
/**
|
||||
* This class contains keyboard constants to be used in unit tests. They should not be used in
|
||||
* production code.
|
||||
*/
|
||||
public class KeyCodes {
|
||||
public static final long PHYSICAL_HYPER = 0x00000010l;
|
||||
public static final long PHYSICAL_SUPER_KEY = 0x00000011l;
|
||||
public static final long PHYSICAL_FN = 0x00000012l;
|
||||
public static final long PHYSICAL_FN_LOCK = 0x00000013l;
|
||||
public static final long PHYSICAL_SUSPEND = 0x00000014l;
|
||||
public static final long PHYSICAL_RESUME = 0x00000015l;
|
||||
public static final long PHYSICAL_TURBO = 0x00000016l;
|
||||
public static final long PHYSICAL_PRIVACY_SCREEN_TOGGLE = 0x00000017l;
|
||||
public static final long PHYSICAL_MICROPHONE_MUTE_TOGGLE = 0x00000018l;
|
||||
public static final long PHYSICAL_SLEEP = 0x00010082l;
|
||||
public static final long PHYSICAL_WAKE_UP = 0x00010083l;
|
||||
public static final long PHYSICAL_DISPLAY_TOGGLE_INT_EXT = 0x000100b5l;
|
||||
public static final long PHYSICAL_GAME_BUTTON1 = 0x0005ff01l;
|
||||
public static final long PHYSICAL_GAME_BUTTON2 = 0x0005ff02l;
|
||||
public static final long PHYSICAL_GAME_BUTTON3 = 0x0005ff03l;
|
||||
public static final long PHYSICAL_GAME_BUTTON4 = 0x0005ff04l;
|
||||
public static final long PHYSICAL_GAME_BUTTON5 = 0x0005ff05l;
|
||||
public static final long PHYSICAL_GAME_BUTTON6 = 0x0005ff06l;
|
||||
public static final long PHYSICAL_GAME_BUTTON7 = 0x0005ff07l;
|
||||
public static final long PHYSICAL_GAME_BUTTON8 = 0x0005ff08l;
|
||||
public static final long PHYSICAL_GAME_BUTTON9 = 0x0005ff09l;
|
||||
public static final long PHYSICAL_GAME_BUTTON10 = 0x0005ff0al;
|
||||
public static final long PHYSICAL_GAME_BUTTON11 = 0x0005ff0bl;
|
||||
public static final long PHYSICAL_GAME_BUTTON12 = 0x0005ff0cl;
|
||||
public static final long PHYSICAL_GAME_BUTTON13 = 0x0005ff0dl;
|
||||
public static final long PHYSICAL_GAME_BUTTON14 = 0x0005ff0el;
|
||||
public static final long PHYSICAL_GAME_BUTTON15 = 0x0005ff0fl;
|
||||
public static final long PHYSICAL_GAME_BUTTON16 = 0x0005ff10l;
|
||||
public static final long PHYSICAL_GAME_BUTTON_A = 0x0005ff11l;
|
||||
public static final long PHYSICAL_GAME_BUTTON_B = 0x0005ff12l;
|
||||
public static final long PHYSICAL_GAME_BUTTON_C = 0x0005ff13l;
|
||||
public static final long PHYSICAL_GAME_BUTTON_LEFT1 = 0x0005ff14l;
|
||||
public static final long PHYSICAL_GAME_BUTTON_LEFT2 = 0x0005ff15l;
|
||||
public static final long PHYSICAL_GAME_BUTTON_MODE = 0x0005ff16l;
|
||||
public static final long PHYSICAL_GAME_BUTTON_RIGHT1 = 0x0005ff17l;
|
||||
public static final long PHYSICAL_GAME_BUTTON_RIGHT2 = 0x0005ff18l;
|
||||
public static final long PHYSICAL_GAME_BUTTON_SELECT = 0x0005ff19l;
|
||||
public static final long PHYSICAL_GAME_BUTTON_START = 0x0005ff1al;
|
||||
public static final long PHYSICAL_GAME_BUTTON_THUMB_LEFT = 0x0005ff1bl;
|
||||
public static final long PHYSICAL_GAME_BUTTON_THUMB_RIGHT = 0x0005ff1cl;
|
||||
public static final long PHYSICAL_GAME_BUTTON_X = 0x0005ff1dl;
|
||||
public static final long PHYSICAL_GAME_BUTTON_Y = 0x0005ff1el;
|
||||
public static final long PHYSICAL_GAME_BUTTON_Z = 0x0005ff1fl;
|
||||
public static final long PHYSICAL_USB_RESERVED = 0x00070000l;
|
||||
public static final long PHYSICAL_USB_ERROR_ROLL_OVER = 0x00070001l;
|
||||
public static final long PHYSICAL_USB_POST_FAIL = 0x00070002l;
|
||||
public static final long PHYSICAL_USB_ERROR_UNDEFINED = 0x00070003l;
|
||||
public static final long PHYSICAL_KEY_A = 0x00070004l;
|
||||
public static final long PHYSICAL_KEY_B = 0x00070005l;
|
||||
public static final long PHYSICAL_KEY_C = 0x00070006l;
|
||||
public static final long PHYSICAL_KEY_D = 0x00070007l;
|
||||
public static final long PHYSICAL_KEY_E = 0x00070008l;
|
||||
public static final long PHYSICAL_KEY_F = 0x00070009l;
|
||||
public static final long PHYSICAL_KEY_G = 0x0007000al;
|
||||
public static final long PHYSICAL_KEY_H = 0x0007000bl;
|
||||
public static final long PHYSICAL_KEY_I = 0x0007000cl;
|
||||
public static final long PHYSICAL_KEY_J = 0x0007000dl;
|
||||
public static final long PHYSICAL_KEY_K = 0x0007000el;
|
||||
public static final long PHYSICAL_KEY_L = 0x0007000fl;
|
||||
public static final long PHYSICAL_KEY_M = 0x00070010l;
|
||||
public static final long PHYSICAL_KEY_N = 0x00070011l;
|
||||
public static final long PHYSICAL_KEY_O = 0x00070012l;
|
||||
public static final long PHYSICAL_KEY_P = 0x00070013l;
|
||||
public static final long PHYSICAL_KEY_Q = 0x00070014l;
|
||||
public static final long PHYSICAL_KEY_R = 0x00070015l;
|
||||
public static final long PHYSICAL_KEY_S = 0x00070016l;
|
||||
public static final long PHYSICAL_KEY_T = 0x00070017l;
|
||||
public static final long PHYSICAL_KEY_U = 0x00070018l;
|
||||
public static final long PHYSICAL_KEY_V = 0x00070019l;
|
||||
public static final long PHYSICAL_KEY_W = 0x0007001al;
|
||||
public static final long PHYSICAL_KEY_X = 0x0007001bl;
|
||||
public static final long PHYSICAL_KEY_Y = 0x0007001cl;
|
||||
public static final long PHYSICAL_KEY_Z = 0x0007001dl;
|
||||
public static final long PHYSICAL_DIGIT1 = 0x0007001el;
|
||||
public static final long PHYSICAL_DIGIT2 = 0x0007001fl;
|
||||
public static final long PHYSICAL_DIGIT3 = 0x00070020l;
|
||||
public static final long PHYSICAL_DIGIT4 = 0x00070021l;
|
||||
public static final long PHYSICAL_DIGIT5 = 0x00070022l;
|
||||
public static final long PHYSICAL_DIGIT6 = 0x00070023l;
|
||||
public static final long PHYSICAL_DIGIT7 = 0x00070024l;
|
||||
public static final long PHYSICAL_DIGIT8 = 0x00070025l;
|
||||
public static final long PHYSICAL_DIGIT9 = 0x00070026l;
|
||||
public static final long PHYSICAL_DIGIT0 = 0x00070027l;
|
||||
public static final long PHYSICAL_ENTER = 0x00070028l;
|
||||
public static final long PHYSICAL_ESCAPE = 0x00070029l;
|
||||
public static final long PHYSICAL_BACKSPACE = 0x0007002al;
|
||||
public static final long PHYSICAL_TAB = 0x0007002bl;
|
||||
public static final long PHYSICAL_SPACE = 0x0007002cl;
|
||||
public static final long PHYSICAL_MINUS = 0x0007002dl;
|
||||
public static final long PHYSICAL_EQUAL = 0x0007002el;
|
||||
public static final long PHYSICAL_BRACKET_LEFT = 0x0007002fl;
|
||||
public static final long PHYSICAL_BRACKET_RIGHT = 0x00070030l;
|
||||
public static final long PHYSICAL_BACKSLASH = 0x00070031l;
|
||||
public static final long PHYSICAL_SEMICOLON = 0x00070033l;
|
||||
public static final long PHYSICAL_QUOTE = 0x00070034l;
|
||||
public static final long PHYSICAL_BACKQUOTE = 0x00070035l;
|
||||
public static final long PHYSICAL_COMMA = 0x00070036l;
|
||||
public static final long PHYSICAL_PERIOD = 0x00070037l;
|
||||
public static final long PHYSICAL_SLASH = 0x00070038l;
|
||||
public static final long PHYSICAL_CAPS_LOCK = 0x00070039l;
|
||||
public static final long PHYSICAL_F1 = 0x0007003al;
|
||||
public static final long PHYSICAL_F2 = 0x0007003bl;
|
||||
public static final long PHYSICAL_F3 = 0x0007003cl;
|
||||
public static final long PHYSICAL_F4 = 0x0007003dl;
|
||||
public static final long PHYSICAL_F5 = 0x0007003el;
|
||||
public static final long PHYSICAL_F6 = 0x0007003fl;
|
||||
public static final long PHYSICAL_F7 = 0x00070040l;
|
||||
public static final long PHYSICAL_F8 = 0x00070041l;
|
||||
public static final long PHYSICAL_F9 = 0x00070042l;
|
||||
public static final long PHYSICAL_F10 = 0x00070043l;
|
||||
public static final long PHYSICAL_F11 = 0x00070044l;
|
||||
public static final long PHYSICAL_F12 = 0x00070045l;
|
||||
public static final long PHYSICAL_PRINT_SCREEN = 0x00070046l;
|
||||
public static final long PHYSICAL_SCROLL_LOCK = 0x00070047l;
|
||||
public static final long PHYSICAL_PAUSE = 0x00070048l;
|
||||
public static final long PHYSICAL_INSERT = 0x00070049l;
|
||||
public static final long PHYSICAL_HOME = 0x0007004al;
|
||||
public static final long PHYSICAL_PAGE_UP = 0x0007004bl;
|
||||
public static final long PHYSICAL_DELETE = 0x0007004cl;
|
||||
public static final long PHYSICAL_END = 0x0007004dl;
|
||||
public static final long PHYSICAL_PAGE_DOWN = 0x0007004el;
|
||||
public static final long PHYSICAL_ARROW_RIGHT = 0x0007004fl;
|
||||
public static final long PHYSICAL_ARROW_LEFT = 0x00070050l;
|
||||
public static final long PHYSICAL_ARROW_DOWN = 0x00070051l;
|
||||
public static final long PHYSICAL_ARROW_UP = 0x00070052l;
|
||||
public static final long PHYSICAL_NUM_LOCK = 0x00070053l;
|
||||
public static final long PHYSICAL_NUMPAD_DIVIDE = 0x00070054l;
|
||||
public static final long PHYSICAL_NUMPAD_MULTIPLY = 0x00070055l;
|
||||
public static final long PHYSICAL_NUMPAD_SUBTRACT = 0x00070056l;
|
||||
public static final long PHYSICAL_NUMPAD_ADD = 0x00070057l;
|
||||
public static final long PHYSICAL_NUMPAD_ENTER = 0x00070058l;
|
||||
public static final long PHYSICAL_NUMPAD1 = 0x00070059l;
|
||||
public static final long PHYSICAL_NUMPAD2 = 0x0007005al;
|
||||
public static final long PHYSICAL_NUMPAD3 = 0x0007005bl;
|
||||
public static final long PHYSICAL_NUMPAD4 = 0x0007005cl;
|
||||
public static final long PHYSICAL_NUMPAD5 = 0x0007005dl;
|
||||
public static final long PHYSICAL_NUMPAD6 = 0x0007005el;
|
||||
public static final long PHYSICAL_NUMPAD7 = 0x0007005fl;
|
||||
public static final long PHYSICAL_NUMPAD8 = 0x00070060l;
|
||||
public static final long PHYSICAL_NUMPAD9 = 0x00070061l;
|
||||
public static final long PHYSICAL_NUMPAD0 = 0x00070062l;
|
||||
public static final long PHYSICAL_NUMPAD_DECIMAL = 0x00070063l;
|
||||
public static final long PHYSICAL_INTL_BACKSLASH = 0x00070064l;
|
||||
public static final long PHYSICAL_CONTEXT_MENU = 0x00070065l;
|
||||
public static final long PHYSICAL_POWER = 0x00070066l;
|
||||
public static final long PHYSICAL_NUMPAD_EQUAL = 0x00070067l;
|
||||
public static final long PHYSICAL_F13 = 0x00070068l;
|
||||
public static final long PHYSICAL_F14 = 0x00070069l;
|
||||
public static final long PHYSICAL_F15 = 0x0007006al;
|
||||
public static final long PHYSICAL_F16 = 0x0007006bl;
|
||||
public static final long PHYSICAL_F17 = 0x0007006cl;
|
||||
public static final long PHYSICAL_F18 = 0x0007006dl;
|
||||
public static final long PHYSICAL_F19 = 0x0007006el;
|
||||
public static final long PHYSICAL_F20 = 0x0007006fl;
|
||||
public static final long PHYSICAL_F21 = 0x00070070l;
|
||||
public static final long PHYSICAL_F22 = 0x00070071l;
|
||||
public static final long PHYSICAL_F23 = 0x00070072l;
|
||||
public static final long PHYSICAL_F24 = 0x00070073l;
|
||||
public static final long PHYSICAL_OPEN = 0x00070074l;
|
||||
public static final long PHYSICAL_HELP = 0x00070075l;
|
||||
public static final long PHYSICAL_SELECT = 0x00070077l;
|
||||
public static final long PHYSICAL_AGAIN = 0x00070079l;
|
||||
public static final long PHYSICAL_UNDO = 0x0007007al;
|
||||
public static final long PHYSICAL_CUT = 0x0007007bl;
|
||||
public static final long PHYSICAL_COPY = 0x0007007cl;
|
||||
public static final long PHYSICAL_PASTE = 0x0007007dl;
|
||||
public static final long PHYSICAL_FIND = 0x0007007el;
|
||||
public static final long PHYSICAL_AUDIO_VOLUME_MUTE = 0x0007007fl;
|
||||
public static final long PHYSICAL_AUDIO_VOLUME_UP = 0x00070080l;
|
||||
public static final long PHYSICAL_AUDIO_VOLUME_DOWN = 0x00070081l;
|
||||
public static final long PHYSICAL_NUMPAD_COMMA = 0x00070085l;
|
||||
public static final long PHYSICAL_INTL_RO = 0x00070087l;
|
||||
public static final long PHYSICAL_KANA_MODE = 0x00070088l;
|
||||
public static final long PHYSICAL_INTL_YEN = 0x00070089l;
|
||||
public static final long PHYSICAL_CONVERT = 0x0007008al;
|
||||
public static final long PHYSICAL_NON_CONVERT = 0x0007008bl;
|
||||
public static final long PHYSICAL_LANG1 = 0x00070090l;
|
||||
public static final long PHYSICAL_LANG2 = 0x00070091l;
|
||||
public static final long PHYSICAL_LANG3 = 0x00070092l;
|
||||
public static final long PHYSICAL_LANG4 = 0x00070093l;
|
||||
public static final long PHYSICAL_LANG5 = 0x00070094l;
|
||||
public static final long PHYSICAL_ABORT = 0x0007009bl;
|
||||
public static final long PHYSICAL_PROPS = 0x000700a3l;
|
||||
public static final long PHYSICAL_NUMPAD_PAREN_LEFT = 0x000700b6l;
|
||||
public static final long PHYSICAL_NUMPAD_PAREN_RIGHT = 0x000700b7l;
|
||||
public static final long PHYSICAL_NUMPAD_BACKSPACE = 0x000700bbl;
|
||||
public static final long PHYSICAL_NUMPAD_MEMORY_STORE = 0x000700d0l;
|
||||
public static final long PHYSICAL_NUMPAD_MEMORY_RECALL = 0x000700d1l;
|
||||
public static final long PHYSICAL_NUMPAD_MEMORY_CLEAR = 0x000700d2l;
|
||||
public static final long PHYSICAL_NUMPAD_MEMORY_ADD = 0x000700d3l;
|
||||
public static final long PHYSICAL_NUMPAD_MEMORY_SUBTRACT = 0x000700d4l;
|
||||
public static final long PHYSICAL_NUMPAD_SIGN_CHANGE = 0x000700d7l;
|
||||
public static final long PHYSICAL_NUMPAD_CLEAR = 0x000700d8l;
|
||||
public static final long PHYSICAL_NUMPAD_CLEAR_ENTRY = 0x000700d9l;
|
||||
public static final long PHYSICAL_CONTROL_LEFT = 0x000700e0l;
|
||||
public static final long PHYSICAL_SHIFT_LEFT = 0x000700e1l;
|
||||
public static final long PHYSICAL_ALT_LEFT = 0x000700e2l;
|
||||
public static final long PHYSICAL_META_LEFT = 0x000700e3l;
|
||||
public static final long PHYSICAL_CONTROL_RIGHT = 0x000700e4l;
|
||||
public static final long PHYSICAL_SHIFT_RIGHT = 0x000700e5l;
|
||||
public static final long PHYSICAL_ALT_RIGHT = 0x000700e6l;
|
||||
public static final long PHYSICAL_META_RIGHT = 0x000700e7l;
|
||||
public static final long PHYSICAL_INFO = 0x000c0060l;
|
||||
public static final long PHYSICAL_CLOSED_CAPTION_TOGGLE = 0x000c0061l;
|
||||
public static final long PHYSICAL_BRIGHTNESS_UP = 0x000c006fl;
|
||||
public static final long PHYSICAL_BRIGHTNESS_DOWN = 0x000c0070l;
|
||||
public static final long PHYSICAL_BRIGHTNESS_TOGGLE = 0x000c0072l;
|
||||
public static final long PHYSICAL_BRIGHTNESS_MINIMUM = 0x000c0073l;
|
||||
public static final long PHYSICAL_BRIGHTNESS_MAXIMUM = 0x000c0074l;
|
||||
public static final long PHYSICAL_BRIGHTNESS_AUTO = 0x000c0075l;
|
||||
public static final long PHYSICAL_KBD_ILLUM_UP = 0x000c0079l;
|
||||
public static final long PHYSICAL_KBD_ILLUM_DOWN = 0x000c007al;
|
||||
public static final long PHYSICAL_MEDIA_LAST = 0x000c0083l;
|
||||
public static final long PHYSICAL_LAUNCH_PHONE = 0x000c008cl;
|
||||
public static final long PHYSICAL_PROGRAM_GUIDE = 0x000c008dl;
|
||||
public static final long PHYSICAL_EXIT = 0x000c0094l;
|
||||
public static final long PHYSICAL_CHANNEL_UP = 0x000c009cl;
|
||||
public static final long PHYSICAL_CHANNEL_DOWN = 0x000c009dl;
|
||||
public static final long PHYSICAL_MEDIA_PLAY = 0x000c00b0l;
|
||||
public static final long PHYSICAL_MEDIA_PAUSE = 0x000c00b1l;
|
||||
public static final long PHYSICAL_MEDIA_RECORD = 0x000c00b2l;
|
||||
public static final long PHYSICAL_MEDIA_FAST_FORWARD = 0x000c00b3l;
|
||||
public static final long PHYSICAL_MEDIA_REWIND = 0x000c00b4l;
|
||||
public static final long PHYSICAL_MEDIA_TRACK_NEXT = 0x000c00b5l;
|
||||
public static final long PHYSICAL_MEDIA_TRACK_PREVIOUS = 0x000c00b6l;
|
||||
public static final long PHYSICAL_MEDIA_STOP = 0x000c00b7l;
|
||||
public static final long PHYSICAL_EJECT = 0x000c00b8l;
|
||||
public static final long PHYSICAL_MEDIA_PLAY_PAUSE = 0x000c00cdl;
|
||||
public static final long PHYSICAL_SPEECH_INPUT_TOGGLE = 0x000c00cfl;
|
||||
public static final long PHYSICAL_BASS_BOOST = 0x000c00e5l;
|
||||
public static final long PHYSICAL_MEDIA_SELECT = 0x000c0183l;
|
||||
public static final long PHYSICAL_LAUNCH_WORD_PROCESSOR = 0x000c0184l;
|
||||
public static final long PHYSICAL_LAUNCH_SPREADSHEET = 0x000c0186l;
|
||||
public static final long PHYSICAL_LAUNCH_MAIL = 0x000c018al;
|
||||
public static final long PHYSICAL_LAUNCH_CONTACTS = 0x000c018dl;
|
||||
public static final long PHYSICAL_LAUNCH_CALENDAR = 0x000c018el;
|
||||
public static final long PHYSICAL_LAUNCH_APP2 = 0x000c0192l;
|
||||
public static final long PHYSICAL_LAUNCH_APP1 = 0x000c0194l;
|
||||
public static final long PHYSICAL_LAUNCH_INTERNET_BROWSER = 0x000c0196l;
|
||||
public static final long PHYSICAL_LOG_OFF = 0x000c019cl;
|
||||
public static final long PHYSICAL_LOCK_SCREEN = 0x000c019el;
|
||||
public static final long PHYSICAL_LAUNCH_CONTROL_PANEL = 0x000c019fl;
|
||||
public static final long PHYSICAL_SELECT_TASK = 0x000c01a2l;
|
||||
public static final long PHYSICAL_LAUNCH_DOCUMENTS = 0x000c01a7l;
|
||||
public static final long PHYSICAL_SPELL_CHECK = 0x000c01abl;
|
||||
public static final long PHYSICAL_LAUNCH_KEYBOARD_LAYOUT = 0x000c01ael;
|
||||
public static final long PHYSICAL_LAUNCH_SCREEN_SAVER = 0x000c01b1l;
|
||||
public static final long PHYSICAL_LAUNCH_AUDIO_BROWSER = 0x000c01b7l;
|
||||
public static final long PHYSICAL_LAUNCH_ASSISTANT = 0x000c01cbl;
|
||||
public static final long PHYSICAL_NEW_KEY = 0x000c0201l;
|
||||
public static final long PHYSICAL_CLOSE = 0x000c0203l;
|
||||
public static final long PHYSICAL_SAVE = 0x000c0207l;
|
||||
public static final long PHYSICAL_PRINT = 0x000c0208l;
|
||||
public static final long PHYSICAL_BROWSER_SEARCH = 0x000c0221l;
|
||||
public static final long PHYSICAL_BROWSER_HOME = 0x000c0223l;
|
||||
public static final long PHYSICAL_BROWSER_BACK = 0x000c0224l;
|
||||
public static final long PHYSICAL_BROWSER_FORWARD = 0x000c0225l;
|
||||
public static final long PHYSICAL_BROWSER_STOP = 0x000c0226l;
|
||||
public static final long PHYSICAL_BROWSER_REFRESH = 0x000c0227l;
|
||||
public static final long PHYSICAL_BROWSER_FAVORITES = 0x000c022al;
|
||||
public static final long PHYSICAL_ZOOM_IN = 0x000c022dl;
|
||||
public static final long PHYSICAL_ZOOM_OUT = 0x000c022el;
|
||||
public static final long PHYSICAL_ZOOM_TOGGLE = 0x000c0232l;
|
||||
public static final long PHYSICAL_REDO = 0x000c0279l;
|
||||
public static final long PHYSICAL_MAIL_REPLY = 0x000c0289l;
|
||||
public static final long PHYSICAL_MAIL_FORWARD = 0x000c028bl;
|
||||
public static final long PHYSICAL_MAIL_SEND = 0x000c028cl;
|
||||
public static final long PHYSICAL_KEYBOARD_LAYOUT_SELECT = 0x000c029dl;
|
||||
public static final long PHYSICAL_SHOW_ALL_WINDOWS = 0x000c029fl;
|
||||
|
||||
public static final long LOGICAL_SPACE = 0x00000000020l;
|
||||
public static final long LOGICAL_EXCLAMATION = 0x00000000021l;
|
||||
public static final long LOGICAL_QUOTE = 0x00000000022l;
|
||||
public static final long LOGICAL_NUMBER_SIGN = 0x00000000023l;
|
||||
public static final long LOGICAL_DOLLAR = 0x00000000024l;
|
||||
public static final long LOGICAL_PERCENT = 0x00000000025l;
|
||||
public static final long LOGICAL_AMPERSAND = 0x00000000026l;
|
||||
public static final long LOGICAL_QUOTE_SINGLE = 0x00000000027l;
|
||||
public static final long LOGICAL_PARENTHESIS_LEFT = 0x00000000028l;
|
||||
public static final long LOGICAL_PARENTHESIS_RIGHT = 0x00000000029l;
|
||||
public static final long LOGICAL_ASTERISK = 0x0000000002al;
|
||||
public static final long LOGICAL_ADD = 0x0000000002bl;
|
||||
public static final long LOGICAL_COMMA = 0x0000000002cl;
|
||||
public static final long LOGICAL_MINUS = 0x0000000002dl;
|
||||
public static final long LOGICAL_PERIOD = 0x0000000002el;
|
||||
public static final long LOGICAL_SLASH = 0x0000000002fl;
|
||||
public static final long LOGICAL_DIGIT0 = 0x00000000030l;
|
||||
public static final long LOGICAL_DIGIT1 = 0x00000000031l;
|
||||
public static final long LOGICAL_DIGIT2 = 0x00000000032l;
|
||||
public static final long LOGICAL_DIGIT3 = 0x00000000033l;
|
||||
public static final long LOGICAL_DIGIT4 = 0x00000000034l;
|
||||
public static final long LOGICAL_DIGIT5 = 0x00000000035l;
|
||||
public static final long LOGICAL_DIGIT6 = 0x00000000036l;
|
||||
public static final long LOGICAL_DIGIT7 = 0x00000000037l;
|
||||
public static final long LOGICAL_DIGIT8 = 0x00000000038l;
|
||||
public static final long LOGICAL_DIGIT9 = 0x00000000039l;
|
||||
public static final long LOGICAL_COLON = 0x0000000003al;
|
||||
public static final long LOGICAL_SEMICOLON = 0x0000000003bl;
|
||||
public static final long LOGICAL_LESS = 0x0000000003cl;
|
||||
public static final long LOGICAL_EQUAL = 0x0000000003dl;
|
||||
public static final long LOGICAL_GREATER = 0x0000000003el;
|
||||
public static final long LOGICAL_QUESTION = 0x0000000003fl;
|
||||
public static final long LOGICAL_AT = 0x00000000040l;
|
||||
public static final long LOGICAL_BRACKET_LEFT = 0x0000000005bl;
|
||||
public static final long LOGICAL_BACKSLASH = 0x0000000005cl;
|
||||
public static final long LOGICAL_BRACKET_RIGHT = 0x0000000005dl;
|
||||
public static final long LOGICAL_CARET = 0x0000000005el;
|
||||
public static final long LOGICAL_UNDERSCORE = 0x0000000005fl;
|
||||
public static final long LOGICAL_BACKQUOTE = 0x00000000060l;
|
||||
public static final long LOGICAL_KEY_A = 0x00000000061l;
|
||||
public static final long LOGICAL_KEY_B = 0x00000000062l;
|
||||
public static final long LOGICAL_KEY_C = 0x00000000063l;
|
||||
public static final long LOGICAL_KEY_D = 0x00000000064l;
|
||||
public static final long LOGICAL_KEY_E = 0x00000000065l;
|
||||
public static final long LOGICAL_KEY_F = 0x00000000066l;
|
||||
public static final long LOGICAL_KEY_G = 0x00000000067l;
|
||||
public static final long LOGICAL_KEY_H = 0x00000000068l;
|
||||
public static final long LOGICAL_KEY_I = 0x00000000069l;
|
||||
public static final long LOGICAL_KEY_J = 0x0000000006al;
|
||||
public static final long LOGICAL_KEY_K = 0x0000000006bl;
|
||||
public static final long LOGICAL_KEY_L = 0x0000000006cl;
|
||||
public static final long LOGICAL_KEY_M = 0x0000000006dl;
|
||||
public static final long LOGICAL_KEY_N = 0x0000000006el;
|
||||
public static final long LOGICAL_KEY_O = 0x0000000006fl;
|
||||
public static final long LOGICAL_KEY_P = 0x00000000070l;
|
||||
public static final long LOGICAL_KEY_Q = 0x00000000071l;
|
||||
public static final long LOGICAL_KEY_R = 0x00000000072l;
|
||||
public static final long LOGICAL_KEY_S = 0x00000000073l;
|
||||
public static final long LOGICAL_KEY_T = 0x00000000074l;
|
||||
public static final long LOGICAL_KEY_U = 0x00000000075l;
|
||||
public static final long LOGICAL_KEY_V = 0x00000000076l;
|
||||
public static final long LOGICAL_KEY_W = 0x00000000077l;
|
||||
public static final long LOGICAL_KEY_X = 0x00000000078l;
|
||||
public static final long LOGICAL_KEY_Y = 0x00000000079l;
|
||||
public static final long LOGICAL_KEY_Z = 0x0000000007al;
|
||||
public static final long LOGICAL_BRACE_LEFT = 0x0000000007bl;
|
||||
public static final long LOGICAL_BAR = 0x0000000007cl;
|
||||
public static final long LOGICAL_BRACE_RIGHT = 0x0000000007dl;
|
||||
public static final long LOGICAL_TILDE = 0x0000000007el;
|
||||
public static final long LOGICAL_UNIDENTIFIED = 0x00100000001l;
|
||||
public static final long LOGICAL_BACKSPACE = 0x00100000008l;
|
||||
public static final long LOGICAL_TAB = 0x00100000009l;
|
||||
public static final long LOGICAL_ENTER = 0x0010000000dl;
|
||||
public static final long LOGICAL_ESCAPE = 0x0010000001bl;
|
||||
public static final long LOGICAL_DELETE = 0x0010000007fl;
|
||||
public static final long LOGICAL_ACCEL = 0x00100000101l;
|
||||
public static final long LOGICAL_ALT_GRAPH = 0x00100000103l;
|
||||
public static final long LOGICAL_CAPS_LOCK = 0x00100000104l;
|
||||
public static final long LOGICAL_FN = 0x00100000106l;
|
||||
public static final long LOGICAL_FN_LOCK = 0x00100000107l;
|
||||
public static final long LOGICAL_HYPER = 0x00100000108l;
|
||||
public static final long LOGICAL_NUM_LOCK = 0x0010000010al;
|
||||
public static final long LOGICAL_SCROLL_LOCK = 0x0010000010cl;
|
||||
public static final long LOGICAL_SUPER_KEY = 0x0010000010el;
|
||||
public static final long LOGICAL_SYMBOL = 0x0010000010fl;
|
||||
public static final long LOGICAL_SYMBOL_LOCK = 0x00100000110l;
|
||||
public static final long LOGICAL_SHIFT_LEVEL5 = 0x00100000111l;
|
||||
public static final long LOGICAL_ARROW_DOWN = 0x00100000301l;
|
||||
public static final long LOGICAL_ARROW_LEFT = 0x00100000302l;
|
||||
public static final long LOGICAL_ARROW_RIGHT = 0x00100000303l;
|
||||
public static final long LOGICAL_ARROW_UP = 0x00100000304l;
|
||||
public static final long LOGICAL_END = 0x00100000305l;
|
||||
public static final long LOGICAL_HOME = 0x00100000306l;
|
||||
public static final long LOGICAL_PAGE_DOWN = 0x00100000307l;
|
||||
public static final long LOGICAL_PAGE_UP = 0x00100000308l;
|
||||
public static final long LOGICAL_CLEAR = 0x00100000401l;
|
||||
public static final long LOGICAL_COPY = 0x00100000402l;
|
||||
public static final long LOGICAL_CR_SEL = 0x00100000403l;
|
||||
public static final long LOGICAL_CUT = 0x00100000404l;
|
||||
public static final long LOGICAL_ERASE_EOF = 0x00100000405l;
|
||||
public static final long LOGICAL_EX_SEL = 0x00100000406l;
|
||||
public static final long LOGICAL_INSERT = 0x00100000407l;
|
||||
public static final long LOGICAL_PASTE = 0x00100000408l;
|
||||
public static final long LOGICAL_REDO = 0x00100000409l;
|
||||
public static final long LOGICAL_UNDO = 0x0010000040al;
|
||||
public static final long LOGICAL_ACCEPT = 0x00100000501l;
|
||||
public static final long LOGICAL_AGAIN = 0x00100000502l;
|
||||
public static final long LOGICAL_ATTN = 0x00100000503l;
|
||||
public static final long LOGICAL_CANCEL = 0x00100000504l;
|
||||
public static final long LOGICAL_CONTEXT_MENU = 0x00100000505l;
|
||||
public static final long LOGICAL_EXECUTE = 0x00100000506l;
|
||||
public static final long LOGICAL_FIND = 0x00100000507l;
|
||||
public static final long LOGICAL_HELP = 0x00100000508l;
|
||||
public static final long LOGICAL_PAUSE = 0x00100000509l;
|
||||
public static final long LOGICAL_PLAY = 0x0010000050al;
|
||||
public static final long LOGICAL_PROPS = 0x0010000050bl;
|
||||
public static final long LOGICAL_SELECT = 0x0010000050cl;
|
||||
public static final long LOGICAL_ZOOM_IN = 0x0010000050dl;
|
||||
public static final long LOGICAL_ZOOM_OUT = 0x0010000050el;
|
||||
public static final long LOGICAL_BRIGHTNESS_DOWN = 0x00100000601l;
|
||||
public static final long LOGICAL_BRIGHTNESS_UP = 0x00100000602l;
|
||||
public static final long LOGICAL_CAMERA = 0x00100000603l;
|
||||
public static final long LOGICAL_EJECT = 0x00100000604l;
|
||||
public static final long LOGICAL_LOG_OFF = 0x00100000605l;
|
||||
public static final long LOGICAL_POWER = 0x00100000606l;
|
||||
public static final long LOGICAL_POWER_OFF = 0x00100000607l;
|
||||
public static final long LOGICAL_PRINT_SCREEN = 0x00100000608l;
|
||||
public static final long LOGICAL_HIBERNATE = 0x00100000609l;
|
||||
public static final long LOGICAL_STANDBY = 0x0010000060al;
|
||||
public static final long LOGICAL_WAKE_UP = 0x0010000060bl;
|
||||
public static final long LOGICAL_ALL_CANDIDATES = 0x00100000701l;
|
||||
public static final long LOGICAL_ALPHANUMERIC = 0x00100000702l;
|
||||
public static final long LOGICAL_CODE_INPUT = 0x00100000703l;
|
||||
public static final long LOGICAL_COMPOSE = 0x00100000704l;
|
||||
public static final long LOGICAL_CONVERT = 0x00100000705l;
|
||||
public static final long LOGICAL_FINAL_MODE = 0x00100000706l;
|
||||
public static final long LOGICAL_GROUP_FIRST = 0x00100000707l;
|
||||
public static final long LOGICAL_GROUP_LAST = 0x00100000708l;
|
||||
public static final long LOGICAL_GROUP_NEXT = 0x00100000709l;
|
||||
public static final long LOGICAL_GROUP_PREVIOUS = 0x0010000070al;
|
||||
public static final long LOGICAL_MODE_CHANGE = 0x0010000070bl;
|
||||
public static final long LOGICAL_NEXT_CANDIDATE = 0x0010000070cl;
|
||||
public static final long LOGICAL_NON_CONVERT = 0x0010000070dl;
|
||||
public static final long LOGICAL_PREVIOUS_CANDIDATE = 0x0010000070el;
|
||||
public static final long LOGICAL_PROCESS = 0x0010000070fl;
|
||||
public static final long LOGICAL_SINGLE_CANDIDATE = 0x00100000710l;
|
||||
public static final long LOGICAL_HANGUL_MODE = 0x00100000711l;
|
||||
public static final long LOGICAL_HANJA_MODE = 0x00100000712l;
|
||||
public static final long LOGICAL_JUNJA_MODE = 0x00100000713l;
|
||||
public static final long LOGICAL_EISU = 0x00100000714l;
|
||||
public static final long LOGICAL_HANKAKU = 0x00100000715l;
|
||||
public static final long LOGICAL_HIRAGANA = 0x00100000716l;
|
||||
public static final long LOGICAL_HIRAGANA_KATAKANA = 0x00100000717l;
|
||||
public static final long LOGICAL_KANA_MODE = 0x00100000718l;
|
||||
public static final long LOGICAL_KANJI_MODE = 0x00100000719l;
|
||||
public static final long LOGICAL_KATAKANA = 0x0010000071al;
|
||||
public static final long LOGICAL_ROMAJI = 0x0010000071bl;
|
||||
public static final long LOGICAL_ZENKAKU = 0x0010000071cl;
|
||||
public static final long LOGICAL_ZENKAKU_HANKAKU = 0x0010000071dl;
|
||||
public static final long LOGICAL_F1 = 0x00100000801l;
|
||||
public static final long LOGICAL_F2 = 0x00100000802l;
|
||||
public static final long LOGICAL_F3 = 0x00100000803l;
|
||||
public static final long LOGICAL_F4 = 0x00100000804l;
|
||||
public static final long LOGICAL_F5 = 0x00100000805l;
|
||||
public static final long LOGICAL_F6 = 0x00100000806l;
|
||||
public static final long LOGICAL_F7 = 0x00100000807l;
|
||||
public static final long LOGICAL_F8 = 0x00100000808l;
|
||||
public static final long LOGICAL_F9 = 0x00100000809l;
|
||||
public static final long LOGICAL_F10 = 0x0010000080al;
|
||||
public static final long LOGICAL_F11 = 0x0010000080bl;
|
||||
public static final long LOGICAL_F12 = 0x0010000080cl;
|
||||
public static final long LOGICAL_F13 = 0x0010000080dl;
|
||||
public static final long LOGICAL_F14 = 0x0010000080el;
|
||||
public static final long LOGICAL_F15 = 0x0010000080fl;
|
||||
public static final long LOGICAL_F16 = 0x00100000810l;
|
||||
public static final long LOGICAL_F17 = 0x00100000811l;
|
||||
public static final long LOGICAL_F18 = 0x00100000812l;
|
||||
public static final long LOGICAL_F19 = 0x00100000813l;
|
||||
public static final long LOGICAL_F20 = 0x00100000814l;
|
||||
public static final long LOGICAL_F21 = 0x00100000815l;
|
||||
public static final long LOGICAL_F22 = 0x00100000816l;
|
||||
public static final long LOGICAL_F23 = 0x00100000817l;
|
||||
public static final long LOGICAL_F24 = 0x00100000818l;
|
||||
public static final long LOGICAL_SOFT1 = 0x00100000901l;
|
||||
public static final long LOGICAL_SOFT2 = 0x00100000902l;
|
||||
public static final long LOGICAL_SOFT3 = 0x00100000903l;
|
||||
public static final long LOGICAL_SOFT4 = 0x00100000904l;
|
||||
public static final long LOGICAL_SOFT5 = 0x00100000905l;
|
||||
public static final long LOGICAL_SOFT6 = 0x00100000906l;
|
||||
public static final long LOGICAL_SOFT7 = 0x00100000907l;
|
||||
public static final long LOGICAL_SOFT8 = 0x00100000908l;
|
||||
public static final long LOGICAL_CLOSE = 0x00100000a01l;
|
||||
public static final long LOGICAL_MAIL_FORWARD = 0x00100000a02l;
|
||||
public static final long LOGICAL_MAIL_REPLY = 0x00100000a03l;
|
||||
public static final long LOGICAL_MAIL_SEND = 0x00100000a04l;
|
||||
public static final long LOGICAL_MEDIA_PLAY_PAUSE = 0x00100000a05l;
|
||||
public static final long LOGICAL_MEDIA_STOP = 0x00100000a07l;
|
||||
public static final long LOGICAL_MEDIA_TRACK_NEXT = 0x00100000a08l;
|
||||
public static final long LOGICAL_MEDIA_TRACK_PREVIOUS = 0x00100000a09l;
|
||||
public static final long LOGICAL_NEW_KEY = 0x00100000a0al;
|
||||
public static final long LOGICAL_OPEN = 0x00100000a0bl;
|
||||
public static final long LOGICAL_PRINT = 0x00100000a0cl;
|
||||
public static final long LOGICAL_SAVE = 0x00100000a0dl;
|
||||
public static final long LOGICAL_SPELL_CHECK = 0x00100000a0el;
|
||||
public static final long LOGICAL_AUDIO_VOLUME_DOWN = 0x00100000a0fl;
|
||||
public static final long LOGICAL_AUDIO_VOLUME_UP = 0x00100000a10l;
|
||||
public static final long LOGICAL_AUDIO_VOLUME_MUTE = 0x00100000a11l;
|
||||
public static final long LOGICAL_LAUNCH_APPLICATION2 = 0x00100000b01l;
|
||||
public static final long LOGICAL_LAUNCH_CALENDAR = 0x00100000b02l;
|
||||
public static final long LOGICAL_LAUNCH_MAIL = 0x00100000b03l;
|
||||
public static final long LOGICAL_LAUNCH_MEDIA_PLAYER = 0x00100000b04l;
|
||||
public static final long LOGICAL_LAUNCH_MUSIC_PLAYER = 0x00100000b05l;
|
||||
public static final long LOGICAL_LAUNCH_APPLICATION1 = 0x00100000b06l;
|
||||
public static final long LOGICAL_LAUNCH_SCREEN_SAVER = 0x00100000b07l;
|
||||
public static final long LOGICAL_LAUNCH_SPREADSHEET = 0x00100000b08l;
|
||||
public static final long LOGICAL_LAUNCH_WEB_BROWSER = 0x00100000b09l;
|
||||
public static final long LOGICAL_LAUNCH_WEB_CAM = 0x00100000b0al;
|
||||
public static final long LOGICAL_LAUNCH_WORD_PROCESSOR = 0x00100000b0bl;
|
||||
public static final long LOGICAL_LAUNCH_CONTACTS = 0x00100000b0cl;
|
||||
public static final long LOGICAL_LAUNCH_PHONE = 0x00100000b0dl;
|
||||
public static final long LOGICAL_LAUNCH_ASSISTANT = 0x00100000b0el;
|
||||
public static final long LOGICAL_LAUNCH_CONTROL_PANEL = 0x00100000b0fl;
|
||||
public static final long LOGICAL_BROWSER_BACK = 0x00100000c01l;
|
||||
public static final long LOGICAL_BROWSER_FAVORITES = 0x00100000c02l;
|
||||
public static final long LOGICAL_BROWSER_FORWARD = 0x00100000c03l;
|
||||
public static final long LOGICAL_BROWSER_HOME = 0x00100000c04l;
|
||||
public static final long LOGICAL_BROWSER_REFRESH = 0x00100000c05l;
|
||||
public static final long LOGICAL_BROWSER_SEARCH = 0x00100000c06l;
|
||||
public static final long LOGICAL_BROWSER_STOP = 0x00100000c07l;
|
||||
public static final long LOGICAL_AUDIO_BALANCE_LEFT = 0x00100000d01l;
|
||||
public static final long LOGICAL_AUDIO_BALANCE_RIGHT = 0x00100000d02l;
|
||||
public static final long LOGICAL_AUDIO_BASS_BOOST_DOWN = 0x00100000d03l;
|
||||
public static final long LOGICAL_AUDIO_BASS_BOOST_UP = 0x00100000d04l;
|
||||
public static final long LOGICAL_AUDIO_FADER_FRONT = 0x00100000d05l;
|
||||
public static final long LOGICAL_AUDIO_FADER_REAR = 0x00100000d06l;
|
||||
public static final long LOGICAL_AUDIO_SURROUND_MODE_NEXT = 0x00100000d07l;
|
||||
public static final long LOGICAL_AVR_INPUT = 0x00100000d08l;
|
||||
public static final long LOGICAL_AVR_POWER = 0x00100000d09l;
|
||||
public static final long LOGICAL_CHANNEL_DOWN = 0x00100000d0al;
|
||||
public static final long LOGICAL_CHANNEL_UP = 0x00100000d0bl;
|
||||
public static final long LOGICAL_COLOR_F0_RED = 0x00100000d0cl;
|
||||
public static final long LOGICAL_COLOR_F1_GREEN = 0x00100000d0dl;
|
||||
public static final long LOGICAL_COLOR_F2_YELLOW = 0x00100000d0el;
|
||||
public static final long LOGICAL_COLOR_F3_BLUE = 0x00100000d0fl;
|
||||
public static final long LOGICAL_COLOR_F4_GREY = 0x00100000d10l;
|
||||
public static final long LOGICAL_COLOR_F5_BROWN = 0x00100000d11l;
|
||||
public static final long LOGICAL_CLOSED_CAPTION_TOGGLE = 0x00100000d12l;
|
||||
public static final long LOGICAL_DIMMER = 0x00100000d13l;
|
||||
public static final long LOGICAL_DISPLAY_SWAP = 0x00100000d14l;
|
||||
public static final long LOGICAL_EXIT = 0x00100000d15l;
|
||||
public static final long LOGICAL_FAVORITE_CLEAR0 = 0x00100000d16l;
|
||||
public static final long LOGICAL_FAVORITE_CLEAR1 = 0x00100000d17l;
|
||||
public static final long LOGICAL_FAVORITE_CLEAR2 = 0x00100000d18l;
|
||||
public static final long LOGICAL_FAVORITE_CLEAR3 = 0x00100000d19l;
|
||||
public static final long LOGICAL_FAVORITE_RECALL0 = 0x00100000d1al;
|
||||
public static final long LOGICAL_FAVORITE_RECALL1 = 0x00100000d1bl;
|
||||
public static final long LOGICAL_FAVORITE_RECALL2 = 0x00100000d1cl;
|
||||
public static final long LOGICAL_FAVORITE_RECALL3 = 0x00100000d1dl;
|
||||
public static final long LOGICAL_FAVORITE_STORE0 = 0x00100000d1el;
|
||||
public static final long LOGICAL_FAVORITE_STORE1 = 0x00100000d1fl;
|
||||
public static final long LOGICAL_FAVORITE_STORE2 = 0x00100000d20l;
|
||||
public static final long LOGICAL_FAVORITE_STORE3 = 0x00100000d21l;
|
||||
public static final long LOGICAL_GUIDE = 0x00100000d22l;
|
||||
public static final long LOGICAL_GUIDE_NEXT_DAY = 0x00100000d23l;
|
||||
public static final long LOGICAL_GUIDE_PREVIOUS_DAY = 0x00100000d24l;
|
||||
public static final long LOGICAL_INFO = 0x00100000d25l;
|
||||
public static final long LOGICAL_INSTANT_REPLAY = 0x00100000d26l;
|
||||
public static final long LOGICAL_LINK = 0x00100000d27l;
|
||||
public static final long LOGICAL_LIST_PROGRAM = 0x00100000d28l;
|
||||
public static final long LOGICAL_LIVE_CONTENT = 0x00100000d29l;
|
||||
public static final long LOGICAL_LOCK = 0x00100000d2al;
|
||||
public static final long LOGICAL_MEDIA_APPS = 0x00100000d2bl;
|
||||
public static final long LOGICAL_MEDIA_FAST_FORWARD = 0x00100000d2cl;
|
||||
public static final long LOGICAL_MEDIA_LAST = 0x00100000d2dl;
|
||||
public static final long LOGICAL_MEDIA_PAUSE = 0x00100000d2el;
|
||||
public static final long LOGICAL_MEDIA_PLAY = 0x00100000d2fl;
|
||||
public static final long LOGICAL_MEDIA_RECORD = 0x00100000d30l;
|
||||
public static final long LOGICAL_MEDIA_REWIND = 0x00100000d31l;
|
||||
public static final long LOGICAL_MEDIA_SKIP = 0x00100000d32l;
|
||||
public static final long LOGICAL_NEXT_FAVORITE_CHANNEL = 0x00100000d33l;
|
||||
public static final long LOGICAL_NEXT_USER_PROFILE = 0x00100000d34l;
|
||||
public static final long LOGICAL_ON_DEMAND = 0x00100000d35l;
|
||||
public static final long LOGICAL_P_IN_P_DOWN = 0x00100000d36l;
|
||||
public static final long LOGICAL_P_IN_P_MOVE = 0x00100000d37l;
|
||||
public static final long LOGICAL_P_IN_P_TOGGLE = 0x00100000d38l;
|
||||
public static final long LOGICAL_P_IN_P_UP = 0x00100000d39l;
|
||||
public static final long LOGICAL_PLAY_SPEED_DOWN = 0x00100000d3al;
|
||||
public static final long LOGICAL_PLAY_SPEED_RESET = 0x00100000d3bl;
|
||||
public static final long LOGICAL_PLAY_SPEED_UP = 0x00100000d3cl;
|
||||
public static final long LOGICAL_RANDOM_TOGGLE = 0x00100000d3dl;
|
||||
public static final long LOGICAL_RC_LOW_BATTERY = 0x00100000d3el;
|
||||
public static final long LOGICAL_RECORD_SPEED_NEXT = 0x00100000d3fl;
|
||||
public static final long LOGICAL_RF_BYPASS = 0x00100000d40l;
|
||||
public static final long LOGICAL_SCAN_CHANNELS_TOGGLE = 0x00100000d41l;
|
||||
public static final long LOGICAL_SCREEN_MODE_NEXT = 0x00100000d42l;
|
||||
public static final long LOGICAL_SETTINGS = 0x00100000d43l;
|
||||
public static final long LOGICAL_SPLIT_SCREEN_TOGGLE = 0x00100000d44l;
|
||||
public static final long LOGICAL_STB_INPUT = 0x00100000d45l;
|
||||
public static final long LOGICAL_STB_POWER = 0x00100000d46l;
|
||||
public static final long LOGICAL_SUBTITLE = 0x00100000d47l;
|
||||
public static final long LOGICAL_TELETEXT = 0x00100000d48l;
|
||||
public static final long LOGICAL_TV = 0x00100000d49l;
|
||||
public static final long LOGICAL_TV_INPUT = 0x00100000d4al;
|
||||
public static final long LOGICAL_TV_POWER = 0x00100000d4bl;
|
||||
public static final long LOGICAL_VIDEO_MODE_NEXT = 0x00100000d4cl;
|
||||
public static final long LOGICAL_WINK = 0x00100000d4dl;
|
||||
public static final long LOGICAL_ZOOM_TOGGLE = 0x00100000d4el;
|
||||
public static final long LOGICAL_DVR = 0x00100000d4fl;
|
||||
public static final long LOGICAL_MEDIA_AUDIO_TRACK = 0x00100000d50l;
|
||||
public static final long LOGICAL_MEDIA_SKIP_BACKWARD = 0x00100000d51l;
|
||||
public static final long LOGICAL_MEDIA_SKIP_FORWARD = 0x00100000d52l;
|
||||
public static final long LOGICAL_MEDIA_STEP_BACKWARD = 0x00100000d53l;
|
||||
public static final long LOGICAL_MEDIA_STEP_FORWARD = 0x00100000d54l;
|
||||
public static final long LOGICAL_MEDIA_TOP_MENU = 0x00100000d55l;
|
||||
public static final long LOGICAL_NAVIGATE_IN = 0x00100000d56l;
|
||||
public static final long LOGICAL_NAVIGATE_NEXT = 0x00100000d57l;
|
||||
public static final long LOGICAL_NAVIGATE_OUT = 0x00100000d58l;
|
||||
public static final long LOGICAL_NAVIGATE_PREVIOUS = 0x00100000d59l;
|
||||
public static final long LOGICAL_PAIRING = 0x00100000d5al;
|
||||
public static final long LOGICAL_MEDIA_CLOSE = 0x00100000d5bl;
|
||||
public static final long LOGICAL_AUDIO_BASS_BOOST_TOGGLE = 0x00100000e02l;
|
||||
public static final long LOGICAL_AUDIO_TREBLE_DOWN = 0x00100000e04l;
|
||||
public static final long LOGICAL_AUDIO_TREBLE_UP = 0x00100000e05l;
|
||||
public static final long LOGICAL_MICROPHONE_TOGGLE = 0x00100000e06l;
|
||||
public static final long LOGICAL_MICROPHONE_VOLUME_DOWN = 0x00100000e07l;
|
||||
public static final long LOGICAL_MICROPHONE_VOLUME_UP = 0x00100000e08l;
|
||||
public static final long LOGICAL_MICROPHONE_VOLUME_MUTE = 0x00100000e09l;
|
||||
public static final long LOGICAL_SPEECH_CORRECTION_LIST = 0x00100000f01l;
|
||||
public static final long LOGICAL_SPEECH_INPUT_TOGGLE = 0x00100000f02l;
|
||||
public static final long LOGICAL_APP_SWITCH = 0x00100001001l;
|
||||
public static final long LOGICAL_CALL = 0x00100001002l;
|
||||
public static final long LOGICAL_CAMERA_FOCUS = 0x00100001003l;
|
||||
public static final long LOGICAL_END_CALL = 0x00100001004l;
|
||||
public static final long LOGICAL_GO_BACK = 0x00100001005l;
|
||||
public static final long LOGICAL_GO_HOME = 0x00100001006l;
|
||||
public static final long LOGICAL_HEADSET_HOOK = 0x00100001007l;
|
||||
public static final long LOGICAL_LAST_NUMBER_REDIAL = 0x00100001008l;
|
||||
public static final long LOGICAL_NOTIFICATION = 0x00100001009l;
|
||||
public static final long LOGICAL_MANNER_MODE = 0x0010000100al;
|
||||
public static final long LOGICAL_VOICE_DIAL = 0x0010000100bl;
|
||||
public static final long LOGICAL_TV3_D_MODE = 0x00100001101l;
|
||||
public static final long LOGICAL_TV_ANTENNA_CABLE = 0x00100001102l;
|
||||
public static final long LOGICAL_TV_AUDIO_DESCRIPTION = 0x00100001103l;
|
||||
public static final long LOGICAL_TV_AUDIO_DESCRIPTION_MIX_DOWN = 0x00100001104l;
|
||||
public static final long LOGICAL_TV_AUDIO_DESCRIPTION_MIX_UP = 0x00100001105l;
|
||||
public static final long LOGICAL_TV_CONTENTS_MENU = 0x00100001106l;
|
||||
public static final long LOGICAL_TV_DATA_SERVICE = 0x00100001107l;
|
||||
public static final long LOGICAL_TV_INPUT_COMPONENT1 = 0x00100001108l;
|
||||
public static final long LOGICAL_TV_INPUT_COMPONENT2 = 0x00100001109l;
|
||||
public static final long LOGICAL_TV_INPUT_COMPOSITE1 = 0x0010000110al;
|
||||
public static final long LOGICAL_TV_INPUT_COMPOSITE2 = 0x0010000110bl;
|
||||
public static final long LOGICAL_TV_INPUT_HD_M1 = 0x0010000110cl;
|
||||
public static final long LOGICAL_TV_INPUT_HD_M2 = 0x0010000110dl;
|
||||
public static final long LOGICAL_TV_INPUT_HD_M3 = 0x0010000110el;
|
||||
public static final long LOGICAL_TV_INPUT_HD_M4 = 0x0010000110fl;
|
||||
public static final long LOGICAL_TV_INPUT_V_G1 = 0x00100001110l;
|
||||
public static final long LOGICAL_TV_MEDIA_CONTEXT = 0x00100001111l;
|
||||
public static final long LOGICAL_TV_NETWORK = 0x00100001112l;
|
||||
public static final long LOGICAL_TV_NUMBER_ENTRY = 0x00100001113l;
|
||||
public static final long LOGICAL_TV_RADIO_SERVICE = 0x00100001114l;
|
||||
public static final long LOGICAL_TV_SATELLITE = 0x00100001115l;
|
||||
public static final long LOGICAL_TV_SATELLITE_B_S = 0x00100001116l;
|
||||
public static final long LOGICAL_TV_SATELLITE_C_S = 0x00100001117l;
|
||||
public static final long LOGICAL_TV_SATELLITE_TOGGLE = 0x00100001118l;
|
||||
public static final long LOGICAL_TV_TERRESTRIAL_ANALOG = 0x00100001119l;
|
||||
public static final long LOGICAL_TV_TERRESTRIAL_DIGITAL = 0x0010000111al;
|
||||
public static final long LOGICAL_TV_TIMER = 0x0010000111bl;
|
||||
public static final long LOGICAL_KEY11 = 0x00100001201l;
|
||||
public static final long LOGICAL_KEY12 = 0x00100001202l;
|
||||
public static final long LOGICAL_SUSPEND = 0x00200000000l;
|
||||
public static final long LOGICAL_RESUME = 0x00200000001l;
|
||||
public static final long LOGICAL_SLEEP = 0x00200000002l;
|
||||
public static final long LOGICAL_ABORT = 0x00200000003l;
|
||||
public static final long LOGICAL_LANG1 = 0x00200000010l;
|
||||
public static final long LOGICAL_LANG2 = 0x00200000011l;
|
||||
public static final long LOGICAL_LANG3 = 0x00200000012l;
|
||||
public static final long LOGICAL_LANG4 = 0x00200000013l;
|
||||
public static final long LOGICAL_LANG5 = 0x00200000014l;
|
||||
public static final long LOGICAL_INTL_BACKSLASH = 0x00200000020l;
|
||||
public static final long LOGICAL_INTL_RO = 0x00200000021l;
|
||||
public static final long LOGICAL_INTL_YEN = 0x00200000022l;
|
||||
public static final long LOGICAL_CONTROL_LEFT = 0x00200000100l;
|
||||
public static final long LOGICAL_CONTROL_RIGHT = 0x00200000101l;
|
||||
public static final long LOGICAL_SHIFT_LEFT = 0x00200000102l;
|
||||
public static final long LOGICAL_SHIFT_RIGHT = 0x00200000103l;
|
||||
public static final long LOGICAL_ALT_LEFT = 0x00200000104l;
|
||||
public static final long LOGICAL_ALT_RIGHT = 0x00200000105l;
|
||||
public static final long LOGICAL_META_LEFT = 0x00200000106l;
|
||||
public static final long LOGICAL_META_RIGHT = 0x00200000107l;
|
||||
public static final long LOGICAL_CONTROL = 0x002000001f0l;
|
||||
public static final long LOGICAL_SHIFT = 0x002000001f2l;
|
||||
public static final long LOGICAL_ALT = 0x002000001f4l;
|
||||
public static final long LOGICAL_META = 0x002000001f6l;
|
||||
public static final long LOGICAL_NUMPAD_ENTER = 0x0020000020dl;
|
||||
public static final long LOGICAL_NUMPAD_PAREN_LEFT = 0x00200000228l;
|
||||
public static final long LOGICAL_NUMPAD_PAREN_RIGHT = 0x00200000229l;
|
||||
public static final long LOGICAL_NUMPAD_MULTIPLY = 0x0020000022al;
|
||||
public static final long LOGICAL_NUMPAD_ADD = 0x0020000022bl;
|
||||
public static final long LOGICAL_NUMPAD_COMMA = 0x0020000022cl;
|
||||
public static final long LOGICAL_NUMPAD_SUBTRACT = 0x0020000022dl;
|
||||
public static final long LOGICAL_NUMPAD_DECIMAL = 0x0020000022el;
|
||||
public static final long LOGICAL_NUMPAD_DIVIDE = 0x0020000022fl;
|
||||
public static final long LOGICAL_NUMPAD0 = 0x00200000230l;
|
||||
public static final long LOGICAL_NUMPAD1 = 0x00200000231l;
|
||||
public static final long LOGICAL_NUMPAD2 = 0x00200000232l;
|
||||
public static final long LOGICAL_NUMPAD3 = 0x00200000233l;
|
||||
public static final long LOGICAL_NUMPAD4 = 0x00200000234l;
|
||||
public static final long LOGICAL_NUMPAD5 = 0x00200000235l;
|
||||
public static final long LOGICAL_NUMPAD6 = 0x00200000236l;
|
||||
public static final long LOGICAL_NUMPAD7 = 0x00200000237l;
|
||||
public static final long LOGICAL_NUMPAD8 = 0x00200000238l;
|
||||
public static final long LOGICAL_NUMPAD9 = 0x00200000239l;
|
||||
public static final long LOGICAL_NUMPAD_EQUAL = 0x0020000023dl;
|
||||
public static final long LOGICAL_GAME_BUTTON1 = 0x00200000301l;
|
||||
public static final long LOGICAL_GAME_BUTTON2 = 0x00200000302l;
|
||||
public static final long LOGICAL_GAME_BUTTON3 = 0x00200000303l;
|
||||
public static final long LOGICAL_GAME_BUTTON4 = 0x00200000304l;
|
||||
public static final long LOGICAL_GAME_BUTTON5 = 0x00200000305l;
|
||||
public static final long LOGICAL_GAME_BUTTON6 = 0x00200000306l;
|
||||
public static final long LOGICAL_GAME_BUTTON7 = 0x00200000307l;
|
||||
public static final long LOGICAL_GAME_BUTTON8 = 0x00200000308l;
|
||||
public static final long LOGICAL_GAME_BUTTON9 = 0x00200000309l;
|
||||
public static final long LOGICAL_GAME_BUTTON10 = 0x0020000030al;
|
||||
public static final long LOGICAL_GAME_BUTTON11 = 0x0020000030bl;
|
||||
public static final long LOGICAL_GAME_BUTTON12 = 0x0020000030cl;
|
||||
public static final long LOGICAL_GAME_BUTTON13 = 0x0020000030dl;
|
||||
public static final long LOGICAL_GAME_BUTTON14 = 0x0020000030el;
|
||||
public static final long LOGICAL_GAME_BUTTON15 = 0x0020000030fl;
|
||||
public static final long LOGICAL_GAME_BUTTON16 = 0x00200000310l;
|
||||
public static final long LOGICAL_GAME_BUTTON_A = 0x00200000311l;
|
||||
public static final long LOGICAL_GAME_BUTTON_B = 0x00200000312l;
|
||||
public static final long LOGICAL_GAME_BUTTON_C = 0x00200000313l;
|
||||
public static final long LOGICAL_GAME_BUTTON_LEFT1 = 0x00200000314l;
|
||||
public static final long LOGICAL_GAME_BUTTON_LEFT2 = 0x00200000315l;
|
||||
public static final long LOGICAL_GAME_BUTTON_MODE = 0x00200000316l;
|
||||
public static final long LOGICAL_GAME_BUTTON_RIGHT1 = 0x00200000317l;
|
||||
public static final long LOGICAL_GAME_BUTTON_RIGHT2 = 0x00200000318l;
|
||||
public static final long LOGICAL_GAME_BUTTON_SELECT = 0x00200000319l;
|
||||
public static final long LOGICAL_GAME_BUTTON_START = 0x0020000031al;
|
||||
public static final long LOGICAL_GAME_BUTTON_THUMB_LEFT = 0x0020000031bl;
|
||||
public static final long LOGICAL_GAME_BUTTON_THUMB_RIGHT = 0x0020000031cl;
|
||||
public static final long LOGICAL_GAME_BUTTON_X = 0x0020000031dl;
|
||||
public static final long LOGICAL_GAME_BUTTON_Y = 0x0020000031el;
|
||||
public static final long LOGICAL_GAME_BUTTON_Z = 0x0020000031fl;
|
||||
}
|
||||
@ -78,8 +78,6 @@ const int32_t kFlutterSemanticsCustomActionIdBatchEnd = -1;
|
||||
// - lib/ui/platform_dispatcher.dart, _kFlutterKeyDataChannel
|
||||
// - shell/platform/darwin/ios/framework/Source/FlutterEngine.mm,
|
||||
// FlutterKeyDataChannel
|
||||
// - io/flutter/embedding/android/KeyData.java,
|
||||
// CHANNEL
|
||||
//
|
||||
// Not to be confused with "flutter/keyevent", which is used to send raw
|
||||
// key event data in a platform-dependent format.
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user