- Use PostMessage instead of a BMessenger to send a message to the window from
the app. - Use the new "_fake" parameter to detect the initial mouse moved sent by app_server instead of a BMessageRunner and delay. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29493 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -238,7 +238,7 @@ ScreenBlanker::MessageReceived(BMessage* message)
|
|||||||
|
|
||||||
// Turn on the message filter again
|
// Turn on the message filter again
|
||||||
BMessage enable(kMsgEnableFilter);
|
BMessage enable(kMsgEnableFilter);
|
||||||
BMessenger(fWindow).SendMessage(&enable);
|
fWindow->PostMessage(&enable);
|
||||||
|
|
||||||
_QueueTurnOffScreen();
|
_QueueTurnOffScreen();
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -37,6 +37,14 @@ ScreenSaverFilter::Filter(BMessage* message, BHandler** target)
|
|||||||
// Fall through
|
// Fall through
|
||||||
}
|
}
|
||||||
case B_MOUSE_MOVED:
|
case B_MOUSE_MOVED:
|
||||||
|
{
|
||||||
|
// ignore the initial "fake" B_MOUSE_MOVED sent by the app_server
|
||||||
|
bool fake = false;
|
||||||
|
if (message->FindBool("_fake", &fake) == B_OK && fake)
|
||||||
|
return B_DISPATCH_MESSAGE;
|
||||||
|
|
||||||
|
// Fall through
|
||||||
|
}
|
||||||
case B_MOUSE_DOWN:
|
case B_MOUSE_DOWN:
|
||||||
fEnabled = false;
|
fEnabled = false;
|
||||||
be_app->PostMessage(B_QUIT_REQUESTED);
|
be_app->PostMessage(B_QUIT_REQUESTED);
|
||||||
@@ -77,21 +85,12 @@ ScreenSaverWindow::ScreenSaverWindow(BRect frame)
|
|||||||
// Ensure that this view receives keyboard input
|
// Ensure that this view receives keyboard input
|
||||||
fTopView->MakeFocus(true);
|
fTopView->MakeFocus(true);
|
||||||
fTopView->SetEventMask(B_KEYBOARD_EVENTS, 0);
|
fTopView->SetEventMask(B_KEYBOARD_EVENTS, 0);
|
||||||
|
|
||||||
// A delay is necessary (250ms was chosen arbitrarily) before enabling the
|
|
||||||
// message filter because when the window first shows some mouse moved
|
|
||||||
// messages are sent to it automatically.
|
|
||||||
BMessage enable(kMsgEnableFilter);
|
|
||||||
fEnableRunner = new BMessageRunner(BMessenger(this), &enable, 250000LL, 1);
|
|
||||||
if (fEnableRunner->InitCheck() != B_OK)
|
|
||||||
syslog(LOG_ERR, "Runner to enable screen saver message filtering failed!\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ScreenSaverWindow::~ScreenSaverWindow()
|
ScreenSaverWindow::~ScreenSaverWindow()
|
||||||
{
|
{
|
||||||
Hide();
|
Hide();
|
||||||
delete fEnableRunner;
|
|
||||||
delete fFilter;
|
delete fFilter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,6 @@
|
|||||||
|
|
||||||
#include <DirectWindow.h>
|
#include <DirectWindow.h>
|
||||||
#include <MessageFilter.h>
|
#include <MessageFilter.h>
|
||||||
#include <MessageRunner.h>
|
|
||||||
|
|
||||||
|
|
||||||
const static uint32 kMsgEnableFilter = 'eflt';
|
const static uint32 kMsgEnableFilter = 'eflt';
|
||||||
@@ -20,7 +19,7 @@ class ScreenSaverFilter : public BMessageFilter {
|
|||||||
public:
|
public:
|
||||||
ScreenSaverFilter()
|
ScreenSaverFilter()
|
||||||
: BMessageFilter(B_ANY_DELIVERY, B_ANY_SOURCE),
|
: BMessageFilter(B_ANY_DELIVERY, B_ANY_SOURCE),
|
||||||
fEnabled(false) {}
|
fEnabled(true) {}
|
||||||
|
|
||||||
virtual filter_result Filter(BMessage* message, BHandler** target);
|
virtual filter_result Filter(BMessage* message, BHandler** target);
|
||||||
|
|
||||||
@@ -46,7 +45,6 @@ class ScreenSaverWindow : public BDirectWindow {
|
|||||||
BView *fTopView;
|
BView *fTopView;
|
||||||
BScreenSaver *fSaver;
|
BScreenSaver *fSaver;
|
||||||
ScreenSaverFilter *fFilter;
|
ScreenSaverFilter *fFilter;
|
||||||
BMessageRunner *fEnableRunner;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // SCREEN_SAVER_WINDOW_H
|
#endif // SCREEN_SAVER_WINDOW_H
|
||||||
|
|||||||
Reference in New Issue
Block a user