Author: brecht Date: 2009-10-22 23:10:19 +0200 (Thu, 22 Oct 2009) New Revision: 33732 Changeset: http://dev.haiku-os.org/changeset/33732/haiku Modified: haiku/trunk/headers/os/interface/InterfaceDefs.h haiku/trunk/headers/private/app/ServerProtocol.h haiku/trunk/src/kits/interface/InterfaceDefs.cpp haiku/trunk/src/kits/interface/MenuBar.cpp haiku/trunk/src/preferences/mouse/MouseConstants.h haiku/trunk/src/preferences/mouse/MouseSettings.cpp haiku/trunk/src/preferences/mouse/MouseSettings.h haiku/trunk/src/preferences/mouse/MouseView.cpp haiku/trunk/src/preferences/mouse/MouseView.h haiku/trunk/src/preferences/mouse/MouseWindow.cpp haiku/trunk/src/preferences/mouse/MouseWindow.h haiku/trunk/src/preferences/mouse/SettingsView.cpp haiku/trunk/src/preferences/mouse/SettingsView.h haiku/trunk/src/servers/app/DefaultDecorator.cpp haiku/trunk/src/servers/app/DefaultDecorator.h haiku/trunk/src/servers/app/Desktop.cpp haiku/trunk/src/servers/app/Desktop.h haiku/trunk/src/servers/app/DesktopSettings.cpp haiku/trunk/src/servers/app/DesktopSettings.h haiku/trunk/src/servers/app/DesktopSettingsPrivate.h haiku/trunk/src/servers/app/ProfileMessageSupport.cpp haiku/trunk/src/servers/app/ServerApp.cpp haiku/trunk/src/servers/app/ServerWindow.cpp haiku/trunk/src/servers/app/Window.cpp haiku/trunk/src/servers/app/Window.h haiku/trunk/src/servers/input/MouseSettings.cpp haiku/trunk/src/servers/input/MouseSettings.h Log: * added click to focus mouse mode; right-click for bring-to-front and send-to-back (might cause some regressions in FFM) * made accept first click user configurable * updated the Mouse preflet to use the layout kit * removed the warp and instant warp modes from the Mouse preflet * changed internal representation of mouse modes (warp modes moved) * coding style fixes Modified: haiku/trunk/headers/os/interface/InterfaceDefs.h =================================================================== --- haiku/trunk/headers/os/interface/InterfaceDefs.h 2009-10-22 20:36:45 UTC (rev 33731) +++ haiku/trunk/headers/os/interface/InterfaceDefs.h 2009-10-22 21:10:19 UTC (rev 33732) @@ -160,12 +160,17 @@ enum mode_mouse { B_NORMAL_MOUSE = 0, - B_FOCUS_FOLLOWS_MOUSE = 1, - B_WARP_MOUSE = 3, - B_INSTANT_WARP_MOUSE = 7 + B_CLICK_TO_FOCUS_MOUSE = -1, + B_FOCUS_FOLLOWS_MOUSE = 1 }; +enum mode_focus_follows_mouse { + B_NORMAL_FOCUS_FOLLOWS_MOUSE = 0, + B_WARP_FOCUS_FOLLOWS_MOUSE = 1, + B_INSTANT_WARP_FOCUS_FOLLOWS_MOUSE = 2 +}; + // View orientation/alignment/style enum border_style { @@ -372,6 +377,12 @@ void set_mouse_mode(mode_mouse mode); mode_mouse mouse_mode(); +void set_focus_follows_mouse_mode(mode_focus_follows_mouse mode); +mode_focus_follows_mouse focus_follows_mouse_mode(); + +void set_accept_first_click(bool acceptFirstClick); +bool accept_first_click(); + rgb_color ui_color(color_which which); void set_ui_color(const color_which& which, const rgb_color& color); rgb_color tint_color(rgb_color color, float tint); Modified: haiku/trunk/headers/private/app/ServerProtocol.h =================================================================== --- haiku/trunk/headers/private/app/ServerProtocol.h 2009-10-22 20:36:45 UTC (rev 33731) +++ haiku/trunk/headers/private/app/ServerProtocol.h 2009-10-22 21:10:19 UTC (rev 33732) @@ -195,6 +195,10 @@ AS_IDLE_TIME, AS_SET_MOUSE_MODE, AS_GET_MOUSE_MODE, + AS_SET_FOCUS_FOLLOWS_MOUSE_MODE, + AS_GET_FOCUS_FOLLOWS_MOUSE_MODE, + AS_SET_ACCEPT_FIRST_CLICK, + AS_GET_ACCEPT_FIRST_CLICK, AS_GET_MOUSE, AS_SET_DECORATOR_SETTINGS, AS_GET_DECORATOR_SETTINGS, Modified: haiku/trunk/src/kits/interface/InterfaceDefs.cpp =================================================================== --- haiku/trunk/src/kits/interface/InterfaceDefs.cpp 2009-10-22 20:36:45 UTC (rev 33731) +++ haiku/trunk/src/kits/interface/InterfaceDefs.cpp 2009-10-22 21:10:19 UTC (rev 33732) @@ -100,7 +100,8 @@ Returns \c true if the mode is known. */ bool -get_mode_parameter(uint32 mode, int32& width, int32& height, uint32& colorSpace) +get_mode_parameter(uint32 mode, int32& width, int32& height, + uint32& colorSpace) { switch (mode) { case B_8_BIT_640x480: @@ -456,7 +457,8 @@ BMessage command(IS_SET_MOUSE_MAP); BMessage reply; - status_t err = command.AddData("mousemap", B_RAW_TYPE, map, sizeof(mouse_map)); + status_t err = command.AddData("mousemap", B_RAW_TYPE, map, + sizeof(mouse_map)); if (err != B_OK) return err; return _control_input_server_(&command, &reply); @@ -652,12 +654,14 @@ _control_input_server_(&command, &reply); - if (reply.FindData("keymap", B_ANY_TYPE, &map_array, &map_count) != B_OK) { + if (reply.FindData("keymap", B_ANY_TYPE, &map_array, &map_count) + != B_OK) { *map = 0; *key_buffer = 0; return; } - if (reply.FindData("key_buffer", B_ANY_TYPE, &key_array, key_buffer_size) != B_OK) { + if (reply.FindData("key_buffer", B_ANY_TYPE, &key_array, key_buffer_size) + != B_OK) { *map = 0; *key_buffer = 0; return; } @@ -852,14 +856,14 @@ set_focus_follows_mouse(bool follow) { // obviously deprecated API - set_mouse_mode(B_WARP_MOUSE); + set_mouse_mode(B_FOCUS_FOLLOWS_MOUSE); } bool focus_follows_mouse() { - return mouse_mode() != B_NORMAL_MOUSE; + return mouse_mode() == B_FOCUS_FOLLOWS_MOUSE; } @@ -876,7 +880,8 @@ mode_mouse mouse_mode() { - // Gets the focus-follows-mouse style, such as normal, B_WARP_MOUSE, etc. + // Gets the mouse focus style, such as activate to click, + // focus to click, ... mode_mouse mode = B_NORMAL_MOUSE; BPrivate::AppServerLink link; @@ -890,6 +895,58 @@ } +void +set_focus_follows_mouse_mode(mode_focus_follows_mouse mode) +{ + BPrivate::AppServerLink link; + link.StartMessage(AS_SET_FOCUS_FOLLOWS_MOUSE_MODE); + link.Attach<mode_focus_follows_mouse>(mode); + link.Flush(); +} + + +mode_focus_follows_mouse +focus_follows_mouse_mode() +{ + mode_focus_follows_mouse mode = B_NORMAL_FOCUS_FOLLOWS_MOUSE; + + BPrivate::AppServerLink link; + link.StartMessage(AS_GET_FOCUS_FOLLOWS_MOUSE_MODE); + + int32 code; + if (link.FlushWithReply(code) == B_OK && code == B_OK) + link.Read<mode_focus_follows_mouse>(&mode); + + return mode; +} + + +void +set_accept_first_click(bool acceptFirstClick) +{ + BPrivate::AppServerLink link; + link.StartMessage(AS_SET_ACCEPT_FIRST_CLICK); + link.Attach<bool>(acceptFirstClick); + link.Flush(); +} + + +bool +accept_first_click() +{ + // Gets the accept first click status + bool acceptFirstClick = false; + + BPrivate::AppServerLink link; + link.StartMessage(AS_GET_ACCEPT_FIRST_CLICK); + + int32 code; + if (link.FlushWithReply(code) == B_OK && code == B_OK) + link.Read<bool>(&acceptFirstClick); + + return accept_first_click; +} + rgb_color ui_color(color_which which) { @@ -900,7 +957,8 @@ } if (be_app) { - server_read_only_memory* shared = BApplication::Private::ServerReadOnlyMemory(); + server_read_only_memory* shared + = BApplication::Private::ServerReadOnlyMemory(); return shared->colors[index]; } @@ -1079,7 +1137,8 @@ /*! - \brief queries the server for the name of the decorator with a certain index + \brief queries the server for the name of the decorator with a certain + index \param index The index of the decorator to get the name for \param name BString to receive the name of the decorator \return B_OK if successful, B_ERROR if not @@ -1323,8 +1382,8 @@ const float* escapementArray, float width, float ellipsisWidth, float size) { float currentWidth = 0.0; - ellipsisWidth /= size; // test if this is as accurate as escapementArray * size - width /= size; + ellipsisWidth /= size; // test if this is as accurate + width /= size; // as escapementArray * size uint32 lastFit = 0, c; for (c = 0; c < numChars; c++) { @@ -1378,7 +1437,8 @@ currentWidth += ellipsisWidth; // go forward again until ellipsis fits (already beyond the target) for (uint32 c2 = c; c2 < numChars; c2++) { -//printf(" backward: %c (%ld) (%.1f - %.1f = %.1f)\n", *dst, c2, currentWidth, escapementArray[c2] * size, currentWidth - escapementArray[c2] * size); +//printf(" backward: %c (%ld) (%.1f - %.1f = %.1f)\n", *dst, c2, currentWidth, escapementArray[c2] * size, +// currentWidth - escapementArray[c2] * size); currentWidth -= escapementArray[c2] * size; do { src++; @@ -1411,7 +1471,8 @@ uint32 left = 0; float leftWidth = 0.0; - while (left < numChars && (leftWidth + (escapementArray[left] * size)) < mid) + while (left < numChars && (leftWidth + (escapementArray[left] * size)) + < mid) leftWidth += (escapementArray[left++] * size); if (left == numChars) @@ -1419,7 +1480,8 @@ float rightWidth = 0.0; uint32 right = numChars; - while (right > left && (rightWidth + (escapementArray[right - 1] * size)) < mid) + while (right > left && (rightWidth + (escapementArray[right - 1] * size)) + < mid) rightWidth += (escapementArray[--right] * size); if (left >= right) @@ -1490,7 +1552,8 @@ char* result, const float* escapementArray, float fontSize, float ellipsisWidth, int32 length, int32 numChars) { - // TODO: that's actually not correct: the string could be smaller than ellipsisWidth + // TODO: that's actually not correct: the string could be smaller than + // ellipsisWidth if (string == NULL /*|| width < ellipsisWidth*/) { // we don't have room for a single glyph strcpy(result, ""); @@ -1540,8 +1603,8 @@ // FALL THROUGH (at least do something) case B_TRUNCATE_MIDDLE: default: - truncated = truncate_middle(source, dest, numChars, escapementArray, - width, ellipsisWidth, fontSize); + truncated = truncate_middle(source, dest, numChars, + escapementArray, width, ellipsisWidth, fontSize); break; } Modified: haiku/trunk/src/kits/interface/MenuBar.cpp =================================================================== --- haiku/trunk/src/kits/interface/MenuBar.cpp 2009-10-22 20:36:45 UTC (rev 33731) +++ haiku/trunk/src/kits/interface/MenuBar.cpp 2009-10-22 21:10:19 UTC (rev 33732) @@ -24,6 +24,7 @@ #include <binary_compatibility/Interface.h> #include <MenuPrivate.h> #include <TokenSpace.h> +#include <InterfaceDefs.h> #include "BMCPrivate.h" @@ -337,10 +338,17 @@ if (fTracking) return; - BWindow* window = Window(); - if (!window->IsActive() || !window->IsFront()) { - window->Activate(); - window->UpdateIfNeeded(); + uint32 buttons; + GetMouse(&where, &buttons); + + BWindow* window = Window(); + if (!window->IsActive() || !window->IsFront()) { + if ((mouse_mode() == B_FOCUS_FOLLOWS_MOUSE) + || ((mouse_mode() == B_CLICK_TO_FOCUS_MOUSE) + && ((buttons & B_SECONDARY_MOUSE_BUTTON) != 0))) { + window->Activate(); + window->UpdateIfNeeded(); + } } StartMenuBar(-1, false, false); Modified: haiku/trunk/src/preferences/mouse/MouseConstants.h =================================================================== --- haiku/trunk/src/preferences/mouse/MouseConstants.h 2009-10-22 20:36:45 UTC (rev 33731) +++ haiku/trunk/src/preferences/mouse/MouseConstants.h 2009-10-22 21:10:19 UTC (rev 33732) @@ -6,6 +6,7 @@ * Jérôme Duval, * Axel Dörfler (axeld@xxxxxxxxxxxxxxxx) * Andrew McCall (mccall@xxxxxxxxxxxxxxxxxxxxx) + * Brecht Machiels (brecht@xxxxxxxxxxx) */ #ifndef MOUSE_CONSTANTS_H #define MOUSE_CONSTANTS_H @@ -17,6 +18,8 @@ const uint32 kMsgMouseType = 'PUmt'; const uint32 kMsgMouseFocusMode = 'PUmf'; +const uint32 kMsgFollowsMouseMode = 'PUff'; +const uint32 kMsgAcceptFirstClick = 'PUaf'; const uint32 kMsgMouseMap = 'PUmm'; const uint32 kMsgDoubleClickSpeed = 'SLdc'; Modified: haiku/trunk/src/preferences/mouse/MouseSettings.cpp =================================================================== --- haiku/trunk/src/preferences/mouse/MouseSettings.cpp 2009-10-22 20:36:45 UTC (rev 33731) +++ haiku/trunk/src/preferences/mouse/MouseSettings.cpp 2009-10-22 21:10:19 UTC (rev 33732) @@ -6,9 +6,9 @@ * Jérôme Duval, * Axel Dörfler (axeld@xxxxxxxxxxxxxxxx) * Andrew McCall (mccall@xxxxxxxxxxxxxxxxxxxxx) + * Brecht Machiels (brecht@xxxxxxxxxxx) */ - #include <FindDirectory.h> #include <File.h> #include <Path.h> @@ -18,7 +18,6 @@ #include "MouseSettings.h" - // The R5 settings file differs from that of OpenBeOS; // the latter maps 16 different mouse buttons #define R5_COMPATIBLE 1 @@ -27,6 +26,7 @@ static const int32 kDefaultMouseSpeed = 65536; static const int32 kDefaultMouseType = 3; // 3 button mouse static const int32 kDefaultAccelerationFactor = 65536; +static const bool kDefaultAcceptFirstClick = false; MouseSettings::MouseSettings() @@ -37,6 +37,8 @@ fOriginalSettings = fSettings; fOriginalMode = fMode; + fOriginalFocusFollowsMouseMode = fFocusFollowsMouseMode; + fOriginalAcceptFirstClick = fAcceptFirstClick; } @@ -75,6 +77,8 @@ fprintf(stderr, "error when get_mouse_type\n"); fMode = mouse_mode(); + fFocusFollowsMouseMode = focus_follows_mouse_mode(); + fAcceptFirstClick = accept_first_click(); // also try to load the window position from disk @@ -151,19 +155,32 @@ char *mode = "unknown"; switch (fMode) { case B_NORMAL_MOUSE: - mode = "normal"; + mode = "click to activate"; break; + case B_CLICK_TO_FOCUS_MOUSE: + mode = "click to focus"; + break; case B_FOCUS_FOLLOWS_MOUSE: mode = "focus follows mouse"; break; - case B_WARP_MOUSE: - mode = "warp mouse"; + } + printf("mouse mode:\t%s\n", mode); + + char *focus_follows_mouse_mode = "unknown"; + switch (fMode) { + case B_NORMAL_FOCUS_FOLLOWS_MOUSE: + focus_follows_mouse_mode = "normal"; break; - case B_INSTANT_WARP_MOUSE: - mode = "instant warp mouse"; + case B_WARP_FOCUS_FOLLOWS_MOUSE: + focus_follows_mouse_mode = "warp"; break; + case B_INSTANT_WARP_FOCUS_FOLLOWS_MOUSE: + focus_follows_mouse_mode = "instant warp"; + break; } - printf("mode:\t\t%s\n", mode); + printf("focus follows mouse mode:\t%s\n", focus_follows_mouse_mode); + printf("accept first click:\t%s\n", + fAcceptFirstClick ? "enabled" : "disabled"); } #endif @@ -177,6 +194,8 @@ SetMouseType(kDefaultMouseType); SetAccelerationFactor(kDefaultAccelerationFactor); SetMouseMode(B_NORMAL_MOUSE); + SetFocusFollowsMouseMode(B_NORMAL_FOCUS_FOLLOWS_MOUSE); + SetAcceptFirstClick(kDefaultAcceptFirstClick); mouse_map map; if (get_mouse_map(&map) == B_OK) { @@ -197,6 +216,8 @@ || fSettings.type != kDefaultMouseType || fSettings.accel.accel_factor != kDefaultAccelerationFactor || fMode != B_NORMAL_MOUSE + || fFocusFollowsMouseMode != B_NORMAL_FOCUS_FOLLOWS_MOUSE + || fAcceptFirstClick != kDefaultAcceptFirstClick || fSettings.map.button[0] != B_PRIMARY_MOUSE_BUTTON || fSettings.map.button[1] != B_SECONDARY_MOUSE_BUTTON || fSettings.map.button[2] != B_TERTIARY_MOUSE_BUTTON; @@ -212,6 +233,9 @@ SetMouseType(fOriginalSettings.type); SetAccelerationFactor(fOriginalSettings.accel.accel_factor); SetMouseMode(fOriginalMode); + SetFocusFollowsMouseMode(fOriginalFocusFollowsMouseMode); + SetAcceptFirstClick(fOriginalAcceptFirstClick); + SetMapping(fOriginalSettings.map); } @@ -313,3 +337,19 @@ fMode = mode; } + +void +MouseSettings::SetFocusFollowsMouseMode(mode_focus_follows_mouse mode) +{ + set_focus_follows_mouse_mode(mode); + fFocusFollowsMouseMode = mode; +} + + +void +MouseSettings::SetAcceptFirstClick(bool accept_first_click) +{ + set_accept_first_click(accept_first_click); + fAcceptFirstClick = accept_first_click; +} + Modified: haiku/trunk/src/preferences/mouse/MouseSettings.h =================================================================== --- haiku/trunk/src/preferences/mouse/MouseSettings.h 2009-10-22 20:36:45 UTC (rev 33731) +++ haiku/trunk/src/preferences/mouse/MouseSettings.h 2009-10-22 21:10:19 UTC (rev 33732) @@ -6,19 +6,21 @@ * Jérôme Duval, * Axel Dörfler (axeld@xxxxxxxxxxxxxxxx) * Andrew McCall (mccall@xxxxxxxxxxxxxxxxxxxxx) + * Brecht Machiels (brecht@xxxxxxxxxxx) */ #ifndef MOUSE_SETTINGS_H #define MOUSE_SETTINGS_H +#include <InterfaceDefs.h> +#include <Point.h> +#include <SupportDefs.h> + #include "kb_mouse_settings.h" -#include <SupportDefs.h> -#include <InterfaceDefs.h> class BPath; - class MouseSettings { public: MouseSettings(); @@ -52,6 +54,14 @@ mode_mouse MouseMode() const { return fMode; } void SetMouseMode(mode_mouse mode); + mode_focus_follows_mouse FocusFollowsMouseMode() const { + return fFocusFollowsMouseMode; + } + void SetFocusFollowsMouseMode(mode_focus_follows_mouse mode); + + bool AcceptFirstClick() const { return fAcceptFirstClick; } + void SetAcceptFirstClick(bool accept_first_click); + private: static status_t _GetSettingsPath(BPath &path); void _RetrieveSettings(); @@ -59,6 +69,9 @@ mouse_settings fSettings, fOriginalSettings; mode_mouse fMode, fOriginalMode; + mode_focus_follows_mouse fFocusFollowsMouseMode; + mode_focus_follows_mouse fOriginalFocusFollowsMouseMode; + bool fAcceptFirstClick, fOriginalAcceptFirstClick; BPoint fWindowPosition; }; Modified: haiku/trunk/src/preferences/mouse/MouseView.cpp =================================================================== --- haiku/trunk/src/preferences/mouse/MouseView.cpp 2009-10-22 20:36:45 UTC (rev 33731) +++ haiku/trunk/src/preferences/mouse/MouseView.cpp 2009-10-22 21:10:19 UTC (rev 33732) @@ -30,7 +30,6 @@ #include "MouseSettings.h" #include "MouseWindow.h" - static const int32 kButtonTop = 6; static const int32 kMouseDownWidth = 72; static const int32 kMouseDownHeight = 30; @@ -86,9 +85,9 @@ // #pragma mark - -MouseView::MouseView(BRect rect, const MouseSettings &settings) +MouseView::MouseView(const MouseSettings &settings) : - BView(rect, "mouse_view", B_FOLLOW_ALL, B_PULSE_NEEDED | B_WILL_DRAW), + BView("mouse_view", B_PULSE_NEEDED | B_WILL_DRAW), fSettings(settings), fType(-1), fButtons(0), Modified: haiku/trunk/src/preferences/mouse/MouseView.h =================================================================== --- haiku/trunk/src/preferences/mouse/MouseView.h 2009-10-22 20:36:45 UTC (rev 33731) +++ haiku/trunk/src/preferences/mouse/MouseView.h 2009-10-22 21:10:19 UTC (rev 33732) @@ -11,38 +11,40 @@ #define MOUSE_VIEW_H -#include <View.h> #include <Bitmap.h> #include <PopUpMenu.h> +#include <View.h> class MouseSettings; class MouseView : public BView { public: - MouseView(BRect frame, const MouseSettings &settings); - virtual ~MouseView(); + MouseView(const MouseSettings &settings); + virtual ~MouseView(); - virtual void AttachedToWindow(); - virtual void MouseDown(BPoint where); - virtual void MouseUp(BPoint where); - virtual void Draw(BRect frame); - virtual void GetPreferredSize(float *_width, float *_height); + virtual void AttachedToWindow(); + virtual void MouseDown(BPoint where); + virtual void MouseUp(BPoint where); + virtual void Draw(BRect frame); + virtual void GetPreferredSize(float *_width, float *_height); - void SetMouseType(int32 type); - void MouseMapUpdated(); - void UpdateFromSettings(); + void SetMouseType(int32 type); + void MouseMapUpdated(); + void UpdateFromSettings(); private: int32 _ConvertFromVisualOrder(int32 button); - typedef BView inherited; + typedef BView inherited; - const MouseSettings &fSettings; + const MouseSettings &fSettings; + BBitmap *fMouseBitmap, *fMouseDownBitmap; + BRect fMouseDownBounds; - int32 fType; - uint32 fButtons; - uint32 fOldButtons; + int32 fType; + uint32 fButtons; + uint32 fOldButtons; }; #endif /* MOUSE_VIEW_H */ Modified: haiku/trunk/src/preferences/mouse/MouseWindow.cpp =================================================================== --- haiku/trunk/src/preferences/mouse/MouseWindow.cpp 2009-10-22 20:36:45 UTC (rev 33731) +++ haiku/trunk/src/preferences/mouse/MouseWindow.cpp 2009-10-22 21:10:19 UTC (rev 33732) @@ -6,20 +6,22 @@ * Jérôme Duval, * Axel Dörfler (axeld@xxxxxxxxxxxxxxxx) * Andrew McCall (mccall@xxxxxxxxxxxxxxxxxxxxx) + * Brecht Machiels (brecht@xxxxxxxxxxx) */ - #include <Alert.h> #include <Application.h> +#include <GroupLayout.h> +#include <GroupLayoutBuilder.h> +#include <Button.h> +#include <CheckBox.h> +#include <Debug.h> +#include <Menu.h> +#include <MenuField.h> +#include <MenuItem.h> #include <Message.h> #include <Screen.h> #include <Slider.h> -#include <Button.h> -#include <Menu.h> -#include <MenuItem.h> -#include <MenuField.h> -#include <Debug.h> -#include <string.h> #include "MouseWindow.h" #include "MouseConstants.h" @@ -29,44 +31,41 @@ MouseWindow::MouseWindow(BRect _rect) : BWindow(_rect, "Mouse", B_TITLED_WINDOW, - B_NOT_RESIZABLE | B_NOT_ZOOMABLE | B_ASYNCHRONOUS_CONTROLS) + B_NOT_RESIZABLE | B_NOT_ZOOMABLE | B_ASYNCHRONOUS_CONTROLS | + B_AUTO_UPDATE_SIZE_LIMITS) { - BView* view = new BView(Bounds(), "view", B_FOLLOW_ALL, 0); - view->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); - AddChild(view); - // Add the main settings view - fSettingsView = new SettingsView(Bounds().InsetBySelf(kBorderSpace, - kBorderSpace), fSettings); - view->AddChild(fSettingsView); + fSettingsView = new SettingsView(fSettings); + fSettingsBox = new BBox("main box"); + fSettingsBox->AddChild(fSettingsView); // Add the "Default" button - BRect rect(kBorderSpace, fSettingsView->Frame().bottom + kItemSpace + 2, - kBorderSpace + 75, fSettingsView->Frame().bottom + 20); - fDefaultsButton = new BButton(rect, "defaults", "Defaults", - new BMessage(kMsgDefaults)); - fDefaultsButton->ResizeToPreferred(); + fDefaultsButton = new BButton("Defaults", new BMessage(kMsgDefaults)); fDefaultsButton->SetEnabled(fSettings.IsDefaultable()); - view->AddChild(fDefaultsButton); // Add the "Revert" button - rect.OffsetBy(fDefaultsButton->Bounds().Width() + kItemSpace, 0); - fRevertButton = new BButton(rect, "revert", "Revert", - new BMessage(kMsgRevert)); + fRevertButton = new BButton("Revert", new BMessage(kMsgRevert)); fRevertButton->SetEnabled(false); - fRevertButton->ResizeToPreferred(); - view->AddChild(fRevertButton); SetPulseRate(100000); // we are using the pulse rate to scan pressed mouse // buttons and draw the selected imagery - ResizeTo(fSettingsView->Frame().right + kBorderSpace, - fRevertButton->Frame().bottom + kBorderSpace - 1); + // Build the layout + SetLayout(new BGroupLayout(B_VERTICAL)); + AddChild(BGroupLayoutBuilder(B_VERTICAL, 10) + .Add(fSettingsBox) + .AddGroup(B_HORIZONTAL, 5) + .Add(fDefaultsButton) + .Add(fRevertButton) + .AddGlue() + .End() + .SetInsets(10, 10, 10, 10) + ); + // check if the window is on screen - - rect = BScreen().Frame(); + BRect rect = BScreen().Frame(); rect.InsetBySelf(20, 20); BPoint position = fSettings.WindowPosition(); @@ -137,9 +136,44 @@ fSettings.SetMouseMode((mode_mouse)mode); fDefaultsButton->SetEnabled(fSettings.IsDefaultable()); fRevertButton->SetEnabled(true); + fSettingsView->fFocusFollowsMouseMenu->SetEnabled( + mode == B_FOCUS_FOLLOWS_MOUSE); + fSettingsView->fAcceptFirstClickBox->SetEnabled( + mode != B_FOCUS_FOLLOWS_MOUSE); } break; } + + case kMsgFollowsMouseMode: + { + int32 mode; + if (message->FindInt32("mode_focus_follows_mouse", &mode) + == B_OK) { + fSettings.SetFocusFollowsMouseMode( + (mode_focus_follows_mouse)mode); + fDefaultsButton->SetEnabled(fSettings.IsDefaultable()); + fRevertButton->SetEnabled(true); + } + break; + } + + case kMsgAcceptFirstClick: + { + BHandler *handler; + if (message->FindPointer("source", + reinterpret_cast<void**>(&handler)) == B_OK) { + bool acceptFirstClick = false; + BCheckBox *acceptFirstClickBox = + dynamic_cast<BCheckBox*>(handler); + if (acceptFirstClickBox) + acceptFirstClick = acceptFirstClickBox->Value() + == B_CONTROL_ON; + fSettings.SetAcceptFirstClick(acceptFirstClick); + fDefaultsButton->SetEnabled(fSettings.IsDefaultable()); + fRevertButton->SetEnabled(true); + } + break; + } case kMsgDoubleClickSpeed: { Modified: haiku/trunk/src/preferences/mouse/MouseWindow.h =================================================================== --- haiku/trunk/src/preferences/mouse/MouseWindow.h 2009-10-22 20:36:45 UTC (rev 33731) +++ haiku/trunk/src/preferences/mouse/MouseWindow.h 2009-10-22 21:10:19 UTC (rev 33732) @@ -6,19 +6,21 @@ * Jérôme Duval, * Axel Dörfler (axeld@xxxxxxxxxxxxxxxx) * Andrew McCall (mccall@xxxxxxxxxxxxxxxxxxxxx) + * Brecht Machiels (brecht@xxxxxxxxxxx) */ #ifndef MOUSE_WINDOW_H #define MOUSE_WINDOW_H +#include <Box.h> +#include <Button.h> #include <Window.h> -#include <Button.h> #include "MouseSettings.h" + class SettingsView; - class MouseWindow : public BWindow { public: MouseWindow(BRect rect); @@ -31,6 +33,7 @@ BButton *fDefaultsButton; BButton *fRevertButton; SettingsView *fSettingsView; + BBox *fSettingsBox; }; #endif /* MOUSE_WINDOW_H */ Modified: haiku/trunk/src/preferences/mouse/SettingsView.cpp =================================================================== --- haiku/trunk/src/preferences/mouse/SettingsView.cpp 2009-10-22 20:36:45 UTC (rev 33731) +++ haiku/trunk/src/preferences/mouse/SettingsView.cpp 2009-10-22 21:10:19 UTC (rev 33732) @@ -6,23 +6,26 @@ * Jérôme Duval, * Axel Dörfler (axeld@xxxxxxxxxxxxxxxx) * Andrew McCall (mccall@xxxxxxxxxxxxxxxxxxxxx) + * Brecht Machiels (brecht@xxxxxxxxxxx) */ +#include "SettingsView.h" -#include <InterfaceDefs.h> -#include <Button.h> -#include <Box.h> #include <Bitmap.h> -#include <TranslationUtils.h> -#include <TextControl.h> -#include <Slider.h> -#include <PopUpMenu.h> +#include <Box.h> +#include <Button.h> +#include <Debug.h> +#include <GroupLayout.h> +#include <GroupLayoutBuilder.h> +#include <InterfaceDefs.h> #include <MenuField.h> #include <MenuItem.h> -#include <Debug.h> +#include <PopUpMenu.h> +#include <Slider.h> +#include <TextControl.h> +#include <TranslationUtils.h> #include <Window.h> -#include "SettingsView.h" #include "MouseConstants.h" #include "MouseSettings.h" #include "MouseView.h" @@ -35,12 +38,24 @@ case B_NORMAL_MOUSE: default: return 0; + case B_CLICK_TO_FOCUS_MOUSE: + return 1; case B_FOCUS_FOLLOWS_MOUSE: + return 2; + } +} + +static int32 +focus_follows_mouse_mode_to_index(mode_focus_follows_mouse mode) +{ + switch (mode) { + case B_NORMAL_FOCUS_FOLLOWS_MOUSE: + default: + return 0; + case B_WARP_FOCUS_FOLLOWS_MOUSE: return 1; - case B_WARP_MOUSE: + case B_INSTANT_WARP_FOCUS_FOLLOWS_MOUSE: return 2; - case B_INSTANT_WARP_MOUSE: - return 3; } } @@ -48,151 +63,153 @@ // #pragma mark - -SettingsView::SettingsView(BRect rect, MouseSettings &settings) - : - BBox(rect, "main_view"), +SettingsView::SettingsView(MouseSettings &settings) + : BBox("main_view"), fSettings(settings) { - ResizeToPreferred(); - - fDoubleClickBitmap = BTranslationUtils::GetBitmap("double_click_bmap"); - fSpeedBitmap = BTranslationUtils::GetBitmap("speed_bmap"); - fAccelerationBitmap = BTranslationUtils::GetBitmap("acceleration_bmap"); - // Add the "Mouse Type" pop up menu fTypeMenu = new BPopUpMenu("unknown"); fTypeMenu->AddItem(new BMenuItem("1-Button", new BMessage(kMsgMouseType))); fTypeMenu->AddItem(new BMenuItem("2-Button", new BMessage(kMsgMouseType))); fTypeMenu->AddItem(new BMenuItem("3-Button", new BMessage(kMsgMouseType))); - BMenuField *field = new BMenuField(BRect(7, 8, 155, 190), "mouse_type", - "Mouse type:", fTypeMenu); - field->SetDivider(field->StringWidth(field->Label()) + kItemSpace); - field->SetAlignment(B_ALIGN_RIGHT); - AddChild(field); + BMenuField *fTypeField = new BMenuField("Mouse type:", fTypeMenu, NULL); + fTypeField->SetAlignment(B_ALIGN_RIGHT); - BFont font = be_plain_font; - float length = font.StringWidth("Mouse type: [3-Button]") + 20; - fLeftArea.Set(8, 7, length + 8, 198); - if (fLeftArea.Width() < 125) - fLeftArea.right = fLeftArea.left + 125; - - fRightArea.Set(fLeftArea.right + 10, 11, 200, 7); - // Create the "Double-click speed slider... - fClickSpeedSlider = new BSlider(fRightArea, "double_click_speed", - "Double-click speed", new BMessage(kMsgDoubleClickSpeed), 0, 1000); + fClickSpeedSlider = new BSlider("double_click_speed", "Double-click speed", + new BMessage(kMsgDoubleClickSpeed), 0, 1000, B_HORIZONTAL); fClickSpeedSlider->SetHashMarks(B_HASH_MARKS_BOTTOM); fClickSpeedSlider->SetHashMarkCount(5); fClickSpeedSlider->SetLimitLabels("Slow", "Fast"); - AddChild(fClickSpeedSlider); - length = fClickSpeedSlider->Bounds().Height() + 6; - fDoubleClickBmpPoint.y = fRightArea.top + - (length - (fDoubleClickBitmap != NULL - ? fDoubleClickBitmap->Bounds().Height() : 0)) / 2; - fRightArea.top += length; - // Create the "Mouse Speed" slider... - fMouseSpeedSlider = new BSlider(fRightArea, "mouse_speed", "Mouse Speed", - new BMessage(kMsgMouseSpeed), 0, 1000); + fMouseSpeedSlider = new BSlider("mouse_speed", "Mouse Speed", + new BMessage(kMsgMouseSpeed), 0, 1000, B_HORIZONTAL); fMouseSpeedSlider->SetHashMarks(B_HASH_MARKS_BOTTOM); fMouseSpeedSlider->SetHashMarkCount(7); fMouseSpeedSlider->SetLimitLabels("Slow", "Fast"); - AddChild(fMouseSpeedSlider); - fSpeedBmpPoint.y = fRightArea.top + - (length - (fSpeedBitmap != NULL - ? fSpeedBitmap->Bounds().Height() : 0)) / 2; - fRightArea.top += length; - // Create the "Mouse Acceleration" slider... - fAccelerationSlider = new BSlider(fRightArea, "mouse_acceleration", - "Mouse Acceleration", new BMessage(kMsgAccelerationFactor), 0, 1000); + fAccelerationSlider = new BSlider("mouse_acceleration", + "Mouse Acceleration", new BMessage(kMsgAccelerationFactor), + 0, 1000, B_HORIZONTAL); fAccelerationSlider->SetHashMarks(B_HASH_MARKS_BOTTOM); fAccelerationSlider->SetHashMarkCount(5); fAccelerationSlider->SetLimitLabels("Slow", "Fast"); - AddChild(fAccelerationSlider); - fAccelerationBmpPoint.y = fRightArea.top + - (length - (fAccelerationBitmap != NULL - ? fAccelerationBitmap->Bounds().Height() : 0)) / 2; - fRightArea.top += length - 3; + // Mouse image... + fMouseView = new MouseView(fSettings); + + // Create the "Double-click test area" text box... + BTextControl *fDoubleClick = new BTextControl(NULL, + "Double-click test area", NULL); + fDoubleClick->SetAlignment(B_ALIGN_LEFT, B_ALIGN_CENTER); + + // Add the "Mouse focus mode" pop up menu + fFocusMenu = new BPopUpMenu("Click to Activate"); - // Add the "Focus follows mouse" pop up menu - fFocusMenu = new BPopUpMenu("Disabled"); - - const char *focusLabels[] = {"Disabled", "Enabled", "Warping", - "Instant-Warping"}; - const mode_mouse focusModes[] = {B_NORMAL_MOUSE, B_FOCUS_FOLLOWS_MOUSE, - B_WARP_MOUSE, B_INSTANT_WARP_MOUSE}; + const char *focusLabels[] = {"Click to Activate", "Click to Focus", + "Focus Follows Mouse"}; + const mode_mouse focusModes[] = {B_NORMAL_MOUSE, B_CLICK_TO_FOCUS_MOUSE, + B_FOCUS_FOLLOWS_MOUSE}; - for (int i = 0; i < 4; i++) { + for (int i = 0; i < 3; i++) { BMessage *message = new BMessage(kMsgMouseFocusMode); message->AddInt32("mode", focusModes[i]); fFocusMenu->AddItem(new BMenuItem(focusLabels[i], message)); } - BRect frame(fRightArea.left, fRightArea.top + 10, fRightArea.left + - font.StringWidth("Focus follows mouse:") + - font.StringWidth(focusLabels[3]) + 30, 200); - field = new BMenuField(frame, "ffm", "Focus follows mouse:", fFocusMenu, - true); - field->SetDivider(field->StringWidth(field->Label()) + kItemSpace); - field->SetAlignment(B_ALIGN_RIGHT); - AddChild(field); + BMenuField *fFocusField = new BMenuField("Focus mode:", fFocusMenu, NULL); + fFocusField->SetAlignment(B_ALIGN_RIGHT); + + // Add the "Focus follows mouse mode" pop up menu + fFocusFollowsMouseMenu = new BPopUpMenu("Normal"); + + const char *focusFollowsMouseLabels[] = {"Normal", "Warp", "Instant Warp"}; + const mode_focus_follows_mouse focusFollowsMouseModes[] = + {B_NORMAL_FOCUS_FOLLOWS_MOUSE, B_WARP_FOCUS_FOLLOWS_MOUSE, + B_INSTANT_WARP_FOCUS_FOLLOWS_MOUSE}; - // Finalize the areas - fRightArea.bottom = fRightArea.top; - fRightArea.top = 11; - fRightArea.right = frame.right + 8; - if (fRightArea.Width() < 200) - fRightArea.right = fRightArea.left + 200; - fLeftArea.bottom = fRightArea.bottom; + for (int i = 0; i < 3; i++) { + BMessage *message = new BMessage(kMsgFollowsMouseMode); + message->AddInt32("mode_focus_follows_mouse", + focusFollowsMouseModes[i]); - // Position mouse bitmaps - fDoubleClickBmpPoint.x = fRightArea.right - 15 [... truncated: 1857 lines follow ...]