зеркало из https://github.com/mozilla/gecko-dev.git
Bug 864040 - Send key events from the UI thread the right way; r=cpeterson
This commit is contained in:
Родитель
caabfdcd8b
Коммит
83438a2314
|
@ -531,19 +531,9 @@ final class GeckoEditable
|
|||
@Override
|
||||
public void sendEvent(final GeckoEvent event) {
|
||||
if (DEBUG) {
|
||||
assertOnIcThread();
|
||||
Log.d(LOGTAG, "sendEvent(" + event + ")");
|
||||
}
|
||||
if (!onIcThread()) {
|
||||
// Events may get dispatched to the main thread;
|
||||
// reroute to our IC thread instead
|
||||
mIcRunHandler.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
sendEvent(event);
|
||||
}
|
||||
});
|
||||
return;
|
||||
}
|
||||
/*
|
||||
We are actually sending two events to Gecko here,
|
||||
1. Event from the event parameter (key event, etc.)
|
||||
|
@ -844,8 +834,12 @@ final class GeckoEditable
|
|||
if (DEBUG) {
|
||||
// GeckoEditableListener methods should all be called from the Gecko thread
|
||||
ThreadUtils.assertOnGeckoThread();
|
||||
Log.d(LOGTAG, "onTextChange(\"" + text + "\", " + start + ", " +
|
||||
unboundedOldEnd + ", " + unboundedNewEnd + ")");
|
||||
StringBuilder sb = new StringBuilder("onTextChange(");
|
||||
debugAppend(sb, text);
|
||||
sb.append(", ").append(start).append(", ")
|
||||
.append(unboundedOldEnd).append(", ")
|
||||
.append(unboundedNewEnd).append(")");
|
||||
Log.d(LOGTAG, sb.toString());
|
||||
}
|
||||
if (start < 0 || start > unboundedOldEnd) {
|
||||
throw new IllegalArgumentException("invalid text notification range: " +
|
||||
|
|
|
@ -125,6 +125,22 @@ class GeckoInputConnection
|
|||
}
|
||||
}
|
||||
|
||||
public void sendEventFromUiThread(final Handler uiHandler,
|
||||
final GeckoEditableClient client,
|
||||
final GeckoEvent event) {
|
||||
final Handler icHandler = client.getInputConnectionHandler();
|
||||
if (icHandler.getLooper() == uiHandler.getLooper()) {
|
||||
// IC thread is UI thread; safe to send event directly
|
||||
client.sendEvent(event);
|
||||
return;
|
||||
}
|
||||
runOnIcThread(icHandler, new Runnable() {
|
||||
@Override public void run() {
|
||||
client.sendEvent(event);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public Editable getEditableForUiThread(final Handler uiHandler,
|
||||
final GeckoEditableClient client) {
|
||||
if (DEBUG) {
|
||||
|
@ -782,7 +798,8 @@ class GeckoInputConnection
|
|||
|
||||
View view = getView();
|
||||
if (view == null) {
|
||||
mEditableClient.sendEvent(GeckoEvent.createKeyEvent(event, 0));
|
||||
InputThreadUtils.sInstance.sendEventFromUiThread(ThreadUtils.getUiHandler(),
|
||||
mEditableClient, GeckoEvent.createKeyEvent(event, 0));
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -799,7 +816,7 @@ class GeckoInputConnection
|
|||
if (skip ||
|
||||
(down && !keyListener.onKeyDown(view, uiEditable, keyCode, event)) ||
|
||||
(!down && !keyListener.onKeyUp(view, uiEditable, keyCode, event))) {
|
||||
mEditableClient.sendEvent(
|
||||
InputThreadUtils.sInstance.sendEventFromUiThread(uiHandler, mEditableClient,
|
||||
GeckoEvent.createKeyEvent(event, TextKeyListener.getMetaState(uiEditable)));
|
||||
if (skip && down) {
|
||||
// Usually, the down key listener call above adjusts meta states for us.
|
||||
|
|
Загрузка…
Ссылка в новой задаче