[haiku-commits] r33732 - in haiku/trunk: headers/os/interface headers/private/app src/kits/interface src/preferences/mouse src/servers/app src/servers/input

  • From: brecht@xxxxxxxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Thu, 22 Oct 2009 23:10:19 +0200 (CEST)

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 ...]

Other related posts: