xref: /haiku/src/preferences/input/InputWindow.cpp (revision db6fcb750a1afb5fdc752322972adf6044d3b4c4)
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 <Alert.h>
11 #include <Alignment.h>
12 #include <Application.h>
13 #include <Button.h>
14 #include <CardLayout.h>
15 #include <CardView.h>
16 #include <Catalog.h>
17 #include <Control.h>
18 #include <ControlLook.h>
19 #include <LayoutBuilder.h>
20 #include <SplitView.h>
21 #include <Screen.h>
22 #include <stdio.h>
23 
24 
25 #include "InputConstants.h"
26 #include "InputDeviceView.h"
27 #include "InputMouse.h"
28 #include "InputTouchpadPref.h"
29 #include "InputWindow.h"
30 #include "MouseSettings.h"
31 #include "SettingsView.h"
32 
33 #undef B_TRANSLATION_CONTEXT
34 #define B_TRANSLATION_CONTEXT "InputWindow"
35 
36 
37 InputWindow::InputWindow(BRect rect)
38 	:
39 	BWindow(rect, B_TRANSLATE_SYSTEM_NAME("Input"), B_TITLED_WINDOW,
40 		B_NOT_RESIZABLE | B_NOT_ZOOMABLE | B_ASYNCHRONOUS_CONTROLS
41 		| B_AUTO_UPDATE_SIZE_LIMITS | B_QUIT_ON_WINDOW_CLOSE)
42 {
43 	FindDevice();
44 
45 	BLayoutBuilder::Group<>(this, B_HORIZONTAL, 10)
46 		.SetInsets(B_USE_WINDOW_SPACING)
47 		.Add(fDeviceListView)
48 		.AddGroup(B_VERTICAL, 0)
49 			.Add(fCardView)
50 		.End();
51 }
52 
53 void
54 InputWindow::MessageReceived(BMessage* message)
55 {
56 	int32 name = message->GetInt32("index", 0);
57 
58 	switch (message->what) {
59 
60 		case ITEM_SELECTED:
61 		{
62 			fCardView->CardLayout()->SetVisibleItem(name);
63 		}
64 		case kMsgMouseType:
65 		case kMsgMouseMap:
66 		case kMsgMouseFocusMode:
67 		case kMsgFollowsMouseMode:
68 		case kMsgAcceptFirstClick:
69 		case kMsgDoubleClickSpeed:
70 		case kMsgMouseSpeed:
71 		case kMsgAccelerationFactor:
72 		case kMsgDefaults:
73 		case kMsgRevert:
74 		{
75 			PostMessage(message,
76 				fCardView->CardLayout()->VisibleItem()->View());
77 			break;
78 		}
79 		case SCROLL_AREA_CHANGED:
80 		case SCROLL_CONTROL_CHANGED:
81 		case TAP_CONTROL_CHANGED:
82 		case DEFAULT_SETTINGS:
83 		case REVERT_SETTINGS:
84 		{
85 			PostMessage(message,
86 				fCardView->CardLayout()->VisibleItem()->View());
87 			break;
88 		}
89 		case kMsgSliderrepeatrate:
90 		case kMsgSliderdelayrate:
91 		{
92 			PostMessage(message,
93 				fCardView->CardLayout()->VisibleItem()->View());
94 			break;
95 		}
96 		default:
97 			BWindow::MessageReceived(message);
98 			break;
99 	}
100 }
101 
102 status_t
103 InputWindow::FindDevice()
104 {
105 	BList devList;
106 	status_t status = get_input_devices(&devList);
107 	if (status != B_OK)
108 		return status;
109 
110 	int32 i = 0;
111 
112 	fDeviceListView = new DeviceListView(B_TRANSLATE("Device List"));
113 	fCardView = new BCardView();
114 
115 	while (true) {
116 		BInputDevice* dev = (BInputDevice*)devList.ItemAt(i);
117 		if (dev == NULL) {
118 			break;
119 		}
120 		i++;
121 
122 		BString name = dev->Name();
123 
124 		if (dev->Type() == B_POINTING_DEVICE
125 			&& name.FindFirst("Touchpad") >= 0) {
126 
127 			fTouchPad = dev;
128 			TouchpadPrefView* view = new TouchpadPrefView(dev);
129 			fCardView->AddChild(view);
130 			fDeviceListView->fDeviceList->AddItem(new BStringItem(name));
131 		} else if (dev->Type() == B_POINTING_DEVICE) {
132 
133 			fMouse = dev;
134 			InputMouse* view = new InputMouse(dev);
135 			fCardView->AddChild(view);
136 			fDeviceListView->fDeviceList->AddItem(new BStringItem(name));
137 		} else if (dev->Type() == B_KEYBOARD_DEVICE) {
138 
139 			fKeyboard = dev;
140 			InputKeyboard* view = new InputKeyboard(dev);
141 			fCardView->AddChild(view);
142 			fDeviceListView->fDeviceList->AddItem(new BStringItem(name));
143 		} else {
144 			delete dev;
145 		}
146 	}
147 	return B_ENTRY_NOT_FOUND;
148 }
149