Some fixes, Additional keyboard and small improvements
Fixed: app restart after physical keyboard connected Fixed: some eventCodes from physical keyboard were processed wrong
This commit is contained in:
parent
595c00d669
commit
458acd617b
@ -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.
|
@ -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
|
||||
|
@ -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.
|
@ -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.
|
||||
|
@ -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.
|
@ -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
|
||||
|
1
app/.gitignore
vendored
1
app/.gitignore
vendored
@ -1 +1,2 @@
|
||||
/build
|
||||
/.externalNativeBuild
|
||||
|
13
app/app.iml
13
app/app.iml
@ -33,11 +33,6 @@
|
||||
<output-test url="file://$MODULE_DIR$/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes" />
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/jni/libxkbcommon/xkbcommon/src" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/jni/libxkbcommon/xkbcommon/src/compose" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/jni/libxkbcommon/xkbcommon/src/xkbcomp" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/jni/lorie" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/jni/lorie/locale" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/debug" isTestSource="false" generated="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/aidl_source_output_dir/debug/compileDebugAidl/out" isTestSource="false" generated="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/debug" isTestSource="false" generated="true" />
|
||||
@ -56,7 +51,6 @@
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/assets" type="java-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/aidl" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/jni" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/shaders" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/res" type="java-test-resource" />
|
||||
@ -64,7 +58,6 @@
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/assets" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/aidl" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/java" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/jni" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/rs" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/shaders" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/res" type="java-test-resource" />
|
||||
@ -72,7 +65,6 @@
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/assets" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/aidl" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/java" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/jni" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/rs" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/shaders" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" />
|
||||
@ -80,7 +72,6 @@
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/assets" type="java-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/shaders" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
|
||||
@ -88,7 +79,6 @@
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/test/aidl" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/test/jni" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
|
||||
@ -96,10 +86,9 @@
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/.externalNativeBuild" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/generated/not_namespaced_r_class_sources" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/generated/source/r" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/annotation_processor_list" />
|
||||
|
@ -17,7 +17,7 @@
|
||||
tools:ignore="GoogleAppIndexingWarning">
|
||||
<activity android:name=".MainActivity"
|
||||
android:theme="@style/NoActionBar"
|
||||
android:configChanges="orientation|screenSize">
|
||||
android:configChanges="fontScale|orientation|screenSize|keyboard|keyboardHidden|layoutDirection|locale|mcc|mnc|navigation|screenLayout|touchscreen|uiMode|smallestScreenSize|density">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
|
173
app/src/main/java/com/termux/wtermux/AdditionalKeyboardView.java
Normal file
173
app/src/main/java/com/termux/wtermux/AdditionalKeyboardView.java
Normal file
@ -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<Integer, String> keyCodesForString = new HashMap<Integer, String>() {{
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
@ -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);
|
||||
|
||||
|
@ -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() {}
|
||||
}
|
||||
|
@ -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");
|
||||
}
|
||||
}
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
||||
|
@ -6,6 +6,7 @@
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".MainActivity">
|
||||
|
||||
|
||||
<SurfaceView
|
||||
android:id="@+id/WestonView"
|
||||
android:layout_width="match_parent"
|
||||
@ -13,9 +14,24 @@
|
||||
android:visibility="visible"
|
||||
tools:visibility="visible" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/MenuHolder"
|
||||
<!-- RelativeLayout and ScrollView inside are needed to make ExtraKeysView visible after soft keyboard is shown -->
|
||||
<RelativeLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical"></LinearLayout>
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<ScrollView
|
||||
android:id="@+id/scrollview"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_above="@+id/extra_keys">
|
||||
</ScrollView>
|
||||
<com.termux.wtermux.AdditionalKeyboardView
|
||||
android:id="@+id/extra_keys"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="50dp"
|
||||
android:layout_alignParentBottom="true" />
|
||||
|
||||
</RelativeLayout>
|
||||
|
||||
|
||||
</FrameLayout>
|
Loading…
Reference in New Issue
Block a user