Index: src/preferences/mouse/SettingsView.h
===================================================================
--- src/preferences/mouse/SettingsView.h	(revision 30852)
+++ src/preferences/mouse/SettingsView.h	(working copy)
@@ -10,6 +10,7 @@
 //  Authors:		Jérôme Duval,
 //					Andrew McCall (mccall@digitalparadise.co.uk)
 //					Axel Dörfler (axeld@pinc-software.de)
+//  				Brecht Machiels (brecht@mos6581.org)
 //  Description:	Mouse Preferences
 //  Created:		December 10, 2003
 //
@@ -23,39 +24,40 @@
 #include <Button.h>
 #include <Slider.h>
 #include <PopUpMenu.h>
+#include <CheckBox.h>
 
+#include "BitmapView.h"
 
+
 class MouseSettings;
 class MouseView;
 
 
 class SettingsView : public BBox {
 	public:
-		SettingsView(BRect frame, MouseSettings &settings);
+		SettingsView(MouseSettings &settings);
 		virtual ~SettingsView();
 
 		virtual void AttachedToWindow();
-		virtual void GetPreferredSize(float *_width, float *_height);
-		virtual void Draw(BRect frame);
 
 		void SetMouseType(int32 type);
 		void MouseMapUpdated();
 		void UpdateFromSettings();
 
 	private:
+		friend class MouseWindow;
+
 		typedef BBox inherited;
 
 		const MouseSettings &fSettings;
 
-		BPopUpMenu	*fTypeMenu, *fFocusMenu;
+		BPopUpMenu	*fTypeMenu, *fFocusMenu, *fFocusFollowsMouseMenu;
+		BCheckBox	*fAcceptFirstClickBox;
 		MouseView	*fMouseView;
 		BSlider		*fClickSpeedSlider, *fMouseSpeedSlider, *fAccelerationSlider;
 
 		BBitmap 	*fDoubleClickBitmap, *fSpeedBitmap, *fAccelerationBitmap;
-
-		BRect 		fLeftArea, fRightArea;
-		BPoint		fLeft, fRight;
-		BPoint		fDoubleClickBmpPoint, fSpeedBmpPoint, fAccelerationBmpPoint;
+		BBitmapView	*fDoubleClickView, *fSpeedView, *fAccelerationView;
 };
 
 #endif	/* SETTINGS_VIEW_H */
Index: src/preferences/mouse/BitmapView.cpp
===================================================================
--- src/preferences/mouse/BitmapView.cpp	(revision 0)
+++ src/preferences/mouse/BitmapView.cpp	(revision 0)
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2009, Haiku, Inc. All rights reserved.
+ * Distributed under the terms of the MIT License.
+ *
+ *  Authors:		
+ *		Brecht Machiels, brecht@mos6581.org
+ *
+ *  Description:	Bitmap BView
+ *  Created:		March 13, 2009
+ *		
+ */
+
+#include "BitmapView.h"
+
+
+BBitmapView::BBitmapView(BBitmap &bitmap)
+	: BView(bitmap.Bounds(), "bitmap_view", B_FOLLOW_NONE, B_WILL_DRAW)
+{
+	fBitmap = &bitmap;
+	
+	this->SetExplicitMinSize(BSize(fBitmap->Bounds().Width(),
+		fBitmap->Bounds().Height()));
+	this->SetExplicitMaxSize(BSize(fBitmap->Bounds().Width(),
+		fBitmap->Bounds().Height()));
+}
+
+
+void
+BBitmapView::AttachedToWindow()
+{
+	this->SetViewBitmap(fBitmap, fBitmap->Bounds(),
+		this->Bounds(), B_FOLLOW_NONE, 0);
+}
Index: src/preferences/mouse/MouseSettings.cpp
===================================================================
--- src/preferences/mouse/MouseSettings.cpp	(revision 30852)
+++ src/preferences/mouse/MouseSettings.cpp	(working copy)
@@ -8,23 +8,24 @@
 //
 //  File:			MouseSettings.h
 //  Authors:		Jérôme Duval,
-//					Andrew McCall (mccall@digitalparadise.co.uk),
+//					Andrew McCall (mccall@digitalparadise.co.uk)
 //					Axel Dörfler (axeld@pinc-software.de)
+//					Brecht Machiels (brecht@mos6581.org)
 //  Description:	Mouse Preferences
 //  Created:		December 10, 2003
 //
 // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
 
+#include "MouseSettings.h"
+
+#include <stdio.h>
+
 #include <FindDirectory.h>
 #include <File.h>
 #include <Path.h>
 #include <View.h>
 
-#include <stdio.h>
 
-#include "MouseSettings.h"
-
-
 // The R5 settings file differs from that of OpenBeOS;
 // the latter maps 16 different mouse buttons
 #define R5_COMPATIBLE 1
@@ -33,16 +34,18 @@
 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()
-	:
-	fWindowPosition(-1, -1)
+	: fWindowPosition(-1, -1)
 {
 	RetrieveSettings();
 
 	fOriginalSettings = fSettings;
 	fOriginalMode = fMode;
+	fOriginalFocusFollowsMouseMode = fFocusFollowsMouseMode;
+	fOriginalAcceptFirstClick = fAcceptFirstClick;
 }
 
 
@@ -81,6 +84,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
 
@@ -143,7 +148,8 @@
 MouseSettings::Dump()
 {
 	printf("type:\t\t%ld button mouse\n", fSettings.type);
-	printf("map:\t\tleft = %lu : middle = %lu : right = %lu\n", fSettings.map.button[0], fSettings.map.button[2], fSettings.map.button[1]);
+	printf("map:\t\tleft = %lu : middle = %lu : right = %lu\n", fSettings.map.button[0],
+		fSettings.map.button[2], fSettings.map.button[1]);
 	printf("click speed:\t%Ld\n", fSettings.click_speed);
 	printf("accel:\t\t%s\n", fSettings.accel.enabled ? "enabled" : "disabled");
 	printf("accel factor:\t%ld\n", fSettings.accel.accel_factor);
@@ -152,19 +158,31 @@
 	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
 
@@ -180,6 +198,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) {
@@ -202,6 +222,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;
@@ -219,6 +241,9 @@
 	SetMouseType(fOriginalSettings.type);
 	SetAccelerationFactor(fOriginalSettings.accel.accel_factor);
 	SetMouseMode(fOriginalMode);
+	SetFocusFollowsMouseMode(fOriginalFocusFollowsMouseMode);
+	SetAcceptFirstClick(fOriginalAcceptFirstClick);
+	
 	SetMapping(fOriginalSettings.map);
 }
 
@@ -320,3 +345,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;	
+}
+
Index: src/preferences/mouse/BitmapView.h
===================================================================
--- src/preferences/mouse/BitmapView.h	(revision 0)
+++ src/preferences/mouse/BitmapView.h	(revision 0)
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2009, Haiku, Inc. All rights reserved.
+ * Distributed under the terms of the MIT License.
+ *
+ *  Authors:
+ *		Brecht Machiels, brecht@mos6581.org
+ *
+ *  Description:	Bitmap BView
+ *  Created:		March 13, 2009
+ *		
+ */
+#ifndef BITMAP_VIEW_H
+#define BITMAP_VIEW_H
+
+
+#include <Bitmap.h>
+#include <View.h>
+
+
+class BBitmapView : public BView {
+	public:
+				BBitmapView(BBitmap &bitmap);
+		
+		virtual	void AttachedToWindow();
+		
+	private:
+				BBitmap		*fBitmap;
+};
+
+#endif	/* BITMAP_VIEW_H */
Index: src/preferences/mouse/MouseSettings.h
===================================================================
--- src/preferences/mouse/MouseSettings.h	(revision 30852)
+++ src/preferences/mouse/MouseSettings.h	(working copy)
@@ -6,19 +6,21 @@
  *		Jérôme Duval
  *		Andrew McCall (mccall@digitalparadise.co.uk)
  *		Axel Dörfler (axeld@pinc-software.de)
+ *		Brecht Machiels (brecht@mos6581.org)
  */
 #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;
 };
 
Index: src/preferences/mouse/MouseWindow.cpp
===================================================================
--- src/preferences/mouse/MouseWindow.cpp	(revision 30852)
+++ src/preferences/mouse/MouseWindow.cpp	(working copy)
@@ -10,66 +10,71 @@
 //  Authors:		Jérôme Duval,
 //					Andrew McCall (mccall@digitalparadise.co.uk)
 //					Axel Dörfler (axeld@pinc-software.de)
+//					Brecht Machiels (brecht@mos6581.org)
 //  Description:	Mouse Preferences
 //  Created:		December 10, 2003
 //
 // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
 
+#include "MouseWindow.h"
+
+#include <string.h>
+
 #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"
 #include "SettingsView.h"
 
 
 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();
@@ -140,9 +145,37 @@
 				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 accept_first_click = false;
+				BCheckBox *fAcceptFirstClickBox = dynamic_cast<BCheckBox*>(handler);
+				if (fAcceptFirstClickBox)
+					accept_first_click = fAcceptFirstClickBox->Value() == B_CONTROL_ON;
+				fSettings.SetAcceptFirstClick(accept_first_click);
+				fDefaultsButton->SetEnabled(fSettings.IsDefaultable());
+				fRevertButton->SetEnabled(true);
+			}
+			break;
+		}
 
 		case kMsgDoubleClickSpeed:
 		{
Index: src/preferences/mouse/MouseView.cpp
===================================================================
--- src/preferences/mouse/MouseView.cpp	(revision 30852)
+++ src/preferences/mouse/MouseView.cpp	(working copy)
@@ -28,7 +28,6 @@
 #include "MouseSettings.h"
 #include "MouseWindow.h"
 
-
 static const int32 kOneButtonOffsets[4] = {0, 55};
 static const int32 kTwoButtonOffsets[4] = {0, 27, 55};
 static const int32 kThreeButtonOffsets[4] = {0, 18, 36, 55};
@@ -76,8 +75,8 @@
 //	#pragma mark -
 
 
-MouseView::MouseView(BRect rect, const MouseSettings &settings)
-	: BView(rect, "mouse_view", B_FOLLOW_ALL, B_PULSE_NEEDED | B_WILL_DRAW),
+MouseView::MouseView(const MouseSettings &settings)
+	: BView("mouse_view", B_PULSE_NEEDED | B_WILL_DRAW),
 	fSettings(settings),
 	fType(-1),
 	fButtons(0),
Index: src/preferences/mouse/MouseWindow.h
===================================================================
--- src/preferences/mouse/MouseWindow.h	(revision 30852)
+++ src/preferences/mouse/MouseWindow.h	(working copy)
@@ -10,6 +10,7 @@
 //  Authors:		Jérôme Duval,
 //					Andrew McCall (mccall@digitalparadise.co.uk)
 //					Axel Dörfler (axeld@pinc-software.de)
+//					Brecht Machiels (brecht@mos6581.org)
 //  Description:	Mouse Preferences
 //  Created:		December 10, 2003
 //
@@ -18,14 +19,15 @@
 #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);
@@ -38,6 +40,7 @@
 		BButton			*fDefaultsButton;
 		BButton			*fRevertButton;
 		SettingsView	*fSettingsView;
+		BBox			*fSettingsBox;
 };
 
 #endif	/* MOUSE_WINDOW_H */
Index: src/preferences/mouse/Jamfile
===================================================================
--- src/preferences/mouse/Jamfile	(revision 30852)
+++ src/preferences/mouse/Jamfile	(working copy)
@@ -7,6 +7,7 @@
 	MouseSettings.cpp 
 	MouseWindow.cpp
 	MouseView.cpp 
+	BitmapView.cpp
 	SettingsView.cpp
 	: translation be
 	: Mouse.rdef
Index: src/preferences/mouse/Mouse.rdef
===================================================================
--- src/preferences/mouse/Mouse.rdef	(revision 30852)
+++ src/preferences/mouse/Mouse.rdef	(working copy)
@@ -97,208 +97,245 @@
 #endif // HAIKU_TARGET_PLATFORM_HAIKU
 
 resource(601, "double_click_bmap") #'bits' array {
-	$"424D06070000000000003A000000280000000E0000001E000000010018000000"
-	$"0000CC060000130B0000130B00000000000000000000FFFFFFFFD8D8D8000000"
-	$"0000000000000000000000000000000000000000000000000000000000000000"
-	$"00D8D8D800000000008080808080808080808080808080808080808080808080"
-	$"808080808080808080808080800000000000000000B8B8B8FFFFFFB8B8B8B8B8"
-	$"B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B880808000000000000000"
-	$"00B8B8B8FFFFFFB8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8"
-	$"B8B88080800000000000000000B8B8B8FFFFFFB8B8B8B8B8B8B8B8B8B8B8B8B8"
-	$"B8B8B8B8B8B8B8B8B8B8B8B8B8B88080800000000000000000B8B8B8FFFFFFB8"
-	$"B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8808080000000"
-	$"0000000000B8B8B8FFFFFFB8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8"
-	$"B8B8B8B8B8B87F7F7F0000000000000000B8B8B8FFFFFFB8B8B8B8B8B8B8B8B8"
-	$"B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B88080800000000000000000B8B8B8"
-	$"FFFFFFB8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B88080"
-	$"800000000000000000B8B8B8FFFFFFB8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8"
-	$"B8B8B8B8B8B8B8B8B8B88080800000000000000000B8B8B8FFFFFFFFFFFFFFFF"
-	$"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80808000000000000000"
-	$"0080808080808080808080808080808080808080808080808080808080808080"
-	$"80808080800000000000000000B8B8B8FFFFFFB8B8B8B8B8B8C0C0C0808080FF"
-	$"FFFFC0C0C0B8B8B8B8B8B8B8B8B88080800000000000000000B8B8B8FFFFFFB8"
-	$"B8B8B8B8B8C0C0C0808080FFFFFFC0C0C0B8B8B8B8B8B8B8B8B8808080000000"
-	$"0000000000B8B8B8FFFFFFB8B8B8B8B8B8C0C0C0808080FFFFFFC0C0C0B8B8B8"
-	$"B8B8B8B8B8B88080800000000000000000B8B8B8FFFFFFFFFFFFFFFFFFFFFFFF"
-	$"808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8080800000000000000000B8B8B8"
-	$"B8B8B8B8B8B8B8B8B8B8B8B8808080B8B8B8B8B8B8B8B8B8B8B8B8B8B8B88080"
-	$"800000000000D8D8D80000000000000000000000000000005858580000000000"
-	$"00000000000000000000000000D8D8D80000D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
-	$"D8000000000000000000D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D80000D8D8"
-	$"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8000000D8D8D8D8D8D8D8D8D8D8D8D8D8"
-	$"D8D8D8D8D8D8D8D80000D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8000000D8"
-	$"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D80000D8D8D8D8D8D8D8D8D8D8"
-	$"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
-	$"0000D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
-	$"D8D8D8D8D8D8D8D8D8D8D8D80000D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
-	$"989898D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D80000D8D8D8D8D8D8"
-	$"D8D8D8D8D8D8D8D8D8989898989898989898D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
-	$"D8D8D8D80000D8D8D8D8D8D8D8D8D8D8D8D89898989898989898989898989898"
-	$"98D8D8D8D8D8D8D8D8D8D8D8D8D8D8D80000D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
-	$"D8D8D8D8989898D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D80000D8D8"
-	$"D8D8D8D8D8D8D8D8D8D8D8D8D8989898989898989898D8D8D8D8D8D8D8D8D8D8"
-	$"D8D8D8D8D8D8D8D80000D8D8D8D8D8D8D8D8D8D8D8D898989898989898989898"
-	$"9898989898D8D8D8D8D8D8D8D8D8D8D8D8D8D8D80000D8D8D8D8D8D8D8D8D898"
-	$"9898989898989898989898989898989898989898D8D8D8D8D8D8D8D8D8D8D8D8"
-	$"0000000000000000000000000000000000000000000000000000000000000000"
-	$"0000000000000000000000000000000000000000000000000000000000000000"
-	$"0000000000000000000000000000000000000000000000000000000000000000"
-	$"0000000000000000000000000000000000000000000000000000000000000000"
-	$"0000000000000000000000000000000000000000000000000000000000000000"
-	$"0000000000000000000000000000000000000000000000000000000000000000"
-	$"0000000000000000000000000000000000000000000000000000000000000000"
-	$"0000000000000000000000000000000000000000000000000000000000000000"
-	$"0000000000000000000000000000000000000000000000000000000000000000"
-	$"0000000000000000000000000000000000000000000000000000000000000000"
-	$"0000000000000000000000000000000000000000000000000000000000000000"
-	$"0000000000000000000000000000000000000000000000000000000000000000"
-	$"0000000000000000000000000000000000000000000000000000000000000000"
-	$"000000000000"
+	$"424d1e090000000000003600000028000000190000001e00000001001800"
+	$"00000000e8080000130b0000130b00000000000000000000d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8000000000000000000000000000000"
+	$"000000000000000000000000000000000000000000d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d80000"
+	$"008080808080808080808080808080808080808080808080808080808080"
+	$"80808080808080000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8000000b8b8b8ffffffb8b8b8b8b8b8b8"
+	$"b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8808080000000d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"000000b8b8b8ffffffb8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8"
+	$"b8b8b8b8b8b8808080000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8000000b8b8b8ffffffb8b8b8b8b8"
+	$"b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8808080000000d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8000000b8b8b8ffffffb8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8"
+	$"b8b8b8b8b8b8b8b8808080000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8000000b8b8b8ffffffb8b8b8"
+	$"b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b87f7f7f000000"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8000000b8b8b8ffffffb8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8"
+	$"b8b8b8b8b8b8b8b8b8b8808080000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8000000b8b8b8ffffffb8"
+	$"b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b880808000"
+	$"0000d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8000000b8b8b8ffffffb8b8b8b8b8b8b8b8b8b8b8b8b8b8b8"
+	$"b8b8b8b8b8b8b8b8b8b8b8b8808080000000d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8000000b8b8b8ffff"
+	$"ffffffffffffffffffffffffffffffffffffffffffffffffffffffff8080"
+	$"80000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d800000080808080808080808080808080808080808080"
+	$"8080808080808080808080808080808080000000d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8000000b8b8b8"
+	$"ffffffb8b8b8b8b8b8c0c0c0808080ffffffc0c0c0b8b8b8b8b8b8b8b8b8"
+	$"808080000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8000000b8b8b8ffffffb8b8b8b8b8b8c0c0c08080"
+	$"80ffffffc0c0c0b8b8b8b8b8b8b8b8b8808080000000d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8000000b8"
+	$"b8b8ffffffb8b8b8b8b8b8c0c0c0808080ffffffc0c0c0b8b8b8b8b8b8b8"
+	$"b8b8808080000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8000000b8b8b8ffffffffffffffffffffffff"
+	$"808080ffffffffffffffffffffffffffffff808080000000d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d80000"
+	$"00b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8808080b8b8b8b8b8b8b8b8b8b8b8"
+	$"b8b8b8b8808080000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800000000000000000000000000"
+	$"0000585858000000000000000000000000000000000000d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8000000000000000000d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8000000d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8989898d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8989898989898989898"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8989898989898989898989898989898d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8989898d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8989898989898989898d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d89898989898989898"
+	$"98989898989898d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8989898989898989898989898989898989898989898d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800"
+
 };
 
 resource(602, "speed_bmap") #'bits' array {
