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