From 458acd617b093dc2859d88631182e88ff43462cc Mon Sep 17 00:00:00 2001 From: Twaik Yont Date: Wed, 10 Jul 2019 07:45:24 +0300 Subject: [PATCH] Some fixes, Additional keyboard and small improvements Fixed: app restart after physical keyboard connected Fixed: some eventCodes from physical keyboard were processed wrong --- ...id_gradle_build_lorie_arm64-v8a.stderr.txt | 4 + ...id_gradle_build_lorie_arm64-v8a.stdout.txt | 33 +--- ..._gradle_build_lorie_armeabi-v7a.stderr.txt | 4 - ..._gradle_build_lorie_armeabi-v7a.stdout.txt | 3 +- ...droid_gradle_build_lorie_x86_64.stderr.txt | 4 + ...droid_gradle_build_lorie_x86_64.stdout.txt | 33 +--- app/.gitignore | 1 + app/app.iml | 13 +- app/src/main/AndroidManifest.xml | 2 +- .../wtermux/AdditionalKeyboardView.java | 173 ++++++++++++++++++ .../java/com/termux/wtermux/LorieService.java | 119 +++++++++--- .../java/com/termux/wtermux/MainActivity.java | 55 +----- .../java/com/termux/wtermux/jniLoader.java | 12 -- app/src/main/jni/lorie/backend-android.c | 15 +- app/src/main/jni/lorie/backend.h | 2 +- app/src/main/jni/lorie/locale/android-utils.c | 6 +- app/src/main/jni/lorie/main.c | 7 +- app/src/main/res/layout/activity_main.xml | 24 ++- 18 files changed, 326 insertions(+), 184 deletions(-) create mode 100644 app/src/main/java/com/termux/wtermux/AdditionalKeyboardView.java delete mode 100644 app/src/main/java/com/termux/wtermux/jniLoader.java diff --git a/app/.externalNativeBuild/ndkBuild/debug/arm64-v8a/android_gradle_build_lorie_arm64-v8a.stderr.txt b/app/.externalNativeBuild/ndkBuild/debug/arm64-v8a/android_gradle_build_lorie_arm64-v8a.stderr.txt index e69de29..acf16d0 100644 --- a/app/.externalNativeBuild/ndkBuild/debug/arm64-v8a/android_gradle_build_lorie_arm64-v8a.stderr.txt +++ b/app/.externalNativeBuild/ndkBuild/debug/arm64-v8a/android_gradle_build_lorie_arm64-v8a.stderr.txt @@ -0,0 +1,4 @@ +/home/twaik/WTermux/app/src/main/jni/lorie/backend-android.c:257:33: warning: result of comparison against a string literal is unspecified (use strncmp instead) [-Wstring-compare] + if (backend->xkb_names.layout != "us") { + ^ ~~~~ +1 warning generated. diff --git a/app/.externalNativeBuild/ndkBuild/debug/arm64-v8a/android_gradle_build_lorie_arm64-v8a.stdout.txt b/app/.externalNativeBuild/ndkBuild/debug/arm64-v8a/android_gradle_build_lorie_arm64-v8a.stdout.txt index fb8f648..2108cf1 100644 --- a/app/.externalNativeBuild/ndkBuild/debug/arm64-v8a/android_gradle_build_lorie_arm64-v8a.stdout.txt +++ b/app/.externalNativeBuild/ndkBuild/debug/arm64-v8a/android_gradle_build_lorie_arm64-v8a.stdout.txt @@ -3,38 +3,7 @@ Android NDK: This is likely to result in incorrect builds. Try using LOCAL_S Android NDK: or LOCAL_SHARED_LIBRARIES instead to list the library dependencies of the Android NDK: current module [arm64-v8a] Compile : lorie <= main.c +[arm64-v8a] Compile : lorie <= android-utils.c [arm64-v8a] Compile : lorie <= backend-android.c [arm64-v8a] Compile : lorie <= renderer.c -[arm64-v8a] Compile : xkbcommon <= parser.c -[arm64-v8a] Compile : xkbcommon <= paths.c -[arm64-v8a] Compile : xkbcommon <= state.c -[arm64-v8a] Compile : xkbcommon <= table.c -[arm64-v8a] Compile : xkbcommon <= action.c -[arm64-v8a] Compile : xkbcommon <= ast-build.c -[arm64-v8a] Compile : xkbcommon <= compat.c -[arm64-v8a] Compile : xkbcommon <= expr.c -[arm64-v8a] Compile : xkbcommon <= include.c -[arm64-v8a] Compile : xkbcommon <= keycodes.c -[arm64-v8a] Compile : xkbcommon <= keymap.c -[arm64-v8a] Compile : xkbcommon <= keymap-dump.c -[arm64-v8a] Compile : xkbcommon <= keywords.c -[arm64-v8a] Compile : xkbcommon <= parser.c -[arm64-v8a] Compile : xkbcommon <= rules.c -[arm64-v8a] Compile : xkbcommon <= scanner.c -[arm64-v8a] Compile : xkbcommon <= symbols.c -[arm64-v8a] Compile : xkbcommon <= types.c -[arm64-v8a] Compile : xkbcommon <= vmod.c -[arm64-v8a] Compile : xkbcommon <= xkbcomp.c -[arm64-v8a] Compile : xkbcommon <= atom.c -[arm64-v8a] Compile : xkbcommon <= context.c -[arm64-v8a] Compile : xkbcommon <= context-priv.c -[arm64-v8a] Compile : xkbcommon <= keysym.c -[arm64-v8a] Compile : xkbcommon <= keysym-utf.c -[arm64-v8a] Compile : xkbcommon <= keymap.c -[arm64-v8a] Compile : xkbcommon <= keymap-priv.c -[arm64-v8a] Compile : xkbcommon <= state.c -[arm64-v8a] Compile : xkbcommon <= text.c -[arm64-v8a] Compile : xkbcommon <= utf8.c -[arm64-v8a] Compile : xkbcommon <= utils.c -[arm64-v8a] SharedLibrary : libxkbcommon.so [arm64-v8a] SharedLibrary : liblorie.so diff --git a/app/.externalNativeBuild/ndkBuild/debug/armeabi-v7a/android_gradle_build_lorie_armeabi-v7a.stderr.txt b/app/.externalNativeBuild/ndkBuild/debug/armeabi-v7a/android_gradle_build_lorie_armeabi-v7a.stderr.txt index acf16d0..e69de29 100644 --- a/app/.externalNativeBuild/ndkBuild/debug/armeabi-v7a/android_gradle_build_lorie_armeabi-v7a.stderr.txt +++ b/app/.externalNativeBuild/ndkBuild/debug/armeabi-v7a/android_gradle_build_lorie_armeabi-v7a.stderr.txt @@ -1,4 +0,0 @@ -/home/twaik/WTermux/app/src/main/jni/lorie/backend-android.c:257:33: warning: result of comparison against a string literal is unspecified (use strncmp instead) [-Wstring-compare] - if (backend->xkb_names.layout != "us") { - ^ ~~~~ -1 warning generated. diff --git a/app/.externalNativeBuild/ndkBuild/debug/armeabi-v7a/android_gradle_build_lorie_armeabi-v7a.stdout.txt b/app/.externalNativeBuild/ndkBuild/debug/armeabi-v7a/android_gradle_build_lorie_armeabi-v7a.stdout.txt index 5dc85d0..4a14818 100644 --- a/app/.externalNativeBuild/ndkBuild/debug/armeabi-v7a/android_gradle_build_lorie_armeabi-v7a.stdout.txt +++ b/app/.externalNativeBuild/ndkBuild/debug/armeabi-v7a/android_gradle_build_lorie_armeabi-v7a.stdout.txt @@ -2,5 +2,4 @@ Android NDK: WARNING:/home/twaik/WTermux/app/src/main/jni/lorie/Android.mk:lorie Android NDK: This is likely to result in incorrect builds. Try using LOCAL_STATIC_LIBRARIES Android NDK: or LOCAL_SHARED_LIBRARIES instead to list the library dependencies of the Android NDK: current module -[armeabi-v7a] Compile thumb : lorie <= backend-android.c -[armeabi-v7a] SharedLibrary : liblorie.so +make: `/home/twaik/WTermux/app/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a/liblorie.so' is up to date. diff --git a/app/.externalNativeBuild/ndkBuild/debug/x86_64/android_gradle_build_lorie_x86_64.stderr.txt b/app/.externalNativeBuild/ndkBuild/debug/x86_64/android_gradle_build_lorie_x86_64.stderr.txt index e69de29..acf16d0 100644 --- a/app/.externalNativeBuild/ndkBuild/debug/x86_64/android_gradle_build_lorie_x86_64.stderr.txt +++ b/app/.externalNativeBuild/ndkBuild/debug/x86_64/android_gradle_build_lorie_x86_64.stderr.txt @@ -0,0 +1,4 @@ +/home/twaik/WTermux/app/src/main/jni/lorie/backend-android.c:257:33: warning: result of comparison against a string literal is unspecified (use strncmp instead) [-Wstring-compare] + if (backend->xkb_names.layout != "us") { + ^ ~~~~ +1 warning generated. diff --git a/app/.externalNativeBuild/ndkBuild/debug/x86_64/android_gradle_build_lorie_x86_64.stdout.txt b/app/.externalNativeBuild/ndkBuild/debug/x86_64/android_gradle_build_lorie_x86_64.stdout.txt index 3bc5e7e..017b344 100644 --- a/app/.externalNativeBuild/ndkBuild/debug/x86_64/android_gradle_build_lorie_x86_64.stdout.txt +++ b/app/.externalNativeBuild/ndkBuild/debug/x86_64/android_gradle_build_lorie_x86_64.stdout.txt @@ -3,38 +3,7 @@ Android NDK: This is likely to result in incorrect builds. Try using LOCAL_S Android NDK: or LOCAL_SHARED_LIBRARIES instead to list the library dependencies of the Android NDK: current module [x86_64] Compile : lorie <= main.c +[x86_64] Compile : lorie <= android-utils.c [x86_64] Compile : lorie <= backend-android.c [x86_64] Compile : lorie <= renderer.c -[x86_64] Compile : xkbcommon <= parser.c -[x86_64] Compile : xkbcommon <= paths.c -[x86_64] Compile : xkbcommon <= state.c -[x86_64] Compile : xkbcommon <= table.c -[x86_64] Compile : xkbcommon <= action.c -[x86_64] Compile : xkbcommon <= ast-build.c -[x86_64] Compile : xkbcommon <= compat.c -[x86_64] Compile : xkbcommon <= expr.c -[x86_64] Compile : xkbcommon <= include.c -[x86_64] Compile : xkbcommon <= keycodes.c -[x86_64] Compile : xkbcommon <= keymap.c -[x86_64] Compile : xkbcommon <= keymap-dump.c -[x86_64] Compile : xkbcommon <= keywords.c -[x86_64] Compile : xkbcommon <= parser.c -[x86_64] Compile : xkbcommon <= rules.c -[x86_64] Compile : xkbcommon <= scanner.c -[x86_64] Compile : xkbcommon <= symbols.c -[x86_64] Compile : xkbcommon <= types.c -[x86_64] Compile : xkbcommon <= vmod.c -[x86_64] Compile : xkbcommon <= xkbcomp.c -[x86_64] Compile : xkbcommon <= atom.c -[x86_64] Compile : xkbcommon <= context.c -[x86_64] Compile : xkbcommon <= context-priv.c -[x86_64] Compile : xkbcommon <= keysym.c -[x86_64] Compile : xkbcommon <= keysym-utf.c -[x86_64] Compile : xkbcommon <= keymap.c -[x86_64] Compile : xkbcommon <= keymap-priv.c -[x86_64] Compile : xkbcommon <= state.c -[x86_64] Compile : xkbcommon <= text.c -[x86_64] Compile : xkbcommon <= utf8.c -[x86_64] Compile : xkbcommon <= utils.c -[x86_64] SharedLibrary : libxkbcommon.so [x86_64] SharedLibrary : liblorie.so diff --git a/app/.gitignore b/app/.gitignore index 796b96d..0886f94 100644 --- a/app/.gitignore +++ b/app/.gitignore @@ -1 +1,2 @@ /build +/.externalNativeBuild diff --git a/app/app.iml b/app/app.iml index 9d048c6..47788af 100644 --- a/app/app.iml +++ b/app/app.iml @@ -33,11 +33,6 @@ - - - - - @@ -56,7 +51,6 @@ - @@ -64,7 +58,6 @@ - @@ -72,7 +65,6 @@ - @@ -80,7 +72,6 @@ - @@ -88,7 +79,6 @@ - @@ -96,10 +86,9 @@ - - + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d567a89..25c7d2d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -17,7 +17,7 @@ tools:ignore="GoogleAppIndexingWarning"> + android:configChanges="fontScale|orientation|screenSize|keyboard|keyboardHidden|layoutDirection|locale|mcc|mnc|navigation|screenLayout|touchscreen|uiMode|smallestScreenSize|density"> diff --git a/app/src/main/java/com/termux/wtermux/AdditionalKeyboardView.java b/app/src/main/java/com/termux/wtermux/AdditionalKeyboardView.java new file mode 100644 index 0000000..ddde934 --- /dev/null +++ b/app/src/main/java/com/termux/wtermux/AdditionalKeyboardView.java @@ -0,0 +1,173 @@ +package com.termux.wtermux; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.Rect; +import android.support.v7.widget.AppCompatTextView; +import android.util.AttributeSet; +import android.util.Log; +import android.view.Gravity; +import android.view.KeyEvent; +import android.view.MotionEvent; +import android.view.View; +import android.widget.HorizontalScrollView; +import android.widget.LinearLayout; + +import java.util.HashMap; +import java.util.Map; + +@SuppressWarnings("unused") +public class AdditionalKeyboardView extends HorizontalScrollView { + Context ctx; + View targetView = null; + View.OnKeyListener targetListener = null; + int density; + LinearLayout root; + public AdditionalKeyboardView(Context context) { + super(context); + init(context); + } + public AdditionalKeyboardView(Context context, AttributeSet attrs) { + super(context, attrs); + init(context); + } + + @SuppressLint("SetTextI18n") + private void init(Context context) { + ctx = context; + density = (int) context.getResources().getDisplayMetrics().density; + + //setFillViewport(true); + LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT); + root = new LinearLayout(context); + root.setLayoutParams(lp); + root.setOrientation(LinearLayout.HORIZONTAL); + addView(root); + } + + public void reload(int[] keys, View TargetView, View.OnKeyListener TargetListener) { + targetView = TargetView; + targetListener = TargetListener; + root.removeAllViews(); + LayoutParams lp = new LayoutParams(60 * density,LayoutParams.MATCH_PARENT); + lp.setMargins(density*3, 0, density*3, 0); + for (int keyCode : keys) { + if (keyCode != KeyEvent.KEYCODE_UNKNOWN) { + Key key = new Key(ctx, keyCode); + root.addView(key, lp); + } + } + } + + private class Key extends AppCompatTextView implements View.OnClickListener, View.OnTouchListener { + private static final int TEXT_COLOR = 0xFFFFFFFF; + private static final int BUTTON_COLOR = 0x0000FFFF; + private static final int INTERESTING_COLOR = 0xFF80DEEA; + private static final int BUTTON_PRESSED_COLOR = 0x7FFFFFFF; + /** + * Keys are displayed in a natural looking way, like "▶" for "RIGHT" + */ + final Map keyCodesForString = new HashMap() {{ + put(KeyEvent.KEYCODE_ESCAPE, "ESC"); + put(KeyEvent.KEYCODE_MOVE_HOME, "HOME"); + put(KeyEvent.KEYCODE_MOVE_END, "END"); + put(KeyEvent.KEYCODE_PAGE_UP, "PGUP"); + put(KeyEvent.KEYCODE_PAGE_DOWN, "PGDN"); + put(KeyEvent.KEYCODE_CTRL_LEFT, "CTRL"); + put(KeyEvent.KEYCODE_ALT_LEFT, "ALT"); + put(KeyEvent.KEYCODE_INSERT, "INS"); + put(KeyEvent.KEYCODE_FORWARD_DEL, "⌦"); // U+2326 ⌦ ERASE TO THE RIGHT not well known but easy to understand + put(KeyEvent.KEYCODE_DEL, "⌫"); // U+232B ⌫ ERASE TO THE LEFT sometimes seen and easy to understand + put(KeyEvent.KEYCODE_DPAD_UP, "▲"); // U+25B2 ▲ BLACK UP-POINTING TRIANGLE + put(KeyEvent.KEYCODE_DPAD_LEFT, "◀"); // U+25C0 ◀ BLACK LEFT-POINTING TRIANGLE + put(KeyEvent.KEYCODE_DPAD_RIGHT, "▶"); // U+25B6 ▶ BLACK RIGHT-POINTING TRIANGLE + put(KeyEvent.KEYCODE_DPAD_DOWN, "▼"); // U+25BC ▼ BLACK DOWN-POINTING TRIANGLE + put(KeyEvent.KEYCODE_ENTER, "↲"); // U+21B2 ↲ DOWNWARDS ARROW WITH TIP LEFTWARDS + put(KeyEvent.KEYCODE_TAB, "↹"); // U+21B9 ↹ LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR + put(KeyEvent.KEYCODE_MINUS, "―"); // U+2015 ― HORIZONTAL BAR + }}; + + void sendKey(int keyCode, boolean down) { + if (targetListener == null || targetView == null) { + Log.e("AdditionalKeyboardView", "target view or target listener is unset"); + return; + } + + targetListener.onKey(targetView, keyCode, new KeyEvent((down?KeyEvent.ACTION_DOWN:KeyEvent.ACTION_UP), keyCode)); + } + + boolean toggle; + boolean checked = false; + int kc; + public Key(Context context, int keyCode) { + super(context); + kc = keyCode; + switch (keyCode) { + case KeyEvent.KEYCODE_CTRL_LEFT: + case KeyEvent.KEYCODE_CTRL_RIGHT: + case KeyEvent.KEYCODE_ALT_LEFT: + case KeyEvent.KEYCODE_ALT_RIGHT: + case KeyEvent.KEYCODE_SHIFT_LEFT: + case KeyEvent.KEYCODE_SHIFT_RIGHT: + toggle = true; + break; + default: + toggle = false; + } + + setMinEms(4); + setPadding(10*density, 0, 10*density, 0); + setGravity(Gravity.CENTER); + + setTextColor(TEXT_COLOR); + setBackgroundColor(BUTTON_COLOR); + String text = keyCodesForString.get(keyCode); + setText(text); + setOnClickListener(this); + setOnTouchListener(this); + } + + @Override + public void onClick(View v) { + if (toggle) { + checked = !checked; + if (checked) { + setTextColor(INTERESTING_COLOR); + setBackgroundColor(BUTTON_PRESSED_COLOR); + sendKey(kc, true); + } else { + setTextColor(TEXT_COLOR); + setBackgroundColor(BUTTON_COLOR); + sendKey(kc, false); + } + } + } + + private Rect rect; + @Override + public boolean onTouch(View v, MotionEvent e) { + switch(e.getAction()) { + case MotionEvent.ACTION_BUTTON_PRESS: + case MotionEvent.ACTION_POINTER_DOWN: + case MotionEvent.ACTION_DOWN: + setTextColor(INTERESTING_COLOR); + setBackgroundColor(BUTTON_PRESSED_COLOR); + if (!toggle) sendKey(kc, true); + break; + case MotionEvent.ACTION_CANCEL: + case MotionEvent.ACTION_BUTTON_RELEASE: + case MotionEvent.ACTION_POINTER_UP: + case MotionEvent.ACTION_UP: + if (!toggle) { + setTextColor(TEXT_COLOR); + setBackgroundColor(BUTTON_COLOR); + sendKey(kc, false); + } + break; + default: + break; + } + return false; + } + } +} diff --git a/app/src/main/java/com/termux/wtermux/LorieService.java b/app/src/main/java/com/termux/wtermux/LorieService.java index 2f05633..474d864 100644 --- a/app/src/main/java/com/termux/wtermux/LorieService.java +++ b/app/src/main/java/com/termux/wtermux/LorieService.java @@ -1,7 +1,9 @@ package com.termux.wtermux; import android.annotation.SuppressLint; -import android.content.Context; +import android.app.Activity; +import android.content.res.Configuration; +import android.util.DisplayMetrics; import android.util.Log; import android.view.KeyEvent; import android.view.MotionEvent; @@ -9,12 +11,14 @@ import android.view.Surface; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; -import android.view.inputmethod.InputMethodManager; -import android.view.inputmethod.InputMethodSubtype; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.widget.FrameLayout; +import android.widget.RelativeLayout; +import android.widget.ScrollView; -import java.util.Locale; - -public class LorieService implements SurfaceHolder.Callback, View.OnTouchListener, View.OnKeyListener { +public class LorieService extends FrameLayout implements SurfaceHolder.Callback, View.OnTouchListener, View.OnKeyListener, KeyboardUtils.SoftKeyboardToggleListener { + private final static int SV2_ID = 0xACCEDED; private static final int BTN_LEFT = 0x110; private static final int BTN_MIDDLE = 0x110; private static final int BTN_RIGHT = 0x110; @@ -23,28 +27,68 @@ public class LorieService implements SurfaceHolder.Callback, View.OnTouchListene private static final int WL_STATE_RELEASED = 0; private static final int WL_POINTER_MOTION = 2; + private static int[] keys = { + KeyEvent.KEYCODE_ESCAPE, + KeyEvent.KEYCODE_TAB, + KeyEvent.KEYCODE_CTRL_LEFT, + KeyEvent.KEYCODE_ALT_LEFT, + KeyEvent.KEYCODE_DPAD_UP, + KeyEvent.KEYCODE_DPAD_DOWN, + KeyEvent.KEYCODE_DPAD_LEFT, + KeyEvent.KEYCODE_DPAD_RIGHT, + }; //private static final int WL_POINTER_BUTTON = 3; - private InputMethodManager imm; private long compositor; - Context ctx; - LorieService(Context context) { - imm = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE); - ctx = context; + private Activity act; + private AdditionalKeyboardView kbd; + @SuppressLint("ClickableViewAccessibility") + LorieService(Activity activity) { + super(activity); + act = activity; compositor = createLorieThread(); if (compositor == 0) { - Log.e("WestonService", "compositor thread was not created"); + Log.e("LorieService", "compositor thread was not created"); + return; } + + int dp = (int) act.getResources().getDisplayMetrics().density; + ViewGroup.LayoutParams match_parent = new WindowManager.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); + setLayoutParams(match_parent); + + SurfaceView lorieView = new SurfaceView(act); + addView(lorieView, match_parent); + + RelativeLayout rl = new RelativeLayout(act); + ScrollView sv = new ScrollView(act); + kbd = new AdditionalKeyboardView(act); + RelativeLayout.LayoutParams svlp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT); + RelativeLayout.LayoutParams kbdlp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, 50*dp); + + svlp.addRule(RelativeLayout.BELOW, SV2_ID); + kbdlp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); + kbd.setId(SV2_ID); + rl.addView(kbd, kbdlp); + rl.addView(sv, svlp); + addView(rl); + + kbd.setVisibility(View.INVISIBLE); + + lorieView.getHolder().addCallback(this); + lorieView.setOnTouchListener(this); + lorieView.setOnKeyListener(this); + + lorieView.setFocusable(true); + lorieView.setFocusableInTouchMode(true); + lorieView.requestFocus(); + + kbd.reload(keys, lorieView, this); + + // prevents SurfaceView from being resized but interrupts additional keyboard showing process + // act.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN); } - @SuppressLint("ClickableViewAccessibility") - void connectSurfaceView(SurfaceView surface) { - surface.getHolder().addCallback(this); - surface.setOnTouchListener(this); - surface.setOnKeyListener(this); - - surface.setFocusable(true); - surface.setFocusableInTouchMode(true); - surface.requestFocus(); + void finishInit() { + KeyboardUtils.addKeyboardToggleListener(act, this); } @Override @@ -54,7 +98,22 @@ public class LorieService implements SurfaceHolder.Callback, View.OnTouchListene @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { - windowChanged(compositor, holder.getSurface(), width, height); + DisplayMetrics dm = new DisplayMetrics(); + int mmWidth, mmHeight; + act.getWindowManager().getDefaultDisplay().getMetrics(dm); + + if (act.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { + mmWidth = (int) Math.round((width * 25.4) / dm.xdpi); + mmHeight = (int) Math.round((height * 25.4) / dm.ydpi); + } else { + mmWidth = (int) Math.round((width * 25.4) / dm.ydpi); + mmHeight = (int) Math.round((height * 25.4) / dm.xdpi); + } + + + Log.e("debug","mmWidth: " + mmWidth + "; mmHeight: " + mmHeight + "; xdpi: " + dm.xdpi + "; ydpi: " + dm.ydpi); + + windowChanged(compositor, holder.getSurface(), width, height, mmWidth, mmHeight); } @Override @@ -106,15 +165,25 @@ public class LorieService implements SurfaceHolder.Callback, View.OnTouchListene @Override public boolean onKey(View v, int keyCode, KeyEvent e) { int action = 0; - int shift = e.isShiftPressed() ? 1 : 0; + + if (e.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) { + KeyboardUtils.toggleKeyboardVisibility(act); + } + if (e.getAction() == KeyEvent.ACTION_DOWN) action = WL_STATE_PRESSED; if (e.getAction() == KeyEvent.ACTION_UP) action = WL_STATE_RELEASED; - onKey(compositor, action, keyCode, shift, e.getCharacters()); + onKey(compositor, action, keyCode, e.isShiftPressed() ? 1 : 0, e.getCharacters()); return false; } + @Override + public void onToggleSoftKeyboard(boolean isVisible) { + kbd.setVisibility((isVisible)?View.VISIBLE:View.INVISIBLE); + Log.d("LorieActivity", "keyboard is " + (isVisible?"visible":"not visible")); + } + private native long createLorieThread(); - private native void windowChanged(long compositor, Surface surface, int width, int height); + private native void windowChanged(long compositor, Surface surface, int width, int height, int mmWidth, int mmHeight); private native void onTouch(long compositor, int type, int button, int x, int y); private native void onKey(long compositor, int type, int key, int shift, String characters); diff --git a/app/src/main/java/com/termux/wtermux/MainActivity.java b/app/src/main/java/com/termux/wtermux/MainActivity.java index 495a445..b1fe107 100644 --- a/app/src/main/java/com/termux/wtermux/MainActivity.java +++ b/app/src/main/java/com/termux/wtermux/MainActivity.java @@ -1,65 +1,22 @@ package com.termux.wtermux; -import android.content.Context; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; -import android.util.Log; -import android.view.KeyEvent; -import android.view.SurfaceView; import android.view.WindowManager; -import android.view.inputmethod.InputMethodManager; -public class MainActivity extends AppCompatActivity implements KeyboardUtils.SoftKeyboardToggleListener { - - LorieService weston; - boolean kbdVisible = false; - InputMethodManager imm; - SurfaceView root; +public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - //jniLoader.loadLibrary("wayland-server"); - setContentView(R.layout.activity_main); + getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); - root = findViewById(R.id.WestonView); - weston = new LorieService(this); - weston.connectSurfaceView(root); - KeyboardUtils.addKeyboardToggleListener(this, this); - + LorieService root = new LorieService(this); + setContentView(root); + root.finishInit(); } @Override - public boolean onKeyDown(int keyCode, KeyEvent event) { - Log.d("LorieActivity", "keydown: " + keyCode + "(keycode_back = " + KeyEvent.KEYCODE_BACK + " )"); - if (keyCode == KeyEvent.KEYCODE_BACK) { - onBackPressed(); - return true; - } - return super.onKeyDown(keyCode, event); - } - - - @Override - public void onBackPressed() { - //KeyboardUtils.toggleKeyboardVisibility(this); - Log.d("Asdasd", "asdasdasd"); - if (root == null) return; - if (kbdVisible) { - ((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)) - .hideSoftInputFromWindow(root.getWindowToken(), 0); - } else - { - ((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)) - .showSoftInput(root, InputMethodManager.SHOW_FORCED); - } - } - - - @Override - public void onToggleSoftKeyboard(boolean isVisible) { - kbdVisible = isVisible; - Log.d("LorieActivity", "keyboard is " + (isVisible?"visible":"not visible")); - } + public void onBackPressed() {} } diff --git a/app/src/main/java/com/termux/wtermux/jniLoader.java b/app/src/main/java/com/termux/wtermux/jniLoader.java deleted file mode 100644 index 0ad373d..0000000 --- a/app/src/main/java/com/termux/wtermux/jniLoader.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.termux.wtermux; - -final class jniLoader { - static void loadLibrary(String name) { - _loadLibrary("lib" + name + ".so"); - } - - private static native void _loadLibrary(String name); - static { - System.loadLibrary("jniLoader"); - } -} diff --git a/app/src/main/jni/lorie/backend-android.c b/app/src/main/jni/lorie/backend-android.c index 88e959b..878fe54 100644 --- a/app/src/main/jni/lorie/backend-android.c +++ b/app/src/main/jni/lorie/backend-android.c @@ -85,7 +85,7 @@ typedef struct { struct { EGLDisplay dpy; EGLNativeWindowType win; - uint32_t width, height; + uint32_t width, height, mmWidth, mmHeight; } window_change; #ifdef __ANDROID__ struct { @@ -155,7 +155,7 @@ void lorie_pointer_event(void __unused *b, uint8_t state, uint16_t button, uint3 write(backend->fds[0], &e, sizeof(lorie_event)); } -void lorie_window_change_event(void __unused *b, EGLDisplay dpy, EGLNativeWindowType win, uint32_t width, uint32_t height) { +void lorie_window_change_event(void __unused *b, EGLDisplay dpy, EGLNativeWindowType win, uint32_t width, uint32_t height, uint32_t mmWidth, uint32_t mmHeight) { if (!backend) return; lorie_event e; @@ -166,6 +166,8 @@ void lorie_window_change_event(void __unused *b, EGLDisplay dpy, EGLNativeWindow e.window_change.win = win; e.window_change.width = width; e.window_change.height = height; + e.window_change.mmWidth = mmWidth; + e.window_change.mmHeight = mmHeight; write(backend->fds[0], &e, sizeof(lorie_event)); } @@ -205,18 +207,18 @@ Java_com_termux_wtermux_LorieService_createLorieThread(JNIEnv __unused *env, job } JNIEXPORT void JNICALL -Java_com_termux_wtermux_LorieService_windowChanged(JNIEnv *env, jobject __unused instance, jlong __unused jcompositor, jobject jsurface, jint width, jint height) { +Java_com_termux_wtermux_LorieService_windowChanged(JNIEnv *env, jobject __unused instance, jlong __unused jcompositor, jobject jsurface, jint width, jint height, jint mmWidth, jint mmHeight) { if (backend == NULL) return; #if 1 EGLNativeWindowType win = ANativeWindow_fromSurface(env, jsurface); if (win == NULL) { LOGE("Surface is invalid"); - lorie_window_change_event(backend, NULL, NULL, (uint32_t) width, (uint32_t) height); + lorie_window_change_event(backend, NULL, NULL, (uint32_t) width, (uint32_t) height, (uint32_t) mmWidth, (uint32_t) mmHeight); return; } lorie_window_change_event(backend, NULL, win, (uint32_t) width, - (uint32_t) height); + (uint32_t) height, (uint32_t) mmWidth, (uint32_t) mmHeight); #else JavaVM* jvm; (*env)->GetJavaVM(env, &jvm); @@ -372,7 +374,7 @@ void backend_dispatch_nonblocking (void) eglMakeCurrent(backend->dpy, backend->sfc, backend->sfc, backend->ctx); checkEGLError(); if (backend->callbacks.resize) - backend->callbacks.resize(ev.window_change.width, ev.window_change.height); + backend->callbacks.resize(ev.window_change.width, ev.window_change.height, ev.window_change.mmWidth, ev.window_change.mmHeight); break; case ACTION_LAYOUT_CHANGE: xkb_keymap_unref(backend->xkb_keymap); @@ -461,4 +463,5 @@ void backend_get_dimensions(uint32_t *width, uint32_t *height) { if (width) *width = 480; if (height) *height = 800; } + #pragma clang diagnostic pop diff --git a/app/src/main/jni/lorie/backend.h b/app/src/main/jni/lorie/backend.h index e1cf141..cba558b 100644 --- a/app/src/main/jni/lorie/backend.h +++ b/app/src/main/jni/lorie/backend.h @@ -7,7 +7,7 @@ struct modifier_state { }; struct callbacks { - void (*resize) (int width, int height); + void (*resize) (int width, int height, int mmWidth, int mmHeight); void (*draw) (void); void (*mouse_motion) (int x, int y); void (*mouse_button) (int button, int state); diff --git a/app/src/main/jni/lorie/locale/android-utils.c b/app/src/main/jni/lorie/locale/android-utils.c index d89fd39..f93aa63 100644 --- a/app/src/main/jni/lorie/locale/android-utils.c +++ b/app/src/main/jni/lorie/locale/android-utils.c @@ -54,6 +54,10 @@ int android_keycode_to_linux_event_code(int keyCode, int *eventCode, int *shift, KEYCODE1(Z); KEYCODE1(COMMA); KEYCODE2(PERIOD, DOT); + KEYCODE2(DPAD_UP, UP); + KEYCODE2(DPAD_LEFT, LEFT); + KEYCODE2(DPAD_DOWN, DOWN); + KEYCODE2(DPAD_RIGHT, RIGHT); KEYCODE2(ALT_LEFT, LEFTALT); KEYCODE2(ALT_RIGHT, RIGHTALT); KEYCODE2(SHIFT_LEFT, LEFTSHIFT); @@ -107,7 +111,7 @@ int android_keycode_to_linux_event_code(int keyCode, int *eventCode, int *shift, KEYCODE2(MOVE_END, END); KEYCODE1(INSERT); KEYCODE1(FORWARD); - KEYCODE1(BACK); + KEYCODE2(BACK, ESC); KEYCODE1(F1); KEYCODE1(F2); KEYCODE1(F3); diff --git a/app/src/main/jni/lorie/main.c b/app/src/main/jni/lorie/main.c index 6776bb0..68f976e 100644 --- a/app/src/main/jni/lorie/main.c +++ b/app/src/main/jni/lorie/main.c @@ -86,8 +86,8 @@ static void surface_attach (struct wl_client *client, struct wl_resource *resour return; } - surface->width = wl_shm_buffer_get_width (shm_buffer); - surface->height = wl_shm_buffer_get_height (shm_buffer); + surface->width = (uint32_t) wl_shm_buffer_get_width (shm_buffer); + surface->height = (uint32_t) wl_shm_buffer_get_height (shm_buffer); if (!surface->texture || surface->texture->width != surface->width || @@ -240,12 +240,13 @@ wl_output_bind(struct wl_client *client, void *data, uint32_t version, uint32_t } // backend callbacks -static void handle_resize_event (int width, int height) { +static void handle_resize_event (int width, int height, int mmWidth, int mmHeight) { if (width == c.width && height == c.height) return; glViewport(0, 0, width, height); c.width = width; c.height = height; if (c.wl_output) { + wl_output_send_geometry(c.wl_output, 0, 0, mmWidth, mmHeight, 0, "non-weston", "none", 0); wl_output_send_mode(c.wl_output, 3, width, height, 60000); wl_output_send_done(c.wl_output); diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 72d6aaf..914660a 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -6,6 +6,7 @@ android:layout_height="match_parent" tools:context=".MainActivity"> + - + + android:layout_height="match_parent"> + + + + + + + + \ No newline at end of file