From 0d54c710b617d863a94e27c4d5dadc372b1e33bc Mon Sep 17 00:00:00 2001 From: Teddy Date: Sat, 31 Oct 2026 14:51:28 +0100 Subject: [PATCH 01/13] feat: drive the external display with a mouse plugged into the phone, logo in the top left --- src/android/backend/wayland/event_handler.rs | 16 +- src/android/dex/classes.dex | Bin 24516 -> 27528 bytes src/android/external_display.rs | 38 ++- .../github/localdesktop/TrackpadControls.java | 237 ++++++++++++++---- 4 files changed, 240 insertions(+), 51 deletions(-) diff --git a/src/android/backend/wayland/event_handler.rs b/src/android/backend/wayland/event_handler.rs index d92c043d..0e8d1b4b 100644 --- a/src/android/backend/wayland/event_handler.rs +++ b/src/android/backend/wayland/event_handler.rs @@ -464,14 +464,22 @@ pub fn paint_trackpad(backend: &mut WaylandBackend) { } } -/// A mouse on the external display: it points where it is, and its buttons and wheel go -/// straight to the desktop. +/// A mouse on the external display, or one plugged into the phone: it moves the cursor, and its +/// buttons and wheel go straight to the desktop. pub fn on_external_pointer(backend: &mut WaylandBackend, event: PointerEvent) { let time = event.time_ms as u32; let size = backend.compositor.state.size; + let (x, y) = if event.relative { + // Mouse counts, scaled up on monitors larger than 1080p so crossing them is no chore. + let speed = (size.w as f64 / 1920.0).max(1.0); + let cursor = backend.cursor_position; + (cursor.x + event.x * speed, cursor.y + event.y * speed) + } else { + (event.x, event.y) + }; backend.cursor_position = ( - event.x.clamp(0.0, (size.w - 1).max(0) as f64), - event.y.clamp(0.0, (size.h - 1).max(0) as f64), + x.clamp(0.0, (size.w - 1).max(0) as f64), + y.clamp(0.0, (size.h - 1).max(0) as f64), ) .into(); let cursor = backend.cursor_position; diff --git a/src/android/dex/classes.dex b/src/android/dex/classes.dex index 5832ce7b6fc06fddbcc86a8b83d219dcf98cacbb..c5ace3026eda79eb1e069858a8f62d005f50d727 100644 GIT binary patch literal 27528 zcmbuI3w)H-ng7o_Gr1CyVUlo(5MDx*ppXjz3?xXxJto|eAwWQ3l1!3;@Xlmr0-?4p zS}#;>#nqzqveH&tti4c|Zmqp6tyb->wrXu_t=p>AtzGTiziX?l|L=3&Gsz@itDl|l zo98*tdCqh0&$+yBLQi-&x4L$b`rU7S)_thq7c)9q&$_|anER#r%F_OOmwqyMc&}11 zrPOf8!T>~n?%$)-Nz0WVK+>3{)K$>wIZ9ms?I}=d3Gu;6N|lKGET!hHS88XeQiq$A zdI`L-LaDbv#!96of+^qJ_SAl?gb~nzk#oVe+RFF`Ky&$4f?@{!6(31z>mS7LD3qe)`C6Y3UC7a z2)qUCwWI~T;4*M0_!js%coR%tr_^H54{iis1FwUb%}RBG%fKDrKJX~`IrtNpav|x! zg`f*u3T_7f3Vr~71@c>HU$71w1joVS;4ffit5OTW4iE=7fiHt+Kt6r41Z)L|!TsPD zV8RBamV#bzCAb588~iuO+^E!Cunr`_G4L386O?bF@4;Q*MUb~ysg>XWxEK5aOlo6{ zfW6=r@LljnFuPr;?chf62zUd`4Kjv+11s-9~=T7 z1vi6Z;0f?&;N3u3H}Sb3jPLiIvM9+HmCusz-F)u>;WGD z*MM8W-QWT6F!&L83H&d}+JOx)2P^_Bz(x=TG4MffEw}@G7TgCO0#Acy!SmqH;BDa9 zi9JvVO2FBm7Ayzr!FI40><5>DYr*Z{bKq;>aqtTGEqD`nFH*`6NKR5-R1TTZPz@%N|56%U( z-~!MFc7Q=}DYy>Y0B!-F1z!MP2akZ~!C%3I-Aa{#I?x2xfevsH=mLY_0Js!<6x;>A z1il3x1);3ARqzfd=)$Lg1)v3N1N~q>xDtFE z+zIXhUjp9*{|TN2FM!{JH^5)P#BQZ#fcaoKSPM3T4iEw#1h;`tgA?Fe;CtW+@I&xp zkgM>cpctGD&H-~k1(*xY1?PczU_Ph>RiGNwfCZoyECh?dVsJjF153bCP!AfwGH?M{ z4jMrdSOHc7mM_H;rC5p-%Z*}bQ7j*d!c{BWv%(!KT(82_D&tBO zZb#ud6w_NVH5F4!F(nkkSTO_@LrF0V)NVj`D4J2x45|l&K`-b7{U8GNfW2S<>;n#n zf*2SCagYE>Fa-9417H{&1RnsGfDeKXflI+ZfkWUja5?xexB^@Wt^!ws!{8&}8gMPR z4tx}R3|tS6fE&O+gB!tJ-~sS$@E!0V$OWm-1j7{3`1$ab2^ScCI�^MQ4)X%i#lt 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

ipH#CRW|6jz`RInS z2`$kcsQ^tG$LC;2?g}0MZ&>YQ1$#{>rAk*8Ta7F3!Cg82 zT54y~q4$XQd$WsujZMdWKI`F?CVj@`TOP^y-q{bYcB&Vt3o@MQg*-(GK2fa#e~^4> zH~20*sFc(VIrdU|v+ap0?w3zAE#ZE*j8-f54mTD1ZfPpc$ZjgmJk}TsHmFUDgFmcR z#lBO^o%R})ze@CCEUb1QkQ02Cn5<*pDb9|q$a*;|GnrY*_$bP#t^IUk@W<7(L2d25 zO-0^YKatZ^IduPN(=WM(x!p?Ja*jlt*8$krM;qEVcCQ&ZNjBtA=}Y(KiGG82>zZ84IzC6@i*rvjrYu+J8Wej^H5U7hG)WEZLfv

