summaryrefslogtreecommitdiff
path: root/java/org/gnu/emacs/EmacsWindow.java
diff options
context:
space:
mode:
authorPo Lu <luangruo@yahoo.com>2023-06-12 14:19:01 +0800
committerPo Lu <luangruo@yahoo.com>2023-06-12 14:19:01 +0800
commit3b08bb1318cd0bf6bc1811b520f9c6934b1aa3bd (patch)
treeb7effb4669608cb3329923a7c7a8a1387dbea412 /java/org/gnu/emacs/EmacsWindow.java
parente3196835ed08a1d1a675b933a53d1a397defd561 (diff)
Fix deadlocks
* java/org/gnu/emacs/EmacsView.java (EmacsView) (showOnScreenKeyboard, hideOnScreenKeyboard): Don't synchronize. * java/org/gnu/emacs/EmacsWindow.java (EmacsWindow) (toggleOnScreenKeyboard): Revert to calling IMM functions from the main thread. * src/android.c (struct android_event_container) (android_pselect_nfds, android_pselect_readfds) (android_pselect_writefds, android_pselect_exceptfds) (android_pselect_timeout): Don't make volatile. (android_wait_event): Run queries if necessary.
Diffstat (limited to 'java/org/gnu/emacs/EmacsWindow.java')
-rw-r--r--java/org/gnu/emacs/EmacsWindow.java25
1 files changed, 17 insertions, 8 deletions
diff --git a/java/org/gnu/emacs/EmacsWindow.java b/java/org/gnu/emacs/EmacsWindow.java
index f5e40e9a2d9..68a18ec2aa7 100644
--- a/java/org/gnu/emacs/EmacsWindow.java
+++ b/java/org/gnu/emacs/EmacsWindow.java
@@ -1201,16 +1201,25 @@ public final class EmacsWindow extends EmacsHandleObject
}
public void
- toggleOnScreenKeyboard (boolean on)
+ toggleOnScreenKeyboard (final boolean on)
{
- /* InputMethodManager functions are thread safe. Call
- `showOnScreenKeyboard' etc from the Emacs thread in order to
- keep the calls in sync with updates to the input context. */
+ /* Even though InputMethodManager functions are thread safe,
+ `showOnScreenKeyboard' etc must be called from the UI thread in
+ order to avoid deadlocks if the calls happen in tandem with a
+ call to a synchronizing function within
+ `onCreateInputConnection'. */
- if (on)
- view.showOnScreenKeyboard ();
- else
- view.hideOnScreenKeyboard ();
+ EmacsService.SERVICE.runOnUiThread (new Runnable () {
+ @Override
+ public void
+ run ()
+ {
+ if (on)
+ view.showOnScreenKeyboard ();
+ else
+ view.hideOnScreenKeyboard ();
+ }
+ });
}
public String