diff --git a/src/servers/app/Desktop.cpp b/src/servers/app/Desktop.cpp index 278690caee..7bb2302c38 100644 --- a/src/servers/app/Desktop.cpp +++ b/src/servers/app/Desktop.cpp @@ -123,33 +123,15 @@ Desktop::Init() private: RootLayer* fRootLayer; }; - class KeyFilter : public BMessageFilter { - public: - KeyFilter(RootLayer* layer) - : BMessageFilter(B_ANY_DELIVERY, B_ANY_SOURCE), - fRootLayer(layer) - { - } - - virtual filter_result - Filter(BMessage* message, BHandler** /*_target*/) - { - fRootLayer->Lock(); - fRootLayer->KeyboardEventHandler(message); - fRootLayer->Unlock(); - return B_SKIP_MESSAGE; - } - - private: - RootLayer* fRootLayer; - }; fEventDispatcher.SetMouseFilter(new MouseFilter(fRootLayer)); - fEventDispatcher.SetKeyFilter(new KeyFilter(fRootLayer)); // take care of setting the default cursor ServerCursor *cursor = fCursorManager.GetCursor(B_CURSOR_DEFAULT); if (cursor) fVirtualScreen.HWInterface()->SetCursor(cursor); + + fVirtualScreen.HWInterface()->MoveCursorTo(fVirtualScreen.Frame().Width() / 2, + fVirtualScreen.Frame().Height() / 2); fVirtualScreen.HWInterface()->SetCursorVisible(true); } diff --git a/src/servers/app/EventDispatcher.cpp b/src/servers/app/EventDispatcher.cpp index 601faa2307..83f31ff980 100644 --- a/src/servers/app/EventDispatcher.cpp +++ b/src/servers/app/EventDispatcher.cpp @@ -146,11 +146,12 @@ EventDispatcher::_Run() void -EventDispatcher::SetFocus(BMessenger* messenger) +EventDispatcher::SetFocus(const BMessenger* messenger) { BAutolock _(this); - if (fFocus == *messenger) + if ((messenger == NULL && !fHasFocus) + || (messenger != NULL && fFocus == *messenger)) return; fHasLastFocus = fHasFocus; @@ -166,7 +167,7 @@ EventDispatcher::SetFocus(BMessenger* messenger) if (fHasFocus) { fFocus = *messenger; - + // add all B_POINTER_EVENTS tokens that target this messenger for (int32 i = fListeners.CountItems(); i-- > 0;) { event_target* target = fListeners.ItemAt(i); diff --git a/src/servers/app/EventDispatcher.h b/src/servers/app/EventDispatcher.h index b51e6221fc..7b6677008d 100644 --- a/src/servers/app/EventDispatcher.h +++ b/src/servers/app/EventDispatcher.h @@ -27,7 +27,7 @@ class EventDispatcher : public BLocker { status_t SetTo(EventStream* stream); status_t InitCheck(); - void SetFocus(BMessenger* messenger); + void SetFocus(const BMessenger* messenger); bool AddListener(BMessenger& messenger, int32 token, uint32 events, uint32 options); diff --git a/src/servers/app/RootLayer.cpp b/src/servers/app/RootLayer.cpp index 1915c3483f..ae1ab30e14 100644 --- a/src/servers/app/RootLayer.cpp +++ b/src/servers/app/RootLayer.cpp @@ -676,8 +676,11 @@ RootLayer::RevealNewWMState(Workspace::State &oldWMState) if (oldWMState.Active != fWMState.Active) { if (oldWMState.Active) oldWMState.Active->Activated(false); - if (fWMState.Active) + if (fWMState.Active) { fWMState.Active->Activated(true); + fDesktop->EventDispatcher().SetFocus(&fWMState.Active->Window()->Messenger()); + } else + fDesktop->EventDispatcher().SetFocus(NULL); } // calculate the region that must be invalidated/redrawn diff --git a/src/servers/app/ServerWindow.cpp b/src/servers/app/ServerWindow.cpp index 9caf70fb41..97210df8bc 100644 --- a/src/servers/app/ServerWindow.cpp +++ b/src/servers/app/ServerWindow.cpp @@ -149,6 +149,9 @@ ServerWindow::ServerWindow(const char *title, ServerApp *app, SetTitle(title); fServerToken = BPrivate::gDefaultTokens.NewToken(B_SERVER_TOKEN, this); + + BMessenger::Private(fClientMessenger).SetTo(fClientTeam, + looperPort, clientToken, false); } diff --git a/src/servers/app/ServerWindow.h b/src/servers/app/ServerWindow.h index 679097db6a..55d07fdd7e 100644 --- a/src/servers/app/ServerWindow.h +++ b/src/servers/app/ServerWindow.h @@ -13,19 +13,20 @@ #define SERVER_WINDOW_H -#include +#include "MessageLooper.h" +#include "SubWindowList.h" + #include +#include + +#include #include #include -#include +#include #include #include #include -#include "MessageLooper.h" -#include "SubWindowList.h" -#include "TokenSpace.h" - class BString; class BMessenger; class BPoint; @@ -70,7 +71,8 @@ public: void NotifyScreenModeChanged(const BRect frame, const color_space cspace); - // util methods. + // util methods. + const BMessenger& Messenger() const { return fClientMessenger; } status_t SendMessageToClient(const BMessage* msg, int32 target = B_NULL_TOKEN, bool usePreferred = false) const; @@ -138,6 +140,7 @@ private: port_id fMessagePort; port_id fClientReplyPort; port_id fClientLooperPort; + BMessenger fClientMessenger; BMessage fClientViewsWithInvalidCoords;