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