1 // 2 // StickIt 3 // File: jwindow.cpp 4 // Joystick window. 5 // Sampel code used in "Getting a Grip on BJoystick" by Eric Shepherd 6 // 7 8 #include <stdio.h> 9 #include <stdlib.h> 10 #include <string.h> 11 #include <OS.h> 12 13 #include <Application.h> 14 #include <Joystick.h> 15 #include <String.h> 16 #include <StringView.h> 17 #include <Box.h> 18 #include <ListView.h> 19 #include <ScrollView.h> 20 #include <ListItem.h> 21 22 #define SPACE 10 23 24 #include "JoystickWindow.h" 25 26 #define SELECTED 'sele' 27 #define INVOKE 'invo' 28 29 #include "StickItWindow.h" 30 31 StickItWindow::StickItWindow(BRect frame) 32 : BWindow(frame, "StickIt", B_TITLED_WINDOW, 0) 33 { 34 frame = Bounds(); 35 frame.InsetBy(5, 5); 36 BBox* box = new BBox(frame, NULL, B_FOLLOW_ALL_SIDES); 37 38 39 // Allocate object 40 BView* view = new BView(Bounds(), "", B_FOLLOW_ALL_SIDES, 0); 41 view->SetViewColor(216, 216, 216); 42 view->SetLowColor(216, 216, 216); 43 44 BRect rectString = BRect(frame.left, frame.top-10, frame.right -30, 30); 45 BStringView* stringview1 = new BStringView(rectString,"StringView1", 46 "This list, lists action that StickIt makes."); 47 48 BRect rect = BRect(rectString.left, rectString.bottom + SPACE, 49 rectString.right, rectString.bottom + SPACE + 200); 50 fListView1 = new BListView(rect,"ListView1"); 51 52 rectString = BRect(rect.left, rect.bottom + SPACE, rect.right, 53 rect.bottom + SPACE + 15); 54 BStringView* stringview2 = new BStringView(rectString,"StringView2", 55 "Choose Joystick below if any exists"); 56 57 rect = BRect(rectString.left, rectString.bottom + SPACE, rectString.right, 58 Bounds().bottom -20); 59 fListView2 = new BListView(rect,"ListView2"); 60 fListView2->SetSelectionMessage(new BMessage(SELECTED)); 61 fListView2->SetInvocationMessage(new BMessage(INVOKE)); 62 63 64 // Adding object 65 box->AddChild(new BScrollView("fListView1", fListView1, 66 B_FOLLOW_LEFT_RIGHT, 0, false, true)); 67 68 box->AddChild(new BScrollView("fListView2", fListView2, 69 B_FOLLOW_ALL_SIDES, 0, false, true)); 70 71 box->AddChild(stringview1); 72 box->AddChild(stringview2); 73 view->AddChild(box); 74 AddChild(view); 75 76 fJoystick = new BJoystick; 77 PickJoystick(fJoystick); 78 } 79 80 81 bool 82 StickItWindow::QuitRequested(void) { 83 be_app->PostMessage(B_QUIT_REQUESTED); 84 return true; 85 } 86 87 88 void 89 StickItWindow::MessageReceived(BMessage *message) 90 { 91 // message->PrintToStream(); 92 switch(message->what) 93 { 94 case INVOKE: 95 case SELECTED: 96 { 97 int32 id = fListView2->CurrentSelection(); 98 BString temp1; 99 if (id > -1) { 100 char devName[B_OS_NAME_LENGTH]; 101 status_t err = fJoystick->GetDeviceName(id, devName); 102 if (err == B_OK) { 103 temp1 << "BJoystick::GetDeviceName(), id = " << id 104 << ", name = " << devName; 105 temp1 = AddToList(fListView1, temp1.String()); 106 BJoystick *joystick = new BJoystick(); 107 err = joystick->Open(devName); 108 if (err != B_ERROR) { 109 temp1 = AddToList(fListView1, "BJoystick::Open()"); 110 temp1 = AddToList(fListView1, "BJoystick::Open()"); 111 if (joystick->IsCalibrationEnabled()) 112 temp1 = AddToList(fListView1, 113 "BJoystick::IsCalibrationEnabled() - True"); 114 else 115 temp1 = AddToList(fListView1, 116 "BJoystick::IsCalibrationEnabled() - False"); 117 JoystickWindow *window = new(std::nothrow) 118 JoystickWindow(devName, joystick, 119 BRect(50, 50, 405, 350)); 120 if (window != NULL) 121 window->Show(); 122 } else 123 AddToList(fListView1, 124 "No controller connected on that port. Try again."); 125 } else 126 AddToList(fListView1, "Can't use that stick. Try again."); 127 } 128 break; 129 } 130 default: 131 BWindow::MessageReceived(message); 132 break; 133 } 134 } 135 136 137 BString 138 StickItWindow::AddToList(BListView *bl, const char * str) 139 { 140 bl->AddItem(new BStringItem(str)); 141 return BString (""); 142 } 143 144 145 // PickJoystick 146 // Present a list of all game controllers and let the user choose the one to 147 // use. This will configure the "stick" object for that controller. 148 void 149 StickItWindow::PickJoystick(BJoystick *stick) 150 { 151 int32 numDevices = stick->CountDevices(); 152 BString temp1("BJoystick::CountDevices()"); 153 temp1 << ", Num = " << numDevices; 154 temp1 = AddToList(fListView1, temp1.String()); 155 status_t err = B_ERROR; 156 if (numDevices) { 157 temp1 << "There are " << numDevices 158 << " Joysticks device types available"; 159 temp1 = AddToList(fListView1, temp1.String()); 160 for (int32 i = 0; i < numDevices; i++) { 161 char devName[B_OS_NAME_LENGTH]; 162 err = stick->GetDeviceName(i, devName); 163 temp1 << "BJoystick::GetDeviceName(), id = " << i << ", name = " 164 << devName; 165 temp1 = AddToList(fListView1, temp1.String()); 166 if (err == B_OK) { 167 err = stick->Open(devName); 168 temp1 = AddToList(fListView1, "BJoystick::Open()"); 169 int32 count = stick->CountSticks(); 170 temp1 << "BJoystick::CountSticks(), number of sticks = " 171 << count; 172 temp1 = AddToList(fListView1, temp1.String()); 173 174 count = stick->CountAxes(); 175 temp1 << "BJoystick::CountAxes(), number of Axes = " 176 << count; 177 temp1 = AddToList(fListView1, temp1.String()); 178 179 count = stick->CountButtons(); 180 temp1 << "BJoystick::CountButtons(), number of Buttons = " 181 << count; 182 temp1 = AddToList(fListView1, temp1.String()); 183 184 count = stick->CountHats(); 185 temp1 << "BJoystick::CountHats(), number of Hats = " 186 << count; 187 temp1 = AddToList(fListView1, temp1.String()); 188 189 count = stick->CountDevices(); 190 temp1 << "BJoystick::CountDevices(), number of Devices = " 191 << count; 192 temp1 = AddToList(fListView1, temp1.String()); 193 194 if (err != B_ERROR) { 195 BString name; 196 err = stick->GetControllerModule(&name); 197 temp1 << "BJoystick::GetControllerModule(), name = " 198 << name; 199 temp1 = AddToList(fListView1, temp1.String()); 200 201 if (name == "Legacy") { 202 bool b = stick->EnterEnhancedMode(); 203 if (b) { 204 temp1 << "BJoystick::EnterEnhancedMode(), OK"; 205 temp1 = AddToList(fListView1, temp1.String()); 206 } else { 207 temp1 << "BJoystick::EnterEnhancedMode(), Not OK"; 208 temp1 = AddToList(fListView1, temp1.String()); 209 } 210 } 211 212 err = stick->GetControllerName(&name); 213 temp1 << "BJoystick::GetControllerName(), name = " << name; 214 temp1 = AddToList(fListView1, temp1.String()); 215 if (err == B_OK) { 216 stick->Close(); 217 temp1 = AddToList(fListView1, "BJoystick::Close()"); 218 temp1 << i+1 << " " << name.String(); 219 temp1 = AddToList(fListView2, temp1.String()); 220 } else { 221 temp1 << "Error = " << strerror(err); 222 temp1 = AddToList(fListView1, temp1.String()); 223 temp1 << "*** Can't get name of controller " 224 << devName; 225 temp1 = AddToList(fListView1, temp1.String()); 226 } 227 } else { 228 temp1 << "Error = " << strerror(err) << "err nr = " << err; 229 temp1 = AddToList(fListView1, temp1.String()); 230 temp1 << "No controller on " << devName; 231 temp1 = AddToList(fListView1, temp1.String()); 232 } 233 } else { 234 temp1 << "Error = " << strerror(err); 235 temp1 = AddToList(fListView1, temp1.String()); 236 temp1 << "*** Error while reading controller list."; 237 temp1 = AddToList(fListView1, temp1.String()); 238 } 239 } 240 } else { 241 temp1 << "Error = " << strerror(err); 242 temp1 = AddToList(fListView1, temp1.String()); 243 temp1 = AddToList(fListView1, "*** No game ports detected."); 244 } 245 } 246