Eg`crr=L# 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 diff --git a/src/android/external_display.rs b/src/android/external_display.rs index 420c7dee..6404c837 100644 --- a/src/android/external_display.rs +++ b/src/android/external_display.rs @@ -67,11 +67,13 @@ impl Drop for ExternalSurface { } } -/// A mouse (or touch) on the external monitor, in its pixels. +/// A mouse (or touch) on the external monitor, or a mouse plugged into the phone. #[derive(Debug, Clone, Copy)] pub struct PointerEvent { + /// Where on the monitor, in its pixels, or how far a phone's mouse moved when `relative`. pub x: f64, pub y: f64, + pub relative: bool, /// `MotionEvent.getButtonState()`. pub buttons: i32, /// `AXIS_HSCROLL` and `AXIS_VSCROLL`, in wheel notches. @@ -265,16 +267,44 @@ pub extern "system" fn Java_io_github_localdesktop_ExternalDisplay_nativeOnPoint scroll_y: jfloat, event_time_ms: jlong, ) { - let mut bridge = bridge().0.lock().unwrap(); - let wake = bridge.pointer_events.is_empty(); - bridge.pointer_events.push_back(PointerEvent { + push_pointer_event(PointerEvent { x: x as f64, y: y as f64, + relative: false, buttons, scroll_x: scroll_x as f64, scroll_y: scroll_y as f64, time_ms: event_time_ms.max(0) as u64, }); +} + +/// A mouse plugged into the phone, captured while it is a trackpad. +#[no_mangle] +pub extern "system" fn Java_io_github_localdesktop_TrackpadControls_nativeOnMouse( + _env: JNIEnv, + _class: JClass, + dx: jfloat, + dy: jfloat, + buttons: jint, + scroll_x: jfloat, + scroll_y: jfloat, + event_time_ms: jlong, +) { + push_pointer_event(PointerEvent { + x: dx as f64, + y: dy as f64, + relative: true, + buttons, + scroll_x: scroll_x as f64, + scroll_y: scroll_y as f64, + time_ms: event_time_ms.max(0) as u64, + }); +} + +fn push_pointer_event(event: PointerEvent) { + let mut bridge = bridge().0.lock().unwrap(); + let wake = bridge.pointer_events.is_empty(); + bridge.pointer_events.push_back(event); if wake { notify(&bridge, AppUserEvent::ExternalPointer); } diff --git a/src/android/java/io/github/localdesktop/TrackpadControls.java b/src/android/java/io/github/localdesktop/TrackpadControls.java index e17a5eec..2a0f5aea 100644 --- a/src/android/java/io/github/localdesktop/TrackpadControls.java +++ b/src/android/java/io/github/localdesktop/TrackpadControls.java @@ -12,11 +12,14 @@ import android.graphics.drawable.AdaptiveIconDrawable; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; +import android.hardware.input.InputManager; import android.os.Build; import android.os.Bundle; import android.text.InputType; import android.view.Gravity; +import android.view.InputDevice; import android.view.KeyEvent; +import android.view.MotionEvent; import android.view.Surface; import android.view.View; import android.view.Window; @@ -28,11 +31,18 @@ import android.view.inputmethod.InputMethodManager; import android.widget.LinearLayout; -/** Buttons on the phone while it is a trackpad: turn the screen, and type with the Android keyboard. */ -final class TrackpadControls extends Dialog { +/** + * Buttons on the phone while it is a trackpad: turn the screen, and type with the Android + * keyboard. A mouse plugged into the phone moves the cursor on the external display. + */ +final class TrackpadControls extends Dialog implements InputManager.InputDeviceListener { private final Activity activity; private final Pad pad; + private final Badge badge; + private LinearLayout bar; private KeyboardButton keyboard; + /** A mouse is plugged in, so this window keeps focus to capture it. */ + private boolean mouseAttached; private boolean keyboardShown; /** Waiting for the window to take focus before the keyboard can come up. */ private boolean keyboardPending; @@ -43,12 +53,14 @@ final class TrackpadControls extends Dialog { super(activity); this.activity = activity; pad = new Pad(activity); + badge = new Badge(activity); } @Override public void show() { // Under the buttons. pad.show(); + badge.show(); super.show(); } @@ -64,13 +76,9 @@ protected void onCreate(Bundle savedInstanceState) { // Touches elsewhere reach the trackpad, and keys the activity, until the keyboard is up. window.addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE); - window.setGravity(Gravity.TOP | Gravity.RIGHT); - WindowManager.LayoutParams attributes = window.getAttributes(); - attributes.x = dp(Pad.INSET + 8); - attributes.y = dp(Pad.INSET + 8); - window.setAttributes(attributes); + placeInCorner(window, Gravity.RIGHT); - LinearLayout bar = new LinearLayout(getContext()); + bar = new LinearLayout(getContext()); bar.setOrientation(LinearLayout.HORIZONTAL); IconButton rotate = new IconButton(getContext(), IconButton.ROTATE); style(rotate, "Rotate screen"); @@ -92,6 +100,21 @@ public void onClick(View view) { bar.addView(keyboard); setContentView(bar); + if (Build.VERSION.SDK_INT >= 26) { + View.OnCapturedPointerListener mouse = new View.OnCapturedPointerListener() { + @Override + public boolean onCapturedPointer(View view, MotionEvent event) { + return onMouse(event); + } + }; + // Captured events go to whichever of these has focus. + bar.setOnCapturedPointerListener(mouse); + keyboard.setOnCapturedPointerListener(mouse); + InputManager inputManager = (InputManager) getContext().getSystemService(Context.INPUT_SERVICE); + inputManager.registerInputDeviceListener(this, null); + updateMouse(); + } + if (Build.VERSION.SDK_INT >= 30) { // The keyboard can also go away with the back gesture. bar.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() { @@ -112,6 +135,11 @@ public WindowInsets onApplyWindowInsets(View view, WindowInsets insets) { @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); + // Capture ends whenever the window loses focus, e.g. to the notification shade. + if (hasFocus && mouseAttached && Build.VERSION.SDK_INT >= 26) { + View focused = getWindow().getDecorView().findFocus(); + (focused != null ? focused : bar).requestPointerCapture(); + } if (hasFocus && keyboardPending) { keyboardPending = false; // After the input method has connected to the newly focused button. @@ -131,11 +159,89 @@ public void run() { @Override public void dismiss() { + if (Build.VERSION.SDK_INT >= 26) { + ((InputManager) getContext().getSystemService(Context.INPUT_SERVICE)).unregisterInputDeviceListener(this); + } setKeyboardShown(false); pad.dismiss(); + badge.dismiss(); super.dismiss(); } + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + // Keys from the Android keyboard, and from a physical one while this window has focus. + if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) { + return super.dispatchKeyEvent(event); + } + forwardKey(event); + return true; + } + + @Override + public void onInputDeviceAdded(int deviceId) { + updateMouse(); + } + + @Override + public void onInputDeviceRemoved(int deviceId) { + updateMouse(); + } + + @Override + public void onInputDeviceChanged(int deviceId) { + updateMouse(); + } + + /** + * With a mouse plugged in, take focus and capture it: Android hides its pointer on the phone, + * and the mouse moves the cursor on the external display instead. + */ + private void updateMouse() { + boolean attached = false; + for (int id : InputDevice.getDeviceIds()) { + InputDevice device = InputDevice.getDevice(id); + // A captured mouse reports itself as relative only, so both count. + if (device != null && !device.isVirtual() + && (device.supportsSource(InputDevice.SOURCE_MOUSE) + || device.supportsSource(InputDevice.SOURCE_MOUSE_RELATIVE))) { + attached = true; + } + } + if (attached == mouseAttached) { + return; + } + mouseAttached = attached; + if (attached) { + getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE); + bar.setFocusableInTouchMode(true); + bar.requestFocus(); + } else if (!keyboardShown) { + bar.setFocusableInTouchMode(false); + getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE); + } + } + + private boolean onMouse(MotionEvent event) { + // A captured mouse reports how far it moved, batched since the last event. + float dx = event.getX(); + float dy = event.getY(); + for (int i = 0; i < event.getHistorySize(); i++) { + dx += event.getHistoricalX(i); + dy += event.getHistoricalY(i); + } + float scrollX = 0; + float scrollY = 0; + if (event.getActionMasked() == MotionEvent.ACTION_SCROLL) { + dx = 0; + dy = 0; + scrollX = event.getAxisValue(MotionEvent.AXIS_HSCROLL); + scrollY = event.getAxisValue(MotionEvent.AXIS_VSCROLL); + } + nativeOnMouse(dx, dy, event.getButtonState(), scrollX, scrollY, event.getEventTime()); + return true; + } + /** A text field on the desktop took focus. */ void showKeyboard() { setKeyboardShown(true); @@ -185,12 +291,26 @@ private void setKeyboardShown(boolean shown) { keyboardPending = false; imm.hideSoftInputFromWindow(keyboard.getWindowToken(), 0); keyboard.setFocusableInTouchMode(false); - window.addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE); + if (mouseAttached) { + bar.requestFocus(); + } else { + window.addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE); + } } keyboard.setSelected(shown); keyboard.invalidate(); } + /** The buttons' corner of the trackpad, mirrored by the badge's. */ + private static void placeInCorner(Window window, int side) { + window.setGravity(Gravity.TOP | side); + WindowManager.LayoutParams attributes = window.getAttributes(); + float density = window.getContext().getResources().getDisplayMetrics().density; + attributes.x = Math.round((Pad.INSET + 8) * density); + attributes.y = Math.round((Pad.INSET + 8) * density); + window.setAttributes(attributes); + } + private void style(View view, String label) { view.setContentDescription(label); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(dp(44), dp(44)); @@ -203,8 +323,8 @@ private int dp(int value) { } /** - * The trackpad itself, drawn like Samsung DeX: a border, a cross through the middle, and the - * app's logo on top so the right way up is clear. Touches go through it to the activity. + * The trackpad itself, drawn like Samsung DeX: a border and a cross through the middle. + * Touches go through it to the activity. */ private static final class Pad extends Dialog { static final int INSET = 12; @@ -238,25 +358,10 @@ protected void onCreate(Bundle savedInstanceState) { private static final class PadView extends View { private final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); - private final Drawable logo; - /** `logo` is an adaptive icon layer, with the art in its middle two thirds. */ - private final boolean logoIsLayer; PadView(Context context) { super(context); paint.setStyle(Paint.Style.STROKE); - Drawable icon = context.getApplicationInfo().loadIcon(context.getPackageManager()); - if (Build.VERSION.SDK_INT >= 33 && icon instanceof AdaptiveIconDrawable - && ((AdaptiveIconDrawable) icon).getMonochrome() != null) { - // The silhouette, in the pad's grey. - logo = ((AdaptiveIconDrawable) icon).getMonochrome().mutate(); - logo.setColorFilter(0xFF8A8A8A, PorterDuff.Mode.SRC_IN); - logoIsLayer = true; - } else { - // An icon without one (a full-bleed picture) as the launcher shows it. - logo = icon; - logoIsLayer = false; - } } @Override @@ -274,15 +379,63 @@ protected void onDraw(Canvas canvas) { paint.setStrokeWidth(1.5f * density); paint.setColor(0xFF4A4A4A); canvas.drawRoundRect(border, 16 * density, 16 * density, paint); + } + } - // Over the top of the cross, on a patch of the pad's black. - int size = Math.round(48 * density); - int left = Math.round(centerX - size / 2f); - int top = Math.round(border.top + 12 * density); - paint.setStyle(Paint.Style.FILL); - paint.setColor(Color.BLACK); - canvas.drawRect(left, top, left + size, top + size, paint); - paint.setStyle(Paint.Style.STROKE); + /** + * The app's logo in the top left corner, across from the buttons, so the right way up is + * clear. Touches go through it to the activity. + */ + private final class Badge extends Dialog { + Badge(Activity activity) { + super(activity); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + requestWindowFeature(Window.FEATURE_NO_TITLE); + super.onCreate(savedInstanceState); + setCancelable(false); + Window window = getWindow(); + window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); + window.addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE + | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE); + placeInCorner(window, Gravity.LEFT); + LinearLayout frame = new LinearLayout(getContext()); + View logo = new LogoView(getContext()); + style(logo, null); + frame.addView(logo); + setContentView(frame); + } + } + + private static final class LogoView extends View { + private final Drawable logo; + /** `logo` is an adaptive icon layer, with the art in its middle two thirds. */ + private final boolean logoIsLayer; + + LogoView(Context context) { + super(context); + Drawable icon = context.getApplicationInfo().loadIcon(context.getPackageManager()); + if (Build.VERSION.SDK_INT >= 33 && icon instanceof AdaptiveIconDrawable + && ((AdaptiveIconDrawable) icon).getMonochrome() != null) { + // The silhouette, in the pad's grey. + logo = ((AdaptiveIconDrawable) icon).getMonochrome().mutate(); + logo.setColorFilter(0xFF8A8A8A, PorterDuff.Mode.SRC_IN); + logoIsLayer = true; + } else { + // An icon without one (a full-bleed picture) as the launcher shows it. + logo = icon; + logoIsLayer = false; + } + } + + @Override + protected void onDraw(Canvas canvas) { + int size = Math.min(getWidth(), getHeight()); + int left = (getWidth() - size) / 2; + int top = (getHeight() - size) / 2; int bleed = logoIsLayer ? size / 4 : 0; logo.setBounds(left - bleed, top - bleed, left + size + bleed, top + size + bleed); logo.draw(canvas); @@ -365,23 +518,21 @@ public InputConnection onCreateInputConnection(EditorInfo outAttrs) { | EditorInfo.IME_ACTION_NONE; return new BaseInputConnection(this, false); } - - @Override - public boolean dispatchKeyEvent(KeyEvent event) { - if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) { - return super.dispatchKeyEvent(event); - } - forwardKey(event); - return true; - } } /** Passes a key on to the desktop, from the Android keyboard or one typing on the monitor. */ static void forwardKey(KeyEvent event) { + // Apps on the desktop repeat held keys themselves. + if (event.getRepeatCount() > 0) { + return; + } if (event.getAction() == KeyEvent.ACTION_DOWN || event.getAction() == KeyEvent.ACTION_UP) { nativeOnKey(event.getAction() == KeyEvent.ACTION_DOWN, event.getKeyCode(), event.getEventTime()); } } private static native void nativeOnKey(boolean down, int keyCode, long eventTimeMs); + + private static native void nativeOnMouse( + float dx, float dy, int buttons, float scrollX, float scrollY, long eventTimeMs); } From 13d2a9cd17f52430772f5028adbb2fa21bc5bfed Mon Sep 17 00:00:00 2001 From: Teddy Date: Sat, 31 Oct 2026 14:54:48 +0100 Subject: [PATCH 02/13] docs: logo in the top left and a mouse on the external display --- gh-pages/docs/user/8-external-display.md | 4 +++- .../static/img/external-display-trackpad.png | Bin 11815 -> 10931 bytes 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/gh-pages/docs/user/8-external-display.md b/gh-pages/docs/user/8-external-display.md index 40641d9e..39f08366 100644 --- a/gh-pages/docs/user/8-external-display.md +++ b/gh-pages/docs/user/8-external-display.md @@ -20,7 +20,7 @@ Connect your phone to a monitor or TV (USB-C to HDMI, a USB-C dock, or a wireles | Touch and hold, then slide | Drag (hold the left button) | | Touch and hold, then lift | Right click | -The bear at the top of the trackpad shows which way is up. +The bear in the top left corner of the trackpad shows which way is up. ## Buttons @@ -29,6 +29,8 @@ The bear at the top of the trackpad shows which way is up. ![The Android keyboard typing into the desktop](/img/external-display-keyboard.png#boxed) +A mouse plugged into the phone moves the cursor on the monitor instead of the phone's, and clicks and scrolls there. + ## In the background Switch to another app and the desktop stays on the monitor. A mouse or keyboard used on the monitor keeps working there, if Android lets the mouse pointer onto the monitor. Come back to Local Desktop to use the trackpad again. diff --git a/gh-pages/static/img/external-display-trackpad.png b/gh-pages/static/img/external-display-trackpad.png index c5ee78472a59a068d147102cb29b27416f221a63..c04eaa37707b43afd381249442016be38eac719c 100644 GIT binary patch literal 10931 zcmeHtc~H|y*RJC%sDR7}!XO9^DlqJdfU?B}MOhV4b|QFYPs(bs7RO;7B|GH0~e$I2A z)6wTm^!az}*|BBI7XEW*^~|^8-r+304sBd=g#{I_= zCsq~$=W0#qh26|P6FaR~>~}KPPMO8Mm;2c9;=;Kn5if+yURc=el6~<))?)qEO4d!i z^S7j)Z~K0SL7v&etp_tb<0PaFJRWLZca|wGr7+jC}JtoV`0o*tD1gRy(YXoY8wUXyJydV;kFc;k_l zmbey|!%0SmlkPW25?=w3k{5c(GR7Y!hdHEe4 zfq=k3Wkp4PKE7oZ%hcHTSVNop45e1#<{mgA``{8{HBh92V9Wm*vsV;76eSLkIvdL*_OtYfoPFhS%%>MoR zot>Ti{rzn#yaucMX&oJA>M8bDQg`Lej8keuylWPkWbc`zX|E3WlE%=-8uc`LJ@{M4 z(0A_K$u`T)%R{l5v)N|XoSdB0vJLV}Qh0WXTiMuX2Fp?hQVz&HlVilj;7#$tm z+uJ)gH%FmRE_SIFf97fL?hb6=*HBPY)LHtV3ez}~d{!m}@ual0wAZ7&x;li`Rlv*3 zE3b>j;`37q3JQ1xBouJOW~`*--o0u)-(|{EmoF#?i|yU36TTi)X{Q@Be;I{Btu*?Z zx>;%aPkzh*-w;8DUJnX7DuJa*+fi!w6+ZFh!-YPlt?AVpyr)vB&|O?t$N89XO1^qV zs_ynL6LW*r(4rzEP11Gu#xyGUMe)D8;(v2jOylQ;AgKqxHIFO=X|JalWS1oAtKe@) zQ8OZC%)*q&L%vi&YwZ2V?9?37bcsECreUSEA*>xgq_vFwpcUUT(_89x?b_66OT4_; z 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 literal 11815 zcmdsdX;f2Z*S4*-Duc9wsDM%@pn#yvgMdX8WC#_JF@Pvj0S)sIAQ5G#ARtDFh(HAc zr3?Wg^AH6Q0f7QC&odz*VG3g)-%h`;t9_nt`L4e2TF;;NELV&isUZf$UN~fv_$KOOLFfw zzurDvcoo;H<<7$u&U-}o$INTLSa+^G5xc0D{N8tb9iy(Pxi%si=QP#xjh+l@^-o_5&KSyAB@`X-onRtyMamUQ$wm zlsTOKlSoq$hPSruN$GvZV_C{VF(%oj(t_e*Vpnu^8yXtw+B*8bRwyiK|L8>8y?b}1 z-@K#%SEECbRi0pU{jEX^$%Nm!Tm!x+5U{baxh7y_Y#bzIk**TkN%4`vyZvz(WOXvp zAzofyE-o$}9tB7lqWwjFx2_hISYjo;0-nX!*EgYgs<5zdY;0_CadBf~!zyn&xyft3 zk0c(IPI7KTOIhTbN_O@4_jh)7_VkqA87OgAQrFPf{wUveVT(qJxpLcRF3AFScY1l_ zQse>V>Z+M!!rQlR;Zg(wp;p)GN*k(Fj!KtzZViyKXgRv7{j$KhEj2VW)KE-bPR@(9 zzL=ez-PI#szIm74N17=axZ6ClJkyq@@Lt|rN5u)*i-}0N#-Nb-;sdNdoz@TV#&zhhia{pFPmPg-wbeEhc$jJ~T7M2Ma__%J>`{&qvGqEHM>8Z1IMyNpiZiOxD8 zs`;XM3bTYu$o_yEhIU&BA+$!GFhQ(Gx#ct+uNyzSt=WM$llYW#C;0kYVZ!h@%!3l8> zBfDHx4Gj%7HKC@G+|Ze&X|k`NB1?)lqkg%VM%X?I}?~j#3dC#3ce=XazqOub2yX15+hx%R^b-`=$!>3Q5 z+AymmoVampY%H4k7-3tXJJsSuDlYcz$+y|dcf4vU(Hf0L3&mWKOX9iO;vko0oOb-! zv3UxGLZv1rB?YebIWx*XXV+pYW8*gK;ibgx?rwkv2f2-AGOKwEm7?Z5C(2$FwL5or59M_K6X6y= zAD@-AHRa?MVN}&(gz(*23Z-$%tJvx+&0A!tLPd_Zfo5-4Zz#quX(@wG3!F~cD;n%^ z_ipR{Gp}%GHDC6%w|h>+C=dG$+)*C%s2k5tg?ne4+6MQFe|0`~!bh#Tpx{RtJj{x? zxVQnKgEJX3sX;P6{I76%gDt74sioxY`K>iZ+(elzQTF}fOsW)0DLLCzGF}fdb)q3o zYw;cbSV=AfhUX)S$}x&Vw7+~>+lc>22+UrtS&qHZ@{+RBzBPLd0FCR$8j1=E0wzI8 zs@ESQN}jtbZFQH{Fc-$^WHrylO{~}FsNfnW3vV~nY|o?k`1r`9uY%Wc=?{I1n2|3c z`9y0rrjv8J=C~u09_rlk^HWMPoc1cO7kcl>8e(A9X4^BAhkQEUz0=7v3-Yu+;idSk zb!GDW{Jj65X9IUcl)a?4hsQ#s7Rz2T!HN~v=&%&8dwiok4&$>nTKyS+U;a~ z*+i^*QC}|lWQvY#@r@Ui{*2ZsuW04HP`)1Oq!S2^_V)Gx0c8Zj86WxB39oVynKB+y zdV;lA>dMi*66&KT7PeV1*L1T zm$lrA`**gtjMFr2qy_6l?MA z#!f(Z-NGZX;J(WV#NeqZm?z=kg@~6gUq&8BOGx(`o<3NA>pZM_z(mYUYs%IDd3(S| z&4$=hSy_plGRK^Wo%jRqEg9k+jRsTqLKd-);^MGVQg*5yqi=*q*5B)#^jxL&nPe+y zY69*YR(f8!MX%Joa^-mN!dpl!8EI*qYoGf1HWupm;$mWKu-nX`p&_`H{G^Ur;MGTJ zbtn8J6V&|agQKH2El_|nfcL>;wc$_-QdB(COH0?*7bm>Ey`gBky3RqoDGvwSR!SZs zW7#ws4PUcD7(kJ$&2myM1TO8t9}4v;+5_e6O2)T{uQ)YrIEWFl(yqI_5v;4LyU#_W zL2I);&dS<)puc}}b8{8`3zYmns=3fkcWteNVLY zp7zNIlDg(s5>f_BwH^Ujh6wWVD$2;1fCs#D=MKCM7U+pc!!?0$vu-NW%Ro%w}yY58J-N&GuJ+Yi%)t$@Ym@o*rTEtYt{_L+X{>85mc=>}<>= zw@gEzUpg;K!kQ>08;RkrU%!6)_H90mmEYMr40c4j%Rc(SuAjUG21jVE30|RtM|Tl zrx*r}RvTQ}_X=m^`Edt`Q`Pt(qMjHo+4~}1?{w4DQug&MLFWr06OR%3H9*8nvOjfq zm+V&#=Z;PXCJ31@uO9AG^e{F&G9n^1WVLVLZsmOa09kgem4?UulAuxNqoyGzC#R_B zm=0uw|JVWZoG$UyfN@9Jpgz}*qltH};A_6ZP-Z&q9z)UOPrRsVrK{G5+}$S1UT=u@ zx3#v!#)+tQ3=M626Ag_CCh#U&L96ZnKbBi1?;kJANjX=4Lz#Ro;D@$rF+XzTh)Tf1 zXtcQs&=;hP|Mfy` zbbptiAHL156aBS^dYGJ8&;9Wg4&M~N)r2YLM78%!t3e*m9VJeL@+eRC_Ae(KCRYGG zfV$P+|GdSiuGK_#=Vz;2lWJR{Sq?;)g>-9M8!EL_LV6#!@U1DY@*mj?2Ql<6UVGAg zz&+a!)5s{P6!%2CyzQ+uaa^N8ileK7&_*x@%B|K`Uz;r#16D@Y+}zy2z@S%Djpv-K z;y2t33#h)rD~Gtk^$Bw7>Ohli^2~_zW_UTE=*Ny7qxh)BPE4~ICd4x-2xqw@sOAM- z%_}P_gM)*an^jK{O7-8l0oX9Ada~YJR1fy1Ly$4s#q0_?p+Iu{MZhuVG~okM9utGxG9) zr`#Dk?iYQ%qB%wL02WhtJzV=`M#gQB7q@QRs_%R!wO+EivI5+%z`S|9)Yp-C=E6KI z!pI0bFick6m9GF+*Gx?^+CMmvIDo<@s>!-P)dR-8xMyL|A?n>Uk_ zle4q4UE7%k;_WvsB)kTx0r|ZAA^wy>Rr8N|W>gw2cwk_-dthK|eFE5j94b`#baKlo zlUZC+64A2Ky(-sTf3M{AYaSjRX@pa zPkf5n0a^0_4v(q(O)hUxiR7B%;$lvWHLqU-%&ub8Y}qb9?|Gpaf_8Fpa(AaKHi*jN zn|sDjquku6fU!V@9mS-&CkwTGV5p)#S~&ONZi>3Kgh1_`Yu&!053KSah%4YtppfMh zk87*-xj>xL=I3FK{QOpd99Z@dEqmKfr66X!%C%oUZl0>u-gKM&Pz}ppTs+@j?8eL2 zftPco(&>oP2Xm?d#%3_ql@%3A)5i&8xbKn->BH4qgXP}!x7vTj$VP6C6Z%+6X&;pgV&xYSFKc}7-s@j+NDyUDNX38Ks?ET{$5E7{!4 z(+9H#*zr25_zMUR^R@7>xKN}_&%l6GN`Ygzlyr}za*pLLf%k6eel&{~=Zj?sg^GUf zhB39F)m1-ASYF_-HDdCQ4)c|1e_`%XCbWaLwzhV5p5c;VQs(Ad-P{JAU7s@$(TO}m z=(xIakUZ<+J&g2LH0XpXtCVbmJK>BmKIQ54^WHj z^*HwWTRzM=dHGJDTG>VqWp2E1R~qQ*QdCtf&pqJ`DI4V+DdXE~D@C1!O}8XFt+2~S#_@LmIzUgg2rA(?iM?*lqI@}^DPu(x zrp`(L90Hr+055OL$B)vBmsM{%+dh0q1%B8fe@Hq!Y@E}D< zq>1G;HmfFN3qw!a7#i6gQm&>LVVA_QOB^}DBx1MI*c)lsRZ`maq`216%k40IkYBRi zXvqt8U=Wq`RB6kZWFuutpB_GFiz-LfY_AUR9lubPd(2j5=OhpvJ}uV5?5qn=yhGHZ z(@zHm26}?5zoCS=?3NMa5k5ksEr0hy0KHZ@QjHp^DK9VQQ1mgS(_>GXhARE}czA+o zw?((!E7vSCfGdH#uoG$Eh>Vw)B86h!LtPr5Zop%o*vlrswFZZr3kwWh6!H$7#j++u zv28)aq$b5noI1g|T2uqQ62(Lgir%blQ_vUBtpwHfJcBvQUR8q1Y^=fjL}YIgBX=)2 z$f+tSGF$y?mSx#Xvg>py)@IQ`cbm^a%$WJddPBB=^8P+SRB;homJZSB`(Y^r3S~ z>+4$YppmWNwc)iIFq8luK$3p*do-gjFdJJPz)yv^sHQo}ZhdstT%J}Yms?2NE`HhV zF%k+7lE3Eo1Yxn3!2~$Ed#32Q>>;x+!$rb8?NmaKmu&I6J<2F^a91J+kS`s9sYNiqSnDIQc-7b<-teova;r>1v(859>Yk z>e25!MUJOiNbhvWZg<$R>g}M4uxe#lwVaS5xZgS4;Hi|HfcQC|88V8OGqG-(WJD7M zEJSi0Nqt#qn9XC1fCk3)FeCi-q|V93l}=;XkXt8kjYtgU+~5JsL%Te{kYJ|^tG&0u z;hCdQ_KVj5Sm7ES^31q9Bq%R7RF+8q3;>=6PJ^!IQoI(cP77&ap@Q9E8Dlp)Jk^Czg!8;sC;ZXF*m$S?sJ9f5l$ea-h zeLbVyML`InovO7>F($L7WKjx2V@)fLm(Ljv)e zIC}Oa2!8D3DbYX({E)5rQY<5A#7#j+bo2MfyVcBYi73s5P`+IEfSMxy&5r%;nf=UD z{cogPfhcOGVW*Rv$5m`MAA5V&E-uw|91{65^8DzB4IzMVvzc~mCU$2AD}yX67>_aPQBRpxvzO2GTNGH9j7&?Ooccs%!fNk59x$p7k8`$k z5R`%MNkOF}sr=YOHu^MjOI*D(tUP>Uc07OUy1q+ZV z3}6?)A1}cg&zFwuWQcD6T3sFDsQ%%qxO=>hjAPU}X*8L=vjzD(48|>Hy-pOf)F|!` zmG%qgnL2ysl==-~k9mQbqTx$;4-oUP4%>_1aslGhNJN3PD4D?JT?D3^g|ri?&qJHS z$yRU>$UuusC5s0mxi3xl+VF`cQNwt9-yx>}Z5?>|u^VS&f9sm#DpAfi%K^a&HEN7z1O_QEb_cmJ!DIGY?LKNLZ8LQumnED; z8m7DgF_;<)X_>YA_v@SUyBVh%e&z2Dxf)C`v21!_(>pye`u4%tbZoH|hpnfvCdK)V zsjckAF6+m1fLEH2t0l8|Dw#RPR8qfY-=Nr@uFPZ+`w#}n3yn7MIFyHt7B#-zN=Go z2NUUG)uzS(&`iQh!VXK+xacADl9evDyzG^vX6p>Xldb5A3$XY{i*mzkYgq23TJCYB>9X-w)QRG9B%Qc3N32vLb=Ow;FbfaBzLR$3XEqB+4l-t=%J)YOfE{Om^aMBXyoyS|<_g8- zkg{Xbl$SwOu7sgLn2qioU!HcsXLKkgWh{;R0I`w@&r?%(#t)Nwhlgt*N>L$HYX-Wf za);KoLxVO<4aWxrt6G#bx|f5poS1A7#a?hv6Ddiy_EbJB$`MizPtAHXkGnKdrNF^H zggWcLp^Mx+L>M!*e)ih;%>iqB8Z;e3>MJ+H&=Ffk-LA#Knpntnj!jHvT9cWv{#Cbc z-W-ipr*lkE4AUITi~%w{-n!geZKi>4zdCP{EpWh#7!aWml@8ezsd-EEd;@jY(Sfh|)ZcFmf;-vwQlMX$bxRP4tiG1EHe&?h zZp3(4bo`YoSIk(4fJxxJDqDDeb^_l1?3qPVg()S>tqYiHp#`$f2m|eeA z4WJlKvrsYydwY8$FbnId5i#sL(9{YpwyKU|KAH${a5yckXBBg+P(@7*?Q5q;Fj0kT zzSjDJ5;prAvTFxQa1WKqtO;)=wCaHEYJ@=K?^vkE>lqpvf`3b#=f&ZNTdeYw6ck<$ zo97ycy9)x07N!axO)-^JR8kT=fHG&7jY&O^74QcgqJC4-A?ze7ukL$`dOJbUE5m zITIxu;Z8lA;vi>9>;d!ceM3VJE40>J7!Dz!-+HLjQp|T3ek|)?)A~r%>a@a~hc}nG zNWKJx6P)RaOY@Py(yWsox6|wDt3^6$sm1k`;L1;7x z=(2~?bN&T<^0lza;Gdd1dR{{JTPcNk^J}}#ZE8L%;5`Ai?57HyR#ps7-YIk=cBCGDi z>Ub!NJ0eE5=DJgFOaSz*pn+OPA3MHXWfTv+@2t#BpgSNpt*xwTzs!tY`=#=eo8^Te z0eYq?1Yf*4*Hv+y9y;?mR7|Lp_-1fjieJBe)k$%XJ38*Q*n8*v6;3}eJB(Zwpcmxp zKfCW(+H=m)RN!(08^Y<%`H{$;rT?5!@URqy$i2Jt9 zMJYL&9mbq+e#Ev1%@#i{@3PhGhz>SxOPVSJ}ob|v{on5(S}8^uqmBc zF>015kbsZUXTg{q=IRdml%#jM1WcUVOc?N7m#eS6{af``G_*^u2_(S2g+0_ft2`OE z4@dJxd4dA&O=- zz~>?FA0zMIhx-rT>Yu*x-`+~L-G{Sf67bHI+dc2Vd(YW{idQ77yerq9BC@L6-&jj50 z*@0X1Zm&<4*{0Le)6gV@-4E#!`lk;L`;Yb?Itf>F|KD9>*{0n)_cQ>glUsl-L!)wN zXx?aVNd)ZBg1w2LzTB1YnkSLNlqJ}#2TeGTYAg0<-(+f7#ijpBCX>x_Vjexxp%$uq zf8jlVHXP6?gtnRpX?M?NI~tl}@b61~iHav5;hB1{rNhNVA_V~^bB{G2lDbMCN``%2 z5fO9D&7$}B7rpkDK6vl|xHs(dgg&$7_1(LYoj>%sD=lxZpt1S!bQ!Ll(t{?=CCj2O! zpb!4NX-2!n+n%fWw8F!Jf}nSxa{@*cbdRFy)6qpGOB=xgm!TyA#mX;=1Y234pJhNW zF}|?)4um9E#0x1y=YX$4ioy;vG8qe=CU_FiFiVs=k>Wm0(7PtUTw4=W^@4V6s*2}$ zpL3dxrLuWy>w+n$CfJz){YJ181ujQ7FYXb5Etfj-E9c|&VDkzu?6?9A&S^5iMhdgR zmKy}`!c@=&AfX0eW1?o7tY9?3gfi|-Q;+oVDvl~&Cx&Z}bz7r28&L=*f#3t0%MbII zw9m=hhB$#vYf4g*s?Y3?a7*al!Myj8oM9Wt;k3kiMdPQWwJzjJ8%1w_FTfSFN;`Vw z$Oi{Gkb<1;AJ3m#IVxvJ=;wBQgzYWRZySQ0t9 zQZ$0Pt=|?!hGm;V+=69lXEy@R3_W0Iy}A}LsfB^@Yb(Oo|ds|6Y;x*k#lc6oq!Tp+zRYe#NzF8={q0Dq)$wrLab zi-LU7(m(e-7ffxn#hCc;rVM}CtA9w}ee#y+JzjOMy?@_Uy=&J!w_5gYl+WO46nf|Z P=hW592%UWGoA>_@^J#1G From 251f6ac3394191b7f1c8ffa0070e3ffe406b148a Mon Sep 17 00:00:00 2001 From: Teddy Date: Sat, 31 Oct 2026 15:24:04 +0100 Subject: [PATCH 03/13] fix: offer keyboard shortcuts when a keyboard connects, and a black background behind the desktop --- src/android/backend/wayland/event_handler.rs | 2 +- src/android/dex/classes.dex | Bin 27528 -> 28428 bytes .../localdesktop/KeyboardShortcutsPrompt.java | 16 +++++++-- .../github/localdesktop/TrackpadControls.java | 31 ++++++++++++++++++ 4 files changed, 46 insertions(+), 3 deletions(-) diff --git a/src/android/backend/wayland/event_handler.rs b/src/android/backend/wayland/event_handler.rs index 0e8d1b4b..cc108139 100644 --- a/src/android/backend/wayland/event_handler.rs +++ b/src/android/backend/wayland/event_handler.rs @@ -741,7 +741,7 @@ fn render(backend: &mut WaylandBackend) -> Result<(), String> { .render(&mut framebuffer, size, Transform::Flipped180) .map_err(|error| format!("Failed to render frame: {error:?}"))?; frame - .clear(Color32F::new(0.1, 0.0, 0.0, 1.0), &[damage]) + .clear(Color32F::new(0.0, 0.0, 0.0, 1.0), &[damage]) .map_err(|error| format!("Failed to clear frame: {error:?}"))?; draw_render_elements(&mut frame, 1.0, &elements, &[damage]) .map_err(|error| format!("Failed to draw render elements: {error:?}"))?; diff --git a/src/android/dex/classes.dex b/src/android/dex/classes.dex index c5ace3026eda79eb1e069858a8f62d005f50d727..e31326dde0eca9b24d623f44d60607c70f46158c 100644 GIT binary patch literal 28428 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 S3on2Bl3yIq<(L1{?*9W@mc8cy literal 27528 zcmbuI3w)H-ng7o_Gr1CyVUlo(5MDx*ppXjz3?xXxJto|eAwWQ3l1!3;@Xlmr0-?4p zS}#;>#nqzqveH&tti4c|Zmqp6tyb->wrXu_t=p>AtzGTiziX?l|L=3&Gsz@itDl|l zo98*tdCqh0&$+yBLQi-&x4L$b`rU7S)_thq7c)9q&$_|anER#r%F_OOmwqyMc&}11 zrPOf8!T>~n?%$)-Nz0WVK+>3{)K$>wIZ9ms?I}=d3Gu;6N|lKGET!hHS88XeQiq$A zdI`L-LaDbv#!96of+^qJ_SAl?gb~nzk#oVe+RFF`Ky&$4f?@{!6(31z>mS7LD3qe)`C6Y3UC7a z2)qUCwWI~T;4*M0_!js%coR%tr_^H54{iis1FwUb%}RBG%fKDrKJX~`IrtNpav|x! zg`f*u3T_7f3Vr~71@c>HU$71w1joVS;4ffit5OTW4iE=7fiHt+Kt6r41Z)L|!TsPD zV8RBamV#bzCAb588~iuO+^E!Cunr`_G4L386O?bF@4;Q*MUb~ysg>XWxEK5aOlo6{ zfW6=r@LljnFuPr;?chf62zUd`4Kjv+11s-9~=T7 z1vi6Z;0f?&;N3u3H}Sb3jPLiIvM9+HmCusz-F)u>;WGD z*MM8W-QWT6F!&L83H&d}+JOx)2P^_Bz(x=TG4MffEw}@G7TgCO0#Acy!SmqH;BDa9 zi9JvVO2FBm7Ayzr!FI40><5>DYr*Z{bKq;>aqtTGEqD`nFH*`6NKR5-R1TTZPz@%N|56%U( z-~!MFc7Q=}DYy>Y0B!-F1z!MP2akZ~!C%3I-Aa{#I?x2xfevsH=mLY_0Js!<6x;>A z1il3x1);3ARqzfd=)$Lg1)v3N1N~q>xDtFE z+zIXhUjp9*{|TN2FM!{JH^5)P#BQZ#fcaoKSPM3T4iEw#1h;`tgA?Fe;CtW+@I&xp zkgM>cpctGD&H-~k1(*xY1?PczU_Ph>RiGNwfCZoyECh?dVsJjF153bCP!AfwGH?M{ z4jMrdSOHc7mM_H;rC5p-%Z*}bQ7j*d!c{BWv%(!KT(82_D&tBO zZb#ud6w_NVH5F4!F(nkkSTO_@LrF0V)NVj`D4J2x45|l&K`-b7{U8GNfW2S<>;n#n zf*2SCagYE>Fa-9417H{&1RnsGfDeKXflI+ZfkWUja5?xexB^@Wt^!ws!{8&}8gMPR z4tx}R3|tS6fE&O+gB!tJ-~sS$@E!0V$OWm-1j7{3`1$ab2^ScCI�^MQ4)X%i#lt zp9e4F!~^6r9b{;ZF>UyT=m?()8sKLceieMV;alM)Z5EJ^@Tu|%pC>{-!b_RtGaCpW zB&`jV^6fNsqc-h9xch3JpyG^Oz? z3_lYp^XLi`%b*v6>r7gi8}bny8Sl3kxr}xBh+KG)3%>_Q`v@=N{}{aFD|0|T(l){$ zH##x+6KTBY%h;58BA>f~@G{;$WBB{wKWq3?@W&1R82mkke-8e0hJOYAUc*b#nSE{%T)JE^+72LDxK|MfKcZ^Nhh z$j87>l_xKaFG}O5r|~kLQ})Y||C_Nt4?dMwU7CJFT3sGXE2oU-`%T(b_^%nhk+cuM zCxCpu4uqHS`3=LjqVr9|%h>yt;kTv9r7u!CyOF1K`r-fG=*QCd;k2|;$CSXqW9UMZa*a+%k%j>%^x7y?pXAFIV5;f4Om(Eq2YN3FL+zF+l1i-=!nXc#($ zpWD!z%8$@#{D^NCdMETOe*Oh2`95#xQqoB{Vd!yaId<RbfI51 z^gifn!si+~54xFE>Wk1V>r8d^d69&RD} zp}q9Va!nJe5!#1dA$t8LK4R(-VMp_GBmab^6V9T({!_bWOHDNT`I_Qu3_V-ZAyoyfrsk#4T22x_ z!cHx_su_eAnsK*~7AVl+kou^mUFu_+ZdXU3OO4)AJlX4{U&?riX?au~(zI7y1#O@o zeoVa37c{L2Oj+a}{THc^faHSJVSX}UuFmx-5pZewIM z>+*D}7E`WPO;@Pf4gD8GkD2(-L${mq3zhP3$3GTp`F^!l)3~}&(}>z&^kv-;{fjkq z*AEGI>2Q;}3EFA;yA!$e-wsBW*x$iOY$Lpr5hUTACVY{}|02>!`(4CIy9PZ8%eWSL z8}wpM?2_(c`bX^SGT~h&yxW9#GcGm}A2Q((o@*oFE)(uDf2}P+h^+AXX@K$>f1+tvR?O@`bs*fZ@-{jM8)=vpbe*GrDh{-QPyGy@D zxFwN!5#hE)=0SuT6B+*^m+>D_hty-5&e!uGLe4V&Bb-oWUPny1BW7Ml=)M2Z@@?vW zHFf8C#MDRjLu)8cg!!>fQ+K{c@J~B*c$wO1=tY`-K<(Dl-A_pV5gm5>U-D0ycxe~e zkI6WQ&`wuq>b8&Q$-Ij&GCpbKUw{s3x3nqT&8RGqWD5HtLi1_sKNqYJGnD}1uzt|0G`*Mc<6yXZezhTnvdYAZ| zJ~v`_TD+XcQ|YIh_)uEBoZVCLRVKbGEndcl#MhDk3KQQ=SlU0^=t=xK;B|ZO6OMjU7&zSUd#YlR&6Or=WLj3(E zUWS3#PnA>Rj}yO94D+${5BuYKIrA{@{IVO($9s8ne3_9C>Kmw0c?EJASDcDQbmyNz zS9EHTXF_*aQ%CG)kXrT&b;PZQ4(eO2Ja+9BD%dzx4f^HgL%0&_73J8u)FO{P%PeB# z&S+5IBIQBvBa~;AdCq}v7Tz1P*Rgs#)vJ`>~cEjeS_OGeU`jHDI2lJ8~2 zWk6&0rzu}9tMX``hfUm||18T=fk{%HJW@$HuP07=-|=^H&z{Sf&tp4w2!EAp1p-T~ zNyKc^F$?T$6{xB8dsT%u;IHrml$BB8u_V(GokA;H)%qtfLUI{<+l|E>&5K1V)0$G@ z3#dS5Aj|RZl6bG<-!0VV_;)}jWFN@-Ds5RnrKDYCtbd9!>N!?DgOQmJ@7DQq$eFq- zYL_x@1763zOUAGNlf-jAw+@kSl-4L?Ep+^MiqwkPVI+=U{7aq{x4Y?~RNSE5#pyi{ zI}y%xW!^2c=FObn9J^14I|zS5hx-XT_T5;NzR#rPr5V0Pc}k&Tk5eQyn@#zJ&et^V zm)%{Sr>!=C&N0z}$}G-RgPZPGD;ACViHETz<0aisJZ9QqP~Tq5oNzxsL@w>r#a>X> z40m?%4uFwIM&#r5OW#F5B_FSUmeC(CpZPBG8Si30C3oxi9Oayd$r5#eHR!LST4n4{ zV*YE9MHq?F2C2FGf@y=4FL6u4GfN{MRNqD$FOYt6ea4%}bBHhFL>lwo0O#0w#7R!lCo(txhE5r@OW%2jXA;i! za1m>U?zcKtO6kAAA02z5vf*dqbwzU~ns<;oV$H;AD&GkWseIeX_eSDJ^G)eY8qwLz z$h}_1{YcqTI@3mUg4p@^7&|iO#5c}FryE|%w**N(Tq*0zGuT^+)jUo*0naiklN+5i zbXA2X%kHAIb=DNlbW;9fSjn>-e=9WCk{hPLpDHpW%-HwV)`-nPeMj!vFSE9)F7I>| ztGw3wjMBPNIusg6@=&yj^wNpk+%rB*I{13tBS>^uy zq|dWG6ZfBk)SYWG zQh9z(8fmK?R=L{YnSGkgD~X?>ZI=ICo58?rR)7Lp?x&2ivnh{b=aZ-8|2Lhe^tfyy#eV0P_-e){7_#N>MF=;4apjz7cbWeH^^JWscCnKx4v`JVK6typz| z>h_iRCej{7oZ<7lWxg1#ypR!7l97pYu@zK#KF3}}59Ikum|Wvzo)VvopvBe-U83_D zSCq`2#L6m^@yQ4*^X#PMo>ZR9lFU!DCoNPVPhMu3wS(UH0d+4?N0A1kwwaE=F4n0NQYw$`b-#`s z^t12N;cQo%@<>@Hc~kB2tC6ytJ5rWZ+-oCo=Z(ar=ExsSId{_og;uFr=r2^k>hl

ipH#CRW|6jz`RInS z2`$kcsQ^tG$LC;2?g}0MZ&>YQ1$#{>rAk*8Ta7F3!Cg82 zT54y~q4$XQd$WsujZMdWKI`F?CVj@`TOP^y-q{bYcB&Vt3o@MQg*-(GK2fa#e~^4> zH~20*sFc(VIrdU|v+ap0?w3zAE#ZE*j8-f54mTD1ZfPpc$ZjgmJk}TsHmFUDgFmcR z#lBO^o%R})ze@CCEUb1QkQ02Cn5<*pDb9|q$a*;|GnrY*_$bP#t^IUk@W<7(L2d25 zO-0^YKatZ^IduPN(=WM(x!p?Ja*jlt*8$krM;qEVcCQ&ZNjBtA=}Y(KiGG82>zZ84IzC6@i*rvjrYu+J8Wej^H5U7hG)WEZLfv

Eg`crr=L# zBd?-eY1@oLO<6BWIX(2LtbgLa-1*eOc$4+Hh_}tM)pmOd9K$cLoq1R0S%n{uRey-@ zNjNOmt8#Be8u4ENf5C{IZe+3tW7Jo_%9wNKhMUJ8;u?vQxglq}S$eiP{xYGgPv_zV z^SrKinT2A8PM0--6=ela zzXF9jXD?6{nGzrH3ZKtf;_edR0&t`6z8koJ}~ zyOO*Mp=a_F3-JmI+5NgR#@!S7NhN;aW2BRNO2bZRZrIwu(Fz{PjYW^}01Aqsgb*=1x>?=jE&5Z;-xe{f9_deMrklUw+&xJFcaq zcCB4_;f2Opv302FIIF47j~P%k(njLrKSf<-O)a8svRj#A##3qyxQF;g;$;n>>C@JL zOiR`PFEZJExNE=)%CH{`?i$b}YXECel(ix7x>G%@ntZ!`tZTI0!g5BBe~{Ye`L;I} zl5PmCGG9MZkJzNwa@Zp|b{6@J?%lsZd8FK1c)p*yvys03HgcI0F}qy*Zi$n|)>byHwQ z0ha|bC!{rArks5O9;-Lnag9p%S89`+11dXH1!8Q+dU{Drhn%CEhO%_73G zf0)G@yoi;ikC3u#wF7@rrn>QLFS760;a_a}QpzIz;_lrm2)g^lR9|YjeI9*zx_r<+ zN6TdoBmMV!%1(8qCHGya`^mSE&mrFRb|rW_xt*I%tz?&UUfM2cHa)Xe+2Vo8)1!j+ zGBjx(xW#b4#7fjZl{OS#D`!S2UnckX6;Q|DK{%HuTyid#^RR>hljM#f6{=;=o#N%p zjz44N-=a0;r0i1@JcEs;mc?C(j6U*Ce(75)Y{N zU$bQYCA-H8Byyh@*zC4g88?@v{_M6cCuRr!CI}q+FzZ4YxA!CQtSo+SiT8GTuF~>& z%e)uUHqR(&so#sPH$19q|AA4uV|E>@Lme$UMW#v_bsco+G~aq^V^xDfgI zq>I{T(O-35TWzr$m^0JUM&e{j@AjYLPoOLFZ?C3xGCI7vzWxCub>2d?W%d$ifnHsg z=vFRc?TXpY>sq{_YccA-wv+#Pr2M(pi=R25_W^^9DY;pV3nj1FCeQSh?U-ICWZuik zVtY-I_5pGl+g{D+#Y4O2`CP`o%+p@-k>`TJBa5&&L0gRbKWHp(fXaG59iJt4S+hwc zbe^Vdleqoz1PW_wIMYv(*$^nN!;{uF>YE{M$^*rp^0cs2v}9VomJBPaVuF@>kY*yyKcud zputUb^iHSRvZ-Fx%FR@8XGc9HpMm$xBVOtNXO(!|lhrKvnbum?G5oZ*F0)weY+p(( zc5Yrm9x?hvEIRg^vJ)51FHg!VN_V!?cR>mNk#WYEzxq$NI=w&hTRs`ZH%-g!j>CC^rMz9MYRpj8=r z^bNbML*jw1q!gNS+j-KK%j$XmmEF~4ZmgW-QmLZ4^=4!B92%=Z-eb$h3qs6@;5wq_d(wD%4a8#9~o{{TVS`r9;D;)Sp@SVUukIJHC851K5sWk+RwXzdvxIA zZs02tXiyIbX+7E!=_o5Ly*hH^^5663p(JhKO$X6vIePTq$?L9bP*1Q?;*w*8%h8sX$0i-)XYL6=gL|#(*%qr;&fXyq%Wc*;(1Tr=_z}URBNin690t z;3~D7&=I!8`7JZAK59)ZnAtFY=FJzC9_>8Z;2EA#I$z#I%`a_fX<4(+bID!oJ@Py0 zc(;ut)0PHRNid-Dmkqae-rdqN9|>R?bR0hMR19*SKmGS z&K`N~GoN>5<@@7&MXX8w`48T$uJVe?{04O$mx~m+rRD0D9W-&Ip+P;Yx0 zCByO!ZCia>NW+6q?YaBz_4AjhlM;Mzn96mkSJ`gm*IhHL{vgcVEm%8xu=DDZCy!oz zRDEA$5%ohMZV7j`L|Q7BJ*Y>fI!D*{i&C}W9S!Q2!nCvucWzx?T6(m!H1efQC)IZ( zt?tFt1KpG14zfuVGb#0^J_fIvb z?;$9Cs`cutk9s~ZV^zz{`BX8|(kT~W%v6QHbg5%#ouNw%U0^8NVy!Q0wWM2YsGL_N zTxO{70{Ku8c-N0cm3Ri%mkQ-|2OYnM86aU<*F`@H=TdhkEoV}RpJn3Z`Ip2mrN$y( z4WwK0uqa_c#Ly^Iba|Gd<@-z+qW3OB<>St6moI^62cd%{_*M5KcEy^+Ny$?6vhWrX z=gOrVZk~DiZDR@V)n!PX%G|S-duEcdO(J(mFXs%QQw*JIsJt^Ew&e~_ZsMh^E}tOe zrkM#9TQ=_z3N3?*t+Rnp*>?-AG*s?(#ZC=U`H_!&*8<6_*2qOB@5qSFrL>_-6Iz!? zD>~eub=}_w6aAGy=vEUizZ)R^6VVpjH1gh?$i$M^9BotgE@Fo);5svSVbcZW*bGP<~c|4!ABMCd|%(K zanhq>hwNDY!9=7xG$4^((NMg{4mmycP{K{J52b;F_JRJ$Kv8-!%n5$ zoV0tQq;R51at!roRX5U(#_cFIirb-BEHO`8r-&o!iDWb$7Nta(d?{R97c&`;?!{op zIe37yQn~GvTbe346xWrE_V(JLq-fa5$iA>0asEyVC6f`SFHxzy6>~dOc0>0-#EGyY z%xrLJcGHITt*hHsuTov6l_^9xmar31EGPP-@nrWq3>?vU>Z9jZJN<;7s4EiWGO|F=k`H33n&MJ!)1;vnhQr zwwtl2OP!xmF?mi;h1*jNx+xyr7fYHtwkl6+v&wF5ZV#^Bu)2*E=p=!)zFms{mOoggf=fD3%%}#H$UQHfN7>i*%8QIUw<1xWl`9L_HTonlo zMElBD3`GWd!tr`F?cG%BRneFzH(|Xh86!;}9QFKBk5sMch$MriY9$RAb>KFH_Jz|6 zG^(H#+ro+H!2YoX8ly7I3syC!nRg4-jEQ(}s5@M~(OEeV>E7EKNszl(8*PDyLC}BIN83 z5jB0JtRqpILJ=ofzA_Z6S2Nx%_QGg{*W^myExJ8HKq{O|2Kr}w8I@)_9 zg&r|JsdZbTB-37vRI0D?wIBD~Wh@-vE z7z3@*XiQW`yFM0=?vJ2Y)gE?N#`5-X_fVWnM#tSyGBPmIqTytmv0JYKBL&mZtx;a- z9CeQSBjE$7BDk!e`rJy5s*gG=T{2^ToEJXtj5gPbi;i@=ZTOEY2BU0TMwLbf&`7qY zHKvqhZ9F;@W8$)LOKu9qL;Dyc#bZn3HbcF#&m?wRr#yHt#^5{a-8D|jJiT%8%Ip^h z^n6%&CL5#kb$@6e(qkOM>f!D%9!rMLsAtgCb&aP|jji3N-#%USwBayjb24^UVg_~P z*z#&8voDlp2qnUL)=)p$b?K6h8_?w$kTM$x>6j| z8tJR{fe8E9WEE$Xa47D!(zu~8>Q2s}n?7qzbTAr9urVlW?FkL+kL;}qIUFhUVq3M^ z=^ltC*v79M;IJecg1@8V7FpKG)0LWO%(yW!>kRSh!~437f-K=P&Y;pB>2pFdU!^r7 z(W*YqXG2|815plA=7dx=ZX;h_^FDMJybs;l_o2J+edsQ#R~Nk3x}D)9BlZ11rKb%V z{tx-rtBUuSx?U}MH_g<6<;=&41^+17xO0v)$@@-2GraFK42kOZS+;t0-n*p;##tg` zp&sL96H<-$u1xvgyD|lT@5&73_pZ!n#!sDjrk++oeLk<}&nLdu1fvJ*dR6zHQ>8|i zdp!O-{d`&h*>^={^{rR)-*ax8LOpWAd#_bO-OXX{drcyz4mtN%4TPM&s+DZ9+rxuH za*C^0lhR{c|Lso`tq&#pWpg>2d}G%hRy^6>j>_7G97j$XV>R2^nmTMlr=@ASvXL`* zy5aVN99{SE-dw9VYvZ_@YHAL0^I%$4JzT#v~GPlxh!tWn;M zHEUD`Uyw{qxDFE9sYt~$d9v3SeToz^UC3i+0&D_Owh+?ZKW(w)#GNywY7-XV@ z3?laBZiX)%&D~5#C&A9<3zbEHKX97Si5_`K`cApQ=@ivYu5dg%n)%C(W4AwMXT}L= z$7$VJuX5e(RC#qZZ-^Vd27baQpB}*rJSJj6T7m`Dqw?A``NA>$sLrA^`J%M6i__%i zr}1@Z{1SLmxHSWzzJ$sSnY$yzJw2)O2jZR{S0M{d=AEiEH$9c9qiSVpWN?)c?u*6` zRx&i(S8re>a%NO>Qu>@W+{@0Ul`B`bw>Ph7Zfy>3-^B%BuzADUcJgu(2e@77QJLJx za_OovpaTb0t{jE>*w2foOJ7lXyFzi5*%jr=aG%QU9$=ei>cOEa$!!HS5{}JxLS^-Y zodnlnD%UWpViAOq#J)%(q5M+(P_nx}b=K2Sa>c3gP0h>>Q+aw~$|om(RQPU+cViM} zWh71!RJQQ4=TsAgYm)-Y^@Q?;xhqnoVeKS(cDa3TZpn9vs%VAyQvG;m9Gb554Qyp## z_i}C5-zIG>g=-7P!Xa9G$Z=b8^bg6wiPb73fiX^~P9dmi9TOl=aM8Un4 z(8YAuA=xC~btOTbmN?2svTgc%yPDF^1y6gl zm-gerY7OmS%vk(YhlphBm43?QYok5{GwAinPvvN$XGET6ce&?Lbh)|Y_$=*|7fFcC zc74%FOrkwJz#L@g`-Rs}q*l8V5rc`2NIW?d8gN;jT*)-vn|kO_km5GsjabW7UP{o; z(tTbhKg6MLe7$1ryRc=(e&TSbg z=k^mNPxTO)oz^wz=}R#ay%7aoS(x60tTOlIMHM56>{rkHtC5 z<9wt7-8LePbDeWhvI#*E7CmA*y&<53HgR_pY{mmNoXmezjH~frtA1|Q*WgA z0&Z;jgE&>9Wn*TudJKL#1V>x1D?N+ zWl=|T4fPS#A4<$;3G3dQ7}}R8TiP2MNQCE=vBb>}#Uf=(7u3uvOZ124*N`OC6$*7N zT)d=fQMjvTVNcJ3uC66DU7_l5&*I*Nix!-Jes3rgUf3PNDvz2IWJaR8%Egrn=J$m6 zmwiZiTC5Y^soOm3JwN0v#_xJcJsS~Bx2AYJtuQ73?vk&$PG#>_T$012~PHW#*N)ZE8M*;_{0Pq>+6P7P1(o7z3K zXKL@%{?S-oU9!B_T89q#o@=*6~I$G3|(bvxu&1y2Y|y)1s0i_9sO2 zXw$7|HSyY5#%&TlwbD9lztoiFxqZdISk|ExKHoDdGptuuS=Pzbmi6fB4E~DdStVAk z`|~;L@FCx^wbtcizg7~;*Ym6SdRw?Rg*&o_ujBG{O1_?vuiwkpVNtnh9bcc9uZPxI zInS-Lat}3I*YLh^3OP?VTRCrn+b^_oPw@xtd>MAhcO>68Tdm6u`EFY8F{+PP*5}t- z)+zA(ddqiLtL1xry;OhJ5&Lne+e;h1Pn9-`sO*US0}?mf%lmqM(Q> zj@ZwN=!xLZXl*T;d&GWDME7s`FZyhYXq|h+{<(-A>i7lSszv7=v7Z;w^Bpf(*4rJT zHSdW1qKIDG`rnrC@HT$o$C^LYnp(w6@2`sd*!JI9zE`$O`D>89EwXRyddKoTwwrg^ ztlFuEJd(Qm3Xku)9x=Eu@DY(b8v3Zmcc@F{6y+=;oyEKFBR_$UiN=Y3>idd(-5%!a zP=v3O!aX5hugKRe5_^k8oQQZm&-Gc^$M<+mXJmLz_Ih$pMLnM5F|X&9L9gfSgynfU zd5gz-G(s=*X88{9wX8SyS=JGU5$JfVQ%;t3GGVFbdHd1w{6SZ5*Xwk|F3Wo6Vr$Ax zo+;0sUuRi9{_$d=y!$rP!{1{E@{ZkAP?244WWpa!= 30) { @@ -181,16 +183,45 @@ public boolean dispatchKeyEvent(KeyEvent event) { @Override public void onInputDeviceAdded(int deviceId) { updateMouse(); + updateKeyboard(); } @Override public void onInputDeviceRemoved(int deviceId) { updateMouse(); + updateKeyboard(); } @Override public void onInputDeviceChanged(int deviceId) { updateMouse(); + updateKeyboard(); + } + + /** + * Android keeps shortcuts such as Alt+Tab for itself; only the keyboard accessibility service + * passes them on. Offer it as soon as a keyboard connects, not just when the app opens. + */ + private void updateKeyboard() { + boolean attached = false; + for (int id : InputDevice.getDeviceIds()) { + InputDevice device = InputDevice.getDevice(id); + if (device != null && !device.isVirtual() + && device.getKeyboardType() == InputDevice.KEYBOARD_TYPE_ALPHABETIC) { + attached = true; + } + } + if (attached && !keyboardAttached) { + // By name: Google Play builds leave the service and its prompt out. + try { + Class.forName(getClass().getPackage().getName() + ".KeyboardShortcutsPrompt") + .getMethod("showIfNeeded", Activity.class) + .invoke(null, activity); + } catch (ReflectiveOperationException e) { + // Not in this build. + } + } + keyboardAttached = attached; } /** From 32ce4e8fa7bec7fcfa905c7b3981ca8667f895ba Mon Sep 17 00:00:00 2001 From: Teddy Date: Sat, 31 Oct 2026 16:13:03 +0100 Subject: [PATCH 04/13] fix: shorter keyboard shortcuts prompt that says how to turn the service on --- src/android/dex/classes.dex | Bin 28428 -> 28616 bytes .../github/localdesktop/ExternalDisplay.java | 12 +++--- .../localdesktop/KeyboardShortcutsPrompt.java | 37 +++++++++++++----- 3 files changed, 34 insertions(+), 15 deletions(-) diff --git a/src/android/dex/classes.dex b/src/android/dex/classes.dex index e31326dde0eca9b24d623f44d60607c70f46158c..dd621f91d9c5f4540f2208277da0715917d8cb95 100644 GIT binary patch literal 28616 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 S3on2Bl3yIq<(L1{?*9W@mc8cy diff --git a/src/android/java/io/github/localdesktop/ExternalDisplay.java b/src/android/java/io/github/localdesktop/ExternalDisplay.java index 68ba4e20..236afc61 100644 --- a/src/android/java/io/github/localdesktop/ExternalDisplay.java +++ b/src/android/java/io/github/localdesktop/ExternalDisplay.java @@ -163,13 +163,13 @@ protected void onCreate(Bundle savedInstanceState) { view.setOnGenericMotionListener(new View.OnGenericMotionListener() { @Override public boolean onGenericMotion(View view, MotionEvent event) { - return onPointer(event); + return onPointer(event, false); } }); view.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent event) { - return onPointer(event); + return onPointer(event, true); } }); setContentView(view); @@ -182,10 +182,12 @@ public boolean dispatchKeyEvent(KeyEvent event) { return true; } - private boolean onPointer(MotionEvent event) { + /** `pressing`: a touch event, which Android only sends while something is pressed. */ + private boolean onPointer(MotionEvent event, boolean pressing) { int buttons = event.getButtonState(); - // A touch screen or pen on the monitor clicks like a mouse. - if (!event.isFromSource(InputDevice.SOURCE_MOUSE)) { + // A touch screen or pen on the monitor clicks like a mouse, and so does a mouse that + // reports no button (a touchpad tapping, an injected click). + if (!event.isFromSource(InputDevice.SOURCE_MOUSE) || (pressing && buttons == 0)) { int action = event.getActionMasked(); buttons = action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL ? 0 : MotionEvent.BUTTON_PRIMARY; diff --git a/src/android/java/io/github/localdesktop/KeyboardShortcutsPrompt.java b/src/android/java/io/github/localdesktop/KeyboardShortcutsPrompt.java index 64af07f1..71412720 100644 --- a/src/android/java/io/github/localdesktop/KeyboardShortcutsPrompt.java +++ b/src/android/java/io/github/localdesktop/KeyboardShortcutsPrompt.java @@ -6,12 +6,15 @@ import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; +import android.os.Bundle; import android.provider.Settings; import android.view.InputDevice; public final class KeyboardShortcutsPrompt { private static final String PREFS = "keyboard_shortcuts"; private static final String ANSWERED = "answered"; + /** "Not now" for as long as the app runs. */ + private static boolean notNow; private KeyboardShortcutsPrompt() {} @@ -27,6 +30,7 @@ public void run() { private static void show(final Activity activity) { final SharedPreferences prefs = activity.getSharedPreferences(PREFS, Activity.MODE_PRIVATE); if (prefs.getBoolean(ANSWERED, false) + || notNow || !hasPhysicalKeyboard() || isServiceEnabled(activity)) { return; @@ -34,26 +38,26 @@ private static void show(final Activity activity) { CharSequence app = activity.getApplicationInfo().loadLabel(activity.getPackageManager()); new AlertDialog.Builder(activity, android.R.style.Theme_DeviceDefault_Dialog_Alert) - .setTitle("Forward keyboard shortcuts?") + .setTitle("Use Alt+Tab on the desktop?") .setMessage( - "Android keeps some shortcuts of a physical keyboard for itself, such as Alt+Tab and the Meta key. " - + app + " can pass them to the Linux desktop with Android's accessibility service.\n\n" - + "When it is on, " + app + " receives the keys you press on a physical keyboard and uses them " - + "only while the desktop is on screen. It does not read the screen or other apps, and it does " - + "not store or send your keystrokes anywhere.\n\n" - + "You can turn it off at any time in Android's accessibility settings.") + "Android keeps Alt+Tab and the Meta key for itself. The " + app + + " keyboard service passes them to the desktop.\n\n" + + "In the settings that open:\n" + + "1. Tap Downloaded apps (or Installed apps)\n" + + "2. Tap " + app + " and switch it on\n" + + "3. Tap Allow") .setCancelable(false) .setPositiveButton("Turn on", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { prefs.edit().putBoolean(ANSWERED, true).apply(); - activity.startActivity(new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS)); + activity.startActivity(accessibilitySettings(activity)); } }) - .setNegativeButton("No thanks", new DialogInterface.OnClickListener() { + .setNegativeButton("Not now", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - prefs.edit().putBoolean(ANSWERED, true).apply(); + notNow = true; } }) .show(); @@ -71,6 +75,19 @@ private static boolean hasPhysicalKeyboard() { return false; } + /** + * Android's accessibility settings, asked to highlight our service. Apps cannot open the + * service's own page; Settings apps that don't know the highlight extras just ignore them. + */ + private static Intent accessibilitySettings(Activity activity) { + String key = new ComponentName(activity, KeyboardAccessibilityService.class).flattenToString(); + Bundle args = new Bundle(); + args.putString(":settings:fragment_args_key", key); + return new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS) + .putExtra(":settings:fragment_args_key", key) + .putExtra(":settings:show_fragment_args", args); + } + private static boolean isServiceEnabled(Activity activity) { String enabled = Settings.Secure.getString( activity.getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES); From d95a191ceb21d9d443d34eb2d71c60809054b6df Mon Sep 17 00:00:00 2001 From: Teddy Date: Sat, 31 Oct 2026 17:35:45 +0100 Subject: [PATCH 05/13] fix: scrolling in X apps, by reporting relative pointer motion to Xwayland --- src/android/backend/wayland/compositor.rs | 11 ++++-- src/android/backend/wayland/event_handler.rs | 35 ++++++++++---------- 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/src/android/backend/wayland/compositor.rs b/src/android/backend/wayland/compositor.rs index 2b9e61e9..6fe7a729 100644 --- a/src/android/backend/wayland/compositor.rs +++ b/src/android/backend/wayland/compositor.rs @@ -1,8 +1,8 @@ use super::bind::bind_socket; use smithay::{ backend::renderer::utils::on_commit_buffer_handler, - delegate_compositor, delegate_data_device, delegate_output, delegate_seat, delegate_shm, - delegate_xdg_shell, + delegate_compositor, delegate_data_device, delegate_output, delegate_relative_pointer, + delegate_seat, delegate_shm, delegate_xdg_shell, input::{keyboard::KeyboardHandle, touch::TouchHandle, Seat, SeatHandler, SeatState}, output::Output, reexports::{ @@ -17,6 +17,7 @@ use smithay::{ CompositorState, SurfaceAttributes, TraversalAction, }, output::OutputHandler, + relative_pointer::RelativePointerManagerState, selection::{ data_device::{ ClientDndGrabHandler, DataDeviceHandler, DataDeviceState, ServerDndGrabHandler, @@ -59,6 +60,10 @@ pub struct State { pub shm_state: ShmState, pub data_device_state: DataDeviceState, pub seat_state: SeatState, + /// Xwayland sends scrolling through its relative pointer device, and pointer motion through + /// it too only when the compositor reports relative motion. Without this, X apps see the + /// pointer switch devices around every scroll and GTK drops the scroll. + pub relative_pointer_state: RelativePointerManagerState, pub size: Size, /// A client attached a new buffer since the last render. pub render_pending: bool, @@ -207,6 +212,7 @@ delegate_shm!(State); delegate_seat!(State); delegate_data_device!(State); delegate_output!(State); +delegate_relative_pointer!(State); impl Compositor { pub fn build() -> Result> { @@ -234,6 +240,7 @@ impl Compositor { shm_state: ShmState::new::(&dh, vec![]), data_device_state: DataDeviceState::new::(&dh), seat_state, + relative_pointer_state: RelativePointerManagerState::new::(&dh), size: (1920, 1080).into(), render_pending: false, frame_pending: false, diff --git a/src/android/backend/wayland/event_handler.rs b/src/android/backend/wayland/event_handler.rs index cc108139..de7a217c 100644 --- a/src/android/backend/wayland/event_handler.rs +++ b/src/android/backend/wayland/event_handler.rs @@ -79,15 +79,26 @@ fn emit_pointer_motion( let state = &mut compositor.state; if let Some(focus) = pointer_focus(state) { let serial = SERIAL_COUNTER.next_serial(); + let delta = Point::from((x, y)) - pointer.current_location(); pointer.motion( state, - Some(focus), + Some(focus.clone()), &pointer::MotionEvent { location: (x, y).into(), serial, time, }, ); + // In the same frame, so Xwayland moves its relative pointer device (see `State`). + pointer.relative_motion( + state, + Some(focus), + &pointer::RelativeMotionEvent { + delta, + delta_unaccel: delta, + utime: time as u64 * 1000, + }, + ); pointer.frame(state); } } @@ -285,22 +296,12 @@ pub fn handle(event: CentralizedEvent, backend: &mut WaylandBackend, event_loop: } } InputEvent::PointerMotionAbsolute { event, .. } => { - let compositor = &mut backend.compositor; - let pointer = compositor.pointer.clone(); - let serial = SERIAL_COUNTER.next_serial(); - - if let Some(surface) = get_surface(&compositor.state) { - pointer.motion( - &mut compositor.state, - Some((surface.wl_surface().clone(), (0f64, 0f64).into())), - &pointer::MotionEvent { - location: (event.x(), event.y()).into(), - serial, - time: event.time_msec(), - }, - ); - } - pointer.frame(&mut compositor.state); + emit_pointer_motion( + &mut backend.compositor, + event.x(), + event.y(), + event.time_msec(), + ); } InputEvent::PointerButton { event, .. } => { let serial = SERIAL_COUNTER.next_serial(); From 90bdd027ffd1247d931e7009362f4374ba7d72f4 Mon Sep 17 00:00:00 2001 From: Teddy Date: Sat, 31 Oct 2026 18:09:56 +0100 Subject: [PATCH 06/13] fix: same gap to the trackpad border above and beside the logo and the buttons --- src/android/dex/classes.dex | Bin 28616 -> 29384 bytes .../github/localdesktop/TrackpadControls.java | 61 +++++++++++++++--- 2 files changed, 51 insertions(+), 10 deletions(-) diff --git a/src/android/dex/classes.dex b/src/android/dex/classes.dex index dd621f91d9c5f4540f2208277da0715917d8cb95..880e07cb117495a124b6e6762f806a5438e0f0e8 100644 GIT binary patch literal 29384 zcmbuI3w)H-ng7o_Gr16kWSArZ;r0@u2Du~+ZJo|9#GT-ed^4 zwV(fszj>bXoaa2}{+!GEf<2L;g6f(@>ba|TRsHJM6Mnbywb!5g!UO%g=L}`OoqqD| zWoJ@KC6!V`TNVZ(`gvzSsqb5k`~yf{&Qt0r^z0a=nxH=pDAi8d}yjt`Rz)b zvXyFBt<-MtL+~p2BPd&=R4r%%Ye5L?0{4LX!AbB9@GbB>cnQ1=egs|xuY)(iZ@@di z*P>J&7!M|cm7pICfurCP;8Wm1@Okh>@MZ8-a2h-Vz71Xgd21;%*aofvN5LcD4EP!F zw<>ih=mgh+yTNJj1}JP(ss?NW2f@AI%iwwN3ovG#Qk7s0=mNKZW8ekwM=*1}Qdfc7 zz?0w?Aa8?GQ@{eS23!el0LQ>d@GN)(SR0j^3YLORUaz&x-R)PbA8C&7c@6gUl@2G4>Q z!S}&Wz%RhB!Q0?}f!fJ<1YnSHRc6H^B42x=N|b zz(Pp>XAz}4Uua2NOtI0^m*d<*;l z{1W^Tn!!5I4U*t`a1*#4d;;7LJ`esLoCe6GO!A41Kl744uOw> zzXQ*Mp8_k2-vSqdMPLmGgE+Vz+yU+d4}&j(e+FL%FM?OVTj2K~cMtUd#b73=0V}{} za3$yiF>nBU6nqij6uYVi{5_ zHHu|Lv4kj=3dPc(SPIlufSXsibA@YG#+52ulEQ5$ro7q>m}-jYp%~VRVW}8iieaJX zN=5f5npV*iYA=X^eIO1JAPELQ3Zy{>41)dO02l%X!PVdza4onFTn|0~4uKoMjo>D5 zGx#951sn#qg4@9D;IF_P;7;%%@L_NSd<1+Hd<@(LJ`Rq8yTLu+6X28JUT`1y6!>d! zKlmbe8axM{2QPpZ!FNC*aGxT>9HN7Q@RkV|8~#@0C59KBQo|pCzsT_Sz)ynr0C{YX zBMeUk5dIiC!smh$@Ru6?QTWRY|2Vu2p9kcz!B}B^=iGdfadd2Aqcmd6HCXL)QOb(Uuam;j_5$_;-O{u0B#W^78FJQYCr zw~c(J2zhKEaq znQxUwE^|#Dkqa+!;bs20Z6)(i9+3-QjgFKp32KeL@FKUN13(@dWQ5@nec>C7zRce> zS-fjg=JQ76GG}C7%kvlzUdI358Gai&Ck?+F{!50B!GGEC*TR3r@VCN0Zg}aVzc;+h zoqsU=J?Q+S;U9v3!tjq|@yF12IBwTYeik2qchgRU|EjT5k)^XRi?60GZkg+|%=es>n%kj1ab;*Vg*t;;>|Pa6Bjvh1ILcl+zn zEcxSE{HZMdOcpQm!nOY#^3%rtS$H?E*Ru3aWRhKWpR_@ZU209C$aa z)ZNvoMef>>`noz&UzeBqx;kgz|JB%(I@<8EPRmmPWWAO)@hMB?TMiv#=vYlXDyix9 z>NaQzdbdI^;?Ee;mhtB^(8>G}I)y*7z6gC7I*mV{gH8u;8@hw^68?mt--cd_-OnNu z-~Qj4TIzqG&B!~67kbvv??KlPZZWhK+DdpQG{g$~Z_sV*hMt9PH*|-Z$sgGt<*5JA zG^T#9X@&Zerk(0T=WLsyf&Pfb;S1&y-0zJ)x>su|YdgQ^R<2Yp$yh06N7*XYMgy<+U@ zev3TDF7kJp_Nx%-VvOL;hHf!*tD)NrjcB?@-46A#Tg@ZA&>&4?=w=K8JBI zo^TF3sfn6SQ1dk{RZBIkQ_D52Rt=h7r#_`=i+Wtskor0_mtC&pm&?xPK^-nof2-+O z^#wz}V&wm<={R)?n$Hed(&d}<`IPH_b@;IQgQneTzt%gX4r|(^(~V(AE$POvBbN9A zcGnUvU{~NL>^JrD)5=mGKfAicnmY9%%gWmKY{t

-6a|n&M(1(yuWd{AD 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 qrHnfTFLvZ_U#7v!d#v&|9=)WM-= 28) { + attributes.layoutInDisplayCutoutMode = + WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES; + } + if (Build.VERSION.SDK_INT >= 30) { + attributes.setFitInsetsTypes(0); + } window.setAttributes(attributes); } private void style(View view, String label) { view.setContentDescription(label); - LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(dp(44), dp(44)); - params.setMargins(dp(4), 0, dp(4), 0); - view.setLayoutParams(params); + view.setLayoutParams(new LinearLayout.LayoutParams(dp(44), dp(44))); } private int dp(int value) { @@ -359,6 +372,8 @@ private int dp(int value) { */ private static final class Pad extends Dialog { static final int INSET = 12; + /** Between the border and the logo or buttons in its corners. */ + static final int GAP = 12; Pad(Activity activity) { // Not a floating dialog, which would keep margins around it. @@ -445,6 +460,7 @@ private static final class LogoView extends View { private final Drawable logo; /** `logo` is an adaptive icon layer, with the art in its middle two thirds. */ private final boolean logoIsLayer; + private Bitmap art; LogoView(Context context) { super(context); @@ -465,11 +481,36 @@ private static final class LogoView extends View { @Override protected void onDraw(Canvas canvas) { int size = Math.min(getWidth(), getHeight()); - int left = (getWidth() - size) / 2; - int top = (getHeight() - size) / 2; + if (size <= 0) { + return; + } + if (art == null || art.getWidth() > size || art.getHeight() > size) { + art = render(size); + } + // The art itself in the corner, so its gaps to the border match the buttons'. + canvas.drawBitmap(art, 0, 0, null); + } + + /** The logo at `size`, trimmed to what it actually draws. */ + private Bitmap render(int size) { + Bitmap full = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); int bleed = logoIsLayer ? size / 4 : 0; - logo.setBounds(left - bleed, top - bleed, left + size + bleed, top + size + bleed); - logo.draw(canvas); + logo.setBounds(-bleed, -bleed, size + bleed, size + bleed); + logo.draw(new Canvas(full)); + int left = size; + int top = size; + for (int y = 0; y < size; y++) { + for (int x = 0; x < size; x++) { + if (Color.alpha(full.getPixel(x, y)) > 0) { + left = Math.min(left, x); + top = Math.min(top, y); + } + } + } + if (left == size) { + return full; + } + return Bitmap.createBitmap(full, left, top, size - left, size - top); } } From 26c2fc4013852bed3d4b5b39d302c4dd5aaf4704 Mon Sep 17 00:00:00 2001 From: Teddy Date: Sat, 31 Oct 2026 19:13:28 +0100 Subject: [PATCH 07/13] feat: the android keyboard on the phone's screen, with the desktop fitting above it --- gh-pages/docs/user/1-getting-started.md | 4 +- gh-pages/docs/user/8-external-display.md | 2 +- gh-pages/static/img/android-keyboard.webp | Bin 0 -> 25990 bytes gh-pages/static/img/squeekboard.webp | Bin 38008 -> 0 bytes src/android/accessibility.rs | 4 +- src/android/app/run.rs | 10 +- src/android/backend/wayland/event_handler.rs | 72 +++++++----- src/android/backend/wayland/mod.rs | 5 +- src/android/backend/wayland/output_state.rs | 6 +- src/android/dex/classes.dex | Bin 29384 -> 31456 bytes src/android/external_display.rs | 24 +++- .../github/localdesktop/ExternalDisplay.java | 10 +- .../io/github/localdesktop/PhoneKeyboard.java | 109 ++++++++++++++++++ src/android/proguard-rules.pro | 4 + src/android/proot/setup.rs | 24 ++-- 15 files changed, 211 insertions(+), 63 deletions(-) create mode 100644 gh-pages/static/img/android-keyboard.webp delete mode 100644 gh-pages/static/img/squeekboard.webp create mode 100644 src/android/java/io/github/localdesktop/PhoneKeyboard.java diff --git a/gh-pages/docs/user/1-getting-started.md b/gh-pages/docs/user/1-getting-started.md index aeee4761..3e6f61b0 100644 --- a/gh-pages/docs/user/1-getting-started.md +++ b/gh-pages/docs/user/1-getting-started.md @@ -51,9 +51,9 @@ The hardest part is installing `yay` or `paru`. You have to follow the `README.m ## I don't have a physical keyboard. -An on-screen keyboard slides up when you tap a text field, and hides again when you tap elsewhere. For apps where it doesn't appear on its own, open _"Applications"_ > _"Accessories"_ > _"On-screen keyboard"_ to show or hide it. A physical keyboard is still more comfortable for long sessions. +Your phone's own keyboard comes up when you tap a text field, and the desktop fits above it. Swipe back to put it away. For apps where it doesn't come up on its own, open _"Applications"_ > _"Accessories"_ > _"On-screen keyboard"_. A physical keyboard is still more comfortable for long sessions. -![On-screen keyboard](/img/squeekboard.webp#boxed) +![The Android keyboard typing into the desktop](/img/android-keyboard.webp#boxed) ## Text is too small diff --git a/gh-pages/docs/user/8-external-display.md b/gh-pages/docs/user/8-external-display.md index 39f08366..5ce0cc92 100644 --- a/gh-pages/docs/user/8-external-display.md +++ b/gh-pages/docs/user/8-external-display.md @@ -25,7 +25,7 @@ The bear in the top left corner of the trackpad shows which way is up. ## Buttons - **Rotate** turns the phone's screen a quarter clockwise, trackpad and Android keyboard included, for when you lay the phone sideways while auto-rotate keeps it upright. -- **Keyboard** opens the Android keyboard on the phone and types into the desktop. It also opens by itself when a text field on the desktop takes focus, instead of the desktop's own touch keyboard. +- **Keyboard** opens the Android keyboard on the phone and types into the desktop. It also opens by itself when a text field on the desktop takes focus. ![The Android keyboard typing into the desktop](/img/external-display-keyboard.png#boxed) diff --git a/gh-pages/static/img/android-keyboard.webp b/gh-pages/static/img/android-keyboard.webp new file mode 100644 index 0000000000000000000000000000000000000000..fa8f7074ae3c55c4aec0580b1eadf629315a9d88 GIT binary patch literal 25990 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%0Dxty4*)3N+yj8h-T?s6i@9fd9Io$Yu!as4 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 literal 0 HcmV?d00001 diff --git a/gh-pages/static/img/squeekboard.webp b/gh-pages/static/img/squeekboard.webp deleted file mode 100644 index 6fcbece6d0e3275f5a5140fd0b314bf092bb2287..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38008 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 diff --git a/src/android/accessibility.rs b/src/android/accessibility.rs index 89d37673..34f31aba 100644 --- a/src/android/accessibility.rs +++ b/src/android/accessibility.rs @@ -23,8 +23,10 @@ pub enum AppUserEvent { ExternalDisplayChanged, /// A mouse (or touch) on the external monitor moved, clicked or scrolled. ExternalPointer, - /// A text field on the desktop took focus while the phone is a trackpad. + /// A text field on the desktop took focus. KeyboardRequested, + /// The Android keyboard on the phone's screen came up, changed height or went away. + KeyboardInset, } #[derive(Clone, Copy, Debug)] diff --git a/src/android/app/run.rs b/src/android/app/run.rs index 35ced6ae..b9f5f2de 100644 --- a/src/android/app/run.rs +++ b/src/android/app/run.rs @@ -8,7 +8,7 @@ use crate::android::{ pipewire_standalone_aaudio, wayland::{ bind, centralize, centralize_injected_keyboard, dispatch_clients, handle, idle, - on_external_pointer, on_vsync, paint_trackpad, start_frame_loop, + on_external_pointer, on_vsync, paint_trackpad, set_keyboard_inset, start_frame_loop, write_guest_output_state, CentralizedEvent, State, WaylandBackend, }, webview::ErrorVariant, @@ -85,8 +85,7 @@ fn configure_output(backend: &mut WaylandBackend) { ); let guest_scale = guest_scale_factor.round().max(1.0) as i32; - let touch_keyboard = winit.external_surface().is_none(); - write_guest_output_state(window_size.w, window_size.h, guest_scale, touch_keyboard); + write_guest_output_state(window_size.w, window_size.h, guest_scale); for surface in backend.compositor.state.xdg_shell_state.toplevel_surfaces() { configure_toplevel(surface, window_size.w, window_size.h); @@ -229,13 +228,16 @@ impl ApplicationHandler for PolarBearApp { } } AppUserEvent::KeyboardRequested => { - if backend.is_trackpad() && backend.window_visible() { + if backend.window_visible() { run_in_jvm( external_display::show_keyboard, self.frontend.android_app.clone(), ); } } + AppUserEvent::KeyboardInset => { + set_keyboard_inset(backend, external_display::keyboard_inset()); + } } } diff --git a/src/android/backend/wayland/event_handler.rs b/src/android/backend/wayland/event_handler.rs index de7a217c..3e3e8f9d 100644 --- a/src/android/backend/wayland/event_handler.rs +++ b/src/android/backend/wayland/event_handler.rs @@ -20,7 +20,7 @@ use smithay::backend::renderer::{Color32F, Frame, Renderer}; use smithay::input::keyboard::FilterResult; use smithay::input::pointer::{self, CursorImageStatus, CursorImageSurfaceData}; use smithay::reexports::wayland_server::protocol::wl_pointer::ButtonState as WlButtonState; -use smithay::utils::{Point, Rectangle, Transform, SERIAL_COUNTER}; +use smithay::utils::{Physical, Point, Rectangle, Size, Transform, SERIAL_COUNTER}; use smithay::wayland::compositor::with_states; use smithay::wayland::shell::xdg::ToplevelSurface; use smithay::{ @@ -424,36 +424,37 @@ pub fn handle(event: CentralizedEvent, backend: &mut WaylandBackend, event_loop: } // The desktop is on the external display, so the phone's own window doesn't size it. CentralizedEvent::Resized { .. } if backend.is_trackpad() => paint_trackpad(backend), - CentralizedEvent::Resized { - size, - guest_scale_factor, - } => { - backend.compositor.state.size = (size.w, size.h).into(); - - if let Some(output) = &backend.compositor.output { - output.change_current_state( - Some(Mode { - size: size.into(), - refresh: backend.refresh_millihz, - }), - Some(Transform::Normal), - Some(Scale::Integer(1)), - Some((0, 0).into()), - ); - } + CentralizedEvent::Resized { size, .. } => resize_desktop(backend, size), + _ => (), + } +} - let guest_scale = guest_scale_factor.round().max(1.0) as i32; - write_guest_output_state(size.w, size.h, guest_scale, true); +/// Size the desktop to the phone's window, less what the Android keyboard covers of it. +fn resize_desktop(backend: &mut WaylandBackend, window: Size) { + let size: Size = (window.w, (window.h - backend.keyboard_inset).max(1)).into(); + backend.compositor.state.size = (size.w, size.h).into(); + + if let Some(output) = &backend.compositor.output { + output.change_current_state( + Some(Mode { + size: size.into(), + refresh: backend.refresh_millihz, + }), + Some(Transform::Normal), + Some(Scale::Integer(1)), + Some((0, 0).into()), + ); + } - if let Some(surface) = get_surface(&backend.compositor.state) { - surface.xdg_toplevel().configure(size.w, size.h, vec![]); - } + let guest_scale = backend.guest_scale_factor.round().max(1.0) as i32; + write_guest_output_state(size.w, size.h, guest_scale); - backend.compositor.state.render_pending = true; - schedule_frame(backend); - } - _ => (), + if let Some(surface) = get_surface(&backend.compositor.state) { + surface.xdg_toplevel().configure(size.w, size.h, vec![]); } + + backend.compositor.state.render_pending = true; + schedule_frame(backend); } /// Show the phone's screen as a blank trackpad; `TrackpadControls` draws its outline on top. @@ -465,6 +466,23 @@ pub fn paint_trackpad(backend: &mut WaylandBackend) { } } +/// The Android keyboard on the phone's screen now covers its bottom `inset` pixels: fit the +/// desktop above it, as Android apps do, so the text field being typed into stays in sight. +pub fn set_keyboard_inset(backend: &mut WaylandBackend, inset: i32) { + if inset == backend.keyboard_inset { + return; + } + backend.keyboard_inset = inset; + if backend.is_trackpad() { + return; + } + let window = match &backend.graphic_renderer { + Some(winit) => winit.window_size(), + None => return, + }; + resize_desktop(backend, window); +} + /// A mouse on the external display, or one plugged into the phone: it moves the cursor, and its /// buttons and wheel go straight to the desktop. pub fn on_external_pointer(backend: &mut WaylandBackend, event: PointerEvent) { diff --git a/src/android/backend/wayland/mod.rs b/src/android/backend/wayland/mod.rs index 8a6a271c..1649ab4a 100644 --- a/src/android/backend/wayland/mod.rs +++ b/src/android/backend/wayland/mod.rs @@ -16,7 +16,8 @@ pub use output_state::write_guest_output_state; pub use compositor::{Compositor, State}; pub use event_centralizer::{centralize, centralize_injected_keyboard, CentralizedEvent}; pub use event_handler::{ - dispatch_clients, handle, idle, on_external_pointer, on_vsync, paint_trackpad, start_frame_loop, + dispatch_clients, handle, idle, on_external_pointer, on_vsync, paint_trackpad, + set_keyboard_inset, start_frame_loop, }; pub use frame_clock::FrameClock; pub use watcher::WaylandWatcher; @@ -82,6 +83,8 @@ pub struct WaylandBackend { pub frame_clock: Option, /// A frame was already submitted for the upcoming refresh, so the next one waits for vsync. pub rendered_since_vsync: bool, + /// How much of the bottom of the phone's screen the Android keyboard covers, in pixels. + pub keyboard_inset: i32, } impl WaylandBackend { diff --git a/src/android/backend/wayland/output_state.rs b/src/android/backend/wayland/output_state.rs index 183bfa6f..1b7393b5 100644 --- a/src/android/backend/wayland/output_state.rs +++ b/src/android/backend/wayland/output_state.rs @@ -5,19 +5,15 @@ use std::path::PathBuf; /// /// The file lives in the proot-visible `/tmp` directory so scripts running inside the /// Xfce/labwc session can align wlroots output mode/scale with the Android winit window. -/// `touch_keyboard` is off while the desktop is on an external display, where the phone is the -/// trackpad and the Android keyboard types instead (see `localdesktop-keyboard-relay`). -pub fn write_guest_output_state(width: i32, height: i32, scale: i32, touch_keyboard: bool) { +pub fn write_guest_output_state(width: i32, height: i32, scale: i32) { if width <= 0 || height <= 0 || scale <= 0 { return; } let path = PathBuf::from(config::arch_fs_root()).join("tmp/localdesktop-output"); - let touch_keyboard = u8::from(touch_keyboard); let content = format!( "LOCALDESKTOP_OUTPUT_MODE={width}x{height} LOCALDESKTOP_OUTPUT_SCALE={scale} -LOCALDESKTOP_TOUCH_KEYBOARD={touch_keyboard} " ); if let Err(error) = std::fs::write(&path, content) { diff --git a/src/android/dex/classes.dex b/src/android/dex/classes.dex index 880e07cb117495a124b6e6762f806a5438e0f0e8..41ae67421b089087af90a47bad898b60ab0dd3bc 100644 GIT binary patch literal 31456 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 Pzg6mkoMe>zKh^&a!d?vE literal 29384 zcmbuI3w)H-ng7o_Gr16kWSArZ;r0@u2Du~+ZJo|9#GT-ed^4 zwV(fszj>bXoaa2}{+!GEf<2L;g6f(@>ba|TRsHJM6Mnbywb!5g!UO%g=L}`OoqqD| zWoJ@KC6!V`TNVZ(`gvzSsqb5k`~yf{&Qt0r^z0a=nxH=pDAi8d}yjt`Rz)b zvXyFBt<-MtL+~p2BPd&=R4r%%Ye5L?0{4LX!AbB9@GbB>cnQ1=egs|xuY)(iZ@@di z*P>J&7!M|cm7pICfurCP;8Wm1@Okh>@MZ8-a2h-Vz71Xgd21;%*aofvN5LcD4EP!F zw<>ih=mgh+yTNJj1}JP(ss?NW2f@AI%iwwN3ovG#Qk7s0=mNKZW8ekwM=*1}Qdfc7 zz?0w?Aa8?GQ@{eS23!el0LQ>d@GN)(SR0j^3YLORUaz&x-R)PbA8C&7c@6gUl@2G4>Q z!S}&Wz%RhB!Q0?}f!fJ<1YnSHRc6H^B42x=N|b zz(Pp>XAz}4Uua2NOtI0^m*d<*;l z{1W^Tn!!5I4U*t`a1*#4d;;7LJ`esLoCe6GO!A41Kl744uOw> zzXQ*Mp8_k2-vSqdMPLmGgE+Vz+yU+d4}&j(e+FL%FM?OVTj2K~cMtUd#b73=0V}{} za3$yiF>nBU6nqij6uYVi{5_ zHHu|Lv4kj=3dPc(SPIlufSXsibA@YG#+52ulEQ5$ro7q>m}-jYp%~VRVW}8iieaJX zN=5f5npV*iYA=X^eIO1JAPELQ3Zy{>41)dO02l%X!PVdza4onFTn|0~4uKoMjo>D5 zGx#951sn#qg4@9D;IF_P;7;%%@L_NSd<1+Hd<@(LJ`Rq8yTLu+6X28JUT`1y6!>d! zKlmbe8axM{2QPpZ!FNC*aGxT>9HN7Q@RkV|8~#@0C59KBQo|pCzsT_Sz)ynr0C{YX zBMeUk5dIiC!smh$@Ru6?QTWRY|2Vu2p9kcz!B}B^=iGdfadd2Aqcmd6HCXL)QOb(Uuam;j_5$_;-O{u0B#W^78FJQYCr zw~c(J2zhKEaq znQxUwE^|#Dkqa+!;bs20Z6)(i9+3-QjgFKp32KeL@FKUN13(@dWQ5@nec>C7zRce> zS-fjg=JQ76GG}C7%kvlzUdI358Gai&Ck?+F{!50B!GGEC*TR3r@VCN0Zg}aVzc;+h zoqsU=J?Q+S;U9v3!tjq|@yF12IBwTYeik2qchgRU|EjT5k)^XRi?60GZkg+|%=es>n%kj1ab;*Vg*t;;>|Pa6Bjvh1ILcl+zn zEcxSE{HZMdOcpQm!nOY#^3%rtS$H?E*Ru3aWRhKWpR_@ZU209C$aa z)ZNvoMef>>`noz&UzeBqx;kgz|JB%(I@<8EPRmmPWWAO)@hMB?TMiv#=vYlXDyix9 z>NaQzdbdI^;?Ee;mhtB^(8>G}I)y*7z6gC7I*mV{gH8u;8@hw^68?mt--cd_-OnNu z-~Qj4TIzqG&B!~67kbvv??KlPZZWhK+DdpQG{g$~Z_sV*hMt9PH*|-Z$sgGt<*5JA zG^T#9X@&Zerk(0T=WLsyf&Pfb;S1&y-0zJ)x>su|YdgQ^R<2Yp$yh06N7*XYMgy<+U@ zev3TDF7kJp_Nx%-VvOL;hHf!*tD)NrjcB?@-46A#Tg@ZA&>&4?=w=K8JBI zo^TF3sfn6SQ1dk{RZBIkQ_D52Rt=h7r#_`=i+Wtskor0_mtC&pm&?xPK^-nof2-+O z^#wz}V&wm<={R)?n$Hed(&d}<`IPH_b@;IQgQneTzt%gX4r|(^(~V(AE$POvBbN9A zcGnUvU{~NL>^JrD)5=mGKfAicnmY9%%gWmKY{t

-6a|n&M(1(yuWd{AD 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 UV<8v0@W-T}$T6ed8Bpr~0b`, + /// How much of the phone's screen the Android keyboard covers, in pixels. + keyboard_inset: i32, } static BRIDGE: OnceLock<(Mutex, Condvar)> = OnceLock::new(); -/// The guest touches this when a text field takes focus while the phone is a trackpad (see -/// `localdesktop-keyboard-relay`). +/// The guest touches this when a text field takes focus (see `localdesktop-keyboard-relay`). const KEYBOARD_REQUEST: &str = "tmp/localdesktop-keyboard"; fn bridge() -> &'static (Mutex, Condvar) { @@ -138,6 +139,10 @@ pub fn set_in_use(in_use: bool) { } } +pub fn keyboard_inset() -> i32 { + bridge().0.lock().unwrap().keyboard_inset +} + pub fn drain_pointer_events() -> Vec { bridge() .0 @@ -195,7 +200,7 @@ pub fn start(env: &mut JNIEnv, android_app: &AndroidApp) { call_java(env, android_app, "start"); } -/// Open the Android keyboard over the trackpad. +/// Open the Android keyboard, over the trackpad or on the phone's screen. pub fn show_keyboard(env: &mut JNIEnv, android_app: &AndroidApp) { call_java(env, android_app, "showKeyboard"); } @@ -329,3 +334,16 @@ pub extern "system" fn Java_io_github_localdesktop_TrackpadControls_nativeOnKey( }; accessibility::inject_key(scancode, state, event_time_ms.max(0) as u64); } + +#[no_mangle] +pub extern "system" fn Java_io_github_localdesktop_PhoneKeyboard_nativeOnInset( + _env: JNIEnv, + _class: JClass, + bottom: jint, +) { + let mut bridge = bridge().0.lock().unwrap(); + if bridge.keyboard_inset != bottom { + bridge.keyboard_inset = bottom; + notify(&bridge, AppUserEvent::KeyboardInset); + } +} diff --git a/src/android/java/io/github/localdesktop/ExternalDisplay.java b/src/android/java/io/github/localdesktop/ExternalDisplay.java index 236afc61..838b1783 100644 --- a/src/android/java/io/github/localdesktop/ExternalDisplay.java +++ b/src/android/java/io/github/localdesktop/ExternalDisplay.java @@ -80,13 +80,18 @@ public void run() { }); } - /** A text field on the desktop took focus: type into it with the Android keyboard. */ - public static void showKeyboard(Activity activity) { + /** + * A text field on the desktop took focus: type into it with the Android keyboard, over the + * trackpad or on the phone's own screen. + */ + public static void showKeyboard(final Activity activity) { activity.runOnUiThread(new Runnable() { @Override public void run() { if (controls != null) { controls.showKeyboard(); + } else { + PhoneKeyboard.show(activity); } } }); @@ -125,6 +130,7 @@ private static void update() { presentation = null; return; } + PhoneKeyboard.hide(); controls = new TrackpadControls(activity); controls.show(); Toast.makeText(activity, "The desktop is on the external display. Use this screen as a trackpad.", diff --git a/src/android/java/io/github/localdesktop/PhoneKeyboard.java b/src/android/java/io/github/localdesktop/PhoneKeyboard.java new file mode 100644 index 00000000..9f0c0091 --- /dev/null +++ b/src/android/java/io/github/localdesktop/PhoneKeyboard.java @@ -0,0 +1,109 @@ +package io.github.localdesktop; + +import android.app.Activity; +import android.content.Context; +import android.os.Build; +import android.text.InputType; +import android.view.KeyEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowInsets; +import android.view.inputmethod.BaseInputConnection; +import android.view.inputmethod.EditorInfo; +import android.view.inputmethod.InputConnection; +import android.view.inputmethod.InputMethodManager; + +/** + * The Android keyboard on the phone's own screen, typing into the desktop shown there. While it + * is up, the desktop fits above it. + */ +final class PhoneKeyboard { + private static KeyInput input; + + private PhoneKeyboard() {} + + static void show(Activity activity) { + final KeyInput input = attach(activity); + input.setFocusableInTouchMode(true); + input.requestFocus(); + // After the input method has connected to the newly focused view. + input.post(new Runnable() { + @Override + public void run() { + InputMethodManager imm = (InputMethodManager) + input.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); + imm.showSoftInput(input, 0); + } + }); + } + + static void hide() { + if (input == null) { + return; + } + InputMethodManager imm = (InputMethodManager) + input.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(input.getWindowToken(), 0); + input.setFocusableInTouchMode(false); + input.clearFocus(); + } + + private static KeyInput attach(Activity activity) { + if (input != null && input.getContext() == activity) { + return input; + } + input = new KeyInput(activity); + activity.addContentView(input, new ViewGroup.LayoutParams(1, 1)); + if (Build.VERSION.SDK_INT >= 30) { + input.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() { + @Override + public WindowInsets onApplyWindowInsets(View view, WindowInsets insets) { + int bottom = insets.isVisible(WindowInsets.Type.ime()) + ? insets.getInsets(WindowInsets.Type.ime()).bottom : 0; + nativeOnInset(bottom); + if (bottom == 0) { + // Put away with the back gesture: the next tap on a text field asks again. + view.setFocusableInTouchMode(false); + } + return insets; + } + }); + } + return input; + } + + /** Takes what the Android keyboard types and passes it on as key presses. */ + private static final class KeyInput extends View { + KeyInput(Context context) { + super(context); + } + + @Override + public boolean onCheckIsTextEditor() { + return true; + } + + @Override + public InputConnection onCreateInputConnection(EditorInfo outAttrs) { + // No suggestions, so each character arrives as soon as it is typed. + outAttrs.inputType = InputType.TYPE_CLASS_TEXT + | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD + | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS; + outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_FULLSCREEN + | EditorInfo.IME_FLAG_NO_EXTRACT_UI + | EditorInfo.IME_ACTION_NONE; + return new BaseInputConnection(this, false) { + @Override + public boolean sendKeyEvent(KeyEvent event) { + // Straight to the desktop: the activity's own key events go to native code, + // which doesn't see keys the input method makes up. + TrackpadControls.forwardKey(event); + return true; + } + }; + } + } + + /** How much of the screen's bottom the keyboard covers, in pixels; 0 once it is gone. */ + private static native void nativeOnInset(int bottom); +} diff --git a/src/android/proguard-rules.pro b/src/android/proguard-rules.pro index 70cd193a..10860009 100644 --- a/src/android/proguard-rules.pro +++ b/src/android/proguard-rules.pro @@ -13,3 +13,7 @@ -keep class io.github.localdesktop.TrackpadControls { native ; } + +-keep class io.github.localdesktop.PhoneKeyboard { + native ; +} diff --git a/src/android/proot/setup.rs b/src/android/proot/setup.rs index cdb5e1a2..2c23bc63 100644 --- a/src/android/proot/setup.rs +++ b/src/android/proot/setup.rs @@ -1019,9 +1019,8 @@ xfconf-query -c xfce4-panel -p /panels/panel-2/autohide-behavior -s 0 2>/dev/nul ), ); - // Squeekboard types through labwc's virtual-keyboard protocol and pops up when a text field - // gets focus. Onboard can only type through X11 (XTest) or /dev/uinput, neither of which - // reaches Wayland apps here, and as a regular window it takes focus from what it types into. + // Squeekboard notices when a text field gets focus, through labwc's input-method protocol; the + // Android keyboard then types instead of it (see `localdesktop-keyboard-relay`). let _ = fs::write( fs_root .join("usr/share/glib-2.0/schemas") @@ -1031,13 +1030,7 @@ xfconf-query -c xfce4-panel -p /panels/panel-2/autohide-behavior -s 0 2>/dev/nul // For apps that don't report focused text fields (X11 apps, for one). write_executable( &fs_root.join("usr/local/bin/localdesktop-keyboard"), - r#"#!/bin/sh -osk() { gdbus call --session --dest sm.puri.OSK0 --object-path /sm/puri/OSK0 "$@"; } -case "$(osk --method org.freedesktop.DBus.Properties.Get sm.puri.OSK0 Visible 2>/dev/null)" in - *true*) osk --method sm.puri.OSK0.SetVisible false >/dev/null ;; - *) osk --method sm.puri.OSK0.SetVisible true >/dev/null ;; -esac -"#, + "#!/bin/sh\ntouch /tmp/localdesktop-keyboard\n", ); let applications_dir = fs_root.join("usr/local/share/applications"); let _ = fs::create_dir_all(&applications_dir); @@ -1046,7 +1039,7 @@ esac r#"[Desktop Entry] Type=Application Name=On-screen keyboard -Comment=Show or hide the on-screen keyboard +Comment=Show the Android keyboard Exec=/usr/local/bin/localdesktop-keyboard Icon=input-keyboard Terminal=false @@ -1228,12 +1221,11 @@ done "#, ) .expect("Failed to write labwc rc.xml defaults"); - // While the desktop is on an external display the phone is its keyboard: when a text field - // brings up Squeekboard, put it away and have the app open the Android keyboard instead. + // Squeekboard only tells when a text field gets focus: put it away and have the app open the + // Android keyboard instead, on the phone's screen or over the trackpad. write_executable( &fs_root.join("usr/local/bin/localdesktop-keyboard-relay"), r#"#!/bin/sh -state_file=/tmp/localdesktop-output request_file=/tmp/localdesktop-keyboard osk() { gdbus call --session --dest sm.puri.OSK0 --object-path /sm/puri/OSK0 "$@"; } while true; do @@ -1242,9 +1234,6 @@ while true; do *"'Visible': "*) ;; *) continue ;; esac - LOCALDESKTOP_TOUCH_KEYBOARD=1 - . "$state_file" 2>/dev/null - [ "$LOCALDESKTOP_TOUCH_KEYBOARD" = 0 ] || continue osk --method sm.puri.OSK0.SetVisible false >/dev/null touch "$request_file" done @@ -1443,6 +1432,7 @@ pub fn setup(android_app: AndroidApp) -> PolarBearBackend { touch_fingers: 0, cursor_position: (0.0, 0.0).into(), external_buttons: 0, + keyboard_inset: 0, android_app, }) } else { From 8fa87c6b79d3b6250685e313d31c13df60c10122 Mon Sep 17 00:00:00 2001 From: Teddy Date: Sun, 1 Nov 2026 14:24:39 +0100 Subject: [PATCH 08/13] feat: settings page in android's app info, with a switch for the android keyboard --- gh-pages/docs/user/1-getting-started.md | 2 +- .../docs/user/2-creating-a-non-root-user.md | 17 +- gh-pages/docs/user/3-custom-de.md | 47 ++-- gh-pages/docs/user/4-configurations.md | 59 ++--- gh-pages/docs/user/7-gpu-acceleration.md | 7 +- gh-pages/static/img/settings.webp | Bin 0 -> 68456 bytes manifest.yaml | 15 ++ patches/xbuild/apk/src/manifest.rs | 4 + src/android/app/run.rs | 5 +- src/android/backend/wayland/event_handler.rs | 4 +- src/android/backend/wayland/output_state.rs | 6 +- src/android/dex/README.md | 2 +- src/android/dex/classes.dex | Bin 31456 -> 37492 bytes .../github/localdesktop/SettingsActivity.java | 230 ++++++++++++++++++ src/android/proot/setup.rs | 28 ++- src/android/utils/application_context.rs | 8 +- src/android/utils/settings.rs | 182 ++++++++++++++ src/bin/build_apk.rs | 4 + src/core/config.rs | 18 +- src/lib.rs | 1 + 20 files changed, 543 insertions(+), 96 deletions(-) create mode 100644 gh-pages/static/img/settings.webp create mode 100644 src/android/java/io/github/localdesktop/SettingsActivity.java create mode 100644 src/android/utils/settings.rs diff --git a/gh-pages/docs/user/1-getting-started.md b/gh-pages/docs/user/1-getting-started.md index 3e6f61b0..0a349a91 100644 --- a/gh-pages/docs/user/1-getting-started.md +++ b/gh-pages/docs/user/1-getting-started.md @@ -51,7 +51,7 @@ The hardest part is installing `yay` or `paru`. You have to follow the `README.m ## I don't have a physical keyboard. -Your phone's own keyboard comes up when you tap a text field, and the desktop fits above it. Swipe back to put it away. For apps where it doesn't come up on its own, open _"Applications"_ > _"Accessories"_ > _"On-screen keyboard"_. A physical keyboard is still more comfortable for long sessions. +Your phone's own keyboard comes up when you tap a text field, and the desktop fits above it. Swipe back to put it away. To use Squeekboard, the desktop's own on-screen keyboard, instead, turn off **Use the Android keyboard** in [Local Desktop settings](/docs/user/configurations). For apps where it doesn't come up on its own, open _"Applications"_ > _"Accessories"_ > _"On-screen keyboard"_. A physical keyboard is still more comfortable for long sessions. ![The Android keyboard typing into the desktop](/img/android-keyboard.webp#boxed) diff --git a/gh-pages/docs/user/2-creating-a-non-root-user.md b/gh-pages/docs/user/2-creating-a-non-root-user.md index ab4df27b..aea6e943 100644 --- a/gh-pages/docs/user/2-creating-a-non-root-user.md +++ b/gh-pages/docs/user/2-creating-a-non-root-user.md @@ -70,19 +70,6 @@ sudo ls /root # Make sure it does not output something like: "teddy is not in th ## [Important] Tell Local Desktop -You must tell Local Desktop who to log in as, or it will log in as root. To (create and) edit the config file: +You must tell Local Desktop who to log in as, or it will log in as root. In Android, open **App info** for Local Desktop > **Additional settings in the app**, and set **User** to `teddy` _(the username you created [previously](#create-your-user))_. Then tap **Restart Local Desktop**. -``` -nano /etc/localdesktop/localdesktop.toml -``` - -Add the following content: - -```toml title="/etc/localdesktop/localdesktop.toml" -[user] -username = "teddy" -``` - -_(Replace `teddy` with the username you created [previously](#create-your-user))_ - -The changes will take effect the next time you launch Local Desktop. If something goes wrong, you can always delete this config file and restart as root. +If something goes wrong, set **User** back to `root` there. See [Settings](/docs/user/configurations). diff --git a/gh-pages/docs/user/3-custom-de.md b/gh-pages/docs/user/3-custom-de.md index 5da634be..b38ed9a1 100644 --- a/gh-pages/docs/user/3-custom-de.md +++ b/gh-pages/docs/user/3-custom-de.md @@ -6,21 +6,14 @@ title: Using other Desktop Environments This is an advanced topic. Proceed with your own risk. ::: -## The `[command]` configs +## The 3 commands -Local Desktop uses 3 commands to set up your desktop environment: - -```toml title="/etc/localdesktop/localdesktop.toml" -[command] -check="pacman -Q noto-fonts && pacman -Q xfce4-session && pacman -Q xfce4-panel && pacman -Q xfce4-settings && pacman -Q xfce4-terminal && pacman -Q thunar && pacman -Q xfdesktop && pacman -Q xfconf && pacman -Q labwc && pacman -Q wlr-randr && pacman -Q xorg-xwayland && pacman -Q xdg-desktop-portal && pacman -Q xdg-desktop-portal-gtk && pacman -Q squeekboard" -install="stdbuf -oL pacman -Syu --needed --noconfirm --noprogressbar noto-fonts xfce4 labwc wlr-randr xorg-xwayland xdg-desktop-portal xdg-desktop-portal-gtk squeekboard" -launch="XDG_RUNTIME_DIR=/tmp WAYLAND_DISPLAY=wayland-0 XDG_SESSION_TYPE=wayland XDG_CURRENT_DESKTOP=XFCE /usr/local/bin/startxfce4-localdesktop 2>&1" -``` +Local Desktop uses 3 commands to set up your desktop environment: **Check**, **Install** and **Launch**. Change them in [Local Desktop settings](/docs/user/configurations), under **Additional settings in the app** in Android's App info for Local Desktop, which shows the current ones. You can change these 3 commands to install and launch your custom desktop environment. Please share your successful setups with us and we can put them here to help others. :::success Tips -The `try_check`, `try_install`, `try_launch` configs are very handy to try different config values **without breaking anything**. Check out the [Configurations](/docs/user/configurations#special-try_-configs) documentation for more details about `try_*`. +The settings open from Android even when the desktop doesn't start, so a command that doesn't work is easy to undo: change it back, or tap **Restore defaults**. ::: ### check @@ -65,14 +58,28 @@ For a legacy **X11 session via Xwayland**, start Xwayland first and point the de ### KDE Plasma -```toml title="/etc/localdesktop/localdesktop.toml" -[command] -try_check = "pacman -Qg plasma" -try_install = "stdbuf -oL pacman -Syu plasma --noconfirm --noprogressbar" -# X11 session via Xwayland -try_launch = "XDG_RUNTIME_DIR=/tmp Xwayland -hidpi :1 2>&1 & while [ ! -e /tmp/.X11-unix/X1 ]; do sleep 0.1; done; XDG_SESSION_TYPE=x11 DISPLAY=:1 dbus-launch startplasma-x11 2>&1" -# Wayland session -try_launch = "XDG_RUNTIME_DIR=/tmp WAYLAND_DISPLAY=wayland-0 /usr/lib/plasma-dbus-run-session-if-needed startplasma-wayland 2>&1" +**Check:** + +```bash +pacman -Qg plasma +``` + +**Install:** + +```bash +stdbuf -oL pacman -Syu plasma --noconfirm --noprogressbar +``` + +**Launch**, a Wayland session: + +```bash +XDG_RUNTIME_DIR=/tmp WAYLAND_DISPLAY=wayland-0 /usr/lib/plasma-dbus-run-session-if-needed startplasma-wayland 2>&1 +``` + +Or an X11 session via Xwayland: + +```bash +XDG_RUNTIME_DIR=/tmp Xwayland -hidpi :1 2>&1 & while [ ! -e /tmp/.X11-unix/X1 ]; do sleep 0.1; done; XDG_SESSION_TYPE=x11 DISPLAY=:1 dbus-launch startplasma-x11 2>&1 ``` ![KDE Plasma on Local Desktop](/img/kde.webp) @@ -85,6 +92,4 @@ Feedback: ### Others -```toml title="/etc/localdesktop/localdesktop.toml" -Feel free to contribute your configs by using the "Edit this page" link below -``` +Feel free to contribute your commands by using the "Edit this page" link below. diff --git a/gh-pages/docs/user/4-configurations.md b/gh-pages/docs/user/4-configurations.md index 58f7265d..c8de1618 100644 --- a/gh-pages/docs/user/4-configurations.md +++ b/gh-pages/docs/user/4-configurations.md @@ -1,53 +1,32 @@ --- -title: Configurations +title: Settings --- -## Config file +## Open the settings -On launch, Local Desktop reads the config file located at: +Local Desktop's settings are in Android, so you can change them even when the desktop doesn't start: -``` -/etc/localdesktop/localdesktop.toml -``` +1. Open Android's **Settings** > **Apps** > **Local Desktop**. Or touch and hold the Local Desktop icon, then tap **App info**. +2. Tap **Additional settings in the app** (on some phones, a gear icon). -If the content of the config file is invalid (for example, invalid TOML format), it will be **replaced** with the default config. You can still view its original content in: +Changes apply the next time Local Desktop starts. **Restart Local Desktop** at the bottom applies them right away. -``` -/etc/localdesktop/localdesktop.bak -``` +![Local Desktop settings](/img/settings.webp#boxed) -Some important notes: -- Although TOML does support multi-line strings, Local Desktop requires each config to fit in a **single line**. You can use `\n` for multi-line config values if needed. -- We use **all lowercase** for config **keys**. For config **values**, the content is **case-sensitive**. +## What you can change -## Config schema +| Setting | What it does | Default | +|---|---|---| +| **Use the Android keyboard** | Your phone's keyboard comes up when a text field takes focus, and the desktop fits above it. Turn it off to use Squeekboard, the desktop's own on-screen keyboard. With an external display, the Android keyboard always types. | On | +| **User** | The Linux user the desktop runs as. Create the user first, see [Creating a non-root user](/docs/user/creating-a-non-root-user). | `root` | +| **Check** | A command that succeeds when the desktop environment is installed. | Checks for Xfce | +| **Install** | Installs the desktop environment when **Check** fails. | Installs Xfce | +| **Launch** | Starts the desktop environment. | Starts Xfce | -We might draw a table or have a mechanism to generate the config schema automatically here. But for now, please check the code for the schema: [localdesktop/src/core/config.rs#L28-L87](https://github.com/localdesktop/localdesktop.github.io/blob/main/src/core/config.rs#L28-L87). +See [Using other Desktop Environments](/docs/user/custom-de) for other **Check**, **Install** and **Launch** commands. -## Special `try_*` configs +If a setting leaves you with a black screen, change it back here, or tap **Restore defaults**. -Some configs are so important that a misconfiguration can leave you stuck on a black screen. So we support a special `try_*` variant of each config. These configs have **higher priority**, but only get applied **once**. +## From `localdesktop.toml` -For example, you just have to clone a config and prefix it with `try_`: - -```toml -[user] -username="root" -try_username="teddy" -``` - -The next time Local Desktop starts, it will log in as `teddy` instead of `root`. But then the `try_` configs will be commented out like this: - -```toml -[user] -username="root" -# try_username="teddy" -``` - -So if the config didn't work, and you got stuck on a black screen, you can just restart Local Desktop, and things will go back to normal. Then you can uncomment the config and try with another value. If the config does work, you just have to remove the `try_` prefix to persist the config. - -Some important notes: -- This rule applies to **all** configs. -- It is not required for the `try_` config to be inside the same group as the normal config. But it is strongly recommended to do so, and to put the `try_` variant right under its normal variant. -- If a normal config appears multiple times, the **first** entry is applied. If a `try_` config appears multiple times, the **last** entry is applied. This behavior is not guaranteed, and is subject to change. But in general, it is **invalid** to have duplicate config keys inside a TOML file. -- `try_x` and `x` are not duplicate keys. `try_x` always has higher priority than `x`. +Earlier versions read their settings from `/etc/localdesktop/localdesktop.toml` in Linux. The first time this version starts, it copies them to the settings above and leaves a note in the file. Local Desktop doesn't read the file anymore, and the `try_*` settings are gone: a setting that doesn't work can now be undone from Android. diff --git a/gh-pages/docs/user/7-gpu-acceleration.md b/gh-pages/docs/user/7-gpu-acceleration.md index f220301d..2b4eb7ec 100644 --- a/gh-pages/docs/user/7-gpu-acceleration.md +++ b/gh-pages/docs/user/7-gpu-acceleration.md @@ -22,11 +22,10 @@ On a supported device this prints a renderer like `zink Vulkan 1.4(Turnip Adreno ## Turn it off -If an app misbehaves with the GPU, prefix your [`launch` command](/docs/user/custom-de#launch) with `LOCALDESKTOP_GPU=0`: +If an app misbehaves with the GPU, put `LOCALDESKTOP_GPU=0 ` in front of the **Launch** command in [Local Desktop settings](/docs/user/configurations), for example: -```toml title="/etc/localdesktop/localdesktop.toml" -[command] -try_launch="LOCALDESKTOP_GPU=0 XDG_RUNTIME_DIR=/tmp WAYLAND_DISPLAY=wayland-0 XDG_SESSION_TYPE=wayland XDG_CURRENT_DESKTOP=XFCE /usr/local/bin/startxfce4-localdesktop 2>&1" +```bash +LOCALDESKTOP_GPU=0 XDG_RUNTIME_DIR=/tmp WAYLAND_DISPLAY=wayland-0 XDG_SESSION_TYPE=wayland XDG_CURRENT_DESKTOP=XFCE /usr/local/bin/startxfce4-localdesktop 2>&1 ``` To turn it off for a single app, start it with the distro's Mesa instead: diff --git a/gh-pages/static/img/settings.webp b/gh-pages/static/img/settings.webp new file mode 100644 index 0000000000000000000000000000000000000000..9abd442163e360737991a05fa29f32744b9be122 GIT binary patch literal 68456 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

f=;&wlGl< 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 SmlhJi-f??wPM81y0002Qz-JKv literal 0 HcmV?d00001 diff --git a/manifest.yaml b/manifest.yaml index 51101860..5c23c5df 100644 --- a/manifest.yaml +++ b/manifest.yaml @@ -18,6 +18,21 @@ android: label: "Local Desktop" extract_native_libs: true # Required for proot invocations use_cleartext_traffic: true # Required for connecting to ws://127.0.0.1, see assets/setup-progress.html + activities: + # The desktop: android.app.NativeActivity, filled in by the build. + - {} + # "Local Desktop settings" in App info. Its own process, so it still opens while the + # desktop is stuck, and can restart it. + - name: io.github.localdesktop.SettingsActivity + label: "Local Desktop settings" + process: ":settings" + theme: "@android:style/Theme.DeviceDefault.Settings" + exported: true + intent_filters: + - actions: + - android.intent.action.APPLICATION_PREFERENCES + categories: + - android.intent.category.DEFAULT services: - name: io.github.localdesktop.KeyboardAccessibilityService permission: android.permission.BIND_ACCESSIBILITY_SERVICE diff --git a/patches/xbuild/apk/src/manifest.rs b/patches/xbuild/apk/src/manifest.rs index a6212aa1..99fba185 100644 --- a/patches/xbuild/apk/src/manifest.rs +++ b/patches/xbuild/apk/src/manifest.rs @@ -120,6 +120,10 @@ pub struct Activity { pub intent_filters: Vec, #[serde(rename(serialize = "android:colorMode"))] pub color_mode: Option, + #[serde(rename(serialize = "android:process"))] + pub process: Option, + #[serde(rename(serialize = "android:theme"))] + pub theme: Option, } /// Android [service element](https://developer.android.com/guide/topics/manifest/service-element). diff --git a/src/android/app/run.rs b/src/android/app/run.rs index b9f5f2de..6b6c1813 100644 --- a/src/android/app/run.rs +++ b/src/android/app/run.rs @@ -16,6 +16,7 @@ use crate::android::{ external_display, proot::launch::launch, utils::{ + application_context::get_application_context, ndk::{self, run_in_jvm}, webview::show_webview_popup, }, @@ -85,7 +86,9 @@ fn configure_output(backend: &mut WaylandBackend) { ); let guest_scale = guest_scale_factor.round().max(1.0) as i32; - write_guest_output_state(window_size.w, window_size.h, guest_scale); + let touch_keyboard = winit.external_surface().is_none() + && !get_application_context().local_config.android_keyboard; + write_guest_output_state(window_size.w, window_size.h, guest_scale, touch_keyboard); for surface in backend.compositor.state.xdg_shell_state.toplevel_surfaces() { configure_toplevel(surface, window_size.w, window_size.h); diff --git a/src/android/backend/wayland/event_handler.rs b/src/android/backend/wayland/event_handler.rs index 3e3e8f9d..4df1b99a 100644 --- a/src/android/backend/wayland/event_handler.rs +++ b/src/android/backend/wayland/event_handler.rs @@ -6,6 +6,7 @@ use crate::android::{ WaylandBackend, WaylandWatcher, }, external_display::PointerEvent, + utils::application_context::get_application_context, }; use smithay::backend::input::{AxisSource, ButtonState}; use smithay::backend::renderer::element::solid::SolidColorRenderElement; @@ -447,7 +448,8 @@ fn resize_desktop(backend: &mut WaylandBackend, window: Size) { } let guest_scale = backend.guest_scale_factor.round().max(1.0) as i32; - write_guest_output_state(size.w, size.h, guest_scale); + let touch_keyboard = !get_application_context().local_config.android_keyboard; + write_guest_output_state(size.w, size.h, guest_scale, touch_keyboard); if let Some(surface) = get_surface(&backend.compositor.state) { surface.xdg_toplevel().configure(size.w, size.h, vec![]); diff --git a/src/android/backend/wayland/output_state.rs b/src/android/backend/wayland/output_state.rs index 1b7393b5..b62755d3 100644 --- a/src/android/backend/wayland/output_state.rs +++ b/src/android/backend/wayland/output_state.rs @@ -5,15 +5,19 @@ use std::path::PathBuf; /// /// The file lives in the proot-visible `/tmp` directory so scripts running inside the /// Xfce/labwc session can align wlroots output mode/scale with the Android winit window. -pub fn write_guest_output_state(width: i32, height: i32, scale: i32) { +/// `touch_keyboard` is on when Squeekboard types rather than the Android keyboard: the setting is +/// off, and the desktop is on the phone's screen (see `localdesktop-keyboard-relay`). +pub fn write_guest_output_state(width: i32, height: i32, scale: i32, touch_keyboard: bool) { if width <= 0 || height <= 0 || scale <= 0 { return; } let path = PathBuf::from(config::arch_fs_root()).join("tmp/localdesktop-output"); + let touch_keyboard = u8::from(touch_keyboard); let content = format!( "LOCALDESKTOP_OUTPUT_MODE={width}x{height} LOCALDESKTOP_OUTPUT_SCALE={scale} +LOCALDESKTOP_TOUCH_KEYBOARD={touch_keyboard} " ); if let Err(error) = std::fs::write(&path, content) { diff --git a/src/android/dex/README.md b/src/android/dex/README.md index d13a33d9..3fcdf8e3 100644 --- a/src/android/dex/README.md +++ b/src/android/dex/README.md @@ -1,6 +1,6 @@ This directory stores JVM bytecode artifacts that the on-device `cargo run` APK builder can embed without requiring a Java or Kotlin toolchain in Termux. -`classes.dex` currently contains the Java classes in [`../java/io/github/localdesktop/`](../java/io/github/localdesktop/): the keyboard accessibility service, the prompt that asks before turning it on, and the external display presentation with its trackpad controls. +`classes.dex` currently contains the Java classes in [`../java/io/github/localdesktop/`](../java/io/github/localdesktop/): the keyboard accessibility service, the prompt that asks before turning it on, and the external display presentation with its trackpad controls, the Android keyboard on the phone's screen, and the settings page in App info. To regenerate it on a machine with `javac`, `d8`, and Android platform `android.jar` available: diff --git a/src/android/dex/classes.dex b/src/android/dex/classes.dex index 41ae67421b089087af90a47bad898b60ab0dd3bc..4846f4a631eee8f0b5fe085986b397997055b1fa 100644 GIT binary patch literal 37492 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 Pzg6mkoMe>zKh^&a!d?vE diff --git a/src/android/java/io/github/localdesktop/SettingsActivity.java b/src/android/java/io/github/localdesktop/SettingsActivity.java new file mode 100644 index 00000000..92cbe0cd --- /dev/null +++ b/src/android/java/io/github/localdesktop/SettingsActivity.java @@ -0,0 +1,230 @@ +package io.github.localdesktop; + +import android.app.Activity; +import android.app.ActivityManager; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.graphics.Typeface; +import android.os.Build; +import android.os.Bundle; +import android.os.Process; +import android.text.InputType; +import android.util.TypedValue; +import android.view.View; +import android.view.WindowInsets; +import android.widget.Button; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.ScrollView; +import android.widget.Switch; +import android.widget.TextView; +import android.widget.Toast; + +/** + * Local Desktop's settings, opened from the app's page in Android's settings. It runs in its own + * process, so a desktop that is stuck or keeps crashing can still be fixed from here. + * + * The desktop reads these when it starts (see `core::config` and `ApplicationContext`), and + * writes what it starts with to the "defaults" preferences for "Restore defaults". + */ +public final class SettingsActivity extends Activity { + static final String PREFERENCES = "settings"; + static final String DEFAULTS = "defaults"; + private static final String[] TEXTS = {"username", "check", "install", "launch"}; + + private Switch androidKeyboard; + private final EditText[] texts = new EditText[TEXTS.length]; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (getActionBar() != null) { + // Android 15 lays the page out under it; the title goes in the page instead. + getActionBar().hide(); + } + LinearLayout list = new LinearLayout(this); + list.setOrientation(LinearLayout.VERTICAL); + list.setPadding(dp(16), dp(8), dp(16), dp(24)); + TextView title = new TextView(this); + title.setText("Local Desktop settings"); + title.setTextSize(TypedValue.COMPLEX_UNIT_SP, 28); + title.setPadding(0, dp(24), 0, 0); + list.addView(title); + + heading(list, "Desktop"); + androidKeyboard = new Switch(this); + androidKeyboard.setText("Use the Android keyboard"); + androidKeyboard.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16); + androidKeyboard.setPadding(0, dp(12), 0, 0); + list.addView(androidKeyboard); + note(list, "Your phone's keyboard comes up when a text field takes focus. Off: Squeekboard, the desktop's own on-screen keyboard."); + texts[0] = field(list, "User", false); + note(list, "Log in as this user. It has to exist in Linux first."); + + heading(list, "Commands"); + note(list, "How Local Desktop checks for, installs and starts the desktop environment."); + texts[1] = field(list, "Check", true); + texts[2] = field(list, "Install", true); + texts[3] = field(list, "Launch", true); + + Button restore = new Button(this); + restore.setText("Restore defaults"); + restore.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + getSharedPreferences(PREFERENCES, MODE_PRIVATE).edit() + .remove("android_keyboard").remove(TEXTS[0]).remove(TEXTS[1]) + .remove(TEXTS[2]).remove(TEXTS[3]).commit(); + load(); + } + }); + Button restart = new Button(this); + restart.setText("Restart Local Desktop"); + restart.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + save(); + restartDesktop(); + } + }); + LinearLayout buttons = new LinearLayout(this); + buttons.setPadding(0, dp(16), 0, 0); + buttons.addView(restore); + buttons.addView(restart); + list.addView(buttons); + note(list, "Changes apply the next time Local Desktop starts."); + + // Opens at the top, without a field taking focus and bringing up the keyboard. + list.setFocusableInTouchMode(true); + list.requestFocus(); + final ScrollView scroll = new ScrollView(this); + scroll.addView(list); + if (Build.VERSION.SDK_INT >= 30) { + // Clear of the status and navigation bars, which Android 15 draws over the page. + scroll.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() { + @Override + public WindowInsets onApplyWindowInsets(View view, WindowInsets insets) { + android.graphics.Insets bars = insets.getInsets( + WindowInsets.Type.systemBars() | WindowInsets.Type.ime()); + view.setPadding(bars.left, bars.top, bars.right, bars.bottom); + return insets; + } + }); + } + setContentView(scroll); + load(); + } + + @Override + protected void onPause() { + super.onPause(); + save(); + } + + /** What is set, and the defaults for the rest. */ + private void load() { + SharedPreferences preferences = getSharedPreferences(PREFERENCES, MODE_PRIVATE); + SharedPreferences defaults = getSharedPreferences(DEFAULTS, MODE_PRIVATE); + androidKeyboard.setChecked(preferences.getBoolean("android_keyboard", + defaults.getBoolean("android_keyboard", true))); + for (int i = 0; i < TEXTS.length; i++) { + texts[i].setText(preferences.getString(TEXTS[i], defaults.getString(TEXTS[i], ""))); + } + } + + /** + * Keeps only what differs from the defaults, so a default that changes in an update still + * reaches settings nobody touched. + */ + private void save() { + SharedPreferences defaults = getSharedPreferences(DEFAULTS, MODE_PRIVATE); + SharedPreferences.Editor editor = getSharedPreferences(PREFERENCES, MODE_PRIVATE).edit(); + if (androidKeyboard.isChecked() == defaults.getBoolean("android_keyboard", true)) { + editor.remove("android_keyboard"); + } else { + editor.putBoolean("android_keyboard", androidKeyboard.isChecked()); + } + for (int i = 0; i < TEXTS.length; i++) { + String value = texts[i].getText().toString().trim(); + if (value.isEmpty() || value.equals(defaults.getString(TEXTS[i], null))) { + editor.remove(TEXTS[i]); + } else { + editor.putString(TEXTS[i], value); + } + } + // Written before the desktop restarts and reads them. + editor.commit(); + } + + /** Ends the desktop's process, which takes its Linux processes with it, and starts it again. */ + private void restartDesktop() { + ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); + if (manager.getRunningAppProcesses() != null) { + for (ActivityManager.RunningAppProcessInfo info : manager.getRunningAppProcesses()) { + if (info.processName.equals(getPackageName())) { + Process.killProcess(info.pid); + } + } + } + Intent launch = getPackageManager().getLaunchIntentForPackage(getPackageName()); + if (launch == null) { + Toast.makeText(this, "Open Local Desktop to apply the changes.", Toast.LENGTH_LONG).show(); + return; + } + launch.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); + startActivity(launch); + finish(); + } + + private void heading(LinearLayout list, String text) { + TextView view = new TextView(this); + view.setText(text); + view.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14); + view.setTypeface(Typeface.DEFAULT_BOLD); + view.setTextColor(accentColor()); + view.setPadding(0, dp(24), 0, 0); + list.addView(view); + } + + private void note(LinearLayout list, String text) { + TextView view = new TextView(this); + view.setText(text); + view.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14); + view.setAlpha(0.7f); + view.setPadding(0, dp(4), 0, 0); + list.addView(view); + } + + private EditText field(LinearLayout list, String label, boolean command) { + TextView title = new TextView(this); + title.setText(label); + title.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16); + title.setPadding(0, dp(16), 0, 0); + list.addView(title); + EditText edit = new EditText(this); + // Empty until Local Desktop has started once and written its defaults; empty means those. + edit.setHint("Default"); + edit.setTextSize(TypedValue.COMPLEX_UNIT_SP, command ? 13 : 16); + if (command) { + edit.setTypeface(Typeface.MONOSPACE); + edit.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE + | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); + } else { + edit.setSingleLine(true); + edit.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); + } + list.addView(edit); + return edit; + } + + private int accentColor() { + TypedValue value = new TypedValue(); + getTheme().resolveAttribute(android.R.attr.colorAccent, value, true); + return value.data; + } + + private int dp(int value) { + return Math.round(value * getResources().getDisplayMetrics().density); + } +} diff --git a/src/android/proot/setup.rs b/src/android/proot/setup.rs index 2c23bc63..83aa939b 100644 --- a/src/android/proot/setup.rs +++ b/src/android/proot/setup.rs @@ -1019,8 +1019,8 @@ xfconf-query -c xfce4-panel -p /panels/panel-2/autohide-behavior -s 0 2>/dev/nul ), ); - // Squeekboard notices when a text field gets focus, through labwc's input-method protocol; the - // Android keyboard then types instead of it (see `localdesktop-keyboard-relay`). + // Squeekboard notices when a text field gets focus, through labwc's input-method protocol, and + // types itself or has the Android keyboard type instead (see `localdesktop-keyboard-relay`). let _ = fs::write( fs_root .join("usr/share/glib-2.0/schemas") @@ -1030,7 +1030,19 @@ xfconf-query -c xfce4-panel -p /panels/panel-2/autohide-behavior -s 0 2>/dev/nul // For apps that don't report focused text fields (X11 apps, for one). write_executable( &fs_root.join("usr/local/bin/localdesktop-keyboard"), - "#!/bin/sh\ntouch /tmp/localdesktop-keyboard\n", + r#"#!/bin/sh +LOCALDESKTOP_TOUCH_KEYBOARD=1 +. /tmp/localdesktop-output 2>/dev/null +if [ "$LOCALDESKTOP_TOUCH_KEYBOARD" = 0 ]; then + touch /tmp/localdesktop-keyboard + exit +fi +osk() { gdbus call --session --dest sm.puri.OSK0 --object-path /sm/puri/OSK0 "$@"; } +case "$(osk --method org.freedesktop.DBus.Properties.Get sm.puri.OSK0 Visible 2>/dev/null)" in + *true*) osk --method sm.puri.OSK0.SetVisible false >/dev/null ;; + *) osk --method sm.puri.OSK0.SetVisible true >/dev/null ;; +esac +"#, ); let applications_dir = fs_root.join("usr/local/share/applications"); let _ = fs::create_dir_all(&applications_dir); @@ -1039,7 +1051,7 @@ xfconf-query -c xfce4-panel -p /panels/panel-2/autohide-behavior -s 0 2>/dev/nul r#"[Desktop Entry] Type=Application Name=On-screen keyboard -Comment=Show the Android keyboard +Comment=Show the on-screen keyboard Exec=/usr/local/bin/localdesktop-keyboard Icon=input-keyboard Terminal=false @@ -1221,11 +1233,12 @@ done "#, ) .expect("Failed to write labwc rc.xml defaults"); - // Squeekboard only tells when a text field gets focus: put it away and have the app open the - // Android keyboard instead, on the phone's screen or over the trackpad. + // Unless it is to type (see `write_guest_output_state`), Squeekboard only tells when a text + // field gets focus: put it away and have the app open the Android keyboard instead. write_executable( &fs_root.join("usr/local/bin/localdesktop-keyboard-relay"), r#"#!/bin/sh +state_file=/tmp/localdesktop-output request_file=/tmp/localdesktop-keyboard osk() { gdbus call --session --dest sm.puri.OSK0 --object-path /sm/puri/OSK0 "$@"; } while true; do @@ -1234,6 +1247,9 @@ while true; do *"'Visible': "*) ;; *) continue ;; esac + LOCALDESKTOP_TOUCH_KEYBOARD=1 + . "$state_file" 2>/dev/null + [ "$LOCALDESKTOP_TOUCH_KEYBOARD" = 0 ] || continue osk --method sm.puri.OSK0.SetVisible false >/dev/null touch "$request_file" done diff --git a/src/android/utils/application_context.rs b/src/android/utils/application_context.rs index 05cbd9f5..e7760ef8 100644 --- a/src/android/utils/application_context.rs +++ b/src/android/utils/application_context.rs @@ -1,6 +1,6 @@ use crate::{ - android::utils::ndk::run_in_jvm, - core::config::{arch_fs_root, init_arch_fs_root, parse_config, LocalConfig, CONFIG_FILE}, + android::utils::{ndk::run_in_jvm, settings}, + core::config::{arch_fs_root, init_arch_fs_root, LocalConfig, CONFIG_FILE}, }; use jni::{ objects::{JObject, JString}, @@ -42,8 +42,8 @@ impl ApplicationContext { "XLOCALEDIR", format!("{}/usr/share/X11/locale", arch_fs_root()), ); - let full_config_path = format!("{}{}", arch_fs_root(), CONFIG_FILE); - let local_config = parse_config(full_config_path); + let legacy_config = PathBuf::from(format!("{}{}", arch_fs_root(), CONFIG_FILE)); + let local_config = settings::load(&mut env, &activity, &legacy_config); let permission_all_files_access = Self::is_all_files_access_granted(android_app); { diff --git a/src/android/utils/settings.rs b/src/android/utils/settings.rs new file mode 100644 index 00000000..9e4c96c2 --- /dev/null +++ b/src/android/utils/settings.rs @@ -0,0 +1,182 @@ +//! The settings from "Local Desktop settings" in Android's App info (`SettingsActivity`), kept in +//! the app's SharedPreferences: only what differs from the defaults is stored there. + +use crate::core::config::{parse_config, LocalConfig}; +use jni::{ + objects::{JObject, JString, JValue}, + JNIEnv, +}; +use std::{fs, path::Path}; + +const PREFERENCES: &str = "settings"; +const DEFAULTS: &str = "defaults"; +/// Set once the settings of `localdesktop.toml` have been carried over. +const MIGRATED: &str = "migrated_toml"; + +/// Write the defaults for the settings page, carry `localdesktop.toml` over once, and return the +/// settings to start with. +pub fn load(env: &mut JNIEnv, activity: &JObject, legacy_config: &Path) -> LocalConfig { + let defaults = LocalConfig::default(); + let result = (|| -> jni::errors::Result { + let stored = preferences(env, activity, DEFAULTS)?; + let editor = env + .call_method( + &stored, + "edit", + "()Landroid/content/SharedPreferences$Editor;", + &[], + )? + .l()?; + for (key, value) in texts(&defaults) { + put_string(env, &editor, key, value)?; + } + put_boolean(env, &editor, "android_keyboard", defaults.android_keyboard)?; + env.call_method(&editor, "apply", "()V", &[])?; + + let settings = preferences(env, activity, PREFERENCES)?; + if !get_boolean(env, &settings, MIGRATED, false)? { + let editor = env + .call_method( + &settings, + "edit", + "()Landroid/content/SharedPreferences$Editor;", + &[], + )? + .l()?; + if legacy_config.exists() { + let legacy = parse_config(legacy_config.to_string_lossy().into_owned()); + for ((key, value), (_, default)) in texts(&legacy).into_iter().zip(texts(&defaults)) + { + if value != default { + put_string(env, &editor, key, value)?; + } + } + retire(legacy_config); + } + put_boolean(env, &editor, MIGRATED, true)?; + env.call_method(&editor, "commit", "()Z", &[])?; + } + + let mut config = defaults.clone(); + config.user.username = + get_string(env, &settings, "username")?.unwrap_or(config.user.username); + config.command.check = get_string(env, &settings, "check")?.unwrap_or(config.command.check); + config.command.install = + get_string(env, &settings, "install")?.unwrap_or(config.command.install); + config.command.launch = + get_string(env, &settings, "launch")?.unwrap_or(config.command.launch); + config.android_keyboard = + get_boolean(env, &settings, "android_keyboard", config.android_keyboard)?; + Ok(config) + })(); + result.unwrap_or_else(|error| { + log::error!("Failed to read the settings, using the defaults: {error}"); + let _ = env.exception_clear(); + defaults + }) +} + +fn texts(config: &LocalConfig) -> [(&'static str, &str); 4] { + [ + ("username", &config.user.username), + ("check", &config.command.check), + ("install", &config.command.install), + ("launch", &config.command.launch), + ] +} + +/// Leave a note where the settings used to be, for anyone who opens the file to change them. +fn retire(legacy_config: &Path) { + let old = fs::read_to_string(legacy_config).unwrap_or_default(); + let note = format!( + "# Local Desktop no longer reads this file. Its settings moved to Android:\n# App info for Local Desktop > Additional settings in the app, where the values below were copied.\n#\n{}", + old.lines().map(|line| format!("# {line}\n")).collect::() + ); + if let Err(error) = fs::write(legacy_config, note) { + log::warn!("Failed to update {}: {error}", legacy_config.display()); + } +} + +fn preferences<'local>( + env: &mut JNIEnv<'local>, + activity: &JObject, + name: &str, +) -> jni::errors::Result> { + let name = env.new_string(name)?; + env.call_method( + activity, + "getSharedPreferences", + "(Ljava/lang/String;I)Landroid/content/SharedPreferences;", + &[(&name).into(), JValue::Int(0)], + )? + .l() +} + +fn get_string( + env: &mut JNIEnv, + preferences: &JObject, + key: &str, +) -> jni::errors::Result> { + let key = env.new_string(key)?; + let value = env + .call_method( + preferences, + "getString", + "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;", + &[(&key).into(), (&JObject::null()).into()], + )? + .l()?; + if value.is_null() { + return Ok(None); + } + Ok(Some(env.get_string(&JString::from(value))?.into())) +} + +fn get_boolean( + env: &mut JNIEnv, + preferences: &JObject, + key: &str, + default: bool, +) -> jni::errors::Result { + let key = env.new_string(key)?; + env.call_method( + preferences, + "getBoolean", + "(Ljava/lang/String;Z)Z", + &[(&key).into(), JValue::Bool(default.into())], + )? + .z() +} + +fn put_string( + env: &mut JNIEnv, + editor: &JObject, + key: &str, + value: &str, +) -> jni::errors::Result<()> { + let key = env.new_string(key)?; + let value = env.new_string(value)?; + env.call_method( + editor, + "putString", + "(Ljava/lang/String;Ljava/lang/String;)Landroid/content/SharedPreferences$Editor;", + &[(&key).into(), (&value).into()], + )?; + Ok(()) +} + +fn put_boolean( + env: &mut JNIEnv, + editor: &JObject, + key: &str, + value: bool, +) -> jni::errors::Result<()> { + let key = env.new_string(key)?; + env.call_method( + editor, + "putBoolean", + "(Ljava/lang/String;Z)Landroid/content/SharedPreferences$Editor;", + &[(&key).into(), JValue::Bool(value.into())], + )?; + Ok(()) +} diff --git a/src/bin/build_apk.rs b/src/bin/build_apk.rs index 3b7e0f96..a538c0fa 100644 --- a/src/bin/build_apk.rs +++ b/src/bin/build_apk.rs @@ -1194,6 +1194,10 @@ pub mod apk { pub intent_filters: Vec, #[serde(rename(serialize = "android:colorMode"))] pub color_mode: Option, + #[serde(rename(serialize = "android:process"))] + pub process: Option, + #[serde(rename(serialize = "android:theme"))] + pub theme: Option, } /// Android [service element](https://developer.android.com/guide/topics/manifest/service-element). diff --git a/src/core/config.rs b/src/core/config.rs index 5a752a86..95d672b5 100644 --- a/src/core/config.rs +++ b/src/core/config.rs @@ -73,13 +73,15 @@ pub const PIPEWIRE_GUEST_RUNTIME_DIR: &str = "/tmp"; /// PipeWire-Pulse socket as seen from inside the proot guest. pub const PULSE_GUEST_SERVER: &str = "unix:/tmp/pulse/native"; +/// Where settings lived before the settings page in Android's App info. Only read once, to carry +/// them over (see `ApplicationContext`). /// Make sure the config keys are all lowercase, and config values are single-line. Use \n for multi-line config values if needed /// If a key exists multiple time, the first entry is applied /// If a `try_` config exsists multiple time, the last entry is applied /// But in general, it is **invalid** to have duplicated config keys inside a TOML file pub const CONFIG_FILE: &str = "/etc/localdesktop/localdesktop.toml"; -#[derive(Debug, Serialize, Deserialize, Default, Clone)] +#[derive(Debug, Serialize, Deserialize, Clone)] pub struct LocalConfig { #[serde(default)] pub user: UserConfig, @@ -90,6 +92,20 @@ pub struct LocalConfig { /// => So make sure that every config group has a `#[serde(default)]` attribute to avoid invalid sections breaking unrelated parts of the config. #[serde(default)] pub command: CommandConfig, + + /// The Android keyboard types into the desktop, instead of Squeekboard. + #[serde(skip)] + pub android_keyboard: bool, +} + +impl Default for LocalConfig { + fn default() -> Self { + Self { + user: UserConfig::default(), + command: CommandConfig::default(), + android_keyboard: true, + } + } } #[derive(Debug, Serialize, Deserialize, Clone)] diff --git a/src/lib.rs b/src/lib.rs index 21a3470b..9aab551e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -26,6 +26,7 @@ pub mod android { pub mod application_context; pub mod fullscreen_immersive; pub mod ndk; + pub mod settings; pub mod webview; } } From c71792beb5d6d859e03c2857c370da336607be01 Mon Sep 17 00:00:00 2001 From: Teddy Date: Sun, 1 Nov 2026 14:42:08 +0100 Subject: [PATCH 09/13] refactor: drop localdesktop.toml, settings only come from the settings page --- gh-pages/docs/user/4-configurations.md | 4 - src/android/utils/application_context.rs | 5 +- src/android/utils/settings.rs | 82 +++------ src/core/config.rs | 206 +---------------------- 4 files changed, 27 insertions(+), 270 deletions(-) diff --git a/gh-pages/docs/user/4-configurations.md b/gh-pages/docs/user/4-configurations.md index c8de1618..28060c8b 100644 --- a/gh-pages/docs/user/4-configurations.md +++ b/gh-pages/docs/user/4-configurations.md @@ -26,7 +26,3 @@ Changes apply the next time Local Desktop starts. **Restart Local Desktop** at t See [Using other Desktop Environments](/docs/user/custom-de) for other **Check**, **Install** and **Launch** commands. If a setting leaves you with a black screen, change it back here, or tap **Restore defaults**. - -## From `localdesktop.toml` - -Earlier versions read their settings from `/etc/localdesktop/localdesktop.toml` in Linux. The first time this version starts, it copies them to the settings above and leaves a note in the file. Local Desktop doesn't read the file anymore, and the `try_*` settings are gone: a setting that doesn't work can now be undone from Android. diff --git a/src/android/utils/application_context.rs b/src/android/utils/application_context.rs index e7760ef8..a6b8a88f 100644 --- a/src/android/utils/application_context.rs +++ b/src/android/utils/application_context.rs @@ -1,6 +1,6 @@ use crate::{ android::utils::{ndk::run_in_jvm, settings}, - core::config::{arch_fs_root, init_arch_fs_root, LocalConfig, CONFIG_FILE}, + core::config::{arch_fs_root, init_arch_fs_root, LocalConfig}, }; use jni::{ objects::{JObject, JString}, @@ -42,8 +42,7 @@ impl ApplicationContext { "XLOCALEDIR", format!("{}/usr/share/X11/locale", arch_fs_root()), ); - let legacy_config = PathBuf::from(format!("{}{}", arch_fs_root(), CONFIG_FILE)); - let local_config = settings::load(&mut env, &activity, &legacy_config); + let local_config = settings::load(&mut env, &activity); let permission_all_files_access = Self::is_all_files_access_granted(android_app); { diff --git a/src/android/utils/settings.rs b/src/android/utils/settings.rs index 9e4c96c2..eb05c187 100644 --- a/src/android/utils/settings.rs +++ b/src/android/utils/settings.rs @@ -1,21 +1,17 @@ -//! The settings from "Local Desktop settings" in Android's App info (`SettingsActivity`), kept in +//! The settings from "Additional settings in the app" in Android's App info (`SettingsActivity`), kept in //! the app's SharedPreferences: only what differs from the defaults is stored there. -use crate::core::config::{parse_config, LocalConfig}; +use crate::core::config::LocalConfig; use jni::{ objects::{JObject, JString, JValue}, JNIEnv, }; -use std::{fs, path::Path}; const PREFERENCES: &str = "settings"; const DEFAULTS: &str = "defaults"; -/// Set once the settings of `localdesktop.toml` have been carried over. -const MIGRATED: &str = "migrated_toml"; -/// Write the defaults for the settings page, carry `localdesktop.toml` over once, and return the -/// settings to start with. -pub fn load(env: &mut JNIEnv, activity: &JObject, legacy_config: &Path) -> LocalConfig { +/// Write the defaults for the settings page, and return the settings to start with. +pub fn load(env: &mut JNIEnv, activity: &JObject) -> LocalConfig { let defaults = LocalConfig::default(); let result = (|| -> jni::errors::Result { let stored = preferences(env, activity, DEFAULTS)?; @@ -27,44 +23,27 @@ pub fn load(env: &mut JNIEnv, activity: &JObject, legacy_config: &Path) -> Local &[], )? .l()?; - for (key, value) in texts(&defaults) { - put_string(env, &editor, key, value)?; - } + put_string(env, &editor, "username", &defaults.user.username)?; + put_string(env, &editor, "check", &defaults.command.check)?; + put_string(env, &editor, "install", &defaults.command.install)?; + put_string(env, &editor, "launch", &defaults.command.launch)?; put_boolean(env, &editor, "android_keyboard", defaults.android_keyboard)?; env.call_method(&editor, "apply", "()V", &[])?; let settings = preferences(env, activity, PREFERENCES)?; - if !get_boolean(env, &settings, MIGRATED, false)? { - let editor = env - .call_method( - &settings, - "edit", - "()Landroid/content/SharedPreferences$Editor;", - &[], - )? - .l()?; - if legacy_config.exists() { - let legacy = parse_config(legacy_config.to_string_lossy().into_owned()); - for ((key, value), (_, default)) in texts(&legacy).into_iter().zip(texts(&defaults)) - { - if value != default { - put_string(env, &editor, key, value)?; - } - } - retire(legacy_config); - } - put_boolean(env, &editor, MIGRATED, true)?; - env.call_method(&editor, "commit", "()Z", &[])?; - } - let mut config = defaults.clone(); - config.user.username = - get_string(env, &settings, "username")?.unwrap_or(config.user.username); - config.command.check = get_string(env, &settings, "check")?.unwrap_or(config.command.check); - config.command.install = - get_string(env, &settings, "install")?.unwrap_or(config.command.install); - config.command.launch = - get_string(env, &settings, "launch")?.unwrap_or(config.command.launch); + if let Some(username) = get_string(env, &settings, "username")? { + config.user.username = username; + } + if let Some(check) = get_string(env, &settings, "check")? { + config.command.check = check; + } + if let Some(install) = get_string(env, &settings, "install")? { + config.command.install = install; + } + if let Some(launch) = get_string(env, &settings, "launch")? { + config.command.launch = launch; + } config.android_keyboard = get_boolean(env, &settings, "android_keyboard", config.android_keyboard)?; Ok(config) @@ -76,27 +55,6 @@ pub fn load(env: &mut JNIEnv, activity: &JObject, legacy_config: &Path) -> Local }) } -fn texts(config: &LocalConfig) -> [(&'static str, &str); 4] { - [ - ("username", &config.user.username), - ("check", &config.command.check), - ("install", &config.command.install), - ("launch", &config.command.launch), - ] -} - -/// Leave a note where the settings used to be, for anyone who opens the file to change them. -fn retire(legacy_config: &Path) { - let old = fs::read_to_string(legacy_config).unwrap_or_default(); - let note = format!( - "# Local Desktop no longer reads this file. Its settings moved to Android:\n# App info for Local Desktop > Additional settings in the app, where the values below were copied.\n#\n{}", - old.lines().map(|line| format!("# {line}\n")).collect::() - ); - if let Err(error) = fs::write(legacy_config, note) { - log::warn!("Failed to update {}: {error}", legacy_config.display()); - } -} - fn preferences<'local>( env: &mut JNIEnv<'local>, activity: &JObject, diff --git a/src/core/config.rs b/src/core/config.rs index 95d672b5..be1514d9 100644 --- a/src/core/config.rs +++ b/src/core/config.rs @@ -1,10 +1,4 @@ -use serde::{Deserialize, Serialize}; -use std::{ - fs::{self, OpenOptions}, - io::Write, - path::Path, - sync::OnceLock, -}; +use std::{fs, path::Path, sync::OnceLock}; pub const VERSION: &str = env!("CARGO_PKG_VERSION"); @@ -73,28 +67,12 @@ pub const PIPEWIRE_GUEST_RUNTIME_DIR: &str = "/tmp"; /// PipeWire-Pulse socket as seen from inside the proot guest. pub const PULSE_GUEST_SERVER: &str = "unix:/tmp/pulse/native"; -/// Where settings lived before the settings page in Android's App info. Only read once, to carry -/// them over (see `ApplicationContext`). -/// Make sure the config keys are all lowercase, and config values are single-line. Use \n for multi-line config values if needed -/// If a key exists multiple time, the first entry is applied -/// If a `try_` config exsists multiple time, the last entry is applied -/// But in general, it is **invalid** to have duplicated config keys inside a TOML file -pub const CONFIG_FILE: &str = "/etc/localdesktop/localdesktop.toml"; - -#[derive(Debug, Serialize, Deserialize, Clone)] +/// Settings from "Additional settings in the app" in Android's App info (see `utils::settings`). +#[derive(Debug, Clone)] pub struct LocalConfig { - #[serde(default)] pub user: UserConfig, - - /// What happens if we don't assign this `#[serde(default)]` attribute? - /// The answer: If the user omits the `[command]` group, the WHOLE config fails to parse - /// => The default `[user]` group is applied (with `username=root`) even if the `[user]` settings are completely valid. - /// => So make sure that every config group has a `#[serde(default)]` attribute to avoid invalid sections breaking unrelated parts of the config. - #[serde(default)] pub command: CommandConfig, - /// The Android keyboard types into the desktop, instead of Squeekboard. - #[serde(skip)] pub android_keyboard: bool, } @@ -108,7 +86,7 @@ impl Default for LocalConfig { } } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, Clone)] pub struct UserConfig { pub username: String, } @@ -121,13 +99,10 @@ impl Default for UserConfig { } } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, Clone)] pub struct CommandConfig { - #[serde(default = "default_check")] pub check: String, - #[serde(default = "default_install")] pub install: String, - #[serde(default = "default_launch")] pub launch: String, } @@ -155,174 +130,3 @@ impl Default for CommandConfig { } } } - -/// This function does 2 major tasks: -/// - Read config from `CONFIG_FILE`, and override configs with their `try_*` versions, and return the configs line by line -/// - Write back to the config file, with `try_*` configs commented out -/// -/// **Important**: As each call to this function will comment out the `try_*` config, it is **non-idempotent**. -fn process_config_file(full_config_path: String) -> Vec { - let mut write_back_lines: Vec = vec![]; - let mut effective_config: Vec = vec![]; - - if let Ok(content) = fs::read_to_string(&full_config_path) { - for line in content.lines() { - let trimmed = line.trim(); - - if let Some((key, value)) = trimmed.split_once('=') { - let key = key.trim(); - let value = value.trim(); - - if key.starts_with("try_") { - // Comment out the `try_*` configs - write_back_lines.push(format!("# {}", trimmed)); - - // Prefer the `try_*` configs - let actual_key = key.trim_start_matches("try_"); - if let Some(line_index) = effective_config - .iter() - .position(|line| line.starts_with(&format!("{}=", actual_key))) - { - // Config exists, overriding - effective_config[line_index] = format!("{}={}", actual_key, value); - } else { - // Config does not exist, appending - effective_config.push(format!("{}={}", actual_key, value)); - // Make sure there are no spaces around = so that the check existing key logic works - } - } else { - // Keep the config as is - write_back_lines.push(trimmed.to_string()); - - if effective_config - .iter() - .any(|line| line.starts_with(&format!("{}=", key))) - { - // If already overridden by try_ version, skip inserting - } else { - // Config does not exist, appending - effective_config.push(format!("{}={}", key, value)); // Make sure there are no spaces around = so that the check existing key logic works - } - } - } else { - // Keep the line as is - write_back_lines.push(trimmed.to_string()); - effective_config.push(trimmed.to_string()); - } - } - - // Rewrite config with try_* lines commented out - let _ = OpenOptions::new() - .write(true) - .truncate(true) - .open(&full_config_path) - .and_then(|mut file| { - for line in &write_back_lines { - writeln!(file, "{}", line)?; - } - Ok(()) - }); - } - - // Convert effective config back to lines - effective_config -} - -pub fn parse_config(full_config_path: String) -> LocalConfig { - let lines = process_config_file(full_config_path); - let content = lines.join("\n"); - if let Ok(config) = toml::from_str::(&content) { - return config; - } - // Config malformed, use the default config and the user can modify it again - let default_config = LocalConfig::default(); - default_config -} - -#[cfg(test)] -mod tests { - use super::*; - use std::fs; - use tempfile::tempdir; - - fn with_config_file(content: &str, f: impl Fn(String)) -> () { - let dir = tempdir().unwrap(); - let base_dir = dir.path().to_str().unwrap(); - let path = format!("{}/etc/localdesktop", base_dir); - fs::create_dir_all(&path).unwrap(); - let file_path = format!("{}/localdesktop.toml", path); - fs::write(&file_path, content).unwrap(); - f(file_path) - } - - #[test] - fn should_handle_configs_without_try() { - with_config_file( - r#" - [user] - username = "alice" - - [command] - check = "check-cmd" - install = "install-cmd" - launch = "launch-cmd" - "#, - |full_config_path| { - let config = parse_config(full_config_path); - assert_eq!(config.user.username, "alice"); - assert_eq!(config.command.check, "check-cmd"); - assert_eq!(config.command.install, "install-cmd"); - assert_eq!(config.command.launch, "launch-cmd"); - }, - ); - } - - #[test] - fn should_handle_configs_with_try() { - with_config_file( - r#" - [user] - username = "root" - try_username = "testuser" - - [command] - check = "check-cmd" - try_check = "try-check" - install = "install-cmd" - launch = "launch-cmd" - "#, - |full_config_path| { - let config = parse_config(full_config_path); - assert_eq!(config.user.username, "testuser"); - assert_eq!(config.command.check, "try-check"); - assert_eq!(config.command.install, "install-cmd") - }, - ); - } - - #[test] - fn should_comment_out_try_configs() { - with_config_file( - r#" - username = "root" - try_username = "commented" - - check = "normal" - try_check = "try" - "#, - |full_config_path| { - let _ = parse_config(full_config_path.clone()); // This triggers rewriting the config file - let content = fs::read_to_string(full_config_path).unwrap(); - - assert!( - content.contains("# try_username = \"commented\""), - "❌ `try_username` is not commented out after being applied" - ); - assert!( - content.contains("# try_check = \"try\""), - "❌ `try_check` is not commented out after being applied" - ); - }, - ); - } -} From e770828de0021bfdc325e7b9af693e4e94a8c981 Mon Sep 17 00:00:00 2001 From: Teddy Date: Sun, 1 Nov 2026 14:42:52 +0100 Subject: [PATCH 10/13] docs: settings page screenshot from a foldable --- gh-pages/docs/user/4-configurations.md | 2 +- gh-pages/static/img/settings-foldable.webp | Bin 0 -> 52138 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 gh-pages/static/img/settings-foldable.webp diff --git a/gh-pages/docs/user/4-configurations.md b/gh-pages/docs/user/4-configurations.md index 28060c8b..0f242520 100644 --- a/gh-pages/docs/user/4-configurations.md +++ b/gh-pages/docs/user/4-configurations.md @@ -11,7 +11,7 @@ Local Desktop's settings are in Android, so you can change them even when the de Changes apply the next time Local Desktop starts. **Restart Local Desktop** at the bottom applies them right away. -![Local Desktop settings](/img/settings.webp#boxed) +Local Desktop settings on a phone Local Desktop settings on a foldable ## What you can change diff --git a/gh-pages/static/img/settings-foldable.webp b/gh-pages/static/img/settings-foldable.webp new file mode 100644 index 0000000000000000000000000000000000000000..df87458440ec4aa1215149a1e3b876f95a2e38e9 GIT binary patch literal 52138 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 K}*j{M$eJEX4o_}@#$i(IKQ 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 O5;{N*q!G9Wpa1|aPv1TO literal 0 HcmV?d00001 From 5ee60c7c7408703f480de42031a75f059049b66e Mon Sep 17 00:00:00 2001 From: Teddy Date: Sun, 1 Nov 2026 14:44:43 +0100 Subject: [PATCH 11/13] docs: one settings page screenshot --- gh-pages/docs/user/4-configurations.md | 2 +- gh-pages/static/img/settings-foldable.webp | Bin 52138 -> 0 bytes 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 gh-pages/static/img/settings-foldable.webp diff --git a/gh-pages/docs/user/4-configurations.md b/gh-pages/docs/user/4-configurations.md index 0f242520..28060c8b 100644 --- a/gh-pages/docs/user/4-configurations.md +++ b/gh-pages/docs/user/4-configurations.md @@ -11,7 +11,7 @@ Local Desktop's settings are in Android, so you can change them even when the de Changes apply the next time Local Desktop starts. **Restart Local Desktop** at the bottom applies them right away. -Local Desktop settings on a phone Local Desktop settings on a foldable +![Local Desktop settings](/img/settings.webp#boxed) ## What you can change diff --git a/gh-pages/static/img/settings-foldable.webp b/gh-pages/static/img/settings-foldable.webp deleted file mode 100644 index df87458440ec4aa1215149a1e3b876f95a2e38e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52138 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 K}*j{M$eJEX4o_}@#$i(IKQ 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 O5;{N*q!G9Wpa1|aPv1TO From 14c3c5610daa77c14a6326520a3a0a48aac75ae9 Mon Sep 17 00:00:00 2001 From: Teddy Date: Sun, 1 Nov 2026 14:49:17 +0100 Subject: [PATCH 12/13] docs: how to open the settings, step by step --- gh-pages/docs/user/4-configurations.md | 6 +++--- gh-pages/static/img/settings-step-1.webp | Bin 0 -> 20984 bytes gh-pages/static/img/settings-step-2.webp | Bin 0 -> 23224 bytes 3 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 gh-pages/static/img/settings-step-1.webp create mode 100644 gh-pages/static/img/settings-step-2.webp diff --git a/gh-pages/docs/user/4-configurations.md b/gh-pages/docs/user/4-configurations.md index 28060c8b..7aad7afc 100644 --- a/gh-pages/docs/user/4-configurations.md +++ b/gh-pages/docs/user/4-configurations.md @@ -6,12 +6,12 @@ title: Settings Local Desktop's settings are in Android, so you can change them even when the desktop doesn't start: -1. Open Android's **Settings** > **Apps** > **Local Desktop**. Or touch and hold the Local Desktop icon, then tap **App info**. +1. Touch and hold the Local Desktop icon, then tap **App info**. Or open Android's **Settings** > **Apps** > **Local Desktop**. 2. Tap **Additional settings in the app** (on some phones, a gear icon). -Changes apply the next time Local Desktop starts. **Restart Local Desktop** at the bottom applies them right away. +Touch and hold the Local Desktop icon, then tap App info Tap Additional settings in the app Local Desktop settings -![Local Desktop settings](/img/settings.webp#boxed) +Changes apply the next time Local Desktop starts. **Restart Local Desktop** at the bottom applies them right away. ## What you can change diff --git a/gh-pages/static/img/settings-step-1.webp b/gh-pages/static/img/settings-step-1.webp new file mode 100644 index 0000000000000000000000000000000000000000..e86b712085d31f2ca9f7693c49c09ec622468dcc GIT binary patch literal 20984 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 literal 0 HcmV?d00001 diff --git a/gh-pages/static/img/settings-step-2.webp b/gh-pages/static/img/settings-step-2.webp new file mode 100644 index 0000000000000000000000000000000000000000..576f261b7ce3af7d5469fd300d2ee22028f241f4 GIT binary patch literal 23224 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 Date: Sun, 1 Nov 2026 15:43:25 +0000 Subject: [PATCH 13/13] chore: set version to v3.3.0 --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6f984387..4eaa36d5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2348,7 +2348,7 @@ dependencies = [ [[package]] name = "localdesktop" -version = "3.2.2" +version = "3.3.0" dependencies = [ "android-sdkmanager-rs", "android_logger", diff --git a/Cargo.toml b/Cargo.toml index 510be904..a927572f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "localdesktop" -version = "3.2.2" +version = "3.3.0" edition = "2021" build = "build.rs" default-run = "build_apk"