* ScreenCornerSelector is now a BControl and fully keyboard navigable.

* simplified drawing a bit, and got rid of those scary scale*() stuff (which also
  results in better looks). The monitor now looks like the one in Screen; I think
  it should either be a very reduced form or a very detailed form, but anything
  in between often looks just odd.
* It now also listens to B_MOUSE_DOWN incl. mouse tracking, not only to B_MOUSE_UP.
* Less flickering on state changes (and focus change).
* Loading settings no longer overwrites defaults missing from the settings.
* Renamed ScreenSaverSettings::GetBlankCorner() to BlankCorner(),
  LoadSettings() to Load(), GetState() to GetModuleState(), ....
* Some more cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@17783 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2006-06-09 16:03:16 +00:00
parent 78f3c7e6f5
commit 642090fdc6
8 changed files with 383 additions and 176 deletions
@@ -12,12 +12,12 @@
enum screen_corner { enum screen_corner {
NONE = -1, NO_CORNER = -1,
UPLEFT, UP_LEFT_CORNER,
UPRIGHT, UP_RIGHT_CORNER,
DOWNRIGHT, DOWN_RIGHT_CORNER,
DOWNLEFT, DOWN_LEFT_CORNER,
CENTER CENTER_CORNER
}; };
// time flags // time flags
@@ -37,7 +37,8 @@ class ScreenSaverSettings {
public: public:
ScreenSaverSettings(); ScreenSaverSettings();
bool LoadSettings(); bool Load();
void Save();
void Defaults(); void Defaults();
BPath& Path() { return fSettingsPath; } BPath& Path() { return fSettingsPath; }
@@ -49,15 +50,15 @@ class ScreenSaverSettings {
bigtime_t SuspendTime() { return fSuspendTime; } bigtime_t SuspendTime() { return fSuspendTime; }
bigtime_t OffTime() { return fOffTime; } bigtime_t OffTime() { return fOffTime; }
screen_corner GetBlankCorner() { return fBlankCorner; } screen_corner BlankCorner() { return fBlankCorner; }
screen_corner GetNeverBlankCorner() { return fNeverBlankCorner; } screen_corner NeverBlankCorner() { return fNeverBlankCorner; }
bool LockEnable() { return fLockEnabled; } bool LockEnable() { return fLockEnabled; }
bigtime_t PasswordTime() { return fPasswordTime; } bigtime_t PasswordTime() { return fPasswordTime; }
const char *Password() { return fPassword.String(); } const char *Password() { return fPassword.String(); }
const char *LockMethod() { return fLockMethod.String(); } const char *LockMethod() { return fLockMethod.String(); }
bool IsNetworkPassword() { return strcmp(fLockMethod.String(), "custom") != 0; } bool IsNetworkPassword() { return strcmp(fLockMethod.String(), "custom") != 0; }
const char *ModuleName() { return fModuleName.String(); } const char *ModuleName() { return fModuleName.String(); }
status_t GetState(const char *name, BMessage *stateMsg); status_t GetModuleState(const char *name, BMessage *stateMsg);
void SetWindowFrame(const BRect &fr) { fWindowFrame = fr; } void SetWindowFrame(const BRect &fr) { fWindowFrame = fr; }
void SetWindowTab(int32 tab) { fWindowTab = tab; } void SetWindowTab(int32 tab) { fWindowTab = tab; }
@@ -74,9 +75,9 @@ class ScreenSaverSettings {
// Cannot set network password from here. // Cannot set network password from here.
void SetLockMethod(const char *method) { fLockMethod = method; } void SetLockMethod(const char *method) { fLockMethod = method; }
void SetModuleName(const char *mn) { fModuleName = mn; } void SetModuleName(const char *mn) { fModuleName = mn; }
void SetState(const char *name, BMessage *stateMsg); void SetModuleState(const char *name, BMessage *stateMsg);
void SaveSettings();
BMessage& GetSettings(); BMessage& Message();
private: private:
BRect fWindowFrame; BRect fWindowFrame;
@@ -101,7 +101,7 @@ ScreenSaverFilter::ScreenSaverFilter()
fLastEventTime(0), fLastEventTime(0),
fBlankTime(0), fBlankTime(0),
fSnoozeTime(0), fSnoozeTime(0),
fCurrentCorner(NONE), fCurrentCorner(NO_CORNER),
fEnabled(false), fEnabled(false),
fFrameNum(0), fFrameNum(0),
fRunner(NULL), fRunner(NULL),
@@ -192,10 +192,10 @@ ScreenSaverFilter::ReloadSettings()
return; return;
} }
fSettings.LoadSettings(); fSettings.Load();
fBlankCorner = fSettings.GetBlankCorner(); fBlankCorner = fSettings.BlankCorner();
fNeverBlankCorner = fSettings.GetNeverBlankCorner(); fNeverBlankCorner = fSettings.NeverBlankCorner();
fBlankTime = fSnoozeTime = fSettings.BlankTime(); fBlankTime = fSnoozeTime = fSettings.BlankTime();
CheckTime(); CheckTime();
@@ -274,19 +274,19 @@ ScreenSaverFilter::_ScreenCorner(screen_corner corner, uint32 cornerSize)
BRect frame = BScreen().Frame(); BRect frame = BScreen().Frame();
switch (corner) { switch (corner) {
case UPLEFT: case UP_LEFT_CORNER:
return BRect(frame.left, frame.top, frame.left + cornerSize - 1, return BRect(frame.left, frame.top, frame.left + cornerSize - 1,
frame.top + cornerSize - 1); frame.top + cornerSize - 1);
case UPRIGHT: case UP_RIGHT_CORNER:
return BRect(frame.right - cornerSize + 1, frame.top, frame.right, return BRect(frame.right - cornerSize + 1, frame.top, frame.right,
frame.top + cornerSize - 1); frame.top + cornerSize - 1);
case DOWNRIGHT: case DOWN_RIGHT_CORNER:
return BRect(frame.right - cornerSize + 1, frame.bottom - cornerSize + 1, return BRect(frame.right - cornerSize + 1, frame.bottom - cornerSize + 1,
frame.right, frame.bottom); frame.right, frame.bottom);
case DOWNLEFT: case DOWN_LEFT_CORNER:
return BRect(frame.left, frame.bottom - cornerSize + 1, return BRect(frame.left, frame.bottom - cornerSize + 1,
frame.left + cornerSize - 1, frame.bottom); frame.left + cornerSize - 1, frame.bottom);
@@ -330,7 +330,7 @@ ScreenSaverFilter::Filter(BMessage *message, BList *outList)
if (fNeverBlankRect.Contains(where)) if (fNeverBlankRect.Contains(where))
fCurrentCorner = fNeverBlankCorner; fCurrentCorner = fNeverBlankCorner;
else else
fCurrentCorner = NONE; fCurrentCorner = NO_CORNER;
break; break;
} }
+2 -2
View File
@@ -57,11 +57,11 @@ ScreenBlanker::~ScreenBlanker()
void void
ScreenBlanker::ReadyToRun() ScreenBlanker::ReadyToRun()
{ {
if (!fSettings.LoadSettings()) { if (!fSettings.Load()) {
fprintf(stderr, "could not load settings\n"); fprintf(stderr, "could not load settings\n");
exit(1); exit(1);
} }
// create a BDirectWindow and start the render thread. // create a BDirectWindow and start the render thread.
// TODO: we need a window per screen... // TODO: we need a window per screen...
BScreen screen(B_MAIN_SCREEN_ID); BScreen screen(B_MAIN_SCREEN_ID);
+1 -1
View File
@@ -143,7 +143,7 @@ ScreenSaverRunner::_LoadAddOn()
printf("Unable to find the instantiator\n"); printf("Unable to find the instantiator\n");
} else { } else {
BMessage state; BMessage state;
fSettings.GetState(fSettings.ModuleName(), &state); fSettings.GetModuleState(fSettings.ModuleName(), &state);
fSaver = instantiate(&state, fAddonImage); fSaver = instantiate(&state, fAddonImage);
} }
+44 -28
View File
@@ -36,7 +36,7 @@ ScreenSaverSettings::ScreenSaverSettings()
//! Load the flattened settings BMessage from disk and parse it. //! Load the flattened settings BMessage from disk and parse it.
bool bool
ScreenSaverSettings::LoadSettings() ScreenSaverSettings::Load()
{ {
BFile file(fSettingsPath.Path(), B_READ_ONLY); BFile file(fSettingsPath.Path(), B_READ_ONLY);
if (file.InitCheck() != B_OK) if (file.InitCheck() != B_OK)
@@ -48,31 +48,47 @@ ScreenSaverSettings::LoadSettings()
PRINT_OBJECT(fSettings); PRINT_OBJECT(fSettings);
fSettings.FindRect("windowframe", &fWindowFrame); BRect rect;
fSettings.FindInt32("windowtab", &fWindowTab); if (fSettings.FindRect("windowframe", &rect) == B_OK)
fSettings.FindInt32("timeflags", &fTimeFlags); fWindowFrame = rect;
int32 value;
if (fSettings.FindInt32("windowtab", &value) == B_OK)
fWindowTab = value;
if (fSettings.FindInt32("timeflags", &value) == B_OK)
fTimeFlags = value;
int32 blank_time, standByTime, suspendTime, offTime, passwordTime; if (fSettings.FindInt32("timefade", &value) == B_OK)
if (fSettings.FindInt32("timefade", &blank_time) == B_OK) fBlankTime = value * 1000000LL;
fBlankTime = blank_time * 1000000LL; if (fSettings.FindInt32("timestandby", &value) == B_OK)
if (fSettings.FindInt32("timestandby", &standByTime) == B_OK) fStandByTime = value * 1000000LL;
fStandByTime = standByTime * 1000000LL; if (fSettings.FindInt32("timesuspend", &value) == B_OK)
if (fSettings.FindInt32("timesuspend", &suspendTime) == B_OK) fSuspendTime = value * 1000000LL;
fSuspendTime = suspendTime * 1000000LL; if (fSettings.FindInt32("timeoff", &value) == B_OK)
if (fSettings.FindInt32("timeoff", &offTime) == B_OK) fOffTime = value * 1000000LL;
fOffTime = offTime * 1000000LL;
fSettings.FindInt32("cornernow", (int32*)&fBlankCorner); if (fSettings.FindInt32("cornernow", &value) == B_OK)
fSettings.FindInt32("cornernever", (int32*)&fNeverBlankCorner); fBlankCorner = (screen_corner)value;
fSettings.FindBool("lockenable", &fLockEnabled); if (fSettings.FindInt32("cornernever", &value) == B_OK)
if (fSettings.FindInt32("lockdelay", &passwordTime) == B_OK) fNeverBlankCorner = (screen_corner)value;
fPasswordTime = passwordTime * 1000000LL;
fSettings.FindString("lockpassword", &fPassword); bool lockEnabled;
fSettings.FindString("lockmethod", &fLockMethod); if (fSettings.FindBool("lockenable", &lockEnabled) == B_OK)
fSettings.FindString("modulename", &fModuleName); fLockEnabled = lockEnabled;
if (fSettings.FindInt32("lockdelay", &value) == B_OK)
fPasswordTime = value * 1000000LL;
const char* string;
if (fSettings.FindString("lockpassword", &string) == B_OK)
fPassword = string;
if (fSettings.FindString("lockmethod", &string) == B_OK)
fLockMethod = string;
if (fSettings.FindString("modulename", &string) == B_OK)
fModuleName = string;
if (IsNetworkPassword()) { if (IsNetworkPassword()) {
FILE *networkFile = NULL; FILE *networkFile = NULL;
char buffer[512], *start; char buffer[512], *start;
// TODO: this only works under R5 net_server!
// This ugly piece opens the networking file and reads the password, if it exists. // This ugly piece opens the networking file and reads the password, if it exists.
if ((networkFile = fopen(fNetworkPath.Path(),"r"))) if ((networkFile = fopen(fNetworkPath.Path(),"r")))
while (fgets(buffer, 512, networkFile) != NULL) { while (fgets(buffer, 512, networkFile) != NULL) {
@@ -100,8 +116,8 @@ ScreenSaverSettings::Defaults()
fStandByTime = 120*1000000LL; fStandByTime = 120*1000000LL;
fSuspendTime = 120*1000000LL; fSuspendTime = 120*1000000LL;
fOffTime = 120*1000000LL; fOffTime = 120*1000000LL;
fBlankCorner = NONE; fBlankCorner = NO_CORNER;
fNeverBlankCorner = NONE; fNeverBlankCorner = NO_CORNER;
fLockEnabled = false; fLockEnabled = false;
fPasswordTime = 120*1000000LL; fPasswordTime = 120*1000000LL;
fPassword = ""; fPassword = "";
@@ -111,7 +127,7 @@ ScreenSaverSettings::Defaults()
BMessage & BMessage &
ScreenSaverSettings::GetSettings() ScreenSaverSettings::Message()
{ {
// We can't just empty the message, because the module states are stored // We can't just empty the message, because the module states are stored
// in this message as well. // in this message as well.
@@ -153,7 +169,7 @@ ScreenSaverSettings::GetSettings()
status_t status_t
ScreenSaverSettings::GetState(const char *name, BMessage *stateMsg) ScreenSaverSettings::GetModuleState(const char *name, BMessage *stateMsg)
{ {
BString stateName("modulesettings_"); BString stateName("modulesettings_");
stateName += name; stateName += name;
@@ -162,7 +178,7 @@ ScreenSaverSettings::GetState(const char *name, BMessage *stateMsg)
void void
ScreenSaverSettings::SetState(const char *name, BMessage *stateMsg) ScreenSaverSettings::SetModuleState(const char *name, BMessage *stateMsg)
{ {
BString stateName("modulesettings_"); BString stateName("modulesettings_");
stateName += name; stateName += name;
@@ -172,9 +188,9 @@ ScreenSaverSettings::SetState(const char *name, BMessage *stateMsg)
void void
ScreenSaverSettings::SaveSettings() ScreenSaverSettings::Save()
{ {
BMessage &settings = GetSettings(); BMessage &settings = Message();
PRINT_OBJECT(settings); PRINT_OBJECT(settings);
BFile file(fSettingsPath.Path(), B_READ_WRITE | B_CREATE_FILE | B_ERASE_FILE); BFile file(fSettingsPath.Path(), B_READ_WRITE | B_CREATE_FILE | B_ERASE_FILE);
if (file.InitCheck() != B_OK || settings.Flatten(&file) != B_OK) if (file.InitCheck() != B_OK || settings.Flatten(&file) != B_OK)
@@ -4,6 +4,7 @@
* *
* Authors: * Authors:
* Michael Phipps * Michael Phipps
* Axel Dörfler, [email protected]
*/ */
#include "ScreenCornerSelector.h" #include "ScreenCornerSelector.h"
@@ -13,141 +14,314 @@
#include <Rect.h> #include <Rect.h>
#include <Point.h> #include <Point.h>
#include <Shape.h> #include <Shape.h>
#include <Screen.h>
#include <Window.h>
#include <stdio.h> #include <stdio.h>
static const float kAspectRatio = 4.0f / 3.0f;
static const float kMonitorBorderSize = 3.0f;
static const float kArrowSize = 11.0f;
static const float kStopSize = 15.0f;
inline BPoint
scale_arrow(int x, int y, BRect area, bool invertX, bool invertY) ScreenCornerSelector::ScreenCornerSelector(BRect frame, const char *name,
BMessage* message, uint32 resizingMode)
: BControl(frame, name, NULL, message, resizingMode, B_WILL_DRAW | B_NAVIGABLE),
fCurrentCorner(NO_CORNER),
fPreviousCorner(-1)
{ {
float arrowX[] = {0, .25, .5, .66667, .90, .9}; SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
float arrowY[] = {0, .15, .25, .3333333, .6666667, 1.0};
return scale_direct(invertX ? 1 - arrowX[x] : arrowX[x],
invertY ? 1 - arrowY[y] : arrowY[y], area);
} }
// #pragma mark - BRect
ScreenCornerSelector::_MonitorFrame() const
ScreenCornerSelector::ScreenCornerSelector(BRect frame, const char *name, uint32 resizingMode)
: BView(frame, name, resizingMode, B_WILL_DRAW),
fCurrentCorner(NONE)
{ {
SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); float width = Bounds().Width();
float height = Bounds().Height();
if (width / kAspectRatio > height)
width = height * kAspectRatio;
else if (height * kAspectRatio > width)
height = width / kAspectRatio;
return BRect((Bounds().Width() - width) / 2, (Bounds().Height() - height) / 2,
(Bounds().Width() + width) / 2, (Bounds().Height() + height) / 2);
}
BRect
ScreenCornerSelector::_InnerFrame(BRect monitorFrame) const
{
return monitorFrame.InsetByCopy(kMonitorBorderSize + 3,
kMonitorBorderSize + 3);
}
BRect
ScreenCornerSelector::_CenterFrame(BRect innerFrame) const
{
return innerFrame.InsetByCopy(kArrowSize, kArrowSize);
} }
void void
ScreenCornerSelector::Draw(BRect update) ScreenCornerSelector::Draw(BRect update)
{ {
// Top of monitor rgb_color darkColor = {160, 160, 160, 255};
SetHighColor(kGrey); rgb_color blackColor = {0, 0, 0, 255};
FillRoundRect(scale(0, 7, 0, 3, Bounds()), 4, 4); rgb_color redColor = {228, 0, 0, 255};
SetHighColor(kBlack);
StrokeRoundRect(scale(0, 7, 0, 3, Bounds()), 4, 4);
SetHighColor(kLightBlue);
fMonitorFrame = scale(1, 6, 1, 2, Bounds());
FillRect(fMonitorFrame);
SetHighColor(kDarkGrey);
StrokeRect(fMonitorFrame);
// Base of monitor BRect outerRect = _MonitorFrame();
SetHighColor(kGrey); BRect innerRect(outerRect.InsetByCopy(kMonitorBorderSize + 2,
FillTriangle(scale(1,5,Bounds()),scale(3,4,Bounds()),scale(3,5,Bounds())); kMonitorBorderSize + 2));
FillTriangle(scale(4,5,Bounds()),scale(4,4,Bounds()),scale(6,5,Bounds()));
FillRect(scale(3,4,4,5,Bounds())); SetDrawingMode(B_OP_OVER);
FillRect(scale(3,4,3,4,Bounds()));
SetHighColor(kBlack); if (!_InnerFrame(outerRect).Contains(update)) {
StrokeRect(scale(3,4,3,4,Bounds())); // frame & background
StrokeLine(scale(2,4,Bounds()),scale(1,5,Bounds()));
StrokeLine(scale(6,5,Bounds()),scale(1,5,Bounds())); // if the focus is changing, we don't redraw the whole view, but only
StrokeLine(scale(6,5,Bounds()),scale(5,4,Bounds())); // the part that's affected by the change
DrawArrow(); if (!IsFocusChanging()) {
SetHighColor(darkColor);
FillRoundRect(outerRect, kMonitorBorderSize * 3 / 2, kMonitorBorderSize * 3 / 2);
}
if (IsFocus() && Window()->IsActive())
SetHighColor(ui_color(B_KEYBOARD_NAVIGATION_COLOR));
else
SetHighColor(blackColor);
StrokeRoundRect(outerRect, kMonitorBorderSize * 3 / 2, kMonitorBorderSize * 3 / 2);
if (!IsFocusChanging()) {
SetHighColor(210, 210, 255);
FillRoundRect(innerRect, kMonitorBorderSize, kMonitorBorderSize);
}
if (IsFocus() && Window()->IsActive())
SetHighColor(ui_color(B_KEYBOARD_NAVIGATION_COLOR));
else
SetHighColor(blackColor);
StrokeRoundRect(innerRect, kMonitorBorderSize, kMonitorBorderSize);
if (IsFocusChanging())
return;
// power light
SetHighColor(redColor);
BPoint powerPos(outerRect.left + kMonitorBorderSize * 2, outerRect.bottom
- kMonitorBorderSize);
StrokeLine(powerPos, BPoint(powerPos.x + 2, powerPos.y));
}
innerRect = _InnerFrame(outerRect);
if (fCurrentCorner != NO_CORNER)
_DrawArrow(innerRect);
else
_DrawStop(innerRect);
SetDrawingMode(B_OP_COPY);
}
int32
ScreenCornerSelector::Value()
{
return (int32)fCurrentCorner;
}
void
ScreenCornerSelector::SetValue(int32 corner)
{
switch (corner) {
case UP_LEFT_CORNER:
case UP_RIGHT_CORNER:
case DOWN_LEFT_CORNER:
case DOWN_RIGHT_CORNER:
case NO_CORNER:
break;
default:
corner = NO_CORNER;
}
if ((screen_corner)corner == fCurrentCorner)
return;
fCurrentCorner = (screen_corner)corner;
Invalidate(_InnerFrame(_MonitorFrame()));
Invoke();
}
screen_corner
ScreenCornerSelector::Corner() const
{
return fCurrentCorner;
} }
void void
ScreenCornerSelector::SetCorner(screen_corner corner) ScreenCornerSelector::SetCorner(screen_corner corner)
{ {
fCurrentCorner = corner; // redirected to SetValue() to make sure only valid values are set
Invalidate(); SetValue((int32)corner);
}
BRect
ScreenCornerSelector::_ArrowSize(BRect monitorRect, bool isCentered)
{
int arrowSize = monitorRect.IntegerWidth();
if (monitorRect.IntegerHeight() < arrowSize)
arrowSize = monitorRect.IntegerHeight();
arrowSize /= 3;
BRect arrowRect(0, 0, arrowSize, arrowSize);
if (isCentered) {
arrowRect.OffsetBy(monitorRect.left + (monitorRect.Width() - arrowSize) / 2,
monitorRect.top + (monitorRect.Height() - arrowSize) / 2);
}
return arrowRect;
} }
void void
ScreenCornerSelector::DrawArrow() ScreenCornerSelector::_DrawStop(BRect innerFrame)
{ {
PushState(); BRect centerRect = _CenterFrame(innerFrame);
float size = kStopSize;
BRect rect(_ArrowSize(fMonitorFrame, fCurrentCorner == NONE)); BRect rect;
rect.left = centerRect.left + (centerRect.Width() - size) / 2;
if (fCurrentCorner != NONE) { rect.top = centerRect.top + (centerRect.Height() - size) / 2;
bool invertX = fCurrentCorner == UPRIGHT || fCurrentCorner == DOWNRIGHT; if (rect.left < centerRect.left || rect.top < centerRect.top) {
bool invertY = fCurrentCorner == UPRIGHT || fCurrentCorner == UPLEFT; size = centerRect.Height();
rect.top = centerRect.top;
float size = rect.Width(); rect.left = centerRect.left + (centerRect.Width() - size) / 2;
MovePenTo(invertX ? fMonitorFrame.right - size - 2 : 2 + fMonitorFrame.left,
!invertY ? fMonitorFrame.bottom - size - 2 : 2 + fMonitorFrame.top);
BShape arrow;
arrow.MoveTo(scale_arrow(0, 1, rect, invertX, invertY));
arrow.LineTo(scale_arrow(0, 5, rect, invertX, invertY));
arrow.LineTo(scale_arrow(4, 5, rect, invertX, invertY));
arrow.LineTo(scale_arrow(3, 4, rect, invertX, invertY));
arrow.LineTo(scale_arrow(5, 3, rect, invertX, invertY));
arrow.LineTo(scale_arrow(2, 0, rect, invertX, invertY));
arrow.LineTo(scale_arrow(1, 2, rect, invertX, invertY));
arrow.LineTo(scale_arrow(0, 1, rect, invertX, invertY));
arrow.Close();
SetHighColor(kBlack);
FillShape(&arrow, B_SOLID_HIGH);
} else {
SetHighColor(255, 0, 0);
SetPenSize(2);
StrokeEllipse(rect);
StrokeLine(BPoint(rect.right, rect.top), BPoint(rect.left, rect.bottom));
} }
rect.right = rect.left + size - 1;
rect.bottom = rect.top + size - 1;
PopState(); SetHighColor(255, 0, 0);
SetPenSize(2);
StrokeEllipse(rect);
size -= ceilf(sin(PI / 4) * size) + 1;
rect.InsetBy(size, size);
StrokeLine(BPoint(rect.right, rect.top), BPoint(rect.left, rect.bottom));
SetPenSize(1);
} }
void void
ScreenCornerSelector::MouseUp(BPoint point) ScreenCornerSelector::_DrawArrow(BRect innerFrame)
{ {
if (fMonitorFrame.Contains(point)) { float size = kArrowSize;
if (_ArrowSize(fMonitorFrame, true).Contains(point)) float sizeX = fCurrentCorner == UP_LEFT_CORNER || fCurrentCorner == DOWN_LEFT_CORNER ? size : -size;
fCurrentCorner = NONE; float sizeY = fCurrentCorner == UP_LEFT_CORNER || fCurrentCorner == UP_RIGHT_CORNER ? size : -size;
else {
float centerX = fMonitorFrame.left + fMonitorFrame.Width() / 2; innerFrame.InsetBy(2, 2);
float centerY = fMonitorFrame.top + fMonitorFrame.Height() / 2; BPoint origin(sizeX < 0 ? innerFrame.right : innerFrame.left,
if (point.x < centerX) sizeY < 0 ? innerFrame.bottom : innerFrame.top);
fCurrentCorner = point.y < centerY ? UPLEFT : DOWNLEFT;
else SetHighColor(kBlack);
fCurrentCorner = point.y < centerY ? UPRIGHT : DOWNRIGHT; FillTriangle(BPoint(origin.x, origin.y), BPoint(origin.x, origin.y + sizeY),
} BPoint(origin.x + sizeX, origin.y));
Draw(fMonitorFrame); }
screen_corner
ScreenCornerSelector::_ScreenCorner(BPoint point, screen_corner previousCorner) const
{
BRect innerFrame = _InnerFrame(_MonitorFrame());
if (!innerFrame.Contains(point))
return previousCorner;
if (_CenterFrame(innerFrame).Contains(point))
return NO_CORNER;
float centerX = innerFrame.left + innerFrame.Width() / 2;
float centerY = innerFrame.top + innerFrame.Height() / 2;
if (point.x < centerX)
return point.y < centerY ? UP_LEFT_CORNER : DOWN_LEFT_CORNER;
return point.y < centerY ? UP_RIGHT_CORNER : DOWN_RIGHT_CORNER;
}
void
ScreenCornerSelector::MouseDown(BPoint where)
{
fPreviousCorner = Value();
SetValue(_ScreenCorner(where, (screen_corner)fPreviousCorner));
SetMouseEventMask(B_POINTER_EVENTS, B_NO_POINTER_HISTORY);
}
void
ScreenCornerSelector::MouseUp(BPoint where)
{
fPreviousCorner = -1;
}
void
ScreenCornerSelector::MouseMoved(BPoint where, uint32 transit, const BMessage* dragMessage)
{
if (fPreviousCorner == -1)
return;
SetValue(_ScreenCorner(where, (screen_corner)fPreviousCorner));
}
void
ScreenCornerSelector::KeyDown(const char* bytes, int32 numBytes)
{
switch (bytes[0]) {
// arrow keys
case B_LEFT_ARROW:
case '4':
if (Corner() == UP_RIGHT_CORNER)
SetCorner(UP_LEFT_CORNER);
else if (Corner() == DOWN_RIGHT_CORNER)
SetCorner(DOWN_LEFT_CORNER);
break;
case B_RIGHT_ARROW:
case '6':
if (Corner() == UP_LEFT_CORNER)
SetCorner(UP_RIGHT_CORNER);
else if (Corner() == DOWN_LEFT_CORNER)
SetCorner(DOWN_RIGHT_CORNER);
break;
case B_UP_ARROW:
case '8':
if (Corner() == DOWN_LEFT_CORNER)
SetCorner(UP_LEFT_CORNER);
else if (Corner() == DOWN_RIGHT_CORNER)
SetCorner(UP_RIGHT_CORNER);
break;
case B_DOWN_ARROW:
case '2':
if (Corner() == UP_LEFT_CORNER)
SetCorner(DOWN_LEFT_CORNER);
else if (Corner() == UP_RIGHT_CORNER)
SetCorner(DOWN_RIGHT_CORNER);
break;
// numlock keys
case B_HOME:
case '7':
SetCorner(UP_LEFT_CORNER);
break;
case B_PAGE_UP:
case '9':
SetCorner(UP_RIGHT_CORNER);
break;
case B_PAGE_DOWN:
case '3':
SetCorner(DOWN_RIGHT_CORNER);
break;
case B_END:
case '1':
SetCorner(DOWN_LEFT_CORNER);
break;
default:
BControl::KeyDown(bytes, numBytes);
} }
} }
@@ -4,6 +4,7 @@
* *
* Authors: * Authors:
* Michael Phipps * Michael Phipps
* Axel Dörfler, [email protected]
*/ */
#ifndef SCREEN_CORNER_SELECTOR_H #ifndef SCREEN_CORNER_SELECTOR_H
#define SCREEN_CORNER_SELECTOR_H #define SCREEN_CORNER_SELECTOR_H
@@ -11,25 +12,36 @@
#include "ScreenSaverSettings.h" #include "ScreenSaverSettings.h"
#include <View.h> #include <Control.h>
class ScreenCornerSelector : public BView { class ScreenCornerSelector : public BControl {
public: public:
ScreenCornerSelector(BRect frame, const char *name, uint32 resizingMode); ScreenCornerSelector(BRect frame, const char *name, BMessage* message,
uint32 resizingMode);
virtual void Draw(BRect update); virtual void Draw(BRect update);
virtual void MouseDown(BPoint point);
virtual void MouseUp(BPoint point); virtual void MouseUp(BPoint point);
virtual void MouseMoved(BPoint where, uint32 transit, const BMessage* dragMessage);
virtual void KeyDown(const char* bytes, int32 numBytes);
void DrawArrow(); virtual void SetValue(int32 value);
inline screen_corner Corner() { return fCurrentCorner; } virtual int32 Value();
void SetCorner(screen_corner direction);
void SetCorner(screen_corner corner);
screen_corner Corner() const;
private: private:
BRect _ArrowSize(BRect monitorRect, bool isCentered); BRect _MonitorFrame() const;
BRect _InnerFrame(BRect monitorFrame) const;
BRect _CenterFrame(BRect innerFrame) const;
void _DrawStop(BRect innerFrame);
void _DrawArrow(BRect innerFrame);
screen_corner _ScreenCorner(BPoint point, screen_corner previous) const;
BRect fMonitorFrame;
screen_corner fCurrentCorner; screen_corner fCurrentCorner;
int32 fPreviousCorner;
}; };
#endif // SCREEN_CORNER_SELECTOR_H #endif // SCREEN_CORNER_SELECTOR_H
@@ -34,9 +34,6 @@
#include <stdio.h> #include <stdio.h>
#include <Debug.h>
#define CALLED() PRINT(("%s\n", __PRETTY_FUNCTION__))
const uint32 kPreviewMonitorGap = 16; const uint32 kPreviewMonitorGap = 16;
const uint32 kMinSettingsWidth = 230; const uint32 kMinSettingsWidth = 230;
@@ -54,8 +51,12 @@ const int32 kMsgEnableScreenSaverBox = 'ESCH';
const int32 kMsgTurnOffCheckBox = 'TUOF'; const int32 kMsgTurnOffCheckBox = 'TUOF';
const int32 kMsgTurnOffSliderChanged = 'TUCG'; const int32 kMsgTurnOffSliderChanged = 'TUCG';
const int32 kMsgFadeCornerChanged = 'fdcc';
const int32 kMsgNeverFadeCornerChanged = 'nfcc';
static const uint32 kTimeSliderChanged = 'tsch'; static const uint32 kTimeSliderChanged = 'tsch';
class TimeSlider : public BSlider { class TimeSlider : public BSlider {
public: public:
TimeSlider(BRect frame, const char* name, uint32 modificationMessage); TimeSlider(BRect frame, const char* name, uint32 modificationMessage);
@@ -371,9 +372,9 @@ ModulesView::MessageReceived(BMessage* message)
case kMsgTestSaver: case kMsgTestSaver:
SaveState(); SaveState();
fSettings.SaveSettings(); fSettings.Save();
be_roster->Launch(SCREEN_BLANKER_SIG, &fSettings.GetSettings()); be_roster->Launch(SCREEN_BLANKER_SIG, &fSettings.Message());
break; break;
case kMsgAddSaver: case kMsgAddSaver:
@@ -395,7 +396,7 @@ ModulesView::SaveState()
BMessage state; BMessage state;
if (saver->SaveState(&state) == B_OK) if (saver->SaveState(&state) == B_OK)
fSettings.SetState(fCurrentName.String(), &state); fSettings.SetModuleState(fCurrentName.String(), &state);
} }
@@ -586,7 +587,7 @@ ScreenSaverWindow::ScreenSaverWindow()
: BWindow(BRect(50, 50, 496, 375), "Screen Saver", : BWindow(BRect(50, 50, 496, 375), "Screen Saver",
B_TITLED_WINDOW, B_ASYNCHRONOUS_CONTROLS /*| B_NOT_ZOOMABLE | B_NOT_RESIZABLE*/) B_TITLED_WINDOW, B_ASYNCHRONOUS_CONTROLS /*| B_NOT_ZOOMABLE | B_NOT_RESIZABLE*/)
{ {
fSettings.LoadSettings(); fSettings.Load();
BRect rect = Bounds(); BRect rect = Bounds();
@@ -622,8 +623,8 @@ ScreenSaverWindow::ScreenSaverWindow()
fEnableCheckBox->SetValue(fSettings.TimeFlags() & ENABLE_SAVER ? B_CONTROL_ON : B_CONTROL_OFF); fEnableCheckBox->SetValue(fSettings.TimeFlags() & ENABLE_SAVER ? B_CONTROL_ON : B_CONTROL_OFF);
fRunSlider->SetTime(fSettings.BlankTime()); fRunSlider->SetTime(fSettings.BlankTime());
fTurnOffSlider->SetTime(fSettings.OffTime() + fSettings.BlankTime()); fTurnOffSlider->SetTime(fSettings.OffTime() + fSettings.BlankTime());
fFadeNow->SetCorner(fSettings.GetBlankCorner()); fFadeNow->SetCorner(fSettings.BlankCorner());
fFadeNever->SetCorner(fSettings.GetNeverBlankCorner()); fFadeNever->SetCorner(fSettings.NeverBlankCorner());
fPasswordCheckBox->SetValue(fSettings.LockEnable()); fPasswordCheckBox->SetValue(fSettings.LockEnable());
fPasswordSlider->SetTime(fSettings.PasswordTime()); fPasswordSlider->SetTime(fSettings.PasswordTime());
@@ -714,10 +715,10 @@ ScreenSaverWindow::_SetupFadeTab(BRect rect)
// Bottom // Bottom
box->AddChild(fFadeNow = new ScreenCornerSelector(BRect(20,205,80,260),"fadeNow", box->AddChild(fFadeNow = new ScreenCornerSelector(BRect(20,205,80,260), "FadeNow",
B_FOLLOW_LEFT | B_FOLLOW_BOTTOM)); new BMessage(kMsgFadeCornerChanged), B_FOLLOW_LEFT | B_FOLLOW_BOTTOM));
box->AddChild(fFadeNever = new ScreenCornerSelector(BRect(220,205,280,260),"fadeNever", box->AddChild(fFadeNever = new ScreenCornerSelector(BRect(220,205,280,260), "FadeNever",
B_FOLLOW_LEFT | B_FOLLOW_BOTTOM)); new BMessage(kMsgNeverFadeCornerChanged), B_FOLLOW_LEFT | B_FOLLOW_BOTTOM));
rect = BRect(90,215,193,230); rect = BRect(90,215,193,230);
stringView = new BStringView(rect, NULL, "Fade now when", stringView = new BStringView(rect, NULL, "Fade now when",
@@ -842,7 +843,10 @@ ScreenSaverWindow::MessageReceived(BMessage *msg)
case kMsgPasswordCheckBox: case kMsgPasswordCheckBox:
case kMsgEnableScreenSaverBox: case kMsgEnableScreenSaverBox:
case kMsgFadeCornerChanged:
case kMsgNeverFadeCornerChanged:
_UpdateStatus(); _UpdateStatus();
fSettings.Save();
break; break;
case kMsgChangePassword: case kMsgChangePassword:
@@ -871,7 +875,7 @@ ScreenSaverWindow::QuitRequested()
{ {
_UpdateStatus(); _UpdateStatus();
fModulesView->SaveState(); fModulesView->SaveState();
fSettings.SaveSettings(); fSettings.Save();
be_app->PostMessage(B_QUIT_REQUESTED); be_app->PostMessage(B_QUIT_REQUESTED);
return true; return true;