-	$"424DE8080000000000003A000000280000001900000016000000010018000000"
-	$"0000AE080000130B0000130B00000000000000000000FFFFFFFFD8D8D8D8D8D8"
-	$"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
-	$"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
-	$"D8D8D8D8D800D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
-	$"D8D8D8D8D8D8D8D8D8D800000000000000000000000000000000000000000000"
-	$"0000000000000000000000000000D8D8D800D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
-	$"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D800000080808080808080808080"
-	$"808080808080808080808080808080808080808080808080808000000000D8D8"
-	$"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D800"
-	$"0000B8B8B8FFFFFFB8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8"
-	$"B8B8B880808000000000D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
-	$"D8D8D8D8D8D8D8D8D8D8D8000000B8B8B8FFFFFFB8B8B8B8B8B8B8B8B8B8B8B8"
-	$"B8B8B8B8B8B8B8B8B8B8B8B8B8B8B880808000000000D8D8D8D8D8D8D8D8D8D8"
-	$"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8000000B8B8B8FFFFFF"
-	$"B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B88080800000"
-	$"0000D8D8D8D8D8D8D8D8D8989898D8D8D8989898989898989898989898D8D8D8"
-	$"D8D8D8000000B8B8B8FFFFFFB8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8"
-	$"B8B8B8B8B8B8B880808000000000D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
-	$"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8000000B8B8B8FFFFFFB8B8B8B8B8B8B8B8"
-	$"B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B880808000000000D8D8D8D8D8D8"
-	$"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8000000B8B8"
-	$"B8FFFFFFB8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B880"
-	$"808000000000989898D8D8D89898989898989898989898989898989898989898"
-	$"98D8D8D8D8D8D8000000B8B8B8FFFFFFB8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8"
-	$"B8B8B8B8B8B8B8B8B8B8B87F7F7F00000000D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
-	$"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8000000B8B8B8FFFFFFB8B8B8B8"
-	$"B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B880808000000000D8D8"
-	$"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D800"
-	$"0000B8B8B8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
-	$"FFFFFF80808000000000D8D8D8D8D8D8D8D8D8989898D8D8D898989898989898"
-	$"9898989898D8D8D8D8D8D8000000808080808080808080808080808080808080"
-	$"80808080808080808080808080808080808000000000D8D8D8D8D8D8D8D8D8D8"
-	$"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8000000B8B8B8FFFFFF"
-	$"B8B8B8B8B8B8C0C0C0808080FFFFFFC0C0C0B8B8B8B8B8B8B8B8B88080800000"
-	$"0000D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
-	$"D8D8D8000000B8B8B8FFFFFFB8B8B8B8B8B8C0C0C0808080FFFFFFC0C0C0B8B8"
-	$"B8B8B8B8B8B8B880808000000000D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
-	$"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8000000B8B8B8FFFFFFB8B8B8B8B8B8C0C0"
-	$"C0808080FFFFFFC0C0C0B8B8B8B8B8B8B8B8B880808000000000D8D8D8D8D8D8"
-	$"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8000000B8B8"
-	$"B8FFFFFFFFFFFFFFFFFFFFFFFF808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80"
-	$"808000000000D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
-	$"D8D8D8D8D8D8D8000000B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8808080B8B8B8B8"
-	$"B8B8B8B8B8B8B8B8B8B8B880808000000000D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
-	$"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D800000000000000000000"
-	$"0000000000585858000000000000000000000000000000000000D8D8D800D8D8"
-	$"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
-	$"D8D8D8D8D8D8D8D8D8D8D8D8D8D8000000000000000000D8D8D8D8D8D8D8D8D8"
-	$"D8D8D8D8D8D8D8D8D800D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
-	$"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8000000"
-	$"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D800D8D8D8D8D8D8D8D8D8D8"
-	$"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
-	$"D8D8D8D8D8D8D8D8D8000000D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
-	$"D800000000000000000000000000000000000000000000000000000000000000"
-	$"0000000000000000000000000000000000000000000000000000000000000000"
-	$"0000000000000000000000000000000000000000000000000000000000000000"
-	$"0000000000000000000000000000000000000000000000000000000000000000"
-	$"0000000000000000000000000000000000000000000000000000000000000000"
-	$"0000000000000000000000000000000000000000000000000000000000000000"
-	$"0000000000000000000000000000000000000000000000000000000000000000"
-	$"0000000000000000000000000000000000000000000000000000000000000000"
-	$"0000000000000000000000000000000000000000000000000000000000000000"
-	$"0000000000000000000000000000000000000000000000000000000000000000"
-	$"0000000000000000000000000000000000000000000000000000000000000000"
-	$"0000000000000000000000000000000000000000000000000000000000000000"
-	$"0000000000000000000000000000000000000000000000000000000000000000"
-	$"0000000000000000000000000000000000000000000000000000000000000000"
-	$"0000000000000000000000000000000000000000000000000000000000000000"
-	$"0000000000000000000000000000000000000000000000000000000000000000"
-	$"0000000000000000000000000000000000000000000000000000000000000000"
-	$"0000000000000000"
+	$"424d1e090000000000003600000028000000190000001e00000001001800"
+	$"00000000e8080000130b0000130b00000000000000000000d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800000000000000000000"
+	$"0000000000000000000000000000000000000000000000000000d8d8d800"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8000000808080808080808080808080808080808080808080808080"
+	$"80808080808080808080808000000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8000000b8b8b8ffffffb8b8"
+	$"b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b88080800000"
+	$"0000d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8000000b8b8b8ffffffb8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8"
+	$"b8b8b8b8b8b8b8b8b8b8b880808000000000d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8000000b8b8b8ffffff"
+	$"b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8808080"
+	$"00000000d8d8d8d8d8d8d8d8d8989898d8d8d89898989898989898989898"
+	$"98d8d8d8d8d8d8000000b8b8b8ffffffb8b8b8b8b8b8b8b8b8b8b8b8b8b8"
+	$"b8b8b8b8b8b8b8b8b8b8b8b8b880808000000000d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8000000b8b8b8ff"
+	$"ffffb8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b880"
+	$"808000000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8000000b8b8b8ffffffb8b8b8b8b8b8b8b8b8b8b8b8"
+	$"b8b8b8b8b8b8b8b8b8b8b8b8b8b8b880808000000000989898d8d8d89898"
+	$"98989898989898989898989898989898989898d8d8d8d8d8d8000000b8b8"
+	$"b8ffffffb8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8"
+	$"b87f7f7f00000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8000000b8b8b8ffffffb8b8b8b8b8b8b8b8b8b8"
+	$"b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b880808000000000d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8000000"
+	$"b8b8b8ffffffffffffffffffffffffffffffffffffffffffffffffffffff"
+	$"ffffff80808000000000d8d8d8d8d8d8d8d8d8989898d8d8d89898989898"
+	$"98989898989898d8d8d8d8d8d80000008080808080808080808080808080"
+	$"8080808080808080808080808080808080808080808000000000d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800"
+	$"0000b8b8b8ffffffb8b8b8b8b8b8c0c0c0808080ffffffc0c0c0b8b8b8b8"
+	$"b8b8b8b8b880808000000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8000000b8b8b8ffffffb8b8b8b8b8b8"
+	$"c0c0c0808080ffffffc0c0c0b8b8b8b8b8b8b8b8b880808000000000d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8000000b8b8b8ffffffb8b8b8b8b8b8c0c0c0808080ffffffc0c0c0b8b8"
+	$"b8b8b8b8b8b8b880808000000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8000000b8b8b8ffffffffffffff"
+	$"ffffffffff808080ffffffffffffffffffffffffffffff80808000000000"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8000000b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8808080b8b8b8b8b8b8"
+	$"b8b8b8b8b8b8b8b8b880808000000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d80000000000000000"
+	$"00000000000000585858000000000000000000000000000000000000d8d8"
+	$"d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8000000000000000000d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8000000d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800"
 };
 
 resource(603, "acceleration_bmap") #'bits' array {
-	$"424D83080000000000003A000000280000001900000015000000010018000000"
-	$"000049080000130B0000130B00000000F8410000F841FFFFFFFFD8D8D8D8D8D8"
-	$"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D80000"
-	$"0000000000000000000000000000000000000000000000000000000000000000"
-	$"0000D8D8D800D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
-	$"D8D8D8D8D8D8D800000080808080808080808080808080808080808080808080"
-	$"808080808080808080808080808000000000D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
-	$"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8000000B8B8B8FFFFFFB8B8B8B8"
-	$"B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B880808000000000D8D8"
-	$"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D800"
-	$"0000B8B8B8FFFFFFB8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8"
-	$"B8B8B880808000000000D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
-	$"D8D8D8D8D8D8D8D8D8D8D8000000B8B8B8FFFFFFB8B8B8B8B8B8B8B8B8B8B8B8"
-	$"B8B8B8B8B8B8B8B8B8B8B8B8B8B8B880808000000000D8D8D8D8D8D8D8D8D898"
-	$"9898D8D8D8989898989898989898989898D8D8D8D8D8D8000000B8B8B8FFFFFF"
-	$"B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B88080800000"
-	$"0000D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
-	$"D8D8D8000000B8B8B8FFFFFFB8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8"
-	$"B8B8B8B8B8B8B880808000000000D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
-	$"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8000000B8B8B8FFFFFFB8B8B8B8B8B8B8B8"
-	$"B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B87F7F7F00000000989898D8D8D8"
-	$"989898989898989898989898989898989898989898D8D8D8D8D8D8000000B8B8"
-	$"B8FFFFFFB8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B880"
-	$"808000000000D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
-	$"D8D8D8D8D8D8D8000000B8B8B8FFFFFFB8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8"
-	$"B8B8B8B8B8B8B8B8B8B8B87F7F7F00000000D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
-	$"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8000000B8B8B8FFFFFFFFFFFFFF"
-	$"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80808000000000D8D8"
-	$"D8D8D8D8D8D8D8989898D8D8D8989898989898989898989898D8D8D8D8D8D800"
-	$"0000808080808080808080808080808080808080808080808080808080808080"
-	$"80808080808000000000D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
-	$"D8D8D8D8D8D8D8D8D8D8D8000000B8B8B8FFFFFFB8B8B8B8B8B8C0C0C0808080"
-	$"FFFFFFC0C0C0B8B8B8B8B8B8B8B8B880808000000000D8D8D8D8D8D8D8D8D8D8"
-	$"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8000000B8B8B8FFFFFF"
-	$"B8B8B8B8B8B8C0C0C0808080FFFFFFC0C0C0B8B8B8B8B8B8B8B8B88080800000"
-	$"0000D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
-	$"D8D8D8000000B8B8B8FFFFFFB8B8B8B8B8B8C0C0C0808080FFFFFFC0C0C0B8B8"
-	$"B8B8B8B8B8B8B880808000000000D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
-	$"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8000000B8B8B8FFFFFFFFFFFFFFFFFFFFFF"
-	$"FF808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80808000000000D8D8D8D8D8D8"
-	$"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8000000B8B8"
-	$"B8B8B8B8B8B8B8B8B8B8B8B8B8808080B8B8B8B8B8B8B8B8B8B8B8B8B8B8B880"
-	$"808000000000D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
-	$"D8D8D8D8D8D8D8D8D8D800000000000000000000000000000058585800000000"
-	$"0000000000000000000000000000D8D8D800D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
-	$"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
-	$"D8D8000000000000000000D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D800D8D8"
-	$"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
-	$"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8000000D8D8D8D8D8D8D8D8D8D8D8D8"
-	$"D8D8D8D8D8D8D8D8D800D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
-	$"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8000000"
-	$"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D800000090413D3D3DFF0000"
-	$"80420000984100008042000008423D0000FF0000804200000C42000080420000"
-	$"4842003D00FF0000804200004C42000080420000844200003DFF000082420000"
-	$"004000008242000090413E3E3EFF000082420000984100008242000008423E00"
-	$"00FF0000824200000C420000824200004842003E00FF0000824200004C420000"
-	$"82420000844200003EFF000084420000004000008442000090413F3F3FFF0000"
-	$"84420000984100008442000008423F0000FF0000844200000C42000084420000"
-	$"4842003F00FF0000844200004C42000084420000844200003FFF000086420000"
-	$"00400000864200009041404040FF000086420000984100008642000008424000"
-	$"00FF0000864200000C420000864200004842004000FF0000864200004C420000"
-	$"864200008442000040FF00008842000000400000884200009041414141FF0000"
-	$"8842000098410000884200000842410000FF0000884200000C42000088420000"
-	$"4842004100FF0000884200004C420000884200008442000041FF00008A420000"
-	$"004000008A4200009041424242FF00008A420000984100008A42000008424200"
-	$"00FF00008A4200000C4200008A4200004842004200FF00008A4200004C420000"
-	$"8A4200008442000042FF00008C420000004000008C4200009041434343FF0000"
-	$"8C420000984100008C4200000842430000FF00008C4200000C4200008C420000"
-	$"484200"
+	$"424d1e090000000000003600000028000000190000001e00000001001800"
+	$"00000000e8080000130b0000130b00000000000000000000d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d800000000000000000000000000"
+	$"0000000000000000000000000000000000000000000000d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800"
+	$"000000808080808080808080808080808080808080808080808080808080"
+	$"808080808080808080000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800000000b8b8b8ffffffb8b8b8b8b8"
+	$"b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8808080000000d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d800000000b8b8b8ffffffb8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8"
+	$"b8b8b8b8b8b8b8b8808080000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800000000b8b8b8ffffffb8b8b8"
+	$"b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8808080000000"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d800000000b8b8b8ffffffb8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8"
+	$"b8b8b8b8b8b8b8b8b8b8808080000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800000000b8b8b8ffffffb8"
+	$"b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b880808000"
+	$"0000d8d8d8d8d8d8989898d8d8d8d8d8d8d8d8d8989898d8d8d8d8d8d8d8"
+	$"d8d8d8d8d800000000b8b8b8ffffffb8b8b8b8b8b8b8b8b8b8b8b8b8b8b8"
+	$"b8b8b8b8b8b8b8b8b8b8b8b8808080000000d8d8d8d8d8d8989898989898"
+	$"d8d8d8d8d8d8989898989898d8d8d8d8d8d8d8d8d800000000b8b8b8ffff"
+	$"ffb8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b87f7f"
+	$"7f000000d8d8d8d8d8d8989898989898989898d8d8d89898989898989898"
+	$"98d8d8d8d8d8d800000000b8b8b8ffffffb8b8b8b8b8b8b8b8b8b8b8b8b8"
+	$"b8b8b8b8b8b8b8b8b8b8b8b8b8b8808080000000d8d8d8d8d8d898989898"
+	$"9898989898989898989898989898989898989898d8d8d800000000b8b8b8"
+	$"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
+	$"808080000000d8d8d8d8d8d8989898989898989898d8d8d8989898989898"
+	$"989898d8d8d8d8d8d8000000008080808080808080808080808080808080"
+	$"80808080808080808080808080808080808080000000d8d8d8d8d8d89898"
+	$"98989898d8d8d8d8d8d8989898989898d8d8d8d8d8d8d8d8d800000000b8"
+	$"b8b8ffffffb8b8b8b8b8b8c0c0c0808080ffffffc0c0c0b8b8b8b8b8b8b8"
+	$"b8b8808080000000d8d8d8d8d8d8989898d8d8d8d8d8d8d8d8d8989898d8"
+	$"d8d8d8d8d8d8d8d8d8d8d800000000b8b8b8ffffffb8b8b8b8b8b8c0c0c0"
+	$"808080ffffffc0c0c0b8b8b8b8b8b8b8b8b8808080000000d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8000000"
+	$"00b8b8b8ffffffb8b8b8b8b8b8c0c0c0808080ffffffc0c0c0b8b8b8b8b8"
+	$"b8b8b8b8808080000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d800000000b8b8b8ffffffffffffffffffff"
+	$"ffff808080ffffffffffffffffffffffffffffff808080000000d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800"
+	$"000000b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8808080b8b8b8b8b8b8b8b8b8"
+	$"b8b8b8b8b8b8808080000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d80000000000000000000000"
+	$"00000000585858000000000000000000000000000000000000d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8000000000000000000d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8000000d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
+	$"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800"
 };
