mirror of https://github.com/stella-emu/stella.git
Further work on the debugger console:
Added typical Unix shell shortcut keys (still TODO is Ctrl-U) Fixed delete action causing crashes Made cursor redraw at the correct place Still TODO: use Unicode to accurately represent keypresses onscreen. git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@471 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
This commit is contained in:
parent
93f9e9e526
commit
08548e51df
|
@ -13,7 +13,7 @@
|
||||||
// See the file "license" for information on usage and redistribution of
|
// See the file "license" for information on usage and redistribution of
|
||||||
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
//
|
//
|
||||||
// $Id: EventHandler.cxx,v 1.70 2005-06-05 23:46:19 stephena Exp $
|
// $Id: EventHandler.cxx,v 1.71 2005-06-07 19:01:53 stephena Exp $
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
@ -246,14 +246,18 @@ void EventHandler::poll(uInt32 time)
|
||||||
SDLMod mod = event.key.keysym.mod;
|
SDLMod mod = event.key.keysym.mod;
|
||||||
uInt8 state = event.key.type == SDL_KEYDOWN ? 1 : 0;
|
uInt8 state = event.key.type == SDL_KEYDOWN ? 1 : 0;
|
||||||
|
|
||||||
|
if(event.type == SDL_KEYDOWN)
|
||||||
|
{
|
||||||
|
if(kbdShift(mod))
|
||||||
|
cerr << "shift key: " << (char)key << endl;
|
||||||
|
else
|
||||||
|
cerr << "key: " << (char)key << endl;
|
||||||
|
}
|
||||||
|
|
||||||
// An attempt to speed up event processing
|
// An attempt to speed up event processing
|
||||||
// All SDL-specific event actions are accessed by either
|
// All SDL-specific event actions are accessed by either
|
||||||
// Control/Cmd or Alt/Shift-Cmd keys. So we quickly check for those.
|
// Control/Cmd or Alt/Shift-Cmd keys. So we quickly check for those.
|
||||||
#ifndef MAC_OSX
|
if(kbdAlt(mod) && state)
|
||||||
if(mod & KMOD_ALT && state)
|
|
||||||
#else
|
|
||||||
if((mod & KMOD_META) && (mod & KMOD_SHIFT) && state)
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
// These keys work in all states
|
// These keys work in all states
|
||||||
switch(int(key))
|
switch(int(key))
|
||||||
|
@ -349,11 +353,7 @@ void EventHandler::poll(uInt32 time)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#ifndef MAC_OSX
|
else if(kbdControl(mod) && state)
|
||||||
else if(mod & KMOD_CTRL && state)
|
|
||||||
#else
|
|
||||||
else if((mod & KMOD_META) && !(mod & KMOD_SHIFT) && state)
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
// These keys work in all states
|
// These keys work in all states
|
||||||
switch(int(key))
|
switch(int(key))
|
||||||
|
@ -442,9 +442,9 @@ void EventHandler::poll(uInt32 time)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
// Otherwise, let the event handler deal with it
|
// Otherwise, let the event handler deal with it
|
||||||
handleKeyEvent(key, mod, state);
|
handleKeyEvent(key, mod, state);
|
||||||
|
|
||||||
break; // SDL_KEYUP, SDL_KEYDOWN
|
break; // SDL_KEYUP, SDL_KEYDOWN
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
// See the file "license" for information on usage and redistribution of
|
// See the file "license" for information on usage and redistribution of
|
||||||
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
//
|
//
|
||||||
// $Id: EventHandler.hxx,v 1.34 2005-05-28 17:25:41 stephena Exp $
|
// $Id: EventHandler.hxx,v 1.35 2005-06-07 19:01:53 stephena Exp $
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
#ifndef EVENTHANDLER_HXX
|
#ifndef EVENTHANDLER_HXX
|
||||||
|
@ -74,7 +74,7 @@ struct Stella_Joystick {
|
||||||
mapping can take place.
|
mapping can take place.
|
||||||
|
|
||||||
@author Stephen Anthony
|
@author Stephen Anthony
|
||||||
@version $Id: EventHandler.hxx,v 1.34 2005-05-28 17:25:41 stephena Exp $
|
@version $Id: EventHandler.hxx,v 1.35 2005-06-07 19:01:53 stephena Exp $
|
||||||
*/
|
*/
|
||||||
class EventHandler
|
class EventHandler
|
||||||
{
|
{
|
||||||
|
@ -180,6 +180,29 @@ class EventHandler
|
||||||
*/
|
*/
|
||||||
void setPaddleMode(uInt32 num, bool showmessage = false);
|
void setPaddleMode(uInt32 num, bool showmessage = false);
|
||||||
|
|
||||||
|
inline bool kbdAlt(int mod)
|
||||||
|
{
|
||||||
|
#ifndef MAC_OSX
|
||||||
|
return (mod & KMOD_ALT) > 0;
|
||||||
|
#else
|
||||||
|
return ((mod & KMOD_META) && (mod & KMOD_SHIFT));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool kbdControl(int mod)
|
||||||
|
{
|
||||||
|
#ifndef MAC_OSX
|
||||||
|
return (mod & KMOD_CTRL) > 0;
|
||||||
|
#else
|
||||||
|
return ((mod & KMOD_META) && !(mod & KMOD_SHIFT))
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool kbdShift(int mod)
|
||||||
|
{
|
||||||
|
return (mod & KMOD_SHIFT) > 0;
|
||||||
|
}
|
||||||
|
|
||||||
// Holds static strings for the remap menu
|
// Holds static strings for the remap menu
|
||||||
static ActionList ourActionList[61];
|
static ActionList ourActionList[61];
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
// See the file "license" for information on usage and redistribution of
|
// See the file "license" for information on usage and redistribution of
|
||||||
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
//
|
//
|
||||||
// $Id: ListWidget.cxx,v 1.9 2005-06-07 01:14:39 stephena Exp $
|
// $Id: ListWidget.cxx,v 1.10 2005-06-07 19:01:53 stephena Exp $
|
||||||
//
|
//
|
||||||
// Based on code from ScummVM - Scumm Interpreter
|
// Based on code from ScummVM - Scumm Interpreter
|
||||||
// Copyright (C) 2002-2004 The ScummVM project
|
// Copyright (C) 2002-2004 The ScummVM project
|
||||||
|
@ -188,6 +188,11 @@ static bool matchingCharsIgnoringCase(string s, string pattern)
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
bool ListWidget::handleKeyDown(int ascii, int keycode, int modifiers)
|
bool ListWidget::handleKeyDown(int ascii, int keycode, int modifiers)
|
||||||
{
|
{
|
||||||
|
// Ignore all mod keys
|
||||||
|
if(instance()->eventHandler().kbdControl(modifiers) ||
|
||||||
|
instance()->eventHandler().kbdControl(modifiers))
|
||||||
|
return true;
|
||||||
|
|
||||||
bool handled = true;
|
bool handled = true;
|
||||||
bool dirty = false;
|
bool dirty = false;
|
||||||
int oldSelectedItem = _selectedItem;
|
int oldSelectedItem = _selectedItem;
|
||||||
|
@ -250,7 +255,7 @@ bool ListWidget::handleKeyDown(int ascii, int keycode, int modifiers)
|
||||||
dirty = true;
|
dirty = true;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if (isprint((char)ascii))
|
if (ascii < 128)
|
||||||
{
|
{
|
||||||
_list[_selectedItem] += (char)ascii;
|
_list[_selectedItem] += (char)ascii;
|
||||||
dirty = true;
|
dirty = true;
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
// See the file "license" for information on usage and redistribution of
|
// See the file "license" for information on usage and redistribution of
|
||||||
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
//
|
//
|
||||||
// $Id: PromptDialog.cxx,v 1.1 2005-06-07 01:14:39 stephena Exp $
|
// $Id: PromptDialog.cxx,v 1.2 2005-06-07 19:01:53 stephena Exp $
|
||||||
//
|
//
|
||||||
// Based on code from ScummVM - Scumm Interpreter
|
// Based on code from ScummVM - Scumm Interpreter
|
||||||
// Copyright (C) 2002-2004 The ScummVM project
|
// Copyright (C) 2002-2004 The ScummVM project
|
||||||
|
@ -21,6 +21,8 @@
|
||||||
|
|
||||||
#include "ScrollBarWidget.hxx"
|
#include "ScrollBarWidget.hxx"
|
||||||
#include "FrameBuffer.hxx"
|
#include "FrameBuffer.hxx"
|
||||||
|
#include "EventHandler.hxx"
|
||||||
|
#include "Version.hxx"
|
||||||
|
|
||||||
#include "PromptDialog.hxx"
|
#include "PromptDialog.hxx"
|
||||||
|
|
||||||
|
@ -56,12 +58,6 @@ PromptDialog::PromptDialog(OSystem* osystem, DialogContainer* parent,
|
||||||
_scrollLine = _linesPerPage - 1;
|
_scrollLine = _linesPerPage - 1;
|
||||||
_firstLineInBuffer = 0;
|
_firstLineInBuffer = 0;
|
||||||
|
|
||||||
_caretVisible = true;//false;
|
|
||||||
_caretTime = 0;
|
|
||||||
|
|
||||||
_slideMode = kNoSlideMode;
|
|
||||||
_slideTime = 0;
|
|
||||||
|
|
||||||
// Add scrollbar
|
// Add scrollbar
|
||||||
_scrollBar = new ScrollBarWidget(this, _w - kScrollBarWidth - 1, 0, kScrollBarWidth, _h);
|
_scrollBar = new ScrollBarWidget(this, _w - kScrollBarWidth - 1, 0, kScrollBarWidth, _h);
|
||||||
_scrollBar->setTarget(this);
|
_scrollBar->setTarget(this);
|
||||||
|
@ -80,8 +76,9 @@ PromptDialog::PromptDialog(OSystem* osystem, DialogContainer* parent,
|
||||||
_promptStartPos = _promptEndPos = -1;
|
_promptStartPos = _promptEndPos = -1;
|
||||||
|
|
||||||
// Display greetings & prompt
|
// Display greetings & prompt
|
||||||
print("HELLO!!");//gScummVMFullVersion);
|
string version = string("Stella version ") + STELLA_VERSION + "\n";
|
||||||
print("\nDebugger is ready\n");
|
print(version.c_str());
|
||||||
|
print("Debugger is ready\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
@ -89,6 +86,16 @@ PromptDialog::~PromptDialog()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
void PromptDialog::loadConfig()
|
||||||
|
{
|
||||||
|
if (_promptStartPos == -1)
|
||||||
|
{
|
||||||
|
print(PROMPT);
|
||||||
|
_promptStartPos = _promptEndPos = _currentPos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void PromptDialog::drawDialog()
|
void PromptDialog::drawDialog()
|
||||||
{
|
{
|
||||||
|
@ -120,6 +127,9 @@ void PromptDialog::drawDialog()
|
||||||
y += kConsoleLineHeight;
|
y += kConsoleLineHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Draw the caret
|
||||||
|
drawCaret();
|
||||||
|
|
||||||
// Draw the scrollbar
|
// Draw the scrollbar
|
||||||
_scrollBar->draw();
|
_scrollBar->draw();
|
||||||
}
|
}
|
||||||
|
@ -133,27 +143,19 @@ void PromptDialog::handleMouseWheel(int x, int y, int direction)
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void PromptDialog::handleKeyDown(int ascii, int keycode, int modifiers)
|
void PromptDialog::handleKeyDown(int ascii, int keycode, int modifiers)
|
||||||
{
|
{
|
||||||
cerr << "PromptDialog::handleKeyDown\n";
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (_slideMode != kNoSlideMode)
|
|
||||||
return;
|
|
||||||
|
|
||||||
switch (keycode)
|
switch (keycode)
|
||||||
{
|
{
|
||||||
case '\n': // enter/return
|
case '\n': // enter/return
|
||||||
case '\r':
|
case '\r':
|
||||||
{
|
{
|
||||||
if (_caretVisible)
|
|
||||||
drawCaret(true);
|
|
||||||
|
|
||||||
nextLine();
|
nextLine();
|
||||||
|
|
||||||
assert(_promptEndPos >= _promptStartPos);
|
assert(_promptEndPos >= _promptStartPos);
|
||||||
int len = _promptEndPos - _promptStartPos;
|
int len = _promptEndPos - _promptStartPos;
|
||||||
bool keepRunning = true;
|
bool keepRunning = true;
|
||||||
|
|
||||||
|
|
||||||
if (len > 0)
|
if (len > 0)
|
||||||
{
|
{
|
||||||
// We have to allocate the string buffer with new, since VC++ sadly does not
|
// We have to allocate the string buffer with new, since VC++ sadly does not
|
||||||
|
@ -172,6 +174,7 @@ cerr << "PromptDialog::handleKeyDown\n";
|
||||||
if (_callbackProc)
|
if (_callbackProc)
|
||||||
keepRunning = (*_callbackProc)(this, str, _callbackRefCon);
|
keepRunning = (*_callbackProc)(this, str, _callbackRefCon);
|
||||||
|
|
||||||
|
cerr << "Command entered: \'" << str << "\'\n";
|
||||||
// Get rid of the string buffer
|
// Get rid of the string buffer
|
||||||
delete [] str;
|
delete [] str;
|
||||||
}
|
}
|
||||||
|
@ -185,14 +188,9 @@ cerr << "PromptDialog::handleKeyDown\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
case 8: // backspace
|
case 8: // backspace
|
||||||
if (_caretVisible)
|
|
||||||
drawCaret(true);
|
|
||||||
|
|
||||||
if (_currentPos > _promptStartPos)
|
if (_currentPos > _promptStartPos)
|
||||||
{
|
killChar(-1);
|
||||||
_currentPos--;
|
|
||||||
killChar();
|
|
||||||
}
|
|
||||||
scrollToCurrent();
|
scrollToCurrent();
|
||||||
draw(); // FIXME - not nice to redraw the full console just for one char!
|
draw(); // FIXME - not nice to redraw the full console just for one char!
|
||||||
instance()->frameBuffer().refresh();
|
instance()->frameBuffer().refresh();
|
||||||
|
@ -214,8 +212,6 @@ cerr << "PromptDialog::handleKeyDown\n";
|
||||||
char *completion = 0;
|
char *completion = 0;
|
||||||
if ((*_completionCallbackProc)(this, str, completion, _callbackRefCon))
|
if ((*_completionCallbackProc)(this, str, completion, _callbackRefCon))
|
||||||
{
|
{
|
||||||
if (_caretVisible)
|
|
||||||
drawCaret(true);
|
|
||||||
insertIntoPrompt(completion);
|
insertIntoPrompt(completion);
|
||||||
scrollToCurrent();
|
scrollToCurrent();
|
||||||
draw();
|
draw();
|
||||||
|
@ -228,7 +224,7 @@ cerr << "PromptDialog::handleKeyDown\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
case 127:
|
case 127:
|
||||||
killChar();
|
killChar(1);
|
||||||
draw();
|
draw();
|
||||||
instance()->frameBuffer().refresh();
|
instance()->frameBuffer().refresh();
|
||||||
break;
|
break;
|
||||||
|
@ -258,7 +254,7 @@ cerr << "PromptDialog::handleKeyDown\n";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 256 + 22: // home
|
case 256 + 22: // home
|
||||||
if (1) // FIXME - shift modifiers == OSystem::KBD_SHIFT)
|
if (0) // FIXME - shift modifiers == OSystem::KBD_SHIFT)
|
||||||
{
|
{
|
||||||
_scrollLine = _firstLineInBuffer + _linesPerPage - 1;
|
_scrollLine = _firstLineInBuffer + _linesPerPage - 1;
|
||||||
updateScrollBuffer();
|
updateScrollBuffer();
|
||||||
|
@ -271,7 +267,7 @@ cerr << "PromptDialog::handleKeyDown\n";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 256 + 23: // end
|
case 256 + 23: // end
|
||||||
if (1) // FIXME - shift modifiers == OSystem::KBD_SHIFT)
|
if (0) // FIXME - shift modifiers == OSystem::KBD_SHIFT)
|
||||||
{
|
{
|
||||||
_scrollLine = _promptEndPos / _lineWidth;
|
_scrollLine = _promptEndPos / _lineWidth;
|
||||||
if (_scrollLine < _linesPerPage - 1)
|
if (_scrollLine < _linesPerPage - 1)
|
||||||
|
@ -308,16 +304,26 @@ cerr << "PromptDialog::handleKeyDown\n";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
/* FIXME
|
cerr << "ascii: " << ascii << endl;
|
||||||
} else if (modifiers == OSystem::KBD_CTRL) {
|
if (instance()->eventHandler().kbdControl(modifiers))
|
||||||
specialKeys(keycode);
|
|
||||||
*/
|
|
||||||
if (isprint((char)ascii))
|
|
||||||
{
|
{
|
||||||
|
specialKeys(keycode);
|
||||||
|
}
|
||||||
|
else if (instance()->eventHandler().kbdAlt(modifiers))
|
||||||
|
{
|
||||||
|
cerr << "Alt from prompt\n";
|
||||||
|
}
|
||||||
|
else if (ascii < 256)
|
||||||
|
{
|
||||||
|
// Do uppercase letters
|
||||||
|
// if(instance()->eventHandler().kbdShift(modifiers))
|
||||||
|
// ascii = ascii & ~0x20;
|
||||||
|
|
||||||
for (i = _promptEndPos - 1; i >= _currentPos; i--)
|
for (i = _promptEndPos - 1; i >= _currentPos; i--)
|
||||||
buffer(i + 1) = buffer(i);
|
buffer(i + 1) = buffer(i);
|
||||||
_promptEndPos++;
|
_promptEndPos++;
|
||||||
putchar((char)ascii);
|
putchar((int)*(SDL_GetKeyName((SDLKey)ascii)));
|
||||||
|
// putchar(ascii);
|
||||||
scrollToCurrent();
|
scrollToCurrent();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -359,51 +365,90 @@ void PromptDialog::handleCommand(CommandSender* sender, int cmd, int data)
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void PromptDialog::specialKeys(int keycode)
|
void PromptDialog::specialKeys(int keycode)
|
||||||
{
|
{
|
||||||
/* FIXME - add UNIX style line editing
|
bool handled = false;
|
||||||
switch (keycode) {
|
|
||||||
case 'a':
|
switch (keycode)
|
||||||
_currentPos = _promptStartPos;
|
{
|
||||||
draw();
|
case 'a':
|
||||||
break;
|
_currentPos = _promptStartPos;
|
||||||
case 'd':
|
handled = true;
|
||||||
if (_currentPos < _promptEndPos) {
|
break;
|
||||||
killChar();
|
|
||||||
draw();
|
case 'd':
|
||||||
}
|
killChar(1);
|
||||||
break;
|
handled = true;
|
||||||
case 'e':
|
break;
|
||||||
_currentPos = _promptEndPos;
|
|
||||||
draw();
|
case 'e':
|
||||||
break;
|
_currentPos = _promptEndPos;
|
||||||
case 'k':
|
handled = true;
|
||||||
killLine();
|
break;
|
||||||
draw();
|
|
||||||
break;
|
case 'k':
|
||||||
case 'w':
|
killLine(1);
|
||||||
killLastWord();
|
handled = true;
|
||||||
draw();
|
break;
|
||||||
break;
|
|
||||||
}
|
case 'u':
|
||||||
*/
|
killLine(-1);
|
||||||
|
handled = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'w':
|
||||||
|
killLastWord();
|
||||||
|
handled = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(handled)
|
||||||
|
{
|
||||||
|
draw();
|
||||||
|
instance()->frameBuffer().refresh();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void PromptDialog::killChar()
|
void PromptDialog::killChar(int direction)
|
||||||
{
|
{
|
||||||
for (int i = _currentPos; i < _promptEndPos; i++)
|
if(direction == -1) // Delete previous character (backspace)
|
||||||
buffer(i) = buffer(i + 1);
|
{
|
||||||
|
if(_currentPos <= _promptStartPos)
|
||||||
|
return;
|
||||||
|
|
||||||
buffer(_promptEndPos) = ' ';
|
_currentPos--;
|
||||||
_promptEndPos--;
|
for (int i = _currentPos; i < _promptEndPos; i++)
|
||||||
|
buffer(i) = buffer(i + 1);
|
||||||
|
|
||||||
|
buffer(_promptEndPos) = ' ';
|
||||||
|
_promptEndPos--;
|
||||||
|
}
|
||||||
|
else if(direction == 1) // Delete next character (delete)
|
||||||
|
{
|
||||||
|
if(_currentPos >= _promptEndPos)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// There are further characters to the right of cursor
|
||||||
|
if(_currentPos + 1 <= _promptEndPos)
|
||||||
|
{
|
||||||
|
for (int i = _currentPos; i < _promptEndPos; i++)
|
||||||
|
buffer(i) = buffer(i + 1);
|
||||||
|
|
||||||
|
buffer(_promptEndPos) = ' ';
|
||||||
|
_promptEndPos--;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void PromptDialog::killLine()
|
void PromptDialog::killLine(int direction)
|
||||||
{
|
{
|
||||||
for (int i = _currentPos; i < _promptEndPos; i++)
|
if(direction == 1) // erase from current position to end of line
|
||||||
buffer(i) = ' ';
|
{
|
||||||
|
for (int i = _currentPos; i < _promptEndPos; i++)
|
||||||
|
buffer(i) = ' ';
|
||||||
|
|
||||||
_promptEndPos = _currentPos;
|
_promptEndPos = _currentPos;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
@ -464,13 +509,9 @@ void PromptDialog::historyScroll(int direction)
|
||||||
return;
|
return;
|
||||||
_historyLine = line;
|
_historyLine = line;
|
||||||
|
|
||||||
// Hide caret if visible
|
|
||||||
if (_caretVisible)
|
|
||||||
drawCaret(true);
|
|
||||||
|
|
||||||
// Remove the current user text
|
// Remove the current user text
|
||||||
_currentPos = _promptStartPos;
|
_currentPos = _promptStartPos;
|
||||||
killLine();
|
killLine(1); // to end of line
|
||||||
|
|
||||||
// ... and ensure the prompt is visible
|
// ... and ensure the prompt is visible
|
||||||
scrollToCurrent();
|
scrollToCurrent();
|
||||||
|
@ -559,10 +600,8 @@ int PromptDialog::vprintf(const char *format, va_list argptr)
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void PromptDialog::putchar(int c)
|
void PromptDialog::putchar(int c)
|
||||||
{
|
{
|
||||||
if (_caretVisible)
|
|
||||||
drawCaret(true);
|
|
||||||
|
|
||||||
putcharIntern(c);
|
putcharIntern(c);
|
||||||
|
|
||||||
draw(); // FIXME - not nice to redraw the full console just for one char!
|
draw(); // FIXME - not nice to redraw the full console just for one char!
|
||||||
instance()->frameBuffer().refresh();
|
instance()->frameBuffer().refresh();
|
||||||
}
|
}
|
||||||
|
@ -578,7 +617,7 @@ void PromptDialog::putcharIntern(int c)
|
||||||
_currentPos++;
|
_currentPos++;
|
||||||
if ((_scrollLine + 1) * _lineWidth == _currentPos)
|
if ((_scrollLine + 1) * _lineWidth == _currentPos)
|
||||||
{
|
{
|
||||||
_scrollLine++;
|
_scrollLine++;
|
||||||
updateScrollBuffer();
|
updateScrollBuffer();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -587,9 +626,6 @@ void PromptDialog::putcharIntern(int c)
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void PromptDialog::print(const char *str)
|
void PromptDialog::print(const char *str)
|
||||||
{
|
{
|
||||||
if (_caretVisible)
|
|
||||||
drawCaret(true);
|
|
||||||
|
|
||||||
while (*str)
|
while (*str)
|
||||||
putcharIntern(*str++);
|
putcharIntern(*str++);
|
||||||
|
|
||||||
|
@ -598,38 +634,19 @@ void PromptDialog::print(const char *str)
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void PromptDialog::drawCaret(bool erase)
|
void PromptDialog::drawCaret()
|
||||||
{
|
{
|
||||||
FrameBuffer& fb = instance()->frameBuffer();
|
FrameBuffer& fb = instance()->frameBuffer();
|
||||||
|
|
||||||
int line = _currentPos / _lineWidth;
|
int line = _currentPos / _lineWidth;
|
||||||
int displayLine = line - _scrollLine + _linesPerPage - 1;
|
int displayLine = line - _scrollLine + _linesPerPage - 1;
|
||||||
|
|
||||||
// Only draw caret if visible
|
|
||||||
if (!isVisible() || displayLine < 0 || displayLine >= _linesPerPage)
|
|
||||||
{
|
|
||||||
_caretVisible = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
int x = _x + 1 + (_currentPos % _lineWidth) * kConsoleCharWidth;
|
int x = _x + 1 + (_currentPos % _lineWidth) * kConsoleCharWidth;
|
||||||
int y = _y + displayLine * kConsoleLineHeight;
|
int y = _y + displayLine * kConsoleLineHeight;
|
||||||
|
|
||||||
char c = buffer(_currentPos);
|
char c = buffer(_currentPos);
|
||||||
if (erase)
|
fb.fillRect(x, y, kConsoleCharWidth, kConsoleLineHeight, kTextColor);
|
||||||
{
|
fb.drawChar(c, x, y + 2, kBGColor);
|
||||||
fb.fillRect(x, y, kConsoleCharWidth, kConsoleLineHeight, kBGColor);
|
|
||||||
fb.drawChar(c, x, y + 2, kTextColor);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
fb.fillRect(x, y, kConsoleCharWidth, kConsoleLineHeight, kTextColor);
|
|
||||||
fb.drawChar(c, x, y + 2, kBGColor);
|
|
||||||
}
|
|
||||||
//FIXMEg_gui.addDirtyRect(x, y, kConsoleCharWidth, kConsoleLineHeight);
|
|
||||||
fb.refresh();
|
|
||||||
|
|
||||||
_caretVisible = !erase;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
// See the file "license" for information on usage and redistribution of
|
// See the file "license" for information on usage and redistribution of
|
||||||
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
//
|
//
|
||||||
// $Id: PromptDialog.hxx,v 1.1 2005-06-07 01:14:39 stephena Exp $
|
// $Id: PromptDialog.hxx,v 1.2 2005-06-07 19:01:53 stephena Exp $
|
||||||
//
|
//
|
||||||
// Based on code from ScummVM - Scumm Interpreter
|
// Based on code from ScummVM - Scumm Interpreter
|
||||||
// Copyright (C) 2002-2004 The ScummVM project
|
// Copyright (C) 2002-2004 The ScummVM project
|
||||||
|
@ -43,10 +43,6 @@ class PromptDialog : public Dialog
|
||||||
int x, int y, int w, int h);
|
int x, int y, int w, int h);
|
||||||
virtual ~PromptDialog();
|
virtual ~PromptDialog();
|
||||||
|
|
||||||
void handleMouseWheel(int x, int y, int direction);
|
|
||||||
void handleKeyDown(int ascii, int keycode, int modifiers);
|
|
||||||
void handleCommand(CommandSender* sender, int cmd, int data);
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
int printf(const char *format, ...);
|
int printf(const char *format, ...);
|
||||||
int vprintf(const char *format, va_list argptr);
|
int vprintf(const char *format, va_list argptr);
|
||||||
|
@ -69,7 +65,7 @@ class PromptDialog : public Dialog
|
||||||
inline char &buffer(int idx) { return _buffer[idx % kBufferSize]; }
|
inline char &buffer(int idx) { return _buffer[idx % kBufferSize]; }
|
||||||
|
|
||||||
void drawDialog();
|
void drawDialog();
|
||||||
void drawCaret(bool erase);
|
void drawCaret();
|
||||||
void putcharIntern(int c);
|
void putcharIntern(int c);
|
||||||
void insertIntoPrompt(const char *str);
|
void insertIntoPrompt(const char *str);
|
||||||
void print(const char *str);
|
void print(const char *str);
|
||||||
|
@ -79,14 +75,20 @@ class PromptDialog : public Dialog
|
||||||
// Line editing
|
// Line editing
|
||||||
void specialKeys(int keycode);
|
void specialKeys(int keycode);
|
||||||
void nextLine();
|
void nextLine();
|
||||||
void killChar();
|
void killChar(int direction);
|
||||||
void killLine();
|
void killLine(int direction);
|
||||||
void killLastWord();
|
void killLastWord();
|
||||||
|
|
||||||
// History
|
// History
|
||||||
void addToHistory(const char *str);
|
void addToHistory(const char *str);
|
||||||
void historyScroll(int direction);
|
void historyScroll(int direction);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void handleMouseWheel(int x, int y, int direction);
|
||||||
|
void handleKeyDown(int ascii, int keycode, int modifiers);
|
||||||
|
void handleCommand(CommandSender* sender, int cmd, int data);
|
||||||
|
void loadConfig();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
char _buffer[kBufferSize];
|
char _buffer[kBufferSize];
|
||||||
int _linesInBuffer;
|
int _linesInBuffer;
|
||||||
|
@ -101,18 +103,6 @@ class PromptDialog : public Dialog
|
||||||
int _promptStartPos;
|
int _promptStartPos;
|
||||||
int _promptEndPos;
|
int _promptEndPos;
|
||||||
|
|
||||||
bool _caretVisible;
|
|
||||||
int _caretTime;
|
|
||||||
|
|
||||||
enum SlideMode {
|
|
||||||
kNoSlideMode,
|
|
||||||
kUpSlideMode,
|
|
||||||
kDownSlideMode
|
|
||||||
};
|
|
||||||
|
|
||||||
SlideMode _slideMode;
|
|
||||||
int _slideTime;
|
|
||||||
|
|
||||||
ScrollBarWidget* _scrollBar;
|
ScrollBarWidget* _scrollBar;
|
||||||
|
|
||||||
// The _callbackProc is called whenver a data line is entered
|
// The _callbackProc is called whenver a data line is entered
|
||||||
|
|
Loading…
Reference in New Issue