* the keyboard events are now using the new EventDispatcher, B_KEYBOARD_EVENTS don't
work yet, though, as the dispatcher is not yet notified about those. * no more mouse cursor jumping - the cursor will now start in the middle of the screen; this should be part of the initial input_server handshake, though. * ServerWindow can now return a BMessenger of its client window. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15017 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
8d8f5950d0
commit
f68598780e
@ -123,33 +123,15 @@ Desktop::Init()
|
|||||||
private:
|
private:
|
||||||
RootLayer* fRootLayer;
|
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.SetMouseFilter(new MouseFilter(fRootLayer));
|
||||||
fEventDispatcher.SetKeyFilter(new KeyFilter(fRootLayer));
|
|
||||||
|
|
||||||
// take care of setting the default cursor
|
// take care of setting the default cursor
|
||||||
ServerCursor *cursor = fCursorManager.GetCursor(B_CURSOR_DEFAULT);
|
ServerCursor *cursor = fCursorManager.GetCursor(B_CURSOR_DEFAULT);
|
||||||
if (cursor)
|
if (cursor)
|
||||||
fVirtualScreen.HWInterface()->SetCursor(cursor);
|
fVirtualScreen.HWInterface()->SetCursor(cursor);
|
||||||
|
|
||||||
|
fVirtualScreen.HWInterface()->MoveCursorTo(fVirtualScreen.Frame().Width() / 2,
|
||||||
|
fVirtualScreen.Frame().Height() / 2);
|
||||||
fVirtualScreen.HWInterface()->SetCursorVisible(true);
|
fVirtualScreen.HWInterface()->SetCursorVisible(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -146,11 +146,12 @@ EventDispatcher::_Run()
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
EventDispatcher::SetFocus(BMessenger* messenger)
|
EventDispatcher::SetFocus(const BMessenger* messenger)
|
||||||
{
|
{
|
||||||
BAutolock _(this);
|
BAutolock _(this);
|
||||||
|
|
||||||
if (fFocus == *messenger)
|
if ((messenger == NULL && !fHasFocus)
|
||||||
|
|| (messenger != NULL && fFocus == *messenger))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
fHasLastFocus = fHasFocus;
|
fHasLastFocus = fHasFocus;
|
||||||
@ -166,7 +167,7 @@ EventDispatcher::SetFocus(BMessenger* messenger)
|
|||||||
|
|
||||||
if (fHasFocus) {
|
if (fHasFocus) {
|
||||||
fFocus = *messenger;
|
fFocus = *messenger;
|
||||||
|
|
||||||
// add all B_POINTER_EVENTS tokens that target this messenger
|
// add all B_POINTER_EVENTS tokens that target this messenger
|
||||||
for (int32 i = fListeners.CountItems(); i-- > 0;) {
|
for (int32 i = fListeners.CountItems(); i-- > 0;) {
|
||||||
event_target* target = fListeners.ItemAt(i);
|
event_target* target = fListeners.ItemAt(i);
|
||||||
|
@ -27,7 +27,7 @@ class EventDispatcher : public BLocker {
|
|||||||
status_t SetTo(EventStream* stream);
|
status_t SetTo(EventStream* stream);
|
||||||
status_t InitCheck();
|
status_t InitCheck();
|
||||||
|
|
||||||
void SetFocus(BMessenger* messenger);
|
void SetFocus(const BMessenger* messenger);
|
||||||
|
|
||||||
bool AddListener(BMessenger& messenger, int32 token,
|
bool AddListener(BMessenger& messenger, int32 token,
|
||||||
uint32 events, uint32 options);
|
uint32 events, uint32 options);
|
||||||
|
@ -676,8 +676,11 @@ RootLayer::RevealNewWMState(Workspace::State &oldWMState)
|
|||||||
if (oldWMState.Active != fWMState.Active) {
|
if (oldWMState.Active != fWMState.Active) {
|
||||||
if (oldWMState.Active)
|
if (oldWMState.Active)
|
||||||
oldWMState.Active->Activated(false);
|
oldWMState.Active->Activated(false);
|
||||||
if (fWMState.Active)
|
if (fWMState.Active) {
|
||||||
fWMState.Active->Activated(true);
|
fWMState.Active->Activated(true);
|
||||||
|
fDesktop->EventDispatcher().SetFocus(&fWMState.Active->Window()->Messenger());
|
||||||
|
} else
|
||||||
|
fDesktop->EventDispatcher().SetFocus(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
// calculate the region that must be invalidated/redrawn
|
// calculate the region that must be invalidated/redrawn
|
||||||
|
@ -149,6 +149,9 @@ ServerWindow::ServerWindow(const char *title, ServerApp *app,
|
|||||||
|
|
||||||
SetTitle(title);
|
SetTitle(title);
|
||||||
fServerToken = BPrivate::gDefaultTokens.NewToken(B_SERVER_TOKEN, this);
|
fServerToken = BPrivate::gDefaultTokens.NewToken(B_SERVER_TOKEN, this);
|
||||||
|
|
||||||
|
BMessenger::Private(fClientMessenger).SetTo(fClientTeam,
|
||||||
|
looperPort, clientToken, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -13,19 +13,20 @@
|
|||||||
#define SERVER_WINDOW_H
|
#define SERVER_WINDOW_H
|
||||||
|
|
||||||
|
|
||||||
#include <GraphicsDefs.h>
|
#include "MessageLooper.h"
|
||||||
|
#include "SubWindowList.h"
|
||||||
|
|
||||||
#include <PortLink.h>
|
#include <PortLink.h>
|
||||||
|
#include <TokenSpace.h>
|
||||||
|
|
||||||
|
#include <GraphicsDefs.h>
|
||||||
#include <Locker.h>
|
#include <Locker.h>
|
||||||
#include <Message.h>
|
#include <Message.h>
|
||||||
#include <OS.h>
|
#include <Messenger.h>
|
||||||
#include <Rect.h>
|
#include <Rect.h>
|
||||||
#include <String.h>
|
#include <String.h>
|
||||||
#include <Window.h>
|
#include <Window.h>
|
||||||
|
|
||||||
#include "MessageLooper.h"
|
|
||||||
#include "SubWindowList.h"
|
|
||||||
#include "TokenSpace.h"
|
|
||||||
|
|
||||||
class BString;
|
class BString;
|
||||||
class BMessenger;
|
class BMessenger;
|
||||||
class BPoint;
|
class BPoint;
|
||||||
@ -70,7 +71,8 @@ public:
|
|||||||
void NotifyScreenModeChanged(const BRect frame,
|
void NotifyScreenModeChanged(const BRect frame,
|
||||||
const color_space cspace);
|
const color_space cspace);
|
||||||
|
|
||||||
// util methods.
|
// util methods.
|
||||||
|
const BMessenger& Messenger() const { return fClientMessenger; }
|
||||||
status_t SendMessageToClient(const BMessage* msg,
|
status_t SendMessageToClient(const BMessage* msg,
|
||||||
int32 target = B_NULL_TOKEN,
|
int32 target = B_NULL_TOKEN,
|
||||||
bool usePreferred = false) const;
|
bool usePreferred = false) const;
|
||||||
@ -138,6 +140,7 @@ private:
|
|||||||
port_id fMessagePort;
|
port_id fMessagePort;
|
||||||
port_id fClientReplyPort;
|
port_id fClientReplyPort;
|
||||||
port_id fClientLooperPort;
|
port_id fClientLooperPort;
|
||||||
|
BMessenger fClientMessenger;
|
||||||
|
|
||||||
BMessage fClientViewsWithInvalidCoords;
|
BMessage fClientViewsWithInvalidCoords;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user