Index: src/preferences/mouse/MouseView.h
===================================================================
--- src/preferences/mouse/MouseView.h	(revision 30852)
+++ src/preferences/mouse/MouseView.h	(working copy)
@@ -18,40 +18,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);
+				int32			ConvertFromVisualOrder(int32 button);
 
-		typedef BView inherited;
+				typedef			BView inherited;
 
-		const MouseSettings &fSettings;
-		BBitmap		*fMouseBitmap, *fMouseDownBitmap;
-		BRect		fMouseDownBounds;
+		const	MouseSettings	&fSettings;
+				BBitmap			*fMouseBitmap, *fMouseDownBitmap;
+				BRect			fMouseDownBounds;
 
-		int32		fType;
-		uint32		fButtons;
-		uint32		fOldButtons;
+				int32			fType;
+				uint32			fButtons;
+				uint32			fOldButtons;
 };
 
 #endif	/* MOUSE_VIEW_H */
Index: src/preferences/mouse/MouseConstants.h
===================================================================
--- src/preferences/mouse/MouseConstants.h	(revision 30852)
+++ src/preferences/mouse/MouseConstants.h	(working copy)
@@ -10,6 +10,7 @@
 //  Authors:		Jérôme Duval,
 //					Andrew McCall (mccall@digitalparadise.co.uk)
 //					Axel Dörfler (axeld@pinc-software.de)
+//					Brecht Machiels (brecht@mos6581.org)
 //  Description:	Mouse Preferences
 //  Created:		December 10, 2003
 //
@@ -18,12 +19,15 @@
 #ifndef MOUSE_CONSTANTS_H
 #define MOUSE_CONSTANTS_H
 
+
 // interface messages
 const uint32 kMsgDefaults			= 'BTde';
 const uint32 kMsgRevert				= 'BTre';
 
 const uint32 kMsgMouseType			= 'PUmt';
 const uint32 kMsgMouseFocusMode		= 'PUmf';
+const uint32 kMsgFollowsMouseMode	= 'PUff';
+const uint32 kMsgAcceptFirstClick	= 'PUaf';
 const uint32 kMsgMouseMap			= 'PUmm';
 
 const uint32 kMsgDoubleClickSpeed	= 'SLdc';
Index: src/preferences/mouse/SettingsView.cpp
===================================================================
--- src/preferences/mouse/SettingsView.cpp	(revision 30852)
+++ src/preferences/mouse/SettingsView.cpp	(working copy)
@@ -8,27 +8,31 @@
 //
 //  File:			SettingsView.cpp
 //  Authors:		Jérôme Duval,
-//					Andrew McCall (mccall@digitalparadise.co.uk)
-//					Axel Dörfler (axeld@pinc-software.de)
+//					Andrew McCall (mccall@digitalparadise.co.uk),
+//					Axel Dörfler (axeld@pinc-software.de),
+//  				Brecht Machiels (brecht@mos6581.org)
 //  Description:	Mouse Preferences
 //  Created:		December 10, 2003
 // 
 // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
 
-#include <InterfaceDefs.h>
-#include <Button.h>
-#include <Box.h>
+#include "SettingsView.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"
@@ -41,145 +45,179 @@
 		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;
 	}
 }
 
 
 //	#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");
 
+	fDoubleClickView = new BBitmapView(*fDoubleClickBitmap);
+	fSpeedView = new BBitmapView(*fSpeedBitmap);
+	fAccelerationView = new BBitmapView(*fAccelerationBitmap);
+
 	// 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->Bounds().Height()) / 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->Bounds().Height()) / 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->Bounds().Height()) / 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[0]) + 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 - fDoubleClickBitmap->Bounds().right - 15; 
-	fSpeedBmpPoint.x = fRightArea.right - fSpeedBitmap->Bounds().right - 15;
-	fAccelerationBmpPoint.x = fRightArea.right - fAccelerationBitmap->Bounds().right - 15;
+		fFocusFollowsMouseMenu->AddItem(new BMenuItem(focusFollowsMouseLabels[i],
+			message));
+	}
 
-	// Resize sliders to equal size
-	length = fRightArea.left - 5;
-	fClickSpeedSlider->ResizeTo(fDoubleClickBmpPoint.x - length - 11, 
-			fClickSpeedSlider->Bounds().Height());
-	fMouseSpeedSlider->ResizeTo(fSpeedBmpPoint.x - length, 
-			fMouseSpeedSlider->Bounds().Height());
-	fAccelerationSlider->ResizeTo(fAccelerationBmpPoint.x - length, 
-			fAccelerationSlider->Bounds().Height());
+	BMenuField *fFocusFollowsMouseField = new BMenuField("Focus follows mouse mode:",
+		fFocusFollowsMouseMenu, NULL);
+	fFocusFollowsMouseField->SetAlignment(B_ALIGN_RIGHT);
 
-	// Mouse image...
-	frame.Set(0, 0, 148, 162);
-	fMouseView = new MouseView(frame, fSettings);
-	fMouseView->ResizeToPreferred();
-	fMouseView->MoveBy((fLeftArea.right - fMouseView->Bounds().Width()) / 2,
-		(fLeftArea.bottom - fMouseView->Bounds().Height()) / 2);
-	AddChild(fMouseView);
+	// Add the "Click-through" check box
+	fAcceptFirstClickBox = new BCheckBox("Accept first click",
+		new BMessage(kMsgAcceptFirstClick));
 
-	// Create the "Double-click test area" text box...
-	frame.Set(fLeftArea.left, fLeftArea.bottom + 10, fLeftArea.right, 0);
-	BTextControl *textControl = new BTextControl(frame, "double_click_test_area", NULL,
-		"Double-click test area", NULL);
-	textControl->SetAlignment(B_ALIGN_LEFT, B_ALIGN_CENTER);
-	AddChild(textControl);
+	// dividers
+	BBox* hdivider = new BBox(
+		BRect(0, 0, 1, 1), B_EMPTY_STRING, B_FOLLOW_ALL_SIDES,
+			B_WILL_DRAW | B_FRAME_EVENTS, B_FANCY_BORDER);
+	hdivider->SetExplicitMaxSize(BSize(1, B_SIZE_UNLIMITED));
+	
+	BBox* vdivider = new BBox(
+		BRect(0, 0, 1, 1), B_EMPTY_STRING, B_FOLLOW_ALL_SIDES,
+			B_WILL_DRAW | B_FRAME_EVENTS, B_FANCY_BORDER);
+	vdivider->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, 1));
 
-	ResizeTo(fRightArea.right + 5, fLeftArea.bottom + 60);
+	// Build the layout
+	SetLayout(new BGroupLayout(B_HORIZONTAL));
+
+	AddChild(BGroupLayoutBuilder(B_VERTICAL, 10)
+		.AddGroup(B_HORIZONTAL, 10)
+			.AddGroup(B_VERTICAL, 10, 1)
+				.AddGroup(B_HORIZONTAL, 10)
+					.AddGlue()
+					.Add(fTypeField)
+					.AddGlue()
+				.End()
+				.AddGlue()
+				.Add(BGroupLayoutBuilder(B_HORIZONTAL, 10)
+					.AddGlue()
+					.Add(fMouseView)
+					.AddGlue()
+				)
+				.AddGlue()
+				.Add(fDoubleClick)
+			.End()
+			.Add(hdivider)
+			.AddGroup(B_VERTICAL, 5, 3)
+				.Add(BGroupLayoutBuilder(B_HORIZONTAL, 0)
+					.Add(fClickSpeedSlider)
+					.Add(fDoubleClickView)
+				)
+				.Add(BGroupLayoutBuilder(B_HORIZONTAL, 0)
+					.Add(fMouseSpeedSlider)
+					.Add(fSpeedView)
+				)
+				.Add(BGroupLayoutBuilder(B_HORIZONTAL, 0)
+					.Add(fAccelerationSlider)
+					.Add(fAccelerationView)
+				)
+			.End()
+		.End()
+		.Add(vdivider)
+		.AddGroup(B_HORIZONTAL, 10)
+			.Add(fFocusField)
+			.AddGlue()
+			.AddGroup(B_VERTICAL, 0)
+				.Add(fAcceptFirstClickBox)
+				.Add(fFocusFollowsMouseField)
+			.End()
+		.End()
+		.SetInsets(5, 5, 5, 5)
+	);
 }
 
 
