From 02ed12f8c0953204d5ada55e6936c5a7792d6191 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Wed, 21 Apr 2021 08:56:04 +0200 Subject: [PATCH 001/179] Update build.gradle to add a colorPicker --- app_pojavlauncher/build.gradle | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app_pojavlauncher/build.gradle b/app_pojavlauncher/build.gradle index 1bf6cd6a8..63710446a 100644 --- a/app_pojavlauncher/build.gradle +++ b/app_pojavlauncher/build.gradle @@ -118,12 +118,14 @@ dependencies { implementation 'androidx.preference:preference:1.1.1' implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'androidx.legacy:legacy-preference-v14:1.0.0' - implementation 'com.google.android.material:material:1.2.1' - implementation 'androidx.annotation:annotation:1.1.0' + implementation 'com.google.android.material:material:1.3.0' + implementation 'androidx.annotation:annotation:1.2.0' implementation 'androidx.browser:browser:1.3.0' implementation "androidx.constraintlayout:constraintlayout:2.0.4" + implementation 'com.rarepebble:colorpicker:3.0.1' + // implementation 'com.intuit.sdp:sdp-android:1.0.5' // implementation 'com.intuit.ssp:ssp-android:1.0.5' From 8eaa29eca5b59d705fd78ab0507bb60113d8ce63 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Wed, 21 Apr 2021 08:56:40 +0200 Subject: [PATCH 002/179] Remove KANA key as it was unused --- .../src/main/java/net/kdt/pojavlaunch/AndroidLWJGLKeycode.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AndroidLWJGLKeycode.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AndroidLWJGLKeycode.java index a9599f3a2..8f47d70b1 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AndroidLWJGLKeycode.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AndroidLWJGLKeycode.java @@ -106,7 +106,7 @@ public class AndroidLWJGLKeycode { androidToLwjglMap.put(KeyEvent.KEYCODE_GRAVE, LWJGLGLFWKeycode.GLFW_KEY_GRAVE_ACCENT); androidToLwjglMap.put(KeyEvent.KEYCODE_HOME, LWJGLGLFWKeycode.GLFW_KEY_HOME); androidToLwjglMap.put(KeyEvent.KEYCODE_INSERT, LWJGLGLFWKeycode.GLFW_KEY_INSERT); - androidToLwjglMap.put(KeyEvent.KEYCODE_KANA, LWJGLGLFWKeycode.GLFW_KEY_K); + //androidToLwjglMap.put(KeyEvent.KEYCODE_KANA, LWJGLGLFWKeycode.GLFW_KEY_K); androidToLwjglMap.put(KeyEvent.KEYCODE_LEFT_BRACKET, LWJGLGLFWKeycode.GLFW_KEY_LEFT_BRACKET); androidToLwjglMap.put(KeyEvent.KEYCODE_MINUS, LWJGLGLFWKeycode.GLFW_KEY_MINUS); From 85b7e5a53d7c4a05446056828cb8eb1c2912f70e Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Wed, 21 Apr 2021 08:57:43 +0200 Subject: [PATCH 003/179] Remove unnecessary unboxing from AndroidLWJGLKeycode.java --- .../main/java/net/kdt/pojavlaunch/AndroidLWJGLKeycode.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AndroidLWJGLKeycode.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AndroidLWJGLKeycode.java index 8f47d70b1..fa33c964e 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AndroidLWJGLKeycode.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AndroidLWJGLKeycode.java @@ -160,8 +160,8 @@ public class AndroidLWJGLKeycode { public static String[] generateKeyName() { if (androidKeyNameArray == null) { List keyName = new ArrayList(); - for (Integer perKey : androidToLwjglMap.keySet()) { - keyName.add(KeyEvent.keyCodeToString(perKey.intValue()).replace("KEYCODE_", "")); + for (int perKey : androidToLwjglMap.keySet()) { + keyName.add(KeyEvent.keyCodeToString(perKey).replace("KEYCODE_", "")); } androidKeyNameArray = keyName.toArray(new String[0]); } From c59f13a3a6dd5f4fa4d4637968b6036c3d9a39c2 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Wed, 21 Apr 2021 08:58:18 +0200 Subject: [PATCH 004/179] Add unknown key as a key that does nothing --- .../src/main/java/net/kdt/pojavlaunch/AndroidLWJGLKeycode.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AndroidLWJGLKeycode.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AndroidLWJGLKeycode.java index fa33c964e..3aada07a5 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AndroidLWJGLKeycode.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AndroidLWJGLKeycode.java @@ -155,6 +155,9 @@ public class AndroidLWJGLKeycode { // androidToLwjglMap.put(KeyEvent.KEYCODE_BUTTON_1, LWJGLGLFWKeycode.G androidToLwjglMap.put(KeyEvent.KEYCODE_AT,LWJGLGLFWKeycode.GLFW_KEY_2); androidToLwjglMap.put(KeyEvent.KEYCODE_POUND,LWJGLGLFWKeycode.GLFW_KEY_3); + + androidToLwjglMap.put(KeyEvent.KEYCODE_UNKNOWN,LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN); + } public static String[] generateKeyName() { From 886fe94555c5d907b0f812b564830965e7bce2f0 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Wed, 21 Apr 2021 08:59:59 +0200 Subject: [PATCH 005/179] Disable sending space key when the key is unknown --- .../src/main/java/org/lwjgl/glfw/CallbackBridge.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app_pojavlauncher/src/main/java/org/lwjgl/glfw/CallbackBridge.java b/app_pojavlauncher/src/main/java/org/lwjgl/glfw/CallbackBridge.java index 3d42cbcca..aed451c70 100644 --- a/app_pojavlauncher/src/main/java/org/lwjgl/glfw/CallbackBridge.java +++ b/app_pojavlauncher/src/main/java/org/lwjgl/glfw/CallbackBridge.java @@ -71,7 +71,7 @@ public class CallbackBridge { //nativeSendKeycode(keycode, keychar, scancode, isDown ? 1 : 0, modifiers); if(keycode != 0) nativeSendKey(keycode,scancode,isDown ? 1 : 0, modifiers); - else nativeSendKey(32,scancode,isDown ? 1 : 0, modifiers); + //else nativeSendKey(32,scancode,isDown ? 1 : 0, modifiers); if(isDown && keychar != '\u0000') { nativeSendCharMods(keychar,modifiers); nativeSendChar(keychar); From eca6d9df47818aa391584545864c5e6e9a50cd29 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Wed, 21 Apr 2021 09:00:19 +0200 Subject: [PATCH 006/179] Add control_setting_v2.xml --- .../main/res/layout/control_setting_v2.xml | 339 ++++++++++++++++++ 1 file changed, 339 insertions(+) create mode 100644 app_pojavlauncher/src/main/res/layout/control_setting_v2.xml diff --git a/app_pojavlauncher/src/main/res/layout/control_setting_v2.xml b/app_pojavlauncher/src/main/res/layout/control_setting_v2.xml new file mode 100644 index 000000000..f7acb6cc1 --- /dev/null +++ b/app_pojavlauncher/src/main/res/layout/control_setting_v2.xml @@ -0,0 +1,339 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From def161b40b775646ddd6b024779a15c90eccb9be Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Wed, 21 Apr 2021 09:05:48 +0200 Subject: [PATCH 007/179] Add new ControlData properties and new constructors --- .../customcontrols/ControlData.java | 119 +++++++++++------- 1 file changed, 74 insertions(+), 45 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java index bd3963309..15d495970 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java @@ -1,5 +1,6 @@ package net.kdt.pojavlaunch.customcontrols; +import android.graphics.Color; import android.util.*; import java.util.*; import net.kdt.pojavlaunch.*; @@ -9,12 +10,7 @@ import org.lwjgl.glfw.*; public class ControlData implements Cloneable { - /* - public static int pixelOf2dp = (int) Tools.dpToPx(2); - public static int pixelOf30dp = (int) Tools.dpToPx(30); - public static int pixelOf50dp = Tools.dpToPx(50);; - public static int pixelOf80dp; - */ + public static final int SPECIALBTN_KEYBOARD = -1; public static final int SPECIALBTN_TOGGLECTRL = -2; public static final int SPECIALBTN_MOUSEPRI = -3; @@ -38,20 +34,20 @@ public class ControlData implements Cloneable * bigger device or vice versa. */ public String dynamicX, dynamicY; - public boolean isDynamicBtn, isToggle, passThruEnabled, isRound; + public boolean isDynamicBtn, isToggle, passThruEnabled; public static ControlData[] getSpecialButtons(){ if (SPECIAL_BUTTONS == null) { ControlData[] specialButtons = new ControlData[]{ - new ControlData("Keyboard", SPECIALBTN_KEYBOARD, "${margin} * 3 + ${width} * 2", "${margin}", false), - new ControlData("GUI", SPECIALBTN_TOGGLECTRL, "${margin}", "${bottom} - ${margin}"), - new ControlData("PRI", SPECIALBTN_MOUSEPRI, "${margin}", "${screen_height} - ${margin} * 3 - ${height} * 3"), - new ControlData("SEC", SPECIALBTN_MOUSESEC, "${margin} * 3 + ${width} * 2", "${screen_height} - ${margin} * 3 - ${height} * 3"), - new ControlData("Mouse", SPECIALBTN_VIRTUALMOUSE, "${right}", "${margin}", false), + new ControlData("Keyboard", new int[]{SPECIALBTN_KEYBOARD}, "${margin} * 3 + ${width} * 2", "${margin}", false), + new ControlData("GUI", new int[]{SPECIALBTN_TOGGLECTRL}, "${margin}", "${bottom} - ${margin}"), + new ControlData("PRI", new int[]{SPECIALBTN_MOUSEPRI}, "${margin}", "${screen_height} - ${margin} * 3 - ${height} * 3"), + new ControlData("SEC", new int[]{SPECIALBTN_MOUSESEC}, "${margin} * 3 + ${width} * 2", "${screen_height} - ${margin} * 3 - ${height} * 3"), + new ControlData("Mouse", new int[]{SPECIALBTN_VIRTUALMOUSE}, "${right}", "${margin}", false), - new ControlData("MID", SPECIALBTN_MOUSEMID, "${margin}", "${margin}"), - new ControlData("SCROLLUP", SPECIALBTN_SCROLLUP, "${margin}", "${margin}"), - new ControlData("SCROLLDOWN", SPECIALBTN_SCROLLDOWN, "${margin}", "${margin}") + new ControlData("MID", new int[]{SPECIALBTN_MOUSEMID}, "${margin}", "${margin}"), + new ControlData("SCROLLUP", new int[]{SPECIALBTN_SCROLLUP}, "${margin}", "${margin}"), + new ControlData("SCROLLDOWN", new int[]{SPECIALBTN_SCROLLDOWN}, "${margin}", "${margin}") }; SPECIAL_BUTTONS = specialButtons; } @@ -76,8 +72,13 @@ public class ControlData implements Cloneable public float y; public float width; public float height; - public int keycode; - public int transparency; + public int[] keycodes; //Should store up to 4 keys + public float opacity; //Alpha value from 0 to 1; + public int bgColor; + public int strokeColor; + public int strokeWidth; + public float cornerRadius; + @Deprecated public boolean hidden; public boolean holdCtrl; @@ -86,63 +87,74 @@ public class ControlData implements Cloneable public Object specialButtonListener; public ControlData() { - this("", LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN, 0, 0); + this("", new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}, 0, 0); } - public ControlData(String name, int keycode) { - this(name, keycode, 0, 0); + public ControlData(String name, int[] keycodes) { + this(name, keycodes, 0, 0); } - public ControlData(String name, int keycode, float x, float y) { - this(name, keycode, x, y, Tools.dpToPx(50), Tools.dpToPx(50)); + public ControlData(String name, int[] keycodes, float x, float y) { + this(name, keycodes, x, y, Tools.dpToPx(50), Tools.dpToPx(50)); } - public ControlData(android.content.Context ctx, int resId, int keycode, float x, float y, boolean isSquare) { - this(ctx.getResources().getString(resId), keycode, x, y, isSquare); + public ControlData(android.content.Context ctx, int resId, int[] keycodes, float x, float y, boolean isSquare) { + this(ctx.getResources().getString(resId), keycodes, x, y, isSquare); } - public ControlData(String name, int keycode, float x, float y, boolean isSquare) { - this(name, keycode, x, y, isSquare ? Tools.dpToPx(50) : Tools.dpToPx(80), isSquare ? Tools.dpToPx(50) : Tools.dpToPx(30)); + public ControlData(String name, int[] keycodes, float x, float y, boolean isSquare) { + this(name, keycodes, x, y, isSquare ? Tools.dpToPx(50) : Tools.dpToPx(80), isSquare ? Tools.dpToPx(50) : Tools.dpToPx(30)); } - public ControlData(String name, int keycode, float x, float y, float width, float height) { - this(name, keycode, Float.toString(x), Float.toString(y), width, height, false); + public ControlData(String name, int[] keycodes, float x, float y, float width, float height) { + this(name, keycodes, Float.toString(x), Float.toString(y), width, height, false); this.isDynamicBtn = false; } - public ControlData(String name, int keycode, String dynamicX, String dynamicY) { - this(name, keycode, dynamicX, dynamicY, Tools.dpToPx(50), Tools.dpToPx(50), false); + public ControlData(String name, int[] keycodes, String dynamicX, String dynamicY) { + this(name, keycodes, dynamicX, dynamicY, Tools.dpToPx(50), Tools.dpToPx(50), false); } - public ControlData(android.content.Context ctx, int resId, int keycode, String dynamicX, String dynamicY, boolean isSquare) { - this(ctx.getResources().getString(resId), keycode, dynamicX, dynamicY, isSquare); + public ControlData(android.content.Context ctx, int resId, int[] keycodes, String dynamicX, String dynamicY, boolean isSquare) { + this(ctx.getResources().getString(resId), keycodes, dynamicX, dynamicY, isSquare); } - public ControlData(String name, int keycode, String dynamicX, String dynamicY, boolean isSquare) { - this(name, keycode, dynamicX, dynamicY, isSquare ? Tools.dpToPx(50) : Tools.dpToPx(80), isSquare ? Tools.dpToPx(50) : Tools.dpToPx(30), false); + public ControlData(String name, int[] keycodes, String dynamicX, String dynamicY, boolean isSquare) { + this(name, keycodes, dynamicX, dynamicY, isSquare ? Tools.dpToPx(50) : Tools.dpToPx(80), isSquare ? Tools.dpToPx(50) : Tools.dpToPx(30), false); } - public ControlData(String name, int keycode, String dynamicX, String dynamicY, float width, float height, boolean isToggle) { + public ControlData(String name, int[] keycodes, String dynamicX, String dynamicY, float width, float height, boolean isToggle){ + this(name, keycodes, dynamicX, dynamicY, width, height, isToggle, 1,0x4D000000, 0xFFFFFFFF,0,Tools.dpToPx(0)); + } + + public ControlData(String name, int[] keycodes, String dynamicX, String dynamicY, float width, float height, boolean isToggle, float opacity, int bgColor, int strokeColor, int strokeWidth, float cornerRadius) { this.name = name; - this.keycode = keycode; + this.keycodes = inflateKeycodeArray(keycodes); this.dynamicX = dynamicX; this.dynamicY = dynamicY; this.width = width; this.height = height; this.isDynamicBtn = true; this.isToggle = isToggle; + this.opacity = opacity; + this.bgColor = bgColor; + this.strokeColor = strokeColor; + this.strokeWidth = strokeWidth; + this.cornerRadius = cornerRadius; update(); } public void execute(BaseMainActivity act, boolean isDown) { - act.sendKeyPress(keycode, 0, isDown); + for(int keycode : keycodes){ + act.sendKeyPress(keycode, 0, isDown); + } } public ControlData clone() { if (this instanceof ControlData) { - return new ControlData(name, keycode, ((ControlData) this).dynamicX, ((ControlData) this).dynamicY, width, height, isToggle); + return new ControlData(name, keycodes, ((ControlData) this).dynamicX, ((ControlData) this).dynamicY, width, height, isToggle, opacity, bgColor, strokeColor,strokeWidth, cornerRadius); } else { - return new ControlData(name, keycode, x, y, width, height); + return new ControlData(name, keycodes, x, y, width, height); } } @@ -167,15 +179,20 @@ public class ControlData implements Cloneable } public void update() { - if (keycode < 0 && SPECIAL_BUTTONS != null) { - for (ControlData data : getSpecialButtons()) { - if (keycode == data.keycode) { - specialButtonListener = data.specialButtonListener; + if(SPECIAL_BUTTONS != null){ + for(int keycode : keycodes){ + for (ControlData data : getSpecialButtons()) { + if (keycode == data.keycodes[0]) { + specialButtonListener = data.specialButtonListener; + } } } - } if (dynamicX == null) { + } + + if (dynamicX == null) { dynamicX = Float.toString(x); - } if (dynamicY == null) { + } + if (dynamicY == null) { dynamicY = Float.toString(y); } @@ -186,4 +203,16 @@ public class ControlData implements Cloneable private static float calculate(String math) { return (float) new ExpressionBuilder(math).build().evaluate(); } + + private static int[] inflateKeycodeArray(int[] keycodes){ + int[] inflatedArray = new int[4]; + int i; + for(i=0; i Date: Wed, 21 Apr 2021 09:07:14 +0200 Subject: [PATCH 008/179] Update CustomControlsActivity "add button" button --- .../main/java/net/kdt/pojavlaunch/CustomControlsActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/CustomControlsActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/CustomControlsActivity.java index 02b28c689..043a54928 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/CustomControlsActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/CustomControlsActivity.java @@ -60,7 +60,7 @@ public class CustomControlsActivity extends BaseActivity load(ctrlLayout); break; case R.id.menu_ctrl_add: - ctrlLayout.addControlButton(new ControlData("New", LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN, 100, 100)); + ctrlLayout.addControlButton(new ControlData("New", new int[] {LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}, 100, 100)); break; case R.id.menu_ctrl_selectdefault: dialogSelectDefaultCtrl(ctrlLayout); From b02c8f769ed66c65c490e3bc46b9fd13d286e0eb Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Wed, 21 Apr 2021 09:12:02 +0200 Subject: [PATCH 009/179] Update default controls to the new constructor --- .../customcontrols/CustomControls.java | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/CustomControls.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/CustomControls.java index 43c67ad24..00bf24007 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/CustomControls.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/CustomControls.java @@ -27,30 +27,32 @@ public class CustomControls this.mControlDataList.add(ControlData.getSpecialButtons()[3].clone()); // Secondary Mouse mControlDataList this.mControlDataList.add(ControlData.getSpecialButtons()[4].clone()); // Virtual mouse toggle - this.mControlDataList.add(new ControlData(ctx, R.string.control_debug, LWJGLGLFWKeycode.GLFW_KEY_F3, "${margin}", "${margin}", false)); - this.mControlDataList.add(new ControlData(ctx, R.string.control_chat, LWJGLGLFWKeycode.GLFW_KEY_T, "${margin} * 2 + ${width}", "${margin}", false)); - this.mControlDataList.add(new ControlData(ctx, R.string.control_listplayers, LWJGLGLFWKeycode.GLFW_KEY_TAB, "${margin} * 4 + ${width} * 3", "${margin}", false)); - this.mControlDataList.add(new ControlData(ctx, R.string.control_thirdperson, LWJGLGLFWKeycode.GLFW_KEY_F5, "${margin}", "${height} + ${margin}", false)); + this.mControlDataList.add(new ControlData(ctx, R.string.control_debug, new int[]{LWJGLGLFWKeycode.GLFW_KEY_F3}, "${margin}", "${margin}", false)); + this.mControlDataList.add(new ControlData(ctx, R.string.control_chat, new int[]{LWJGLGLFWKeycode.GLFW_KEY_T}, "${margin} * 2 + ${width}", "${margin}", false)); + this.mControlDataList.add(new ControlData(ctx, R.string.control_listplayers, new int[]{LWJGLGLFWKeycode.GLFW_KEY_TAB}, "${margin} * 4 + ${width} * 3", "${margin}", false)); + this.mControlDataList.add(new ControlData(ctx, R.string.control_thirdperson, new int[]{LWJGLGLFWKeycode.GLFW_KEY_F5}, "${margin}", "${height} + ${margin}", false)); - this.mControlDataList.add(new ControlData(ctx, R.string.control_up, LWJGLGLFWKeycode.GLFW_KEY_W, "${margin} * 2 + ${width}", "${bottom} - ${margin} * 3 - ${height} * 2", true)); - this.mControlDataList.add(new ControlData(ctx, R.string.control_left, LWJGLGLFWKeycode.GLFW_KEY_A, "${margin}", "${bottom} - ${margin} * 2 - ${height}", true)); - this.mControlDataList.add(new ControlData(ctx, R.string.control_down, LWJGLGLFWKeycode.GLFW_KEY_S, "${margin} * 2 + ${width}", "${bottom} - ${margin}", true)); - this.mControlDataList.add(new ControlData(ctx, R.string.control_right, LWJGLGLFWKeycode.GLFW_KEY_D, "${margin} * 3 + ${width} * 2", "${bottom} - ${margin} * 2 - ${height}", true)); + this.mControlDataList.add(new ControlData(ctx, R.string.control_up, new int[]{LWJGLGLFWKeycode.GLFW_KEY_W}, "${margin} * 2 + ${width}", "${bottom} - ${margin} * 3 - ${height} * 2", true)); + this.mControlDataList.add(new ControlData(ctx, R.string.control_left, new int[]{LWJGLGLFWKeycode.GLFW_KEY_A}, "${margin}", "${bottom} - ${margin} * 2 - ${height}", true)); + this.mControlDataList.add(new ControlData(ctx, R.string.control_down, new int[]{LWJGLGLFWKeycode.GLFW_KEY_S}, "${margin} * 2 + ${width}", "${bottom} - ${margin}", true)); + this.mControlDataList.add(new ControlData(ctx, R.string.control_right, new int[]{LWJGLGLFWKeycode.GLFW_KEY_D}, "${margin} * 3 + ${width} * 2", "${bottom} - ${margin} * 2 - ${height}", true)); - this.mControlDataList.add(new ControlData(ctx, R.string.control_inventory, LWJGLGLFWKeycode.GLFW_KEY_E, "${margin} * 3 + ${width} * 2", "${bottom} - ${margin}", true)); + this.mControlDataList.add(new ControlData(ctx, R.string.control_inventory, new int[]{LWJGLGLFWKeycode.GLFW_KEY_E}, "${margin} * 3 + ${width} * 2", "${bottom} - ${margin}", true)); - ControlData shiftData = new ControlData(ctx, R.string.control_shift, LWJGLGLFWKeycode.GLFW_KEY_LEFT_SHIFT, "${margin} * 2 + ${width}", "${screen_height} - ${margin} * 2 - ${height} * 2", true); + ControlData shiftData = new ControlData(ctx, R.string.control_shift, new int[]{LWJGLGLFWKeycode.GLFW_KEY_LEFT_SHIFT}, "${margin} * 2 + ${width}", "${screen_height} - ${margin} * 2 - ${height} * 2", true); shiftData.isToggle = true; this.mControlDataList.add(shiftData); - this.mControlDataList.add(new ControlData(ctx, R.string.control_jump, LWJGLGLFWKeycode.GLFW_KEY_SPACE, "${right} - ${margin} * 2 - ${width}", "${bottom} - ${margin} * 2 - ${height}", true)); + this.mControlDataList.add(new ControlData(ctx, R.string.control_jump, new int[]{LWJGLGLFWKeycode.GLFW_KEY_SPACE}, "${right} - ${margin} * 2 - ${width}", "${bottom} - ${margin} * 2 - ${height}", true)); } public ControlData findControlData(int keycode) { for (ControlData data : mControlDataList) { - if (data.keycode == keycode) { - return data; - } + for(int dataKeycode : data.keycodes){ + if (dataKeycode == keycode) { + return data; + } + } } return null; } From d9676915748aad47c6daaa8a61682491edff28e1 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Wed, 21 Apr 2021 09:15:51 +0200 Subject: [PATCH 010/179] Add ControlButton to support new properties --- .../customcontrols/ControlButton.java | 90 ++++++++++--------- 1 file changed, 50 insertions(+), 40 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlButton.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlButton.java index d0274a4fb..e71d881ab 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlButton.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlButton.java @@ -2,6 +2,8 @@ package net.kdt.pojavlaunch.customcontrols; import android.content.*; import android.graphics.*; +import android.graphics.drawable.GradientDrawable; +import android.graphics.drawable.ShapeDrawable; import android.util.*; import android.view.*; import android.view.View.*; @@ -29,17 +31,11 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp public ControlButton(ControlLayout layout, ControlData properties) { super(layout.getContext()); setPadding(4, 4, 4, 4); - setWillNotDraw(false); mScaleAt = layout.mLayout.scaledAt; mGestureDetector = new GestureDetector(getContext(), new SingleTapConfirm()); - if (!LauncherPreferences.PREF_BUTTON_FLAT) { - setBackgroundResource(R.drawable.control_button); - } else { - setBackgroundResource(R.drawable.control_button_black); - } setOnLongClickListener(this); setProperties(properties); @@ -69,7 +65,8 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp public void setProperties(ControlData properties, boolean changePos) { mProperties = properties; - mProperties.transparency = mProperties.hidden ? 100 : mProperties.transparency; + mProperties.opacity = mProperties.hidden ? 1 : mProperties.opacity; + properties.update(); // com.android.internal.R.string.delete @@ -79,11 +76,14 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp setTranslationX(moveX = properties.x); setTranslationY(moveY = properties.y); } - if (!LauncherPreferences.PREF_BUTTON_FLAT) { - setBackgroundResource(mProperties.isRound ? R.drawable.control_button_round : R.drawable.control_button); - } else { - setBackgroundResource(mProperties.isRound ? R.drawable.control_button_round_black : R.drawable.control_button_black); - } + + GradientDrawable gd = new GradientDrawable(); + gd.setColor(mProperties.bgColor); + gd.setStroke(mProperties.strokeWidth, mProperties.strokeColor); + gd.setCornerRadius(mProperties.cornerRadius); + setBackground(gd); + + if (properties.specialButtonListener == null) { // A non-special button or inside custom controls screen so skip listener } else if (properties.specialButtonListener instanceof View.OnClickListener) { @@ -176,7 +176,7 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp CallbackBridge.holdingAlt = isDown; MainActivity.sendKeyPress(LWJGLGLFWKeycode.GLFW_KEY_LEFT_ALT,0,isDown); System.out.println("holdingAlt="+CallbackBridge.holdingAlt); - } if (mProperties.keycode == LWJGLGLFWKeycode.GLFW_KEY_CAPS_LOCK) { + } if (mProperties.keycodes[0] == LWJGLGLFWKeycode.GLFW_KEY_CAPS_LOCK) { CallbackBridge.holdingCapslock = isDown; //MainActivity.sendKeyPress(LWJGLGLFWKeycode.GLFW_KEY_CAPS_LOCK,0,isDown); System.out.println("holdingCapslock="+CallbackBridge.holdingCapslock); @@ -184,7 +184,7 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp CallbackBridge.holdingCtrl = isDown; MainActivity.sendKeyPress(LWJGLGLFWKeycode.GLFW_KEY_LEFT_CONTROL,0,isDown); System.out.println("holdingCtrl="+CallbackBridge.holdingCtrl); - } if (mProperties.keycode == LWJGLGLFWKeycode.GLFW_KEY_NUM_LOCK) { + } if (mProperties.keycodes[0] == LWJGLGLFWKeycode.GLFW_KEY_NUM_LOCK) { CallbackBridge.holdingNumlock = isDown; //MainActivity.sendKeyPress(LWJGLGLFWKeycode.GLFW_KEY_NUM_LOCK,0,isDown); System.out.println("holdingNumlock="+CallbackBridge.holdingNumlock); @@ -201,39 +201,40 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp public boolean onTouchEvent(MotionEvent event) { if (!mModifiable) { mCanTriggerLongClick = false; - if(event.getAction() == MotionEvent.ACTION_MOVE && CallbackBridge.isGrabbing() && mProperties.passThruEnabled) { + if (event.getAction() == MotionEvent.ACTION_MOVE && CallbackBridge.isGrabbing() && mProperties.passThruEnabled) { MinecraftGLView v = ((ControlLayout) this.getParent()).findViewById(R.id.main_game_render_view); - if(v != null) { + if (v != null) { v.dispatchTouchEvent(event); return true; } } - if (mProperties.keycode >= 0) { - if (!mProperties.isToggle) { - switch (event.getActionMasked()) { - case MotionEvent.ACTION_DOWN: // 0 - case MotionEvent.ACTION_POINTER_DOWN: // 5 - setHolding(true); - MainActivity.sendKeyPress(mProperties.keycode, CallbackBridge.getCurrentMods(), true); - break; - case MotionEvent.ACTION_UP: // 1 - case MotionEvent.ACTION_CANCEL: // 3 - case MotionEvent.ACTION_POINTER_UP: // 6 - setHolding(false); - MainActivity.sendKeyPress(mProperties.keycode, CallbackBridge.getCurrentMods(), false); - break; - default: - return false; - } - } else if (mGestureDetector.onTouchEvent(event)) { - mChecked = !mChecked; - invalidate(); - setHolding(mChecked); - MainActivity.sendKeyPress(mProperties.keycode, CallbackBridge.getCurrentMods(), mChecked); + + if (!mProperties.isToggle) { + switch (event.getActionMasked()) { + case MotionEvent.ACTION_DOWN: // 0 + case MotionEvent.ACTION_POINTER_DOWN: // 5 + setHolding(true); + sendKeyPresses(event, true); + break; + case MotionEvent.ACTION_UP: // 1 + case MotionEvent.ACTION_CANCEL: // 3 + case MotionEvent.ACTION_POINTER_UP: // 6 + setHolding(false); + sendKeyPresses(event,false); + break; + default: + return false; } - return true; + + } else if (mGestureDetector.onTouchEvent(event)) { + mChecked = !mChecked; + invalidate(); + setHolding(mChecked); + sendKeyPresses(event, mChecked); } + return true; + } else { if (mGestureDetector.onTouchEvent(event)) { mCanTriggerLongClick = true; @@ -257,7 +258,6 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp setTranslationX(moveX); setTranslationY(moveY); } - break; } } @@ -265,6 +265,16 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp return super.onTouchEvent(event); } + private void sendKeyPresses(MotionEvent event, boolean isDown){ + for(int keycode : mProperties.keycodes){ + if(keycode > 0){ + MainActivity.sendKeyPress(keycode, CallbackBridge.getCurrentMods(), isDown); + }else { + super.onTouchEvent(event); + } + } + } + public void setModifiable(boolean z) { mModifiable = z; } From 9748df5d49fba7f414050c197546c5cf05789d25 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Wed, 21 Apr 2021 09:16:58 +0200 Subject: [PATCH 011/179] Update ControlLayout to support new properties --- .../net/kdt/pojavlaunch/customcontrols/ControlLayout.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java index cc5dac562..c71aa316d 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java @@ -66,7 +66,7 @@ public class ControlLayout extends FrameLayout mLayout = controlLayout; for (ControlData button : controlLayout.mControlDataList) { - button.isHideable = button.keycode != ControlData.SPECIALBTN_TOGGLECTRL && button.keycode != ControlData.SPECIALBTN_VIRTUALMOUSE; + button.isHideable = button.keycodes[0] != ControlData.SPECIALBTN_TOGGLECTRL && button.keycodes[0] != ControlData.SPECIALBTN_VIRTUALMOUSE; button.width = button.width / controlLayout.scaledAt * LauncherPreferences.PREF_BUTTONSIZE; button.height = button.height / controlLayout.scaledAt * LauncherPreferences.PREF_BUTTONSIZE; if (!button.isDynamicBtn) { @@ -90,7 +90,7 @@ public class ControlLayout extends FrameLayout final ControlButton view = new ControlButton(this, controlButton); view.setModifiable(mModifiable); if (!mModifiable) { - view.setAlpha(1f - view.getProperties().transparency / 100f); + view.setAlpha(view.getProperties().opacity); view.setFocusable(false); view.setFocusableInTouchMode(false); } @@ -151,7 +151,7 @@ public class ControlLayout extends FrameLayout ControlButton cv = ((ControlButton) v); cv.setModifiable(z); if (!z) { - cv.setAlpha(1f - cv.getProperties().transparency / 100f); + cv.setAlpha(cv.getProperties().opacity); } } } From fdddabd1c7bf3c8a5ff7cbd2aed7fe58047a65cd Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Wed, 21 Apr 2021 09:22:32 +0200 Subject: [PATCH 012/179] - Major flattening of the code to avoid it being unreadeable. - New edit button interface with new properties. --- .../handleview/ActionPopupWindow.java | 453 +++++++++++------- 1 file changed, 272 insertions(+), 181 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/ActionPopupWindow.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/ActionPopupWindow.java index 6ae0bb636..79233e395 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/ActionPopupWindow.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/ActionPopupWindow.java @@ -19,7 +19,10 @@ */ package net.kdt.pojavlaunch.customcontrols.handleview; +import android.app.Dialog; import android.content.*; +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; import android.view.*; import android.view.ViewGroup.*; import android.widget.*; @@ -30,10 +33,49 @@ import android.view.View.OnClickListener; import net.kdt.pojavlaunch.customcontrols.*; import androidx.appcompat.app.*; +import com.rarepebble.colorpicker.ColorPickerView; + public class ActionPopupWindow extends PinnedPopupWindow implements OnClickListener { private TextView mEditTextView; private TextView mDeleteTextView; - + + private AlertDialog.Builder alertBuilder; + private Dialog dialog; + + private EditText editName; + private Spinner[] spinnersKeycode; + + private CheckBox checkToggle; + private CheckBox checkPassThrough; + private CheckBox checkDynamicPosition; + private CheckBox checkHoldAlt; + private CheckBox checkHoldCtrl; + private CheckBox checkHoldShift; + + private EditText editWidth; + private EditText editHeight; + private EditText editDynamicX; + private EditText editDynamicY; + + private SeekBar seekBarOpacity; + private SeekBar seekBarCornerRadius; + private SeekBar seekBarStrokeWidth; + + private ImageButton buttonBackgroundColor; + private ImageButton buttonStrokeColor; + + private TextView textOpacity; + private TextView textCornerRadius; + private TextView textStrokeWidth; + + private ControlData properties; + + private ArrayAdapter adapter; + private String[] specialArr; + + + + public ActionPopupWindow(HandleView handleView) { super(handleView); } @@ -77,178 +119,30 @@ public class ActionPopupWindow extends PinnedPopupWindow implements OnClickListe @Override public void onClick(final View view) { - AlertDialog.Builder alert = new AlertDialog.Builder(view.getContext()); - alert.setCancelable(false); + alertBuilder = new AlertDialog.Builder(view.getContext()); + alertBuilder.setCancelable(false); + + + + if (view == mEditTextView) { - alert.setTitle(view.getResources().getString(R.string.customctrl_edit, mHandleView.mView.getText())); - alert.setView(R.layout.control_setting); - alert.setPositiveButton(android.R.string.ok, null); - alert.setNegativeButton(android.R.string.cancel, null); - final AlertDialog dialog = alert.create(); - final ControlData properties = mHandleView.mView.getProperties(); + properties = mHandleView.mView.getProperties(); + initializeEditDialog(view.getContext()); - dialog.setOnShowListener(new DialogInterface.OnShowListener() { - @Override - public void onShow(DialogInterface dialogInterface) { - final EditText editName = dialog.findViewById(R.id.controlsetting_edit_name); - editName.setText(properties.name); - final Spinner spinnerKeycode = dialog.findViewById(R.id.controlsetting_spinner_lwjglkeycode); - ArrayAdapter adapter = new ArrayAdapter(view.getContext(), android.R.layout.simple_spinner_item); - String[] oldSpecialArr = ControlData.buildSpecialButtonArray(); - final String[] specialArr = new String[oldSpecialArr.length]; - for (int i = 0; i < specialArr.length; i++) { - specialArr[i] = "SPECIAL_" + oldSpecialArr[specialArr.length - i - 1]; - } - - adapter.addAll(specialArr); - adapter.addAll(AndroidLWJGLKeycode.generateKeyName()); - adapter.setDropDownViewResource(android.R.layout.simple_list_item_single_choice); - spinnerKeycode.setAdapter(adapter); - if (properties.keycode < 0) { - spinnerKeycode.setSelection(properties.keycode + specialArr.length); - } else { - spinnerKeycode.setSelection(AndroidLWJGLKeycode.getIndexByLWJGLKey(properties.keycode) + specialArr.length); - } - - final CheckBox checkToggle = dialog.findViewById(R.id.controlsetting_checkbox_toggle); - checkToggle.setChecked(properties.isToggle); - final CheckBox checkPassthru = dialog.findViewById(R.id.controlsetting_checkbox_passthru); - checkPassthru.setChecked(properties.passThruEnabled); - final CheckBox checkRound = dialog.findViewById(R.id.controlsetting_checkbox_round); - checkRound.setChecked(properties.isRound); - final EditText editWidth = dialog.findViewById(R.id.controlsetting_edit_width); - final EditText editHeight = dialog.findViewById(R.id.controlsetting_edit_height); - editWidth.setText(Float.toString(properties.width)); - editHeight.setText(Float.toString(properties.height)); - - final EditText editDynamicX = dialog.findViewById(R.id.controlsetting_edit_dynamicpos_x); - final EditText editDynamicY = dialog.findViewById(R.id.controlsetting_edit_dynamicpos_y); - editDynamicX.setEnabled(properties.isDynamicBtn); - editDynamicY.setEnabled(properties.isDynamicBtn); - - final SeekBar seekTransparency = dialog.findViewById(R.id.controlsetting_seek_transparency); - seekTransparency.setMax(100); - seekTransparency.setProgress(properties.hidden ? 100 : properties.transparency); - - final CheckBox checkDynamicPos = dialog.findViewById(R.id.controlsetting_checkbox_dynamicpos); - checkDynamicPos.setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener(){ - - @Override - public void onCheckedChanged(CompoundButton btn, boolean checked) { - editDynamicX.setEnabled(checked); - editDynamicY.setEnabled(checked); - } - }); - checkDynamicPos.setChecked(properties.isDynamicBtn); - - editDynamicX.setHint(Float.toString(properties.x)); - editDynamicX.setText(properties.dynamicX); - - editDynamicY.setHint(Float.toString(properties.y)); - editDynamicY.setText(properties.dynamicY); - - final CheckBox checkHoldAlt = dialog.findViewById(R.id.controlsetting_checkbox_keycombine_alt); - checkHoldAlt.setChecked(properties.holdAlt); - - final CheckBox checkHoldControl = dialog.findViewById(R.id.controlsetting_checkbox_keycombine_control); - checkHoldControl.setChecked(properties.holdCtrl); - - final CheckBox checkHoldShift = dialog.findViewById(R.id.controlsetting_checkbox_keycombine_shift); - checkHoldShift.setChecked(properties.holdShift); - - Button button = dialog.getButton(AlertDialog.BUTTON_POSITIVE); - button.setOnClickListener(new View.OnClickListener() { - - @Override - public void onClick(View view2) { - if (editName.getText().toString().isEmpty()) { - editName.setError(view.getResources().getString(R.string.global_error_field_empty)); - } else { - /* - String errorAt = null; - try { - errorAt = "DynamicX"; - properties.insertDynamicPos(editDynamicX.getText().toString()); - errorAt = "DynamicY"; - properties.insertDynamicPos(editDynamicY.getText().toString()); - } catch (Throwable th) { - Error e = new Error(errorAt, th); - e.setStackTrace(null); - Tools.showError(view.getContext(), e); - return; - } - errorAt = null; - */ - - if (properties.isDynamicBtn) { - int errorAt = 0; - try { - properties.insertDynamicPos(editDynamicX.getText().toString()); - errorAt = 1; - properties.insertDynamicPos(editDynamicY.getText().toString()); - } catch (Throwable th) { - (errorAt == 0 ? editDynamicX : editDynamicY) - .setError(th.getMessage()); - - return; - } - } - - if (spinnerKeycode.getSelectedItemPosition() < specialArr.length) { - properties.keycode = spinnerKeycode.getSelectedItemPosition() - specialArr.length; - } else { - properties.keycode = AndroidLWJGLKeycode.getKeyByIndex(spinnerKeycode.getSelectedItemPosition() - specialArr.length); - } - properties.name = editName.getText().toString(); - - properties.transparency = seekTransparency.getProgress(); - - properties.hidden = false; - properties.isToggle = checkToggle.isChecked(); - properties.passThruEnabled = checkPassthru.isChecked(); - properties.isRound = checkRound.isChecked(); - properties.isDynamicBtn = checkDynamicPos.isChecked(); - properties.width = Float.parseFloat(editWidth.getText().toString()); - properties.height = Float.parseFloat(editHeight.getText().toString()); - properties.dynamicX = editDynamicX.getText().toString(); - properties.dynamicY = editDynamicY.getText().toString(); - - properties.holdAlt = checkHoldAlt.isChecked(); - properties.holdCtrl = checkHoldControl.isChecked(); - properties.holdShift = checkHoldShift.isChecked(); - - if (properties.dynamicX.isEmpty()) { - properties.dynamicX = Float.toString(properties.x); - } if (properties.dynamicY.isEmpty()) { - properties.dynamicY = Float.toString(properties.y); - } - - mHandleView.mView.updateProperties(); - - dialog.dismiss(); - } - } - }); - } - }); dialog.show(); } else if (view == mDeleteTextView) { - alert.setMessage(view.getContext().getString(R.string.customctrl_remove, mHandleView.mView.getText()) + "?"); - alert.setPositiveButton(R.string.global_remove, new DialogInterface.OnClickListener(){ + alertBuilder.setMessage(view.getContext().getString(R.string.customctrl_remove, mHandleView.mView.getText()) + "?"); - @Override - public void onClick(DialogInterface p1, int p2) - { - ControlLayout layout = ((ControlLayout) mHandleView.mView.getParent()); - layout.removeControlButton(mHandleView.mView); - } - }); - alert.setNegativeButton(android.R.string.cancel, null); - alert.show(); + alertBuilder.setPositiveButton(R.string.global_remove, (p1, p2) -> { + ControlLayout layout = ((ControlLayout) mHandleView.mView.getParent()); + layout.removeControlButton(mHandleView.mView); + }); + alertBuilder.setNegativeButton(android.R.string.cancel, null); + alertBuilder.show(); } hide(); @@ -257,32 +151,229 @@ public class ActionPopupWindow extends PinnedPopupWindow implements OnClickListe @Override protected int getTextOffset() { return 0; - // return (mTextView.getSelectionStart() + mTextView.getSelectionEnd()) / 2; } @Override protected int getVerticalLocalPosition(int line) { - // return mTextView.getLayout().getLineTop(line) - mContentView.getMeasuredHeight(); return 0; } @Override protected int clipVertically(int positionY) { - /* - if (positionY < 0) { - final int offset = getTextOffset(); - final Layout layout = mTextView.getLayout(); - final int line = layout.getLineForOffset(offset); - positionY += layout.getLineBottom(line) - layout.getLineTop(line); - positionY += mContentView.getMeasuredHeight(); - - // Assumes insertion and selection handles share the same height - final Drawable handle = mHandleView.getContext().getDrawable( - mTextView.mTextSelectHandleRes); - positionY += handle.getIntrinsicHeight(); - } - */ - return positionY; } + + private void initializeEditDialog(Context ctx){ + //TODO: Support the color picker, stroke width/color and corner radius + //Create the editing dialog + LayoutInflater layoutInflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + View v = layoutInflater.inflate(R.layout.control_setting_v2,null); + + alertBuilder.setTitle(ctx.getResources().getString(R.string.customctrl_edit, mHandleView.mView.getText())); + alertBuilder.setView(v); + + //Linking a lot of stuff + editName = v.findViewById(R.id.controlsetting_edit_name); + + spinnersKeycode = new Spinner[]{ + v.findViewById(R.id.controlsetting_spinner_lwjglkeycode), + v.findViewById(R.id.controlsetting_spinner_lwjglkeycode2), + v.findViewById(R.id.controlsetting_spinner_lwjglkeycode3), + v.findViewById(R.id.controlsetting_spinner_lwjglkeycode4) + }; + checkToggle = v.findViewById(R.id.controlsetting_checkbox_toggle); + checkPassThrough = v.findViewById(R.id.controlsetting_checkbox_passthru); + + editWidth = v.findViewById(R.id.controlsetting_edit_width); + editHeight = v.findViewById(R.id.controlsetting_edit_height); + + editDynamicX = v.findViewById(R.id.controlsetting_edit_dynamicpos_x); + editDynamicY = v.findViewById(R.id.controlsetting_edit_dynamicpos_y); + + seekBarOpacity = v.findViewById(R.id.controlsetting_seek_opacity); + seekBarCornerRadius = v.findViewById(R.id.controlsetting_seek_corner_radius); + seekBarStrokeWidth = v.findViewById(R.id.controlsetting_seek_stroke_width); + + buttonBackgroundColor = v.findViewById(R.id.controlsetting_background_color); + buttonStrokeColor = v.findViewById(R.id.controlsetting_stroke_color); + + textOpacity = v.findViewById(R.id.controlsetting_text_opacity); + textCornerRadius = v.findViewById(R.id.controlsetting_text_corner_radius); + textStrokeWidth = v.findViewById(R.id.controlsetting_text_stroke_width); + + checkDynamicPosition = v.findViewById(R.id.controlsetting_checkbox_dynamicpos); + checkDynamicPosition.setOnCheckedChangeListener((btn, checked) -> { + editDynamicX.setEnabled(checked); + editDynamicY.setEnabled(checked); + }); + + + checkHoldAlt = v.findViewById(R.id.controlsetting_checkbox_keycombine_alt); + checkHoldCtrl = v.findViewById(R.id.controlsetting_checkbox_keycombine_control); + checkHoldShift = v.findViewById(R.id.controlsetting_checkbox_keycombine_shift); + + //Initialize adapter for keycodes + adapter= new ArrayAdapter(ctx, android.R.layout.simple_spinner_item); + String[] oldSpecialArr = ControlData.buildSpecialButtonArray(); + specialArr = new String[oldSpecialArr.length]; + for (int i = 0; i < specialArr.length; i++) { + specialArr[i] = "SPECIAL_" + oldSpecialArr[specialArr.length - i - 1]; + } + adapter.addAll(specialArr); + adapter.addAll(AndroidLWJGLKeycode.generateKeyName()); + adapter.setDropDownViewResource(android.R.layout.simple_list_item_single_choice); + + for (Spinner spinner : spinnersKeycode) { + spinner.setAdapter(adapter); + } + + //Set color imageButton behavior + buttonBackgroundColor.setOnClickListener(view -> showBackgroundColorPicker(view.getContext())); + buttonStrokeColor.setOnClickListener(view -> showStrokeColorPicker(view.getContext())); + + //Set dialog buttons behavior + alertBuilder.setPositiveButton(android.R.string.ok, (dialogInterface1, i) -> { + if(!hasErrors(dialog.getContext())){ + saveProperties(); + } + }); + alertBuilder.setNegativeButton(android.R.string.cancel, null); + + //Create the finalized dialog + dialog = alertBuilder.create(); + + dialog.setOnShowListener(dialogInterface -> { + setEditDialogValues(); + }); + + } + + private void setEditDialogValues(){ + + editName.setText(properties.name); + + checkToggle.setChecked(properties.isToggle); + checkPassThrough.setChecked(properties.passThruEnabled); + + editWidth.setText(Float.toString(properties.width)); + editHeight.setText(Float.toString(properties.height)); + + editDynamicX.setEnabled(properties.isDynamicBtn); + editDynamicY.setEnabled(properties.isDynamicBtn); + editDynamicX.setHint(Float.toString(properties.x)); + editDynamicX.setText(properties.dynamicX); + editDynamicY.setHint(Float.toString(properties.y)); + editDynamicY.setText(properties.dynamicY); + + seekBarOpacity.setProgress(properties.hidden ? 0 : (int)properties.opacity*100); + seekBarStrokeWidth.setProgress(properties.strokeWidth); + seekBarCornerRadius.setProgress((int)properties.cornerRadius); + + buttonBackgroundColor.setBackgroundColor(properties.bgColor); + buttonStrokeColor.setBackgroundColor(properties.strokeColor); + + checkHoldAlt.setChecked(properties.holdAlt); + checkHoldCtrl.setChecked(properties.holdCtrl); + checkHoldShift.setChecked(properties.holdShift); + checkDynamicPosition.setChecked(properties.isDynamicBtn); + + for(int i=0; i< properties.keycodes.length; i++){ + if (properties.keycodes[i] < 0) { + spinnersKeycode[i].setSelection(properties.keycodes[i] + specialArr.length); + } else { + spinnersKeycode[i].setSelection(AndroidLWJGLKeycode.getIndexByLWJGLKey(properties.keycodes[i]) + specialArr.length); + } + } + } + + private void saveProperties(){ + //TODO save new properties + //This method assumes there are no error. + properties.name = editName.getText().toString(); + + //Keycodes + for(int i=0; i buttonBackgroundColor.setBackgroundColor(picker.getColor())); + + dialog.show(); + } + + private void showStrokeColorPicker(Context ctx){ + ColorPickerView picker = new ColorPickerView(ctx); + picker.setColor(((ColorDrawable)buttonStrokeColor.getBackground()).getColor()); + picker.showAlpha(false); + + AlertDialog.Builder dialog = new AlertDialog.Builder(ctx); + dialog.setTitle("Edit stroke color"); + dialog.setView(picker); + dialog.setNegativeButton(android.R.string.cancel, null); + dialog.setPositiveButton(android.R.string.ok, (dialogInterface, i) -> buttonStrokeColor.setBackgroundColor(picker.getColor())); + + dialog.show(); + } + } From 8fa12e2d769cf7eedfe188aa34b2fd25cb7978e2 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Wed, 21 Apr 2021 09:25:28 +0200 Subject: [PATCH 013/179] Update MainActivity to support new properties --- .../net/kdt/pojavlaunch/MainActivity.java | 72 ++++++++++--------- 1 file changed, 38 insertions(+), 34 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MainActivity.java index 67cdcd63a..762ba99e9 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MainActivity.java @@ -37,7 +37,7 @@ public class MainActivity extends BaseMainActivity { CustomControlsActivity.load(mControlLayout); break; case R.id.menu_ctrl_add: - mControlLayout.addControlButton(new ControlData("New", LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN, 100, 100)); + mControlLayout.addControlButton(new ControlData("New", new int[] {LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}, 100, 100)); break; case R.id.menu_ctrl_selectdefault: CustomControlsActivity.dialogSelectDefaultCtrl(mControlLayout); @@ -56,18 +56,20 @@ public class MainActivity extends BaseMainActivity { public void onClick(View view) { if (view instanceof ControlButton) { ControlButton button = (ControlButton) view; - switch (button.getProperties().keycode) { - case ControlData.SPECIALBTN_KEYBOARD: - showKeyboard(); - break; + for(int keycode : button.getProperties().keycodes){ + switch (keycode) { + case ControlData.SPECIALBTN_KEYBOARD: + showKeyboard(); + break; - case ControlData.SPECIALBTN_TOGGLECTRL: - mControlLayout.toggleControlVisible(); - break; + case ControlData.SPECIALBTN_TOGGLECTRL: + mControlLayout.toggleControlVisible(); + break; - case ControlData.SPECIALBTN_VIRTUALMOUSE: - toggleMouse(button); - break; + case ControlData.SPECIALBTN_VIRTUALMOUSE: + toggleMouse(button); + break; + } } } } @@ -93,32 +95,34 @@ public class MainActivity extends BaseMainActivity { if (view instanceof ControlButton) { ControlButton button = (ControlButton) view; - switch (button.getProperties().keycode) { - case ControlData.SPECIALBTN_MOUSEPRI: - sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT, isDown); - break; + for(int keycode : button.getProperties().keycodes) { + switch (keycode) { + case ControlData.SPECIALBTN_MOUSEPRI: + sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT, isDown); + break; - case ControlData.SPECIALBTN_MOUSEMID: - sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_MIDDLE, isDown); - break; + case ControlData.SPECIALBTN_MOUSEMID: + sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_MIDDLE, isDown); + break; - case ControlData.SPECIALBTN_MOUSESEC: - if (CallbackBridge.isGrabbing()) { - sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT, isDown); - } else { - CallbackBridge.putMouseEventWithCoords(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT, isDown ? 1 : 0, CallbackBridge.mouseX, CallbackBridge.mouseY); + case ControlData.SPECIALBTN_MOUSESEC: + if (CallbackBridge.isGrabbing()) { + sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT, isDown); + } else { + CallbackBridge.putMouseEventWithCoords(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT, isDown ? 1 : 0, CallbackBridge.mouseX, CallbackBridge.mouseY); - setRightOverride(isDown); - } - break; - - case ControlData.SPECIALBTN_SCROLLDOWN: - if(!isDown)CallbackBridge.sendScroll(0, 1d); - break; - - case ControlData.SPECIALBTN_SCROLLUP: - if(!isDown)CallbackBridge.sendScroll(0, -1d); - break; + setRightOverride(isDown); + } + break; + + case ControlData.SPECIALBTN_SCROLLDOWN: + if (!isDown) CallbackBridge.sendScroll(0, 1d); + break; + + case ControlData.SPECIALBTN_SCROLLUP: + if (!isDown) CallbackBridge.sendScroll(0, -1d); + break; + } } } From 29317bb72ed09b62b8f697315ed943dc6a6bd7af Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Wed, 21 Apr 2021 09:26:11 +0200 Subject: [PATCH 014/179] Remove unused resources --- .../res/drawable/control_button_black.xml | 5 - .../res/drawable/control_button_round.xml | 5 - .../drawable/control_button_round_black.xml | 5 - .../drawable/control_button_round_normal.xml | 7 - .../drawable/control_button_round_pressed.xml | 7 - .../src/main/res/layout/control_setting.xml | 158 ------------------ 6 files changed, 187 deletions(-) delete mode 100644 app_pojavlauncher/src/main/res/drawable/control_button_black.xml delete mode 100644 app_pojavlauncher/src/main/res/drawable/control_button_round.xml delete mode 100644 app_pojavlauncher/src/main/res/drawable/control_button_round_black.xml delete mode 100644 app_pojavlauncher/src/main/res/drawable/control_button_round_normal.xml delete mode 100644 app_pojavlauncher/src/main/res/drawable/control_button_round_pressed.xml delete mode 100644 app_pojavlauncher/src/main/res/layout/control_setting.xml diff --git a/app_pojavlauncher/src/main/res/drawable/control_button_black.xml b/app_pojavlauncher/src/main/res/drawable/control_button_black.xml deleted file mode 100644 index d1d60fa08..000000000 --- a/app_pojavlauncher/src/main/res/drawable/control_button_black.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app_pojavlauncher/src/main/res/drawable/control_button_round.xml b/app_pojavlauncher/src/main/res/drawable/control_button_round.xml deleted file mode 100644 index 50973a575..000000000 --- a/app_pojavlauncher/src/main/res/drawable/control_button_round.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app_pojavlauncher/src/main/res/drawable/control_button_round_black.xml b/app_pojavlauncher/src/main/res/drawable/control_button_round_black.xml deleted file mode 100644 index e0a801ca8..000000000 --- a/app_pojavlauncher/src/main/res/drawable/control_button_round_black.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app_pojavlauncher/src/main/res/drawable/control_button_round_normal.xml b/app_pojavlauncher/src/main/res/drawable/control_button_round_normal.xml deleted file mode 100644 index 97f91f53d..000000000 --- a/app_pojavlauncher/src/main/res/drawable/control_button_round_normal.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app_pojavlauncher/src/main/res/drawable/control_button_round_pressed.xml b/app_pojavlauncher/src/main/res/drawable/control_button_round_pressed.xml deleted file mode 100644 index d72b64b0b..000000000 --- a/app_pojavlauncher/src/main/res/drawable/control_button_round_pressed.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/app_pojavlauncher/src/main/res/layout/control_setting.xml b/app_pojavlauncher/src/main/res/layout/control_setting.xml deleted file mode 100644 index 74841bd43..000000000 --- a/app_pojavlauncher/src/main/res/layout/control_setting.xml +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From 801eec319d634cd89bb356a99a2905bbb2bdd3a7 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Wed, 21 Apr 2021 10:44:57 +0200 Subject: [PATCH 015/179] setting textViews are now actualised --- .../handleview/ActionPopupWindow.java | 58 ++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/ActionPopupWindow.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/ActionPopupWindow.java index 79233e395..b0de6bb81 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/ActionPopupWindow.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/ActionPopupWindow.java @@ -164,7 +164,6 @@ public class ActionPopupWindow extends PinnedPopupWindow implements OnClickListe } private void initializeEditDialog(Context ctx){ - //TODO: Support the color picker, stroke width/color and corner radius //Create the editing dialog LayoutInflater layoutInflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View v = layoutInflater.inflate(R.layout.control_setting_v2,null); @@ -194,6 +193,55 @@ public class ActionPopupWindow extends PinnedPopupWindow implements OnClickListe seekBarCornerRadius = v.findViewById(R.id.controlsetting_seek_corner_radius); seekBarStrokeWidth = v.findViewById(R.id.controlsetting_seek_stroke_width); + //Add listeners, too bad I don't need all the methods + seekBarOpacity.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + @Override + public void onProgressChanged(SeekBar seekBar, int i, boolean b) { + setPercentageText(textOpacity, i); + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + //AUTO GENERATED STUN + } + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + //AUTO GENERATED STUN + } + }); + + seekBarCornerRadius.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + @Override + public void onProgressChanged(SeekBar seekBar, int i, boolean b) { + setPercentageText(textCornerRadius, i); + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + //AUTO GENERATED STUN + } + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + //AUTO GENERATED STUN + } + }); + + seekBarStrokeWidth.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + @Override + public void onProgressChanged(SeekBar seekBar, int i, boolean b) { + setPercentageText(textStrokeWidth, i); + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + //AUTO GENERATED STUN + } + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + //AUTO GENERATED STUN + } + }); + buttonBackgroundColor = v.findViewById(R.id.controlsetting_background_color); buttonStrokeColor = v.findViewById(R.id.controlsetting_stroke_color); @@ -272,6 +320,10 @@ public class ActionPopupWindow extends PinnedPopupWindow implements OnClickListe buttonBackgroundColor.setBackgroundColor(properties.bgColor); buttonStrokeColor.setBackgroundColor(properties.strokeColor); + setPercentageText(textCornerRadius,seekBarCornerRadius.getProgress()); + setPercentageText(textOpacity,seekBarOpacity.getProgress()); + setPercentageText(textStrokeWidth,seekBarStrokeWidth.getProgress()); + checkHoldAlt.setChecked(properties.holdAlt); checkHoldCtrl.setChecked(properties.holdCtrl); checkHoldShift.setChecked(properties.holdShift); @@ -376,4 +428,8 @@ public class ActionPopupWindow extends PinnedPopupWindow implements OnClickListe dialog.show(); } + private void setPercentageText(TextView textView, int progress){ + textView.setText(progress + " %"); + } + } From 27f3ee55ba8940e0f908cf4e4f259aeb009c7663 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Wed, 21 Apr 2021 11:15:26 +0200 Subject: [PATCH 016/179] Fix toggle state not being rounded --- .../net/kdt/pojavlaunch/customcontrols/ControlButton.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlButton.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlButton.java index e71d881ab..02b716680 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlButton.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlButton.java @@ -25,14 +25,10 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp private boolean mCanTriggerLongClick = true; private boolean mChecked = false; - - private float mScaleAt; public ControlButton(ControlLayout layout, ControlData properties) { super(layout.getContext()); setPadding(4, 4, 4, 4); - - mScaleAt = layout.mLayout.scaledAt; mGestureDetector = new GestureDetector(getContext(), new SingleTapConfirm()); @@ -146,7 +142,7 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (mChecked) { - canvas.drawRect(0, getHeight() - 10 * mScaleAt, getWidth(), getHeight(), mRectPaint); + canvas.drawRoundRect(0, 0, getWidth(), getHeight(), mProperties.cornerRadius, mProperties.cornerRadius, mRectPaint); } } From a573b2bb97e25b3baee6f902d02701d1bc40a35e Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Wed, 21 Apr 2021 12:13:25 +0200 Subject: [PATCH 017/179] Fix toggle unable to be pressed when moving the camera --- .../customcontrols/ControlButton.java | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlButton.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlButton.java index 02b716680..82535d1a1 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlButton.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlButton.java @@ -205,29 +205,29 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp } } - - if (!mProperties.isToggle) { - switch (event.getActionMasked()) { - case MotionEvent.ACTION_DOWN: // 0 - case MotionEvent.ACTION_POINTER_DOWN: // 5 + switch (event.getActionMasked()) { + case MotionEvent.ACTION_DOWN: // 0 + case MotionEvent.ACTION_POINTER_DOWN: // 5 + if(!mProperties.isToggle){ setHolding(true); sendKeyPresses(event, true); + } + break; + case MotionEvent.ACTION_UP: // 1 + case MotionEvent.ACTION_CANCEL: // 3 + case MotionEvent.ACTION_POINTER_UP: // 6 + if(mProperties.isToggle){ + mChecked = !mChecked; + invalidate(); + setHolding(mChecked); + sendKeyPresses(event, mChecked); break; - case MotionEvent.ACTION_UP: // 1 - case MotionEvent.ACTION_CANCEL: // 3 - case MotionEvent.ACTION_POINTER_UP: // 6 - setHolding(false); - sendKeyPresses(event,false); - break; - default: - return false; - } - - } else if (mGestureDetector.onTouchEvent(event)) { - mChecked = !mChecked; - invalidate(); - setHolding(mChecked); - sendKeyPresses(event, mChecked); + } + setHolding(false); + sendKeyPresses(event,false); + break; + default: + return false; } return true; From 78ea1ca709345c9d5a3812d31539c62509c6c6c2 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Wed, 21 Apr 2021 16:50:12 +0200 Subject: [PATCH 018/179] Fix double click on some button --- .../java/net/kdt/pojavlaunch/customcontrols/ControlButton.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlButton.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlButton.java index 82535d1a1..742b3ca25 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlButton.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlButton.java @@ -263,7 +263,7 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp private void sendKeyPresses(MotionEvent event, boolean isDown){ for(int keycode : mProperties.keycodes){ - if(keycode > 0){ + if(keycode >= 0){ MainActivity.sendKeyPress(keycode, CallbackBridge.getCurrentMods(), isDown); }else { super.onTouchEvent(event); From 0fa13e2328320c7bce71b55bac81e4e2883863cb Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Wed, 21 Apr 2021 17:22:37 +0200 Subject: [PATCH 019/179] Clean BaseMainActivity --- .../net/kdt/pojavlaunch/BaseMainActivity.java | 96 +------------------ 1 file changed, 3 insertions(+), 93 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java index 54330cfea..8e2cc80c9 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java @@ -28,11 +28,10 @@ import org.lwjgl.glfw.*; public class BaseMainActivity extends LoggableActivity { public static volatile ClipboardManager GLOBAL_CLIPBOARD; - - public static final String initText = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA "; + volatile public static boolean isInputStackCall; - private static int[] hotbarKeys = { + private static final int[] hotbarKeys = { LWJGLGLFWKeycode.GLFW_KEY_1, LWJGLGLFWKeycode.GLFW_KEY_2, LWJGLGLFWKeycode.GLFW_KEY_3, LWJGLGLFWKeycode.GLFW_KEY_4, LWJGLGLFWKeycode.GLFW_KEY_5, LWJGLGLFWKeycode.GLFW_KEY_6, LWJGLGLFWKeycode.GLFW_KEY_7, LWJGLGLFWKeycode.GLFW_KEY_8, LWJGLGLFWKeycode.GLFW_KEY_9}; @@ -72,7 +71,6 @@ public class BaseMainActivity extends LoggableActivity { private int guiScale; private DisplayMetrics displayMetrics; public boolean hiddenTextIgnoreUpdate = true; - public String hiddenTextContents = initText; private boolean isVirtualMouseEnabled; private LinearLayout touchPad; @@ -386,8 +384,7 @@ public class BaseMainActivity extends LoggableActivity { private boolean isTouchInHotbar = false; private int hotbarX, hotbarY; @Override - public boolean onTouch(View p1, MotionEvent e) - { + public boolean onTouch(View p1, MotionEvent e) { { int mptrIndex = -1; @@ -523,94 +520,7 @@ public class BaseMainActivity extends LoggableActivity { break; } } - -/* - int x = ((int) e.getX()) * scaleFactor; - int y = (minecraftGLView.getHeight() - ((int) e.getY())) * scaleFactor; - int hudKeyHandled = handleGuiBar(x, y, e); - if (!CallbackBridge.isGrabbing() && gestureDetector.onTouchEvent(e)) { - if (hudKeyHandled != -1) { - sendKeyPress(hudKeyHandled); - } else { - CallbackBridge.sendMouseEvent( - x, CallbackBridge.windowHeight - y, - rightOverride ? LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT : LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT - ); - if (!rightOverride) { - CallbackBridge.mouseLeft = true; - } - } - } else { - switch (e.getActionMasked()) { - case MotionEvent.ACTION_DOWN: // 0 - case MotionEvent.ACTION_POINTER_DOWN: // 5 - isTouchInHotbar = hudKeyHandled != -1; - if (isTouchInHotbar) { - sendKeyPress(hudKeyHandled, 0, true); - hotbarX = x; - hotbarY = y; - theHandler.sendEmptyMessageDelayed(MainActivity.MSG_DROP_ITEM_BUTTON_CHECK, LauncherPreferences.PREF_LONGPRESS_TRIGGER); - } else { - CallbackBridge.sendCursorPos(x, CallbackBridge.windowHeight - y); - - // if (!rightOverride) - // CallbackBridge.mouseLeft = true; - - - - if (CallbackBridge.isGrabbing()) { - CallbackBridge.sendMouseKeycode(rightOverride ? LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT : LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT, 0, true); - initialX = x; - initialY = y; - theHandler.sendEmptyMessageDelayed(MainActivity.MSG_LEFT_MOUSE_BUTTON_CHECK, LauncherPreferences.PREF_LONGPRESS_TRIGGER); - } - } - break; - case MotionEvent.ACTION_UP: // 1 - case MotionEvent.ACTION_CANCEL: // 3 - case MotionEvent.ACTION_POINTER_UP: // 6 - if (!isTouchInHotbar) { - CallbackBridge.sendCursorPos(x, CallbackBridge.windowHeight - y); - - // TODO uncomment after fix wrong trigger - // CallbackBridge.putMouseEventWithCoords(rightOverride ? (byte) 1 : (byte) 0, (byte) 0, x, y); - if (!rightOverride) { - // CallbackBridge.mouseLeft = false; - } - } - - if (CallbackBridge.isGrabbing()) { - // System.out.println((String) ("[Math.abs(" + initialX + " - " + x + ") = " + Math.abs(initialX - x) + "] < " + fingerStillThreshold)); - // System.out.println((String) ("[Math.abs(" + initialY + " - " + y + ") = " + Math.abs(initialY - y) + "] < " + fingerStillThreshold)); - if (isTouchInHotbar && Math.abs(hotbarX - x) < fingerStillThreshold && Math.abs(hotbarY - y) < fingerStillThreshold) { - sendKeyPress(hudKeyHandled, 0, false); - } else if (!triggeredLeftMouseButton && Math.abs(initialX - x) < fingerStillThreshold && Math.abs(initialY - y) < fingerStillThreshold) { - sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT, true); - sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT, false); - } - if (!isTouchInHotbar) { - if (triggeredLeftMouseButton) { - sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT, false); - } - triggeredLeftMouseButton = false; - theHandler.removeMessages(MainActivity.MSG_LEFT_MOUSE_BUTTON_CHECK); - } else { - sendKeyPress(LWJGLGLFWKeycode.GLFW_KEY_Q, 0, false); - theHandler.removeMessages(MSG_DROP_ITEM_BUTTON_CHECK); - } - } - break; - - default: - if (!isTouchInHotbar) { - CallbackBridge.sendCursorPos(x, CallbackBridge.windowHeight - y); - } - break; - - } - } - */ debugText.setText(CallbackBridge.DEBUG_STRING.toString()); CallbackBridge.DEBUG_STRING.setLength(0); From e2f35f3f6f8fd08ef6db240b2d693d7d40d6c8ef Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Fri, 30 Apr 2021 11:46:48 +0200 Subject: [PATCH 020/179] Clean some code --- .../customcontrols/ControlButton.java | 4 +-- .../customcontrols/ControlLayout.java | 26 +++++++------------ 2 files changed, 11 insertions(+), 19 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlButton.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlButton.java index 742b3ca25..7dce338f1 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlButton.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlButton.java @@ -271,8 +271,8 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp } } - public void setModifiable(boolean z) { - mModifiable = z; + public void setModifiable(boolean isModifiable) { + mModifiable = isModifiable; } private void setModified(boolean modified) { diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java index c71aa316d..3dee6dd7e 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java @@ -44,20 +44,12 @@ public class ControlLayout extends FrameLayout if (mModifiable) { hideAllHandleViews(); } - /*if (getChildAt(0) instanceof MinecraftGLView) { - View viewGL = getChildAt(0); - View viewTouchpad = getChildAt(1); - removeAllViews(); - addView(viewGL); - addView(viewTouchpad); - } else { - removeAllViews();*/ - removeAllButtons(); - //} - if (mLayout != null) { - mLayout.mControlDataList = null; - mLayout = null; - } + removeAllButtons(); + if(mLayout != null) { + mLayout.mControlDataList = null; + mLayout = null; + } + System.gc(); // Cleanup buttons only when input layout is null @@ -70,8 +62,8 @@ public class ControlLayout extends FrameLayout button.width = button.width / controlLayout.scaledAt * LauncherPreferences.PREF_BUTTONSIZE; button.height = button.height / controlLayout.scaledAt * LauncherPreferences.PREF_BUTTONSIZE; if (!button.isDynamicBtn) { - button.dynamicX = Float.toString(button.x / CallbackBridge.physicalWidth) + " * ${screen_width}"; - button.dynamicY = Float.toString(button.y / CallbackBridge.physicalHeight) + " * ${screen_height}"; + button.dynamicX = button.x / CallbackBridge.physicalWidth + " * ${screen_width}"; + button.dynamicY = button.y / CallbackBridge.physicalHeight + " * ${screen_height}"; } button.update(); addControlView(button); @@ -138,7 +130,7 @@ public class ControlLayout extends FrameLayout for (int i = 0; i < getChildCount(); i++) { View view = getChildAt(i); if (view instanceof ControlButton && ((ControlButton) view).getProperties().isHideable) { - ((ControlButton) view).setVisibility(mControlVisible ? View.VISIBLE : View.GONE); + view.setVisibility(mControlVisible ? View.VISIBLE : View.GONE); } } } From 5dee2524dfad74e8b76184791b5b55e38d6e7368 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Fri, 30 Apr 2021 11:51:22 +0200 Subject: [PATCH 021/179] Add ControlDrawer.java and ControlDrawerData.java --- .../customcontrols/ControlDrawer.java | 161 ++++++++++++++++++ .../customcontrols/ControlDrawerData.java | 74 ++++++++ 2 files changed, 235 insertions(+) create mode 100644 app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlDrawer.java create mode 100644 app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlDrawerData.java diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlDrawer.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlDrawer.java new file mode 100644 index 000000000..9cee537b7 --- /dev/null +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlDrawer.java @@ -0,0 +1,161 @@ +package net.kdt.pojavlaunch.customcontrols; + +import android.content.Context; +import android.util.Log; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; + +import java.util.ArrayList; + + + +public class ControlDrawer extends ControlButton { + + + public ArrayList buttons; + public ControlDrawerData drawerData; + public ControlLayout mLayout; + private boolean areButtonsVisible = false; + + + public ControlDrawer(ControlLayout layout, ControlDrawerData drawerData) { + super(layout, drawerData.properties); + + buttons = new ArrayList<>(/*drawerData.buttonProperties.size()*/); + mLayout = layout; + this.drawerData = drawerData; + + + //Filter unwanted values before instantiating the button + for(int i=0; i < buttons.size(); ++i){ + drawerData.buttonProperties.set(i, filterProperties(drawerData.buttonProperties.get(i))); + + addButton(drawerData.buttonProperties.get(i)); + } + + } + + + + private ControlData filterProperties(ControlData properties){ + properties.isDynamicBtn = false; + properties.width = drawerData.properties.width; + properties.height = drawerData.properties.height; + + return properties; + } + + + public void addButton(ControlData properties){ + addButton(new ControlSubButton(mLayout, properties, this)); + } + + public void addButton(ControlSubButton button){ + buttons.add(button); + setControlButtonVisibility(button, mModifiable || areButtonsVisible); + syncButtons(); + } + + private void setControlButtonVisibility(ControlButton button, boolean isVisible){ + button.setVisibility(isVisible ? VISIBLE : GONE); + } + + private void switchButtonVisibility(){ + areButtonsVisible = !areButtonsVisible; + int visibility = areButtonsVisible ? View.VISIBLE : View.GONE; + for(ControlButton button : buttons){ + button.setVisibility(visibility); + } + } + + + @Override + public boolean onTouchEvent(MotionEvent event) { + if(!mModifiable){ + switch (event.getActionMasked()){ + case MotionEvent.ACTION_UP: // 1 + case MotionEvent.ACTION_POINTER_UP: // 6 + switchButtonVisibility(); + break; + } + + return true; + } + + boolean isHandled = super.onTouchEvent(event); + //syncButtons(); + return isHandled; + } + + //Syncing stuff + private void alignButtons(){ + + if(buttons == null) return; + for(int i=0; i < buttons.size(); ++i){ + switch (drawerData.orientation){ + case RIGHT: + buttons.get(i).setTranslationX( (drawerData.properties.x + drawerData.properties.width) + drawerData.properties.width*i ); + buttons.get(i).setTranslationY(drawerData.properties.y); + break; + + case LEFT: + buttons.get(i).setTranslationX( (drawerData.properties.x - drawerData.properties.width) - drawerData.properties.width*i ); + buttons.get(i).setTranslationY(drawerData.properties.y); + break; + + case UP: + buttons.get(i).setTranslationY( (drawerData.properties.y - drawerData.properties.height) - drawerData.properties.height*i ); + buttons.get(i).setTranslationX(drawerData.properties.x); + break; + + case DOWN: + buttons.get(i).setTranslationY( (drawerData.properties.y + drawerData.properties.height) + drawerData.properties.height*i ); + buttons.get(i).setTranslationX(drawerData.properties.x); + break; + } + buttons.get(i).updateProperties(); + } + } + + + private void resizeButtons(){ + if (buttons == null) return; + for(ControlSubButton subButton : buttons){ + subButton.mProperties.width = mProperties.width; + subButton.mProperties.height = mProperties.height; + + subButton.updateProperties(); + } + } + + private void syncButtons(){ + alignButtons(); + resizeButtons(); + } + + @Override + public void setTranslationX(float x) { + super.setTranslationX(x); + alignButtons(); + } + + @Override + public void setTranslationY(float y) { + super.setTranslationY(y); + alignButtons(); + } + + @Override + public void setLayoutParams(ViewGroup.LayoutParams params) { + super.setLayoutParams(params); + syncButtons(); + } + + //Getters + public ControlDrawerData getDrawerData() { + return drawerData; + } +} diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlDrawerData.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlDrawerData.java new file mode 100644 index 000000000..5e3072f66 --- /dev/null +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlDrawerData.java @@ -0,0 +1,74 @@ +package net.kdt.pojavlaunch.customcontrols; + +import java.util.ArrayList; + +import static net.kdt.pojavlaunch.customcontrols.ControlDrawerData.Orientation.DOWN; +import static net.kdt.pojavlaunch.customcontrols.ControlDrawerData.Orientation.LEFT; +import static net.kdt.pojavlaunch.customcontrols.ControlDrawerData.Orientation.RIGHT; +import static net.kdt.pojavlaunch.customcontrols.ControlDrawerData.Orientation.UP; + +public class ControlDrawerData { + + public ArrayList buttonProperties; + public ControlData properties; + public Orientation orientation; + + public enum Orientation { + DOWN, + LEFT, + UP, + RIGHT + } + + public static Orientation[] getOrientations(){ + return new Orientation[]{DOWN,LEFT,UP,RIGHT}; + } + + public static int orientationToInt(Orientation orientation){ + switch (orientation){ + case DOWN: + return 0; + case LEFT: + return 1; + case UP: + return 2; + case RIGHT: + return 3; + } + return -1; + } + + public static Orientation intToOrientation(int by){ + switch (by){ + case 0: + return Orientation.DOWN; + case 1: + return Orientation.LEFT; + case 2: + return Orientation.UP; + case 3: + return RIGHT; + } + return null; + } + + public ControlDrawerData(){ + this(new ArrayList<>()); + } + + public ControlDrawerData(ArrayList buttonProperties){ + this(buttonProperties, new ControlData()); + } + + public ControlDrawerData(ArrayList buttonProperties, ControlData properties){ + this(buttonProperties, properties, Orientation.LEFT); + } + + + public ControlDrawerData(ArrayList buttonProperties, ControlData properties, Orientation orientation){ + this.buttonProperties = buttonProperties; + this.properties = properties; + this.orientation = orientation; + } + +} From 430392deac3caed98ddba2f5767154bee5bf7ae8 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Fri, 30 Apr 2021 11:52:51 +0200 Subject: [PATCH 022/179] Add ConstrolSubButton --- .../customcontrols/ControlSubButton.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlSubButton.java diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlSubButton.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlSubButton.java new file mode 100644 index 000000000..e515a0658 --- /dev/null +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlSubButton.java @@ -0,0 +1,24 @@ +package net.kdt.pojavlaunch.customcontrols; + +public class ControlSubButton extends ControlButton { + + public ControlDrawer parentDrawer; + + public ControlSubButton(ControlLayout layout, ControlData properties, ControlDrawer parentDrawer) { + super(layout, properties); + this.parentDrawer = parentDrawer; + filterProperties(); + } + + private void filterProperties(){ + mProperties.height = parentDrawer.getProperties().height; + mProperties.width = parentDrawer.getProperties().width; + mProperties.isDynamicBtn = false; + + setProperties(mProperties, false); + } + + + + +} From e9a63ae9f6be517b93c01d2e5729a77f43dbb91f Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Fri, 30 Apr 2021 11:53:32 +0200 Subject: [PATCH 023/179] Add ControlDrawer in CustomControls --- .../kdt/pojavlaunch/customcontrols/CustomControls.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/CustomControls.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/CustomControls.java index 00bf24007..1e99f252e 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/CustomControls.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/CustomControls.java @@ -9,12 +9,16 @@ public class CustomControls { public float scaledAt; public List mControlDataList; + public List mDrawerDataList; public CustomControls() { - this(new ArrayList()); + this(new ArrayList(), new ArrayList()); } - - public CustomControls(List mControlDataList) { + + + + public CustomControls(List mControlDataList, List mDrawerDataList) { this.mControlDataList = mControlDataList; + this.mDrawerDataList = mDrawerDataList; this.scaledAt = 100f; } From 77248316d6792b04abb666bfaa5843cefa9e769e Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Fri, 30 Apr 2021 11:54:56 +0200 Subject: [PATCH 024/179] Add xml files for the various buttons --- .../res/layout/control_drawer_setting.xml | 262 +++++++++++++++++ .../main/res/layout/control_setting_v2.xml | 6 +- .../main/res/layout/control_sub_button.xml | 267 ++++++++++++++++++ 3 files changed, 533 insertions(+), 2 deletions(-) create mode 100644 app_pojavlauncher/src/main/res/layout/control_drawer_setting.xml create mode 100644 app_pojavlauncher/src/main/res/layout/control_sub_button.xml diff --git a/app_pojavlauncher/src/main/res/layout/control_drawer_setting.xml b/app_pojavlauncher/src/main/res/layout/control_drawer_setting.xml new file mode 100644 index 000000000..80981f709 --- /dev/null +++ b/app_pojavlauncher/src/main/res/layout/control_drawer_setting.xml @@ -0,0 +1,262 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app_pojavlauncher/src/main/res/layout/control_setting_v2.xml b/app_pojavlauncher/src/main/res/layout/control_setting_v2.xml index f7acb6cc1..8f5a72af0 100644 --- a/app_pojavlauncher/src/main/res/layout/control_setting_v2.xml +++ b/app_pojavlauncher/src/main/res/layout/control_setting_v2.xml @@ -39,7 +39,8 @@ + android:orientation="horizontal" + android:id="@+id/controlsetting_layout_size"> + android:orientation="horizontal" + android:id="@+id/controlsetting_layout_mapping"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From b365d8ff847e4b4da1bc7f6b818d762fc6d13f53 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Fri, 30 Apr 2021 11:57:12 +0200 Subject: [PATCH 025/179] Modified ControlButton to be more extensible. Add support for new properties. Deprecated property *hidden* removed --- .../customcontrols/ControlButton.java | 56 ++++++++++++------- .../customcontrols/ControlData.java | 2 - 2 files changed, 35 insertions(+), 23 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlButton.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlButton.java index 7dce338f1..3b232d900 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlButton.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlButton.java @@ -17,14 +17,14 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp { private Paint mRectPaint; - private GestureDetector mGestureDetector; - private ControlData mProperties; - private SelectionEndHandleView mHandleView; + protected GestureDetector mGestureDetector; + protected ControlData mProperties; + protected SelectionEndHandleView mHandleView; - private boolean mModifiable = false; - private boolean mCanTriggerLongClick = true; - - private boolean mChecked = false; + protected boolean mModifiable = false; + protected boolean mCanTriggerLongClick = true; + + protected boolean mChecked = false; public ControlButton(ControlLayout layout, ControlData properties) { super(layout.getContext()); @@ -61,7 +61,6 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp public void setProperties(ControlData properties, boolean changePos) { mProperties = properties; - mProperties.opacity = mProperties.hidden ? 1 : mProperties.opacity; properties.update(); @@ -73,13 +72,6 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp setTranslationY(moveY = properties.y); } - GradientDrawable gd = new GradientDrawable(); - gd.setColor(mProperties.bgColor); - gd.setStroke(mProperties.strokeWidth, mProperties.strokeColor); - gd.setCornerRadius(mProperties.cornerRadius); - setBackground(gd); - - if (properties.specialButtonListener == null) { // A non-special button or inside custom controls screen so skip listener } else if (properties.specialButtonListener instanceof View.OnClickListener) { @@ -97,12 +89,33 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp setLayoutParams(new FrameLayout.LayoutParams((int) properties.width, (int) properties.height)); } + public void setBackground(){ + GradientDrawable gd = new GradientDrawable(); + gd.setColor(mProperties.bgColor); + gd.setStroke(computeStrokeWidth(mProperties.strokeWidth), mProperties.strokeColor); + gd.setCornerRadius(computeCornerRadius(mProperties.cornerRadius)); + + setBackground(gd); + } + + public int computeStrokeWidth(float widthInPercent){ + float maxSize = Math.max(mProperties.width, mProperties.height); + return (int)((maxSize/2) * (widthInPercent/100)); + } + + public float computeCornerRadius(float radiusInPercent){ + float minSize = Math.min(mProperties.width, mProperties.height); + return (minSize/2) * (radiusInPercent/100); + } + @Override public void setLayoutParams(ViewGroup.LayoutParams params) { super.setLayoutParams(params); mProperties.width = params.width; mProperties.height = params.height; + setBackground(); + // Re-calculate position mProperties.update(); @@ -147,7 +160,7 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp } @Override - public boolean onLongClick(View p1) { + public boolean onLongClick(View v) { if (mCanTriggerLongClick && mModifiable) { if (mHandleView.isShowing()) { mHandleView.hide(); @@ -157,7 +170,7 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp } try { - mHandleView.show(); + mHandleView.show(this); } catch (Throwable th) { th.printStackTrace(); } @@ -166,7 +179,8 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp return mCanTriggerLongClick; } - + + private void setHolding(boolean isDown) { if (mProperties.holdAlt) { CallbackBridge.holdingAlt = isDown; @@ -191,8 +205,8 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp } } - private float moveX, moveY; - private float downX, downY; + protected float moveX, moveY; + protected float downX, downY; @Override public boolean onTouchEvent(MotionEvent event) { if (!mModifiable) { @@ -261,7 +275,7 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp return super.onTouchEvent(event); } - private void sendKeyPresses(MotionEvent event, boolean isDown){ + public void sendKeyPresses(MotionEvent event, boolean isDown){ for(int keycode : mProperties.keycodes){ if(keycode >= 0){ MainActivity.sendKeyPress(keycode, CallbackBridge.getCurrentMods(), isDown); diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java index 15d495970..952a09aac 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java @@ -79,8 +79,6 @@ public class ControlData implements Cloneable public int strokeWidth; public float cornerRadius; - @Deprecated - public boolean hidden; public boolean holdCtrl; public boolean holdAlt; public boolean holdShift; From 0a19daae5ce6058d08fbbe4a9037aa9d253a8187 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Fri, 30 Apr 2021 11:57:40 +0200 Subject: [PATCH 026/179] Add button editing classes --- .../handleview/ActionPopupWindow.java | 349 +++--------------- .../handleview/EditControlButtonPopup.java | 313 ++++++++++++++++ .../handleview/EditControlDrawerPopup.java | 261 +++++++++++++ .../handleview/EditControlSubButtonPopup.java | 263 +++++++++++++ 4 files changed, 880 insertions(+), 306 deletions(-) create mode 100644 app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java create mode 100644 app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlDrawerPopup.java create mode 100644 app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlSubButtonPopup.java diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/ActionPopupWindow.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/ActionPopupWindow.java index b0de6bb81..7f1b16854 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/ActionPopupWindow.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/ActionPopupWindow.java @@ -21,8 +21,8 @@ package net.kdt.pojavlaunch.customcontrols.handleview; import android.app.Dialog; import android.content.*; -import android.graphics.Color; import android.graphics.drawable.ColorDrawable; +import android.util.Log; import android.view.*; import android.view.ViewGroup.*; import android.widget.*; @@ -36,48 +36,15 @@ import androidx.appcompat.app.*; import com.rarepebble.colorpicker.ColorPickerView; public class ActionPopupWindow extends PinnedPopupWindow implements OnClickListener { + private TextView mEditTextView; private TextView mDeleteTextView; - private AlertDialog.Builder alertBuilder; - private Dialog dialog; + private Object editedButton; - private EditText editName; - private Spinner[] spinnersKeycode; - - private CheckBox checkToggle; - private CheckBox checkPassThrough; - private CheckBox checkDynamicPosition; - private CheckBox checkHoldAlt; - private CheckBox checkHoldCtrl; - private CheckBox checkHoldShift; - - private EditText editWidth; - private EditText editHeight; - private EditText editDynamicX; - private EditText editDynamicY; - - private SeekBar seekBarOpacity; - private SeekBar seekBarCornerRadius; - private SeekBar seekBarStrokeWidth; - - private ImageButton buttonBackgroundColor; - private ImageButton buttonStrokeColor; - - private TextView textOpacity; - private TextView textCornerRadius; - private TextView textStrokeWidth; - - private ControlData properties; - - private ArrayAdapter adapter; - private String[] specialArr; - - - - - public ActionPopupWindow(HandleView handleView) { + public ActionPopupWindow(HandleView handleView, Object object){ super(handleView); + this.editedButton = object; } @Override @@ -119,26 +86,46 @@ public class ActionPopupWindow extends PinnedPopupWindow implements OnClickListe @Override public void onClick(final View view) { - alertBuilder = new AlertDialog.Builder(view.getContext()); - alertBuilder.setCancelable(false); - - - - if (view == mEditTextView) { - properties = mHandleView.mView.getProperties(); - initializeEditDialog(view.getContext()); + + if(editedButton instanceof ControlSubButton){ + new EditControlSubButtonPopup((ControlSubButton) editedButton); + return; + } + + if(editedButton instanceof ControlDrawer){ + new EditControlDrawerPopup((ControlDrawer) editedButton); + return; + } + + if(editedButton instanceof ControlButton){ + new EditControlButtonPopup((ControlButton) editedButton); + return; + } - - - - dialog.show(); } else if (view == mDeleteTextView) { + AlertDialog.Builder alertBuilder = new AlertDialog.Builder(view.getContext()); + alertBuilder.setCancelable(false); alertBuilder.setMessage(view.getContext().getString(R.string.customctrl_remove, mHandleView.mView.getText()) + "?"); alertBuilder.setPositiveButton(R.string.global_remove, (p1, p2) -> { ControlLayout layout = ((ControlLayout) mHandleView.mView.getParent()); + + if(editedButton instanceof ControlSubButton){ + layout.removeControlSubButton((ControlSubButton) editedButton); + return; + } + + if(editedButton instanceof ControlDrawer){ + layout.removeControlDrawer((ControlDrawer) editedButton); + return; + } + + if(editedButton instanceof ControlButton){ + layout.removeControlButton((ControlButton) editedButton); + } + layout.removeControlButton(mHandleView.mView); }); alertBuilder.setNegativeButton(android.R.string.cancel, null); @@ -163,272 +150,22 @@ public class ActionPopupWindow extends PinnedPopupWindow implements OnClickListe return positionY; } - private void initializeEditDialog(Context ctx){ - //Create the editing dialog - LayoutInflater layoutInflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - View v = layoutInflater.inflate(R.layout.control_setting_v2,null); - alertBuilder.setTitle(ctx.getResources().getString(R.string.customctrl_edit, mHandleView.mView.getText())); - alertBuilder.setView(v); - - //Linking a lot of stuff - editName = v.findViewById(R.id.controlsetting_edit_name); - - spinnersKeycode = new Spinner[]{ - v.findViewById(R.id.controlsetting_spinner_lwjglkeycode), - v.findViewById(R.id.controlsetting_spinner_lwjglkeycode2), - v.findViewById(R.id.controlsetting_spinner_lwjglkeycode3), - v.findViewById(R.id.controlsetting_spinner_lwjglkeycode4) - }; - checkToggle = v.findViewById(R.id.controlsetting_checkbox_toggle); - checkPassThrough = v.findViewById(R.id.controlsetting_checkbox_passthru); - - editWidth = v.findViewById(R.id.controlsetting_edit_width); - editHeight = v.findViewById(R.id.controlsetting_edit_height); - - editDynamicX = v.findViewById(R.id.controlsetting_edit_dynamicpos_x); - editDynamicY = v.findViewById(R.id.controlsetting_edit_dynamicpos_y); - - seekBarOpacity = v.findViewById(R.id.controlsetting_seek_opacity); - seekBarCornerRadius = v.findViewById(R.id.controlsetting_seek_corner_radius); - seekBarStrokeWidth = v.findViewById(R.id.controlsetting_seek_stroke_width); - - //Add listeners, too bad I don't need all the methods - seekBarOpacity.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { - @Override - public void onProgressChanged(SeekBar seekBar, int i, boolean b) { - setPercentageText(textOpacity, i); - } - - @Override - public void onStartTrackingTouch(SeekBar seekBar) { - //AUTO GENERATED STUN - } - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - //AUTO GENERATED STUN - } - }); - - seekBarCornerRadius.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { - @Override - public void onProgressChanged(SeekBar seekBar, int i, boolean b) { - setPercentageText(textCornerRadius, i); - } - - @Override - public void onStartTrackingTouch(SeekBar seekBar) { - //AUTO GENERATED STUN - } - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - //AUTO GENERATED STUN - } - }); - - seekBarStrokeWidth.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { - @Override - public void onProgressChanged(SeekBar seekBar, int i, boolean b) { - setPercentageText(textStrokeWidth, i); - } - - @Override - public void onStartTrackingTouch(SeekBar seekBar) { - //AUTO GENERATED STUN - } - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - //AUTO GENERATED STUN - } - }); - - buttonBackgroundColor = v.findViewById(R.id.controlsetting_background_color); - buttonStrokeColor = v.findViewById(R.id.controlsetting_stroke_color); - - textOpacity = v.findViewById(R.id.controlsetting_text_opacity); - textCornerRadius = v.findViewById(R.id.controlsetting_text_corner_radius); - textStrokeWidth = v.findViewById(R.id.controlsetting_text_stroke_width); - - checkDynamicPosition = v.findViewById(R.id.controlsetting_checkbox_dynamicpos); - checkDynamicPosition.setOnCheckedChangeListener((btn, checked) -> { - editDynamicX.setEnabled(checked); - editDynamicY.setEnabled(checked); - }); - - - checkHoldAlt = v.findViewById(R.id.controlsetting_checkbox_keycombine_alt); - checkHoldCtrl = v.findViewById(R.id.controlsetting_checkbox_keycombine_control); - checkHoldShift = v.findViewById(R.id.controlsetting_checkbox_keycombine_shift); - - //Initialize adapter for keycodes - adapter= new ArrayAdapter(ctx, android.R.layout.simple_spinner_item); - String[] oldSpecialArr = ControlData.buildSpecialButtonArray(); - specialArr = new String[oldSpecialArr.length]; - for (int i = 0; i < specialArr.length; i++) { - specialArr[i] = "SPECIAL_" + oldSpecialArr[specialArr.length - i - 1]; - } - adapter.addAll(specialArr); - adapter.addAll(AndroidLWJGLKeycode.generateKeyName()); - adapter.setDropDownViewResource(android.R.layout.simple_list_item_single_choice); - - for (Spinner spinner : spinnersKeycode) { - spinner.setAdapter(adapter); - } - - //Set color imageButton behavior - buttonBackgroundColor.setOnClickListener(view -> showBackgroundColorPicker(view.getContext())); - buttonStrokeColor.setOnClickListener(view -> showStrokeColorPicker(view.getContext())); - - //Set dialog buttons behavior - alertBuilder.setPositiveButton(android.R.string.ok, (dialogInterface1, i) -> { - if(!hasErrors(dialog.getContext())){ - saveProperties(); - } - }); - alertBuilder.setNegativeButton(android.R.string.cancel, null); - - //Create the finalized dialog - dialog = alertBuilder.create(); - - dialog.setOnShowListener(dialogInterface -> { - setEditDialogValues(); - }); - - } - - private void setEditDialogValues(){ - - editName.setText(properties.name); - - checkToggle.setChecked(properties.isToggle); - checkPassThrough.setChecked(properties.passThruEnabled); - - editWidth.setText(Float.toString(properties.width)); - editHeight.setText(Float.toString(properties.height)); - - editDynamicX.setEnabled(properties.isDynamicBtn); - editDynamicY.setEnabled(properties.isDynamicBtn); - editDynamicX.setHint(Float.toString(properties.x)); - editDynamicX.setText(properties.dynamicX); - editDynamicY.setHint(Float.toString(properties.y)); - editDynamicY.setText(properties.dynamicY); - - seekBarOpacity.setProgress(properties.hidden ? 0 : (int)properties.opacity*100); - seekBarStrokeWidth.setProgress(properties.strokeWidth); - seekBarCornerRadius.setProgress((int)properties.cornerRadius); - - buttonBackgroundColor.setBackgroundColor(properties.bgColor); - buttonStrokeColor.setBackgroundColor(properties.strokeColor); - - setPercentageText(textCornerRadius,seekBarCornerRadius.getProgress()); - setPercentageText(textOpacity,seekBarOpacity.getProgress()); - setPercentageText(textStrokeWidth,seekBarStrokeWidth.getProgress()); - - checkHoldAlt.setChecked(properties.holdAlt); - checkHoldCtrl.setChecked(properties.holdCtrl); - checkHoldShift.setChecked(properties.holdShift); - checkDynamicPosition.setChecked(properties.isDynamicBtn); - - for(int i=0; i< properties.keycodes.length; i++){ - if (properties.keycodes[i] < 0) { - spinnersKeycode[i].setSelection(properties.keycodes[i] + specialArr.length); - } else { - spinnersKeycode[i].setSelection(AndroidLWJGLKeycode.getIndexByLWJGLKey(properties.keycodes[i]) + specialArr.length); - } - } - } - - private void saveProperties(){ - //TODO save new properties - //This method assumes there are no error. - properties.name = editName.getText().toString(); - - //Keycodes - for(int i=0; i buttonBackgroundColor.setBackgroundColor(picker.getColor())); + dialog.setPositiveButton(android.R.string.ok, (dialogInterface, i) -> v.setBackgroundColor(picker.getColor())); dialog.show(); } - private void showStrokeColorPicker(Context ctx){ - ColorPickerView picker = new ColorPickerView(ctx); - picker.setColor(((ColorDrawable)buttonStrokeColor.getBackground()).getColor()); - picker.showAlpha(false); - - AlertDialog.Builder dialog = new AlertDialog.Builder(ctx); - dialog.setTitle("Edit stroke color"); - dialog.setView(picker); - dialog.setNegativeButton(android.R.string.cancel, null); - dialog.setPositiveButton(android.R.string.ok, (dialogInterface, i) -> buttonStrokeColor.setBackgroundColor(picker.getColor())); - - dialog.show(); - } - - private void setPercentageText(TextView textView, int progress){ + public static void setPercentageText(TextView textView, int progress){ textView.setText(progress + " %"); } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java new file mode 100644 index 000000000..e98a6a2bd --- /dev/null +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java @@ -0,0 +1,313 @@ +package net.kdt.pojavlaunch.customcontrols.handleview; + +import android.app.Dialog; +import android.content.Context; +import android.content.DialogInterface; +import android.graphics.drawable.ColorDrawable; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.ArrayAdapter; +import android.widget.CheckBox; +import android.widget.EditText; +import android.widget.ImageButton; +import android.widget.SeekBar; +import android.widget.Spinner; +import android.widget.TextView; + +import androidx.appcompat.app.AlertDialog; + +import net.kdt.pojavlaunch.AndroidLWJGLKeycode; +import net.kdt.pojavlaunch.R; +import net.kdt.pojavlaunch.customcontrols.ControlButton; +import net.kdt.pojavlaunch.customcontrols.ControlData; + +import static net.kdt.pojavlaunch.customcontrols.handleview.ActionPopupWindow.setPercentageText; + +public class EditControlButtonPopup { + + private Dialog dialog; + + private EditText editName; + private Spinner[] spinnersKeycode; + + private CheckBox checkToggle; + private CheckBox checkPassThrough; + private CheckBox checkDynamicPosition; + private CheckBox checkHoldAlt; + private CheckBox checkHoldCtrl; + private CheckBox checkHoldShift; + + private EditText editWidth; + private EditText editHeight; + private EditText editDynamicX; + private EditText editDynamicY; + + private SeekBar seekBarOpacity; + private SeekBar seekBarCornerRadius; + private SeekBar seekBarStrokeWidth; + + private ImageButton buttonBackgroundColor; + private ImageButton buttonStrokeColor; + + private TextView textOpacity; + private TextView textCornerRadius; + private TextView textStrokeWidth; + + private final ControlButton button; + private final ControlData properties; + + private ArrayAdapter adapter; + private String[] specialArr; + + + public EditControlButtonPopup(ControlButton button){ + this.button = button; + this.properties = button.getProperties(); + + initializeEditDialog(button.getContext()); + setEditDialogValues(); + + dialog.show(); + } + + + public void initializeEditDialog(Context ctx){ + //Create the editing dialog + LayoutInflater layoutInflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + View v = layoutInflater.inflate(R.layout.control_setting_v2,null); + + AlertDialog.Builder alertBuilder = new AlertDialog.Builder(ctx); + alertBuilder.setTitle(ctx.getResources().getString(R.string.customctrl_edit, properties.name)); + alertBuilder.setView(v); + + //Linking a lot of stuff + editName = v.findViewById(R.id.controlsetting_edit_name); + + spinnersKeycode = new Spinner[]{ + v.findViewById(R.id.controlsetting_spinner_lwjglkeycode), + v.findViewById(R.id.controlsetting_spinner_lwjglkeycode2), + v.findViewById(R.id.controlsetting_spinner_lwjglkeycode3), + v.findViewById(R.id.controlsetting_spinner_lwjglkeycode4) + }; + + checkToggle = v.findViewById(R.id.controlsetting_checkbox_toggle); + checkPassThrough = v.findViewById(R.id.controlsetting_checkbox_passthru); + + editWidth = v.findViewById(R.id.controlsetting_edit_width); + editHeight = v.findViewById(R.id.controlsetting_edit_height); + + editDynamicX = v.findViewById(R.id.controlsetting_edit_dynamicpos_x); + editDynamicY = v.findViewById(R.id.controlsetting_edit_dynamicpos_y); + + seekBarOpacity = v.findViewById(R.id.controlsetting_seek_opacity); + seekBarCornerRadius = v.findViewById(R.id.controlsetting_seek_corner_radius); + seekBarStrokeWidth = v.findViewById(R.id.controlsetting_seek_stroke_width); + + //Add listeners, too bad I don't need all the methods + seekBarOpacity.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + @Override + public void onProgressChanged(SeekBar seekBar, int i, boolean b) { + setPercentageText(textOpacity, i); + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + //AUTO GENERATED STUB + } + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + //AUTO GENERATED STUB + } + }); + + seekBarCornerRadius.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + @Override + public void onProgressChanged(SeekBar seekBar, int i, boolean b) { + setPercentageText(textCornerRadius, i); + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + //AUTO GENERATED STUB + } + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + //AUTO GENERATED STUB + } + }); + + seekBarStrokeWidth.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + @Override + public void onProgressChanged(SeekBar seekBar, int i, boolean b) { + setPercentageText(textStrokeWidth, i); + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + //AUTO GENERATED STUB + } + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + //AUTO GENERATED STUB + } + }); + + buttonBackgroundColor = v.findViewById(R.id.controlsetting_background_color); + buttonStrokeColor = v.findViewById(R.id.controlsetting_stroke_color); + + textOpacity = v.findViewById(R.id.controlsetting_text_opacity); + textCornerRadius = v.findViewById(R.id.controlsetting_text_corner_radius); + textStrokeWidth = v.findViewById(R.id.controlsetting_text_stroke_width); + + checkDynamicPosition = v.findViewById(R.id.controlsetting_checkbox_dynamicpos); + checkDynamicPosition.setOnCheckedChangeListener((btn, checked) -> { + editDynamicX.setEnabled(checked); + editDynamicY.setEnabled(checked); + }); + + + checkHoldAlt = v.findViewById(R.id.controlsetting_checkbox_keycombine_alt); + checkHoldCtrl = v.findViewById(R.id.controlsetting_checkbox_keycombine_control); + checkHoldShift = v.findViewById(R.id.controlsetting_checkbox_keycombine_shift); + + //Initialize adapter for keycodes + adapter = new ArrayAdapter<>(ctx, android.R.layout.simple_spinner_item); + String[] oldSpecialArr = ControlData.buildSpecialButtonArray(); + specialArr = new String[oldSpecialArr.length]; + for (int i = 0; i < specialArr.length; i++) { + specialArr[i] = "SPECIAL_" + oldSpecialArr[specialArr.length - i - 1]; + } + adapter.addAll(specialArr); + adapter.addAll(AndroidLWJGLKeycode.generateKeyName()); + adapter.setDropDownViewResource(android.R.layout.simple_list_item_single_choice); + + for (Spinner spinner : spinnersKeycode) { + spinner.setAdapter(adapter); + } + + //Set color imageButton behavior + buttonBackgroundColor.setOnClickListener(view -> ActionPopupWindow.showColorPicker(ctx, "Edit background color", true, ((ColorDrawable) buttonBackgroundColor.getBackground()).getColor(), buttonBackgroundColor)); + buttonStrokeColor.setOnClickListener(view -> ActionPopupWindow.showColorPicker(ctx, "Edit stroke color", false, ((ColorDrawable) buttonStrokeColor.getBackground()).getColor(), buttonStrokeColor)); + + + //Set dialog buttons behavior + alertBuilder.setPositiveButton(android.R.string.ok, (dialogInterface1, i) -> { + if(!hasPropertiesErrors(dialog.getContext())){ + saveProperties(); + } + }); + alertBuilder.setNegativeButton(android.R.string.cancel, null); + + //Create the finalized dialog + dialog = alertBuilder.create(); + + dialog.setOnShowListener(dialogInterface -> { + //setEditDialogValues(); + }); + + } + + private void setEditDialogValues(){ + + editName.setText(properties.name); + + checkToggle.setChecked(properties.isToggle); + checkPassThrough.setChecked(properties.passThruEnabled); + + editWidth.setText(Float.toString(properties.width)); + editHeight.setText(Float.toString(properties.height)); + + editDynamicX.setEnabled(properties.isDynamicBtn); + editDynamicY.setEnabled(properties.isDynamicBtn); + editDynamicX.setHint(Float.toString(properties.x)); + editDynamicX.setText(properties.dynamicX); + editDynamicY.setHint(Float.toString(properties.y)); + editDynamicY.setText(properties.dynamicY); + + seekBarOpacity.setProgress((int) (properties.opacity*100)); + seekBarStrokeWidth.setProgress(properties.strokeWidth); + seekBarCornerRadius.setProgress((int)properties.cornerRadius); + + buttonBackgroundColor.setBackgroundColor(properties.bgColor); + buttonStrokeColor.setBackgroundColor(properties.strokeColor); + + setPercentageText(textCornerRadius,seekBarCornerRadius.getProgress()); + setPercentageText(textOpacity,seekBarOpacity.getProgress()); + setPercentageText(textStrokeWidth,seekBarStrokeWidth.getProgress()); + + checkHoldAlt.setChecked(properties.holdAlt); + checkHoldCtrl.setChecked(properties.holdCtrl); + checkHoldShift.setChecked(properties.holdShift); + checkDynamicPosition.setChecked(properties.isDynamicBtn); + + for(int i=0; i< properties.keycodes.length; i++){ + if (properties.keycodes[i] < 0) { + spinnersKeycode[i].setSelection(properties.keycodes[i] + specialArr.length); + } else { + spinnersKeycode[i].setSelection(AndroidLWJGLKeycode.getIndexByLWJGLKey(properties.keycodes[i]) + specialArr.length); + } + } + } + + + private boolean hasPropertiesErrors(Context ctx){ + if (editName.getText().toString().isEmpty()) { + editName.setError(ctx.getResources().getString(R.string.global_error_field_empty)); + return true; + } + + if (properties.isDynamicBtn) { + + int errorAt = 0; + try { + properties.insertDynamicPos(editDynamicX.getText().toString()); + errorAt = 1; + properties.insertDynamicPos(editDynamicY.getText().toString()); + } catch (Throwable th) { + (errorAt == 0 ? editDynamicX : editDynamicY).setError(th.getMessage()); + + return true; + } + } + + return false; + } + + private void saveProperties(){ + //This method assumes there are no error. + properties.name = editName.getText().toString(); + + //Keycodes + for(int i=0; i { + editDynamicX.setEnabled(checked); + editDynamicY.setEnabled(checked); + }); + + ArrayAdapter adapter = new ArrayAdapter<>(ctx, android.R.layout.simple_spinner_item); + adapter.addAll(ControlDrawerData.getOrientations()); + adapter.setDropDownViewResource(android.R.layout.simple_list_item_single_choice); + + spinnerOrientation.setAdapter(adapter); + + //Set color imageButton behavior + buttonBackgroundColor.setOnClickListener(view -> ActionPopupWindow.showColorPicker(ctx, "Edit background color", true, ((ColorDrawable) buttonBackgroundColor.getBackground()).getColor(), buttonBackgroundColor)); + buttonStrokeColor.setOnClickListener(view -> ActionPopupWindow.showColorPicker(ctx, "Edit stroke color", false, ((ColorDrawable) buttonStrokeColor.getBackground()).getColor(), buttonStrokeColor)); + + //Set dialog buttons behavior + alertBuilder.setNegativeButton(android.R.string.cancel, null); + alertBuilder.setPositiveButton(android.R.string.ok, (dialogInterface1, i) -> { + if(!hasPropertiesErrors(dialog.getContext())){ + saveProperties(); + } + }); + + alertBuilder.setNeutralButton("Add sub-button", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + //TODO add a button; + ControlLayout layout = (ControlLayout) drawer.getParent(); + layout.addSubButton(drawer, new ControlData()); + + } + }); + + + //Create the finalized dialog + dialog = alertBuilder.create(); + } //initializeEditDialog + + private void setEditDialogValues() { + editName.setText(drawerData.properties.name); + + spinnerOrientation.setSelection(ControlDrawerData.orientationToInt(drawerData.orientation)); + + editWidth.setText(Float.toString(drawerData.properties.width)); + editHeight.setText(Float.toString(drawerData.properties.height)); + + editDynamicX.setEnabled(drawerData.properties.isDynamicBtn); + editDynamicY.setEnabled(drawerData.properties.isDynamicBtn); + editDynamicX.setHint(Float.toString(drawerData.properties.x)); + editDynamicX.setText(drawerData.properties.dynamicX); + editDynamicY.setHint(Float.toString(drawerData.properties.y)); + editDynamicY.setText(drawerData.properties.dynamicY); + + seekBarOpacity.setProgress((int)drawerData.properties.opacity*100); + seekBarStrokeWidth.setProgress(drawerData.properties.strokeWidth); + seekBarCornerRadius.setProgress((int)drawerData.properties.cornerRadius); + + buttonBackgroundColor.setBackgroundColor(drawerData.properties.bgColor); + buttonStrokeColor.setBackgroundColor(drawerData.properties.strokeColor); + + setPercentageText(textCornerRadius,seekBarCornerRadius.getProgress()); + setPercentageText(textOpacity,seekBarOpacity.getProgress()); + setPercentageText(textStrokeWidth,seekBarStrokeWidth.getProgress()); + + checkDynamicPosition.setChecked(drawerData.properties.isDynamicBtn); + + }//setEditValues + + + private boolean hasPropertiesErrors(Context ctx){ + if (editName.getText().toString().isEmpty()) { + editName.setError(ctx.getResources().getString(R.string.global_error_field_empty)); + return true; + } + + if (drawerData.properties.isDynamicBtn) { + int errorAt = 0; + try { + drawerData.properties.insertDynamicPos(editDynamicX.getText().toString()); + errorAt = 1; + drawerData.properties.insertDynamicPos(editDynamicY.getText().toString()); + } catch (Throwable th) { + (errorAt == 0 ? editDynamicX : editDynamicY).setError(th.getMessage()); + return true; + } + } + return false; + }//hasErrors + + + private void saveProperties(){ + drawerData.properties.name = editName.getText().toString(); + + drawerData.orientation = ControlDrawerData.intToOrientation(spinnerOrientation.getSelectedItemPosition()); + + drawerData.properties.opacity = seekBarOpacity.getProgress()/100f; + drawerData.properties.strokeWidth = seekBarStrokeWidth.getProgress(); + drawerData.properties.cornerRadius = seekBarCornerRadius.getProgress(); + + drawerData.properties.bgColor = ((ColorDrawable) buttonBackgroundColor.getBackground()).getColor(); + drawerData.properties.strokeColor = ((ColorDrawable) buttonStrokeColor.getBackground()).getColor(); + + drawerData.properties.width = Float.parseFloat(editWidth.getText().toString()); + drawerData.properties.height = Float.parseFloat(editHeight.getText().toString()); + + drawerData.properties.isDynamicBtn = checkDynamicPosition.isChecked(); + drawerData.properties.dynamicX = editDynamicX.getText().toString().isEmpty() ? drawerData.properties.dynamicX = Float.toString(drawerData.properties.x) : editDynamicX.getText().toString(); + drawerData.properties.dynamicY = editDynamicY.getText().toString().isEmpty() ? drawerData.properties.dynamicY = Float.toString(drawerData.properties.y) : editDynamicY.getText().toString(); + + + + drawer.updateProperties(); + }//saveProperties + + + +} diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlSubButtonPopup.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlSubButtonPopup.java new file mode 100644 index 000000000..2bc0ae966 --- /dev/null +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlSubButtonPopup.java @@ -0,0 +1,263 @@ +package net.kdt.pojavlaunch.customcontrols.handleview; + +import android.app.Dialog; +import android.content.Context; +import android.graphics.drawable.ColorDrawable; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.ArrayAdapter; +import android.widget.CheckBox; +import android.widget.EditText; +import android.widget.ImageButton; +import android.widget.SeekBar; +import android.widget.Spinner; +import android.widget.TextView; + +import androidx.appcompat.app.AlertDialog; + +import net.kdt.pojavlaunch.AndroidLWJGLKeycode; +import net.kdt.pojavlaunch.R; +import net.kdt.pojavlaunch.customcontrols.ControlButton; +import net.kdt.pojavlaunch.customcontrols.ControlData; + +import static net.kdt.pojavlaunch.customcontrols.handleview.ActionPopupWindow.setPercentageText; + +public class EditControlSubButtonPopup { + + private Dialog dialog; + + private EditText editName; + private Spinner[] spinnersKeycode; + + private CheckBox checkToggle; + private CheckBox checkPassThrough; + private CheckBox checkHoldAlt; + private CheckBox checkHoldCtrl; + private CheckBox checkHoldShift; + + private SeekBar seekBarOpacity; + private SeekBar seekBarCornerRadius; + private SeekBar seekBarStrokeWidth; + + private ImageButton buttonBackgroundColor; + private ImageButton buttonStrokeColor; + + private TextView textOpacity; + private TextView textCornerRadius; + private TextView textStrokeWidth; + + private final ControlButton button; + private final ControlData properties; + + private ArrayAdapter adapter; + private String[] specialArr; + + + public EditControlSubButtonPopup(ControlButton button){ + this.button = button; + this.properties = button.getProperties(); + + initializeEditDialog(button.getContext()); + setEditDialogValues(); + + dialog.show(); + } + + + public void initializeEditDialog(Context ctx){ + //Create the editing dialog + LayoutInflater layoutInflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + View v = layoutInflater.inflate(R.layout.control_sub_button, null); + + AlertDialog.Builder alertBuilder = new AlertDialog.Builder(ctx); + alertBuilder.setTitle(ctx.getResources().getString(R.string.customctrl_edit, properties.name)); + alertBuilder.setView(v); + + //Linking a lot of stuff + editName = v.findViewById(R.id.controlsetting_edit_name); + + spinnersKeycode = new Spinner[]{ + v.findViewById(R.id.controlsetting_spinner_lwjglkeycode), + v.findViewById(R.id.controlsetting_spinner_lwjglkeycode2), + v.findViewById(R.id.controlsetting_spinner_lwjglkeycode3), + v.findViewById(R.id.controlsetting_spinner_lwjglkeycode4) + }; + + checkToggle = v.findViewById(R.id.controlsetting_checkbox_toggle); + checkPassThrough = v.findViewById(R.id.controlsetting_checkbox_passthru); + + + seekBarOpacity = v.findViewById(R.id.controlsetting_seek_opacity); + seekBarCornerRadius = v.findViewById(R.id.controlsetting_seek_corner_radius); + seekBarStrokeWidth = v.findViewById(R.id.controlsetting_seek_stroke_width); + + //Add listeners, too bad I don't need all the methods + seekBarOpacity.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + @Override + public void onProgressChanged(SeekBar seekBar, int i, boolean b) { + setPercentageText(textOpacity, i); + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + //AUTO GENERATED STUB + } + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + //AUTO GENERATED STUB + } + }); + + seekBarCornerRadius.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + @Override + public void onProgressChanged(SeekBar seekBar, int i, boolean b) { + setPercentageText(textCornerRadius, i); + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + //AUTO GENERATED STUB + } + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + //AUTO GENERATED STUB + } + }); + + seekBarStrokeWidth.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + @Override + public void onProgressChanged(SeekBar seekBar, int i, boolean b) { + setPercentageText(textStrokeWidth, i); + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + //AUTO GENERATED STUB + } + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + //AUTO GENERATED STUB + } + }); + + buttonBackgroundColor = v.findViewById(R.id.controlsetting_background_color); + buttonStrokeColor = v.findViewById(R.id.controlsetting_stroke_color); + + textOpacity = v.findViewById(R.id.controlsetting_text_opacity); + textCornerRadius = v.findViewById(R.id.controlsetting_text_corner_radius); + textStrokeWidth = v.findViewById(R.id.controlsetting_text_stroke_width); + + + checkHoldAlt = v.findViewById(R.id.controlsetting_checkbox_keycombine_alt); + checkHoldCtrl = v.findViewById(R.id.controlsetting_checkbox_keycombine_control); + checkHoldShift = v.findViewById(R.id.controlsetting_checkbox_keycombine_shift); + + //Initialize adapter for keycodes + adapter = new ArrayAdapter<>(ctx, android.R.layout.simple_spinner_item); + String[] oldSpecialArr = ControlData.buildSpecialButtonArray(); + specialArr = new String[oldSpecialArr.length]; + for (int i = 0; i < specialArr.length; i++) { + specialArr[i] = "SPECIAL_" + oldSpecialArr[specialArr.length - i - 1]; + } + adapter.addAll(specialArr); + adapter.addAll(AndroidLWJGLKeycode.generateKeyName()); + adapter.setDropDownViewResource(android.R.layout.simple_list_item_single_choice); + + for (Spinner spinner : spinnersKeycode) { + spinner.setAdapter(adapter); + } + + //Set color imageButton behavior + buttonBackgroundColor.setOnClickListener(view -> ActionPopupWindow.showColorPicker(ctx, "Edit background color", true, ((ColorDrawable) buttonBackgroundColor.getBackground()).getColor(), buttonBackgroundColor)); + buttonStrokeColor.setOnClickListener(view -> ActionPopupWindow.showColorPicker(ctx, "Edit stroke color", false, ((ColorDrawable) buttonStrokeColor.getBackground()).getColor(), buttonStrokeColor)); + + + //Set dialog buttons behavior + alertBuilder.setPositiveButton(android.R.string.ok, (dialogInterface1, i) -> { + if(!hasPropertiesErrors(dialog.getContext())){ + saveProperties(); + } + }); + alertBuilder.setNegativeButton(android.R.string.cancel, null); + + //Create the finalized dialog + dialog = alertBuilder.create(); + + dialog.setOnShowListener(dialogInterface -> { + //setEditDialogValues(); + }); + + } + + private void setEditDialogValues(){ + + editName.setText(properties.name); + + checkToggle.setChecked(properties.isToggle); + checkPassThrough.setChecked(properties.passThruEnabled); + + seekBarOpacity.setProgress((int) (properties.opacity*100)); + seekBarStrokeWidth.setProgress(properties.strokeWidth); + seekBarCornerRadius.setProgress((int)properties.cornerRadius); + + buttonBackgroundColor.setBackgroundColor(properties.bgColor); + buttonStrokeColor.setBackgroundColor(properties.strokeColor); + + setPercentageText(textCornerRadius,seekBarCornerRadius.getProgress()); + setPercentageText(textOpacity,seekBarOpacity.getProgress()); + setPercentageText(textStrokeWidth,seekBarStrokeWidth.getProgress()); + + checkHoldAlt.setChecked(properties.holdAlt); + checkHoldCtrl.setChecked(properties.holdCtrl); + checkHoldShift.setChecked(properties.holdShift); + + for(int i=0; i< properties.keycodes.length; i++){ + if (properties.keycodes[i] < 0) { + spinnersKeycode[i].setSelection(properties.keycodes[i] + specialArr.length); + } else { + spinnersKeycode[i].setSelection(AndroidLWJGLKeycode.getIndexByLWJGLKey(properties.keycodes[i]) + specialArr.length); + } + } + } + + + private boolean hasPropertiesErrors(Context ctx){ + if (editName.getText().toString().isEmpty()) { + editName.setError(ctx.getResources().getString(R.string.global_error_field_empty)); + return true; + } + + return false; + } + + private void saveProperties(){ + //This method assumes there are no error. + properties.name = editName.getText().toString(); + + //Keycodes + for(int i=0; i Date: Fri, 30 Apr 2021 11:59:08 +0200 Subject: [PATCH 027/179] Update HandleView to support different button. --- .../customcontrols/handleview/HandleView.java | 13 ++++--------- .../handleview/SelectionEndHandleView.java | 7 +++---- 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/HandleView.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/HandleView.java index 744a8e3ae..8611f3f5e 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/HandleView.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/HandleView.java @@ -30,6 +30,7 @@ import java.lang.reflect.*; import net.kdt.pojavlaunch.*; import net.kdt.pojavlaunch.customcontrols.*; + public abstract class HandleView extends View implements ViewPositionListener, View.OnLongClickListener { protected Drawable mDrawable; @@ -100,6 +101,7 @@ public abstract class HandleView extends View implements ViewPositionListener, V mIdealVerticalOffset = 0.7f * handleHeight; } + protected void updateDrawable() { // final int offset = getCurrentCursorOffset(); final boolean isRtlCharAtOffset = true; // mView.getLayout().isRtlCharAt(offset); @@ -189,9 +191,9 @@ public abstract class HandleView extends View implements ViewPositionListener, V getPositionListener().removeSubscriber(this); } - void showActionPopupWindow(int delay) { + void showActionPopupWindow(int delay, Object object) { if (mActionPopupWindow == null) { - mActionPopupWindow = new ActionPopupWindow(this); + mActionPopupWindow = new ActionPopupWindow(this, object); } if (mActionPopupShower == null) { mActionPopupShower = new Runnable() { @@ -314,13 +316,6 @@ public abstract class HandleView extends View implements ViewPositionListener, V protected int getCursorOffset() { return 0; } - - // Addition - @Override - public boolean onLongClick(View view) { - showActionPopupWindow(0); - return true; - } // Addition private float mDownX, mDownY; diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/SelectionEndHandleView.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/SelectionEndHandleView.java index 065a94320..62762902e 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/SelectionEndHandleView.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/SelectionEndHandleView.java @@ -25,6 +25,7 @@ import android.view.*; import android.os.*; import net.kdt.pojavlaunch.customcontrols.*; + public class SelectionEndHandleView extends HandleView { public SelectionEndHandleView(ControlButton view) { @@ -50,11 +51,9 @@ public class SelectionEndHandleView extends HandleView return 0; // mView.getSelectionEnd(); } - @Override - public void show() { + public void show(Object object){ super.show(); - - showActionPopupWindow(0); + showActionPopupWindow(0, object); } @Override From 6a588670515fffb99d3f6a55026e174a1519d866 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Fri, 30 Apr 2021 11:59:21 +0200 Subject: [PATCH 028/179] Update ControlLayout.java to support new buttons --- .../customcontrols/ControlLayout.java | 101 +++++++++++++++++- 1 file changed, 99 insertions(+), 2 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java index 3dee6dd7e..667e5131f 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java @@ -56,7 +56,8 @@ public class ControlLayout extends FrameLayout if (controlLayout == null) return; mLayout = controlLayout; - + + //CONTROL BUTTON for (ControlData button : controlLayout.mControlDataList) { button.isHideable = button.keycodes[0] != ControlData.SPECIALBTN_TOGGLECTRL && button.keycodes[0] != ControlData.SPECIALBTN_VIRTUALMOUSE; button.width = button.width / controlLayout.scaledAt * LauncherPreferences.PREF_BUTTONSIZE; @@ -68,11 +69,43 @@ public class ControlLayout extends FrameLayout button.update(); addControlView(button); } + + //CONTROL DRAWER + for(ControlDrawerData drawerData : controlLayout.mDrawerDataList){ + drawerData.properties.isHideable = true; + drawerData.properties.width = drawerData.properties.width / controlLayout.scaledAt * LauncherPreferences.PREF_BUTTONSIZE; + drawerData.properties.height = drawerData.properties.height / controlLayout.scaledAt * LauncherPreferences.PREF_BUTTONSIZE; + if (!drawerData.properties.isDynamicBtn) { + drawerData.properties.dynamicX = drawerData.properties.x / CallbackBridge.physicalWidth + " * ${screen_width}"; + drawerData.properties.dynamicY = drawerData.properties.y / CallbackBridge.physicalHeight + " * ${screen_height}"; + } + + ControlDrawer drawer = addDrawerView(drawerData); + + //CONTROL SUB BUTTON + for (ControlData subButton : drawerData.buttonProperties){ + subButton.isHideable = subButton.keycodes[0] != ControlData.SPECIALBTN_TOGGLECTRL && subButton.keycodes[0] != ControlData.SPECIALBTN_VIRTUALMOUSE; + subButton.width = subButton.width / controlLayout.scaledAt * LauncherPreferences.PREF_BUTTONSIZE; + subButton.height = subButton.height / controlLayout.scaledAt * LauncherPreferences.PREF_BUTTONSIZE; + if (!subButton.isDynamicBtn) { + subButton.dynamicX = subButton.x / CallbackBridge.physicalWidth + " * ${screen_width}"; + subButton.dynamicY = subButton.y / CallbackBridge.physicalHeight + " * ${screen_height}"; + } + subButton.update(); + addSubView(drawer, subButton); + } + + + + } + + mLayout.scaledAt = LauncherPreferences.PREF_BUTTONSIZE; setModified(false); - } + } // loadLayout + //CONTROL BUTTON public void addControlButton(ControlData controlButton) { mLayout.mControlDataList.add(controlButton); addControlView(controlButton); @@ -90,6 +123,53 @@ public class ControlLayout extends FrameLayout setModified(true); } + + // CONTROL DRAWER + public void addDrawer(ControlDrawerData drawerData){ + mLayout.mDrawerDataList.add(drawerData); + addDrawerView(); + } + + private void addDrawerView(){ + addDrawerView(null); + } + + private ControlDrawer addDrawerView(ControlDrawerData drawerData){ + + final ControlDrawer view = new ControlDrawer(this,drawerData == null ? mLayout.mDrawerDataList.get(mLayout.mDrawerDataList.size()-1) : drawerData); + view.setModifiable(mModifiable); + if (!mModifiable) { + view.setAlpha(view.getProperties().opacity); + view.setFocusable(false); + view.setFocusableInTouchMode(false); + } + addView(view); + + setModified(true); + return view; + } + + //CONTROL SUB-BUTTON + public void addSubButton(ControlDrawer drawer, ControlData controlButton){ + //Yep there isn't much here + drawer.getDrawerData().buttonProperties.add(controlButton); + addSubView(drawer, drawer.getDrawerData().buttonProperties.get(drawer.getDrawerData().buttonProperties.size()-1 )); + } + + public void addSubView(ControlDrawer drawer, ControlData controlButton){ + final ControlSubButton view = new ControlSubButton(this, controlButton, drawer); + view.setModifiable(mModifiable); + if (!mModifiable) { + view.setAlpha(view.getProperties().opacity); + view.setFocusable(false); + view.setFocusableInTouchMode(false); + } + drawer.addButton(view); + addView(view); + + setModified(true); + } + private void removeAllButtons() { List viewList = new ArrayList<>(); View v; @@ -106,6 +186,7 @@ public class ControlLayout extends FrameLayout //i wanna be sure that all the removed Views will be removed after a reload //because if frames will slowly go down after many control changes it will be warm and bad } + public void removeControlButton(ControlButton controlButton) { mLayout.mControlDataList.remove(controlButton.getProperties()); controlButton.setVisibility(View.GONE); @@ -114,6 +195,22 @@ public class ControlLayout extends FrameLayout setModified(true); } + public void removeControlDrawer(ControlDrawer controlDrawer){ + mLayout.mDrawerDataList.remove(controlDrawer.getDrawerData()); + controlDrawer.setVisibility(GONE); + removeView(controlDrawer); + + setModified(true); + } + + public void removeControlSubButton(ControlSubButton subButton){ + subButton.parentDrawer.drawerData.buttonProperties.remove(subButton.getProperties()); + subButton.parentDrawer.buttons.remove(subButton); + + subButton.setVisibility(GONE); + removeView(subButton); + } + public void saveLayout(String path) throws Exception { mLayout.save(path); setModified(false); From 55c0d19c49ef75d339b87f20d2fcc7391d69b588 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Mon, 3 May 2021 15:37:03 +0200 Subject: [PATCH 029/179] Rewrote EditControl popups to be easily extended. --- .../handleview/EditControlButtonPopup.java | 146 +++--- .../handleview/EditControlDrawerPopup.java | 229 ++------- .../handleview/EditControlSubButtonPopup.java | 239 +--------- .../res/layout/control_button_setting.xml | 434 ++++++++++++++++++ .../res/layout/control_drawer_setting.xml | 262 ----------- .../main/res/layout/control_setting_v2.xml | 341 -------------- .../main/res/layout/control_sub_button.xml | 267 ----------- .../src/main/res/values/strings.xml | 8 + 8 files changed, 559 insertions(+), 1367 deletions(-) create mode 100644 app_pojavlauncher/src/main/res/layout/control_button_setting.xml delete mode 100644 app_pojavlauncher/src/main/res/layout/control_drawer_setting.xml delete mode 100644 app_pojavlauncher/src/main/res/layout/control_setting_v2.xml delete mode 100644 app_pojavlauncher/src/main/res/layout/control_sub_button.xml diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java index e98a6a2bd..683e0daf6 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java @@ -25,39 +25,41 @@ import static net.kdt.pojavlaunch.customcontrols.handleview.ActionPopupWindow.se public class EditControlButtonPopup { - private Dialog dialog; + protected Dialog dialog; + protected View v; + protected AlertDialog.Builder builder; - private EditText editName; - private Spinner[] spinnersKeycode; + protected EditText editName; + protected Spinner[] spinnersKeycode; - private CheckBox checkToggle; - private CheckBox checkPassThrough; - private CheckBox checkDynamicPosition; - private CheckBox checkHoldAlt; - private CheckBox checkHoldCtrl; - private CheckBox checkHoldShift; + protected CheckBox checkToggle; + protected CheckBox checkPassThrough; + protected CheckBox checkDynamicPosition; + protected CheckBox checkHoldAlt; + protected CheckBox checkHoldCtrl; + protected CheckBox checkHoldShift; - private EditText editWidth; - private EditText editHeight; - private EditText editDynamicX; - private EditText editDynamicY; + protected EditText editWidth; + protected EditText editHeight; + protected EditText editDynamicX; + protected EditText editDynamicY; - private SeekBar seekBarOpacity; - private SeekBar seekBarCornerRadius; - private SeekBar seekBarStrokeWidth; + protected SeekBar seekBarOpacity; + protected SeekBar seekBarCornerRadius; + protected SeekBar seekBarStrokeWidth; - private ImageButton buttonBackgroundColor; - private ImageButton buttonStrokeColor; + protected ImageButton buttonBackgroundColor; + protected ImageButton buttonStrokeColor; - private TextView textOpacity; - private TextView textCornerRadius; - private TextView textStrokeWidth; + protected TextView textOpacity; + protected TextView textCornerRadius; + protected TextView textStrokeWidth; - private final ControlButton button; - private final ControlData properties; + protected final ControlButton button; + protected final ControlData properties; - private ArrayAdapter adapter; - private String[] specialArr; + protected ArrayAdapter adapter; + protected String[] specialArr; public EditControlButtonPopup(ControlButton button){ @@ -65,43 +67,46 @@ public class EditControlButtonPopup { this.properties = button.getProperties(); initializeEditDialog(button.getContext()); - setEditDialogValues(); + + //Create the finalized dialog + dialog = builder.create(); + dialog.setOnShowListener(dialogInterface -> setEditDialogValues()); + dialog.show(); } - - public void initializeEditDialog(Context ctx){ + protected void initializeEditDialog(Context ctx){ //Create the editing dialog LayoutInflater layoutInflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - View v = layoutInflater.inflate(R.layout.control_setting_v2,null); + v = layoutInflater.inflate(R.layout.control_button_setting,null); - AlertDialog.Builder alertBuilder = new AlertDialog.Builder(ctx); - alertBuilder.setTitle(ctx.getResources().getString(R.string.customctrl_edit, properties.name)); - alertBuilder.setView(v); + builder = new AlertDialog.Builder(ctx); + builder.setTitle(ctx.getResources().getString(R.string.customctrl_edit, properties.name)); + builder.setView(v); //Linking a lot of stuff - editName = v.findViewById(R.id.controlsetting_edit_name); + editName = v.findViewById(R.id.editName_editText); spinnersKeycode = new Spinner[]{ - v.findViewById(R.id.controlsetting_spinner_lwjglkeycode), - v.findViewById(R.id.controlsetting_spinner_lwjglkeycode2), - v.findViewById(R.id.controlsetting_spinner_lwjglkeycode3), - v.findViewById(R.id.controlsetting_spinner_lwjglkeycode4) + v.findViewById(R.id.editMapping_spinner_1), + v.findViewById(R.id.editMapping_spinner_2), + v.findViewById(R.id.editMapping_spinner_3), + v.findViewById(R.id.editMapping_spinner_4) }; - checkToggle = v.findViewById(R.id.controlsetting_checkbox_toggle); - checkPassThrough = v.findViewById(R.id.controlsetting_checkbox_passthru); + checkToggle = v.findViewById(R.id.checkboxToggle); + checkPassThrough = v.findViewById(R.id.checkboxPassThrough); - editWidth = v.findViewById(R.id.controlsetting_edit_width); - editHeight = v.findViewById(R.id.controlsetting_edit_height); + editWidth = v.findViewById(R.id.editSize_editTextX); + editHeight = v.findViewById(R.id.editSize_editTextY); - editDynamicX = v.findViewById(R.id.controlsetting_edit_dynamicpos_x); - editDynamicY = v.findViewById(R.id.controlsetting_edit_dynamicpos_y); + editDynamicX = v.findViewById(R.id.editDynamicPositionX_editText); + editDynamicY = v.findViewById(R.id.editDynamicPositionY_editText); - seekBarOpacity = v.findViewById(R.id.controlsetting_seek_opacity); - seekBarCornerRadius = v.findViewById(R.id.controlsetting_seek_corner_radius); - seekBarStrokeWidth = v.findViewById(R.id.controlsetting_seek_stroke_width); + seekBarOpacity = v.findViewById(R.id.editButtonOpacity_seekbar); + seekBarCornerRadius = v.findViewById(R.id.editCornerRadius_seekbar); + seekBarStrokeWidth = v.findViewById(R.id.editStrokeWidth_seekbar); //Add listeners, too bad I don't need all the methods seekBarOpacity.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @@ -152,23 +157,23 @@ public class EditControlButtonPopup { } }); - buttonBackgroundColor = v.findViewById(R.id.controlsetting_background_color); - buttonStrokeColor = v.findViewById(R.id.controlsetting_stroke_color); + buttonBackgroundColor = v.findViewById(R.id.editBackgroundColor_imageButton); + buttonStrokeColor = v.findViewById(R.id.editStrokeColor_imageButton); - textOpacity = v.findViewById(R.id.controlsetting_text_opacity); - textCornerRadius = v.findViewById(R.id.controlsetting_text_corner_radius); - textStrokeWidth = v.findViewById(R.id.controlsetting_text_stroke_width); + textOpacity = v.findViewById(R.id.editButtonOpacity_textView_percent); + textCornerRadius = v.findViewById(R.id.editCornerRadius_textView_percent); + textStrokeWidth = v.findViewById(R.id.editStrokeWidth_textView_percent); - checkDynamicPosition = v.findViewById(R.id.controlsetting_checkbox_dynamicpos); + checkDynamicPosition = v.findViewById(R.id.checkboxDynamicPosition); checkDynamicPosition.setOnCheckedChangeListener((btn, checked) -> { editDynamicX.setEnabled(checked); editDynamicY.setEnabled(checked); }); - checkHoldAlt = v.findViewById(R.id.controlsetting_checkbox_keycombine_alt); - checkHoldCtrl = v.findViewById(R.id.controlsetting_checkbox_keycombine_control); - checkHoldShift = v.findViewById(R.id.controlsetting_checkbox_keycombine_shift); + checkHoldAlt = v.findViewById(R.id.checkBoxKeyCombination_alt); + checkHoldCtrl = v.findViewById(R.id.checkBoxKeyCombination_ctrl); + checkHoldShift = v.findViewById(R.id.checkBoxKeyCombination_shift); //Initialize adapter for keycodes adapter = new ArrayAdapter<>(ctx, android.R.layout.simple_spinner_item); @@ -190,24 +195,29 @@ public class EditControlButtonPopup { buttonStrokeColor.setOnClickListener(view -> ActionPopupWindow.showColorPicker(ctx, "Edit stroke color", false, ((ColorDrawable) buttonStrokeColor.getBackground()).getColor(), buttonStrokeColor)); + //Set dialog buttons behavior - alertBuilder.setPositiveButton(android.R.string.ok, (dialogInterface1, i) -> { + setupDialogButtons(); + + hideUselessViews(); + + } + + protected void setupDialogButtons(){ + //Set dialog buttons behavior + builder.setPositiveButton(android.R.string.ok, (dialogInterface1, i) -> { if(!hasPropertiesErrors(dialog.getContext())){ saveProperties(); } }); - alertBuilder.setNegativeButton(android.R.string.cancel, null); - - //Create the finalized dialog - dialog = alertBuilder.create(); - - dialog.setOnShowListener(dialogInterface -> { - //setEditDialogValues(); - }); - + builder.setNegativeButton(android.R.string.cancel, null); } - private void setEditDialogValues(){ + protected void hideUselessViews(){ + (v.findViewById(R.id.editOrientation_textView)).setVisibility(View.GONE); + } + + protected void setEditDialogValues(){ editName.setText(properties.name); @@ -250,7 +260,7 @@ public class EditControlButtonPopup { } - private boolean hasPropertiesErrors(Context ctx){ + protected boolean hasPropertiesErrors(Context ctx){ if (editName.getText().toString().isEmpty()) { editName.setError(ctx.getResources().getString(R.string.global_error_field_empty)); return true; @@ -273,7 +283,7 @@ public class EditControlButtonPopup { return false; } - private void saveProperties(){ + protected void saveProperties(){ //This method assumes there are no error. properties.name = editName.getText().toString(); diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlDrawerPopup.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlDrawerPopup.java index 272d62692..638e00197 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlDrawerPopup.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlDrawerPopup.java @@ -24,238 +24,65 @@ import net.kdt.pojavlaunch.customcontrols.ControlLayout; import static net.kdt.pojavlaunch.customcontrols.handleview.ActionPopupWindow.setPercentageText; -public class EditControlDrawerPopup { - private Dialog dialog; - - private EditText editName; +public class EditControlDrawerPopup extends EditControlButtonPopup{ private Spinner spinnerOrientation; - private CheckBox checkDynamicPosition; - - private EditText editWidth; - private EditText editHeight; - private EditText editDynamicX; - private EditText editDynamicY; - - private SeekBar seekBarOpacity; - private SeekBar seekBarCornerRadius; - private SeekBar seekBarStrokeWidth; - - private ImageButton buttonBackgroundColor; - private ImageButton buttonStrokeColor; - - private TextView textOpacity; - private TextView textCornerRadius; - private TextView textStrokeWidth; private ControlDrawer drawer; private ControlDrawerData drawerData; public EditControlDrawerPopup(ControlDrawer editedButton) { + super(editedButton); drawer = editedButton; drawerData = editedButton.getDrawerData(); - - initializeEditDialog(drawer.getContext()); - setEditDialogValues(); - - dialog.show(); } - private void initializeEditDialog(Context ctx){ - LayoutInflater layoutInflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - View v = layoutInflater.inflate(R.layout.control_drawer_setting,null); + @Override + protected void hideUselessViews() { + (v.findViewById(R.id.editMapping_textView)).setVisibility(View.GONE); + checkPassThrough.setVisibility(View.GONE); + checkToggle.setVisibility(View.GONE); + } - AlertDialog.Builder alertBuilder = new AlertDialog.Builder(ctx); - alertBuilder.setTitle(ctx.getResources().getString(R.string.customctrl_edit, drawerData.properties.name)); - alertBuilder.setView(v); + @Override + protected void initializeEditDialog(Context ctx) { + super.initializeEditDialog(ctx); - //LINKING PHASE - editName = v.findViewById(R.id.controlsetting_edit_name); - - spinnerOrientation = v.findViewById(R.id.controlsetting_orientation); - - editWidth = v.findViewById(R.id.controlsetting_edit_width); - editHeight = v.findViewById(R.id.controlsetting_edit_height); - - editDynamicX = v.findViewById(R.id.controlsetting_edit_dynamicpos_x); - editDynamicY = v.findViewById(R.id.controlsetting_edit_dynamicpos_y); - - seekBarOpacity = v.findViewById(R.id.controlsetting_seek_opacity); - seekBarCornerRadius = v.findViewById(R.id.controlsetting_seek_corner_radius); - seekBarStrokeWidth = v.findViewById(R.id.controlsetting_seek_stroke_width); - - //Add listeners, too bad I don't need all the methods - seekBarOpacity.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { - @Override - public void onProgressChanged(SeekBar seekBar, int i, boolean b) { - setPercentageText(textOpacity, i); - } - - @Override - public void onStartTrackingTouch(SeekBar seekBar) { - //AUTO GENERATED STUB - } - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - //AUTO GENERATED STUB - } - }); - - seekBarCornerRadius.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { - @Override - public void onProgressChanged(SeekBar seekBar, int i, boolean b) { - setPercentageText(textCornerRadius, i); - } - - @Override - public void onStartTrackingTouch(SeekBar seekBar) { - //AUTO GENERATED STUB - } - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - //AUTO GENERATED STUB - } - }); - - seekBarStrokeWidth.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { - @Override - public void onProgressChanged(SeekBar seekBar, int i, boolean b) { - setPercentageText(textStrokeWidth, i); - } - - @Override - public void onStartTrackingTouch(SeekBar seekBar) { - //AUTO GENERATED STUB - } - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - //AUTO GENERATED STUB - } - }); - - buttonBackgroundColor = v.findViewById(R.id.controlsetting_background_color); - buttonStrokeColor = v.findViewById(R.id.controlsetting_stroke_color); - - textOpacity = v.findViewById(R.id.controlsetting_text_opacity); - textCornerRadius = v.findViewById(R.id.controlsetting_text_corner_radius); - textStrokeWidth = v.findViewById(R.id.controlsetting_text_stroke_width); - - checkDynamicPosition = v.findViewById(R.id.controlsetting_checkbox_dynamicpos); - checkDynamicPosition.setOnCheckedChangeListener((btn, checked) -> { - editDynamicX.setEnabled(checked); - editDynamicY.setEnabled(checked); - }); + spinnerOrientation = v.findViewById(R.id.editOrientation_spinner); ArrayAdapter adapter = new ArrayAdapter<>(ctx, android.R.layout.simple_spinner_item); adapter.addAll(ControlDrawerData.getOrientations()); adapter.setDropDownViewResource(android.R.layout.simple_list_item_single_choice); spinnerOrientation.setAdapter(adapter); + } - //Set color imageButton behavior - buttonBackgroundColor.setOnClickListener(view -> ActionPopupWindow.showColorPicker(ctx, "Edit background color", true, ((ColorDrawable) buttonBackgroundColor.getBackground()).getColor(), buttonBackgroundColor)); - buttonStrokeColor.setOnClickListener(view -> ActionPopupWindow.showColorPicker(ctx, "Edit stroke color", false, ((ColorDrawable) buttonStrokeColor.getBackground()).getColor(), buttonStrokeColor)); + @Override + protected void setEditDialogValues() { + super.setEditDialogValues(); - //Set dialog buttons behavior - alertBuilder.setNegativeButton(android.R.string.cancel, null); - alertBuilder.setPositiveButton(android.R.string.ok, (dialogInterface1, i) -> { - if(!hasPropertiesErrors(dialog.getContext())){ - saveProperties(); - } - }); + spinnerOrientation.setSelection(ControlDrawerData.orientationToInt(drawerData.orientation)); + } - alertBuilder.setNeutralButton("Add sub-button", new DialogInterface.OnClickListener() { + @Override + protected void setupDialogButtons() { + super.setupDialogButtons(); + + builder.setNeutralButton("Add sub-button", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { - //TODO add a button; ControlLayout layout = (ControlLayout) drawer.getParent(); layout.addSubButton(drawer, new ControlData()); } }); + } - //Create the finalized dialog - dialog = alertBuilder.create(); - } //initializeEditDialog - - private void setEditDialogValues() { - editName.setText(drawerData.properties.name); - - spinnerOrientation.setSelection(ControlDrawerData.orientationToInt(drawerData.orientation)); - - editWidth.setText(Float.toString(drawerData.properties.width)); - editHeight.setText(Float.toString(drawerData.properties.height)); - - editDynamicX.setEnabled(drawerData.properties.isDynamicBtn); - editDynamicY.setEnabled(drawerData.properties.isDynamicBtn); - editDynamicX.setHint(Float.toString(drawerData.properties.x)); - editDynamicX.setText(drawerData.properties.dynamicX); - editDynamicY.setHint(Float.toString(drawerData.properties.y)); - editDynamicY.setText(drawerData.properties.dynamicY); - - seekBarOpacity.setProgress((int)drawerData.properties.opacity*100); - seekBarStrokeWidth.setProgress(drawerData.properties.strokeWidth); - seekBarCornerRadius.setProgress((int)drawerData.properties.cornerRadius); - - buttonBackgroundColor.setBackgroundColor(drawerData.properties.bgColor); - buttonStrokeColor.setBackgroundColor(drawerData.properties.strokeColor); - - setPercentageText(textCornerRadius,seekBarCornerRadius.getProgress()); - setPercentageText(textOpacity,seekBarOpacity.getProgress()); - setPercentageText(textStrokeWidth,seekBarStrokeWidth.getProgress()); - - checkDynamicPosition.setChecked(drawerData.properties.isDynamicBtn); - - }//setEditValues - - - private boolean hasPropertiesErrors(Context ctx){ - if (editName.getText().toString().isEmpty()) { - editName.setError(ctx.getResources().getString(R.string.global_error_field_empty)); - return true; - } - - if (drawerData.properties.isDynamicBtn) { - int errorAt = 0; - try { - drawerData.properties.insertDynamicPos(editDynamicX.getText().toString()); - errorAt = 1; - drawerData.properties.insertDynamicPos(editDynamicY.getText().toString()); - } catch (Throwable th) { - (errorAt == 0 ? editDynamicX : editDynamicY).setError(th.getMessage()); - return true; - } - } - return false; - }//hasErrors - - - private void saveProperties(){ - drawerData.properties.name = editName.getText().toString(); - + @Override + protected void saveProperties() { drawerData.orientation = ControlDrawerData.intToOrientation(spinnerOrientation.getSelectedItemPosition()); - - drawerData.properties.opacity = seekBarOpacity.getProgress()/100f; - drawerData.properties.strokeWidth = seekBarStrokeWidth.getProgress(); - drawerData.properties.cornerRadius = seekBarCornerRadius.getProgress(); - - drawerData.properties.bgColor = ((ColorDrawable) buttonBackgroundColor.getBackground()).getColor(); - drawerData.properties.strokeColor = ((ColorDrawable) buttonStrokeColor.getBackground()).getColor(); - - drawerData.properties.width = Float.parseFloat(editWidth.getText().toString()); - drawerData.properties.height = Float.parseFloat(editHeight.getText().toString()); - - drawerData.properties.isDynamicBtn = checkDynamicPosition.isChecked(); - drawerData.properties.dynamicX = editDynamicX.getText().toString().isEmpty() ? drawerData.properties.dynamicX = Float.toString(drawerData.properties.x) : editDynamicX.getText().toString(); - drawerData.properties.dynamicY = editDynamicY.getText().toString().isEmpty() ? drawerData.properties.dynamicY = Float.toString(drawerData.properties.y) : editDynamicY.getText().toString(); - - - - drawer.updateProperties(); - }//saveProperties - - - + super.saveProperties(); + } } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlSubButtonPopup.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlSubButtonPopup.java index 2bc0ae966..4e0022e03 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlSubButtonPopup.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlSubButtonPopup.java @@ -22,242 +22,25 @@ import net.kdt.pojavlaunch.customcontrols.ControlData; import static net.kdt.pojavlaunch.customcontrols.handleview.ActionPopupWindow.setPercentageText; -public class EditControlSubButtonPopup { - - private Dialog dialog; - - private EditText editName; - private Spinner[] spinnersKeycode; - - private CheckBox checkToggle; - private CheckBox checkPassThrough; - private CheckBox checkHoldAlt; - private CheckBox checkHoldCtrl; - private CheckBox checkHoldShift; - - private SeekBar seekBarOpacity; - private SeekBar seekBarCornerRadius; - private SeekBar seekBarStrokeWidth; - - private ImageButton buttonBackgroundColor; - private ImageButton buttonStrokeColor; - - private TextView textOpacity; - private TextView textCornerRadius; - private TextView textStrokeWidth; - - private final ControlButton button; - private final ControlData properties; - - private ArrayAdapter adapter; - private String[] specialArr; +public class EditControlSubButtonPopup extends EditControlButtonPopup{ public EditControlSubButtonPopup(ControlButton button){ - this.button = button; - this.properties = button.getProperties(); - - initializeEditDialog(button.getContext()); - setEditDialogValues(); - - dialog.show(); + super(button); } + @Override + protected void hideUselessViews() { + (v.findViewById(R.id.editSize_textView)).setVisibility(View.GONE); - public void initializeEditDialog(Context ctx){ - //Create the editing dialog - LayoutInflater layoutInflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - View v = layoutInflater.inflate(R.layout.control_sub_button, null); + (v.findViewById(R.id.editOrientation_textView)).setVisibility(View.GONE); - AlertDialog.Builder alertBuilder = new AlertDialog.Builder(ctx); - alertBuilder.setTitle(ctx.getResources().getString(R.string.customctrl_edit, properties.name)); - alertBuilder.setView(v); + checkDynamicPosition.setVisibility(View.GONE); - //Linking a lot of stuff - editName = v.findViewById(R.id.controlsetting_edit_name); - - spinnersKeycode = new Spinner[]{ - v.findViewById(R.id.controlsetting_spinner_lwjglkeycode), - v.findViewById(R.id.controlsetting_spinner_lwjglkeycode2), - v.findViewById(R.id.controlsetting_spinner_lwjglkeycode3), - v.findViewById(R.id.controlsetting_spinner_lwjglkeycode4) - }; - - checkToggle = v.findViewById(R.id.controlsetting_checkbox_toggle); - checkPassThrough = v.findViewById(R.id.controlsetting_checkbox_passthru); - - - seekBarOpacity = v.findViewById(R.id.controlsetting_seek_opacity); - seekBarCornerRadius = v.findViewById(R.id.controlsetting_seek_corner_radius); - seekBarStrokeWidth = v.findViewById(R.id.controlsetting_seek_stroke_width); - - //Add listeners, too bad I don't need all the methods - seekBarOpacity.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { - @Override - public void onProgressChanged(SeekBar seekBar, int i, boolean b) { - setPercentageText(textOpacity, i); - } - - @Override - public void onStartTrackingTouch(SeekBar seekBar) { - //AUTO GENERATED STUB - } - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - //AUTO GENERATED STUB - } - }); - - seekBarCornerRadius.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { - @Override - public void onProgressChanged(SeekBar seekBar, int i, boolean b) { - setPercentageText(textCornerRadius, i); - } - - @Override - public void onStartTrackingTouch(SeekBar seekBar) { - //AUTO GENERATED STUB - } - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - //AUTO GENERATED STUB - } - }); - - seekBarStrokeWidth.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { - @Override - public void onProgressChanged(SeekBar seekBar, int i, boolean b) { - setPercentageText(textStrokeWidth, i); - } - - @Override - public void onStartTrackingTouch(SeekBar seekBar) { - //AUTO GENERATED STUB - } - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - //AUTO GENERATED STUB - } - }); - - buttonBackgroundColor = v.findViewById(R.id.controlsetting_background_color); - buttonStrokeColor = v.findViewById(R.id.controlsetting_stroke_color); - - textOpacity = v.findViewById(R.id.controlsetting_text_opacity); - textCornerRadius = v.findViewById(R.id.controlsetting_text_corner_radius); - textStrokeWidth = v.findViewById(R.id.controlsetting_text_stroke_width); - - - checkHoldAlt = v.findViewById(R.id.controlsetting_checkbox_keycombine_alt); - checkHoldCtrl = v.findViewById(R.id.controlsetting_checkbox_keycombine_control); - checkHoldShift = v.findViewById(R.id.controlsetting_checkbox_keycombine_shift); - - //Initialize adapter for keycodes - adapter = new ArrayAdapter<>(ctx, android.R.layout.simple_spinner_item); - String[] oldSpecialArr = ControlData.buildSpecialButtonArray(); - specialArr = new String[oldSpecialArr.length]; - for (int i = 0; i < specialArr.length; i++) { - specialArr[i] = "SPECIAL_" + oldSpecialArr[specialArr.length - i - 1]; - } - adapter.addAll(specialArr); - adapter.addAll(AndroidLWJGLKeycode.generateKeyName()); - adapter.setDropDownViewResource(android.R.layout.simple_list_item_single_choice); - - for (Spinner spinner : spinnersKeycode) { - spinner.setAdapter(adapter); - } - - //Set color imageButton behavior - buttonBackgroundColor.setOnClickListener(view -> ActionPopupWindow.showColorPicker(ctx, "Edit background color", true, ((ColorDrawable) buttonBackgroundColor.getBackground()).getColor(), buttonBackgroundColor)); - buttonStrokeColor.setOnClickListener(view -> ActionPopupWindow.showColorPicker(ctx, "Edit stroke color", false, ((ColorDrawable) buttonStrokeColor.getBackground()).getColor(), buttonStrokeColor)); - - - //Set dialog buttons behavior - alertBuilder.setPositiveButton(android.R.string.ok, (dialogInterface1, i) -> { - if(!hasPropertiesErrors(dialog.getContext())){ - saveProperties(); - } - }); - alertBuilder.setNegativeButton(android.R.string.cancel, null); - - //Create the finalized dialog - dialog = alertBuilder.create(); - - dialog.setOnShowListener(dialogInterface -> { - //setEditDialogValues(); - }); + (v.findViewById(R.id.editDynamicPositionX_textView)).setVisibility(View.GONE); + editDynamicX.setVisibility(View.GONE); + (v.findViewById(R.id.editDynamicPositionY_textView)).setVisibility(View.GONE); + editDynamicY.setVisibility(View.GONE); } - - private void setEditDialogValues(){ - - editName.setText(properties.name); - - checkToggle.setChecked(properties.isToggle); - checkPassThrough.setChecked(properties.passThruEnabled); - - seekBarOpacity.setProgress((int) (properties.opacity*100)); - seekBarStrokeWidth.setProgress(properties.strokeWidth); - seekBarCornerRadius.setProgress((int)properties.cornerRadius); - - buttonBackgroundColor.setBackgroundColor(properties.bgColor); - buttonStrokeColor.setBackgroundColor(properties.strokeColor); - - setPercentageText(textCornerRadius,seekBarCornerRadius.getProgress()); - setPercentageText(textOpacity,seekBarOpacity.getProgress()); - setPercentageText(textStrokeWidth,seekBarStrokeWidth.getProgress()); - - checkHoldAlt.setChecked(properties.holdAlt); - checkHoldCtrl.setChecked(properties.holdCtrl); - checkHoldShift.setChecked(properties.holdShift); - - for(int i=0; i< properties.keycodes.length; i++){ - if (properties.keycodes[i] < 0) { - spinnersKeycode[i].setSelection(properties.keycodes[i] + specialArr.length); - } else { - spinnersKeycode[i].setSelection(AndroidLWJGLKeycode.getIndexByLWJGLKey(properties.keycodes[i]) + specialArr.length); - } - } - } - - - private boolean hasPropertiesErrors(Context ctx){ - if (editName.getText().toString().isEmpty()) { - editName.setError(ctx.getResources().getString(R.string.global_error_field_empty)); - return true; - } - - return false; - } - - private void saveProperties(){ - //This method assumes there are no error. - properties.name = editName.getText().toString(); - - //Keycodes - for(int i=0; i + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app_pojavlauncher/src/main/res/layout/control_drawer_setting.xml b/app_pojavlauncher/src/main/res/layout/control_drawer_setting.xml deleted file mode 100644 index 80981f709..000000000 --- a/app_pojavlauncher/src/main/res/layout/control_drawer_setting.xml +++ /dev/null @@ -1,262 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app_pojavlauncher/src/main/res/layout/control_setting_v2.xml b/app_pojavlauncher/src/main/res/layout/control_setting_v2.xml deleted file mode 100644 index 8f5a72af0..000000000 --- a/app_pojavlauncher/src/main/res/layout/control_setting_v2.xml +++ /dev/null @@ -1,341 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app_pojavlauncher/src/main/res/layout/control_sub_button.xml b/app_pojavlauncher/src/main/res/layout/control_sub_button.xml deleted file mode 100644 index 0a75b9829..000000000 --- a/app_pojavlauncher/src/main/res/layout/control_sub_button.xml +++ /dev/null @@ -1,267 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app_pojavlauncher/src/main/res/values/strings.xml b/app_pojavlauncher/src/main/res/values/strings.xml index db2b039af..c8c352a30 100644 --- a/app_pojavlauncher/src/main/res/values/strings.xml +++ b/app_pojavlauncher/src/main/res/values/strings.xml @@ -170,12 +170,20 @@ Size Width Height + + Mapping + Orientation + Background color + Corner radius + Stroke width + Stroke color Dynamic position Dynamic X Dynamic Y Background transparency + Background Opacity Key combination Alt From 04999718b2b37cc3bdcdfe12d2c71055f4563ab2 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Mon, 3 May 2021 19:59:26 +0200 Subject: [PATCH 030/179] Add a custom scrollView that have the ability to disable the auto-refocus. --- .../java/com/kdt/DefocusableScrollView.java | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 app_pojavlauncher/src/main/java/com/kdt/DefocusableScrollView.java diff --git a/app_pojavlauncher/src/main/java/com/kdt/DefocusableScrollView.java b/app_pojavlauncher/src/main/java/com/kdt/DefocusableScrollView.java new file mode 100644 index 000000000..9bbde79b4 --- /dev/null +++ b/app_pojavlauncher/src/main/java/com/kdt/DefocusableScrollView.java @@ -0,0 +1,50 @@ +package com.kdt; + +import android.content.Context; +import android.graphics.Rect; +import android.util.AttributeSet; +import android.widget.ScrollView; + +public class DefocusableScrollView extends ScrollView { + + /* + What is this class for ? + It allows to ignore the focusing from an item such an EditText. + Ignoring it will stop the scrollView from refocusing on the view + */ + + private boolean keepFocusing = false; + + + public DefocusableScrollView(Context context) { + super(context); + } + + public DefocusableScrollView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public DefocusableScrollView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + public DefocusableScrollView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + + public void setKeepFocusing(boolean shouldKeepFocusing){ + keepFocusing = shouldKeepFocusing; + } + + public boolean isKeepFocusing(){ + return keepFocusing; + } + + @Override + protected int computeScrollDeltaToGetChildRectOnScreen(Rect rect) { + if(!keepFocusing) return 0; + return super.computeScrollDeltaToGetChildRectOnScreen(rect); + } + + +} From d46523025ddeb10a20ebd666a04ad28843edb955 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Mon, 3 May 2021 20:49:48 +0200 Subject: [PATCH 031/179] Fix auto refocusing on EditText via the new DefocusableScrollView --- .../src/main/res/layout/control_button_setting.xml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app_pojavlauncher/src/main/res/layout/control_button_setting.xml b/app_pojavlauncher/src/main/res/layout/control_button_setting.xml index 6d15e85a4..a19a699a7 100644 --- a/app_pojavlauncher/src/main/res/layout/control_button_setting.xml +++ b/app_pojavlauncher/src/main/res/layout/control_button_setting.xml @@ -1,5 +1,5 @@ - - - \ No newline at end of file + \ No newline at end of file From 87187f7999e5e736d06dc23c1787952289652d8a Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Mon, 3 May 2021 20:51:02 +0200 Subject: [PATCH 032/179] Tweaked xml file to be nicer to the eyes --- .../res/layout/control_button_setting.xml | 63 +++++++++++++++++-- 1 file changed, 58 insertions(+), 5 deletions(-) diff --git a/app_pojavlauncher/src/main/res/layout/control_button_setting.xml b/app_pojavlauncher/src/main/res/layout/control_button_setting.xml index a19a699a7..44ab629fb 100644 --- a/app_pojavlauncher/src/main/res/layout/control_button_setting.xml +++ b/app_pojavlauncher/src/main/res/layout/control_button_setting.xml @@ -14,9 +14,10 @@ @@ -36,9 +37,10 @@ @@ -101,6 +104,21 @@ app:layout_constraintEnd_toStartOf="@id/editMapping_spinner_2" app:layout_constraintBottom_toTopOf="@id/editMapping_spinner_3"/> + + + + + + + + Date: Mon, 3 May 2021 20:52:58 +0200 Subject: [PATCH 033/179] Fix crash --- .../handleview/SelectionEndHandleView.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/SelectionEndHandleView.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/SelectionEndHandleView.java index 62762902e..1dd401451 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/SelectionEndHandleView.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/SelectionEndHandleView.java @@ -67,10 +67,11 @@ public class SelectionEndHandleView extends HandleView // updatePosition((int) x, (int) y, false, false); positionAtCursorOffset(0, false); } - /* - public void setActionPopupWindow(ActionPopupWindow actionPopupWindow) { - mActionPopupWindow = actionPopupWindow; - } - */ + + @Override + public boolean onLongClick(View view) { + //TODO stub + return false; + } } From 4de83829fad8e84a18577bdcdf4bf5b123b98660 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Mon, 3 May 2021 22:36:09 +0200 Subject: [PATCH 034/179] Force ControlSubButton to keep the same size as his parent --- .../pojavlaunch/customcontrols/ControlSubButton.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlSubButton.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlSubButton.java index e515a0658..5dfe6b1be 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlSubButton.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlSubButton.java @@ -21,4 +21,14 @@ public class ControlSubButton extends ControlButton { + @Override + public void setLayoutParams(ViewGroup.LayoutParams params) { + if(parentDrawer != null){ + params.width = (int)parentDrawer.mProperties.width; + params.height = (int)parentDrawer.mProperties.height; + } + + super.setLayoutParams(params); + + } } From 659563d3f8d94a362648c494f10666e8436f53f3 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Mon, 10 May 2021 21:34:05 +0200 Subject: [PATCH 035/179] The subButton is now properly hidden on launch --- .../net/kdt/pojavlaunch/customcontrols/ControlDrawer.java | 2 +- .../kdt/pojavlaunch/customcontrols/ControlSubButton.java | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlDrawer.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlDrawer.java index 9cee537b7..e74507ff0 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlDrawer.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlDrawer.java @@ -18,7 +18,7 @@ public class ControlDrawer extends ControlButton { public ArrayList buttons; public ControlDrawerData drawerData; public ControlLayout mLayout; - private boolean areButtonsVisible = false; + public boolean areButtonsVisible = false; public ControlDrawer(ControlLayout layout, ControlDrawerData drawerData) { diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlSubButton.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlSubButton.java index 5dfe6b1be..6a9d4b5bb 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlSubButton.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlSubButton.java @@ -1,5 +1,9 @@ package net.kdt.pojavlaunch.customcontrols; +import android.os.Handler; +import android.os.Looper; +import android.view.ViewGroup; + public class ControlSubButton extends ControlButton { public ControlDrawer parentDrawer; @@ -7,6 +11,10 @@ public class ControlSubButton extends ControlButton { public ControlSubButton(ControlLayout layout, ControlData properties, ControlDrawer parentDrawer) { super(layout, properties); this.parentDrawer = parentDrawer; + + //Delayed to let the button inflate first + new Handler(Looper.getMainLooper()).postDelayed(() -> setVisibility(parentDrawer.areButtonsVisible ? VISIBLE : GONE), 0); + filterProperties(); } From c6cff8813341d09636e0b447895662fdf05616bc Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Mon, 10 May 2021 21:38:24 +0200 Subject: [PATCH 036/179] Add hide GUI support for Drawer and SubButton --- .../pojavlaunch/customcontrols/ControlLayout.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java index 667e5131f..b4714b238 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java @@ -224,10 +224,22 @@ public class ControlLayout extends FrameLayout if (mModifiable) return; // Not using on custom controls activity mControlVisible = !mControlVisible; + int visibilityState = mControlVisible ? View.VISIBLE : View.GONE; + for (int i = 0; i < getChildCount(); i++) { View view = getChildAt(i); + + if(view instanceof ControlSubButton){ + view.setVisibility(mControlVisible ? (((ControlSubButton)view).parentDrawer.areButtonsVisible ? VISIBLE : GONE) : View.GONE); + } + + if(view instanceof ControlDrawer){ + view.setVisibility(visibilityState); + continue; + } + if (view instanceof ControlButton && ((ControlButton) view).getProperties().isHideable) { - view.setVisibility(mControlVisible ? View.VISIBLE : View.GONE); + view.setVisibility(visibilityState); } } } From e67ffe77d0c64331a2d871a15ec2239ece95ea89 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Tue, 11 May 2021 15:19:06 +0200 Subject: [PATCH 037/179] Update the dp scaling methods --- .../src/main/java/net/kdt/pojavlaunch/Tools.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java index 4ea68c69e..2896c7743 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java @@ -417,10 +417,13 @@ public final class Tools } public static float dpToPx(float dp) { - // 921600 = 1280 * 720, default scale - // TODO better way to scaling - float scaledDp = dp; // / DisplayMetrics.DENSITY_XHIGH * currentDisplayMetrics.densityDpi; - return (scaledDp * currentDisplayMetrics.density); + //Better hope for the currentDisplayMetrics to be good + return dp * currentDisplayMetrics.density; + } + + public static float pxToDp(float px){ + //Better hope for the currentDisplayMetrics to be good + return px / currentDisplayMetrics.density; } public static void copyAssetFile(Context ctx, String fileName, String output, boolean overwrite) throws IOException { From 2ed45d4b170350386b0e6d77d07f0631c5eeda90 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Tue, 11 May 2021 19:46:50 +0200 Subject: [PATCH 038/179] Switch button size to dp to allow better scalability across resolutions --- .../customcontrols/ControlButton.java | 10 ++-- .../customcontrols/ControlData.java | 50 +++++++++++++------ .../customcontrols/ControlDrawer.java | 16 +++--- .../customcontrols/ControlLayout.java | 12 ++--- .../customcontrols/ControlSubButton.java | 8 +-- .../handleview/EditControlButtonPopup.java | 8 +-- 6 files changed, 61 insertions(+), 43 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlButton.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlButton.java index 3b232d900..d29bffe25 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlButton.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlButton.java @@ -86,7 +86,7 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp properties.specialButtonListener.getClass().getName()); } - setLayoutParams(new FrameLayout.LayoutParams((int) properties.width, (int) properties.height)); + setLayoutParams(new FrameLayout.LayoutParams((int) properties.getWidth(), (int) properties.getHeight() )); } public void setBackground(){ @@ -99,12 +99,12 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp } public int computeStrokeWidth(float widthInPercent){ - float maxSize = Math.max(mProperties.width, mProperties.height); + float maxSize = Math.max(mProperties.getWidth(), mProperties.getHeight()); return (int)((maxSize/2) * (widthInPercent/100)); } public float computeCornerRadius(float radiusInPercent){ - float minSize = Math.min(mProperties.width, mProperties.height); + float minSize = Math.min(mProperties.getWidth(), mProperties.getHeight()); return (minSize/2) * (radiusInPercent/100); } @@ -112,8 +112,8 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp public void setLayoutParams(ViewGroup.LayoutParams params) { super.setLayoutParams(params); - mProperties.width = params.width; - mProperties.height = params.height; + mProperties.setWidth(params.width); + mProperties.setHeight(params.height); setBackground(); diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java index 952a09aac..b6256b160 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java @@ -1,6 +1,5 @@ package net.kdt.pojavlaunch.customcontrols; -import android.graphics.Color; import android.util.*; import java.util.*; import net.kdt.pojavlaunch.*; @@ -70,14 +69,14 @@ public class ControlData implements Cloneable public String name; public float x; public float y; - public float width; - public float height; - public int[] keycodes; //Should store up to 4 keys - public float opacity; //Alpha value from 0 to 1; + private float width; //Dp instead of Px now + private float height; //Dp instead of Px now + public int[] keycodes; //Should store up to 4 keys + public float opacity; //Alpha value from 0 to 1; public int bgColor; public int strokeColor; - public int strokeWidth; - public float cornerRadius; + public int strokeWidth; //0-100% + public float cornerRadius; //0-100% public boolean holdCtrl; public boolean holdAlt; @@ -93,7 +92,7 @@ public class ControlData implements Cloneable } public ControlData(String name, int[] keycodes, float x, float y) { - this(name, keycodes, x, y, Tools.dpToPx(50), Tools.dpToPx(50)); + this(name, keycodes, x, y, 50, 50); } public ControlData(android.content.Context ctx, int resId, int[] keycodes, float x, float y, boolean isSquare) { @@ -101,7 +100,7 @@ public class ControlData implements Cloneable } public ControlData(String name, int[] keycodes, float x, float y, boolean isSquare) { - this(name, keycodes, x, y, isSquare ? Tools.dpToPx(50) : Tools.dpToPx(80), isSquare ? Tools.dpToPx(50) : Tools.dpToPx(30)); + this(name, keycodes, x, y, isSquare ? 50 : 80, isSquare ? 50 : 30); } public ControlData(String name, int[] keycodes, float x, float y, float width, float height) { @@ -110,7 +109,7 @@ public class ControlData implements Cloneable } public ControlData(String name, int[] keycodes, String dynamicX, String dynamicY) { - this(name, keycodes, dynamicX, dynamicY, Tools.dpToPx(50), Tools.dpToPx(50), false); + this(name, keycodes, dynamicX, dynamicY, 50, 50, false); } public ControlData(android.content.Context ctx, int resId, int[] keycodes, String dynamicX, String dynamicY, boolean isSquare) { @@ -118,11 +117,11 @@ public class ControlData implements Cloneable } public ControlData(String name, int[] keycodes, String dynamicX, String dynamicY, boolean isSquare) { - this(name, keycodes, dynamicX, dynamicY, isSquare ? Tools.dpToPx(50) : Tools.dpToPx(80), isSquare ? Tools.dpToPx(50) : Tools.dpToPx(30), false); + this(name, keycodes, dynamicX, dynamicY, isSquare ? 50 : 80, isSquare ? 50 : 30, false); } public ControlData(String name, int[] keycodes, String dynamicX, String dynamicY, float width, float height, boolean isToggle){ - this(name, keycodes, dynamicX, dynamicY, width, height, isToggle, 1,0x4D000000, 0xFFFFFFFF,0,Tools.dpToPx(0)); + this(name, keycodes, dynamicX, dynamicY, width, height, isToggle, 1,0x4D000000, 0xFFFFFFFF,0,0); } public ControlData(String name, int[] keycodes, String dynamicX, String dynamicY, float width, float height, boolean isToggle, float opacity, int bgColor, int strokeColor, int strokeWidth, float cornerRadius) { @@ -161,10 +160,10 @@ public class ControlData implements Cloneable Map keyValueMap = new ArrayMap<>(); keyValueMap.put("top", "0"); keyValueMap.put("left", "0"); - keyValueMap.put("right", Float.toString(CallbackBridge.physicalWidth - width)); - keyValueMap.put("bottom", Float.toString(CallbackBridge.physicalHeight - height)); - keyValueMap.put("width", Float.toString(width)); - keyValueMap.put("height", Float.toString(height)); + keyValueMap.put("right", Float.toString(CallbackBridge.physicalWidth - getWidth())); + keyValueMap.put("bottom", Float.toString(CallbackBridge.physicalHeight - getHeight())); + keyValueMap.put("width", Float.toString(getWidth())); + keyValueMap.put("height", Float.toString(getHeight())); keyValueMap.put("screen_width", Integer.toString(CallbackBridge.physicalWidth)); keyValueMap.put("screen_height", Integer.toString(CallbackBridge.physicalHeight)); keyValueMap.put("margin", Integer.toString((int) Tools.dpToPx(2))); @@ -213,4 +212,23 @@ public class ControlData implements Cloneable } return inflatedArray; } + + + //Getters || setters (with conversion for ease of use) + public float getWidth() { + return Tools.dpToPx(width); + } + + public float getHeight(){ + return Tools.dpToPx(height); + } + + + public void setWidth(float widthInPx){ + width = Tools.pxToDp(widthInPx); + } + + public void setHeight(float heightInPx){ + height = Tools.pxToDp(heightInPx); + } } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlDrawer.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlDrawer.java index e74507ff0..c723bcc28 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlDrawer.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlDrawer.java @@ -42,8 +42,8 @@ public class ControlDrawer extends ControlButton { private ControlData filterProperties(ControlData properties){ properties.isDynamicBtn = false; - properties.width = drawerData.properties.width; - properties.height = drawerData.properties.height; + properties.setWidth(drawerData.properties.getWidth()); + properties.setHeight(drawerData.properties.getHeight()); return properties; } @@ -97,22 +97,22 @@ public class ControlDrawer extends ControlButton { for(int i=0; i < buttons.size(); ++i){ switch (drawerData.orientation){ case RIGHT: - buttons.get(i).setTranslationX( (drawerData.properties.x + drawerData.properties.width) + drawerData.properties.width*i ); + buttons.get(i).setTranslationX( (drawerData.properties.x + drawerData.properties.getWidth()) + drawerData.properties.getWidth()*i ); buttons.get(i).setTranslationY(drawerData.properties.y); break; case LEFT: - buttons.get(i).setTranslationX( (drawerData.properties.x - drawerData.properties.width) - drawerData.properties.width*i ); + buttons.get(i).setTranslationX( (drawerData.properties.x - drawerData.properties.getWidth()) - drawerData.properties.getWidth()*i ); buttons.get(i).setTranslationY(drawerData.properties.y); break; case UP: - buttons.get(i).setTranslationY( (drawerData.properties.y - drawerData.properties.height) - drawerData.properties.height*i ); + buttons.get(i).setTranslationY( (drawerData.properties.y - drawerData.properties.getHeight()) - drawerData.properties.getHeight()*i ); buttons.get(i).setTranslationX(drawerData.properties.x); break; case DOWN: - buttons.get(i).setTranslationY( (drawerData.properties.y + drawerData.properties.height) + drawerData.properties.height*i ); + buttons.get(i).setTranslationY( (drawerData.properties.y + drawerData.properties.getHeight()) + drawerData.properties.getHeight()*i ); buttons.get(i).setTranslationX(drawerData.properties.x); break; } @@ -124,8 +124,8 @@ public class ControlDrawer extends ControlButton { private void resizeButtons(){ if (buttons == null) return; for(ControlSubButton subButton : buttons){ - subButton.mProperties.width = mProperties.width; - subButton.mProperties.height = mProperties.height; + subButton.mProperties.setWidth(mProperties.getWidth()); + subButton.mProperties.setHeight(mProperties.getHeight()); subButton.updateProperties(); } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java index b4714b238..1a976afc2 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java @@ -60,8 +60,8 @@ public class ControlLayout extends FrameLayout //CONTROL BUTTON for (ControlData button : controlLayout.mControlDataList) { button.isHideable = button.keycodes[0] != ControlData.SPECIALBTN_TOGGLECTRL && button.keycodes[0] != ControlData.SPECIALBTN_VIRTUALMOUSE; - button.width = button.width / controlLayout.scaledAt * LauncherPreferences.PREF_BUTTONSIZE; - button.height = button.height / controlLayout.scaledAt * LauncherPreferences.PREF_BUTTONSIZE; + button.setWidth(button.getWidth() / controlLayout.scaledAt * LauncherPreferences.PREF_BUTTONSIZE); + button.setHeight(button.getHeight() / controlLayout.scaledAt * LauncherPreferences.PREF_BUTTONSIZE); if (!button.isDynamicBtn) { button.dynamicX = button.x / CallbackBridge.physicalWidth + " * ${screen_width}"; button.dynamicY = button.y / CallbackBridge.physicalHeight + " * ${screen_height}"; @@ -73,8 +73,8 @@ public class ControlLayout extends FrameLayout //CONTROL DRAWER for(ControlDrawerData drawerData : controlLayout.mDrawerDataList){ drawerData.properties.isHideable = true; - drawerData.properties.width = drawerData.properties.width / controlLayout.scaledAt * LauncherPreferences.PREF_BUTTONSIZE; - drawerData.properties.height = drawerData.properties.height / controlLayout.scaledAt * LauncherPreferences.PREF_BUTTONSIZE; + drawerData.properties.setWidth(drawerData.properties.getWidth() / controlLayout.scaledAt * LauncherPreferences.PREF_BUTTONSIZE); + drawerData.properties.setHeight(drawerData.properties.getHeight() / controlLayout.scaledAt * LauncherPreferences.PREF_BUTTONSIZE); if (!drawerData.properties.isDynamicBtn) { drawerData.properties.dynamicX = drawerData.properties.x / CallbackBridge.physicalWidth + " * ${screen_width}"; drawerData.properties.dynamicY = drawerData.properties.y / CallbackBridge.physicalHeight + " * ${screen_height}"; @@ -85,8 +85,8 @@ public class ControlLayout extends FrameLayout //CONTROL SUB BUTTON for (ControlData subButton : drawerData.buttonProperties){ subButton.isHideable = subButton.keycodes[0] != ControlData.SPECIALBTN_TOGGLECTRL && subButton.keycodes[0] != ControlData.SPECIALBTN_VIRTUALMOUSE; - subButton.width = subButton.width / controlLayout.scaledAt * LauncherPreferences.PREF_BUTTONSIZE; - subButton.height = subButton.height / controlLayout.scaledAt * LauncherPreferences.PREF_BUTTONSIZE; + subButton.setWidth(subButton.getWidth() / controlLayout.scaledAt * LauncherPreferences.PREF_BUTTONSIZE); + subButton.setHeight(subButton.getHeight() / controlLayout.scaledAt * LauncherPreferences.PREF_BUTTONSIZE); if (!subButton.isDynamicBtn) { subButton.dynamicX = subButton.x / CallbackBridge.physicalWidth + " * ${screen_width}"; subButton.dynamicY = subButton.y / CallbackBridge.physicalHeight + " * ${screen_height}"; diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlSubButton.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlSubButton.java index 6a9d4b5bb..8d8b23d5e 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlSubButton.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlSubButton.java @@ -19,8 +19,8 @@ public class ControlSubButton extends ControlButton { } private void filterProperties(){ - mProperties.height = parentDrawer.getProperties().height; - mProperties.width = parentDrawer.getProperties().width; + mProperties.setHeight(parentDrawer.getProperties().getHeight()); + mProperties.setWidth(parentDrawer.getProperties().getWidth()); mProperties.isDynamicBtn = false; setProperties(mProperties, false); @@ -32,8 +32,8 @@ public class ControlSubButton extends ControlButton { @Override public void setLayoutParams(ViewGroup.LayoutParams params) { if(parentDrawer != null){ - params.width = (int)parentDrawer.mProperties.width; - params.height = (int)parentDrawer.mProperties.height; + params.width = (int)parentDrawer.mProperties.getWidth(); + params.height = (int)parentDrawer.mProperties.getHeight(); } super.setLayoutParams(params); diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java index 683e0daf6..600eec17b 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java @@ -224,8 +224,8 @@ public class EditControlButtonPopup { checkToggle.setChecked(properties.isToggle); checkPassThrough.setChecked(properties.passThruEnabled); - editWidth.setText(Float.toString(properties.width)); - editHeight.setText(Float.toString(properties.height)); + editWidth.setText(Float.toString(properties.getWidth())); + editHeight.setText(Float.toString(properties.getHeight())); editDynamicX.setEnabled(properties.isDynamicBtn); editDynamicY.setEnabled(properties.isDynamicBtn); @@ -306,8 +306,8 @@ public class EditControlButtonPopup { properties.isToggle = checkToggle.isChecked(); properties.passThruEnabled = checkPassThrough.isChecked(); - properties.width = Float.parseFloat(editWidth.getText().toString()); - properties.height = Float.parseFloat(editHeight.getText().toString()); + properties.setWidth(Float.parseFloat(editWidth.getText().toString())); + properties.setHeight(Float.parseFloat(editHeight.getText().toString())); properties.isDynamicBtn = checkDynamicPosition.isChecked(); properties.dynamicX = editDynamicX.getText().toString().isEmpty() ? properties.dynamicX = Float.toString(properties.x) : editDynamicX.getText().toString(); From a00e03270f0d6940208acf3fc2b40b32ada97f31 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Tue, 11 May 2021 22:08:11 +0200 Subject: [PATCH 039/179] Fix subButtons not appearing when on edit mode. --- .../net/kdt/pojavlaunch/customcontrols/ControlLayout.java | 4 ++++ .../net/kdt/pojavlaunch/customcontrols/ControlSubButton.java | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java index 1a976afc2..4e7d0c352 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java @@ -258,6 +258,10 @@ public class ControlLayout extends FrameLayout } } + public boolean getModifiable(){ + return mModifiable; + } + protected void setModified(boolean z) { if (mActivity != null) mActivity.isModified = z; } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlSubButton.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlSubButton.java index 8d8b23d5e..b09e37911 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlSubButton.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlSubButton.java @@ -13,7 +13,8 @@ public class ControlSubButton extends ControlButton { this.parentDrawer = parentDrawer; //Delayed to let the button inflate first - new Handler(Looper.getMainLooper()).postDelayed(() -> setVisibility(parentDrawer.areButtonsVisible ? VISIBLE : GONE), 0); + if(!layout.getModifiable()) + new Handler(Looper.getMainLooper()).postDelayed(() -> setVisibility(parentDrawer.areButtonsVisible ? VISIBLE : GONE), 0); filterProperties(); } From 5fd9a5893eb7d2c328341499db94589f031f5522 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Tue, 11 May 2021 22:08:19 +0200 Subject: [PATCH 040/179] Update strings.xml --- app_pojavlauncher/src/main/res/values/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app_pojavlauncher/src/main/res/values/strings.xml b/app_pojavlauncher/src/main/res/values/strings.xml index c8c352a30..0d77fc756 100644 --- a/app_pojavlauncher/src/main/res/values/strings.xml +++ b/app_pojavlauncher/src/main/res/values/strings.xml @@ -190,6 +190,7 @@ Ctrl Shift Add button + Add button drawer Select default Control json From d0b75ee8882ff4f8531d94621e419151d5a7431f Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Tue, 11 May 2021 22:08:37 +0200 Subject: [PATCH 041/179] Add a an item into menu_customctrl.xml --- app_pojavlauncher/src/main/res/menu/menu_customctrl.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app_pojavlauncher/src/main/res/menu/menu_customctrl.xml b/app_pojavlauncher/src/main/res/menu/menu_customctrl.xml index 3512bece4..6c0a08420 100644 --- a/app_pojavlauncher/src/main/res/menu/menu_customctrl.xml +++ b/app_pojavlauncher/src/main/res/menu/menu_customctrl.xml @@ -3,6 +3,10 @@ android:id="@+id/menu_ctrl_add" android:title="@string/customctrl_addbutton"/> + + From 5de6ba4633e8988b35a092965853b3da41971752 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Tue, 11 May 2021 22:09:45 +0200 Subject: [PATCH 042/179] Updated constructors fcontrolData with a default pos to the center --- .../net/kdt/pojavlaunch/customcontrols/ControlData.java | 8 ++++++-- .../kdt/pojavlaunch/customcontrols/ControlDrawerData.java | 4 +++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java index b6256b160..2e281bc22 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java @@ -84,11 +84,15 @@ public class ControlData implements Cloneable public Object specialButtonListener; public ControlData() { - this("", new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}, 0, 0); + this("button"); + } + + public ControlData(String name){ + this(name, new int[] {}); } public ControlData(String name, int[] keycodes) { - this(name, keycodes, 0, 0); + this(name, keycodes, Tools.currentDisplayMetrics.widthPixels/2, Tools.currentDisplayMetrics.heightPixels/2); } public ControlData(String name, int[] keycodes, float x, float y) { diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlDrawerData.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlDrawerData.java index 5e3072f66..cdb02339c 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlDrawerData.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlDrawerData.java @@ -1,5 +1,7 @@ package net.kdt.pojavlaunch.customcontrols; +import net.kdt.pojavlaunch.Tools; + import java.util.ArrayList; import static net.kdt.pojavlaunch.customcontrols.ControlDrawerData.Orientation.DOWN; @@ -57,7 +59,7 @@ public class ControlDrawerData { } public ControlDrawerData(ArrayList buttonProperties){ - this(buttonProperties, new ControlData()); + this(buttonProperties, new ControlData("Drawer", new int[] {}, Tools.currentDisplayMetrics.widthPixels/2, Tools.currentDisplayMetrics.heightPixels/2)); } public ControlDrawerData(ArrayList buttonProperties, ControlData properties){ From a6bd302d36b40d9f3e4e034ef2a3f9feca439a17 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Tue, 11 May 2021 22:10:18 +0200 Subject: [PATCH 043/179] New "add drawer" button ! --- .../java/net/kdt/pojavlaunch/CustomControlsActivity.java | 5 ++++- .../src/main/java/net/kdt/pojavlaunch/MainActivity.java | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/CustomControlsActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/CustomControlsActivity.java index 043a54928..dcd8c49bd 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/CustomControlsActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/CustomControlsActivity.java @@ -60,7 +60,10 @@ public class CustomControlsActivity extends BaseActivity load(ctrlLayout); break; case R.id.menu_ctrl_add: - ctrlLayout.addControlButton(new ControlData("New", new int[] {LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}, 100, 100)); + ctrlLayout.addControlButton(new ControlData("New")); + break; + case R.id.menu_ctrl_add_drawer: + ctrlLayout.addDrawer(new ControlDrawerData()); break; case R.id.menu_ctrl_selectdefault: dialogSelectDefaultCtrl(ctrlLayout); diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MainActivity.java index 762ba99e9..6fb848679 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MainActivity.java @@ -37,7 +37,10 @@ public class MainActivity extends BaseMainActivity { CustomControlsActivity.load(mControlLayout); break; case R.id.menu_ctrl_add: - mControlLayout.addControlButton(new ControlData("New", new int[] {LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}, 100, 100)); + mControlLayout.addControlButton(new ControlData("New")); + break; + case R.id.menu_ctrl_add_drawer: + mControlLayout.addDrawer(new ControlDrawerData()); break; case R.id.menu_ctrl_selectdefault: CustomControlsActivity.dialogSelectDefaultCtrl(mControlLayout); From c1211f03e9db25f4b0183b8b2c8af9a932b31a37 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Tue, 11 May 2021 22:56:52 +0200 Subject: [PATCH 044/179] Added margins for subButtons within a drawer --- .../pojavlaunch/customcontrols/ControlDrawer.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlDrawer.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlDrawer.java index c723bcc28..ea751fcfc 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlDrawer.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlDrawer.java @@ -8,6 +8,8 @@ import android.view.ViewGroup; import androidx.annotation.NonNull; +import net.kdt.pojavlaunch.Tools; + import java.util.ArrayList; @@ -38,8 +40,6 @@ public class ControlDrawer extends ControlButton { } - - private ControlData filterProperties(ControlData properties){ properties.isDynamicBtn = false; properties.setWidth(drawerData.properties.getWidth()); @@ -97,22 +97,22 @@ public class ControlDrawer extends ControlButton { for(int i=0; i < buttons.size(); ++i){ switch (drawerData.orientation){ case RIGHT: - buttons.get(i).setTranslationX( (drawerData.properties.x + drawerData.properties.getWidth()) + drawerData.properties.getWidth()*i ); + buttons.get(i).setTranslationX(drawerData.properties.x + (drawerData.properties.getWidth() + Tools.dpToPx(2))*(i+1) ); buttons.get(i).setTranslationY(drawerData.properties.y); break; case LEFT: - buttons.get(i).setTranslationX( (drawerData.properties.x - drawerData.properties.getWidth()) - drawerData.properties.getWidth()*i ); + buttons.get(i).setTranslationX(drawerData.properties.x - (drawerData.properties.getWidth() + Tools.dpToPx(2))*(i+1) ); buttons.get(i).setTranslationY(drawerData.properties.y); break; case UP: - buttons.get(i).setTranslationY( (drawerData.properties.y - drawerData.properties.getHeight()) - drawerData.properties.getHeight()*i ); + buttons.get(i).setTranslationY(drawerData.properties.y - (drawerData.properties.getHeight() + Tools.dpToPx(2))*(i+1) ); buttons.get(i).setTranslationX(drawerData.properties.x); break; case DOWN: - buttons.get(i).setTranslationY( (drawerData.properties.y + drawerData.properties.getHeight()) + drawerData.properties.getHeight()*i ); + buttons.get(i).setTranslationY(drawerData.properties.y + (drawerData.properties.getHeight() + Tools.dpToPx(2))*(i+1) ); buttons.get(i).setTranslationX(drawerData.properties.x); break; } From c13eda73e19364727626ac2259943aefd7d9ffd8 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Wed, 12 May 2021 09:03:57 +0200 Subject: [PATCH 045/179] creating a subButton will inherit its mother's visual properties --- .../customcontrols/handleview/EditControlDrawerPopup.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlDrawerPopup.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlDrawerPopup.java index 638e00197..779c37d10 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlDrawerPopup.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlDrawerPopup.java @@ -73,8 +73,9 @@ public class EditControlDrawerPopup extends EditControlButtonPopup{ @Override public void onClick(DialogInterface dialogInterface, int i) { ControlLayout layout = (ControlLayout) drawer.getParent(); - layout.addSubButton(drawer, new ControlData()); - + ControlData controlData = drawerData.properties.clone(); + controlData.name = "new"; + layout.addSubButton(drawer, controlData); } }); From 35c23be3f0bfcaf7b4404c160772bca96141768f Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Wed, 12 May 2021 09:11:47 +0200 Subject: [PATCH 046/179] De-hardcoded a string --- .../customcontrols/handleview/EditControlDrawerPopup.java | 2 +- app_pojavlauncher/src/main/res/values/strings.xml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlDrawerPopup.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlDrawerPopup.java index 779c37d10..123396858 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlDrawerPopup.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlDrawerPopup.java @@ -69,7 +69,7 @@ public class EditControlDrawerPopup extends EditControlButtonPopup{ protected void setupDialogButtons() { super.setupDialogButtons(); - builder.setNeutralButton("Add sub-button", new DialogInterface.OnClickListener() { + builder.setNeutralButton(v.getResources().getString(R.string.customctrl_addsubbutton), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { ControlLayout layout = (ControlLayout) drawer.getParent(); diff --git a/app_pojavlauncher/src/main/res/values/strings.xml b/app_pojavlauncher/src/main/res/values/strings.xml index 0d77fc756..969cbd83b 100644 --- a/app_pojavlauncher/src/main/res/values/strings.xml +++ b/app_pojavlauncher/src/main/res/values/strings.xml @@ -191,6 +191,7 @@ Shift Add button Add button drawer + Add sub-button Select default Control json From d48ab790a05bf24cd624b25ed6ebf0d69f879d87 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Wed, 12 May 2021 09:42:01 +0200 Subject: [PATCH 047/179] Removed a now useless option --- .../prefs/LauncherPreferences.java | 58 +++++++++---------- .../src/main/res/xml/pref_main.xml | 6 -- 2 files changed, 29 insertions(+), 35 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferences.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferences.java index b6b82e15d..a4c84e579 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferences.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferences.java @@ -8,21 +8,21 @@ public class LauncherPreferences { public static SharedPreferences DEFAULT_PREF; public static String PREF_RENDERER = "opengles2"; - public static boolean PREF_VERTYPE_RELEASE = true; - public static boolean PREF_VERTYPE_SNAPSHOT = false; - public static boolean PREF_VERTYPE_OLDALPHA = false; - public static boolean PREF_VERTYPE_OLDBETA = false; - public static boolean PREF_FREEFORM = false; - public static boolean PREF_HIDE_SIDEBAR = false; - public static boolean PREF_IGNORE_NOTCH = false; - public static boolean PREF_BACK_TO_RIGHT_MOUSE = false; - public static boolean PREF_BUTTON_FLAT = false; - public static int PREF_NOTCH_SIZE = 0; - public static float PREF_BUTTONSIZE = 100f; - public static float PREF_MOUSESCALE = 100f; - public static int PREF_LONGPRESS_TRIGGER = 500; - public static String PREF_DEFAULTCTRL_PATH = Tools.CTRLDEF_FILE; - public static String PREF_CUSTOM_JAVA_ARGS; + + public static boolean PREF_VERTYPE_RELEASE = true; + public static boolean PREF_VERTYPE_SNAPSHOT = false; + public static boolean PREF_VERTYPE_OLDALPHA = false; + public static boolean PREF_VERTYPE_OLDBETA = false; + public static boolean PREF_FREEFORM = false; + public static boolean PREF_HIDE_SIDEBAR = false; + public static boolean PREF_IGNORE_NOTCH = false; + public static boolean PREF_BACK_TO_RIGHT_MOUSE = false; + public static int PREF_NOTCH_SIZE = 0; + public static float PREF_BUTTONSIZE = 100f; + public static float PREF_MOUSESCALE = 100f; + public static int PREF_LONGPRESS_TRIGGER = 500; + public static String PREF_DEFAULTCTRL_PATH = Tools.CTRLDEF_FILE; + public static String PREF_CUSTOM_JAVA_ARGS; public static String PREF_CUSTOM_OPENGL_LIBNAME = "libgl4es_114.so"; public static String PREF_LANGUAGE = "default"; public static String PREF_VERSION_REPOS = "https://launchermeta.mojang.com/mc/game/version_manifest_v2.json"; @@ -33,20 +33,20 @@ public class LauncherPreferences public static String PREF_DEFAULT_RUNTIME; public static void loadPreferences() { PREF_RENDERER = DEFAULT_PREF.getString("renderer", "opengles2"); - PREF_BUTTONSIZE = DEFAULT_PREF.getInt("buttonscale", 100); - PREF_MOUSESCALE = DEFAULT_PREF.getInt("mousescale", 100); - PREF_MOUSESPEED = ((float)DEFAULT_PREF.getInt("mousespeed",100))/100f; - PREF_FREEFORM = DEFAULT_PREF.getBoolean("freeform", false); - PREF_HIDE_SIDEBAR = DEFAULT_PREF.getBoolean("hideSidebar", false); - PREF_IGNORE_NOTCH = DEFAULT_PREF.getBoolean("ignoreNotch", false); - PREF_BACK_TO_RIGHT_MOUSE = DEFAULT_PREF.getBoolean("backToRightMouse", false); - PREF_BUTTON_FLAT = DEFAULT_PREF.getBoolean("flatButtonStyle", false); - PREF_VERTYPE_RELEASE = DEFAULT_PREF.getBoolean("vertype_release", true); - PREF_VERTYPE_SNAPSHOT = DEFAULT_PREF.getBoolean("vertype_snapshot", false); - PREF_VERTYPE_OLDALPHA = DEFAULT_PREF.getBoolean("vertype_oldalpha", false); - PREF_VERTYPE_OLDBETA = DEFAULT_PREF.getBoolean("vertype_oldbeta", false); - PREF_LONGPRESS_TRIGGER = DEFAULT_PREF.getInt("timeLongPressTrigger", 500); - PREF_DEFAULTCTRL_PATH = DEFAULT_PREF.getString("defaultCtrl", Tools.CTRLDEF_FILE); + + PREF_BUTTONSIZE = DEFAULT_PREF.getInt("buttonscale", 100); + PREF_MOUSESCALE = DEFAULT_PREF.getInt("mousescale", 100); + PREF_MOUSESPEED = ((float)DEFAULT_PREF.getInt("mousespeed",100))/100f; + PREF_FREEFORM = DEFAULT_PREF.getBoolean("freeform", false); + PREF_HIDE_SIDEBAR = DEFAULT_PREF.getBoolean("hideSidebar", false); + PREF_IGNORE_NOTCH = DEFAULT_PREF.getBoolean("ignoreNotch", false); + PREF_BACK_TO_RIGHT_MOUSE = DEFAULT_PREF.getBoolean("backToRightMouse", false); + PREF_VERTYPE_RELEASE = DEFAULT_PREF.getBoolean("vertype_release", true); + PREF_VERTYPE_SNAPSHOT = DEFAULT_PREF.getBoolean("vertype_snapshot", false); + PREF_VERTYPE_OLDALPHA = DEFAULT_PREF.getBoolean("vertype_oldalpha", false); + PREF_VERTYPE_OLDBETA = DEFAULT_PREF.getBoolean("vertype_oldbeta", false); + PREF_LONGPRESS_TRIGGER = DEFAULT_PREF.getInt("timeLongPressTrigger", 500); + PREF_DEFAULTCTRL_PATH = DEFAULT_PREF.getString("defaultCtrl", Tools.CTRLDEF_FILE); PREF_LANGUAGE = DEFAULT_PREF.getString("language", "default"); PREF_CHECK_LIBRARY_SHA = DEFAULT_PREF.getBoolean("checkLibraries",true); PREF_DISABLE_GESTURES = DEFAULT_PREF.getBoolean("disableGestures",false); diff --git a/app_pojavlauncher/src/main/res/xml/pref_main.xml b/app_pojavlauncher/src/main/res/xml/pref_main.xml index 2b5ded16a..ee23eaeb1 100644 --- a/app_pojavlauncher/src/main/res/xml/pref_main.xml +++ b/app_pojavlauncher/src/main/res/xml/pref_main.xml @@ -24,12 +24,6 @@ app2:selectable="false" app2:icon="@drawable/tap_len" /> - Date: Mon, 17 May 2021 14:11:29 +0200 Subject: [PATCH 048/179] Add GamepadDpad.java --- .../customcontrols/gamepad/GamepadDpad.java | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadDpad.java diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadDpad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadDpad.java new file mode 100644 index 000000000..39d7a2d5c --- /dev/null +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadDpad.java @@ -0,0 +1,77 @@ +package net.kdt.pojavlaunch.customcontrols.gamepad; + +import android.view.InputDevice; +import android.view.InputEvent; +import android.view.KeyEvent; +import android.view.MotionEvent; + +/* + Code from the android documentation + */ + +public class GamepadDpad { + final static int UP = 0; + final static int LEFT = 1; + final static int RIGHT = 2; + final static int DOWN = 3; + final static int CENTER = 4; + + int pressedDirection = -1; + + public int getDirectionPressed(InputEvent event) { + if (!isDpadEvent(event)) { + return -1; + } + + // If the input event is a MotionEvent, check its hat axis values. + if (event instanceof MotionEvent) { + + // Use the hat axis value to find the D-pad direction + MotionEvent motionEvent = (MotionEvent) event; + float xaxis = motionEvent.getAxisValue(MotionEvent.AXIS_HAT_X); + float yaxis = motionEvent.getAxisValue(MotionEvent.AXIS_HAT_Y); + + // Check if the AXIS_HAT_X value is -1 or 1, and set the D-pad + // LEFT and RIGHT direction accordingly. + if (Float.compare(xaxis, -1.0f) == 0) { + pressedDirection = GamepadDpad.LEFT; + } else if (Float.compare(xaxis, 1.0f) == 0) { + pressedDirection = GamepadDpad.RIGHT; + } + // Check if the AXIS_HAT_Y value is -1 or 1, and set the D-pad + // UP and DOWN direction accordingly. + else if (Float.compare(yaxis, -1.0f) == 0) { + pressedDirection = GamepadDpad.UP; + } else if (Float.compare(yaxis, 1.0f) == 0) { + pressedDirection = GamepadDpad.DOWN; + } + } + + // If the input event is a KeyEvent, check its key code. + else if (event instanceof KeyEvent) { + + // Use the key code to find the D-pad direction. + KeyEvent keyEvent = (KeyEvent) event; + if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_DPAD_LEFT) { + pressedDirection = GamepadDpad.LEFT; + } else if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_DPAD_RIGHT) { + pressedDirection = GamepadDpad.RIGHT; + } else if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_DPAD_UP) { + pressedDirection = GamepadDpad.UP; + } else if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_DPAD_DOWN) { + pressedDirection = GamepadDpad.DOWN; + } else if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_DPAD_CENTER) { + pressedDirection = GamepadDpad.CENTER; + } + } + return pressedDirection; + } + + public static boolean isDpadEvent(InputEvent event) { + // Check that input comes from a device with directional pads. + // And... also the joystick since it declares sometimes as a joystick. + + return (event.getSource() & InputDevice.SOURCE_DPAD) == InputDevice.SOURCE_DPAD + || (event.getSource() & InputDevice.SOURCE_JOYSTICK) == InputDevice.SOURCE_JOYSTICK; + } +} \ No newline at end of file From 576ee9a9303cea9a626391cc208333d65cee747d Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Mon, 17 May 2021 14:11:59 +0200 Subject: [PATCH 049/179] Add gamepadJoystick.java --- .../gamepad/GamepadJoystick.java | 93 +++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadJoystick.java diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadJoystick.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadJoystick.java new file mode 100644 index 000000000..0ff2de668 --- /dev/null +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadJoystick.java @@ -0,0 +1,93 @@ +package net.kdt.pojavlaunch.customcontrols.gamepad; + +import android.view.InputDevice; +import android.view.MotionEvent; + +import com.google.android.material.math.MathUtils; + +public class GamepadJoystick { + + //Directions + public static final int DIRECTION_NONE = -1; //GamepadJoystick at the center + public static final int DIRECTION_NORTH = 0; + public static final int DIRECTION_NORTH_EAST = 7; + public static final int DIRECTION_EAST = 6; + public static final int DIRECTION_SOUTH_EAST = 5; + public static final int DIRECTION_SOUTH = 4; + public static final int DIRECTION_SOUTH_WEST = 3; + public static final int DIRECTION_WEST = 2; + public static final int DIRECTION_NORTH_WEST = 1; + + public static final float JOYSTICK_DEADZONE = 0.20f; + + private final int verticalAxis; + private final int horizontalAxis; + + public GamepadJoystick(int horizontalAxis, int verticalAxis){ + this.verticalAxis = verticalAxis; + this.horizontalAxis = horizontalAxis; + } + + public double getAngleRadian(MotionEvent event){ + float x = getHorizontalAxis(event); + float y = getVerticalAxis(event); + if(x == y && x == 0) + return 0.00; //atan2 don't like when x and y == 0 + + double angle = -Math.atan2(y, x); + return angle; + } + + public double getAngle(MotionEvent event){ + float x = getHorizontalAxis(event); + float y = getVerticalAxis(event); + if(x == y && x == 0) + return 0.00; //atan2 don't like when x and y == 0 + + return 180+(Math.atan2(x, y)*57); + } + + public double getMagnitude(MotionEvent event){ + float x = Math.abs(event.getAxisValue(horizontalAxis)); + float y = Math.abs(event.getAxisValue(verticalAxis)); + + return MathUtils.dist(0,0, x, y); + } + + public float getVerticalAxis(MotionEvent event){ + return applyDeadzone(event, verticalAxis); + } + + public float getHorizontalAxis(MotionEvent event){ + return applyDeadzone(event, horizontalAxis); + } + + private float applyDeadzone(MotionEvent event, int axis){ + //TODO: tweakable deadzone ? + /* + This piece of code also modifies the value + to make it seem like there was no deadzone in the first place + */ + double magnitude = getMagnitude(event); + if (magnitude < JOYSTICK_DEADZONE){ + return 0; + }else{ + //if( Math.abs(event.getAxisValue(axis)) < 0.035) return 0; + return (float) ((event.getAxisValue(axis) / magnitude) * ((magnitude - JOYSTICK_DEADZONE) / (1 - JOYSTICK_DEADZONE))); + } + } + + public static boolean isJoystickEvent(MotionEvent event){ + return (event.getSource() & InputDevice.SOURCE_JOYSTICK) == InputDevice.SOURCE_JOYSTICK + && event.getAction() == MotionEvent.ACTION_MOVE; + } + + + public int getHeightDirection(MotionEvent event){ + if(getMagnitude(event) <= JOYSTICK_DEADZONE ) return DIRECTION_NONE; + return ((int) ((getAngle(event)+22.5)/45)) % 8; + } + + + +} From 043121178864026abaea7e8646348b27297fc4ff Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Mon, 17 May 2021 14:12:21 +0200 Subject: [PATCH 050/179] Add gamepadMapping.java --- .../gamepad/GamepadMapping.java | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadMapping.java diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadMapping.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadMapping.java new file mode 100644 index 000000000..b47aaea77 --- /dev/null +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadMapping.java @@ -0,0 +1,52 @@ +package net.kdt.pojavlaunch.customcontrols.gamepad; + +import net.kdt.pojavlaunch.LWJGLGLFWKeycode; + +import java.util.HashMap; + +public class GamepadMapping { + + public static final int MOUSE_SCROLL_DOWN = -1; + public static final int MOUSE_SCROLL_UP = -2; + + + + /* + This class is just here to store the mapping + can be modified to create re-mappable controls I guess + + Be warned, you should define ALL keys if you want to avoid a non defined exception + + */ + + public int[] BUTTON_A; + public int[] BUTTON_B; + public int[] BUTTON_X; + public int[] BUTTON_Y; + + public int[] BUTTON_START; + public int[] BUTTON_SELECT; + + public int[] TRIGGER_RIGHT; //R2 + public int[] TRIGGER_LEFT; //L2 + + public int[] SHOULDER_RIGHT; //R1 + public int[] SHOULDER_LEFT; //L1 + + public int[] DIRECTION_FORWARD; + public int[] DIRECTION_BACKWARD; + public int[] DIRECTION_RIGHT; + public int[] DIRECTION_LEFT; + + public int[] THUMBSTICK_RIGHT; //R3 + public int[] THUMBSTICK_LEFT; //L3 + + public int[] DPAD_UP; + public int[] DPAD_RIGHT; + public int[] DPAD_DOWN; + public int[] DPAD_LEFT; + + + + +} From bff53f4110bbfc4d60c2487d8d03fe61041985a5 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Mon, 17 May 2021 14:13:19 +0200 Subject: [PATCH 051/179] Add WIP gamepad.java --- .../customcontrols/gamepad/Gamepad.java | 379 ++++++++++++++++++ 1 file changed, 379 insertions(+) create mode 100644 app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java new file mode 100644 index 000000000..e876d17a2 --- /dev/null +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java @@ -0,0 +1,379 @@ +package net.kdt.pojavlaunch.customcontrols.gamepad; + +import android.view.InputDevice; +import android.view.InputEvent; +import android.view.KeyEvent; +import android.view.MotionEvent; + +import net.kdt.pojavlaunch.BaseMainActivity; +import net.kdt.pojavlaunch.LWJGLGLFWKeycode; + +import org.lwjgl.glfw.CallbackBridge; + +import static net.kdt.pojavlaunch.customcontrols.gamepad.GamepadJoystick.DIRECTION_EAST; +import static net.kdt.pojavlaunch.customcontrols.gamepad.GamepadJoystick.DIRECTION_NONE; +import static net.kdt.pojavlaunch.customcontrols.gamepad.GamepadJoystick.DIRECTION_NORTH; +import static net.kdt.pojavlaunch.customcontrols.gamepad.GamepadJoystick.DIRECTION_NORTH_EAST; +import static net.kdt.pojavlaunch.customcontrols.gamepad.GamepadJoystick.DIRECTION_NORTH_WEST; +import static net.kdt.pojavlaunch.customcontrols.gamepad.GamepadJoystick.DIRECTION_SOUTH; +import static net.kdt.pojavlaunch.customcontrols.gamepad.GamepadJoystick.DIRECTION_SOUTH_EAST; +import static net.kdt.pojavlaunch.customcontrols.gamepad.GamepadJoystick.DIRECTION_SOUTH_WEST; +import static net.kdt.pojavlaunch.customcontrols.gamepad.GamepadJoystick.DIRECTION_WEST; +import static net.kdt.pojavlaunch.customcontrols.gamepad.GamepadJoystick.JOYSTICK_DEADZONE; + +public class Gamepad { + + private BaseMainActivity gameActivity; + + + private GamepadDpad gamepadDpad = new GamepadDpad(); + + private final GamepadJoystick leftJoystick = new GamepadJoystick(MotionEvent.AXIS_X, MotionEvent.AXIS_Y); + private int currentJoystickDirection = DIRECTION_NONE; + + private final GamepadJoystick rightJoystick = new GamepadJoystick(MotionEvent.AXIS_Z, MotionEvent.AXIS_RZ); + private float lastHorizontalValue = 0.0f; + private float lastVerticalValue = 0.0f; + + private final double mouseMaxAcceleration = 2f; + private double acceleration = 0.0f; + + private double mouseMagnitude; + private double mouseAngle; + private double mouseSensitivity = 19; + + private final GamepadMapping gameMap = new GamepadMapping(); + private final GamepadMapping menuMap = new GamepadMapping(); + private GamepadMapping currentMap = menuMap; + + private boolean leftThumbstickToggle = false; + private boolean rightThumbstickToggle = false; + + private boolean isGrabbing = false; + + + private Thread mouseThread; + + public Gamepad(BaseMainActivity gameActivity){ + this.gameActivity = gameActivity; + createMapping(); + + mouseThread = new Thread("Gamepad Thread"){ + long lastTime = System.nanoTime(); + final double ticks = 60D; + final double ns = 1000000000 / ticks; + double delta = 0; + + @Override + public void run() { + + + while (!isInterrupted()) { + long now = System.nanoTime(); + delta += (now - lastTime) / ns; + lastTime = now; + if(delta >= 1) { + + updateGrabbingState(); + + tick(); + + delta--; + try { + sleep((long) ((1 - delta)/ticks)); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + } + + + + private void tick(){ + if(lastHorizontalValue != 0 || lastVerticalValue != 0){ + + acceleration = (mouseMagnitude - JOYSTICK_DEADZONE)/(1 - JOYSTICK_DEADZONE); + acceleration = Math.pow(acceleration, mouseMaxAcceleration); + + if(acceleration > 1){ + acceleration = 1; + } + + gameActivity.mouse_x += Math.cos(mouseAngle) * acceleration * mouseSensitivity; + gameActivity.mouse_y -= Math.sin(mouseAngle) * acceleration * mouseSensitivity; + + CallbackBridge.sendCursorPos(gameActivity.mouse_x, gameActivity.mouse_y); + if(!isGrabbing){ + gameActivity.placeMouseAt(gameActivity.mouse_x / gameActivity.scaleFactor, gameActivity.mouse_y / gameActivity.scaleFactor); + } + } + + } + }; + mouseThread.setPriority(1); + mouseThread.start(); + } + + private void updateGrabbingState() { + boolean lastGrabbingValue = isGrabbing; + isGrabbing = CallbackBridge.isGrabbing(); + if(lastGrabbingValue != isGrabbing){ + if(isGrabbing){ + //TODO hide the cursor + currentMap = gameMap; + }else{ + //TODO place the cursor at the center + currentMap = menuMap; + + gameActivity.mouse_x = CallbackBridge.windowWidth/2; + gameActivity.mouse_y = CallbackBridge.windowHeight/2; + CallbackBridge.sendCursorPos(gameActivity.mouse_x, gameActivity.mouse_y); + gameActivity.placeMouseAt(CallbackBridge.physicalWidth/2, CallbackBridge.physicalHeight/2); + } + + } + + } + + private void createMapping(){ + //create mappings to fit our needs + + //GAMEMAP + gameMap.BUTTON_A = new int[]{LWJGLGLFWKeycode.GLFW_KEY_SPACE}; + gameMap.BUTTON_B = new int[]{LWJGLGLFWKeycode.GLFW_KEY_Q}; + gameMap.BUTTON_X = new int[]{LWJGLGLFWKeycode.GLFW_KEY_F}; + gameMap.BUTTON_Y = new int[]{LWJGLGLFWKeycode.GLFW_KEY_E}; + + gameMap.DIRECTION_FORWARD = new int[]{LWJGLGLFWKeycode.GLFW_KEY_W}; + gameMap.DIRECTION_BACKWARD = new int[]{LWJGLGLFWKeycode.GLFW_KEY_S}; + gameMap.DIRECTION_RIGHT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_D}; + gameMap.DIRECTION_LEFT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_A}; + + gameMap.DPAD_UP = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; + gameMap.DPAD_DOWN = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; + gameMap.DPAD_RIGHT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; + gameMap.DPAD_LEFT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; + + gameMap.SHOULDER_LEFT = new int[]{GamepadMapping.MOUSE_SCROLL_UP}; + gameMap.SHOULDER_RIGHT = new int[]{GamepadMapping.MOUSE_SCROLL_DOWN}; + + gameMap.TRIGGER_LEFT = new int[]{LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT}; + gameMap.TRIGGER_RIGHT = new int[]{LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT}; + + gameMap.THUMBSTICK_LEFT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_LEFT_SHIFT}; + gameMap.THUMBSTICK_RIGHT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_F5}; + + gameMap.BUTTON_START = new int[]{LWJGLGLFWKeycode.GLFW_KEY_ESCAPE}; + gameMap.BUTTON_SELECT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; + + + //MENU MAP + menuMap.BUTTON_A = new int[]{LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT}; + menuMap.BUTTON_B = new int[]{LWJGLGLFWKeycode.GLFW_KEY_ESCAPE}; + menuMap.BUTTON_X = new int[]{LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT}; + menuMap.BUTTON_Y = new int[]{LWJGLGLFWKeycode.GLFW_KEY_LEFT_SHIFT, LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT}; //Oops, doesn't work since left shift isn't properly applied. + + menuMap.DIRECTION_FORWARD = new int[]{GamepadMapping.MOUSE_SCROLL_UP, GamepadMapping.MOUSE_SCROLL_UP, GamepadMapping.MOUSE_SCROLL_UP,GamepadMapping.MOUSE_SCROLL_UP,GamepadMapping.MOUSE_SCROLL_UP}; + menuMap.DIRECTION_BACKWARD = new int[]{GamepadMapping.MOUSE_SCROLL_DOWN, GamepadMapping.MOUSE_SCROLL_DOWN, GamepadMapping.MOUSE_SCROLL_DOWN,GamepadMapping.MOUSE_SCROLL_DOWN,GamepadMapping.MOUSE_SCROLL_DOWN}; + menuMap.DIRECTION_RIGHT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; + menuMap.DIRECTION_LEFT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; + + menuMap.DPAD_UP = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; + menuMap.DPAD_DOWN = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; + menuMap.DPAD_RIGHT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; + menuMap.DPAD_LEFT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; + + menuMap.SHOULDER_LEFT = new int[]{GamepadMapping.MOUSE_SCROLL_UP}; + menuMap.SHOULDER_RIGHT = new int[]{GamepadMapping.MOUSE_SCROLL_DOWN}; + + menuMap.TRIGGER_LEFT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; + menuMap.TRIGGER_RIGHT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; + + menuMap.THUMBSTICK_LEFT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; + menuMap.THUMBSTICK_RIGHT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; + + menuMap.BUTTON_START = new int[]{LWJGLGLFWKeycode.GLFW_KEY_ESCAPE}; + menuMap.BUTTON_SELECT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; + + + } + + + public void update(InputEvent event){ + if(event instanceof MotionEvent){ + update((MotionEvent) event); + } + if(event instanceof KeyEvent){ + update((KeyEvent) event); + } + } + + private void update(KeyEvent event){ + sendButton(event.getKeyCode(), event.getAction() == KeyEvent.ACTION_DOWN, getCurrentMap()); + } + + private void update(MotionEvent event){ + updateDirectionalJoystick(event); + updateMouseJoystick(event); + } + + private void updateMouseJoystick(MotionEvent event){ + GamepadJoystick currentJoystick = CallbackBridge.isGrabbing() ? rightJoystick : leftJoystick; + + lastHorizontalValue = currentJoystick.getHorizontalAxis(event); + lastVerticalValue = currentJoystick.getVerticalAxis(event); + + mouseMagnitude = currentJoystick.getMagnitude(event); + mouseAngle = currentJoystick.getAngleRadian(event); + } + + private void updateDirectionalJoystick(MotionEvent event){ + GamepadJoystick currentJoystick = CallbackBridge.isGrabbing() ? leftJoystick : rightJoystick; + + int lastJoystickDirection = currentJoystickDirection; + currentJoystickDirection = currentJoystick.getHeightDirection(event); + + if(currentJoystickDirection != lastJoystickDirection){ + sendDirectionalKeycode(lastJoystickDirection, false, getCurrentMap()); + sendDirectionalKeycode(currentJoystickDirection, true, getCurrentMap()); + } + } + + private void updateAnalogTriggers(MotionEvent event){ + sendInput(getCurrentMap().TRIGGER_RIGHT, event.getAxisValue(MotionEvent.AXIS_RTRIGGER) > 0.5); + sendInput(getCurrentMap().TRIGGER_LEFT, event.getAxisValue(MotionEvent.AXIS_LTRIGGER) > 0.5); + + } + + private GamepadMapping getCurrentMap(){ + return currentMap; + } + + private static void sendDirectionalKeycode(int direction, boolean isDown, GamepadMapping map){ + switch (direction){ + case DIRECTION_NORTH: + sendInput(map.DIRECTION_FORWARD, isDown); + break; + case DIRECTION_NORTH_EAST: + sendInput(map.DIRECTION_FORWARD, isDown); + sendInput(map.DIRECTION_RIGHT, isDown); + break; + case DIRECTION_EAST: + sendInput(map.DIRECTION_RIGHT, isDown); + break; + case DIRECTION_SOUTH_EAST: + sendInput(map.DIRECTION_RIGHT, isDown); + sendInput(map.DIRECTION_BACKWARD, isDown); + break; + case DIRECTION_SOUTH: + sendInput(map.DIRECTION_BACKWARD, isDown); + break; + case DIRECTION_SOUTH_WEST: + sendInput(map.DIRECTION_BACKWARD, isDown); + sendInput(map.DIRECTION_LEFT, isDown); + break; + case DIRECTION_WEST: + sendInput(map.DIRECTION_LEFT, isDown); + break; + case DIRECTION_NORTH_WEST: + sendInput(map.DIRECTION_FORWARD, isDown); + sendInput(map.DIRECTION_LEFT, isDown); + break; + } + } + + + private void sendButton(int keycode, boolean isDown, GamepadMapping map){ + switch (keycode){ + case KeyEvent.KEYCODE_BUTTON_A: + sendInput(map.BUTTON_A, isDown); + break; + case KeyEvent.KEYCODE_BUTTON_B: + sendInput(map.BUTTON_B, isDown); + break; + case KeyEvent.KEYCODE_BUTTON_X: + sendInput(map.BUTTON_X, isDown); + break; + case KeyEvent.KEYCODE_BUTTON_Y: + sendInput(map.BUTTON_Y, isDown); + break; + + //Shoulders + case KeyEvent.KEYCODE_BUTTON_L1: + sendInput(map.SHOULDER_LEFT, isDown); + break; + case KeyEvent.KEYCODE_BUTTON_R1: + sendInput(map.SHOULDER_RIGHT, isDown); + break; + + //Triggers + case KeyEvent.KEYCODE_BUTTON_L2: + sendInput(map.TRIGGER_LEFT, isDown); + break; + case KeyEvent.KEYCODE_BUTTON_R2: + sendInput(map.TRIGGER_RIGHT, isDown); + break; + + //L3 || R3 + case KeyEvent.KEYCODE_BUTTON_THUMBL: + leftThumbstickToggle = !leftThumbstickToggle; + if(leftThumbstickToggle) sendInput(map.THUMBSTICK_LEFT, isDown); + break; + case KeyEvent.KEYCODE_BUTTON_THUMBR: + rightThumbstickToggle = !rightThumbstickToggle; + if(rightThumbstickToggle) sendInput(map.THUMBSTICK_RIGHT, isDown); + break; + + case KeyEvent.KEYCODE_BUTTON_START: + sendInput(map.BUTTON_START, isDown); + break; + case KeyEvent.KEYCODE_BUTTON_SELECT: + sendInput(map.BUTTON_SELECT, isDown); + break; + + + default: + BaseMainActivity.sendKeyPress(LWJGLGLFWKeycode.GLFW_KEY_SPACE, CallbackBridge.getCurrentMods(), isDown); + break; + } + } + + private static void sendInput(int[] keycodes, boolean isDown){ + for(int keycode : keycodes){ + switch (keycode){ + case GamepadMapping.MOUSE_SCROLL_DOWN: + if(isDown) CallbackBridge.sendScroll(0, -1); + return; + case GamepadMapping.MOUSE_SCROLL_UP: + if(isDown) CallbackBridge.sendScroll(0, 1); + return; + + case LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT: + BaseMainActivity.sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT, isDown); + return; + case LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT: + BaseMainActivity.sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT, isDown); + return; + + + default: + BaseMainActivity.sendKeyPress(keycode, CallbackBridge.getCurrentMods(), isDown); + return; + } + } + + } + + public static boolean isGamepadEvent(InputEvent event){ + if(event instanceof KeyEvent){ + return (event.getSource() & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD; + } + if(event instanceof MotionEvent){ + return GamepadJoystick.isJoystickEvent((MotionEvent) event) || GamepadDpad.isDpadEvent(event); + } + + return false; + } + +} From 91c04a15c35847f7a8179514a9d112de9c48c831 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Mon, 17 May 2021 14:13:56 +0200 Subject: [PATCH 052/179] Introduce the gamepad feature for testing. --- .../net/kdt/pojavlaunch/BaseMainActivity.java | 195 +++++++----------- 1 file changed, 77 insertions(+), 118 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java index 8e2cc80c9..1f697fa2b 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java @@ -11,16 +11,18 @@ import android.view.View.*; import android.view.inputmethod.*; import android.widget.*; -import androidx.annotation.NonNull; import androidx.drawerlayout.widget.*; import com.google.android.material.navigation.*; import java.io.*; import java.lang.reflect.*; -import java.nio.ByteBuffer; -import java.nio.FloatBuffer; import java.util.*; import net.kdt.pojavlaunch.customcontrols.*; + import net.kdt.pojavlaunch.multirt.MultiRTUtils; + +import net.kdt.pojavlaunch.customcontrols.gamepad.Gamepad; +import net.kdt.pojavlaunch.customcontrols.gamepad.GamepadJoystick; + import net.kdt.pojavlaunch.prefs.*; import net.kdt.pojavlaunch.utils.*; import net.kdt.pojavlaunch.value.*; @@ -37,7 +39,7 @@ public class BaseMainActivity extends LoggableActivity { LWJGLGLFWKeycode.GLFW_KEY_7, LWJGLGLFWKeycode.GLFW_KEY_8, LWJGLGLFWKeycode.GLFW_KEY_9}; private boolean rightOverride = false; - private float scaleFactor = 1; + public float scaleFactor = 1; private int fingerStillThreshold = 8; private int initialX, initialY; private int scrollInitialX, scrollInitialY; @@ -111,7 +113,9 @@ public class BaseMainActivity extends LoggableActivity { private boolean lastGrab = false; private boolean isExited = false; private boolean isLogAllow = false; - private volatile int mouse_x, mouse_y; + + public volatile int mouse_x, mouse_y; + // private int navBarHeight = 40; // private static Collection rsaPkcs1List; @@ -254,37 +258,23 @@ public class BaseMainActivity extends LoggableActivity { if (lastGrab != CallbackBridge.isGrabbing()) mousePointer.post(new Runnable(){ - @Override - public void run() - { - if (!CallbackBridge.isGrabbing() && isVirtualMouseEnabled) { - touchPad.setVisibility(View.VISIBLE); - placeMouseAt(displayMetrics.widthPixels / 2, displayMetrics.heightPixels / 2); - } - - if (CallbackBridge.isGrabbing() && touchPad.getVisibility() != View.GONE) { - touchPad.setVisibility(View.GONE); - } - /* - if (isAndroid8OrHigher()) { - if (!CallbackBridge.isGrabbing() && isCapturing) { - minecraftGLView.releasePointerCapture(); - minecraftGLView.clearFocus(); - isCapturing = false; - } else if (CallbackBridge.isGrabbing() && !isCapturing) { - minecraftGLView.requestFocus(); - minecraftGLView.requestPointerCapture(); - isCapturing = true; - } - } - */ - lastGrab = CallbackBridge.isGrabbing(); + @Override + public void run() + { + if (!CallbackBridge.isGrabbing() && isVirtualMouseEnabled) { + touchPad.setVisibility(View.VISIBLE); + placeMouseAt(displayMetrics.widthPixels / 2, displayMetrics.heightPixels / 2); } - }); - // try { - // Thread.sleep(100); - // } catch (Throwable th) {} + if (CallbackBridge.isGrabbing() && touchPad.getVisibility() != View.GONE) { + touchPad.setVisibility(View.GONE); + } + + lastGrab = CallbackBridge.isGrabbing(); + } + }); + + } } }, "VirtualMouseGrabThread").start(); @@ -347,6 +337,7 @@ public class BaseMainActivity extends LoggableActivity { break; case MotionEvent.ACTION_MOVE: // 2 + if (!CallbackBridge.isGrabbing() && event.getPointerCount() == 2 && !LauncherPreferences.PREF_DISABLE_GESTURES) { CallbackBridge.sendScroll(CallbackBridge.mouseX - scrollInitialX, CallbackBridge.mouseY - scrollInitialY); scrollInitialX = CallbackBridge.mouseX; @@ -364,7 +355,7 @@ public class BaseMainActivity extends LoggableActivity { CallbackBridge.sendMouseKeycode(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT, 0, isRightMouseDown); } */ - } + break; } } @@ -662,70 +653,50 @@ public class BaseMainActivity extends LoggableActivity { } } - /* - @Override - public boolean dispatchKeyEvent(KeyEvent event) { - switch (event.getAction()) { - case KeyEvent.ACTION_DOWN: - AndroidLWJGLKeycode.execKey(event, event.getKeyCode(), true); - break; - - case KeyEvent.ACTION_UP: - AndroidLWJGLKeycode.execKey(event, event.getKeyCode(), false); - break; - } - - return super.dispatchKeyEvent(event); - } - */ + + private final Gamepad gamepad = new Gamepad(this); @Override public boolean dispatchGenericMotionEvent(MotionEvent ev) { int mouseCursorIndex = -1; - if(ev.getSource() == InputDevice.SOURCE_CLASS_JOYSTICK) { - CallbackBridge.nativePutControllerAxes((FloatBuffer)FloatBuffer.allocate(8) - .put(ev.getAxisValue(MotionEvent.AXIS_X)) - .put(ev.getAxisValue(MotionEvent.AXIS_Y)) - .put(ev.getAxisValue(MotionEvent.AXIS_Z)) - .put(ev.getAxisValue(MotionEvent.AXIS_RX)) - .put(ev.getAxisValue(MotionEvent.AXIS_RY)) - .put(ev.getAxisValue(MotionEvent.AXIS_RZ)) - .put(ev.getAxisValue(MotionEvent.AXIS_HAT_X)) - .put(ev.getAxisValue(MotionEvent.AXIS_HAT_Y)) - .flip()); - return true;//consume the cum chalice - }else { - for(int i = 0; i < ev.getPointerCount(); i++) { - if(ev.getToolType(i) == MotionEvent.TOOL_TYPE_MOUSE) { - mouseCursorIndex = i; - } - } - if(mouseCursorIndex == -1) return false; // we cant consoom that, theres no mice! - if(CallbackBridge.isGrabbing()) { - if(BaseMainActivity.isAndroid8OrHigher()) minecraftGLView.requestPointerCapture(); - } - switch(ev.getActionMasked()) { - case MotionEvent.ACTION_HOVER_MOVE: - mouse_x = (int) (ev.getX(mouseCursorIndex) * scaleFactor); - mouse_y = (int) (ev.getY(mouseCursorIndex) * scaleFactor); - CallbackBridge.mouseX = mouse_x; - CallbackBridge.mouseY = mouse_y; - CallbackBridge.sendCursorPos(mouse_x,mouse_y); - debugText.setText(CallbackBridge.DEBUG_STRING.toString()); - CallbackBridge.DEBUG_STRING.setLength(0); - return true; - case MotionEvent.ACTION_SCROLL: - CallbackBridge.sendScroll((double) ev.getAxisValue(MotionEvent.AXIS_VSCROLL), (double) ev.getAxisValue(MotionEvent.AXIS_HSCROLL)); - return true; - case MotionEvent.ACTION_BUTTON_PRESS: - return sendMouseButtonUnconverted(ev.getActionButton(),true); - case MotionEvent.ACTION_BUTTON_RELEASE: - return sendMouseButtonUnconverted(ev.getActionButton(),false); - default: - return false; - } + + if(Gamepad.isGamepadEvent(ev)){ + gamepad.update(ev); + return true; } + for(int i = 0; i < ev.getPointerCount(); i++) { + if(ev.getToolType(i) == MotionEvent.TOOL_TYPE_MOUSE) { + mouseCursorIndex = i; + } + } + if(mouseCursorIndex == -1) return false; // we cant consoom that, theres no mice! + if(CallbackBridge.isGrabbing()) { + if(BaseMainActivity.isAndroid8OrHigher()) minecraftGLView.requestPointerCapture(); + } + switch(ev.getActionMasked()) { + case MotionEvent.ACTION_HOVER_MOVE: + mouse_x = (int) (ev.getX(mouseCursorIndex) * scaleFactor); + mouse_y = (int) (ev.getY(mouseCursorIndex) * scaleFactor); + CallbackBridge.mouseX = mouse_x; + CallbackBridge.mouseY = mouse_y; + CallbackBridge.sendCursorPos(mouse_x,mouse_y); + debugText.setText(CallbackBridge.DEBUG_STRING.toString()); + CallbackBridge.DEBUG_STRING.setLength(0); + return true; + case MotionEvent.ACTION_SCROLL: + CallbackBridge.sendScroll((double) ev.getAxisValue(MotionEvent.AXIS_VSCROLL), (double) ev.getAxisValue(MotionEvent.AXIS_HSCROLL)); + return true; + case MotionEvent.ACTION_BUTTON_PRESS: + return sendMouseButtonUnconverted(ev.getActionButton(),true); + case MotionEvent.ACTION_BUTTON_RELEASE: + return sendMouseButtonUnconverted(ev.getActionButton(),false); + default: + return false; + } + + } + boolean isKeyboard(KeyEvent evt) { System.out.println("Event:" +evt); //if((evt.getFlags() & KeyEvent.FLAG_SOFT_KEYBOARD) == KeyEvent.FLAG_SOFT_KEYBOARD) return true; @@ -734,35 +705,23 @@ public class BaseMainActivity extends LoggableActivity { if(AndroidLWJGLKeycode.androidToLwjglMap.containsKey(evt.getKeyCode())) return true; return false; } - byte[] kevArray = new byte[8]; + + @Override public boolean dispatchKeyEvent(KeyEvent event) { - System.out.println(event.getSource() + " "+ event.getFlags()); - if(event.getSource() == InputDevice.SOURCE_CLASS_JOYSTICK) { - switch(event.getKeyCode()) { - case KeyEvent.KEYCODE_BUTTON_A: - kevArray[0]= (byte) ((event.getAction() == KeyEvent.ACTION_DOWN)?1:0); - case KeyEvent.KEYCODE_BUTTON_B: - kevArray[1]=(byte) ((event.getAction() == KeyEvent.ACTION_DOWN)?1:0); - case KeyEvent.KEYCODE_BUTTON_X: - kevArray[2]=(byte) ((event.getAction() == KeyEvent.ACTION_DOWN)?1:0); - case KeyEvent.KEYCODE_BUTTON_Y: - kevArray[3]=(byte) ((event.getAction() == KeyEvent.ACTION_DOWN)?1:0); - case KeyEvent.KEYCODE_DPAD_LEFT: - kevArray[4]=(byte) ((event.getAction() == KeyEvent.ACTION_DOWN)?1:0); - case KeyEvent.KEYCODE_DPAD_RIGHT: - kevArray[5]=(byte) ((event.getAction() == KeyEvent.ACTION_DOWN)?1:0); - case KeyEvent.KEYCODE_DPAD_UP: - kevArray[6]=(byte) ((event.getAction() == KeyEvent.ACTION_DOWN)?1:0); - case KeyEvent.KEYCODE_DPAD_DOWN: - kevArray[7]=(byte) ((event.getAction() == KeyEvent.ACTION_DOWN)?1:0); - } - CallbackBridge.nativePutControllerButtons(ByteBuffer.wrap(kevArray)); + System.out.println(event); + + if(Gamepad.isGamepadEvent(event)){ + gamepad.update(event); return true; - }else if(isKeyboard(event)) { - AndroidLWJGLKeycode.execKey(event,event.getKeyCode(),event.getAction() == KeyEvent.ACTION_DOWN); + } + + if(isKeyboard(event)) { + AndroidLWJGLKeycode.execKey(event,event.getKeyCode(),event.getAction() == KeyEvent.ACTION_DOWN); return true; - }else return false; + } + + return false; } //private Dialog menuDial; From 1d63e30e6c0d0dc5ea1150077d5f883a6fc61314 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Thu, 20 May 2021 14:37:29 +0200 Subject: [PATCH 053/179] Add GamepadButton.java --- .../customcontrols/gamepad/GamepadButton.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadButton.java diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadButton.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadButton.java new file mode 100644 index 000000000..be9d8bcf8 --- /dev/null +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadButton.java @@ -0,0 +1,26 @@ +package net.kdt.pojavlaunch.customcontrols.gamepad; + +import android.view.KeyEvent; + +public class GamepadButton { + + /* + Just a simple button, that auto deal with the great habit from android to just SPAAAM input events + */ + public int[] keycodes; + private boolean isDown = false; + + public void update(KeyEvent event){ + boolean down = (event.getAction() == KeyEvent.ACTION_DOWN); + if(down != isDown){ + isDown = down; + Gamepad.sendInput(keycodes, isDown); + } + + } + + public void resetButtonState(){ + isDown = false; + } + +} From ddb2307a3d82f26cb4df582ceaa0d6122676c178 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Thu, 20 May 2021 14:41:41 +0200 Subject: [PATCH 054/179] GameButtons are now used in the mapping - Fixes spam issue --- .../customcontrols/gamepad/Gamepad.java | 108 +++++++++--------- .../gamepad/GamepadMapping.java | 57 ++++++--- 2 files changed, 94 insertions(+), 71 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java index e876d17a2..2a1d56cf0 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java @@ -46,9 +46,6 @@ public class Gamepad { private final GamepadMapping menuMap = new GamepadMapping(); private GamepadMapping currentMap = menuMap; - private boolean leftThumbstickToggle = false; - private boolean rightThumbstickToggle = false; - private boolean isGrabbing = false; @@ -122,9 +119,11 @@ public class Gamepad { if(isGrabbing){ //TODO hide the cursor currentMap = gameMap; + menuMap.resetPressedState(); }else{ //TODO place the cursor at the center currentMap = menuMap; + gameMap.resetPressedState(); gameActivity.mouse_x = CallbackBridge.windowWidth/2; gameActivity.mouse_y = CallbackBridge.windowHeight/2; @@ -140,61 +139,61 @@ public class Gamepad { //create mappings to fit our needs //GAMEMAP - gameMap.BUTTON_A = new int[]{LWJGLGLFWKeycode.GLFW_KEY_SPACE}; - gameMap.BUTTON_B = new int[]{LWJGLGLFWKeycode.GLFW_KEY_Q}; - gameMap.BUTTON_X = new int[]{LWJGLGLFWKeycode.GLFW_KEY_F}; - gameMap.BUTTON_Y = new int[]{LWJGLGLFWKeycode.GLFW_KEY_E}; + gameMap.BUTTON_A.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_SPACE}; + gameMap.BUTTON_B.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_Q}; + gameMap.BUTTON_X.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_F}; + gameMap.BUTTON_Y.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_E}; gameMap.DIRECTION_FORWARD = new int[]{LWJGLGLFWKeycode.GLFW_KEY_W}; gameMap.DIRECTION_BACKWARD = new int[]{LWJGLGLFWKeycode.GLFW_KEY_S}; gameMap.DIRECTION_RIGHT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_D}; gameMap.DIRECTION_LEFT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_A}; - gameMap.DPAD_UP = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; - gameMap.DPAD_DOWN = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; - gameMap.DPAD_RIGHT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; - gameMap.DPAD_LEFT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; + gameMap.DPAD_UP.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; + gameMap.DPAD_DOWN.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; + gameMap.DPAD_RIGHT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; + gameMap.DPAD_LEFT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; - gameMap.SHOULDER_LEFT = new int[]{GamepadMapping.MOUSE_SCROLL_UP}; - gameMap.SHOULDER_RIGHT = new int[]{GamepadMapping.MOUSE_SCROLL_DOWN}; + gameMap.SHOULDER_LEFT.keycodes = new int[]{GamepadMapping.MOUSE_SCROLL_UP}; + gameMap.SHOULDER_RIGHT.keycodes = new int[]{GamepadMapping.MOUSE_SCROLL_DOWN}; - gameMap.TRIGGER_LEFT = new int[]{LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT}; - gameMap.TRIGGER_RIGHT = new int[]{LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT}; + gameMap.TRIGGER_LEFT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT}; + gameMap.TRIGGER_RIGHT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT}; - gameMap.THUMBSTICK_LEFT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_LEFT_SHIFT}; - gameMap.THUMBSTICK_RIGHT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_F5}; + gameMap.THUMBSTICK_LEFT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_LEFT_SHIFT}; + gameMap.THUMBSTICK_RIGHT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_F5}; - gameMap.BUTTON_START = new int[]{LWJGLGLFWKeycode.GLFW_KEY_ESCAPE}; - gameMap.BUTTON_SELECT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; + gameMap.BUTTON_START.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_ESCAPE}; + gameMap.BUTTON_SELECT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; //MENU MAP - menuMap.BUTTON_A = new int[]{LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT}; - menuMap.BUTTON_B = new int[]{LWJGLGLFWKeycode.GLFW_KEY_ESCAPE}; - menuMap.BUTTON_X = new int[]{LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT}; - menuMap.BUTTON_Y = new int[]{LWJGLGLFWKeycode.GLFW_KEY_LEFT_SHIFT, LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT}; //Oops, doesn't work since left shift isn't properly applied. + menuMap.BUTTON_A.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT}; + menuMap.BUTTON_B.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_ESCAPE}; + menuMap.BUTTON_X.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT}; + menuMap.BUTTON_Y.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_LEFT_SHIFT, LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT}; //Oops, doesn't work since left shift isn't properly applied. menuMap.DIRECTION_FORWARD = new int[]{GamepadMapping.MOUSE_SCROLL_UP, GamepadMapping.MOUSE_SCROLL_UP, GamepadMapping.MOUSE_SCROLL_UP,GamepadMapping.MOUSE_SCROLL_UP,GamepadMapping.MOUSE_SCROLL_UP}; menuMap.DIRECTION_BACKWARD = new int[]{GamepadMapping.MOUSE_SCROLL_DOWN, GamepadMapping.MOUSE_SCROLL_DOWN, GamepadMapping.MOUSE_SCROLL_DOWN,GamepadMapping.MOUSE_SCROLL_DOWN,GamepadMapping.MOUSE_SCROLL_DOWN}; menuMap.DIRECTION_RIGHT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; menuMap.DIRECTION_LEFT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; - menuMap.DPAD_UP = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; - menuMap.DPAD_DOWN = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; - menuMap.DPAD_RIGHT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; - menuMap.DPAD_LEFT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; + menuMap.DPAD_UP.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; + menuMap.DPAD_DOWN.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; + menuMap.DPAD_RIGHT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; + menuMap.DPAD_LEFT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; - menuMap.SHOULDER_LEFT = new int[]{GamepadMapping.MOUSE_SCROLL_UP}; - menuMap.SHOULDER_RIGHT = new int[]{GamepadMapping.MOUSE_SCROLL_DOWN}; + menuMap.SHOULDER_LEFT.keycodes = new int[]{GamepadMapping.MOUSE_SCROLL_UP}; + menuMap.SHOULDER_RIGHT.keycodes = new int[]{GamepadMapping.MOUSE_SCROLL_DOWN}; - menuMap.TRIGGER_LEFT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; - menuMap.TRIGGER_RIGHT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; + menuMap.TRIGGER_LEFT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; + menuMap.TRIGGER_RIGHT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; - menuMap.THUMBSTICK_LEFT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; - menuMap.THUMBSTICK_RIGHT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; + menuMap.THUMBSTICK_LEFT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; + menuMap.THUMBSTICK_RIGHT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; - menuMap.BUTTON_START = new int[]{LWJGLGLFWKeycode.GLFW_KEY_ESCAPE}; - menuMap.BUTTON_SELECT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; + menuMap.BUTTON_START.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_ESCAPE}; + menuMap.BUTTON_SELECT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; } @@ -210,7 +209,7 @@ public class Gamepad { } private void update(KeyEvent event){ - sendButton(event.getKeyCode(), event.getAction() == KeyEvent.ACTION_DOWN, getCurrentMap()); + sendButton(event); } private void update(MotionEvent event){ @@ -241,8 +240,8 @@ public class Gamepad { } private void updateAnalogTriggers(MotionEvent event){ - sendInput(getCurrentMap().TRIGGER_RIGHT, event.getAxisValue(MotionEvent.AXIS_RTRIGGER) > 0.5); - sendInput(getCurrentMap().TRIGGER_LEFT, event.getAxisValue(MotionEvent.AXIS_LTRIGGER) > 0.5); + //sendInput(getCurrentMap().TRIGGER_RIGHT, event.getAxisValue(MotionEvent.AXIS_RTRIGGER) > 0.5); + //sendInput(getCurrentMap().TRIGGER_LEFT, event.getAxisValue(MotionEvent.AXIS_LTRIGGER) > 0.5); } @@ -284,62 +283,61 @@ public class Gamepad { } - private void sendButton(int keycode, boolean isDown, GamepadMapping map){ + private void sendButton(KeyEvent event){ + int keycode = event.getKeyCode(); switch (keycode){ case KeyEvent.KEYCODE_BUTTON_A: - sendInput(map.BUTTON_A, isDown); + getCurrentMap().BUTTON_A.update(event); break; case KeyEvent.KEYCODE_BUTTON_B: - sendInput(map.BUTTON_B, isDown); + getCurrentMap().BUTTON_B.update(event); break; case KeyEvent.KEYCODE_BUTTON_X: - sendInput(map.BUTTON_X, isDown); + getCurrentMap().BUTTON_X.update(event); break; case KeyEvent.KEYCODE_BUTTON_Y: - sendInput(map.BUTTON_Y, isDown); + getCurrentMap().BUTTON_Y.update(event); break; //Shoulders case KeyEvent.KEYCODE_BUTTON_L1: - sendInput(map.SHOULDER_LEFT, isDown); + getCurrentMap().SHOULDER_LEFT.update(event); break; case KeyEvent.KEYCODE_BUTTON_R1: - sendInput(map.SHOULDER_RIGHT, isDown); + getCurrentMap().SHOULDER_RIGHT.update(event); break; //Triggers case KeyEvent.KEYCODE_BUTTON_L2: - sendInput(map.TRIGGER_LEFT, isDown); + getCurrentMap().TRIGGER_LEFT.update(event); break; case KeyEvent.KEYCODE_BUTTON_R2: - sendInput(map.TRIGGER_RIGHT, isDown); + getCurrentMap().TRIGGER_RIGHT.update(event); break; //L3 || R3 case KeyEvent.KEYCODE_BUTTON_THUMBL: - leftThumbstickToggle = !leftThumbstickToggle; - if(leftThumbstickToggle) sendInput(map.THUMBSTICK_LEFT, isDown); + getCurrentMap().THUMBSTICK_LEFT.update(event); break; case KeyEvent.KEYCODE_BUTTON_THUMBR: - rightThumbstickToggle = !rightThumbstickToggle; - if(rightThumbstickToggle) sendInput(map.THUMBSTICK_RIGHT, isDown); + getCurrentMap().THUMBSTICK_RIGHT.update(event); break; case KeyEvent.KEYCODE_BUTTON_START: - sendInput(map.BUTTON_START, isDown); + getCurrentMap().BUTTON_START.update(event); break; case KeyEvent.KEYCODE_BUTTON_SELECT: - sendInput(map.BUTTON_SELECT, isDown); + getCurrentMap().BUTTON_SELECT.update(event); break; default: - BaseMainActivity.sendKeyPress(LWJGLGLFWKeycode.GLFW_KEY_SPACE, CallbackBridge.getCurrentMods(), isDown); + BaseMainActivity.sendKeyPress(LWJGLGLFWKeycode.GLFW_KEY_SPACE, CallbackBridge.getCurrentMods(), event.getAction() == KeyEvent.ACTION_DOWN); break; } } - private static void sendInput(int[] keycodes, boolean isDown){ + public static void sendInput(int[] keycodes, boolean isDown){ for(int keycode : keycodes){ switch (keycode){ case GamepadMapping.MOUSE_SCROLL_DOWN: diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadMapping.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadMapping.java index b47aaea77..61af4a286 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadMapping.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadMapping.java @@ -2,6 +2,7 @@ package net.kdt.pojavlaunch.customcontrols.gamepad; import net.kdt.pojavlaunch.LWJGLGLFWKeycode; +import java.security.PublicKey; import java.util.HashMap; public class GamepadMapping { @@ -19,34 +20,58 @@ public class GamepadMapping { */ - public int[] BUTTON_A; - public int[] BUTTON_B; - public int[] BUTTON_X; - public int[] BUTTON_Y; + public GamepadButton BUTTON_A = new GamepadButton(); + public GamepadButton BUTTON_B = new GamepadButton(); + public GamepadButton BUTTON_X = new GamepadButton(); + public GamepadButton BUTTON_Y = new GamepadButton(); - public int[] BUTTON_START; - public int[] BUTTON_SELECT; + public GamepadButton BUTTON_START = new GamepadButton(); + public GamepadButton BUTTON_SELECT = new GamepadButton(); - public int[] TRIGGER_RIGHT; //R2 - public int[] TRIGGER_LEFT; //L2 + public GamepadButton TRIGGER_RIGHT = new GamepadButton(); //R2 + public GamepadButton TRIGGER_LEFT = new GamepadButton(); //L2 - public int[] SHOULDER_RIGHT; //R1 - public int[] SHOULDER_LEFT; //L1 + public GamepadButton SHOULDER_RIGHT = new GamepadButton(); //R1 + public GamepadButton SHOULDER_LEFT = new GamepadButton(); //L1 public int[] DIRECTION_FORWARD; public int[] DIRECTION_BACKWARD; public int[] DIRECTION_RIGHT; public int[] DIRECTION_LEFT; - public int[] THUMBSTICK_RIGHT; //R3 - public int[] THUMBSTICK_LEFT; //L3 + public GamepadButton THUMBSTICK_RIGHT = new GamepadButton(); //R3 + public GamepadButton THUMBSTICK_LEFT = new GamepadButton(); //L3 - public int[] DPAD_UP; - public int[] DPAD_RIGHT; - public int[] DPAD_DOWN; - public int[] DPAD_LEFT; + public GamepadButton DPAD_UP = new GamepadButton(); + public GamepadButton DPAD_RIGHT = new GamepadButton(); + public GamepadButton DPAD_DOWN = new GamepadButton(); + public GamepadButton DPAD_LEFT = new GamepadButton(); + public void resetPressedState(){ + BUTTON_A.resetButtonState(); + BUTTON_B.resetButtonState(); + BUTTON_X.resetButtonState(); + BUTTON_Y.resetButtonState(); + + BUTTON_START.resetButtonState(); + BUTTON_SELECT.resetButtonState(); + + TRIGGER_LEFT.resetButtonState(); + TRIGGER_RIGHT.resetButtonState(); + + SHOULDER_LEFT.resetButtonState(); + SHOULDER_RIGHT.resetButtonState(); + + THUMBSTICK_LEFT.resetButtonState(); + THUMBSTICK_RIGHT.resetButtonState(); + + DPAD_UP.resetButtonState(); + DPAD_RIGHT.resetButtonState(); + DPAD_DOWN.resetButtonState(); + DPAD_LEFT.resetButtonState(); + + } } From 3c1bb45f5725db75784698a340284e1e7641c9cf Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Thu, 20 May 2021 15:43:15 +0200 Subject: [PATCH 055/179] Gamebutton is more flexible now --- .../customcontrols/gamepad/GamepadButton.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadButton.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadButton.java index be9d8bcf8..7cedaf6fd 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadButton.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadButton.java @@ -11,12 +11,15 @@ public class GamepadButton { private boolean isDown = false; public void update(KeyEvent event){ - boolean down = (event.getAction() == KeyEvent.ACTION_DOWN); - if(down != isDown){ - isDown = down; + boolean isKeyDown = (event.getAction() == KeyEvent.ACTION_DOWN); + update(isKeyDown); + } + + public void update(boolean isKeyDown){ + if(isKeyDown != isDown){ + isDown = isKeyDown; Gamepad.sendInput(keycodes, isDown); } - } public void resetButtonState(){ From 2d3349ceede9b2fa0a21ca089089f11ce42cc41e Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Thu, 20 May 2021 15:43:33 +0200 Subject: [PATCH 056/179] Add support for analog triggers --- .../net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java index 2a1d56cf0..c52c4daa0 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java @@ -215,6 +215,7 @@ public class Gamepad { private void update(MotionEvent event){ updateDirectionalJoystick(event); updateMouseJoystick(event); + updateAnalogTriggers(event); } private void updateMouseJoystick(MotionEvent event){ @@ -240,8 +241,8 @@ public class Gamepad { } private void updateAnalogTriggers(MotionEvent event){ - //sendInput(getCurrentMap().TRIGGER_RIGHT, event.getAxisValue(MotionEvent.AXIS_RTRIGGER) > 0.5); - //sendInput(getCurrentMap().TRIGGER_LEFT, event.getAxisValue(MotionEvent.AXIS_LTRIGGER) > 0.5); + getCurrentMap().TRIGGER_LEFT.update(event.getAxisValue(MotionEvent.AXIS_LTRIGGER) > 0.5); + getCurrentMap().TRIGGER_RIGHT.update(event.getAxisValue(MotionEvent.AXIS_RTRIGGER) > 0.5); } From 8988a6075f64066984794cae6aede884233f1148 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Thu, 20 May 2021 20:04:19 +0200 Subject: [PATCH 057/179] Fix subControlButton appearing when using GUI button --- .../java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java index 4e7d0c352..257fb4612 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java @@ -231,6 +231,7 @@ public class ControlLayout extends FrameLayout if(view instanceof ControlSubButton){ view.setVisibility(mControlVisible ? (((ControlSubButton)view).parentDrawer.areButtonsVisible ? VISIBLE : GONE) : View.GONE); + continue; } if(view instanceof ControlDrawer){ From 28725743fa63e5aca4c1510bc4074142fba27769 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Fri, 21 May 2021 08:45:07 +0200 Subject: [PATCH 058/179] Fix more than one keycode not taken into account --- .../pojavlaunch/customcontrols/gamepad/Gamepad.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java index c52c4daa0..4a8511aa5 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java @@ -343,22 +343,22 @@ public class Gamepad { switch (keycode){ case GamepadMapping.MOUSE_SCROLL_DOWN: if(isDown) CallbackBridge.sendScroll(0, -1); - return; + break; case GamepadMapping.MOUSE_SCROLL_UP: if(isDown) CallbackBridge.sendScroll(0, 1); - return; + break; case LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT: BaseMainActivity.sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT, isDown); - return; + break; case LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT: BaseMainActivity.sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT, isDown); - return; + break; default: BaseMainActivity.sendKeyPress(keycode, CallbackBridge.getCurrentMods(), isDown); - return; + break; } } From b86de4db95249f41d6298d1a392b5891b3d681f3 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Fri, 21 May 2021 10:19:54 +0200 Subject: [PATCH 059/179] Any gameButton can be toogled if needed now --- .../customcontrols/gamepad/GamepadButton.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadButton.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadButton.java index 7cedaf6fd..d6a0d1f07 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadButton.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadButton.java @@ -8,7 +8,9 @@ public class GamepadButton { Just a simple button, that auto deal with the great habit from android to just SPAAAM input events */ public int[] keycodes; + public boolean isToggleable = false; private boolean isDown = false; + private boolean toggled = false; public void update(KeyEvent event){ boolean isKeyDown = (event.getAction() == KeyEvent.ACTION_DOWN); @@ -18,6 +20,14 @@ public class GamepadButton { public void update(boolean isKeyDown){ if(isKeyDown != isDown){ isDown = isKeyDown; + if(isToggleable){ + if(isKeyDown){ + toggled = !toggled; + Gamepad.sendInput(keycodes, toggled); + } + return; + } + Gamepad.sendInput(keycodes, isDown); } } From 331a637e19b4e4e4c2a640214e88abb2bf291b6c Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Fri, 21 May 2021 10:21:17 +0200 Subject: [PATCH 060/179] Add ability to retreive gamepadButton state --- .../kdt/pojavlaunch/customcontrols/gamepad/GamepadButton.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadButton.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadButton.java index d6a0d1f07..410fb6f32 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadButton.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadButton.java @@ -35,5 +35,8 @@ public class GamepadButton { public void resetButtonState(){ isDown = false; } + public boolean isDown(){ + return isToggleable ? toggled : isDown; + } } From 8164f4a9a9624ebfda1169126e4efa9eae133445 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Fri, 21 May 2021 10:21:58 +0200 Subject: [PATCH 061/179] Set shift key to be toggleable --- .../java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java index 4a8511aa5..c073eebcc 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java @@ -161,6 +161,7 @@ public class Gamepad { gameMap.TRIGGER_RIGHT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT}; gameMap.THUMBSTICK_LEFT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_LEFT_SHIFT}; + gameMap.THUMBSTICK_LEFT.isToggleable = true; gameMap.THUMBSTICK_RIGHT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_F5}; gameMap.BUTTON_START.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_ESCAPE}; From d994c12cc3c8d3b43d4109eabbeaa4ae9bd241d8 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Fri, 21 May 2021 10:30:55 +0200 Subject: [PATCH 062/179] Fix toogle state not resetting --- .../kdt/pojavlaunch/customcontrols/gamepad/GamepadButton.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadButton.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadButton.java index 410fb6f32..7f17df65b 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadButton.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadButton.java @@ -34,6 +34,7 @@ public class GamepadButton { public void resetButtonState(){ isDown = false; + toggled = false; } public boolean isDown(){ return isToggleable ? toggled : isDown; From 90aac77adeb1b004c93931e0a8fc034f820c9162 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Fri, 21 May 2021 14:56:02 +0200 Subject: [PATCH 063/179] add ability to detect if a gamepad is connected --- .../main/java/net/kdt/pojavlaunch/Tools.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java index 2896c7743..27c0a9a00 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java @@ -923,4 +923,21 @@ public final class Tools } } + public static InputDevice grabFirstGamepad() { + + int[] deviceIds = InputDevice.getDeviceIds(); + for (int deviceId : deviceIds) { + InputDevice dev = InputDevice.getDevice(deviceId); + int sources = dev.getSources(); + + // Verify that the device has gamepad buttons, control sticks, or both. + if (((sources & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD) + || ((sources & InputDevice.SOURCE_JOYSTICK) + == InputDevice.SOURCE_JOYSTICK)) { + // This device is a game controller. Store its device ID. + return dev; + } + } + return null; + } } From 4edb0ebe34a13599fbea12a4397a8e66a8783b65 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Fri, 21 May 2021 14:57:40 +0200 Subject: [PATCH 064/179] New deadzone system + auto-grab controller --- .../net/kdt/pojavlaunch/BaseMainActivity.java | 12 +++++++++- .../customcontrols/gamepad/Gamepad.java | 21 ++++++++++-------- .../gamepad/GamepadJoystick.java | 22 +++++++++++-------- 3 files changed, 36 insertions(+), 19 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java index 1f697fa2b..b4ab4ea48 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java @@ -38,6 +38,8 @@ public class BaseMainActivity extends LoggableActivity { LWJGLGLFWKeycode.GLFW_KEY_4, LWJGLGLFWKeycode.GLFW_KEY_5, LWJGLGLFWKeycode.GLFW_KEY_6, LWJGLGLFWKeycode.GLFW_KEY_7, LWJGLGLFWKeycode.GLFW_KEY_8, LWJGLGLFWKeycode.GLFW_KEY_9}; + private Gamepad gamepad; + private boolean rightOverride = false; public float scaleFactor = 1; private int fingerStillThreshold = 8; @@ -654,12 +656,16 @@ public class BaseMainActivity extends LoggableActivity { } - private final Gamepad gamepad = new Gamepad(this); + @Override public boolean dispatchGenericMotionEvent(MotionEvent ev) { int mouseCursorIndex = -1; if(Gamepad.isGamepadEvent(ev)){ + if(gamepad == null){ + gamepad = new Gamepad(this, Tools.grabFirstGamepad()); + } + gamepad.update(ev); return true; } @@ -712,6 +718,10 @@ public class BaseMainActivity extends LoggableActivity { System.out.println(event); if(Gamepad.isGamepadEvent(event)){ + if(gamepad == null){ + gamepad = new Gamepad(this, Tools.grabFirstGamepad()); + } + gamepad.update(event); return true; } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java index c073eebcc..0393e5490 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java @@ -7,6 +7,7 @@ import android.view.MotionEvent; import net.kdt.pojavlaunch.BaseMainActivity; import net.kdt.pojavlaunch.LWJGLGLFWKeycode; +import net.kdt.pojavlaunch.Tools; import org.lwjgl.glfw.CallbackBridge; @@ -19,7 +20,6 @@ import static net.kdt.pojavlaunch.customcontrols.gamepad.GamepadJoystick.DIRECTI import static net.kdt.pojavlaunch.customcontrols.gamepad.GamepadJoystick.DIRECTION_SOUTH_EAST; import static net.kdt.pojavlaunch.customcontrols.gamepad.GamepadJoystick.DIRECTION_SOUTH_WEST; import static net.kdt.pojavlaunch.customcontrols.gamepad.GamepadJoystick.DIRECTION_WEST; -import static net.kdt.pojavlaunch.customcontrols.gamepad.GamepadJoystick.JOYSTICK_DEADZONE; public class Gamepad { @@ -28,10 +28,10 @@ public class Gamepad { private GamepadDpad gamepadDpad = new GamepadDpad(); - private final GamepadJoystick leftJoystick = new GamepadJoystick(MotionEvent.AXIS_X, MotionEvent.AXIS_Y); + private final GamepadJoystick leftJoystick; private int currentJoystickDirection = DIRECTION_NONE; - private final GamepadJoystick rightJoystick = new GamepadJoystick(MotionEvent.AXIS_Z, MotionEvent.AXIS_RZ); + private final GamepadJoystick rightJoystick; private float lastHorizontalValue = 0.0f; private float lastVerticalValue = 0.0f; @@ -51,7 +51,11 @@ public class Gamepad { private Thread mouseThread; - public Gamepad(BaseMainActivity gameActivity){ + public Gamepad(BaseMainActivity gameActivity, InputDevice inputDevice){ + leftJoystick = new GamepadJoystick(MotionEvent.AXIS_X, MotionEvent.AXIS_Y, inputDevice); + rightJoystick = new GamepadJoystick(MotionEvent.AXIS_Z, MotionEvent.AXIS_RZ, inputDevice); + + this.gameActivity = gameActivity; createMapping(); @@ -64,7 +68,6 @@ public class Gamepad { @Override public void run() { - while (!isInterrupted()) { long now = System.nanoTime(); delta += (now - lastTime) / ns; @@ -89,8 +92,9 @@ public class Gamepad { private void tick(){ if(lastHorizontalValue != 0 || lastVerticalValue != 0){ + GamepadJoystick currentJoystick = isGrabbing ? leftJoystick : rightJoystick; - acceleration = (mouseMagnitude - JOYSTICK_DEADZONE)/(1 - JOYSTICK_DEADZONE); + acceleration = (mouseMagnitude - currentJoystick.getDeadzone())/(1 - currentJoystick.getDeadzone()); acceleration = Math.pow(acceleration, mouseMaxAcceleration); if(acceleration > 1){ @@ -220,8 +224,7 @@ public class Gamepad { } private void updateMouseJoystick(MotionEvent event){ - GamepadJoystick currentJoystick = CallbackBridge.isGrabbing() ? rightJoystick : leftJoystick; - + GamepadJoystick currentJoystick = isGrabbing ? rightJoystick : leftJoystick; lastHorizontalValue = currentJoystick.getHorizontalAxis(event); lastVerticalValue = currentJoystick.getVerticalAxis(event); @@ -230,7 +233,7 @@ public class Gamepad { } private void updateDirectionalJoystick(MotionEvent event){ - GamepadJoystick currentJoystick = CallbackBridge.isGrabbing() ? leftJoystick : rightJoystick; + GamepadJoystick currentJoystick = isGrabbing ? leftJoystick : rightJoystick; int lastJoystickDirection = currentJoystickDirection; currentJoystickDirection = currentJoystick.getHeightDirection(event); diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadJoystick.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadJoystick.java index 0ff2de668..b83f06470 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadJoystick.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadJoystick.java @@ -18,14 +18,17 @@ public class GamepadJoystick { public static final int DIRECTION_WEST = 2; public static final int DIRECTION_NORTH_WEST = 1; - public static final float JOYSTICK_DEADZONE = 0.20f; + private float deadzone; private final int verticalAxis; private final int horizontalAxis; - public GamepadJoystick(int horizontalAxis, int verticalAxis){ + public GamepadJoystick(int horizontalAxis, int verticalAxis, InputDevice device){ this.verticalAxis = verticalAxis; this.horizontalAxis = horizontalAxis; + + deadzone = Math.max(device.getMotionRange(verticalAxis).getFlat(), + device.getMotionRange(horizontalAxis).getFlat() ); } public double getAngleRadian(MotionEvent event){ @@ -63,18 +66,17 @@ public class GamepadJoystick { } private float applyDeadzone(MotionEvent event, int axis){ - //TODO: tweakable deadzone ? /* This piece of code also modifies the value to make it seem like there was no deadzone in the first place */ + double magnitude = getMagnitude(event); - if (magnitude < JOYSTICK_DEADZONE){ + if (magnitude < deadzone){ return 0; - }else{ - //if( Math.abs(event.getAxisValue(axis)) < 0.035) return 0; - return (float) ((event.getAxisValue(axis) / magnitude) * ((magnitude - JOYSTICK_DEADZONE) / (1 - JOYSTICK_DEADZONE))); } + + return (float) ((event.getAxisValue(axis) / magnitude) * ((magnitude - deadzone) / (1 - deadzone))); } public static boolean isJoystickEvent(MotionEvent event){ @@ -84,10 +86,12 @@ public class GamepadJoystick { public int getHeightDirection(MotionEvent event){ - if(getMagnitude(event) <= JOYSTICK_DEADZONE ) return DIRECTION_NONE; + if(getMagnitude(event) <= deadzone) return DIRECTION_NONE; return ((int) ((getAngle(event)+22.5)/45)) % 8; } - + public float getDeadzone() { + return deadzone; + } } From c4247570c6d206f65ed281405c39a58022e50e65 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Fri, 21 May 2021 16:14:43 +0200 Subject: [PATCH 065/179] Bump up the minimum deadzone --- .../pojavlaunch/customcontrols/gamepad/GamepadJoystick.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadJoystick.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadJoystick.java index b83f06470..f1786c850 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadJoystick.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadJoystick.java @@ -28,7 +28,9 @@ public class GamepadJoystick { this.horizontalAxis = horizontalAxis; deadzone = Math.max(device.getMotionRange(verticalAxis).getFlat(), - device.getMotionRange(horizontalAxis).getFlat() ); + device.getMotionRange(horizontalAxis).getFlat()) * 2f; + + if(deadzone < 0.15) deadzone = 0.15f; } public double getAngleRadian(MotionEvent event){ From 3e09983501387d47d15b9178265cd387123165f8 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Fri, 21 May 2021 16:47:19 +0200 Subject: [PATCH 066/179] add more visibility options on controls --- .../customcontrols/ControlLayout.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java index 257fb4612..df5fdc9da 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java @@ -219,18 +219,23 @@ public class ControlLayout extends FrameLayout public void setActivity(CustomControlsActivity activity) { mActivity = activity; } - - public void toggleControlVisible() { - if (mModifiable) return; // Not using on custom controls activity - + + public void toggleControlVisible(){ mControlVisible = !mControlVisible; - int visibilityState = mControlVisible ? View.VISIBLE : View.GONE; + setControlVisible(mControlVisible); + } + + public void setControlVisible(boolean isVisible) { + if (mModifiable) return; // Not using on custom controls activity + + mControlVisible = isVisible; + int visibilityState = isVisible ? View.VISIBLE : View.GONE; for (int i = 0; i < getChildCount(); i++) { View view = getChildAt(i); if(view instanceof ControlSubButton){ - view.setVisibility(mControlVisible ? (((ControlSubButton)view).parentDrawer.areButtonsVisible ? VISIBLE : GONE) : View.GONE); + view.setVisibility(isVisible ? (((ControlSubButton)view).parentDrawer.areButtonsVisible ? VISIBLE : GONE) : View.GONE); continue; } From 7b8526c929850b03857dc070dc92a30614f07167 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Fri, 21 May 2021 17:35:35 +0200 Subject: [PATCH 067/179] Fix player still moving when going out of menus --- .../java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java | 1 + .../kdt/pojavlaunch/customcontrols/gamepad/GamepadButton.java | 1 + 2 files changed, 2 insertions(+) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java index 0393e5490..3b145e215 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java @@ -128,6 +128,7 @@ public class Gamepad { //TODO place the cursor at the center currentMap = menuMap; gameMap.resetPressedState(); + sendDirectionalKeycode(currentJoystickDirection, false, gameMap); // removing what we were doing gameActivity.mouse_x = CallbackBridge.windowWidth/2; gameActivity.mouse_y = CallbackBridge.windowHeight/2; diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadButton.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadButton.java index 7f17df65b..f7f513ce6 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadButton.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadButton.java @@ -35,6 +35,7 @@ public class GamepadButton { public void resetButtonState(){ isDown = false; toggled = false; + Gamepad.sendInput(keycodes, false); } public boolean isDown(){ return isToggleable ? toggled : isDown; From 78df3709ae07658fe24a3200f857acaaceb0bf1c Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Fri, 21 May 2021 17:44:58 +0200 Subject: [PATCH 068/179] Fix gamepad thread crashing when unfocused. --- .../net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java index 3b145e215..a6da666af 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java @@ -80,7 +80,7 @@ public class Gamepad { delta--; try { - sleep((long) ((1 - delta)/ticks)); + sleep(Math.max((long) ((1 - delta)/ticks), 0)); } catch (InterruptedException e) { e.printStackTrace(); } From 7835a76a95ba61dc37cb8a5c7a0fd8cf40615a99 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Fri, 21 May 2021 18:27:51 +0200 Subject: [PATCH 069/179] Clean up mappings --- .../customcontrols/gamepad/Gamepad.java | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java index a6da666af..6d9ef863f 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java @@ -154,10 +154,10 @@ public class Gamepad { gameMap.DIRECTION_RIGHT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_D}; gameMap.DIRECTION_LEFT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_A}; - gameMap.DPAD_UP.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; - gameMap.DPAD_DOWN.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; - gameMap.DPAD_RIGHT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; - gameMap.DPAD_LEFT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; + gameMap.DPAD_UP.keycodes = new int[]{}; + gameMap.DPAD_DOWN.keycodes = new int[]{}; + gameMap.DPAD_RIGHT.keycodes = new int[]{}; + gameMap.DPAD_LEFT.keycodes = new int[]{}; gameMap.SHOULDER_LEFT.keycodes = new int[]{GamepadMapping.MOUSE_SCROLL_UP}; gameMap.SHOULDER_RIGHT.keycodes = new int[]{GamepadMapping.MOUSE_SCROLL_DOWN}; @@ -170,7 +170,7 @@ public class Gamepad { gameMap.THUMBSTICK_RIGHT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_F5}; gameMap.BUTTON_START.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_ESCAPE}; - gameMap.BUTTON_SELECT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; + gameMap.BUTTON_SELECT.keycodes = new int[]{}; //MENU MAP @@ -181,25 +181,25 @@ public class Gamepad { menuMap.DIRECTION_FORWARD = new int[]{GamepadMapping.MOUSE_SCROLL_UP, GamepadMapping.MOUSE_SCROLL_UP, GamepadMapping.MOUSE_SCROLL_UP,GamepadMapping.MOUSE_SCROLL_UP,GamepadMapping.MOUSE_SCROLL_UP}; menuMap.DIRECTION_BACKWARD = new int[]{GamepadMapping.MOUSE_SCROLL_DOWN, GamepadMapping.MOUSE_SCROLL_DOWN, GamepadMapping.MOUSE_SCROLL_DOWN,GamepadMapping.MOUSE_SCROLL_DOWN,GamepadMapping.MOUSE_SCROLL_DOWN}; - menuMap.DIRECTION_RIGHT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; - menuMap.DIRECTION_LEFT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; + menuMap.DIRECTION_RIGHT = new int[]{}; + menuMap.DIRECTION_LEFT = new int[]{}; - menuMap.DPAD_UP.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; - menuMap.DPAD_DOWN.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; - menuMap.DPAD_RIGHT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; - menuMap.DPAD_LEFT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; + menuMap.DPAD_UP.keycodes = new int[]{}; + menuMap.DPAD_DOWN.keycodes = new int[]{}; + menuMap.DPAD_RIGHT.keycodes = new int[]{}; + menuMap.DPAD_LEFT.keycodes = new int[]{}; menuMap.SHOULDER_LEFT.keycodes = new int[]{GamepadMapping.MOUSE_SCROLL_UP}; menuMap.SHOULDER_RIGHT.keycodes = new int[]{GamepadMapping.MOUSE_SCROLL_DOWN}; - menuMap.TRIGGER_LEFT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; - menuMap.TRIGGER_RIGHT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; + menuMap.TRIGGER_LEFT.keycodes = new int[]{}; + menuMap.TRIGGER_RIGHT.keycodes = new int[]{}; - menuMap.THUMBSTICK_LEFT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; - menuMap.THUMBSTICK_RIGHT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; + menuMap.THUMBSTICK_LEFT.keycodes = new int[]{}; + menuMap.THUMBSTICK_RIGHT.keycodes = new int[]{}; menuMap.BUTTON_START.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_ESCAPE}; - menuMap.BUTTON_SELECT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; + menuMap.BUTTON_SELECT.keycodes = new int[]{}; } From 2fa4a2756e65576741db2d1986b66409b4deca90 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Sat, 22 May 2021 15:48:22 +0200 Subject: [PATCH 070/179] Fix crash due to crash when a controller isn't recognized --- .../pojavlaunch/customcontrols/gamepad/GamepadJoystick.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadJoystick.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadJoystick.java index f1786c850..ac12f2e78 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadJoystick.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadJoystick.java @@ -27,8 +27,9 @@ public class GamepadJoystick { this.verticalAxis = verticalAxis; this.horizontalAxis = horizontalAxis; - deadzone = Math.max(device.getMotionRange(verticalAxis).getFlat(), - device.getMotionRange(horizontalAxis).getFlat()) * 2f; + //Some controllers aren't recognized as such by android, so we fallback to a default value of 0.2 + deadzone = device != null ? Math.max(device.getMotionRange(verticalAxis).getFlat(), + device.getMotionRange(horizontalAxis).getFlat()) * 2f : 0.2f; if(deadzone < 0.15) deadzone = 0.15f; } From 62ac7729043b7bf9f6fccae4f7780aacbc07bb0c Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Sat, 22 May 2021 15:49:04 +0200 Subject: [PATCH 071/179] Clean up some code --- .../net/kdt/pojavlaunch/BaseMainActivity.java | 363 +++++------------- .../main/java/net/kdt/pojavlaunch/Tools.java | 92 +---- 2 files changed, 111 insertions(+), 344 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java index b4ab4ea48..485495ec6 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java @@ -21,7 +21,6 @@ import net.kdt.pojavlaunch.customcontrols.*; import net.kdt.pojavlaunch.multirt.MultiRTUtils; import net.kdt.pojavlaunch.customcontrols.gamepad.Gamepad; -import net.kdt.pojavlaunch.customcontrols.gamepad.GamepadJoystick; import net.kdt.pojavlaunch.prefs.*; import net.kdt.pojavlaunch.utils.*; @@ -42,14 +41,14 @@ public class BaseMainActivity extends LoggableActivity { private boolean rightOverride = false; public float scaleFactor = 1; - private int fingerStillThreshold = 8; + private final int fingerStillThreshold = 8; private int initialX, initialY; private int scrollInitialX, scrollInitialY; private boolean mIsResuming = false; private static final int MSG_LEFT_MOUSE_BUTTON_CHECK = 1028; private static final int MSG_DROP_ITEM_BUTTON_CHECK = 1029; private static boolean triggeredLeftMouseButton = false; - private Handler theHandler = new Handler() { + private final Handler theHandler = new Handler() { public void handleMessage(Message msg) { if (!LauncherPreferences.PREF_DISABLE_GESTURES) { switch (msg.what) { @@ -79,14 +78,10 @@ public class BaseMainActivity extends LoggableActivity { private boolean isVirtualMouseEnabled; private LinearLayout touchPad; private ImageView mousePointer; - //private EditText hiddenEditor; - // private ViewGroup overlayView; private MinecraftAccount mProfile; private DrawerLayout drawerLayout; private NavigationView navDrawer; - - // protected CapturedEditText mKeyHandlerView; private LinearLayout contentLog; private TextView textLog; @@ -97,7 +92,6 @@ public class BaseMainActivity extends LoggableActivity { private TextView debugText; private NavigationView.OnNavigationItemSelectedListener gameActionListener; public NavigationView.OnNavigationItemSelectedListener ingameControlsEditorListener; - // private String mQueueText = new String(); protected volatile JMinecraftVersionList.Version mVersionInfo; @@ -106,22 +100,13 @@ public class BaseMainActivity extends LoggableActivity { private File logFile; private PrintStream logStream; private PerVersionConfig.VersionConfig config; - /* - private LinearLayout contentCanvas; - private AWTSurfaceView contentCanvasView; - */ - private boolean resuming; - private boolean lastEnabled = false; + private final boolean lastEnabled = false; private boolean lastGrab = false; - private boolean isExited = false; + private final boolean isExited = false; private boolean isLogAllow = false; public volatile int mouse_x, mouse_y; - // private int navBarHeight = 40; - - // private static Collection rsaPkcs1List; - // @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -172,50 +157,36 @@ public class BaseMainActivity extends LoggableActivity { drawerLayout = findViewById(R.id.main_drawer_options); navDrawer = findViewById(R.id.main_navigation_view); - gameActionListener = new NavigationView.OnNavigationItemSelectedListener() { - @Override - public boolean onNavigationItemSelected(MenuItem menuItem) { - switch (menuItem.getItemId()) { - case R.id.nav_forceclose: dialogForceClose(BaseMainActivity.this); - break; - case R.id.nav_viewlog: openLogOutput(); - break; - case R.id.nav_debug: toggleDebug(); - break; - case R.id.nav_customkey: dialogSendCustomKey(); - break; - case R.id.nav_mousespd: adjustMouseSpeedLive(); - break; - case R.id.nav_customctrl: openCustomControls(); - break; - } - //Toast.makeText(MainActivity.this, menuItem.getTitle() + ":" + menuItem.getItemId(), Toast.LENGTH_SHORT).show(); - - drawerLayout.closeDrawers(); - return true; + gameActionListener = menuItem -> { + switch (menuItem.getItemId()) { + case R.id.nav_forceclose: dialogForceClose(BaseMainActivity.this); + break; + case R.id.nav_viewlog: openLogOutput(); + break; + case R.id.nav_debug: toggleDebug(); + break; + case R.id.nav_customkey: dialogSendCustomKey(); + break; + case R.id.nav_mousespd: adjustMouseSpeedLive(); + break; + case R.id.nav_customctrl: openCustomControls(); + break; } + + drawerLayout.closeDrawers(); + return true; }; navDrawer.setNavigationItemSelectedListener( gameActionListener); - // this.overlayView = (ViewGroup) findViewById(R.id.main_control_overlay); - - //this.hiddenEditor = findViewById(R.id.hiddenTextbox); - - // Mouse pointer part - //this.mouseToggleButton = findButton(R.id.control_togglemouse); this.touchPad = findViewById(R.id.main_touchpad); touchPad.setFocusable(false); this.mousePointer = findViewById(R.id.main_mouse_pointer); - this.mousePointer.post(new Runnable(){ - - @Override - public void run() { - ViewGroup.LayoutParams params = mousePointer.getLayoutParams(); - params.width = (int) (36 / 100f * LauncherPreferences.PREF_MOUSESCALE); - params.height = (int) (54 / 100f * LauncherPreferences.PREF_MOUSESCALE); - } + this.mousePointer.post(() -> { + ViewGroup.LayoutParams params = mousePointer.getLayoutParams(); + params.width = (int) (36 / 100f * LauncherPreferences.PREF_MOUSESCALE); + params.height = (int) (54 / 100f * LauncherPreferences.PREF_MOUSESCALE); }); this.contentLog = findViewById(R.id.content_log_layout); @@ -223,63 +194,37 @@ public class BaseMainActivity extends LoggableActivity { this.textLog = (TextView) contentScroll.getChildAt(0); this.toggleLog = findViewById(R.id.content_log_toggle_log); this.toggleLog.setChecked(false); - // this.textLogBehindGL = (TextView) findViewById(R.id.main_log_behind_GL); - // this.textLogBehindGL.setTypeface(Typeface.MONOSPACE); this.textLog.setTypeface(Typeface.MONOSPACE); - this.toggleLog.setOnCheckedChangeListener(new ToggleButton.OnCheckedChangeListener(){ - - @Override - public void onCheckedChanged(CompoundButton button, boolean isChecked) - { - isLogAllow = isChecked; - appendToLog(""); - } - }); + this.toggleLog.setOnCheckedChangeListener((button, isChecked) -> { + isLogAllow = isChecked; + appendToLog(""); + }); this.debugText = findViewById(R.id.content_text_debug); this.minecraftGLView = findViewById(R.id.main_game_render_view); - // toggleGui(null); this.drawerLayout.closeDrawers(); -/* - mKeyHandlerView = findViewById(R.id.main_key_handler); - mKeyHandlerView.setSingleLine(false); - mKeyHandlerView.clearFocus(); - - AndroidLWJGLKeycode.isBackspaceAfterChar = true; // mVersionInfo.minimumLauncherVersion >= 18; -*/ + placeMouseAt(CallbackBridge.physicalWidth / 2, CallbackBridge.physicalHeight / 2); - new Thread(new Runnable(){ - - //private boolean isCapturing = false; - @Override - public void run() - { - while (!isExited) { - if (lastGrab != CallbackBridge.isGrabbing()) - mousePointer.post(new Runnable(){ - - @Override - public void run() - { - if (!CallbackBridge.isGrabbing() && isVirtualMouseEnabled) { - touchPad.setVisibility(View.VISIBLE); - placeMouseAt(displayMetrics.widthPixels / 2, displayMetrics.heightPixels / 2); - } - - if (CallbackBridge.isGrabbing() && touchPad.getVisibility() != View.GONE) { - touchPad.setVisibility(View.GONE); - } - - lastGrab = CallbackBridge.isGrabbing(); - } - }); - - + new Thread(() -> { + while (!isExited) { + if (lastGrab != CallbackBridge.isGrabbing()) + mousePointer.post(() -> { + if (!CallbackBridge.isGrabbing() && isVirtualMouseEnabled) { + touchPad.setVisibility(View.VISIBLE); + placeMouseAt(displayMetrics.widthPixels / 2, displayMetrics.heightPixels / 2); } - } - }, "VirtualMouseGrabThread").start(); + + if (CallbackBridge.isGrabbing() && touchPad.getVisibility() != View.GONE) { + touchPad.setVisibility(View.GONE); + } + + lastGrab = CallbackBridge.isGrabbing(); + }); + + } + }, "VirtualMouseGrabThread").start(); if (isAndroid8OrHigher()) { @@ -372,7 +317,6 @@ public class BaseMainActivity extends LoggableActivity { // System.loadLibrary("Regal"); minecraftGLView.setFocusable(true); - // minecraftGLView.setEGLContextClientVersion(2); glTouchListener = new OnTouchListener(){ private boolean isTouchInHotbar = false; private int hotbarX, hotbarY; @@ -401,8 +345,7 @@ public class BaseMainActivity extends LoggableActivity { } // System.out.println("Pre touch, isTouchInHotbar=" + Boolean.toString(isTouchInHotbar) + ", action=" + MotionEvent.actionToString(e.getActionMasked())); - /* int x = ((int) e.getX()) * scaleFactor; - int y = ((int) e.getY()) * scaleFactor;*/ + if(e.getHistorySize() > 0 && CallbackBridge.isGrabbing()) { mouse_x += (int)(e.getX() - e.getHistoricalX(0)); mouse_y += (int)(e.getY() - e.getHistoricalY(0)); @@ -444,7 +387,6 @@ public class BaseMainActivity extends LoggableActivity { if (CallbackBridge.isGrabbing()) { // It cause hold left mouse while moving camera - // CallbackBridge.putMouseEventWithCoords(rightOverride ? (byte) 1 : (byte) 0, (byte) 1, x, y); initialX = mouse_x; initialY = mouse_y; theHandler.sendEmptyMessageDelayed(BaseMainActivity.MSG_LEFT_MOUSE_BUTTON_CHECK, LauncherPreferences.PREF_LONGPRESS_TRIGGER); @@ -459,7 +401,6 @@ public class BaseMainActivity extends LoggableActivity { CallbackBridge.mouseY = mouse_y; // -TODO uncomment after fix wrong trigger - // CallbackBridge.putMouseEventWithCoords(rightOverride ? (byte) 1 : (byte) 0, (byte) 0, x, y); CallbackBridge.sendCursorPos(mouse_x, mouse_y); if (!rightOverride) { CallbackBridge.mouseLeft = false; @@ -467,8 +408,6 @@ public class BaseMainActivity extends LoggableActivity { } if (CallbackBridge.isGrabbing()) { - // System.out.println((String) ("[Math.abs(" + initialX + " - " + x + ") = " + Math.abs(initialX - x) + "] < " + fingerStillThreshold)); - // System.out.println((String) ("[Math.abs(" + initialY + " - " + y + ") = " + Math.abs(initialY - y) + "] < " + fingerStillThreshold)); if (isTouchInHotbar && Math.abs(hotbarX - mouse_x) < fingerStillThreshold && Math.abs(hotbarY - mouse_y) < fingerStillThreshold) { sendKeyPress(hudKeyHandled, 0, false); } else if (!triggeredLeftMouseButton && Math.abs(initialX - mouse_x) < fingerStillThreshold && Math.abs(initialY - mouse_y) < fingerStillThreshold) { @@ -519,7 +458,6 @@ public class BaseMainActivity extends LoggableActivity { CallbackBridge.DEBUG_STRING.setLength(0); return true; - // return !CallbackBridge.isGrabbing(); } }; @@ -530,13 +468,9 @@ public class BaseMainActivity extends LoggableActivity { private boolean debugErrored = false; private String getMoving(float pos, boolean xOrY) { - if (pos == 0) { - return "STOPPED"; - } else if (pos > 0) { - return xOrY ? "RIGHT" : "DOWN"; - } else { // if (pos3 < 0) { - return xOrY ? "LEFT" : "UP"; - } + if (pos == 0) return "STOPPED"; + if (pos > 0) return xOrY ? "RIGHT" : "DOWN"; + return xOrY ? "LEFT" : "UP"; } @Override @@ -617,18 +551,14 @@ public class BaseMainActivity extends LoggableActivity { JREUtils.setupBridgeWindow(new Surface(texture)); - new Thread(new Runnable(){ - - @Override - public void run() { - try { - Thread.sleep(200); - runCraft(); - } catch (Throwable e) { - Tools.showError(BaseMainActivity.this, e, true); - } - } - }, "JVM Main thread").start(); + new Thread(() -> { + try { + Thread.sleep(200); + runCraft(); + } catch (Throwable e) { + Tools.showError(BaseMainActivity.this, e, true); + } + }, "JVM Main thread").start(); } } @@ -705,11 +635,7 @@ public class BaseMainActivity extends LoggableActivity { boolean isKeyboard(KeyEvent evt) { System.out.println("Event:" +evt); - //if((evt.getFlags() & KeyEvent.FLAG_SOFT_KEYBOARD) == KeyEvent.FLAG_SOFT_KEYBOARD) return true; - //if(evt.getSource() == InputDevice.SOURCE_KEYBOARD) return true; - //if(evt.getUnicodeChar() != 0) return true; - if(AndroidLWJGLKeycode.androidToLwjglMap.containsKey(evt.getKeyCode())) return true; - return false; + return AndroidLWJGLKeycode.androidToLwjglMap.containsKey(evt.getKeyCode()); } @@ -734,20 +660,18 @@ public class BaseMainActivity extends LoggableActivity { return false; } - //private Dialog menuDial; + @Override public void onResume() { super.onResume(); mIsResuming = true; - // if (minecraftGLView != null) minecraftGLView.requestRender(); final int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; final View decorView = getWindow().getDecorView(); decorView.setSystemUiVisibility(uiOptions); } @Override - protected void onPause() - { + protected void onPause() { if (CallbackBridge.isGrabbing()){ sendKeyPress(LWJGLGLFWKeycode.GLFW_KEY_ESCAPE); } @@ -763,29 +687,7 @@ public class BaseMainActivity extends LoggableActivity { return Build.VERSION.SDK_INT >= 26; } - // private FileObserver mLogObserver; private void runCraft() throws Throwable { - /* Old logger - if (Tools.LAUNCH_TYPE != Tools.LTYPE_PROCESS) { - currLogFile = JREUtils.redirectStdio(true); - // DEPRECATED constructor (String) api 29 - mLogObserver = new FileObserver(currLogFile.getAbsolutePath(), FileObserver.MODIFY){ - @Override - public void onEvent(int event, String file) { - try { - if (event == FileObserver.MODIFY && currLogFile.length() > 0l) { - System.out.println(Tools.read(currLogFile.getAbsolutePath())); - Tools.write(currLogFile.getAbsolutePath(), ""); - } - } catch (Throwable th) { - Tools.showError(MainActivity.this, th); - mLogObserver.stopWatching(); - } - } - }; - mLogObserver.startWatching(); - } - */ if(Tools.LOCAL_RENDERER == null) { Tools.LOCAL_RENDERER = LauncherPreferences.PREF_RENDERER; } @@ -811,38 +713,6 @@ public class BaseMainActivity extends LoggableActivity { private void checkJavaArgsIsLaunchable(String jreVersion) throws Throwable { appendlnToLog("Info: Custom Java arguments: \"" + LauncherPreferences.PREF_CUSTOM_JAVA_ARGS + "\""); - -/* - if (jreVersion.equals("1.8.0")) return; - - // Test java - ShellProcessOperation shell = new ShellProcessOperation(new ShellProcessOperation.OnPrintListener(){ - @Override - public void onPrintLine(String text){ - appendlnToLog("[JRETest] " + text); - } - }); - JREUtils.setJavaEnvironment(this, shell); - - List testArgs = new ArrayList(); - testArgs.add(Tools.homeJreDir + "/bin/java"); - Tools.getJavaArgs(this, testArgs); - testArgs.add("-version"); - - new File(Tools.homeJreDir + "/bin/java").setExecutable(true); - - // shell.writeToProcess("chmod 777 " + Tools.homeJreDir + "/bin/java"); - shell.writeToProcess("set -e"); - shell.writeToProcess(testArgs.toArray(new String[0])); - - int exitCode = shell.waitFor(); - appendlnToLog("Info: java test command exited with " + exitCode); - - if (exitCode != 0) { - appendlnToLog("Error: the test returned non-zero exit code."); - // throw new RuntimeException(getString(R.string.mcn_check_fail_java)); - } - */ } private void checkLWJGL3Installed() { @@ -878,11 +748,11 @@ public class BaseMainActivity extends LoggableActivity { } public static String fromArray(List arr) { - String s = ""; + StringBuilder s = new StringBuilder(); for (String exec : arr) { - s = s + " " + exec; + s.append(" ").append(exec); } - return s; + return s.toString(); } private void toggleDebug() { @@ -892,15 +762,10 @@ public class BaseMainActivity extends LoggableActivity { private void dialogSendCustomKey() { AlertDialog.Builder dialog = new AlertDialog.Builder(this); dialog.setTitle(R.string.control_customkey); - dialog.setItems(AndroidLWJGLKeycode.generateKeyName(), new DialogInterface.OnClickListener(){ - - @Override - public void onClick(DialogInterface dInterface, int position) { - AndroidLWJGLKeycode.execKeyIndex(BaseMainActivity.this, position); - } - }); + dialog.setItems(AndroidLWJGLKeycode.generateKeyName(), (dInterface, position) -> AndroidLWJGLKeycode.execKeyIndex(BaseMainActivity.this, position)); dialog.show(); } + boolean isInEditor; private void openCustomControls() { if(ingameControlsEditorListener != null) { @@ -911,6 +776,7 @@ public class BaseMainActivity extends LoggableActivity { isInEditor = true; } } + public void leaveCustomControls() { if(this instanceof MainActivity) { try { @@ -938,53 +804,21 @@ public class BaseMainActivity extends LoggableActivity { contentLog.setVisibility(View.GONE); mIsResuming = true; } - /* - private void openCanvasOutput() { - WindowAnimation.fadeIn(contentCanvas, 500); - } - - public void closeCanvasOutput(View view) { - WindowAnimation.fadeOut(contentCanvas, 500); - } - */ @Override public void appendToLog(final String text, boolean checkAllow) { logStream.print(text); if (checkAllow && !isLogAllow) return; - textLog.post(new Runnable(){ - @Override - public void run() { - textLog.append(text); - contentScroll.fullScroll(ScrollView.FOCUS_DOWN); - } - }); - } - - public String getMinecraftOption(String key) { - try { - String[] options = Tools.read(Tools.DIR_GAME_NEW + "/options.txt").split("\n"); - for (String option : options) { - String[] optionKeyValue = option.split(":"); - if (optionKeyValue[0].equals(key)) { - return optionKeyValue[1]; - } - } - } catch (Exception e) { - e.printStackTrace(); - } - return ""; + textLog.post(() -> { + textLog.append(text); + contentScroll.fullScroll(ScrollView.FOCUS_DOWN); + }); } public int mcscale(int input) { return (int)((this.guiScale * input)/scaleFactor); } - /* - public int randomInRange(int min, int max) { - return min + (int)(Math.random() * (max - min + 1)); - } - */ public void toggleMenu(View v) { drawerLayout.openDrawer(Gravity.RIGHT); @@ -1012,24 +846,13 @@ public class BaseMainActivity extends LoggableActivity { new AlertDialog.Builder(ctx) .setMessage(R.string.mcn_exit_confirm) .setNegativeButton(android.R.string.cancel, null) - .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener(){ - - @Override - public void onClick(DialogInterface p1, int p2) - { - try { - fullyExit(); - } catch (Throwable th) { - Log.w(Tools.APP_NAME, "Could not enable System.exit() method!", th); - } - - // If we are unable to enable exit, use method: kill myself. - // android.os.Process.killProcess(android.os.Process.myPid()); - - // Toast.makeText(MainActivity.this, "Could not exit. Please force close this app.", Toast.LENGTH_LONG).show(); + .setPositiveButton(android.R.string.ok, (p1, p2) -> { + try { + fullyExit(); + } catch (Throwable th) { + Log.w(Tools.APP_NAME, "Could not enable System.exit() method!", th); } - }) - .show(); + }).show(); } @Override @@ -1058,7 +881,6 @@ public class BaseMainActivity extends LoggableActivity { protected void setRightOverride(boolean val) { this.rightOverride = val; - // this.secondaryButton.setBackgroundDrawable(this.rightOverride ? this.secondaryButtonColorBackground : this.secondaryButtonDefaultBackground); } public static void sendKeyPress(int keyCode, int modifiers, boolean status) { @@ -1089,10 +911,11 @@ public class BaseMainActivity extends LoggableActivity { } catch (IllegalAccessException | NoSuchFieldException e) { } - }else{ - sendKeyPress(0, keyChar, 0, CallbackBridge.getCurrentMods(), true); - sendKeyPress(0, keyChar, 0, CallbackBridge.getCurrentMods(), false); + return; } + + sendKeyPress(0, keyChar, 0, CallbackBridge.getCurrentMods(), true); + sendKeyPress(0, keyChar, 0, CallbackBridge.getCurrentMods(), false); } public void sendKeyPress(int keyCode) { @@ -1171,21 +994,15 @@ public class BaseMainActivity extends LoggableActivity { public void onStopTrackingTouch(SeekBar seekBar) {} }); b.setView(v); - b.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - LauncherPreferences.PREF_MOUSESPEED = ((float)tmpMouseSpeed)/100f; - LauncherPreferences.DEFAULT_PREF.edit().putInt("mousespeed",tmpMouseSpeed).commit(); - dialogInterface.dismiss(); - System.gc(); - } + b.setPositiveButton(android.R.string.ok, (dialogInterface, i) -> { + LauncherPreferences.PREF_MOUSESPEED = ((float)tmpMouseSpeed)/100f; + LauncherPreferences.DEFAULT_PREF.edit().putInt("mousespeed",tmpMouseSpeed).commit(); + dialogInterface.dismiss(); + System.gc(); }); - b.setNegativeButton(android.R.string.cancel,new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - dialogInterface.dismiss(); - System.gc(); - } + b.setNegativeButton(android.R.string.cancel, (dialogInterface, i) -> { + dialogInterface.dismiss(); + System.gc(); }); b.show(); } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java index 27c0a9a00..5ce8832c4 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java @@ -33,8 +33,7 @@ import static android.os.Build.VERSION_CODES.P; import static net.kdt.pojavlaunch.prefs.LauncherPreferences.PREF_IGNORE_NOTCH; import static net.kdt.pojavlaunch.prefs.LauncherPreferences.PREF_NOTCH_SIZE; -public final class Tools -{ +public final class Tools { public static final boolean ENABLE_DEV_FEATURES = BuildConfig.DEBUG; public static String APP_NAME = "null"; @@ -441,31 +440,7 @@ public final class Tools write(file2.getAbsolutePath(), loadFromAssetToByte(ctx, fileName)); } } -/* - public static void extractAssetFolder(Activity ctx, String path, String output) throws Exception { - extractAssetFolder(ctx, path, output, false); - } - public static void extractAssetFolder(Activity ctx, String path, String output, boolean overwrite) throws Exception { - AssetManager assetManager = ctx.getAssets(); - String assets[] = null; - try { - assets = assetManager.list(path); - if (assets.length == 0) { - Tools.copyAssetFile(ctx, path, output, overwrite); - } else { - File dir = new File(output, path); - if (!dir.exists()) - dir.mkdirs(); - for (String sub : assets) { - extractAssetFolder(ctx, path + "/" + sub, output, overwrite); - } - } - } catch (Exception e) { - showError(ctx, e); - } - } -*/ public static void showError(Context ctx, Throwable e) { showError(ctx, e, false); } @@ -490,45 +465,27 @@ public final class Tools AlertDialog.Builder builder = new AlertDialog.Builder((Context) ctx) .setTitle(titleId) .setMessage(errMsg) - .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener(){ - - @Override - public void onClick(DialogInterface p1, int p2) - { - if(exitIfOk) { - if (ctx instanceof BaseMainActivity) { - BaseMainActivity.fullyExit(); - } else if (ctx instanceof Activity) { - ((Activity) ctx).finish(); - } + .setPositiveButton(android.R.string.ok, (DialogInterface.OnClickListener) (p1, p2) -> { + if(exitIfOk) { + if (ctx instanceof BaseMainActivity) { + BaseMainActivity.fullyExit(); + } else if (ctx instanceof Activity) { + ((Activity) ctx).finish(); } } }) - .setNegativeButton(showMore ? R.string.error_show_less : R.string.error_show_more, new DialogInterface.OnClickListener(){ - - @Override - public void onClick(DialogInterface p1, int p2) - { - showError(ctx, titleId, e, exitIfOk, !showMore); - } - }) - .setNeutralButton(android.R.string.copy, new DialogInterface.OnClickListener(){ - - @Override - public void onClick(DialogInterface p1, int p2) - { - android.content.ClipboardManager mgr = (android.content.ClipboardManager) ctx.getSystemService(Context.CLIPBOARD_SERVICE); - mgr.setPrimaryClip(ClipData.newPlainText("error", Log.getStackTraceString(e))); - if(exitIfOk) { - if (ctx instanceof BaseMainActivity) { - BaseMainActivity.fullyExit(); - } else { - ((Activity) ctx).finish(); - } + .setNegativeButton(showMore ? R.string.error_show_less : R.string.error_show_more, (DialogInterface.OnClickListener) (p1, p2) -> showError(ctx, titleId, e, exitIfOk, !showMore)) + .setNeutralButton(android.R.string.copy, (DialogInterface.OnClickListener) (p1, p2) -> { + ClipboardManager mgr = (ClipboardManager) ctx.getSystemService(Context.CLIPBOARD_SERVICE); + mgr.setPrimaryClip(ClipData.newPlainText("error", Log.getStackTraceString(e))); + if(exitIfOk) { + if (ctx instanceof BaseMainActivity) { + BaseMainActivity.fullyExit(); + } else { + ((Activity) ctx).finish(); } } }) - //.setNegativeButton("Report (not available)", null) .setCancelable(!exitIfOk); try { builder.show(); @@ -546,18 +503,11 @@ public final class Tools } public static void dialogOnUiThread(final Activity ctx, final CharSequence title, final CharSequence message) { - ctx.runOnUiThread(new Runnable(){ - - @Override - public void run() { - new AlertDialog.Builder(ctx) - .setTitle(title) - .setMessage(message) - .setPositiveButton(android.R.string.ok, null) - .show(); - } - }); - + ctx.runOnUiThread(() -> new AlertDialog.Builder(ctx) + .setTitle(title) + .setMessage(message) + .setPositiveButton(android.R.string.ok, null) + .show()); } public static void moveInside(String from, String to) { From e8e4089e91c9c00bc8acca8ea8b7ea3292797295 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Sat, 22 May 2021 22:05:02 +0200 Subject: [PATCH 072/179] Add a more robust camera tracking --- .../net/kdt/pojavlaunch/BaseMainActivity.java | 29 ++++++++++++++----- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java index 485495ec6..9e89718c6 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java @@ -320,6 +320,7 @@ public class BaseMainActivity extends LoggableActivity { glTouchListener = new OnTouchListener(){ private boolean isTouchInHotbar = false; private int hotbarX, hotbarY; + private float prevX, prevY; @Override public boolean onTouch(View p1, MotionEvent e) { @@ -346,14 +347,7 @@ public class BaseMainActivity extends LoggableActivity { // System.out.println("Pre touch, isTouchInHotbar=" + Boolean.toString(isTouchInHotbar) + ", action=" + MotionEvent.actionToString(e.getActionMasked())); - if(e.getHistorySize() > 0 && CallbackBridge.isGrabbing()) { - mouse_x += (int)(e.getX() - e.getHistoricalX(0)); - mouse_y += (int)(e.getY() - e.getHistoricalY(0)); - } - if(!CallbackBridge.isGrabbing()) { - mouse_x = (int) (e.getX() * scaleFactor); - mouse_y = (int) (e.getY() * scaleFactor); - } + int hudKeyHandled = handleGuiBar((int)e.getX(), (int)e.getY()); if (!CallbackBridge.isGrabbing() && gestureDetector.onTouchEvent(e)) { @@ -380,6 +374,8 @@ public class BaseMainActivity extends LoggableActivity { } else { CallbackBridge.mouseX = mouse_x; CallbackBridge.mouseY = mouse_y; + prevX = e.getX(); + prevY = e.getY(); CallbackBridge.sendCursorPos(mouse_x, mouse_y); if (!rightOverride) { CallbackBridge.mouseLeft = true; @@ -453,6 +449,23 @@ public class BaseMainActivity extends LoggableActivity { } } + /*if(e.getHistorySize() > 0 && CallbackBridge.isGrabbing()) { + mouse_x += (int)(e.getX() - e.getHistoricalX(0))*4; + mouse_y += (int)(e.getY() - e.getHistoricalY(0))*4; + }*/ + if(CallbackBridge.isGrabbing()){ + if(e.getActionMasked() == MotionEvent.ACTION_MOVE){ + mouse_x += (int) (e.getX() - prevX); + mouse_y += (int) (e.getY() - prevY); + prevX = e.getX(); + prevY = e.getY(); + } + } + if(!CallbackBridge.isGrabbing()) { + mouse_x = (int) (e.getX() * scaleFactor); + mouse_y = (int) (e.getY() * scaleFactor); + } + debugText.setText(CallbackBridge.DEBUG_STRING.toString()); CallbackBridge.DEBUG_STRING.setLength(0); From a3fb8317b6ff40b1abe025baf77dbc2074ddd41b Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Sat, 22 May 2021 22:19:41 +0200 Subject: [PATCH 073/179] Fix in-menu behavior --- .../java/net/kdt/pojavlaunch/BaseMainActivity.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java index 9e89718c6..b57ebd3d3 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java @@ -347,7 +347,10 @@ public class BaseMainActivity extends LoggableActivity { // System.out.println("Pre touch, isTouchInHotbar=" + Boolean.toString(isTouchInHotbar) + ", action=" + MotionEvent.actionToString(e.getActionMasked())); - + if(!CallbackBridge.isGrabbing()) { + mouse_x = (int) (e.getX() * scaleFactor); + mouse_y = (int) (e.getY() * scaleFactor); + } int hudKeyHandled = handleGuiBar((int)e.getX(), (int)e.getY()); if (!CallbackBridge.isGrabbing() && gestureDetector.onTouchEvent(e)) { @@ -461,10 +464,7 @@ public class BaseMainActivity extends LoggableActivity { prevY = e.getY(); } } - if(!CallbackBridge.isGrabbing()) { - mouse_x = (int) (e.getX() * scaleFactor); - mouse_y = (int) (e.getY() * scaleFactor); - } + debugText.setText(CallbackBridge.DEBUG_STRING.toString()); From 7ed4607bc8d1188a4d024680599fc70bdfc39bb9 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Sat, 22 May 2021 22:50:06 +0200 Subject: [PATCH 074/179] Fix jumping when jungling between pointers --- .../java/net/kdt/pojavlaunch/BaseMainActivity.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java index b57ebd3d3..c96f9ff43 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java @@ -321,6 +321,7 @@ public class BaseMainActivity extends LoggableActivity { private boolean isTouchInHotbar = false; private int hotbarX, hotbarY; private float prevX, prevY; + private int currentPointerID; @Override public boolean onTouch(View p1, MotionEvent e) { @@ -375,6 +376,7 @@ public class BaseMainActivity extends LoggableActivity { theHandler.sendEmptyMessageDelayed(BaseMainActivity.MSG_DROP_ITEM_BUTTON_CHECK, LauncherPreferences.PREF_LONGPRESS_TRIGGER); } else { + currentPointerID = e.getPointerId(0); CallbackBridge.mouseX = mouse_x; CallbackBridge.mouseY = mouse_y; prevX = e.getX(); @@ -452,17 +454,15 @@ public class BaseMainActivity extends LoggableActivity { } } - /*if(e.getHistorySize() > 0 && CallbackBridge.isGrabbing()) { - mouse_x += (int)(e.getX() - e.getHistoricalX(0))*4; - mouse_y += (int)(e.getY() - e.getHistoricalY(0))*4; - }*/ if(CallbackBridge.isGrabbing()){ - if(e.getActionMasked() == MotionEvent.ACTION_MOVE){ + if(e.getPointerId(0) != currentPointerID){ + currentPointerID = e.getPointerId(0); + }else{ mouse_x += (int) (e.getX() - prevX); mouse_y += (int) (e.getY() - prevY); - prevX = e.getX(); - prevY = e.getY(); } + prevX = e.getX(); + prevY = e.getY(); } From 283634cba2f13ee80b795b336cbb88a39f2d1b84 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Sun, 23 May 2021 11:32:19 +0200 Subject: [PATCH 075/179] the touchpad mouse tracking is good now ! --- .../net/kdt/pojavlaunch/BaseMainActivity.java | 147 ++++++++---------- 1 file changed, 68 insertions(+), 79 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java index c96f9ff43..e52127faa 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java @@ -44,6 +44,9 @@ public class BaseMainActivity extends LoggableActivity { private final int fingerStillThreshold = 8; private int initialX, initialY; private int scrollInitialX, scrollInitialY; + private float prevX, prevY; + private int currentPointerID; + private boolean mIsResuming = false; private static final int MSG_LEFT_MOUSE_BUTTON_CHECK = 1028; private static final int MSG_DROP_ITEM_BUTTON_CHECK = 1029; @@ -230,89 +233,77 @@ public class BaseMainActivity extends LoggableActivity { if (isAndroid8OrHigher()) { touchPad.setDefaultFocusHighlightEnabled(false); } - touchPad.setOnTouchListener(new OnTouchListener(){ - private float prevX, prevY; - @Override - public boolean onTouch(View v, MotionEvent event) { - // MotionEvent reports input details from the touch screen - // and other input controls. In this case, you are only - // interested in events where the touch position changed. - // int index = event.getActionIndex(); - if(CallbackBridge.isGrabbing()) { - minecraftGLView.dispatchTouchEvent(MotionEvent.obtain(event)); - System.out.println("Transitioned event" + event.hashCode() + " to MinecraftGLView"); - return false; - } - int action = event.getActionMasked(); + touchPad.setOnTouchListener((v, event) -> { + // MotionEvent reports input details from the touch screen + // and other input controls. In this case, you are only + // interested in events where the touch position changed. + // int index = event.getActionIndex(); + if(CallbackBridge.isGrabbing()) { + minecraftGLView.dispatchTouchEvent(MotionEvent.obtain(event)); + System.out.println("Transitioned event" + event.hashCode() + " to MinecraftGLView"); + return false; + } + int action = event.getActionMasked(); - float x = event.getX(); - float y = event.getY(); - if(event.getHistorySize() > 0) { - prevX = event.getHistoricalX(0); - prevY = event.getHistoricalY(0); - }else{ + float x = event.getX(); + float y = event.getY(); + float mouseX = mousePointer.getTranslationX(); + float mouseY = mousePointer.getTranslationY(); + + if (gestureDetector.onTouchEvent(event)) { + mouse_x = (int) (mouseX * scaleFactor); + mouse_y = (int) (mouseY * scaleFactor); + CallbackBridge.sendCursorPos(mouse_x, mouse_y); + CallbackBridge.sendMouseKeycode(rightOverride ? LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT : LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT); + if (!rightOverride) CallbackBridge.mouseLeft = true; + + + } else { + switch (action) { + case MotionEvent.ACTION_UP: // 1 + case MotionEvent.ACTION_CANCEL: // 3 + if (!rightOverride) CallbackBridge.mouseLeft = false; + break; + + case MotionEvent.ACTION_POINTER_DOWN: // 5 + scrollInitialX = CallbackBridge.mouseX; + scrollInitialY = CallbackBridge.mouseY; + break; + + case MotionEvent.ACTION_DOWN: prevX = x; prevY = y; - } - float mouseX = mousePointer.getTranslationX(); - float mouseY = mousePointer.getTranslationY(); + currentPointerID = event.getPointerId(0); + break; - if (gestureDetector.onTouchEvent(event)) { - mouse_x = (int) (mouseX * scaleFactor); - mouse_y = (int) (mouseY * scaleFactor); - CallbackBridge.sendCursorPos((int) (mouseX * scaleFactor), (int) (mouseY *scaleFactor)); - CallbackBridge.sendMouseKeycode(rightOverride ? LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT : LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT); - if (!rightOverride) { - CallbackBridge.mouseLeft = true; + case MotionEvent.ACTION_MOVE: // 2 + + if (!CallbackBridge.isGrabbing() && event.getPointerCount() == 2 && !LauncherPreferences.PREF_DISABLE_GESTURES) { + CallbackBridge.sendScroll(CallbackBridge.mouseX - scrollInitialX, CallbackBridge.mouseY - scrollInitialY); + scrollInitialX = CallbackBridge.mouseX; + scrollInitialY = CallbackBridge.mouseY; + } else { + if(currentPointerID == event.getPointerId(0)) { + mouseX = Math.max(0, Math.min(displayMetrics.widthPixels, mouseX + (x - prevX) * LauncherPreferences.PREF_MOUSESPEED)); + mouseY = Math.max(0, Math.min(displayMetrics.heightPixels, mouseY + (y - prevY) * LauncherPreferences.PREF_MOUSESPEED)); + mouse_x = (int) (mouseX * scaleFactor); + mouse_y = (int) (mouseY * scaleFactor); + placeMouseAt(mouseX, mouseY); + CallbackBridge.sendCursorPos(mouse_x, mouse_y); + }else currentPointerID = event.getPointerId(0); + + prevX = x; + prevY = y; } - - } else { - switch (action) { - case MotionEvent.ACTION_UP: // 1 - case MotionEvent.ACTION_CANCEL: // 3 - if (!rightOverride) { - CallbackBridge.mouseLeft = false; - } - break; - - case MotionEvent.ACTION_POINTER_DOWN: // 5 - scrollInitialX = CallbackBridge.mouseX; - scrollInitialY = CallbackBridge.mouseY; - break; - - case MotionEvent.ACTION_POINTER_UP: // 6 - break; - - case MotionEvent.ACTION_MOVE: // 2 - - if (!CallbackBridge.isGrabbing() && event.getPointerCount() == 2 && !LauncherPreferences.PREF_DISABLE_GESTURES) { - CallbackBridge.sendScroll(CallbackBridge.mouseX - scrollInitialX, CallbackBridge.mouseY - scrollInitialY); - scrollInitialX = CallbackBridge.mouseX; - scrollInitialY = CallbackBridge.mouseY; - } else { - mouseX = Math.max(0, Math.min(displayMetrics.widthPixels, mouseX + (x - prevX)*LauncherPreferences.PREF_MOUSESPEED)); - mouseY = Math.max(0, Math.min(displayMetrics.heightPixels, mouseY + (y - prevY)*LauncherPreferences.PREF_MOUSESPEED)); - mouse_x = (int) (mouseX * scaleFactor); - mouse_y = (int) (mouseY * scaleFactor); - placeMouseAt(mouseX, mouseY); - CallbackBridge.sendCursorPos((int) (mouseX * scaleFactor), (int) (mouseY *scaleFactor)); - /* - if (!CallbackBridge.isGrabbing()) { - CallbackBridge.sendMouseKeycode(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT, 0, isLeftMouseDown); - CallbackBridge.sendMouseKeycode(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT, 0, isRightMouseDown); - } - */ - - break; - } - } - - debugText.setText(CallbackBridge.DEBUG_STRING.toString()); - CallbackBridge.DEBUG_STRING.setLength(0); - - return true; + break; } - }); + } + + debugText.setText(CallbackBridge.DEBUG_STRING.toString()); + CallbackBridge.DEBUG_STRING.setLength(0); + + return true; + }); // System.loadLibrary("Regal"); @@ -320,8 +311,6 @@ public class BaseMainActivity extends LoggableActivity { glTouchListener = new OnTouchListener(){ private boolean isTouchInHotbar = false; private int hotbarX, hotbarY; - private float prevX, prevY; - private int currentPointerID; @Override public boolean onTouch(View p1, MotionEvent e) { From 7132a576bffd424f205b9878c9bcca413038bcbc Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Sun, 23 May 2021 12:27:21 +0200 Subject: [PATCH 076/179] Clean up some code --- .../net/kdt/pojavlaunch/BaseMainActivity.java | 40 ++++++++----------- 1 file changed, 17 insertions(+), 23 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java index e52127faa..7dc6301d2 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java @@ -348,9 +348,7 @@ public class BaseMainActivity extends LoggableActivity { sendKeyPress(hudKeyHandled); } else { CallbackBridge.putMouseEventWithCoords(rightOverride ? (byte) 1 : (byte) 0, mouse_x, mouse_y); - if (!rightOverride) { - CallbackBridge.mouseLeft = true; - } + if (!rightOverride) CallbackBridge.mouseLeft = true; } } else { switch (e.getActionMasked()) { @@ -364,23 +362,22 @@ public class BaseMainActivity extends LoggableActivity { hotbarY = (int)e.getY(); theHandler.sendEmptyMessageDelayed(BaseMainActivity.MSG_DROP_ITEM_BUTTON_CHECK, LauncherPreferences.PREF_LONGPRESS_TRIGGER); - } else { - currentPointerID = e.getPointerId(0); - CallbackBridge.mouseX = mouse_x; - CallbackBridge.mouseY = mouse_y; - prevX = e.getX(); - prevY = e.getY(); - CallbackBridge.sendCursorPos(mouse_x, mouse_y); - if (!rightOverride) { - CallbackBridge.mouseLeft = true; - } + break; + } - if (CallbackBridge.isGrabbing()) { - // It cause hold left mouse while moving camera - initialX = mouse_x; - initialY = mouse_y; - theHandler.sendEmptyMessageDelayed(BaseMainActivity.MSG_LEFT_MOUSE_BUTTON_CHECK, LauncherPreferences.PREF_LONGPRESS_TRIGGER); - } + currentPointerID = e.getPointerId(0); + CallbackBridge.mouseX = mouse_x; + CallbackBridge.mouseY = mouse_y; + prevX = e.getX(); + prevY = e.getY(); + CallbackBridge.sendCursorPos(mouse_x, mouse_y); + if (!rightOverride) CallbackBridge.mouseLeft = true; + + if (CallbackBridge.isGrabbing()) { + // It cause hold left mouse while moving camera + initialX = mouse_x; + initialY = mouse_y; + theHandler.sendEmptyMessageDelayed(BaseMainActivity.MSG_LEFT_MOUSE_BUTTON_CHECK, LauncherPreferences.PREF_LONGPRESS_TRIGGER); } break; @@ -392,9 +389,7 @@ public class BaseMainActivity extends LoggableActivity { // -TODO uncomment after fix wrong trigger CallbackBridge.sendCursorPos(mouse_x, mouse_y); - if (!rightOverride) { - CallbackBridge.mouseLeft = false; - } + if (!rightOverride) CallbackBridge.mouseLeft = false; } if (CallbackBridge.isGrabbing()) { @@ -588,7 +583,6 @@ public class BaseMainActivity extends LoggableActivity { } - @Override public boolean dispatchGenericMotionEvent(MotionEvent ev) { int mouseCursorIndex = -1; From e77499778f402a4733c8787533e059daa736d0b1 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Mon, 24 May 2021 18:48:30 +0200 Subject: [PATCH 077/179] Introduced unified mouse sensitivity. --- .../java/net/kdt/pojavlaunch/BaseMainActivity.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java index 7dc6301d2..ebfae66f2 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java @@ -40,7 +40,9 @@ public class BaseMainActivity extends LoggableActivity { private Gamepad gamepad; private boolean rightOverride = false; + private DisplayMetrics displayMetrics; public float scaleFactor = 1; + public double sensitivityFactor; private final int fingerStillThreshold = 8; private int initialX, initialY; private int scrollInitialX, scrollInitialY; @@ -75,7 +77,7 @@ public class BaseMainActivity extends LoggableActivity { private MinecraftGLView minecraftGLView; private int guiScale; - private DisplayMetrics displayMetrics; + public boolean hiddenTextIgnoreUpdate = true; private boolean isVirtualMouseEnabled; @@ -148,7 +150,8 @@ public class BaseMainActivity extends LoggableActivity { // Minecraft 1.13+ isInputStackCall = mVersionInfo.arguments != null; - this.displayMetrics = Tools.getDisplayMetrics(this); + displayMetrics = Tools.getDisplayMetrics(this); + sensitivityFactor = 1.4 * (1080f/ displayMetrics.heightPixels); CallbackBridge.windowWidth = (int) ((float)displayMetrics.widthPixels * scaleFactor); CallbackBridge.windowHeight = (int) ((float)displayMetrics.heightPixels * scaleFactor); System.out.println("WidthHeight: " + CallbackBridge.windowWidth + ":" + CallbackBridge.windowHeight); @@ -442,8 +445,8 @@ public class BaseMainActivity extends LoggableActivity { if(e.getPointerId(0) != currentPointerID){ currentPointerID = e.getPointerId(0); }else{ - mouse_x += (int) (e.getX() - prevX); - mouse_y += (int) (e.getY() - prevY); + mouse_x += (int) (e.getX() - prevX) * sensitivityFactor; + mouse_y += (int) (e.getY() - prevY) * sensitivityFactor; } prevX = e.getX(); prevY = e.getY(); From ee00a737d4ac578192212954e03fee743117ff22 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Mon, 24 May 2021 18:49:02 +0200 Subject: [PATCH 078/179] more accurate gamepad deadzone detection --- .../net/kdt/pojavlaunch/BaseMainActivity.java | 4 ++-- .../main/java/net/kdt/pojavlaunch/Tools.java | 19 +------------------ 2 files changed, 3 insertions(+), 20 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java index ebfae66f2..a3733b45b 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java @@ -592,7 +592,7 @@ public class BaseMainActivity extends LoggableActivity { if(Gamepad.isGamepadEvent(ev)){ if(gamepad == null){ - gamepad = new Gamepad(this, Tools.grabFirstGamepad()); + gamepad = new Gamepad(this, ev.getDevice()); } gamepad.update(ev); @@ -644,7 +644,7 @@ public class BaseMainActivity extends LoggableActivity { if(Gamepad.isGamepadEvent(event)){ if(gamepad == null){ - gamepad = new Gamepad(this, Tools.grabFirstGamepad()); + gamepad = new Gamepad(this, event.getDevice()); } gamepad.update(event); diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java index 5ce8832c4..83b95c7bd 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java @@ -872,22 +872,5 @@ public final class Tools { Tools.updateWindowSize(ctx); } } - - public static InputDevice grabFirstGamepad() { - - int[] deviceIds = InputDevice.getDeviceIds(); - for (int deviceId : deviceIds) { - InputDevice dev = InputDevice.getDevice(deviceId); - int sources = dev.getSources(); - - // Verify that the device has gamepad buttons, control sticks, or both. - if (((sources & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD) - || ((sources & InputDevice.SOURCE_JOYSTICK) - == InputDevice.SOURCE_JOYSTICK)) { - // This device is a game controller. Store its device ID. - return dev; - } - } - return null; - } + } From a31331a0f1d03cea1e997bf18343959d4a133896 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Mon, 24 May 2021 18:49:31 +0200 Subject: [PATCH 079/179] Fallback for unproperly detected gamepads --- .../pojavlaunch/customcontrols/gamepad/GamepadJoystick.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadJoystick.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadJoystick.java index ac12f2e78..b36653131 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadJoystick.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadJoystick.java @@ -28,8 +28,8 @@ public class GamepadJoystick { this.horizontalAxis = horizontalAxis; //Some controllers aren't recognized as such by android, so we fallback to a default value of 0.2 - deadzone = device != null ? Math.max(device.getMotionRange(verticalAxis).getFlat(), - device.getMotionRange(horizontalAxis).getFlat()) * 2f : 0.2f; + try { deadzone = Math.max(device.getMotionRange(verticalAxis).getFlat(), device.getMotionRange(horizontalAxis).getFlat()); } + catch (NullPointerException e){ deadzone = 0.2f; } if(deadzone < 0.15) deadzone = 0.15f; } From bf228199e48ccae96d3ece95cc377348ba097617 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Thu, 27 May 2021 17:46:24 +0200 Subject: [PATCH 080/179] Forgot to add the multiplier --- .../kdt/pojavlaunch/customcontrols/gamepad/GamepadJoystick.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadJoystick.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadJoystick.java index b36653131..ae9c87457 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadJoystick.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadJoystick.java @@ -28,7 +28,7 @@ public class GamepadJoystick { this.horizontalAxis = horizontalAxis; //Some controllers aren't recognized as such by android, so we fallback to a default value of 0.2 - try { deadzone = Math.max(device.getMotionRange(verticalAxis).getFlat(), device.getMotionRange(horizontalAxis).getFlat()); } + try { deadzone = Math.max(device.getMotionRange(verticalAxis).getFlat(), device.getMotionRange(horizontalAxis).getFlat()) * 1.9f; } catch (NullPointerException e){ deadzone = 0.2f; } if(deadzone < 0.15) deadzone = 0.15f; From 14f76142b902ccd437acc26083ac9e95bec1b223 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Thu, 27 May 2021 17:48:29 +0200 Subject: [PATCH 081/179] Add pointer resource --- .../src/main/res/drawable-xhdpi/pointer.png | Bin 0 -> 861 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100755 app_pojavlauncher/src/main/res/drawable-xhdpi/pointer.png diff --git a/app_pojavlauncher/src/main/res/drawable-xhdpi/pointer.png b/app_pojavlauncher/src/main/res/drawable-xhdpi/pointer.png new file mode 100755 index 0000000000000000000000000000000000000000..9a3fceb7649c9944441b7fb16b5313878306b705 GIT binary patch literal 861 zcmV-j1ETziP)DbwT>X+$100IAj?ifBR0D^= zq=Ccq0otVG)=O=X7$);=wXja0*Sv6@^)u@fxL3fLY~C1wSUsy|gw z;r0b#@EavC z(mr{dlI+CPE*U77rWWQ!DXux=C#GKRWLu@UU2>=tr`p_{gmW`EmkdixO`(kxd~9dK z%9(K6(gsUIO>xak+r`#flntg&{xC5~lubEflfb-cDz2P}c33MQ4 Date: Thu, 27 May 2021 17:51:23 +0200 Subject: [PATCH 082/179] Add the pointer to the main layout. --- .../src/main/res/layout/main_with_customctrl.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app_pojavlauncher/src/main/res/layout/main_with_customctrl.xml b/app_pojavlauncher/src/main/res/layout/main_with_customctrl.xml index 608f8d77a..6f269d3d2 100644 --- a/app_pojavlauncher/src/main/res/layout/main_with_customctrl.xml +++ b/app_pojavlauncher/src/main/res/layout/main_with_customctrl.xml @@ -39,6 +39,12 @@ + + Date: Thu, 27 May 2021 17:59:16 +0200 Subject: [PATCH 083/179] The controller now uses a pointer image that isn't linked to the touchpad pointer --- .../customcontrols/gamepad/Gamepad.java | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java index 6d9ef863f..e88d47012 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java @@ -4,10 +4,11 @@ import android.view.InputDevice; import android.view.InputEvent; import android.view.KeyEvent; import android.view.MotionEvent; +import android.widget.ImageView; import net.kdt.pojavlaunch.BaseMainActivity; import net.kdt.pojavlaunch.LWJGLGLFWKeycode; -import net.kdt.pojavlaunch.Tools; +import net.kdt.pojavlaunch.R; import org.lwjgl.glfw.CallbackBridge; @@ -24,7 +25,7 @@ import static net.kdt.pojavlaunch.customcontrols.gamepad.GamepadJoystick.DIRECTI public class Gamepad { private BaseMainActivity gameActivity; - + private ImageView pointerView; private GamepadDpad gamepadDpad = new GamepadDpad(); @@ -57,6 +58,7 @@ public class Gamepad { this.gameActivity = gameActivity; + pointerView = this.gameActivity.findViewById(R.id.console_pointer); createMapping(); mouseThread = new Thread("Gamepad Thread"){ @@ -97,16 +99,15 @@ public class Gamepad { acceleration = (mouseMagnitude - currentJoystick.getDeadzone())/(1 - currentJoystick.getDeadzone()); acceleration = Math.pow(acceleration, mouseMaxAcceleration); - if(acceleration > 1){ - acceleration = 1; - } + if(acceleration > 1) acceleration = 1; + gameActivity.mouse_x += Math.cos(mouseAngle) * acceleration * mouseSensitivity; gameActivity.mouse_y -= Math.sin(mouseAngle) * acceleration * mouseSensitivity; CallbackBridge.sendCursorPos(gameActivity.mouse_x, gameActivity.mouse_y); if(!isGrabbing){ - gameActivity.placeMouseAt(gameActivity.mouse_x / gameActivity.scaleFactor, gameActivity.mouse_y / gameActivity.scaleFactor); + placePointerView((int)(gameActivity.mouse_x / gameActivity.scaleFactor), (int) (gameActivity.mouse_y / gameActivity.scaleFactor)); } } @@ -133,7 +134,7 @@ public class Gamepad { gameActivity.mouse_x = CallbackBridge.windowWidth/2; gameActivity.mouse_y = CallbackBridge.windowHeight/2; CallbackBridge.sendCursorPos(gameActivity.mouse_x, gameActivity.mouse_y); - gameActivity.placeMouseAt(CallbackBridge.physicalWidth/2, CallbackBridge.physicalHeight/2); + placePointerView(CallbackBridge.physicalWidth/2, CallbackBridge.physicalHeight/2); } } @@ -288,6 +289,10 @@ public class Gamepad { } } + private void placePointerView(int x, int y){ + pointerView.setTranslationX(x-32); + pointerView.setTranslationY(y-32); + } private void sendButton(KeyEvent event){ int keycode = event.getKeyCode(); From 087eadb1e52ae529acbc27ab8151d8fe4fac5bd8 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Thu, 27 May 2021 20:01:12 +0200 Subject: [PATCH 084/179] The pointer now appears only when needed. --- .../kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java | 9 ++++++++- .../src/main/res/layout/main_with_customctrl.xml | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java index e88d47012..5c9d50569 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java @@ -47,7 +47,7 @@ public class Gamepad { private final GamepadMapping menuMap = new GamepadMapping(); private GamepadMapping currentMap = menuMap; - private boolean isGrabbing = false; + private boolean isGrabbing = true; private Thread mouseThread; @@ -125,6 +125,7 @@ public class Gamepad { //TODO hide the cursor currentMap = gameMap; menuMap.resetPressedState(); + setPointerViewVisible(false); }else{ //TODO place the cursor at the center currentMap = menuMap; @@ -135,6 +136,7 @@ public class Gamepad { gameActivity.mouse_y = CallbackBridge.windowHeight/2; CallbackBridge.sendCursorPos(gameActivity.mouse_x, gameActivity.mouse_y); placePointerView(CallbackBridge.physicalWidth/2, CallbackBridge.physicalHeight/2); + setPointerViewVisible(true); } } @@ -294,6 +296,11 @@ public class Gamepad { pointerView.setTranslationY(y-32); } + private void setPointerViewVisible(boolean state){ + new Handler(Looper.getMainLooper()).post(() -> pointerView.setVisibility( state ? View.VISIBLE : View.INVISIBLE)); + + } + private void sendButton(KeyEvent event){ int keycode = event.getKeyCode(); switch (keycode){ diff --git a/app_pojavlauncher/src/main/res/layout/main_with_customctrl.xml b/app_pojavlauncher/src/main/res/layout/main_with_customctrl.xml index 6f269d3d2..ecbeb9517 100644 --- a/app_pojavlauncher/src/main/res/layout/main_with_customctrl.xml +++ b/app_pojavlauncher/src/main/res/layout/main_with_customctrl.xml @@ -41,6 +41,7 @@ From d1dc7ec6450535eec5169e89c9b7c191b851c7c2 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Thu, 27 May 2021 20:03:11 +0200 Subject: [PATCH 085/179] Added needed imports --- .../net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java index 5c9d50569..880a992ae 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java @@ -1,9 +1,12 @@ package net.kdt.pojavlaunch.customcontrols.gamepad; +import android.os.Handler; +import android.os.Looper; import android.view.InputDevice; import android.view.InputEvent; import android.view.KeyEvent; import android.view.MotionEvent; +import android.view.View; import android.widget.ImageView; import net.kdt.pojavlaunch.BaseMainActivity; From 8a85ea819ba4ed612714f1727a203f8da04f24f6 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Fri, 28 May 2021 20:17:13 +0200 Subject: [PATCH 086/179] Buttons are into packages now. --- .../net/kdt/pojavlaunch/MainActivity.java | 1 + .../customcontrols/ControlLayout.java | 7 +++++-- .../{ => buttons}/ControlButton.java | 5 ++++- .../{ => buttons}/ControlDrawer.java | 9 ++++----- .../{ => buttons}/ControlSubButton.java | 5 ++++- .../handleview/ActionPopupWindow.java | 7 ++++--- .../handleview/EditControlButtonPopup.java | 3 +-- .../handleview/EditControlDrawerPopup.java | 14 +------------- .../handleview/EditControlSubButtonPopup.java | 19 +------------------ .../customcontrols/handleview/HandleView.java | 6 ++---- .../handleview/SelectionEndHandleView.java | 5 ++--- 11 files changed, 29 insertions(+), 52 deletions(-) rename app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/{ => buttons}/ControlButton.java (98%) rename app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/{ => buttons}/ControlDrawer.java (95%) rename app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/{ => buttons}/ControlSubButton.java (87%) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MainActivity.java index 6fb848679..f63c0dd98 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MainActivity.java @@ -10,6 +10,7 @@ import androidx.annotation.Nullable; import com.google.android.material.navigation.NavigationView; import net.kdt.pojavlaunch.customcontrols.*; +import net.kdt.pojavlaunch.customcontrols.buttons.ControlButton; import net.kdt.pojavlaunch.prefs.*; import net.kdt.pojavlaunch.utils.MCOptionUtils; diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java index df5fdc9da..b6965bdc9 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java @@ -9,6 +9,9 @@ import java.util.ArrayList; import java.util.List; import net.kdt.pojavlaunch.*; +import net.kdt.pojavlaunch.customcontrols.buttons.ControlButton; +import net.kdt.pojavlaunch.customcontrols.buttons.ControlDrawer; +import net.kdt.pojavlaunch.customcontrols.buttons.ControlSubButton; import net.kdt.pojavlaunch.prefs.*; import org.lwjgl.glfw.*; @@ -268,7 +271,7 @@ public class ControlLayout extends FrameLayout return mModifiable; } - protected void setModified(boolean z) { - if (mActivity != null) mActivity.isModified = z; + public void setModified(boolean isModified) { + if (mActivity != null) mActivity.isModified = isModified; } } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlButton.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java similarity index 98% rename from app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlButton.java rename to app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java index d29bffe25..b9f5890ed 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlButton.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java @@ -1,4 +1,4 @@ -package net.kdt.pojavlaunch.customcontrols; +package net.kdt.pojavlaunch.customcontrols.buttons; import android.content.*; import android.graphics.*; @@ -8,6 +8,9 @@ import android.util.*; import android.view.*; import android.view.View.*; import android.widget.*; + +import net.kdt.pojavlaunch.customcontrols.ControlData; +import net.kdt.pojavlaunch.customcontrols.ControlLayout; import net.kdt.pojavlaunch.customcontrols.handleview.*; import net.kdt.pojavlaunch.prefs.LauncherPreferences; import net.kdt.pojavlaunch.*; diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlDrawer.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlDrawer.java similarity index 95% rename from app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlDrawer.java rename to app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlDrawer.java index ea751fcfc..6b341c33c 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlDrawer.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlDrawer.java @@ -1,14 +1,13 @@ -package net.kdt.pojavlaunch.customcontrols; +package net.kdt.pojavlaunch.customcontrols.buttons; -import android.content.Context; -import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; -import androidx.annotation.NonNull; - import net.kdt.pojavlaunch.Tools; +import net.kdt.pojavlaunch.customcontrols.ControlData; +import net.kdt.pojavlaunch.customcontrols.ControlDrawerData; +import net.kdt.pojavlaunch.customcontrols.ControlLayout; import java.util.ArrayList; diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlSubButton.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlSubButton.java similarity index 87% rename from app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlSubButton.java rename to app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlSubButton.java index b09e37911..ce43c5881 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlSubButton.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlSubButton.java @@ -1,9 +1,12 @@ -package net.kdt.pojavlaunch.customcontrols; +package net.kdt.pojavlaunch.customcontrols.buttons; import android.os.Handler; import android.os.Looper; import android.view.ViewGroup; +import net.kdt.pojavlaunch.customcontrols.ControlData; +import net.kdt.pojavlaunch.customcontrols.ControlLayout; + public class ControlSubButton extends ControlButton { public ControlDrawer parentDrawer; diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/ActionPopupWindow.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/ActionPopupWindow.java index 7f1b16854..5c4836cc9 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/ActionPopupWindow.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/ActionPopupWindow.java @@ -19,10 +19,7 @@ */ package net.kdt.pojavlaunch.customcontrols.handleview; -import android.app.Dialog; import android.content.*; -import android.graphics.drawable.ColorDrawable; -import android.util.Log; import android.view.*; import android.view.ViewGroup.*; import android.widget.*; @@ -31,6 +28,10 @@ import net.kdt.pojavlaunch.*; import android.view.View.OnClickListener; import net.kdt.pojavlaunch.customcontrols.*; +import net.kdt.pojavlaunch.customcontrols.buttons.ControlButton; +import net.kdt.pojavlaunch.customcontrols.buttons.ControlDrawer; +import net.kdt.pojavlaunch.customcontrols.buttons.ControlSubButton; + import androidx.appcompat.app.*; import com.rarepebble.colorpicker.ColorPickerView; diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java index 600eec17b..a07355f1b 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java @@ -2,7 +2,6 @@ package net.kdt.pojavlaunch.customcontrols.handleview; import android.app.Dialog; import android.content.Context; -import android.content.DialogInterface; import android.graphics.drawable.ColorDrawable; import android.view.LayoutInflater; import android.view.View; @@ -18,7 +17,7 @@ import androidx.appcompat.app.AlertDialog; import net.kdt.pojavlaunch.AndroidLWJGLKeycode; import net.kdt.pojavlaunch.R; -import net.kdt.pojavlaunch.customcontrols.ControlButton; +import net.kdt.pojavlaunch.customcontrols.buttons.ControlButton; import net.kdt.pojavlaunch.customcontrols.ControlData; import static net.kdt.pojavlaunch.customcontrols.handleview.ActionPopupWindow.setPercentageText; diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlDrawerPopup.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlDrawerPopup.java index 123396858..fffdc3d24 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlDrawerPopup.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlDrawerPopup.java @@ -1,29 +1,17 @@ package net.kdt.pojavlaunch.customcontrols.handleview; -import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; -import android.graphics.drawable.ColorDrawable; -import android.view.LayoutInflater; import android.view.View; import android.widget.ArrayAdapter; -import android.widget.CheckBox; -import android.widget.EditText; -import android.widget.ImageButton; -import android.widget.SeekBar; import android.widget.Spinner; -import android.widget.TextView; - -import androidx.appcompat.app.AlertDialog; import net.kdt.pojavlaunch.R; import net.kdt.pojavlaunch.customcontrols.ControlData; -import net.kdt.pojavlaunch.customcontrols.ControlDrawer; +import net.kdt.pojavlaunch.customcontrols.buttons.ControlDrawer; import net.kdt.pojavlaunch.customcontrols.ControlDrawerData; import net.kdt.pojavlaunch.customcontrols.ControlLayout; -import static net.kdt.pojavlaunch.customcontrols.handleview.ActionPopupWindow.setPercentageText; - public class EditControlDrawerPopup extends EditControlButtonPopup{ private Spinner spinnerOrientation; diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlSubButtonPopup.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlSubButtonPopup.java index 4e0022e03..e8c1f99c8 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlSubButtonPopup.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlSubButtonPopup.java @@ -1,26 +1,9 @@ package net.kdt.pojavlaunch.customcontrols.handleview; -import android.app.Dialog; -import android.content.Context; -import android.graphics.drawable.ColorDrawable; -import android.view.LayoutInflater; import android.view.View; -import android.widget.ArrayAdapter; -import android.widget.CheckBox; -import android.widget.EditText; -import android.widget.ImageButton; -import android.widget.SeekBar; -import android.widget.Spinner; -import android.widget.TextView; -import androidx.appcompat.app.AlertDialog; - -import net.kdt.pojavlaunch.AndroidLWJGLKeycode; import net.kdt.pojavlaunch.R; -import net.kdt.pojavlaunch.customcontrols.ControlButton; -import net.kdt.pojavlaunch.customcontrols.ControlData; - -import static net.kdt.pojavlaunch.customcontrols.handleview.ActionPopupWindow.setPercentageText; +import net.kdt.pojavlaunch.customcontrols.buttons.ControlButton; public class EditControlSubButtonPopup extends EditControlButtonPopup{ diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/HandleView.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/HandleView.java index 8611f3f5e..46e122905 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/HandleView.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/HandleView.java @@ -22,13 +22,11 @@ package net.kdt.pojavlaunch.customcontrols.handleview; import android.graphics.*; import android.graphics.drawable.*; import android.os.*; -import android.text.*; import android.view.*; import android.widget.*; -import android.content.*; -import java.lang.reflect.*; + import net.kdt.pojavlaunch.*; -import net.kdt.pojavlaunch.customcontrols.*; +import net.kdt.pojavlaunch.customcontrols.buttons.ControlButton; public abstract class HandleView extends View implements ViewPositionListener, View.OnLongClickListener diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/SelectionEndHandleView.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/SelectionEndHandleView.java index 1dd401451..eb606da4e 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/SelectionEndHandleView.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/SelectionEndHandleView.java @@ -20,10 +20,9 @@ package net.kdt.pojavlaunch.customcontrols.handleview; import android.graphics.drawable.*; -import android.text.*; import android.view.*; -import android.os.*; -import net.kdt.pojavlaunch.customcontrols.*; + +import net.kdt.pojavlaunch.customcontrols.buttons.ControlButton; public class SelectionEndHandleView extends HandleView From a6136f9e46a223bd7ea92d3e9b336fc45040bc04 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Fri, 28 May 2021 20:17:47 +0200 Subject: [PATCH 087/179] Add versionning for the custom controls. --- .../pojavlaunch/customcontrols/CustomControls.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/CustomControls.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/CustomControls.java index 1e99f252e..0d05f5e65 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/CustomControls.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/CustomControls.java @@ -5,13 +5,13 @@ import java.util.*; import net.kdt.pojavlaunch.*; import org.lwjgl.glfw.*; -public class CustomControls -{ +public class CustomControls { + public int version = -1; public float scaledAt; public List mControlDataList; public List mDrawerDataList; public CustomControls() { - this(new ArrayList(), new ArrayList()); + this(new ArrayList<>(), new ArrayList<>()); } @@ -47,7 +47,9 @@ public class CustomControls shiftData.isToggle = true; this.mControlDataList.add(shiftData); this.mControlDataList.add(new ControlData(ctx, R.string.control_jump, new int[]{LWJGLGLFWKeycode.GLFW_KEY_SPACE}, "${right} - ${margin} * 2 - ${width}", "${bottom} - ${margin} * 2 - ${height}", true)); - + + //The default controls are conform to the V2 + version = 2; } public ControlData findControlData(int keycode) { @@ -62,6 +64,9 @@ public class CustomControls } public void save(String path) throws Exception { + //Current version is the V2 so the version as to be marked as 2 ! + version = 2; + Tools.write(path, Tools.GLOBAL_GSON.toJson(this)); } } From 95fd415f94cdb62ba4f8f110542854e0685dd490 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Sat, 29 May 2021 19:24:24 +0200 Subject: [PATCH 088/179] Reduce gamepad sensitivity when in menus --- .../net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java index 880a992ae..1536678a5 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java @@ -129,6 +129,7 @@ public class Gamepad { currentMap = gameMap; menuMap.resetPressedState(); setPointerViewVisible(false); + mouseSensitivity = 19; }else{ //TODO place the cursor at the center currentMap = menuMap; @@ -140,6 +141,7 @@ public class Gamepad { CallbackBridge.sendCursorPos(gameActivity.mouse_x, gameActivity.mouse_y); placePointerView(CallbackBridge.physicalWidth/2, CallbackBridge.physicalHeight/2); setPointerViewVisible(true); + mouseSensitivity = 15; } } From 0ddc5db96790707687a14d35a1d4da45c550ed89 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Sun, 6 Jun 2021 10:13:40 +0200 Subject: [PATCH 089/179] - Reset state will now only send an input when necesarry. --- .../customcontrols/gamepad/GamepadButton.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadButton.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadButton.java index f7f513ce6..f502ff60f 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadButton.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadButton.java @@ -5,12 +5,12 @@ import android.view.KeyEvent; public class GamepadButton { /* - Just a simple button, that auto deal with the great habit from android to just SPAAAM input events + Just a simple button, that auto deal with the great habit from android to just SPAAAMS input events */ public int[] keycodes; public boolean isToggleable = false; private boolean isDown = false; - private boolean toggled = false; + private boolean isToggled = false; public void update(KeyEvent event){ boolean isKeyDown = (event.getAction() == KeyEvent.ACTION_DOWN); @@ -22,23 +22,25 @@ public class GamepadButton { isDown = isKeyDown; if(isToggleable){ if(isKeyDown){ - toggled = !toggled; - Gamepad.sendInput(keycodes, toggled); + isToggled = !isToggled; + Gamepad.sendInput(keycodes, isToggled); } return; } - Gamepad.sendInput(keycodes, isDown); } } public void resetButtonState(){ + if(isDown || isToggled){ + Gamepad.sendInput(keycodes, false); + } isDown = false; - toggled = false; - Gamepad.sendInput(keycodes, false); + isToggled = false; } + public boolean isDown(){ - return isToggleable ? toggled : isDown; + return isToggleable ? isToggled : isDown; } } From 3aa408af9678c9f6e1be154c5be0be29d4e238ff Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Thu, 10 Jun 2021 19:57:00 +0200 Subject: [PATCH 090/179] Fix crashes on minecraft 1.13+ --- .../customcontrols/gamepad/Gamepad.java | 98 ++++++++++--------- 1 file changed, 52 insertions(+), 46 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java index 1536678a5..80af9a190 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java @@ -11,6 +11,7 @@ import android.widget.ImageView; import net.kdt.pojavlaunch.BaseMainActivity; import net.kdt.pojavlaunch.LWJGLGLFWKeycode; +import net.kdt.pojavlaunch.MainActivity; import net.kdt.pojavlaunch.R; import org.lwjgl.glfw.CallbackBridge; @@ -48,12 +49,14 @@ public class Gamepad { private final GamepadMapping gameMap = new GamepadMapping(); private final GamepadMapping menuMap = new GamepadMapping(); - private GamepadMapping currentMap = menuMap; + private GamepadMapping currentMap = gameMap; - private boolean isGrabbing = true; + private boolean lastGrabbingState = true; - private Thread mouseThread; + private final Thread mouseThread; + private final Runnable mouseRunnable; + private final Runnable switchStateRunnable; public Gamepad(BaseMainActivity gameActivity, InputDevice inputDevice){ leftJoystick = new GamepadJoystick(MotionEvent.AXIS_X, MotionEvent.AXIS_Y, inputDevice); @@ -77,8 +80,8 @@ public class Gamepad { long now = System.nanoTime(); delta += (now - lastTime) / ns; lastTime = now; - if(delta >= 1) { + if(delta >= 1) { updateGrabbingState(); tick(); @@ -93,11 +96,9 @@ public class Gamepad { } } - - private void tick(){ if(lastHorizontalValue != 0 || lastVerticalValue != 0){ - GamepadJoystick currentJoystick = isGrabbing ? leftJoystick : rightJoystick; + GamepadJoystick currentJoystick = CallbackBridge.isGrabbing() ? leftJoystick : rightJoystick; acceleration = (mouseMagnitude - currentJoystick.getDeadzone())/(1 - currentJoystick.getDeadzone()); acceleration = Math.pow(acceleration, mouseMaxAcceleration); @@ -105,12 +106,15 @@ public class Gamepad { if(acceleration > 1) acceleration = 1; - gameActivity.mouse_x += Math.cos(mouseAngle) * acceleration * mouseSensitivity; - gameActivity.mouse_y -= Math.sin(mouseAngle) * acceleration * mouseSensitivity; + CallbackBridge.mouseX += Math.cos(mouseAngle) * acceleration * mouseSensitivity; + CallbackBridge.mouseY -= Math.sin(mouseAngle) * acceleration * mouseSensitivity; + gameActivity.mouse_x = CallbackBridge.mouseX; + gameActivity.mouse_y = CallbackBridge.mouseY; - CallbackBridge.sendCursorPos(gameActivity.mouse_x, gameActivity.mouse_y); - if(!isGrabbing){ - placePointerView((int)(gameActivity.mouse_x / gameActivity.scaleFactor), (int) (gameActivity.mouse_y / gameActivity.scaleFactor)); + gameActivity.runOnUiThread(mouseRunnable); + + if(!CallbackBridge.isGrabbing()){ + placePointerView((int)(CallbackBridge.mouseX / gameActivity.scaleFactor), (int) (CallbackBridge.mouseY / gameActivity.scaleFactor)); } } @@ -118,32 +122,37 @@ public class Gamepad { }; mouseThread.setPriority(1); mouseThread.start(); + + + //Initialize runnables to be used by the input system, avoiding generating one each time is better memory. + mouseRunnable = () -> CallbackBridge.sendCursorPos(gameActivity.mouse_x, gameActivity.mouse_y); + switchStateRunnable = () -> { + if(lastGrabbingState){ + currentMap = gameMap; + menuMap.resetPressedState(); + pointerView.setVisibility(View.INVISIBLE); + mouseSensitivity = 19; + return; + } + + currentMap = menuMap; + gameMap.resetPressedState(); + sendDirectionalKeycode(currentJoystickDirection, false, gameMap); // removing what we were doing + + gameActivity.mouse_x = CallbackBridge.windowWidth/2; + gameActivity.mouse_y = CallbackBridge.windowHeight/2; + CallbackBridge.sendCursorPos(gameActivity.mouse_x, gameActivity.mouse_y); + placePointerView(CallbackBridge.physicalWidth/2, CallbackBridge.physicalHeight/2); + pointerView.setVisibility(View.VISIBLE); + mouseSensitivity = 15; + }; } private void updateGrabbingState() { - boolean lastGrabbingValue = isGrabbing; - isGrabbing = CallbackBridge.isGrabbing(); - if(lastGrabbingValue != isGrabbing){ - if(isGrabbing){ - //TODO hide the cursor - currentMap = gameMap; - menuMap.resetPressedState(); - setPointerViewVisible(false); - mouseSensitivity = 19; - }else{ - //TODO place the cursor at the center - currentMap = menuMap; - gameMap.resetPressedState(); - sendDirectionalKeycode(currentJoystickDirection, false, gameMap); // removing what we were doing - - gameActivity.mouse_x = CallbackBridge.windowWidth/2; - gameActivity.mouse_y = CallbackBridge.windowHeight/2; - CallbackBridge.sendCursorPos(gameActivity.mouse_x, gameActivity.mouse_y); - placePointerView(CallbackBridge.physicalWidth/2, CallbackBridge.physicalHeight/2); - setPointerViewVisible(true); - mouseSensitivity = 15; - } - + boolean lastGrabbingValue = lastGrabbingState; + lastGrabbingState = CallbackBridge.isGrabbing(); + if(lastGrabbingValue != lastGrabbingState){ + gameActivity.runOnUiThread(switchStateRunnable); } } @@ -233,7 +242,7 @@ public class Gamepad { } private void updateMouseJoystick(MotionEvent event){ - GamepadJoystick currentJoystick = isGrabbing ? rightJoystick : leftJoystick; + GamepadJoystick currentJoystick = CallbackBridge.isGrabbing() ? rightJoystick : leftJoystick; lastHorizontalValue = currentJoystick.getHorizontalAxis(event); lastVerticalValue = currentJoystick.getVerticalAxis(event); @@ -242,7 +251,7 @@ public class Gamepad { } private void updateDirectionalJoystick(MotionEvent event){ - GamepadJoystick currentJoystick = isGrabbing ? leftJoystick : rightJoystick; + GamepadJoystick currentJoystick = CallbackBridge.isGrabbing() ? leftJoystick : rightJoystick; int lastJoystickDirection = currentJoystickDirection; currentJoystickDirection = currentJoystick.getHeightDirection(event); @@ -256,7 +265,6 @@ public class Gamepad { private void updateAnalogTriggers(MotionEvent event){ getCurrentMap().TRIGGER_LEFT.update(event.getAxisValue(MotionEvent.AXIS_LTRIGGER) > 0.5); getCurrentMap().TRIGGER_RIGHT.update(event.getAxisValue(MotionEvent.AXIS_RTRIGGER) > 0.5); - } private GamepadMapping getCurrentMap(){ @@ -301,10 +309,6 @@ public class Gamepad { pointerView.setTranslationY(y-32); } - private void setPointerViewVisible(boolean state){ - new Handler(Looper.getMainLooper()).post(() -> pointerView.setVisibility( state ? View.VISIBLE : View.INVISIBLE)); - - } private void sendButton(KeyEvent event){ int keycode = event.getKeyCode(); @@ -355,7 +359,7 @@ public class Gamepad { default: - BaseMainActivity.sendKeyPress(LWJGLGLFWKeycode.GLFW_KEY_SPACE, CallbackBridge.getCurrentMods(), event.getAction() == KeyEvent.ACTION_DOWN); + MainActivity.sendKeyPress(LWJGLGLFWKeycode.GLFW_KEY_SPACE, CallbackBridge.getCurrentMods(), event.getAction() == KeyEvent.ACTION_DOWN); break; } } @@ -371,15 +375,17 @@ public class Gamepad { break; case LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT: - BaseMainActivity.sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT, isDown); + CallbackBridge.putMouseEventWithCoords(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT, isDown?1:0, CallbackBridge.mouseX, CallbackBridge.mouseY); + //MainActivity.sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT, isDown); break; case LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT: - BaseMainActivity.sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT, isDown); + CallbackBridge.putMouseEventWithCoords(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT, isDown?1:0, CallbackBridge.mouseX, CallbackBridge.mouseY); + //MainActivity.sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT, isDown); break; default: - BaseMainActivity.sendKeyPress(keycode, CallbackBridge.getCurrentMods(), isDown); + MainActivity.sendKeyPress(keycode, CallbackBridge.getCurrentMods(), isDown); break; } } From 9ac66cd3c8685177063b5ab18bfa4eecc5f8245d Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Thu, 17 Jun 2021 12:30:12 +0200 Subject: [PATCH 091/179] Tweak scroll feature to be less resolution dependent and more friendly to use. --- .../src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java index a3733b45b..610004e27 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java @@ -282,7 +282,7 @@ public class BaseMainActivity extends LoggableActivity { case MotionEvent.ACTION_MOVE: // 2 if (!CallbackBridge.isGrabbing() && event.getPointerCount() == 2 && !LauncherPreferences.PREF_DISABLE_GESTURES) { - CallbackBridge.sendScroll(CallbackBridge.mouseX - scrollInitialX, CallbackBridge.mouseY - scrollInitialY); + CallbackBridge.sendScroll( Tools.pxToDp(CallbackBridge.mouseX - scrollInitialX)/30, Tools.pxToDp(CallbackBridge.mouseY - scrollInitialY)/30); scrollInitialX = CallbackBridge.mouseX; scrollInitialY = CallbackBridge.mouseY; } else { @@ -428,7 +428,7 @@ public class BaseMainActivity extends LoggableActivity { case MotionEvent.ACTION_MOVE: if (!CallbackBridge.isGrabbing() && e.getPointerCount() == 2 && !LauncherPreferences.PREF_DISABLE_GESTURES) { - CallbackBridge.sendScroll(mouse_x - scrollInitialX, mouse_y - scrollInitialY); + CallbackBridge.sendScroll(Tools.pxToDp(mouse_x - scrollInitialX)/30 , Tools.pxToDp(mouse_y - scrollInitialY)/30); scrollInitialX = mouse_x; scrollInitialY = mouse_y; } else if (!isTouchInHotbar) { From 33ebc505192179b6cce1b9e84c37178449663796 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Thu, 17 Jun 2021 12:33:18 +0200 Subject: [PATCH 092/179] Clean up useless code --- .../customcontrols/gamepad/Gamepad.java | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java index 80af9a190..12c390beb 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java @@ -221,21 +221,11 @@ public class Gamepad { } - - public void update(InputEvent event){ - if(event instanceof MotionEvent){ - update((MotionEvent) event); - } - if(event instanceof KeyEvent){ - update((KeyEvent) event); - } - } - - private void update(KeyEvent event){ + public void update(KeyEvent event){ sendButton(event); } - private void update(MotionEvent event){ + public void update(MotionEvent event){ updateDirectionalJoystick(event); updateMouseJoystick(event); updateAnalogTriggers(event); From 1aabb184d30da637fa44f7b8c6f7a099f8767d89 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Thu, 17 Jun 2021 13:36:23 +0200 Subject: [PATCH 093/179] The speed of gamepad cursor is now res independent. --- .../kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java index 12c390beb..aa37f16ea 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java @@ -127,16 +127,15 @@ public class Gamepad { //Initialize runnables to be used by the input system, avoiding generating one each time is better memory. mouseRunnable = () -> CallbackBridge.sendCursorPos(gameActivity.mouse_x, gameActivity.mouse_y); switchStateRunnable = () -> { + currentMap.resetPressedState(); if(lastGrabbingState){ currentMap = gameMap; - menuMap.resetPressedState(); pointerView.setVisibility(View.INVISIBLE); - mouseSensitivity = 19; + mouseSensitivity = 26 / gameActivity.sensitivityFactor; //sensitivity in menus is resolution dependent. return; } currentMap = menuMap; - gameMap.resetPressedState(); sendDirectionalKeycode(currentJoystickDirection, false, gameMap); // removing what we were doing gameActivity.mouse_x = CallbackBridge.windowWidth/2; @@ -144,7 +143,7 @@ public class Gamepad { CallbackBridge.sendCursorPos(gameActivity.mouse_x, gameActivity.mouse_y); placePointerView(CallbackBridge.physicalWidth/2, CallbackBridge.physicalHeight/2); pointerView.setVisibility(View.VISIBLE); - mouseSensitivity = 15; + mouseSensitivity = 15; //sensitivity in game doesn't need to be resolution dependent }; } From 3099301645fbc3cd11192a26324224fd93e07ef8 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Thu, 17 Jun 2021 14:31:03 +0200 Subject: [PATCH 094/179] Clean up onTouch function --- .../net/kdt/pojavlaunch/BaseMainActivity.java | 41 +++++++------------ 1 file changed, 14 insertions(+), 27 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java index 610004e27..7d95f93c4 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java @@ -308,7 +308,6 @@ public class BaseMainActivity extends LoggableActivity { return true; }); - // System.loadLibrary("Regal"); minecraftGLView.setFocusable(true); glTouchListener = new OnTouchListener(){ @@ -317,25 +316,18 @@ public class BaseMainActivity extends LoggableActivity { @Override public boolean onTouch(View p1, MotionEvent e) { - { - int mptrIndex = -1; - for (int i = 0; i < e.getPointerCount(); i++) { - if (e.getToolType(i) == MotionEvent.TOOL_TYPE_MOUSE) { //if there's at least one mouse... - mptrIndex = i; //index it - } - } - if (mptrIndex != -1) { - if(CallbackBridge.isGrabbing()) { - return false; - } - //handle mouse events by just sending the coords of the new point in touch event - int x = (int) (e.getX(mptrIndex) * scaleFactor); - int y = (int) (e.getY(mptrIndex) * scaleFactor); + //Looking for a mouse to handle, won't have an effect if no mouse exists. + for (int i = 0; i < e.getPointerCount(); i++) { + if (e.getToolType(i) == MotionEvent.TOOL_TYPE_MOUSE) { + + if(CallbackBridge.isGrabbing()) return false; + int x = (int) (e.getX(i) * scaleFactor); + int y = (int) (e.getY(i) * scaleFactor); CallbackBridge.mouseX = x; CallbackBridge.mouseY = y; CallbackBridge.sendCursorPos(x, y); - return true; // event handled sucessfully - }//if index IS -1, continue handling as an usual touch event + return true; //mouse event handled successfully + } } // System.out.println("Pre touch, isTouchInHotbar=" + Boolean.toString(isTouchInHotbar) + ", action=" + MotionEvent.actionToString(e.getActionMasked())); @@ -357,10 +349,11 @@ public class BaseMainActivity extends LoggableActivity { switch (e.getActionMasked()) { case MotionEvent.ACTION_DOWN: // 0 CallbackBridge.sendPrepareGrabInitialPos(); - + isTouchInHotbar = hudKeyHandled != -1; if (isTouchInHotbar) { sendKeyPress(hudKeyHandled, 0, true); + sendKeyPress(hudKeyHandled, 0, false); hotbarX = (int)e.getX(); hotbarY = (int)e.getY(); @@ -396,9 +389,7 @@ public class BaseMainActivity extends LoggableActivity { } if (CallbackBridge.isGrabbing()) { - if (isTouchInHotbar && Math.abs(hotbarX - mouse_x) < fingerStillThreshold && Math.abs(hotbarY - mouse_y) < fingerStillThreshold) { - sendKeyPress(hudKeyHandled, 0, false); - } else if (!triggeredLeftMouseButton && Math.abs(initialX - mouse_x) < fingerStillThreshold && Math.abs(initialY - mouse_y) < fingerStillThreshold) { + if (!triggeredLeftMouseButton && Math.abs(initialX - mouse_x) < fingerStillThreshold && Math.abs(initialY - mouse_y) < fingerStillThreshold) { if (!LauncherPreferences.PREF_DISABLE_GESTURES) { sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT, true); sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT, false); @@ -422,12 +413,9 @@ public class BaseMainActivity extends LoggableActivity { scrollInitialX = CallbackBridge.mouseX; scrollInitialY = CallbackBridge.mouseY; break; - - case MotionEvent.ACTION_POINTER_UP: // 6 - break; case MotionEvent.ACTION_MOVE: - if (!CallbackBridge.isGrabbing() && e.getPointerCount() == 2 && !LauncherPreferences.PREF_DISABLE_GESTURES) { + if (!CallbackBridge.isGrabbing() && e.getPointerCount() == 2 && !LauncherPreferences.PREF_DISABLE_GESTURES) { //Scrolling feature CallbackBridge.sendScroll(Tools.pxToDp(mouse_x - scrollInitialX)/30 , Tools.pxToDp(mouse_y - scrollInitialY)/30); scrollInitialX = mouse_x; scrollInitialY = mouse_y; @@ -441,6 +429,7 @@ public class BaseMainActivity extends LoggableActivity { } } + //Camera movement if(CallbackBridge.isGrabbing()){ if(e.getPointerId(0) != currentPointerID){ currentPointerID = e.getPointerId(0); @@ -452,8 +441,6 @@ public class BaseMainActivity extends LoggableActivity { prevY = e.getY(); } - - debugText.setText(CallbackBridge.DEBUG_STRING.toString()); CallbackBridge.DEBUG_STRING.setLength(0); From d95112d5ff3f4940006223bf8889e8263abf978f Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Thu, 17 Jun 2021 14:31:32 +0200 Subject: [PATCH 095/179] Simplified GamePad code --- .../pojavlaunch/customcontrols/gamepad/Gamepad.java | 13 ++++--------- .../customcontrols/gamepad/GamepadJoystick.java | 8 +++++--- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java index aa37f16ea..255bbd03b 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java @@ -153,7 +153,6 @@ public class Gamepad { if(lastGrabbingValue != lastGrabbingState){ gameActivity.runOnUiThread(switchStateRunnable); } - } private void createMapping(){ @@ -339,6 +338,7 @@ public class Gamepad { getCurrentMap().THUMBSTICK_RIGHT.update(event); break; + //Start/select case KeyEvent.KEYCODE_BUTTON_START: getCurrentMap().BUTTON_START.update(event); break; @@ -382,14 +382,9 @@ public class Gamepad { } public static boolean isGamepadEvent(InputEvent event){ - if(event instanceof KeyEvent){ - return (event.getSource() & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD; - } - if(event instanceof MotionEvent){ - return GamepadJoystick.isJoystickEvent((MotionEvent) event) || GamepadDpad.isDpadEvent(event); - } - - return false; + return ((event.getSource() & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD + || GamepadJoystick.isJoystickEvent((MotionEvent) event) + || GamepadDpad.isDpadEvent(event)); } } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadJoystick.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadJoystick.java index ae9c87457..8c3cf9738 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadJoystick.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadJoystick.java @@ -27,7 +27,10 @@ public class GamepadJoystick { this.verticalAxis = verticalAxis; this.horizontalAxis = horizontalAxis; - //Some controllers aren't recognized as such by android, so we fallback to a default value of 0.2 + /* + Some controllers aren't recognized as such by android, so we fallback to a default value of 0.2 + And some others don't report their MotionRange. This was the case with the xbox one series S controller. + */ try { deadzone = Math.max(device.getMotionRange(verticalAxis).getFlat(), device.getMotionRange(horizontalAxis).getFlat()) * 1.9f; } catch (NullPointerException e){ deadzone = 0.2f; } @@ -40,8 +43,7 @@ public class GamepadJoystick { if(x == y && x == 0) return 0.00; //atan2 don't like when x and y == 0 - double angle = -Math.atan2(y, x); - return angle; + return -Math.atan2(y, x); } public double getAngle(MotionEvent event){ From 84490ec5a7ef37e0346460a34537c6e5d64f664e Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Thu, 17 Jun 2021 15:49:27 +0200 Subject: [PATCH 096/179] Fix a crash in gamepadEvent detection --- .../kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java index 255bbd03b..1b7e69823 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java @@ -25,6 +25,7 @@ import static net.kdt.pojavlaunch.customcontrols.gamepad.GamepadJoystick.DIRECTI import static net.kdt.pojavlaunch.customcontrols.gamepad.GamepadJoystick.DIRECTION_SOUTH_EAST; import static net.kdt.pojavlaunch.customcontrols.gamepad.GamepadJoystick.DIRECTION_SOUTH_WEST; import static net.kdt.pojavlaunch.customcontrols.gamepad.GamepadJoystick.DIRECTION_WEST; +import static net.kdt.pojavlaunch.customcontrols.gamepad.GamepadJoystick.isJoystickEvent; public class Gamepad { @@ -381,9 +382,12 @@ public class Gamepad { } - public static boolean isGamepadEvent(InputEvent event){ + public static boolean isGamepadEvent(MotionEvent event){ + return isJoystickEvent(event); + } + + public static boolean isGamepadEvent(KeyEvent event){ return ((event.getSource() & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD - || GamepadJoystick.isJoystickEvent((MotionEvent) event) || GamepadDpad.isDpadEvent(event)); } From cbc024c0297bae609f80a4d1ea860970bab70bf3 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Thu, 17 Jun 2021 21:53:18 +0200 Subject: [PATCH 097/179] Simplified onTouch code structure. Added bugs. --- .../net/kdt/pojavlaunch/BaseMainActivity.java | 194 +++++++++--------- 1 file changed, 94 insertions(+), 100 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java index 7d95f93c4..520a0d1b3 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java @@ -281,7 +281,7 @@ public class BaseMainActivity extends LoggableActivity { case MotionEvent.ACTION_MOVE: // 2 - if (!CallbackBridge.isGrabbing() && event.getPointerCount() == 2 && !LauncherPreferences.PREF_DISABLE_GESTURES) { + if (!CallbackBridge.isGrabbing() && event.getPointerCount() == 2 && !LauncherPreferences.PREF_DISABLE_GESTURES) { //Scrolling feature CallbackBridge.sendScroll( Tools.pxToDp(CallbackBridge.mouseX - scrollInitialX)/30, Tools.pxToDp(CallbackBridge.mouseY - scrollInitialY)/30); scrollInitialX = CallbackBridge.mouseX; scrollInitialY = CallbackBridge.mouseY; @@ -312,7 +312,6 @@ public class BaseMainActivity extends LoggableActivity { minecraftGLView.setFocusable(true); glTouchListener = new OnTouchListener(){ private boolean isTouchInHotbar = false; - private int hotbarX, hotbarY; @Override public boolean onTouch(View p1, MotionEvent e) { @@ -338,107 +337,102 @@ public class BaseMainActivity extends LoggableActivity { } int hudKeyHandled = handleGuiBar((int)e.getX(), (int)e.getY()); - if (!CallbackBridge.isGrabbing() && gestureDetector.onTouchEvent(e)) { - if (hudKeyHandled != -1) { - sendKeyPress(hudKeyHandled); - } else { - CallbackBridge.putMouseEventWithCoords(rightOverride ? (byte) 1 : (byte) 0, mouse_x, mouse_y); - if (!rightOverride) CallbackBridge.mouseLeft = true; - } - } else { - switch (e.getActionMasked()) { - case MotionEvent.ACTION_DOWN: // 0 - CallbackBridge.sendPrepareGrabInitialPos(); - - isTouchInHotbar = hudKeyHandled != -1; - if (isTouchInHotbar) { - sendKeyPress(hudKeyHandled, 0, true); - sendKeyPress(hudKeyHandled, 0, false); - hotbarX = (int)e.getX(); - hotbarY = (int)e.getY(); - - theHandler.sendEmptyMessageDelayed(BaseMainActivity.MSG_DROP_ITEM_BUTTON_CHECK, LauncherPreferences.PREF_LONGPRESS_TRIGGER); - break; - } - - currentPointerID = e.getPointerId(0); - CallbackBridge.mouseX = mouse_x; - CallbackBridge.mouseY = mouse_y; - prevX = e.getX(); - prevY = e.getY(); - CallbackBridge.sendCursorPos(mouse_x, mouse_y); - if (!rightOverride) CallbackBridge.mouseLeft = true; - - if (CallbackBridge.isGrabbing()) { - // It cause hold left mouse while moving camera - initialX = mouse_x; - initialY = mouse_y; - theHandler.sendEmptyMessageDelayed(BaseMainActivity.MSG_LEFT_MOUSE_BUTTON_CHECK, LauncherPreferences.PREF_LONGPRESS_TRIGGER); - } - break; - - case MotionEvent.ACTION_UP: // 1 - case MotionEvent.ACTION_CANCEL: // 3 - if (!isTouchInHotbar) { - CallbackBridge.mouseX = mouse_x; - CallbackBridge.mouseY = mouse_y; - - // -TODO uncomment after fix wrong trigger - CallbackBridge.sendCursorPos(mouse_x, mouse_y); - if (!rightOverride) CallbackBridge.mouseLeft = false; - } - - if (CallbackBridge.isGrabbing()) { - if (!triggeredLeftMouseButton && Math.abs(initialX - mouse_x) < fingerStillThreshold && Math.abs(initialY - mouse_y) < fingerStillThreshold) { - if (!LauncherPreferences.PREF_DISABLE_GESTURES) { - sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT, true); - sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT, false); - } - } - if (!isTouchInHotbar) { - if (triggeredLeftMouseButton) { - sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT, false); - } - triggeredLeftMouseButton = false; - theHandler.removeMessages(BaseMainActivity.MSG_LEFT_MOUSE_BUTTON_CHECK); - } else { - sendKeyPress(LWJGLGLFWKeycode.GLFW_KEY_Q, 0, false); - theHandler.removeMessages(MSG_DROP_ITEM_BUTTON_CHECK); - } - } - - break; - - case MotionEvent.ACTION_POINTER_DOWN: // 5 - scrollInitialX = CallbackBridge.mouseX; - scrollInitialY = CallbackBridge.mouseY; - break; - - case MotionEvent.ACTION_MOVE: - if (!CallbackBridge.isGrabbing() && e.getPointerCount() == 2 && !LauncherPreferences.PREF_DISABLE_GESTURES) { //Scrolling feature - CallbackBridge.sendScroll(Tools.pxToDp(mouse_x - scrollInitialX)/30 , Tools.pxToDp(mouse_y - scrollInitialY)/30); - scrollInitialX = mouse_x; - scrollInitialY = mouse_y; - } else if (!isTouchInHotbar) { - CallbackBridge.mouseX = mouse_x; - CallbackBridge.mouseY = mouse_y; - - CallbackBridge.sendCursorPos(mouse_x, mouse_y); - } - break; - } + if (!CallbackBridge.isGrabbing() && gestureDetector.onTouchEvent(e)){ + CallbackBridge.putMouseEventWithCoords(rightOverride ? (byte) 1 : (byte) 0, mouse_x, mouse_y); + if (!rightOverride) CallbackBridge.mouseLeft = true; + return true; } - //Camera movement - if(CallbackBridge.isGrabbing()){ - if(e.getPointerId(0) != currentPointerID){ + switch (e.getActionMasked()) { + case MotionEvent.ACTION_DOWN: // 0 + CallbackBridge.sendPrepareGrabInitialPos(); + currentPointerID = e.getPointerId(0); - }else{ - mouse_x += (int) (e.getX() - prevX) * sensitivityFactor; - mouse_y += (int) (e.getY() - prevY) * sensitivityFactor; - } - prevX = e.getX(); - prevY = e.getY(); + CallbackBridge.mouseX = mouse_x; + CallbackBridge.mouseY = mouse_y; + prevX = e.getX(); + prevY = e.getY(); + + //Compute the touchbar after + // to avoid mouse jumps. + isTouchInHotbar = hudKeyHandled != -1; + if (isTouchInHotbar) { + sendKeyPress(hudKeyHandled); + + theHandler.sendEmptyMessageDelayed(BaseMainActivity.MSG_DROP_ITEM_BUTTON_CHECK, LauncherPreferences.PREF_LONGPRESS_TRIGGER); + CallbackBridge.sendCursorPos(mouse_x, mouse_y); + break; + } + + if (!rightOverride) CallbackBridge.mouseLeft = true; + + if (CallbackBridge.isGrabbing()) { + // It cause hold left mouse while moving camera + initialX = mouse_x; + initialY = mouse_y; + if(!isTouchInHotbar) theHandler.sendEmptyMessageDelayed(BaseMainActivity.MSG_LEFT_MOUSE_BUTTON_CHECK, LauncherPreferences.PREF_LONGPRESS_TRIGGER); + } + break; + + case MotionEvent.ACTION_UP: // 1 + case MotionEvent.ACTION_CANCEL: // 3 + if (!isTouchInHotbar) { + CallbackBridge.mouseX = mouse_x; + CallbackBridge.mouseY = mouse_y; + + // -TODO uncomment after fix wrong trigger + CallbackBridge.sendCursorPos(mouse_x, mouse_y); + if (!rightOverride) CallbackBridge.mouseLeft = false; + } + + if (CallbackBridge.isGrabbing()) { + if (!triggeredLeftMouseButton && Math.abs(initialX - mouse_x) < fingerStillThreshold && Math.abs(initialY - mouse_y) < fingerStillThreshold) { + if (!LauncherPreferences.PREF_DISABLE_GESTURES) { + sendKeyPress(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT); + } + } + if (!isTouchInHotbar) { + if (triggeredLeftMouseButton) sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT, false); + + triggeredLeftMouseButton = false; + theHandler.removeMessages(BaseMainActivity.MSG_LEFT_MOUSE_BUTTON_CHECK); + } else { + sendKeyPress(LWJGLGLFWKeycode.GLFW_KEY_Q, 0, false); + theHandler.removeMessages(MSG_DROP_ITEM_BUTTON_CHECK); + } + } + + break; + + case MotionEvent.ACTION_POINTER_DOWN: // 5 + scrollInitialX = CallbackBridge.mouseX; + scrollInitialY = CallbackBridge.mouseY; + //Checking if we are pressing the hotbar to select the item + hudKeyHandled = handleGuiBar((int)e.getX(e.getPointerCount()-1), (int) e.getY(e.getPointerCount()-1)); + if(hudKeyHandled != -1) sendKeyPress(hudKeyHandled); + break; + + case MotionEvent.ACTION_MOVE: + if (!CallbackBridge.isGrabbing() && e.getPointerCount() == 2 && !LauncherPreferences.PREF_DISABLE_GESTURES) { //Scrolling feature + CallbackBridge.sendScroll(Tools.pxToDp(mouse_x - scrollInitialX)/30 , Tools.pxToDp(mouse_y - scrollInitialY)/30); + scrollInitialX = mouse_x; + scrollInitialY = mouse_y; + } else if (!isTouchInHotbar) { + //Camera movement + if(CallbackBridge.isGrabbing()){ + if(e.getPointerId(0) != currentPointerID){ + currentPointerID = e.getPointerId(0); + }else{ + mouse_x += (int) (e.getX() - prevX) * sensitivityFactor; + mouse_y += (int) (e.getY() - prevY) * sensitivityFactor; + } + prevX = e.getX(); + prevY = e.getY(); + } + + CallbackBridge.sendCursorPos(mouse_x, mouse_y); + } + break; } debugText.setText(CallbackBridge.DEBUG_STRING.toString()); From fc00455a481ecc19f5c42d5a6cfb530b33ecd1f5 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Thu, 17 Jun 2021 22:13:08 +0200 Subject: [PATCH 098/179] Remove two instructions --- .../src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java index 520a0d1b3..cabccafc7 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java @@ -322,8 +322,6 @@ public class BaseMainActivity extends LoggableActivity { if(CallbackBridge.isGrabbing()) return false; int x = (int) (e.getX(i) * scaleFactor); int y = (int) (e.getY(i) * scaleFactor); - CallbackBridge.mouseX = x; - CallbackBridge.mouseY = y; CallbackBridge.sendCursorPos(x, y); return true; //mouse event handled successfully } From 573c7c3483a8058647ec9d1bccd78060178a9240 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Thu, 17 Jun 2021 22:39:35 +0200 Subject: [PATCH 099/179] Fix a missing test --- .../src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java index cabccafc7..5fa20e49b 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java @@ -335,7 +335,7 @@ public class BaseMainActivity extends LoggableActivity { } int hudKeyHandled = handleGuiBar((int)e.getX(), (int)e.getY()); - if (!CallbackBridge.isGrabbing() && gestureDetector.onTouchEvent(e)){ + if (!CallbackBridge.isGrabbing() && gestureDetector.onTouchEvent(e) && hudKeyHandled == -1){ CallbackBridge.putMouseEventWithCoords(rightOverride ? (byte) 1 : (byte) 0, mouse_x, mouse_y); if (!rightOverride) CallbackBridge.mouseLeft = true; return true; From af1f0d678bed108309cc593c032b215efff028b4 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Thu, 17 Jun 2021 22:55:29 +0200 Subject: [PATCH 100/179] Ooops I was sending a mouse click as a keyboard press... --- .../src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java index 5fa20e49b..ed6778891 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java @@ -386,7 +386,8 @@ public class BaseMainActivity extends LoggableActivity { if (CallbackBridge.isGrabbing()) { if (!triggeredLeftMouseButton && Math.abs(initialX - mouse_x) < fingerStillThreshold && Math.abs(initialY - mouse_y) < fingerStillThreshold) { if (!LauncherPreferences.PREF_DISABLE_GESTURES) { - sendKeyPress(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT); + sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT, true); + sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT, false); } } if (!isTouchInHotbar) { From 2d818e8786631c71ef05a160f918ee7febe84a82 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Fri, 18 Jun 2021 19:36:18 +0200 Subject: [PATCH 101/179] Set a lower priority for the mouseGrab thread. --- .../main/java/net/kdt/pojavlaunch/BaseMainActivity.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java index ed6778891..997b3d982 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java @@ -213,7 +213,7 @@ public class BaseMainActivity extends LoggableActivity { this.drawerLayout.closeDrawers(); placeMouseAt(CallbackBridge.physicalWidth / 2, CallbackBridge.physicalHeight / 2); - new Thread(() -> { + Thread virtualMouseGrabThread = new Thread(() -> { while (!isExited) { if (lastGrab != CallbackBridge.isGrabbing()) mousePointer.post(() -> { @@ -230,8 +230,9 @@ public class BaseMainActivity extends LoggableActivity { }); } - }, "VirtualMouseGrabThread").start(); - + }, "VirtualMouseGrabThread"); + virtualMouseGrabThread.setPriority(Thread.MIN_PRIORITY); + virtualMouseGrabThread.start(); if (isAndroid8OrHigher()) { touchPad.setDefaultFocusHighlightEnabled(false); From 876ae5c2852a21cdade85ec5d0c8abc861a690ab Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Fri, 18 Jun 2021 19:36:58 +0200 Subject: [PATCH 102/179] Optimized how many times we use handle GUI bar function. --- .../main/java/net/kdt/pojavlaunch/BaseMainActivity.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java index 997b3d982..f30791bb7 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java @@ -330,13 +330,14 @@ public class BaseMainActivity extends LoggableActivity { // System.out.println("Pre touch, isTouchInHotbar=" + Boolean.toString(isTouchInHotbar) + ", action=" + MotionEvent.actionToString(e.getActionMasked())); + //Getting scaled position from the event if(!CallbackBridge.isGrabbing()) { mouse_x = (int) (e.getX() * scaleFactor); mouse_y = (int) (e.getY() * scaleFactor); } - int hudKeyHandled = handleGuiBar((int)e.getX(), (int)e.getY()); - if (!CallbackBridge.isGrabbing() && gestureDetector.onTouchEvent(e) && hudKeyHandled == -1){ + int hudKeyHandled; + if (!CallbackBridge.isGrabbing() && gestureDetector.onTouchEvent(e)){ CallbackBridge.putMouseEventWithCoords(rightOverride ? (byte) 1 : (byte) 0, mouse_x, mouse_y); if (!rightOverride) CallbackBridge.mouseLeft = true; return true; @@ -352,8 +353,8 @@ public class BaseMainActivity extends LoggableActivity { prevX = e.getX(); prevY = e.getY(); - //Compute the touchbar after - // to avoid mouse jumps. + + hudKeyHandled = handleGuiBar((int)e.getX(), (int) e.getY()); isTouchInHotbar = hudKeyHandled != -1; if (isTouchInHotbar) { sendKeyPress(hudKeyHandled); From 6742d98baf324bd86bbff6d7886d833a8f04f885 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Fri, 18 Jun 2021 20:06:19 +0200 Subject: [PATCH 103/179] Clean up code. --- .../src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java index f30791bb7..a79a2d77e 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java @@ -182,8 +182,7 @@ public class BaseMainActivity extends LoggableActivity { drawerLayout.closeDrawers(); return true; }; - navDrawer.setNavigationItemSelectedListener( - gameActionListener); + navDrawer.setNavigationItemSelectedListener(gameActionListener); this.touchPad = findViewById(R.id.main_touchpad); touchPad.setFocusable(false); @@ -348,8 +347,7 @@ public class BaseMainActivity extends LoggableActivity { CallbackBridge.sendPrepareGrabInitialPos(); currentPointerID = e.getPointerId(0); - CallbackBridge.mouseX = mouse_x; - CallbackBridge.mouseY = mouse_y; + CallbackBridge.sendCursorPos(mouse_x, mouse_y); prevX = e.getX(); prevY = e.getY(); From 8c17dff2d770015f8497ac381b3898768951815c Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Fri, 18 Jun 2021 22:35:35 +0200 Subject: [PATCH 104/179] Removed useless instructions since they are supplented by others in the Motion Event. --- .../src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java index a79a2d77e..2cf2bc171 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java @@ -375,11 +375,7 @@ public class BaseMainActivity extends LoggableActivity { case MotionEvent.ACTION_UP: // 1 case MotionEvent.ACTION_CANCEL: // 3 if (!isTouchInHotbar) { - CallbackBridge.mouseX = mouse_x; - CallbackBridge.mouseY = mouse_y; - // -TODO uncomment after fix wrong trigger - CallbackBridge.sendCursorPos(mouse_x, mouse_y); if (!rightOverride) CallbackBridge.mouseLeft = false; } From 8e2a314c272a7ef70fb38833a00a748b8ea07f35 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Sun, 20 Jun 2021 00:35:17 +0200 Subject: [PATCH 105/179] Clean up unused native functions --- .../java/org/lwjgl/glfw/CallbackBridge.java | 2 - .../src/main/jni/input_bridge_v3.c | 40 ------------------- 2 files changed, 42 deletions(-) diff --git a/app_pojavlauncher/src/main/java/org/lwjgl/glfw/CallbackBridge.java b/app_pojavlauncher/src/main/java/org/lwjgl/glfw/CallbackBridge.java index aed451c70..b050b59da 100644 --- a/app_pojavlauncher/src/main/java/org/lwjgl/glfw/CallbackBridge.java +++ b/app_pojavlauncher/src/main/java/org/lwjgl/glfw/CallbackBridge.java @@ -179,8 +179,6 @@ public class CallbackBridge { private static native void nativeSendScreenSize(int width, int height); public static native boolean nativeIsGrabbing(); - public static native void nativePutControllerAxes(FloatBuffer axBuf); - public static native void nativePutControllerButtons(ByteBuffer axBuf); static { System.loadLibrary("pojavexec"); } diff --git a/app_pojavlauncher/src/main/jni/input_bridge_v3.c b/app_pojavlauncher/src/main/jni/input_bridge_v3.c index 32d12c96a..4c53c5055 100644 --- a/app_pojavlauncher/src/main/jni/input_bridge_v3.c +++ b/app_pojavlauncher/src/main/jni/input_bridge_v3.c @@ -363,43 +363,3 @@ JNIEXPORT void JNICALL Java_org_lwjgl_glfw_CallbackBridge_nativeSendScroll(JNIEn JNIEXPORT void JNICALL Java_org_lwjgl_glfw_GLFW_nglfwSetShowingWindow(JNIEnv* env, jclass clazz, jlong window) { showingWindow = (long) window; } -JNIEXPORT void JNICALL -Java_org_lwjgl_glfw_CallbackBridge_nativePutControllerAxes(JNIEnv *env, jclass clazz, - jobject ax_buf) { - // TODO: implement nativePutControllerAxes() - if(isInputReady) { - jbyte *src = (jbyte *)((*env)->GetDirectBufferAddress(*env,ax_buf)); - jclass glfw_joystick_class = (*runtimeJNIEnvPtr_ANDROID)->FindClass(runtimeJNIEnvPtr_ANDROID,"org/lwjgl/glfw/GLFW"); - if(glfw_joystick_class == NULL) { - __android_log_print(ANDROID_LOG_ERROR,"ControllerPipeNative","GLFW is not attached!"); - return; - } - jfieldID glfw_controller_axis_data = (*runtimeJNIEnvPtr_ANDROID)->GetStaticFieldID(runtimeJNIEnvPtr_ANDROID,glfw_joystick_class,"joystickData", - "Ljava/nio/FloatBuffer;"); - if(glfw_controller_axis_data == NULL) { - __android_log_print(ANDROID_LOG_ERROR,"ControllerPipeNative","Unable to find the field!"); - return; - } - (*runtimeJNIEnvPtr_ANDROID)->SetStaticObjectField(runtimeJNIEnvPtr_ANDROID,glfw_joystick_class,glfw_controller_axis_data,(*runtimeJNIEnvPtr_ANDROID)->NewDirectByteBuffer(runtimeJNIEnvPtr_ANDROID,src,(*env)->GetDirectBufferCapacity(env,ax_buf))); - } -} -JNIEXPORT void JNICALL -Java_org_lwjgl_glfw_CallbackBridge_nativePutControllerButtons(JNIEnv *env, jclass clazz, - jobject ax_buf) { - // TODO: implement nativePutControllerButtons() - if(isInputReady) { - jbyte *src = (jbyte *)((*env)->GetDirectBufferAddress(*env,ax_buf)); - jclass glfw_joystick_class = (*runtimeJNIEnvPtr_ANDROID)->FindClass(runtimeJNIEnvPtr_ANDROID,"org/lwjgl/glfw/GLFW"); - if(glfw_joystick_class == NULL) { - __android_log_print(ANDROID_LOG_ERROR,"ControllerPipeNative","GLFW is not attached!"); - return; - } - jfieldID glfw_controller_button_data = (*runtimeJNIEnvPtr_ANDROID)->GetStaticFieldID(runtimeJNIEnvPtr_ANDROID,glfw_joystick_class,"buttonData", - "Ljava/nio/ByteBuffer;"); - if(glfw_controller_button_data == NULL) { - __android_log_print(ANDROID_LOG_ERROR,"ControllerPipeNative","Unable to find the field!"); - return; - } - (*runtimeJNIEnvPtr_ANDROID)->SetStaticObjectField(runtimeJNIEnvPtr_ANDROID,glfw_joystick_class,glfw_controller_button_data,(*runtimeJNIEnvPtr_ANDROID)->NewDirectByteBuffer(runtimeJNIEnvPtr_ANDROID,src,(*env)->GetDirectBufferCapacity(env,ax_buf))); - } -} From dcd0f5d0d36fe04cfed0123cedf22b38be21d7b6 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Sun, 20 Jun 2021 01:03:40 +0200 Subject: [PATCH 106/179] Slight performance optimization related to DEBUG_STRING --- .../src/main/java/org/lwjgl/glfw/CallbackBridge.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app_pojavlauncher/src/main/java/org/lwjgl/glfw/CallbackBridge.java b/app_pojavlauncher/src/main/java/org/lwjgl/glfw/CallbackBridge.java index b050b59da..8020bab66 100644 --- a/app_pojavlauncher/src/main/java/org/lwjgl/glfw/CallbackBridge.java +++ b/app_pojavlauncher/src/main/java/org/lwjgl/glfw/CallbackBridge.java @@ -49,7 +49,7 @@ public class CallbackBridge { threadAttached = CallbackBridge.nativeAttachThreadToOther(true, BaseMainActivity.isInputStackCall); } - DEBUG_STRING.append("CursorPos=" + x + ", " + y + "\n"); + DEBUG_STRING.append("CursorPos=").append(x).append(", ").append(y).append("\n"); mouseX = x; mouseY = y; nativeSendCursorPos(x, y); @@ -61,7 +61,7 @@ public class CallbackBridge { } public static void sendKeycode(int keycode, char keychar, int scancode, int modifiers, boolean isDown) { - DEBUG_STRING.append("KeyCode=" + keycode + ", Char=" + keychar); + DEBUG_STRING.append("KeyCode=").append(keycode).append(", Char=").append(keychar); // TODO CHECK: This may cause input issue, not receive input! /* if (!nativeSendCharMods((int) keychar, modifiers) || !nativeSendChar(keychar)) { @@ -81,7 +81,7 @@ public class CallbackBridge { } public static void sendMouseKeycode(int button, int modifiers, boolean isDown) { - DEBUG_STRING.append("MouseKey=" + button + ", down=" + isDown + "\n"); + DEBUG_STRING.append("MouseKey=").append(button).append(", down=").append(isDown).append("\n"); // if (isGrabbing()) DEBUG_STRING.append("MouseGrabStrace: " + android.util.Log.getStackTraceString(new Throwable()) + "\n"); nativeSendMouseButton(button, isDown ? 1 : 0, modifiers); } @@ -92,7 +92,7 @@ public class CallbackBridge { } public static void sendScroll(double xoffset, double yoffset) { - DEBUG_STRING.append("ScrollX=" + xoffset + ",ScrollY=" + yoffset); + DEBUG_STRING.append("ScrollX=").append(xoffset).append(",ScrollY=").append(yoffset); nativeSendScroll(xoffset, yoffset); } From 691bf427cc955296362aa70892fe3d24d7de74a1 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Mon, 21 Jun 2021 23:43:36 +0200 Subject: [PATCH 107/179] attempt to reduce memory footprint of the map. --- .../java/net/kdt/pojavlaunch/AndroidLWJGLKeycode.java | 4 ++-- .../main/java/net/kdt/pojavlaunch/LWJGLGLFWKeycode.java | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AndroidLWJGLKeycode.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AndroidLWJGLKeycode.java index 3aada07a5..9b30d29b6 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AndroidLWJGLKeycode.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AndroidLWJGLKeycode.java @@ -12,12 +12,12 @@ import org.lwjgl.glfw.*; public class AndroidLWJGLKeycode { // Fix double letters on MC 1.9 and above public static boolean isBackspaceAfterChar = true; - public static final ArrayMap androidToLwjglMap; + public static final ArrayMap androidToLwjglMap; public static String[] androidKeyNameArray; static { // Mapping Android Keycodes to LWJGL Keycodes - androidToLwjglMap = new ArrayMap(); + androidToLwjglMap = new ArrayMap<>(); // 0-9 keys androidToLwjglMap.put(KeyEvent.KEYCODE_0, LWJGLGLFWKeycode.GLFW_KEY_0); diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/LWJGLGLFWKeycode.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/LWJGLGLFWKeycode.java index 39db81891..5482b01f6 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/LWJGLGLFWKeycode.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/LWJGLGLFWKeycode.java @@ -33,10 +33,10 @@ package net.kdt.pojavlaunch; public class LWJGLGLFWKeycode { /** The unknown key. */ - public static final int GLFW_KEY_UNKNOWN = 0; // should be -1 + public static final short GLFW_KEY_UNKNOWN = 0; // should be -1 /** Printable keys. */ - public static final int + public static final short GLFW_KEY_SPACE = 32, GLFW_KEY_APOSTROPHE = 39, GLFW_KEY_COMMA = 44, @@ -89,7 +89,7 @@ public class LWJGLGLFWKeycode GLFW_KEY_WORLD_2 = 162; /** Function keys. */ - public static final int + public static final short GLFW_KEY_ESCAPE = 256, GLFW_KEY_ENTER = 257, GLFW_KEY_TAB = 258, @@ -182,7 +182,7 @@ public class LWJGLGLFWKeycode /** Mouse buttons. See mouse button input for how these are used. */ - public static final int + public static final short GLFW_MOUSE_BUTTON_1 = 0, GLFW_MOUSE_BUTTON_2 = 1, GLFW_MOUSE_BUTTON_3 = 2, From 14bf84fbe05e89fe9c4da6793041d1c06212bbdd Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Tue, 22 Jun 2021 10:51:49 +0200 Subject: [PATCH 108/179] Slight performance optimization for mouse users. --- .../net/kdt/pojavlaunch/BaseMainActivity.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java index 2cf2bc171..4e213fb0f 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java @@ -465,21 +465,21 @@ public class BaseMainActivity extends LoggableActivity { StringBuilder builder = new StringBuilder(); try { builder.append("PointerCapture debug\n"); - builder.append("MotionEvent=" + e.getActionMasked() + "\n"); - builder.append("PressingBtn=" + MotionEvent.class.getDeclaredMethod("buttonStateToString").invoke(null, e.getButtonState()) + "\n\n"); + builder.append("MotionEvent=").append(e.getActionMasked()).append("\n"); + builder.append("PressingBtn=").append(MotionEvent.class.getDeclaredMethod("buttonStateToString").invoke(null, e.getButtonState())).append("\n\n"); - builder.append("PointerX=" + e.getX() + "\n"); - builder.append("PointerY=" + e.getY() + "\n"); - builder.append("RawX=" + e.getRawX() + "\n"); - builder.append("RawY=" + e.getRawY() + "\n\n"); + builder.append("PointerX=").append(e.getX()).append("\n"); + builder.append("PointerY=").append(e.getY()).append("\n"); + builder.append("RawX=").append(e.getRawX()).append("\n"); + builder.append("RawY=").append(e.getRawY()).append("\n\n"); - builder.append("XPos=" + mouse_x + "\n"); - builder.append("YPos=" + mouse_y + "\n\n"); - builder.append("MovingX=" + getMoving(e.getX(), true) + "\n"); - builder.append("MovingY=" + getMoving(e.getY(), false) + "\n"); + builder.append("XPos=").append(mouse_x).append("\n"); + builder.append("YPos=").append(mouse_y).append("\n\n"); + builder.append("MovingX=").append(getMoving(e.getX(), true)).append("\n"); + builder.append("MovingY=").append(getMoving(e.getY(), false)).append("\n"); } catch (Throwable th) { debugErrored = true; - builder.append("Error getting debug. The debug will be stopped!\n" + Log.getStackTraceString(th)); + builder.append("Error getting debug. The debug will be stopped!\n").append(Log.getStackTraceString(th)); } finally { debugText.setText(builder.toString()); builder.setLength(0); From 003e17a12c34aa99aa6f230752aaaaa31853265b Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Thu, 24 Jun 2021 15:32:31 +0200 Subject: [PATCH 109/179] The mouse is now butter smooth. --- .../net/kdt/pojavlaunch/BaseMainActivity.java | 47 +++++++++---------- .../java/org/lwjgl/glfw/CallbackBridge.java | 8 ++-- 2 files changed, 26 insertions(+), 29 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java index 4e213fb0f..ac5f5b0a5 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java @@ -44,7 +44,7 @@ public class BaseMainActivity extends LoggableActivity { public float scaleFactor = 1; public double sensitivityFactor; private final int fingerStillThreshold = 8; - private int initialX, initialY; + private float initialX, initialY; private int scrollInitialX, scrollInitialY; private float prevX, prevY; private int currentPointerID; @@ -110,7 +110,7 @@ public class BaseMainActivity extends LoggableActivity { private final boolean isExited = false; private boolean isLogAllow = false; - public volatile int mouse_x, mouse_y; + public volatile float mouse_x, mouse_y; // @Override public void onCreate(Bundle savedInstanceState) { @@ -254,8 +254,8 @@ public class BaseMainActivity extends LoggableActivity { float mouseY = mousePointer.getTranslationY(); if (gestureDetector.onTouchEvent(event)) { - mouse_x = (int) (mouseX * scaleFactor); - mouse_y = (int) (mouseY * scaleFactor); + mouse_x = (mouseX * scaleFactor); + mouse_y = (mouseY * scaleFactor); CallbackBridge.sendCursorPos(mouse_x, mouse_y); CallbackBridge.sendMouseKeycode(rightOverride ? LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT : LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT); if (!rightOverride) CallbackBridge.mouseLeft = true; @@ -289,8 +289,8 @@ public class BaseMainActivity extends LoggableActivity { if(currentPointerID == event.getPointerId(0)) { mouseX = Math.max(0, Math.min(displayMetrics.widthPixels, mouseX + (x - prevX) * LauncherPreferences.PREF_MOUSESPEED)); mouseY = Math.max(0, Math.min(displayMetrics.heightPixels, mouseY + (y - prevY) * LauncherPreferences.PREF_MOUSESPEED)); - mouse_x = (int) (mouseX * scaleFactor); - mouse_y = (int) (mouseY * scaleFactor); + mouse_x = (mouseX * scaleFactor); + mouse_y = (mouseY * scaleFactor); placeMouseAt(mouseX, mouseY); CallbackBridge.sendCursorPos(mouse_x, mouse_y); }else currentPointerID = event.getPointerId(0); @@ -320,9 +320,8 @@ public class BaseMainActivity extends LoggableActivity { if (e.getToolType(i) == MotionEvent.TOOL_TYPE_MOUSE) { if(CallbackBridge.isGrabbing()) return false; - int x = (int) (e.getX(i) * scaleFactor); - int y = (int) (e.getY(i) * scaleFactor); - CallbackBridge.sendCursorPos(x, y); + CallbackBridge.sendCursorPos( e.getX(i) * scaleFactor, + e.getY(i) * scaleFactor); return true; //mouse event handled successfully } } @@ -331,13 +330,13 @@ public class BaseMainActivity extends LoggableActivity { //Getting scaled position from the event if(!CallbackBridge.isGrabbing()) { - mouse_x = (int) (e.getX() * scaleFactor); - mouse_y = (int) (e.getY() * scaleFactor); + mouse_x = (e.getX() * scaleFactor); + mouse_y = (e.getY() * scaleFactor); } int hudKeyHandled; if (!CallbackBridge.isGrabbing() && gestureDetector.onTouchEvent(e)){ - CallbackBridge.putMouseEventWithCoords(rightOverride ? (byte) 1 : (byte) 0, mouse_x, mouse_y); + CallbackBridge.putMouseEventWithCoords(rightOverride ? (byte) 1 : (byte) 0, (int)mouse_x, (int)mouse_y); if (!rightOverride) CallbackBridge.mouseLeft = true; return true; } @@ -410,16 +409,16 @@ public class BaseMainActivity extends LoggableActivity { case MotionEvent.ACTION_MOVE: if (!CallbackBridge.isGrabbing() && e.getPointerCount() == 2 && !LauncherPreferences.PREF_DISABLE_GESTURES) { //Scrolling feature CallbackBridge.sendScroll(Tools.pxToDp(mouse_x - scrollInitialX)/30 , Tools.pxToDp(mouse_y - scrollInitialY)/30); - scrollInitialX = mouse_x; - scrollInitialY = mouse_y; + scrollInitialX = (int)mouse_x; + scrollInitialY = (int)mouse_y; } else if (!isTouchInHotbar) { //Camera movement if(CallbackBridge.isGrabbing()){ if(e.getPointerId(0) != currentPointerID){ currentPointerID = e.getPointerId(0); }else{ - mouse_x += (int) (e.getX() - prevX) * sensitivityFactor; - mouse_y += (int) (e.getY() - prevY) * sensitivityFactor; + mouse_x += (e.getX() - prevX) * sensitivityFactor; + mouse_y += (e.getY() - prevY) * sensitivityFactor; } prevX = e.getX(); prevY = e.getY(); @@ -452,11 +451,11 @@ public class BaseMainActivity extends LoggableActivity { @Override public boolean onCapturedPointer (View view, MotionEvent e) { if(e.getHistorySize() > 0) { - mouse_x += (int)(e.getX()*scaleFactor); - mouse_y += (int)(e.getY()*scaleFactor); + mouse_x += (e.getX()*scaleFactor); + mouse_y += (e.getY()*scaleFactor); } - CallbackBridge.mouseX = mouse_x; - CallbackBridge.mouseY = mouse_y; + CallbackBridge.mouseX = (int) mouse_x; + CallbackBridge.mouseY = (int) mouse_y; if(!CallbackBridge.isGrabbing()){ view.releasePointerCapture(); } @@ -586,11 +585,9 @@ public class BaseMainActivity extends LoggableActivity { } switch(ev.getActionMasked()) { case MotionEvent.ACTION_HOVER_MOVE: - mouse_x = (int) (ev.getX(mouseCursorIndex) * scaleFactor); - mouse_y = (int) (ev.getY(mouseCursorIndex) * scaleFactor); - CallbackBridge.mouseX = mouse_x; - CallbackBridge.mouseY = mouse_y; - CallbackBridge.sendCursorPos(mouse_x,mouse_y); + mouse_x = (ev.getX(mouseCursorIndex) * scaleFactor); + mouse_y = (ev.getY(mouseCursorIndex) * scaleFactor); + CallbackBridge.sendCursorPos(mouse_x, mouse_y); debugText.setText(CallbackBridge.DEBUG_STRING.toString()); CallbackBridge.DEBUG_STRING.setLength(0); return true; diff --git a/app_pojavlauncher/src/main/java/org/lwjgl/glfw/CallbackBridge.java b/app_pojavlauncher/src/main/java/org/lwjgl/glfw/CallbackBridge.java index 8020bab66..b474e737d 100644 --- a/app_pojavlauncher/src/main/java/org/lwjgl/glfw/CallbackBridge.java +++ b/app_pojavlauncher/src/main/java/org/lwjgl/glfw/CallbackBridge.java @@ -44,15 +44,15 @@ public class CallbackBridge { } private static boolean threadAttached; - public static void sendCursorPos(int x, int y) { + public static void sendCursorPos(float x, float y) { if (!threadAttached) { threadAttached = CallbackBridge.nativeAttachThreadToOther(true, BaseMainActivity.isInputStackCall); } DEBUG_STRING.append("CursorPos=").append(x).append(", ").append(y).append("\n"); - mouseX = x; - mouseY = y; - nativeSendCursorPos(x, y); + mouseX = (int) x; + mouseY = (int) y; + nativeSendCursorPos(mouseX, mouseY); } public static void sendPrepareGrabInitialPos() { From c743662b37c40cdce50b737f51c5ecbde7b90d58 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Fri, 25 Jun 2021 12:28:02 +0200 Subject: [PATCH 110/179] Simplified the code from GamePad.java --- .../gamepad/GamepadJoystick.java | 59 ++++++++----------- 1 file changed, 26 insertions(+), 33 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadJoystick.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadJoystick.java index 8c3cf9738..6529b9ccb 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadJoystick.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadJoystick.java @@ -3,20 +3,22 @@ package net.kdt.pojavlaunch.customcontrols.gamepad; import android.view.InputDevice; import android.view.MotionEvent; + import com.google.android.material.math.MathUtils; public class GamepadJoystick { //Directions public static final int DIRECTION_NONE = -1; //GamepadJoystick at the center - public static final int DIRECTION_NORTH = 0; - public static final int DIRECTION_NORTH_EAST = 7; - public static final int DIRECTION_EAST = 6; - public static final int DIRECTION_SOUTH_EAST = 5; - public static final int DIRECTION_SOUTH = 4; - public static final int DIRECTION_SOUTH_WEST = 3; - public static final int DIRECTION_WEST = 2; - public static final int DIRECTION_NORTH_WEST = 1; + + public static final int DIRECTION_EAST = 0; + public static final int DIRECTION_NORTH_EAST = 1; + public static final int DIRECTION_NORTH = 2; + public static final int DIRECTION_NORTH_WEST = 3; + public static final int DIRECTION_WEST = 4; + public static final int DIRECTION_SOUTH_WEST = 5; + public static final int DIRECTION_SOUTH = 6; + public static final int DIRECTION_SOUTH_EAST = 7; private float deadzone; @@ -27,10 +29,9 @@ public class GamepadJoystick { this.verticalAxis = verticalAxis; this.horizontalAxis = horizontalAxis; - /* - Some controllers aren't recognized as such by android, so we fallback to a default value of 0.2 - And some others don't report their MotionRange. This was the case with the xbox one series S controller. - */ + //Some controllers aren't recognized as such by android, so we fallback to a default value of 0.2 + //And some others don't report their MotionRange. This was the case with the xbox one series S controller. + try { deadzone = Math.max(device.getMotionRange(verticalAxis).getFlat(), device.getMotionRange(horizontalAxis).getFlat()) * 1.9f; } catch (NullPointerException e){ deadzone = 0.2f; } @@ -38,21 +39,17 @@ public class GamepadJoystick { } public double getAngleRadian(MotionEvent event){ - float x = getHorizontalAxis(event); - float y = getVerticalAxis(event); - if(x == y && x == 0) - return 0.00; //atan2 don't like when x and y == 0 - - return -Math.atan2(y, x); + //From -PI to PI + return -Math.atan2(getVerticalAxis(event), getHorizontalAxis(event)); } - public double getAngle(MotionEvent event){ - float x = getHorizontalAxis(event); - float y = getVerticalAxis(event); - if(x == y && x == 0) - return 0.00; //atan2 don't like when x and y == 0 - return 180+(Math.atan2(x, y)*57); + public double getAngleDegree(MotionEvent event){ + //From 0 to 360 degrees + double result = Math.toDegrees(getAngleRadian(event)); + if(result < 0) result += 360; + + return result; } public double getMagnitude(MotionEvent event){ @@ -71,17 +68,13 @@ public class GamepadJoystick { } private float applyDeadzone(MotionEvent event, int axis){ - /* - This piece of code also modifies the value - to make it seem like there was no deadzone in the first place - */ + //This piece of code also modifies the value + //to make it seem like there was no deadzone in the first place double magnitude = getMagnitude(event); - if (magnitude < deadzone){ - return 0; - } + if (magnitude < deadzone) return 0; - return (float) ((event.getAxisValue(axis) / magnitude) * ((magnitude - deadzone) / (1 - deadzone))); + return (float) ( (event.getAxisValue(axis) / magnitude) * ((magnitude - deadzone) / (1 - deadzone)) ); } public static boolean isJoystickEvent(MotionEvent event){ @@ -92,7 +85,7 @@ public class GamepadJoystick { public int getHeightDirection(MotionEvent event){ if(getMagnitude(event) <= deadzone) return DIRECTION_NONE; - return ((int) ((getAngle(event)+22.5)/45)) % 8; + return ((int) ((getAngleDegree(event)+22.5)/45)) % 8; } From e6d8475a64cf748fb99e674766401779e751acf9 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Fri, 25 Jun 2021 14:58:32 +0200 Subject: [PATCH 111/179] Tweak how the Gamepad Thread sleeps/its priority. --- .../kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java index 1b7e69823..f32969ac2 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java @@ -88,11 +88,15 @@ public class Gamepad { tick(); delta--; + + try { - sleep(Math.max((long) ((1 - delta)/ticks), 0)); + sleep(Math.max((long) ( (1 - delta) * (1000/ticks) ), 0)); + } catch (InterruptedException e) { e.printStackTrace(); } + } } } @@ -121,7 +125,7 @@ public class Gamepad { } }; - mouseThread.setPriority(1); + mouseThread.setPriority(Thread.MAX_PRIORITY); mouseThread.start(); From 6f100d67224436977c73d018023993ba95efb7c5 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Mon, 28 Jun 2021 12:04:18 +0200 Subject: [PATCH 112/179] Fix slider performance degradation when editing controls --- .../src/main/res/layout/control_button_setting.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app_pojavlauncher/src/main/res/layout/control_button_setting.xml b/app_pojavlauncher/src/main/res/layout/control_button_setting.xml index 44ab629fb..1f15d51c5 100644 --- a/app_pojavlauncher/src/main/res/layout/control_button_setting.xml +++ b/app_pojavlauncher/src/main/res/layout/control_button_setting.xml @@ -282,7 +282,7 @@ Date: Wed, 30 Jun 2021 21:26:17 +0200 Subject: [PATCH 113/179] Add isSwipeable boolean. --- .../java/net/kdt/pojavlaunch/customcontrols/ControlData.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java index 2e281bc22..b895c0373 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java @@ -77,6 +77,7 @@ public class ControlData implements Cloneable public int strokeColor; public int strokeWidth; //0-100% public float cornerRadius; //0-100% + public boolean isSwipeable; public boolean holdCtrl; public boolean holdAlt; From 01a710485c8cc7f1d5ce285fa1cf2fbd1393e81b Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Wed, 30 Jun 2021 21:27:10 +0200 Subject: [PATCH 114/179] Cleanup of buttons --- .../customcontrols/ControlLayout.java | 127 +++++++++------ .../customcontrols/buttons/ControlButton.java | 154 +++++++++++------- .../customcontrols/buttons/ControlDrawer.java | 45 ++--- .../buttons/ControlSubButton.java | 7 +- 4 files changed, 208 insertions(+), 125 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java index b6965bdc9..94175dfa5 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java @@ -31,11 +31,8 @@ public class ControlLayout extends FrameLayout } public void hideAllHandleViews() { - for (int i = 0; i < getChildCount(); i++) { - View view = getChildAt(i); - if (view instanceof ControlButton) { - ((ControlButton) view).getHandleView().hide(); - } + for(ControlButton button : getButtonChildren()){ + button.getHandleView().hide(); } } @@ -44,9 +41,9 @@ public class ControlLayout extends FrameLayout } public void loadLayout(CustomControls controlLayout) { - if (mModifiable) { + if (mModifiable) hideAllHandleViews(); - } + removeAllButtons(); if(mLayout != null) { mLayout.mControlDataList = null; @@ -174,17 +171,10 @@ public class ControlLayout extends FrameLayout } private void removeAllButtons() { - List viewList = new ArrayList<>(); - View v; - for(int i = 0; i < getChildCount(); i++) { - v = getChildAt(i); - if(v instanceof ControlButton) viewList.add(v); + for(View v : getButtonChildren()){ + removeView(v); } - v = null; - for(View v2 : viewList) { - removeView(v2); - } - viewList = null; + System.gc(); //i wanna be sure that all the removed Views will be removed after a reload //because if frames will slowly go down after many control changes it will be warm and bad @@ -232,38 +222,17 @@ public class ControlLayout extends FrameLayout if (mModifiable) return; // Not using on custom controls activity mControlVisible = isVisible; - int visibilityState = isVisible ? View.VISIBLE : View.GONE; - - for (int i = 0; i < getChildCount(); i++) { - View view = getChildAt(i); - - if(view instanceof ControlSubButton){ - view.setVisibility(isVisible ? (((ControlSubButton)view).parentDrawer.areButtonsVisible ? VISIBLE : GONE) : View.GONE); - continue; - } - - if(view instanceof ControlDrawer){ - view.setVisibility(visibilityState); - continue; - } - - if (view instanceof ControlButton && ((ControlButton) view).getProperties().isHideable) { - view.setVisibility(visibilityState); - } + for(ControlButton button : getButtonChildren()){ + button.setVisible(isVisible); } } - public void setModifiable(boolean z) { - mModifiable = z; - for (int i = 0; i < getChildCount(); i++) { - View v = getChildAt(i); - if (v instanceof ControlButton) { - ControlButton cv = ((ControlButton) v); - cv.setModifiable(z); - if (!z) { - cv.setAlpha(cv.getProperties().opacity); - } - } + public void setModifiable(boolean isModifiable) { + mModifiable = isModifiable; + for(ControlButton button : getButtonChildren()){ + button.setModifiable(isModifiable); + if (!isModifiable) + button.setAlpha(button.getProperties().opacity); } } @@ -273,5 +242,71 @@ public class ControlLayout extends FrameLayout public void setModified(boolean isModified) { if (mActivity != null) mActivity.isModified = isModified; + + } + + private ArrayList getButtonChildren(){ + ArrayList children = new ArrayList<>(); + for(int i=0; i children = getButtonChildren(); + + Log.d("getX LAYOUT_CONTROL", String.valueOf(ev.getX())); + Log.d("getY LAYOUT_CONTROL", String.valueOf(ev.getY())); + Log.d("getRawX LAYOUT_CONTROL", String.valueOf(ev.getRawX())); + Log.d("getRawY LAYOUT_CONTROL", String.valueOf(ev.getRawY())); + if(lastControlButton != null){ + if( ev.getRawX() > lastControlButton.getX() && ev.getRawX() < lastControlButton.getX() + lastControlButton.getWidth() && + ev.getRawY() > lastControlButton.getY() && ev.getRawY() < lastControlButton.getY() + lastControlButton.getHeight()){ + return true; + } + } + + for(ControlButton button : children){ + /* + Log.d("Left: LAYOUT_CONTROL", String.valueOf(button.getLeft())); + Log.d("TOP: LAYOUT_CONTROL", String.valueOf(button.getTop())); + Log.d("RIGHT: LAYOUT_CONTROL", String.valueOf(button.getRight())); + Log.d("BOTTOM: LAYOUT_CONTROL", String.valueOf(button.getBottom())); + + */ + + if( ev.getRawX() > button.getX() && ev.getRawX() < button.getX() + button.getWidth() && + ev.getRawY() > button.getY() && ev.getRawY() < button.getY() + button.getHeight()){ + System.out.println("FOUND ONE !"); + //Button hovered; + if(!button.equals(lastControlButton)){ + ev.setAction(MotionEvent.ACTION_POINTER_UP); + if (lastControlButton != null) lastControlButton.onTouchEvent(ev); + + ev.setAction(MotionEvent.ACTION_POINTER_DOWN); + button.onTouchEvent(ev); + + lastControlButton = button; + } + return true; + } + } + return false; + //We actually could go through all our children here. + //This isn't the most performance friendly stuff though. + //return true; } } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java index b9f5890ed..b7b38db60 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java @@ -1,9 +1,7 @@ package net.kdt.pojavlaunch.customcontrols.buttons; -import android.content.*; import android.graphics.*; import android.graphics.drawable.GradientDrawable; -import android.graphics.drawable.ShapeDrawable; import android.util.*; import android.view.*; import android.view.View.*; @@ -12,7 +10,6 @@ import android.widget.*; import net.kdt.pojavlaunch.customcontrols.ControlData; import net.kdt.pojavlaunch.customcontrols.ControlLayout; import net.kdt.pojavlaunch.customcontrols.handleview.*; -import net.kdt.pojavlaunch.prefs.LauncherPreferences; import net.kdt.pojavlaunch.*; import org.lwjgl.glfw.*; @@ -27,7 +24,8 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp protected boolean mModifiable = false; protected boolean mCanTriggerLongClick = true; - protected boolean mChecked = false; + protected boolean isToggled = false; + protected boolean isPointerOutOfBounds = false; public ControlButton(ControlLayout layout, ControlData properties) { super(layout.getContext()); @@ -70,6 +68,7 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp // com.android.internal.R.string.delete // android.R.string. setText(properties.name); + if (changePos) { setTranslationX(moveX = properties.x); setTranslationY(moveY = properties.y); @@ -101,14 +100,37 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp setBackground(gd); } - public int computeStrokeWidth(float widthInPercent){ - float maxSize = Math.max(mProperties.getWidth(), mProperties.getHeight()); - return (int)((maxSize/2) * (widthInPercent/100)); + public void setModifiable(boolean isModifiable) { + mModifiable = isModifiable; } - public float computeCornerRadius(float radiusInPercent){ - float minSize = Math.min(mProperties.getWidth(), mProperties.getHeight()); - return (minSize/2) * (radiusInPercent/100); + private void setModified(boolean modified) { + if (getParent() != null) + ((ControlLayout) getParent()).setModified(modified); + } + + private void setHolding(boolean isDown) { + if (mProperties.holdAlt) { + CallbackBridge.holdingAlt = isDown; + MainActivity.sendKeyPress(LWJGLGLFWKeycode.GLFW_KEY_LEFT_ALT,0,isDown); + System.out.println("holdingAlt="+CallbackBridge.holdingAlt); + } if (mProperties.keycodes[0] == LWJGLGLFWKeycode.GLFW_KEY_CAPS_LOCK) { + CallbackBridge.holdingCapslock = isDown; + //MainActivity.sendKeyPress(LWJGLGLFWKeycode.GLFW_KEY_CAPS_LOCK,0,isDown); + System.out.println("holdingCapslock="+CallbackBridge.holdingCapslock); + } if (mProperties.holdCtrl) { + CallbackBridge.holdingCtrl = isDown; + MainActivity.sendKeyPress(LWJGLGLFWKeycode.GLFW_KEY_LEFT_CONTROL,0,isDown); + System.out.println("holdingCtrl="+CallbackBridge.holdingCtrl); + } if (mProperties.keycodes[0] == LWJGLGLFWKeycode.GLFW_KEY_NUM_LOCK) { + CallbackBridge.holdingNumlock = isDown; + //MainActivity.sendKeyPress(LWJGLGLFWKeycode.GLFW_KEY_NUM_LOCK,0,isDown); + System.out.println("holdingNumlock="+CallbackBridge.holdingNumlock); + } if (mProperties.holdShift) { + CallbackBridge.holdingShift = isDown; + MainActivity.sendKeyPress(LWJGLGLFWKeycode.GLFW_KEY_LEFT_SHIFT,0,isDown); + System.out.println("holdingShift="+CallbackBridge.holdingShift); + } } @Override @@ -128,13 +150,18 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp setModified(true); } + public void setVisible(boolean isVisible){ + if(mProperties.isHideable) + setVisibility(isVisible ? VISIBLE : GONE); + } + @Override public void setTranslationX(float x) { super.setTranslationX(x); if (!mProperties.isDynamicBtn) { mProperties.x = x; - mProperties.dynamicX = Float.toString(x / CallbackBridge.physicalWidth) + " * ${screen_width}"; + mProperties.dynamicX = x / CallbackBridge.physicalWidth + " * ${screen_width}"; setModified(true); } } @@ -145,7 +172,7 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp if (!mProperties.isDynamicBtn) { mProperties.y = y; - mProperties.dynamicY = Float.toString(y / CallbackBridge.physicalHeight) + " * ${screen_height}"; + mProperties.dynamicY = y / CallbackBridge.physicalHeight + " * ${screen_height}"; setModified(true); } } @@ -157,7 +184,7 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); - if (mChecked) { + if (isToggled) { canvas.drawRoundRect(0, 0, getWidth(), getHeight(), mProperties.cornerRadius, mProperties.cornerRadius, mRectPaint); } } @@ -183,35 +210,11 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp return mCanTriggerLongClick; } - - private void setHolding(boolean isDown) { - if (mProperties.holdAlt) { - CallbackBridge.holdingAlt = isDown; - MainActivity.sendKeyPress(LWJGLGLFWKeycode.GLFW_KEY_LEFT_ALT,0,isDown); - System.out.println("holdingAlt="+CallbackBridge.holdingAlt); - } if (mProperties.keycodes[0] == LWJGLGLFWKeycode.GLFW_KEY_CAPS_LOCK) { - CallbackBridge.holdingCapslock = isDown; - //MainActivity.sendKeyPress(LWJGLGLFWKeycode.GLFW_KEY_CAPS_LOCK,0,isDown); - System.out.println("holdingCapslock="+CallbackBridge.holdingCapslock); - } if (mProperties.holdCtrl) { - CallbackBridge.holdingCtrl = isDown; - MainActivity.sendKeyPress(LWJGLGLFWKeycode.GLFW_KEY_LEFT_CONTROL,0,isDown); - System.out.println("holdingCtrl="+CallbackBridge.holdingCtrl); - } if (mProperties.keycodes[0] == LWJGLGLFWKeycode.GLFW_KEY_NUM_LOCK) { - CallbackBridge.holdingNumlock = isDown; - //MainActivity.sendKeyPress(LWJGLGLFWKeycode.GLFW_KEY_NUM_LOCK,0,isDown); - System.out.println("holdingNumlock="+CallbackBridge.holdingNumlock); - } if (mProperties.holdShift) { - CallbackBridge.holdingShift = isDown; - MainActivity.sendKeyPress(LWJGLGLFWKeycode.GLFW_KEY_LEFT_SHIFT,0,isDown); - System.out.println("holdingShift="+CallbackBridge.holdingShift); - } - } - protected float moveX, moveY; protected float downX, downY; @Override public boolean onTouchEvent(MotionEvent event) { + System.out.println("IS BEING TOUCHED"); if (!mModifiable) { mCanTriggerLongClick = false; if (event.getAction() == MotionEvent.ACTION_MOVE && CallbackBridge.isGrabbing() && mProperties.passThruEnabled) { @@ -223,6 +226,35 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp } switch (event.getActionMasked()) { + + case MotionEvent.ACTION_MOVE: + //If out of bounds + if(event.getX() < getLeft() || event.getX() > getRight() || + event.getY() < getTop() || event.getY() > getBottom()){ + if(mProperties.isSwipeable && !isPointerOutOfBounds){ + //Remove keys + if(!triggerToggle(event)) { + setHolding(false); + sendKeyPresses(event, false); + } + } + isPointerOutOfBounds = true; + ((ControlLayout) getParent()).onTouchEvent(event); + break; + } + + //Else if we now are in bounds + if(isPointerOutOfBounds) { + ((ControlLayout) getParent()).onTouchEvent(event); + //RE-press the button + if(mProperties.isSwipeable && !mProperties.isToggle){ + setHolding(true); + sendKeyPresses(event, true); + } + } + isPointerOutOfBounds = false; + break; + case MotionEvent.ACTION_DOWN: // 0 case MotionEvent.ACTION_POINTER_DOWN: // 5 if(!mProperties.isToggle){ @@ -233,16 +265,15 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp case MotionEvent.ACTION_UP: // 1 case MotionEvent.ACTION_CANCEL: // 3 case MotionEvent.ACTION_POINTER_UP: // 6 - if(mProperties.isToggle){ - mChecked = !mChecked; - invalidate(); - setHolding(mChecked); - sendKeyPresses(event, mChecked); - break; + if(isPointerOutOfBounds) ((ControlLayout) getParent()).onTouchEvent(event); + isPointerOutOfBounds = false; + + if(!triggerToggle(event)) { + setHolding(false); + sendKeyPresses(event, false); } - setHolding(false); - sendKeyPresses(event,false); break; + default: return false; } @@ -278,6 +309,28 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp return super.onTouchEvent(event); } + public int computeStrokeWidth(float widthInPercent){ + float maxSize = Math.max(mProperties.getWidth(), mProperties.getHeight()); + return (int)((maxSize/2) * (widthInPercent/100)); + } + + public float computeCornerRadius(float radiusInPercent){ + float minSize = Math.min(mProperties.getWidth(), mProperties.getHeight()); + return (minSize/2) * (radiusInPercent/100); + } + + public boolean triggerToggle(MotionEvent event){ + //returns true a the toggle system is triggered + if(mProperties.isToggle){ + isToggled = !isToggled; + invalidate(); + setHolding(isToggled); + sendKeyPresses(event, isToggled); + return true; + } + return false; + } + public void sendKeyPresses(MotionEvent event, boolean isDown){ for(int keycode : mProperties.keycodes){ if(keycode >= 0){ @@ -288,13 +341,4 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp } } - public void setModifiable(boolean isModifiable) { - mModifiable = isModifiable; - } - - private void setModified(boolean modified) { - if (getParent() != null) { - ((ControlLayout) getParent()).setModified(modified); - } - } } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlDrawer.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlDrawer.java index 6b341c33c..685284bbc 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlDrawer.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlDrawer.java @@ -59,36 +59,16 @@ public class ControlDrawer extends ControlButton { } private void setControlButtonVisibility(ControlButton button, boolean isVisible){ - button.setVisibility(isVisible ? VISIBLE : GONE); + button.setVisible(isVisible); } private void switchButtonVisibility(){ areButtonsVisible = !areButtonsVisible; - int visibility = areButtonsVisible ? View.VISIBLE : View.GONE; for(ControlButton button : buttons){ - button.setVisibility(visibility); + button.setVisible(areButtonsVisible); } } - - @Override - public boolean onTouchEvent(MotionEvent event) { - if(!mModifiable){ - switch (event.getActionMasked()){ - case MotionEvent.ACTION_UP: // 1 - case MotionEvent.ACTION_POINTER_UP: // 6 - switchButtonVisibility(); - break; - } - - return true; - } - - boolean isHandled = super.onTouchEvent(event); - //syncButtons(); - return isHandled; - } - //Syncing stuff private void alignButtons(){ @@ -135,6 +115,27 @@ public class ControlDrawer extends ControlButton { resizeButtons(); } + @Override + public void setVisible(boolean isVisible) { + //TODO replicate changes to his children ? + setVisibility(isVisible ? VISIBLE : GONE); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + if(!mModifiable){ + switch (event.getActionMasked()){ + case MotionEvent.ACTION_UP: // 1 + case MotionEvent.ACTION_POINTER_UP: // 6 + switchButtonVisibility(); + break; + } + return true; + } + + return super.onTouchEvent(event); + } + @Override public void setTranslationX(float x) { super.setTranslationX(x); diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlSubButton.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlSubButton.java index ce43c5881..b15f1327e 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlSubButton.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlSubButton.java @@ -2,6 +2,7 @@ package net.kdt.pojavlaunch.customcontrols.buttons; import android.os.Handler; import android.os.Looper; +import android.view.View; import android.view.ViewGroup; import net.kdt.pojavlaunch.customcontrols.ControlData; @@ -30,8 +31,10 @@ public class ControlSubButton extends ControlButton { setProperties(mProperties, false); } - - + @Override + public void setVisible(boolean isVisible) { + setVisibility(isVisible ? (parentDrawer.areButtonsVisible ? VISIBLE : GONE) : View.GONE); + } @Override public void setLayoutParams(ViewGroup.LayoutParams params) { From 635b41648c502e299a37c24927242108fffa572e Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Wed, 30 Jun 2021 22:53:42 +0200 Subject: [PATCH 115/179] Clean up ControlData --- .../customcontrols/ControlData.java | 27 +++++++------------ 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java index b895c0373..85bb61a17 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java @@ -37,7 +37,7 @@ public class ControlData implements Cloneable public static ControlData[] getSpecialButtons(){ if (SPECIAL_BUTTONS == null) { - ControlData[] specialButtons = new ControlData[]{ + SPECIAL_BUTTONS = new ControlData[]{ new ControlData("Keyboard", new int[]{SPECIALBTN_KEYBOARD}, "${margin} * 3 + ${width} * 2", "${margin}", false), new ControlData("GUI", new int[]{SPECIALBTN_TOGGLECTRL}, "${margin}", "${bottom} - ${margin}"), new ControlData("PRI", new int[]{SPECIALBTN_MOUSEPRI}, "${margin}", "${screen_height} - ${margin} * 3 - ${height} * 3"), @@ -48,7 +48,6 @@ public class ControlData implements Cloneable new ControlData("SCROLLUP", new int[]{SPECIALBTN_SCROLLUP}, "${margin}", "${margin}"), new ControlData("SCROLLDOWN", new int[]{SPECIALBTN_SCROLLDOWN}, "${margin}", "${margin}") }; - SPECIAL_BUTTONS = specialButtons; } return SPECIAL_BUTTONS; @@ -146,18 +145,15 @@ public class ControlData implements Cloneable update(); } - public void execute(BaseMainActivity act, boolean isDown) { + public void execute(boolean isDown) { for(int keycode : keycodes){ - act.sendKeyPress(keycode, 0, isDown); + BaseMainActivity.sendKeyPress(keycode, 0, isDown); } } + public ControlData clone() { - if (this instanceof ControlData) { - return new ControlData(name, keycodes, ((ControlData) this).dynamicX, ((ControlData) this).dynamicY, width, height, isToggle, opacity, bgColor, strokeColor,strokeWidth, cornerRadius); - } else { - return new ControlData(name, keycodes, x, y, width, height); - } + return new ControlData(name, keycodes, dynamicX, dynamicY, width, height, isToggle, opacity, bgColor, strokeColor,strokeWidth, cornerRadius); } public float insertDynamicPos(String dynamicPos) { @@ -181,15 +177,12 @@ public class ControlData implements Cloneable } public void update() { - if(SPECIAL_BUTTONS != null){ - for(int keycode : keycodes){ - for (ControlData data : getSpecialButtons()) { - if (keycode == data.keycodes[0]) { + if(SPECIAL_BUTTONS != null) + for(int keycode : keycodes) + for (ControlData data : getSpecialButtons()) + if (keycode == data.keycodes[0]) specialButtonListener = data.specialButtonListener; - } - } - } - } + if (dynamicX == null) { dynamicX = Float.toString(x); From 0479e13f6e0b61fee75bbc87ebc8aebf5d5b03e2 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Wed, 30 Jun 2021 22:54:15 +0200 Subject: [PATCH 116/179] ControlData can check its keycodes --- .../net/kdt/pojavlaunch/customcontrols/ControlData.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java index 85bb61a17..74dc679a4 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java @@ -212,6 +212,14 @@ public class ControlData implements Cloneable } + public boolean containsKeycode(int keycodeToCheck){ + for(int keycode : keycodes) + if(keycodeToCheck == keycode) + return true; + + return false; + } + //Getters || setters (with conversion for ease of use) public float getWidth() { return Tools.dpToPx(width); From fed34eedf944fbfad33dfc49b700884b0437ef19 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Wed, 30 Jun 2021 22:55:47 +0200 Subject: [PATCH 117/179] Make use of the OOP to clean up ControlLayout. --- .../customcontrols/ControlLayout.java | 33 +++---------------- .../customcontrols/buttons/ControlButton.java | 31 +++++++++++++++-- .../customcontrols/buttons/ControlDrawer.java | 9 +++++ 3 files changed, 42 insertions(+), 31 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java index 94175dfa5..d93ede3cb 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java @@ -59,47 +59,20 @@ public class ControlLayout extends FrameLayout //CONTROL BUTTON for (ControlData button : controlLayout.mControlDataList) { - button.isHideable = button.keycodes[0] != ControlData.SPECIALBTN_TOGGLECTRL && button.keycodes[0] != ControlData.SPECIALBTN_VIRTUALMOUSE; - button.setWidth(button.getWidth() / controlLayout.scaledAt * LauncherPreferences.PREF_BUTTONSIZE); - button.setHeight(button.getHeight() / controlLayout.scaledAt * LauncherPreferences.PREF_BUTTONSIZE); - if (!button.isDynamicBtn) { - button.dynamicX = button.x / CallbackBridge.physicalWidth + " * ${screen_width}"; - button.dynamicY = button.y / CallbackBridge.physicalHeight + " * ${screen_height}"; - } - button.update(); addControlView(button); } //CONTROL DRAWER for(ControlDrawerData drawerData : controlLayout.mDrawerDataList){ - drawerData.properties.isHideable = true; - drawerData.properties.setWidth(drawerData.properties.getWidth() / controlLayout.scaledAt * LauncherPreferences.PREF_BUTTONSIZE); - drawerData.properties.setHeight(drawerData.properties.getHeight() / controlLayout.scaledAt * LauncherPreferences.PREF_BUTTONSIZE); - if (!drawerData.properties.isDynamicBtn) { - drawerData.properties.dynamicX = drawerData.properties.x / CallbackBridge.physicalWidth + " * ${screen_width}"; - drawerData.properties.dynamicY = drawerData.properties.y / CallbackBridge.physicalHeight + " * ${screen_height}"; - } - ControlDrawer drawer = addDrawerView(drawerData); + if(mModifiable) drawer.areButtonsVisible = true; //CONTROL SUB BUTTON for (ControlData subButton : drawerData.buttonProperties){ - subButton.isHideable = subButton.keycodes[0] != ControlData.SPECIALBTN_TOGGLECTRL && subButton.keycodes[0] != ControlData.SPECIALBTN_VIRTUALMOUSE; - subButton.setWidth(subButton.getWidth() / controlLayout.scaledAt * LauncherPreferences.PREF_BUTTONSIZE); - subButton.setHeight(subButton.getHeight() / controlLayout.scaledAt * LauncherPreferences.PREF_BUTTONSIZE); - if (!subButton.isDynamicBtn) { - subButton.dynamicX = subButton.x / CallbackBridge.physicalWidth + " * ${screen_width}"; - subButton.dynamicY = subButton.y / CallbackBridge.physicalHeight + " * ${screen_height}"; - } - subButton.update(); addSubView(drawer, subButton); } - - - } - mLayout.scaledAt = LauncherPreferences.PREF_BUTTONSIZE; setModified(false); @@ -218,6 +191,10 @@ public class ControlLayout extends FrameLayout setControlVisible(mControlVisible); } + public float getLayoutScale(){ + return mLayout.scaledAt; + } + public void setControlVisible(boolean isVisible) { if (mModifiable) return; // Not using on custom controls activity diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java index b7b38db60..e1277b695 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java @@ -1,5 +1,6 @@ package net.kdt.pojavlaunch.customcontrols.buttons; +import android.annotation.SuppressLint; import android.graphics.*; import android.graphics.drawable.GradientDrawable; import android.util.*; @@ -11,8 +12,11 @@ import net.kdt.pojavlaunch.customcontrols.ControlData; import net.kdt.pojavlaunch.customcontrols.ControlLayout; import net.kdt.pojavlaunch.customcontrols.handleview.*; import net.kdt.pojavlaunch.*; +import net.kdt.pojavlaunch.prefs.LauncherPreferences; + import org.lwjgl.glfw.*; +@SuppressLint("ViewConstructor") public class ControlButton extends androidx.appcompat.widget.AppCompatButton implements OnLongClickListener { private Paint mRectPaint; @@ -34,15 +38,18 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp mGestureDetector = new GestureDetector(getContext(), new SingleTapConfirm()); setOnLongClickListener(this); + //When a button is created, the width/height has yet to be processed to fit the scaling. - setProperties(properties); + setProperties(preProcessProperties(properties, layout)); setModified(false); mHandleView = new SelectionEndHandleView(this); - + + + //For the toggle layer final TypedValue value = new TypedValue(); getContext().getTheme().resolveAttribute(R.attr.colorAccent, value, true); - + mRectPaint = new Paint(); mRectPaint.setColor(value.data); mRectPaint.setAlpha(128); @@ -60,6 +67,24 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp setProperties(properties, true); } + public ControlData preProcessProperties(ControlData properties, ControlLayout layout){ + //Size + properties.setWidth(properties.getWidth() / layout.getLayoutScale() * LauncherPreferences.PREF_BUTTONSIZE); + properties.setHeight(properties.getHeight() / layout.getLayoutScale() * LauncherPreferences.PREF_BUTTONSIZE); + + //Visibility + properties.isHideable = properties.keycodes[0] != ControlData.SPECIALBTN_TOGGLECTRL && properties.keycodes[0] != ControlData.SPECIALBTN_VIRTUALMOUSE; + + //Position + if (!properties.isDynamicBtn) { + properties.dynamicX = properties.x / CallbackBridge.physicalWidth + " * ${screen_width}"; + properties.dynamicY = properties.y / CallbackBridge.physicalHeight + " * ${screen_height}"; + } + + properties.update(); + return properties; + } + public void setProperties(ControlData properties, boolean changePos) { mProperties = properties; diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlDrawer.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlDrawer.java index 685284bbc..187ca94bd 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlDrawer.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlDrawer.java @@ -1,5 +1,6 @@ package net.kdt.pojavlaunch.customcontrols.buttons; +import android.annotation.SuppressLint; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; @@ -13,6 +14,7 @@ import java.util.ArrayList; +@SuppressLint("ViewConstructor") public class ControlDrawer extends ControlButton { @@ -115,6 +117,13 @@ public class ControlDrawer extends ControlButton { resizeButtons(); } + @Override + public ControlData preProcessProperties(ControlData properties, ControlLayout layout) { + ControlData data = super.preProcessProperties(properties, layout); + data.isHideable = true; + return data; + } + @Override public void setVisible(boolean isVisible) { //TODO replicate changes to his children ? From 4502c96dfeffa932b54b1b208ed688639399d7a7 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Thu, 1 Jul 2021 12:29:00 +0200 Subject: [PATCH 118/179] Made use a the containKeycode function instead of looking at one keycode only --- .../customcontrols/buttons/ControlButton.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java index e1277b695..b9ba453d0 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java @@ -16,6 +16,8 @@ import net.kdt.pojavlaunch.prefs.LauncherPreferences; import org.lwjgl.glfw.*; +import static net.kdt.pojavlaunch.LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN; + @SuppressLint("ViewConstructor") public class ControlButton extends androidx.appcompat.widget.AppCompatButton implements OnLongClickListener { @@ -68,12 +70,13 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp } public ControlData preProcessProperties(ControlData properties, ControlLayout layout){ + //When a button is created, properties have to be modified to fit the screen. //Size properties.setWidth(properties.getWidth() / layout.getLayoutScale() * LauncherPreferences.PREF_BUTTONSIZE); properties.setHeight(properties.getHeight() / layout.getLayoutScale() * LauncherPreferences.PREF_BUTTONSIZE); //Visibility - properties.isHideable = properties.keycodes[0] != ControlData.SPECIALBTN_TOGGLECTRL && properties.keycodes[0] != ControlData.SPECIALBTN_VIRTUALMOUSE; + properties.isHideable = !properties.containsKeycode(ControlData.SPECIALBTN_TOGGLECTRL) && !properties.containsKeycode(ControlData.SPECIALBTN_VIRTUALMOUSE); //Position if (!properties.isDynamicBtn) { @@ -139,7 +142,7 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp CallbackBridge.holdingAlt = isDown; MainActivity.sendKeyPress(LWJGLGLFWKeycode.GLFW_KEY_LEFT_ALT,0,isDown); System.out.println("holdingAlt="+CallbackBridge.holdingAlt); - } if (mProperties.keycodes[0] == LWJGLGLFWKeycode.GLFW_KEY_CAPS_LOCK) { + } if (mProperties.containsKeycode(LWJGLGLFWKeycode.GLFW_KEY_CAPS_LOCK)) { CallbackBridge.holdingCapslock = isDown; //MainActivity.sendKeyPress(LWJGLGLFWKeycode.GLFW_KEY_CAPS_LOCK,0,isDown); System.out.println("holdingCapslock="+CallbackBridge.holdingCapslock); @@ -147,7 +150,7 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp CallbackBridge.holdingCtrl = isDown; MainActivity.sendKeyPress(LWJGLGLFWKeycode.GLFW_KEY_LEFT_CONTROL,0,isDown); System.out.println("holdingCtrl="+CallbackBridge.holdingCtrl); - } if (mProperties.keycodes[0] == LWJGLGLFWKeycode.GLFW_KEY_NUM_LOCK) { + } if (mProperties.containsKeycode(LWJGLGLFWKeycode.GLFW_KEY_NUM_LOCK)) { CallbackBridge.holdingNumlock = isDown; //MainActivity.sendKeyPress(LWJGLGLFWKeycode.GLFW_KEY_NUM_LOCK,0,isDown); System.out.println("holdingNumlock="+CallbackBridge.holdingNumlock); @@ -358,7 +361,7 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp public void sendKeyPresses(MotionEvent event, boolean isDown){ for(int keycode : mProperties.keycodes){ - if(keycode >= 0){ + if(keycode >= GLFW_KEY_UNKNOWN){ MainActivity.sendKeyPress(keycode, CallbackBridge.getCurrentMods(), isDown); }else { super.onTouchEvent(event); From 6493daaf662611a8017607fa875e2a8628087187 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Thu, 1 Jul 2021 12:29:17 +0200 Subject: [PATCH 119/179] Removed some stubs --- .../handleview/EditControlButtonPopup.java | 73 +++++++------------ 1 file changed, 26 insertions(+), 47 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java index a07355f1b..e7ca071ff 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java @@ -107,54 +107,33 @@ public class EditControlButtonPopup { seekBarCornerRadius = v.findViewById(R.id.editCornerRadius_seekbar); seekBarStrokeWidth = v.findViewById(R.id.editStrokeWidth_seekbar); + SeekBar.OnSeekBarChangeListener changeListener = new SeekBar.OnSeekBarChangeListener() { + + @Override + public void onProgressChanged(SeekBar seekBar, int i, boolean b) { + if(seekBar.equals(seekBarCornerRadius)) { + setPercentageText(textCornerRadius, i); + return; + } + if(seekBar.equals(seekBarOpacity)) { + setPercentageText(textOpacity, i); + return; + } + if(seekBar.equals(seekBarStrokeWidth)) { + setPercentageText(textStrokeWidth, i); + } + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) {/*STUB*/} + @Override + public void onStopTrackingTouch(SeekBar seekBar) {/*STUB*/} + }; + //Add listeners, too bad I don't need all the methods - seekBarOpacity.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { - @Override - public void onProgressChanged(SeekBar seekBar, int i, boolean b) { - setPercentageText(textOpacity, i); - } - - @Override - public void onStartTrackingTouch(SeekBar seekBar) { - //AUTO GENERATED STUB - } - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - //AUTO GENERATED STUB - } - }); - - seekBarCornerRadius.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { - @Override - public void onProgressChanged(SeekBar seekBar, int i, boolean b) { - setPercentageText(textCornerRadius, i); - } - - @Override - public void onStartTrackingTouch(SeekBar seekBar) { - //AUTO GENERATED STUB - } - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - //AUTO GENERATED STUB - } - }); - - seekBarStrokeWidth.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { - @Override - public void onProgressChanged(SeekBar seekBar, int i, boolean b) { - setPercentageText(textStrokeWidth, i); - } - - @Override - public void onStartTrackingTouch(SeekBar seekBar) { - //AUTO GENERATED STUB - } - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - //AUTO GENERATED STUB - } - }); + seekBarOpacity.setOnSeekBarChangeListener(changeListener); + seekBarCornerRadius.setOnSeekBarChangeListener(changeListener); + seekBarStrokeWidth.setOnSeekBarChangeListener(changeListener); buttonBackgroundColor = v.findViewById(R.id.editBackgroundColor_imageButton); buttonStrokeColor = v.findViewById(R.id.editStrokeColor_imageButton); From bc4e6e7c163a23120fc282f5a492103498cada6d Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Thu, 1 Jul 2021 14:50:37 +0200 Subject: [PATCH 120/179] Clean up code. --- .../net/kdt/pojavlaunch/BaseMainActivity.java | 12 +-- .../pojavlaunch/JavaGUILauncherActivity.java | 12 +-- .../customcontrols/buttons/ControlButton.java | 81 +++++++++---------- .../customcontrols/buttons/ControlDrawer.java | 24 +++--- .../customcontrols/gamepad/Gamepad.java | 4 +- 5 files changed, 64 insertions(+), 69 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java index ac5f5b0a5..16e52bdb5 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java @@ -250,8 +250,8 @@ public class BaseMainActivity extends LoggableActivity { float x = event.getX(); float y = event.getY(); - float mouseX = mousePointer.getTranslationX(); - float mouseY = mousePointer.getTranslationY(); + float mouseX = mousePointer.getX(); + float mouseY = mousePointer.getY(); if (gestureDetector.onTouchEvent(event)) { mouse_x = (mouseX * scaleFactor); @@ -797,13 +797,13 @@ public class BaseMainActivity extends LoggableActivity { } public void placeMouseAdd(float x, float y) { - this.mousePointer.setTranslationX(mousePointer.getTranslationX() + x); - this.mousePointer.setTranslationY(mousePointer.getTranslationY() + y); + this.mousePointer.setX(mousePointer.getX() + x); + this.mousePointer.setY(mousePointer.getY() + y); } public void placeMouseAt(float x, float y) { - this.mousePointer.setTranslationX(x); - this.mousePointer.setTranslationY(y); + this.mousePointer.setX(x); + this.mousePointer.setY(y); } public void toggleMouse(View view) { diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/JavaGUILauncherActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/JavaGUILauncherActivity.java index 77308e4da..cc3966114 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/JavaGUILauncherActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/JavaGUILauncherActivity.java @@ -108,8 +108,8 @@ public class JavaGUILauncherActivity extends LoggableActivity implements View.On prevX = x; prevY = y; } - float mouseX = mousePointer.getTranslationX(); - float mouseY = mousePointer.getTranslationY(); + float mouseX = mousePointer.getX(); + float mouseY = mousePointer.getY(); if (gestureDetector.onTouchEvent(event)) { @@ -250,13 +250,13 @@ public class JavaGUILauncherActivity extends LoggableActivity implements View.On } public void placeMouseAdd(float x, float y) { - this.mousePointer.setTranslationX(mousePointer.getTranslationX() + x); - this.mousePointer.setTranslationY(mousePointer.getTranslationY() + y); + this.mousePointer.setX(mousePointer.getX() + x); + this.mousePointer.setY(mousePointer.getY() + y); } public void placeMouseAt(float x, float y) { - this.mousePointer.setTranslationX(x); - this.mousePointer.setTranslationY(y); + this.mousePointer.setX(x); + this.mousePointer.setY(y); } void sendScaledMousePosition(float x, float y){ diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java index b9ba453d0..0a6afdf36 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java @@ -98,8 +98,8 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp setText(properties.name); if (changePos) { - setTranslationX(moveX = properties.x); - setTranslationY(moveY = properties.y); + setX(properties.x); + setY(properties.y); } if (properties.specialButtonListener == null) { @@ -172,8 +172,8 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp // Re-calculate position mProperties.update(); - setTranslationX(mProperties.x); - setTranslationY(mProperties.y); + setX(mProperties.x); + setY(mProperties.y); setModified(true); } @@ -184,8 +184,8 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp } @Override - public void setTranslationX(float x) { - super.setTranslationX(x); + public void setX(float x) { + super.setX(x); if (!mProperties.isDynamicBtn) { mProperties.x = x; @@ -195,8 +195,8 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp } @Override - public void setTranslationY(float y) { - super.setTranslationY(y); + public void setY(float y) { + super.setY(y); if (!mProperties.isDynamicBtn) { mProperties.y = y; @@ -238,27 +238,23 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp return mCanTriggerLongClick; } - protected float moveX, moveY; protected float downX, downY; @Override public boolean onTouchEvent(MotionEvent event) { - System.out.println("IS BEING TOUCHED"); - if (!mModifiable) { + if(!mModifiable){ mCanTriggerLongClick = false; - if (event.getAction() == MotionEvent.ACTION_MOVE && CallbackBridge.isGrabbing() && mProperties.passThruEnabled) { - MinecraftGLView v = ((ControlLayout) this.getParent()).findViewById(R.id.main_game_render_view); - if (v != null) { - v.dispatchTouchEvent(event); - return true; - } - } - - switch (event.getActionMasked()) { + switch (event.getActionMasked()){ case MotionEvent.ACTION_MOVE: + //Send the event to be taken as a mouse action + if(mProperties.passThruEnabled && CallbackBridge.isGrabbing()){ + MinecraftGLView v = ((ControlLayout) this.getParent()).findViewById(R.id.main_game_render_view); + if (v != null) v.dispatchTouchEvent(event); + } + //If out of bounds if(event.getX() < getLeft() || event.getX() > getRight() || - event.getY() < getTop() || event.getY() > getBottom()){ + event.getY() < getTop() || event.getY() > getBottom()){ if(mProperties.isSwipeable && !isPointerOutOfBounds){ //Remove keys if(!triggerToggle(event)) { @@ -290,6 +286,7 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp sendKeyPresses(event, true); } break; + case MotionEvent.ACTION_UP: // 1 case MotionEvent.ACTION_CANCEL: // 3 case MotionEvent.ACTION_POINTER_UP: // 6 @@ -306,32 +303,30 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp return false; } return true; + } - } else { - if (mGestureDetector.onTouchEvent(event)) { + //If the button can be modified/moved + if (mGestureDetector.onTouchEvent(event)) { + mCanTriggerLongClick = true; + onLongClick(this); + } + + switch (event.getActionMasked()) { + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_DOWN: mCanTriggerLongClick = true; - onLongClick(this); - } + downX = event.getRawX() - getX(); + downY = event.getRawY() - getY(); + break; - switch (event.getActionMasked()) { - case MotionEvent.ACTION_UP: - case MotionEvent.ACTION_DOWN: - mCanTriggerLongClick = true; - downX = event.getX(); - downY = event.getY(); - break; + case MotionEvent.ACTION_MOVE: + mCanTriggerLongClick = false; - case MotionEvent.ACTION_MOVE: - mCanTriggerLongClick = false; - moveX += event.getX() - downX; - moveY += event.getY() - downY; - - if (!mProperties.isDynamicBtn) { - setTranslationX(moveX); - setTranslationY(moveY); - } - break; - } + if (!mProperties.isDynamicBtn) { + setX(event.getRawX() - downX); + setY(event.getRawY() - downY); + } + break; } return super.onTouchEvent(event); diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlDrawer.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlDrawer.java index 187ca94bd..09dbba963 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlDrawer.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlDrawer.java @@ -78,23 +78,23 @@ public class ControlDrawer extends ControlButton { for(int i=0; i < buttons.size(); ++i){ switch (drawerData.orientation){ case RIGHT: - buttons.get(i).setTranslationX(drawerData.properties.x + (drawerData.properties.getWidth() + Tools.dpToPx(2))*(i+1) ); - buttons.get(i).setTranslationY(drawerData.properties.y); + buttons.get(i).setX(drawerData.properties.x + (drawerData.properties.getWidth() + Tools.dpToPx(2))*(i+1) ); + buttons.get(i).setY(drawerData.properties.y); break; case LEFT: - buttons.get(i).setTranslationX(drawerData.properties.x - (drawerData.properties.getWidth() + Tools.dpToPx(2))*(i+1) ); - buttons.get(i).setTranslationY(drawerData.properties.y); + buttons.get(i).setX(drawerData.properties.x - (drawerData.properties.getWidth() + Tools.dpToPx(2))*(i+1) ); + buttons.get(i).setY(drawerData.properties.y); break; case UP: - buttons.get(i).setTranslationY(drawerData.properties.y - (drawerData.properties.getHeight() + Tools.dpToPx(2))*(i+1) ); - buttons.get(i).setTranslationX(drawerData.properties.x); + buttons.get(i).setY(drawerData.properties.y - (drawerData.properties.getHeight() + Tools.dpToPx(2))*(i+1) ); + buttons.get(i).setX(drawerData.properties.x); break; case DOWN: - buttons.get(i).setTranslationY(drawerData.properties.y + (drawerData.properties.getHeight() + Tools.dpToPx(2))*(i+1) ); - buttons.get(i).setTranslationX(drawerData.properties.x); + buttons.get(i).setY(drawerData.properties.y + (drawerData.properties.getHeight() + Tools.dpToPx(2))*(i+1) ); + buttons.get(i).setX(drawerData.properties.x); break; } buttons.get(i).updateProperties(); @@ -146,14 +146,14 @@ public class ControlDrawer extends ControlButton { } @Override - public void setTranslationX(float x) { - super.setTranslationX(x); + public void setX(float x) { + super.setX(x); alignButtons(); } @Override - public void setTranslationY(float y) { - super.setTranslationY(y); + public void setY(float y) { + super.setY(y); alignButtons(); } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java index f32969ac2..d5468f668 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java @@ -298,8 +298,8 @@ public class Gamepad { } private void placePointerView(int x, int y){ - pointerView.setTranslationX(x-32); - pointerView.setTranslationY(y-32); + pointerView.setX(x-32); + pointerView.setY(y-32); } From 9cc4243966a4abb2ecb859a2453164e3eed08608 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Sat, 3 Jul 2021 10:18:35 +0200 Subject: [PATCH 121/179] Add a memory optimization if you don't edit the buttons --- .../pojavlaunch/customcontrols/buttons/ControlButton.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java index 0a6afdf36..6229796b6 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java @@ -45,7 +45,7 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp setProperties(preProcessProperties(properties, layout)); setModified(false); - mHandleView = new SelectionEndHandleView(this); + //For the toggle layer @@ -212,13 +212,15 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); - if (isToggled) { + if (isToggled) canvas.drawRoundRect(0, 0, getWidth(), getHeight(), mProperties.cornerRadius, mProperties.cornerRadius, mRectPaint); - } } @Override public boolean onLongClick(View v) { + + if(mHandleView == null) mHandleView = new SelectionEndHandleView(this); + if (mCanTriggerLongClick && mModifiable) { if (mHandleView.isShowing()) { mHandleView.hide(); From dec6fba24499eb9025e1e992f9339febd4f30b91 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Sat, 3 Jul 2021 10:36:38 +0200 Subject: [PATCH 122/179] Fix values not being filtered upon instance creation --- .../kdt/pojavlaunch/customcontrols/buttons/ControlDrawer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlDrawer.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlDrawer.java index 09dbba963..6d2295592 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlDrawer.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlDrawer.java @@ -33,7 +33,7 @@ public class ControlDrawer extends ControlButton { //Filter unwanted values before instantiating the button - for(int i=0; i < buttons.size(); ++i){ + for(int i=0; i < drawerData.buttonProperties.size(); ++i){ drawerData.buttonProperties.set(i, filterProperties(drawerData.buttonProperties.get(i))); addButton(drawerData.buttonProperties.get(i)); From 85f90be2165fc4479ce270f2e95a2c9301c9af8a Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Sat, 3 Jul 2021 23:15:37 +0200 Subject: [PATCH 123/179] Fix crash due to assuming the handleview is non-null --- .../java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java index d93ede3cb..f546192ef 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java @@ -32,7 +32,8 @@ public class ControlLayout extends FrameLayout public void hideAllHandleViews() { for(ControlButton button : getButtonChildren()){ - button.getHandleView().hide(); + HandleView hv = button.getHandleView(); + if(hv != null) hv.hide(); } } From 17aa7614a80df9fbe6adbd39d3e512643c60b9da Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Sat, 3 Jul 2021 23:18:08 +0200 Subject: [PATCH 124/179] Clean up useless code --- .../customcontrols/buttons/ControlDrawer.java | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlDrawer.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlDrawer.java index 6d2295592..f17f583a4 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlDrawer.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlDrawer.java @@ -27,26 +27,9 @@ public class ControlDrawer extends ControlButton { public ControlDrawer(ControlLayout layout, ControlDrawerData drawerData) { super(layout, drawerData.properties); - buttons = new ArrayList<>(/*drawerData.buttonProperties.size()*/); + buttons = new ArrayList<>(drawerData.buttonProperties.size()); mLayout = layout; this.drawerData = drawerData; - - - //Filter unwanted values before instantiating the button - for(int i=0; i < drawerData.buttonProperties.size(); ++i){ - drawerData.buttonProperties.set(i, filterProperties(drawerData.buttonProperties.get(i))); - - addButton(drawerData.buttonProperties.get(i)); - } - - } - - private ControlData filterProperties(ControlData properties){ - properties.isDynamicBtn = false; - properties.setWidth(drawerData.properties.getWidth()); - properties.setHeight(drawerData.properties.getHeight()); - - return properties; } From f114e824227f6354cd3f9aa18c254fa32f80c97b Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Sat, 3 Jul 2021 23:32:28 +0200 Subject: [PATCH 125/179] Properly takes into account if a button is swipeable. --- .../pojavlaunch/customcontrols/ControlLayout.java | 14 ++++++-------- .../customcontrols/buttons/ControlButton.java | 6 +++--- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java index f546192ef..b2a164e22 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java @@ -234,9 +234,8 @@ public class ControlLayout extends FrameLayout } ControlButton lastControlButton = null; - @Override - public boolean onTouchEvent(MotionEvent ev) { - System.out.println("ON_TOUCH_LAYOUT"); + //While this is called onTouch, this should only be called from a ControlButton. + public boolean onTouch(MotionEvent ev) { if(ev.getActionMasked() == MotionEvent.ACTION_UP || ev.getActionMasked() == MotionEvent.ACTION_CANCEL){ if(lastControlButton != null) lastControlButton.onTouchEvent(ev); lastControlButton = null; @@ -245,11 +244,13 @@ public class ControlLayout extends FrameLayout if(ev.getActionMasked() != MotionEvent.ACTION_MOVE) return false; ArrayList children = getButtonChildren(); - + /* Log.d("getX LAYOUT_CONTROL", String.valueOf(ev.getX())); Log.d("getY LAYOUT_CONTROL", String.valueOf(ev.getY())); Log.d("getRawX LAYOUT_CONTROL", String.valueOf(ev.getRawX())); Log.d("getRawY LAYOUT_CONTROL", String.valueOf(ev.getRawY())); + */ + //Optimization pass to avoid looking at all children again if(lastControlButton != null){ if( ev.getRawX() > lastControlButton.getX() && ev.getRawX() < lastControlButton.getX() + lastControlButton.getWidth() && ev.getRawY() > lastControlButton.getY() && ev.getRawY() < lastControlButton.getY() + lastControlButton.getHeight()){ @@ -265,7 +266,7 @@ public class ControlLayout extends FrameLayout Log.d("BOTTOM: LAYOUT_CONTROL", String.valueOf(button.getBottom())); */ - + if(!button.getProperties().isSwipeable) continue; if( ev.getRawX() > button.getX() && ev.getRawX() < button.getX() + button.getWidth() && ev.getRawY() > button.getY() && ev.getRawY() < button.getY() + button.getHeight()){ System.out.println("FOUND ONE !"); @@ -283,8 +284,5 @@ public class ControlLayout extends FrameLayout } } return false; - //We actually could go through all our children here. - //This isn't the most performance friendly stuff though. - //return true; } } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java index 6229796b6..2031d9546 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java @@ -265,13 +265,13 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp } } isPointerOutOfBounds = true; - ((ControlLayout) getParent()).onTouchEvent(event); + ((ControlLayout) getParent()).onTouch(event); break; } //Else if we now are in bounds if(isPointerOutOfBounds) { - ((ControlLayout) getParent()).onTouchEvent(event); + ((ControlLayout) getParent()).onTouch(event); //RE-press the button if(mProperties.isSwipeable && !mProperties.isToggle){ setHolding(true); @@ -292,7 +292,7 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp case MotionEvent.ACTION_UP: // 1 case MotionEvent.ACTION_CANCEL: // 3 case MotionEvent.ACTION_POINTER_UP: // 6 - if(isPointerOutOfBounds) ((ControlLayout) getParent()).onTouchEvent(event); + if(isPointerOutOfBounds) ((ControlLayout) getParent()).onTouch(event); isPointerOutOfBounds = false; if(!triggerToggle(event)) { From ba0db19facb3b1579cf7ff4dd39361f0e34ae293 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Mon, 5 Jul 2021 14:58:05 +0200 Subject: [PATCH 126/179] Fix handleview being instantiated when unneeded --- .../pojavlaunch/customcontrols/buttons/ControlButton.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java index 2031d9546..a88eed364 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java @@ -218,10 +218,10 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp @Override public boolean onLongClick(View v) { - - if(mHandleView == null) mHandleView = new SelectionEndHandleView(this); - if (mCanTriggerLongClick && mModifiable) { + //Instantiate on need only + if(mHandleView == null) mHandleView = new SelectionEndHandleView(this); + if (mHandleView.isShowing()) { mHandleView.hide(); } else { From 1f7ba3fa10bf2233f3e90837109d55a17c5f84a4 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Mon, 5 Jul 2021 14:59:11 +0200 Subject: [PATCH 127/179] More memory optimisations :eyes: --- .../kdt/pojavlaunch/AndroidLWJGLKeycode.java | 224 +++++++++--------- 1 file changed, 112 insertions(+), 112 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AndroidLWJGLKeycode.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AndroidLWJGLKeycode.java index 9b30d29b6..acfb6c00a 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AndroidLWJGLKeycode.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AndroidLWJGLKeycode.java @@ -12,151 +12,151 @@ import org.lwjgl.glfw.*; public class AndroidLWJGLKeycode { // Fix double letters on MC 1.9 and above public static boolean isBackspaceAfterChar = true; - public static final ArrayMap androidToLwjglMap; + public static final ArrayMap androidToLwjglMap; public static String[] androidKeyNameArray; static { // Mapping Android Keycodes to LWJGL Keycodes androidToLwjglMap = new ArrayMap<>(); - + // 0-9 keys - androidToLwjglMap.put(KeyEvent.KEYCODE_0, LWJGLGLFWKeycode.GLFW_KEY_0); - androidToLwjglMap.put(KeyEvent.KEYCODE_1, LWJGLGLFWKeycode.GLFW_KEY_1); - androidToLwjglMap.put(KeyEvent.KEYCODE_2, LWJGLGLFWKeycode.GLFW_KEY_2); - androidToLwjglMap.put(KeyEvent.KEYCODE_3, LWJGLGLFWKeycode.GLFW_KEY_3); - androidToLwjglMap.put(KeyEvent.KEYCODE_4, LWJGLGLFWKeycode.GLFW_KEY_4); - androidToLwjglMap.put(KeyEvent.KEYCODE_5, LWJGLGLFWKeycode.GLFW_KEY_5); - androidToLwjglMap.put(KeyEvent.KEYCODE_6, LWJGLGLFWKeycode.GLFW_KEY_6); - androidToLwjglMap.put(KeyEvent.KEYCODE_7, LWJGLGLFWKeycode.GLFW_KEY_7); - androidToLwjglMap.put(KeyEvent.KEYCODE_8, LWJGLGLFWKeycode.GLFW_KEY_8); - androidToLwjglMap.put(KeyEvent.KEYCODE_9, LWJGLGLFWKeycode.GLFW_KEY_9); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_0, LWJGLGLFWKeycode.GLFW_KEY_0); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_1, LWJGLGLFWKeycode.GLFW_KEY_1); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_2, LWJGLGLFWKeycode.GLFW_KEY_2); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_3, LWJGLGLFWKeycode.GLFW_KEY_3); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_4, LWJGLGLFWKeycode.GLFW_KEY_4); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_5, LWJGLGLFWKeycode.GLFW_KEY_5); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_6, LWJGLGLFWKeycode.GLFW_KEY_6); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_7, LWJGLGLFWKeycode.GLFW_KEY_7); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_8, LWJGLGLFWKeycode.GLFW_KEY_8); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_9, LWJGLGLFWKeycode.GLFW_KEY_9); // A-Z keys - androidToLwjglMap.put(KeyEvent.KEYCODE_A, LWJGLGLFWKeycode.GLFW_KEY_A); - androidToLwjglMap.put(KeyEvent.KEYCODE_B, LWJGLGLFWKeycode.GLFW_KEY_B); - androidToLwjglMap.put(KeyEvent.KEYCODE_C, LWJGLGLFWKeycode.GLFW_KEY_C); - androidToLwjglMap.put(KeyEvent.KEYCODE_D, LWJGLGLFWKeycode.GLFW_KEY_D); - androidToLwjglMap.put(KeyEvent.KEYCODE_E, LWJGLGLFWKeycode.GLFW_KEY_E); - androidToLwjglMap.put(KeyEvent.KEYCODE_F, LWJGLGLFWKeycode.GLFW_KEY_F); - androidToLwjglMap.put(KeyEvent.KEYCODE_G, LWJGLGLFWKeycode.GLFW_KEY_G); - androidToLwjglMap.put(KeyEvent.KEYCODE_H, LWJGLGLFWKeycode.GLFW_KEY_H); - androidToLwjglMap.put(KeyEvent.KEYCODE_I, LWJGLGLFWKeycode.GLFW_KEY_I); - androidToLwjglMap.put(KeyEvent.KEYCODE_J, LWJGLGLFWKeycode.GLFW_KEY_J); - androidToLwjglMap.put(KeyEvent.KEYCODE_K, LWJGLGLFWKeycode.GLFW_KEY_K); - androidToLwjglMap.put(KeyEvent.KEYCODE_L, LWJGLGLFWKeycode.GLFW_KEY_L); - androidToLwjglMap.put(KeyEvent.KEYCODE_M, LWJGLGLFWKeycode.GLFW_KEY_M); - androidToLwjglMap.put(KeyEvent.KEYCODE_N, LWJGLGLFWKeycode.GLFW_KEY_N); - androidToLwjglMap.put(KeyEvent.KEYCODE_O, LWJGLGLFWKeycode.GLFW_KEY_O); - androidToLwjglMap.put(KeyEvent.KEYCODE_P, LWJGLGLFWKeycode.GLFW_KEY_P); - androidToLwjglMap.put(KeyEvent.KEYCODE_Q, LWJGLGLFWKeycode.GLFW_KEY_Q); - androidToLwjglMap.put(KeyEvent.KEYCODE_R, LWJGLGLFWKeycode.GLFW_KEY_R); - androidToLwjglMap.put(KeyEvent.KEYCODE_S, LWJGLGLFWKeycode.GLFW_KEY_S); - androidToLwjglMap.put(KeyEvent.KEYCODE_T, LWJGLGLFWKeycode.GLFW_KEY_T); - androidToLwjglMap.put(KeyEvent.KEYCODE_U, LWJGLGLFWKeycode.GLFW_KEY_U); - androidToLwjglMap.put(KeyEvent.KEYCODE_V, LWJGLGLFWKeycode.GLFW_KEY_V); - androidToLwjglMap.put(KeyEvent.KEYCODE_W, LWJGLGLFWKeycode.GLFW_KEY_W); - androidToLwjglMap.put(KeyEvent.KEYCODE_X, LWJGLGLFWKeycode.GLFW_KEY_X); - androidToLwjglMap.put(KeyEvent.KEYCODE_Y, LWJGLGLFWKeycode.GLFW_KEY_Y); - androidToLwjglMap.put(KeyEvent.KEYCODE_Z, LWJGLGLFWKeycode.GLFW_KEY_Z); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_A, LWJGLGLFWKeycode.GLFW_KEY_A); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_B, LWJGLGLFWKeycode.GLFW_KEY_B); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_C, LWJGLGLFWKeycode.GLFW_KEY_C); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_D, LWJGLGLFWKeycode.GLFW_KEY_D); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_E, LWJGLGLFWKeycode.GLFW_KEY_E); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_F, LWJGLGLFWKeycode.GLFW_KEY_F); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_G, LWJGLGLFWKeycode.GLFW_KEY_G); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_H, LWJGLGLFWKeycode.GLFW_KEY_H); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_I, LWJGLGLFWKeycode.GLFW_KEY_I); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_J, LWJGLGLFWKeycode.GLFW_KEY_J); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_K, LWJGLGLFWKeycode.GLFW_KEY_K); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_L, LWJGLGLFWKeycode.GLFW_KEY_L); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_M, LWJGLGLFWKeycode.GLFW_KEY_M); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_N, LWJGLGLFWKeycode.GLFW_KEY_N); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_O, LWJGLGLFWKeycode.GLFW_KEY_O); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_P, LWJGLGLFWKeycode.GLFW_KEY_P); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_Q, LWJGLGLFWKeycode.GLFW_KEY_Q); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_R, LWJGLGLFWKeycode.GLFW_KEY_R); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_S, LWJGLGLFWKeycode.GLFW_KEY_S); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_T, LWJGLGLFWKeycode.GLFW_KEY_T); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_U, LWJGLGLFWKeycode.GLFW_KEY_U); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_V, LWJGLGLFWKeycode.GLFW_KEY_V); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_W, LWJGLGLFWKeycode.GLFW_KEY_W); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_X, LWJGLGLFWKeycode.GLFW_KEY_X); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_Y, LWJGLGLFWKeycode.GLFW_KEY_Y); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_Z, LWJGLGLFWKeycode.GLFW_KEY_Z); // Alt keys - androidToLwjglMap.put(KeyEvent.KEYCODE_ALT_LEFT, LWJGLGLFWKeycode.GLFW_KEY_LEFT_ALT); - androidToLwjglMap.put(KeyEvent.KEYCODE_ALT_RIGHT, LWJGLGLFWKeycode.GLFW_KEY_RIGHT_ALT); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_ALT_LEFT, LWJGLGLFWKeycode.GLFW_KEY_LEFT_ALT); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_ALT_RIGHT, LWJGLGLFWKeycode.GLFW_KEY_RIGHT_ALT); // Escape key - androidToLwjglMap.put(KeyEvent.KEYCODE_BACK, LWJGLGLFWKeycode.GLFW_KEY_ESCAPE); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_BACK, LWJGLGLFWKeycode.GLFW_KEY_ESCAPE); - androidToLwjglMap.put(KeyEvent.KEYCODE_BACKSLASH, LWJGLGLFWKeycode.GLFW_KEY_BACKSLASH); - androidToLwjglMap.put(KeyEvent.KEYCODE_BREAK, LWJGLGLFWKeycode.GLFW_KEY_PAUSE); - androidToLwjglMap.put(KeyEvent.KEYCODE_CAPS_LOCK, LWJGLGLFWKeycode.GLFW_KEY_CAPS_LOCK); - androidToLwjglMap.put(KeyEvent.KEYCODE_COMMA, LWJGLGLFWKeycode.GLFW_KEY_COMMA); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_BACKSLASH, LWJGLGLFWKeycode.GLFW_KEY_BACKSLASH); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_BREAK, LWJGLGLFWKeycode.GLFW_KEY_PAUSE); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_CAPS_LOCK, LWJGLGLFWKeycode.GLFW_KEY_CAPS_LOCK); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_COMMA, LWJGLGLFWKeycode.GLFW_KEY_COMMA); // Control keys - androidToLwjglMap.put(KeyEvent.KEYCODE_CTRL_LEFT, LWJGLGLFWKeycode.GLFW_KEY_LEFT_CONTROL); - androidToLwjglMap.put(KeyEvent.KEYCODE_CTRL_RIGHT, LWJGLGLFWKeycode.GLFW_KEY_RIGHT_CONTROL); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_CTRL_LEFT, LWJGLGLFWKeycode.GLFW_KEY_LEFT_CONTROL); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_CTRL_RIGHT, LWJGLGLFWKeycode.GLFW_KEY_RIGHT_CONTROL); - androidToLwjglMap.put(KeyEvent.KEYCODE_DEL, LWJGLGLFWKeycode.GLFW_KEY_BACKSPACE); // Backspace + androidToLwjglMap.put((short)KeyEvent.KEYCODE_DEL, LWJGLGLFWKeycode.GLFW_KEY_BACKSPACE); // Backspace // Arrow keys - androidToLwjglMap.put(KeyEvent.KEYCODE_DPAD_DOWN, LWJGLGLFWKeycode.GLFW_KEY_DOWN); - androidToLwjglMap.put(KeyEvent.KEYCODE_DPAD_LEFT, LWJGLGLFWKeycode.GLFW_KEY_LEFT); - androidToLwjglMap.put(KeyEvent.KEYCODE_DPAD_RIGHT, LWJGLGLFWKeycode.GLFW_KEY_RIGHT); - androidToLwjglMap.put(KeyEvent.KEYCODE_DPAD_UP, LWJGLGLFWKeycode.GLFW_KEY_UP); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_DPAD_DOWN, LWJGLGLFWKeycode.GLFW_KEY_DOWN); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_DPAD_LEFT, LWJGLGLFWKeycode.GLFW_KEY_LEFT); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_DPAD_RIGHT, LWJGLGLFWKeycode.GLFW_KEY_RIGHT); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_DPAD_UP, LWJGLGLFWKeycode.GLFW_KEY_UP); - androidToLwjglMap.put(KeyEvent.KEYCODE_ENTER, LWJGLGLFWKeycode.GLFW_KEY_ENTER); - androidToLwjglMap.put(KeyEvent.KEYCODE_EQUALS, LWJGLGLFWKeycode.GLFW_KEY_EQUAL); - androidToLwjglMap.put(KeyEvent.KEYCODE_ESCAPE, LWJGLGLFWKeycode.GLFW_KEY_ESCAPE); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_ENTER, LWJGLGLFWKeycode.GLFW_KEY_ENTER); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_EQUALS, LWJGLGLFWKeycode.GLFW_KEY_EQUAL); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_ESCAPE, LWJGLGLFWKeycode.GLFW_KEY_ESCAPE); // Fn keys - androidToLwjglMap.put(KeyEvent.KEYCODE_F1, LWJGLGLFWKeycode.GLFW_KEY_F1); - androidToLwjglMap.put(KeyEvent.KEYCODE_F2, LWJGLGLFWKeycode.GLFW_KEY_F2); - androidToLwjglMap.put(KeyEvent.KEYCODE_F3, LWJGLGLFWKeycode.GLFW_KEY_F3); - androidToLwjglMap.put(KeyEvent.KEYCODE_F4, LWJGLGLFWKeycode.GLFW_KEY_F4); - androidToLwjglMap.put(KeyEvent.KEYCODE_F5, LWJGLGLFWKeycode.GLFW_KEY_F5); - androidToLwjglMap.put(KeyEvent.KEYCODE_F6, LWJGLGLFWKeycode.GLFW_KEY_F6); - androidToLwjglMap.put(KeyEvent.KEYCODE_F7, LWJGLGLFWKeycode.GLFW_KEY_F7); - androidToLwjglMap.put(KeyEvent.KEYCODE_F8, LWJGLGLFWKeycode.GLFW_KEY_F8); - androidToLwjglMap.put(KeyEvent.KEYCODE_F9, LWJGLGLFWKeycode.GLFW_KEY_F9); - androidToLwjglMap.put(KeyEvent.KEYCODE_F10, LWJGLGLFWKeycode.GLFW_KEY_F10); - androidToLwjglMap.put(KeyEvent.KEYCODE_F11, LWJGLGLFWKeycode.GLFW_KEY_F11); - androidToLwjglMap.put(KeyEvent.KEYCODE_F12, LWJGLGLFWKeycode.GLFW_KEY_F12); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_F1, LWJGLGLFWKeycode.GLFW_KEY_F1); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_F2, LWJGLGLFWKeycode.GLFW_KEY_F2); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_F3, LWJGLGLFWKeycode.GLFW_KEY_F3); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_F4, LWJGLGLFWKeycode.GLFW_KEY_F4); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_F5, LWJGLGLFWKeycode.GLFW_KEY_F5); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_F6, LWJGLGLFWKeycode.GLFW_KEY_F6); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_F7, LWJGLGLFWKeycode.GLFW_KEY_F7); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_F8, LWJGLGLFWKeycode.GLFW_KEY_F8); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_F9, LWJGLGLFWKeycode.GLFW_KEY_F9); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_F10, LWJGLGLFWKeycode.GLFW_KEY_F10); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_F11, LWJGLGLFWKeycode.GLFW_KEY_F11); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_F12, LWJGLGLFWKeycode.GLFW_KEY_F12); // FIXME GLFW Function key - // androidToLwjglMap.put(KeyEvent.KEYCODE_FUNCTION, LWJGLGLFWKeycode.GLFW_KEY_FUNCTION); + // androidToLwjglMap.put((short)KeyEvent.KEYCODE_FUNCTION, LWJGLGLFWKeycode.GLFW_KEY_FUNCTION); - androidToLwjglMap.put(KeyEvent.KEYCODE_GRAVE, LWJGLGLFWKeycode.GLFW_KEY_GRAVE_ACCENT); - androidToLwjglMap.put(KeyEvent.KEYCODE_HOME, LWJGLGLFWKeycode.GLFW_KEY_HOME); - androidToLwjglMap.put(KeyEvent.KEYCODE_INSERT, LWJGLGLFWKeycode.GLFW_KEY_INSERT); - //androidToLwjglMap.put(KeyEvent.KEYCODE_KANA, LWJGLGLFWKeycode.GLFW_KEY_K); - androidToLwjglMap.put(KeyEvent.KEYCODE_LEFT_BRACKET, LWJGLGLFWKeycode.GLFW_KEY_LEFT_BRACKET); - androidToLwjglMap.put(KeyEvent.KEYCODE_MINUS, LWJGLGLFWKeycode.GLFW_KEY_MINUS); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_GRAVE, LWJGLGLFWKeycode.GLFW_KEY_GRAVE_ACCENT); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_HOME, LWJGLGLFWKeycode.GLFW_KEY_HOME); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_INSERT, LWJGLGLFWKeycode.GLFW_KEY_INSERT); + //androidToLwjglMap.put((short)KeyEvent.KEYCODE_KANA, LWJGLGLFWKeycode.GLFW_KEY_K); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_LEFT_BRACKET, LWJGLGLFWKeycode.GLFW_KEY_LEFT_BRACKET); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_MINUS, LWJGLGLFWKeycode.GLFW_KEY_MINUS); // Num keys - androidToLwjglMap.put(KeyEvent.KEYCODE_NUM_LOCK, LWJGLGLFWKeycode.GLFW_KEY_NUM_LOCK); - androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_0, LWJGLGLFWKeycode.GLFW_KEY_0); - androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_1, LWJGLGLFWKeycode.GLFW_KEY_1); - androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_2, LWJGLGLFWKeycode.GLFW_KEY_2); - androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_3, LWJGLGLFWKeycode.GLFW_KEY_3); - androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_4, LWJGLGLFWKeycode.GLFW_KEY_4); - androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_5, LWJGLGLFWKeycode.GLFW_KEY_5); - androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_6, LWJGLGLFWKeycode.GLFW_KEY_6); - androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_7, LWJGLGLFWKeycode.GLFW_KEY_7); - androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_8, LWJGLGLFWKeycode.GLFW_KEY_8); - androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_9, LWJGLGLFWKeycode.GLFW_KEY_9); - androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_ADD, LWJGLGLFWKeycode.GLFW_KEY_KP_ADD); - androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_COMMA, LWJGLGLFWKeycode.GLFW_KEY_COMMA); - androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_DIVIDE, LWJGLGLFWKeycode.GLFW_KEY_KP_DIVIDE); - androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_DOT, LWJGLGLFWKeycode.GLFW_KEY_PERIOD); - androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_ENTER, LWJGLGLFWKeycode.GLFW_KEY_ENTER); - androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_EQUALS, LWJGLGLFWKeycode.GLFW_KEY_EQUAL); - androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_MULTIPLY, LWJGLGLFWKeycode.GLFW_KEY_KP_MULTIPLY); - androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_SUBTRACT, LWJGLGLFWKeycode.GLFW_KEY_KP_SUBTRACT); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_NUM_LOCK, LWJGLGLFWKeycode.GLFW_KEY_NUM_LOCK); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_NUMPAD_0, LWJGLGLFWKeycode.GLFW_KEY_0); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_NUMPAD_1, LWJGLGLFWKeycode.GLFW_KEY_1); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_NUMPAD_2, LWJGLGLFWKeycode.GLFW_KEY_2); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_NUMPAD_3, LWJGLGLFWKeycode.GLFW_KEY_3); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_NUMPAD_4, LWJGLGLFWKeycode.GLFW_KEY_4); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_NUMPAD_5, LWJGLGLFWKeycode.GLFW_KEY_5); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_NUMPAD_6, LWJGLGLFWKeycode.GLFW_KEY_6); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_NUMPAD_7, LWJGLGLFWKeycode.GLFW_KEY_7); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_NUMPAD_8, LWJGLGLFWKeycode.GLFW_KEY_8); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_NUMPAD_9, LWJGLGLFWKeycode.GLFW_KEY_9); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_NUMPAD_ADD, LWJGLGLFWKeycode.GLFW_KEY_KP_ADD); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_NUMPAD_COMMA, LWJGLGLFWKeycode.GLFW_KEY_COMMA); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_NUMPAD_DIVIDE, LWJGLGLFWKeycode.GLFW_KEY_KP_DIVIDE); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_NUMPAD_DOT, LWJGLGLFWKeycode.GLFW_KEY_PERIOD); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_NUMPAD_ENTER, LWJGLGLFWKeycode.GLFW_KEY_ENTER); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_NUMPAD_EQUALS, LWJGLGLFWKeycode.GLFW_KEY_EQUAL); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_NUMPAD_MULTIPLY, LWJGLGLFWKeycode.GLFW_KEY_KP_MULTIPLY); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_NUMPAD_SUBTRACT, LWJGLGLFWKeycode.GLFW_KEY_KP_SUBTRACT); // Page keys - androidToLwjglMap.put(KeyEvent.KEYCODE_PAGE_DOWN, LWJGLGLFWKeycode.GLFW_KEY_PAGE_DOWN); - androidToLwjglMap.put(KeyEvent.KEYCODE_PAGE_UP, LWJGLGLFWKeycode.GLFW_KEY_PAGE_UP); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_PAGE_DOWN, LWJGLGLFWKeycode.GLFW_KEY_PAGE_DOWN); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_PAGE_UP, LWJGLGLFWKeycode.GLFW_KEY_PAGE_UP); - androidToLwjglMap.put(KeyEvent.KEYCODE_PERIOD, LWJGLGLFWKeycode.GLFW_KEY_PERIOD); - androidToLwjglMap.put(KeyEvent.KEYCODE_PLUS, LWJGLGLFWKeycode.GLFW_KEY_KP_ADD); - // androidToLwjglMap.put(KeyEvent.KEYCODE_POWER, LWJGLGLFWKeycode.GLFW_KEY_POWER); - androidToLwjglMap.put(KeyEvent.KEYCODE_RIGHT_BRACKET, LWJGLGLFWKeycode.GLFW_KEY_RIGHT_BRACKET); - androidToLwjglMap.put(KeyEvent.KEYCODE_SEMICOLON, LWJGLGLFWKeycode.GLFW_KEY_SEMICOLON); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_PERIOD, LWJGLGLFWKeycode.GLFW_KEY_PERIOD); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_PLUS, LWJGLGLFWKeycode.GLFW_KEY_KP_ADD); + // androidToLwjglMap.put((short)KeyEvent.KEYCODE_POWER, LWJGLGLFWKeycode.GLFW_KEY_POWER); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_RIGHT_BRACKET, LWJGLGLFWKeycode.GLFW_KEY_RIGHT_BRACKET); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_SEMICOLON, LWJGLGLFWKeycode.GLFW_KEY_SEMICOLON); // Shift keys - androidToLwjglMap.put(KeyEvent.KEYCODE_SHIFT_LEFT, LWJGLGLFWKeycode.GLFW_KEY_LEFT_SHIFT); - androidToLwjglMap.put(KeyEvent.KEYCODE_SHIFT_RIGHT, LWJGLGLFWKeycode.GLFW_KEY_RIGHT_SHIFT); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_SHIFT_LEFT, LWJGLGLFWKeycode.GLFW_KEY_LEFT_SHIFT); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_SHIFT_RIGHT, LWJGLGLFWKeycode.GLFW_KEY_RIGHT_SHIFT); - androidToLwjglMap.put(KeyEvent.KEYCODE_SLASH, LWJGLGLFWKeycode.GLFW_KEY_SLASH); - // androidToLwjglMap.put(KeyEvent.KEYCODE_SLEEP, LWJGLGLFWKeycode.GLFW_KEY_SLEEP); - androidToLwjglMap.put(KeyEvent.KEYCODE_SPACE, LWJGLGLFWKeycode.GLFW_KEY_SPACE); - // androidToLwjglMap.put(KeyEvent.KEYCODE_SYSRQ, LWJGLGLFWKeycode.GLFW_KEY_SYSRQ); - androidToLwjglMap.put(KeyEvent.KEYCODE_TAB, LWJGLGLFWKeycode.GLFW_KEY_TAB); - // androidToLwjglMap.put(KeyEvent.KEYCODE_YEN, LWJGLGLFWKeycode.GLFW_KEY_YEN); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_SLASH, LWJGLGLFWKeycode.GLFW_KEY_SLASH); + // androidToLwjglMap.put((short)KeyEvent.KEYCODE_SLEEP, LWJGLGLFWKeycode.GLFW_KEY_SLEEP); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_SPACE, LWJGLGLFWKeycode.GLFW_KEY_SPACE); + // androidToLwjglMap.put((short)KeyEvent.KEYCODE_SYSRQ, LWJGLGLFWKeycode.GLFW_KEY_SYSRQ); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_TAB, LWJGLGLFWKeycode.GLFW_KEY_TAB); + // androidToLwjglMap.put((short)KeyEvent.KEYCODE_YEN, LWJGLGLFWKeycode.GLFW_KEY_YEN); - // androidToLwjglMap.put(KeyEvent.KEYCODE_BUTTON_1, LWJGLGLFWKeycode.G - androidToLwjglMap.put(KeyEvent.KEYCODE_AT,LWJGLGLFWKeycode.GLFW_KEY_2); - androidToLwjglMap.put(KeyEvent.KEYCODE_POUND,LWJGLGLFWKeycode.GLFW_KEY_3); + // androidToLwjglMap.put((short)KeyEvent.KEYCODE_BUTTON_1, LWJGLGLFWKeycode.G + androidToLwjglMap.put((short)KeyEvent.KEYCODE_AT,LWJGLGLFWKeycode.GLFW_KEY_2); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_POUND,LWJGLGLFWKeycode.GLFW_KEY_3); - androidToLwjglMap.put(KeyEvent.KEYCODE_UNKNOWN,LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN); + androidToLwjglMap.put((short)KeyEvent.KEYCODE_UNKNOWN,LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN); } From d037ff338d184593770d83b39ea6e5f465378173 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Mon, 5 Jul 2021 15:40:40 +0200 Subject: [PATCH 128/179] Another small memory optimisation --- .../customcontrols/buttons/ControlButton.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java index a88eed364..563a5ecc1 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java @@ -36,18 +36,14 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp public ControlButton(ControlLayout layout, ControlData properties) { super(layout.getContext()); setPadding(4, 4, 4, 4); - - mGestureDetector = new GestureDetector(getContext(), new SingleTapConfirm()); setOnLongClickListener(this); - //When a button is created, the width/height has yet to be processed to fit the scaling. + //When a button is created, the width/height has yet to be processed to fit the scaling. setProperties(preProcessProperties(properties, layout)); setModified(false); - - //For the toggle layer final TypedValue value = new TypedValue(); getContext().getTheme().resolveAttribute(R.attr.colorAccent, value, true); @@ -168,7 +164,6 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp mProperties.setWidth(params.width); mProperties.setHeight(params.height); setBackground(); - // Re-calculate position mProperties.update(); @@ -307,7 +302,10 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp return true; } - //If the button can be modified/moved + /* If the button can be modified/moved */ + //Instantiate the gesture detector only when needed + if(mGestureDetector == null) mGestureDetector = new GestureDetector(getContext(), new SingleTapConfirm()); + if (mGestureDetector.onTouchEvent(event)) { mCanTriggerLongClick = true; onLongClick(this); From 535d502679434e95b7338c015cb718f252cc3ea5 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Mon, 5 Jul 2021 16:50:58 +0200 Subject: [PATCH 129/179] Add string resource --- app_pojavlauncher/src/main/res/values/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app_pojavlauncher/src/main/res/values/strings.xml b/app_pojavlauncher/src/main/res/values/strings.xml index 969cbd83b..0b4c0897c 100644 --- a/app_pojavlauncher/src/main/res/values/strings.xml +++ b/app_pojavlauncher/src/main/res/values/strings.xml @@ -217,6 +217,7 @@ Mouse Speed Changes the speed of the software mouse Mouse pass-thru + Swipeable Rounded The current amount of free RAM (%d) is lower than allocated RAM (%d), which may lead to crashes. Change the allocation if the game crashes. Memory allocation From a5f8c4f69f850d25c94d37da8151d469c0b2bbd1 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Mon, 5 Jul 2021 16:51:58 +0200 Subject: [PATCH 130/179] isSwipeable property is now properly integrated into UI --- .../handleview/EditControlButtonPopup.java | 4 ++++ .../src/main/res/layout/control_button_setting.xml | 14 +++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java index e7ca071ff..cd4fc2b8a 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java @@ -33,6 +33,7 @@ public class EditControlButtonPopup { protected CheckBox checkToggle; protected CheckBox checkPassThrough; + protected CheckBox checkBoxSwipeable; protected CheckBox checkDynamicPosition; protected CheckBox checkHoldAlt; protected CheckBox checkHoldCtrl; @@ -96,6 +97,7 @@ public class EditControlButtonPopup { checkToggle = v.findViewById(R.id.checkboxToggle); checkPassThrough = v.findViewById(R.id.checkboxPassThrough); + checkBoxSwipeable = v.findViewById(R.id.checkboxSwipeable); editWidth = v.findViewById(R.id.editSize_editTextX); editHeight = v.findViewById(R.id.editSize_editTextY); @@ -201,6 +203,7 @@ public class EditControlButtonPopup { checkToggle.setChecked(properties.isToggle); checkPassThrough.setChecked(properties.passThruEnabled); + checkBoxSwipeable.setChecked(properties.isSwipeable); editWidth.setText(Float.toString(properties.getWidth())); editHeight.setText(Float.toString(properties.getHeight())); @@ -283,6 +286,7 @@ public class EditControlButtonPopup { properties.isToggle = checkToggle.isChecked(); properties.passThruEnabled = checkPassThrough.isChecked(); + properties.isSwipeable = checkBoxSwipeable.isChecked(); properties.setWidth(Float.parseFloat(editWidth.getText().toString())); properties.setHeight(Float.parseFloat(editHeight.getText().toString())); diff --git a/app_pojavlauncher/src/main/res/layout/control_button_setting.xml b/app_pojavlauncher/src/main/res/layout/control_button_setting.xml index 1f15d51c5..039f2cdc5 100644 --- a/app_pojavlauncher/src/main/res/layout/control_button_setting.xml +++ b/app_pojavlauncher/src/main/res/layout/control_button_setting.xml @@ -218,6 +218,7 @@ app:layout_constraintTop_toBottomOf="@id/editOrientation_textView" /> + + + + Date: Mon, 5 Jul 2021 17:22:03 +0200 Subject: [PATCH 131/179] Add support for swipeable buttons ! --- .../customcontrols/ControlLayout.java | 41 +++++++++---------- .../customcontrols/buttons/ControlButton.java | 6 +-- 2 files changed, 23 insertions(+), 24 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java index b2a164e22..584afcda7 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java @@ -6,12 +6,14 @@ import android.widget.*; import com.google.gson.*; import java.io.*; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import net.kdt.pojavlaunch.*; import net.kdt.pojavlaunch.customcontrols.buttons.ControlButton; import net.kdt.pojavlaunch.customcontrols.buttons.ControlDrawer; import net.kdt.pojavlaunch.customcontrols.buttons.ControlSubButton; +import net.kdt.pojavlaunch.customcontrols.handleview.HandleView; import net.kdt.pojavlaunch.prefs.*; import org.lwjgl.glfw.*; @@ -52,6 +54,7 @@ public class ControlLayout extends FrameLayout } System.gc(); + mapTable.clear(); // Cleanup buttons only when input layout is null if (controlLayout == null) return; @@ -68,8 +71,9 @@ public class ControlLayout extends FrameLayout ControlDrawer drawer = addDrawerView(drawerData); if(mModifiable) drawer.areButtonsVisible = true; + //CONTROL SUB BUTTON - for (ControlData subButton : drawerData.buttonProperties){ + for (ControlData subButton : drawerData.buttonProperties) { addSubView(drawer, subButton); } } @@ -233,23 +237,20 @@ public class ControlLayout extends FrameLayout return children; } - ControlButton lastControlButton = null; + HashMap mapTable = new HashMap<>(); //While this is called onTouch, this should only be called from a ControlButton. - public boolean onTouch(MotionEvent ev) { + public boolean onTouch(View v, MotionEvent ev) { + ControlButton lastControlButton = mapTable.get(v); + + //Check if the action is cancelling, reset the lastControl button associated to the view if(ev.getActionMasked() == MotionEvent.ACTION_UP || ev.getActionMasked() == MotionEvent.ACTION_CANCEL){ if(lastControlButton != null) lastControlButton.onTouchEvent(ev); - lastControlButton = null; + mapTable.put(v, null); return true; } if(ev.getActionMasked() != MotionEvent.ACTION_MOVE) return false; - ArrayList children = getButtonChildren(); - /* - Log.d("getX LAYOUT_CONTROL", String.valueOf(ev.getX())); - Log.d("getY LAYOUT_CONTROL", String.valueOf(ev.getY())); - Log.d("getRawX LAYOUT_CONTROL", String.valueOf(ev.getRawX())); - Log.d("getRawY LAYOUT_CONTROL", String.valueOf(ev.getRawY())); - */ + //Optimization pass to avoid looking at all children again if(lastControlButton != null){ if( ev.getRawX() > lastControlButton.getX() && ev.getRawX() < lastControlButton.getX() + lastControlButton.getWidth() && @@ -258,19 +259,17 @@ public class ControlLayout extends FrameLayout } } - for(ControlButton button : children){ - /* - Log.d("Left: LAYOUT_CONTROL", String.valueOf(button.getLeft())); - Log.d("TOP: LAYOUT_CONTROL", String.valueOf(button.getTop())); - Log.d("RIGHT: LAYOUT_CONTROL", String.valueOf(button.getRight())); - Log.d("BOTTOM: LAYOUT_CONTROL", String.valueOf(button.getBottom())); - */ + + + //Look for another SWIPEABLE button + for(ControlButton button : getButtonChildren()){ if(!button.getProperties().isSwipeable) continue; + if( ev.getRawX() > button.getX() && ev.getRawX() < button.getX() + button.getWidth() && ev.getRawY() > button.getY() && ev.getRawY() < button.getY() + button.getHeight()){ - System.out.println("FOUND ONE !"); - //Button hovered; + + //Release the last key, press the new one if(!button.equals(lastControlButton)){ ev.setAction(MotionEvent.ACTION_POINTER_UP); if (lastControlButton != null) lastControlButton.onTouchEvent(ev); @@ -278,7 +277,7 @@ public class ControlLayout extends FrameLayout ev.setAction(MotionEvent.ACTION_POINTER_DOWN); button.onTouchEvent(ev); - lastControlButton = button; + mapTable.put(v, button); } return true; } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java index 563a5ecc1..e3d2eb787 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java @@ -260,13 +260,13 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp } } isPointerOutOfBounds = true; - ((ControlLayout) getParent()).onTouch(event); + ((ControlLayout) getParent()).onTouch(this, event); break; } //Else if we now are in bounds if(isPointerOutOfBounds) { - ((ControlLayout) getParent()).onTouch(event); + ((ControlLayout) getParent()).onTouch(this, event); //RE-press the button if(mProperties.isSwipeable && !mProperties.isToggle){ setHolding(true); @@ -287,7 +287,7 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp case MotionEvent.ACTION_UP: // 1 case MotionEvent.ACTION_CANCEL: // 3 case MotionEvent.ACTION_POINTER_UP: // 6 - if(isPointerOutOfBounds) ((ControlLayout) getParent()).onTouch(event); + if(isPointerOutOfBounds) ((ControlLayout) getParent()).onTouch(this, event); isPointerOutOfBounds = false; if(!triggerToggle(event)) { From b5134c97d332c5c18d8900def034bde5c9d62027 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Mon, 5 Jul 2021 17:45:24 +0200 Subject: [PATCH 132/179] Revert "More memory optimisations :eyes:" This reverts commit 59b33333118e2d8a6651a4774e21f9855970535b. --- .../kdt/pojavlaunch/AndroidLWJGLKeycode.java | 224 +++++++++--------- 1 file changed, 112 insertions(+), 112 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AndroidLWJGLKeycode.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AndroidLWJGLKeycode.java index acfb6c00a..9b30d29b6 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AndroidLWJGLKeycode.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AndroidLWJGLKeycode.java @@ -12,151 +12,151 @@ import org.lwjgl.glfw.*; public class AndroidLWJGLKeycode { // Fix double letters on MC 1.9 and above public static boolean isBackspaceAfterChar = true; - public static final ArrayMap androidToLwjglMap; + public static final ArrayMap androidToLwjglMap; public static String[] androidKeyNameArray; static { // Mapping Android Keycodes to LWJGL Keycodes androidToLwjglMap = new ArrayMap<>(); - + // 0-9 keys - androidToLwjglMap.put((short)KeyEvent.KEYCODE_0, LWJGLGLFWKeycode.GLFW_KEY_0); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_1, LWJGLGLFWKeycode.GLFW_KEY_1); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_2, LWJGLGLFWKeycode.GLFW_KEY_2); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_3, LWJGLGLFWKeycode.GLFW_KEY_3); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_4, LWJGLGLFWKeycode.GLFW_KEY_4); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_5, LWJGLGLFWKeycode.GLFW_KEY_5); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_6, LWJGLGLFWKeycode.GLFW_KEY_6); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_7, LWJGLGLFWKeycode.GLFW_KEY_7); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_8, LWJGLGLFWKeycode.GLFW_KEY_8); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_9, LWJGLGLFWKeycode.GLFW_KEY_9); + androidToLwjglMap.put(KeyEvent.KEYCODE_0, LWJGLGLFWKeycode.GLFW_KEY_0); + androidToLwjglMap.put(KeyEvent.KEYCODE_1, LWJGLGLFWKeycode.GLFW_KEY_1); + androidToLwjglMap.put(KeyEvent.KEYCODE_2, LWJGLGLFWKeycode.GLFW_KEY_2); + androidToLwjglMap.put(KeyEvent.KEYCODE_3, LWJGLGLFWKeycode.GLFW_KEY_3); + androidToLwjglMap.put(KeyEvent.KEYCODE_4, LWJGLGLFWKeycode.GLFW_KEY_4); + androidToLwjglMap.put(KeyEvent.KEYCODE_5, LWJGLGLFWKeycode.GLFW_KEY_5); + androidToLwjglMap.put(KeyEvent.KEYCODE_6, LWJGLGLFWKeycode.GLFW_KEY_6); + androidToLwjglMap.put(KeyEvent.KEYCODE_7, LWJGLGLFWKeycode.GLFW_KEY_7); + androidToLwjglMap.put(KeyEvent.KEYCODE_8, LWJGLGLFWKeycode.GLFW_KEY_8); + androidToLwjglMap.put(KeyEvent.KEYCODE_9, LWJGLGLFWKeycode.GLFW_KEY_9); // A-Z keys - androidToLwjglMap.put((short)KeyEvent.KEYCODE_A, LWJGLGLFWKeycode.GLFW_KEY_A); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_B, LWJGLGLFWKeycode.GLFW_KEY_B); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_C, LWJGLGLFWKeycode.GLFW_KEY_C); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_D, LWJGLGLFWKeycode.GLFW_KEY_D); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_E, LWJGLGLFWKeycode.GLFW_KEY_E); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_F, LWJGLGLFWKeycode.GLFW_KEY_F); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_G, LWJGLGLFWKeycode.GLFW_KEY_G); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_H, LWJGLGLFWKeycode.GLFW_KEY_H); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_I, LWJGLGLFWKeycode.GLFW_KEY_I); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_J, LWJGLGLFWKeycode.GLFW_KEY_J); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_K, LWJGLGLFWKeycode.GLFW_KEY_K); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_L, LWJGLGLFWKeycode.GLFW_KEY_L); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_M, LWJGLGLFWKeycode.GLFW_KEY_M); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_N, LWJGLGLFWKeycode.GLFW_KEY_N); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_O, LWJGLGLFWKeycode.GLFW_KEY_O); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_P, LWJGLGLFWKeycode.GLFW_KEY_P); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_Q, LWJGLGLFWKeycode.GLFW_KEY_Q); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_R, LWJGLGLFWKeycode.GLFW_KEY_R); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_S, LWJGLGLFWKeycode.GLFW_KEY_S); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_T, LWJGLGLFWKeycode.GLFW_KEY_T); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_U, LWJGLGLFWKeycode.GLFW_KEY_U); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_V, LWJGLGLFWKeycode.GLFW_KEY_V); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_W, LWJGLGLFWKeycode.GLFW_KEY_W); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_X, LWJGLGLFWKeycode.GLFW_KEY_X); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_Y, LWJGLGLFWKeycode.GLFW_KEY_Y); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_Z, LWJGLGLFWKeycode.GLFW_KEY_Z); + androidToLwjglMap.put(KeyEvent.KEYCODE_A, LWJGLGLFWKeycode.GLFW_KEY_A); + androidToLwjglMap.put(KeyEvent.KEYCODE_B, LWJGLGLFWKeycode.GLFW_KEY_B); + androidToLwjglMap.put(KeyEvent.KEYCODE_C, LWJGLGLFWKeycode.GLFW_KEY_C); + androidToLwjglMap.put(KeyEvent.KEYCODE_D, LWJGLGLFWKeycode.GLFW_KEY_D); + androidToLwjglMap.put(KeyEvent.KEYCODE_E, LWJGLGLFWKeycode.GLFW_KEY_E); + androidToLwjglMap.put(KeyEvent.KEYCODE_F, LWJGLGLFWKeycode.GLFW_KEY_F); + androidToLwjglMap.put(KeyEvent.KEYCODE_G, LWJGLGLFWKeycode.GLFW_KEY_G); + androidToLwjglMap.put(KeyEvent.KEYCODE_H, LWJGLGLFWKeycode.GLFW_KEY_H); + androidToLwjglMap.put(KeyEvent.KEYCODE_I, LWJGLGLFWKeycode.GLFW_KEY_I); + androidToLwjglMap.put(KeyEvent.KEYCODE_J, LWJGLGLFWKeycode.GLFW_KEY_J); + androidToLwjglMap.put(KeyEvent.KEYCODE_K, LWJGLGLFWKeycode.GLFW_KEY_K); + androidToLwjglMap.put(KeyEvent.KEYCODE_L, LWJGLGLFWKeycode.GLFW_KEY_L); + androidToLwjglMap.put(KeyEvent.KEYCODE_M, LWJGLGLFWKeycode.GLFW_KEY_M); + androidToLwjglMap.put(KeyEvent.KEYCODE_N, LWJGLGLFWKeycode.GLFW_KEY_N); + androidToLwjglMap.put(KeyEvent.KEYCODE_O, LWJGLGLFWKeycode.GLFW_KEY_O); + androidToLwjglMap.put(KeyEvent.KEYCODE_P, LWJGLGLFWKeycode.GLFW_KEY_P); + androidToLwjglMap.put(KeyEvent.KEYCODE_Q, LWJGLGLFWKeycode.GLFW_KEY_Q); + androidToLwjglMap.put(KeyEvent.KEYCODE_R, LWJGLGLFWKeycode.GLFW_KEY_R); + androidToLwjglMap.put(KeyEvent.KEYCODE_S, LWJGLGLFWKeycode.GLFW_KEY_S); + androidToLwjglMap.put(KeyEvent.KEYCODE_T, LWJGLGLFWKeycode.GLFW_KEY_T); + androidToLwjglMap.put(KeyEvent.KEYCODE_U, LWJGLGLFWKeycode.GLFW_KEY_U); + androidToLwjglMap.put(KeyEvent.KEYCODE_V, LWJGLGLFWKeycode.GLFW_KEY_V); + androidToLwjglMap.put(KeyEvent.KEYCODE_W, LWJGLGLFWKeycode.GLFW_KEY_W); + androidToLwjglMap.put(KeyEvent.KEYCODE_X, LWJGLGLFWKeycode.GLFW_KEY_X); + androidToLwjglMap.put(KeyEvent.KEYCODE_Y, LWJGLGLFWKeycode.GLFW_KEY_Y); + androidToLwjglMap.put(KeyEvent.KEYCODE_Z, LWJGLGLFWKeycode.GLFW_KEY_Z); // Alt keys - androidToLwjglMap.put((short)KeyEvent.KEYCODE_ALT_LEFT, LWJGLGLFWKeycode.GLFW_KEY_LEFT_ALT); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_ALT_RIGHT, LWJGLGLFWKeycode.GLFW_KEY_RIGHT_ALT); + androidToLwjglMap.put(KeyEvent.KEYCODE_ALT_LEFT, LWJGLGLFWKeycode.GLFW_KEY_LEFT_ALT); + androidToLwjglMap.put(KeyEvent.KEYCODE_ALT_RIGHT, LWJGLGLFWKeycode.GLFW_KEY_RIGHT_ALT); // Escape key - androidToLwjglMap.put((short)KeyEvent.KEYCODE_BACK, LWJGLGLFWKeycode.GLFW_KEY_ESCAPE); + androidToLwjglMap.put(KeyEvent.KEYCODE_BACK, LWJGLGLFWKeycode.GLFW_KEY_ESCAPE); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_BACKSLASH, LWJGLGLFWKeycode.GLFW_KEY_BACKSLASH); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_BREAK, LWJGLGLFWKeycode.GLFW_KEY_PAUSE); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_CAPS_LOCK, LWJGLGLFWKeycode.GLFW_KEY_CAPS_LOCK); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_COMMA, LWJGLGLFWKeycode.GLFW_KEY_COMMA); + androidToLwjglMap.put(KeyEvent.KEYCODE_BACKSLASH, LWJGLGLFWKeycode.GLFW_KEY_BACKSLASH); + androidToLwjglMap.put(KeyEvent.KEYCODE_BREAK, LWJGLGLFWKeycode.GLFW_KEY_PAUSE); + androidToLwjglMap.put(KeyEvent.KEYCODE_CAPS_LOCK, LWJGLGLFWKeycode.GLFW_KEY_CAPS_LOCK); + androidToLwjglMap.put(KeyEvent.KEYCODE_COMMA, LWJGLGLFWKeycode.GLFW_KEY_COMMA); // Control keys - androidToLwjglMap.put((short)KeyEvent.KEYCODE_CTRL_LEFT, LWJGLGLFWKeycode.GLFW_KEY_LEFT_CONTROL); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_CTRL_RIGHT, LWJGLGLFWKeycode.GLFW_KEY_RIGHT_CONTROL); + androidToLwjglMap.put(KeyEvent.KEYCODE_CTRL_LEFT, LWJGLGLFWKeycode.GLFW_KEY_LEFT_CONTROL); + androidToLwjglMap.put(KeyEvent.KEYCODE_CTRL_RIGHT, LWJGLGLFWKeycode.GLFW_KEY_RIGHT_CONTROL); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_DEL, LWJGLGLFWKeycode.GLFW_KEY_BACKSPACE); // Backspace + androidToLwjglMap.put(KeyEvent.KEYCODE_DEL, LWJGLGLFWKeycode.GLFW_KEY_BACKSPACE); // Backspace // Arrow keys - androidToLwjglMap.put((short)KeyEvent.KEYCODE_DPAD_DOWN, LWJGLGLFWKeycode.GLFW_KEY_DOWN); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_DPAD_LEFT, LWJGLGLFWKeycode.GLFW_KEY_LEFT); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_DPAD_RIGHT, LWJGLGLFWKeycode.GLFW_KEY_RIGHT); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_DPAD_UP, LWJGLGLFWKeycode.GLFW_KEY_UP); + androidToLwjglMap.put(KeyEvent.KEYCODE_DPAD_DOWN, LWJGLGLFWKeycode.GLFW_KEY_DOWN); + androidToLwjglMap.put(KeyEvent.KEYCODE_DPAD_LEFT, LWJGLGLFWKeycode.GLFW_KEY_LEFT); + androidToLwjglMap.put(KeyEvent.KEYCODE_DPAD_RIGHT, LWJGLGLFWKeycode.GLFW_KEY_RIGHT); + androidToLwjglMap.put(KeyEvent.KEYCODE_DPAD_UP, LWJGLGLFWKeycode.GLFW_KEY_UP); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_ENTER, LWJGLGLFWKeycode.GLFW_KEY_ENTER); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_EQUALS, LWJGLGLFWKeycode.GLFW_KEY_EQUAL); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_ESCAPE, LWJGLGLFWKeycode.GLFW_KEY_ESCAPE); + androidToLwjglMap.put(KeyEvent.KEYCODE_ENTER, LWJGLGLFWKeycode.GLFW_KEY_ENTER); + androidToLwjglMap.put(KeyEvent.KEYCODE_EQUALS, LWJGLGLFWKeycode.GLFW_KEY_EQUAL); + androidToLwjglMap.put(KeyEvent.KEYCODE_ESCAPE, LWJGLGLFWKeycode.GLFW_KEY_ESCAPE); // Fn keys - androidToLwjglMap.put((short)KeyEvent.KEYCODE_F1, LWJGLGLFWKeycode.GLFW_KEY_F1); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_F2, LWJGLGLFWKeycode.GLFW_KEY_F2); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_F3, LWJGLGLFWKeycode.GLFW_KEY_F3); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_F4, LWJGLGLFWKeycode.GLFW_KEY_F4); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_F5, LWJGLGLFWKeycode.GLFW_KEY_F5); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_F6, LWJGLGLFWKeycode.GLFW_KEY_F6); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_F7, LWJGLGLFWKeycode.GLFW_KEY_F7); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_F8, LWJGLGLFWKeycode.GLFW_KEY_F8); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_F9, LWJGLGLFWKeycode.GLFW_KEY_F9); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_F10, LWJGLGLFWKeycode.GLFW_KEY_F10); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_F11, LWJGLGLFWKeycode.GLFW_KEY_F11); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_F12, LWJGLGLFWKeycode.GLFW_KEY_F12); + androidToLwjglMap.put(KeyEvent.KEYCODE_F1, LWJGLGLFWKeycode.GLFW_KEY_F1); + androidToLwjglMap.put(KeyEvent.KEYCODE_F2, LWJGLGLFWKeycode.GLFW_KEY_F2); + androidToLwjglMap.put(KeyEvent.KEYCODE_F3, LWJGLGLFWKeycode.GLFW_KEY_F3); + androidToLwjglMap.put(KeyEvent.KEYCODE_F4, LWJGLGLFWKeycode.GLFW_KEY_F4); + androidToLwjglMap.put(KeyEvent.KEYCODE_F5, LWJGLGLFWKeycode.GLFW_KEY_F5); + androidToLwjglMap.put(KeyEvent.KEYCODE_F6, LWJGLGLFWKeycode.GLFW_KEY_F6); + androidToLwjglMap.put(KeyEvent.KEYCODE_F7, LWJGLGLFWKeycode.GLFW_KEY_F7); + androidToLwjglMap.put(KeyEvent.KEYCODE_F8, LWJGLGLFWKeycode.GLFW_KEY_F8); + androidToLwjglMap.put(KeyEvent.KEYCODE_F9, LWJGLGLFWKeycode.GLFW_KEY_F9); + androidToLwjglMap.put(KeyEvent.KEYCODE_F10, LWJGLGLFWKeycode.GLFW_KEY_F10); + androidToLwjglMap.put(KeyEvent.KEYCODE_F11, LWJGLGLFWKeycode.GLFW_KEY_F11); + androidToLwjglMap.put(KeyEvent.KEYCODE_F12, LWJGLGLFWKeycode.GLFW_KEY_F12); // FIXME GLFW Function key - // androidToLwjglMap.put((short)KeyEvent.KEYCODE_FUNCTION, LWJGLGLFWKeycode.GLFW_KEY_FUNCTION); + // androidToLwjglMap.put(KeyEvent.KEYCODE_FUNCTION, LWJGLGLFWKeycode.GLFW_KEY_FUNCTION); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_GRAVE, LWJGLGLFWKeycode.GLFW_KEY_GRAVE_ACCENT); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_HOME, LWJGLGLFWKeycode.GLFW_KEY_HOME); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_INSERT, LWJGLGLFWKeycode.GLFW_KEY_INSERT); - //androidToLwjglMap.put((short)KeyEvent.KEYCODE_KANA, LWJGLGLFWKeycode.GLFW_KEY_K); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_LEFT_BRACKET, LWJGLGLFWKeycode.GLFW_KEY_LEFT_BRACKET); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_MINUS, LWJGLGLFWKeycode.GLFW_KEY_MINUS); + androidToLwjglMap.put(KeyEvent.KEYCODE_GRAVE, LWJGLGLFWKeycode.GLFW_KEY_GRAVE_ACCENT); + androidToLwjglMap.put(KeyEvent.KEYCODE_HOME, LWJGLGLFWKeycode.GLFW_KEY_HOME); + androidToLwjglMap.put(KeyEvent.KEYCODE_INSERT, LWJGLGLFWKeycode.GLFW_KEY_INSERT); + //androidToLwjglMap.put(KeyEvent.KEYCODE_KANA, LWJGLGLFWKeycode.GLFW_KEY_K); + androidToLwjglMap.put(KeyEvent.KEYCODE_LEFT_BRACKET, LWJGLGLFWKeycode.GLFW_KEY_LEFT_BRACKET); + androidToLwjglMap.put(KeyEvent.KEYCODE_MINUS, LWJGLGLFWKeycode.GLFW_KEY_MINUS); // Num keys - androidToLwjglMap.put((short)KeyEvent.KEYCODE_NUM_LOCK, LWJGLGLFWKeycode.GLFW_KEY_NUM_LOCK); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_NUMPAD_0, LWJGLGLFWKeycode.GLFW_KEY_0); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_NUMPAD_1, LWJGLGLFWKeycode.GLFW_KEY_1); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_NUMPAD_2, LWJGLGLFWKeycode.GLFW_KEY_2); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_NUMPAD_3, LWJGLGLFWKeycode.GLFW_KEY_3); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_NUMPAD_4, LWJGLGLFWKeycode.GLFW_KEY_4); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_NUMPAD_5, LWJGLGLFWKeycode.GLFW_KEY_5); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_NUMPAD_6, LWJGLGLFWKeycode.GLFW_KEY_6); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_NUMPAD_7, LWJGLGLFWKeycode.GLFW_KEY_7); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_NUMPAD_8, LWJGLGLFWKeycode.GLFW_KEY_8); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_NUMPAD_9, LWJGLGLFWKeycode.GLFW_KEY_9); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_NUMPAD_ADD, LWJGLGLFWKeycode.GLFW_KEY_KP_ADD); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_NUMPAD_COMMA, LWJGLGLFWKeycode.GLFW_KEY_COMMA); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_NUMPAD_DIVIDE, LWJGLGLFWKeycode.GLFW_KEY_KP_DIVIDE); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_NUMPAD_DOT, LWJGLGLFWKeycode.GLFW_KEY_PERIOD); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_NUMPAD_ENTER, LWJGLGLFWKeycode.GLFW_KEY_ENTER); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_NUMPAD_EQUALS, LWJGLGLFWKeycode.GLFW_KEY_EQUAL); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_NUMPAD_MULTIPLY, LWJGLGLFWKeycode.GLFW_KEY_KP_MULTIPLY); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_NUMPAD_SUBTRACT, LWJGLGLFWKeycode.GLFW_KEY_KP_SUBTRACT); + androidToLwjglMap.put(KeyEvent.KEYCODE_NUM_LOCK, LWJGLGLFWKeycode.GLFW_KEY_NUM_LOCK); + androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_0, LWJGLGLFWKeycode.GLFW_KEY_0); + androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_1, LWJGLGLFWKeycode.GLFW_KEY_1); + androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_2, LWJGLGLFWKeycode.GLFW_KEY_2); + androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_3, LWJGLGLFWKeycode.GLFW_KEY_3); + androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_4, LWJGLGLFWKeycode.GLFW_KEY_4); + androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_5, LWJGLGLFWKeycode.GLFW_KEY_5); + androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_6, LWJGLGLFWKeycode.GLFW_KEY_6); + androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_7, LWJGLGLFWKeycode.GLFW_KEY_7); + androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_8, LWJGLGLFWKeycode.GLFW_KEY_8); + androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_9, LWJGLGLFWKeycode.GLFW_KEY_9); + androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_ADD, LWJGLGLFWKeycode.GLFW_KEY_KP_ADD); + androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_COMMA, LWJGLGLFWKeycode.GLFW_KEY_COMMA); + androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_DIVIDE, LWJGLGLFWKeycode.GLFW_KEY_KP_DIVIDE); + androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_DOT, LWJGLGLFWKeycode.GLFW_KEY_PERIOD); + androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_ENTER, LWJGLGLFWKeycode.GLFW_KEY_ENTER); + androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_EQUALS, LWJGLGLFWKeycode.GLFW_KEY_EQUAL); + androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_MULTIPLY, LWJGLGLFWKeycode.GLFW_KEY_KP_MULTIPLY); + androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_SUBTRACT, LWJGLGLFWKeycode.GLFW_KEY_KP_SUBTRACT); // Page keys - androidToLwjglMap.put((short)KeyEvent.KEYCODE_PAGE_DOWN, LWJGLGLFWKeycode.GLFW_KEY_PAGE_DOWN); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_PAGE_UP, LWJGLGLFWKeycode.GLFW_KEY_PAGE_UP); + androidToLwjglMap.put(KeyEvent.KEYCODE_PAGE_DOWN, LWJGLGLFWKeycode.GLFW_KEY_PAGE_DOWN); + androidToLwjglMap.put(KeyEvent.KEYCODE_PAGE_UP, LWJGLGLFWKeycode.GLFW_KEY_PAGE_UP); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_PERIOD, LWJGLGLFWKeycode.GLFW_KEY_PERIOD); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_PLUS, LWJGLGLFWKeycode.GLFW_KEY_KP_ADD); - // androidToLwjglMap.put((short)KeyEvent.KEYCODE_POWER, LWJGLGLFWKeycode.GLFW_KEY_POWER); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_RIGHT_BRACKET, LWJGLGLFWKeycode.GLFW_KEY_RIGHT_BRACKET); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_SEMICOLON, LWJGLGLFWKeycode.GLFW_KEY_SEMICOLON); + androidToLwjglMap.put(KeyEvent.KEYCODE_PERIOD, LWJGLGLFWKeycode.GLFW_KEY_PERIOD); + androidToLwjglMap.put(KeyEvent.KEYCODE_PLUS, LWJGLGLFWKeycode.GLFW_KEY_KP_ADD); + // androidToLwjglMap.put(KeyEvent.KEYCODE_POWER, LWJGLGLFWKeycode.GLFW_KEY_POWER); + androidToLwjglMap.put(KeyEvent.KEYCODE_RIGHT_BRACKET, LWJGLGLFWKeycode.GLFW_KEY_RIGHT_BRACKET); + androidToLwjglMap.put(KeyEvent.KEYCODE_SEMICOLON, LWJGLGLFWKeycode.GLFW_KEY_SEMICOLON); // Shift keys - androidToLwjglMap.put((short)KeyEvent.KEYCODE_SHIFT_LEFT, LWJGLGLFWKeycode.GLFW_KEY_LEFT_SHIFT); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_SHIFT_RIGHT, LWJGLGLFWKeycode.GLFW_KEY_RIGHT_SHIFT); + androidToLwjglMap.put(KeyEvent.KEYCODE_SHIFT_LEFT, LWJGLGLFWKeycode.GLFW_KEY_LEFT_SHIFT); + androidToLwjglMap.put(KeyEvent.KEYCODE_SHIFT_RIGHT, LWJGLGLFWKeycode.GLFW_KEY_RIGHT_SHIFT); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_SLASH, LWJGLGLFWKeycode.GLFW_KEY_SLASH); - // androidToLwjglMap.put((short)KeyEvent.KEYCODE_SLEEP, LWJGLGLFWKeycode.GLFW_KEY_SLEEP); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_SPACE, LWJGLGLFWKeycode.GLFW_KEY_SPACE); - // androidToLwjglMap.put((short)KeyEvent.KEYCODE_SYSRQ, LWJGLGLFWKeycode.GLFW_KEY_SYSRQ); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_TAB, LWJGLGLFWKeycode.GLFW_KEY_TAB); - // androidToLwjglMap.put((short)KeyEvent.KEYCODE_YEN, LWJGLGLFWKeycode.GLFW_KEY_YEN); + androidToLwjglMap.put(KeyEvent.KEYCODE_SLASH, LWJGLGLFWKeycode.GLFW_KEY_SLASH); + // androidToLwjglMap.put(KeyEvent.KEYCODE_SLEEP, LWJGLGLFWKeycode.GLFW_KEY_SLEEP); + androidToLwjglMap.put(KeyEvent.KEYCODE_SPACE, LWJGLGLFWKeycode.GLFW_KEY_SPACE); + // androidToLwjglMap.put(KeyEvent.KEYCODE_SYSRQ, LWJGLGLFWKeycode.GLFW_KEY_SYSRQ); + androidToLwjglMap.put(KeyEvent.KEYCODE_TAB, LWJGLGLFWKeycode.GLFW_KEY_TAB); + // androidToLwjglMap.put(KeyEvent.KEYCODE_YEN, LWJGLGLFWKeycode.GLFW_KEY_YEN); - // androidToLwjglMap.put((short)KeyEvent.KEYCODE_BUTTON_1, LWJGLGLFWKeycode.G - androidToLwjglMap.put((short)KeyEvent.KEYCODE_AT,LWJGLGLFWKeycode.GLFW_KEY_2); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_POUND,LWJGLGLFWKeycode.GLFW_KEY_3); + // androidToLwjglMap.put(KeyEvent.KEYCODE_BUTTON_1, LWJGLGLFWKeycode.G + androidToLwjglMap.put(KeyEvent.KEYCODE_AT,LWJGLGLFWKeycode.GLFW_KEY_2); + androidToLwjglMap.put(KeyEvent.KEYCODE_POUND,LWJGLGLFWKeycode.GLFW_KEY_3); - androidToLwjglMap.put((short)KeyEvent.KEYCODE_UNKNOWN,LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN); + androidToLwjglMap.put(KeyEvent.KEYCODE_UNKNOWN,LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN); } From 78c829bbbf81b56720a11b16e385afa362d74f5c Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Mon, 5 Jul 2021 18:23:31 +0200 Subject: [PATCH 133/179] Fix last swipped in key still being pressed --- .../kdt/pojavlaunch/customcontrols/ControlLayout.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java index 584afcda7..924d4ba28 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java @@ -259,8 +259,10 @@ public class ControlLayout extends FrameLayout } } - - + //Release the last key + ev.setAction(MotionEvent.ACTION_POINTER_UP); + if (lastControlButton != null) lastControlButton.onTouchEvent(ev); + mapTable.put(v, null); //Look for another SWIPEABLE button for(ControlButton button : getButtonChildren()){ @@ -269,11 +271,8 @@ public class ControlLayout extends FrameLayout if( ev.getRawX() > button.getX() && ev.getRawX() < button.getX() + button.getWidth() && ev.getRawY() > button.getY() && ev.getRawY() < button.getY() + button.getHeight()){ - //Release the last key, press the new one + //Press the new key if(!button.equals(lastControlButton)){ - ev.setAction(MotionEvent.ACTION_POINTER_UP); - if (lastControlButton != null) lastControlButton.onTouchEvent(ev); - ev.setAction(MotionEvent.ACTION_POINTER_DOWN); button.onTouchEvent(ev); From 8dd07ff3b4dd9d52a1528979cb4dc1d141d2ffc5 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Mon, 5 Jul 2021 19:51:17 +0200 Subject: [PATCH 134/179] Fix subButton behavior in edit mode --- .../buttons/ControlSubButton.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlSubButton.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlSubButton.java index b15f1327e..636be1a60 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlSubButton.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlSubButton.java @@ -2,9 +2,12 @@ package net.kdt.pojavlaunch.customcontrols.buttons; import android.os.Handler; import android.os.Looper; +import android.view.GestureDetector; +import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; +import net.kdt.pojavlaunch.SingleTapConfirm; import net.kdt.pojavlaunch.customcontrols.ControlData; import net.kdt.pojavlaunch.customcontrols.ControlLayout; @@ -42,8 +45,21 @@ public class ControlSubButton extends ControlButton { params.width = (int)parentDrawer.mProperties.getWidth(); params.height = (int)parentDrawer.mProperties.getHeight(); } - super.setLayoutParams(params); + } + @Override + public boolean onTouchEvent(MotionEvent event) { + if(!mModifiable){ + return super.onTouchEvent(event); + } + + if(mGestureDetector == null) mGestureDetector = new GestureDetector(getContext(), new SingleTapConfirm()); + + if (mGestureDetector.onTouchEvent(event)) { + mCanTriggerLongClick = true; + onLongClick(this); + } + return true; } } From c389dd9bb9ae762e64ce7933ab464e57d825800f Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Mon, 5 Jul 2021 21:11:46 +0200 Subject: [PATCH 135/179] Fix GUI button being invisible when in a drawer and the gui was hidden --- .../pojavlaunch/customcontrols/buttons/ControlSubButton.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlSubButton.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlSubButton.java index 636be1a60..1692df4a3 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlSubButton.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlSubButton.java @@ -36,7 +36,7 @@ public class ControlSubButton extends ControlButton { @Override public void setVisible(boolean isVisible) { - setVisibility(isVisible ? (parentDrawer.areButtonsVisible ? VISIBLE : GONE) : View.GONE); + setVisibility(isVisible ? (parentDrawer.areButtonsVisible ? VISIBLE : GONE) : (!mProperties.isHideable && parentDrawer.getVisibility() == GONE) ? VISIBLE : View.GONE); } @Override From bf2670aa89610b3e2ad40b73997c88250234b24c Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Tue, 6 Jul 2021 16:39:23 +0200 Subject: [PATCH 136/179] Add a slightly more efficient LWJGL Keycode converter. --- .../EfficientAndroidLWJGLKeycode.java | 246 ++++++++++++++++++ 1 file changed, 246 insertions(+) create mode 100644 app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/EfficientAndroidLWJGLKeycode.java diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/EfficientAndroidLWJGLKeycode.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/EfficientAndroidLWJGLKeycode.java new file mode 100644 index 000000000..da4d5038c --- /dev/null +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/EfficientAndroidLWJGLKeycode.java @@ -0,0 +1,246 @@ +package net.kdt.pojavlaunch; + +import android.view.KeyEvent; + +import net.kdt.pojavlaunch.prefs.LauncherPreferences; + +import org.lwjgl.glfw.CallbackBridge; + +public class EfficientAndroidLWJGLKeycode { + private static final int[] androidKeycodes = new int[103]; + private static final short[] LWJGLKeycodes = new short[androidKeycodes.length]; + private static String[] androidKeyNameArray; /* = new String[androidKeycodes.length]; */ + + static { + /* BINARY SEARCH IS PERFORMED ON THE androidKeycodes ARRAY ! + WHEN ADDING A MAPPING, ADD IT SO THE androidKeycodes ARRAY STAYS SORTED ! */ + // Mapping Android Keycodes to LWJGL Keycodes + + add(KeyEvent.KEYCODE_UNKNOWN,LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN); + add(KeyEvent.KEYCODE_HOME, LWJGLGLFWKeycode.GLFW_KEY_HOME); + // Escape key + add(KeyEvent.KEYCODE_BACK, LWJGLGLFWKeycode.GLFW_KEY_ESCAPE); + + // 0-9 keys + add(KeyEvent.KEYCODE_0, LWJGLGLFWKeycode.GLFW_KEY_0); //7 + add(KeyEvent.KEYCODE_1, LWJGLGLFWKeycode.GLFW_KEY_1); + add(KeyEvent.KEYCODE_2, LWJGLGLFWKeycode.GLFW_KEY_2); + add(KeyEvent.KEYCODE_3, LWJGLGLFWKeycode.GLFW_KEY_3); + add(KeyEvent.KEYCODE_4, LWJGLGLFWKeycode.GLFW_KEY_4); + add(KeyEvent.KEYCODE_5, LWJGLGLFWKeycode.GLFW_KEY_5); + add(KeyEvent.KEYCODE_6, LWJGLGLFWKeycode.GLFW_KEY_6); + add(KeyEvent.KEYCODE_7, LWJGLGLFWKeycode.GLFW_KEY_7); + add(KeyEvent.KEYCODE_8, LWJGLGLFWKeycode.GLFW_KEY_8); + add(KeyEvent.KEYCODE_9, LWJGLGLFWKeycode.GLFW_KEY_9); //16 + + add(KeyEvent.KEYCODE_POUND,LWJGLGLFWKeycode.GLFW_KEY_3); + + // Arrow keys + add(KeyEvent.KEYCODE_DPAD_UP, LWJGLGLFWKeycode.GLFW_KEY_UP); //19 + add(KeyEvent.KEYCODE_DPAD_DOWN, LWJGLGLFWKeycode.GLFW_KEY_DOWN); + add(KeyEvent.KEYCODE_DPAD_LEFT, LWJGLGLFWKeycode.GLFW_KEY_LEFT); + add(KeyEvent.KEYCODE_DPAD_RIGHT, LWJGLGLFWKeycode.GLFW_KEY_RIGHT); //22 + + // A-Z keys + add(KeyEvent.KEYCODE_A, LWJGLGLFWKeycode.GLFW_KEY_A); //29 + add(KeyEvent.KEYCODE_B, LWJGLGLFWKeycode.GLFW_KEY_B); + add(KeyEvent.KEYCODE_C, LWJGLGLFWKeycode.GLFW_KEY_C); + add(KeyEvent.KEYCODE_D, LWJGLGLFWKeycode.GLFW_KEY_D); + add(KeyEvent.KEYCODE_E, LWJGLGLFWKeycode.GLFW_KEY_E); + add(KeyEvent.KEYCODE_F, LWJGLGLFWKeycode.GLFW_KEY_F); + add(KeyEvent.KEYCODE_G, LWJGLGLFWKeycode.GLFW_KEY_G); + add(KeyEvent.KEYCODE_H, LWJGLGLFWKeycode.GLFW_KEY_H); + add(KeyEvent.KEYCODE_I, LWJGLGLFWKeycode.GLFW_KEY_I); + add(KeyEvent.KEYCODE_J, LWJGLGLFWKeycode.GLFW_KEY_J); + add(KeyEvent.KEYCODE_K, LWJGLGLFWKeycode.GLFW_KEY_K); + add(KeyEvent.KEYCODE_L, LWJGLGLFWKeycode.GLFW_KEY_L); + add(KeyEvent.KEYCODE_M, LWJGLGLFWKeycode.GLFW_KEY_M); + add(KeyEvent.KEYCODE_N, LWJGLGLFWKeycode.GLFW_KEY_N); + add(KeyEvent.KEYCODE_O, LWJGLGLFWKeycode.GLFW_KEY_O); + add(KeyEvent.KEYCODE_P, LWJGLGLFWKeycode.GLFW_KEY_P); + add(KeyEvent.KEYCODE_Q, LWJGLGLFWKeycode.GLFW_KEY_Q); + add(KeyEvent.KEYCODE_R, LWJGLGLFWKeycode.GLFW_KEY_R); + add(KeyEvent.KEYCODE_S, LWJGLGLFWKeycode.GLFW_KEY_S); + add(KeyEvent.KEYCODE_T, LWJGLGLFWKeycode.GLFW_KEY_T); + add(KeyEvent.KEYCODE_U, LWJGLGLFWKeycode.GLFW_KEY_U); + add(KeyEvent.KEYCODE_V, LWJGLGLFWKeycode.GLFW_KEY_V); + add(KeyEvent.KEYCODE_W, LWJGLGLFWKeycode.GLFW_KEY_W); + add(KeyEvent.KEYCODE_X, LWJGLGLFWKeycode.GLFW_KEY_X); + add(KeyEvent.KEYCODE_Y, LWJGLGLFWKeycode.GLFW_KEY_Y); + add(KeyEvent.KEYCODE_Z, LWJGLGLFWKeycode.GLFW_KEY_Z); //54 + + + add(KeyEvent.KEYCODE_COMMA, LWJGLGLFWKeycode.GLFW_KEY_COMMA); + + // Alt keys + add(KeyEvent.KEYCODE_ALT_LEFT, LWJGLGLFWKeycode.GLFW_KEY_LEFT_ALT); + add(KeyEvent.KEYCODE_ALT_RIGHT, LWJGLGLFWKeycode.GLFW_KEY_RIGHT_ALT); + + // Shift keys + add(KeyEvent.KEYCODE_SHIFT_LEFT, LWJGLGLFWKeycode.GLFW_KEY_LEFT_SHIFT); + add(KeyEvent.KEYCODE_SHIFT_RIGHT, LWJGLGLFWKeycode.GLFW_KEY_RIGHT_SHIFT); + + add(KeyEvent.KEYCODE_TAB, LWJGLGLFWKeycode.GLFW_KEY_TAB); + add(KeyEvent.KEYCODE_SPACE, LWJGLGLFWKeycode.GLFW_KEY_SPACE); + add(KeyEvent.KEYCODE_ENTER, LWJGLGLFWKeycode.GLFW_KEY_ENTER); //66 + add(KeyEvent.KEYCODE_DEL, LWJGLGLFWKeycode.GLFW_KEY_BACKSPACE); // Backspace + add(KeyEvent.KEYCODE_GRAVE, LWJGLGLFWKeycode.GLFW_KEY_GRAVE_ACCENT); + add(KeyEvent.KEYCODE_MINUS, LWJGLGLFWKeycode.GLFW_KEY_MINUS); + add(KeyEvent.KEYCODE_EQUALS, LWJGLGLFWKeycode.GLFW_KEY_EQUAL); + add(KeyEvent.KEYCODE_LEFT_BRACKET, LWJGLGLFWKeycode.GLFW_KEY_LEFT_BRACKET); + add(KeyEvent.KEYCODE_RIGHT_BRACKET, LWJGLGLFWKeycode.GLFW_KEY_RIGHT_BRACKET); + add(KeyEvent.KEYCODE_BACKSLASH, LWJGLGLFWKeycode.GLFW_KEY_BACKSLASH); + add(KeyEvent.KEYCODE_SEMICOLON, LWJGLGLFWKeycode.GLFW_KEY_SEMICOLON); //74 + + add(KeyEvent.KEYCODE_SLASH, LWJGLGLFWKeycode.GLFW_KEY_SLASH); //76 + add(KeyEvent.KEYCODE_AT,LWJGLGLFWKeycode.GLFW_KEY_2); + + add(KeyEvent.KEYCODE_PLUS, LWJGLGLFWKeycode.GLFW_KEY_KP_ADD); + + // Page keys + add(KeyEvent.KEYCODE_PAGE_UP, LWJGLGLFWKeycode.GLFW_KEY_PAGE_UP); //92 + add(KeyEvent.KEYCODE_PAGE_DOWN, LWJGLGLFWKeycode.GLFW_KEY_PAGE_DOWN); + + add(KeyEvent.KEYCODE_ESCAPE, LWJGLGLFWKeycode.GLFW_KEY_ESCAPE); + + // Control keys + add(KeyEvent.KEYCODE_CTRL_LEFT, LWJGLGLFWKeycode.GLFW_KEY_LEFT_CONTROL); + add(KeyEvent.KEYCODE_CTRL_RIGHT, LWJGLGLFWKeycode.GLFW_KEY_RIGHT_CONTROL); + + add(KeyEvent.KEYCODE_CAPS_LOCK, LWJGLGLFWKeycode.GLFW_KEY_CAPS_LOCK); + add(KeyEvent.KEYCODE_BREAK, LWJGLGLFWKeycode.GLFW_KEY_PAUSE); + add(KeyEvent.KEYCODE_INSERT, LWJGLGLFWKeycode.GLFW_KEY_INSERT); + + // Fn keys + add(KeyEvent.KEYCODE_F1, LWJGLGLFWKeycode.GLFW_KEY_F1); //131 + add(KeyEvent.KEYCODE_F2, LWJGLGLFWKeycode.GLFW_KEY_F2); + add(KeyEvent.KEYCODE_F3, LWJGLGLFWKeycode.GLFW_KEY_F3); + add(KeyEvent.KEYCODE_F4, LWJGLGLFWKeycode.GLFW_KEY_F4); + add(KeyEvent.KEYCODE_F5, LWJGLGLFWKeycode.GLFW_KEY_F5); + add(KeyEvent.KEYCODE_F6, LWJGLGLFWKeycode.GLFW_KEY_F6); + add(KeyEvent.KEYCODE_F7, LWJGLGLFWKeycode.GLFW_KEY_F7); + add(KeyEvent.KEYCODE_F8, LWJGLGLFWKeycode.GLFW_KEY_F8); + add(KeyEvent.KEYCODE_F9, LWJGLGLFWKeycode.GLFW_KEY_F9); + add(KeyEvent.KEYCODE_F10, LWJGLGLFWKeycode.GLFW_KEY_F10); + add(KeyEvent.KEYCODE_F11, LWJGLGLFWKeycode.GLFW_KEY_F11); + add(KeyEvent.KEYCODE_F12, LWJGLGLFWKeycode.GLFW_KEY_F12); //142 + + // Num keys + add(KeyEvent.KEYCODE_NUM_LOCK, LWJGLGLFWKeycode.GLFW_KEY_NUM_LOCK); //143 + add(KeyEvent.KEYCODE_NUMPAD_0, LWJGLGLFWKeycode.GLFW_KEY_0); + add(KeyEvent.KEYCODE_NUMPAD_1, LWJGLGLFWKeycode.GLFW_KEY_1); + add(KeyEvent.KEYCODE_NUMPAD_2, LWJGLGLFWKeycode.GLFW_KEY_2); + add(KeyEvent.KEYCODE_NUMPAD_3, LWJGLGLFWKeycode.GLFW_KEY_3); + add(KeyEvent.KEYCODE_NUMPAD_4, LWJGLGLFWKeycode.GLFW_KEY_4); + add(KeyEvent.KEYCODE_NUMPAD_5, LWJGLGLFWKeycode.GLFW_KEY_5); + add(KeyEvent.KEYCODE_NUMPAD_6, LWJGLGLFWKeycode.GLFW_KEY_6); + add(KeyEvent.KEYCODE_NUMPAD_7, LWJGLGLFWKeycode.GLFW_KEY_7); + add(KeyEvent.KEYCODE_NUMPAD_8, LWJGLGLFWKeycode.GLFW_KEY_8); + add(KeyEvent.KEYCODE_NUMPAD_9, LWJGLGLFWKeycode.GLFW_KEY_9); + add(KeyEvent.KEYCODE_NUMPAD_DIVIDE, LWJGLGLFWKeycode.GLFW_KEY_KP_DIVIDE); + add(KeyEvent.KEYCODE_NUMPAD_MULTIPLY, LWJGLGLFWKeycode.GLFW_KEY_KP_MULTIPLY); + add(KeyEvent.KEYCODE_NUMPAD_SUBTRACT, LWJGLGLFWKeycode.GLFW_KEY_KP_SUBTRACT); + add(KeyEvent.KEYCODE_NUMPAD_ADD, LWJGLGLFWKeycode.GLFW_KEY_KP_ADD); + add(KeyEvent.KEYCODE_NUMPAD_DOT, LWJGLGLFWKeycode.GLFW_KEY_PERIOD); + add(KeyEvent.KEYCODE_NUMPAD_COMMA, LWJGLGLFWKeycode.GLFW_KEY_COMMA); + add(KeyEvent.KEYCODE_NUMPAD_ENTER, LWJGLGLFWKeycode.GLFW_KEY_ENTER); + add(KeyEvent.KEYCODE_NUMPAD_EQUALS, LWJGLGLFWKeycode.GLFW_KEY_EQUAL); //161 + + } + + private static short index = 0; + private static void add(int androidKeycode, short LWJGLKeycode){ + androidKeycodes[index] = androidKeycode; + LWJGLKeycodes[index] = LWJGLKeycode; + ++index; + } + + public static short get(int key){ + //Taken from: https://www.geeksforgeeks.org/binary-search/ + //Give the value associated to a key + int left = 0, right = androidKeycodes.length - 1; + while (left <= right) { + int m = left + (right - left) / 2; + + // Check if x is present at mid + if (androidKeycodes[m] == key) + return LWJGLKeycodes[m]; + + // If x greater, ignore left half + if (androidKeycodes[m] < key) + left = m + 1; + + // If x is smaller, ignore right half + else + right = m - 1; + } + + // if we reach here, then element was + // not present + return -1; + } + + public static boolean containsKey(int keycode){ + return get(keycode) != -1; + } + + + public static String[] generateKeyName() { + if (androidKeyNameArray == null) { + androidKeyNameArray = new String[androidKeycodes.length]; + for(int i=0; i < androidKeyNameArray.length; ++i){ + androidKeyNameArray[i] = KeyEvent.keyCodeToString(androidKeycodes[i]).replace("KEYCODE_", ""); + } + } + return androidKeyNameArray; + } + + public static void execKey(KeyEvent keyEvent, int i, boolean isDown) { + CallbackBridge.holdingAlt = keyEvent.isAltPressed(); + CallbackBridge.holdingCapslock = keyEvent.isCapsLockOn(); + CallbackBridge.holdingCtrl = keyEvent.isCtrlPressed(); + CallbackBridge.holdingNumlock = keyEvent.isNumLockOn(); + CallbackBridge.holdingShift = keyEvent.isShiftPressed(); + + try { + System.out.println(keyEvent.getKeyCode() + " " +keyEvent.getDisplayLabel()); + if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_BACK && LauncherPreferences.PREF_BACK_TO_RIGHT_MOUSE) { + BaseMainActivity.sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT, keyEvent.getAction() == KeyEvent.ACTION_DOWN); + } else { + if(keyEvent.getUnicodeChar() != 0) { + char key = (char)keyEvent.getUnicodeChar(); + BaseMainActivity.sendKeyPress( + get(keyEvent.getKeyCode()), + key, + 0, + CallbackBridge.getCurrentMods(), + keyEvent.getAction() == KeyEvent.ACTION_DOWN); + }else{ + BaseMainActivity.sendKeyPress( + get(keyEvent.getKeyCode()), + CallbackBridge.getCurrentMods(), + keyEvent.getAction()==KeyEvent.ACTION_DOWN); + } + } + } catch (Throwable th) { + th.printStackTrace(); + } + } + + public static void execKeyIndex(BaseMainActivity mainActivity, int index) { + mainActivity.sendKeyPress(getKeyByIndex(index)); + + } + + public static int getKeyByIndex(int index) { + return LWJGLKeycodes[index]; + } + + public static int getIndexByLWJGLKey(int lwjglKey) { + for (int i = 0; i < LWJGLKeycodes.length; i++) { + if(LWJGLKeycodes[i] == lwjglKey) return i; + } + + return 0; + } +} From f7ef779d054b4f2b46cdd55fcdf51e9d3bb96488 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Tue, 6 Jul 2021 16:40:32 +0200 Subject: [PATCH 137/179] Transition to the efficient keycode converter. --- .../java/net/kdt/pojavlaunch/BaseMainActivity.java | 10 +++++----- .../handleview/EditControlButtonPopup.java | 9 ++++----- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java index 16e52bdb5..3ec6d9d1b 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java @@ -607,7 +607,7 @@ public class BaseMainActivity extends LoggableActivity { boolean isKeyboard(KeyEvent evt) { System.out.println("Event:" +evt); - return AndroidLWJGLKeycode.androidToLwjglMap.containsKey(evt.getKeyCode()); + return EfficientAndroidLWJGLKeycode.containsKey(evt.getKeyCode()); } @@ -625,7 +625,7 @@ public class BaseMainActivity extends LoggableActivity { } if(isKeyboard(event)) { - AndroidLWJGLKeycode.execKey(event,event.getKeyCode(),event.getAction() == KeyEvent.ACTION_DOWN); + EfficientAndroidLWJGLKeycode.execKey(event,event.getKeyCode(),event.getAction() == KeyEvent.ACTION_DOWN); return true; } @@ -734,7 +734,7 @@ public class BaseMainActivity extends LoggableActivity { private void dialogSendCustomKey() { AlertDialog.Builder dialog = new AlertDialog.Builder(this); dialog.setTitle(R.string.control_customkey); - dialog.setItems(AndroidLWJGLKeycode.generateKeyName(), (dInterface, position) -> AndroidLWJGLKeycode.execKeyIndex(BaseMainActivity.this, position)); + dialog.setItems(EfficientAndroidLWJGLKeycode.generateKeyName(), (dInterface, position) -> EfficientAndroidLWJGLKeycode.execKeyIndex(BaseMainActivity.this, position)); dialog.show(); } @@ -878,8 +878,8 @@ public class BaseMainActivity extends LoggableActivity { if(doesObjectContainField(KeyEvent.class,"KEYCODE_" + Character.toUpperCase(keyChar))) { try { int keyCode = KeyEvent.class.getField("KEYCODE_" + Character.toUpperCase(keyChar)).getInt(null); - sendKeyPress(AndroidLWJGLKeycode.androidToLwjglMap.get(keyCode), keyChar, 0, CallbackBridge.getCurrentMods(), true); - sendKeyPress(AndroidLWJGLKeycode.androidToLwjglMap.get(keyCode), keyChar, 0, CallbackBridge.getCurrentMods(), false); + sendKeyPress(EfficientAndroidLWJGLKeycode.get(keyCode), keyChar, 0, CallbackBridge.getCurrentMods(), true); + sendKeyPress(EfficientAndroidLWJGLKeycode.get(keyCode), keyChar, 0, CallbackBridge.getCurrentMods(), false); } catch (IllegalAccessException | NoSuchFieldException e) { } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java index cd4fc2b8a..145c1694d 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java @@ -15,7 +15,7 @@ import android.widget.TextView; import androidx.appcompat.app.AlertDialog; -import net.kdt.pojavlaunch.AndroidLWJGLKeycode; +import net.kdt.pojavlaunch.EfficientAndroidLWJGLKeycode; import net.kdt.pojavlaunch.R; import net.kdt.pojavlaunch.customcontrols.buttons.ControlButton; import net.kdt.pojavlaunch.customcontrols.ControlData; @@ -163,7 +163,7 @@ public class EditControlButtonPopup { specialArr[i] = "SPECIAL_" + oldSpecialArr[specialArr.length - i - 1]; } adapter.addAll(specialArr); - adapter.addAll(AndroidLWJGLKeycode.generateKeyName()); + adapter.addAll(EfficientAndroidLWJGLKeycode.generateKeyName()); adapter.setDropDownViewResource(android.R.layout.simple_list_item_single_choice); for (Spinner spinner : spinnersKeycode) { @@ -175,7 +175,6 @@ public class EditControlButtonPopup { buttonStrokeColor.setOnClickListener(view -> ActionPopupWindow.showColorPicker(ctx, "Edit stroke color", false, ((ColorDrawable) buttonStrokeColor.getBackground()).getColor(), buttonStrokeColor)); - //Set dialog buttons behavior setupDialogButtons(); @@ -235,7 +234,7 @@ public class EditControlButtonPopup { if (properties.keycodes[i] < 0) { spinnersKeycode[i].setSelection(properties.keycodes[i] + specialArr.length); } else { - spinnersKeycode[i].setSelection(AndroidLWJGLKeycode.getIndexByLWJGLKey(properties.keycodes[i]) + specialArr.length); + spinnersKeycode[i].setSelection(EfficientAndroidLWJGLKeycode.getIndexByLWJGLKey(properties.keycodes[i]) + specialArr.length); } } } @@ -273,7 +272,7 @@ public class EditControlButtonPopup { if (spinnersKeycode[i].getSelectedItemPosition() < specialArr.length) { properties.keycodes[i] = spinnersKeycode[i].getSelectedItemPosition() - specialArr.length; } else { - properties.keycodes[i] = AndroidLWJGLKeycode.getKeyByIndex(spinnersKeycode[i].getSelectedItemPosition() - specialArr.length); + properties.keycodes[i] = EfficientAndroidLWJGLKeycode.getKeyByIndex(spinnersKeycode[i].getSelectedItemPosition() - specialArr.length); } } From dff9d01c66076dc98a81e19a59af8e8d1146ec7d Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Tue, 6 Jul 2021 16:40:46 +0200 Subject: [PATCH 138/179] Remove old keycode converter --- .../kdt/pojavlaunch/AndroidLWJGLKeycode.java | 225 ------------------ 1 file changed, 225 deletions(-) delete mode 100644 app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AndroidLWJGLKeycode.java diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AndroidLWJGLKeycode.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AndroidLWJGLKeycode.java deleted file mode 100644 index 9b30d29b6..000000000 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AndroidLWJGLKeycode.java +++ /dev/null @@ -1,225 +0,0 @@ -package net.kdt.pojavlaunch; - -import android.util.*; -import android.view.*; - -import java.net.CookieHandler; -import java.util.*; - -import net.kdt.pojavlaunch.prefs.LauncherPreferences; -import org.lwjgl.glfw.*; - -public class AndroidLWJGLKeycode { - // Fix double letters on MC 1.9 and above - public static boolean isBackspaceAfterChar = true; - public static final ArrayMap androidToLwjglMap; - public static String[] androidKeyNameArray; - - static { - // Mapping Android Keycodes to LWJGL Keycodes - androidToLwjglMap = new ArrayMap<>(); - - // 0-9 keys - androidToLwjglMap.put(KeyEvent.KEYCODE_0, LWJGLGLFWKeycode.GLFW_KEY_0); - androidToLwjglMap.put(KeyEvent.KEYCODE_1, LWJGLGLFWKeycode.GLFW_KEY_1); - androidToLwjglMap.put(KeyEvent.KEYCODE_2, LWJGLGLFWKeycode.GLFW_KEY_2); - androidToLwjglMap.put(KeyEvent.KEYCODE_3, LWJGLGLFWKeycode.GLFW_KEY_3); - androidToLwjglMap.put(KeyEvent.KEYCODE_4, LWJGLGLFWKeycode.GLFW_KEY_4); - androidToLwjglMap.put(KeyEvent.KEYCODE_5, LWJGLGLFWKeycode.GLFW_KEY_5); - androidToLwjglMap.put(KeyEvent.KEYCODE_6, LWJGLGLFWKeycode.GLFW_KEY_6); - androidToLwjglMap.put(KeyEvent.KEYCODE_7, LWJGLGLFWKeycode.GLFW_KEY_7); - androidToLwjglMap.put(KeyEvent.KEYCODE_8, LWJGLGLFWKeycode.GLFW_KEY_8); - androidToLwjglMap.put(KeyEvent.KEYCODE_9, LWJGLGLFWKeycode.GLFW_KEY_9); - - // A-Z keys - androidToLwjglMap.put(KeyEvent.KEYCODE_A, LWJGLGLFWKeycode.GLFW_KEY_A); - androidToLwjglMap.put(KeyEvent.KEYCODE_B, LWJGLGLFWKeycode.GLFW_KEY_B); - androidToLwjglMap.put(KeyEvent.KEYCODE_C, LWJGLGLFWKeycode.GLFW_KEY_C); - androidToLwjglMap.put(KeyEvent.KEYCODE_D, LWJGLGLFWKeycode.GLFW_KEY_D); - androidToLwjglMap.put(KeyEvent.KEYCODE_E, LWJGLGLFWKeycode.GLFW_KEY_E); - androidToLwjglMap.put(KeyEvent.KEYCODE_F, LWJGLGLFWKeycode.GLFW_KEY_F); - androidToLwjglMap.put(KeyEvent.KEYCODE_G, LWJGLGLFWKeycode.GLFW_KEY_G); - androidToLwjglMap.put(KeyEvent.KEYCODE_H, LWJGLGLFWKeycode.GLFW_KEY_H); - androidToLwjglMap.put(KeyEvent.KEYCODE_I, LWJGLGLFWKeycode.GLFW_KEY_I); - androidToLwjglMap.put(KeyEvent.KEYCODE_J, LWJGLGLFWKeycode.GLFW_KEY_J); - androidToLwjglMap.put(KeyEvent.KEYCODE_K, LWJGLGLFWKeycode.GLFW_KEY_K); - androidToLwjglMap.put(KeyEvent.KEYCODE_L, LWJGLGLFWKeycode.GLFW_KEY_L); - androidToLwjglMap.put(KeyEvent.KEYCODE_M, LWJGLGLFWKeycode.GLFW_KEY_M); - androidToLwjglMap.put(KeyEvent.KEYCODE_N, LWJGLGLFWKeycode.GLFW_KEY_N); - androidToLwjglMap.put(KeyEvent.KEYCODE_O, LWJGLGLFWKeycode.GLFW_KEY_O); - androidToLwjglMap.put(KeyEvent.KEYCODE_P, LWJGLGLFWKeycode.GLFW_KEY_P); - androidToLwjglMap.put(KeyEvent.KEYCODE_Q, LWJGLGLFWKeycode.GLFW_KEY_Q); - androidToLwjglMap.put(KeyEvent.KEYCODE_R, LWJGLGLFWKeycode.GLFW_KEY_R); - androidToLwjglMap.put(KeyEvent.KEYCODE_S, LWJGLGLFWKeycode.GLFW_KEY_S); - androidToLwjglMap.put(KeyEvent.KEYCODE_T, LWJGLGLFWKeycode.GLFW_KEY_T); - androidToLwjglMap.put(KeyEvent.KEYCODE_U, LWJGLGLFWKeycode.GLFW_KEY_U); - androidToLwjglMap.put(KeyEvent.KEYCODE_V, LWJGLGLFWKeycode.GLFW_KEY_V); - androidToLwjglMap.put(KeyEvent.KEYCODE_W, LWJGLGLFWKeycode.GLFW_KEY_W); - androidToLwjglMap.put(KeyEvent.KEYCODE_X, LWJGLGLFWKeycode.GLFW_KEY_X); - androidToLwjglMap.put(KeyEvent.KEYCODE_Y, LWJGLGLFWKeycode.GLFW_KEY_Y); - androidToLwjglMap.put(KeyEvent.KEYCODE_Z, LWJGLGLFWKeycode.GLFW_KEY_Z); - - // Alt keys - androidToLwjglMap.put(KeyEvent.KEYCODE_ALT_LEFT, LWJGLGLFWKeycode.GLFW_KEY_LEFT_ALT); - androidToLwjglMap.put(KeyEvent.KEYCODE_ALT_RIGHT, LWJGLGLFWKeycode.GLFW_KEY_RIGHT_ALT); - - // Escape key - androidToLwjglMap.put(KeyEvent.KEYCODE_BACK, LWJGLGLFWKeycode.GLFW_KEY_ESCAPE); - - androidToLwjglMap.put(KeyEvent.KEYCODE_BACKSLASH, LWJGLGLFWKeycode.GLFW_KEY_BACKSLASH); - androidToLwjglMap.put(KeyEvent.KEYCODE_BREAK, LWJGLGLFWKeycode.GLFW_KEY_PAUSE); - androidToLwjglMap.put(KeyEvent.KEYCODE_CAPS_LOCK, LWJGLGLFWKeycode.GLFW_KEY_CAPS_LOCK); - androidToLwjglMap.put(KeyEvent.KEYCODE_COMMA, LWJGLGLFWKeycode.GLFW_KEY_COMMA); - - // Control keys - androidToLwjglMap.put(KeyEvent.KEYCODE_CTRL_LEFT, LWJGLGLFWKeycode.GLFW_KEY_LEFT_CONTROL); - androidToLwjglMap.put(KeyEvent.KEYCODE_CTRL_RIGHT, LWJGLGLFWKeycode.GLFW_KEY_RIGHT_CONTROL); - - androidToLwjglMap.put(KeyEvent.KEYCODE_DEL, LWJGLGLFWKeycode.GLFW_KEY_BACKSPACE); // Backspace - - // Arrow keys - androidToLwjglMap.put(KeyEvent.KEYCODE_DPAD_DOWN, LWJGLGLFWKeycode.GLFW_KEY_DOWN); - androidToLwjglMap.put(KeyEvent.KEYCODE_DPAD_LEFT, LWJGLGLFWKeycode.GLFW_KEY_LEFT); - androidToLwjglMap.put(KeyEvent.KEYCODE_DPAD_RIGHT, LWJGLGLFWKeycode.GLFW_KEY_RIGHT); - androidToLwjglMap.put(KeyEvent.KEYCODE_DPAD_UP, LWJGLGLFWKeycode.GLFW_KEY_UP); - - androidToLwjglMap.put(KeyEvent.KEYCODE_ENTER, LWJGLGLFWKeycode.GLFW_KEY_ENTER); - androidToLwjglMap.put(KeyEvent.KEYCODE_EQUALS, LWJGLGLFWKeycode.GLFW_KEY_EQUAL); - androidToLwjglMap.put(KeyEvent.KEYCODE_ESCAPE, LWJGLGLFWKeycode.GLFW_KEY_ESCAPE); - - // Fn keys - androidToLwjglMap.put(KeyEvent.KEYCODE_F1, LWJGLGLFWKeycode.GLFW_KEY_F1); - androidToLwjglMap.put(KeyEvent.KEYCODE_F2, LWJGLGLFWKeycode.GLFW_KEY_F2); - androidToLwjglMap.put(KeyEvent.KEYCODE_F3, LWJGLGLFWKeycode.GLFW_KEY_F3); - androidToLwjglMap.put(KeyEvent.KEYCODE_F4, LWJGLGLFWKeycode.GLFW_KEY_F4); - androidToLwjglMap.put(KeyEvent.KEYCODE_F5, LWJGLGLFWKeycode.GLFW_KEY_F5); - androidToLwjglMap.put(KeyEvent.KEYCODE_F6, LWJGLGLFWKeycode.GLFW_KEY_F6); - androidToLwjglMap.put(KeyEvent.KEYCODE_F7, LWJGLGLFWKeycode.GLFW_KEY_F7); - androidToLwjglMap.put(KeyEvent.KEYCODE_F8, LWJGLGLFWKeycode.GLFW_KEY_F8); - androidToLwjglMap.put(KeyEvent.KEYCODE_F9, LWJGLGLFWKeycode.GLFW_KEY_F9); - androidToLwjglMap.put(KeyEvent.KEYCODE_F10, LWJGLGLFWKeycode.GLFW_KEY_F10); - androidToLwjglMap.put(KeyEvent.KEYCODE_F11, LWJGLGLFWKeycode.GLFW_KEY_F11); - androidToLwjglMap.put(KeyEvent.KEYCODE_F12, LWJGLGLFWKeycode.GLFW_KEY_F12); - // FIXME GLFW Function key - // androidToLwjglMap.put(KeyEvent.KEYCODE_FUNCTION, LWJGLGLFWKeycode.GLFW_KEY_FUNCTION); - - androidToLwjglMap.put(KeyEvent.KEYCODE_GRAVE, LWJGLGLFWKeycode.GLFW_KEY_GRAVE_ACCENT); - androidToLwjglMap.put(KeyEvent.KEYCODE_HOME, LWJGLGLFWKeycode.GLFW_KEY_HOME); - androidToLwjglMap.put(KeyEvent.KEYCODE_INSERT, LWJGLGLFWKeycode.GLFW_KEY_INSERT); - //androidToLwjglMap.put(KeyEvent.KEYCODE_KANA, LWJGLGLFWKeycode.GLFW_KEY_K); - androidToLwjglMap.put(KeyEvent.KEYCODE_LEFT_BRACKET, LWJGLGLFWKeycode.GLFW_KEY_LEFT_BRACKET); - androidToLwjglMap.put(KeyEvent.KEYCODE_MINUS, LWJGLGLFWKeycode.GLFW_KEY_MINUS); - - // Num keys - androidToLwjglMap.put(KeyEvent.KEYCODE_NUM_LOCK, LWJGLGLFWKeycode.GLFW_KEY_NUM_LOCK); - androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_0, LWJGLGLFWKeycode.GLFW_KEY_0); - androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_1, LWJGLGLFWKeycode.GLFW_KEY_1); - androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_2, LWJGLGLFWKeycode.GLFW_KEY_2); - androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_3, LWJGLGLFWKeycode.GLFW_KEY_3); - androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_4, LWJGLGLFWKeycode.GLFW_KEY_4); - androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_5, LWJGLGLFWKeycode.GLFW_KEY_5); - androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_6, LWJGLGLFWKeycode.GLFW_KEY_6); - androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_7, LWJGLGLFWKeycode.GLFW_KEY_7); - androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_8, LWJGLGLFWKeycode.GLFW_KEY_8); - androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_9, LWJGLGLFWKeycode.GLFW_KEY_9); - androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_ADD, LWJGLGLFWKeycode.GLFW_KEY_KP_ADD); - androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_COMMA, LWJGLGLFWKeycode.GLFW_KEY_COMMA); - androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_DIVIDE, LWJGLGLFWKeycode.GLFW_KEY_KP_DIVIDE); - androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_DOT, LWJGLGLFWKeycode.GLFW_KEY_PERIOD); - androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_ENTER, LWJGLGLFWKeycode.GLFW_KEY_ENTER); - androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_EQUALS, LWJGLGLFWKeycode.GLFW_KEY_EQUAL); - androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_MULTIPLY, LWJGLGLFWKeycode.GLFW_KEY_KP_MULTIPLY); - androidToLwjglMap.put(KeyEvent.KEYCODE_NUMPAD_SUBTRACT, LWJGLGLFWKeycode.GLFW_KEY_KP_SUBTRACT); - - // Page keys - androidToLwjglMap.put(KeyEvent.KEYCODE_PAGE_DOWN, LWJGLGLFWKeycode.GLFW_KEY_PAGE_DOWN); - androidToLwjglMap.put(KeyEvent.KEYCODE_PAGE_UP, LWJGLGLFWKeycode.GLFW_KEY_PAGE_UP); - - androidToLwjglMap.put(KeyEvent.KEYCODE_PERIOD, LWJGLGLFWKeycode.GLFW_KEY_PERIOD); - androidToLwjglMap.put(KeyEvent.KEYCODE_PLUS, LWJGLGLFWKeycode.GLFW_KEY_KP_ADD); - // androidToLwjglMap.put(KeyEvent.KEYCODE_POWER, LWJGLGLFWKeycode.GLFW_KEY_POWER); - androidToLwjglMap.put(KeyEvent.KEYCODE_RIGHT_BRACKET, LWJGLGLFWKeycode.GLFW_KEY_RIGHT_BRACKET); - androidToLwjglMap.put(KeyEvent.KEYCODE_SEMICOLON, LWJGLGLFWKeycode.GLFW_KEY_SEMICOLON); - - // Shift keys - androidToLwjglMap.put(KeyEvent.KEYCODE_SHIFT_LEFT, LWJGLGLFWKeycode.GLFW_KEY_LEFT_SHIFT); - androidToLwjglMap.put(KeyEvent.KEYCODE_SHIFT_RIGHT, LWJGLGLFWKeycode.GLFW_KEY_RIGHT_SHIFT); - - androidToLwjglMap.put(KeyEvent.KEYCODE_SLASH, LWJGLGLFWKeycode.GLFW_KEY_SLASH); - // androidToLwjglMap.put(KeyEvent.KEYCODE_SLEEP, LWJGLGLFWKeycode.GLFW_KEY_SLEEP); - androidToLwjglMap.put(KeyEvent.KEYCODE_SPACE, LWJGLGLFWKeycode.GLFW_KEY_SPACE); - // androidToLwjglMap.put(KeyEvent.KEYCODE_SYSRQ, LWJGLGLFWKeycode.GLFW_KEY_SYSRQ); - androidToLwjglMap.put(KeyEvent.KEYCODE_TAB, LWJGLGLFWKeycode.GLFW_KEY_TAB); - // androidToLwjglMap.put(KeyEvent.KEYCODE_YEN, LWJGLGLFWKeycode.GLFW_KEY_YEN); - - // androidToLwjglMap.put(KeyEvent.KEYCODE_BUTTON_1, LWJGLGLFWKeycode.G - androidToLwjglMap.put(KeyEvent.KEYCODE_AT,LWJGLGLFWKeycode.GLFW_KEY_2); - androidToLwjglMap.put(KeyEvent.KEYCODE_POUND,LWJGLGLFWKeycode.GLFW_KEY_3); - - androidToLwjglMap.put(KeyEvent.KEYCODE_UNKNOWN,LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN); - - } - - public static String[] generateKeyName() { - if (androidKeyNameArray == null) { - List keyName = new ArrayList(); - for (int perKey : androidToLwjglMap.keySet()) { - keyName.add(KeyEvent.keyCodeToString(perKey).replace("KEYCODE_", "")); - } - androidKeyNameArray = keyName.toArray(new String[0]); - } - return androidKeyNameArray; - } - - public static void execKey(KeyEvent keyEvent, int i, boolean isDown) { - CallbackBridge.holdingAlt = keyEvent.isAltPressed(); - CallbackBridge.holdingCapslock = keyEvent.isCapsLockOn(); - CallbackBridge.holdingCtrl = keyEvent.isCtrlPressed(); - CallbackBridge.holdingNumlock = keyEvent.isNumLockOn(); - CallbackBridge.holdingShift = keyEvent.isShiftPressed(); - - try { - System.out.println(keyEvent.getKeyCode() + " " +keyEvent.getDisplayLabel()); - if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_BACK && LauncherPreferences.PREF_BACK_TO_RIGHT_MOUSE) { - BaseMainActivity.sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT, keyEvent.getAction() == KeyEvent.ACTION_DOWN); - } else { - if(keyEvent.getUnicodeChar() != 0) { - char key = (char)keyEvent.getUnicodeChar(); - BaseMainActivity.sendKeyPress( - androidToLwjglMap.get(keyEvent.getKeyCode()), - key, - 0, - CallbackBridge.getCurrentMods(), - keyEvent.getAction() == KeyEvent.ACTION_DOWN); - }else{ - BaseMainActivity.sendKeyPress( - androidToLwjglMap.get(keyEvent.getKeyCode()), - CallbackBridge.getCurrentMods(), - keyEvent.getAction()==KeyEvent.ACTION_DOWN); - } - } - } catch (Throwable th) { - th.printStackTrace(); - } - } - - public static void execKeyIndex(BaseMainActivity mainActivity, int index) { - mainActivity.sendKeyPress(getKeyByIndex(index)); - - } - - public static int getKeyByIndex(int index) { - return androidToLwjglMap.valueAt(index); - } - - public static int getIndexByLWJGLKey(int lwjglKey) { - for (int i = 0; i < androidToLwjglMap.size(); i++) { - int currKey = androidToLwjglMap.valueAt(i); - if (currKey == lwjglKey) { - return i; - } - } - - return 0; - } -} From 22b3583ae107ce2db1b5c4ac29a27e9092615e30 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Wed, 7 Jul 2021 14:36:35 +0200 Subject: [PATCH 139/179] WIP implementation of the Dpad for the gamepad --- .../customcontrols/gamepad/Gamepad.java | 64 +++++++++++++------ .../customcontrols/gamepad/GamepadDpad.java | 57 ++++++++++++----- .../{GamepadMapping.java => GamepadMap.java} | 2 +- 3 files changed, 87 insertions(+), 36 deletions(-) rename app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/{GamepadMapping.java => GamepadMap.java} (98%) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java index d5468f668..8fcef8ea4 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java @@ -1,9 +1,6 @@ package net.kdt.pojavlaunch.customcontrols.gamepad; -import android.os.Handler; -import android.os.Looper; import android.view.InputDevice; -import android.view.InputEvent; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; @@ -32,7 +29,7 @@ public class Gamepad { private BaseMainActivity gameActivity; private ImageView pointerView; - private GamepadDpad gamepadDpad = new GamepadDpad(); + private GamepadDpad gamepadDpad = new GamepadDpad(this); private final GamepadJoystick leftJoystick; private int currentJoystickDirection = DIRECTION_NONE; @@ -48,9 +45,9 @@ public class Gamepad { private double mouseAngle; private double mouseSensitivity = 19; - private final GamepadMapping gameMap = new GamepadMapping(); - private final GamepadMapping menuMap = new GamepadMapping(); - private GamepadMapping currentMap = gameMap; + private final GamepadMap gameMap = new GamepadMap(); + private final GamepadMap menuMap = new GamepadMap(); + private GamepadMap currentMap = gameMap; private boolean lastGrabbingState = true; @@ -174,13 +171,13 @@ public class Gamepad { gameMap.DIRECTION_RIGHT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_D}; gameMap.DIRECTION_LEFT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_A}; - gameMap.DPAD_UP.keycodes = new int[]{}; + gameMap.DPAD_UP.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_W}; gameMap.DPAD_DOWN.keycodes = new int[]{}; gameMap.DPAD_RIGHT.keycodes = new int[]{}; gameMap.DPAD_LEFT.keycodes = new int[]{}; - gameMap.SHOULDER_LEFT.keycodes = new int[]{GamepadMapping.MOUSE_SCROLL_UP}; - gameMap.SHOULDER_RIGHT.keycodes = new int[]{GamepadMapping.MOUSE_SCROLL_DOWN}; + gameMap.SHOULDER_LEFT.keycodes = new int[]{GamepadMap.MOUSE_SCROLL_UP}; + gameMap.SHOULDER_RIGHT.keycodes = new int[]{GamepadMap.MOUSE_SCROLL_DOWN}; gameMap.TRIGGER_LEFT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT}; gameMap.TRIGGER_RIGHT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT}; @@ -199,8 +196,8 @@ public class Gamepad { menuMap.BUTTON_X.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT}; menuMap.BUTTON_Y.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_LEFT_SHIFT, LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT}; //Oops, doesn't work since left shift isn't properly applied. - menuMap.DIRECTION_FORWARD = new int[]{GamepadMapping.MOUSE_SCROLL_UP, GamepadMapping.MOUSE_SCROLL_UP, GamepadMapping.MOUSE_SCROLL_UP,GamepadMapping.MOUSE_SCROLL_UP,GamepadMapping.MOUSE_SCROLL_UP}; - menuMap.DIRECTION_BACKWARD = new int[]{GamepadMapping.MOUSE_SCROLL_DOWN, GamepadMapping.MOUSE_SCROLL_DOWN, GamepadMapping.MOUSE_SCROLL_DOWN,GamepadMapping.MOUSE_SCROLL_DOWN,GamepadMapping.MOUSE_SCROLL_DOWN}; + menuMap.DIRECTION_FORWARD = new int[]{GamepadMap.MOUSE_SCROLL_UP, GamepadMap.MOUSE_SCROLL_UP, GamepadMap.MOUSE_SCROLL_UP, GamepadMap.MOUSE_SCROLL_UP, GamepadMap.MOUSE_SCROLL_UP}; + menuMap.DIRECTION_BACKWARD = new int[]{GamepadMap.MOUSE_SCROLL_DOWN, GamepadMap.MOUSE_SCROLL_DOWN, GamepadMap.MOUSE_SCROLL_DOWN, GamepadMap.MOUSE_SCROLL_DOWN, GamepadMap.MOUSE_SCROLL_DOWN}; menuMap.DIRECTION_RIGHT = new int[]{}; menuMap.DIRECTION_LEFT = new int[]{}; @@ -209,8 +206,8 @@ public class Gamepad { menuMap.DPAD_RIGHT.keycodes = new int[]{}; menuMap.DPAD_LEFT.keycodes = new int[]{}; - menuMap.SHOULDER_LEFT.keycodes = new int[]{GamepadMapping.MOUSE_SCROLL_UP}; - menuMap.SHOULDER_RIGHT.keycodes = new int[]{GamepadMapping.MOUSE_SCROLL_DOWN}; + menuMap.SHOULDER_LEFT.keycodes = new int[]{GamepadMap.MOUSE_SCROLL_UP}; + menuMap.SHOULDER_RIGHT.keycodes = new int[]{GamepadMap.MOUSE_SCROLL_DOWN}; menuMap.TRIGGER_LEFT.keycodes = new int[]{}; menuMap.TRIGGER_RIGHT.keycodes = new int[]{}; @@ -225,10 +222,12 @@ public class Gamepad { } public void update(KeyEvent event){ + gamepadDpad.update(event); sendButton(event); } public void update(MotionEvent event){ + gamepadDpad.update(event); updateDirectionalJoystick(event); updateMouseJoystick(event); updateAnalogTriggers(event); @@ -260,11 +259,11 @@ public class Gamepad { getCurrentMap().TRIGGER_RIGHT.update(event.getAxisValue(MotionEvent.AXIS_RTRIGGER) > 0.5); } - private GamepadMapping getCurrentMap(){ + private GamepadMap getCurrentMap(){ return currentMap; } - private static void sendDirectionalKeycode(int direction, boolean isDown, GamepadMapping map){ + private static void sendDirectionalKeycode(int direction, boolean isDown, GamepadMap map){ switch (direction){ case DIRECTION_NORTH: sendInput(map.DIRECTION_FORWARD, isDown); @@ -303,7 +302,7 @@ public class Gamepad { } - private void sendButton(KeyEvent event){ + public void sendButton(KeyEvent event){ int keycode = event.getKeyCode(); switch (keycode){ case KeyEvent.KEYCODE_BUTTON_A: @@ -343,6 +342,26 @@ public class Gamepad { getCurrentMap().THUMBSTICK_RIGHT.update(event); break; + //DPAD + case GamepadDpad.UP: + getCurrentMap().DPAD_UP.update(event); + break; + case GamepadDpad.DOWN: + getCurrentMap().DPAD_DOWN.update(event); + break; + case GamepadDpad.LEFT: + getCurrentMap().DPAD_LEFT.update(event); + break; + case GamepadDpad.RIGHT: + getCurrentMap().DPAD_RIGHT.update(event); + break; + case GamepadDpad.CENTER: + getCurrentMap().DPAD_RIGHT.update(false); + getCurrentMap().DPAD_LEFT.update(false); + getCurrentMap().DPAD_UP.update(false); + getCurrentMap().DPAD_DOWN.update(false); + break; + //Start/select case KeyEvent.KEYCODE_BUTTON_START: getCurrentMap().BUTTON_START.update(event); @@ -361,10 +380,10 @@ public class Gamepad { public static void sendInput(int[] keycodes, boolean isDown){ for(int keycode : keycodes){ switch (keycode){ - case GamepadMapping.MOUSE_SCROLL_DOWN: + case GamepadMap.MOUSE_SCROLL_DOWN: if(isDown) CallbackBridge.sendScroll(0, -1); break; - case GamepadMapping.MOUSE_SCROLL_UP: + case GamepadMap.MOUSE_SCROLL_UP: if(isDown) CallbackBridge.sendScroll(0, 1); break; @@ -391,8 +410,13 @@ public class Gamepad { } public static boolean isGamepadEvent(KeyEvent event){ + //return false; + + return ((event.getSource() & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD - || GamepadDpad.isDpadEvent(event)); + || GamepadDpad.isDpadEvent(event) ); + + } } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadDpad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadDpad.java index 39d7a2d5c..09e59f632 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadDpad.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadDpad.java @@ -5,20 +5,38 @@ import android.view.InputEvent; import android.view.KeyEvent; import android.view.MotionEvent; +import java.lang.reflect.Field; + /* Code from the android documentation */ public class GamepadDpad { - final static int UP = 0; - final static int LEFT = 1; - final static int RIGHT = 2; - final static int DOWN = 3; - final static int CENTER = 4; + final static int UP = 999; + final static int LEFT = 9999; + final static int RIGHT = 99999; + final static int DOWN = 999999; + final static int CENTER = 9999999; int pressedDirection = -1; + Gamepad parentPad; + KeyEvent dummyevent = new KeyEvent(KeyEvent.ACTION_DOWN, CENTER); + Field eventCodeField; - public int getDirectionPressed(InputEvent event) { + { + try { + eventCodeField = dummyevent.getClass().getDeclaredField("mKeyCode"); + eventCodeField.setAccessible(true); + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } + } + + public GamepadDpad(Gamepad parentPad){ + this.parentPad = parentPad; + } + + public int update(InputEvent event) { if (!isDpadEvent(event)) { return -1; } @@ -34,16 +52,18 @@ public class GamepadDpad { // Check if the AXIS_HAT_X value is -1 or 1, and set the D-pad // LEFT and RIGHT direction accordingly. if (Float.compare(xaxis, -1.0f) == 0) { - pressedDirection = GamepadDpad.LEFT; + pressedDirection = LEFT; } else if (Float.compare(xaxis, 1.0f) == 0) { - pressedDirection = GamepadDpad.RIGHT; + pressedDirection = RIGHT; } // Check if the AXIS_HAT_Y value is -1 or 1, and set the D-pad // UP and DOWN direction accordingly. else if (Float.compare(yaxis, -1.0f) == 0) { - pressedDirection = GamepadDpad.UP; + pressedDirection = UP; } else if (Float.compare(yaxis, 1.0f) == 0) { - pressedDirection = GamepadDpad.DOWN; + pressedDirection = DOWN; + }else { + pressedDirection = CENTER; } } @@ -53,17 +73,24 @@ public class GamepadDpad { // Use the key code to find the D-pad direction. KeyEvent keyEvent = (KeyEvent) event; if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_DPAD_LEFT) { - pressedDirection = GamepadDpad.LEFT; + pressedDirection = LEFT; } else if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_DPAD_RIGHT) { - pressedDirection = GamepadDpad.RIGHT; + pressedDirection = RIGHT; } else if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_DPAD_UP) { - pressedDirection = GamepadDpad.UP; + pressedDirection = UP; } else if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_DPAD_DOWN) { - pressedDirection = GamepadDpad.DOWN; + pressedDirection = DOWN; } else if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_DPAD_CENTER) { - pressedDirection = GamepadDpad.CENTER; + pressedDirection = CENTER; } } + + try { + eventCodeField.setInt(dummyevent, pressedDirection); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + parentPad.sendButton(dummyevent); return pressedDirection; } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadMapping.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadMap.java similarity index 98% rename from app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadMapping.java rename to app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadMap.java index 61af4a286..798f4b34c 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadMapping.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadMap.java @@ -5,7 +5,7 @@ import net.kdt.pojavlaunch.LWJGLGLFWKeycode; import java.security.PublicKey; import java.util.HashMap; -public class GamepadMapping { +public class GamepadMap { public static final int MOUSE_SCROLL_DOWN = -1; public static final int MOUSE_SCROLL_UP = -2; From 153e991806206abc755c5973ac94ca56dc887d9c Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Wed, 7 Jul 2021 14:46:28 +0200 Subject: [PATCH 140/179] Clean up, keyboard is faster now --- .../net/kdt/pojavlaunch/BaseMainActivity.java | 14 +-- .../EfficientAndroidLWJGLKeycode.java | 85 +++++++++---------- .../handleview/EditControlButtonPopup.java | 4 +- 3 files changed, 49 insertions(+), 54 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java index 3ec6d9d1b..b921a31cb 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java @@ -624,8 +624,10 @@ public class BaseMainActivity extends LoggableActivity { return true; } - if(isKeyboard(event)) { - EfficientAndroidLWJGLKeycode.execKey(event,event.getKeyCode(),event.getAction() == KeyEvent.ACTION_DOWN); + int index = EfficientAndroidLWJGLKeycode.getIndexByKey(event.getKeyCode()); + if(index >= 0) { + Toast.makeText(this,"THIS IS A KEYBOARD EVENT !", Toast.LENGTH_SHORT).show(); + EfficientAndroidLWJGLKeycode.execKey(event, index); return true; } @@ -734,7 +736,7 @@ public class BaseMainActivity extends LoggableActivity { private void dialogSendCustomKey() { AlertDialog.Builder dialog = new AlertDialog.Builder(this); dialog.setTitle(R.string.control_customkey); - dialog.setItems(EfficientAndroidLWJGLKeycode.generateKeyName(), (dInterface, position) -> EfficientAndroidLWJGLKeycode.execKeyIndex(BaseMainActivity.this, position)); + dialog.setItems(EfficientAndroidLWJGLKeycode.generateKeyName(), (dInterface, position) -> EfficientAndroidLWJGLKeycode.execKeyIndex(position)); dialog.show(); } @@ -878,8 +880,8 @@ public class BaseMainActivity extends LoggableActivity { if(doesObjectContainField(KeyEvent.class,"KEYCODE_" + Character.toUpperCase(keyChar))) { try { int keyCode = KeyEvent.class.getField("KEYCODE_" + Character.toUpperCase(keyChar)).getInt(null); - sendKeyPress(EfficientAndroidLWJGLKeycode.get(keyCode), keyChar, 0, CallbackBridge.getCurrentMods(), true); - sendKeyPress(EfficientAndroidLWJGLKeycode.get(keyCode), keyChar, 0, CallbackBridge.getCurrentMods(), false); + sendKeyPress(EfficientAndroidLWJGLKeycode.getValue(keyCode), keyChar, 0, CallbackBridge.getCurrentMods(), true); + sendKeyPress(EfficientAndroidLWJGLKeycode.getValue(keyCode), keyChar, 0, CallbackBridge.getCurrentMods(), false); } catch (IllegalAccessException | NoSuchFieldException e) { } @@ -890,7 +892,7 @@ public class BaseMainActivity extends LoggableActivity { sendKeyPress(0, keyChar, 0, CallbackBridge.getCurrentMods(), false); } - public void sendKeyPress(int keyCode) { + public static void sendKeyPress(int keyCode) { sendKeyPress(keyCode, CallbackBridge.getCurrentMods(), true); sendKeyPress(keyCode, CallbackBridge.getCurrentMods(), false); } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/EfficientAndroidLWJGLKeycode.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/EfficientAndroidLWJGLKeycode.java index da4d5038c..075c8ae1e 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/EfficientAndroidLWJGLKeycode.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/EfficientAndroidLWJGLKeycode.java @@ -6,7 +6,14 @@ import net.kdt.pojavlaunch.prefs.LauncherPreferences; import org.lwjgl.glfw.CallbackBridge; +import java.util.Arrays; + public class EfficientAndroidLWJGLKeycode { + + //This old version of this class was using an ArrayMap, a generic Key -> Value data structure. + //The key being the android keycode from a KeyEvent + //The value its LWJGL equivalent. + private static final int[] androidKeycodes = new int[103]; private static final short[] LWJGLKeycodes = new short[androidKeycodes.length]; private static String[] androidKeyNameArray; /* = new String[androidKeycodes.length]; */ @@ -155,36 +162,13 @@ public class EfficientAndroidLWJGLKeycode { ++index; } - public static short get(int key){ - //Taken from: https://www.geeksforgeeks.org/binary-search/ - //Give the value associated to a key - int left = 0, right = androidKeycodes.length - 1; - while (left <= right) { - int m = left + (right - left) / 2; - - // Check if x is present at mid - if (androidKeycodes[m] == key) - return LWJGLKeycodes[m]; - - // If x greater, ignore left half - if (androidKeycodes[m] < key) - left = m + 1; - - // If x is smaller, ignore right half - else - right = m - 1; - } - - // if we reach here, then element was - // not present - return -1; - } public static boolean containsKey(int keycode){ - return get(keycode) != -1; + return getIndexByKey(keycode) >= 0; } + public static String[] generateKeyName() { if (androidKeyNameArray == null) { androidKeyNameArray = new String[androidKeycodes.length]; @@ -195,7 +179,13 @@ public class EfficientAndroidLWJGLKeycode { return androidKeyNameArray; } - public static void execKey(KeyEvent keyEvent, int i, boolean isDown) { + public static void execKey(KeyEvent keyEvent) { + execKey(keyEvent, getIndexByKey(keyEvent.getKeyCode())); + } + + + public static void execKey(KeyEvent keyEvent, int valueIndex) { + //valueIndex points to where the value is stored in the array. CallbackBridge.holdingAlt = keyEvent.isAltPressed(); CallbackBridge.holdingCapslock = keyEvent.isCapsLockOn(); CallbackBridge.holdingCtrl = keyEvent.isCtrlPressed(); @@ -203,40 +193,43 @@ public class EfficientAndroidLWJGLKeycode { CallbackBridge.holdingShift = keyEvent.isShiftPressed(); try { - System.out.println(keyEvent.getKeyCode() + " " +keyEvent.getDisplayLabel()); + System.out.println(keyEvent.getKeyCode() + " " +keyEvent.getDisplayLabel()); if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_BACK && LauncherPreferences.PREF_BACK_TO_RIGHT_MOUSE) { BaseMainActivity.sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT, keyEvent.getAction() == KeyEvent.ACTION_DOWN); } else { - if(keyEvent.getUnicodeChar() != 0) { - char key = (char)keyEvent.getUnicodeChar(); - BaseMainActivity.sendKeyPress( - get(keyEvent.getKeyCode()), - key, - 0, - CallbackBridge.getCurrentMods(), - keyEvent.getAction() == KeyEvent.ACTION_DOWN); - }else{ - BaseMainActivity.sendKeyPress( - get(keyEvent.getKeyCode()), - CallbackBridge.getCurrentMods(), - keyEvent.getAction()==KeyEvent.ACTION_DOWN); - } + char key = (char)(keyEvent.getUnicodeChar() != 0 ? keyEvent.getUnicodeChar() : '\u0000'); + BaseMainActivity.sendKeyPress( + getValueByIndex(valueIndex), + key, + 0, + CallbackBridge.getCurrentMods(), + keyEvent.getAction() == KeyEvent.ACTION_DOWN); } } catch (Throwable th) { th.printStackTrace(); } } - public static void execKeyIndex(BaseMainActivity mainActivity, int index) { - mainActivity.sendKeyPress(getKeyByIndex(index)); - + public static void execKeyIndex(int index){ + //Send a quick key press. + BaseMainActivity.sendKeyPress(getValueByIndex(index)); } - public static int getKeyByIndex(int index) { + public static int getValueByIndex(int index) { return LWJGLKeycodes[index]; } - public static int getIndexByLWJGLKey(int lwjglKey) { + public static int getIndexByKey(int key){ + return Arrays.binarySearch(androidKeycodes, key); + } + + public static short getValue(int key){ + return LWJGLKeycodes[Arrays.binarySearch(androidKeycodes, key)]; + } + + public static int getIndexByValue(int lwjglKey) { + //Since the LWJGL keycodes aren't sorted, linear search is used. + //You should avoid using this function on performance critical areas for (int i = 0; i < LWJGLKeycodes.length; i++) { if(LWJGLKeycodes[i] == lwjglKey) return i; } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java index 145c1694d..aa6358592 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java @@ -234,7 +234,7 @@ public class EditControlButtonPopup { if (properties.keycodes[i] < 0) { spinnersKeycode[i].setSelection(properties.keycodes[i] + specialArr.length); } else { - spinnersKeycode[i].setSelection(EfficientAndroidLWJGLKeycode.getIndexByLWJGLKey(properties.keycodes[i]) + specialArr.length); + spinnersKeycode[i].setSelection(EfficientAndroidLWJGLKeycode.getIndexByValue(properties.keycodes[i]) + specialArr.length); } } } @@ -272,7 +272,7 @@ public class EditControlButtonPopup { if (spinnersKeycode[i].getSelectedItemPosition() < specialArr.length) { properties.keycodes[i] = spinnersKeycode[i].getSelectedItemPosition() - specialArr.length; } else { - properties.keycodes[i] = EfficientAndroidLWJGLKeycode.getKeyByIndex(spinnersKeycode[i].getSelectedItemPosition() - specialArr.length); + properties.keycodes[i] = EfficientAndroidLWJGLKeycode.getValueByIndex(spinnersKeycode[i].getSelectedItemPosition() - specialArr.length); } } From 6bef0c8742fac5e4c703b86bea22b5f91a2188af Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Wed, 7 Jul 2021 14:46:57 +0200 Subject: [PATCH 141/179] Use of the Optimizer in the button setting layout. --- .../src/main/res/layout/control_button_setting.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app_pojavlauncher/src/main/res/layout/control_button_setting.xml b/app_pojavlauncher/src/main/res/layout/control_button_setting.xml index 039f2cdc5..5feb69534 100644 --- a/app_pojavlauncher/src/main/res/layout/control_button_setting.xml +++ b/app_pojavlauncher/src/main/res/layout/control_button_setting.xml @@ -7,7 +7,8 @@ + android:layout_height="wrap_content" + app:layout_optimizationLevel="standard|dimensions|chains"> From af27b0e09a9a57b50b3d07e0aabee7169967c1dd Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Wed, 7 Jul 2021 15:10:26 +0200 Subject: [PATCH 142/179] Better persistence of the pointer index. --- .../main/java/net/kdt/pojavlaunch/BaseMainActivity.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java index b921a31cb..5cd29fb55 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java @@ -414,11 +414,12 @@ public class BaseMainActivity extends LoggableActivity { } else if (!isTouchInHotbar) { //Camera movement if(CallbackBridge.isGrabbing()){ - if(e.getPointerId(0) != currentPointerID){ + int pointerIndex = e.findPointerIndex(currentPointerID); + if(pointerIndex == -1){ currentPointerID = e.getPointerId(0); }else{ - mouse_x += (e.getX() - prevX) * sensitivityFactor; - mouse_y += (e.getY() - prevY) * sensitivityFactor; + mouse_x += (e.getX(currentPointerID) - prevX) * sensitivityFactor; + mouse_y += (e.getY(currentPointerID) - prevY) * sensitivityFactor; } prevX = e.getX(); prevY = e.getY(); From caf7073866bebccfc688467ef196a056867fd657 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Wed, 7 Jul 2021 15:41:27 +0200 Subject: [PATCH 143/179] Fix pointer out of range. --- .../src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java index 5cd29fb55..92a6d73f1 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java @@ -418,8 +418,8 @@ public class BaseMainActivity extends LoggableActivity { if(pointerIndex == -1){ currentPointerID = e.getPointerId(0); }else{ - mouse_x += (e.getX(currentPointerID) - prevX) * sensitivityFactor; - mouse_y += (e.getY(currentPointerID) - prevY) * sensitivityFactor; + mouse_x += (e.getX(pointerIndex) - prevX) * sensitivityFactor; + mouse_y += (e.getY(pointerIndex) - prevY) * sensitivityFactor; } prevX = e.getX(); prevY = e.getY(); From f35b880413ac263a4a9e88b3581a5f0fc2d00357 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Wed, 7 Jul 2021 16:11:33 +0200 Subject: [PATCH 144/179] optimize keyEvents by checking only changes in state --- .../src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java index 92a6d73f1..1149b1b6d 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java @@ -615,6 +615,7 @@ public class BaseMainActivity extends LoggableActivity { @Override public boolean dispatchKeyEvent(KeyEvent event) { System.out.println(event); + if(event.getRepeatCount() != 0) return true; //We consume but no need to recheck since it was already sent once. if(Gamepad.isGamepadEvent(event)){ if(gamepad == null){ From e61c94a0a6a655e24311bdad7071618d62afaf9d Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Wed, 7 Jul 2021 23:41:44 +0200 Subject: [PATCH 145/179] Fix keyboard events being interpreted as gamepad events --- .../pojavlaunch/customcontrols/gamepad/GamepadDpad.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadDpad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadDpad.java index 09e59f632..2196c3f2d 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadDpad.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadDpad.java @@ -7,6 +7,8 @@ import android.view.MotionEvent; import java.lang.reflect.Field; +import static android.view.InputDevice.KEYBOARD_TYPE_NON_ALPHABETIC; + /* Code from the android documentation */ @@ -97,8 +99,7 @@ public class GamepadDpad { public static boolean isDpadEvent(InputEvent event) { // Check that input comes from a device with directional pads. // And... also the joystick since it declares sometimes as a joystick. - - return (event.getSource() & InputDevice.SOURCE_DPAD) == InputDevice.SOURCE_DPAD - || (event.getSource() & InputDevice.SOURCE_JOYSTICK) == InputDevice.SOURCE_JOYSTICK; + return (event.getSource() & InputDevice.SOURCE_JOYSTICK) == InputDevice.SOURCE_JOYSTICK && + ((event.getSource() & InputDevice.SOURCE_DPAD) == InputDevice.SOURCE_DPAD) && (event.getDevice().getKeyboardType() == KEYBOARD_TYPE_NON_ALPHABETIC); } } \ No newline at end of file From 4f0bae9431031eae57389d3ba8d4cdd91d92d538 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Thu, 15 Jul 2021 19:08:55 +0200 Subject: [PATCH 146/179] Optimize mouse movements a very little. --- .../src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java index 1149b1b6d..64eb4fd10 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java @@ -578,6 +578,7 @@ public class BaseMainActivity extends LoggableActivity { for(int i = 0; i < ev.getPointerCount(); i++) { if(ev.getToolType(i) == MotionEvent.TOOL_TYPE_MOUSE) { mouseCursorIndex = i; + break; } } if(mouseCursorIndex == -1) return false; // we cant consoom that, theres no mice! From 905f05605b00f2945552e5fc220504486e876729 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Thu, 15 Jul 2021 19:09:27 +0200 Subject: [PATCH 147/179] Fix typo --- .../pojavlaunch/customcontrols/gamepad/GamepadDpad.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadDpad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadDpad.java index 2196c3f2d..d16fe8824 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadDpad.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadDpad.java @@ -22,12 +22,12 @@ public class GamepadDpad { int pressedDirection = -1; Gamepad parentPad; - KeyEvent dummyevent = new KeyEvent(KeyEvent.ACTION_DOWN, CENTER); + KeyEvent dummyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, CENTER); Field eventCodeField; { try { - eventCodeField = dummyevent.getClass().getDeclaredField("mKeyCode"); + eventCodeField = dummyEvent.getClass().getDeclaredField("mKeyCode"); eventCodeField.setAccessible(true); } catch (NoSuchFieldException e) { e.printStackTrace(); @@ -88,11 +88,11 @@ public class GamepadDpad { } try { - eventCodeField.setInt(dummyevent, pressedDirection); + eventCodeField.setInt(dummyEvent, pressedDirection); } catch (IllegalAccessException e) { e.printStackTrace(); } - parentPad.sendButton(dummyevent); + parentPad.sendButton(dummyEvent); return pressedDirection; } From 17ab69dfada7310e3322fc1d9d017d9ab19fd00d Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Fri, 16 Jul 2021 18:49:44 +0200 Subject: [PATCH 148/179] light optimisation of motion events on Gamepad.java --- .../customcontrols/gamepad/Gamepad.java | 26 ++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java index 8fcef8ea4..b9d65c0fd 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java @@ -5,6 +5,7 @@ import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; import android.widget.ImageView; +import android.widget.Toast; import net.kdt.pojavlaunch.BaseMainActivity; import net.kdt.pojavlaunch.LWJGLGLFWKeycode; @@ -50,6 +51,7 @@ public class Gamepad { private GamepadMap currentMap = gameMap; private boolean lastGrabbingState = true; + private MotionEvent lastMotionEvent = null; private final Thread mouseThread; @@ -57,6 +59,8 @@ public class Gamepad { private final Runnable switchStateRunnable; public Gamepad(BaseMainActivity gameActivity, InputDevice inputDevice){ + Toast.makeText(gameActivity.getApplicationContext(),"GAMEPAD CREATED", Toast.LENGTH_LONG).show(); + leftJoystick = new GamepadJoystick(MotionEvent.AXIS_X, MotionEvent.AXIS_Y, inputDevice); rightJoystick = new GamepadJoystick(MotionEvent.AXIS_Z, MotionEvent.AXIS_RZ, inputDevice); @@ -99,6 +103,12 @@ public class Gamepad { } private void tick(){ + if(lastMotionEvent != null){ + updateDirectionalJoystick(lastMotionEvent); + updateMouseJoystick(lastMotionEvent); + updateAnalogTriggers(lastMotionEvent); + } + if(lastHorizontalValue != 0 || lastVerticalValue != 0){ GamepadJoystick currentJoystick = CallbackBridge.isGrabbing() ? leftJoystick : rightJoystick; @@ -227,10 +237,9 @@ public class Gamepad { } public void update(MotionEvent event){ - gamepadDpad.update(event); - updateDirectionalJoystick(event); - updateMouseJoystick(event); - updateAnalogTriggers(event); + lastMotionEvent = event; + if(gamepadDpad.update(event) != -1) return; + //The rest of events are now sent each 1/60 second. } private void updateMouseJoystick(MotionEvent event){ @@ -388,12 +397,12 @@ public class Gamepad { break; case LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT: - CallbackBridge.putMouseEventWithCoords(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT, isDown?1:0, CallbackBridge.mouseX, CallbackBridge.mouseY); - //MainActivity.sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT, isDown); + //CallbackBridge.putMouseEventWithCoords(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT, isDown?1:0, CallbackBridge.mouseX, CallbackBridge.mouseY); + MainActivity.sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT, isDown); break; case LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT: - CallbackBridge.putMouseEventWithCoords(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT, isDown?1:0, CallbackBridge.mouseX, CallbackBridge.mouseY); - //MainActivity.sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT, isDown); + //CallbackBridge.putMouseEventWithCoords(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT, isDown?1:0, CallbackBridge.mouseX, CallbackBridge.mouseY); + MainActivity.sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT, isDown); break; @@ -410,7 +419,6 @@ public class Gamepad { } public static boolean isGamepadEvent(KeyEvent event){ - //return false; return ((event.getSource() & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD From 606d633ee35af7455c21ade3862bf5ee0cfe90f0 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Fri, 16 Jul 2021 18:51:01 +0200 Subject: [PATCH 149/179] Add more filters while dispatching events. --- .../src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java index 64eb4fd10..5e104f8e7 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java @@ -616,8 +616,8 @@ public class BaseMainActivity extends LoggableActivity { @Override public boolean dispatchKeyEvent(KeyEvent event) { System.out.println(event); - if(event.getRepeatCount() != 0) return true; //We consume but no need to recheck since it was already sent once. - + if(event.getRepeatCount() != 0 || event.getAction() == KeyEvent.ACTION_MULTIPLE) return true; //We consume but no need to recheck since it was already sent once. + if(Gamepad.isGamepadEvent(event)){ if(gamepad == null){ gamepad = new Gamepad(this, event.getDevice()); From 52f23f33a9fbae9e87cdbdab2a5a80236f0f4be8 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Sat, 17 Jul 2021 13:14:04 +0200 Subject: [PATCH 150/179] Proper filtering of fallback keyevents --- .../src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java index 5e104f8e7..f9cd4e271 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java @@ -615,8 +615,9 @@ public class BaseMainActivity extends LoggableActivity { @Override public boolean dispatchKeyEvent(KeyEvent event) { + System.out.println(event); - if(event.getRepeatCount() != 0 || event.getAction() == KeyEvent.ACTION_MULTIPLE) return true; //We consume but no need to recheck since it was already sent once. + if(event.getRepeatCount() != 0 || event.getAction() == KeyEvent.ACTION_MULTIPLE || event.getFlags() == KeyEvent.FLAG_FALLBACK) return true; //We consume but no need to recheck since it was already sent once. if(Gamepad.isGamepadEvent(event)){ if(gamepad == null){ From 7a49cadaaa472e1fd035667a8b62697a88beef79 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Sat, 17 Jul 2021 22:46:04 +0200 Subject: [PATCH 151/179] Implement a checkboard pattern for the background color of buttons --- app_pojavlauncher/build.gradle | 1 + .../handleview/ActionPopupWindow.java | 7 +++-- .../handleview/EditControlButtonPopup.java | 28 +++++++++++++++---- 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/app_pojavlauncher/build.gradle b/app_pojavlauncher/build.gradle index 63710446a..52a9965c2 100644 --- a/app_pojavlauncher/build.gradle +++ b/app_pojavlauncher/build.gradle @@ -125,6 +125,7 @@ dependencies { implementation "androidx.constraintlayout:constraintlayout:2.0.4" implementation 'com.rarepebble:colorpicker:3.0.1' + implementation 'com.github.duanhong169:checkerboarddrawable:1.0.2' // implementation 'com.intuit.sdp:sdp-android:1.0.5' diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/ActionPopupWindow.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/ActionPopupWindow.java index 5c4836cc9..cbcc33aad 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/ActionPopupWindow.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/ActionPopupWindow.java @@ -20,6 +20,7 @@ package net.kdt.pojavlaunch.customcontrols.handleview; import android.content.*; +import android.graphics.drawable.ColorDrawable; import android.view.*; import android.view.ViewGroup.*; import android.widget.*; @@ -152,7 +153,9 @@ public class ActionPopupWindow extends PinnedPopupWindow implements OnClickListe } - public static void showColorPicker(Context ctx,String title, boolean showAlpha, int startColor, View v){ + public static void showColorPicker(Context ctx,String title, boolean showAlpha, ImageView v){ + int startColor = ((ColorDrawable)v.getDrawable()).getColor(); + ColorPickerView picker = new ColorPickerView(ctx); picker.setColor(startColor); picker.showAlpha(showAlpha); @@ -161,7 +164,7 @@ public class ActionPopupWindow extends PinnedPopupWindow implements OnClickListe dialog.setTitle(title); dialog.setView(picker); dialog.setNegativeButton(android.R.string.cancel, null); - dialog.setPositiveButton(android.R.string.ok, (dialogInterface, i) -> v.setBackgroundColor(picker.getColor())); + dialog.setPositiveButton(android.R.string.ok, (dialogInterface, i) -> v.setImageDrawable(new ColorDrawable(picker.getColor()))); dialog.show(); } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java index aa6358592..9c79a7c48 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java @@ -2,6 +2,7 @@ package net.kdt.pojavlaunch.customcontrols.handleview; import android.app.Dialog; import android.content.Context; +import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.view.LayoutInflater; import android.view.View; @@ -17,9 +18,12 @@ import androidx.appcompat.app.AlertDialog; import net.kdt.pojavlaunch.EfficientAndroidLWJGLKeycode; import net.kdt.pojavlaunch.R; +import net.kdt.pojavlaunch.Tools; import net.kdt.pojavlaunch.customcontrols.buttons.ControlButton; import net.kdt.pojavlaunch.customcontrols.ControlData; +import top.defaults.checkerboarddrawable.CheckerboardDrawable; + import static net.kdt.pojavlaunch.customcontrols.handleview.ActionPopupWindow.setPercentageText; public class EditControlButtonPopup { @@ -171,8 +175,8 @@ public class EditControlButtonPopup { } //Set color imageButton behavior - buttonBackgroundColor.setOnClickListener(view -> ActionPopupWindow.showColorPicker(ctx, "Edit background color", true, ((ColorDrawable) buttonBackgroundColor.getBackground()).getColor(), buttonBackgroundColor)); - buttonStrokeColor.setOnClickListener(view -> ActionPopupWindow.showColorPicker(ctx, "Edit stroke color", false, ((ColorDrawable) buttonStrokeColor.getBackground()).getColor(), buttonStrokeColor)); + buttonBackgroundColor.setOnClickListener(view -> ActionPopupWindow.showColorPicker(ctx, "Edit background color", true, buttonBackgroundColor)); + buttonStrokeColor.setOnClickListener(view -> ActionPopupWindow.showColorPicker(ctx, "Edit stroke color", false, buttonStrokeColor)); //Set dialog buttons behavior @@ -180,6 +184,7 @@ public class EditControlButtonPopup { hideUselessViews(); + setupCheckerboards(); } protected void setupDialogButtons(){ @@ -196,6 +201,17 @@ public class EditControlButtonPopup { (v.findViewById(R.id.editOrientation_textView)).setVisibility(View.GONE); } + private void setupCheckerboards(){ + CheckerboardDrawable drawable = new CheckerboardDrawable.Builder() + .colorEven(Color.LTGRAY) + .colorOdd(Color.WHITE) + .size((int) Tools.dpToPx(20)) + .build(); + + buttonBackgroundColor.setBackground(drawable); + buttonStrokeColor.setBackground(drawable); + } + protected void setEditDialogValues(){ editName.setText(properties.name); @@ -218,8 +234,8 @@ public class EditControlButtonPopup { seekBarStrokeWidth.setProgress(properties.strokeWidth); seekBarCornerRadius.setProgress((int)properties.cornerRadius); - buttonBackgroundColor.setBackgroundColor(properties.bgColor); - buttonStrokeColor.setBackgroundColor(properties.strokeColor); + buttonBackgroundColor.setImageDrawable(new ColorDrawable(properties.bgColor)); + buttonStrokeColor.setImageDrawable(new ColorDrawable(properties.strokeColor)); setPercentageText(textCornerRadius,seekBarCornerRadius.getProgress()); setPercentageText(textOpacity,seekBarOpacity.getProgress()); @@ -280,8 +296,8 @@ public class EditControlButtonPopup { properties.strokeWidth = seekBarStrokeWidth.getProgress(); properties.cornerRadius = seekBarCornerRadius.getProgress(); - properties.bgColor = ((ColorDrawable) buttonBackgroundColor.getBackground()).getColor(); - properties.strokeColor = ((ColorDrawable) buttonStrokeColor.getBackground()).getColor(); + properties.bgColor = ((ColorDrawable)buttonBackgroundColor.getDrawable()).getColor(); + properties.strokeColor = ((ColorDrawable) buttonStrokeColor.getDrawable()).getColor(); properties.isToggle = checkToggle.isChecked(); properties.passThruEnabled = checkPassThrough.isChecked(); From 779352a0963203648e30f393d01f1433d791da71 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Sat, 17 Jul 2021 22:46:10 +0200 Subject: [PATCH 152/179] Update build.gradle --- app_pojavlauncher/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app_pojavlauncher/build.gradle b/app_pojavlauncher/build.gradle index 52a9965c2..a8f847e90 100644 --- a/app_pojavlauncher/build.gradle +++ b/app_pojavlauncher/build.gradle @@ -116,9 +116,9 @@ dependencies { // implementation 'com.wu-man:android-bsf-api:3.1.3' implementation 'androidx.legacy:legacy-support-v4:1.0.0' implementation 'androidx.preference:preference:1.1.1' - implementation 'androidx.appcompat:appcompat:1.2.0' + implementation 'androidx.appcompat:appcompat:1.3.0' implementation 'androidx.legacy:legacy-preference-v14:1.0.0' - implementation 'com.google.android.material:material:1.3.0' + implementation 'com.google.android.material:material:1.4.0' implementation 'androidx.annotation:annotation:1.2.0' implementation 'androidx.browser:browser:1.3.0' From d150d38187ae4abf8b31d28ec80c32c946d88b25 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Sun, 18 Jul 2021 16:30:17 +0200 Subject: [PATCH 153/179] Limit gamepad pointer range --- .../net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java index b9d65c0fd..c19387b5f 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java @@ -120,6 +120,8 @@ public class Gamepad { CallbackBridge.mouseX += Math.cos(mouseAngle) * acceleration * mouseSensitivity; CallbackBridge.mouseY -= Math.sin(mouseAngle) * acceleration * mouseSensitivity; + CallbackBridge.mouseX = MathUtils.clamp(CallbackBridge.mouseX, 0, CallbackBridge.windowWidth); + CallbackBridge.mouseY = MathUtils.clamp(CallbackBridge.mouseY, 0, CallbackBridge.windowHeight); gameActivity.mouse_x = CallbackBridge.mouseX; gameActivity.mouse_y = CallbackBridge.mouseY; From 9f93161aca0deb59ac9f161770180076df59422e Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Sun, 18 Jul 2021 16:30:59 +0200 Subject: [PATCH 154/179] Pointer placement is size aware. --- .../net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java index c19387b5f..6952a9886 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java @@ -308,8 +308,8 @@ public class Gamepad { } private void placePointerView(int x, int y){ - pointerView.setX(x-32); - pointerView.setY(y-32); + pointerView.setX(x - pointerView.getWidth()/2); + pointerView.setY(y - pointerView.getHeight()/2); } From a4b37a79291f8be120fa46e4dcdb21fc196539e8 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Mon, 19 Jul 2021 09:08:16 +0200 Subject: [PATCH 155/179] Fix gamepad mouse clamping when in game. --- .../pojavlaunch/customcontrols/gamepad/Gamepad.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java index 6952a9886..7b5c6d322 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java @@ -1,12 +1,16 @@ package net.kdt.pojavlaunch.customcontrols.gamepad; + import android.view.InputDevice; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; +import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.Toast; +import androidx.core.math.MathUtils; + import net.kdt.pojavlaunch.BaseMainActivity; import net.kdt.pojavlaunch.LWJGLGLFWKeycode; import net.kdt.pojavlaunch.MainActivity; @@ -120,8 +124,10 @@ public class Gamepad { CallbackBridge.mouseX += Math.cos(mouseAngle) * acceleration * mouseSensitivity; CallbackBridge.mouseY -= Math.sin(mouseAngle) * acceleration * mouseSensitivity; - CallbackBridge.mouseX = MathUtils.clamp(CallbackBridge.mouseX, 0, CallbackBridge.windowWidth); - CallbackBridge.mouseY = MathUtils.clamp(CallbackBridge.mouseY, 0, CallbackBridge.windowHeight); + if(!CallbackBridge.isGrabbing()) { + CallbackBridge.mouseX = MathUtils.clamp(CallbackBridge.mouseX, 0, CallbackBridge.windowWidth); + CallbackBridge.mouseY = MathUtils.clamp(CallbackBridge.mouseY, 0, CallbackBridge.windowHeight); + } gameActivity.mouse_x = CallbackBridge.mouseX; gameActivity.mouse_y = CallbackBridge.mouseY; From 047a9f6043c4f736e8dc2e5a9eac84add28491e6 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Mon, 19 Jul 2021 09:11:51 +0200 Subject: [PATCH 156/179] W.I.P dynamic pointer size according to GUI scale --- .../net/kdt/pojavlaunch/BaseMainActivity.java | 2 ++ .../customcontrols/gamepad/Gamepad.java | 6 ++++++ .../src/main/res/drawable-xhdpi/pointer.png | Bin 861 -> 0 bytes .../src/main/res/drawable/pointer.png | Bin 0 -> 258 bytes .../src/main/res/layout/main_with_customctrl.xml | 6 +++--- 5 files changed, 11 insertions(+), 3 deletions(-) delete mode 100755 app_pojavlauncher/src/main/res/drawable-xhdpi/pointer.png create mode 100644 app_pojavlauncher/src/main/res/drawable/pointer.png diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java index f9cd4e271..61626a5ff 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java @@ -934,6 +934,8 @@ public class BaseMainActivity extends LoggableActivity { if(scale < this.guiScale || guiScale == 0){ this.guiScale = scale; } + + if(gamepad != null) gamepad.notifyGUISizeChange(this.guiScale); } public int handleGuiBar(int x, int y) { diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java index 7b5c6d322..e9ecec9ec 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java @@ -276,6 +276,12 @@ public class Gamepad { getCurrentMap().TRIGGER_RIGHT.update(event.getAxisValue(MotionEvent.AXIS_RTRIGGER) > 0.5); } + public void notifyGUISizeChange(int newSize){ + //Change the pointer size to match UI + int size = (int) ((22 * newSize) / gameActivity.scaleFactor); + gameActivity.runOnUiThread(() -> pointerView.setLayoutParams(new FrameLayout.LayoutParams(size, size))); + } + private GamepadMap getCurrentMap(){ return currentMap; } diff --git a/app_pojavlauncher/src/main/res/drawable-xhdpi/pointer.png b/app_pojavlauncher/src/main/res/drawable-xhdpi/pointer.png deleted file mode 100755 index 9a3fceb7649c9944441b7fb16b5313878306b705..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 861 zcmV-j1ETziP)DbwT>X+$100IAj?ifBR0D^= zq=Ccq0otVG)=O=X7$);=wXja0*Sv6@^)u@fxL3fLY~C1wSUsy|gw z;r0b#@EavC z(mr{dlI+CPE*U77rWWQ!DXux=C#GKRWLu@UU2>=tr`p_{gmW`EmkdixO`(kxd~9dK z%9(K6(gsUIO>xak+r`#flntg&{xC5~lubEflfb-cDz2P}c33MQ4JdYH7M{f9JJr?@&ELVADPsA zJy)}It!3)|IEhWMYU!nfEf&wqIOd#VY|&gQ6ZNz0aY^0BPK{@L**mOH<*jg@6fGnD z;IIJGxr#mC)sCI8`jn(^-RT%`DOz1&X6-KHx4%#CO1iuL!1K0?hj+6+iCOLVWtGa2 z9F-NPrjKM6jezI)8&r+Zh89ZJ6T-G@yGywpc CVPjbU literal 0 HcmV?d00001 diff --git a/app_pojavlauncher/src/main/res/layout/main_with_customctrl.xml b/app_pojavlauncher/src/main/res/layout/main_with_customctrl.xml index ecbeb9517..da94434a0 100644 --- a/app_pojavlauncher/src/main/res/layout/main_with_customctrl.xml +++ b/app_pojavlauncher/src/main/res/layout/main_with_customctrl.xml @@ -41,9 +41,9 @@ From ef05b9c955d245ea7c8aa20c9bb8290a362f5b7c Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Mon, 19 Jul 2021 09:53:06 +0200 Subject: [PATCH 157/179] Clean up some code --- .../customcontrols/gamepad/Gamepad.java | 20 +++++++------------ 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java index e9ecec9ec..abb0b45c2 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java @@ -124,18 +124,17 @@ public class Gamepad { CallbackBridge.mouseX += Math.cos(mouseAngle) * acceleration * mouseSensitivity; CallbackBridge.mouseY -= Math.sin(mouseAngle) * acceleration * mouseSensitivity; - if(!CallbackBridge.isGrabbing()) { - CallbackBridge.mouseX = MathUtils.clamp(CallbackBridge.mouseX, 0, CallbackBridge.windowWidth); - CallbackBridge.mouseY = MathUtils.clamp(CallbackBridge.mouseY, 0, CallbackBridge.windowHeight); - } - gameActivity.mouse_x = CallbackBridge.mouseX; - gameActivity.mouse_y = CallbackBridge.mouseY; gameActivity.runOnUiThread(mouseRunnable); if(!CallbackBridge.isGrabbing()){ - placePointerView((int)(CallbackBridge.mouseX / gameActivity.scaleFactor), (int) (CallbackBridge.mouseY / gameActivity.scaleFactor)); + CallbackBridge.mouseX = MathUtils.clamp(CallbackBridge.mouseX, 0, CallbackBridge.windowWidth); + CallbackBridge.mouseY = MathUtils.clamp(CallbackBridge.mouseY, 0, CallbackBridge.windowHeight); + placePointerView((int) (CallbackBridge.mouseX /gameActivity.scaleFactor), (int) (CallbackBridge.mouseY/gameActivity.scaleFactor)); } + + gameActivity.mouse_x = CallbackBridge.mouseX; + gameActivity.mouse_y = CallbackBridge.mouseY; } } @@ -145,7 +144,7 @@ public class Gamepad { //Initialize runnables to be used by the input system, avoiding generating one each time is better memory. - mouseRunnable = () -> CallbackBridge.sendCursorPos(gameActivity.mouse_x, gameActivity.mouse_y); + mouseRunnable = () -> CallbackBridge.sendCursorPos(CallbackBridge.mouseX, CallbackBridge.mouseY); switchStateRunnable = () -> { currentMap.resetPressedState(); if(lastGrabbingState){ @@ -433,12 +432,7 @@ public class Gamepad { } public static boolean isGamepadEvent(KeyEvent event){ - - return ((event.getSource() & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD || GamepadDpad.isDpadEvent(event) ); - - } - } From 284d0f207da2ebd6624933773535110a909ffd8c Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Mon, 19 Jul 2021 11:32:41 +0200 Subject: [PATCH 158/179] Revert "light optimisation of motion events on Gamepad.java" This reverts commit 5c010ef076a34ff304b6b47317f53a027b96d431. Conflicts: app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java --- .../customcontrols/gamepad/Gamepad.java | 25 ++++++------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java index abb0b45c2..58c65f17b 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java @@ -7,7 +7,6 @@ import android.view.MotionEvent; import android.view.View; import android.widget.FrameLayout; import android.widget.ImageView; -import android.widget.Toast; import androidx.core.math.MathUtils; @@ -55,7 +54,6 @@ public class Gamepad { private GamepadMap currentMap = gameMap; private boolean lastGrabbingState = true; - private MotionEvent lastMotionEvent = null; private final Thread mouseThread; @@ -63,8 +61,6 @@ public class Gamepad { private final Runnable switchStateRunnable; public Gamepad(BaseMainActivity gameActivity, InputDevice inputDevice){ - Toast.makeText(gameActivity.getApplicationContext(),"GAMEPAD CREATED", Toast.LENGTH_LONG).show(); - leftJoystick = new GamepadJoystick(MotionEvent.AXIS_X, MotionEvent.AXIS_Y, inputDevice); rightJoystick = new GamepadJoystick(MotionEvent.AXIS_Z, MotionEvent.AXIS_RZ, inputDevice); @@ -107,12 +103,6 @@ public class Gamepad { } private void tick(){ - if(lastMotionEvent != null){ - updateDirectionalJoystick(lastMotionEvent); - updateMouseJoystick(lastMotionEvent); - updateAnalogTriggers(lastMotionEvent); - } - if(lastHorizontalValue != 0 || lastVerticalValue != 0){ GamepadJoystick currentJoystick = CallbackBridge.isGrabbing() ? leftJoystick : rightJoystick; @@ -244,9 +234,10 @@ public class Gamepad { } public void update(MotionEvent event){ - lastMotionEvent = event; - if(gamepadDpad.update(event) != -1) return; - //The rest of events are now sent each 1/60 second. + gamepadDpad.update(event); + updateDirectionalJoystick(event); + updateMouseJoystick(event); + updateAnalogTriggers(event); } private void updateMouseJoystick(MotionEvent event){ @@ -410,12 +401,12 @@ public class Gamepad { break; case LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT: - //CallbackBridge.putMouseEventWithCoords(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT, isDown?1:0, CallbackBridge.mouseX, CallbackBridge.mouseY); - MainActivity.sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT, isDown); + CallbackBridge.putMouseEventWithCoords(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT, isDown?1:0, CallbackBridge.mouseX, CallbackBridge.mouseY); + //MainActivity.sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT, isDown); break; case LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT: - //CallbackBridge.putMouseEventWithCoords(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT, isDown?1:0, CallbackBridge.mouseX, CallbackBridge.mouseY); - MainActivity.sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT, isDown); + CallbackBridge.putMouseEventWithCoords(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT, isDown?1:0, CallbackBridge.mouseX, CallbackBridge.mouseY); + //MainActivity.sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT, isDown); break; From 5855b1ef931caa44fb76c3db49b4e335aaf6f625 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Mon, 19 Jul 2021 11:47:04 +0200 Subject: [PATCH 159/179] Revert "Revert "light optimisation of motion events on Gamepad.java"" This reverts commit ebf90783117db65c097f4626e900cf241a60a2a4. --- .../customcontrols/gamepad/Gamepad.java | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java index 58c65f17b..abb0b45c2 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java @@ -7,6 +7,7 @@ import android.view.MotionEvent; import android.view.View; import android.widget.FrameLayout; import android.widget.ImageView; +import android.widget.Toast; import androidx.core.math.MathUtils; @@ -54,6 +55,7 @@ public class Gamepad { private GamepadMap currentMap = gameMap; private boolean lastGrabbingState = true; + private MotionEvent lastMotionEvent = null; private final Thread mouseThread; @@ -61,6 +63,8 @@ public class Gamepad { private final Runnable switchStateRunnable; public Gamepad(BaseMainActivity gameActivity, InputDevice inputDevice){ + Toast.makeText(gameActivity.getApplicationContext(),"GAMEPAD CREATED", Toast.LENGTH_LONG).show(); + leftJoystick = new GamepadJoystick(MotionEvent.AXIS_X, MotionEvent.AXIS_Y, inputDevice); rightJoystick = new GamepadJoystick(MotionEvent.AXIS_Z, MotionEvent.AXIS_RZ, inputDevice); @@ -103,6 +107,12 @@ public class Gamepad { } private void tick(){ + if(lastMotionEvent != null){ + updateDirectionalJoystick(lastMotionEvent); + updateMouseJoystick(lastMotionEvent); + updateAnalogTriggers(lastMotionEvent); + } + if(lastHorizontalValue != 0 || lastVerticalValue != 0){ GamepadJoystick currentJoystick = CallbackBridge.isGrabbing() ? leftJoystick : rightJoystick; @@ -234,10 +244,9 @@ public class Gamepad { } public void update(MotionEvent event){ - gamepadDpad.update(event); - updateDirectionalJoystick(event); - updateMouseJoystick(event); - updateAnalogTriggers(event); + lastMotionEvent = event; + if(gamepadDpad.update(event) != -1) return; + //The rest of events are now sent each 1/60 second. } private void updateMouseJoystick(MotionEvent event){ @@ -401,12 +410,12 @@ public class Gamepad { break; case LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT: - CallbackBridge.putMouseEventWithCoords(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT, isDown?1:0, CallbackBridge.mouseX, CallbackBridge.mouseY); - //MainActivity.sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT, isDown); + //CallbackBridge.putMouseEventWithCoords(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT, isDown?1:0, CallbackBridge.mouseX, CallbackBridge.mouseY); + MainActivity.sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT, isDown); break; case LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT: - CallbackBridge.putMouseEventWithCoords(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT, isDown?1:0, CallbackBridge.mouseX, CallbackBridge.mouseY); - //MainActivity.sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT, isDown); + //CallbackBridge.putMouseEventWithCoords(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT, isDown?1:0, CallbackBridge.mouseX, CallbackBridge.mouseY); + MainActivity.sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT, isDown); break; From c2e851fc8ffb960274f189a1f84d81eb079257aa Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Mon, 19 Jul 2021 16:03:12 +0200 Subject: [PATCH 160/179] - Gamepad optimisations (now works on 1.13+) --- .../customcontrols/gamepad/Gamepad.java | 114 ++++-------------- .../customcontrols/gamepad/GamepadMap.java | 111 +++++++++++++++-- 2 files changed, 126 insertions(+), 99 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java index abb0b45c2..4e0f21f87 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java @@ -31,10 +31,10 @@ import static net.kdt.pojavlaunch.customcontrols.gamepad.GamepadJoystick.isJoyst public class Gamepad { - private BaseMainActivity gameActivity; - private ImageView pointerView; + private final BaseMainActivity gameActivity; + private final ImageView pointerView; - private GamepadDpad gamepadDpad = new GamepadDpad(this); + private final GamepadDpad gamepadDpad = new GamepadDpad(this); private final GamepadJoystick leftJoystick; private int currentJoystickDirection = DIRECTION_NONE; @@ -50,17 +50,17 @@ public class Gamepad { private double mouseAngle; private double mouseSensitivity = 19; - private final GamepadMap gameMap = new GamepadMap(); - private final GamepadMap menuMap = new GamepadMap(); + private final GamepadMap gameMap = GamepadMap.getDefaultGameMap(); + private final GamepadMap menuMap = GamepadMap.getDefaultMenuMap(); private GamepadMap currentMap = gameMap; private boolean lastGrabbingState = true; private MotionEvent lastMotionEvent = null; - private final Thread mouseThread; private final Runnable mouseRunnable; private final Runnable switchStateRunnable; + private final Runnable motionEventRunnable; public Gamepad(BaseMainActivity gameActivity, InputDevice inputDevice){ Toast.makeText(gameActivity.getApplicationContext(),"GAMEPAD CREATED", Toast.LENGTH_LONG).show(); @@ -68,10 +68,8 @@ public class Gamepad { leftJoystick = new GamepadJoystick(MotionEvent.AXIS_X, MotionEvent.AXIS_Y, inputDevice); rightJoystick = new GamepadJoystick(MotionEvent.AXIS_Z, MotionEvent.AXIS_RZ, inputDevice); - this.gameActivity = gameActivity; pointerView = this.gameActivity.findViewById(R.id.console_pointer); - createMapping(); mouseThread = new Thread("Gamepad Thread"){ long lastTime = System.nanoTime(); @@ -89,32 +87,21 @@ public class Gamepad { if(delta >= 1) { updateGrabbingState(); - tick(); delta--; - - try { - sleep(Math.max((long) ( (1 - delta) * (1000/ticks) ), 0)); - - } catch (InterruptedException e) { - e.printStackTrace(); - } - + try{ sleep(Math.max((long) ( (1 - delta) * (1000/ticks) ), 0)); } catch (InterruptedException e) {e.printStackTrace();} } } } private void tick(){ - if(lastMotionEvent != null){ - updateDirectionalJoystick(lastMotionEvent); - updateMouseJoystick(lastMotionEvent); - updateAnalogTriggers(lastMotionEvent); - } + //Update motion events, and the mouse position + if(lastMotionEvent != null)gameActivity.runOnUiThread(motionEventRunnable); if(lastHorizontalValue != 0 || lastVerticalValue != 0){ - GamepadJoystick currentJoystick = CallbackBridge.isGrabbing() ? leftJoystick : rightJoystick; + GamepadJoystick currentJoystick = lastGrabbingState ? leftJoystick : rightJoystick; acceleration = (mouseMagnitude - currentJoystick.getDeadzone())/(1 - currentJoystick.getDeadzone()); acceleration = Math.pow(acceleration, mouseMaxAcceleration); @@ -127,7 +114,7 @@ public class Gamepad { gameActivity.runOnUiThread(mouseRunnable); - if(!CallbackBridge.isGrabbing()){ + if(!lastGrabbingState){ CallbackBridge.mouseX = MathUtils.clamp(CallbackBridge.mouseX, 0, CallbackBridge.windowWidth); CallbackBridge.mouseY = MathUtils.clamp(CallbackBridge.mouseY, 0, CallbackBridge.windowHeight); placePointerView((int) (CallbackBridge.mouseX /gameActivity.scaleFactor), (int) (CallbackBridge.mouseY/gameActivity.scaleFactor)); @@ -164,6 +151,14 @@ public class Gamepad { pointerView.setVisibility(View.VISIBLE); mouseSensitivity = 15; //sensitivity in game doesn't need to be resolution dependent }; + + motionEventRunnable = () -> { + updateDirectionalJoystick(lastMotionEvent); + updateMouseJoystick(lastMotionEvent); + updateAnalogTriggers(lastMotionEvent); + gamepadDpad.update(lastMotionEvent); + }; + } private void updateGrabbingState() { @@ -174,83 +169,18 @@ public class Gamepad { } } - private void createMapping(){ - //create mappings to fit our needs - - //GAMEMAP - gameMap.BUTTON_A.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_SPACE}; - gameMap.BUTTON_B.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_Q}; - gameMap.BUTTON_X.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_F}; - gameMap.BUTTON_Y.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_E}; - - gameMap.DIRECTION_FORWARD = new int[]{LWJGLGLFWKeycode.GLFW_KEY_W}; - gameMap.DIRECTION_BACKWARD = new int[]{LWJGLGLFWKeycode.GLFW_KEY_S}; - gameMap.DIRECTION_RIGHT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_D}; - gameMap.DIRECTION_LEFT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_A}; - - gameMap.DPAD_UP.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_W}; - gameMap.DPAD_DOWN.keycodes = new int[]{}; - gameMap.DPAD_RIGHT.keycodes = new int[]{}; - gameMap.DPAD_LEFT.keycodes = new int[]{}; - - gameMap.SHOULDER_LEFT.keycodes = new int[]{GamepadMap.MOUSE_SCROLL_UP}; - gameMap.SHOULDER_RIGHT.keycodes = new int[]{GamepadMap.MOUSE_SCROLL_DOWN}; - - gameMap.TRIGGER_LEFT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT}; - gameMap.TRIGGER_RIGHT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT}; - - gameMap.THUMBSTICK_LEFT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_LEFT_SHIFT}; - gameMap.THUMBSTICK_LEFT.isToggleable = true; - gameMap.THUMBSTICK_RIGHT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_F5}; - - gameMap.BUTTON_START.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_ESCAPE}; - gameMap.BUTTON_SELECT.keycodes = new int[]{}; - - - //MENU MAP - menuMap.BUTTON_A.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT}; - menuMap.BUTTON_B.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_ESCAPE}; - menuMap.BUTTON_X.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT}; - menuMap.BUTTON_Y.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_LEFT_SHIFT, LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT}; //Oops, doesn't work since left shift isn't properly applied. - - menuMap.DIRECTION_FORWARD = new int[]{GamepadMap.MOUSE_SCROLL_UP, GamepadMap.MOUSE_SCROLL_UP, GamepadMap.MOUSE_SCROLL_UP, GamepadMap.MOUSE_SCROLL_UP, GamepadMap.MOUSE_SCROLL_UP}; - menuMap.DIRECTION_BACKWARD = new int[]{GamepadMap.MOUSE_SCROLL_DOWN, GamepadMap.MOUSE_SCROLL_DOWN, GamepadMap.MOUSE_SCROLL_DOWN, GamepadMap.MOUSE_SCROLL_DOWN, GamepadMap.MOUSE_SCROLL_DOWN}; - menuMap.DIRECTION_RIGHT = new int[]{}; - menuMap.DIRECTION_LEFT = new int[]{}; - - menuMap.DPAD_UP.keycodes = new int[]{}; - menuMap.DPAD_DOWN.keycodes = new int[]{}; - menuMap.DPAD_RIGHT.keycodes = new int[]{}; - menuMap.DPAD_LEFT.keycodes = new int[]{}; - - menuMap.SHOULDER_LEFT.keycodes = new int[]{GamepadMap.MOUSE_SCROLL_UP}; - menuMap.SHOULDER_RIGHT.keycodes = new int[]{GamepadMap.MOUSE_SCROLL_DOWN}; - - menuMap.TRIGGER_LEFT.keycodes = new int[]{}; - menuMap.TRIGGER_RIGHT.keycodes = new int[]{}; - - menuMap.THUMBSTICK_LEFT.keycodes = new int[]{}; - menuMap.THUMBSTICK_RIGHT.keycodes = new int[]{}; - - menuMap.BUTTON_START.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_ESCAPE}; - menuMap.BUTTON_SELECT.keycodes = new int[]{}; - - - } - public void update(KeyEvent event){ gamepadDpad.update(event); sendButton(event); } public void update(MotionEvent event){ + //Motion events are taken into account every 1/60th second lastMotionEvent = event; - if(gamepadDpad.update(event) != -1) return; - //The rest of events are now sent each 1/60 second. } private void updateMouseJoystick(MotionEvent event){ - GamepadJoystick currentJoystick = CallbackBridge.isGrabbing() ? rightJoystick : leftJoystick; + GamepadJoystick currentJoystick = lastGrabbingState ? rightJoystick : leftJoystick; lastHorizontalValue = currentJoystick.getHorizontalAxis(event); lastVerticalValue = currentJoystick.getVerticalAxis(event); @@ -259,7 +189,7 @@ public class Gamepad { } private void updateDirectionalJoystick(MotionEvent event){ - GamepadJoystick currentJoystick = CallbackBridge.isGrabbing() ? leftJoystick : rightJoystick; + GamepadJoystick currentJoystick = lastGrabbingState ? leftJoystick : rightJoystick; int lastJoystickDirection = currentJoystickDirection; currentJoystickDirection = currentJoystick.getHeightDirection(event); diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadMap.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadMap.java index 798f4b34c..464d1910b 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadMap.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadMap.java @@ -2,22 +2,16 @@ package net.kdt.pojavlaunch.customcontrols.gamepad; import net.kdt.pojavlaunch.LWJGLGLFWKeycode; -import java.security.PublicKey; -import java.util.HashMap; - public class GamepadMap { public static final int MOUSE_SCROLL_DOWN = -1; public static final int MOUSE_SCROLL_UP = -2; - - /* This class is just here to store the mapping can be modified to create re-mappable controls I guess Be warned, you should define ALL keys if you want to avoid a non defined exception - */ public GamepadButton BUTTON_A = new GamepadButton(); @@ -46,8 +40,11 @@ public class GamepadMap { public GamepadButton DPAD_RIGHT = new GamepadButton(); public GamepadButton DPAD_DOWN = new GamepadButton(); public GamepadButton DPAD_LEFT = new GamepadButton(); - + + /* + * Sets all buttons to a not pressed state, sending an input if needed + */ public void resetPressedState(){ BUTTON_A.resetButtonState(); BUTTON_B.resetButtonState(); @@ -73,5 +70,105 @@ public class GamepadMap { } + /* + * Returns a pre-done mapping used when the mouse is grabbed by the game. + */ + public static GamepadMap getDefaultGameMap(){ + GamepadMap gameMap = new GamepadMap(); + + gameMap.BUTTON_A.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_SPACE}; + gameMap.BUTTON_B.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_Q}; + gameMap.BUTTON_X.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_F}; + gameMap.BUTTON_Y.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_E}; + + gameMap.DIRECTION_FORWARD = new int[]{LWJGLGLFWKeycode.GLFW_KEY_W}; + gameMap.DIRECTION_BACKWARD = new int[]{LWJGLGLFWKeycode.GLFW_KEY_S}; + gameMap.DIRECTION_RIGHT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_D}; + gameMap.DIRECTION_LEFT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_A}; + + gameMap.DPAD_UP.keycodes = new int[]{}; + gameMap.DPAD_DOWN.keycodes = new int[]{}; + gameMap.DPAD_RIGHT.keycodes = new int[]{}; + gameMap.DPAD_LEFT.keycodes = new int[]{}; + + gameMap.SHOULDER_LEFT.keycodes = new int[]{GamepadMap.MOUSE_SCROLL_UP}; + gameMap.SHOULDER_RIGHT.keycodes = new int[]{GamepadMap.MOUSE_SCROLL_DOWN}; + + gameMap.TRIGGER_LEFT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT}; + gameMap.TRIGGER_RIGHT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT}; + + gameMap.THUMBSTICK_LEFT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_LEFT_SHIFT}; + gameMap.THUMBSTICK_LEFT.isToggleable = true; + gameMap.THUMBSTICK_RIGHT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_F5}; + + gameMap.BUTTON_START.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_ESCAPE}; + gameMap.BUTTON_SELECT.keycodes = new int[]{}; + + return gameMap; + } + + /* + * Returns a pre-done mapping used when the mouse is NOT grabbed by the game. + */ + public static GamepadMap getDefaultMenuMap(){ + GamepadMap menuMap = new GamepadMap(); + + menuMap.BUTTON_A.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT}; + menuMap.BUTTON_B.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_ESCAPE}; + menuMap.BUTTON_X.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT}; + menuMap.BUTTON_Y.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_LEFT_SHIFT, LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT}; //Oops, doesn't work since left shift isn't properly applied. + + menuMap.DIRECTION_FORWARD = new int[]{GamepadMap.MOUSE_SCROLL_UP, GamepadMap.MOUSE_SCROLL_UP, GamepadMap.MOUSE_SCROLL_UP, GamepadMap.MOUSE_SCROLL_UP, GamepadMap.MOUSE_SCROLL_UP}; + menuMap.DIRECTION_BACKWARD = new int[]{GamepadMap.MOUSE_SCROLL_DOWN, GamepadMap.MOUSE_SCROLL_DOWN, GamepadMap.MOUSE_SCROLL_DOWN, GamepadMap.MOUSE_SCROLL_DOWN, GamepadMap.MOUSE_SCROLL_DOWN}; + menuMap.DIRECTION_RIGHT = new int[]{}; + menuMap.DIRECTION_LEFT = new int[]{}; + + menuMap.DPAD_UP.keycodes = new int[]{}; + menuMap.DPAD_DOWN.keycodes = new int[]{}; + menuMap.DPAD_RIGHT.keycodes = new int[]{}; + menuMap.DPAD_LEFT.keycodes = new int[]{}; + + menuMap.SHOULDER_LEFT.keycodes = new int[]{GamepadMap.MOUSE_SCROLL_UP}; + menuMap.SHOULDER_RIGHT.keycodes = new int[]{GamepadMap.MOUSE_SCROLL_DOWN}; + + menuMap.TRIGGER_LEFT.keycodes = new int[]{}; + menuMap.TRIGGER_RIGHT.keycodes = new int[]{}; + + menuMap.THUMBSTICK_LEFT.keycodes = new int[]{}; + menuMap.THUMBSTICK_RIGHT.keycodes = new int[]{}; + + menuMap.BUTTON_START.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_ESCAPE}; + menuMap.BUTTON_SELECT.keycodes = new int[]{}; + + return menuMap; + } + + /* + * Returns all GamepadButtons, does not include directional keys + */ + public GamepadButton[] getButtons(){ + return new GamepadButton[]{ BUTTON_A, BUTTON_B, BUTTON_X, BUTTON_Y, + BUTTON_SELECT, BUTTON_START, + TRIGGER_LEFT, TRIGGER_RIGHT, + SHOULDER_LEFT, SHOULDER_RIGHT, + THUMBSTICK_LEFT, THUMBSTICK_RIGHT, + DPAD_UP, DPAD_RIGHT, DPAD_DOWN, DPAD_LEFT}; + } + + /* + * Returns an pre-initialized GamepadMap with only empty keycodes + */ + public static GamepadMap getEmptyMap(){ + GamepadMap emptyMap = new GamepadMap(); + for(GamepadButton button : emptyMap.getButtons()) + button.keycodes = new int[]{}; + + emptyMap.DIRECTION_LEFT = new int[]{}; + emptyMap.DIRECTION_FORWARD = new int[]{}; + emptyMap.DIRECTION_RIGHT = new int[]{}; + emptyMap.DIRECTION_BACKWARD = new int[]{}; + + return emptyMap; + } } From 00e60ee3bd73142297e5b2f9d39617b5ee1e9a0a Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Tue, 20 Jul 2021 14:31:45 +0200 Subject: [PATCH 161/179] Tweak KeyEvent filtering --- .../src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java index 61626a5ff..add1492ab 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java @@ -615,10 +615,9 @@ public class BaseMainActivity extends LoggableActivity { @Override public boolean dispatchKeyEvent(KeyEvent event) { - + if(event.getRepeatCount() != 0 || event.getKeyCode() == KeyEvent.KEYCODE_UNKNOWN || (event.getFlags() & KeyEvent.FLAG_FALLBACK) == KeyEvent.FLAG_FALLBACK) return true; //We consume but no need to recheck since it was already sent once. System.out.println(event); - if(event.getRepeatCount() != 0 || event.getAction() == KeyEvent.ACTION_MULTIPLE || event.getFlags() == KeyEvent.FLAG_FALLBACK) return true; //We consume but no need to recheck since it was already sent once. - + if(Gamepad.isGamepadEvent(event)){ if(gamepad == null){ gamepad = new Gamepad(this, event.getDevice()); From 97a8a11f80e0c0ff70a83a3ecd2361e4a451bfa8 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Tue, 20 Jul 2021 14:32:24 +0200 Subject: [PATCH 162/179] Improved precision of the Dpad detection --- .../customcontrols/gamepad/GamepadDpad.java | 96 +++++++++---------- 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadDpad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadDpad.java index d16fe8824..e07692b1e 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadDpad.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadDpad.java @@ -38,68 +38,68 @@ public class GamepadDpad { this.parentPad = parentPad; } - public int update(InputEvent event) { - if (!isDpadEvent(event)) { - return -1; + public void update(KeyEvent event){ + + //TODO check if the event is valid + if (event.getKeyCode() == KeyEvent.KEYCODE_DPAD_LEFT) { + pressedDirection = LEFT; + } else if (event.getKeyCode() == KeyEvent.KEYCODE_DPAD_RIGHT) { + pressedDirection = RIGHT; + } else if (event.getKeyCode() == KeyEvent.KEYCODE_DPAD_UP) { + pressedDirection = UP; + } else if (event.getKeyCode() == KeyEvent.KEYCODE_DPAD_DOWN) { + pressedDirection = DOWN; + } else if (event.getKeyCode() == KeyEvent.KEYCODE_DPAD_CENTER) { + pressedDirection = CENTER; } - // If the input event is a MotionEvent, check its hat axis values. - if (event instanceof MotionEvent) { + setDummyEventKeyCode(pressedDirection); + parentPad.sendButton(dummyEvent); + } - // Use the hat axis value to find the D-pad direction - MotionEvent motionEvent = (MotionEvent) event; - float xaxis = motionEvent.getAxisValue(MotionEvent.AXIS_HAT_X); - float yaxis = motionEvent.getAxisValue(MotionEvent.AXIS_HAT_Y); + public void update(MotionEvent event){ + //TODO check if the event is valid - // Check if the AXIS_HAT_X value is -1 or 1, and set the D-pad - // LEFT and RIGHT direction accordingly. - if (Float.compare(xaxis, -1.0f) == 0) { - pressedDirection = LEFT; - } else if (Float.compare(xaxis, 1.0f) == 0) { - pressedDirection = RIGHT; - } - // Check if the AXIS_HAT_Y value is -1 or 1, and set the D-pad - // UP and DOWN direction accordingly. - else if (Float.compare(yaxis, -1.0f) == 0) { - pressedDirection = UP; - } else if (Float.compare(yaxis, 1.0f) == 0) { - pressedDirection = DOWN; - }else { - pressedDirection = CENTER; - } + // Use the hat axis value to find the D-pad direction + float xaxis = event.getAxisValue(MotionEvent.AXIS_HAT_X); + float yaxis = event.getAxisValue(MotionEvent.AXIS_HAT_Y); + + // Check if the AXIS_HAT_X value is -1 or 1, and set the D-pad + // LEFT and RIGHT direction accordingly. + if (Float.compare(xaxis, -1.0f) == 0) { + pressedDirection = LEFT; + } else if (Float.compare(xaxis, 1.0f) == 0) { + pressedDirection = RIGHT; + } + // Check if the AXIS_HAT_Y value is -1 or 1, and set the D-pad + // UP and DOWN direction accordingly. + else if (Float.compare(yaxis, -1.0f) == 0) { + pressedDirection = UP; + } else if (Float.compare(yaxis, 1.0f) == 0) { + pressedDirection = DOWN; + }else { + pressedDirection = CENTER; } - // If the input event is a KeyEvent, check its key code. - else if (event instanceof KeyEvent) { - - // Use the key code to find the D-pad direction. - KeyEvent keyEvent = (KeyEvent) event; - if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_DPAD_LEFT) { - pressedDirection = LEFT; - } else if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_DPAD_RIGHT) { - pressedDirection = RIGHT; - } else if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_DPAD_UP) { - pressedDirection = UP; - } else if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_DPAD_DOWN) { - pressedDirection = DOWN; - } else if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_DPAD_CENTER) { - pressedDirection = CENTER; - } - } + setDummyEventKeyCode(pressedDirection); + parentPad.sendButton(dummyEvent); + } + private void setDummyEventKeyCode(int fakeKeycode){ try { - eventCodeField.setInt(dummyEvent, pressedDirection); + eventCodeField.setInt(dummyEvent, fakeKeycode); } catch (IllegalAccessException e) { e.printStackTrace(); } - parentPad.sendButton(dummyEvent); - return pressedDirection; } - public static boolean isDpadEvent(InputEvent event) { + public static boolean isDpadEvent(MotionEvent event) { // Check that input comes from a device with directional pads. // And... also the joystick since it declares sometimes as a joystick. - return (event.getSource() & InputDevice.SOURCE_JOYSTICK) == InputDevice.SOURCE_JOYSTICK && - ((event.getSource() & InputDevice.SOURCE_DPAD) == InputDevice.SOURCE_DPAD) && (event.getDevice().getKeyboardType() == KEYBOARD_TYPE_NON_ALPHABETIC); + return (event.getSource() & InputDevice.SOURCE_JOYSTICK) == InputDevice.SOURCE_JOYSTICK; + } + + public static boolean isDpadEvent(KeyEvent event){ + return ((event.getSource() & InputDevice.SOURCE_DPAD) == InputDevice.SOURCE_DPAD) && (event.getDevice().getKeyboardType() == KEYBOARD_TYPE_NON_ALPHABETIC); } } \ No newline at end of file From ee0b715061d6c9251039d0832e856c306d1cc12c Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Tue, 20 Jul 2021 14:53:26 +0200 Subject: [PATCH 163/179] Gamepad pointer size is now dynamic ! --- .../net/kdt/pojavlaunch/BaseMainActivity.java | 3 ++- .../customcontrols/gamepad/Gamepad.java | 3 +++ .../src/main/res/drawable/pointer.png | Bin 258 -> 695 bytes .../main/res/layout/main_with_customctrl.xml | 2 +- 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java index add1492ab..89eea9f13 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java @@ -922,7 +922,7 @@ public class BaseMainActivity extends LoggableActivity { return true; } - public void getMcScale() { + public int getMcScale() { //Get the scale stored in game files, used auto scale if found or if the stored scaled is bigger than the authorized size. MCOptionUtils.load(); String str = MCOptionUtils.get("guiScale"); @@ -935,6 +935,7 @@ public class BaseMainActivity extends LoggableActivity { } if(gamepad != null) gamepad.notifyGUISizeChange(this.guiScale); + return this.guiScale; } public int handleGuiBar(int x, int y) { diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java index 4e0f21f87..8fb1a12bb 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java @@ -70,6 +70,9 @@ public class Gamepad { this.gameActivity = gameActivity; pointerView = this.gameActivity.findViewById(R.id.console_pointer); + pointerView.getDrawable().setFilterBitmap(false); + notifyGUISizeChange(gameActivity.getMcScale()); + mouseThread = new Thread("Gamepad Thread"){ long lastTime = System.nanoTime(); diff --git a/app_pojavlauncher/src/main/res/drawable/pointer.png b/app_pojavlauncher/src/main/res/drawable/pointer.png index 1bee904a739f64c21e0a75f2ada804ab567a87c9..7ad77f98f7c86f120c927d09f4be14f9679b7b3d 100644 GIT binary patch delta 621 zcmV-z0+RiL0=ET_Reu6ZNkl)xS2FI`K`kUr`74P)T6CQ|{K6(B&bplZ}um1FUaVnm8kB`*h zMp68Gh=pRa+3b?o!dvl$_%sX!*OVJY@l&U4cE2xq3V+WRtu4hLGLxT~crISHlUIni za;&OA_?GOC)&5g%s)&zj-V6qV*J{}SVK(@iJb<#Ay>b%^d3Bm)*^^KhPenX?)>Uq4 z@I9rt8Q?zxHLOLWu~mUMvGkOuY*I^r8&xqUglq_Ld^{xq zHETkR=w`PfJcSnGK^rUCq4f?!`z7i8y19uyJZHq#C61Ev$G5_5QPBG|@$ASe#NkWv zv-nA*65feF#X9yh9TXM_2bm^0d?-GM@AXO-ZW+imd{R@sb81 zdZp4}v^eK>2%OFVgej#QTKR_Kbbj%PDCQ1pxI4;js6&!l92?-n5CYD4y!R%?$U5?3 zFFT1rP|{l`Aenu-Gwu7!x? jEz87epgW`%yD;VeHd%j@9gj?<00000NkvXXu0mjfoKRED diff --git a/app_pojavlauncher/src/main/res/layout/main_with_customctrl.xml b/app_pojavlauncher/src/main/res/layout/main_with_customctrl.xml index da94434a0..cff6aafc4 100644 --- a/app_pojavlauncher/src/main/res/layout/main_with_customctrl.xml +++ b/app_pojavlauncher/src/main/res/layout/main_with_customctrl.xml @@ -41,7 +41,7 @@ From bbab922e63ed46f9c759f8f04f74623de2241528 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Tue, 20 Jul 2021 14:53:56 +0200 Subject: [PATCH 164/179] Tweak the sensitivity down a bit --- .../net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java index 8fb1a12bb..b5451bbfd 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java @@ -140,7 +140,7 @@ public class Gamepad { if(lastGrabbingState){ currentMap = gameMap; pointerView.setVisibility(View.INVISIBLE); - mouseSensitivity = 26 / gameActivity.sensitivityFactor; //sensitivity in menus is resolution dependent. + mouseSensitivity = 22 / gameActivity.sensitivityFactor; //sensitivity in menus is resolution dependent. return; } @@ -152,7 +152,7 @@ public class Gamepad { CallbackBridge.sendCursorPos(gameActivity.mouse_x, gameActivity.mouse_y); placePointerView(CallbackBridge.physicalWidth/2, CallbackBridge.physicalHeight/2); pointerView.setVisibility(View.VISIBLE); - mouseSensitivity = 15; //sensitivity in game doesn't need to be resolution dependent + mouseSensitivity = 14; //sensitivity in game doesn't need to be resolution dependent }; motionEventRunnable = () -> { From c19debacb2720b228a189fdbcf357eb5a643464a Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Tue, 20 Jul 2021 19:28:39 +0200 Subject: [PATCH 165/179] Tweak minimal gamepad deadzone. --- .../kdt/pojavlaunch/customcontrols/gamepad/GamepadJoystick.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadJoystick.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadJoystick.java index 6529b9ccb..f04b26615 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadJoystick.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadJoystick.java @@ -35,7 +35,7 @@ public class GamepadJoystick { try { deadzone = Math.max(device.getMotionRange(verticalAxis).getFlat(), device.getMotionRange(horizontalAxis).getFlat()) * 1.9f; } catch (NullPointerException e){ deadzone = 0.2f; } - if(deadzone < 0.15) deadzone = 0.15f; + if(deadzone < 0.2) deadzone = 0.2f; } public double getAngleRadian(MotionEvent event){ From 35e66892add04a57543d5913673fe6bd0e349409 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Tue, 20 Jul 2021 20:13:44 +0200 Subject: [PATCH 166/179] Clean up ControlButton options, supplented by multi touch --- .../customcontrols/ControlData.java | 3 -- .../customcontrols/buttons/ControlButton.java | 48 +++++++++---------- .../handleview/EditControlButtonPopup.java | 14 ------ .../handleview/EditControlDrawerPopup.java | 14 +++--- .../handleview/EditControlSubButtonPopup.java | 1 - .../res/layout/control_button_setting.xml | 40 ---------------- 6 files changed, 28 insertions(+), 92 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java index 74dc679a4..ed49f4607 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java @@ -78,9 +78,6 @@ public class ControlData implements Cloneable public float cornerRadius; //0-100% public boolean isSwipeable; - public boolean holdCtrl; - public boolean holdAlt; - public boolean holdShift; public Object specialButtonListener; public ControlData() { diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java index e3d2eb787..239966587 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java @@ -133,27 +133,27 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp ((ControlLayout) getParent()).setModified(modified); } - private void setHolding(boolean isDown) { - if (mProperties.holdAlt) { - CallbackBridge.holdingAlt = isDown; - MainActivity.sendKeyPress(LWJGLGLFWKeycode.GLFW_KEY_LEFT_ALT,0,isDown); - System.out.println("holdingAlt="+CallbackBridge.holdingAlt); - } if (mProperties.containsKeycode(LWJGLGLFWKeycode.GLFW_KEY_CAPS_LOCK)) { - CallbackBridge.holdingCapslock = isDown; - //MainActivity.sendKeyPress(LWJGLGLFWKeycode.GLFW_KEY_CAPS_LOCK,0,isDown); - System.out.println("holdingCapslock="+CallbackBridge.holdingCapslock); - } if (mProperties.holdCtrl) { - CallbackBridge.holdingCtrl = isDown; - MainActivity.sendKeyPress(LWJGLGLFWKeycode.GLFW_KEY_LEFT_CONTROL,0,isDown); - System.out.println("holdingCtrl="+CallbackBridge.holdingCtrl); - } if (mProperties.containsKeycode(LWJGLGLFWKeycode.GLFW_KEY_NUM_LOCK)) { - CallbackBridge.holdingNumlock = isDown; - //MainActivity.sendKeyPress(LWJGLGLFWKeycode.GLFW_KEY_NUM_LOCK,0,isDown); - System.out.println("holdingNumlock="+CallbackBridge.holdingNumlock); - } if (mProperties.holdShift) { - CallbackBridge.holdingShift = isDown; - MainActivity.sendKeyPress(LWJGLGLFWKeycode.GLFW_KEY_LEFT_SHIFT,0,isDown); - System.out.println("holdingShift="+CallbackBridge.holdingShift); + private void setHolding(int keyCode, boolean isDown){ + switch (keyCode){ + case LWJGLGLFWKeycode.GLFW_KEY_LEFT_SHIFT: + CallbackBridge.holdingShift = isDown; + return; + + case LWJGLGLFWKeycode.GLFW_KEY_LEFT_CONTROL: + CallbackBridge.holdingCtrl = isDown; + return; + + case LWJGLGLFWKeycode.GLFW_KEY_LEFT_ALT: + CallbackBridge.holdingAlt = isDown; + return; + + case LWJGLGLFWKeycode.GLFW_KEY_CAPS_LOCK: + CallbackBridge.holdingCapslock = isDown; + return; + + case LWJGLGLFWKeycode.GLFW_KEY_NUM_LOCK: + CallbackBridge.holdingNumlock = isDown; + return; } } @@ -255,7 +255,6 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp if(mProperties.isSwipeable && !isPointerOutOfBounds){ //Remove keys if(!triggerToggle(event)) { - setHolding(false); sendKeyPresses(event, false); } } @@ -269,7 +268,6 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp ((ControlLayout) getParent()).onTouch(this, event); //RE-press the button if(mProperties.isSwipeable && !mProperties.isToggle){ - setHolding(true); sendKeyPresses(event, true); } } @@ -279,7 +277,6 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp case MotionEvent.ACTION_DOWN: // 0 case MotionEvent.ACTION_POINTER_DOWN: // 5 if(!mProperties.isToggle){ - setHolding(true); sendKeyPresses(event, true); } break; @@ -291,7 +288,6 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp isPointerOutOfBounds = false; if(!triggerToggle(event)) { - setHolding(false); sendKeyPresses(event, false); } break; @@ -347,7 +343,6 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp if(mProperties.isToggle){ isToggled = !isToggled; invalidate(); - setHolding(isToggled); sendKeyPresses(event, isToggled); return true; } @@ -358,6 +353,7 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp for(int keycode : mProperties.keycodes){ if(keycode >= GLFW_KEY_UNKNOWN){ MainActivity.sendKeyPress(keycode, CallbackBridge.getCurrentMods(), isDown); + setHolding(keycode, isDown); }else { super.onTouchEvent(event); } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java index 9c79a7c48..6c138ebf8 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java @@ -39,9 +39,6 @@ public class EditControlButtonPopup { protected CheckBox checkPassThrough; protected CheckBox checkBoxSwipeable; protected CheckBox checkDynamicPosition; - protected CheckBox checkHoldAlt; - protected CheckBox checkHoldCtrl; - protected CheckBox checkHoldShift; protected EditText editWidth; protected EditText editHeight; @@ -155,10 +152,6 @@ public class EditControlButtonPopup { }); - checkHoldAlt = v.findViewById(R.id.checkBoxKeyCombination_alt); - checkHoldCtrl = v.findViewById(R.id.checkBoxKeyCombination_ctrl); - checkHoldShift = v.findViewById(R.id.checkBoxKeyCombination_shift); - //Initialize adapter for keycodes adapter = new ArrayAdapter<>(ctx, android.R.layout.simple_spinner_item); String[] oldSpecialArr = ControlData.buildSpecialButtonArray(); @@ -241,9 +234,6 @@ public class EditControlButtonPopup { setPercentageText(textOpacity,seekBarOpacity.getProgress()); setPercentageText(textStrokeWidth,seekBarStrokeWidth.getProgress()); - checkHoldAlt.setChecked(properties.holdAlt); - checkHoldCtrl.setChecked(properties.holdCtrl); - checkHoldShift.setChecked(properties.holdShift); checkDynamicPosition.setChecked(properties.isDynamicBtn); for(int i=0; i< properties.keycodes.length; i++){ @@ -310,10 +300,6 @@ public class EditControlButtonPopup { properties.dynamicX = editDynamicX.getText().toString().isEmpty() ? properties.dynamicX = Float.toString(properties.x) : editDynamicX.getText().toString(); properties.dynamicY = editDynamicY.getText().toString().isEmpty() ? properties.dynamicY = Float.toString(properties.y) : editDynamicY.getText().toString(); - properties.holdAlt = checkHoldAlt.isChecked(); - properties.holdCtrl = checkHoldCtrl.isChecked(); - properties.holdShift = checkHoldShift.isChecked(); - button.updateProperties(); } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlDrawerPopup.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlDrawerPopup.java index fffdc3d24..b741631ff 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlDrawerPopup.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlDrawerPopup.java @@ -31,6 +31,7 @@ public class EditControlDrawerPopup extends EditControlButtonPopup{ (v.findViewById(R.id.editMapping_textView)).setVisibility(View.GONE); checkPassThrough.setVisibility(View.GONE); checkToggle.setVisibility(View.GONE); + checkBoxSwipeable.setVisibility(View.GONE); } @Override @@ -57,14 +58,11 @@ public class EditControlDrawerPopup extends EditControlButtonPopup{ protected void setupDialogButtons() { super.setupDialogButtons(); - builder.setNeutralButton(v.getResources().getString(R.string.customctrl_addsubbutton), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - ControlLayout layout = (ControlLayout) drawer.getParent(); - ControlData controlData = drawerData.properties.clone(); - controlData.name = "new"; - layout.addSubButton(drawer, controlData); - } + builder.setNeutralButton(v.getResources().getString(R.string.customctrl_addsubbutton), (dialogInterface, i) -> { + ControlLayout layout = (ControlLayout) drawer.getParent(); + ControlData controlData = drawerData.properties.clone(); + controlData.name = "new"; + layout.addSubButton(drawer, controlData); }); } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlSubButtonPopup.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlSubButtonPopup.java index e8c1f99c8..064a5829e 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlSubButtonPopup.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlSubButtonPopup.java @@ -15,7 +15,6 @@ public class EditControlSubButtonPopup extends EditControlButtonPopup{ @Override protected void hideUselessViews() { (v.findViewById(R.id.editSize_textView)).setVisibility(View.GONE); - (v.findViewById(R.id.editOrientation_textView)).setVisibility(View.GONE); checkDynamicPosition.setVisibility(View.GONE); diff --git a/app_pojavlauncher/src/main/res/layout/control_button_setting.xml b/app_pojavlauncher/src/main/res/layout/control_button_setting.xml index 5feb69534..d867d183a 100644 --- a/app_pojavlauncher/src/main/res/layout/control_button_setting.xml +++ b/app_pojavlauncher/src/main/res/layout/control_button_setting.xml @@ -454,46 +454,6 @@ app:layout_constraintTop_toBottomOf="@id/editDynamicPositionY_textView" /> - - - - - - - - - \ No newline at end of file From 7da0c68813f8df7d955fd8b469125e4b9d583433 Mon Sep 17 00:00:00 2001 From: artdeell Date: Wed, 21 Jul 2021 12:31:24 +0300 Subject: [PATCH 167/179] Layout converter --- .../customcontrols/ControlLayout.java | 11 ++- .../customcontrols/CustomControls.java | 4 +- .../customcontrols/LayoutConverter.java | 77 +++++++++++++++++++ 3 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/LayoutConverter.java diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java index 924d4ba28..6cf5456fb 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java @@ -15,6 +15,10 @@ import net.kdt.pojavlaunch.customcontrols.buttons.ControlDrawer; import net.kdt.pojavlaunch.customcontrols.buttons.ControlSubButton; import net.kdt.pojavlaunch.customcontrols.handleview.HandleView; import net.kdt.pojavlaunch.prefs.*; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; import org.lwjgl.glfw.*; public class ControlLayout extends FrameLayout @@ -40,7 +44,12 @@ public class ControlLayout extends FrameLayout } public void loadLayout(String jsonPath) throws IOException, JsonSyntaxException { - loadLayout(Tools.GLOBAL_GSON.fromJson(Tools.read(jsonPath), CustomControls.class)); + CustomControls layout = LayoutConverter.loadAndConvertIfNecessary(jsonPath); + if(layout != null) { + loadLayout(layout); + }else{ + throw new IOException("Unsupported control layout version"); + } } public void loadLayout(CustomControls controlLayout) { diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/CustomControls.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/CustomControls.java index 0d05f5e65..2851e987b 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/CustomControls.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/CustomControls.java @@ -1,6 +1,8 @@ package net.kdt.pojavlaunch.customcontrols; import android.content.*; import com.google.gson.*; + +import java.io.IOException; import java.util.*; import net.kdt.pojavlaunch.*; import org.lwjgl.glfw.*; @@ -63,7 +65,7 @@ public class CustomControls { return null; } - public void save(String path) throws Exception { + public void save(String path) throws IOException { //Current version is the V2 so the version as to be marked as 2 ! version = 2; diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/LayoutConverter.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/LayoutConverter.java new file mode 100644 index 000000000..50b2b5a70 --- /dev/null +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/LayoutConverter.java @@ -0,0 +1,77 @@ +package net.kdt.pojavlaunch.customcontrols; + +import com.google.gson.JsonSyntaxException; + +import net.kdt.pojavlaunch.LWJGLGLFWKeycode; +import net.kdt.pojavlaunch.Tools; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; + +public class LayoutConverter { + public static boolean convertLookType = false; //false = flat; true = classic + public static CustomControls loadAndConvertIfNecessary(String jsonPath) throws IOException, JsonSyntaxException { + String jsonLayoutData = Tools.read(jsonPath); + try { + JSONObject layoutJobj = new JSONObject(jsonLayoutData); + + if(!layoutJobj.has("version")) { //v1 layout + CustomControls layout = LayoutConverter.convertV1Layout(layoutJobj); + layout.save(jsonPath); + return layout; + }else if (layoutJobj.getInt("version") == 2) { + return Tools.GLOBAL_GSON.fromJson(jsonLayoutData, CustomControls.class); + }else{ + return null; + } + }catch (JSONException e) { + throw new JsonSyntaxException("Failed to load",e); + } + } + public static CustomControls convertV1Layout(JSONObject oldLayoutJson) throws JSONException { + CustomControls empty = new CustomControls(); + JSONArray layoutMainArray = oldLayoutJson.getJSONArray("mControlDataList"); + for(int i = 0; i < layoutMainArray.length(); i++) { + JSONObject button = layoutMainArray.getJSONObject(i); + ControlData n_button = new ControlData(); + int[] keycodes = new int[] {LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN, + LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN, + LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN, + LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN}; + n_button.dynamicX = button.getString("dynamicX"); + n_button.dynamicY = button.getString("dynamicY"); + n_button.isDynamicBtn = button.getBoolean("isDynamicBtn"); + n_button.name = button.getString("name"); + n_button.opacity = ((float)button.getInt("transparency"))/100f; + n_button.passThruEnabled = button.getBoolean("passThruEnabled"); + n_button.isToggle = button.getBoolean("isToggle"); + n_button.x = button.getInt("x"); + n_button.y = button.getInt("y"); + n_button.setHeight(button.getInt("height")); + n_button.setWidth(button.getInt("width")); + if(convertLookType) { + n_button.strokeColor = 0xdd7f7f7f; + n_button.bgColor = 0x807f7f7f; + n_button.strokeWidth = 10; + }else{ + n_button.bgColor = 0x4d000000; + n_button.strokeWidth = 0; + } + if(button.getBoolean("isRound")) { n_button.cornerRadius = 35f; } + int next_idx = 0; + if(button.getBoolean("holdShift")) { keycodes[next_idx] = LWJGLGLFWKeycode.GLFW_KEY_LEFT_SHIFT; next_idx++; } + if(button.getBoolean("holdCtrl")) { keycodes[next_idx] = LWJGLGLFWKeycode.GLFW_KEY_LEFT_CONTROL; next_idx++; } + if(button.getBoolean("holdAlt")) { keycodes[next_idx] = LWJGLGLFWKeycode.GLFW_KEY_LEFT_ALT; next_idx++; } + keycodes[next_idx] = button.getInt("keycode"); + n_button.keycodes = keycodes; + n_button.update(); + empty.mControlDataList.add(n_button); + } + empty.scaledAt = (float)oldLayoutJson.getDouble("scaledAt"); + empty.version = 2; + return empty; + } +} From 37b6db588765f17a4f3476c8a18d2139c3737a76 Mon Sep 17 00:00:00 2001 From: artdeell Date: Wed, 21 Jul 2021 12:34:45 +0300 Subject: [PATCH 168/179] Comment out that debug line --- .../src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java index 89eea9f13..903179cd5 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java @@ -629,7 +629,7 @@ public class BaseMainActivity extends LoggableActivity { int index = EfficientAndroidLWJGLKeycode.getIndexByKey(event.getKeyCode()); if(index >= 0) { - Toast.makeText(this,"THIS IS A KEYBOARD EVENT !", Toast.LENGTH_SHORT).show(); + //Toast.makeText(this,"THIS IS A KEYBOARD EVENT !", Toast.LENGTH_SHORT).show(); EfficientAndroidLWJGLKeycode.execKey(event, index); return true; } From 793f93c5ccb3aca01d8d6fd676cb9e3f9e9d4b0c Mon Sep 17 00:00:00 2001 From: artdeell Date: Wed, 21 Jul 2021 13:46:37 +0300 Subject: [PATCH 169/179] Invert opacity on converted layouts --- .../net/kdt/pojavlaunch/customcontrols/LayoutConverter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/LayoutConverter.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/LayoutConverter.java index 50b2b5a70..002735587 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/LayoutConverter.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/LayoutConverter.java @@ -45,7 +45,7 @@ public class LayoutConverter { n_button.dynamicY = button.getString("dynamicY"); n_button.isDynamicBtn = button.getBoolean("isDynamicBtn"); n_button.name = button.getString("name"); - n_button.opacity = ((float)button.getInt("transparency"))/100f; + n_button.opacity = ((float)((button.getInt("transparency")-100)*-1))/100f; n_button.passThruEnabled = button.getBoolean("passThruEnabled"); n_button.isToggle = button.getBoolean("isToggle"); n_button.x = button.getInt("x"); From b4eeb2e74db69f0ec82abdc31102cfc2ca9433fe Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Wed, 21 Jul 2021 13:34:18 +0200 Subject: [PATCH 170/179] Fix improper string value --- app_pojavlauncher/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app_pojavlauncher/src/main/res/values/strings.xml b/app_pojavlauncher/src/main/res/values/strings.xml index 0b4c0897c..fc1587910 100644 --- a/app_pojavlauncher/src/main/res/values/strings.xml +++ b/app_pojavlauncher/src/main/res/values/strings.xml @@ -183,7 +183,7 @@ Dynamic Y Background transparency - Background Opacity + Button Opacity Key combination Alt From 51e7c2fce8e55c47577932191c77ddf635e2b803 Mon Sep 17 00:00:00 2001 From: Duy Tran Khanh <40482367+khanhduytran0@users.noreply.github.com> Date: Thu, 22 Jul 2021 15:58:48 +0700 Subject: [PATCH 171/179] Bug fix: Exit button on the save dialog doesn't work as expected --- .../main/java/net/kdt/pojavlaunch/CustomControlsActivity.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/CustomControlsActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/CustomControlsActivity.java index dcd8c49bd..26dfe44f3 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/CustomControlsActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/CustomControlsActivity.java @@ -153,6 +153,7 @@ public class CustomControlsActivity extends BaseActivity if(ctx instanceof MainActivity) { ((MainActivity) ctx).leaveCustomControls(); }else{ + ((CustomControlsActivity) ctx).isModified = false; ((Activity)ctx).onBackPressed(); } // setResult(Activity.RESULT_OK, new Intent()); From b4a21feaeab4cfe66d2e462313b7531d907a74e6 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Thu, 22 Jul 2021 18:43:02 +0200 Subject: [PATCH 172/179] Many under the hood improvements: - CPU overhead reduced - Compatibility increased - Fix digital triggers auto-disabling - Fix KeyEvents from DPAD --- .../customcontrols/gamepad/Gamepad.java | 126 ++++++++---------- .../customcontrols/gamepad/GamepadDpad.java | 84 ++++++------ 2 files changed, 91 insertions(+), 119 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java index b5451bbfd..26531682d 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java @@ -1,6 +1,8 @@ package net.kdt.pojavlaunch.customcontrols.gamepad; +import android.os.Handler; +import android.os.Looper; import android.view.InputDevice; import android.view.KeyEvent; import android.view.MotionEvent; @@ -34,7 +36,7 @@ public class Gamepad { private final BaseMainActivity gameActivity; private final ImageView pointerView; - private final GamepadDpad gamepadDpad = new GamepadDpad(this); + private final GamepadDpad gamepadDpad = new GamepadDpad(); private final GamepadJoystick leftJoystick; private int currentJoystickDirection = DIRECTION_NONE; @@ -55,86 +57,37 @@ public class Gamepad { private GamepadMap currentMap = gameMap; private boolean lastGrabbingState = true; - private MotionEvent lastMotionEvent = null; + private final boolean hasDigitalTriggers; - private final Thread mouseThread; - private final Runnable mouseRunnable; + private final Handler handler = new Handler(Looper.getMainLooper()); private final Runnable switchStateRunnable; - private final Runnable motionEventRunnable; public Gamepad(BaseMainActivity gameActivity, InputDevice inputDevice){ Toast.makeText(gameActivity.getApplicationContext(),"GAMEPAD CREATED", Toast.LENGTH_LONG).show(); leftJoystick = new GamepadJoystick(MotionEvent.AXIS_X, MotionEvent.AXIS_Y, inputDevice); rightJoystick = new GamepadJoystick(MotionEvent.AXIS_Z, MotionEvent.AXIS_RZ, inputDevice); + hasDigitalTriggers = inputDevice.hasKeys(KeyEvent.KEYCODE_BUTTON_R2)[0]; this.gameActivity = gameActivity; pointerView = this.gameActivity.findViewById(R.id.console_pointer); pointerView.getDrawable().setFilterBitmap(false); notifyGUISizeChange(gameActivity.getMcScale()); - - mouseThread = new Thread("Gamepad Thread"){ - long lastTime = System.nanoTime(); - final double ticks = 60D; - final double ns = 1000000000 / ticks; - double delta = 0; + Runnable handlerRunnable = new Runnable() { @Override public void run() { + updateGrabbingState(); + tick(); - while (!isInterrupted()) { - long now = System.nanoTime(); - delta += (now - lastTime) / ns; - lastTime = now; - - if(delta >= 1) { - updateGrabbingState(); - tick(); - - delta--; - - try{ sleep(Math.max((long) ( (1 - delta) * (1000/ticks) ), 0)); } catch (InterruptedException e) {e.printStackTrace();} - } - } - } - - private void tick(){ - //Update motion events, and the mouse position - if(lastMotionEvent != null)gameActivity.runOnUiThread(motionEventRunnable); - - if(lastHorizontalValue != 0 || lastVerticalValue != 0){ - GamepadJoystick currentJoystick = lastGrabbingState ? leftJoystick : rightJoystick; - - acceleration = (mouseMagnitude - currentJoystick.getDeadzone())/(1 - currentJoystick.getDeadzone()); - acceleration = Math.pow(acceleration, mouseMaxAcceleration); - - if(acceleration > 1) acceleration = 1; - - - CallbackBridge.mouseX += Math.cos(mouseAngle) * acceleration * mouseSensitivity; - CallbackBridge.mouseY -= Math.sin(mouseAngle) * acceleration * mouseSensitivity; - - gameActivity.runOnUiThread(mouseRunnable); - - if(!lastGrabbingState){ - CallbackBridge.mouseX = MathUtils.clamp(CallbackBridge.mouseX, 0, CallbackBridge.windowWidth); - CallbackBridge.mouseY = MathUtils.clamp(CallbackBridge.mouseY, 0, CallbackBridge.windowHeight); - placePointerView((int) (CallbackBridge.mouseX /gameActivity.scaleFactor), (int) (CallbackBridge.mouseY/gameActivity.scaleFactor)); - } - - gameActivity.mouse_x = CallbackBridge.mouseX; - gameActivity.mouse_y = CallbackBridge.mouseY; - } - + handler.postDelayed(this, 16); } }; - mouseThread.setPriority(Thread.MAX_PRIORITY); - mouseThread.start(); + handler.postDelayed(handlerRunnable, 16); //Initialize runnables to be used by the input system, avoiding generating one each time is better memory. - mouseRunnable = () -> CallbackBridge.sendCursorPos(CallbackBridge.mouseX, CallbackBridge.mouseY); switchStateRunnable = () -> { currentMap.resetPressedState(); if(lastGrabbingState){ @@ -155,12 +108,34 @@ public class Gamepad { mouseSensitivity = 14; //sensitivity in game doesn't need to be resolution dependent }; - motionEventRunnable = () -> { - updateDirectionalJoystick(lastMotionEvent); - updateMouseJoystick(lastMotionEvent); - updateAnalogTriggers(lastMotionEvent); - gamepadDpad.update(lastMotionEvent); - }; + } + + + + private void tick(){ + //update mouse position + if(lastHorizontalValue != 0 || lastVerticalValue != 0){ + GamepadJoystick currentJoystick = lastGrabbingState ? leftJoystick : rightJoystick; + + acceleration = (mouseMagnitude - currentJoystick.getDeadzone())/(1 - currentJoystick.getDeadzone()); + acceleration = Math.pow(acceleration, mouseMaxAcceleration); + if(acceleration > 1) acceleration = 1; + + CallbackBridge.mouseX += Math.cos(mouseAngle) * acceleration * mouseSensitivity; + CallbackBridge.mouseY -= Math.sin(mouseAngle) * acceleration * mouseSensitivity; + + if(!lastGrabbingState){ + CallbackBridge.mouseX = MathUtils.clamp(CallbackBridge.mouseX, 0, CallbackBridge.windowWidth); + CallbackBridge.mouseY = MathUtils.clamp(CallbackBridge.mouseY, 0, CallbackBridge.windowHeight); + placePointerView((int) (CallbackBridge.mouseX /gameActivity.scaleFactor), (int) (CallbackBridge.mouseY/gameActivity.scaleFactor)); + } + + gameActivity.mouse_x = CallbackBridge.mouseX; + gameActivity.mouse_y = CallbackBridge.mouseY; + + //Send the mouse to the game + CallbackBridge.sendCursorPos(CallbackBridge.mouseX, CallbackBridge.mouseY); + } } @@ -173,13 +148,14 @@ public class Gamepad { } public void update(KeyEvent event){ - gamepadDpad.update(event); sendButton(event); } public void update(MotionEvent event){ - //Motion events are taken into account every 1/60th second - lastMotionEvent = event; + updateDirectionalJoystick(event); + updateMouseJoystick(event); + updateAnalogTriggers(event); + sendButton(gamepadDpad.convertEvent(event)); } private void updateMouseJoystick(MotionEvent event){ @@ -204,8 +180,10 @@ public class Gamepad { } private void updateAnalogTriggers(MotionEvent event){ - getCurrentMap().TRIGGER_LEFT.update(event.getAxisValue(MotionEvent.AXIS_LTRIGGER) > 0.5); - getCurrentMap().TRIGGER_RIGHT.update(event.getAxisValue(MotionEvent.AXIS_RTRIGGER) > 0.5); + if(!hasDigitalTriggers){ + getCurrentMap().TRIGGER_LEFT.update((event.getAxisValue(MotionEvent.AXIS_LTRIGGER) > 0.5) || (event.getAxisValue(MotionEvent.AXIS_BRAKE) > 0.5)); + getCurrentMap().TRIGGER_RIGHT.update((event.getAxisValue(MotionEvent.AXIS_RTRIGGER) > 0.5) || (event.getAxisValue(MotionEvent.AXIS_GAS) > 0.5)); + } } public void notifyGUISizeChange(int newSize){ @@ -298,19 +276,19 @@ public class Gamepad { break; //DPAD - case GamepadDpad.UP: + case KeyEvent.KEYCODE_DPAD_UP: getCurrentMap().DPAD_UP.update(event); break; - case GamepadDpad.DOWN: + case KeyEvent.KEYCODE_DPAD_DOWN: getCurrentMap().DPAD_DOWN.update(event); break; - case GamepadDpad.LEFT: + case KeyEvent.KEYCODE_DPAD_LEFT: getCurrentMap().DPAD_LEFT.update(event); break; - case GamepadDpad.RIGHT: + case KeyEvent.KEYCODE_DPAD_RIGHT: getCurrentMap().DPAD_RIGHT.update(event); break; - case GamepadDpad.CENTER: + case KeyEvent.KEYCODE_DPAD_CENTER: getCurrentMap().DPAD_RIGHT.update(false); getCurrentMap().DPAD_LEFT.update(false); getCurrentMap().DPAD_UP.update(false); diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadDpad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadDpad.java index e07692b1e..8cd12c46f 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadDpad.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadDpad.java @@ -1,91 +1,77 @@ package net.kdt.pojavlaunch.customcontrols.gamepad; import android.view.InputDevice; -import android.view.InputEvent; import android.view.KeyEvent; import android.view.MotionEvent; +import net.kdt.pojavlaunch.LWJGLGLFWKeycode; + import java.lang.reflect.Field; import static android.view.InputDevice.KEYBOARD_TYPE_NON_ALPHABETIC; +import static android.view.InputDevice.SOURCE_DPAD; +import static android.view.KeyEvent.KEYCODE_DPAD_CENTER; +import static android.view.KeyEvent.KEYCODE_DPAD_DOWN; +import static android.view.KeyEvent.KEYCODE_DPAD_LEFT; +import static android.view.KeyEvent.KEYCODE_DPAD_RIGHT; +import static android.view.KeyEvent.KEYCODE_DPAD_UP; /* - Code from the android documentation + Reflection is used to avoid memory churning, and only has an negative impact at start */ public class GamepadDpad { - final static int UP = 999; - final static int LEFT = 9999; - final static int RIGHT = 99999; - final static int DOWN = 999999; - final static int CENTER = 9999999; - int pressedDirection = -1; - Gamepad parentPad; - KeyEvent dummyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, CENTER); - Field eventCodeField; + + private int lastKeycode = KEYCODE_DPAD_CENTER; + private KeyEvent dummyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, lastKeycode); + private Field eventCodeField; + private Field eventActionField; { try { eventCodeField = dummyEvent.getClass().getDeclaredField("mKeyCode"); eventCodeField.setAccessible(true); + + eventActionField = dummyEvent.getClass().getDeclaredField("mAction"); + eventActionField.setAccessible(true); } catch (NoSuchFieldException e) { e.printStackTrace(); } } - public GamepadDpad(Gamepad parentPad){ - this.parentPad = parentPad; - } - - public void update(KeyEvent event){ - - //TODO check if the event is valid - if (event.getKeyCode() == KeyEvent.KEYCODE_DPAD_LEFT) { - pressedDirection = LEFT; - } else if (event.getKeyCode() == KeyEvent.KEYCODE_DPAD_RIGHT) { - pressedDirection = RIGHT; - } else if (event.getKeyCode() == KeyEvent.KEYCODE_DPAD_UP) { - pressedDirection = UP; - } else if (event.getKeyCode() == KeyEvent.KEYCODE_DPAD_DOWN) { - pressedDirection = DOWN; - } else if (event.getKeyCode() == KeyEvent.KEYCODE_DPAD_CENTER) { - pressedDirection = CENTER; - } - - setDummyEventKeyCode(pressedDirection); - parentPad.sendButton(dummyEvent); - } - - public void update(MotionEvent event){ - //TODO check if the event is valid - + public KeyEvent convertEvent(MotionEvent event){ // Use the hat axis value to find the D-pad direction float xaxis = event.getAxisValue(MotionEvent.AXIS_HAT_X); float yaxis = event.getAxisValue(MotionEvent.AXIS_HAT_Y); + int action = KeyEvent.ACTION_DOWN; // Check if the AXIS_HAT_X value is -1 or 1, and set the D-pad // LEFT and RIGHT direction accordingly. if (Float.compare(xaxis, -1.0f) == 0) { - pressedDirection = LEFT; + lastKeycode = KEYCODE_DPAD_LEFT; } else if (Float.compare(xaxis, 1.0f) == 0) { - pressedDirection = RIGHT; + lastKeycode = KEYCODE_DPAD_RIGHT; } // Check if the AXIS_HAT_Y value is -1 or 1, and set the D-pad // UP and DOWN direction accordingly. else if (Float.compare(yaxis, -1.0f) == 0) { - pressedDirection = UP; + lastKeycode = KEYCODE_DPAD_UP; } else if (Float.compare(yaxis, 1.0f) == 0) { - pressedDirection = DOWN; + lastKeycode = KEYCODE_DPAD_DOWN; }else { - pressedDirection = CENTER; + //No keycode change + action = KeyEvent.ACTION_UP; } - setDummyEventKeyCode(pressedDirection); - parentPad.sendButton(dummyEvent); + setDummyEventKeycode(lastKeycode); + setDummyEventAction(action); + dummyEvent.setSource(SOURCE_DPAD); + return dummyEvent; + } - private void setDummyEventKeyCode(int fakeKeycode){ + private void setDummyEventKeycode(int fakeKeycode){ try { eventCodeField.setInt(dummyEvent, fakeKeycode); } catch (IllegalAccessException e) { @@ -93,6 +79,14 @@ public class GamepadDpad { } } + private void setDummyEventAction(int action){ + try { + eventActionField.setInt(dummyEvent, action); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + public static boolean isDpadEvent(MotionEvent event) { // Check that input comes from a device with directional pads. // And... also the joystick since it declares sometimes as a joystick. From f3e1c84c15f101bc69fb8234e73d372fa7527298 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Thu, 22 Jul 2021 21:48:44 +0200 Subject: [PATCH 173/179] Update gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 70814f3e0..ec7f8af78 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,6 @@ /build /*/build app_pojavlauncher/src/main/assets/components/jre +local.properties +.idea/ +app_pojavlauncher/.cxx/ From f425322eb5ffa77423a4d07f5ca6ab2fc6fadbf8 Mon Sep 17 00:00:00 2001 From: artdeell Date: Fri, 23 Jul 2021 11:04:56 +0300 Subject: [PATCH 174/179] Change the length to 102 to get rid of the extra UNKNOWN at the end --- .../EfficientAndroidLWJGLKeycode.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/EfficientAndroidLWJGLKeycode.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/EfficientAndroidLWJGLKeycode.java index 075c8ae1e..1bae86893 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/EfficientAndroidLWJGLKeycode.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/EfficientAndroidLWJGLKeycode.java @@ -13,16 +13,15 @@ public class EfficientAndroidLWJGLKeycode { //This old version of this class was using an ArrayMap, a generic Key -> Value data structure. //The key being the android keycode from a KeyEvent //The value its LWJGL equivalent. - - private static final int[] androidKeycodes = new int[103]; - private static final short[] LWJGLKeycodes = new short[androidKeycodes.length]; + private static final int KEYCODE_COUNT = 102; + private static final int[] androidKeycodes = new int[KEYCODE_COUNT]; + private static final short[] LWJGLKeycodes = new short[KEYCODE_COUNT]; private static String[] androidKeyNameArray; /* = new String[androidKeycodes.length]; */ static { /* BINARY SEARCH IS PERFORMED ON THE androidKeycodes ARRAY ! WHEN ADDING A MAPPING, ADD IT SO THE androidKeycodes ARRAY STAYS SORTED ! */ // Mapping Android Keycodes to LWJGL Keycodes - add(KeyEvent.KEYCODE_UNKNOWN,LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN); add(KeyEvent.KEYCODE_HOME, LWJGLGLFWKeycode.GLFW_KEY_HOME); // Escape key @@ -47,7 +46,7 @@ public class EfficientAndroidLWJGLKeycode { add(KeyEvent.KEYCODE_DPAD_DOWN, LWJGLGLFWKeycode.GLFW_KEY_DOWN); add(KeyEvent.KEYCODE_DPAD_LEFT, LWJGLGLFWKeycode.GLFW_KEY_LEFT); add(KeyEvent.KEYCODE_DPAD_RIGHT, LWJGLGLFWKeycode.GLFW_KEY_RIGHT); //22 - + // A-Z keys add(KeyEvent.KEYCODE_A, LWJGLGLFWKeycode.GLFW_KEY_A); //29 add(KeyEvent.KEYCODE_B, LWJGLGLFWKeycode.GLFW_KEY_B); @@ -78,7 +77,7 @@ public class EfficientAndroidLWJGLKeycode { add(KeyEvent.KEYCODE_COMMA, LWJGLGLFWKeycode.GLFW_KEY_COMMA); - + // Alt keys add(KeyEvent.KEYCODE_ALT_LEFT, LWJGLGLFWKeycode.GLFW_KEY_LEFT_ALT); add(KeyEvent.KEYCODE_ALT_RIGHT, LWJGLGLFWKeycode.GLFW_KEY_RIGHT_ALT); @@ -117,7 +116,7 @@ public class EfficientAndroidLWJGLKeycode { add(KeyEvent.KEYCODE_CAPS_LOCK, LWJGLGLFWKeycode.GLFW_KEY_CAPS_LOCK); add(KeyEvent.KEYCODE_BREAK, LWJGLGLFWKeycode.GLFW_KEY_PAUSE); add(KeyEvent.KEYCODE_INSERT, LWJGLGLFWKeycode.GLFW_KEY_INSERT); - + // Fn keys add(KeyEvent.KEYCODE_F1, LWJGLGLFWKeycode.GLFW_KEY_F1); //131 add(KeyEvent.KEYCODE_F2, LWJGLGLFWKeycode.GLFW_KEY_F2); @@ -131,7 +130,7 @@ public class EfficientAndroidLWJGLKeycode { add(KeyEvent.KEYCODE_F10, LWJGLGLFWKeycode.GLFW_KEY_F10); add(KeyEvent.KEYCODE_F11, LWJGLGLFWKeycode.GLFW_KEY_F11); add(KeyEvent.KEYCODE_F12, LWJGLGLFWKeycode.GLFW_KEY_F12); //142 - + // Num keys add(KeyEvent.KEYCODE_NUM_LOCK, LWJGLGLFWKeycode.GLFW_KEY_NUM_LOCK); //143 add(KeyEvent.KEYCODE_NUMPAD_0, LWJGLGLFWKeycode.GLFW_KEY_0); @@ -156,6 +155,7 @@ public class EfficientAndroidLWJGLKeycode { } private static short index = 0; + private static void add(int androidKeycode, short LWJGLKeycode){ androidKeycodes[index] = androidKeycode; LWJGLKeycodes[index] = LWJGLKeycode; From 59bc3764dd50073ec6b7b0a99dc6354a04cbe99c Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Fri, 23 Jul 2021 11:12:00 +0200 Subject: [PATCH 175/179] Moved the setModifiers to the CallbackBridge --- .../customcontrols/buttons/ControlButton.java | 24 +------------------ .../java/org/lwjgl/glfw/CallbackBridge.java | 24 +++++++++++++++++++ 2 files changed, 25 insertions(+), 23 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java index 239966587..1f4ca2d64 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java @@ -133,29 +133,7 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp ((ControlLayout) getParent()).setModified(modified); } - private void setHolding(int keyCode, boolean isDown){ - switch (keyCode){ - case LWJGLGLFWKeycode.GLFW_KEY_LEFT_SHIFT: - CallbackBridge.holdingShift = isDown; - return; - case LWJGLGLFWKeycode.GLFW_KEY_LEFT_CONTROL: - CallbackBridge.holdingCtrl = isDown; - return; - - case LWJGLGLFWKeycode.GLFW_KEY_LEFT_ALT: - CallbackBridge.holdingAlt = isDown; - return; - - case LWJGLGLFWKeycode.GLFW_KEY_CAPS_LOCK: - CallbackBridge.holdingCapslock = isDown; - return; - - case LWJGLGLFWKeycode.GLFW_KEY_NUM_LOCK: - CallbackBridge.holdingNumlock = isDown; - return; - } - } @Override public void setLayoutParams(ViewGroup.LayoutParams params) { @@ -353,7 +331,7 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp for(int keycode : mProperties.keycodes){ if(keycode >= GLFW_KEY_UNKNOWN){ MainActivity.sendKeyPress(keycode, CallbackBridge.getCurrentMods(), isDown); - setHolding(keycode, isDown); + CallbackBridge.setModifiers(keycode, isDown); }else { super.onTouchEvent(event); } diff --git a/app_pojavlauncher/src/main/java/org/lwjgl/glfw/CallbackBridge.java b/app_pojavlauncher/src/main/java/org/lwjgl/glfw/CallbackBridge.java index b474e737d..94111f036 100644 --- a/app_pojavlauncher/src/main/java/org/lwjgl/glfw/CallbackBridge.java +++ b/app_pojavlauncher/src/main/java/org/lwjgl/glfw/CallbackBridge.java @@ -166,6 +166,30 @@ public class CallbackBridge { return currMods; } + public static void setModifiers(int keyCode, boolean isDown){ + switch (keyCode){ + case LWJGLGLFWKeycode.GLFW_KEY_LEFT_SHIFT: + CallbackBridge.holdingShift = isDown; + return; + + case LWJGLGLFWKeycode.GLFW_KEY_LEFT_CONTROL: + CallbackBridge.holdingCtrl = isDown; + return; + + case LWJGLGLFWKeycode.GLFW_KEY_LEFT_ALT: + CallbackBridge.holdingAlt = isDown; + return; + + case LWJGLGLFWKeycode.GLFW_KEY_CAPS_LOCK: + CallbackBridge.holdingCapslock = isDown; + return; + + case LWJGLGLFWKeycode.GLFW_KEY_NUM_LOCK: + CallbackBridge.holdingNumlock = isDown; + return; + } + } + public static native boolean nativeAttachThreadToOther(boolean isAndroid, boolean isUsePushPoll); private static native boolean nativeSendChar(char codepoint); From cd0c4c25dab122e5e007690edce80813d0b3a770 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Fri, 23 Jul 2021 11:12:12 +0200 Subject: [PATCH 176/179] The gamepad now sets the modifiers --- .../java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java index 26531682d..fa94321ff 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java @@ -334,6 +334,7 @@ public class Gamepad { MainActivity.sendKeyPress(keycode, CallbackBridge.getCurrentMods(), isDown); break; } + CallbackBridge.setModifiers(keycode, isDown); } } From 82fa8876f2ebf25a51c4122e96bbdc1fb8c4599c Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Fri, 23 Jul 2021 11:30:18 +0200 Subject: [PATCH 177/179] Clean up gamepad --- .../net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java index fa94321ff..e2b0f58fa 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java @@ -63,7 +63,7 @@ public class Gamepad { private final Runnable switchStateRunnable; public Gamepad(BaseMainActivity gameActivity, InputDevice inputDevice){ - Toast.makeText(gameActivity.getApplicationContext(),"GAMEPAD CREATED", Toast.LENGTH_LONG).show(); + //Toast.makeText(gameActivity.getApplicationContext(),"GAMEPAD CREATED", Toast.LENGTH_LONG).show(); leftJoystick = new GamepadJoystick(MotionEvent.AXIS_X, MotionEvent.AXIS_Y, inputDevice); rightJoystick = new GamepadJoystick(MotionEvent.AXIS_Z, MotionEvent.AXIS_RZ, inputDevice); @@ -321,11 +321,9 @@ public class Gamepad { break; case LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT: - //CallbackBridge.putMouseEventWithCoords(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT, isDown?1:0, CallbackBridge.mouseX, CallbackBridge.mouseY); MainActivity.sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT, isDown); break; case LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT: - //CallbackBridge.putMouseEventWithCoords(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT, isDown?1:0, CallbackBridge.mouseX, CallbackBridge.mouseY); MainActivity.sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT, isDown); break; From 63bec703b6400e63943a1d650f9fe2228be7c328 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Sun, 25 Jul 2021 18:58:36 +0200 Subject: [PATCH 178/179] Tweaked the gamepad mappings. --- .../customcontrols/gamepad/GamepadMap.java | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadMap.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadMap.java index 464d1910b..90ec915b6 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadMap.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/GamepadMap.java @@ -78,18 +78,18 @@ public class GamepadMap { gameMap.BUTTON_A.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_SPACE}; gameMap.BUTTON_B.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_Q}; - gameMap.BUTTON_X.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_F}; - gameMap.BUTTON_Y.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_E}; + gameMap.BUTTON_X.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_E}; + gameMap.BUTTON_Y.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_F}; gameMap.DIRECTION_FORWARD = new int[]{LWJGLGLFWKeycode.GLFW_KEY_W}; gameMap.DIRECTION_BACKWARD = new int[]{LWJGLGLFWKeycode.GLFW_KEY_S}; gameMap.DIRECTION_RIGHT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_D}; gameMap.DIRECTION_LEFT = new int[]{LWJGLGLFWKeycode.GLFW_KEY_A}; - gameMap.DPAD_UP.keycodes = new int[]{}; - gameMap.DPAD_DOWN.keycodes = new int[]{}; - gameMap.DPAD_RIGHT.keycodes = new int[]{}; - gameMap.DPAD_LEFT.keycodes = new int[]{}; + gameMap.DPAD_UP.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_LEFT_SHIFT}; + gameMap.DPAD_DOWN.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_O}; //For mods ? + gameMap.DPAD_RIGHT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_K}; //For mods ? + gameMap.DPAD_LEFT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_J}; //For mods ? gameMap.SHOULDER_LEFT.keycodes = new int[]{GamepadMap.MOUSE_SCROLL_UP}; gameMap.SHOULDER_RIGHT.keycodes = new int[]{GamepadMap.MOUSE_SCROLL_DOWN}; @@ -97,12 +97,12 @@ public class GamepadMap { gameMap.TRIGGER_LEFT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT}; gameMap.TRIGGER_RIGHT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT}; - gameMap.THUMBSTICK_LEFT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_LEFT_SHIFT}; - gameMap.THUMBSTICK_LEFT.isToggleable = true; - gameMap.THUMBSTICK_RIGHT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_F5}; + gameMap.THUMBSTICK_LEFT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_LEFT_CONTROL}; + gameMap.THUMBSTICK_RIGHT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_LEFT_SHIFT}; + gameMap.THUMBSTICK_RIGHT.isToggleable = true; gameMap.BUTTON_START.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_ESCAPE}; - gameMap.BUTTON_SELECT.keycodes = new int[]{}; + gameMap.BUTTON_SELECT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_TAB}; return gameMap; } @@ -124,9 +124,9 @@ public class GamepadMap { menuMap.DIRECTION_LEFT = new int[]{}; menuMap.DPAD_UP.keycodes = new int[]{}; - menuMap.DPAD_DOWN.keycodes = new int[]{}; - menuMap.DPAD_RIGHT.keycodes = new int[]{}; - menuMap.DPAD_LEFT.keycodes = new int[]{}; + menuMap.DPAD_DOWN.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_O}; //For mods ? + menuMap.DPAD_RIGHT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_K}; //For mods ? + menuMap.DPAD_LEFT.keycodes = new int[]{LWJGLGLFWKeycode.GLFW_KEY_J}; //For mods ? menuMap.SHOULDER_LEFT.keycodes = new int[]{GamepadMap.MOUSE_SCROLL_UP}; menuMap.SHOULDER_RIGHT.keycodes = new int[]{GamepadMap.MOUSE_SCROLL_DOWN}; From 5eaf17c2db7f3832068ae49733687e72e92ab5d6 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Sun, 25 Jul 2021 23:28:15 +0200 Subject: [PATCH 179/179] Clean up inflate keycode array function --- .../kdt/pojavlaunch/customcontrols/ControlData.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java index ed49f4607..6059ce2df 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java @@ -7,6 +7,8 @@ import net.kdt.pojavlaunch.utils.*; import net.objecthunter.exp4j.*; import org.lwjgl.glfw.*; +import static net.kdt.pojavlaunch.LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN; + public class ControlData implements Cloneable { @@ -197,14 +199,8 @@ public class ControlData implements Cloneable } private static int[] inflateKeycodeArray(int[] keycodes){ - int[] inflatedArray = new int[4]; - int i; - for(i=0; i