From b90e755f566c38bfb414cfaa5542f4e4b1e4662e Mon Sep 17 00:00:00 2001 From: sideloadking <118634044+sideloadking@users.noreply.github.com> Date: Sun, 20 Jul 2025 00:53:52 +0100 Subject: [PATCH 1/5] Update TouchInputHandler.java Should fix track pad I hope --- app/src/main/java/com/termux/x11/input/TouchInputHandler.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/termux/x11/input/TouchInputHandler.java b/app/src/main/java/com/termux/x11/input/TouchInputHandler.java index d49ebc6b9..5fd8db133 100644 --- a/app/src/main/java/com/termux/x11/input/TouchInputHandler.java +++ b/app/src/main/java/com/termux/x11/input/TouchInputHandler.java @@ -262,8 +262,8 @@ static public void refreshInputDevices() { } boolean isDexEvent(MotionEvent event) { - int SOURCE_DEX = InputDevice.SOURCE_MOUSE | InputDevice.SOURCE_TOUCHSCREEN; - return ((event.getSource() & SOURCE_DEX) == SOURCE_DEX) + return ((event.getSource() & InputDevice.SOURCE_MOUSE) == + InputDevice.SOURCE_MOUSE) && ((event.getSource() & InputDevice.SOURCE_TOUCHPAD) != InputDevice.SOURCE_TOUCHPAD) && (event.getToolType(event.getActionIndex()) == MotionEvent.TOOL_TYPE_FINGER); } From 6996b5bec8b5e7af3abfdf711b5a2c35ec1756a4 Mon Sep 17 00:00:00 2001 From: sideloadking <118634044+sideloadking@users.noreply.github.com> Date: Sun, 20 Jul 2025 20:22:54 +0100 Subject: [PATCH 2/5] =?UTF-8?q?Create=20build=E2=80=91debug.yml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflows/build\342\200\221debug.yml" | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 ".github/workflows/build\342\200\221debug.yml" diff --git "a/.github/workflows/build\342\200\221debug.yml" "b/.github/workflows/build\342\200\221debug.yml" new file mode 100644 index 000000000..2685e2404 --- /dev/null +++ "b/.github/workflows/build\342\200\221debug.yml" @@ -0,0 +1,35 @@ +name: Android ‑ Debug build + +on: + push: # build every commit to main (change if you like) + branches: [ main ] + workflow_dispatch: # allows “Run workflow” button in the UI + +jobs: + build: + runs-on: ubuntu-latest + + steps: + # 1. check out your code + - uses: actions/checkout@v4 + + # 2. get a JDK + cache Gradle + - uses: actions/setup-java@v4 + with: + distribution: 'zulu' + java-version: '17' + cache: 'gradle' + + # 3. make the wrapper executable (Linux hosts need this) + - name: Make Gradle wrapper executable + run: chmod +x ./gradlew + + # 4. compile the DEBUG variant + - name: Build debug APK + run: ./gradlew assembleDebug # <‑‑ key line + + # 5. upload whatever was produced as a run artifact + - uses: actions/upload-artifact@v4 + with: + name: debug-apk + path: app/build/outputs/apk/debug/*.apk # adjust “app” if your module name differs From d3b794af9041adfccb02ab6b9a4c299f270ae8d8 Mon Sep 17 00:00:00 2001 From: sideloadking <118634044+sideloadking@users.noreply.github.com> Date: Sun, 20 Jul 2025 20:32:58 +0100 Subject: [PATCH 3/5] =?UTF-8?q?Update=20build=E2=80=91debug.yml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflows/build\342\200\221debug.yml" | 84 ++++++++++++------- 1 file changed, 56 insertions(+), 28 deletions(-) diff --git "a/.github/workflows/build\342\200\221debug.yml" "b/.github/workflows/build\342\200\221debug.yml" index 2685e2404..8dd87b6d3 100644 --- "a/.github/workflows/build\342\200\221debug.yml" +++ "b/.github/workflows/build\342\200\221debug.yml" @@ -1,35 +1,63 @@ -name: Android ‑ Debug build +name: Android – Debug build +# ────────────────────────────────────────────────────────────── +# Run on every push to main, on pull‑requests, and on demand on: - push: # build every commit to main (change if you like) - branches: [ main ] - workflow_dispatch: # allows “Run workflow” button in the UI + push: + branches: [ main ] # change if your default branch differs + pull_request: + workflow_dispatch: +# ────────────────────────────────────────────────────────────── jobs: - build: + debug-apk: runs-on: ubuntu-latest steps: - # 1. check out your code - - uses: actions/checkout@v4 - - # 2. get a JDK + cache Gradle - - uses: actions/setup-java@v4 - with: - distribution: 'zulu' - java-version: '17' - cache: 'gradle' - - # 3. make the wrapper executable (Linux hosts need this) - - name: Make Gradle wrapper executable - run: chmod +x ./gradlew - - # 4. compile the DEBUG variant - - name: Build debug APK - run: ./gradlew assembleDebug # <‑‑ key line - - # 5. upload whatever was produced as a run artifact - - uses: actions/upload-artifact@v4 - with: - name: debug-apk - path: app/build/outputs/apk/debug/*.apk # adjust “app” if your module name differs + # 1️⃣ Clone the repo **with sub‑modules** + - name: Checkout sources + uses: actions/checkout@v4 + with: + submodules: recursive # ← critical for Termux:X11 + fetch-depth: 0 # (keeps full history; omit if you like) + + # 2️⃣ Set up JDK 17 and cache the Gradle user‑home dir + - name: Set up Java & Gradle cache + uses: actions/setup-java@v4 + with: + distribution: 'zulu' + java-version: '17' + cache: 'gradle' + + # 3️⃣ Make the Gradle wrapper executable (Linux runners need this) + - name: Gradle wrapper permissions + run: chmod +x ./gradlew + + # 4️⃣ Build the DEBUG variant (change :app if your module has a different name) + - name: Build debug APK + run: ./gradlew :app:assembleDebug + + # 5️⃣ Upload the APK(s) produced under app/build/outputs/apk/debug/ + - name: Upload APK artefact + uses: actions/upload-artifact@v4 + with: + name: debug-apk + path: app/build/outputs/apk/debug/*.apk + + # ──────────────────────────────────────────────────────────── + # Optional nightly clean‑up so artefacts don’t pile up + cleanup-old-artifacts: + if: ${{ github.event_name == 'schedule' }} + runs-on: ubuntu-latest + steps: + - uses: c-hive/gha-remove-artifacts@v4 + with: + age: '14 days' + +# Enable the clean‑up once a day at 03:00 UTC: +# +# on: +# schedule: +# - cron: '0 3 * * *' +# +# (Uncomment the block above or schedule inside the Actions UI.) From f22da9514279e9d625a7e160b5fb60f00defb0d9 Mon Sep 17 00:00:00 2001 From: sideloadking <118634044+sideloadking@users.noreply.github.com> Date: Sun, 20 Jul 2025 23:47:01 +0100 Subject: [PATCH 4/5] Updatetwoscrool TouchInputHandler.java should add two finger scrolling --- .../termux/x11/input/TouchInputHandler.java | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/termux/x11/input/TouchInputHandler.java b/app/src/main/java/com/termux/x11/input/TouchInputHandler.java index 5fd8db133..57f6152ea 100644 --- a/app/src/main/java/com/termux/x11/input/TouchInputHandler.java +++ b/app/src/main/java/com/termux/x11/input/TouchInputHandler.java @@ -338,8 +338,17 @@ public boolean handleTouchEvent(View view0, View view, MotionEvent event) { break; case MotionEvent.ACTION_SCROLL: - float scrollY = -100 * event.getAxisValue(MotionEvent.AXIS_VSCROLL); - float scrollX = -100 * event.getAxisValue(MotionEvent.AXIS_HSCROLL); + float scrollY = event.getAxisValue(MotionEvent.AXIS_VSCROLL); + float scrollX = event.getAxisValue(MotionEvent.AXIS_HSCROLL); + + if (scrollY == 0 && scrollX == 0) { + scrollY = -event.getAxisValue(MotionEvent.AXIS_RELATIVE_VSCROLL); + scrollX = -event.getAxisValue(MotionEvent.AXIS_RELATIVE_HSCROLL); + } + + scrollY *= -100; + scrollX *= -100; + mInjector.sendMouseWheelEvent(scrollX, scrollY); return true; @@ -853,8 +862,17 @@ boolean mouseButtonDown(int mask) { @SuppressLint("ClickableViewAccessibility") boolean onTouch(View v, MotionEvent e) { if (e.getAction() == MotionEvent.ACTION_SCROLL) { - float scrollY = -100 * e.getAxisValue(MotionEvent.AXIS_VSCROLL); - float scrollX = -100 * e.getAxisValue(MotionEvent.AXIS_HSCROLL); + float scrollY = e.getAxisValue(MotionEvent.AXIS_VSCROLL); + float scrollX = e.getAxisValue(MotionEvent.AXIS_HSCROLL); + + if (scrollY == 0 && scrollX == 0) { + scrollY = -e.getAxisValue(MotionEvent.AXIS_RELATIVE_VSCROLL); + scrollX = -e.getAxisValue(MotionEvent.AXIS_RELATIVE_HSCROLL); + } + + scrollY *= -100; + scrollX *= -100; + mInjector.sendMouseWheelEvent(scrollX, scrollY); return true; From 19e9998cb9194bca9b4d0dd5e0f4dd842c8529bc Mon Sep 17 00:00:00 2001 From: sideloadking <118634044+sideloadking@users.noreply.github.com> Date: Mon, 21 Jul 2025 00:08:18 +0100 Subject: [PATCH 5/5] Update MainActivity.java --- .../java/com/termux/x11/MainActivity.java | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/app/src/main/java/com/termux/x11/MainActivity.java b/app/src/main/java/com/termux/x11/MainActivity.java index 40cb0ccf4..c33509523 100644 --- a/app/src/main/java/com/termux/x11/MainActivity.java +++ b/app/src/main/java/com/termux/x11/MainActivity.java @@ -10,6 +10,9 @@ import android.Manifest; import android.annotation.SuppressLint; +import android.view.WindowInsets; +import android.view.WindowInsetsController; +import androidx.core.view.WindowCompat; import android.app.AppOpsManager; import android.app.Notification; import android.app.NotificationChannel; @@ -71,9 +74,52 @@ import java.util.Map; + + @SuppressLint("ApplySharedPref") @SuppressWarnings({"deprecation", "unused"}) public class MainActivity extends AppCompatActivity { + + private void hideBars() { + WindowInsetsController ctl = + WindowCompat.getInsetsController(getWindow(), getWindow().getDecorView()); + if (ctl != null) { + ctl.hide(WindowInsets.Type.systemBars()); + ctl.setSystemBarsBehavior( + WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE); + } + } + + private void setupAutoRehide() { + final View root = getWindow().getDecorView(); + root.setOnApplyWindowInsetsListener((v, insets) -> { + boolean statusVisible = insets.isVisible(WindowInsets.Type.statusBars()); + boolean navVisible = insets.isVisible(WindowInsets.Type.navigationBars()); + if (statusVisible || navVisible) { + v.postDelayed(this::hideBars, /* delay ms */ 50); // pick any delay you like + } + return insets; + }); + } + + + + + + + + + + + + + + + + + + + public static final String ACTION_STOP = "com.termux.x11.ACTION_STOP"; public static final String ACTION_CUSTOM = "com.termux.x11.ACTION_CUSTOM"; @@ -166,6 +212,12 @@ protected void onCreate(Bundle savedInstanceState) { requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.main_activity); + WindowCompat.setDecorFitsSystemWindows(getWindow(), false); + hideBars(); + setupAutoRehide(); + + + frm = findViewById(R.id.frame); findViewById(R.id.preferences_button).setOnClickListener((l) -> startActivity(new Intent(this, LoriePreferences.class) {{ setAction(Intent.ACTION_MAIN); }})); findViewById(R.id.help_button).setOnClickListener((l) -> startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://github.com/termux/termux-x11/blob/master/README.md#running-graphical-applications"))));