mirror of
https://github.com/Swordfish90/cool-retro-term.git
synced 2025-04-15 15:20:49 +01:00
Much improved mouse emulation.
This commit is contained in:
parent
765c41307f
commit
a0bfe0f77f
@ -376,6 +376,12 @@ signals:
|
||||
*/
|
||||
void imageSizeChanged(int lineCount , int columnCount);
|
||||
|
||||
/**
|
||||
* Emitted after receiving the escape sequence which asks to change
|
||||
* the terminal emulator's size
|
||||
*/
|
||||
void imageResizeRequest(const QSize& sizz);
|
||||
|
||||
/**
|
||||
* Emitted when the terminal program requests to change various properties
|
||||
* of the terminal display.
|
||||
|
@ -48,9 +48,10 @@
|
||||
#include "ShellCommand.h" // REUSE THIS
|
||||
#include "Vt102Emulation.h" // REUSE THIS
|
||||
|
||||
|
||||
int Session::lastSessionId = 0;
|
||||
|
||||
using namespace Konsole;
|
||||
|
||||
Session::Session() :
|
||||
_shellProcess(0)
|
||||
, _emulation(0)
|
||||
|
@ -23,37 +23,47 @@
|
||||
// Own
|
||||
#include "Vt102Emulation.h"
|
||||
|
||||
// XKB
|
||||
//#include <config-konsole.h>
|
||||
|
||||
// this allows konsole to be compiled without XKB and XTEST extensions
|
||||
// even though it might be available on a particular system.
|
||||
#if defined(AVOID_XKB)
|
||||
#undef HAVE_XKB
|
||||
#endif
|
||||
|
||||
#if defined(HAVE_XKB)
|
||||
void scrolllock_set_off();
|
||||
void scrolllock_set_on();
|
||||
#endif
|
||||
|
||||
// Standard
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <assert.h>
|
||||
|
||||
// Qt
|
||||
#include <QtCore/QEvent>
|
||||
#include <QtCore/QTimer>
|
||||
#include <QtGui/QKeyEvent>
|
||||
#include <QtCore/QByteRef>
|
||||
|
||||
// KDE
|
||||
//#include <kdebug.h>
|
||||
//#include <klocale.h>
|
||||
//#include <KLocalizedString>
|
||||
//#include <KDebug>
|
||||
|
||||
// Konsole
|
||||
#include "KeyboardTranslator.h"
|
||||
#include "Screen.h"
|
||||
#include "TerminalDisplay.h"
|
||||
|
||||
using Konsole::Vt102Emulation;
|
||||
|
||||
/*
|
||||
The VT100 has 32 special graphical characters. The usual vt100 extended
|
||||
xterm fonts have these at 0x00..0x1f.
|
||||
|
||||
QT's iso mapping leaves 0x00..0x7f without any changes. But the graphicals
|
||||
come in here as proper unicode characters.
|
||||
|
||||
We treat non-iso10646 fonts as VT100 extended and do the required mapping
|
||||
from unicode to 0x00..0x1f. The remaining translation is then left to the
|
||||
QCodec.
|
||||
*/
|
||||
|
||||
// assert for i in [0..31] : vt100extended(vt100_graphics[i]) == i.
|
||||
|
||||
unsigned short Konsole::vt100_graphics[32] = {
|
||||
// 0/8 1/9 2/10 3/11 4/12 5/13 6/14 7/15
|
||||
0x0020, 0x25C6, 0x2592, 0x2409, 0x240c, 0x240d, 0x240a, 0x00b0,
|
||||
0x00b1, 0x2424, 0x240b, 0x2518, 0x2510, 0x250c, 0x2514, 0x253c,
|
||||
0xF800, 0xF801, 0x2500, 0xF803, 0xF804, 0x251c, 0x2524, 0x2534,
|
||||
0x252c, 0x2502, 0x2264, 0x2265, 0x03C0, 0x2260, 0x00A3, 0x00b7
|
||||
};
|
||||
|
||||
Vt102Emulation::Vt102Emulation()
|
||||
: Emulation(),
|
||||
@ -77,12 +87,20 @@ void Vt102Emulation::clearEntireScreen()
|
||||
|
||||
void Vt102Emulation::reset()
|
||||
{
|
||||
// Save the current codec so we can set it later.
|
||||
// Ideally we would want to use the profile setting
|
||||
const QTextCodec* currentCodec = codec();
|
||||
|
||||
resetTokenizer();
|
||||
resetModes();
|
||||
resetCharset(0);
|
||||
_screen[0]->reset();
|
||||
resetCharset(1);
|
||||
_screen[1]->reset();
|
||||
|
||||
if (currentCodec)
|
||||
setCodec(currentCodec);
|
||||
else
|
||||
setCodec(LocaleCodec);
|
||||
|
||||
bufferedUpdate();
|
||||
@ -142,7 +160,7 @@ void Vt102Emulation::reset()
|
||||
The last two forms allow list of arguments. Since the elements of
|
||||
the lists are treated individually the same way, they are passed
|
||||
as individual tokens to the interpretation. Further, because the
|
||||
meaning of the parameters are names (althought represented as numbers),
|
||||
meaning of the parameters are names (although represented as numbers),
|
||||
they are includes within the token ('N').
|
||||
|
||||
*/
|
||||
@ -162,7 +180,7 @@ void Vt102Emulation::reset()
|
||||
#define TY_CSI_PG(A) TY_CONSTRUCT(9,A,0)
|
||||
#define TY_CSI_PE(A) TY_CONSTRUCT(10,A,0)
|
||||
|
||||
#define MAX_ARGUMENT 4096
|
||||
const int MAX_ARGUMENT = 4096;
|
||||
|
||||
// Tokenizer --------------------------------------------------------------- --
|
||||
|
||||
@ -200,15 +218,13 @@ void Vt102Emulation::addToCurrentToken(int cc)
|
||||
}
|
||||
|
||||
// Character Class flags used while decoding
|
||||
|
||||
#define CTL 1 // Control character
|
||||
#define CHR 2 // Printable character
|
||||
#define CPN 4 // TODO: Document me
|
||||
#define DIG 8 // Digit
|
||||
#define SCS 16 // TODO: Document me
|
||||
#define GRP 32 // TODO: Document me
|
||||
#define CPS 64 // Character which indicates end of window resize
|
||||
// escape sequence '\e[8;<row>;<col>t'
|
||||
const int CTL = 1; // Control character
|
||||
const int CHR = 2; // Printable character
|
||||
const int CPN = 4; // TODO: Document me
|
||||
const int DIG = 8; // Digit
|
||||
const int SCS = 16; // Select Character Set
|
||||
const int GRP = 32; // TODO: Document me
|
||||
const int CPS = 64; // Character which indicates end of window resize
|
||||
|
||||
void Vt102Emulation::initTokenizer()
|
||||
{
|
||||
@ -267,13 +283,14 @@ void Vt102Emulation::initTokenizer()
|
||||
#define Xte (Xpe && cc == 7 )
|
||||
#define ces(C) (cc < 256 && (charClass[cc] & (C)) == (C) && !Xte)
|
||||
|
||||
#define ESC 27
|
||||
#define CNTL(c) ((c)-'@')
|
||||
const int ESC = 27;
|
||||
const int DEL = 127;
|
||||
|
||||
// process an incoming unicode character
|
||||
void Vt102Emulation::receiveChar(int cc)
|
||||
{
|
||||
if (cc == 127)
|
||||
if (cc == DEL)
|
||||
return; //VT100: ignore.
|
||||
|
||||
if (ces(CTL))
|
||||
@ -294,7 +311,7 @@ void Vt102Emulation::receiveChar(int cc)
|
||||
addToCurrentToken(cc);
|
||||
|
||||
int* s = tokenBuffer;
|
||||
int p = tokenBufferPos;
|
||||
const int p = tokenBufferPos;
|
||||
|
||||
if (getMode(MODE_Ansi))
|
||||
{
|
||||
@ -418,7 +435,7 @@ void Vt102Emulation::updateTitle()
|
||||
meaning is assigned to them. These are either operations of
|
||||
the current _screen, or of the emulation class itself.
|
||||
|
||||
The token to be interpreteted comes in as a machine word
|
||||
The token to be interpreted comes in as a machine word
|
||||
possibly accompanied by two parameters.
|
||||
|
||||
Likewise, the operations assigned to, come with up to two
|
||||
@ -433,7 +450,6 @@ void Vt102Emulation::processToken(int token, int p, int q)
|
||||
{
|
||||
switch (token)
|
||||
{
|
||||
|
||||
case TY_CHR( ) : _currentScreen->displayCharacter (p ); break; //UTF16
|
||||
|
||||
// 127 DEL : ignored on input
|
||||
@ -528,7 +544,9 @@ void Vt102Emulation::processToken(int token, int p, int q)
|
||||
case TY_ESC_DE('8' ) : _currentScreen->helpAlign ( ); break;
|
||||
|
||||
// resize = \e[8;<row>;<col>t
|
||||
case TY_CSI_PS('t', 8) : setImageSize( q /* columns */, p /* lines */ ); break;
|
||||
case TY_CSI_PS('t', 8) : setImageSize( p /*lines */, q /* columns */ );
|
||||
emit imageResizeRequest(QSize(q, p));
|
||||
break;
|
||||
|
||||
// change tab text color : \e[28;<color>t color: 0-16,777,215
|
||||
case TY_CSI_PS('t', 28) : emit changeTabTextColorRequest ( p ); break;
|
||||
@ -552,6 +570,7 @@ void Vt102Emulation::processToken(int token, int p, int q)
|
||||
|
||||
case TY_CSI_PS('m', 0) : _currentScreen->setDefaultRendition ( ); break;
|
||||
case TY_CSI_PS('m', 1) : _currentScreen-> setRendition (RE_BOLD ); break; //VT100
|
||||
//case TY_CSI_PS('m', 3) : _currentScreen-> setRendition (RE_ITALIC ); break; //VT100
|
||||
case TY_CSI_PS('m', 4) : _currentScreen-> setRendition (RE_UNDERLINE); break; //VT100
|
||||
case TY_CSI_PS('m', 5) : _currentScreen-> setRendition (RE_BLINK ); break; //VT100
|
||||
case TY_CSI_PS('m', 7) : _currentScreen-> setRendition (RE_REVERSE ); break;
|
||||
@ -559,6 +578,7 @@ void Vt102Emulation::processToken(int token, int p, int q)
|
||||
case TY_CSI_PS('m', 11) : /* IGNORED: mapping related */ break; //LINUX
|
||||
case TY_CSI_PS('m', 12) : /* IGNORED: mapping related */ break; //LINUX
|
||||
case TY_CSI_PS('m', 22) : _currentScreen->resetRendition (RE_BOLD ); break;
|
||||
//case TY_CSI_PS('m', 23) : _currentScreen->resetRendition (RE_ITALIC ); break; //VT100
|
||||
case TY_CSI_PS('m', 24) : _currentScreen->resetRendition (RE_UNDERLINE); break;
|
||||
case TY_CSI_PS('m', 25) : _currentScreen->resetRendition (RE_BLINK ); break;
|
||||
case TY_CSI_PS('m', 27) : _currentScreen->resetRendition (RE_REVERSE ); break;
|
||||
@ -622,6 +642,8 @@ void Vt102Emulation::processToken(int token, int p, int q)
|
||||
case TY_CSI_PN('B' ) : _currentScreen->cursorDown (p ); break; //VT100
|
||||
case TY_CSI_PN('C' ) : _currentScreen->cursorRight (p ); break; //VT100
|
||||
case TY_CSI_PN('D' ) : _currentScreen->cursorLeft (p ); break; //VT100
|
||||
case TY_CSI_PN('E' ) : /* Not implemented: cursor next p lines */ break; //VT100
|
||||
case TY_CSI_PN('F' ) : /* Not implemented: cursor preceding p lines */ break; //VT100
|
||||
case TY_CSI_PN('G' ) : _currentScreen->setCursorX (p ); break; //LINUX
|
||||
case TY_CSI_PN('H' ) : _currentScreen->setCursorYX (p, q); break; //VT100
|
||||
case TY_CSI_PN('I' ) : _currentScreen->tab (p ); break;
|
||||
@ -736,6 +758,21 @@ void Vt102Emulation::processToken(int token, int p, int q)
|
||||
case TY_CSI_PR('s', 1003) : saveMode (MODE_Mouse1003); break; //XTERM
|
||||
case TY_CSI_PR('r', 1003) : restoreMode (MODE_Mouse1003); break; //XTERM
|
||||
|
||||
case TY_CSI_PR('h', 1005) : setMode (MODE_Mouse1005); break; //XTERM
|
||||
case TY_CSI_PR('l', 1005) : resetMode (MODE_Mouse1005); break; //XTERM
|
||||
case TY_CSI_PR('s', 1005) : saveMode (MODE_Mouse1005); break; //XTERM
|
||||
case TY_CSI_PR('r', 1005) : restoreMode (MODE_Mouse1005); break; //XTERM
|
||||
|
||||
case TY_CSI_PR('h', 1006) : setMode (MODE_Mouse1006); break; //XTERM
|
||||
case TY_CSI_PR('l', 1006) : resetMode (MODE_Mouse1006); break; //XTERM
|
||||
case TY_CSI_PR('s', 1006) : saveMode (MODE_Mouse1006); break; //XTERM
|
||||
case TY_CSI_PR('r', 1006) : restoreMode (MODE_Mouse1006); break; //XTERM
|
||||
|
||||
case TY_CSI_PR('h', 1015) : setMode (MODE_Mouse1015); break; //URXVT
|
||||
case TY_CSI_PR('l', 1015) : resetMode (MODE_Mouse1015); break; //URXVT
|
||||
case TY_CSI_PR('s', 1015) : saveMode (MODE_Mouse1015); break; //URXVT
|
||||
case TY_CSI_PR('r', 1015) : restoreMode (MODE_Mouse1015); break; //URXVT
|
||||
|
||||
case TY_CSI_PR('h', 1034) : /* IGNORED: 8bitinput activation */ break; //XTERM
|
||||
|
||||
case TY_CSI_PR('h', 1047) : setMode (MODE_AppScreen); break; //XTERM
|
||||
@ -754,6 +791,11 @@ void Vt102Emulation::processToken(int token, int p, int q)
|
||||
case TY_CSI_PR('h', 1049) : saveCursor(); _screen[1]->clearEntireScreen(); setMode(MODE_AppScreen); break; //XTERM
|
||||
case TY_CSI_PR('l', 1049) : resetMode(MODE_AppScreen); restoreCursor(); break; //XTERM
|
||||
|
||||
case TY_CSI_PR('h', 2004) : setMode (MODE_BracketedPaste); break; //XTERM
|
||||
case TY_CSI_PR('l', 2004) : resetMode (MODE_BracketedPaste); break; //XTERM
|
||||
case TY_CSI_PR('s', 2004) : saveMode (MODE_BracketedPaste); break; //XTERM
|
||||
case TY_CSI_PR('r', 2004) : restoreMode (MODE_BracketedPaste); break; //XTERM
|
||||
|
||||
//FIXME: weird DEC reset sequence
|
||||
case TY_CSI_PE('p' ) : /* IGNORED: reset ( ) */ break;
|
||||
|
||||
@ -797,13 +839,13 @@ void Vt102Emulation::sendString(const char* s , int length)
|
||||
if ( length >= 0 )
|
||||
emit sendData(s,length);
|
||||
else
|
||||
emit sendData(s,strlen(s));
|
||||
emit sendData(s,qstrlen(s));
|
||||
}
|
||||
|
||||
void Vt102Emulation::reportCursorPosition()
|
||||
{
|
||||
char tmp[20];
|
||||
sprintf(tmp,"\033[%d;%dR",_currentScreen->getCursorY()+1,_currentScreen->getCursorX()+1);
|
||||
snprintf(tmp, sizeof(tmp), "\033[%d;%dR", _currentScreen->getCursorY()+1, _currentScreen->getCursorX()+1);
|
||||
sendString(tmp);
|
||||
}
|
||||
|
||||
@ -822,7 +864,7 @@ void Vt102Emulation::reportTerminalType()
|
||||
|
||||
void Vt102Emulation::reportSecondaryAttributes()
|
||||
{
|
||||
// Seconday device attribute response (Request was: ^[[>0c or ^[[>c)
|
||||
// Secondary device attribute response (Request was: ^[[>0c or ^[[>c)
|
||||
if (getMode(MODE_Ansi))
|
||||
sendString("\033[>0;115;0c"); // Why 115? ;)
|
||||
else
|
||||
@ -830,11 +872,24 @@ void Vt102Emulation::reportSecondaryAttributes()
|
||||
// konsoles backward compatibility.
|
||||
}
|
||||
|
||||
/* DECREPTPARM – Report Terminal Parameters
|
||||
ESC [ <sol>; <par>; <nbits>; <xspeed>; <rspeed>; <clkmul>; <flags> x
|
||||
|
||||
http://vt100.net/docs/vt100-ug/chapter3.html
|
||||
*/
|
||||
void Vt102Emulation::reportTerminalParms(int p)
|
||||
// DECREPTPARM
|
||||
{
|
||||
char tmp[100];
|
||||
sprintf(tmp,"\033[%d;1;1;112;112;1;0x",p); // not really true.
|
||||
/*
|
||||
sol=1: This message is a request; report in response to a request.
|
||||
par=1: No parity set
|
||||
nbits=1: 8 bits per character
|
||||
xspeed=112: 9600
|
||||
rspeed=112: 9600
|
||||
clkmul=1: The bit rate multiplier is 16.
|
||||
flags=0: None
|
||||
*/
|
||||
snprintf(tmp, sizeof(tmp), "\033[%d;1;1;112;112;1;0x", p); // not really true.
|
||||
sendString(tmp);
|
||||
}
|
||||
|
||||
@ -853,12 +908,12 @@ void Vt102Emulation::reportAnswerBack()
|
||||
|
||||
/*!
|
||||
`cx',`cy' are 1-based.
|
||||
`eventType' indicates the button pressed (0-2)
|
||||
or a general mouse release (3).
|
||||
`cb' indicates the button pressed or released (0-2) or scroll event (4-5).
|
||||
|
||||
eventType represents the kind of mouse action that occurred:
|
||||
0 = Mouse button press or release
|
||||
0 = Mouse button press
|
||||
1 = Mouse drag
|
||||
2 = Mouse button release
|
||||
*/
|
||||
|
||||
void Vt102Emulation::sendMouseEvent(int cb, int cx, int cy , int eventType)
|
||||
@ -866,6 +921,11 @@ void Vt102Emulation::sendMouseEvent( int cb, int cx, int cy , int eventType )
|
||||
if (cx < 1 || cy < 1)
|
||||
return;
|
||||
|
||||
// With the exception of the 1006 mode, button release is encoded in cb.
|
||||
// Note that if multiple extensions are enabled, the 1006 is used, so it's okay to check for only that.
|
||||
if (eventType == 2 && !getMode(MODE_Mouse1006))
|
||||
cb = 3;
|
||||
|
||||
// normal buttons are passed as 0x20 + button,
|
||||
// mouse wheel (buttons 4,5) as 0x5c + button
|
||||
if (cb >= 4)
|
||||
@ -875,15 +935,35 @@ void Vt102Emulation::sendMouseEvent( int cb, int cx, int cy , int eventType )
|
||||
if ((getMode(MODE_Mouse1002) || getMode(MODE_Mouse1003)) && eventType == 1)
|
||||
cb += 0x20; //add 32 to signify motion event
|
||||
|
||||
char command[20];
|
||||
sprintf(command,"\033[M%c%c%c",cb+0x20,cx+0x20,cy+0x20);
|
||||
char command[32];
|
||||
command[0] = '\0';
|
||||
// Check the extensions in decreasing order of preference. Encoding the release event above assumes that 1006 comes first.
|
||||
if (getMode(MODE_Mouse1006)) {
|
||||
snprintf(command, sizeof(command), "\033[<%d;%d;%d%c", cb, cx, cy, eventType == 2 ? 'm' : 'M');
|
||||
} else if (getMode(MODE_Mouse1015)) {
|
||||
snprintf(command, sizeof(command), "\033[%d;%d;%dM", cb + 0x20, cx, cy);
|
||||
} else if (getMode(MODE_Mouse1005)) {
|
||||
if (cx <= 2015 && cy <= 2015) {
|
||||
// The xterm extension uses UTF-8 (up to 2 bytes) to encode
|
||||
// coordinate+32, no matter what the locale is. We could easily
|
||||
// convert manually, but QString can also do it for us.
|
||||
QChar coords[2];
|
||||
coords[0] = cx + 0x20;
|
||||
coords[1] = cy + 0x20;
|
||||
QString coordsStr = QString(coords, 2);
|
||||
QByteArray utf8 = coordsStr.toUtf8();
|
||||
snprintf(command, sizeof(command), "\033[M%c%s", cb + 0x20, (const char *)utf8);
|
||||
}
|
||||
} else if (cx <= 223 && cy <= 223) {
|
||||
snprintf(command, sizeof(command), "\033[M%c%c%c", cb + 0x20, cx + 0x20, cy + 0x20);
|
||||
}
|
||||
|
||||
sendString(command);
|
||||
}
|
||||
|
||||
void Vt102Emulation::sendText(const QString& text)
|
||||
{
|
||||
if (!text.isEmpty())
|
||||
{
|
||||
if (!text.isEmpty()) {
|
||||
QKeyEvent event(QEvent::KeyPress,
|
||||
0,
|
||||
Qt::NoModifier,
|
||||
@ -893,7 +973,7 @@ void Vt102Emulation::sendText( const QString& text )
|
||||
}
|
||||
void Vt102Emulation::sendKeyEvent(QKeyEvent* event)
|
||||
{
|
||||
Qt::KeyboardModifiers modifiers = event->modifiers();
|
||||
const Qt::KeyboardModifiers modifiers = event->modifiers();
|
||||
KeyboardTranslator::States states = KeyboardTranslator::NoState;
|
||||
|
||||
// get current states
|
||||
@ -905,17 +985,20 @@ void Vt102Emulation::sendKeyEvent( QKeyEvent* event )
|
||||
states |= KeyboardTranslator::ApplicationKeypadState;
|
||||
|
||||
// check flow control state
|
||||
if (modifiers & Qt::ControlModifier)
|
||||
{
|
||||
if (event->key() == Qt::Key_S)
|
||||
if (modifiers & Qt::ControlModifier) {
|
||||
switch (event->key()) {
|
||||
case Qt::Key_S:
|
||||
emit flowControlKeyPressed(true);
|
||||
else if (event->key() == Qt::Key_Q)
|
||||
break;
|
||||
case Qt::Key_Q:
|
||||
case Qt::Key_C: // cancel flow control
|
||||
emit flowControlKeyPressed(false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// look up key binding
|
||||
if ( _keyTranslator )
|
||||
{
|
||||
if (_keyTranslator) {
|
||||
KeyboardTranslator::Entry entry = _keyTranslator->findEntry(
|
||||
event->key() ,
|
||||
modifiers,
|
||||
@ -928,8 +1011,9 @@ void Vt102Emulation::sendKeyEvent( QKeyEvent* event )
|
||||
// Alt+[Character] results in Esc+[Character] being sent
|
||||
// (unless there is an entry defined for this particular combination
|
||||
// in the keyboard modifier)
|
||||
bool wantsAltModifier = entry.modifiers() & entry.modifierMask() & Qt::AltModifier;
|
||||
bool wantsAnyModifier = entry.state() &
|
||||
const bool wantsAltModifier = entry.modifiers() & entry.modifierMask() & Qt::AltModifier;
|
||||
const bool wantsMetaModifier = entry.modifiers() & entry.modifierMask() & Qt::MetaModifier;
|
||||
const bool wantsAnyModifier = entry.state() &
|
||||
entry.stateMask() & KeyboardTranslator::AnyModifierState;
|
||||
|
||||
if ( modifiers & Qt::AltModifier && !(wantsAltModifier || wantsAnyModifier)
|
||||
@ -937,13 +1021,18 @@ void Vt102Emulation::sendKeyEvent( QKeyEvent* event )
|
||||
{
|
||||
textToSend.prepend("\033");
|
||||
}
|
||||
if ( modifiers & Qt::MetaModifier && !(wantsMetaModifier || wantsAnyModifier)
|
||||
&& !event->text().isEmpty() )
|
||||
{
|
||||
textToSend.prepend("\030@s");
|
||||
}
|
||||
|
||||
if ( entry.command() != KeyboardTranslator::NoCommand )
|
||||
{
|
||||
KTerminalDisplay * currentView = _currentScreen->currentTerminalDisplay();
|
||||
if (entry.command() & KeyboardTranslator::EraseCommand)
|
||||
if (entry.command() & KeyboardTranslator::EraseCommand) {
|
||||
textToSend += eraseChar();
|
||||
else if (entry.command() & KeyboardTranslator::ScrollPageUpCommand)
|
||||
} else if (entry.command() & KeyboardTranslator::ScrollPageUpCommand)
|
||||
currentView->scrollScreenWindow(ScreenWindow::ScrollPages, -1);
|
||||
else if (entry.command() & KeyboardTranslator::ScrollPageDownCommand)
|
||||
currentView->scrollScreenWindow(ScreenWindow::ScrollPages, 1);
|
||||
@ -951,8 +1040,11 @@ void Vt102Emulation::sendKeyEvent( QKeyEvent* event )
|
||||
currentView->scrollScreenWindow(ScreenWindow::ScrollLines, -1);
|
||||
else if (entry.command() & KeyboardTranslator::ScrollLineDownCommand)
|
||||
currentView->scrollScreenWindow(ScreenWindow::ScrollLines, 1);
|
||||
|
||||
// TODO command handling
|
||||
// else if (entry.command() & KeyboardTranslator::ScrollUpToTopCommand)
|
||||
// currentView->scrollScreenWindow(ScreenWindow::ScrollLines,
|
||||
// - currentView->screenWindow()->currentLine());
|
||||
// else if (entry.command() & KeyboardTranslator::ScrollDownToBottomCommand)
|
||||
// currentView->scrollScreenWindow(ScreenWindow::ScrollLines, lineCount());
|
||||
}
|
||||
else if (!entry.text().isEmpty())
|
||||
{
|
||||
@ -967,12 +1059,12 @@ void Vt102Emulation::sendKeyEvent( QKeyEvent* event )
|
||||
{
|
||||
// print an error message to the terminal if no key translator has been
|
||||
// set
|
||||
QString translatorError = tr("No keyboard translator available. "
|
||||
"The information needed to convert key presses "
|
||||
"into characters to send to the terminal "
|
||||
"is missing.");
|
||||
// QString translatorError = i18n("No keyboard translator available. "
|
||||
// "The information needed to convert key presses "
|
||||
// "into characters to send to the terminal "
|
||||
// "is missing.");
|
||||
reset();
|
||||
receiveData( translatorError.toLatin1().constData() , translatorError.count() );
|
||||
// receiveData(translatorError.toAscii().constData(), translatorError.count());
|
||||
}
|
||||
}
|
||||
|
||||
@ -1022,7 +1114,7 @@ unsigned short Vt102Emulation::applyCharset(unsigned short c)
|
||||
void Vt102Emulation::resetCharset(int scrno)
|
||||
{
|
||||
_charset[scrno].cu_cs = 0;
|
||||
strncpy(_charset[scrno].charset,"BBBB",4);
|
||||
qstrncpy(_charset[scrno].charset, "BBBB", 4);
|
||||
_charset[scrno].sa_graphic = false;
|
||||
_charset[scrno].sa_pound = false;
|
||||
_charset[scrno].graphic = false;
|
||||
@ -1100,13 +1192,17 @@ void Vt102Emulation::restoreCursor()
|
||||
void Vt102Emulation::resetModes()
|
||||
{
|
||||
// MODE_Allow132Columns is not reset here
|
||||
// to match Xterm's behaviour (see Xterm's VTReset() function)
|
||||
// to match Xterm's behavior (see Xterm's VTReset() function)
|
||||
|
||||
resetMode(MODE_132Columns); saveMode(MODE_132Columns);
|
||||
resetMode(MODE_Mouse1000); saveMode(MODE_Mouse1000);
|
||||
resetMode(MODE_Mouse1001); saveMode(MODE_Mouse1001);
|
||||
resetMode(MODE_Mouse1002); saveMode(MODE_Mouse1002);
|
||||
resetMode(MODE_Mouse1003); saveMode(MODE_Mouse1003);
|
||||
resetMode(MODE_Mouse1005); saveMode(MODE_Mouse1005);
|
||||
resetMode(MODE_Mouse1006); saveMode(MODE_Mouse1006);
|
||||
resetMode(MODE_Mouse1015); saveMode(MODE_Mouse1015);
|
||||
resetMode(MODE_BracketedPaste); saveMode(MODE_BracketedPaste);
|
||||
|
||||
resetMode(MODE_AppScreen); saveMode(MODE_AppScreen);
|
||||
resetMode(MODE_AppCuKeys); saveMode(MODE_AppCuKeys);
|
||||
@ -1118,8 +1214,7 @@ void Vt102Emulation::resetModes()
|
||||
void Vt102Emulation::setMode(int m)
|
||||
{
|
||||
_currentModes.mode[m] = true;
|
||||
switch (m)
|
||||
{
|
||||
switch (m) {
|
||||
case MODE_132Columns:
|
||||
if (getMode(MODE_Allow132Columns))
|
||||
clearScreenAndSetColumns(132);
|
||||
@ -1133,12 +1228,18 @@ void Vt102Emulation::setMode(int m)
|
||||
emit programUsesMouseChanged(false);
|
||||
break;
|
||||
|
||||
case MODE_AppScreen : _screen[1]->clearSelection();
|
||||
case MODE_BracketedPaste:
|
||||
//emit programBracketedPasteModeChanged(true);
|
||||
break;
|
||||
|
||||
case MODE_AppScreen :
|
||||
_screen[1]->clearSelection();
|
||||
setScreen(1);
|
||||
break;
|
||||
}
|
||||
if (m < MODES_SCREEN || m == MODE_NewLine)
|
||||
{
|
||||
// FIXME: Currently this has a redundant condition as MODES_SCREEN is 6
|
||||
// and MODE_NewLine is 5
|
||||
if (m < MODES_SCREEN || m == MODE_NewLine) {
|
||||
_screen[0]->setMode(m);
|
||||
_screen[1]->setMode(m);
|
||||
}
|
||||
@ -1147,8 +1248,7 @@ void Vt102Emulation::setMode(int m)
|
||||
void Vt102Emulation::resetMode(int m)
|
||||
{
|
||||
_currentModes.mode[m] = false;
|
||||
switch (m)
|
||||
{
|
||||
switch (m) {
|
||||
case MODE_132Columns:
|
||||
if (getMode(MODE_Allow132Columns))
|
||||
clearScreenAndSetColumns(80);
|
||||
@ -1160,13 +1260,18 @@ void Vt102Emulation::resetMode(int m)
|
||||
emit programUsesMouseChanged(true);
|
||||
break;
|
||||
|
||||
case MODE_BracketedPaste:
|
||||
//emit programBracketedPasteModeChanged(false);
|
||||
break;
|
||||
|
||||
case MODE_AppScreen :
|
||||
_screen[0]->clearSelection();
|
||||
setScreen(0);
|
||||
break;
|
||||
}
|
||||
if (m < MODES_SCREEN || m == MODE_NewLine)
|
||||
{
|
||||
// FIXME: Currently this has a redundant condition as MODES_SCREEN is 6
|
||||
// and MODE_NewLine is 5
|
||||
if (m < MODES_SCREEN || m == MODE_NewLine) {
|
||||
_screen[0]->resetMode(m);
|
||||
_screen[1]->resetMode(m);
|
||||
}
|
||||
@ -1202,29 +1307,53 @@ char Vt102Emulation::eraseChar() const
|
||||
return '\b';
|
||||
}
|
||||
|
||||
#if 0
|
||||
// print contents of the scan buffer
|
||||
static void hexdump(int* s, int len)
|
||||
{ int i;
|
||||
for (i = 0; i < len; i++)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < len; i++) {
|
||||
if (s[i] == '\\')
|
||||
printf("\\\\");
|
||||
else
|
||||
if ((s[i]) > 32 && s[i] < 127)
|
||||
else if ((s[i]) > 32 && s[i] < 127)
|
||||
printf("%c", s[i]);
|
||||
else
|
||||
printf("\\%04x(hex)", s[i]);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
// return contents of the scan buffer
|
||||
static QString hexdump2(int* s, int len)
|
||||
{
|
||||
int i;
|
||||
char dump[128];
|
||||
QString returnDump;
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
if (s[i] == '\\')
|
||||
snprintf(dump, sizeof(dump), "%s", "\\\\");
|
||||
else if ((s[i]) > 32 && s[i] < 127)
|
||||
snprintf(dump, sizeof(dump), "%c", s[i]);
|
||||
else
|
||||
snprintf(dump, sizeof(dump), "\\%04x(hex)", s[i]);
|
||||
returnDump.append(QString(dump));
|
||||
}
|
||||
return returnDump;
|
||||
}
|
||||
|
||||
void Vt102Emulation::reportDecodingError()
|
||||
{
|
||||
if (tokenBufferPos == 0 || (tokenBufferPos == 1 && (tokenBuffer[0] & 0xff) >= 32))
|
||||
return;
|
||||
printf("Undecodable sequence: ");
|
||||
hexdump(tokenBuffer,tokenBufferPos);
|
||||
printf("\n");
|
||||
|
||||
// printf("Undecodable sequence: ");
|
||||
// hexdump(tokenBuffer, tokenBufferPos);
|
||||
// printf("\n");
|
||||
|
||||
QString outputError = QString("Undecodable sequence: ");
|
||||
outputError.append(hexdump2(tokenBuffer, tokenBufferPos));
|
||||
//kDebug() << outputError;
|
||||
}
|
||||
|
||||
//#include "Vt102Emulation.moc"
|
||||
|
||||
|
@ -23,19 +23,16 @@
|
||||
#ifndef VT102EMULATION_H
|
||||
#define VT102EMULATION_H
|
||||
|
||||
// Standard Library
|
||||
#include <stdio.h>
|
||||
|
||||
// Qt
|
||||
#include <QtGui/QKeyEvent>
|
||||
#include <QtCore/QHash>
|
||||
#include <QtCore/QTimer>
|
||||
|
||||
// Konsole
|
||||
#include "Emulation.h"
|
||||
#include "Screen.h"
|
||||
#include "ScreenWindow.h"
|
||||
#include "TerminalDisplay.h"
|
||||
|
||||
class QTimer;
|
||||
class QKeyEvent;
|
||||
|
||||
#define MODE_AppScreen (MODES_SCREEN+0) // Mode #1
|
||||
#define MODE_AppCuKeys (MODES_SCREEN+1) // Application cursor keys (DECCKM)
|
||||
@ -44,14 +41,20 @@
|
||||
#define MODE_Mouse1001 (MODES_SCREEN+4) // Use Hilight mouse tracking
|
||||
#define MODE_Mouse1002 (MODES_SCREEN+5) // Use cell motion mouse tracking
|
||||
#define MODE_Mouse1003 (MODES_SCREEN+6) // Use all motion mouse tracking
|
||||
#define MODE_Ansi (MODES_SCREEN+7) // Use US Ascii for character sets G0-G3 (DECANM)
|
||||
#define MODE_132Columns (MODES_SCREEN+8) // 80 <-> 132 column mode switch (DECCOLM)
|
||||
#define MODE_Allow132Columns (MODES_SCREEN+9) // Allow DECCOLM mode
|
||||
#define MODE_total (MODES_SCREEN+10)
|
||||
#define MODE_Mouse1005 (MODES_SCREEN+7) // Xterm-style extended coordinates
|
||||
#define MODE_Mouse1006 (MODES_SCREEN+8) // 2nd Xterm-style extended coordinates
|
||||
#define MODE_Mouse1015 (MODES_SCREEN+9) // Urxvt-style extended coordinates
|
||||
#define MODE_Ansi (MODES_SCREEN+10) // Use US Ascii for character sets G0-G3 (DECANM)
|
||||
#define MODE_132Columns (MODES_SCREEN+11) // 80 <-> 132 column mode switch (DECCOLM)
|
||||
#define MODE_Allow132Columns (MODES_SCREEN+12) // Allow DECCOLM mode
|
||||
#define MODE_BracketedPaste (MODES_SCREEN+13) // Xterm-style bracketed paste mode
|
||||
#define MODE_total (MODES_SCREEN+14)
|
||||
|
||||
|
||||
struct CharCodes
|
||||
namespace Konsole
|
||||
{
|
||||
extern unsigned short vt100_graphics[32];
|
||||
|
||||
struct CharCodes {
|
||||
// coding info
|
||||
char charset[4]; //
|
||||
int cu_cs; // actual charset.
|
||||
@ -127,7 +130,7 @@ private:
|
||||
void resetModes();
|
||||
|
||||
void resetTokenizer();
|
||||
#define MAX_TOKEN_LENGTH 80
|
||||
#define MAX_TOKEN_LENGTH 256 // Max length of tokens (e.g. window title)
|
||||
void addToCurrentToken(int cc);
|
||||
int tokenBuffer[MAX_TOKEN_LENGTH]; //FIXME: overflow?
|
||||
int tokenBufferPos;
|
||||
@ -155,9 +158,6 @@ private:
|
||||
void reportCursorPosition();
|
||||
void reportTerminalParms(int p);
|
||||
|
||||
void onScrollLock();
|
||||
void scrollLock(const bool lock);
|
||||
|
||||
// clears the screen and resizes it to the specified
|
||||
// number of columns
|
||||
void clearScreenAndSetColumns(int columnCount);
|
||||
@ -168,8 +168,9 @@ private:
|
||||
{
|
||||
public:
|
||||
// Initializes all modes to false
|
||||
TerminalState()
|
||||
{ memset(&mode,false,MODE_total * sizeof(bool)); }
|
||||
TerminalState() {
|
||||
memset(&mode, false, MODE_total * sizeof(bool));
|
||||
}
|
||||
|
||||
bool mode[MODE_total];
|
||||
};
|
||||
@ -185,6 +186,6 @@ private:
|
||||
QHash<int, QString> _pendingTitleUpdates;
|
||||
QTimer* _titleUpdateTimer;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // VT102EMULATION_H
|
||||
|
Loading…
x
Reference in New Issue
Block a user