From a49c022308b09627c9bcdd2dfe866471d3defe8b Mon Sep 17 00:00:00 2001 From: duffyduck Date: Tue, 21 Jul 2026 01:19:37 +0200 Subject: [PATCH] fix(vnc): Tastatur-Button folgt echter Tastatur-Sichtbarkeit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Androids Zurueck-Taste versteckt die Tastatur ohne den TextInput zu blurren → ⌨-Button blieb an, erst der uebernaechste Tap oeffnete wieder. Jetzt setzt keyboardDidShow/Hide den Button-Zustand; Oeffnen erzwingt blur→focus, damit ein noch fokussiertes Feld die Tastatur neu aufklappt. Co-Authored-By: Claude Opus 4.8 --- android/src/workspace/tiles/VncTile.tsx | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/android/src/workspace/tiles/VncTile.tsx b/android/src/workspace/tiles/VncTile.tsx index b1b4c67..ab538b0 100644 --- a/android/src/workspace/tiles/VncTile.tsx +++ b/android/src/workspace/tiles/VncTile.tsx @@ -11,7 +11,7 @@ */ import React, { useCallback, useEffect, useRef, useState } from 'react'; -import { NativeSyntheticEvent, ScrollView, StyleSheet, Text, TextInput, TextInputChangeEventData, TextInputKeyPressEventData, TouchableOpacity, View } from 'react-native'; +import { Keyboard, NativeSyntheticEvent, ScrollView, StyleSheet, Text, TextInput, TextInputChangeEventData, TextInputKeyPressEventData, TouchableOpacity, View } from 'react-native'; import { WebView, WebViewMessageEvent } from 'react-native-webview'; import desktop from '../../services/desktop'; import { NOVNC_HTML } from '../assets/novncHtml'; @@ -58,6 +58,16 @@ const VncTile: React.FC = ({ projectId, focused, port = 5901 }) => { return () => teardown(); }, [focused, teardown]); + // Button-Zustand an die ECHTE Tastatur-Sichtbarkeit koppeln: Androids + // Zurueck-Taste blendet die Tastatur aus, ohne den TextInput zu blurren — + // ueber keyboardDidHide setzen wir das ⌨-Symbol trotzdem zurueck. + useEffect(() => { + if (!focused) return; + const show = Keyboard.addListener('keyboardDidShow', () => setKbdOn(true)); + const hide = Keyboard.addListener('keyboardDidHide', () => setKbdOn(false)); + return () => { show.remove(); hide.remove(); }; + }, [focused]); + const ctl = useCallback((fn: string) => { webRef.current?.injectJavaScript(`window.ariaVncCtl && window.ariaVncCtl.${fn}(); true;`); }, []); @@ -99,11 +109,13 @@ const VncTile: React.FC = ({ projectId, focused, port = 5901 }) => { else webRef.current?.injectJavaScript(`window.ariaVncKey && window.ariaVncKey.char(${cp}); true;`); }, [activeMods, sendCombo, clearMods]); - // Tastatur ein-/ausblenden: echtes RN- fokussieren → Android oeffnet - // die Software-Tastatur zuverlaessig (anders als ein verstecktes WebView-Feld). + // Tastatur ein-/ausblenden. Oeffnen: blur→focus erzwingt das Aufklappen auch + // dann, wenn der TextInput noch fokussiert ist (Tastatur per Zurueck-Taste + // versteckt). Schliessen: Keyboard.dismiss(); den Button-Zustand setzt der + // keyboardDidShow/Hide-Listener — nicht hier —, damit er nie „haengen" bleibt. const toggleKbd = useCallback(() => { - if (kbdOn) { kbdRef.current?.blur(); setKbdOn(false); } - else { setKbdOn(true); setTimeout(() => kbdRef.current?.focus(), 0); } + if (kbdOn) { Keyboard.dismiss(); } + else { kbdRef.current?.blur(); setTimeout(() => kbdRef.current?.focus(), 30); } }, [kbdOn]); // Druckbare Zeichen: Prefix-Diff des (wachsenden) Feldes → nur neu Getipptes an @@ -182,7 +194,6 @@ const VncTile: React.FC = ({ projectId, focused, port = 5901 }) => { onChange={onKbdChange} onKeyPress={onKbdKeyPress} onSubmitEditing={() => pressKey(KEYSYM.Enter)} - onBlur={() => setKbdOn(false)} keyboardType="visible-password" returnKeyType="send" autoCapitalize="none"