Ticket #4220: 20090531_5.diff

File 20090531_5.diff, 95.3 KB (added by brecht, 15 years ago)
  • src/preferences/mouse/SettingsView.h

     
    1010//  Authors:        Jérôme Duval,
    1111//                  Andrew McCall (mccall@digitalparadise.co.uk)
    1212//                  Axel Dörfler (axeld@pinc-software.de)
     13//                  Brecht Machiels (brecht@mos6581.org)
    1314//  Description:    Mouse Preferences
    1415//  Created:        December 10, 2003
    1516//
     
    2324#include <Button.h>
    2425#include <Slider.h>
    2526#include <PopUpMenu.h>
     27#include <CheckBox.h>
    2628
     29#include "BitmapView.h"
    2730
     31
    2832class MouseSettings;
    2933class MouseView;
    3034
    3135
    3236class SettingsView : public BBox {
    3337    public:
    34         SettingsView(BRect frame, MouseSettings &settings);
     38        SettingsView(MouseSettings &settings);
    3539        virtual ~SettingsView();
    3640
    3741        virtual void AttachedToWindow();
    38         virtual void GetPreferredSize(float *_width, float *_height);
    39         virtual void Draw(BRect frame);
    4042
    4143        void SetMouseType(int32 type);
    4244        void MouseMapUpdated();
    4345        void UpdateFromSettings();
    4446
    4547    private:
     48        friend class MouseWindow;
     49
    4650        typedef BBox inherited;
    4751
    4852        const MouseSettings &fSettings;
    4953
    50         BPopUpMenu  *fTypeMenu, *fFocusMenu;
     54        BPopUpMenu  *fTypeMenu, *fFocusMenu, *fFocusFollowsMouseMenu;
     55        BCheckBox   *fAcceptFirstClickBox;
    5156        MouseView   *fMouseView;
    5257        BSlider     *fClickSpeedSlider, *fMouseSpeedSlider, *fAccelerationSlider;
    5358
    5459        BBitmap     *fDoubleClickBitmap, *fSpeedBitmap, *fAccelerationBitmap;
    55 
    56         BRect       fLeftArea, fRightArea;
    57         BPoint      fLeft, fRight;
    58         BPoint      fDoubleClickBmpPoint, fSpeedBmpPoint, fAccelerationBmpPoint;
     60        BBitmapView *fDoubleClickView, *fSpeedView, *fAccelerationView;
    5961};
    6062
    6163#endif  /* SETTINGS_VIEW_H */
  • src/preferences/mouse/BitmapView.cpp

     
     1/*
     2 * Copyright 2009, Haiku, Inc. All rights reserved.
     3 * Distributed under the terms of the MIT License.
     4 *
     5 *  Authors:       
     6 *      Brecht Machiels, brecht@mos6581.org
     7 *
     8 *  Description:    Bitmap BView
     9 *  Created:        March 13, 2009
     10 *     
     11 */
     12
     13#include "BitmapView.h"
     14
     15
     16BBitmapView::BBitmapView(BBitmap &bitmap)
     17    : BView(bitmap.Bounds(), "bitmap_view", B_FOLLOW_NONE, B_WILL_DRAW)
     18{
     19    fBitmap = &bitmap;
     20   
     21    this->SetExplicitMinSize(BSize(fBitmap->Bounds().Width(),
     22        fBitmap->Bounds().Height()));
     23    this->SetExplicitMaxSize(BSize(fBitmap->Bounds().Width(),
     24        fBitmap->Bounds().Height()));
     25}
     26
     27
     28void
     29BBitmapView::AttachedToWindow()
     30{
     31    this->SetViewBitmap(fBitmap, fBitmap->Bounds(),
     32        this->Bounds(), B_FOLLOW_NONE, 0);
     33}
  • src/preferences/mouse/MouseSettings.cpp

     
    88//
    99//  File:           MouseSettings.h
    1010//  Authors:        Jérôme Duval,
    11 //                  Andrew McCall (mccall@digitalparadise.co.uk),
     11//                  Andrew McCall (mccall@digitalparadise.co.uk)
    1212//                  Axel Dörfler (axeld@pinc-software.de)
     13//                  Brecht Machiels (brecht@mos6581.org)
    1314//  Description:    Mouse Preferences
    1415//  Created:        December 10, 2003
    1516//
    1617// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
    1718
     19#include "MouseSettings.h"
     20
     21#include <stdio.h>
     22
    1823#include <FindDirectory.h>
    1924#include <File.h>
    2025#include <Path.h>
    2126#include <View.h>
    2227
    23 #include <stdio.h>
    2428
    25 #include "MouseSettings.h"
    26 
    27 
    2829// The R5 settings file differs from that of OpenBeOS;
    2930// the latter maps 16 different mouse buttons
    3031#define R5_COMPATIBLE 1
     
    3334static const int32 kDefaultMouseSpeed = 65536;
    3435static const int32 kDefaultMouseType = 3;   // 3 button mouse
    3536static const int32 kDefaultAccelerationFactor = 65536;
     37static const bool kDefaultAcceptFirstClick = false;
    3638
    3739
    3840MouseSettings::MouseSettings()
    39     :
    40     fWindowPosition(-1, -1)
     41    : fWindowPosition(-1, -1)
    4142{
    4243    RetrieveSettings();
    4344
    4445    fOriginalSettings = fSettings;
    4546    fOriginalMode = fMode;
     47    fOriginalFocusFollowsMouseMode = fFocusFollowsMouseMode;
     48    fOriginalAcceptFirstClick = fAcceptFirstClick;
    4649}
    4750
    4851
     
    8184        fprintf(stderr, "error when get_mouse_type\n");
    8285
    8386    fMode = mouse_mode();
     87    fFocusFollowsMouseMode = focus_follows_mouse_mode();
     88    fAcceptFirstClick = accept_first_click();
    8489
    8590    // also try to load the window position from disk
    8691
     
    143148MouseSettings::Dump()
    144149{
    145150    printf("type:\t\t%ld button mouse\n", fSettings.type);
    146     printf("map:\t\tleft = %lu : middle = %lu : right = %lu\n", fSettings.map.button[0], fSettings.map.button[2], fSettings.map.button[1]);
     151    printf("map:\t\tleft = %lu : middle = %lu : right = %lu\n", fSettings.map.button[0],
     152        fSettings.map.button[2], fSettings.map.button[1]);
    147153    printf("click speed:\t%Ld\n", fSettings.click_speed);
    148154    printf("accel:\t\t%s\n", fSettings.accel.enabled ? "enabled" : "disabled");
    149155    printf("accel factor:\t%ld\n", fSettings.accel.accel_factor);
     
    152158    char *mode = "unknown";
    153159    switch (fMode) {
    154160        case B_NORMAL_MOUSE:
    155             mode = "normal";
     161            mode = "click to activate";
    156162            break;
     163        case B_CLICK_TO_FOCUS_MOUSE:
     164            mode = "click to focus";
     165            break;
    157166        case B_FOCUS_FOLLOWS_MOUSE:
    158167            mode = "focus follows mouse";
    159168            break;
    160         case B_WARP_MOUSE:
    161             mode = "warp mouse";
     169    }
     170    printf("mouse mode:\t%s\n", mode);
     171
     172    char *focus_follows_mouse_mode = "unknown";
     173    switch (fMode) {
     174        case B_NORMAL_FOCUS_FOLLOWS_MOUSE:
     175            focus_follows_mouse_mode = "normal";
    162176            break;
    163         case B_INSTANT_WARP_MOUSE:
    164             mode = "instant warp mouse";
     177        case B_WARP_FOCUS_FOLLOWS_MOUSE:
     178            focus_follows_mouse_mode = "warp";
    165179            break;
     180        case B_INSTANT_WARP_FOCUS_FOLLOWS_MOUSE:
     181            focus_follows_mouse_mode = "instant warp";
     182            break;
    166183    }
    167     printf("mode:\t\t%s\n", mode);
     184    printf("focus follows mouse mode:\t%s\n", focus_follows_mouse_mode);
     185    printf("accept first click:\t%s\n", fAcceptFirstClick ? "enabled" : "disabled");
    168186}
    169187#endif
    170188
     
    180198    SetMouseType(kDefaultMouseType);
    181199    SetAccelerationFactor(kDefaultAccelerationFactor);
    182200    SetMouseMode(B_NORMAL_MOUSE);
     201    SetFocusFollowsMouseMode(B_NORMAL_FOCUS_FOLLOWS_MOUSE);
     202    SetAcceptFirstClick(kDefaultAcceptFirstClick);
    183203
    184204    mouse_map map;
    185205    if (get_mouse_map(&map) == B_OK) {
     
    202222        || fSettings.type != kDefaultMouseType
    203223        || fSettings.accel.accel_factor != kDefaultAccelerationFactor
    204224        || fMode != B_NORMAL_MOUSE
     225        || fFocusFollowsMouseMode != B_NORMAL_FOCUS_FOLLOWS_MOUSE
     226        || fAcceptFirstClick != kDefaultAcceptFirstClick
    205227        || fSettings.map.button[0] != B_PRIMARY_MOUSE_BUTTON
    206228        || fSettings.map.button[1] != B_SECONDARY_MOUSE_BUTTON
    207229        || fSettings.map.button[2] != B_TERTIARY_MOUSE_BUTTON;
     
    219241    SetMouseType(fOriginalSettings.type);
    220242    SetAccelerationFactor(fOriginalSettings.accel.accel_factor);
    221243    SetMouseMode(fOriginalMode);
     244    SetFocusFollowsMouseMode(fOriginalFocusFollowsMouseMode);
     245    SetAcceptFirstClick(fOriginalAcceptFirstClick);
     246   
    222247    SetMapping(fOriginalSettings.map);
    223248}
    224249
     
    320345    fMode = mode;
    321346}
    322347
     348
     349void
     350MouseSettings::SetFocusFollowsMouseMode(mode_focus_follows_mouse mode)
     351{
     352    set_focus_follows_mouse_mode(mode);
     353    fFocusFollowsMouseMode = mode; 
     354}
     355
     356
     357void
     358MouseSettings::SetAcceptFirstClick(bool accept_first_click)
     359{
     360    set_accept_first_click(accept_first_click);
     361    fAcceptFirstClick = accept_first_click;
     362}
     363
  • src/preferences/mouse/BitmapView.h

     
     1/*
     2 * Copyright 2009, Haiku, Inc. All rights reserved.
     3 * Distributed under the terms of the MIT License.
     4 *
     5 *  Authors:
     6 *      Brecht Machiels, brecht@mos6581.org
     7 *
     8 *  Description:    Bitmap BView
     9 *  Created:        March 13, 2009
     10 *     
     11 */
     12#ifndef BITMAP_VIEW_H
     13#define BITMAP_VIEW_H
     14
     15
     16#include <Bitmap.h>
     17#include <View.h>
     18
     19
     20class BBitmapView : public BView {
     21    public:
     22                BBitmapView(BBitmap &bitmap);
     23       
     24        virtual void AttachedToWindow();
     25       
     26    private:
     27                BBitmap     *fBitmap;
     28};
     29
     30#endif  /* BITMAP_VIEW_H */
  • src/preferences/mouse/MouseSettings.h

     
    66 *      Jérôme Duval
    77 *      Andrew McCall (mccall@digitalparadise.co.uk)
    88 *      Axel Dörfler (axeld@pinc-software.de)
     9 *      Brecht Machiels (brecht@mos6581.org)
    910 */
    1011#ifndef MOUSE_SETTINGS_H
    1112#define MOUSE_SETTINGS_H
    1213
    1314
     15#include <InterfaceDefs.h>
     16#include <Point.h>
     17#include <SupportDefs.h>
     18
    1419#include "kb_mouse_settings.h"
    1520
    16 #include <SupportDefs.h>
    17 #include <InterfaceDefs.h>
    1821
    1922class BPath;
    2023
    21 
    2224class MouseSettings {
    2325    public:
    2426        MouseSettings();
     
    5254        mode_mouse MouseMode() const { return fMode; }
    5355        void SetMouseMode(mode_mouse mode);
    5456
     57        mode_focus_follows_mouse FocusFollowsMouseMode() const {
     58            return fFocusFollowsMouseMode;
     59        }
     60        void SetFocusFollowsMouseMode(mode_focus_follows_mouse mode);
     61
     62        bool AcceptFirstClick() const { return fAcceptFirstClick; }
     63        void SetAcceptFirstClick(bool accept_first_click);
     64
    5565    private:
    5666        static status_t GetSettingsPath(BPath &path);
    5767        void RetrieveSettings();
     
    5969
    6070        mouse_settings  fSettings, fOriginalSettings;
    6171        mode_mouse      fMode, fOriginalMode;
     72        mode_focus_follows_mouse    fFocusFollowsMouseMode;
     73        mode_focus_follows_mouse    fOriginalFocusFollowsMouseMode;
     74        bool            fAcceptFirstClick, fOriginalAcceptFirstClick;
    6275        BPoint          fWindowPosition;
    6376};
    6477
  • src/preferences/mouse/MouseWindow.cpp

     
    1010//  Authors:        Jérôme Duval,
    1111//                  Andrew McCall (mccall@digitalparadise.co.uk)
    1212//                  Axel Dörfler (axeld@pinc-software.de)
     13//                  Brecht Machiels (brecht@mos6581.org)
    1314//  Description:    Mouse Preferences
    1415//  Created:        December 10, 2003
    1516//
    1617// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
    1718
     19#include "MouseWindow.h"
     20
     21#include <string.h>
     22
    1823#include <Alert.h>
    1924#include <Application.h>
     25#include <GroupLayout.h>
     26#include <GroupLayoutBuilder.h>
     27#include <Button.h>
     28#include <CheckBox.h>
     29#include <Debug.h>
     30#include <Menu.h>
     31#include <MenuField.h>
     32#include <MenuItem.h>
    2033#include <Message.h>
    2134#include <Screen.h>
    2235#include <Slider.h>
    23 #include <Button.h>
    24 #include <Menu.h>
    25 #include <MenuItem.h>
    26 #include <MenuField.h>
    27 #include <Debug.h>
    28 #include <string.h>
    2936
    30 #include "MouseWindow.h"
    3137#include "MouseConstants.h"
    3238#include "SettingsView.h"
    3339
    3440
    3541MouseWindow::MouseWindow(BRect _rect)
    3642    : BWindow(_rect, "Mouse", B_TITLED_WINDOW,
    37         B_NOT_RESIZABLE | B_NOT_ZOOMABLE | B_ASYNCHRONOUS_CONTROLS)
     43        B_NOT_RESIZABLE | B_NOT_ZOOMABLE | B_ASYNCHRONOUS_CONTROLS |
     44            B_AUTO_UPDATE_SIZE_LIMITS)
    3845{
    39     BView *view = new BView(Bounds(), "view", B_FOLLOW_ALL, 0);
    40     view->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
    41     AddChild(view);
    42 
    4346    // Add the main settings view
    44     fSettingsView = new SettingsView(Bounds().InsetBySelf(kBorderSpace, kBorderSpace),
    45         fSettings);
    46     view->AddChild(fSettingsView);
     47    fSettingsView = new SettingsView(fSettings);
     48    fSettingsBox = new BBox("main box");
     49    fSettingsBox->AddChild(fSettingsView);
    4750
    4851    // Add the "Default" button
    49     BRect rect(kBorderSpace, fSettingsView->Frame().bottom + kItemSpace + 2,
    50         kBorderSpace + 75, fSettingsView->Frame().bottom + 20);
    51     fDefaultsButton = new BButton(rect, "defaults", "Defaults", new BMessage(kMsgDefaults));
    52     fDefaultsButton->ResizeToPreferred();
     52    fDefaultsButton = new BButton("Defaults", new BMessage(kMsgDefaults));
    5353    fDefaultsButton->SetEnabled(fSettings.IsDefaultable());
    54     view->AddChild(fDefaultsButton);
    5554
    5655    // Add the "Revert" button
    57     rect.OffsetBy(fDefaultsButton->Bounds().Width() + kItemSpace, 0);
    58     fRevertButton = new BButton(rect, "revert", "Revert", new BMessage(kMsgRevert));
     56    fRevertButton = new BButton("Revert", new BMessage(kMsgRevert));
    5957    fRevertButton->SetEnabled(false);
    60     fRevertButton->ResizeToPreferred();
    61     view->AddChild(fRevertButton);
    6258
    6359    SetPulseRate(100000);
    6460        // we are using the pulse rate to scan pressed mouse
    6561        // buttons and draw the selected imagery
    6662
    67     ResizeTo(fSettingsView->Frame().right + kBorderSpace,
    68         fRevertButton->Frame().bottom + kBorderSpace - 1);
     63    // Build the layout
     64    SetLayout(new BGroupLayout(B_VERTICAL));
    6965
     66    AddChild(BGroupLayoutBuilder(B_VERTICAL, 10)
     67        .Add(fSettingsBox)
     68        .AddGroup(B_HORIZONTAL, 5)
     69            .Add(fDefaultsButton)
     70            .Add(fRevertButton)
     71            .AddGlue()
     72        .End()
     73        .SetInsets(10, 10, 10, 10)
     74    );
     75
    7076    // check if the window is on screen
    71 
    72     rect = BScreen().Frame();
     77    BRect rect = BScreen().Frame();
    7378    rect.InsetBySelf(20, 20);
    7479
    7580    BPoint position = fSettings.WindowPosition();
     
    140145                fSettings.SetMouseMode((mode_mouse)mode);
    141146                fDefaultsButton->SetEnabled(fSettings.IsDefaultable());
    142147                fRevertButton->SetEnabled(true);
     148                fSettingsView->fFocusFollowsMouseMenu->SetEnabled(mode == B_FOCUS_FOLLOWS_MOUSE);
     149                fSettingsView->fAcceptFirstClickBox->SetEnabled(mode != B_FOCUS_FOLLOWS_MOUSE);
    143150            }
    144151            break;
    145152        }
     153       
     154        case kMsgFollowsMouseMode:
     155        {
     156            int32 mode;
     157            if (message->FindInt32("mode_focus_follows_mouse", &mode) == B_OK) {
     158                fSettings.SetFocusFollowsMouseMode((mode_focus_follows_mouse)mode);
     159                fDefaultsButton->SetEnabled(fSettings.IsDefaultable());
     160                fRevertButton->SetEnabled(true);
     161            }
     162            break;
     163        }
     164       
     165        case kMsgAcceptFirstClick:
     166        {
     167            BHandler *handler;
     168            if (message->FindPointer("source", reinterpret_cast<void**>(&handler)) == B_OK) {
     169                bool accept_first_click = false;
     170                BCheckBox *fAcceptFirstClickBox = dynamic_cast<BCheckBox*>(handler);
     171                if (fAcceptFirstClickBox)
     172                    accept_first_click = fAcceptFirstClickBox->Value() == B_CONTROL_ON;
     173                fSettings.SetAcceptFirstClick(accept_first_click);
     174                fDefaultsButton->SetEnabled(fSettings.IsDefaultable());
     175                fRevertButton->SetEnabled(true);
     176            }
     177            break;
     178        }
    146179
    147180        case kMsgDoubleClickSpeed:
    148181        {
  • src/preferences/mouse/MouseView.cpp

     
    2828#include "MouseSettings.h"
    2929#include "MouseWindow.h"
    3030
    31 
    3231static const int32 kOneButtonOffsets[4] = {0, 55};
    3332static const int32 kTwoButtonOffsets[4] = {0, 27, 55};
    3433static const int32 kThreeButtonOffsets[4] = {0, 18, 36, 55};
     
    7675//  #pragma mark -
    7776
    7877
    79 MouseView::MouseView(BRect rect, const MouseSettings &settings)
    80     : BView(rect, "mouse_view", B_FOLLOW_ALL, B_PULSE_NEEDED | B_WILL_DRAW),
     78MouseView::MouseView(const MouseSettings &settings)
     79    : BView("mouse_view", B_PULSE_NEEDED | B_WILL_DRAW),
    8180    fSettings(settings),
    8281    fType(-1),
    8382    fButtons(0),
  • src/preferences/mouse/MouseWindow.h

     
    1010//  Authors:        Jérôme Duval,
    1111//                  Andrew McCall (mccall@digitalparadise.co.uk)
    1212//                  Axel Dörfler (axeld@pinc-software.de)
     13//                  Brecht Machiels (brecht@mos6581.org)
    1314//  Description:    Mouse Preferences
    1415//  Created:        December 10, 2003
    1516//
     
    1819#define MOUSE_WINDOW_H
    1920
    2021
     22#include <Box.h>
     23#include <Button.h>
    2124#include <Window.h>
    22 #include <Button.h>
    2325
    2426#include "MouseSettings.h"
    2527
     28
    2629class SettingsView;
    2730
    28 
    2931class MouseWindow : public BWindow {
    3032    public:
    3133        MouseWindow(BRect rect);
     
    3840        BButton         *fDefaultsButton;
    3941        BButton         *fRevertButton;
    4042        SettingsView    *fSettingsView;
     43        BBox            *fSettingsBox;
    4144};
    4245
    4346#endif  /* MOUSE_WINDOW_H */
  • src/preferences/mouse/Jamfile

     
    77    MouseSettings.cpp
    88    MouseWindow.cpp
    99    MouseView.cpp
     10    BitmapView.cpp
    1011    SettingsView.cpp
    1112    : translation be
    1213    : Mouse.rdef
  • src/preferences/mouse/Mouse.rdef

     
    9797#endif // HAIKU_TARGET_PLATFORM_HAIKU
    9898
    9999resource(601, "double_click_bmap") #'bits' array {
    100     $"424D06070000000000003A000000280000000E0000001E000000010018000000"
    101     $"0000CC060000130B0000130B00000000000000000000FFFFFFFFD8D8D8000000"
    102     $"0000000000000000000000000000000000000000000000000000000000000000"
    103     $"00D8D8D800000000008080808080808080808080808080808080808080808080"
    104     $"808080808080808080808080800000000000000000B8B8B8FFFFFFB8B8B8B8B8"
    105     $"B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B880808000000000000000"
    106     $"00B8B8B8FFFFFFB8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8"
    107     $"B8B88080800000000000000000B8B8B8FFFFFFB8B8B8B8B8B8B8B8B8B8B8B8B8"
    108     $"B8B8B8B8B8B8B8B8B8B8B8B8B8B88080800000000000000000B8B8B8FFFFFFB8"
    109     $"B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8808080000000"
    110     $"0000000000B8B8B8FFFFFFB8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8"
    111     $"B8B8B8B8B8B87F7F7F0000000000000000B8B8B8FFFFFFB8B8B8B8B8B8B8B8B8"
    112     $"B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B88080800000000000000000B8B8B8"
    113     $"FFFFFFB8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B88080"
    114     $"800000000000000000B8B8B8FFFFFFB8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8"
    115     $"B8B8B8B8B8B8B8B8B8B88080800000000000000000B8B8B8FFFFFFFFFFFFFFFF"
    116     $"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80808000000000000000"
    117     $"0080808080808080808080808080808080808080808080808080808080808080"
    118     $"80808080800000000000000000B8B8B8FFFFFFB8B8B8B8B8B8C0C0C0808080FF"
    119     $"FFFFC0C0C0B8B8B8B8B8B8B8B8B88080800000000000000000B8B8B8FFFFFFB8"
    120     $"B8B8B8B8B8C0C0C0808080FFFFFFC0C0C0B8B8B8B8B8B8B8B8B8808080000000"
    121     $"0000000000B8B8B8FFFFFFB8B8B8B8B8B8C0C0C0808080FFFFFFC0C0C0B8B8B8"
    122     $"B8B8B8B8B8B88080800000000000000000B8B8B8FFFFFFFFFFFFFFFFFFFFFFFF"
    123     $"808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8080800000000000000000B8B8B8"
    124     $"B8B8B8B8B8B8B8B8B8B8B8B8808080B8B8B8B8B8B8B8B8B8B8B8B8B8B8B88080"
    125     $"800000000000D8D8D80000000000000000000000000000005858580000000000"
    126     $"00000000000000000000000000D8D8D80000D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
    127     $"D8000000000000000000D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D80000D8D8"
    128     $"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8000000D8D8D8D8D8D8D8D8D8D8D8D8D8"
    129     $"D8D8D8D8D8D8D8D80000D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8000000D8"
    130     $"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D80000D8D8D8D8D8D8D8D8D8D8"
    131     $"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
    132     $"0000D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
    133     $"D8D8D8D8D8D8D8D8D8D8D8D80000D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
    134     $"989898D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D80000D8D8D8D8D8D8"
    135     $"D8D8D8D8D8D8D8D8D8989898989898989898D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
    136     $"D8D8D8D80000D8D8D8D8D8D8D8D8D8D8D8D89898989898989898989898989898"
    137     $"98D8D8D8D8D8D8D8D8D8D8D8D8D8D8D80000D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
    138     $"D8D8D8D8989898D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D80000D8D8"
    139     $"D8D8D8D8D8D8D8D8D8D8D8D8D8989898989898989898D8D8D8D8D8D8D8D8D8D8"
    140     $"D8D8D8D8D8D8D8D80000D8D8D8D8D8D8D8D8D8D8D8D898989898989898989898"
    141     $"9898989898D8D8D8D8D8D8D8D8D8D8D8D8D8D8D80000D8D8D8D8D8D8D8D8D898"
    142     $"9898989898989898989898989898989898989898D8D8D8D8D8D8D8D8D8D8D8D8"
    143     $"0000000000000000000000000000000000000000000000000000000000000000"
    144     $"0000000000000000000000000000000000000000000000000000000000000000"
    145     $"0000000000000000000000000000000000000000000000000000000000000000"
    146     $"0000000000000000000000000000000000000000000000000000000000000000"
    147     $"0000000000000000000000000000000000000000000000000000000000000000"
    148     $"0000000000000000000000000000000000000000000000000000000000000000"
    149     $"0000000000000000000000000000000000000000000000000000000000000000"
    150     $"0000000000000000000000000000000000000000000000000000000000000000"
    151     $"0000000000000000000000000000000000000000000000000000000000000000"
    152     $"0000000000000000000000000000000000000000000000000000000000000000"
    153     $"0000000000000000000000000000000000000000000000000000000000000000"
    154     $"0000000000000000000000000000000000000000000000000000000000000000"
    155     $"0000000000000000000000000000000000000000000000000000000000000000"
    156     $"000000000000"
     100    $"424d1e090000000000003600000028000000190000001e00000001001800"
     101    $"00000000e8080000130b0000130b00000000000000000000d8d8d8d8d8d8"
     102    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8000000000000000000000000000000"
     103    $"000000000000000000000000000000000000000000d8d8d8d8d8d8d8d8d8"
     104    $"d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d80000"
     105    $"008080808080808080808080808080808080808080808080808080808080"
     106    $"80808080808080000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8"
     107    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8000000b8b8b8ffffffb8b8b8b8b8b8b8"
     108    $"b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8808080000000d8d8d8d8"
     109    $"d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     110    $"000000b8b8b8ffffffb8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8"
     111    $"b8b8b8b8b8b8808080000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8"
     112    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8000000b8b8b8ffffffb8b8b8b8b8"
     113    $"b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8808080000000d8d8"
     114    $"d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     115    $"d8d8000000b8b8b8ffffffb8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8"
     116    $"b8b8b8b8b8b8b8b8808080000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800"
     117    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8000000b8b8b8ffffffb8b8b8"
     118    $"b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b87f7f7f000000"
     119    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     120    $"d8d8d8d8000000b8b8b8ffffffb8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8"
     121    $"b8b8b8b8b8b8b8b8b8b8808080000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     122    $"d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8000000b8b8b8ffffffb8"
     123    $"b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b880808000"
     124    $"0000d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8"
     125    $"d8d8d8d8d8d8000000b8b8b8ffffffb8b8b8b8b8b8b8b8b8b8b8b8b8b8b8"
     126    $"b8b8b8b8b8b8b8b8b8b8b8b8808080000000d8d8d8d8d8d8d8d8d8d8d8d8"
     127    $"d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8000000b8b8b8ffff"
     128    $"ffffffffffffffffffffffffffffffffffffffffffffffffffffffff8080"
     129    $"80000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8"
     130    $"d8d8d8d8d8d8d8d800000080808080808080808080808080808080808080"
     131    $"8080808080808080808080808080808080000000d8d8d8d8d8d8d8d8d8d8"
     132    $"d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8000000b8b8b8"
     133    $"ffffffb8b8b8b8b8b8c0c0c0808080ffffffc0c0c0b8b8b8b8b8b8b8b8b8"
     134    $"808080000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8"
     135    $"d8d8d8d8d8d8d8d8d8d8000000b8b8b8ffffffb8b8b8b8b8b8c0c0c08080"
     136    $"80ffffffc0c0c0b8b8b8b8b8b8b8b8b8808080000000d8d8d8d8d8d8d8d8"
     137    $"d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8000000b8"
     138    $"b8b8ffffffb8b8b8b8b8b8c0c0c0808080ffffffc0c0c0b8b8b8b8b8b8b8"
     139    $"b8b8808080000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8"
     140    $"d8d8d8d8d8d8d8d8d8d8d8d8000000b8b8b8ffffffffffffffffffffffff"
     141    $"808080ffffffffffffffffffffffffffffff808080000000d8d8d8d8d8d8"
     142    $"d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d80000"
     143    $"00b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8808080b8b8b8b8b8b8b8b8b8b8b8"
     144    $"b8b8b8b8808080000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8"
     145    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800000000000000000000000000"
     146    $"0000585858000000000000000000000000000000000000d8d8d8d8d8d8d8"
     147    $"d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     148    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8000000000000000000d8d8d8d8d8d8"
     149    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8"
     150    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     151    $"d8d8d8d8000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     152    $"d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     153    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8000000d8d8d8d8d8d8d8"
     154    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800"
     155    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     156    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     157    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     158    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     159    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     160    $"d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     161    $"d8d8d8d8d8d8d8d8989898d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     162    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8"
     163    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8989898989898989898"
     164    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     165    $"d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     166    $"d8d8d8d8989898989898989898989898989898d8d8d8d8d8d8d8d8d8d8d8"
     167    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8"
     168    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8989898d8"
     169    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     170    $"d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     171    $"d8d8d8d8d8d8d8d8d8989898989898989898d8d8d8d8d8d8d8d8d8d8d8d8"
     172    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8"
     173    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d89898989898989898"
     174    $"98989898989898d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     175    $"d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     176    $"d8d8d8d8d8989898989898989898989898989898989898989898d8d8d8d8"
     177    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800"
     178
    157179};
    158180
    159181resource(602, "speed_bmap") #'bits' array {
    160     $"424DE8080000000000003A000000280000001900000016000000010018000000"
    161     $"0000AE080000130B0000130B00000000000000000000FFFFFFFFD8D8D8D8D8D8"
    162     $"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
    163     $"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
    164     $"D8D8D8D8D800D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
    165     $"D8D8D8D8D8D8D8D8D8D800000000000000000000000000000000000000000000"
    166     $"0000000000000000000000000000D8D8D800D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
    167     $"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D800000080808080808080808080"
    168     $"808080808080808080808080808080808080808080808080808000000000D8D8"
    169     $"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D800"
    170     $"0000B8B8B8FFFFFFB8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8"
    171     $"B8B8B880808000000000D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
    172     $"D8D8D8D8D8D8D8D8D8D8D8000000B8B8B8FFFFFFB8B8B8B8B8B8B8B8B8B8B8B8"
    173     $"B8B8B8B8B8B8B8B8B8B8B8B8B8B8B880808000000000D8D8D8D8D8D8D8D8D8D8"
    174     $"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8000000B8B8B8FFFFFF"
    175     $"B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B88080800000"
    176     $"0000D8D8D8D8D8D8D8D8D8989898D8D8D8989898989898989898989898D8D8D8"
    177     $"D8D8D8000000B8B8B8FFFFFFB8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8"
    178     $"B8B8B8B8B8B8B880808000000000D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
    179     $"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8000000B8B8B8FFFFFFB8B8B8B8B8B8B8B8"
    180     $"B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B880808000000000D8D8D8D8D8D8"
    181     $"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8000000B8B8"
    182     $"B8FFFFFFB8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B880"
    183     $"808000000000989898D8D8D89898989898989898989898989898989898989898"
    184     $"98D8D8D8D8D8D8000000B8B8B8FFFFFFB8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8"
    185     $"B8B8B8B8B8B8B8B8B8B8B87F7F7F00000000D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
    186     $"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8000000B8B8B8FFFFFFB8B8B8B8"
    187     $"B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B880808000000000D8D8"
    188     $"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D800"
    189     $"0000B8B8B8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
    190     $"FFFFFF80808000000000D8D8D8D8D8D8D8D8D8989898D8D8D898989898989898"
    191     $"9898989898D8D8D8D8D8D8000000808080808080808080808080808080808080"
    192     $"80808080808080808080808080808080808000000000D8D8D8D8D8D8D8D8D8D8"
    193     $"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8000000B8B8B8FFFFFF"
    194     $"B8B8B8B8B8B8C0C0C0808080FFFFFFC0C0C0B8B8B8B8B8B8B8B8B88080800000"
    195     $"0000D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
    196     $"D8D8D8000000B8B8B8FFFFFFB8B8B8B8B8B8C0C0C0808080FFFFFFC0C0C0B8B8"
    197     $"B8B8B8B8B8B8B880808000000000D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
    198     $"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8000000B8B8B8FFFFFFB8B8B8B8B8B8C0C0"
    199     $"C0808080FFFFFFC0C0C0B8B8B8B8B8B8B8B8B880808000000000D8D8D8D8D8D8"
    200     $"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8000000B8B8"
    201     $"B8FFFFFFFFFFFFFFFFFFFFFFFF808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80"
    202     $"808000000000D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
    203     $"D8D8D8D8D8D8D8000000B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8808080B8B8B8B8"
    204     $"B8B8B8B8B8B8B8B8B8B8B880808000000000D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
    205     $"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D800000000000000000000"
    206     $"0000000000585858000000000000000000000000000000000000D8D8D800D8D8"
    207     $"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
    208     $"D8D8D8D8D8D8D8D8D8D8D8D8D8D8000000000000000000D8D8D8D8D8D8D8D8D8"
    209     $"D8D8D8D8D8D8D8D8D800D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
    210     $"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8000000"
    211     $"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D800D8D8D8D8D8D8D8D8D8D8"
    212     $"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
    213     $"D8D8D8D8D8D8D8D8D8000000D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
    214     $"D800000000000000000000000000000000000000000000000000000000000000"
    215     $"0000000000000000000000000000000000000000000000000000000000000000"
    216     $"0000000000000000000000000000000000000000000000000000000000000000"
    217     $"0000000000000000000000000000000000000000000000000000000000000000"
    218     $"0000000000000000000000000000000000000000000000000000000000000000"
    219     $"0000000000000000000000000000000000000000000000000000000000000000"
    220     $"0000000000000000000000000000000000000000000000000000000000000000"
    221     $"0000000000000000000000000000000000000000000000000000000000000000"
    222     $"0000000000000000000000000000000000000000000000000000000000000000"
    223     $"0000000000000000000000000000000000000000000000000000000000000000"
    224     $"0000000000000000000000000000000000000000000000000000000000000000"
    225     $"0000000000000000000000000000000000000000000000000000000000000000"
    226     $"0000000000000000000000000000000000000000000000000000000000000000"
    227     $"0000000000000000000000000000000000000000000000000000000000000000"
    228     $"0000000000000000000000000000000000000000000000000000000000000000"
    229     $"0000000000000000000000000000000000000000000000000000000000000000"
    230     $"0000000000000000000000000000000000000000000000000000000000000000"
    231     $"0000000000000000"
     182    $"424d1e090000000000003600000028000000190000001e00000001001800"
     183    $"00000000e8080000130b0000130b00000000000000000000d8d8d8d8d8d8"
     184    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     185    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     186    $"d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     187    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     188    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8"
     189    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     190    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     191    $"d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     192    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     193    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8"
     194    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     195    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     196    $"d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     197    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800000000000000000000"
     198    $"0000000000000000000000000000000000000000000000000000d8d8d800"
     199    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     200    $"d8d8d8000000808080808080808080808080808080808080808080808080"
     201    $"80808080808080808080808000000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     202    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8000000b8b8b8ffffffb8b8"
     203    $"b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b88080800000"
     204    $"0000d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     205    $"d8d8d8d8d8000000b8b8b8ffffffb8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8"
     206    $"b8b8b8b8b8b8b8b8b8b8b880808000000000d8d8d8d8d8d8d8d8d8d8d8d8"
     207    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8000000b8b8b8ffffff"
     208    $"b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8808080"
     209    $"00000000d8d8d8d8d8d8d8d8d8989898d8d8d89898989898989898989898"
     210    $"98d8d8d8d8d8d8000000b8b8b8ffffffb8b8b8b8b8b8b8b8b8b8b8b8b8b8"
     211    $"b8b8b8b8b8b8b8b8b8b8b8b8b880808000000000d8d8d8d8d8d8d8d8d8d8"
     212    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8000000b8b8b8ff"
     213    $"ffffb8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b880"
     214    $"808000000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     215    $"d8d8d8d8d8d8d8d8d8000000b8b8b8ffffffb8b8b8b8b8b8b8b8b8b8b8b8"
     216    $"b8b8b8b8b8b8b8b8b8b8b8b8b8b8b880808000000000989898d8d8d89898"
     217    $"98989898989898989898989898989898989898d8d8d8d8d8d8000000b8b8"
     218    $"b8ffffffb8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8"
     219    $"b87f7f7f00000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     220    $"d8d8d8d8d8d8d8d8d8d8d8000000b8b8b8ffffffb8b8b8b8b8b8b8b8b8b8"
     221    $"b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b880808000000000d8d8d8d8d8d8"
     222    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8000000"
     223    $"b8b8b8ffffffffffffffffffffffffffffffffffffffffffffffffffffff"
     224    $"ffffff80808000000000d8d8d8d8d8d8d8d8d8989898d8d8d89898989898"
     225    $"98989898989898d8d8d8d8d8d80000008080808080808080808080808080"
     226    $"8080808080808080808080808080808080808080808000000000d8d8d8d8"
     227    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800"
     228    $"0000b8b8b8ffffffb8b8b8b8b8b8c0c0c0808080ffffffc0c0c0b8b8b8b8"
     229    $"b8b8b8b8b880808000000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     230    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8000000b8b8b8ffffffb8b8b8b8b8b8"
     231    $"c0c0c0808080ffffffc0c0c0b8b8b8b8b8b8b8b8b880808000000000d8d8"
     232    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     233    $"d8000000b8b8b8ffffffb8b8b8b8b8b8c0c0c0808080ffffffc0c0c0b8b8"
     234    $"b8b8b8b8b8b8b880808000000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     235    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8000000b8b8b8ffffffffffffff"
     236    $"ffffffffff808080ffffffffffffffffffffffffffffff80808000000000"
     237    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     238    $"d8d8d8000000b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8808080b8b8b8b8b8b8"
     239    $"b8b8b8b8b8b8b8b8b880808000000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     240    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d80000000000000000"
     241    $"00000000000000585858000000000000000000000000000000000000d8d8"
     242    $"d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     243    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8000000000000000000d8"
     244    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8"
     245    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     246    $"d8d8d8d8d8d8d8d8d8000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     247    $"d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     248    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8000000d8d8"
     249    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8"
     250    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     251    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     252    $"d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     253    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     254    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8"
     255    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     256    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     257    $"d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     258    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     259    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800"
    232260};
    233261
    234262resource(603, "acceleration_bmap") #'bits' array {
    235     $"424D83080000000000003A000000280000001900000015000000010018000000"
    236     $"000049080000130B0000130B00000000F8410000F841FFFFFFFFD8D8D8D8D8D8"
    237     $"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D80000"
    238     $"0000000000000000000000000000000000000000000000000000000000000000"
    239     $"0000D8D8D800D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
    240     $"D8D8D8D8D8D8D800000080808080808080808080808080808080808080808080"
    241     $"808080808080808080808080808000000000D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
    242     $"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8000000B8B8B8FFFFFFB8B8B8B8"
    243     $"B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B880808000000000D8D8"
    244     $"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D800"
    245     $"0000B8B8B8FFFFFFB8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8"
    246     $"B8B8B880808000000000D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
    247     $"D8D8D8D8D8D8D8D8D8D8D8000000B8B8B8FFFFFFB8B8B8B8B8B8B8B8B8B8B8B8"
    248     $"B8B8B8B8B8B8B8B8B8B8B8B8B8B8B880808000000000D8D8D8D8D8D8D8D8D898"
    249     $"9898D8D8D8989898989898989898989898D8D8D8D8D8D8000000B8B8B8FFFFFF"
    250     $"B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B88080800000"
    251     $"0000D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
    252     $"D8D8D8000000B8B8B8FFFFFFB8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8"
    253     $"B8B8B8B8B8B8B880808000000000D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
    254     $"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8000000B8B8B8FFFFFFB8B8B8B8B8B8B8B8"
    255     $"B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B87F7F7F00000000989898D8D8D8"
    256     $"989898989898989898989898989898989898989898D8D8D8D8D8D8000000B8B8"
    257     $"B8FFFFFFB8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B880"
    258     $"808000000000D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
    259     $"D8D8D8D8D8D8D8000000B8B8B8FFFFFFB8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8"
    260     $"B8B8B8B8B8B8B8B8B8B8B87F7F7F00000000D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
    261     $"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8000000B8B8B8FFFFFFFFFFFFFF"
    262     $"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80808000000000D8D8"
    263     $"D8D8D8D8D8D8D8989898D8D8D8989898989898989898989898D8D8D8D8D8D800"
    264     $"0000808080808080808080808080808080808080808080808080808080808080"
    265     $"80808080808000000000D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
    266     $"D8D8D8D8D8D8D8D8D8D8D8000000B8B8B8FFFFFFB8B8B8B8B8B8C0C0C0808080"
    267     $"FFFFFFC0C0C0B8B8B8B8B8B8B8B8B880808000000000D8D8D8D8D8D8D8D8D8D8"
    268     $"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8000000B8B8B8FFFFFF"
    269     $"B8B8B8B8B8B8C0C0C0808080FFFFFFC0C0C0B8B8B8B8B8B8B8B8B88080800000"
    270     $"0000D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
    271     $"D8D8D8000000B8B8B8FFFFFFB8B8B8B8B8B8C0C0C0808080FFFFFFC0C0C0B8B8"
    272     $"B8B8B8B8B8B8B880808000000000D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
    273     $"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8000000B8B8B8FFFFFFFFFFFFFFFFFFFFFF"
    274     $"FF808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80808000000000D8D8D8D8D8D8"
    275     $"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8000000B8B8"
    276     $"B8B8B8B8B8B8B8B8B8B8B8B8B8808080B8B8B8B8B8B8B8B8B8B8B8B8B8B8B880"
    277     $"808000000000D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
    278     $"D8D8D8D8D8D8D8D8D8D800000000000000000000000000000058585800000000"
    279     $"0000000000000000000000000000D8D8D800D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
    280     $"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
    281     $"D8D8000000000000000000D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D800D8D8"
    282     $"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
    283     $"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8000000D8D8D8D8D8D8D8D8D8D8D8D8"
    284     $"D8D8D8D8D8D8D8D8D800D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
    285     $"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8000000"
    286     $"D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D800000090413D3D3DFF0000"
    287     $"80420000984100008042000008423D0000FF0000804200000C42000080420000"
    288     $"4842003D00FF0000804200004C42000080420000844200003DFF000082420000"
    289     $"004000008242000090413E3E3EFF000082420000984100008242000008423E00"
    290     $"00FF0000824200000C420000824200004842003E00FF0000824200004C420000"
    291     $"82420000844200003EFF000084420000004000008442000090413F3F3FFF0000"
    292     $"84420000984100008442000008423F0000FF0000844200000C42000084420000"
    293     $"4842003F00FF0000844200004C42000084420000844200003FFF000086420000"
    294     $"00400000864200009041404040FF000086420000984100008642000008424000"
    295     $"00FF0000864200000C420000864200004842004000FF0000864200004C420000"
    296     $"864200008442000040FF00008842000000400000884200009041414141FF0000"
    297     $"8842000098410000884200000842410000FF0000884200000C42000088420000"
    298     $"4842004100FF0000884200004C420000884200008442000041FF00008A420000"
    299     $"004000008A4200009041424242FF00008A420000984100008A42000008424200"
    300     $"00FF00008A4200000C4200008A4200004842004200FF00008A4200004C420000"
    301     $"8A4200008442000042FF00008C420000004000008C4200009041434343FF0000"
    302     $"8C420000984100008C4200000842430000FF00008C4200000C4200008C420000"
    303     $"484200"
     263    $"424d1e090000000000003600000028000000190000001e00000001001800"
     264    $"00000000e8080000130b0000130b00000000000000000000d8d8d8d8d8d8"
     265    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     266    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     267    $"d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     268    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     269    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8"
     270    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     271    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     272    $"d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     273    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     274    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8"
     275    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     276    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     277    $"d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d800000000000000000000000000"
     278    $"0000000000000000000000000000000000000000000000d8d8d8d8d8d8d8"
     279    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800"
     280    $"000000808080808080808080808080808080808080808080808080808080"
     281    $"808080808080808080000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     282    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800000000b8b8b8ffffffb8b8b8b8b8"
     283    $"b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8808080000000d8d8"
     284    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     285    $"d800000000b8b8b8ffffffb8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8"
     286    $"b8b8b8b8b8b8b8b8808080000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     287    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800000000b8b8b8ffffffb8b8b8"
     288    $"b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8808080000000"
     289    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     290    $"d8d8d800000000b8b8b8ffffffb8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8"
     291    $"b8b8b8b8b8b8b8b8b8b8808080000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     292    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800000000b8b8b8ffffffb8"
     293    $"b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b880808000"
     294    $"0000d8d8d8d8d8d8989898d8d8d8d8d8d8d8d8d8989898d8d8d8d8d8d8d8"
     295    $"d8d8d8d8d800000000b8b8b8ffffffb8b8b8b8b8b8b8b8b8b8b8b8b8b8b8"
     296    $"b8b8b8b8b8b8b8b8b8b8b8b8808080000000d8d8d8d8d8d8989898989898"
     297    $"d8d8d8d8d8d8989898989898d8d8d8d8d8d8d8d8d800000000b8b8b8ffff"
     298    $"ffb8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b87f7f"
     299    $"7f000000d8d8d8d8d8d8989898989898989898d8d8d89898989898989898"
     300    $"98d8d8d8d8d8d800000000b8b8b8ffffffb8b8b8b8b8b8b8b8b8b8b8b8b8"
     301    $"b8b8b8b8b8b8b8b8b8b8b8b8b8b8808080000000d8d8d8d8d8d898989898"
     302    $"9898989898989898989898989898989898989898d8d8d800000000b8b8b8"
     303    $"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
     304    $"808080000000d8d8d8d8d8d8989898989898989898d8d8d8989898989898"
     305    $"989898d8d8d8d8d8d8000000008080808080808080808080808080808080"
     306    $"80808080808080808080808080808080808080000000d8d8d8d8d8d89898"
     307    $"98989898d8d8d8d8d8d8989898989898d8d8d8d8d8d8d8d8d800000000b8"
     308    $"b8b8ffffffb8b8b8b8b8b8c0c0c0808080ffffffc0c0c0b8b8b8b8b8b8b8"
     309    $"b8b8808080000000d8d8d8d8d8d8989898d8d8d8d8d8d8d8d8d8989898d8"
     310    $"d8d8d8d8d8d8d8d8d8d8d800000000b8b8b8ffffffb8b8b8b8b8b8c0c0c0"
     311    $"808080ffffffc0c0c0b8b8b8b8b8b8b8b8b8808080000000d8d8d8d8d8d8"
     312    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8000000"
     313    $"00b8b8b8ffffffb8b8b8b8b8b8c0c0c0808080ffffffc0c0c0b8b8b8b8b8"
     314    $"b8b8b8b8808080000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     315    $"d8d8d8d8d8d8d8d8d8d8d8d8d800000000b8b8b8ffffffffffffffffffff"
     316    $"ffff808080ffffffffffffffffffffffffffffff808080000000d8d8d8d8"
     317    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800"
     318    $"000000b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8808080b8b8b8b8b8b8b8b8b8"
     319    $"b8b8b8b8b8b8808080000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     320    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d80000000000000000000000"
     321    $"00000000585858000000000000000000000000000000000000d8d8d8d8d8"
     322    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     323    $"d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8000000000000000000d8d8d8d8"
     324    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     325    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8"
     326    $"d8d8d8d8d8d8000000d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     327    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     328    $"d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8000000d8d8d8d8d8"
     329    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     330    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8"
     331    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     332    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     333    $"d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     334    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     335    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8"
     336    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     337    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     338    $"d8d8d8d8d8d8d800d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     339    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8"
     340    $"d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800"
    304341};
  • src/preferences/mouse/MouseView.h

     
    1818#define MOUSE_VIEW_H
    1919
    2020
    21 #include <View.h>
    2221#include <Bitmap.h>
    2322#include <PopUpMenu.h>
     23#include <View.h>
    2424
    2525
    2626class MouseSettings;
    2727
    2828class MouseView : public BView {
    2929    public:
    30         MouseView(BRect frame, const MouseSettings &settings);
    31         virtual ~MouseView();
     30                                MouseView(const MouseSettings &settings);
     31        virtual                 ~MouseView();
    3232
    33         virtual void AttachedToWindow();
    34         virtual void MouseDown(BPoint where);
    35         virtual void MouseUp(BPoint where);
    36         virtual void Draw(BRect frame);
    37         virtual void GetPreferredSize(float *_width, float *_height);
     33        virtual void            AttachedToWindow();
     34        virtual void            MouseDown(BPoint where);
     35        virtual void            MouseUp(BPoint where);
     36        virtual void            Draw(BRect frame);
     37        virtual void            GetPreferredSize(float *_width, float *_height);
    3838
    39         void SetMouseType(int32 type);
    40         void MouseMapUpdated();
    41         void UpdateFromSettings();
     39                void            SetMouseType(int32 type);
     40                void            MouseMapUpdated();
     41                void            UpdateFromSettings();
    4242
    4343    private:
    44         int32 ConvertFromVisualOrder(int32 button);
     44                int32           ConvertFromVisualOrder(int32 button);
    4545
    46         typedef BView inherited;
     46                typedef         BView inherited;
    4747
    48         const MouseSettings &fSettings;
    49         BBitmap     *fMouseBitmap, *fMouseDownBitmap;
    50         BRect       fMouseDownBounds;
     48        const   MouseSettings   &fSettings;
     49                BBitmap         *fMouseBitmap, *fMouseDownBitmap;
     50                BRect           fMouseDownBounds;
    5151
    52         int32       fType;
    53         uint32      fButtons;
    54         uint32      fOldButtons;
     52                int32           fType;
     53                uint32          fButtons;
     54                uint32          fOldButtons;
    5555};
    5656
    5757#endif  /* MOUSE_VIEW_H */
  • src/preferences/mouse/MouseConstants.h

     
    1010//  Authors:        Jérôme Duval,
    1111//                  Andrew McCall (mccall@digitalparadise.co.uk)
    1212//                  Axel Dörfler (axeld@pinc-software.de)
     13//                  Brecht Machiels (brecht@mos6581.org)
    1314//  Description:    Mouse Preferences
    1415//  Created:        December 10, 2003
    1516//
     
    1819#ifndef MOUSE_CONSTANTS_H
    1920#define MOUSE_CONSTANTS_H
    2021
     22
    2123// interface messages
    2224const uint32 kMsgDefaults           = 'BTde';
    2325const uint32 kMsgRevert             = 'BTre';
    2426
    2527const uint32 kMsgMouseType          = 'PUmt';
    2628const uint32 kMsgMouseFocusMode     = 'PUmf';
     29const uint32 kMsgFollowsMouseMode   = 'PUff';
     30const uint32 kMsgAcceptFirstClick   = 'PUaf';
    2731const uint32 kMsgMouseMap           = 'PUmm';
    2832
    2933const uint32 kMsgDoubleClickSpeed   = 'SLdc';
  • src/preferences/mouse/SettingsView.cpp

     
    88//
    99//  File:           SettingsView.cpp
    1010//  Authors:        Jérôme Duval,
    11 //                  Andrew McCall (mccall@digitalparadise.co.uk)
    12 //                  Axel Dörfler (axeld@pinc-software.de)
     11//                  Andrew McCall (mccall@digitalparadise.co.uk),
     12//                  Axel Dörfler (axeld@pinc-software.de),
     13//                  Brecht Machiels (brecht@mos6581.org)
    1314//  Description:    Mouse Preferences
    1415//  Created:        December 10, 2003
    1516//
    1617// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
    1718
    18 #include <InterfaceDefs.h>
    19 #include <Button.h>
    20 #include <Box.h>
     19#include "SettingsView.h"
     20
    2121#include <Bitmap.h>
    22 #include <TranslationUtils.h>
    23 #include <TextControl.h>
    24 #include <Slider.h>
    25 #include <PopUpMenu.h>
     22#include <Box.h>
     23#include <Button.h>
     24#include <Debug.h>
     25#include <GroupLayout.h>
     26#include <GroupLayoutBuilder.h>
     27#include <InterfaceDefs.h>
    2628#include <MenuField.h>
    2729#include <MenuItem.h>
    28 #include <Debug.h>
     30#include <PopUpMenu.h>
     31#include <Slider.h>
     32#include <TextControl.h>
     33#include <TranslationUtils.h>
    2934#include <Window.h>
    3035
    31 #include "SettingsView.h"
    3236#include "MouseConstants.h"
    3337#include "MouseSettings.h"
    3438#include "MouseView.h"
     
    4145        case B_NORMAL_MOUSE:
    4246        default:
    4347            return 0;
     48        case B_CLICK_TO_FOCUS_MOUSE:
     49            return 1;
    4450        case B_FOCUS_FOLLOWS_MOUSE:
     51            return 2;
     52    }
     53}
     54
     55static int32
     56focus_follows_mouse_mode_to_index(mode_focus_follows_mouse mode)
     57{
     58    switch (mode) {
     59        case B_NORMAL_FOCUS_FOLLOWS_MOUSE:
     60        default:
     61            return 0;
     62        case B_WARP_FOCUS_FOLLOWS_MOUSE:
    4563            return 1;
    46         case B_WARP_MOUSE:
     64        case B_INSTANT_WARP_FOCUS_FOLLOWS_MOUSE:
    4765            return 2;
    48         case B_INSTANT_WARP_MOUSE:
    49             return 3;
    5066    }
    5167}
    5268
    5369
    5470//  #pragma mark -
    5571
    56 
    57 SettingsView::SettingsView(BRect rect, MouseSettings &settings)
    58     : BBox(rect, "main_view"),
     72SettingsView::SettingsView(MouseSettings &settings)
     73    : BBox("main_view"),
    5974    fSettings(settings)
    6075{
    61     ResizeToPreferred();
    62 
    6376    fDoubleClickBitmap = BTranslationUtils::GetBitmap("double_click_bmap");
    6477    fSpeedBitmap = BTranslationUtils::GetBitmap("speed_bmap");
    6578    fAccelerationBitmap = BTranslationUtils::GetBitmap("acceleration_bmap");
    6679
     80    fDoubleClickView = new BBitmapView(*fDoubleClickBitmap);
     81    fSpeedView = new BBitmapView(*fSpeedBitmap);
     82    fAccelerationView = new BBitmapView(*fAccelerationBitmap);
     83
    6784    // Add the "Mouse Type" pop up menu
    6885    fTypeMenu = new BPopUpMenu("unknown");
    6986    fTypeMenu->AddItem(new BMenuItem("1-Button", new BMessage(kMsgMouseType)));
    7087    fTypeMenu->AddItem(new BMenuItem("2-Button", new BMessage(kMsgMouseType)));
    7188    fTypeMenu->AddItem(new BMenuItem("3-Button", new BMessage(kMsgMouseType)));
    7289
    73     BMenuField *field = new BMenuField(BRect(7, 8, 155, 190), "mouse_type", "Mouse type:", fTypeMenu);
    74     field->SetDivider(field->StringWidth(field->Label()) + kItemSpace);
    75     field->SetAlignment(B_ALIGN_RIGHT);
    76     AddChild(field);
     90    BMenuField *fTypeField = new BMenuField("Mouse type:", fTypeMenu, NULL);
     91    fTypeField->SetAlignment(B_ALIGN_RIGHT);
    7792
    78     BFont font = be_plain_font;
    79     float length = font.StringWidth("Mouse type: [3-Button]") + 20;
    80     fLeftArea.Set(8, 7, length + 8, 198);
    81     if (fLeftArea.Width() < 125)
    82         fLeftArea.right = fLeftArea.left + 125;
    83 
    84     fRightArea.Set(fLeftArea.right + 10, 11, 200, 7);
    85 
    8693    // Create the "Double-click speed slider...
    87     fClickSpeedSlider = new BSlider(fRightArea, "double_click_speed", "Double-click speed",
    88         new BMessage(kMsgDoubleClickSpeed), 0, 1000);
     94    fClickSpeedSlider = new BSlider("double_click_speed", "Double-click speed",
     95        new BMessage(kMsgDoubleClickSpeed), 0, 1000, B_HORIZONTAL);
    8996    fClickSpeedSlider->SetHashMarks(B_HASH_MARKS_BOTTOM);
    9097    fClickSpeedSlider->SetHashMarkCount(5);
    9198    fClickSpeedSlider->SetLimitLabels("Slow", "Fast");
    92     AddChild(fClickSpeedSlider);
    9399
    94     length = fClickSpeedSlider->Bounds().Height() + 6;
    95     fDoubleClickBmpPoint.y = fRightArea.top +
    96         (length - fDoubleClickBitmap->Bounds().Height()) / 2;
    97     fRightArea.top += length;
    98 
    99100    // Create the "Mouse Speed" slider...
    100     fMouseSpeedSlider = new BSlider(fRightArea, "mouse_speed", "Mouse Speed",
    101         new BMessage(kMsgMouseSpeed), 0, 1000);
     101    fMouseSpeedSlider = new BSlider("mouse_speed", "Mouse Speed",
     102        new BMessage(kMsgMouseSpeed), 0, 1000, B_HORIZONTAL);
    102103    fMouseSpeedSlider->SetHashMarks(B_HASH_MARKS_BOTTOM);
    103104    fMouseSpeedSlider->SetHashMarkCount(7);
    104105    fMouseSpeedSlider->SetLimitLabels("Slow", "Fast");
    105     AddChild(fMouseSpeedSlider);
    106106
    107     fSpeedBmpPoint.y = fRightArea.top +
    108         (length - fSpeedBitmap->Bounds().Height()) / 2;
    109     fRightArea.top += length;
    110 
    111107    // Create the "Mouse Acceleration" slider...
    112     fAccelerationSlider = new BSlider(fRightArea, "mouse_acceleration", "Mouse Acceleration",
    113         new BMessage(kMsgAccelerationFactor), 0, 1000);
     108    fAccelerationSlider = new BSlider("mouse_acceleration", "Mouse Acceleration",
     109        new BMessage(kMsgAccelerationFactor), 0, 1000, B_HORIZONTAL);
    114110    fAccelerationSlider->SetHashMarks(B_HASH_MARKS_BOTTOM);
    115111    fAccelerationSlider->SetHashMarkCount(5);
    116112    fAccelerationSlider->SetLimitLabels("Slow", "Fast");
    117     AddChild(fAccelerationSlider);
    118113
    119     fAccelerationBmpPoint.y = fRightArea.top +
    120         (length - fAccelerationBitmap->Bounds().Height()) / 2;
    121     fRightArea.top += length - 3;
     114    // Mouse image...
     115    fMouseView = new MouseView(fSettings);
     116
     117    // Create the "Double-click test area" text box...
     118    BTextControl *fDoubleClick = new BTextControl(NULL, "Double-click test area", NULL);
     119    fDoubleClick->SetAlignment(B_ALIGN_LEFT, B_ALIGN_CENTER);
     120
     121    // Add the "Mouse focus mode" pop up menu
     122    fFocusMenu = new BPopUpMenu("Click to Activate");
    122123   
    123     // Add the "Focus follows mouse" pop up menu
    124     fFocusMenu = new BPopUpMenu("Disabled");
    125    
    126     const char *focusLabels[] = {"Disabled", "Enabled", "Warping", "Instant-Warping"};
    127     const mode_mouse focusModes[] = {B_NORMAL_MOUSE, B_FOCUS_FOLLOWS_MOUSE,
    128         B_WARP_MOUSE, B_INSTANT_WARP_MOUSE};
     124    const char *focusLabels[] = {"Click to Activate", "Click to Focus",
     125                                    "Focus Follows Mouse"};
     126    const mode_mouse focusModes[] = {B_NORMAL_MOUSE, B_CLICK_TO_FOCUS_MOUSE,
     127                                        B_FOCUS_FOLLOWS_MOUSE};
    129128
    130     for (int i = 0; i < 4; i++) {
     129    for (int i = 0; i < 3; i++) {
    131130        BMessage *message = new BMessage(kMsgMouseFocusMode);
    132131        message->AddInt32("mode", focusModes[i]);
    133132
    134133        fFocusMenu->AddItem(new BMenuItem(focusLabels[i], message));
    135134    }
    136135
    137     BRect frame(fRightArea.left, fRightArea.top + 10, fRightArea.left +
    138             font.StringWidth("Focus follows mouse:") +
    139             font.StringWidth(focusLabels[0]) + 30, 200);
    140     field = new BMenuField(frame, "ffm", "Focus follows mouse:", fFocusMenu, true);
    141     field->SetDivider(field->StringWidth(field->Label()) + kItemSpace);
    142     field->SetAlignment(B_ALIGN_RIGHT);
    143     AddChild(field);
     136    BMenuField *fFocusField = new BMenuField("Focus mode:", fFocusMenu, NULL);
     137    fFocusField->SetAlignment(B_ALIGN_RIGHT);
     138   
     139    // Add the "Focus follows mouse mode" pop up menu
     140    fFocusFollowsMouseMenu = new BPopUpMenu("Normal");
     141   
     142    const char *focusFollowsMouseLabels[] = {"Normal", "Warp", "Instant Warp"};
     143    const mode_focus_follows_mouse focusFollowsMouseModes[] =
     144        {B_NORMAL_FOCUS_FOLLOWS_MOUSE, B_WARP_FOCUS_FOLLOWS_MOUSE,
     145            B_INSTANT_WARP_FOCUS_FOLLOWS_MOUSE};
    144146
    145     // Finalize the areas
    146     fRightArea.bottom = fRightArea.top;
    147     fRightArea.top = 11;
    148     fRightArea.right = frame.right + 8;
    149     if (fRightArea.Width() < 200)
    150         fRightArea.right = fRightArea.left + 200;
    151     fLeftArea.bottom = fRightArea.bottom;
     147    for (int i = 0; i < 3; i++) {
     148        BMessage *message = new BMessage(kMsgFollowsMouseMode);
     149        message->AddInt32("mode_focus_follows_mouse", focusFollowsMouseModes[i]);
    152150
    153     // Position mouse bitmaps
    154     fDoubleClickBmpPoint.x = fRightArea.right - fDoubleClickBitmap->Bounds().right - 15;
    155     fSpeedBmpPoint.x = fRightArea.right - fSpeedBitmap->Bounds().right - 15;
    156     fAccelerationBmpPoint.x = fRightArea.right - fAccelerationBitmap->Bounds().right - 15;
     151        fFocusFollowsMouseMenu->AddItem(new BMenuItem(focusFollowsMouseLabels[i],
     152            message));
     153    }
    157154
    158     // Resize sliders to equal size
    159     length = fRightArea.left - 5;
    160     fClickSpeedSlider->ResizeTo(fDoubleClickBmpPoint.x - length - 11,
    161             fClickSpeedSlider->Bounds().Height());
    162     fMouseSpeedSlider->ResizeTo(fSpeedBmpPoint.x - length,
    163             fMouseSpeedSlider->Bounds().Height());
    164     fAccelerationSlider->ResizeTo(fAccelerationBmpPoint.x - length,
    165             fAccelerationSlider->Bounds().Height());
     155    BMenuField *fFocusFollowsMouseField = new BMenuField("Focus follows mouse mode:",
     156        fFocusFollowsMouseMenu, NULL);
     157    fFocusFollowsMouseField->SetAlignment(B_ALIGN_RIGHT);
    166158
    167     // Mouse image...
    168     frame.Set(0, 0, 148, 162);
    169     fMouseView = new MouseView(frame, fSettings);
    170     fMouseView->ResizeToPreferred();
    171     fMouseView->MoveBy((fLeftArea.right - fMouseView->Bounds().Width()) / 2,
    172         (fLeftArea.bottom - fMouseView->Bounds().Height()) / 2);
    173     AddChild(fMouseView);
     159    // Add the "Click-through" check box
     160    fAcceptFirstClickBox = new BCheckBox("Accept first click",
     161        new BMessage(kMsgAcceptFirstClick));
    174162
    175     // Create the "Double-click test area" text box...
    176     frame.Set(fLeftArea.left, fLeftArea.bottom + 10, fLeftArea.right, 0);
    177     BTextControl *textControl = new BTextControl(frame, "double_click_test_area", NULL,
    178         "Double-click test area", NULL);
    179     textControl->SetAlignment(B_ALIGN_LEFT, B_ALIGN_CENTER);
    180     AddChild(textControl);
     163    // dividers
     164    BBox* hdivider = new BBox(
     165        BRect(0, 0, 1, 1), B_EMPTY_STRING, B_FOLLOW_ALL_SIDES,
     166            B_WILL_DRAW | B_FRAME_EVENTS, B_FANCY_BORDER);
     167    hdivider->SetExplicitMaxSize(BSize(1, B_SIZE_UNLIMITED));
     168   
     169    BBox* vdivider = new BBox(
     170        BRect(0, 0, 1, 1), B_EMPTY_STRING, B_FOLLOW_ALL_SIDES,
     171            B_WILL_DRAW | B_FRAME_EVENTS, B_FANCY_BORDER);
     172    vdivider->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, 1));
    181173
    182     ResizeTo(fRightArea.right + 5, fLeftArea.bottom + 60);
     174    // Build the layout
     175    SetLayout(new BGroupLayout(B_HORIZONTAL));
     176
     177    AddChild(BGroupLayoutBuilder(B_VERTICAL, 10)
     178        .AddGroup(B_HORIZONTAL, 10)
     179            .AddGroup(B_VERTICAL, 10, 1)
     180                .AddGroup(B_HORIZONTAL, 10)
     181                    .AddGlue()
     182                    .Add(fTypeField)
     183                    .AddGlue()
     184                .End()
     185                .AddGlue()
     186                .Add(BGroupLayoutBuilder(B_HORIZONTAL, 10)
     187                    .AddGlue()
     188                    .Add(fMouseView)
     189                    .AddGlue()
     190                )
     191                .AddGlue()
     192                .Add(fDoubleClick)
     193            .End()
     194            .Add(hdivider)
     195            .AddGroup(B_VERTICAL, 5, 3)
     196                .Add(BGroupLayoutBuilder(B_HORIZONTAL, 0)
     197                    .Add(fClickSpeedSlider)
     198                    .Add(fDoubleClickView)
     199                )
     200                .Add(BGroupLayoutBuilder(B_HORIZONTAL, 0)
     201                    .Add(fMouseSpeedSlider)
     202                    .Add(fSpeedView)
     203                )
     204                .Add(BGroupLayoutBuilder(B_HORIZONTAL, 0)
     205                    .Add(fAccelerationSlider)
     206                    .Add(fAccelerationView)
     207                )
     208            .End()
     209        .End()
     210        .Add(vdivider)
     211        .AddGroup(B_HORIZONTAL, 10)
     212            .Add(fFocusField)
     213            .AddGlue()
     214            .AddGroup(B_VERTICAL, 0)
     215                .Add(fAcceptFirstClickBox)
     216                .Add(fFocusFollowsMouseField)
     217            .End()
     218        .End()
     219        .SetInsets(5, 5, 5, 5)
     220    );
    183221}
    184222
    185223
     
    199237
    200238
    201239void
    202 SettingsView::GetPreferredSize(float *_width, float *_height)
    203 {
    204     if (_width)
    205         *_width = fRightArea.right + 5;
    206     if (_height)
    207         *_height = fLeftArea.bottom + 60;
    208 }
    209 
    210 
    211 void
    212 SettingsView::Draw(BRect updateFrame)
    213 {
    214     inherited::Draw(updateFrame);
    215 
    216     SetHighColor(120, 120, 120);
    217     SetLowColor(255, 255, 255);
    218    
    219     // Line above the test area
    220     fLeft = fLeftArea.LeftBottom();
    221     fRight = fLeftArea.RightBottom();
    222     StrokeLine(fLeft, fRight, B_SOLID_HIGH);
    223     fLeft.y++; fRight.y++;
    224     StrokeLine(fLeft, fRight, B_SOLID_LOW);
    225    
    226     // Line above focus follows mouse
    227     fLeft = fRightArea.LeftBottom();
    228     fRight = fRightArea.RightBottom();
    229     StrokeLine(fLeft, fRight, B_SOLID_HIGH);
    230     fLeft.y++; fRight.y++;
    231     StrokeLine(fLeft, fRight, B_SOLID_LOW);
    232    
    233     // Line in the middle
    234     fLeft = fLeftArea.RightTop();
    235     fRight = fLeftArea.RightBottom();
    236     fLeft.x += 5;
    237     fRight.x += 5;
    238     StrokeLine(fLeft, fRight, B_SOLID_HIGH);
    239     fLeft.x++; fRight.x++;
    240     StrokeLine(fLeft, fRight, B_SOLID_LOW);
    241 
    242     SetDrawingMode(B_OP_OVER);
    243 
    244     // Draw the icons
    245     if (fDoubleClickBitmap != NULL
    246         && updateFrame.Intersects(BRect(fDoubleClickBmpPoint,
    247             fDoubleClickBmpPoint + fDoubleClickBitmap->Bounds().RightBottom())))
    248         DrawBitmapAsync(fDoubleClickBitmap, fDoubleClickBmpPoint);
    249 
    250     if (fSpeedBitmap != NULL
    251         && updateFrame.Intersects(BRect(fSpeedBmpPoint,
    252             fSpeedBmpPoint + fSpeedBitmap->Bounds().RightBottom())))
    253         DrawBitmapAsync(fSpeedBitmap, fSpeedBmpPoint);
    254    
    255     if (fAccelerationBitmap != NULL
    256         && updateFrame.Intersects(BRect(fAccelerationBmpPoint,
    257             fAccelerationBmpPoint + fAccelerationBitmap->Bounds().RightBottom())))
    258         DrawBitmapAsync(fAccelerationBitmap, fAccelerationBmpPoint);
    259    
    260 
    261     SetDrawingMode(B_OP_COPY);
    262 }
    263 
    264 
    265 void
    266240SettingsView::SetMouseType(int32 type)
    267241{
    268242    fMouseView->SetMouseType(type);
     
    300274    item = fFocusMenu->ItemAt(mouse_mode_to_index(fSettings.MouseMode()));
    301275    if (item != NULL)
    302276        item->SetMarked(true);
     277       
     278    item = fFocusFollowsMouseMenu->ItemAt(focus_follows_mouse_mode_to_index(fSettings.FocusFollowsMouseMode()));
     279    if (item != NULL)
     280        item->SetMarked(true);
     281
     282    fFocusFollowsMouseMenu->SetEnabled(fSettings.MouseMode() == B_FOCUS_FOLLOWS_MOUSE);
     283   
     284    fAcceptFirstClickBox->SetValue(fSettings.AcceptFirstClick() ? B_CONTROL_ON : B_CONTROL_OFF);
    303285}
    304286
  • src/apps/deskbar/BarWindow.cpp

     
    7575    : BWindow(BRect(-1000.0f, -1000.0f, -1000.0f, -1000.0f), "Deskbar",
    7676        B_BORDERED_WINDOW,
    7777        B_WILL_ACCEPT_FIRST_CLICK | B_NOT_ZOOMABLE | B_NOT_CLOSABLE
    78             | B_NOT_MOVABLE | B_AVOID_FRONT | B_ASYNCHRONOUS_CONTROLS,
     78            | B_NOT_MOVABLE | B_ASYNCHRONOUS_CONTROLS
     79            | B_AVOID_FOCUS,
    7980        B_ALL_WORKSPACES)
    8081{
    8182    desk_settings *settings = ((TBarApp *)be_app)->Settings();
  • src/servers/app/DesktopSettings.h

     
    4444        void            GetMenuInfo(menu_info& info) const;
    4545
    4646        mode_mouse      MouseMode() const;
     47        mode_focus_follows_mouse    FocusFollowsMouseMode() const;
    4748        bool            FocusFollowsMouse() const;
     49        bool            AcceptFirstClick() const;
    4850
    4951        bool            ShowAllDraggers() const;
    5052
     
    7577        void            SetMenuInfo(const menu_info& info);
    7678
    7779        void            SetMouseMode(mode_mouse mode);
     80        void            SetFocusFollowsMouseMode(const mode_focus_follows_mouse mode);
     81        void            SetAcceptFirstClick(bool accept_first_click);
    7882
    7983        void            SetShowAllDraggers(bool show);
    8084
  • src/servers/app/ServerApp.cpp

     
    1818    \brief Counterpart to BApplication within the app_server
    1919*/
    2020
     21#include "ServerApp.h"
     22
     23#include <new>
     24#include <stdio.h>
     25#include <string.h>
     26#include <syslog.h>
     27
     28#include <AppDefs.h>
     29#include <Autolock.h>
     30#include <Debug.h>
     31#include <List.h>
     32#include <ScrollBar.h>
     33#include <Shape.h>
     34#include <String.h>
     35
     36#include <FontPrivate.h>
     37#include <MessengerPrivate.h>
     38#include <RosterPrivate.h>
     39#include <ServerProtocol.h>
     40#include <WindowPrivate.h>
     41
    2142#include "AppServer.h"
    2243#include "BitmapManager.h"
    2344#include "CursorManager.h"
     
    3152#include "InputManager.h"
    3253#include "OffscreenServerWindow.h"
    3354#include "Screen.h"
    34 #include "ServerApp.h"
    3555#include "ServerBitmap.h"
    3656#include "ServerConfig.h"
    3757#include "ServerCursor.h"
     
    4161#include "SystemPalette.h"
    4262#include "Window.h"
    4363
    44 #include <FontPrivate.h>
    45 #include <MessengerPrivate.h>
    46 #include <RosterPrivate.h>
    47 #include <ServerProtocol.h>
    48 #include <WindowPrivate.h>
    4964
    50 #include <AppDefs.h>
    51 #include <Autolock.h>
    52 #include <Debug.h>
    53 #include <List.h>
    54 #include <ScrollBar.h>
    55 #include <Shape.h>
    56 #include <String.h>
    57 
    58 #include <new>
    59 #include <stdio.h>
    60 #include <string.h>
    61 #include <syslog.h>
    62 
    63 
    6465//#define DEBUG_SERVERAPP
    6566#ifdef DEBUG_SERVERAPP
    6667#   define STRACE(x) debug_printf x
     
    10501051
    10511052        case AS_SET_MOUSE_MODE:
    10521053        {
    1053             STRACE(("ServerApp %s: Set Focus Follows Mouse mode\n", Signature()));
     1054            STRACE(("ServerApp %s: Set Mouse Focus mode\n", Signature()));
    10541055            // Attached Data:
    1055             // 1) enum mode_mouse FFM mouse mode
     1056            // 1) enum mode_mouse mouse focus mode
    10561057            mode_mouse mouseMode;
    10571058            if (link.Read<mode_mouse>(&mouseMode) == B_OK) {
    10581059                LockedDesktopSettings settings(fDesktop);
     
    10621063        }
    10631064        case AS_GET_MOUSE_MODE:
    10641065        {
    1065             STRACE(("ServerApp %s: Get Focus Follows Mouse mode\n", Signature()));
     1066            STRACE(("ServerApp %s: Get Mouse Focus mode\n", Signature()));
    10661067
    10671068            if (fDesktop->LockSingleWindow()) {
    10681069                DesktopSettings settings(fDesktop);
     
    10771078            fLink.Flush();
    10781079            break;
    10791080        }
     1081        case AS_SET_FOCUS_FOLLOWS_MOUSE_MODE:
     1082        {
     1083            STRACE(("ServerApp %s: Set Focus Follows Mouse mode\n", Signature()));
     1084            // Attached Data:
     1085            // 1) enum mode_focus_follows_mouse FFM mouse mode
     1086            mode_focus_follows_mouse focusFollowsMousMode;
     1087            if (link.Read<mode_focus_follows_mouse>(&focusFollowsMousMode) == B_OK) {
     1088                LockedDesktopSettings settings(fDesktop);
     1089                settings.SetFocusFollowsMouseMode(focusFollowsMousMode);
     1090            }
     1091            break;
     1092        }
     1093        case AS_GET_FOCUS_FOLLOWS_MOUSE_MODE:
     1094        {
     1095            STRACE(("ServerApp %s: Get Focus Follows Mouse mode\n", Signature()));
    10801096
     1097            if (fDesktop->LockSingleWindow()) {
     1098                DesktopSettings settings(fDesktop);
     1099
     1100                fLink.StartMessage(B_OK);
     1101                fLink.Attach<mode_focus_follows_mouse>(settings.FocusFollowsMouseMode());
     1102
     1103                fDesktop->UnlockSingleWindow();
     1104            } else
     1105                fLink.StartMessage(B_ERROR);
     1106
     1107            fLink.Flush();
     1108            break;
     1109        }
     1110        case AS_SET_ACCEPT_FIRST_CLICK:
     1111        {
     1112            STRACE(("ServerApp %s: Set Accept First Click\n", Signature()));
     1113            // Attached Data:
     1114            // 1) bool accept_first_click
     1115            bool acceptFirstClick;
     1116            if (link.Read<bool>(&acceptFirstClick) == B_OK) {
     1117                LockedDesktopSettings settings(fDesktop);
     1118                settings.SetAcceptFirstClick(acceptFirstClick);
     1119            }
     1120            break;
     1121        }
     1122        case AS_GET_ACCEPT_FIRST_CLICK:
     1123        {
     1124            STRACE(("ServerApp %s: Get Accept First Click\n", Signature()));
     1125
     1126            if (fDesktop->LockSingleWindow()) {
     1127                DesktopSettings settings(fDesktop);
     1128
     1129                fLink.StartMessage(B_OK);
     1130                fLink.Attach<bool>(settings.AcceptFirstClick());
     1131
     1132                fDesktop->UnlockSingleWindow();
     1133            } else
     1134                fLink.StartMessage(B_ERROR);
     1135
     1136            fLink.Flush();
     1137            break;
     1138        }
     1139
    10811140        case AS_GET_SHOW_ALL_DRAGGERS:
    10821141        {
    10831142            STRACE(("ServerApp %s: Get Show All Draggers\n", Signature()));
  • src/servers/app/Window.h

     
    66 *      DarkWyrm <bpmagic@columbus.rr.com>
    77 *      Adi Oanca <adioanca@gmail.com>
    88 *      Stephan Aßmus <superstippi@gmx.de>
    9  *      Axel Dörfler, axeld@pinc-software.de
     9 *      Axel Dörfler <axeld@pinc-software.de>
     10 *      Brecht Machiels <brecht@mos6581.org>
    1011 */
    1112#ifndef WINDOW_H
    1213#define WINDOW_H
  • src/servers/app/Desktop.h

     
    55 * Authors:
    66 *      Adrian Oanca <adioanca@cotty.iren.ro>
    77 *      Stephan Aßmus <superstippi@gmx.de>
    8  *      Axel Dörfler, axeld@pinc-software.de
     8 *      Axel Dörfler <axeld@pinc-software.de>
    99 *      Andrej Spielmann, <andrej.spielmann@seh.ox.ac.uk>
     10 *      Brecht Machiels <brecht@mos6581.org>
    1011 */
    1112#ifndef DESKTOP_H
    1213#define DESKTOP_H
     
    116117
    117118        // Window methods
    118119
     120        void                    SelectWindow(Window* window);
    119121        void                    ActivateWindow(Window* window);
    120122        void                    SendWindowBehind(Window* window,
    121123                                    Window* behindOf = NULL);
  • src/servers/app/DesktopSettings.cpp

     
    1111
    1212#include "DesktopSettings.h"
    1313#include "DesktopSettingsPrivate.h"
     14
     15#include <Directory.h>
     16#include <File.h>
     17#include <FindDirectory.h>
     18#include <Path.h>
     19
     20#include <DefaultColors.h>
     21#include <ServerReadOnlyMemory.h>
     22
    1423#include "Desktop.h"
    1524#include "FontCache.h"
    1625#include "FontCacheEntry.h"
     
    1827#include "GlobalSubpixelSettings.h"
    1928#include "ServerConfig.h"
    2029
    21 #include <DefaultColors.h>
    22 #include <ServerReadOnlyMemory.h>
    2330
    24 #include <Directory.h>
    25 #include <File.h>
    26 #include <FindDirectory.h>
    27 #include <Path.h>
    28 
    29 
    3031DesktopSettingsPrivate::DesktopSettingsPrivate(server_read_only_memory* shared)
    3132    :
    3233    fShared(*shared)
     
    5051    fFixedFont = *gFontManager->DefaultFixedFont();
    5152
    5253    fMouseMode = B_NORMAL_MOUSE;
     54    fFocusFollowsMouseMode = B_NORMAL_FOCUS_FOLLOWS_MOUSE;
     55    fAcceptFirstClick = false;
    5356    fShowAllDraggers = true;
    5457
    5558    // init scrollbar info
     
    186189        status = settings.Unflatten(&file);
    187190        if (status == B_OK) {
    188191            int32 mode;
    189             if (settings.FindInt32("mode", &mode) == B_OK) {
     192            if (settings.FindInt32("mode", &mode) == B_OK)
    190193                fMouseMode = (mode_mouse)mode;
     194            int32 focus_follows_mouse_mode;
     195            if (settings.FindInt32("focus follows mouse mode",
     196                &focus_follows_mouse_mode) == B_OK) {
     197                fFocusFollowsMouseMode =
     198                    (mode_focus_follows_mouse)focus_follows_mouse_mode;
    191199            }
     200            bool accept_first_click;
     201            if (settings.FindBool("accept first click", &accept_first_click) == B_OK)
     202                fAcceptFirstClick = accept_first_click;
    192203        }
    193204    }
    194205
     
    337348        if (path.Append("mouse") == B_OK) {
    338349            BMessage settings('asms');
    339350            settings.AddInt32("mode", (int32)fMouseMode);
     351            settings.AddInt32("focus follows mouse mode", (int32)fFocusFollowsMouseMode);
     352            settings.AddBool("accept first click", fAcceptFirstClick);
    340353
    341354            BFile file;
    342355            status = file.SetTo(path.Path(), B_CREATE_FILE | B_ERASE_FILE
     
    485498}
    486499
    487500
     501void
     502DesktopSettingsPrivate::SetFocusFollowsMouseMode(const mode_focus_follows_mouse mode)
     503{
     504    fFocusFollowsMouseMode = mode;
     505    Save(kMouseSettings);
     506}
     507
     508
    488509mode_mouse
    489510DesktopSettingsPrivate::MouseMode() const
    490511{
     
    492513}
    493514
    494515
     516mode_focus_follows_mouse
     517DesktopSettingsPrivate::FocusFollowsMouseMode() const
     518{
     519    return fFocusFollowsMouseMode;
     520}
     521
     522
     523void
     524DesktopSettingsPrivate::SetAcceptFirstClick(const bool accept_first_click)
     525{
     526    fAcceptFirstClick = accept_first_click;
     527    Save(kMouseSettings);
     528}
     529
     530
    495531bool
     532DesktopSettingsPrivate::AcceptFirstClick() const
     533{
     534    return fAcceptFirstClick;
     535}
     536
     537
     538bool
    496539DesktopSettingsPrivate::FocusFollowsMouse() const
    497540{
    498     return MouseMode() != B_NORMAL_MOUSE;
     541    return MouseMode() == B_FOCUS_FOLLOWS_MOUSE;
    499542}
    500543
    501544
     
    697740}
    698741
    699742
     743mode_focus_follows_mouse
     744DesktopSettings::FocusFollowsMouseMode() const
     745{
     746    return fSettings->FocusFollowsMouseMode();
     747}
     748
     749
    700750bool
    701751DesktopSettings::FocusFollowsMouse() const
    702752{
     
    705755
    706756
    707757bool
     758DesktopSettings::AcceptFirstClick() const
     759{
     760    return fSettings->AcceptFirstClick();
     761}
     762
     763
     764bool
    708765DesktopSettings::ShowAllDraggers() const
    709766{
    710767    return fSettings->ShowAllDraggers();
     
    826883
    827884
    828885void
     886LockedDesktopSettings::SetFocusFollowsMouseMode(const mode_focus_follows_mouse mode)
     887{
     888    fSettings->SetFocusFollowsMouseMode(mode);
     889}
     890
     891
     892void
     893LockedDesktopSettings::SetAcceptFirstClick(const bool accept_first_click)
     894{
     895    fSettings->SetAcceptFirstClick(accept_first_click);
     896}
     897
     898
     899void
    829900LockedDesktopSettings::SetShowAllDraggers(bool show)
    830901{
    831902    fSettings->SetShowAllDraggers(show);
  • src/servers/app/DefaultDecorator.h

     
    1010#define DEFAULT_DECORATOR_H
    1111
    1212
    13 #include "Decorator.h"
    1413#include <Region.h>
    1514
     15#include "Decorator.h"
     16
     17
    1618class Desktop;
    1719class ServerBitmap;
    1820
  • src/servers/app/ServerWindow.cpp

     
    66 *      DarkWyrm <bpmagic@columbus.rr.com>
    77 *      Adrian Oanca <adioanca@gmail.com>
    88 *      Stephan Aßmus <superstippi@gmx.de>
    9  *      Stefano Ceccherini (burton666@libero.it)
    10  *      Axel Dörfler, axeld@pinc-software.de
     9 *      Stefano Ceccherini <burton666@libero.it>
     10 *      Axel Dörfler <axeld@pinc-software.de>
    1111 *      Artur Wyszynski <harakash@gmail.com>
    12  *      Philippe Saint-Pierre, stpere@gmail.com
     12 *      Philippe Saint-Pierre <stpere@gmail.com>
     13 *      Brecht Machiels <brecht@mos6581.org>
    1314 */
    1415
    1516/*!
     
    699700            fDesktop->UnlockSingleWindow();
    700701
    701702            if (activate)
    702                 fDesktop->ActivateWindow(fWindow);
     703                fDesktop->SelectWindow(fWindow);
    703704            else
    704705                fDesktop->SendWindowBehind(fWindow, NULL);
    705706
  • src/servers/app/ProfileMessageSupport.cpp

     
    169169        case AS_IDLE_TIME: string = "AS_IDLE_TIME"; break;
    170170        case AS_SET_MOUSE_MODE: string = "AS_SET_MOUSE_MODE"; break;
    171171        case AS_GET_MOUSE_MODE: string = "AS_GET_MOUSE_MODE"; break;
     172        case AS_SET_FOCUS_FOLLOWS_MOUSE_MODE:
     173            string = "AS_SET_FOCUS_FOLLOWS_MOUSE_MODE"; break;
     174        case AS_GET_FOCUS_FOLLOWS_MOUSE_MODE:
     175            string = "AS_GET_FOCUS_FOLLOWS_MOUSE_MODE"; break;
     176        case AS_SET_ACCEPT_FIRST_CLICK: string = "AS_SET_ACCEPT_FIRST_CLICK"; break;
     177        case AS_GET_ACCEPT_FIRST_CLICK: string = "AS_GET_ACCEPT_FIRST_CLICK"; break;
    172178        case AS_GET_MOUSE: string = "AS_GET_MOUSE"; break;
    173179        case AS_SET_DECORATOR_SETTINGS: string = "AS_SET_DECORATOR_SETTINGS"; break;
    174180        case AS_GET_DECORATOR_SETTINGS: string = "AS_GET_DECORATOR_SETTINGS"; break;
  • src/servers/app/Window.cpp

     
    66 *      DarkWyrm <bpmagic@columbus.rr.com>
    77 *      Adi Oanca <adioanca@gmail.com>
    88 *      Stephan Aßmus <superstippi@gmx.de>
    9  *      Axel Dörfler, axeld@pinc-software.de
     9 *      Axel Dörfler <axeld@pinc-software.de>
     10 *      Brecht Machiels <brecht@mos6581.org>
    1011 */
    1112
    1213
     
    757758void
    758759Window::MouseDown(BMessage* message, BPoint where, int32* _viewToken)
    759760{
     761    DesktopSettings desktopSettings(fDesktop);
     762
    760763    // TODO: move into Decorator
    761764    if (!fBorderRegionValid)
    762765        GetBorderRegion(&fBorderRegion);
     
    770773        if (fDecorator)
    771774            action = _ActionFor(message);
    772775
    773         // ignore clicks on decorator buttons if the
    774         // non-floating window doesn't have focus
    775         if (!IsFocus() && !IsFloating() && action != DEC_MOVETOBACK
    776             && action != DEC_RESIZE && action != DEC_SLIDETAB)
    777             action = DEC_DRAG;
     776        if (!desktopSettings.AcceptFirstClick()) {
     777            // ignore clicks on decorator buttons if the
     778            // non-floating window doesn't have focus
     779            if (!IsFocus() && !IsFloating() && action != DEC_MOVETOBACK
     780                && action != DEC_RESIZE && action != DEC_SLIDETAB)
     781                action = DEC_DRAG;
     782        }
    778783
    779784        // set decorator internals
    780785        switch (action) {
     
    838843
    839844        // based on what the Decorator returned, properly place this window.
    840845        if (action == DEC_MOVETOBACK) {
    841             fDesktop->SendWindowBehind(this);
     846            if (desktopSettings.MouseMode() == B_CLICK_TO_FOCUS_MOUSE) {
     847                bool covered = true;
     848                BRegion fullRegion;
     849                GetFullRegion(&fullRegion);
     850                if (fullRegion == VisibleRegion()) {
     851                    // window is overlapped.
     852                    covered = false;
     853                }
     854                if (this != fDesktop->FrontWindow() && covered)
     855                    fDesktop->ActivateWindow(this);
     856                else
     857                    fDesktop->SendWindowBehind(this);
     858            } else
     859                fDesktop->SendWindowBehind(this);
    842860        } else {
    843861            fDesktop->SetMouseEventWindow(this);
    844862
    845             // activate window if not in FFM mode
    846             DesktopSettings desktopSettings(fDesktop);
    847             if (!desktopSettings.FocusFollowsMouse()) {
     863            // activate window if in click to activate mode, else only focus it
     864            if (desktopSettings.MouseMode() == B_NORMAL_MOUSE)
    848865                fDesktop->ActivateWindow(this);
    849             } else {
    850                 // actually, the window should already be
    851                 // focused since the mouse would have to
    852                 // be over it, but just for completeness...
     866            else {
    853867                fDesktop->SetFocusWindow(this);
    854                 if (action == DEC_DRAG) {
     868                if (desktopSettings.MouseMode() == B_FOCUS_FOLLOWS_MOUSE
     869                    && action == DEC_DRAG) {
    855870                    fActivateOnMouseUp = true;
    856871                    fLastMoveTime = system_time();
    857872                }
     
    865880
    866881            // clicking a simple View
    867882            if (!IsFocus()) {
    868                 DesktopSettings desktopSettings(fDesktop);
     883                bool acceptFirstClick = desktopSettings.AcceptFirstClick()
     884                    || ((Flags() & B_WILL_ACCEPT_FIRST_CLICK) != 0);
     885                bool avoidFocus = (Flags() & B_AVOID_FOCUS) != 0;
    869886
    870                 // Activate window in case it doesn't accept first click, and
    871                 // we're not in FFM mode
    872                 if ((Flags() & B_WILL_ACCEPT_FIRST_CLICK) == 0
    873                     && !desktopSettings.FocusFollowsMouse())
     887                // Activate or focus the window in case it doesn't accept first click,
     888                // depending on the mouse mode
     889                if (desktopSettings.MouseMode() == B_NORMAL_MOUSE
     890                    && !acceptFirstClick)
    874891                    fDesktop->ActivateWindow(this);
     892                else if (!avoidFocus)
     893                    fDesktop->SetFocusWindow(this);
    875894
    876895                // Eat the click if we don't accept first click
    877896                // (B_AVOID_FOCUS never gets the focus, so they always accept
     
    879898                // TODO: the latter is unlike BeOS - if we really wanted to
    880899                // imitate this behaviour, we would need to check if we're
    881900                // the front window instead of the focus window
    882                 if ((Flags() & (B_WILL_ACCEPT_FIRST_CLICK
    883                         | B_AVOID_FOCUS)) == 0)
     901                if (!acceptFirstClick && !avoidFocus)
    884902                    return;
    885903            }
    886904
     
    936954        engine->UnlockParallelAccess();
    937955
    938956        fRegionPool.Recycle(visibleBorder);
     957
     958        int32 buttons;
     959        if (message->FindInt32("buttons", &buttons) != B_OK)
     960            buttons = 0;
     961
     962        // if the primary mouse button is released, stop dragging/resizing/sliding
     963        if ((buttons & B_PRIMARY_MOUSE_BUTTON) == 0) {
     964            fIsDragging = false;
     965            fIsResizing = false;
     966            fIsSlidingTab = false;
     967        }
    939968    }
    940969
    941970    // in FFM mode, activate the window and bring it
     
    949978            fDesktop->ActivateWindow(this);
    950979    }
    951980
    952     fIsDragging = false;
    953     fIsResizing = false;
    954     fIsSlidingTab = false;
    955 
    956981    if (View* view = ViewAt(where)) {
    957982        if (HasModal())
    958983            return;
  • src/servers/app/Desktop.cpp

     
    55 * Authors:
    66 *      Adrian Oanca <adioanca@cotty.iren.ro>
    77 *      Stephan Aßmus <superstippi@gmx.de>
    8  *      Axel Dörfler, axeld@pinc-software.de
     8 *      Axel Dörfler <axeld@pinc-software.de>
    99 *      Andrej Spielmann, <andrej.spielmann@seh.ox.ac.uk>
     10 *      Brecht Machiels <brecht@mos6581.org>
    1011 */
    1112
    1213/*! Class used to encapsulate desktop management */
     
    1415
    1516#include "Desktop.h"
    1617
     18#include <stdio.h>
     19#include <string.h>
     20#include <syslog.h>
     21
     22#include <Debug.h>
     23#include <DirectWindow.h>
     24#include <Entry.h>
     25#include <Message.h>
     26#include <MessageFilter.h>
     27#include <Region.h>
     28#include <Roster.h>
     29
     30#include <ViewPrivate.h>
     31#include <WindowInfo.h>
     32#include <ServerProtocol.h>
     33
    1734#include "AppServer.h"
    1835#include "DesktopSettingsPrivate.h"
    1936#include "DrawingEngine.h"
     
    3047#include "Workspace.h"
    3148#include "WorkspacesView.h"
    3249
    33 #include <ViewPrivate.h>
    34 #include <WindowInfo.h>
    35 #include <ServerProtocol.h>
    3650
    37 #include <Debug.h>
    38 #include <DirectWindow.h>
    39 #include <Entry.h>
    40 #include <Message.h>
    41 #include <MessageFilter.h>
    42 #include <Region.h>
    43 #include <Roster.h>
    44 
    45 #include <stdio.h>
    46 #include <string.h>
    47 #include <syslog.h>
    48 
    4951#if TEST_MODE
    5052#   include "EventStream.h"
    5153#endif
     
    233235
    234236            case B_MOUSE_UP:
    235237                window->MouseUp(message, where, &viewToken);
    236                 fDesktop->SetMouseEventWindow(NULL);
     238                if (buttons == 0)
     239                    fDesktop->SetMouseEventWindow(NULL);
    237240                break;
    238241
    239242            case B_MOUSE_MOVED:
     
    14581461
    14591462    uint32 list = fCurrentWorkspace;
    14601463
    1461     if (fSettings->FocusFollowsMouse())
     1464    if (fSettings->MouseMode() != B_NORMAL_MOUSE)
    14621465        list = kFocusList;
    14631466
    14641467    if (focus == NULL || hasModal) {
    1465         if (!fSettings->FocusFollowsMouse()) {
     1468        if (fSettings->MouseMode() == B_NORMAL_MOUSE) {
    14661469            focus = FrontWindow();
    14671470            if (focus == NULL) {
    14681471                // there might be no front window in case of only a single
     
    16081611}
    16091612
    16101613
     1614/*!
     1615    \brief Activates or focusses the window, based on the mouse mode.
     1616*/
     1617void
     1618Desktop::SelectWindow(Window* window)
     1619{
     1620    if (fSettings->MouseMode() != B_NORMAL_MOUSE) {
     1621        // Only bring the window to front when it is not the window under the
     1622        // mouse pointer. This should result in sensible behaviour.
     1623        if (window != fWindowUnderMouse
     1624            || (window == fWindowUnderMouse && window != FocusWindow()))
     1625            ActivateWindow(window);
     1626        else
     1627            SetFocusWindow(window);
     1628    } else
     1629        ActivateWindow(window);
     1630}
     1631
     1632
    16111633/*! \brief Tries to move the specified window to the front of the screen,
    16121634        and make it the focus window.
    16131635
     
    17151737        for (Window* modal = frontmost; modal != NULL; modal = nextModal) {
    17161738            // get the next modal window
    17171739            nextModal = modal->NextWindow(fCurrentWorkspace);
    1718             while (nextModal != NULL && !nextModal->IsModal()) {
     1740            while (nextModal != NULL && !nextModal->IsModal())
    17191741                nextModal = nextModal->NextWindow(fCurrentWorkspace);
    1720             }
     1742               
    17211743            if (nextModal != NULL && !nextModal->HasInSubset(window))
    17221744                nextModal = NULL;
    17231745
     
    17681790    MarkDirty(dirty);
    17691791
    17701792    _UpdateFronts();
    1771     SetFocusWindow(fSettings->FocusFollowsMouse() ?
    1772         WindowAt(fLastMousePosition) : NULL);
     1793    if (fSettings->MouseMode() == B_FOCUS_FOLLOWS_MOUSE)
     1794        SetFocusWindow(WindowAt(fLastMousePosition));
     1795    else
     1796        SetFocusWindow(NULL);
    17731797
    17741798    bool sendFakeMouseMoved = false;
    17751799    if (FocusWindow() != window)
  • src/servers/app/DefaultDecorator.cpp

     
    1313
    1414#include "DefaultDecorator.h"
    1515
     16#include <new>
     17#include <stdio.h>
     18
     19#include <Autolock.h>
     20#include <GradientLinear.h>
     21#include <Rect.h>
     22#include <View.h>
     23
     24#include <WindowPrivate.h>
     25
    1626#include "BitmapDrawingEngine.h"
    1727#include "DesktopSettings.h"
    1828#include "DrawingEngine.h"
     
    2131#include "PatternHandler.h"
    2232#include "ServerBitmap.h"
    2333
    24 #include <WindowPrivate.h>
    2534
    26 #include <Autolock.h>
    27 #include <GradientLinear.h>
    28 #include <Rect.h>
    29 #include <View.h>
    30 
    31 #include <new>
    32 #include <stdio.h>
    33 
    3435//#define DEBUG_DECORATOR
    3536#ifdef DEBUG_DECORATOR
    3637#   define STRACE(x) printf x
     
    574575        // NOTE: On R5, windows are not moved to back if clicked inside the
    575576        // resize area with the second mouse button. So we check this after
    576577        // the check above
    577         if (buttons == B_SECONDARY_MOUSE_BUTTON)
     578        if ((buttons & B_SECONDARY_MOUSE_BUTTON) != 0)
    578579            return DEC_MOVETOBACK;
    579580
    580581        if (fWasDoubleClick && !(fFlags & B_NOT_MINIMIZABLE))
  • src/servers/app/DesktopSettingsPrivate.h

     
    1111
    1212
    1313#include "DesktopSettings.h"
    14 #include "ServerFont.h"
    1514
    1615#include <Locker.h>
    1716
     17#include "ServerFont.h"
     18
     19
    1820struct server_read_only_memory;
    1921
    2022
     
    4345
    4446            void                SetMouseMode(mode_mouse mode);
    4547            mode_mouse          MouseMode() const;
     48            void                SetFocusFollowsMouseMode(mode_focus_follows_mouse mode);
     49            mode_focus_follows_mouse        FocusFollowsMouseMode() const;
    4650            bool                FocusFollowsMouse() const;
     51            void                SetAcceptFirstClick(bool accept_first_click);
     52            bool                AcceptFirstClick() const;
    4753
    4854            void                SetShowAllDraggers(bool show);
    4955            bool                ShowAllDraggers() const;
     
    8187            scroll_bar_info     fScrollBarInfo;
    8288            menu_info           fMenuInfo;
    8389            mode_mouse          fMouseMode;
     90            mode_focus_follows_mouse    fFocusFollowsMouseMode;
     91            bool                fAcceptFirstClick;
    8492            bool                fShowAllDraggers;
    8593            int32               fWorkspacesCount;
    8694            BMessage            fWorkspaceMessages[kMaxWorkspaces];
  • src/servers/input/MouseSettings.cpp

     
    1515//
    1616// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
    1717
     18
     19#include "MouseSettings.h"
     20
     21#include <stdio.h>
     22
    1823#include <FindDirectory.h>
    1924#include <File.h>
    2025#include <Path.h>
    2126#include <View.h>
    2227
    23 #include <stdio.h>
    2428
    25 #include "MouseSettings.h"
    26 
    2729static const bigtime_t kDefaultClickSpeed = 500000;
    2830static const int32 kDefaultMouseSpeed = 65536;
    2931static const int32 kDefaultMouseType = 3;   // 3 button mouse
    3032static const int32 kDefaultAccelerationFactor = 65536;
     33static const bool kDefaultAcceptFirstClick = false;
    3134
    3235
     36
    3337MouseSettings::MouseSettings()
    3438{
    3539    Defaults();
     
    4145
    4246    fOriginalSettings = fSettings;
    4347    fOriginalMode = fMode;
     48    fOriginalFocusFollowsMouseMode = fFocusFollowsMouseMode;
     49    fOriginalAcceptFirstClick = fAcceptFirstClick;
    4450}
    4551
    4652
     
    6874    // retrieve current values
    6975
    7076    fMode = mouse_mode();
     77    fAcceptFirstClick = accept_first_click();
    7178    Defaults();
    7279   
    7380    // also try to load the window position from disk
     
    128135    file.Write(&fSettings, sizeof(fSettings));
    129136#endif
    130137
    131     // who is responsible for saving the mouse mode?
     138    // who is responsible for saving the mouse mode and accept_first_click?
    132139
    133140    return B_OK;
    134141}
     
    148155    char *mode = "unknown";
    149156    switch (fMode) {
    150157        case B_NORMAL_MOUSE:
    151             mode = "normal";
     158            mode = "activate";
    152159            break;
     160        case B_CLICK_TO_FOCUS_MOUSE:
     161            mode = "focus";
     162            break;
    153163        case B_FOCUS_FOLLOWS_MOUSE:
    154             mode = "focus follows mouse";
     164            mode = "auto-focus";
    155165            break;
    156         case B_WARP_MOUSE:
    157             mode = "warp mouse";
     166    }
     167    printf("mouse mode:\t%s\n", mode);
     168
     169    char *focus_follows_mouse_mode = "unknown";
     170    switch (fMode) {
     171        case B_NORMAL_FOCUS_FOLLOWS_MOUSE:
     172            focus_follows_mouse_mode = "normal";
    158173            break;
    159         case B_INSTANT_WARP_MOUSE:
    160             mode = "instant warp mouse";
     174        case B_WARP_FOCUS_FOLLOWS_MOUSE:
     175            focus_follows_mouse_mode = "warp";
    161176            break;
     177        case B_INSTANT_WARP_FOCUS_FOLLOWS_MOUSE:
     178            focus_follows_mouse_mode = "instant warp";
     179            break;
    162180    }
    163     printf("mode:\t\t%s\n", mode);
     181    printf("focus follows mouse mode:\t%s\n", focus_follows_mouse_mode);
     182    printf("accept first click:\t%s\n", fAcceptFirstClick ? "enabled" : "disabled");
    164183}
    165184#endif
    166185
     
    176195    SetMouseType(kDefaultMouseType);
    177196    SetAccelerationFactor(kDefaultAccelerationFactor);
    178197    SetMouseMode(B_NORMAL_MOUSE);
     198    SetFocusFollowsMouseMode(B_NORMAL_FOCUS_FOLLOWS_MOUSE);
     199    SetAcceptFirstClick(kDefaultAcceptFirstClick);
    179200
    180201    fSettings.map.button[0] = B_PRIMARY_MOUSE_BUTTON;
    181202    fSettings.map.button[1] = B_SECONDARY_MOUSE_BUTTON;
     
    253274    fMode = mode;
    254275}
    255276
     277
     278void
     279MouseSettings::SetFocusFollowsMouseMode(mode_focus_follows_mouse mode)
     280{
     281    fFocusFollowsMouseMode = mode; 
     282}
     283
     284
     285void
     286MouseSettings::SetAcceptFirstClick(bool accept_first_click)
     287{
     288    fAcceptFirstClick = accept_first_click;
     289}
     290
     291
  • src/servers/input/MouseSettings.h

     
    1818#ifndef MOUSE_SETTINGS_H_
    1919#define MOUSE_SETTINGS_H_
    2020
    21 #include <SupportDefs.h>
    2221#include <InterfaceDefs.h>
    2322#include <kb_mouse_settings.h>
     23#include <Path.h>
     24#include <SupportDefs.h>
    2425
    2526
    2627class MouseSettings {
     
    5152        mode_mouse MouseMode() const { return fMode; }
    5253        void SetMouseMode(mode_mouse mode);
    5354
     55        mode_focus_follows_mouse FocusFollowsMouseMode() const { return fFocusFollowsMouseMode; }
     56        void SetFocusFollowsMouseMode(mode_focus_follows_mouse mode);
     57
     58        bool AcceptFirstClick() const { return fAcceptFirstClick; }
     59        void SetAcceptFirstClick(bool accept_first_click);
     60
    5461        status_t SaveSettings();
    5562
    5663    private:
     
    5966
    6067        mouse_settings  fSettings, fOriginalSettings;
    6168        mode_mouse      fMode, fOriginalMode;
     69        mode_focus_follows_mouse    fFocusFollowsMouseMode, fOriginalFocusFollowsMouseMode;
     70        bool            fAcceptFirstClick, fOriginalAcceptFirstClick;
    6271};
    6372
    6473#endif
  • src/kits/app/Application.cpp

     
    14201420void
    14211421BApplication::_ArgvReceived(BMessage *message)
    14221422{
    1423     ASSERT(message != NULL);
     1423    ASSERT((const char*)message != NULL);
    14241424
    14251425    // build the argv vector
    14261426    status_t error = B_OK;
  • src/kits/interface/InterfaceDefs.cpp

     
    1010
    1111/*! Global functions and variables for the Interface Kit */
    1212
     13#include <InterfaceDefs.h>
    1314#include <InterfacePrivate.h>
    1415
    1516#include <stdio.h>
     
    1819
    1920#include <ControlLook.h>
    2021#include <Font.h>
    21 #include <InterfaceDefs.h>
    2222#include <Menu.h>
    2323#include <Roster.h>
    2424#include <ScrollBar.h>
     
    817817set_focus_follows_mouse(bool follow)
    818818{
    819819    // obviously deprecated API
    820     set_mouse_mode(B_WARP_MOUSE);
     820    set_mouse_mode(B_FOCUS_FOLLOWS_MOUSE);
    821821}
    822822
    823823
    824824bool
    825825focus_follows_mouse()
    826826{
    827     return mouse_mode() != B_NORMAL_MOUSE;
     827    return mouse_mode() == B_FOCUS_FOLLOWS_MOUSE;
    828828}
    829829
    830830
     
    841841mode_mouse
    842842mouse_mode()
    843843{
    844     // Gets the focus-follows-mouse style, such as normal, B_WARP_MOUSE, etc.
     844    // Gets the mouse focus style, such as activate to click, focus to click, ...
    845845    mode_mouse mode = B_NORMAL_MOUSE;
    846846
    847847    BPrivate::AppServerLink link;
     
    855855}
    856856
    857857
     858void
     859set_focus_follows_mouse_mode(mode_focus_follows_mouse mode)
     860{
     861    BPrivate::AppServerLink link;
     862    link.StartMessage(AS_SET_FOCUS_FOLLOWS_MOUSE_MODE);
     863    link.Attach<mode_focus_follows_mouse>(mode);
     864    link.Flush();
     865}
     866
     867
     868mode_focus_follows_mouse
     869focus_follows_mouse_mode()
     870{
     871    mode_focus_follows_mouse mode = B_NORMAL_FOCUS_FOLLOWS_MOUSE;
     872
     873    BPrivate::AppServerLink link;
     874    link.StartMessage(AS_GET_FOCUS_FOLLOWS_MOUSE_MODE);
     875
     876    int32 code;
     877    if (link.FlushWithReply(code) == B_OK && code == B_OK)
     878        link.Read<mode_focus_follows_mouse>(&mode);
     879
     880    return mode;
     881}
     882
     883
     884void
     885set_accept_first_click(bool accept_first_click)
     886{
     887    BPrivate::AppServerLink link;
     888    link.StartMessage(AS_SET_ACCEPT_FIRST_CLICK);
     889    link.Attach<bool>(accept_first_click);
     890    link.Flush();
     891}
     892
     893
     894bool
     895accept_first_click()
     896{
     897    // Gets the accept first click status
     898    bool accept_first_click = false;
     899
     900    BPrivate::AppServerLink link;
     901    link.StartMessage(AS_GET_ACCEPT_FIRST_CLICK);
     902
     903    int32 code;
     904    if (link.FlushWithReply(code) == B_OK && code == B_OK)
     905        link.Read<bool>(&accept_first_click);
     906
     907    return accept_first_click;
     908}
     909
    858910rgb_color
    859911ui_color(color_which which)
    860912{
  • src/kits/interface/Region.cpp

     
    121121    \return \ctrue if the two regions are the same, \cfalse otherwise.
    122122*/
    123123bool
    124 BRegion::operator==(const BRegion& other) const
     124BRegion::operator==(const BRegion &other) const
    125125{
    126126    if (&other == this)
    127127        return true;
  • src/kits/interface/MenuBar.cpp

     
    2323#include <binary_compatibility/Interface.h>
    2424#include <MenuPrivate.h>
    2525#include <TokenSpace.h>
     26#include <InterfaceDefs.h>
    2627
    2728#include "BMCPrivate.h"
    2829
     
    225226    if (fTracking)
    226227        return;
    227228
     229    uint32 buttons;
     230    GetMouse(&where, &buttons);
     231
    228232    BWindow *window = Window();
    229233    if (!window->IsActive() || !window->IsFront()) {
    230         window->Activate();
    231         window->UpdateIfNeeded();
     234        if ((mouse_mode() == B_FOCUS_FOLLOWS_MOUSE)
     235            || ((mouse_mode() == B_CLICK_TO_FOCUS_MOUSE)
     236                && ((buttons & B_SECONDARY_MOUSE_BUTTON) != 0))) {
     237            window->Activate();
     238            window->UpdateIfNeeded();
     239        }
    232240    }
    233241
    234242    StartMenuBar(-1, false, false);
  • headers/build/os/interface/InterfaceDefs.h

     
    315315
    316316enum mode_mouse {
    317317    B_NORMAL_MOUSE          = 0,
    318     B_FOCUS_FOLLOWS_MOUSE   = 1,
    319     B_WARP_MOUSE            = 3,
    320     B_INSTANT_WARP_MOUSE    = 7
     318    B_CLICK_TO_FOCUS_MOUSE  = -1,
     319    B_FOCUS_FOLLOWS_MOUSE   = 1
    321320};
    322321
    323 _IMPEXP_BE void         set_mouse_mode(mode_mouse mode);   
    324 _IMPEXP_BE mode_mouse   mouse_mode();   
     322enum mode_focus_follows_mouse {
     323    B_NORMAL_FOCUS_FOLLOWS_MOUSE        = 0,
     324    B_WARP_FOCUS_FOLLOWS_MOUSE          = 1,
     325    B_INSTANT_WARP_FOCUS_FOLLOWS_MOUSE  = 2
     326};
    325327
     328_IMPEXP_BE void         set_mouse_mode(mode_mouse mode);
     329_IMPEXP_BE mode_mouse   mouse_mode();
     330
     331_IMPEXP_BE void         set_focus_follows_mouse_mode(mode_focus_follows_mouse mode);
     332_IMPEXP_BE mode_focus_follows_mouse focus_follows_mouse_mode();
     333
     334_IMPEXP_BE void         set_accept_first_click(bool accept_first_click);
     335_IMPEXP_BE bool         accept_first_click();
     336
    326337enum color_which {
    327338    B_PANEL_BACKGROUND_COLOR = 1,
    328339    B_PANEL_TEXT_COLOR = 10,
  • headers/build/os/interface/Region.h

     
    3131                                BRegion(const BRect rect);
    3232    virtual                     ~BRegion();
    3333
    34             BRegion         &operator=(const BRegion &from);
     34            BRegion             &operator=(const BRegion &from);
     35            bool                operator==(const BRegion& other) const;
    3536
    3637            void                Set(BRect newBounds);
    3738            void                Set(clipping_rect newBounds);
  • headers/build/private/app/ServerProtocol.h

     
    192192    AS_RUN_BE_ABOUT,
    193193    AS_SET_MOUSE_MODE,
    194194    AS_GET_MOUSE_MODE,
     195    AS_SET_FOCUS_FOLLOWS_MOUSE_MODE,
     196    AS_GET_FOCUS_FOLLOWS_MOUSE_MODE,
     197    AS_SET_ACCEPT_FIRST_CLICK,
     198    AS_GET_ACCEPT_FIRST_CLICK,
    195199
    196200    // Hook function messages
    197201    AS_WORKSPACE_ACTIVATED,
  • headers/os/interface/InterfaceDefs.h

     
    164164
    165165enum mode_mouse {
    166166    B_NORMAL_MOUSE          = 0,
    167     B_FOCUS_FOLLOWS_MOUSE   = 1,
    168     B_WARP_MOUSE            = 3,
    169     B_INSTANT_WARP_MOUSE    = 7
     167    B_CLICK_TO_FOCUS_MOUSE  = -1,
     168    B_FOCUS_FOLLOWS_MOUSE   = 1
    170169};
    171170
     171enum mode_focus_follows_mouse {
     172    B_NORMAL_FOCUS_FOLLOWS_MOUSE        = 0,
     173    B_WARP_FOCUS_FOLLOWS_MOUSE          = 1,
     174    B_INSTANT_WARP_FOCUS_FOLLOWS_MOUSE  = 2
     175};
    172176
     177
    173178// View orientation/alignment/style
    174179
    175180enum border_style {
     
    376381void            set_mouse_mode(mode_mouse mode);
    377382mode_mouse      mouse_mode();
    378383
     384void            set_focus_follows_mouse_mode(mode_focus_follows_mouse mode);
     385mode_focus_follows_mouse    focus_follows_mouse_mode();
     386
     387void            set_accept_first_click(bool accept_first_click);   
     388bool            accept_first_click();
     389
    379390rgb_color       ui_color(color_which which);
    380391void            set_ui_color(const color_which& which, const rgb_color& color);
    381392rgb_color       tint_color(rgb_color color, float tint);
  • headers/private/app/ServerProtocol.h

     
    186186    AS_IDLE_TIME,
    187187    AS_SET_MOUSE_MODE,
    188188    AS_GET_MOUSE_MODE,
     189    AS_SET_FOCUS_FOLLOWS_MOUSE_MODE,
     190    AS_GET_FOCUS_FOLLOWS_MOUSE_MODE,
     191    AS_SET_ACCEPT_FIRST_CLICK,
     192    AS_GET_ACCEPT_FIRST_CLICK,
    189193    AS_GET_MOUSE,
    190194    AS_SET_DECORATOR_SETTINGS,
    191195    AS_GET_DECORATOR_SETTINGS,