diff options
Diffstat (limited to 'app/src/main/java/com/javispedro/vndroid')
15 files changed, 2597 insertions, 0 deletions
diff --git a/app/src/main/java/com/javispedro/vndroid/ControlService.java b/app/src/main/java/com/javispedro/vndroid/ControlService.java new file mode 100644 index 0000000..db5362d --- /dev/null +++ b/app/src/main/java/com/javispedro/vndroid/ControlService.java @@ -0,0 +1,47 @@ +package com.javispedro.vndroid; + +import android.accessibilityservice.AccessibilityService; +import android.content.Intent; +import android.support.annotation.Nullable; +import android.util.Log; +import android.view.accessibility.AccessibilityEvent; + +public class ControlService extends AccessibilityService { + private final String TAG = ControlService.class.getSimpleName(); + + @Nullable + private static ControlService instance = null; + + @Override + public void onServiceConnected() { + super.onServiceConnected(); + Log.d(TAG, "onServiceConnected"); + instance = this; + } + + @Override + public boolean onUnbind(Intent intent) { + Log.d(TAG, "onUnbind"); + instance = null; + return super.onUnbind(intent); + } + + @Override + public void onAccessibilityEvent(AccessibilityEvent event) { + + } + + @Override + public void onInterrupt() { + + } + + @Nullable + public static ControlService getInstance() { + return instance; + } + + public static boolean isServiceStarted() { + return instance != null; + } +} diff --git a/app/src/main/java/com/javispedro/vndroid/KeyEventOutput.java b/app/src/main/java/com/javispedro/vndroid/KeyEventOutput.java new file mode 100644 index 0000000..597942a --- /dev/null +++ b/app/src/main/java/com/javispedro/vndroid/KeyEventOutput.java @@ -0,0 +1,286 @@ +package com.javispedro.vndroid; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.util.Log; +import android.view.accessibility.AccessibilityNodeInfo; + +import com.javispedro.vndroid.keymaps.KeyActionHandler; +import com.javispedro.vndroid.keymaps.KeyHandler; + +import java.util.ArrayList; +import java.util.List; + +public class KeyEventOutput implements KeyActionHandler { + private final String TAG = KeyEventOutput.class.getSimpleName(); + + private final List<KeyHandler> handlers = new ArrayList<KeyHandler>(); + + @Nullable + private AccessibilityNodeInfo getFocusNode() { + ControlService service = ControlService.getInstance(); + if (service != null) { + return service.findFocus(AccessibilityNodeInfo.FOCUS_INPUT); + } + return null; + } + + public void addHandler(KeyHandler handler) { + handler.setActionHandler(this); + handlers.add(handler); + } + + public void postKeyEvent(int key, boolean state) { + if (state) Log.d(TAG, "keysym pressed: " + Integer.toHexString(key)); + for (KeyHandler handler : handlers) { + boolean handled; + if (state) { + handled = handler.keyDown(key); + } else { + handled = handler.keyUp(key); + } + if (handled) { + break; + } + } + } + + @Override + public void postText(CharSequence text) { + AccessibilityNodeInfo node = getFocusNode(); + if (node == null || !node.isEditable()) { + Log.d(TAG, "no input focus or not editable"); + return; + } + + final CharSequence curText = node.getText(); + final int curTextLen = curText != null ? curText.length() : 0; + final int textLen = text.length(); + int selStart = node.getTextSelectionStart(); + int selEnd = node.getTextSelectionEnd(); + StringBuilder builder = new StringBuilder(curTextLen + textLen); + + Log.d(TAG, " cur text: " + curText + " start=" + selStart + " end=" + selEnd); + + if (selStart == -1 || selEnd == -1 || curTextLen == 0) { + // No selection, no cursor + if (curTextLen > 0) builder.append(curText); + builder.append(text); + } else { + builder.append(curText.subSequence(0, selStart)); + builder.append(text); + builder.append(curText.subSequence(selEnd, curText.length())); + + selStart = selEnd + textLen; + selEnd = selStart; + } + + Log.d(TAG, " new text: " + builder.toString() + " start=" + selStart + " end=" + selEnd); + + Bundle args = new Bundle(); + args.putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, + builder.toString()); + node.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, args); + + if (selStart != -1 && selEnd != -1 && selStart != builder.length()) { + args = new Bundle(); + args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT, selStart); + args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT, selEnd); + node.performAction(AccessibilityNodeInfo.ACTION_SET_SELECTION, args); + } + } + + @Override + public void postChar(char c) { + AccessibilityNodeInfo node = getFocusNode(); + if (node == null || !node.isEditable()) { + Log.d(TAG, "no input focus or not editable"); + return; + } + + final CharSequence curText = node.getText(); + final int curTextLen = curText != null ? curText.length() : 0; + int selStart = node.getTextSelectionStart(); + int selEnd = node.getTextSelectionEnd(); + StringBuilder builder = new StringBuilder(curTextLen + 1); + + Log.d(TAG, " cur text: " + curText + " start=" + selStart + " end=" + selEnd); + + if (selStart == -1 || selEnd == -1 || curTextLen == 0) { + // No selection, no cursor + if (curTextLen > 0) builder.append(curText); + builder.append(c); + } else { + builder.append(curText.subSequence(0, selStart)); + builder.append(c); + builder.append(curText.subSequence(selEnd, curText.length())); + + selStart = selEnd + 1; + selEnd = selStart; + } + + Log.d(TAG, " new text: " + builder.toString() + " start=" + selStart + " end=" + selEnd); + + Bundle args = new Bundle(); + args.putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, + builder.toString()); + node.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, args); + + if (selStart != -1 && selEnd != -1 && selStart != builder.length()) { + args = new Bundle(); + args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT, selStart); + args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT, selEnd); + node.performAction(AccessibilityNodeInfo.ACTION_SET_SELECTION, args); + } + } + + @Override + public void postLocalAction(int action) { + AccessibilityNodeInfo node = getFocusNode(); + if (node == null || !node.isEditable()) { + Log.d(TAG, "no input focus or not editable"); + return; + } + + final CharSequence curText = node.getText(); + final int curTextLen = curText != null ? curText.length() : 0; + int selStart = node.getTextSelectionStart(); + int selEnd = node.getTextSelectionEnd(); + StringBuilder builder = null; + + Log.d(TAG, " cur text: " + curText + " start=" + selStart + " end=" + selEnd); + + switch (action) { + case KeyActionHandler.ACTION_BACKSPACE: + if (selStart == -1 || selEnd == -1 || curTextLen == 0) { + return; + } + builder = new StringBuilder(curTextLen - 1); + if (selStart == selEnd && selStart > 0) { + builder.append(curText.subSequence(0, selStart - 1)); + builder.append(curText.subSequence(selEnd, curTextLen)); + selStart = selStart - 1; + selEnd = selStart; + } else if (selStart != selEnd) { + builder.append(curText.subSequence(0, selStart)); + builder.append(curText.subSequence(selEnd, curTextLen)); + selEnd = selStart; + } else { + return; + } + break; + case KeyActionHandler.ACTION_DEL: + if (selStart == -1 || selEnd == -1 || curTextLen == 0) { + return; + } + builder = new StringBuilder(curTextLen - 1); + if (selStart == selEnd && selStart < curTextLen) { + builder.append(curText.subSequence(0, selStart)); + builder.append(curText.subSequence(selEnd + 1, curTextLen)); + selStart = selStart; + selEnd = selStart; + } else if (selStart != selEnd) { + builder.append(curText.subSequence(0, selStart)); + builder.append(curText.subSequence(selEnd, curTextLen)); + selEnd = selStart; + } else { + return; + } + break; + case KeyActionHandler.ACTION_MOVE_LEFT: + if (selStart == -1 || selEnd == -1 || curTextLen == 0) { + return; + } + if (selStart > 0) { + selStart = selStart - 1; + selEnd = selStart; + } else { + return; + } + break; + case KeyActionHandler.ACTION_MOVE_RIGHT: + if (selStart == -1 || selEnd == -1 || curTextLen == 0) { + return; + } + if (selEnd < curTextLen) { + selStart = selEnd + 1; + selEnd = selStart; + } else { + return; + } + break; + case KeyActionHandler.ACTION_MOVE_LEFTMOST: + selStart = 0; + selEnd = 0; + break; + case KeyActionHandler.ACTION_MOVE_RIGHTMOST: + if (curTextLen == 0) { + return; + } + selStart = curTextLen; + selEnd = curTextLen; + break; + case KeyActionHandler.ACTION_SELECT_LEFT: + if (selStart == -1 || selEnd == -1 || curTextLen == 0) { + return; + } + if (selStart > 0) { + selStart = selStart - 1; + } else { + return; + } + break; + case KeyActionHandler.ACTION_SELECT_RIGHT: + if (selStart == -1 || selEnd == -1 || curTextLen == 0) { + return; + } + if (selEnd < curTextLen) { + selEnd = selEnd + 1; + } else { + return; + } + break; + case KeyActionHandler.ACTION_SELECT_LEFTMOST: + selStart = 0; + break; + case KeyActionHandler.ACTION_SELECT_RIGHTMOST: + if (curTextLen == 0) { + return; + } + selEnd = curTextLen; + break; + default: + return; + } + + if (builder != null) { + Log.d(TAG, " new text: " + builder.toString() + " start=" + selStart + " end=" + selEnd); + } else { + Log.d(TAG, " new start=" + selStart + " end=" + selEnd); + } + + if (builder != null && builder.toString() != curText) { + Bundle args = new Bundle(); + args.putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, + builder.toString()); + node.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, args); + } + + if (selStart != -1 && selEnd != -1 && (builder == null || selStart != builder.length())) { + Bundle args = new Bundle(); + args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT, selStart); + args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT, selEnd); + node.performAction(AccessibilityNodeInfo.ACTION_SET_SELECTION, args); + } + } + + @Override + public void postGlobalAction(int action) { + ControlService service = ControlService.getInstance(); + if (service != null) { + if (!service.performGlobalAction(action)) { + Log.e(TAG, "could not perform global action: " + action); + } + } + } +} diff --git a/app/src/main/java/com/javispedro/vndroid/PointerEventOutput.java b/app/src/main/java/com/javispedro/vndroid/PointerEventOutput.java new file mode 100644 index 0000000..f380671 --- /dev/null +++ b/app/src/main/java/com/javispedro/vndroid/PointerEventOutput.java @@ -0,0 +1,101 @@ +package com.javispedro.vndroid; + +import android.accessibilityservice.AccessibilityService; +import android.accessibilityservice.GestureDescription; +import android.graphics.Path; +import android.os.SystemClock; +import android.util.Log; + +public class PointerEventOutput extends AccessibilityService.GestureResultCallback { + private final String TAG = PointerEventOutput.class.getSimpleName(); + + private boolean btnPressed = false; + + private void dispatchGesture(GestureDescription gesture) { + ControlService service = ControlService.getInstance(); + if (service != null) { + if (!service.dispatchGesture(gesture, this, null)) { + Log.w(TAG, "gesture not dispatched"); + } + } else { + Log.e(TAG, "no controlservice"); + } + } + + private long lastTime = 0; + private GestureDescription lastGesture = null; + private int lastX = -1, lastY = -1; + + private void pointerGesture(boolean cont, int x, int y, long curTime, boolean willContinue) { + Path path = new Path(); + long duration = 1; + + if (cont && lastGesture == null) { + Log.w(TAG, "continuing gesture but no previous data"); + } + + if (cont && lastGesture != null) { + assert lastX != -1 && lastY != -1; + path.moveTo(lastX, lastY); + duration = curTime - lastTime; + assert duration > 0; + } else { + path.moveTo(x, y); + } + + path.lineTo(x, y); + + GestureDescription.Builder builder = new GestureDescription.Builder(); + GestureDescription.StrokeDescription stroke; + if (cont && lastGesture != null) { + stroke = lastGesture.getStroke(0); + stroke = stroke.continueStroke(path, 0, duration, willContinue); + } else { + stroke = new GestureDescription.StrokeDescription(path, 0, duration, willContinue); + } + builder.addStroke(stroke); + GestureDescription gesture = builder.build(); + dispatchGesture(gesture); + + if (willContinue) { + lastGesture = gesture; + lastTime = curTime; + lastX = x; + lastY = y; + } else { + lastGesture = null; + lastTime = 0; + lastX = -1; + lastY = -1; + } + } + + public void postPointerEvent(byte buttonMask, int x, int y) { + final long curTime = SystemClock.uptimeMillis(); + + if ((buttonMask & 1) != 0) { + // Main button pressed + if (!btnPressed) { + pointerGesture(false, x, y, curTime, true); + btnPressed = true; + } else { + // Button moved while pressed + pointerGesture(true, x, y, curTime, true); + } + } else if (btnPressed) { + // Button was pressed but now released + pointerGesture(true, x, y, curTime, false); + + btnPressed = false; + } + } + + @Override + public void onCompleted(GestureDescription gestureDescription) { + } + + @Override + public void onCancelled(GestureDescription gestureDescription) { + Log.d(TAG, "gesture cancelled"); + } +} diff --git a/app/src/main/java/com/javispedro/vndroid/RFBServer.java b/app/src/main/java/com/javispedro/vndroid/RFBServer.java new file mode 100644 index 0000000..f5af05c --- /dev/null +++ b/app/src/main/java/com/javispedro/vndroid/RFBServer.java @@ -0,0 +1,98 @@ +package com.javispedro.vndroid; + +import android.graphics.PixelFormat; +import android.media.Image; +import android.support.annotation.Nullable; +import android.util.EventLog; + +import java.nio.ByteBuffer; + +public class RFBServer { + private static final String TAG = RFBServer.class.getSimpleName(); + + @Nullable + private Image lastImage = null; + + @Nullable + private EventCallback callback = null; + + public class ServerException extends RuntimeException { + public ServerException(String what) { + super(what); + } + } + + public interface EventCallback { + void onPointerEvent(int buttonMask, int x, int y); + void onKeyEvent(int key, boolean state); + } + + public RFBServer() { + if (!allocate()) { + throw new ServerException("failure to allocate()"); + } + } + + public void start() { + if (!init()) { + throw new ServerException("failure to init()"); + } + } + + public void stop() { + forgetLastImage(); + shutdown(); + } + + public void finalize() { + forgetLastImage(); + shutdown(); + deallocate(); + } + + public void setEventCallback(EventCallback c) { + callback = c; + set_event_callback(c); + } + + public void putImage(Image image) { + Image.Plane[] planes = image.getPlanes(); + + if (image.getFormat() != PixelFormat.RGBA_8888) { + String msg = "Unknown pixel format: " + image.getFormat(); + throw new UnsupportedOperationException(msg); + } + if (planes.length != 1) { + String msg = "Unknown number of planes: " + planes.length; + throw new UnsupportedOperationException(msg); + } + + Image.Plane plane = planes[0]; + + if (!put_image(image.getWidth(), image.getHeight(), plane.getBuffer(), plane.getPixelStride(), plane.getRowStride())) { + throw new ServerException("failed to put image"); + } + + forgetLastImage(); + lastImage = image; + } + + private void forgetLastImage() { + if (lastImage != null) { + lastImage.close(); + } + lastImage = null; + } + + private long nativeData = 0; + + private native boolean allocate(); + private native void deallocate(); + + private native boolean init(); + private native void shutdown(); + + private native void set_event_callback(EventCallback c); + + private native boolean put_image(int width, int height, ByteBuffer buffer, int pixel_stride, int row_stride); +} diff --git a/app/src/main/java/com/javispedro/vndroid/ScreenGrabber.java b/app/src/main/java/com/javispedro/vndroid/ScreenGrabber.java new file mode 100644 index 0000000..54d11bc --- /dev/null +++ b/app/src/main/java/com/javispedro/vndroid/ScreenGrabber.java @@ -0,0 +1,83 @@ +package com.javispedro.vndroid; + +import android.content.Context; +import android.content.ContextWrapper; +import android.hardware.display.VirtualDisplay; +import android.media.Image; +import android.media.ImageReader; +import android.support.annotation.Nullable; +import android.util.Log; + +public abstract class ScreenGrabber extends ContextWrapper { + private static final String TAG = ScreenGrabber.class.getSimpleName(); + + protected static final int MAX_IMAGES = 3; + + @Nullable protected ImageReader reader; + @Nullable protected VirtualDisplay display; + @Nullable protected Callback callback; + + public interface Callback { + void onImage(Image image); + } + + protected class VirtualDisplayCallback extends VirtualDisplay.Callback { + @Override + public void onPaused() { + Log.d(TAG, "onVirtualDisplayPaused"); + } + + @Override + public void onResumed() { + Log.d(TAG, "onVirtualDisplayResumed"); + } + + @Override + public void onStopped() { + Log.d(TAG, "onVirtualDisplayStopped"); + } + } + + protected class ImageReaderCallback implements ImageReader.OnImageAvailableListener { + @Override + public void onImageAvailable(ImageReader reader) { + if (callback != null) { + Image image = reader.acquireLatestImage(); + callback.onImage(image); + } + } + } + + protected ScreenGrabber(Context context) { + super(context); + } + + public abstract void start(); + + public void stop() { + if (display != null) { + display.release(); + display = null; + } + if (reader != null) { + reader.close(); + reader = null; + } + } + + public void setCallback(Callback c) { + callback = c; + } + + public int scaleInputX(int x) { + return x; + } + + public int scaleInputY(int y) { + return y; + } + + public boolean hasSizeChanged() { return false; } + + public void updateScreenSize() { } +} diff --git a/app/src/main/java/com/javispedro/vndroid/ScreenMirrorGrabber.java b/app/src/main/java/com/javispedro/vndroid/ScreenMirrorGrabber.java new file mode 100644 index 0000000..9f78b3c --- /dev/null +++ b/app/src/main/java/com/javispedro/vndroid/ScreenMirrorGrabber.java @@ -0,0 +1,110 @@ +package com.javispedro.vndroid; + +import android.content.Context; +import android.graphics.PixelFormat; +import android.hardware.display.DisplayManager; +import android.media.ImageReader; +import android.media.projection.MediaProjection; +import android.os.Handler; +import android.support.annotation.NonNull; +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.Display; + +public class ScreenMirrorGrabber extends ScreenGrabber { + private static final String TAG = ScreenMirrorGrabber.class.getSimpleName(); + + protected final MediaProjection projection; + protected final Display realDisplay; + + protected final DisplayMetrics realDisplayMetrics; + + private float scale = 0.5f; + + public ScreenMirrorGrabber(Context context, @NonNull MediaProjection proj, @NonNull Display display) { + super(context); + projection = proj; + realDisplay = display; + realDisplayMetrics = new DisplayMetrics(); + } + + private void initDisplay() { + realDisplay.getRealMetrics(realDisplayMetrics); + + Log.d(TAG, "real display size: " + realDisplayMetrics.widthPixels + "x" + realDisplayMetrics.heightPixels); + + int width = Math.round(realDisplayMetrics.widthPixels * scale); + int height = Math.round(realDisplayMetrics.heightPixels * scale); + int dpi = realDisplayMetrics.densityDpi; + + Log.d(TAG, "starting mirror display with size: " + width + "x" + height + " dpi: " + dpi); + + reader = ImageReader.newInstance(width, height, PixelFormat.RGBA_8888, MAX_IMAGES); + reader.setOnImageAvailableListener(new ImageReaderCallback(), null); + + display = projection.createVirtualDisplay("vndroid", + width, height, dpi, + DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC | DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, + reader.getSurface(), + new VirtualDisplayCallback(), null); + } + + @Override + public void start() { + if (reader != null || display != null) { + Log.w(TAG, "already started"); + return; + } + + initDisplay(); + } + + @Override + public void stop() { + super.stop(); + projection.stop(); + } + + @Override + public int scaleInputX(int x) { + return Math.round(x / scale); + } + + @Override + public int scaleInputY(int y) { + return Math.round(y / scale); + } + + @Override + public boolean hasSizeChanged() { + DisplayMetrics metrics = new DisplayMetrics(); + realDisplay.getRealMetrics(metrics); + return metrics.widthPixels != realDisplayMetrics.widthPixels || metrics.heightPixels != realDisplayMetrics.heightPixels; + } + + @Override + public void updateScreenSize() { + final ImageReader oldReader = reader; + reader = null; + + if (display != null) { + display.release(); + display = null; + } + + initDisplay(); + + Log.d(TAG, "new buffers set"); + + // Delay destruction of old image buffers to minimize multithread issues... + if (oldReader != null) { + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + Log.d(TAG, "old buffers closed"); + oldReader.close(); + } + }, 1000); + } + } +} diff --git a/app/src/main/java/com/javispedro/vndroid/ScreenVirtualGrabber.java b/app/src/main/java/com/javispedro/vndroid/ScreenVirtualGrabber.java new file mode 100644 index 0000000..5eef75d --- /dev/null +++ b/app/src/main/java/com/javispedro/vndroid/ScreenVirtualGrabber.java @@ -0,0 +1,38 @@ +package com.javispedro.vndroid; + +import android.content.Context; +import android.graphics.PixelFormat; +import android.hardware.display.DisplayManager; +import android.media.ImageReader; +import android.util.Log; + +public class ScreenVirtualGrabber extends ScreenGrabber { + private static final String TAG = ScreenVirtualGrabber.class.getSimpleName(); + + public ScreenVirtualGrabber(Context context) { + super(context); + } + + @Override + public void start() { + if (reader != null || display != null) { + Log.w(TAG, "already started"); + return; + } + + int width = 1024; + int height = 768; + int dpi = 96; + + Log.d(TAG, "starting virtual display with width " + width + " height: " + height + " dpi: " + dpi); + + reader = ImageReader.newInstance(width, height, PixelFormat.RGBA_8888, MAX_IMAGES); + reader.setOnImageAvailableListener(new ImageReaderCallback(), null); + + DisplayManager manager = getSystemService(DisplayManager.class); + display = manager.createVirtualDisplay("vndroid", + width, height, dpi, reader.getSurface(), + DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC | DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY, + new VirtualDisplayCallback(), null); + } +} diff --git a/app/src/main/java/com/javispedro/vndroid/ServerRunningNotification.java b/app/src/main/java/com/javispedro/vndroid/ServerRunningNotification.java new file mode 100644 index 0000000..6fcf8ab --- /dev/null +++ b/app/src/main/java/com/javispedro/vndroid/ServerRunningNotification.java @@ -0,0 +1,108 @@ +package com.javispedro.vndroid; + +import android.annotation.TargetApi; +import android.app.Notification; +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.net.Uri; +import android.os.Build; +import android.support.v4.app.NotificationCompat; + +/** + * Helper class for showing and canceling server running + * notifications. + * <p> + * This class makes heavy use of the {@link NotificationCompat.Builder} helper + * class to create notifications in a backward-compatible way. + */ +public class ServerRunningNotification { + /** + * The unique identifier for this type of notification. + */ + private static final String NOTIFICATION_TAG = "ServerRunning"; + + private static final String NOTIFICATION_CHANNEL = NOTIFICATION_TAG; + + public static NotificationChannel createNotificationChannel(final Context context) { + final Resources res = context.getResources(); + NotificationChannel channel = new NotificationChannel(NOTIFICATION_CHANNEL, + res.getString(R.string.server_running_notification_channel), + NotificationManager.IMPORTANCE_NONE); + channel.setShowBadge(false); + return channel; + } + + public static void initNotificationChannel(final Context context) { + NotificationManager manager = context.getSystemService(NotificationManager.class); + manager.createNotificationChannel(createNotificationChannel(context)); + } + + public static Notification build(final Context context) { + final Resources res = context.getResources(); + + final String title = res.getString(R.string.server_running_notification_title); + + final NotificationCompat.Builder builder = new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL) + + // Set appropriate defaults for the notification light, sound, + // and vibration. + .setDefaults(Notification.DEFAULT_ALL) + .setCategory(Notification.CATEGORY_SERVICE) + .setOngoing(true) + + // Set required fields, including the small icon, the + // notification title, and text. + .setSmallIcon(R.drawable.ic_stat_server_running) + .setContentTitle(title) + //.setContentText(text) + + // All fields below this line are optional. + + // Use a default priority (recognized on devices running Android + // 4.1 or later) + .setPriority(NotificationCompat.PRIORITY_MIN) + + // Set ticker text (preview) information for this notification. + //.setTicker(ticker) + + // If this notification relates to a past or upcoming event, you + // should set the relevant time information using the setWhen + // method below. If this call is omitted, the notification's + // timestamp will by set to the time at which it was shown. + // TODO: Call setWhen if this notification relates to a past or + // upcoming event. The sole argument to this method should be + // the notification timestamp in milliseconds. + //.setWhen(...) + + // Set the pending intent to be initiated when the user touches + // the notification. + .setContentIntent( + PendingIntent.getActivity( + context, + 0, + new Intent(context, SetupActivity.class), + PendingIntent.FLAG_UPDATE_CURRENT)) + + // Example additional actions for this notification. These will + // only show on devices running Android 4.1 or later, so you + // should ensure that the activity in this notification's + // content intent provides access to the same actions in + // another way. + .addAction( + R.drawable.ic_action_stop_screen_sharing, + res.getString(R.string.action_stop), + PendingIntent.getForegroundService( + context, + 0, + new Intent(context, ServerService.class).setAction(ServerService.ACTION_STOP), + PendingIntent.FLAG_UPDATE_CURRENT)); + + return builder.build(); + } +} diff --git a/app/src/main/java/com/javispedro/vndroid/ServerService.java b/app/src/main/java/com/javispedro/vndroid/ServerService.java new file mode 100644 index 0000000..bf72d21 --- /dev/null +++ b/app/src/main/java/com/javispedro/vndroid/ServerService.java @@ -0,0 +1,175 @@ +package com.javispedro.vndroid; + +import android.app.Activity; +import android.app.Notification; +import android.app.Service; +import android.content.Intent; +import android.content.res.Configuration; +import android.media.Image; +import android.media.projection.MediaProjection; +import android.media.projection.MediaProjectionManager; +import android.os.IBinder; +import android.util.Log; +import android.view.WindowManager; +import android.widget.Toast; + +import com.javispedro.vndroid.keymaps.AndroidKeyHandler; +import com.javispedro.vndroid.keymaps.SpanishKeyHandler; + +public class ServerService extends Service { + private static final String TAG = ServerService.class.getSimpleName(); + public static final String ACTION_START = "ACTION_START"; + public static final String ACTION_STOP = "ACTION_STOP"; + public static final String ACTION_NOTIFY_MEDIA_PROJECTION_RESULT = "ACTION_NOTIFY_MEDIA_PROJECTION_RESULT"; + + private ScreenGrabber screenGrabber; + private RFBServer rfbServer; + private PointerEventOutput pointerOut; + private KeyEventOutput keyOut; + + public ServerService() { + } + + @Override + public void onCreate() { + ServerRunningNotification.initNotificationChannel(this); + System.loadLibrary("native-lib"); + } + + @Override + public IBinder onBind(Intent intent) { + throw new UnsupportedOperationException("Not implemented"); + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + if (intent != null) { + switch (intent.getAction()) { + case ACTION_START: + start(); + break; + case ACTION_STOP: + stop(); + break; + case ACTION_NOTIFY_MEDIA_PROJECTION_RESULT: + notifyMediaProjectionResult(intent.getIntExtra("resultCode", Activity.RESULT_CANCELED), + (Intent) intent.getParcelableExtra("resultData")); + break; + } + } + return super.onStartCommand(intent, flags, startId); + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + if (screenGrabber != null && screenGrabber.hasSizeChanged()) { + Log.d(TAG, "screen size has changed"); + screenGrabber.updateScreenSize(); + } + } + + protected class ScreenGrabberCallback implements ScreenGrabber.Callback { + @Override + public void onImage(Image image) { + if (rfbServer != null) { + rfbServer.putImage(image); + } else { + image.close(); + } + } + } + + protected class EventCallback implements RFBServer.EventCallback { + @Override + public void onPointerEvent(int buttonMask, int x, int y) { + try { + x = screenGrabber.scaleInputX(x); + y = screenGrabber.scaleInputY(y); + pointerOut.postPointerEvent((byte) buttonMask, x, y); + } catch (Exception e) { + Log.e(TAG, "Exception on pointer EventCallback: " + e.toString()); + e.printStackTrace(); + // Need to supress the exception, otherwise we'll crash JNI + } + } + + @Override + public void onKeyEvent(int key, boolean state) { + try { + keyOut.postKeyEvent(key, state); + } catch (Exception e) { + Log.e(TAG, "Exception on key EventCallback: " + e.toString()); + e.printStackTrace(); + } + } + } + + protected void start() { + if (rfbServer != null) { + Log.w(TAG, "cannot start, already started"); + return; + } + + Log.d(TAG, "starting"); + + if (!ControlService.isServiceStarted()) { + Toast toast = Toast.makeText(this, R.string.toast_no_input_service, Toast.LENGTH_SHORT); + toast.show(); + } + + pointerOut = new PointerEventOutput(); + keyOut = new KeyEventOutput(); + keyOut.addHandler(new AndroidKeyHandler()); + keyOut.addHandler(new SpanishKeyHandler()); + + + if (screenGrabber == null) { + screenGrabber = new ScreenVirtualGrabber(this); + } + + rfbServer = new RFBServer(); + rfbServer.setEventCallback(new EventCallback()); + rfbServer.start(); + + screenGrabber.setCallback(new ScreenGrabberCallback()); + screenGrabber.start(); + + Notification notification = ServerRunningNotification.build(this); + startForeground(1, notification); + } + + protected void stop() { + Log.d(TAG, "stopping"); + + if (rfbServer != null) { + rfbServer.stop(); + rfbServer = null; + } + if (screenGrabber != null) { + screenGrabber.stop(); + screenGrabber = null; + } + if (pointerOut != null) { + pointerOut = null; + } + if (keyOut != null) { + keyOut = null; + } + + stopForeground(true); + stopSelf(); + } + + protected void notifyMediaProjectionResult(int resultCode, Intent data) { + if (screenGrabber != null) { + Log.w(TAG, "already have an screen grabber"); + } + MediaProjectionManager manager = getSystemService(MediaProjectionManager.class); + MediaProjection projection = manager.getMediaProjection(resultCode, data); + + WindowManager wm = getSystemService(WindowManager.class); + + screenGrabber = new ScreenMirrorGrabber(this, projection, wm.getDefaultDisplay()); + } +} diff --git a/app/src/main/java/com/javispedro/vndroid/SetupActivity.java b/app/src/main/java/com/javispedro/vndroid/SetupActivity.java new file mode 100644 index 0000000..123bbe7 --- /dev/null +++ b/app/src/main/java/com/javispedro/vndroid/SetupActivity.java @@ -0,0 +1,78 @@ +package com.javispedro.vndroid; + +import android.app.Activity; +import android.content.Intent; +import android.media.projection.MediaProjectionManager; +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.util.Log; +import android.view.View; + +public class SetupActivity extends AppCompatActivity { + private static String TAG = SetupActivity.class.getSimpleName(); + + private static final int REQUEST_MEDIA_PROJECTION = 1; + + private boolean mirror = true; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_setup); + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) + { + switch (requestCode) { + case REQUEST_MEDIA_PROJECTION: + if (resultCode != Activity.RESULT_OK) { + Log.w(TAG, "User cancelled media projection"); + return; + } + + notifyMediaProjectionResult(resultCode, data); + startServer(); + + break; + } + } + + private void startServer() + { + Intent intent = new Intent(this, ServerService.class); + intent.setAction(ServerService.ACTION_START); + startService(intent); + } + + private void stopServer() + { + Intent intent = new Intent(this, ServerService.class); + intent.setAction(ServerService.ACTION_STOP); + startService(intent); + } + + private void notifyMediaProjectionResult(int resultCode, Intent resultData) + { + Intent intent = new Intent(this, ServerService.class); + intent.setAction(ServerService.ACTION_NOTIFY_MEDIA_PROJECTION_RESULT); + intent.putExtra("resultCode", resultCode); + intent.putExtra("resultData", resultData); + startService(intent); + } + + public void onStartClick(View view) { + Log.d(TAG, "onStartClick"); + if (mirror) { + MediaProjectionManager manager = getSystemService(MediaProjectionManager.class); + startActivityForResult(manager.createScreenCaptureIntent(), REQUEST_MEDIA_PROJECTION); + } else { + startServer(); + } + } + + public void onStopClick(View view) { + Log.d(TAG, "onStopClick"); + stopServer(); + } +} diff --git a/app/src/main/java/com/javispedro/vndroid/keymaps/AndroidKeyHandler.java b/app/src/main/java/com/javispedro/vndroid/keymaps/AndroidKeyHandler.java new file mode 100644 index 0000000..b0ac08e --- /dev/null +++ b/app/src/main/java/com/javispedro/vndroid/keymaps/AndroidKeyHandler.java @@ -0,0 +1,69 @@ +package com.javispedro.vndroid.keymaps; + +import android.accessibilityservice.AccessibilityService; + +public class AndroidKeyHandler extends KeyHandler { + private boolean shiftPressed = false; + + @Override + public boolean keyDown(int key) { + switch (key) { + case KeySyms.Key_Shift_L: + case KeySyms.Key_Shift_R: + shiftPressed = true; + return false; + case KeySyms.Key_Escape: + action.postGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK); + return true; + case KeySyms.Key_F1: + action.postGlobalAction(AccessibilityService.GLOBAL_ACTION_HOME); + return true; + case KeySyms.Key_BackSpace: + action.postLocalAction(KeyActionHandler.ACTION_BACKSPACE); + return true; + case KeySyms.Key_Delete: + action.postLocalAction(KeyActionHandler.ACTION_DEL); + return true; + case KeySyms.Key_Left: + if (shiftPressed) { + action.postLocalAction(KeyActionHandler.ACTION_SELECT_LEFT); + } else { + action.postLocalAction(KeyActionHandler.ACTION_MOVE_LEFT); + } + return true; + case KeySyms.Key_Right: + if (shiftPressed) { + action.postLocalAction(KeyActionHandler.ACTION_SELECT_RIGHT); + } else { + action.postLocalAction(KeyActionHandler.ACTION_MOVE_RIGHT); + } + return true; + case KeySyms.Key_Home: + if (shiftPressed) { + action.postLocalAction(KeyActionHandler.ACTION_SELECT_LEFTMOST); + } else { + action.postLocalAction(KeyActionHandler.ACTION_MOVE_LEFTMOST); + } + return true; + case KeySyms.Key_End: + if (shiftPressed) { + action.postLocalAction(KeyActionHandler.ACTION_SELECT_RIGHTMOST); + } else { + action.postLocalAction(KeyActionHandler.ACTION_MOVE_RIGHTMOST); + } + return true; + } + return false; + } + + @Override + public boolean keyUp(int key) { + switch (key) { + case KeySyms.Key_Shift_L: + case KeySyms.Key_Shift_R: + shiftPressed = false; + return false; + } + return false; + } +} diff --git a/app/src/main/java/com/javispedro/vndroid/keymaps/KeyActionHandler.java b/app/src/main/java/com/javispedro/vndroid/keymaps/KeyActionHandler.java new file mode 100644 index 0000000..41fd510 --- /dev/null +++ b/app/src/main/java/com/javispedro/vndroid/keymaps/KeyActionHandler.java @@ -0,0 +1,20 @@ +package com.javispedro.vndroid.keymaps; + +public interface KeyActionHandler { + int ACTION_NONE = 0; + int ACTION_BACKSPACE = 1; + int ACTION_DEL = 2; + int ACTION_MOVE_LEFT = 10; + int ACTION_MOVE_RIGHT = 11; + int ACTION_MOVE_LEFTMOST = 12; + int ACTION_MOVE_RIGHTMOST = 13; + int ACTION_SELECT_LEFT = 20; + int ACTION_SELECT_RIGHT = 21; + int ACTION_SELECT_LEFTMOST = 22; + int ACTION_SELECT_RIGHTMOST = 23; + + void postText(CharSequence text); + void postChar(char c); + void postLocalAction(int action); + void postGlobalAction(int action); +} diff --git a/app/src/main/java/com/javispedro/vndroid/keymaps/KeyHandler.java b/app/src/main/java/com/javispedro/vndroid/keymaps/KeyHandler.java new file mode 100644 index 0000000..5f64f34 --- /dev/null +++ b/app/src/main/java/com/javispedro/vndroid/keymaps/KeyHandler.java @@ -0,0 +1,12 @@ +package com.javispedro.vndroid.keymaps; + +public abstract class KeyHandler { + protected KeyActionHandler action; + + public void setActionHandler(KeyActionHandler handler) { + action = handler; + } + + public abstract boolean keyDown(int key); + public abstract boolean keyUp(int key); +} diff --git a/app/src/main/java/com/javispedro/vndroid/keymaps/KeySyms.java b/app/src/main/java/com/javispedro/vndroid/keymaps/KeySyms.java new file mode 100644 index 0000000..033cd32 --- /dev/null +++ b/app/src/main/java/com/javispedro/vndroid/keymaps/KeySyms.java @@ -0,0 +1,1321 @@ +package com.javispedro.vndroid.keymaps; + +public class KeySyms { + public static final int Key_BackSpace = 0xFF08 /* back space, back char */; + public static final int Key_Tab = 0xFF09; + public static final int Key_Linefeed = 0xFF0A /* Linefeed, LF */; + public static final int Key_Clear = 0xFF0B; + public static final int Key_Return = 0xFF0D /* Return, enter */; + public static final int Key_Pause = 0xFF13 /* Pause, hold */; + public static final int Key_Scroll_Lock = 0xFF14; + public static final int Key_Sys_Req = 0xFF15; + public static final int Key_Escape = 0xFF1B; + public static final int Key_Delete = 0xFFFF /* Delete, rubout */; + public static final int Key_Multi_key = 0xFF20 /* Multi-key character compose */; + public static final int Key_SingleCandidate = 0xFF3C; + public static final int Key_MultipleCandidate = 0xFF3D; + public static final int Key_PreviousCandidate = 0xFF3E; + public static final int Key_Kanji = 0xFF21 /* Kanji, Kanji convert */; + public static final int Key_Muhenkan = 0xFF22 /* Cancel Conversion */; + public static final int Key_Henkan_Mode = 0xFF23 /* Start/Stop Conversion */; + public static final int Key_Henkan = 0xFF23 /* Alias for Henkan_Mode */; + public static final int Key_Romaji = 0xFF24 /* to Romaji */; + public static final int Key_Hiragana = 0xFF25 /* to Hiragana */; + public static final int Key_Katakana = 0xFF26 /* to Katakana */; + public static final int Key_Hiragana_Katakana = 0xFF27 /* Hiragana/Katakana toggle */; + public static final int Key_Zenkaku = 0xFF28 /* to Zenkaku */; + public static final int Key_Hankaku = 0xFF29 /* to Hankaku */; + public static final int Key_Zenkaku_Hankaku = 0xFF2A /* Zenkaku/Hankaku toggle */; + public static final int Key_Touroku = 0xFF2B /* Add to Dictionary */; + public static final int Key_Massyo = 0xFF2C /* Delete from Dictionary */; + public static final int Key_Kana_Lock = 0xFF2D /* Kana Lock */; + public static final int Key_Kana_Shift = 0xFF2E /* Kana Shift */; + public static final int Key_Eisu_Shift = 0xFF2F /* Alphanumeric Shift */; + public static final int Key_Eisu_toggle = 0xFF30 /* Alphanumeric toggle */; + public static final int Key_Zen_Koho = 0xFF3D /* Multiple/All Candidate(s) */; + public static final int Key_Mae_Koho = 0xFF3E /* Previous Candidate */; + public static final int Key_Home = 0xFF50; + public static final int Key_Left = 0xFF51 /* Move left, left arrow */; + public static final int Key_Up = 0xFF52 /* Move up, up arrow */; + public static final int Key_Right = 0xFF53 /* Move right, right arrow */; + public static final int Key_Down = 0xFF54 /* Move down, down arrow */; + public static final int Key_Prior = 0xFF55 /* Prior, previous */; + public static final int Key_Page_Up = 0xFF55; + public static final int Key_Next = 0xFF56 /* Next */; + public static final int Key_Page_Down = 0xFF56; + public static final int Key_End = 0xFF57 /* EOL */; + public static final int Key_Begin = 0xFF58 /* BOL */; + public static final int Key_Select = 0xFF60 /* Select, mark */; + public static final int Key_Print = 0xFF61; + public static final int Key_Execute = 0xFF62 /* Execute, run, do */; + public static final int Key_Insert = 0xFF63 /* Insert, insert here */; + public static final int Key_Undo = 0xFF65 /* Undo, oops */; + public static final int Key_Redo = 0xFF66 /* redo, again */; + public static final int Key_Menu = 0xFF67; + public static final int Key_Find = 0xFF68 /* Find, search */; + public static final int Key_Cancel = 0xFF69 /* Cancel, stop, abort, exit */; + public static final int Key_Help = 0xFF6A /* Help */; + public static final int Key_Break = 0xFF6B; + public static final int Key_Mode_switch = 0xFF7E /* Character set switch */; + public static final int Key_script_switch = 0xFF7E /* Alias for mode_switch */; + public static final int Key_Num_Lock = 0xFF7F; + public static final int Key_KP_Space = 0xFF80 /* space */; + public static final int Key_KP_Tab = 0xFF89; + public static final int Key_KP_Enter = 0xFF8D /* enter */; + public static final int Key_KP_F1 = 0xFF91 /* PF1, KP_A, ... */; + public static final int Key_KP_F2 = 0xFF92; + public static final int Key_KP_F3 = 0xFF93; + public static final int Key_KP_F4 = 0xFF94; + public static final int Key_KP_Home = 0xFF95; + public static final int Key_KP_Left = 0xFF96; + public static final int Key_KP_Up = 0xFF97; + public static final int Key_KP_Right = 0xFF98; + public static final int Key_KP_Down = 0xFF99; + public static final int Key_KP_Prior = 0xFF9A; + public static final int Key_KP_Page_Up = 0xFF9A; + public static final int Key_KP_Next = 0xFF9B; + public static final int Key_KP_Page_Down = 0xFF9B; + public static final int Key_KP_End = 0xFF9C; + public static final int Key_KP_Begin = 0xFF9D; + public static final int Key_KP_Insert = 0xFF9E; + public static final int Key_KP_Delete = 0xFF9F; + public static final int Key_KP_Equal = 0xFFBD /* equals */; + public static final int Key_KP_Multiply = 0xFFAA; + public static final int Key_KP_Add = 0xFFAB; + public static final int Key_KP_Separator = 0xFFAC /* separator, often comma */; + public static final int Key_KP_Subtract = 0xFFAD; + public static final int Key_KP_Decimal = 0xFFAE; + public static final int Key_KP_Divide = 0xFFAF; + public static final int Key_KP_0 = 0xFFB0; + public static final int Key_KP_1 = 0xFFB1; + public static final int Key_KP_2 = 0xFFB2; + public static final int Key_KP_3 = 0xFFB3; + public static final int Key_KP_4 = 0xFFB4; + public static final int Key_KP_5 = 0xFFB5; + public static final int Key_KP_6 = 0xFFB6; + public static final int Key_KP_7 = 0xFFB7; + public static final int Key_KP_8 = 0xFFB8; + public static final int Key_KP_9 = 0xFFB9; + public static final int Key_F1 = 0xFFBE; + public static final int Key_F2 = 0xFFBF; + public static final int Key_F3 = 0xFFC0; + public static final int Key_F4 = 0xFFC1; + public static final int Key_F5 = 0xFFC2; + public static final int Key_F6 = 0xFFC3; + public static final int Key_F7 = 0xFFC4; + public static final int Key_F8 = 0xFFC5; + public static final int Key_F9 = 0xFFC6; + public static final int Key_F10 = 0xFFC7; + public static final int Key_F11 = 0xFFC8; + public static final int Key_L1 = 0xFFC8; + public static final int Key_F12 = 0xFFC9; + public static final int Key_L2 = 0xFFC9; + public static final int Key_F13 = 0xFFCA; + public static final int Key_L3 = 0xFFCA; + public static final int Key_F14 = 0xFFCB; + public static final int Key_L4 = 0xFFCB; + public static final int Key_F15 = 0xFFCC; + public static final int Key_L5 = 0xFFCC; + public static final int Key_F16 = 0xFFCD; + public static final int Key_L6 = 0xFFCD; + public static final int Key_F17 = 0xFFCE; + public static final int Key_L7 = 0xFFCE; + public static final int Key_F18 = 0xFFCF; + public static final int Key_L8 = 0xFFCF; + public static final int Key_F19 = 0xFFD0; + public static final int Key_L9 = 0xFFD0; + public static final int Key_F20 = 0xFFD1; + public static final int Key_L10 = 0xFFD1; + public static final int Key_F21 = 0xFFD2; + public static final int Key_R1 = 0xFFD2; + public static final int Key_F22 = 0xFFD3; + public static final int Key_R2 = 0xFFD3; + public static final int Key_F23 = 0xFFD4; + public static final int Key_R3 = 0xFFD4; + public static final int Key_F24 = 0xFFD5; + public static final int Key_R4 = 0xFFD5; + public static final int Key_F25 = 0xFFD6; + public static final int Key_R5 = 0xFFD6; + public static final int Key_F26 = 0xFFD7; + public static final int Key_R6 = 0xFFD7; + public static final int Key_F27 = 0xFFD8; + public static final int Key_R7 = 0xFFD8; + public static final int Key_F28 = 0xFFD9; + public static final int Key_R8 = 0xFFD9; + public static final int Key_F29 = 0xFFDA; + public static final int Key_R9 = 0xFFDA; + public static final int Key_F30 = 0xFFDB; + public static final int Key_R10 = 0xFFDB; + public static final int Key_F31 = 0xFFDC; + public static final int Key_R11 = 0xFFDC; + public static final int Key_F32 = 0xFFDD; + public static final int Key_R12 = 0xFFDD; + public static final int Key_F33 = 0xFFDE; + public static final int Key_R13 = 0xFFDE; + public static final int Key_F34 = 0xFFDF; + public static final int Key_R14 = 0xFFDF; + public static final int Key_F35 = 0xFFE0; + public static final int Key_R15 = 0xFFE0; + public static final int Key_Shift_L = 0xFFE1 /* Left shift */; + public static final int Key_Shift_R = 0xFFE2 /* Right shift */; + public static final int Key_Control_L = 0xFFE3 /* Left control */; + public static final int Key_Control_R = 0xFFE4 /* Right control */; + public static final int Key_Caps_Lock = 0xFFE5 /* Caps lock */; + public static final int Key_Shift_Lock = 0xFFE6 /* Shift lock */; + public static final int Key_Meta_L = 0xFFE7 /* Left meta */; + public static final int Key_Meta_R = 0xFFE8 /* Right meta */; + public static final int Key_Alt_L = 0xFFE9 /* Left alt */; + public static final int Key_Alt_R = 0xFFEA /* Right alt */; + public static final int Key_Super_L = 0xFFEB /* Left super */; + public static final int Key_Super_R = 0xFFEC /* Right super */; + public static final int Key_Hyper_L = 0xFFED /* Left hyper */; + public static final int Key_Hyper_R = 0xFFEE /* Right hyper */; + public static final int Key_ISO_Lock = 0xFE01; + public static final int Key_ISO_Level2_Latch = 0xFE02; + public static final int Key_ISO_Level3_Shift = 0xFE03; + public static final int Key_ISO_Level3_Latch = 0xFE04; + public static final int Key_ISO_Level3_Lock = 0xFE05; + public static final int Key_ISO_Group_Shift = 0xFF7E /* Alias for mode_switch */; + public static final int Key_ISO_Group_Latch = 0xFE06; + public static final int Key_ISO_Group_Lock = 0xFE07; + public static final int Key_ISO_Next_Group = 0xFE08; + public static final int Key_ISO_Next_Group_Lock = 0xFE09; + public static final int Key_ISO_Prev_Group = 0xFE0A; + public static final int Key_ISO_Prev_Group_Lock = 0xFE0B; + public static final int Key_ISO_First_Group = 0xFE0C; + public static final int Key_ISO_First_Group_Lock = 0xFE0D; + public static final int Key_ISO_Last_Group = 0xFE0E; + public static final int Key_ISO_Last_Group_Lock = 0xFE0F; + public static final int Key_ISO_Left_Tab = 0xFE20; + public static final int Key_ISO_Move_Line_Up = 0xFE21; + public static final int Key_ISO_Move_Line_Down = 0xFE22; + public static final int Key_ISO_Partial_Line_Up = 0xFE23; + public static final int Key_ISO_Partial_Line_Down = 0xFE24; + public static final int Key_ISO_Partial_Space_Left = 0xFE25; + public static final int Key_ISO_Partial_Space_Right = 0xFE26; + public static final int Key_ISO_Set_Margin_Left = 0xFE27; + public static final int Key_ISO_Set_Margin_Right = 0xFE28; + public static final int Key_ISO_Release_Margin_Left = 0xFE29; + public static final int Key_ISO_Release_Margin_Right = 0xFE2A; + public static final int Key_ISO_Release_Both_Margins = 0xFE2B; + public static final int Key_ISO_Fast_Cursor_Left = 0xFE2C; + public static final int Key_ISO_Fast_Cursor_Right = 0xFE2D; + public static final int Key_ISO_Fast_Cursor_Up = 0xFE2E; + public static final int Key_ISO_Fast_Cursor_Down = 0xFE2F; + public static final int Key_ISO_Continuous_Underline = 0xFE30; + public static final int Key_ISO_Discontinuous_Underline = 0xFE31; + public static final int Key_ISO_Emphasize = 0xFE32; + public static final int Key_ISO_Center_Object = 0xFE33; + public static final int Key_ISO_Enter = 0xFE34; + public static final int Key_dead_grave = 0xFE50; + public static final int Key_dead_acute = 0xFE51; + public static final int Key_dead_circumflex = 0xFE52; + public static final int Key_dead_tilde = 0xFE53; + public static final int Key_dead_macron = 0xFE54; + public static final int Key_dead_breve = 0xFE55; + public static final int Key_dead_abovedot = 0xFE56; + public static final int Key_dead_diaeresis = 0xFE57; + public static final int Key_dead_abovering = 0xFE58; + public static final int Key_dead_doubleacute = 0xFE59; + public static final int Key_dead_caron = 0xFE5A; + public static final int Key_dead_cedilla = 0xFE5B; + public static final int Key_dead_ogonek = 0xFE5C; + public static final int Key_dead_iota = 0xFE5D; + public static final int Key_dead_voiced_sound = 0xFE5E; + public static final int Key_dead_semivoiced_sound = 0xFE5F; + public static final int Key_dead_belowdot = 0xFE60; + public static final int Key_First_Virtual_Screen = 0xFED0; + public static final int Key_Prev_Virtual_Screen = 0xFED1; + public static final int Key_Next_Virtual_Screen = 0xFED2; + public static final int Key_Last_Virtual_Screen = 0xFED4; + public static final int Key_Terminate_Server = 0xFED5; + public static final int Key_AccessX_Enable = 0xFE70; + public static final int Key_AccessX_Feedback_Enable = 0xFE71; + public static final int Key_RepeatKeys_Enable = 0xFE72; + public static final int Key_SlowKeys_Enable = 0xFE73; + public static final int Key_BounceKeys_Enable = 0xFE74; + public static final int Key_StickyKeys_Enable = 0xFE75; + public static final int Key_MouseKeys_Enable = 0xFE76; + public static final int Key_MouseKeys_Accel_Enable = 0xFE77; + public static final int Key_Overlay1_Enable = 0xFE78; + public static final int Key_Overlay2_Enable = 0xFE79; + public static final int Key_AudibleBell_Enable = 0xFE7A; + public static final int Key_Pointer_Left = 0xFEE0; + public static final int Key_Pointer_Right = 0xFEE1; + public static final int Key_Pointer_Up = 0xFEE2; + public static final int Key_Pointer_Down = 0xFEE3; + public static final int Key_Pointer_UpLeft = 0xFEE4; + public static final int Key_Pointer_UpRight = 0xFEE5; + public static final int Key_Pointer_DownLeft = 0xFEE6; + public static final int Key_Pointer_DownRight = 0xFEE7; + public static final int Key_Pointer_Button_Dflt = 0xFEE8; + public static final int Key_Pointer_Button1 = 0xFEE9; + public static final int Key_Pointer_Button2 = 0xFEEA; + public static final int Key_Pointer_Button3 = 0xFEEB; + public static final int Key_Pointer_Button4 = 0xFEEC; + public static final int Key_Pointer_Button5 = 0xFEED; + public static final int Key_Pointer_DblClick_Dflt = 0xFEEE; + public static final int Key_Pointer_DblClick1 = 0xFEEF; + public static final int Key_Pointer_DblClick2 = 0xFEF0; + public static final int Key_Pointer_DblClick3 = 0xFEF1; + public static final int Key_Pointer_DblClick4 = 0xFEF2; + public static final int Key_Pointer_DblClick5 = 0xFEF3; + public static final int Key_Pointer_Drag_Dflt = 0xFEF4; + public static final int Key_Pointer_Drag1 = 0xFEF5; + public static final int Key_Pointer_Drag2 = 0xFEF6; + public static final int Key_Pointer_Drag3 = 0xFEF7; + public static final int Key_Pointer_Drag4 = 0xFEF8; + public static final int Key_Pointer_Drag5 = 0xFEFD; + public static final int Key_Pointer_EnableKeys = 0xFEF9; + public static final int Key_Pointer_Accelerate = 0xFEFA; + public static final int Key_Pointer_DfltBtnNext = 0xFEFB; + public static final int Key_Pointer_DfltBtnPrev = 0xFEFC; + public static final int Key_3270_Duplicate = 0xFD01; + public static final int Key_3270_FieldMark = 0xFD02; + public static final int Key_3270_Right2 = 0xFD03; + public static final int Key_3270_Left2 = 0xFD04; + public static final int Key_3270_BackTab = 0xFD05; + public static final int Key_3270_EraseEOF = 0xFD06; + public static final int Key_3270_EraseInput = 0xFD07; + public static final int Key_3270_Reset = 0xFD08; + public static final int Key_3270_Quit = 0xFD09; + public static final int Key_3270_PA1 = 0xFD0A; + public static final int Key_3270_PA2 = 0xFD0B; + public static final int Key_3270_PA3 = 0xFD0C; + public static final int Key_3270_Test = 0xFD0D; + public static final int Key_3270_Attn = 0xFD0E; + public static final int Key_3270_CursorBlink = 0xFD0F; + public static final int Key_3270_AltCursor = 0xFD10; + public static final int Key_3270_KeyClick = 0xFD11; + public static final int Key_3270_Jump = 0xFD12; + public static final int Key_3270_Ident = 0xFD13; + public static final int Key_3270_Rule = 0xFD14; + public static final int Key_3270_Copy = 0xFD15; + public static final int Key_3270_Play = 0xFD16; + public static final int Key_3270_Setup = 0xFD17; + public static final int Key_3270_Record = 0xFD18; + public static final int Key_3270_ChangeScreen = 0xFD19; + public static final int Key_3270_DeleteWord = 0xFD1A; + public static final int Key_3270_ExSelect = 0xFD1B; + public static final int Key_3270_CursorSelect = 0xFD1C; + public static final int Key_3270_PrintScreen = 0xFD1D; + public static final int Key_3270_Enter = 0xFD1E; + public static final int Key_space = 0x020; + public static final int Key_exclam = 0x021; + public static final int Key_quotedbl = 0x022; + public static final int Key_numbersign = 0x023; + public static final int Key_dollar = 0x024; + public static final int Key_percent = 0x025; + public static final int Key_ampersand = 0x026; + public static final int Key_apostrophe = 0x027; + public static final int Key_quoteright = 0x027 /* deprecated */; + public static final int Key_parenleft = 0x028; + public static final int Key_parenright = 0x029; + public static final int Key_asterisk = 0x02a; + public static final int Key_plus = 0x02b; + public static final int Key_comma = 0x02c; + public static final int Key_minus = 0x02d; + public static final int Key_period = 0x02e; + public static final int Key_slash = 0x02f; + public static final int Key_0 = 0x030; + public static final int Key_1 = 0x031; + public static final int Key_2 = 0x032; + public static final int Key_3 = 0x033; + public static final int Key_4 = 0x034; + public static final int Key_5 = 0x035; + public static final int Key_6 = 0x036; + public static final int Key_7 = 0x037; + public static final int Key_8 = 0x038; + public static final int Key_9 = 0x039; + public static final int Key_colon = 0x03a; + public static final int Key_semicolon = 0x03b; + public static final int Key_less = 0x03c; + public static final int Key_equal = 0x03d; + public static final int Key_greater = 0x03e; + public static final int Key_question = 0x03f; + public static final int Key_at = 0x040; + public static final int Key_A = 0x041; + public static final int Key_B = 0x042; + public static final int Key_C = 0x043; + public static final int Key_D = 0x044; + public static final int Key_E = 0x045; + public static final int Key_F = 0x046; + public static final int Key_G = 0x047; + public static final int Key_H = 0x048; + public static final int Key_I = 0x049; + public static final int Key_J = 0x04a; + public static final int Key_K = 0x04b; + public static final int Key_L = 0x04c; + public static final int Key_M = 0x04d; + public static final int Key_N = 0x04e; + public static final int Key_O = 0x04f; + public static final int Key_P = 0x050; + public static final int Key_Q = 0x051; + public static final int Key_R = 0x052; + public static final int Key_S = 0x053; + public static final int Key_T = 0x054; + public static final int Key_U = 0x055; + public static final int Key_V = 0x056; + public static final int Key_W = 0x057; + public static final int Key_X = 0x058; + public static final int Key_Y = 0x059; + public static final int Key_Z = 0x05a; + public static final int Key_bracketleft = 0x05b; + public static final int Key_backslash = 0x05c; + public static final int Key_bracketright = 0x05d; + public static final int Key_asciicircum = 0x05e; + public static final int Key_underscore = 0x05f; + public static final int Key_grave = 0x060; + public static final int Key_quoteleft = 0x060 /* deprecated */; + public static final int Key_a = 0x061; + public static final int Key_b = 0x062; + public static final int Key_c = 0x063; + public static final int Key_d = 0x064; + public static final int Key_e = 0x065; + public static final int Key_f = 0x066; + public static final int Key_g = 0x067; + public static final int Key_h = 0x068; + public static final int Key_i = 0x069; + public static final int Key_j = 0x06a; + public static final int Key_k = 0x06b; + public static final int Key_l = 0x06c; + public static final int Key_m = 0x06d; + public static final int Key_n = 0x06e; + public static final int Key_o = 0x06f; + public static final int Key_p = 0x070; + public static final int Key_q = 0x071; + public static final int Key_r = 0x072; + public static final int Key_s = 0x073; + public static final int Key_t = 0x074; + public static final int Key_u = 0x075; + public static final int Key_v = 0x076; + public static final int Key_w = 0x077; + public static final int Key_x = 0x078; + public static final int Key_y = 0x079; + public static final int Key_z = 0x07a; + public static final int Key_braceleft = 0x07b; + public static final int Key_bar = 0x07c; + public static final int Key_braceright = 0x07d; + public static final int Key_asciitilde = 0x07e; + public static final int Key_nobreakspace = 0x0a0; + public static final int Key_exclamdown = 0x0a1; + public static final int Key_cent = 0x0a2; + public static final int Key_sterling = 0x0a3; + public static final int Key_currency = 0x0a4; + public static final int Key_yen = 0x0a5; + public static final int Key_brokenbar = 0x0a6; + public static final int Key_section = 0x0a7; + public static final int Key_diaeresis = 0x0a8; + public static final int Key_copyright = 0x0a9; + public static final int Key_ordfeminine = 0x0aa; + public static final int Key_guillemotleft = 0x0ab /* left angle quotation mark */; + public static final int Key_notsign = 0x0ac; + public static final int Key_hyphen = 0x0ad; + public static final int Key_registered = 0x0ae; + public static final int Key_macron = 0x0af; + public static final int Key_degree = 0x0b0; + public static final int Key_plusminus = 0x0b1; + public static final int Key_twosuperior = 0x0b2; + public static final int Key_threesuperior = 0x0b3; + public static final int Key_acute = 0x0b4; + public static final int Key_mu = 0x0b5; + public static final int Key_paragraph = 0x0b6; + public static final int Key_periodcentered = 0x0b7; + public static final int Key_cedilla = 0x0b8; + public static final int Key_onesuperior = 0x0b9; + public static final int Key_masculine = 0x0ba; + public static final int Key_guillemotright = 0x0bb /* right angle quotation mark */; + public static final int Key_onequarter = 0x0bc; + public static final int Key_onehalf = 0x0bd; + public static final int Key_threequarters = 0x0be; + public static final int Key_questiondown = 0x0bf; + public static final int Key_Agrave = 0x0c0; + public static final int Key_Aacute = 0x0c1; + public static final int Key_Acircumflex = 0x0c2; + public static final int Key_Atilde = 0x0c3; + public static final int Key_Adiaeresis = 0x0c4; + public static final int Key_Aring = 0x0c5; + public static final int Key_AE = 0x0c6; + public static final int Key_Ccedilla = 0x0c7; + public static final int Key_Egrave = 0x0c8; + public static final int Key_Eacute = 0x0c9; + public static final int Key_Ecircumflex = 0x0ca; + public static final int Key_Ediaeresis = 0x0cb; + public static final int Key_Igrave = 0x0cc; + public static final int Key_Iacute = 0x0cd; + public static final int Key_Icircumflex = 0x0ce; + public static final int Key_Idiaeresis = 0x0cf; + public static final int Key_ETH = 0x0d0; + public static final int Key_Eth = 0x0d0 /* deprecated */; + public static final int Key_Ntilde = 0x0d1; + public static final int Key_Ograve = 0x0d2; + public static final int Key_Oacute = 0x0d3; + public static final int Key_Ocircumflex = 0x0d4; + public static final int Key_Otilde = 0x0d5; + public static final int Key_Odiaeresis = 0x0d6; + public static final int Key_multiply = 0x0d7; + public static final int Key_Ooblique = 0x0d8; + public static final int Key_Ugrave = 0x0d9; + public static final int Key_Uacute = 0x0da; + public static final int Key_Ucircumflex = 0x0db; + public static final int Key_Udiaeresis = 0x0dc; + public static final int Key_Yacute = 0x0dd; + public static final int Key_THORN = 0x0de; + public static final int Key_Thorn = 0x0de /* deprecated */; + public static final int Key_ssharp = 0x0df; + public static final int Key_agrave = 0x0e0; + public static final int Key_aacute = 0x0e1; + public static final int Key_acircumflex = 0x0e2; + public static final int Key_atilde = 0x0e3; + public static final int Key_adiaeresis = 0x0e4; + public static final int Key_aring = 0x0e5; + public static final int Key_ae = 0x0e6; + public static final int Key_ccedilla = 0x0e7; + public static final int Key_egrave = 0x0e8; + public static final int Key_eacute = 0x0e9; + public static final int Key_ecircumflex = 0x0ea; + public static final int Key_ediaeresis = 0x0eb; + public static final int Key_igrave = 0x0ec; + public static final int Key_iacute = 0x0ed; + public static final int Key_icircumflex = 0x0ee; + public static final int Key_idiaeresis = 0x0ef; + public static final int Key_eth = 0x0f0; + public static final int Key_ntilde = 0x0f1; + public static final int Key_ograve = 0x0f2; + public static final int Key_oacute = 0x0f3; + public static final int Key_ocircumflex = 0x0f4; + public static final int Key_otilde = 0x0f5; + public static final int Key_odiaeresis = 0x0f6; + public static final int Key_division = 0x0f7; + public static final int Key_oslash = 0x0f8; + public static final int Key_ugrave = 0x0f9; + public static final int Key_uacute = 0x0fa; + public static final int Key_ucircumflex = 0x0fb; + public static final int Key_udiaeresis = 0x0fc; + public static final int Key_yacute = 0x0fd; + public static final int Key_thorn = 0x0fe; + public static final int Key_ydiaeresis = 0x0ff; + public static final int Key_Aogonek = 0x1a1; + public static final int Key_breve = 0x1a2; + public static final int Key_Lstroke = 0x1a3; + public static final int Key_Lcaron = 0x1a5; + public static final int Key_Sacute = 0x1a6; + public static final int Key_Scaron = 0x1a9; + public static final int Key_Scedilla = 0x1aa; + public static final int Key_Tcaron = 0x1ab; + public static final int Key_Zacute = 0x1ac; + public static final int Key_Zcaron = 0x1ae; + public static final int Key_Zabovedot = 0x1af; + public static final int Key_aogonek = 0x1b1; + public static final int Key_ogonek = 0x1b2; + public static final int Key_lstroke = 0x1b3; + public static final int Key_lcaron = 0x1b5; + public static final int Key_sacute = 0x1b6; + public static final int Key_caron = 0x1b7; + public static final int Key_scaron = 0x1b9; + public static final int Key_scedilla = 0x1ba; + public static final int Key_tcaron = 0x1bb; + public static final int Key_zacute = 0x1bc; + public static final int Key_doubleacute = 0x1bd; + public static final int Key_zcaron = 0x1be; + public static final int Key_zabovedot = 0x1bf; + public static final int Key_Racute = 0x1c0; + public static final int Key_Abreve = 0x1c3; + public static final int Key_Lacute = 0x1c5; + public static final int Key_Cacute = 0x1c6; + public static final int Key_Ccaron = 0x1c8; + public static final int Key_Eogonek = 0x1ca; + public static final int Key_Ecaron = 0x1cc; + public static final int Key_Dcaron = 0x1cf; + public static final int Key_Dstroke = 0x1d0; + public static final int Key_Nacute = 0x1d1; + public static final int Key_Ncaron = 0x1d2; + public static final int Key_Odoubleacute = 0x1d5; + public static final int Key_Rcaron = 0x1d8; + public static final int Key_Uring = 0x1d9; + public static final int Key_Udoubleacute = 0x1db; + public static final int Key_Tcedilla = 0x1de; + public static final int Key_racute = 0x1e0; + public static final int Key_abreve = 0x1e3; + public static final int Key_lacute = 0x1e5; + public static final int Key_cacute = 0x1e6; + public static final int Key_ccaron = 0x1e8; + public static final int Key_eogonek = 0x1ea; + public static final int Key_ecaron = 0x1ec; + public static final int Key_dcaron = 0x1ef; + public static final int Key_dstroke = 0x1f0; + public static final int Key_nacute = 0x1f1; + public static final int Key_ncaron = 0x1f2; + public static final int Key_odoubleacute = 0x1f5; + public static final int Key_udoubleacute = 0x1fb; + public static final int Key_rcaron = 0x1f8; + public static final int Key_uring = 0x1f9; + public static final int Key_tcedilla = 0x1fe; + public static final int Key_abovedot = 0x1ff; + public static final int Key_Hstroke = 0x2a1; + public static final int Key_Hcircumflex = 0x2a6; + public static final int Key_Iabovedot = 0x2a9; + public static final int Key_Gbreve = 0x2ab; + public static final int Key_Jcircumflex = 0x2ac; + public static final int Key_hstroke = 0x2b1; + public static final int Key_hcircumflex = 0x2b6; + public static final int Key_idotless = 0x2b9; + public static final int Key_gbreve = 0x2bb; + public static final int Key_jcircumflex = 0x2bc; + public static final int Key_Cabovedot = 0x2c5; + public static final int Key_Ccircumflex = 0x2c6; + public static final int Key_Gabovedot = 0x2d5; + public static final int Key_Gcircumflex = 0x2d8; + public static final int Key_Ubreve = 0x2dd; + public static final int Key_Scircumflex = 0x2de; + public static final int Key_cabovedot = 0x2e5; + public static final int Key_ccircumflex = 0x2e6; + public static final int Key_gabovedot = 0x2f5; + public static final int Key_gcircumflex = 0x2f8; + public static final int Key_ubreve = 0x2fd; + public static final int Key_scircumflex = 0x2fe; + public static final int Key_kra = 0x3a2; + public static final int Key_kappa = 0x3a2 /* deprecated */; + public static final int Key_Rcedilla = 0x3a3; + public static final int Key_Itilde = 0x3a5; + public static final int Key_Lcedilla = 0x3a6; + public static final int Key_Emacron = 0x3aa; + public static final int Key_Gcedilla = 0x3ab; + public static final int Key_Tslash = 0x3ac; + public static final int Key_rcedilla = 0x3b3; + public static final int Key_itilde = 0x3b5; + public static final int Key_lcedilla = 0x3b6; + public static final int Key_emacron = 0x3ba; + public static final int Key_gcedilla = 0x3bb; + public static final int Key_tslash = 0x3bc; + public static final int Key_ENG = 0x3bd; + public static final int Key_eng = 0x3bf; + public static final int Key_Amacron = 0x3c0; + public static final int Key_Iogonek = 0x3c7; + public static final int Key_Eabovedot = 0x3cc; + public static final int Key_Imacron = 0x3cf; + public static final int Key_Ncedilla = 0x3d1; + public static final int Key_Omacron = 0x3d2; + public static final int Key_Kcedilla = 0x3d3; + public static final int Key_Uogonek = 0x3d9; + public static final int Key_Utilde = 0x3dd; + public static final int Key_Umacron = 0x3de; + public static final int Key_amacron = 0x3e0; + public static final int Key_iogonek = 0x3e7; + public static final int Key_eabovedot = 0x3ec; + public static final int Key_imacron = 0x3ef; + public static final int Key_ncedilla = 0x3f1; + public static final int Key_omacron = 0x3f2; + public static final int Key_kcedilla = 0x3f3; + public static final int Key_uogonek = 0x3f9; + public static final int Key_utilde = 0x3fd; + public static final int Key_umacron = 0x3fe; + public static final int Key_overline = 0x47e; + public static final int Key_kana_fullstop = 0x4a1; + public static final int Key_kana_openingbracket = 0x4a2; + public static final int Key_kana_closingbracket = 0x4a3; + public static final int Key_kana_comma = 0x4a4; + public static final int Key_kana_conjunctive = 0x4a5; + public static final int Key_kana_middledot = 0x4a5 /* deprecated */; + public static final int Key_kana_WO = 0x4a6; + public static final int Key_kana_a = 0x4a7; + public static final int Key_kana_i = 0x4a8; + public static final int Key_kana_u = 0x4a9; + public static final int Key_kana_e = 0x4aa; + public static final int Key_kana_o = 0x4ab; + public static final int Key_kana_ya = 0x4ac; + public static final int Key_kana_yu = 0x4ad; + public static final int Key_kana_yo = 0x4ae; + public static final int Key_kana_tsu = 0x4af; + public static final int Key_kana_tu = 0x4af /* deprecated */; + public static final int Key_prolongedsound = 0x4b0; + public static final int Key_kana_A = 0x4b1; + public static final int Key_kana_I = 0x4b2; + public static final int Key_kana_U = 0x4b3; + public static final int Key_kana_E = 0x4b4; + public static final int Key_kana_O = 0x4b5; + public static final int Key_kana_KA = 0x4b6; + public static final int Key_kana_KI = 0x4b7; + public static final int Key_kana_KU = 0x4b8; + public static final int Key_kana_KE = 0x4b9; + public static final int Key_kana_KO = 0x4ba; + public static final int Key_kana_SA = 0x4bb; + public static final int Key_kana_SHI = 0x4bc; + public static final int Key_kana_SU = 0x4bd; + public static final int Key_kana_SE = 0x4be; + public static final int Key_kana_SO = 0x4bf; + public static final int Key_kana_TA = 0x4c0; + public static final int Key_kana_CHI = 0x4c1; + public static final int Key_kana_TI = 0x4c1 /* deprecated */; + public static final int Key_kana_TSU = 0x4c2; + public static final int Key_kana_TU = 0x4c2 /* deprecated */; + public static final int Key_kana_TE = 0x4c3; + public static final int Key_kana_TO = 0x4c4; + public static final int Key_kana_NA = 0x4c5; + public static final int Key_kana_NI = 0x4c6; + public static final int Key_kana_NU = 0x4c7; + public static final int Key_kana_NE = 0x4c8; + public static final int Key_kana_NO = 0x4c9; + public static final int Key_kana_HA = 0x4ca; + public static final int Key_kana_HI = 0x4cb; + public static final int Key_kana_FU = 0x4cc; + public static final int Key_kana_HU = 0x4cc /* deprecated */; + public static final int Key_kana_HE = 0x4cd; + public static final int Key_kana_HO = 0x4ce; + public static final int Key_kana_MA = 0x4cf; + public static final int Key_kana_MI = 0x4d0; + public static final int Key_kana_MU = 0x4d1; + public static final int Key_kana_ME = 0x4d2; + public static final int Key_kana_MO = 0x4d3; + public static final int Key_kana_YA = 0x4d4; + public static final int Key_kana_YU = 0x4d5; + public static final int Key_kana_YO = 0x4d6; + public static final int Key_kana_RA = 0x4d7; + public static final int Key_kana_RI = 0x4d8; + public static final int Key_kana_RU = 0x4d9; + public static final int Key_kana_RE = 0x4da; + public static final int Key_kana_RO = 0x4db; + public static final int Key_kana_WA = 0x4dc; + public static final int Key_kana_N = 0x4dd; + public static final int Key_voicedsound = 0x4de; + public static final int Key_semivoicedsound = 0x4df; + public static final int Key_kana_switch = 0xFF7E /* Alias for mode_switch */; + public static final int Key_Arabic_comma = 0x5ac; + public static final int Key_Arabic_semicolon = 0x5bb; + public static final int Key_Arabic_question_mark = 0x5bf; + public static final int Key_Arabic_hamza = 0x5c1; + public static final int Key_Arabic_maddaonalef = 0x5c2; + public static final int Key_Arabic_hamzaonalef = 0x5c3; + public static final int Key_Arabic_hamzaonwaw = 0x5c4; + public static final int Key_Arabic_hamzaunderalef = 0x5c5; + public static final int Key_Arabic_hamzaonyeh = 0x5c6; + public static final int Key_Arabic_alef = 0x5c7; + public static final int Key_Arabic_beh = 0x5c8; + public static final int Key_Arabic_tehmarbuta = 0x5c9; + public static final int Key_Arabic_teh = 0x5ca; + public static final int Key_Arabic_theh = 0x5cb; + public static final int Key_Arabic_jeem = 0x5cc; + public static final int Key_Arabic_hah = 0x5cd; + public static final int Key_Arabic_khah = 0x5ce; + public static final int Key_Arabic_dal = 0x5cf; + public static final int Key_Arabic_thal = 0x5d0; + public static final int Key_Arabic_ra = 0x5d1; + public static final int Key_Arabic_zain = 0x5d2; + public static final int Key_Arabic_seen = 0x5d3; + public static final int Key_Arabic_sheen = 0x5d4; + public static final int Key_Arabic_sad = 0x5d5; + public static final int Key_Arabic_dad = 0x5d6; + public static final int Key_Arabic_tah = 0x5d7; + public static final int Key_Arabic_zah = 0x5d8; + public static final int Key_Arabic_ain = 0x5d9; + public static final int Key_Arabic_ghain = 0x5da; + public static final int Key_Arabic_tatweel = 0x5e0; + public static final int Key_Arabic_feh = 0x5e1; + public static final int Key_Arabic_qaf = 0x5e2; + public static final int Key_Arabic_kaf = 0x5e3; + public static final int Key_Arabic_lam = 0x5e4; + public static final int Key_Arabic_meem = 0x5e5; + public static final int Key_Arabic_noon = 0x5e6; + public static final int Key_Arabic_ha = 0x5e7; + public static final int Key_Arabic_heh = 0x5e7 /* deprecated */; + public static final int Key_Arabic_waw = 0x5e8; + public static final int Key_Arabic_alefmaksura = 0x5e9; + public static final int Key_Arabic_yeh = 0x5ea; + public static final int Key_Arabic_fathatan = 0x5eb; + public static final int Key_Arabic_dammatan = 0x5ec; + public static final int Key_Arabic_kasratan = 0x5ed; + public static final int Key_Arabic_fatha = 0x5ee; + public static final int Key_Arabic_damma = 0x5ef; + public static final int Key_Arabic_kasra = 0x5f0; + public static final int Key_Arabic_shadda = 0x5f1; + public static final int Key_Arabic_sukun = 0x5f2; + public static final int Key_Arabic_switch = 0xFF7E /* Alias for mode_switch */; + public static final int Key_Serbian_dje = 0x6a1; + public static final int Key_Macedonia_gje = 0x6a2; + public static final int Key_Cyrillic_io = 0x6a3; + public static final int Key_Ukrainian_ie = 0x6a4; + public static final int Key_Ukranian_je = 0x6a4 /* deprecated */; + public static final int Key_Macedonia_dse = 0x6a5; + public static final int Key_Ukrainian_i = 0x6a6; + public static final int Key_Ukranian_i = 0x6a6 /* deprecated */; + public static final int Key_Ukrainian_yi = 0x6a7; + public static final int Key_Ukranian_yi = 0x6a7 /* deprecated */; + public static final int Key_Cyrillic_je = 0x6a8; + public static final int Key_Serbian_je = 0x6a8 /* deprecated */; + public static final int Key_Cyrillic_lje = 0x6a9; + public static final int Key_Serbian_lje = 0x6a9 /* deprecated */; + public static final int Key_Cyrillic_nje = 0x6aa; + public static final int Key_Serbian_nje = 0x6aa /* deprecated */; + public static final int Key_Serbian_tshe = 0x6ab; + public static final int Key_Macedonia_kje = 0x6ac; + public static final int Key_Byelorussian_shortu = 0x6ae; + public static final int Key_Cyrillic_dzhe = 0x6af; + public static final int Key_Serbian_dze = 0x6af /* deprecated */; + public static final int Key_numerosign = 0x6b0; + public static final int Key_Serbian_DJE = 0x6b1; + public static final int Key_Macedonia_GJE = 0x6b2; + public static final int Key_Cyrillic_IO = 0x6b3; + public static final int Key_Ukrainian_IE = 0x6b4; + public static final int Key_Ukranian_JE = 0x6b4 /* deprecated */; + public static final int Key_Macedonia_DSE = 0x6b5; + public static final int Key_Ukrainian_I = 0x6b6; + public static final int Key_Ukranian_I = 0x6b6 /* deprecated */; + public static final int Key_Ukrainian_YI = 0x6b7; + public static final int Key_Ukranian_YI = 0x6b7 /* deprecated */; + public static final int Key_Cyrillic_JE = 0x6b8; + public static final int Key_Serbian_JE = 0x6b8 /* deprecated */; + public static final int Key_Cyrillic_LJE = 0x6b9; + public static final int Key_Serbian_LJE = 0x6b9 /* deprecated */; + public static final int Key_Cyrillic_NJE = 0x6ba; + public static final int Key_Serbian_NJE = 0x6ba /* deprecated */; + public static final int Key_Serbian_TSHE = 0x6bb; + public static final int Key_Macedonia_KJE = 0x6bc; + public static final int Key_Byelorussian_SHORTU = 0x6be; + public static final int Key_Cyrillic_DZHE = 0x6bf; + public static final int Key_Serbian_DZE = 0x6bf /* deprecated */; + public static final int Key_Cyrillic_yu = 0x6c0; + public static final int Key_Cyrillic_a = 0x6c1; + public static final int Key_Cyrillic_be = 0x6c2; + public static final int Key_Cyrillic_tse = 0x6c3; + public static final int Key_Cyrillic_de = 0x6c4; + public static final int Key_Cyrillic_ie = 0x6c5; + public static final int Key_Cyrillic_ef = 0x6c6; + public static final int Key_Cyrillic_ghe = 0x6c7; + public static final int Key_Cyrillic_ha = 0x6c8; + public static final int Key_Cyrillic_i = 0x6c9; + public static final int Key_Cyrillic_shorti = 0x6ca; + public static final int Key_Cyrillic_ka = 0x6cb; + public static final int Key_Cyrillic_el = 0x6cc; + public static final int Key_Cyrillic_em = 0x6cd; + public static final int Key_Cyrillic_en = 0x6ce; + public static final int Key_Cyrillic_o = 0x6cf; + public static final int Key_Cyrillic_pe = 0x6d0; + public static final int Key_Cyrillic_ya = 0x6d1; + public static final int Key_Cyrillic_er = 0x6d2; + public static final int Key_Cyrillic_es = 0x6d3; + public static final int Key_Cyrillic_te = 0x6d4; + public static final int Key_Cyrillic_u = 0x6d5; + public static final int Key_Cyrillic_zhe = 0x6d6; + public static final int Key_Cyrillic_ve = 0x6d7; + public static final int Key_Cyrillic_softsign = 0x6d8; + public static final int Key_Cyrillic_yeru = 0x6d9; + public static final int Key_Cyrillic_ze = 0x6da; + public static final int Key_Cyrillic_sha = 0x6db; + public static final int Key_Cyrillic_e = 0x6dc; + public static final int Key_Cyrillic_shcha = 0x6dd; + public static final int Key_Cyrillic_che = 0x6de; + public static final int Key_Cyrillic_hardsign = 0x6df; + public static final int Key_Cyrillic_YU = 0x6e0; + public static final int Key_Cyrillic_A = 0x6e1; + public static final int Key_Cyrillic_BE = 0x6e2; + public static final int Key_Cyrillic_TSE = 0x6e3; + public static final int Key_Cyrillic_DE = 0x6e4; + public static final int Key_Cyrillic_IE = 0x6e5; + public static final int Key_Cyrillic_EF = 0x6e6; + public static final int Key_Cyrillic_GHE = 0x6e7; + public static final int Key_Cyrillic_HA = 0x6e8; + public static final int Key_Cyrillic_I = 0x6e9; + public static final int Key_Cyrillic_SHORTI = 0x6ea; + public static final int Key_Cyrillic_KA = 0x6eb; + public static final int Key_Cyrillic_EL = 0x6ec; + public static final int Key_Cyrillic_EM = 0x6ed; + public static final int Key_Cyrillic_EN = 0x6ee; + public static final int Key_Cyrillic_O = 0x6ef; + public static final int Key_Cyrillic_PE = 0x6f0; + public static final int Key_Cyrillic_YA = 0x6f1; + public static final int Key_Cyrillic_ER = 0x6f2; + public static final int Key_Cyrillic_ES = 0x6f3; + public static final int Key_Cyrillic_TE = 0x6f4; + public static final int Key_Cyrillic_U = 0x6f5; + public static final int Key_Cyrillic_ZHE = 0x6f6; + public static final int Key_Cyrillic_VE = 0x6f7; + public static final int Key_Cyrillic_SOFTSIGN = 0x6f8; + public static final int Key_Cyrillic_YERU = 0x6f9; + public static final int Key_Cyrillic_ZE = 0x6fa; + public static final int Key_Cyrillic_SHA = 0x6fb; + public static final int Key_Cyrillic_E = 0x6fc; + public static final int Key_Cyrillic_SHCHA = 0x6fd; + public static final int Key_Cyrillic_CHE = 0x6fe; + public static final int Key_Cyrillic_HARDSIGN = 0x6ff; + public static final int Key_Greek_ALPHAaccent = 0x7a1; + public static final int Key_Greek_EPSILONaccent = 0x7a2; + public static final int Key_Greek_ETAaccent = 0x7a3; + public static final int Key_Greek_IOTAaccent = 0x7a4; + public static final int Key_Greek_IOTAdieresis = 0x7a5; + public static final int Key_Greek_OMICRONaccent = 0x7a7; + public static final int Key_Greek_UPSILONaccent = 0x7a8; + public static final int Key_Greek_UPSILONdieresis = 0x7a9; + public static final int Key_Greek_OMEGAaccent = 0x7ab; + public static final int Key_Greek_accentdieresis = 0x7ae; + public static final int Key_Greek_horizbar = 0x7af; + public static final int Key_Greek_alphaaccent = 0x7b1; + public static final int Key_Greek_epsilonaccent = 0x7b2; + public static final int Key_Greek_etaaccent = 0x7b3; + public static final int Key_Greek_iotaaccent = 0x7b4; + public static final int Key_Greek_iotadieresis = 0x7b5; + public static final int Key_Greek_iotaaccentdieresis = 0x7b6; + public static final int Key_Greek_omicronaccent = 0x7b7; + public static final int Key_Greek_upsilonaccent = 0x7b8; + public static final int Key_Greek_upsilondieresis = 0x7b9; + public static final int Key_Greek_upsilonaccentdieresis = 0x7ba; + public static final int Key_Greek_omegaaccent = 0x7bb; + public static final int Key_Greek_ALPHA = 0x7c1; + public static final int Key_Greek_BETA = 0x7c2; + public static final int Key_Greek_GAMMA = 0x7c3; + public static final int Key_Greek_DELTA = 0x7c4; + public static final int Key_Greek_EPSILON = 0x7c5; + public static final int Key_Greek_ZETA = 0x7c6; + public static final int Key_Greek_ETA = 0x7c7; + public static final int Key_Greek_THETA = 0x7c8; + public static final int Key_Greek_IOTA = 0x7c9; + public static final int Key_Greek_KAPPA = 0x7ca; + public static final int Key_Greek_LAMDA = 0x7cb; + public static final int Key_Greek_LAMBDA = 0x7cb; + public static final int Key_Greek_MU = 0x7cc; + public static final int Key_Greek_NU = 0x7cd; + public static final int Key_Greek_XI = 0x7ce; + public static final int Key_Greek_OMICRON = 0x7cf; + public static final int Key_Greek_PI = 0x7d0; + public static final int Key_Greek_RHO = 0x7d1; + public static final int Key_Greek_SIGMA = 0x7d2; + public static final int Key_Greek_TAU = 0x7d4; + public static final int Key_Greek_UPSILON = 0x7d5; + public static final int Key_Greek_PHI = 0x7d6; + public static final int Key_Greek_CHI = 0x7d7; + public static final int Key_Greek_PSI = 0x7d8; + public static final int Key_Greek_OMEGA = 0x7d9; + public static final int Key_Greek_alpha = 0x7e1; + public static final int Key_Greek_beta = 0x7e2; + public static final int Key_Greek_gamma = 0x7e3; + public static final int Key_Greek_delta = 0x7e4; + public static final int Key_Greek_epsilon = 0x7e5; + public static final int Key_Greek_zeta = 0x7e6; + public static final int Key_Greek_eta = 0x7e7; + public static final int Key_Greek_theta = 0x7e8; + public static final int Key_Greek_iota = 0x7e9; + public static final int Key_Greek_kappa = 0x7ea; + public static final int Key_Greek_lamda = 0x7eb; + public static final int Key_Greek_lambda = 0x7eb; + public static final int Key_Greek_mu = 0x7ec; + public static final int Key_Greek_nu = 0x7ed; + public static final int Key_Greek_xi = 0x7ee; + public static final int Key_Greek_omicron = 0x7ef; + public static final int Key_Greek_pi = 0x7f0; + public static final int Key_Greek_rho = 0x7f1; + public static final int Key_Greek_sigma = 0x7f2; + public static final int Key_Greek_finalsmallsigma = 0x7f3; + public static final int Key_Greek_tau = 0x7f4; + public static final int Key_Greek_upsilon = 0x7f5; + public static final int Key_Greek_phi = 0x7f6; + public static final int Key_Greek_chi = 0x7f7; + public static final int Key_Greek_psi = 0x7f8; + public static final int Key_Greek_omega = 0x7f9; + public static final int Key_Greek_switch = 0xFF7E /* Alias for mode_switch */; + public static final int Key_leftradical = 0x8a1; + public static final int Key_topleftradical = 0x8a2; + public static final int Key_horizconnector = 0x8a3; + public static final int Key_topintegral = 0x8a4; + public static final int Key_botintegral = 0x8a5; + public static final int Key_vertconnector = 0x8a6; + public static final int Key_topleftsqbracket = 0x8a7; + public static final int Key_botleftsqbracket = 0x8a8; + public static final int Key_toprightsqbracket = 0x8a9; + public static final int Key_botrightsqbracket = 0x8aa; + public static final int Key_topleftparens = 0x8ab; + public static final int Key_botleftparens = 0x8ac; + public static final int Key_toprightparens = 0x8ad; + public static final int Key_botrightparens = 0x8ae; + public static final int Key_leftmiddlecurlybrace = 0x8af; + public static final int Key_rightmiddlecurlybrace = 0x8b0; + public static final int Key_topleftsummation = 0x8b1; + public static final int Key_botleftsummation = 0x8b2; + public static final int Key_topvertsummationconnector = 0x8b3; + public static final int Key_botvertsummationconnector = 0x8b4; + public static final int Key_toprightsummation = 0x8b5; + public static final int Key_botrightsummation = 0x8b6; + public static final int Key_rightmiddlesummation = 0x8b7; + public static final int Key_lessthanequal = 0x8bc; + public static final int Key_notequal = 0x8bd; + public static final int Key_greaterthanequal = 0x8be; + public static final int Key_integral = 0x8bf; + public static final int Key_therefore = 0x8c0; + public static final int Key_variation = 0x8c1; + public static final int Key_infinity = 0x8c2; + public static final int Key_nabla = 0x8c5; + public static final int Key_approximate = 0x8c8; + public static final int Key_similarequal = 0x8c9; + public static final int Key_ifonlyif = 0x8cd; + public static final int Key_implies = 0x8ce; + public static final int Key_identical = 0x8cf; + public static final int Key_radical = 0x8d6; + public static final int Key_includedin = 0x8da; + public static final int Key_includes = 0x8db; + public static final int Key_intersection = 0x8dc; + public static final int Key_union = 0x8dd; + public static final int Key_logicaland = 0x8de; + public static final int Key_logicalor = 0x8df; + public static final int Key_partialderivative = 0x8ef; + public static final int Key_function = 0x8f6; + public static final int Key_leftarrow = 0x8fb; + public static final int Key_uparrow = 0x8fc; + public static final int Key_rightarrow = 0x8fd; + public static final int Key_downarrow = 0x8fe; + public static final int Key_blank = 0x9df; + public static final int Key_soliddiamond = 0x9e0; + public static final int Key_checkerboard = 0x9e1; + public static final int Key_ht = 0x9e2; + public static final int Key_ff = 0x9e3; + public static final int Key_cr = 0x9e4; + public static final int Key_lf = 0x9e5; + public static final int Key_nl = 0x9e8; + public static final int Key_vt = 0x9e9; + public static final int Key_lowrightcorner = 0x9ea; + public static final int Key_uprightcorner = 0x9eb; + public static final int Key_upleftcorner = 0x9ec; + public static final int Key_lowleftcorner = 0x9ed; + public static final int Key_crossinglines = 0x9ee; + public static final int Key_horizlinescan1 = 0x9ef; + public static final int Key_horizlinescan3 = 0x9f0; + public static final int Key_horizlinescan5 = 0x9f1; + public static final int Key_horizlinescan7 = 0x9f2; + public static final int Key_horizlinescan9 = 0x9f3; + public static final int Key_leftt = 0x9f4; + public static final int Key_rightt = 0x9f5; + public static final int Key_bott = 0x9f6; + public static final int Key_topt = 0x9f7; + public static final int Key_vertbar = 0x9f8; + public static final int Key_emspace = 0xaa1; + public static final int Key_enspace = 0xaa2; + public static final int Key_em3space = 0xaa3; + public static final int Key_em4space = 0xaa4; + public static final int Key_digitspace = 0xaa5; + public static final int Key_punctspace = 0xaa6; + public static final int Key_thinspace = 0xaa7; + public static final int Key_hairspace = 0xaa8; + public static final int Key_emdash = 0xaa9; + public static final int Key_endash = 0xaaa; + public static final int Key_signifblank = 0xaac; + public static final int Key_ellipsis = 0xaae; + public static final int Key_doubbaselinedot = 0xaaf; + public static final int Key_onethird = 0xab0; + public static final int Key_twothirds = 0xab1; + public static final int Key_onefifth = 0xab2; + public static final int Key_twofifths = 0xab3; + public static final int Key_threefifths = 0xab4; + public static final int Key_fourfifths = 0xab5; + public static final int Key_onesixth = 0xab6; + public static final int Key_fivesixths = 0xab7; + public static final int Key_careof = 0xab8; + public static final int Key_figdash = 0xabb; + public static final int Key_leftanglebracket = 0xabc; + public static final int Key_decimalpoint = 0xabd; + public static final int Key_rightanglebracket = 0xabe; + public static final int Key_marker = 0xabf; + public static final int Key_oneeighth = 0xac3; + public static final int Key_threeeighths = 0xac4; + public static final int Key_fiveeighths = 0xac5; + public static final int Key_seveneighths = 0xac6; + public static final int Key_trademark = 0xac9; + public static final int Key_signaturemark = 0xaca; + public static final int Key_trademarkincircle = 0xacb; + public static final int Key_leftopentriangle = 0xacc; + public static final int Key_rightopentriangle = 0xacd; + public static final int Key_emopencircle = 0xace; + public static final int Key_emopenrectangle = 0xacf; + public static final int Key_leftsinglequotemark = 0xad0; + public static final int Key_rightsinglequotemark = 0xad1; + public static final int Key_leftdoublequotemark = 0xad2; + public static final int Key_rightdoublequotemark = 0xad3; + public static final int Key_prescription = 0xad4; + public static final int Key_minutes = 0xad6; + public static final int Key_seconds = 0xad7; + public static final int Key_latincross = 0xad9; + public static final int Key_hexagram = 0xada; + public static final int Key_filledrectbullet = 0xadb; + public static final int Key_filledlefttribullet = 0xadc; + public static final int Key_filledrighttribullet = 0xadd; + public static final int Key_emfilledcircle = 0xade; + public static final int Key_emfilledrect = 0xadf; + public static final int Key_enopencircbullet = 0xae0; + public static final int Key_enopensquarebullet = 0xae1; + public static final int Key_openrectbullet = 0xae2; + public static final int Key_opentribulletup = 0xae3; + public static final int Key_opentribulletdown = 0xae4; + public static final int Key_openstar = 0xae5; + public static final int Key_enfilledcircbullet = 0xae6; + public static final int Key_enfilledsqbullet = 0xae7; + public static final int Key_filledtribulletup = 0xae8; + public static final int Key_filledtribulletdown = 0xae9; + public static final int Key_leftpointer = 0xaea; + public static final int Key_rightpointer = 0xaeb; + public static final int Key_club = 0xaec; + public static final int Key_diamond = 0xaed; + public static final int Key_heart = 0xaee; + public static final int Key_maltesecross = 0xaf0; + public static final int Key_dagger = 0xaf1; + public static final int Key_doubledagger = 0xaf2; + public static final int Key_checkmark = 0xaf3; + public static final int Key_ballotcross = 0xaf4; + public static final int Key_musicalsharp = 0xaf5; + public static final int Key_musicalflat = 0xaf6; + public static final int Key_malesymbol = 0xaf7; + public static final int Key_femalesymbol = 0xaf8; + public static final int Key_telephone = 0xaf9; + public static final int Key_telephonerecorder = 0xafa; + public static final int Key_phonographcopyright = 0xafb; + public static final int Key_caret = 0xafc; + public static final int Key_singlelowquotemark = 0xafd; + public static final int Key_doublelowquotemark = 0xafe; + public static final int Key_cursor = 0xaff; + public static final int Key_leftcaret = 0xba3; + public static final int Key_rightcaret = 0xba6; + public static final int Key_downcaret = 0xba8; + public static final int Key_upcaret = 0xba9; + public static final int Key_overbar = 0xbc0; + public static final int Key_downtack = 0xbc2; + public static final int Key_upshoe = 0xbc3; + public static final int Key_downstile = 0xbc4; + public static final int Key_underbar = 0xbc6; + public static final int Key_jot = 0xbca; + public static final int Key_quad = 0xbcc; + public static final int Key_uptack = 0xbce; + public static final int Key_circle = 0xbcf; + public static final int Key_upstile = 0xbd3; + public static final int Key_downshoe = 0xbd6; + public static final int Key_rightshoe = 0xbd8; + public static final int Key_leftshoe = 0xbda; + public static final int Key_lefttack = 0xbdc; + public static final int Key_righttack = 0xbfc; + public static final int Key_hebrew_doublelowline = 0xcdf; + public static final int Key_hebrew_aleph = 0xce0; + public static final int Key_hebrew_bet = 0xce1; + public static final int Key_hebrew_beth = 0xce1 /* deprecated */; + public static final int Key_hebrew_gimel = 0xce2; + public static final int Key_hebrew_gimmel = 0xce2 /* deprecated */; + public static final int Key_hebrew_dalet = 0xce3; + public static final int Key_hebrew_daleth = 0xce3 /* deprecated */; + public static final int Key_hebrew_he = 0xce4; + public static final int Key_hebrew_waw = 0xce5; + public static final int Key_hebrew_zain = 0xce6; + public static final int Key_hebrew_zayin = 0xce6 /* deprecated */; + public static final int Key_hebrew_chet = 0xce7; + public static final int Key_hebrew_het = 0xce7 /* deprecated */; + public static final int Key_hebrew_tet = 0xce8; + public static final int Key_hebrew_teth = 0xce8 /* deprecated */; + public static final int Key_hebrew_yod = 0xce9; + public static final int Key_hebrew_finalkaph = 0xcea; + public static final int Key_hebrew_kaph = 0xceb; + public static final int Key_hebrew_lamed = 0xcec; + public static final int Key_hebrew_finalmem = 0xced; + public static final int Key_hebrew_mem = 0xcee; + public static final int Key_hebrew_finalnun = 0xcef; + public static final int Key_hebrew_nun = 0xcf0; + public static final int Key_hebrew_samech = 0xcf1; + public static final int Key_hebrew_samekh = 0xcf1 /* deprecated */; + public static final int Key_hebrew_ayin = 0xcf2; + public static final int Key_hebrew_finalpe = 0xcf3; + public static final int Key_hebrew_pe = 0xcf4; + public static final int Key_hebrew_finalzade = 0xcf5; + public static final int Key_hebrew_finalzadi = 0xcf5 /* deprecated */; + public static final int Key_hebrew_zade = 0xcf6; + public static final int Key_hebrew_zadi = 0xcf6 /* deprecated */; + public static final int Key_hebrew_qoph = 0xcf7; + public static final int Key_hebrew_kuf = 0xcf7 /* deprecated */; + public static final int Key_hebrew_resh = 0xcf8; + public static final int Key_hebrew_shin = 0xcf9; + public static final int Key_hebrew_taw = 0xcfa; + public static final int Key_hebrew_taf = 0xcfa /* deprecated */; + public static final int Key_Hebrew_switch = 0xFF7E /* Alias for mode_switch */; + public static final int Key_Thai_kokai = 0xda1; + public static final int Key_Thai_khokhai = 0xda2; + public static final int Key_Thai_khokhuat = 0xda3; + public static final int Key_Thai_khokhwai = 0xda4; + public static final int Key_Thai_khokhon = 0xda5; + public static final int Key_Thai_khorakhang = 0xda6 ; + public static final int Key_Thai_ngongu = 0xda7 ; + public static final int Key_Thai_chochan = 0xda8 ; + public static final int Key_Thai_choching = 0xda9 ; + public static final int Key_Thai_chochang = 0xdaa ; + public static final int Key_Thai_soso = 0xdab; + public static final int Key_Thai_chochoe = 0xdac; + public static final int Key_Thai_yoying = 0xdad; + public static final int Key_Thai_dochada = 0xdae; + public static final int Key_Thai_topatak = 0xdaf; + public static final int Key_Thai_thothan = 0xdb0; + public static final int Key_Thai_thonangmontho = 0xdb1; + public static final int Key_Thai_thophuthao = 0xdb2; + public static final int Key_Thai_nonen = 0xdb3; + public static final int Key_Thai_dodek = 0xdb4; + public static final int Key_Thai_totao = 0xdb5; + public static final int Key_Thai_thothung = 0xdb6; + public static final int Key_Thai_thothahan = 0xdb7; + public static final int Key_Thai_thothong = 0xdb8; + public static final int Key_Thai_nonu = 0xdb9; + public static final int Key_Thai_bobaimai = 0xdba; + public static final int Key_Thai_popla = 0xdbb; + public static final int Key_Thai_phophung = 0xdbc; + public static final int Key_Thai_fofa = 0xdbd; + public static final int Key_Thai_phophan = 0xdbe; + public static final int Key_Thai_fofan = 0xdbf; + public static final int Key_Thai_phosamphao = 0xdc0; + public static final int Key_Thai_moma = 0xdc1; + public static final int Key_Thai_yoyak = 0xdc2; + public static final int Key_Thai_rorua = 0xdc3; + public static final int Key_Thai_ru = 0xdc4; + public static final int Key_Thai_loling = 0xdc5; + public static final int Key_Thai_lu = 0xdc6; + public static final int Key_Thai_wowaen = 0xdc7; + public static final int Key_Thai_sosala = 0xdc8; + public static final int Key_Thai_sorusi = 0xdc9; + public static final int Key_Thai_sosua = 0xdca; + public static final int Key_Thai_hohip = 0xdcb; + public static final int Key_Thai_lochula = 0xdcc; + public static final int Key_Thai_oang = 0xdcd; + public static final int Key_Thai_honokhuk = 0xdce; + public static final int Key_Thai_paiyannoi = 0xdcf; + public static final int Key_Thai_saraa = 0xdd0; + public static final int Key_Thai_maihanakat = 0xdd1; + public static final int Key_Thai_saraaa = 0xdd2; + public static final int Key_Thai_saraam = 0xdd3; + public static final int Key_Thai_sarai = 0xdd4 ; + public static final int Key_Thai_saraii = 0xdd5 ; + public static final int Key_Thai_saraue = 0xdd6 ; + public static final int Key_Thai_sarauee = 0xdd7 ; + public static final int Key_Thai_sarau = 0xdd8 ; + public static final int Key_Thai_sarauu = 0xdd9 ; + public static final int Key_Thai_phinthu = 0xdda; + public static final int Key_Thai_maihanakat_maitho = 0xdde; + public static final int Key_Thai_baht = 0xddf; + public static final int Key_Thai_sarae = 0xde0 ; + public static final int Key_Thai_saraae = 0xde1; + public static final int Key_Thai_sarao = 0xde2; + public static final int Key_Thai_saraaimaimuan = 0xde3 ; + public static final int Key_Thai_saraaimaimalai = 0xde4 ; + public static final int Key_Thai_lakkhangyao = 0xde5; + public static final int Key_Thai_maiyamok = 0xde6; + public static final int Key_Thai_maitaikhu = 0xde7; + public static final int Key_Thai_maiek = 0xde8 ; + public static final int Key_Thai_maitho = 0xde9; + public static final int Key_Thai_maitri = 0xdea; + public static final int Key_Thai_maichattawa = 0xdeb; + public static final int Key_Thai_thanthakhat = 0xdec; + public static final int Key_Thai_nikhahit = 0xded; + public static final int Key_Thai_leksun = 0xdf0 ; + public static final int Key_Thai_leknung = 0xdf1 ; + public static final int Key_Thai_leksong = 0xdf2 ; + public static final int Key_Thai_leksam = 0xdf3; + public static final int Key_Thai_leksi = 0xdf4 ; + public static final int Key_Thai_lekha = 0xdf5 ; + public static final int Key_Thai_lekhok = 0xdf6 ; + public static final int Key_Thai_lekchet = 0xdf7 ; + public static final int Key_Thai_lekpaet = 0xdf8 ; + public static final int Key_Thai_lekkao = 0xdf9 ; + public static final int Key_Hangul = 0xff31 /* Hangul start/stop(toggle) */; + public static final int Key_Hangul_Start = 0xff32 /* Hangul start */; + public static final int Key_Hangul_End = 0xff33 /* Hangul end, English start */; + public static final int Key_Hangul_Hanja = 0xff34 /* Start Hangul->Hanja Conversion */; + public static final int Key_Hangul_Jamo = 0xff35 /* Hangul Jamo mode */; + public static final int Key_Hangul_Romaja = 0xff36 /* Hangul Romaja mode */; + public static final int Key_Hangul_Codeinput = 0xff37 /* Hangul code input mode */; + public static final int Key_Hangul_Jeonja = 0xff38 /* Jeonja mode */; + public static final int Key_Hangul_Banja = 0xff39 /* Banja mode */; + public static final int Key_Hangul_PreHanja = 0xff3a /* Pre Hanja conversion */; + public static final int Key_Hangul_PostHanja = 0xff3b /* Post Hanja conversion */; + public static final int Key_Hangul_SingleCandidate = 0xff3c /* Single candidate */; + public static final int Key_Hangul_MultipleCandidate = 0xff3d /* Multiple candidate */; + public static final int Key_Hangul_PreviousCandidate = 0xff3e /* Previous candidate */; + public static final int Key_Hangul_Special = 0xff3f /* Special symbols */; + public static final int Key_Hangul_switch = 0xFF7E /* Alias for mode_switch */; + public static final int Key_Hangul_Kiyeog = 0xea1; + public static final int Key_Hangul_SsangKiyeog = 0xea2; + public static final int Key_Hangul_KiyeogSios = 0xea3; + public static final int Key_Hangul_Nieun = 0xea4; + public static final int Key_Hangul_NieunJieuj = 0xea5; + public static final int Key_Hangul_NieunHieuh = 0xea6; + public static final int Key_Hangul_Dikeud = 0xea7; + public static final int Key_Hangul_SsangDikeud = 0xea8; + public static final int Key_Hangul_Rieul = 0xea9; + public static final int Key_Hangul_RieulKiyeog = 0xeaa; + public static final int Key_Hangul_RieulMieum = 0xeab; + public static final int Key_Hangul_RieulPieub = 0xeac; + public static final int Key_Hangul_RieulSios = 0xead; + public static final int Key_Hangul_RieulTieut = 0xeae; + public static final int Key_Hangul_RieulPhieuf = 0xeaf; + public static final int Key_Hangul_RieulHieuh = 0xeb0; + public static final int Key_Hangul_Mieum = 0xeb1; + public static final int Key_Hangul_Pieub = 0xeb2; + public static final int Key_Hangul_SsangPieub = 0xeb3; + public static final int Key_Hangul_PieubSios = 0xeb4; + public static final int Key_Hangul_Sios = 0xeb5; + public static final int Key_Hangul_SsangSios = 0xeb6; + public static final int Key_Hangul_Ieung = 0xeb7; + public static final int Key_Hangul_Jieuj = 0xeb8; + public static final int Key_Hangul_SsangJieuj = 0xeb9; + public static final int Key_Hangul_Cieuc = 0xeba; + public static final int Key_Hangul_Khieuq = 0xebb; + public static final int Key_Hangul_Tieut = 0xebc; + public static final int Key_Hangul_Phieuf = 0xebd; + public static final int Key_Hangul_Hieuh = 0xebe; + public static final int Key_Hangul_A = 0xebf; + public static final int Key_Hangul_AE = 0xec0; + public static final int Key_Hangul_YA = 0xec1; + public static final int Key_Hangul_YAE = 0xec2; + public static final int Key_Hangul_EO = 0xec3; + public static final int Key_Hangul_E = 0xec4; + public static final int Key_Hangul_YEO = 0xec5; + public static final int Key_Hangul_YE = 0xec6; + public static final int Key_Hangul_O = 0xec7; + public static final int Key_Hangul_WA = 0xec8; + public static final int Key_Hangul_WAE = 0xec9; + public static final int Key_Hangul_OE = 0xeca; + public static final int Key_Hangul_YO = 0xecb; + public static final int Key_Hangul_U = 0xecc; + public static final int Key_Hangul_WEO = 0xecd; + public static final int Key_Hangul_WE = 0xece; + public static final int Key_Hangul_WI = 0xecf; + public static final int Key_Hangul_YU = 0xed0; + public static final int Key_Hangul_EU = 0xed1; + public static final int Key_Hangul_YI = 0xed2; + public static final int Key_Hangul_I = 0xed3; + public static final int Key_Hangul_J_Kiyeog = 0xed4; + public static final int Key_Hangul_J_SsangKiyeog = 0xed5; + public static final int Key_Hangul_J_KiyeogSios = 0xed6; + public static final int Key_Hangul_J_Nieun = 0xed7; + public static final int Key_Hangul_J_NieunJieuj = 0xed8; + public static final int Key_Hangul_J_NieunHieuh = 0xed9; + public static final int Key_Hangul_J_Dikeud = 0xeda; + public static final int Key_Hangul_J_Rieul = 0xedb; + public static final int Key_Hangul_J_RieulKiyeog = 0xedc; + public static final int Key_Hangul_J_RieulMieum = 0xedd; + public static final int Key_Hangul_J_RieulPieub = 0xede; + public static final int Key_Hangul_J_RieulSios = 0xedf; + public static final int Key_Hangul_J_RieulTieut = 0xee0; + public static final int Key_Hangul_J_RieulPhieuf = 0xee1; + public static final int Key_Hangul_J_RieulHieuh = 0xee2; + public static final int Key_Hangul_J_Mieum = 0xee3; + public static final int Key_Hangul_J_Pieub = 0xee4; + public static final int Key_Hangul_J_PieubSios = 0xee5; + public static final int Key_Hangul_J_Sios = 0xee6; + public static final int Key_Hangul_J_SsangSios = 0xee7; + public static final int Key_Hangul_J_Ieung = 0xee8; + public static final int Key_Hangul_J_Jieuj = 0xee9; + public static final int Key_Hangul_J_Cieuc = 0xeea; + public static final int Key_Hangul_J_Khieuq = 0xeeb; + public static final int Key_Hangul_J_Tieut = 0xeec; + public static final int Key_Hangul_J_Phieuf = 0xeed; + public static final int Key_Hangul_J_Hieuh = 0xeee; + public static final int Key_Hangul_RieulYeorinHieuh = 0xeef; + public static final int Key_Hangul_SunkyeongeumMieum = 0xef0; + public static final int Key_Hangul_SunkyeongeumPieub = 0xef1; + public static final int Key_Hangul_PanSios = 0xef2; + public static final int Key_Hangul_KkogjiDalrinIeung = 0xef3; + public static final int Key_Hangul_SunkyeongeumPhieuf = 0xef4; + public static final int Key_Hangul_YeorinHieuh = 0xef5; + public static final int Key_Hangul_AraeA = 0xef6; + public static final int Key_Hangul_AraeAE = 0xef7; + public static final int Key_Hangul_J_PanSios = 0xef8; + public static final int Key_Hangul_J_KkogjiDalrinIeung = 0xef9; + public static final int Key_Hangul_J_YeorinHieuh = 0xefa; + public static final int Key_Korean_Won = 0xeff; + public static final int Key_EuroSign = 0x20ac; +} diff --git a/app/src/main/java/com/javispedro/vndroid/keymaps/SpanishKeyHandler.java b/app/src/main/java/com/javispedro/vndroid/keymaps/SpanishKeyHandler.java new file mode 100644 index 0000000..4337b61 --- /dev/null +++ b/app/src/main/java/com/javispedro/vndroid/keymaps/SpanishKeyHandler.java @@ -0,0 +1,51 @@ +package com.javispedro.vndroid.keymaps; + +import java.text.Normalizer; + +import static com.javispedro.vndroid.keymaps.KeySyms.Key_dead_acute; +import static com.javispedro.vndroid.keymaps.KeySyms.Key_dead_grave; + +public class SpanishKeyHandler extends KeyHandler { + + private char deadKey = 0; + + @Override + public boolean keyDown(int key) { + if (key >= KeySyms.Key_space && key <= KeySyms.Key_z) { + // Printable keysyms + char c = (char) (' ' + (key - KeySyms.Key_space)); + if (deadKey != 0) { + StringBuilder builder = new StringBuilder(2); + builder.append(c); + builder.append(deadKey); + String text = Normalizer.normalize(builder.toString(), Normalizer.Form.NFKC); + action.postText(text); + deadKey = 0; + return true; + } + action.postChar(c); + return true; + } else { + switch (key) { + case KeySyms.Key_ccedilla: + action.postChar('ç'); + return true; + case KeySyms.Key_ntilde: + action.postChar('ñ'); + return true; + case Key_dead_acute: + deadKey = '\u0301'; + return true; + case Key_dead_grave: + deadKey = '\u0300'; + return true; + } + } + return false; + } + + @Override + public boolean keyUp(int key) { + return false; + } +} |