Ticket #4759: 2 - gui_check_for_modifiers_in_keypad_handling.patch
File 2 - gui_check_for_modifiers_in_keypad_handling.patch, 13.7 KB (added by , 15 years ago) |
---|
-
gui/console.cpp
302 302 slideUpAndClose(); 303 303 break; 304 304 } 305 305 306 case Common::KEYCODE_ESCAPE: 306 307 slideUpAndClose(); 307 308 break; 309 308 310 case Common::KEYCODE_BACKSPACE: 309 311 if (_caretVisible) 310 312 drawCaret(true); … … 316 318 scrollToCurrent(); 317 319 drawLine(pos2line(_currentPos)); 318 320 break; 319 case Common::KEYCODE_TAB: 320 {321 322 case Common::KEYCODE_TAB: { 321 323 if (_completionCallbackProc) { 322 324 int len = _currentPos - _promptStartPos; 323 325 assert(len >= 0); … … 339 341 delete[] str; 340 342 } 341 343 break; 342 } 344 } 345 346 // Keypad & special keys 347 // - if num lock is set, we always go to the default case 348 // - if num lock is not set, we either fall down to the special key case 349 // or ignore the key press in case of 0 (INSERT) or 5 350 351 case Common::KEYCODE_KP0: 352 case Common::KEYCODE_KP5: 353 if (state.flags & Common::KBD_NUM) 354 defaultKeyDownHandler(state); 355 break; 356 357 case Common::KEYCODE_KP_PERIOD: 358 if (state.flags & Common::KBD_NUM) { 359 defaultKeyDownHandler(state); 360 break; 361 } 343 362 case Common::KEYCODE_DELETE: 344 363 if (_currentPos < _promptEndPos) { 345 364 killChar(); 346 365 drawLine(pos2line(_currentPos)); 347 366 } 348 367 break; 349 case Common::KEYCODE_PAGEUP: 350 if (state.flags == Common::KBD_SHIFT) { 351 _scrollLine -= _linesPerPage - 1; 352 if (_scrollLine < _firstLineInBuffer + _linesPerPage - 1) 353 _scrollLine = _firstLineInBuffer + _linesPerPage - 1; 368 369 case Common::KEYCODE_KP1: 370 if (state.flags & Common::KBD_NUM) { 371 defaultKeyDownHandler(state); 372 break; 373 } 374 case Common::KEYCODE_END: 375 if (state.hasFlags(Common::KBD_SHIFT)) { 376 _scrollLine = _promptEndPos / kCharsPerLine; 377 if (_scrollLine < _linesPerPage - 1) 378 _scrollLine = _linesPerPage - 1; 354 379 updateScrollBuffer(); 355 draw(); 380 } else { 381 _currentPos = _promptEndPos; 356 382 } 383 draw(); 357 384 break; 385 386 case Common::KEYCODE_KP2: 387 if (state.flags & Common::KBD_NUM) { 388 defaultKeyDownHandler(state); 389 break; 390 } 391 case Common::KEYCODE_DOWN: 392 historyScroll(-1); 393 break; 394 395 case Common::KEYCODE_KP3: 396 if (state.flags & Common::KBD_NUM) { 397 defaultKeyDownHandler(state); 398 break; 399 } 358 400 case Common::KEYCODE_PAGEDOWN: 359 if (state. flags == Common::KBD_SHIFT) {401 if (state.hasFlags(Common::KBD_SHIFT)) { 360 402 _scrollLine += _linesPerPage - 1; 361 403 if (_scrollLine > _promptEndPos / kCharsPerLine) { 362 404 _scrollLine = _promptEndPos / kCharsPerLine; … … 367 409 draw(); 368 410 } 369 411 break; 412 413 case Common::KEYCODE_KP4: 414 if (state.flags & Common::KBD_NUM) { 415 defaultKeyDownHandler(state); 416 break; 417 } 418 case Common::KEYCODE_LEFT: 419 if (_currentPos > _promptStartPos) 420 _currentPos--; 421 drawLine(pos2line(_currentPos)); 422 break; 423 424 case Common::KEYCODE_KP6: 425 if (state.flags & Common::KBD_NUM) { 426 defaultKeyDownHandler(state); 427 break; 428 } 429 case Common::KEYCODE_RIGHT: 430 if (_currentPos < _promptEndPos) 431 _currentPos++; 432 drawLine(pos2line(_currentPos)); 433 break; 434 435 case Common::KEYCODE_KP7: 436 if (state.flags & Common::KBD_NUM) { 437 defaultKeyDownHandler(state); 438 break; 439 } 370 440 case Common::KEYCODE_HOME: 371 if (state. flags == Common::KBD_SHIFT) {441 if (state.hasFlags(Common::KBD_SHIFT)) { 372 442 _scrollLine = _firstLineInBuffer + _linesPerPage - 1; 373 443 updateScrollBuffer(); 374 444 } else { … … 376 446 } 377 447 draw(); 378 448 break; 379 case Common::KEYCODE_END: 380 if (state.flags == Common::KBD_SHIFT) { 381 _scrollLine = _promptEndPos / kCharsPerLine; 382 if (_scrollLine < _linesPerPage - 1) 383 _scrollLine = _linesPerPage - 1; 384 updateScrollBuffer(); 385 } else { 386 _currentPos = _promptEndPos; 449 450 case Common::KEYCODE_KP8: 451 if (state.flags & Common::KBD_NUM) { 452 defaultKeyDownHandler(state); 453 break; 387 454 } 388 draw();389 break;390 455 case Common::KEYCODE_UP: 391 456 historyScroll(+1); 392 457 break; 393 case Common::KEYCODE_DOWN: 394 historyScroll(-1); 458 459 case Common::KEYCODE_KP9: 460 if (state.flags & Common::KBD_NUM) { 461 defaultKeyDownHandler(state); 462 break; 463 } 464 case Common::KEYCODE_PAGEUP: 465 if (state.hasFlags(Common::KBD_SHIFT)) { 466 _scrollLine -= _linesPerPage - 1; 467 if (_scrollLine < _firstLineInBuffer + _linesPerPage - 1) 468 _scrollLine = _firstLineInBuffer + _linesPerPage - 1; 469 updateScrollBuffer(); 470 draw(); 471 } 395 472 break; 396 case Common::KEYCODE_RIGHT: 397 if (_currentPos < _promptEndPos) 398 _currentPos++; 399 drawLine(pos2line(_currentPos)); 400 break; 401 case Common::KEYCODE_LEFT: 402 if (_currentPos > _promptStartPos) 403 _currentPos--; 404 drawLine(pos2line(_currentPos)); 405 break; 473 406 474 default: 407 if (state.ascii == '~' || state.ascii == '#') { 408 slideUpAndClose(); 409 } else if (state.flags == Common::KBD_CTRL) { 410 specialKeys(state.keycode); 411 } else if ((state.ascii >= 32 && state.ascii <= 127) || (state.ascii >= 160 && state.ascii <= 255)) { 412 for (i = _promptEndPos - 1; i >= _currentPos; i--) 413 buffer(i + 1) = buffer(i); 414 _promptEndPos++; 415 putchar((byte)state.ascii); 416 scrollToCurrent(); 417 } 475 defaultKeyDownHandler(state); 418 476 } 419 477 } 420 478 479 void ConsoleDialog::defaultKeyDownHandler(Common::KeyState &state) { 480 if (state.ascii == '~' || state.ascii == '#') { 481 slideUpAndClose(); 482 } else if (state.hasFlags(Common::KBD_CTRL)) { 483 specialKeys(state.keycode); 484 } else if ((state.ascii >= 32 && state.ascii <= 127) || (state.ascii >= 160 && state.ascii <= 255)) { 485 for (int i = _promptEndPos - 1; i >= _currentPos; i--) 486 buffer(i + 1) = buffer(i); 487 _promptEndPos++; 488 putchar((byte)state.ascii); 489 scrollToCurrent(); 490 } 491 } 492 421 493 void ConsoleDialog::insertIntoPrompt(const char* str) { 422 494 unsigned int l = strlen(str); 423 495 for (int i = _promptEndPos - 1; i >= _currentPos; i--) -
gui/console.h
178 178 void updateScrollBuffer(); 179 179 void scrollToCurrent(); 180 180 181 void defaultKeyDownHandler(Common::KeyState &state); 182 181 183 // Line editing 182 184 void specialKeys(int keycode); 183 185 void nextLine(); -
gui/editable.cpp
100 100 endEditMode(); 101 101 dirty = true; 102 102 break; 103 103 104 case Common::KEYCODE_ESCAPE: 104 105 abortEditMode(); 105 106 dirty = true; 106 107 break; 108 107 109 case Common::KEYCODE_BACKSPACE: 108 110 if (_caretPos > 0) { 109 111 _caretPos--; … … 114 116 } 115 117 forcecaret = true; 116 118 break; 119 120 // Keypad & special keys 121 // - if num lock is set, we always go to the default case 122 // - if num lock is not set, we either fall down to the special key case 123 // or ignore the key press in case of 0 (INSERT), 2 (DOWN), 3 (PGDWN) 124 // 5, 8 (UP) and 9 (PGUP) 125 126 case Common::KEYCODE_KP0: 127 case Common::KEYCODE_KP2: 128 case Common::KEYCODE_KP3: 129 case Common::KEYCODE_KP5: 130 case Common::KEYCODE_KP8: 131 case Common::KEYCODE_KP9: 132 if (state.flags & Common::KBD_NUM) 133 defaultKeyDownHandler(state, dirty, forcecaret, handled); 134 break; 135 136 case Common::KEYCODE_KP_PERIOD: 137 if (state.flags & Common::KBD_NUM) { 138 defaultKeyDownHandler(state, dirty, forcecaret, handled); 139 break; 140 } 117 141 case Common::KEYCODE_DELETE: 118 142 if (_caretPos < (int)_editString.size()) { 119 143 _editString.deleteChar(_caretPos); … … 123 147 } 124 148 forcecaret = true; 125 149 break; 150 151 case Common::KEYCODE_KP1: 152 if (state.flags & Common::KBD_NUM) { 153 defaultKeyDownHandler(state, dirty, forcecaret, handled); 154 break; 155 } 156 case Common::KEYCODE_END: 157 dirty = setCaretPos(_editString.size()); 158 forcecaret = true; 159 break; 160 161 case Common::KEYCODE_KP4: 162 if (state.flags & Common::KBD_NUM) { 163 defaultKeyDownHandler(state, dirty, forcecaret, handled); 164 break; 165 } 126 166 case Common::KEYCODE_LEFT: 127 167 if (_caretPos > 0) { 128 168 dirty = setCaretPos(_caretPos - 1); … … 130 170 forcecaret = true; 131 171 dirty = true; 132 172 break; 173 174 case Common::KEYCODE_KP6: 175 if (state.flags & Common::KBD_NUM) { 176 defaultKeyDownHandler(state, dirty, forcecaret, handled); 177 break; 178 } 133 179 case Common::KEYCODE_RIGHT: 134 180 if (_caretPos < (int)_editString.size()) { 135 181 dirty = setCaretPos(_caretPos + 1); … … 137 183 forcecaret = true; 138 184 dirty = true; 139 185 break; 186 187 case Common::KEYCODE_KP7: 188 if (state.flags & Common::KBD_NUM) { 189 defaultKeyDownHandler(state, dirty, forcecaret, handled); 190 break; 191 } 140 192 case Common::KEYCODE_HOME: 141 193 dirty = setCaretPos(0); 142 194 forcecaret = true; 143 195 break; 144 case Common::KEYCODE_END: 145 dirty = setCaretPos(_editString.size()); 146 forcecaret = true; 147 break; 196 148 197 default: 149 if (tryInsertChar((byte)state.ascii, _caretPos)) { 150 _caretPos++; 151 dirty = true; 152 forcecaret = true; 153 154 sendCommand(_cmd, 0); 155 } else { 156 handled = false; 157 } 198 defaultKeyDownHandler(state, dirty, forcecaret, handled); 158 199 } 159 200 160 201 if (dirty) … … 166 207 return handled; 167 208 } 168 209 210 void EditableWidget::defaultKeyDownHandler(Common::KeyState &state, bool &dirty, bool &forcecaret, bool &handled) { 211 if (tryInsertChar((byte)state.ascii, _caretPos)) { 212 _caretPos++; 213 dirty = true; 214 forcecaret = true; 215 216 sendCommand(_cmd, 0); 217 } else { 218 handled = false; 219 } 220 } 221 169 222 int EditableWidget::getCaretOffset() const { 170 223 int caretpos = 0; 171 224 for (int i = 0; i < _caretPos; i++) -
gui/editable.h
81 81 bool adjustOffset(); 82 82 void makeCaretVisible(); 83 83 84 void defaultKeyDownHandler(Common::KeyState &state, bool &dirty, bool &forcecaret, bool &handled); 85 84 86 void setFontStyle(ThemeEngine::FontStyle font) { _font = font; } 85 87 86 88 virtual bool tryInsertChar(byte c, int pos); -
gui/ListWidget.cpp
286 286 bool dirty = false; 287 287 int oldSelectedItem = _selectedItem; 288 288 289 if (!_editMode && isprint((unsigned char)state.ascii)) {289 if (!_editMode && state.keycode <= Common::KEYCODE_z && isprint((unsigned char)state.ascii)) { 290 290 // Quick selection mode: Go to first list item starting with this key 291 291 // (or a substring accumulated from the last couple key presses). 292 292 // Only works in a useful fashion if the list entries are sorted. … … 339 339 sendCommand(kListItemActivatedCmd, _selectedItem); 340 340 } 341 341 break; 342 343 // Keypad & special keys 344 // - if num lock is set, we do not handle the keypress 345 // - if num lock is not set, we either fall down to the special key case 346 // or ignore the key press for 0, 4, 5 and 6 347 348 case Common::KEYCODE_KP_PERIOD: 349 if (state.flags & Common::KBD_NUM) { 350 handled = false; 351 break; 352 } 342 353 case Common::KEYCODE_BACKSPACE: 343 case Common::KEYCODE_KP_PERIOD:344 354 case Common::KEYCODE_DELETE: 345 355 if (_selectedItem >= 0) { 346 356 if (_editable) { … … 350 360 } 351 361 } 352 362 break; 353 case Common::KEYCODE_UP: 354 if (_selectedItem > 0) 355 _selectedItem--; 363 364 case Common::KEYCODE_KP1: 365 if (state.flags & Common::KBD_NUM) { 366 handled = false; 367 break; 368 } 369 case Common::KEYCODE_END: 370 _selectedItem = _list.size() - 1; 356 371 break; 372 373 374 case Common::KEYCODE_KP2: 375 if (state.flags & Common::KBD_NUM) { 376 handled = false; 377 break; 378 } 357 379 case Common::KEYCODE_DOWN: 358 380 if (_selectedItem < (int)_list.size() - 1) 359 381 _selectedItem++; 360 382 break; 361 case Common::KEYCODE_PAGEUP: 362 _selectedItem -= _entriesPerPage - 1; 363 if (_selectedItem < 0) 364 _selectedItem = 0; 365 break; 383 384 case Common::KEYCODE_KP3: 385 if (state.flags & Common::KBD_NUM) { 386 handled = false; 387 break; 388 } 366 389 case Common::KEYCODE_PAGEDOWN: 367 390 _selectedItem += _entriesPerPage - 1; 368 391 if (_selectedItem >= (int)_list.size() ) 369 392 _selectedItem = _list.size() - 1; 370 393 break; 394 395 case Common::KEYCODE_KP7: 396 if (state.flags & Common::KBD_NUM) { 397 handled = false; 398 break; 399 } 371 400 case Common::KEYCODE_HOME: 372 401 _selectedItem = 0; 373 402 break; 374 case Common::KEYCODE_END: 375 _selectedItem = _list.size() - 1; 403 404 case Common::KEYCODE_KP8: 405 if (state.flags & Common::KBD_NUM) { 406 handled = false; 407 break; 408 } 409 case Common::KEYCODE_UP: 410 if (_selectedItem > 0) 411 _selectedItem--; 376 412 break; 413 414 case Common::KEYCODE_KP9: 415 if (state.flags & Common::KBD_NUM) { 416 handled = false; 417 break; 418 } 419 case Common::KEYCODE_PAGEUP: 420 _selectedItem -= _entriesPerPage - 1; 421 if (_selectedItem < 0) 422 _selectedItem = 0; 423 break; 424 377 425 default: 378 426 handled = false; 379 427 } -
gui/PopUpWidget.cpp
222 222 return; 223 223 224 224 switch (state.keycode) { 225 225 226 case Common::KEYCODE_RETURN: 226 227 case Common::KEYCODE_KP_ENTER: 227 228 setResult(_selection); 228 229 close(); 229 230 break; 230 case Common::KEYCODE_UP: 231 moveUp(); 231 232 // Keypad & special keys 233 // - if num lock is set, we ignore the keypress 234 // - if num lock is not set, we fall down to the special key case 235 236 case Common::KEYCODE_KP1: 237 if (state.flags & Common::KBD_NUM) 238 break; 239 case Common::KEYCODE_END: 240 setSelection(_popUpBoss->_entries.size()-1); 232 241 break; 242 243 case Common::KEYCODE_KP2: 244 if (state.flags & Common::KBD_NUM) 245 break; 233 246 case Common::KEYCODE_DOWN: 234 247 moveDown(); 235 248 break; 249 250 case Common::KEYCODE_KP7: 251 if (state.flags & Common::KBD_NUM) 252 break; 236 253 case Common::KEYCODE_HOME: 237 254 setSelection(0); 238 255 break; 239 case Common::KEYCODE_END: 240 setSelection(_popUpBoss->_entries.size()-1); 256 257 case Common::KEYCODE_KP8: 258 if (state.flags & Common::KBD_NUM) 259 break; 260 case Common::KEYCODE_UP: 261 moveUp(); 241 262 break; 263 242 264 default: 243 265 break; 244 266 }