@@ -199,70 +237,6 @@
 
 
 void 
-SettingsView::GetPreferredSize(float *_width, float *_height)
-{
-	if (_width)
-		*_width = fRightArea.right + 5;
-	if (_height)
-		*_height = fLeftArea.bottom + 60;
-}
-
-
-void 
-SettingsView::Draw(BRect updateFrame)
-{
-	inherited::Draw(updateFrame);
-
-	SetHighColor(120, 120, 120);
-	SetLowColor(255, 255, 255);
-	
-	// Line above the test area
-	fLeft = fLeftArea.LeftBottom();
-	fRight = fLeftArea.RightBottom();
-	StrokeLine(fLeft, fRight, B_SOLID_HIGH);
-	fLeft.y++; fRight.y++;
-	StrokeLine(fLeft, fRight, B_SOLID_LOW);
-	
-	// Line above focus follows mouse
-	fLeft = fRightArea.LeftBottom();
-	fRight = fRightArea.RightBottom();
-	StrokeLine(fLeft, fRight, B_SOLID_HIGH);
-	fLeft.y++; fRight.y++;
-	StrokeLine(fLeft, fRight, B_SOLID_LOW);
-	
-	// Line in the middle
-	fLeft = fLeftArea.RightTop();
-	fRight = fLeftArea.RightBottom();
-	fLeft.x += 5;
-	fRight.x += 5;
-	StrokeLine(fLeft, fRight, B_SOLID_HIGH);
-	fLeft.x++; fRight.x++;
-	StrokeLine(fLeft, fRight, B_SOLID_LOW);
-
-	SetDrawingMode(B_OP_OVER);
-
-	// Draw the icons
-	if (fDoubleClickBitmap != NULL 
-		&& updateFrame.Intersects(BRect(fDoubleClickBmpPoint,
-			fDoubleClickBmpPoint + fDoubleClickBitmap->Bounds().RightBottom())))
-		DrawBitmapAsync(fDoubleClickBitmap, fDoubleClickBmpPoint);
-
-	if (fSpeedBitmap != NULL 
-		&& updateFrame.Intersects(BRect(fSpeedBmpPoint,
-			fSpeedBmpPoint + fSpeedBitmap->Bounds().RightBottom())))
-		DrawBitmapAsync(fSpeedBitmap, fSpeedBmpPoint);
-	
-	if (fAccelerationBitmap != NULL 
-		&& updateFrame.Intersects(BRect(fAccelerationBmpPoint,
-			fAccelerationBmpPoint + fAccelerationBitmap->Bounds().RightBottom())))
-		DrawBitmapAsync(fAccelerationBitmap, fAccelerationBmpPoint);
-	
-
-	SetDrawingMode(B_OP_COPY);
-}
-
-
-void 
 SettingsView::SetMouseType(int32 type)
 {
 	fMouseView->SetMouseType(type);
@@ -300,5 +274,13 @@
 	item = fFocusMenu->ItemAt(mouse_mode_to_index(fSettings.MouseMode()));
 	if (item != NULL)
 		item->SetMarked(true);
+		
+	item = fFocusFollowsMouseMenu->ItemAt(focus_follows_mouse_mode_to_index(fSettings.FocusFollowsMouseMode()));
+	if (item != NULL)
+		item->SetMarked(true);
+
+	fFocusFollowsMouseMenu->SetEnabled(fSettings.MouseMode() == B_FOCUS_FOLLOWS_MOUSE);
+	
+	fAcceptFirstClickBox->SetValue(fSettings.AcceptFirstClick() ? B_CONTROL_ON : B_CONTROL_OFF);
 }
 
