|
|
|
|
@ -6204,9 +6204,7 @@ void InputDispatcher::doDispatchCycleFinishedCommand(nsecs_t finishTime,
|
|
|
|
|
|
|
|
|
|
bool restartEvent;
|
|
|
|
|
if (dispatchEntry->eventEntry->type == EventEntry::Type::KEY) {
|
|
|
|
|
KeyEntry& keyEntry = static_cast<KeyEntry&>(*(dispatchEntry->eventEntry));
|
|
|
|
|
restartEvent =
|
|
|
|
|
afterKeyEventLockedInterruptable(connection, dispatchEntry, keyEntry, handled);
|
|
|
|
|
restartEvent = afterKeyEventLockedInterruptable(connection, dispatchEntry, handled);
|
|
|
|
|
} else if (dispatchEntry->eventEntry->type == EventEntry::Type::MOTION) {
|
|
|
|
|
MotionEntry& motionEntry = static_cast<MotionEntry&>(*(dispatchEntry->eventEntry));
|
|
|
|
|
restartEvent = afterMotionEventLockedInterruptable(connection, dispatchEntry, motionEntry,
|
|
|
|
|
@ -6424,8 +6422,17 @@ void InputDispatcher::processConnectionResponsiveLocked(const Connection& connec
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool InputDispatcher::afterKeyEventLockedInterruptable(
|
|
|
|
|
const std::shared_ptr<Connection>& connection, DispatchEntry* dispatchEntry,
|
|
|
|
|
KeyEntry& keyEntry, bool handled) {
|
|
|
|
|
const std::shared_ptr<Connection>& connection, DispatchEntry* dispatchEntry, bool handled) {
|
|
|
|
|
// The dispatchEntry is currently valid, but it might point to a deleted object after we release
|
|
|
|
|
// the lock. For simplicity, make copies of the data of interest here and assume that
|
|
|
|
|
// 'dispatchEntry' is not valid after this section.
|
|
|
|
|
// Hold a strong reference to the EventEntry to ensure it's valid for the duration of this
|
|
|
|
|
// function, even if the DispatchEntry gets destroyed and releases its share of the ownership.
|
|
|
|
|
std::shared_ptr<EventEntry> eventEntry = dispatchEntry->eventEntry;
|
|
|
|
|
const bool hasForegroundTarget = dispatchEntry->hasForegroundTarget();
|
|
|
|
|
KeyEntry& keyEntry = static_cast<KeyEntry&>(*(eventEntry));
|
|
|
|
|
// To prevent misuse, ensure dispatchEntry is no longer valid.
|
|
|
|
|
dispatchEntry = nullptr;
|
|
|
|
|
if (keyEntry.flags & AKEY_EVENT_FLAG_FALLBACK) {
|
|
|
|
|
if (!handled) {
|
|
|
|
|
// Report the key as unhandled, since the fallback was not handled.
|
|
|
|
|
@ -6442,7 +6449,7 @@ bool InputDispatcher::afterKeyEventLockedInterruptable(
|
|
|
|
|
connection->inputState.removeFallbackKey(originalKeyCode);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (handled || !dispatchEntry->hasForegroundTarget()) {
|
|
|
|
|
if (handled || !hasForegroundTarget) {
|
|
|
|
|
// If the application handles the original key for which we previously
|
|
|
|
|
// generated a fallback or if the window is not a foreground window,
|
|
|
|
|
// then cancel the associated fallback key, if any.
|
|
|
|
|
|