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