Index: src/apps/deskbar/BarWindow.cpp
===================================================================
--- src/apps/deskbar/BarWindow.cpp	(revision 30852)
+++ src/apps/deskbar/BarWindow.cpp	(working copy)
@@ -75,7 +75,8 @@
 	: BWindow(BRect(-1000.0f, -1000.0f, -1000.0f, -1000.0f), "Deskbar",
 		B_BORDERED_WINDOW,
 		B_WILL_ACCEPT_FIRST_CLICK | B_NOT_ZOOMABLE | B_NOT_CLOSABLE
-			| B_NOT_MOVABLE | B_AVOID_FRONT | B_ASYNCHRONOUS_CONTROLS,
+			| B_NOT_MOVABLE | B_ASYNCHRONOUS_CONTROLS
+			| B_AVOID_FOCUS,
 		B_ALL_WORKSPACES)
 {
 	desk_settings *settings = ((TBarApp *)be_app)->Settings();
Index: src/servers/app/DesktopSettings.h
===================================================================
--- src/servers/app/DesktopSettings.h	(revision 30852)
+++ src/servers/app/DesktopSettings.h	(working copy)
@@ -44,7 +44,9 @@
 		void			GetMenuInfo(menu_info& info) const;
 
 		mode_mouse		MouseMode() const;
+		mode_focus_follows_mouse	FocusFollowsMouseMode() const;
 		bool			FocusFollowsMouse() const;
+		bool			AcceptFirstClick() const;
 
 		bool			ShowAllDraggers() const;
 
@@ -75,6 +77,8 @@
 		void			SetMenuInfo(const menu_info& info);
 
 		void			SetMouseMode(mode_mouse mode);
+		void			SetFocusFollowsMouseMode(const mode_focus_follows_mouse mode);
+		void			SetAcceptFirstClick(bool accept_first_click);
 
 		void			SetShowAllDraggers(bool show);
 
Index: src/servers/app/ServerApp.cpp
===================================================================
--- src/servers/app/ServerApp.cpp	(revision 30852)
+++ src/servers/app/ServerApp.cpp	(working copy)
@@ -18,6 +18,27 @@
 	\brief Counterpart to BApplication within the app_server
 */
 
+#include "ServerApp.h"
+
+#include <new>
+#include <stdio.h>
+#include <string.h>
+#include <syslog.h>
+
+#include <AppDefs.h>
+#include <Autolock.h>
+#include <Debug.h>
+#include <List.h>
+#include <ScrollBar.h>
+#include <Shape.h>
+#include <String.h>
+
+#include <FontPrivate.h>
+#include <MessengerPrivate.h>
+#include <RosterPrivate.h>
+#include <ServerProtocol.h>
+#include <WindowPrivate.h>
+
 #include "AppServer.h"
 #include "BitmapManager.h"
 #include "CursorManager.h"
@@ -31,7 +52,6 @@
 #include "InputManager.h"
 #include "OffscreenServerWindow.h"
 #include "Screen.h"
-#include "ServerApp.h"
 #include "ServerBitmap.h"
 #include "ServerConfig.h"
 #include "ServerCursor.h"
@@ -41,26 +61,7 @@
 #include "SystemPalette.h"
 #include "Window.h"
 
-#include <FontPrivate.h>
-#include <MessengerPrivate.h>
-#include <RosterPrivate.h>
-#include <ServerProtocol.h>
-#include <WindowPrivate.h>
 
-#include <AppDefs.h>
-#include <Autolock.h>
-#include <Debug.h>
-#include <List.h>
-#include <ScrollBar.h>
-#include <Shape.h>
-#include <String.h>
-
-#include <new>
-#include <stdio.h>
-#include <string.h>
-#include <syslog.h>
-
-
 //#define DEBUG_SERVERAPP
 #ifdef DEBUG_SERVERAPP
 #	define STRACE(x) debug_printf x
@@ -1050,9 +1051,9 @@
 
 		case AS_SET_MOUSE_MODE:
 		{
-			STRACE(("ServerApp %s: Set Focus Follows Mouse mode\n", Signature()));
+			STRACE(("ServerApp %s: Set Mouse Focus mode\n", Signature()));
 			// Attached Data:
-			// 1) enum mode_mouse FFM mouse mode
+			// 1) enum mode_mouse mouse focus mode
 			mode_mouse mouseMode;
 			if (link.Read<mode_mouse>(&mouseMode) == B_OK) {
 				LockedDesktopSettings settings(fDesktop);
@@ -1062,7 +1063,7 @@
 		}
 		case AS_GET_MOUSE_MODE:
 		{
-			STRACE(("ServerApp %s: Get Focus Follows Mouse mode\n", Signature()));
+			STRACE(("ServerApp %s: Get Mouse Focus mode\n", Signature()));
 
 			if (fDesktop->LockSingleWindow()) {
 				DesktopSettings settings(fDesktop);
@@ -1077,7 +1078,65 @@
 			fLink.Flush();
 			break;
 		}
+		case AS_SET_FOCUS_FOLLOWS_MOUSE_MODE:
+		{
+			STRACE(("ServerApp %s: Set Focus Follows Mouse mode\n", Signature()));
+			// Attached Data:
+			// 1) enum mode_focus_follows_mouse FFM mouse mode
+			mode_focus_follows_mouse focusFollowsMousMode;
+			if (link.Read<mode_focus_follows_mouse>(&focusFollowsMousMode) == B_OK) {
+				LockedDesktopSettings settings(fDesktop);
+				settings.SetFocusFollowsMouseMode(focusFollowsMousMode);
+			}
+			break;
+		}
+		case AS_GET_FOCUS_FOLLOWS_MOUSE_MODE:
+		{
+			STRACE(("ServerApp %s: Get Focus Follows Mouse mode\n", Signature()));
 
+			if (fDesktop->LockSingleWindow()) {
+				DesktopSettings settings(fDesktop);
+
+				fLink.StartMessage(B_OK);
+				fLink.Attach<mode_focus_follows_mouse>(settings.FocusFollowsMouseMode());
+
+				fDesktop->UnlockSingleWindow();
+			} else
+				fLink.StartMessage(B_ERROR);
+
+			fLink.Flush();
+			break;
+		}
+		case AS_SET_ACCEPT_FIRST_CLICK:
+		{
+			STRACE(("ServerApp %s: Set Accept First Click\n", Signature()));
+			// Attached Data:
+			// 1) bool accept_first_click
+			bool acceptFirstClick;
+			if (link.Read<bool>(&acceptFirstClick) == B_OK) {
+				LockedDesktopSettings settings(fDesktop);
+				settings.SetAcceptFirstClick(acceptFirstClick);
+			}
+			break;
+		}
+		case AS_GET_ACCEPT_FIRST_CLICK:
+		{
+			STRACE(("ServerApp %s: Get Accept First Click\n", Signature()));
+
+			if (fDesktop->LockSingleWindow()) {
+				DesktopSettings settings(fDesktop);
+
+				fLink.StartMessage(B_OK);
+				fLink.Attach<bool>(settings.AcceptFirstClick());
+
+				fDesktop->UnlockSingleWindow();
+			} else
+				fLink.StartMessage(B_ERROR);
+
+			fLink.Flush();
+			break;
+		}
+
 		case AS_GET_SHOW_ALL_DRAGGERS:
 		{
 			STRACE(("ServerApp %s: Get Show All Draggers\n", Signature()));
Index: src/servers/app/Window.h
===================================================================
--- src/servers/app/Window.h	(revision 30852)
+++ src/servers/app/Window.h	(working copy)
@@ -6,7 +6,8 @@
  *		DarkWyrm <bpmagic@columbus.rr.com>
  *		Adi Oanca <adioanca@gmail.com>
  *		Stephan Aßmus <superstippi@gmx.de>
- *		Axel Dörfler, axeld@pinc-software.de
+ *		Axel Dörfler <axeld@pinc-software.de>
+ *		Brecht Machiels <brecht@mos6581.org>
  */
 #ifndef WINDOW_H
 #define WINDOW_H
Index: src/servers/app/Desktop.h
===================================================================
--- src/servers/app/Desktop.h	(revision 30852)
+++ src/servers/app/Desktop.h	(working copy)
@@ -5,8 +5,9 @@
  * Authors:
  *		Adrian Oanca <adioanca@cotty.iren.ro>
  *		Stephan Aßmus <superstippi@gmx.de>
- *		Axel Dörfler, axeld@pinc-software.de
+ *		Axel Dörfler <axeld@pinc-software.de>
  *		Andrej Spielmann, <andrej.spielmann@seh.ox.ac.uk>
+ *		Brecht Machiels <brecht@mos6581.org>
  */
 #ifndef DESKTOP_H
 #define DESKTOP_H
@@ -116,6 +117,7 @@
 
 		// Window methods
 
+		void					SelectWindow(Window* window);
 		void					ActivateWindow(Window* window);
 		void					SendWindowBehind(Window* window,
 									Window* behindOf = NULL);
Index: src/servers/app/DesktopSettings.cpp
===================================================================
--- src/servers/app/DesktopSettings.cpp	(revision 30852)
+++ src/servers/app/DesktopSettings.cpp	(working copy)
@@ -11,6 +11,15 @@
 
 #include "DesktopSettings.h"
 #include "DesktopSettingsPrivate.h"
+
+#include <Directory.h>
+#include <File.h>
+#include <FindDirectory.h>
+#include <Path.h>
+
+#include <DefaultColors.h>
+#include <ServerReadOnlyMemory.h>
+
 #include "Desktop.h"
 #include "FontCache.h"
 #include "FontCacheEntry.h"
@@ -18,15 +27,7 @@
 #include "GlobalSubpixelSettings.h"
 #include "ServerConfig.h"
 
-#include <DefaultColors.h>
-#include <ServerReadOnlyMemory.h>
 
-#include <Directory.h>
-#include <File.h>
-#include <FindDirectory.h>
-#include <Path.h>
-
-
 DesktopSettingsPrivate::DesktopSettingsPrivate(server_read_only_memory* shared)
 	:
 	fShared(*shared)
@@ -50,6 +51,8 @@
 	fFixedFont = *gFontManager->DefaultFixedFont();
 
 	fMouseMode = B_NORMAL_MOUSE;
+	fFocusFollowsMouseMode = B_NORMAL_FOCUS_FOLLOWS_MOUSE;
+	fAcceptFirstClick = false;
 	fShowAllDraggers = true;
 
 	// init scrollbar info
@@ -186,9 +189,17 @@
 		status = settings.Unflatten(&file);
 		if (status == B_OK) {
 			int32 mode;
-			if (settings.FindInt32("mode", &mode) == B_OK) {
+			if (settings.FindInt32("mode", &mode) == B_OK)
 				fMouseMode = (mode_mouse)mode;
+			int32 focus_follows_mouse_mode;
+			if (settings.FindInt32("focus follows mouse mode",
+				&focus_follows_mouse_mode) == B_OK) {
+				fFocusFollowsMouseMode =
+					(mode_focus_follows_mouse)focus_follows_mouse_mode;
 			}
+			bool accept_first_click;
+			if (settings.FindBool("accept first click", &accept_first_click) == B_OK)
+				fAcceptFirstClick = accept_first_click;
 		}
 	}
 
@@ -337,6 +348,8 @@
 		if (path.Append("mouse") == B_OK) {
 			BMessage settings('asms');
 			settings.AddInt32("mode", (int32)fMouseMode);
+			settings.AddInt32("focus follows mouse mode", (int32)fFocusFollowsMouseMode);
+			settings.AddBool("accept first click", fAcceptFirstClick);
 
 			BFile file;
 			status = file.SetTo(path.Path(), B_CREATE_FILE | B_ERASE_FILE
@@ -485,6 +498,14 @@
 }
 
 
+void
+DesktopSettingsPrivate::SetFocusFollowsMouseMode(const mode_focus_follows_mouse mode)
+{
+	fFocusFollowsMouseMode = mode;
+	Save(kMouseSettings);
+}
+
+
 mode_mouse
 DesktopSettingsPrivate::MouseMode() const
 {
@@ -492,10 +513,32 @@
 }
 
 
+mode_focus_follows_mouse
+DesktopSettingsPrivate::FocusFollowsMouseMode() const
+{
+	return fFocusFollowsMouseMode;
+}
+
+
+void
+DesktopSettingsPrivate::SetAcceptFirstClick(const bool accept_first_click)
+{
+	fAcceptFirstClick = accept_first_click;
+	Save(kMouseSettings);
+}
+
+
 bool
+DesktopSettingsPrivate::AcceptFirstClick() const
+{
+	return fAcceptFirstClick;
+}
+
+
+bool
 DesktopSettingsPrivate::FocusFollowsMouse() const
 {
-	return MouseMode() != B_NORMAL_MOUSE;
+	return MouseMode() == B_FOCUS_FOLLOWS_MOUSE;
 }
 
 
@@ -697,6 +740,13 @@
 }
 
 
+mode_focus_follows_mouse
+DesktopSettings::FocusFollowsMouseMode() const
+{
+	return fSettings->FocusFollowsMouseMode();
+}
+
+
 bool
 DesktopSettings::FocusFollowsMouse() const
 {
@@ -705,6 +755,13 @@
 
 
 bool
+DesktopSettings::AcceptFirstClick() const
+{
+	return fSettings->AcceptFirstClick();
+}
+
+
+bool
 DesktopSettings::ShowAllDraggers() const
 {
 	return fSettings->ShowAllDraggers();
@@ -826,6 +883,20 @@
 
 
 void
+LockedDesktopSettings::SetFocusFollowsMouseMode(const mode_focus_follows_mouse mode)
+{
+	fSettings->SetFocusFollowsMouseMode(mode);
+}
+
+
+void
+LockedDesktopSettings::SetAcceptFirstClick(const bool accept_first_click)
+{
+	fSettings->SetAcceptFirstClick(accept_first_click);
+}
+
+
+void
 LockedDesktopSettings::SetShowAllDraggers(bool show)
 {
 	fSettings->SetShowAllDraggers(show);
Index: src/servers/app/DefaultDecorator.h
===================================================================
--- src/servers/app/DefaultDecorator.h	(revision 30852)
+++ src/servers/app/DefaultDecorator.h	(working copy)
@@ -10,9 +10,11 @@
 #define DEFAULT_DECORATOR_H
 
 
-#include "Decorator.h"
 #include <Region.h>
 
+#include "Decorator.h"
+
+
 class Desktop;
 class ServerBitmap;
 
Index: src/servers/app/ServerWindow.cpp
===================================================================
--- src/servers/app/ServerWindow.cpp	(revision 30852)
+++ src/servers/app/ServerWindow.cpp	(working copy)
@@ -6,10 +6,11 @@
  *		DarkWyrm <bpmagic@columbus.rr.com>
  *		Adrian Oanca <adioanca@gmail.com>
  *		Stephan Aßmus <superstippi@gmx.de>
- *		Stefano Ceccherini (burton666@libero.it)
- *		Axel Dörfler, axeld@pinc-software.de
+ *		Stefano Ceccherini <burton666@libero.it>
+ *		Axel Dörfler <axeld@pinc-software.de>
  *		Artur Wyszynski <harakash@gmail.com>
- *		Philippe Saint-Pierre, stpere@gmail.com
+ *		Philippe Saint-Pierre <stpere@gmail.com>
+ *		Brecht Machiels <brecht@mos6581.org>
  */
 
 /*!
@@ -699,7 +700,7 @@
 			fDesktop->UnlockSingleWindow();
 
 			if (activate)
-				fDesktop->ActivateWindow(fWindow);
+				fDesktop->SelectWindow(fWindow);
 			else
 				fDesktop->SendWindowBehind(fWindow, NULL);
 
Index: src/servers/app/ProfileMessageSupport.cpp
===================================================================
--- src/servers/app/ProfileMessageSupport.cpp	(revision 30852)
+++ src/servers/app/ProfileMessageSupport.cpp	(working copy)
@@ -169,6 +169,12 @@
 		case AS_IDLE_TIME: string = "AS_IDLE_TIME"; break;
 		case AS_SET_MOUSE_MODE: string = "AS_SET_MOUSE_MODE"; break;
 		case AS_GET_MOUSE_MODE: string = "AS_GET_MOUSE_MODE"; break;
+		case AS_SET_FOCUS_FOLLOWS_MOUSE_MODE:
+			string = "AS_SET_FOCUS_FOLLOWS_MOUSE_MODE"; break;
+		case AS_GET_FOCUS_FOLLOWS_MOUSE_MODE:
+			string = "AS_GET_FOCUS_FOLLOWS_MOUSE_MODE"; break;
+		case AS_SET_ACCEPT_FIRST_CLICK: string = "AS_SET_ACCEPT_FIRST_CLICK"; break;
+		case AS_GET_ACCEPT_FIRST_CLICK: string = "AS_GET_ACCEPT_FIRST_CLICK"; break;
 		case AS_GET_MOUSE: string = "AS_GET_MOUSE"; break;
 		case AS_SET_DECORATOR_SETTINGS: string = "AS_SET_DECORATOR_SETTINGS"; break;
 		case AS_GET_DECORATOR_SETTINGS: string = "AS_GET_DECORATOR_SETTINGS"; break;
Index: src/servers/app/Window.cpp
===================================================================
--- src/servers/app/Window.cpp	(revision 30852)
+++ src/servers/app/Window.cpp	(working copy)
@@ -6,7 +6,8 @@
  *		DarkWyrm <bpmagic@columbus.rr.com>
  *		Adi Oanca <adioanca@gmail.com>
  *		Stephan Aßmus <superstippi@gmx.de>
- *		Axel Dörfler, axeld@pinc-software.de
+ *		Axel Dörfler <axeld@pinc-software.de>
+ *		Brecht Machiels <brecht@mos6581.org>
  */
 
 
@@ -757,6 +758,8 @@
 void
 Window::MouseDown(BMessage* message, BPoint where, int32* _viewToken)
 {
+	DesktopSettings desktopSettings(fDesktop);
+
 	// TODO: move into Decorator
 	if (!fBorderRegionValid)
 		GetBorderRegion(&fBorderRegion);
@@ -770,11 +773,13 @@
 		if (fDecorator)
 			action = _ActionFor(message);
 
-		// ignore clicks on decorator buttons if the
-		// non-floating window doesn't have focus
-		if (!IsFocus() && !IsFloating() && action != DEC_MOVETOBACK
-			&& action != DEC_RESIZE && action != DEC_SLIDETAB)
-			action = DEC_DRAG;
+		if (!desktopSettings.AcceptFirstClick()) {
+			// ignore clicks on decorator buttons if the
+			// non-floating window doesn't have focus
+			if (!IsFocus() && !IsFloating() && action != DEC_MOVETOBACK
+				&& action != DEC_RESIZE && action != DEC_SLIDETAB)
+				action = DEC_DRAG;
+		}
 
 		// set decorator internals
 		switch (action) {
@@ -838,20 +843,30 @@
 
 		// based on what the Decorator returned, properly place this window.
 		if (action == DEC_MOVETOBACK) {
-			fDesktop->SendWindowBehind(this);
+			if (desktopSettings.MouseMode() == B_CLICK_TO_FOCUS_MOUSE) {
+				bool covered = true;
+				BRegion fullRegion;
+				GetFullRegion(&fullRegion);
+				if (fullRegion == VisibleRegion()) {
+    				// window is overlapped.
+    				covered = false;
+				}
+				if (this != fDesktop->FrontWindow() && covered)
+					fDesktop->ActivateWindow(this);
+				else
+					fDesktop->SendWindowBehind(this);
+			} else
+				fDesktop->SendWindowBehind(this);
 		} else {
 			fDesktop->SetMouseEventWindow(this);
 
-			// activate window if not in FFM mode
-			DesktopSettings desktopSettings(fDesktop);
-			if (!desktopSettings.FocusFollowsMouse()) {
+			// activate window if in click to activate mode, else only focus it
+			if (desktopSettings.MouseMode() == B_NORMAL_MOUSE)
 				fDesktop->ActivateWindow(this);
-			} else {
-				// actually, the window should already be
-				// focused since the mouse would have to
-				// be over it, but just for completeness...
+			else {
 				fDesktop->SetFocusWindow(this);
-				if (action == DEC_DRAG) {
+				if (desktopSettings.MouseMode() == B_FOCUS_FOLLOWS_MOUSE
+					&& action == DEC_DRAG) {
 					fActivateOnMouseUp = true;
 					fLastMoveTime = system_time();
 				}
@@ -865,13 +880,17 @@
 
 			// clicking a simple View
 			if (!IsFocus()) {
-				DesktopSettings desktopSettings(fDesktop);
+				bool acceptFirstClick = desktopSettings.AcceptFirstClick()
+					|| ((Flags() & B_WILL_ACCEPT_FIRST_CLICK) != 0);
+				bool avoidFocus = (Flags() & B_AVOID_FOCUS) != 0;
 
-				// Activate window in case it doesn't accept first click, and
-				// we're not in FFM mode
-				if ((Flags() & B_WILL_ACCEPT_FIRST_CLICK) == 0
-					&& !desktopSettings.FocusFollowsMouse())
+				// Activate or focus the window in case it doesn't accept first click,
+				// depending on the mouse mode
+				if (desktopSettings.MouseMode() == B_NORMAL_MOUSE
+					&& !acceptFirstClick)
 					fDesktop->ActivateWindow(this);
+				else if (!avoidFocus)
+					fDesktop->SetFocusWindow(this);
 
 				// Eat the click if we don't accept first click
 				// (B_AVOID_FOCUS never gets the focus, so they always accept
@@ -879,8 +898,7 @@
 				// TODO: the latter is unlike BeOS - if we really wanted to
 				// imitate this behaviour, we would need to check if we're
 				// the front window instead of the focus window
-				if ((Flags() & (B_WILL_ACCEPT_FIRST_CLICK
-						| B_AVOID_FOCUS)) == 0)
+				if (!acceptFirstClick && !avoidFocus)
 					return;
 			}
 
@@ -936,6 +954,17 @@
 		engine->UnlockParallelAccess();
 
 		fRegionPool.Recycle(visibleBorder);
+
+		int32 buttons;
+		if (message->FindInt32("buttons", &buttons) != B_OK)
+			buttons = 0;
+
+		// if the primary mouse button is released, stop dragging/resizing/sliding
+		if ((buttons & B_PRIMARY_MOUSE_BUTTON) == 0) {
+			fIsDragging = false;
+			fIsResizing = false;
+			fIsSlidingTab = false;
+		}
 	}
 
 	// in FFM mode, activate the window and bring it
@@ -949,10 +978,6 @@
 			fDesktop->ActivateWindow(this);
 	}
 
-	fIsDragging = false;
-	fIsResizing = false;
-	fIsSlidingTab = false;
-
 	if (View* view = ViewAt(where)) {
 		if (HasModal())
 			return;
Index: src/servers/app/Desktop.cpp
===================================================================
--- src/servers/app/Desktop.cpp	(revision 30852)
+++ src/servers/app/Desktop.cpp	(working copy)
@@ -5,8 +5,9 @@
  * Authors:
  *		Adrian Oanca <adioanca@cotty.iren.ro>
  *		Stephan Aßmus <superstippi@gmx.de>
- *		Axel Dörfler, axeld@pinc-software.de
+ *		Axel Dörfler <axeld@pinc-software.de>
  *		Andrej Spielmann, <andrej.spielmann@seh.ox.ac.uk>
+ *		Brecht Machiels <brecht@mos6581.org>
  */
 
 /*!	Class used to encapsulate desktop management */
@@ -14,6 +15,22 @@
 
 #include "Desktop.h"
 
+#include <stdio.h>
+#include <string.h>
+#include <syslog.h>
+
+#include <Debug.h>
+#include <DirectWindow.h>
+#include <Entry.h>
+#include <Message.h>
+#include <MessageFilter.h>
+#include <Region.h>
+#include <Roster.h>
+
+#include <ViewPrivate.h>
+#include <WindowInfo.h>
+#include <ServerProtocol.h>
+
 #include "AppServer.h"
 #include "DesktopSettingsPrivate.h"
 #include "DrawingEngine.h"
@@ -30,22 +47,7 @@
 #include "Workspace.h"
 #include "WorkspacesView.h"
 
-#include <ViewPrivate.h>
-#include <WindowInfo.h>
-#include <ServerProtocol.h>
 
-#include <Debug.h>
-#include <DirectWindow.h>
-#include <Entry.h>
-#include <Message.h>
-#include <MessageFilter.h>
-#include <Region.h>
-#include <Roster.h>
-
-#include <stdio.h>
-#include <string.h>
-#include <syslog.h>
-
 #if TEST_MODE
 #	include "EventStream.h"
 #endif
@@ -233,7 +235,8 @@
 
 			case B_MOUSE_UP:
 				window->MouseUp(message, where, &viewToken);
-				fDesktop->SetMouseEventWindow(NULL);
+				if (buttons == 0)
+					fDesktop->SetMouseEventWindow(NULL);
 				break;
 
 			case B_MOUSE_MOVED:
@@ -1458,11 +1461,11 @@
 
 	uint32 list = fCurrentWorkspace;
 
-	if (fSettings->FocusFollowsMouse())
+	if (fSettings->MouseMode() != B_NORMAL_MOUSE)
 		list = kFocusList;
 
 	if (focus == NULL || hasModal) {
-		if (!fSettings->FocusFollowsMouse()) {
+		if (fSettings->MouseMode() == B_NORMAL_MOUSE) {
 			focus = FrontWindow();
 			if (focus == NULL) {
 				// there might be no front window in case of only a single
@@ -1608,6 +1611,25 @@
 }
 
 
+/*!
+	\brief Activates or focusses the window, based on the mouse mode.
+*/
+void
+Desktop::SelectWindow(Window* window)
+{
+	if (fSettings->MouseMode() != B_NORMAL_MOUSE) {
+		// Only bring the window to front when it is not the window under the
+		// mouse pointer. This should result in sensible behaviour.
+		if (window != fWindowUnderMouse
+			|| (window == fWindowUnderMouse && window != FocusWindow()))
+			ActivateWindow(window);
+		else
+			SetFocusWindow(window);
+	} else
+		ActivateWindow(window);
+}
+
+
 /*!	\brief Tries to move the specified window to the front of the screen,
 		and make it the focus window.
 
@@ -1715,9 +1737,9 @@
 		for (Window* modal = frontmost; modal != NULL; modal = nextModal) {
 			// get the next modal window
 			nextModal = modal->NextWindow(fCurrentWorkspace);
-			while (nextModal != NULL && !nextModal->IsModal()) {
+			while (nextModal != NULL && !nextModal->IsModal())
 				nextModal = nextModal->NextWindow(fCurrentWorkspace);
-			}
+				
 			if (nextModal != NULL && !nextModal->HasInSubset(window))
 				nextModal = NULL;
 
@@ -1768,8 +1790,10 @@
 	MarkDirty(dirty);
 
 	_UpdateFronts();
-	SetFocusWindow(fSettings->FocusFollowsMouse() ?
-		WindowAt(fLastMousePosition) : NULL);
+	if (fSettings->MouseMode() == B_FOCUS_FOLLOWS_MOUSE)
+		SetFocusWindow(WindowAt(fLastMousePosition));
+	else
+		SetFocusWindow(NULL);
 
 	bool sendFakeMouseMoved = false;
 	if (FocusWindow() != window)
Index: src/servers/app/DefaultDecorator.cpp
===================================================================
--- src/servers/app/DefaultDecorator.cpp	(revision 30852)
+++ src/servers/app/DefaultDecorator.cpp	(working copy)
@@ -13,6 +13,16 @@
 
 #include "DefaultDecorator.h"
 
+#include <new>
+#include <stdio.h>
+
+#include <Autolock.h>
+#include <GradientLinear.h>
+#include <Rect.h>
+#include <View.h>
+
+#include <WindowPrivate.h>
+
 #include "BitmapDrawingEngine.h"
 #include "DesktopSettings.h"
 #include "DrawingEngine.h"
@@ -21,16 +31,7 @@
 #include "PatternHandler.h"
 #include "ServerBitmap.h"
 
-#include <WindowPrivate.h>
 
-#include <Autolock.h>
-#include <GradientLinear.h>
-#include <Rect.h>
-#include <View.h>
-
-#include <new>
-#include <stdio.h>
-
 //#define DEBUG_DECORATOR
 #ifdef DEBUG_DECORATOR
 #	define STRACE(x) printf x
@@ -574,7 +575,7 @@
 		// NOTE: On R5, windows are not moved to back if clicked inside the
 		// resize area with the second mouse button. So we check this after
 		// the check above
-		if (buttons == B_SECONDARY_MOUSE_BUTTON)
+		if ((buttons & B_SECONDARY_MOUSE_BUTTON) != 0)
 			return DEC_MOVETOBACK;
 
 		if (fWasDoubleClick && !(fFlags & B_NOT_MINIMIZABLE))
Index: src/servers/app/DesktopSettingsPrivate.h
===================================================================
--- src/servers/app/DesktopSettingsPrivate.h	(revision 30852)
+++ src/servers/app/DesktopSettingsPrivate.h	(working copy)
@@ -11,10 +11,12 @@
 
 
 #include "DesktopSettings.h"
-#include "ServerFont.h"
 
 #include <Locker.h>
 
+#include "ServerFont.h"
+
+
 struct server_read_only_memory;
 
 
@@ -43,7 +45,11 @@
 
 			void				SetMouseMode(mode_mouse mode);
 			mode_mouse			MouseMode() const;
+			void				SetFocusFollowsMouseMode(mode_focus_follows_mouse mode);
+			mode_focus_follows_mouse		FocusFollowsMouseMode() const;
 			bool				FocusFollowsMouse() const;
+			void				SetAcceptFirstClick(bool accept_first_click);
+			bool				AcceptFirstClick() const;
 
 			void				SetShowAllDraggers(bool show);
 			bool				ShowAllDraggers() const;
@@ -81,6 +87,8 @@
 			scroll_bar_info		fScrollBarInfo;
 			menu_info			fMenuInfo;
 			mode_mouse			fMouseMode;
+			mode_focus_follows_mouse	fFocusFollowsMouseMode;
+			bool				fAcceptFirstClick;
 			bool				fShowAllDraggers;
 			int32				fWorkspacesCount;
 			BMessage			fWorkspaceMessages[kMaxWorkspaces];
Index: src/servers/input/MouseSettings.cpp
===================================================================
--- src/servers/input/MouseSettings.cpp	(revision 30852)
+++ src/servers/input/MouseSettings.cpp	(working copy)
@@ -15,21 +15,25 @@
 //
 // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
 
+
+#include "MouseSettings.h"
+
+#include <stdio.h>
+
 #include <FindDirectory.h>
 #include <File.h>
 #include <Path.h>
 #include <View.h>
 
-#include <stdio.h>
 
-#include "MouseSettings.h"
-
 static const bigtime_t kDefaultClickSpeed = 500000;
 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()
 {
 	Defaults();
@@ -41,6 +45,8 @@
 
 	fOriginalSettings = fSettings;
 	fOriginalMode = fMode;
+	fOriginalFocusFollowsMouseMode = fFocusFollowsMouseMode;
+	fOriginalAcceptFirstClick = fAcceptFirstClick;
 }
 
 
@@ -68,6 +74,7 @@
 	// retrieve current values
 
 	fMode = mouse_mode();
+	fAcceptFirstClick = accept_first_click();
 	Defaults();
 	
 	// also try to load the window position from disk
@@ -128,7 +135,7 @@
 	file.Write(&fSettings, sizeof(fSettings));
 #endif
 
-	// who is responsible for saving the mouse mode?
+	// who is responsible for saving the mouse mode and accept_first_click?
 
 	return B_OK;
 }
@@ -148,19 +155,31 @@
 	char *mode = "unknown";
 	switch (fMode) {
 		case B_NORMAL_MOUSE:
-			mode = "normal";
+			mode = "activate";
 			break;
+		case B_CLICK_TO_FOCUS_MOUSE:
+			mode = "focus";
+			break;
 		case B_FOCUS_FOLLOWS_MOUSE:
-			mode = "focus follows mouse";
+			mode = "auto-focus";
 			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
 
@@ -176,6 +195,8 @@
 	SetMouseType(kDefaultMouseType);
 	SetAccelerationFactor(kDefaultAccelerationFactor);
 	SetMouseMode(B_NORMAL_MOUSE);
+	SetFocusFollowsMouseMode(B_NORMAL_FOCUS_FOLLOWS_MOUSE);
+	SetAcceptFirstClick(kDefaultAcceptFirstClick);
 
 	fSettings.map.button[0] = B_PRIMARY_MOUSE_BUTTON;
 	fSettings.map.button[1] = B_SECONDARY_MOUSE_BUTTON;
@@ -253,3 +274,18 @@
 	fMode = mode;
 }
 
+
+void
+MouseSettings::SetFocusFollowsMouseMode(mode_focus_follows_mouse mode)
+{
+	fFocusFollowsMouseMode = mode;	
+}
+
+
+void 
+MouseSettings::SetAcceptFirstClick(bool accept_first_click)
+{
+	fAcceptFirstClick = accept_first_click;	
+}
+
+
Index: src/servers/input/MouseSettings.h
===================================================================
--- src/servers/input/MouseSettings.h	(revision 30852)
+++ src/servers/input/MouseSettings.h	(working copy)
@@ -18,9 +18,10 @@
 #ifndef MOUSE_SETTINGS_H_
 #define MOUSE_SETTINGS_H_
 
-#include <SupportDefs.h>
 #include <InterfaceDefs.h>
 #include <kb_mouse_settings.h>
+#include <Path.h>
+#include <SupportDefs.h>
 
 
 class MouseSettings {
@@ -51,6 +52,12 @@
 		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);
+
 		status_t SaveSettings();
 
 	private:
@@ -59,6 +66,8 @@
 
 		mouse_settings	fSettings, fOriginalSettings;
 		mode_mouse		fMode, fOriginalMode;
+		mode_focus_follows_mouse	fFocusFollowsMouseMode, fOriginalFocusFollowsMouseMode;
+		bool			fAcceptFirstClick, fOriginalAcceptFirstClick;
 };
 
 #endif
Index: src/kits/app/Application.cpp
===================================================================
--- src/kits/app/Application.cpp	(revision 30852)
+++ src/kits/app/Application.cpp	(working copy)
@@ -1420,7 +1420,7 @@
 void
 BApplication::_ArgvReceived(BMessage *message)
 {
-	ASSERT(message != NULL);
+	ASSERT((const char*)message != NULL);
 
 	// build the argv vector
 	status_t error = B_OK;
Index: src/kits/interface/InterfaceDefs.cpp
===================================================================
--- src/kits/interface/InterfaceDefs.cpp	(revision 30852)
+++ src/kits/interface/InterfaceDefs.cpp	(working copy)
@@ -10,6 +10,7 @@
 
 /*!	Global functions and variables for the Interface Kit */
 
+#include <InterfaceDefs.h>
 #include <InterfacePrivate.h>
 
 #include <stdio.h>
@@ -18,7 +19,6 @@
 
 #include <ControlLook.h>
 #include <Font.h>
-#include <InterfaceDefs.h>
 #include <Menu.h>
 #include <Roster.h>
 #include <ScrollBar.h>
@@ -817,14 +817,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;
 }
 
 
@@ -841,7 +841,7 @@
 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;
@@ -855,6 +855,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 accept_first_click)
+{
+	BPrivate::AppServerLink link;
+	link.StartMessage(AS_SET_ACCEPT_FIRST_CLICK);
+	link.Attach<bool>(accept_first_click);
+	link.Flush();
+}
+
+
+bool
+accept_first_click()
+{
+	// Gets the accept first click status
+	bool accept_first_click = 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>(&accept_first_click);
+
+	return accept_first_click;
+}
+
 rgb_color
 ui_color(color_which which)
 {
Index: src/kits/interface/Region.cpp
===================================================================
--- src/kits/interface/Region.cpp	(revision 30852)
+++ src/kits/interface/Region.cpp	(working copy)
@@ -121,7 +121,7 @@
 	\return \ctrue if the two regions are the same, \cfalse otherwise.
 */
 bool
-BRegion::operator==(const BRegion& other) const
+BRegion::operator==(const BRegion &other) const
 {
 	if (&other == this)
 		return true;
Index: src/kits/interface/MenuBar.cpp
===================================================================
--- src/kits/interface/MenuBar.cpp	(revision 30852)
+++ src/kits/interface/MenuBar.cpp	(working copy)
@@ -23,6 +23,7 @@
 #include <binary_compatibility/Interface.h>
 #include <MenuPrivate.h>
 #include <TokenSpace.h>
+#include <InterfaceDefs.h>
 
 #include "BMCPrivate.h"
 
@@ -225,10 +226,17 @@
 	if (fTracking)
 		return;
 
+	uint32 buttons;
+	GetMouse(&where, &buttons);
+
 	BWindow *window = Window();
 	if (!window->IsActive() || !window->IsFront()) {
-		window->Activate();
-		window->UpdateIfNeeded();
+		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);
Index: headers/build/os/interface/InterfaceDefs.h
===================================================================
--- headers/build/os/interface/InterfaceDefs.h	(revision 30852)
+++ headers/build/os/interface/InterfaceDefs.h	(working copy)
@@ -315,14 +315,25 @@
 
 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
 };
 
-_IMPEXP_BE void			set_mouse_mode(mode_mouse mode);	
-_IMPEXP_BE mode_mouse	mouse_mode();	
+enum mode_focus_follows_mouse {
+	B_NORMAL_FOCUS_FOLLOWS_MOUSE		= 0,
+	B_WARP_FOCUS_FOLLOWS_MOUSE			= 1,
+	B_INSTANT_WARP_FOCUS_FOLLOWS_MOUSE	= 2
+};
 
+_IMPEXP_BE void			set_mouse_mode(mode_mouse mode);
+_IMPEXP_BE mode_mouse	mouse_mode();
+
+_IMPEXP_BE void			set_focus_follows_mouse_mode(mode_focus_follows_mouse mode);
+_IMPEXP_BE mode_focus_follows_mouse	focus_follows_mouse_mode();
+
+_IMPEXP_BE void			set_accept_first_click(bool accept_first_click);
+_IMPEXP_BE bool			accept_first_click();
+
 enum color_which {
 	B_PANEL_BACKGROUND_COLOR = 1,
 	B_PANEL_TEXT_COLOR = 10,
Index: headers/build/os/interface/Region.h
===================================================================
--- headers/build/os/interface/Region.h	(revision 30852)
+++ headers/build/os/interface/Region.h	(working copy)
@@ -31,7 +31,8 @@
 								BRegion(const BRect rect);
 	virtual						~BRegion();	
 
-			BRegion			&operator=(const BRegion &from);
+			BRegion				&operator=(const BRegion &from);
+			bool				operator==(const BRegion& other) const;
 
 			void				Set(BRect newBounds);
 			void				Set(clipping_rect newBounds);
Index: headers/build/private/app/ServerProtocol.h
===================================================================
--- headers/build/private/app/ServerProtocol.h	(revision 30852)
+++ headers/build/private/app/ServerProtocol.h	(working copy)
@@ -192,6 +192,10 @@
 	AS_RUN_BE_ABOUT,
 	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,
 
 	// Hook function messages
 	AS_WORKSPACE_ACTIVATED,
Index: headers/os/interface/InterfaceDefs.h
===================================================================
--- headers/os/interface/InterfaceDefs.h	(revision 30852)
+++ headers/os/interface/InterfaceDefs.h	(working copy)
@@ -164,12 +164,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 {
@@ -376,6 +381,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 accept_first_click);	
+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);
Index: headers/private/app/ServerProtocol.h
===================================================================
--- headers/private/app/ServerProtocol.h	(revision 30852)
+++ headers/private/app/ServerProtocol.h	(working copy)
@@ -186,6 +186,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,
