1 /* 2 * Copyright 2019, Haiku, Inc. 3 * Distributed under the terms of the MIT License. 4 * 5 * Author: 6 * Preetpal Kaur <preetpalok123@gmail.com> 7 */ 8 9 10 #include "InputMouse.h" 11 12 #include <Application.h> 13 #include <Bitmap.h> 14 #include <Box.h> 15 #include <Button.h> 16 #include <Catalog.h> 17 #include <ControlLook.h> 18 #include <Debug.h> 19 #include <CheckBox.h> 20 #include <MenuField.h> 21 #include <MenuItem.h> 22 #include <PopUpMenu.h> 23 #include <LayoutBuilder.h> 24 #include <Locale.h> 25 #include <Slider.h> 26 #include <Screen.h> 27 #include <StringView.h> 28 #include <TabView.h> 29 30 #include "InputConstants.h" 31 #include "InputWindow.h" 32 #include "MouseSettings.h" 33 #include "MouseView.h" 34 35 36 #undef B_TRANSLATION_CONTEXT 37 #define B_TRANSLATION_CONTEXT "InputMouse" 38 39 40 InputMouse::InputMouse(BInputDevice* dev, MouseSettings* settings) 41 : BView("InputMouse", B_WILL_DRAW) 42 { 43 fSettings = settings; 44 45 fSettingsView = new SettingsView(*fSettings); 46 47 fDefaultsButton = new BButton(B_TRANSLATE("Defaults"), 48 new BMessage(kMsgDefaults)); 49 fDefaultsButton->SetEnabled(fSettings->IsDefaultable()); 50 51 fRevertButton = new BButton(B_TRANSLATE("Revert"), 52 new BMessage(kMsgRevert)); 53 fRevertButton->SetEnabled(false); 54 55 BLayoutBuilder::Group<>(this, B_VERTICAL, B_USE_DEFAULT_SPACING) 56 .Add(fSettingsView) 57 .Add(new BSeparatorView(B_HORIZONTAL)) 58 .AddGroup(B_HORIZONTAL) 59 .Add(fDefaultsButton) 60 .Add(fRevertButton) 61 .AddGlue() 62 .End() 63 .End(); 64 } 65 66 InputMouse::~InputMouse() 67 { 68 } 69 70 void 71 InputMouse::MessageReceived(BMessage* message) 72 { 73 switch (message->what) { 74 case kMsgDefaults: { 75 fSettings->Defaults(); 76 fSettingsView->UpdateFromSettings(); 77 78 fDefaultsButton->SetEnabled(false); 79 fRevertButton->SetEnabled(fSettings->IsRevertable()); 80 break; 81 } 82 83 case kMsgRevert: { 84 fSettings->Revert(); 85 fSettingsView->UpdateFromSettings(); 86 87 fDefaultsButton->SetEnabled(fSettings->IsDefaultable()); 88 fRevertButton->SetEnabled(false); 89 break; 90 91 } 92 93 case kMsgMouseType: 94 { 95 int32 type; 96 if (message->FindInt32("be:value", &type) == B_OK) { 97 if (type > 6) 98 debugger("Mouse type is invalid"); 99 fSettings->SetMouseType(type); 100 fSettingsView->SetMouseType(type); 101 fDefaultsButton->SetEnabled(fSettings->IsDefaultable()); 102 fRevertButton->SetEnabled(fSettings->IsRevertable()); 103 } 104 break; 105 } 106 107 case kMsgMouseFocusMode: 108 { 109 int32 mode; 110 if (message->FindInt32("mode", &mode) == B_OK) { 111 fSettings->SetMouseMode((mode_mouse)mode); 112 fDefaultsButton->SetEnabled(fSettings->IsDefaultable()); 113 fRevertButton->SetEnabled(fSettings->IsRevertable()); 114 fSettingsView->fFocusFollowsMouseMenu->SetEnabled( 115 mode == B_FOCUS_FOLLOWS_MOUSE); 116 fSettingsView->fAcceptFirstClickBox->SetEnabled( 117 mode != B_FOCUS_FOLLOWS_MOUSE); 118 } 119 break; 120 } 121 122 case kMsgFollowsMouseMode: 123 { 124 int32 mode; 125 if (message->FindInt32("mode_focus_follows_mouse", &mode) 126 == B_OK) { 127 fSettings->SetFocusFollowsMouseMode( 128 (mode_focus_follows_mouse)mode); 129 fDefaultsButton->SetEnabled(fSettings->IsDefaultable()); 130 fRevertButton->SetEnabled(fSettings->IsRevertable()); 131 } 132 break; 133 } 134 135 case kMsgAcceptFirstClick: 136 { 137 BHandler *handler; 138 if (message->FindPointer("source", 139 reinterpret_cast<void**>(&handler)) == B_OK) { 140 bool acceptFirstClick = true; 141 BCheckBox *acceptFirstClickBox = 142 dynamic_cast<BCheckBox*>(handler); 143 if (acceptFirstClickBox) 144 acceptFirstClick = acceptFirstClickBox->Value() 145 == B_CONTROL_ON; 146 fSettings->SetAcceptFirstClick(acceptFirstClick); 147 fDefaultsButton->SetEnabled(fSettings->IsDefaultable()); 148 fRevertButton->SetEnabled(fSettings->IsRevertable()); 149 } 150 break; 151 } 152 153 case kMsgDoubleClickSpeed: 154 { 155 int32 value; 156 if (message->FindInt32("be:value", &value) == B_OK) { 157 // slow = 1000000, fast = 0 158 fSettings->SetClickSpeed(value * 1000); 159 fDefaultsButton->SetEnabled(fSettings->IsDefaultable()); 160 fRevertButton->SetEnabled(fSettings->IsRevertable()); 161 } 162 break; 163 } 164 165 case kMsgMouseSpeed: 166 { 167 int32 value; 168 if (message->FindInt32("be:value", &value) == B_OK) { 169 // slow = 8192, fast = 524287 170 fSettings->SetMouseSpeed((int32)pow(2, 171 value * 6.0 / 1000) * 8192); 172 fDefaultsButton->SetEnabled(fSettings->IsDefaultable()); 173 fRevertButton->SetEnabled(fSettings->IsRevertable()); 174 } 175 break; 176 } 177 178 case kMsgAccelerationFactor: 179 { 180 int32 value; 181 if (message->FindInt32("be:value", &value) == B_OK) { 182 // slow = 0, fast = 262144 183 fSettings->SetAccelerationFactor((int32)pow( 184 value * 4.0 / 1000, 2) * 16384); 185 fDefaultsButton->SetEnabled(fSettings->IsDefaultable()); 186 fRevertButton->SetEnabled(fSettings->IsRevertable()); 187 } 188 break; 189 } 190 191 case kMsgMouseMap: 192 { 193 int32 index; 194 int32 button; 195 if (message->FindInt32("index", &index) == B_OK 196 && message->FindInt32("button", &button) == B_OK) { 197 int32 mapping = B_MOUSE_BUTTON(index + 1); 198 fSettings->SetMapping(button, mapping); 199 fDefaultsButton->SetEnabled(fSettings->IsDefaultable()); 200 fRevertButton->SetEnabled(fSettings->IsRevertable()); 201 fSettingsView->MouseMapUpdated(); 202 } 203 break; 204 } 205 206 default: 207 BView::MessageReceived(message); 208 } 209 } 210