From 158893b903a189d911cafc4ada75808672f0b6b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Sun, 29 Oct 2006 19:12:29 +0000 Subject: [PATCH] The input_server now removes all B_INPUT_METHOD_EVENTS when the target view is not input method aware. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19147 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/servers/input/InputServer.cpp | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/servers/input/InputServer.cpp b/src/servers/input/InputServer.cpp index 0eed30424e..1309ce5998 100644 --- a/src/servers/input/InputServer.cpp +++ b/src/servers/input/InputServer.cpp @@ -1518,7 +1518,7 @@ InputServer::_MethodizeEvents(EventList& events) for (int32 i = 0; i < count;) { _FilterEvent(fActiveMethod, events, i, count); } - + { // move the method events into the event queue - they are not // "methodized" either @@ -1526,11 +1526,13 @@ InputServer::_MethodizeEvents(EventList& events) events.AddList(&fMethodQueue); fMethodQueue.MakeEmpty(); } - - int32 newCount = events.CountItems(); if (!fInputMethodAware) { // special handling for non-input-method-aware views + + int32 newCount = events.CountItems(); + // we may add new events in this loop that don't need to be checked again + for (int32 i = 0; i < newCount; i++) { BMessage* event = events.ItemAt(i); @@ -1539,6 +1541,8 @@ InputServer::_MethodizeEvents(EventList& events) SERIAL_PRINT(("IME received\n")); + bool removeEvent = true; + int32 opcode; if (event->FindInt32("be:opcode", &opcode) == B_OK) { bool inlineOnly; @@ -1553,6 +1557,7 @@ InputServer::_MethodizeEvents(EventList& events) && event->FindMessage("be:translated", &translated) == B_OK) { // translate event for the non-aware view *event = translated; + removeEvent = false; } } else { if (fInputMethodWindow == NULL @@ -1563,12 +1568,6 @@ InputServer::_MethodizeEvents(EventList& events) EventList newEvents; fInputMethodWindow->HandleInputMethodEvent(event, newEvents); - // replace event with new events (but don't scan them again - // for input method messages) - events.RemoveItemAt(i--); - delete event; - newCount--; - if (!newEvents.IsEmpty()) { events.AddList(&newEvents); opcode = B_INPUT_METHOD_STOPPED; @@ -1581,6 +1580,13 @@ InputServer::_MethodizeEvents(EventList& events) } } } + + if (removeEvent) { + // the inline/bottom window has eaten the event + events.RemoveItemAt(i--); + delete event; + newCount--; + } } }