From 357ef4edac38f0f1cbed376b3e516e35b88fe12d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Thu, 11 Dec 2003 08:44:26 +0000 Subject: [PATCH] Beta version Improvements are still possible git-svn-id: file:///srv/svn/repos/haiku/trunk/current@5650 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/prefs/mouse/Jamfile | 6 +- src/prefs/mouse/Mouse.cpp | 81 ++---- src/prefs/mouse/Mouse.h | 36 ++- src/prefs/mouse/Mouse.rsrc | Bin 19741 -> 10561 bytes src/prefs/mouse/MouseBitmap.h | 441 ++++++++++++++++++++++++++++++ src/prefs/mouse/MouseMessages.h | 22 +- src/prefs/mouse/MouseSettings.cpp | 89 +++--- src/prefs/mouse/MouseSettings.h | 31 ++- src/prefs/mouse/MouseView.cpp | 366 ++++++++++++++++++++----- src/prefs/mouse/MouseView.h | 62 ++++- src/prefs/mouse/MouseWindow.cpp | 205 ++++++++------ src/prefs/mouse/MouseWindow.h | 22 +- 12 files changed, 1069 insertions(+), 292 deletions(-) create mode 100644 src/prefs/mouse/MouseBitmap.h diff --git a/src/prefs/mouse/Jamfile b/src/prefs/mouse/Jamfile index 648d958577..d6fb8ad498 100644 --- a/src/prefs/mouse/Jamfile +++ b/src/prefs/mouse/Jamfile @@ -2,6 +2,10 @@ SubDir OBOS_TOP src prefs mouse ; AddResources Mouse : Mouse.rsrc ; -Preference Mouse : Mouse.cpp MouseSettings.cpp MouseView.cpp MouseWindow.cpp ; +Preference Mouse : + Mouse.cpp + MouseSettings.cpp + MouseView.cpp + MouseWindow.cpp ; LinkSharedOSLibs Mouse : translation be root ; diff --git a/src/prefs/mouse/Mouse.cpp b/src/prefs/mouse/Mouse.cpp index 6bfbb849c4..14318a172b 100644 --- a/src/prefs/mouse/Mouse.cpp +++ b/src/prefs/mouse/Mouse.cpp @@ -1,18 +1,26 @@ -/* - * Mouse.cpp - * Mouse mccall@digitalparadise.co.uk - * - */ +// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ +// +// Copyright (c) 2003, OpenBeOS +// +// This software is part of the OpenBeOS distribution and is covered +// by the OpenBeOS license. +// +// +// File: Mouse.cpp +// Author: Jérôme Duval, Andrew McCall (mccall@digitalparadise.co.uk) +// Description: Media Preferences +// Created : +// Modified : December 10, 2003 +// +// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ #include #include #include "Mouse.h" #include "MouseWindow.h" -#include "MouseSettings.h" -#include "MouseMessages.h" -const char MouseApplication::kMouseApplicationSig[] = "application/x-vnd.OpenBeOS-MOUS"; +const char kMouseApplicationSig[] = "application/x-vnd.OpenBeOS-MOUS"; int main(int, char**) { @@ -24,65 +32,18 @@ int main(int, char**) } MouseApplication::MouseApplication() - :BApplication(kMouseApplicationSig) + :BApplication(kMouseApplicationSig) { + BRect rect(0, 0, 397, 293); + MouseWindow *window = new MouseWindow(rect); + window->MoveTo(window->fSettings.WindowCorner()); - MouseWindow *window; - - fSettings = new MouseSettings(); - - window = new MouseWindow(); - + window->Show(); } -void -MouseApplication::MessageReceived(BMessage *message) -{ - switch(message->what) { - case ERROR_DETECTED: - { - BAlert *errorAlert = new BAlert("Error", "Something has gone wrong!","OK",NULL,NULL,B_WIDTH_AS_USUAL, B_OFFSET_SPACING, B_WARNING_ALERT); - errorAlert->Go(); - be_app->PostMessage(B_QUIT_REQUESTED); - } - break; - default: - BApplication::MessageReceived(message); - break; - } -} - -void -MouseApplication::SetWindowCorner(BPoint corner) -{ - fSettings->SetWindowCorner(corner); -} - -void -MouseApplication::SetMouseType(mouse_type type) -{ - fSettings->SetMouseType(type); -} - -void -MouseApplication::SetClickSpeed(bigtime_t click_speed) -{ - fSettings->SetClickSpeed(click_speed); -} - -void -MouseApplication::SetMouseSpeed(int32 speed) -{ - fSettings->SetMouseSpeed(speed); -} void MouseApplication::AboutRequested(void) { (new BAlert("about", "...by Andrew Edward McCall", "Dig Deal"))->Go(); } - -MouseApplication::~MouseApplication() -{ - delete fSettings; -} diff --git a/src/prefs/mouse/Mouse.h b/src/prefs/mouse/Mouse.h index eaa7656202..304fe3250d 100644 --- a/src/prefs/mouse/Mouse.h +++ b/src/prefs/mouse/Mouse.h @@ -1,35 +1,31 @@ +// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ +// +// Copyright (c) 2003, OpenBeOS +// +// This software is part of the OpenBeOS distribution and is covered +// by the OpenBeOS license. +// +// +// File: Mouse.h +// Author: Jérôme Duval, Andrew McCall (mccall@digitalparadise.co.uk) +// Description: Media Preferences +// Created : +// Modified : December 10, 2003 +// +// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ + #ifndef MOUSE_H #define MOUSE_H #include - #include "MouseWindow.h" -#include "MouseSettings.h" class MouseApplication : public BApplication { public: MouseApplication(); - virtual ~MouseApplication(); - void MessageReceived(BMessage *message); - BPoint WindowCorner() const {return fSettings->WindowCorner(); } - void SetWindowCorner(BPoint corner); - int32 MouseType() const {return fSettings->MouseType(); } - void SetMouseType(mouse_type type); - bigtime_t ClickSpeed() const {return fSettings->ClickSpeed(); } - void SetClickSpeed(bigtime_t click_speed); - int32 MouseSpeed() const {return fSettings->MouseSpeed(); } - void SetMouseSpeed(int32 speed); - void AboutRequested(void); - -private: - - static const char kMouseApplicationSig[]; - - MouseSettings *fSettings; - }; #endif diff --git a/src/prefs/mouse/Mouse.rsrc b/src/prefs/mouse/Mouse.rsrc index e611c5f494cb078426251c732afe8ea3348e2b96..eb7fe8120d60cc91064e741980d14f26cf1381bc 100644 GIT binary patch delta 264 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 #include #include @@ -14,10 +23,11 @@ #include "MouseSettings.h" #include "MouseMessages.h" -const char MouseSettings::kMouseSettingsFile[] = "Mouse_settings"; +const char kMouseSettingsFile[] = "Mouse_settings"; MouseSettings::MouseSettings() { + fInitCheck = B_OK; BPath path; if (find_directory(B_USER_SETTINGS_DIRECTORY,&path) == B_OK) { @@ -25,39 +35,39 @@ MouseSettings::MouseSettings() BFile file(path.Path(), B_READ_ONLY); if (file.InitCheck() == B_OK) { // Now read in the data - if (file.Read(&fSettings, sizeof(mouse_settings)) != sizeof(mouse_settings)) { + // we have to do this because mouse_map counts 16 buttons in OBOS + if ((file.Read(&fSettings.type, sizeof(fSettings.type)) != sizeof(fSettings.type)) + ||(file.Read(&fSettings.map, (3*sizeof(int32))) != (3*sizeof(int32))) + || (file.Read(&fSettings.accel, sizeof(fSettings.accel)) != sizeof(fSettings.accel)) + || (file.Read(&fSettings.click_speed, sizeof(fSettings.click_speed)) != sizeof(fSettings.click_speed))) { if (get_mouse_type((int32*)&fSettings.type) != B_OK) - be_app->PostMessage(ERROR_DETECTED); + fInitCheck = B_ERROR; if (get_mouse_map(&fSettings.map) != B_OK) - be_app->PostMessage(ERROR_DETECTED); - if (get_mouse_speed((int32 *)&fSettings.accel.speed) != B_OK) - be_app->PostMessage(ERROR_DETECTED); + fInitCheck = B_ERROR; + if (get_mouse_speed(&fSettings.accel.speed) != B_OK) + fInitCheck = B_ERROR; if (get_click_speed(&fSettings.click_speed) != B_OK) - be_app->PostMessage(ERROR_DETECTED); + fInitCheck = B_ERROR; } if (file.Read(&fCorner, sizeof(BPoint)) != sizeof(BPoint)) { fCorner.x=50; fCorner.y=50; - } - } - else { + } + } else { if (get_mouse_type((int32*)&fSettings.type) != B_OK) - be_app->PostMessage(ERROR_DETECTED); + fInitCheck = B_ERROR; if (get_mouse_map(&fSettings.map) != B_OK) - be_app->PostMessage(ERROR_DETECTED); - + fInitCheck = B_ERROR; + if (get_mouse_speed(&fSettings.accel.speed) != B_OK) + fInitCheck = B_ERROR; if (get_click_speed(&fSettings.click_speed) != B_OK) - be_app->PostMessage(ERROR_DETECTED); + fInitCheck = B_ERROR; fCorner.x=50; fCorner.y=50; } - } - else - be_app->PostMessage(ERROR_DETECTED); - - printf("Size is : %ld\n",sizeof(mouse_settings)+sizeof(BPoint)); - + } else + fInitCheck = B_ERROR; } MouseSettings::~MouseSettings() @@ -69,31 +79,46 @@ MouseSettings::~MouseSettings() path.Append(kMouseSettingsFile); - BFile file(path.Path(), B_WRITE_ONLY | B_CREATE_FILE); + BFile file(path.Path(), B_READ_WRITE | B_CREATE_FILE | B_ERASE_FILE); if (file.InitCheck() == B_OK) { - file.Write(&fSettings, sizeof(mouse_settings)); + // we have to do this because mouse_map counts 16 buttons in OBOS + file.Write(&fSettings.type, sizeof(fSettings.type)); + file.Write(&fSettings.map, 3*sizeof(int32)); + file.Write(&fSettings.accel, sizeof(fSettings.accel)); + file.Write(&fSettings.click_speed, sizeof(fSettings.click_speed)); file.Write(&fCorner, sizeof(BPoint)); } } + +status_t +MouseSettings::InitCheck() +{ + return fInitCheck; +} + + void MouseSettings::SetWindowCorner(BPoint corner) { - fCorner=corner; + fCorner = corner; } + void -MouseSettings::SetMouseType(mouse_type type) +MouseSettings::SetMouseType(int32 type) { - fSettings.type=type; + fSettings.type = type; } + void MouseSettings::SetClickSpeed(bigtime_t click_speed) { - fSettings.click_speed=-(click_speed-1000000); + fSettings.click_speed = -(click_speed-1000000); } + void MouseSettings::SetMouseSpeed(int32 accel) { diff --git a/src/prefs/mouse/MouseSettings.h b/src/prefs/mouse/MouseSettings.h index 4e126ad317..1276c42598 100644 --- a/src/prefs/mouse/MouseSettings.h +++ b/src/prefs/mouse/MouseSettings.h @@ -1,16 +1,24 @@ +// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ +// +// Copyright (c) 2003, OpenBeOS +// +// This software is part of the OpenBeOS distribution and is covered +// by the OpenBeOS license. +// +// +// File: MouseSettings.h +// Author: Jérôme Duval, Andrew McCall (mccall@digitalparadise.co.uk) +// Description: Media Preferences +// Created : December 10, 2003 +// +// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ + #ifndef MOUSE_SETTINGS_H_ #define MOUSE_SETTINGS_H_ #include #include -typedef enum { - MOUSE_1_BUTTON = 1, - MOUSE_2_BUTTON, - MOUSE_3_BUTTON -} mouse_type; - - typedef struct { bool enabled; // Acceleration on / off int32 accel_factor; // accel factor: 256 = step by 1, 128 = step by 1/2 @@ -18,7 +26,7 @@ typedef struct { } mouse_accel; typedef struct { - mouse_type type; + int32 type; mouse_map map; mouse_accel accel; bigtime_t click_speed; @@ -28,18 +36,19 @@ class MouseSettings{ public : MouseSettings(); ~MouseSettings(); + status_t InitCheck(); BPoint WindowCorner() const { return fCorner; } void SetWindowCorner(BPoint corner); - mouse_type MouseType() const { return fSettings.type; } - void SetMouseType(mouse_type type); + int32 MouseType() const { return fSettings.type; } + void SetMouseType(int32 type); bigtime_t ClickSpeed() const { return -(fSettings.click_speed-1000000); } // -1000000 to correct the Sliders 0-100000 scale void SetClickSpeed(bigtime_t click_speed); int32 MouseSpeed() const { return fSettings.accel.speed; } void SetMouseSpeed(int32 speed); private: - static const char kMouseSettingsFile[]; + status_t fInitCheck; BPoint fCorner; mouse_settings fSettings; }; diff --git a/src/prefs/mouse/MouseView.cpp b/src/prefs/mouse/MouseView.cpp index dcc7dd62de..be1ff8a4d9 100644 --- a/src/prefs/mouse/MouseView.cpp +++ b/src/prefs/mouse/MouseView.cpp @@ -1,8 +1,18 @@ -/* - - MouseView.cpp - -*/ +// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ +// +// Copyright (c) 2003, OpenBeOS +// +// This software is part of the OpenBeOS distribution and is covered +// by the OpenBeOS license. +// +// +// File: MouseView.cpp +// Author: Jérôme Duval, Andrew McCall (mccall@digitalparadise.co.uk) +// Description: Media Preferences +// Created : December 10, 2003 +// +// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ + #include #include #include @@ -13,21 +23,68 @@ #include #include #include +#include +#include #include "MouseView.h" #include "MouseMessages.h" +#include "MouseBitmap.h" + +BoxView::BoxView(BRect rect, MouseView *mouseView) + : BBox(rect, "mouse_box", + B_FOLLOW_LEFT, B_WILL_DRAW,B_FANCY_BORDER), + fMouseView(mouseView) +{ +} + + +void +BoxView::MouseDown(BPoint where) +{ + + int32 index = fMouseView->mouseTypeMenu->IndexOf(fMouseView->mouseTypeMenu->FindMarked()); + + fMouseView->fCurrentButton = -1; + if ((index == 0) && BRect(50,41,105,73).Contains(where)) + fMouseView->fCurrentButton = 0; + else if (index == 1) { + if(BRect(50,41,77,73).Contains(where)) + fMouseView->fCurrentButton = 0; + else if (BRect(77,41,105,73).Contains(where)) + fMouseView->fCurrentButton = 1; + } else { + if(BRect(50,41,68,73).Contains(where)) + fMouseView->fCurrentButton = 0; + else if (BRect(86,41,105,73).Contains(where)) + fMouseView->fCurrentButton = 1; + else if (BRect(68,41,86,73).Contains(where)) + fMouseView->fCurrentButton = 2; + } + + if (fMouseView->fCurrentButton >= 0) { + int32 number = 0; + switch (fMouseView->fCurrentMouseMap.button[fMouseView->fCurrentButton]) { + case B_PRIMARY_MOUSE_BUTTON: number = 0; break; + case B_SECONDARY_MOUSE_BUTTON: number = 1; break; + case B_TERTIARY_MOUSE_BUTTON: number = 2; break; + } + fMouseView->mouseMapMenu->ItemAt(number)->SetMarked(true); + ConvertToScreen(&where); + fMouseView->mouseMapMenu->Go(where, true); + } +} MouseView::MouseView(BRect rect) : BBox(rect, "mouse_view", - B_FOLLOW_ALL, B_WILL_DRAW | B_FRAME_EVENTS | B_NAVIGABLE_JUMP, - B_PLAIN_BORDER) + B_FOLLOW_ALL, B_WILL_DRAW | B_FRAME_EVENTS | B_NAVIGABLE_JUMP | B_PULSE_NEEDED, + B_PLAIN_BORDER), + fCurrentButton(-1), + fButtons(0), + fOldButtons(0) { BRect frame; - BButton *button; BTextControl *textcontrol; - BSlider *slider; - BPopUpMenu *popupmenu; BMenuField *menufield; SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); @@ -36,16 +93,25 @@ MouseView::MouseView(BRect rect) fSpeedBitmap = BTranslationUtils::GetBitmap("speed_bmap"); fAccelerationBitmap = BTranslationUtils::GetBitmap("acceleration_bmap"); + // i don't really understand this bitmap SetBits : i have to substract 4 lines and add 15 pixels + BRect mouseRect(0,0,kMouseWidth-1,kMouseHeight-5); + fMouseBitmap = new BBitmap(mouseRect, B_CMAP8); + fMouseBitmap->SetBits(kMouseBits, kMouseWidth*kMouseHeight + 15, 0, kMouseColorSpace); + + BRect mouseDownRect(0,0,kMouseDownWidth-1,kMouseDownHeight-1); + fMouseDownBitmap = new BBitmap(mouseDownRect, B_CMAP8); + fMouseDownBitmap->SetBits(kMouseDownBits, kMouseDownWidth*kMouseDownHeight + 30, 0, kMouseDownColorSpace); + // Add the "Default" button.. frame.Set(10,259,85,279); - button = new BButton(frame,"mouse_defaults","Defaults", new BMessage(BUTTON_DEFAULTS)); - AddChild(button); + defaultButton = new BButton(frame,"mouse_defaults","Defaults", new BMessage(BUTTON_DEFAULTS)); + AddChild(defaultButton); // Add the "Revert" button... frame.Set(92,259,167,279); - button = new BButton(frame,"mouse_revert","Revert", new BMessage(BUTTON_REVERT)); - button->SetEnabled(false); - AddChild(button); + revertButton = new BButton(frame,"mouse_revert","Revert", new BMessage(BUTTON_REVERT)); + revertButton->SetEnabled(false); + AddChild(revertButton); // Create the main box for the controls... frame=Bounds(); @@ -53,58 +119,61 @@ MouseView::MouseView(BRect rect) frame.top=frame.top+11; frame.right=frame.right-11; frame.bottom=frame.bottom-44; - fBox = new BBox(frame,"mouse_box",B_FOLLOW_LEFT,B_WILL_DRAW,B_FANCY_BORDER); + fBox = new BoxView(frame, this); // Add the "Mouse Type" pop up menu - popupmenu = new BPopUpMenu("Mouse Type Menu"); - popupmenu->AddItem(new BMenuItem("1-Button",new BMessage(POPUP_MOUSE_TYPE))); - popupmenu->AddItem(new BMenuItem("2-Button",new BMessage(POPUP_MOUSE_TYPE))); - popupmenu->AddItem(new BMenuItem("3-Button",new BMessage(POPUP_MOUSE_TYPE))); + mouseTypeMenu = new BPopUpMenu("Mouse Type Menu"); + mouseTypeMenu->AddItem(new BMenuItem("1-Button",new BMessage(POPUP_MOUSE_TYPE))); + mouseTypeMenu->AddItem(new BMenuItem("2-Button",new BMessage(POPUP_MOUSE_TYPE))); + mouseTypeMenu->AddItem(new BMenuItem("3-Button",new BMessage(POPUP_MOUSE_TYPE))); - frame.Set(18,10,208,20); - menufield = new BMenuField(frame, "mouse_type", "Mouse Type", popupmenu); - menufield->SetDivider(menufield->Divider() - 30); + frame.Set(17,8,208,20); + menufield = new BMenuField(frame, "mouse_type", "Mouse type", mouseTypeMenu); + menufield->SetDivider(menufield->Divider() - 34); fBox->AddChild(menufield); - // Add the "Mouse Type" pop up menu - popupmenu = new BPopUpMenu("Focus Follows Mouse Menu"); - popupmenu->AddItem(new BMenuItem("Disabled",new BMessage(BUTTON_REVERT))); - popupmenu->AddItem(new BMenuItem("Enabled",new BMessage(BUTTON_REVERT))); - popupmenu->AddItem(new BMenuItem("Warping",new BMessage(BUTTON_REVERT))); - popupmenu->AddItem(new BMenuItem("Instant-Warping",new BMessage(BUTTON_REVERT))); + // Add the "Focus follows mouse" pop up menu + focusMenu = new BPopUpMenu("Focus Follows Mouse Menu"); + focusMenu->AddItem(new BMenuItem("Disabled",new BMessage(POPUP_MOUSE_FOCUS))); + focusMenu->AddItem(new BMenuItem("Enabled",new BMessage(POPUP_MOUSE_FOCUS))); + focusMenu->AddItem(new BMenuItem("Warping",new BMessage(POPUP_MOUSE_FOCUS))); + focusMenu->AddItem(new BMenuItem("Instant-Warping",new BMessage(POPUP_MOUSE_FOCUS))); - frame.Set(168,207,440,200); - menufield = new BMenuField(frame, "Focus follows mouse", "Focus follows mouse:", popupmenu); - menufield->SetDivider(menufield->Divider() - 30); + frame.Set(165,208,440,200); + menufield = new BMenuField(frame, "Focus follows mouse", "Focus follows mouse:", focusMenu); + menufield->SetDivider(menufield->Divider() - 32); fBox->AddChild(menufield); // Create the "Double-click speed slider... - frame.Set(168,10,328,50); - slider = new BSlider(frame,"double_click_speed","Double-click speed", new BMessage(SLIDER_DOUBLE_CLICK_SPEED),0,1000000,B_BLOCK_THUMB,B_FOLLOW_LEFT,B_WILL_DRAW); - slider->SetHashMarks(B_HASH_MARKS_BOTTOM); - slider->SetHashMarkCount(5); - slider->SetLimitLabels("Slow","Fast"); - fBox->AddChild(slider); + frame.Set(166,11,328,50); + dcSpeedSlider = new BSlider(frame,"double_click_speed","Double-click speed", + new BMessage(SLIDER_DOUBLE_CLICK_SPEED),0,1000,B_BLOCK_THUMB,B_FOLLOW_LEFT,B_WILL_DRAW); + dcSpeedSlider->SetHashMarks(B_HASH_MARKS_BOTTOM); + dcSpeedSlider->SetHashMarkCount(5); + dcSpeedSlider->SetLimitLabels("Slow","Fast"); + fBox->AddChild(dcSpeedSlider); // Create the "Mouse Speed" slider... - frame.Set(168,75,328,125); - slider = new BSlider(frame,"mouse_speed","Mouse Speed", new BMessage(SLIDER_MOUSE_SPEED),8192,524287,B_BLOCK_THUMB,B_FOLLOW_LEFT,B_WILL_DRAW); - slider->SetHashMarks(B_HASH_MARKS_BOTTOM); - slider->SetHashMarkCount(7); - slider->SetLimitLabels("Slow","Fast"); - fBox->AddChild(slider); + frame.Set(166,76,328,125); + mouseSpeedSlider = new BSlider(frame,"mouse_speed","Mouse Speed", + new BMessage(SLIDER_MOUSE_SPEED),0,1000,B_BLOCK_THUMB,B_FOLLOW_LEFT,B_WILL_DRAW); + mouseSpeedSlider->SetHashMarks(B_HASH_MARKS_BOTTOM); + mouseSpeedSlider->SetHashMarkCount(7); + mouseSpeedSlider->SetLimitLabels("Slow","Fast"); + fBox->AddChild(mouseSpeedSlider); // Create the "Mouse Acceleration" slider... - frame.Set(168,140,328,190); - slider = new BSlider(frame,"mouse_acceleration","Mouse Acceleration", new BMessage(SLIDER_MOUSE_SPEED),250000,1000000,B_BLOCK_THUMB,B_FOLLOW_LEFT,B_WILL_DRAW); - slider->SetHashMarks(B_HASH_MARKS_BOTTOM); - slider->SetHashMarkCount(5); - slider->SetLimitLabels("Slow","Fast"); - fBox->AddChild(slider); + frame.Set(166,141,328,190); + mouseAccSlider = new BSlider(frame,"mouse_acceleration","Mouse Acceleration", + new BMessage(SLIDER_MOUSE_ACC),0,1000,B_BLOCK_THUMB,B_FOLLOW_LEFT,B_WILL_DRAW); + mouseAccSlider->SetHashMarks(B_HASH_MARKS_BOTTOM); + mouseAccSlider->SetHashMarkCount(5); + mouseAccSlider->SetLimitLabels("Slow","Fast"); + fBox->AddChild(mouseAccSlider); // Create the "Double-click test area" text box... frame=fBox->Bounds(); - frame.left=frame.left+10; + frame.left=frame.left+9; frame.right=frame.right-230; frame.top=frame.bottom-30; textcontrol = new BTextControl(frame,"double_click_test_area",NULL,"Double-click test area", new BMessage(DOUBLE_CLICK_TEST_AREA),B_FOLLOW_LEFT,B_WILL_DRAW); @@ -113,25 +182,198 @@ MouseView::MouseView(BRect rect) AddChild(fBox); + mouseMapMenu = new BPopUpMenu("Mouse Map Menu", true, true); + mouseMapMenu->AddItem(new BMenuItem("1",new BMessage(POPUP_MOUSE_MAP))); + mouseMapMenu->AddItem(new BMenuItem("2",new BMessage(POPUP_MOUSE_MAP))); + mouseMapMenu->AddItem(new BMenuItem("3",new BMessage(POPUP_MOUSE_MAP))); + } -void MouseView::Draw(BRect updateFrame) + +void +MouseView::AttachedToWindow() +{ + get_click_speed(&fClickSpeed); + get_mouse_speed(&fMouseSpeed); + get_mouse_acceleration(&fMouseAcc); + get_mouse_type(&fMouseType); + fMouseMode = mouse_mode(); + get_mouse_map(&fMouseMap); + get_mouse_map(&fCurrentMouseMap); + Init(); + + mouseMapMenu->SetTargetForItems( this->Window() ); +} + + +void +MouseView::Pulse() +{ + BPoint point; + GetMouse(&point, &fButtons, true); + + if (fOldButtons != fButtons) { + Invalidate(); + fOldButtons = fButtons; + } +} + + +void +MouseView::Draw(BRect updateFrame) { inherited::Draw(updateFrame); fBox->SetHighColor(120,120,120); fBox->SetLowColor(255,255,255); // Line above the test area - fBox->StrokeLine(BPoint(10,199),BPoint(150,199),B_SOLID_HIGH); - fBox->StrokeLine(BPoint(11,200),BPoint(150,200),B_SOLID_LOW); + fBox->StrokeLine(BPoint(8,198),BPoint(149,198),B_SOLID_HIGH); + fBox->StrokeLine(BPoint(8,199),BPoint(149,199),B_SOLID_LOW); // Line above focus follows mouse - fBox->StrokeLine(BPoint(170,199),BPoint(362,199),B_SOLID_HIGH); - fBox->StrokeLine(BPoint(171,200),BPoint(362,200),B_SOLID_LOW); + fBox->StrokeLine(BPoint(164,198),BPoint(367,198),B_SOLID_HIGH); + fBox->StrokeLine(BPoint(164,199),BPoint(367,199),B_SOLID_LOW); // Line in the middle - fBox->StrokeLine(BPoint(160,10),BPoint(160,230),B_SOLID_HIGH); - fBox->StrokeLine(BPoint(161,11),BPoint(161,230),B_SOLID_LOW); - //Draw the icons - fBox->DrawBitmap(fDoubleClickBitmap,BPoint(341,20)); - fBox->DrawBitmap(fSpeedBitmap,BPoint(331,90)); - fBox->DrawBitmap(fAccelerationBitmap,BPoint(331,155)); + fBox->StrokeLine(BPoint(156,10),BPoint(156,230),B_SOLID_HIGH); + fBox->StrokeLine(BPoint(157,11),BPoint(157,230),B_SOLID_LOW); + // Draw the icons + fBox->DrawBitmap(fDoubleClickBitmap,BPoint(344,16)); + fBox->DrawBitmap(fSpeedBitmap,BPoint(333,90)); + fBox->DrawBitmap(fAccelerationBitmap,BPoint(333,155)); + fBox->SetDrawingMode(B_OP_OVER); + + // Draw the mouse top + fBox->DrawBitmap(fMouseBitmap,BPoint(50, 41)); + int32 index = mouseTypeMenu->IndexOf(mouseTypeMenu->FindMarked()); + if (index == 0) { // 1 button + if (fButtons & fCurrentMouseMap.button[0]) { + fBox->DrawBitmap(fMouseDownBitmap,BPoint(50, 47)); + fBox->SetHighColor(64,64,64); + } + } else if (index == 1) { // 2 button + if ( fButtons & fCurrentMouseMap.button[0]) { + fBox->DrawBitmap(fMouseDownBitmap, BRect(0,0,27,28), BRect(50,47,77,75)); + fBox->SetHighColor(120,120,120); + } else + fBox->SetHighColor(184,184,184); + fBox->StrokeLine(BPoint(76,49),BPoint(76,71),B_SOLID_HIGH); + + if (fButtons & fCurrentMouseMap.button[1]) { + fBox->SetHighColor(120,120,120); + fBox->DrawBitmap(fMouseDownBitmap, BRect(27,0,54,28), BRect(77,47,104,75)); + } else + fBox->SetHighColor(255,255,255); + fBox->StrokeLine(BPoint(78,49),BPoint(78,71),B_SOLID_HIGH); + + if ((fButtons & fCurrentMouseMap.button[0]) || (fButtons & fCurrentMouseMap.button[1])) + fBox->SetHighColor(48,48,48); + else + fBox->SetHighColor(88,88,88); + fBox->StrokeLine(BPoint(77,48),BPoint(77,72),B_SOLID_HIGH); + + } else { // 3 button + if ( fButtons & fCurrentMouseMap.button[0]) { + fBox->DrawBitmap(fMouseDownBitmap, BRect(0,0,18,28), BRect(50,47,68,75)); + fBox->SetHighColor(120,120,120); + } else + fBox->SetHighColor(184,184,184); + fBox->StrokeLine(BPoint(67,49),BPoint(67,71),B_SOLID_HIGH); + + if (fButtons & fCurrentMouseMap.button[2]) { + fBox->DrawBitmap(fMouseDownBitmap, BRect(18,0,36,28), BRect(68,47,86,75)); + fBox->SetHighColor(120,120,120); + } else + fBox->SetHighColor(184,184,184); + fBox->StrokeLine(BPoint(85,49),BPoint(85,71),B_SOLID_HIGH); + + if (fButtons & fCurrentMouseMap.button[2]) + fBox->SetHighColor(120,120,120); + else + fBox->SetHighColor(255,255,255); + fBox->StrokeLine(BPoint(69,49),BPoint(69,71),B_SOLID_HIGH); + + if (fButtons & fCurrentMouseMap.button[1]) { + fBox->DrawBitmap(fMouseDownBitmap, BRect(36,0,54,28), BRect(86,47,104,75)); + fBox->SetHighColor(120,120,120); + } else + fBox->SetHighColor(255,255,255); + fBox->StrokeLine(BPoint(87,49),BPoint(87,71),B_SOLID_HIGH); + + if ((fButtons & fCurrentMouseMap.button[0]) || (fButtons & fCurrentMouseMap.button[2])) + fBox->SetHighColor(48,48,48); + else + fBox->SetHighColor(88,88,88); + fBox->StrokeLine(BPoint(68,48),BPoint(68,72),B_SOLID_HIGH); + + if ((fButtons & fCurrentMouseMap.button[2]) || (fButtons & fCurrentMouseMap.button[1])) + fBox->SetHighColor(48,48,48); + else + fBox->SetHighColor(88,88,88); + fBox->StrokeLine(BPoint(86,48),BPoint(86,72),B_SOLID_HIGH); + + } + + fBox->SetHighColor(32,32,32); + fBox->SetFont(be_plain_font); + for(int32 i=0; iMovePenTo(offsets[index][i], 65); + fBox->DrawString(number); + } + + fBox->SetDrawingMode(B_OP_COPY); } + + +void +MouseView::Init() +{ + int32 value; + // slow = 1000000, fast = 0 + value = (int32) ((1000000 - fClickSpeed) / 1000); + if (value > 1000) value = 1000; + if (value < 0) value = 0; + dcSpeedSlider->SetValue(value); + + // slow = 8192, fast = 524287 + value = (int32) (( log(fMouseSpeed / 8192) / log(2)) * 1000 / 6); + if (value > 1000) value = 1000; + if (value < 0) value = 0; + mouseSpeedSlider->SetValue(value); + + // slow = 0, fast = 262144 + value = (int32) (sqrt(fMouseAcc / 16384) * 1000 / 4); + if (value > 1000) value = 1000; + if (value < 0) value = 0; + mouseAccSlider->SetValue(value); + + if (fMouseType < 1) + fMouseType = 1; + if (fMouseType > 3) + fMouseType = 3; + BMenuItem *item = mouseTypeMenu->ItemAt(fMouseType - 1); + if (item) + item->SetMarked(true); + + int32 mode; + switch(fMouseMode) { + case B_NORMAL_MOUSE: mode = 0; break; + case B_FOCUS_FOLLOWS_MOUSE: mode = 1; break; + case B_WARP_MOUSE: mode = 2; break; + case B_INSTANT_WARP_MOUSE: mode = 3; break; + default : mode = 0; break; + } + item = focusMenu->ItemAt(mode); + if (item) + item->SetMarked(true); + + printf("click_speed : %lli, mouse_speed : %li, mouse_acc : %li, mouse_type : %li\n", + fClickSpeed, fMouseSpeed, fMouseAcc, fMouseType); +} \ No newline at end of file diff --git a/src/prefs/mouse/MouseView.h b/src/prefs/mouse/MouseView.h index 5da3d008b6..eb1a0b3285 100644 --- a/src/prefs/mouse/MouseView.h +++ b/src/prefs/mouse/MouseView.h @@ -1,14 +1,25 @@ -/* - - MouseView.h - -*/ - +// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ +// +// Copyright (c) 2003, OpenBeOS +// +// This software is part of the OpenBeOS distribution and is covered +// by the OpenBeOS license. +// +// +// File: MouseView.h +// Author: Jérôme Duval, Andrew McCall (mccall@digitalparadise.co.uk) +// Description: Media Preferences +// Created : December 10, 2003 +// +// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ #ifndef MOUSE_VIEW_H #define MOUSE_VIEW_H #include #include +#include +#include +#include class MouseView : public BBox { @@ -16,14 +27,41 @@ public: typedef BBox inherited; MouseView(BRect frame); + void AttachedToWindow(); virtual void Draw(BRect frame); - -private: - BBox *fBox; + virtual void Pulse(); + void Init(); + + BButton *defaultButton, *revertButton; + BSlider *dcSpeedSlider, *mouseSpeedSlider, *mouseAccSlider; + BPopUpMenu *mouseTypeMenu, *focusMenu, *mouseMapMenu; + + bigtime_t fClickSpeed; + int32 fMouseSpeed; + int32 fMouseAcc; + int32 fMouseType; + mode_mouse fMouseMode; + mouse_map fMouseMap, fCurrentMouseMap; + int32 fCurrentButton; + uint32 fButtons; + uint32 fOldButtons; + +private: + BBox *fBox; + + BBitmap *fDoubleClickBitmap, *fSpeedBitmap, *fAccelerationBitmap; + BBitmap *fMouseBitmap, *fMouseDownBitmap; - BBitmap *fDoubleClickBitmap; - BBitmap *fSpeedBitmap; - BBitmap *fAccelerationBitmap; }; +class BoxView : public BBox +{ +public: + BoxView(BRect frame, MouseView *mouseView); + void MouseDown(BPoint where); +private: + MouseView *fMouseView; +}; + + #endif diff --git a/src/prefs/mouse/MouseWindow.cpp b/src/prefs/mouse/MouseWindow.cpp index 65ad2429d7..e2395bf3cc 100644 --- a/src/prefs/mouse/MouseWindow.cpp +++ b/src/prefs/mouse/MouseWindow.cpp @@ -1,9 +1,18 @@ -/* - * MouseWindow.cpp - * Mouse mccall@digitalparadise.co.uk - * - */ - +// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ +// +// Copyright (c) 2003, OpenBeOS +// +// This software is part of the OpenBeOS distribution and is covered +// by the OpenBeOS license. +// +// +// File: MouseWindow.cpp +// Author: Jérôme Duval, Andrew McCall (mccall@digitalparadise.co.uk) +// Description: Media Preferences +// Created : December 10, 2003 +// +// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ +#include #include #include #include @@ -12,74 +21,28 @@ #include #include #include -#include +#include +#include #include "MouseMessages.h" #include "MouseWindow.h" #include "MouseView.h" -#include "Mouse.h" -#define MOUSE_WINDOW_RIGHT 397 -#define MOUSE_WINDOW_BOTTTOM 293 - -MouseWindow::MouseWindow() - : BWindow(BRect(0,0,MOUSE_WINDOW_RIGHT,MOUSE_WINDOW_BOTTTOM), "Mouse", B_TITLED_WINDOW, B_NOT_RESIZABLE | B_NOT_ZOOMABLE ) +MouseWindow::MouseWindow(BRect rect) + : BWindow(rect, "Mouse", B_TITLED_WINDOW, B_NOT_RESIZABLE | B_NOT_ZOOMABLE ) { - BScreen screen; - BSlider *slider=NULL; - BMenuField *menufield=NULL; - - MoveTo(dynamic_cast(be_app)->WindowCorner()); - - // Code to make sure that the window doesn't get drawn off screen... - if (!(screen.Frame().right >= Frame().right && screen.Frame().bottom >= Frame().bottom)) - MoveTo((screen.Frame().right-Bounds().right)*.5,(screen.Frame().bottom-Bounds().bottom)*.5); - - BuildView(); - AddChild(fView); - - - menufield = (BMenuField *)FindView("mouse_type"); - if (menufield !=NULL) - menufield->Menu()->ItemAt((dynamic_cast(be_app)->MouseType())-1)->SetMarked(true); - - slider = (BSlider *)FindView("double_click_speed"); - if (slider !=NULL) slider->SetValue((dynamic_cast(be_app)->ClickSpeed())); - - slider = (BSlider *)FindView("mouse_speed"); - if (slider !=NULL) slider->SetValue((dynamic_cast(be_app)->MouseSpeed())); - Show(); - + AddChild(fView = new MouseView(Bounds())); + if(fSettings.InitCheck() != B_OK) + PostMessage(ERROR_DETECTED); + SetPulseRate(100000); } -void -MouseWindow::BuildView() -{ - fView = new MouseView(Bounds()); -} bool MouseWindow::QuitRequested() { - - BSlider *slider=NULL; - BMenuField *menufield=NULL; - - dynamic_cast(be_app)->SetWindowCorner(BPoint(Frame().left,Frame().top)); - - slider = (BSlider *)FindView("double_click_speed"); - if (slider !=NULL) - dynamic_cast(be_app)->SetClickSpeed(slider->Value()); - - - - menufield = (BMenuField *)FindView("mouse_type"); - if (menufield !=NULL) { - BMenu *menu; - menu = menufield->Menu(); - dynamic_cast(be_app)->SetMouseType((mouse_type)(menu->IndexOf(menu->FindMarked())+1)); - } - + fSettings.SetWindowCorner(Frame().LeftTop()); + be_app->PostMessage(B_QUIT_REQUESTED); return(true); } @@ -87,30 +50,109 @@ MouseWindow::QuitRequested() void MouseWindow::MessageReceived(BMessage *message) { - BSlider *slider=NULL; - BButton *button=NULL; - BMenuField *menufield=NULL; - + switch(message->what) { case BUTTON_DEFAULTS: { - if (set_click_speed(500000)!=B_OK) - be_app->PostMessage(ERROR_DETECTED); - slider = (BSlider *)FindView("double_click_speed"); - if (slider !=NULL) slider->SetValue(500000); + fView->dcSpeedSlider->SetValue(500); + fView->dcSpeedSlider->Invoke(); + fView->mouseSpeedSlider->SetValue(500); + fView->mouseSpeedSlider->Invoke(); + fView->mouseAccSlider->SetValue(500); + fView->mouseAccSlider->Invoke(); + fView->focusMenu->ItemAt(0)->SetMarked(true); + set_mouse_type(3); + fView->mouseTypeMenu->ItemAt(2)->SetMarked(true); + set_mouse_mode(B_NORMAL_MOUSE); + fView->fCurrentMouseMap.button[0] = B_PRIMARY_MOUSE_BUTTON; + fView->fCurrentMouseMap.button[1] = B_SECONDARY_MOUSE_BUTTON; + fView->fCurrentMouseMap.button[2] = B_TERTIARY_MOUSE_BUTTON; + set_mouse_map(&fView->fCurrentMouseMap); - button = (BButton *)FindView("mouse_revert"); - if (button !=NULL) button->SetEnabled(true); + fView->revertButton->SetEnabled(true); + } + break; + case BUTTON_REVERT: { + fView->Init(); + set_mouse_type(fView->fMouseType); + set_mouse_mode(fView->fMouseMode); + set_click_speed(fView->fClickSpeed); + set_mouse_speed(fView->fMouseSpeed); + set_mouse_acceleration(fView->fMouseAcc); + set_mouse_map(&fView->fMouseMap); + get_mouse_map(&fView->fCurrentMouseMap); + + fView->revertButton->SetEnabled(false); } break; case POPUP_MOUSE_TYPE: { - beep(); - menufield = (BMenuField *)FindView("mouse_type"); - if (menufield !=NULL) { - BMenu *menu; - menu = menufield->Menu(); - if (set_mouse_type(menu->IndexOf(menu->FindMarked())+1) !=B_OK) - be_app->PostMessage(ERROR_DETECTED); + status_t err = set_mouse_type(fView->mouseTypeMenu->IndexOf(fView->mouseTypeMenu->FindMarked())+1); + if(err < B_OK) + printf("error while setting mouse type : %s\n", strerror(err)); + fView->revertButton->SetEnabled(true); + } + break; + case POPUP_MOUSE_FOCUS: { + mode_mouse mouse_mode = B_NORMAL_MOUSE; + switch (fView->focusMenu->IndexOf(fView->focusMenu->FindMarked())) { + case 0: mouse_mode = B_NORMAL_MOUSE; break; + case 1: mouse_mode = B_FOCUS_FOLLOWS_MOUSE; break; + case 2: mouse_mode = B_WARP_MOUSE; break; + case 3: mouse_mode = B_INSTANT_WARP_MOUSE; break; } + set_mouse_mode(mouse_mode); + fView->revertButton->SetEnabled(true); + } + break; + case SLIDER_DOUBLE_CLICK_SPEED: { + int32 value = fView->dcSpeedSlider->Value(); + int32 click_speed; // slow = 1000000, fast = 0 + click_speed = (int32) (1000000 - value * 1000); + status_t err = set_click_speed(click_speed); + if(err < B_OK) + printf("error while setting click speed : %s\n", strerror(err)); + fView->revertButton->SetEnabled(true); + } + break; + case SLIDER_MOUSE_SPEED: { + int32 value = fView->mouseSpeedSlider->Value(); + int32 mouse_speed; // slow = 8192, fast = 524287 + mouse_speed = (int32) pow(2, value * 6 / 1000) * 8192; + status_t err = set_mouse_speed(mouse_speed); + if(err < B_OK) + printf("error while setting mouse speed : %s\n", strerror(err)); + fView->revertButton->SetEnabled(true); + } + break; + case SLIDER_MOUSE_ACC: { + int32 value = fView->mouseAccSlider->Value(); + int32 mouse_acc; // slow = 0, fast = 262144 + mouse_acc = (int32) pow(value * 4 / 1000, 2) * 16384; + status_t err = set_mouse_acceleration(mouse_acc); + if(err < B_OK) + printf("error while setting mouse acceleration : %s\n", strerror(err)); + fView->revertButton->SetEnabled(true); + } + break; + case POPUP_MOUSE_MAP: { + int32 index = fView->mouseMapMenu->IndexOf(fView->mouseMapMenu->FindMarked()); + int32 number = B_PRIMARY_MOUSE_BUTTON; + switch (index) { + case 0: number = B_PRIMARY_MOUSE_BUTTON; break; + case 1: number = B_SECONDARY_MOUSE_BUTTON; break; + case 2: number = B_TERTIARY_MOUSE_BUTTON; break; + } + fView->fCurrentMouseMap.button[fView->fCurrentButton] = number; + status_t err = set_mouse_map(&fView->fCurrentMouseMap); + fView->fCurrentButton = -1; + if(err < B_OK) + printf("error while setting mouse map : %s\n", strerror(err)); + fView->revertButton->SetEnabled(true); + } + break; + case ERROR_DETECTED: { + (new BAlert("Error", "Something has gone wrong!","OK",NULL,NULL, + B_WIDTH_AS_USUAL, B_OFFSET_SPACING, B_WARNING_ALERT))->Go(); + be_app->PostMessage(B_QUIT_REQUESTED); } break; default: @@ -119,8 +161,3 @@ MouseWindow::MessageReceived(BMessage *message) } } - -MouseWindow::~MouseWindow() -{ - -} diff --git a/src/prefs/mouse/MouseWindow.h b/src/prefs/mouse/MouseWindow.h index 228726a16e..5b21be154c 100644 --- a/src/prefs/mouse/MouseWindow.h +++ b/src/prefs/mouse/MouseWindow.h @@ -1,3 +1,17 @@ +// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ +// +// Copyright (c) 2003, OpenBeOS +// +// This software is part of the OpenBeOS distribution and is covered +// by the OpenBeOS license. +// +// +// File: MouseWindow.h +// Author: Jérôme Duval, Andrew McCall (mccall@digitalparadise.co.uk) +// Description: Media Preferences +// Created : December 10, 2003 +// +// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ #ifndef MOUSE_WINDOW_H #define MOUSE_WINDOW_H @@ -9,16 +23,14 @@ class MouseWindow : public BWindow { public: - MouseWindow(); - ~MouseWindow(); + MouseWindow(BRect rect); bool QuitRequested(); void MessageReceived(BMessage *message); - void BuildView(); - + + MouseSettings fSettings; private: MouseView *fView; - }; #endif