-
-
Notifications
You must be signed in to change notification settings - Fork 338
/
ScreenSaverWindow.cpp
142 lines (113 loc) · 2.92 KB
/
ScreenSaverWindow.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/*
* Copyright 2003-2009, Haiku.
* Distributed under the terms of the MIT License.
*
* Authors:
* Michael Phipps
* Jérôme Duval, jerome.duval@free.fr
* Ryan Leavengood, leavengood@gmail.com
*/
#include "ScreenBlanker.h"
#include "ScreenSaverWindow.h"
#include <Application.h>
#include <View.h>
#include <WindowPrivate.h>
#include <syslog.h>
/* This message filter is what will close the screensaver upon user activity. */
filter_result
ScreenSaverFilter::Filter(BMessage* message, BHandler** target)
{
// This guard is used to avoid sending multiple B_QUIT_REQUESTED messages
if (fEnabled) {
switch (message->what) {
case B_KEY_DOWN:
{
// we ignore the Print-Screen key to make screen shots of
// screen savers possible
int32 key;
if (message->FindInt32("key", &key) == B_OK && key == 0xe)
return B_DISPATCH_MESSAGE;
// Fall through
}
case B_MOUSE_MOVED:
{
// ignore the initial B_MOUSE_MOVED sent by the app_server
bool transitOnly = false;
if (message->FindBool("be:transit_only", &transitOnly) == B_OK
&& transitOnly)
return B_DISPATCH_MESSAGE;
// Fall through
}
case B_MODIFIERS_CHANGED:
case B_UNMAPPED_KEY_DOWN:
case B_MOUSE_DOWN:
fEnabled = false;
be_app->PostMessage(B_QUIT_REQUESTED);
break;
}
} else if (message->what == B_KEY_DOWN) {
// Handle the escape key when the password window is showing
const char *string = NULL;
if (message->FindString("bytes", &string) == B_OK && string[0] == B_ESCAPE)
be_app->PostMessage(kMsgResumeSaver);
}
return B_DISPATCH_MESSAGE;
}
void
ScreenSaverFilter::SetEnabled(bool enabled)
{
fEnabled = enabled;
}
/*!
This is the BDirectWindow subclass that rendering occurs in.
A view is added to it so that BView based screensavers will work.
*/
ScreenSaverWindow::ScreenSaverWindow(BRect frame)
: BDirectWindow(frame, "ScreenSaver Window",
B_NO_BORDER_WINDOW_LOOK, kWindowScreenFeel,
B_NOT_RESIZABLE | B_NOT_MOVABLE | B_NOT_ZOOMABLE, B_ALL_WORKSPACES),
fSaver(NULL)
{
frame.OffsetTo(0, 0);
fTopView = new BView(frame, "ScreenSaver View", B_FOLLOW_ALL, B_WILL_DRAW);
fTopView->SetViewColor(B_TRANSPARENT_COLOR);
fFilter = new ScreenSaverFilter();
fTopView->AddFilter(fFilter);
AddChild(fTopView);
// Ensure that this view receives keyboard input
fTopView->MakeFocus(true);
fTopView->SetEventMask(B_KEYBOARD_EVENTS, 0);
}
ScreenSaverWindow::~ScreenSaverWindow()
{
Hide();
}
void
ScreenSaverWindow::SetSaver(BScreenSaver *saver)
{
fSaver = saver;
}
void
ScreenSaverWindow::MessageReceived(BMessage *message)
{
switch (message->what) {
case kMsgEnableFilter:
fFilter->SetEnabled(true);
break;
default:
BWindow::MessageReceived(message);
break;
}
}
bool
ScreenSaverWindow::QuitRequested()
{
be_app->PostMessage(B_QUIT_REQUESTED);
return true;
}
void
ScreenSaverWindow::DirectConnected(direct_buffer_info *info)
{
if (fSaver)
fSaver->DirectConnected(info);
}