32 files changed, 144 insertions, 3435 deletions
diff --git a/noncore/apps/opie-console/MyPty.cpp b/noncore/apps/opie-console/MyPty.cpp index 315ea4a..27ba9ff 100644 --- a/noncore/apps/opie-console/MyPty.cpp +++ b/noncore/apps/opie-console/MyPty.cpp @@ -61,20 +61,16 @@ There's a sinister ioctl(2), signal(2) and job control stuff nessesary to make everything work as it should. */ #include "procctl.h" #include "MyPty.h" -/* OPIE */ -#include <opie2/odebug.h> -using namespace Opie::Core; - /* QT */ #include <qsocketnotifier.h> #include <qfile.h> /* STD */ #include <stdlib.h> #include <stdio.h> #include <signal.h> @@ -97,17 +93,16 @@ using namespace Opie::Core; /*! Informs the client program about the actual size of the window. */ void MyPty::setSize(int lines, int columns) { - owarn << "setting size" << oendl; struct winsize wsize; wsize.ws_row = (unsigned short)lines; wsize.ws_col = (unsigned short)columns; if(m_fd < 0) return; ioctl(m_fd,TIOCSWINSZ,(char *)&wsize); } diff --git a/noncore/apps/opie-console/TEWidget.cpp b/noncore/apps/opie-console/TEWidget.cpp index d168a5e..98c1793 100644 --- a/noncore/apps/opie-console/TEWidget.cpp +++ b/noncore/apps/opie-console/TEWidget.cpp @@ -1024,17 +1024,16 @@ bool TEWidget::eventFilter( QObject *obj, QEvent *e ) return FALSE; // not us if ( e->type() == QEvent::Wheel) { QApplication::sendEvent(scrollbar, e); } #ifdef FAKE_CTRL_AND_ALT static bool control = FALSE; static bool alt = FALSE; -// odebug << " Has a keyboard with no CTRL and ALT keys, but we fake it:" << oendl; bool dele=FALSE; if ( e->type() == QEvent::KeyPress || e->type() == QEvent::KeyRelease ) { QKeyEvent* ke = (QKeyEvent*)e; bool keydown = e->type() == QEvent::KeyPress || ke->isAutoRepeat(); switch (ke->key()) { case Key_F9: // let this be "Control" control = keydown; e = new QKeyEvent(QEvent::KeyPress, Key_Control, 0, ke->state()); @@ -1063,21 +1062,18 @@ bool TEWidget::eventFilter( QObject *obj, QEvent *e ) } #endif if ( e->type() == QEvent::KeyPress ) { QKeyEvent* ke = (QKeyEvent*)e; actSel=0; // Key stroke implies a screen update, so TEWidget won't // know where the current selection is. -// odebug << "key pressed is 0x" << ke->key() << "" << oendl; if( ke->state() == ShiftButton && ke->key() == Key_Tab) { //lets hardcode this sucker - -// odebug << "key pressed 2 is 0x" << ke->key() << "" << oendl; emitText("\\"); // expose } else emit keyPressedSignal(ke); // expose ke->accept(); #ifdef FAKE_CTRL_AND_ALT if ( dele ) delete e; #endif return true; // stop the event diff --git a/noncore/apps/opie-console/TEmulation.cpp b/noncore/apps/opie-console/TEmulation.cpp index 6ff73af..72cce75 100644 --- a/noncore/apps/opie-console/TEmulation.cpp +++ b/noncore/apps/opie-console/TEmulation.cpp @@ -66,20 +66,16 @@ */ /* FIXME - evtl. the bulk operations could be made more transparent. */ #include "TEmulation.h" -/* OPIE */ -#include <opie2/odebug.h> -using namespace Opie::Core; - /* STD */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> /* ------------------------------------------------------------------------- */ /* */ @@ -205,17 +201,16 @@ void TEmulation::onRcvChar(int c) /* */ /* ------------------------------------------------------------------------- */ /*! */ void TEmulation::onKeyPress( QKeyEvent* ev ) { - owarn << "onKeyPress,...." << oendl; if (!connected) return; // someone else gets the keys if (scr->getHistCursor() != scr->getHistLines()); scr->setHistCursor(scr->getHistLines()); if (!ev->text().isEmpty()) { // A block of text // Note that the text is proper unicode. // We should do a conversion here, but since this // routine will never be used, we simply emit plain ascii. diff --git a/noncore/apps/opie-console/atconfigdialog.cpp b/noncore/apps/opie-console/atconfigdialog.cpp index c998f96..f958b52 100644 --- a/noncore/apps/opie-console/atconfigdialog.cpp +++ b/noncore/apps/opie-console/atconfigdialog.cpp @@ -1,15 +1,11 @@ #include "atconfigdialog.h" #include "io_modem.h" -/* OPIE */ -#include <opie2/odebug.h> -using namespace Opie::Core; - /* QT */ #include <qlineedit.h> #include <qspinbox.h> #include <qlayout.h> #include <qcombobox.h> #include <qtabwidget.h> #include <qlabel.h> #include <qscrollview.h> @@ -150,18 +146,16 @@ QWidget* ATConfigDialog::tab1( QWidget* parent ) { multiLineUntagBox->insertItem( tr("Yes") ); return returnWidget; } void ATConfigDialog::readConfig( const Profile& config ) { - owarn << "config in atconfigdialog" << oendl; - initStringLine->setText( config.readEntry("InitString", MODEM_DEFAULT_INIT_STRING ) ); resetStringLine->setText( config.readEntry("ResetString", MODEM_DEFAULT_RESET_STRING ) ); dialPref1Line->setText( config.readEntry("DialPrefix1", MODEM_DEFAULT_DIAL_PREFIX1 ) ); dialSuf1Line->setText( config.readEntry("DialSuffix1", MODEM_DEFAULT_DIAL_SUFFIX1 ) ); dialPref2Line->setText( config.readEntry("DialPrefix2", MODEM_DEFAULT_DIAL_PREFIX1 ) ); dialSuf2Line->setText( config.readEntry("DialSuffix2", MODEM_DEFAULT_DIAL_SUFFIX1 ) ); dialPref3Line->setText( config.readEntry("DialPrefix3", MODEM_DEFAULT_DIAL_PREFIX1 ) ); dialSuf3Line->setText( config.readEntry("DialSuffix3", MODEM_DEFAULT_DIAL_SUFFIX1 ) ); diff --git a/noncore/apps/opie-console/btconfigwidget.cpp b/noncore/apps/opie-console/btconfigwidget.cpp index 232e497..f2ed558 100644 --- a/noncore/apps/opie-console/btconfigwidget.cpp +++ b/noncore/apps/opie-console/btconfigwidget.cpp @@ -1,31 +1,21 @@ +#include "btconfigwidget.h" +#include "iolayerbase.h" +#include "comboboxhelper.h" + #include <qlabel.h> #include <qlayout.h> #include <qlineedit.h> #include <qcombobox.h> #include <qhbox.h> #include <qradiobutton.h> -#include "iolayerbase.h" -#include "btconfigwidget.h" -namespace { - void setCurrent( const QString& str, QComboBox* bo ) { - uint b = bo->count(); - for (int i = 0; i < bo->count(); i++ ) { - if ( bo->text(i) == str ) { - bo->setCurrentItem( i ); - return; - } - } - bo->insertItem( str ); - bo->setCurrentItem( b ); - } -} + BTConfigWidget::BTConfigWidget( const QString& name, QWidget* parent, const char* na ) : ProfileDialogConnectionWidget( name, parent, na ) { m_lay = new QVBoxLayout( this ); @@ -110,17 +100,17 @@ void BTConfigWidget::load( const Profile& prof ) { break; case 9600: default: m_base->setSpeed(IOLayerBase::Baud_9600 ); break; } if ( prof.readEntry("Device").isEmpty() ) return; - setCurrent( prof.readEntry("Device"), m_deviceCmb ); + ComboboxHelper::setCurrent( prof.readEntry("Device"), m_deviceCmb ); } /* * save speed, * flow, * parity */ void BTConfigWidget::save( Profile& prof ) { diff --git a/noncore/apps/opie-console/comboboxhelper.cpp b/noncore/apps/opie-console/comboboxhelper.cpp new file mode 100644 index 0000000..1bfe0a7 --- a/dev/null +++ b/noncore/apps/opie-console/comboboxhelper.cpp @@ -0,0 +1,55 @@ +/* + =. This file is part of the OPIE Project + .=l. Copyright (c) 2002,2004 Holger Hans Peter Freyther <freyther@handhelds.org> + .>+-= + _;:, .> :=|. This program is free software; you can +.> <`_, > . <= redistribute it and/or modify it under +:`=1 )Y*s>-.-- : the terms of the GNU General Public +.="- .-=="i, .._ License as published by the Free Software + - . .-<_> .<> Foundation; either version 2 of the License, + ._= =} : or (at your option) any later version. + .%`+i> _;_. + .i_,=:_. -<s. This program is distributed in the hope that + + . -:. = it will be useful, but WITHOUT ANY WARRANTY; + : .. .:, . . . without even the implied warranty of + =_ + =;=|` MERCHANTABILITY or FITNESS FOR A + _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU +..}^=.= = ; General Public License for more +++= -. .` .: details. + : = ...= . :.=- + -. .:....=;==+<; You should have received a copy of the GNU + -_. . . )=. = General Public License along with + -- :-=` this library; see the file COPYING.BIN. + If not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +#include "comboboxhelper.h" + +#include <qstring.h> +#include <qcombobox.h> + +/** + * \brief Set string to be Current String inside the QCombox without duplicating it + * + * This method will make \par str the current QString. If + * the QString is already inside the QComboBox it will be + * set current. If it isn't it will be added. + * + * @param str The QString to be set current + * @param bo The QComboBox to operate on + */ +void ComboboxHelper::setCurrent( const QString& str, QComboBox* bo ) { + const uint b = bo->count(); + for (uint i = 0; i < b; i++ ) { + if ( bo->text(i) == str ) { + bo->setCurrentItem( i ); + return; + } + } + + bo->insertItem( str ); + bo->setCurrentItem( b ); +} diff --git a/noncore/apps/opie-console/comboboxhelper.h b/noncore/apps/opie-console/comboboxhelper.h new file mode 100644 index 0000000..40153bf --- a/dev/null +++ b/noncore/apps/opie-console/comboboxhelper.h @@ -0,0 +1,49 @@ +/* + =. This file is part of the OPIE Project + .=l. Copyright (c) 2002,2004 Holger Hans Peter Freyther <freyther@handhelds.org> + .>+-= + _;:, .> :=|. This program is free software; you can +.> <`_, > . <= redistribute it and/or modify it under +:`=1 )Y*s>-.-- : the terms of the GNU General Public +.="- .-=="i, .._ License as published by the Free Software + - . .-<_> .<> Foundation; either version 2 of the License, + ._= =} : or (at your option) any later version. + .%`+i> _;_. + .i_,=:_. -<s. This program is distributed in the hope that + + . -:. = it will be useful, but WITHOUT ANY WARRANTY; + : .. .:, . . . without even the implied warranty of + =_ + =;=|` MERCHANTABILITY or FITNESS FOR A + _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU +..}^=.= = ; General Public License for more +++= -. .` .: details. + : = ...= . :.=- + -. .:....=;==+<; You should have received a copy of the GNU + -_. . . )=. = General Public License along with + -- :-=` this library; see the file COPYING.BIN. + If not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ +#ifndef COMBO_BOX_HELPER_H +#define COMBO_BOX_HELPER_H + +#include <qstring.h> + + +class QComboBox; + + +/** + * \brief ComboboxHelper with a small Helper for Configuring it + * + * ComboboxHelper contains methods for helping managing + * Comboboxes with 'dynamic' data. + * All Methods related to this class are static and operate + * on a QComboBox. + */ +struct ComboboxHelper { + static void setCurrent(const QString&, QComboBox *); +}; + +#endif diff --git a/noncore/apps/opie-console/dialer.cpp b/noncore/apps/opie-console/dialer.cpp index 7010594..8883b83 100644 --- a/noncore/apps/opie-console/dialer.cpp +++ b/noncore/apps/opie-console/dialer.cpp @@ -1,15 +1,11 @@ #include "dialer.h" #include "io_modem.h" -/* OPIE */ -#include <opie2/odebug.h> -using namespace Opie::Core; - /* QT */ #include <qlayout.h> #include <qprogressbar.h> #include <qlabel.h> #include <qpushbutton.h> #include <qapp.h> #include <qtimer.h> #include <qmessagebox.h> @@ -104,17 +100,16 @@ void Dialer::slotCancel() } else { accept(); } } void Dialer::reset() { - owarn << "reset" << oendl; switchState(state_cancel); } void Dialer::slotAutostart() { //state = state_preinit; dial(m_profile.readEntry("Number")); } @@ -136,28 +131,25 @@ void Dialer::dial(const QString& number) // modem hangup trydial(QString::null); reject(); } } void Dialer::trydial(const QString& number) { - owarn << "TryDial:" << number.latin1() << "" << oendl; if(state != state_cancel) switchState(state_preinit); if(cleanshutdown) { - owarn << "HangupString " << m_profile.readEntry("HangupString") << oendl; send(m_profile.readEntry("HangupString", MODEM_DEFAULT_HANGUP_STRING ) + "\r"); } if(state != state_cancel) { switchState(state_init); -// owarn << "Init String " + m_profile.readEntry("InitString") << oendl; send(m_profile.readEntry("InitString",MODEM_DEFAULT_INIT_STRING ) + "\r"); QString response2 = receive(); if(!response2.contains("\nOK\r")) reset(); } /* if(state != state_cancel) { @@ -178,33 +170,32 @@ void Dialer::trydial(const QString& number) send("ATX1\r"); QString response4 = receive(); if(!response4.contains("\nOK\r")) reset(); } if(state != state_cancel) { - owarn << "progress" << oendl; switchState(state_dialing); // send(QString("ATDT %1\r").arg(number)); send(QString("%1 %2\r").arg(m_profile.readEntry("DialPrefix1", MODEM_DEFAULT_DIAL_PREFIX1 )) .arg(number)); QString response5 = receive(); if(!response5.contains("CONNECT") ) { if(response5.contains("BUSY")) switchState(state_dialing); else { QMessageBox::warning(this, QObject::tr("Failure"), - QObject::tr("Dialing the number failed.")); + QObject::tr("<qt>Dialing the number failed.</qt>")); slotCancel(); } } } if(state != state_cancel) { @@ -214,17 +205,16 @@ void Dialer::trydial(const QString& number) } void Dialer::send(const QString& msg) { QString m = msg; int bytes; QString termination; - owarn << "Sending: " << m.latin1() << "" << oendl; /* termination = "\r"; //termination = m_profile.readEntry("Termination"); if(termination == "\n") m = m + "\n"; else if(termination == "\r") m = m + "\r"; else m = m + "\r\n"; */ m = m.replace(QRegExp("\n"), "\r"); @@ -247,21 +237,19 @@ QString Dialer::receive() { ret = ::read(m_fd, buffer, sizeof(buffer)); if(ret > 0) { for(int i = 0; i < ret; i++) buffer[i] = buffer[i] & 0x7F; buffer[ret] = 0; - owarn << "Got: " << buffer << "" << oendl; buf.append(QString(buffer)); if(buf.contains("OK") || buf.contains("ERROR") || buf.contains("CONNECT") || (buf.contains("BUSY"))) { - //owarn << "Receiving: '" << buf.latin1() << "'" << oendl; cleanshutdown = 1; return buf; }else if (buf.contains("NO CARRIER") || buf.contains("NO DIALTONE") ) { cleanshutdown = 1; return QString::null; } } else if(ret < 0) diff --git a/noncore/apps/opie-console/emulation_handler.cpp b/noncore/apps/opie-console/emulation_handler.cpp index e045aef..986ae8d 100644 --- a/noncore/apps/opie-console/emulation_handler.cpp +++ b/noncore/apps/opie-console/emulation_handler.cpp @@ -1,22 +1,17 @@ #include "TEmuVt102.h" #include "profile.h" #include "emulation_handler.h" #include "script.h" #include "logger.h" -/* OPIE */ -#include <opie2/odebug.h> - #include <qfile.h> #include <qtextstream.h> -using namespace Opie::Core; - EmulationHandler::EmulationHandler( const Profile& prof, QWidget* parent,const char* name ) : QObject(0, name ) { m_teWid = new TEWidget( parent, "TerminalMain"); // use setWrapAt(0) for classic behaviour (wrap at screen width, no scrollbar) // use setWrapAt(80) for normal console with scrollbar setWrap(prof.readNumEntry("Wrap", 80) ? 0 : 80); m_teWid->setMinimumSize(150, 70 ); @@ -143,21 +138,19 @@ QColor EmulationHandler::foreColor(int col) { case Profile::White: /* color is black */ co = Qt::white; break; case Profile::Black: co = Qt::black; break; case Profile::Green: - owarn << "Foreground green" << oendl; co = Qt::green; break; case Profile::Orange: - owarn << "Foreground orange" << oendl; co.setRgb( 231, 184, 98 ); break; } return co; } QColor EmulationHandler::backColor(int col ) { QColor co; @@ -167,21 +160,19 @@ QColor EmulationHandler::backColor(int col ) { case Profile::White: /* color is white */ co = Qt::black; break; case Profile::Black: co = Qt::white; break; case Profile::Green: - owarn << "Background black" << oendl; co = Qt::black; break; case Profile::Orange: - owarn << "Background black" << oendl; co = Qt::black; break; } return co; } QPushButton* EmulationHandler::cornerButton() { diff --git a/noncore/apps/opie-console/emulation_widget.cpp b/noncore/apps/opie-console/emulation_widget.cpp index 4688551..f0708d0 100644 --- a/noncore/apps/opie-console/emulation_widget.cpp +++ b/noncore/apps/opie-console/emulation_widget.cpp @@ -219,20 +219,16 @@ void EmulationWidget::paintEvent( QPaintEvent* pe ) drawFrame( &painter ); painter.end(); } void EmulationWidget::calcGeometry() { m_scrollbar->resize(QApplication::style().scrollBarExtent().width(), contentsRect().height() ); - odebug << QString(" TEST").arg( contentsRect().width() ) << oendl; - odebug << QString(" TEST").arg( contentsRect().height() ) << oendl; - odebug << "NEUER TESTT!!!!!!!!" << oendl; - switch( scrollLoc ) { case SCRNONE : m_columns = ( contentsRect().width() -2 * rimX ) / f_width; m_blX = ( contentsRect().width() - ( m_columns*f_width ) ) / 2; m_brX = m_blX; m_scrollbar->hide(); break; @@ -253,31 +249,29 @@ void EmulationWidget::calcGeometry() } m_lines = ( contentsRect().height() - 2 * rimY ) / f_height; m_bY = ( contentsRect().height() - (m_lines * f_height ) ) / 2; } void EmulationWidget::drawAttrString( QString& string, QPainter &painter, QRect rect, Character attr, bool usePixmap, bool clear ) { - owarn << "Color1 " << color_table[attr.b].color.name().latin1() << "" << oendl; if ( usePixmap && color_table[attr.b].transparent ) { painter.setBackgroundMode( TransparentMode ); if ( clear ) erase( rect ); } else { if ( blinking ) painter.fillRect( rect, color_table[attr.b].color ); else { painter.setBackgroundMode( OpaqueMode ); - owarn << "Color " << color_table[attr.b].color.name().latin1() << "" << oendl; painter.setBackgroundColor( color_table[attr.b].color ); } } if ( color_table[attr.f].bold ) painter.setPen( QColor( 0x8F, 0x00, 0x00 ) ); else painter.setPen( color_table[attr.f].color ); painter.drawText( rect.x(), rect.y() + f_ascent, string ); diff --git a/noncore/apps/opie-console/function_keyboard.cpp b/noncore/apps/opie-console/function_keyboard.cpp index 6613183..0abe0d9 100644 --- a/noncore/apps/opie-console/function_keyboard.cpp +++ b/noncore/apps/opie-console/function_keyboard.cpp @@ -1,14 +1,10 @@ #include "function_keyboard.h" -/* OPIE */ -#include <opie2/odebug.h> -using namespace Opie::Core; - /* QT */ #include <qlayout.h> #include <qlistbox.h> #include <qlabel.h> #include <qdir.h> #define DEFAULT_ROWS 2 #define DEFAULT_COLS 12 @@ -37,17 +33,16 @@ FunctionKeyboard::FunctionKeyboard(QWidget *parent) : if (value_list.isEmpty()) continue; keys.insert( handle, FKey (value_list[0], value_list[1], value_list[2].toUShort(), value_list[3].toUShort()) ); } - //owarn << "loaded " << keys.count() << " keys" << oendl; */ if (keys.isEmpty()) loadDefaults(); } FunctionKeyboard::~FunctionKeyboard() {} @@ -256,54 +251,51 @@ void FunctionKeyboard::loadDefaults() { } /* FunctionKeyboardConfig {{{1 */ FunctionKeyboardConfig::FunctionKeyboardConfig(const QString& name, QWidget* parent, const char* na ) : ProfileDialogKeyWidget(name, parent, na), selectedRow(0), selectedCol(0) { - owarn << "FunctionKeyboardConfig" << oendl; - - kb = new FunctionKeyboard(this); connect (kb, SIGNAL(keyPressed(FKey,ushort,ushort,bool)), this, SLOT(slotKeyPressed(FKey,ushort,ushort,bool))); QGroupBox *dimentions = new QGroupBox(2, Qt::Horizontal, tr("Dimensions"), this); - QLabel *l = new QLabel("Rows", dimentions); + QLabel *l = new QLabel(tr("Rows"), dimentions); m_rowBox = new QSpinBox(1, 15, 1, dimentions); connect (m_rowBox, SIGNAL(valueChanged(int)), this, SLOT(slotChangeRows(int))); - l = new QLabel("Columns", dimentions); + l = new QLabel(tr("Columns"), dimentions); m_colBox = new QSpinBox(1, 15, 1, dimentions); connect (m_colBox, SIGNAL(valueChanged(int)), this, SLOT(slotChangeCols(int))); QGroupBox *editKey = new QGroupBox(2, Qt::Horizontal, tr("Edit Key"), this); - l = new QLabel("Label", editKey); + l = new QLabel(tr("Label"), editKey); m_labels = new QComboBox(true, editKey); m_labels->setInsertionPolicy(QComboBox::AtCurrent); m_labels->insertItem(""); QStringList files = QDir( QPEApplication::qpeDir() + "pics/console/keys/", "*.png").entryList(); for (uint i = 0; i < files.count(); i++) { m_labels->insertItem( Resource::loadPixmap("console/keys/" + files[i]), files[i]); } connect (m_labels, SIGNAL(activated(int)), this, SLOT(slotChangeIcon(int))); connect (m_labels, SIGNAL(textChanged(const QString&)), this, SLOT(slotChangeLabelText(const QString&))); - l = new QLabel("Q Keycode", editKey); + l = new QLabel(tr("Q Keycode", "Qt Key Code for the OnScreen Keyboard"), editKey); m_qvalues = new QComboBox(true, editKey); m_qvalues->setInsertionPolicy(QComboBox::AtTop); m_qvalues->setDuplicatesEnabled(false); m_qvalues->insertItem(""); connect (m_qvalues, SIGNAL(textChanged(const QString&)), this, SLOT(slotChangeQCode(const QString&))); - l = new QLabel("Unicode Value", editKey); + l = new QLabel(tr("Unicode Value", "The Unicode value of the key"), editKey); m_uniValues = new QComboBox(true, editKey); m_uniValues->setInsertionPolicy(QComboBox::AtTop); m_uniValues->setDuplicatesEnabled(false); m_uniValues->insertItem(""); connect (m_uniValues, SIGNAL(textChanged(const QString&)), this, SLOT(slotChangeUnicode(const QString&))); QVBoxLayout *root = new QVBoxLayout(this, 2); root->addWidget(kb); diff --git a/noncore/apps/opie-console/io_bt.cpp b/noncore/apps/opie-console/io_bt.cpp index c102427..a06b0c4 100644 --- a/noncore/apps/opie-console/io_bt.cpp +++ b/noncore/apps/opie-console/io_bt.cpp @@ -1,15 +1,11 @@ #include "io_bt.h" -/* OPIE */ -#include <opie2/odebug.h> -using namespace Opie::Core; - IOBt::IOBt( const Profile &config ) : IOSerial( config ) { m_attach = 0; } IOBt::~IOBt() { if ( m_attach ) { delete m_attach; @@ -30,28 +26,27 @@ void IOBt::close() { bool IOBt::open() { bool ret = false; // only set up bt stuff if mac address was set, otherwise use the device set if ( !m_mac.isEmpty() ) { // now it should also be checked, if there is a connection to the device with that mac allready // hciattach here - m_attach = new OProcess(); + m_attach = new Opie::Core::OProcess(); *m_attach << "hciattach /dev/ttyS2 any 57600"; // then start hcid, then rcfomm handling (m_mac) connect( m_attach, SIGNAL( processExited(Opie::Core::OProcess*) ), this, SLOT( slotExited(Opie::Core::OProcess*) ) ); if ( m_attach->start() ) { ret = IOSerial::open(); } else { - owarn << "could not attach to device" << oendl; delete m_attach; m_attach = 0; } } else { // directly to the normal serial // TODO: look first if the connection really exists. ( is set up ) ret =IOSerial::open(); @@ -73,24 +68,12 @@ void IOBt::reload( const Profile &config ) { QString IOBt::identifier() const { return "bluetooth"; } QString IOBt::name() const { return "BLuetooth IO Layer"; } -void IOBt::slotExited( OProcess* proc ){ +void IOBt::slotExited( Opie::Core::OProcess* proc ){ close(); delete proc; } - -QBitArray IOBt::supports() const { - return QBitArray( 3 ); -} - -bool IOBt::isConnected() { - return false; -} - -void IOBt::send(const QByteArray &data) { - odebug << "Please overload me..." << oendl; -} diff --git a/noncore/apps/opie-console/io_bt.h b/noncore/apps/opie-console/io_bt.h index 00ca7e5..156632b 100644 --- a/noncore/apps/opie-console/io_bt.h +++ b/noncore/apps/opie-console/io_bt.h @@ -22,25 +22,22 @@ class IOBt : public IOSerial { public: IOBt(const Profile &); ~IOBt(); virtual QString identifier() const; virtual QString name() const; - virtual QBitArray supports() const; - virtual bool isConnected(); signals: void received(const QByteArray &); void error(int, const QString &); public slots: - virtual void send( const QByteArray& ); virtual bool open(); virtual void close(); virtual void reload(const Profile &); private: Opie::Core::OProcess *m_attach; QString m_mac; private slots: diff --git a/noncore/apps/opie-console/io_irda.cpp b/noncore/apps/opie-console/io_irda.cpp index 38542f5..9d27c85 100644 --- a/noncore/apps/opie-console/io_irda.cpp +++ b/noncore/apps/opie-console/io_irda.cpp @@ -1,14 +1,10 @@ #include "io_irda.h" -/* OPIE */ -#include <opie2/odebug.h> -using namespace Opie::Core; - IOIrda::IOIrda( const Profile &config ) : IOSerial( config ) { m_attach = 0; } IOIrda::~IOIrda() { if ( m_attach ) { delete m_attach; @@ -22,27 +18,26 @@ void IOIrda::close() { // still need error handling delete m_attach; } bool IOIrda::open() { bool ret; // irdaattach here - m_attach = new OProcess(); + m_attach = new Opie::Core::OProcess(); *m_attach << "irattach /dev/ttyS2 -s"; connect( m_attach, SIGNAL( processExited(Opie::Core::OProcess*) ), this, SLOT( slotExited(Opie::Core::OProcess*) ) ); if ( m_attach->start() ) { ret= IOSerial::open(); } else { // emit error!!! - owarn << "could not attach to device" << oendl; delete m_attach; m_attach = 0l; } return ret; } void IOIrda::reload( const Profile &config ) { m_device = config.readEntry("Device", IRDA_DEFAULT_DEVICE); @@ -57,24 +52,13 @@ void IOIrda::reload( const Profile &config ) { QString IOIrda::identifier() const { return "irda"; } QString IOIrda::name() const { return "Irda IO Layer"; } -void IOIrda::slotExited(OProcess* proc ){ +void IOIrda::slotExited(Opie::Core::OProcess* proc ){ close(); delete proc; } -QBitArray IOIrda::supports()const { - return QBitArray( 3 ); -} - -bool IOIrda::isConnected() { - return false; -} - -void IOIrda::send(const QByteArray &data) { - odebug << "Please overload me..." << oendl; -} diff --git a/noncore/apps/opie-console/io_irda.h b/noncore/apps/opie-console/io_irda.h index fb29686..1fdbd4b 100644 --- a/noncore/apps/opie-console/io_irda.h +++ b/noncore/apps/opie-console/io_irda.h @@ -20,25 +20,22 @@ class IOIrda : public IOSerial { public: IOIrda(const Profile &); ~IOIrda(); virtual QString identifier() const; virtual QString name() const; - virtual QBitArray supports() const; - virtual bool isConnected(); signals: void received(const QByteArray &); void error(int, const QString &); public slots: - virtual void send( const QByteArray& ); virtual bool open(); virtual void close(); virtual void reload(const Profile &); private: Opie::Core::OProcess *m_attach; private slots: diff --git a/noncore/apps/opie-console/io_modem.cpp b/noncore/apps/opie-console/io_modem.cpp index c499dfe..915a1d2 100644 --- a/noncore/apps/opie-console/io_modem.cpp +++ b/noncore/apps/opie-console/io_modem.cpp @@ -1,16 +1,12 @@ #include "io_modem.h" #include "dialer.h" -/* OPIE */ -#include <opie2/odebug.h> -using namespace Opie::Core; - IOModem::IOModem( const Profile &profile ) : IOSerial( profile ) { m_profile = profile; } IOModem::~IOModem() { } @@ -83,26 +79,8 @@ void IOModem::reload( const Profile &config ) { QString IOModem::identifier() const { return "modem"; } QString IOModem::name() const { return "Modem IO Layer"; } - -void IOModem::slotExited(OProcess* proc ){ - close(); - /* delete it afterwards */ - delete proc; -} - -QBitArray IOModem::supports()const { - return QBitArray( 3 ); -} - -bool IOModem::isConnected() { - return false; -} - -void IOModem::send(const QByteArray &data) { - odebug << "Please overload me..." << oendl; -} diff --git a/noncore/apps/opie-console/io_modem.h b/noncore/apps/opie-console/io_modem.h index 5b99e00..056e630 100644 --- a/noncore/apps/opie-console/io_modem.h +++ b/noncore/apps/opie-console/io_modem.h @@ -40,35 +40,28 @@ class IOModem : public IOSerial { public: IOModem(const Profile &); ~IOModem(); virtual QString identifier() const; virtual QString name() const; - virtual QBitArray supports() const; - virtual bool isConnected(); signals: void received(const QByteArray &); void error(int, const QString &); public slots: - virtual void send( const QByteArray& ); virtual bool open(); virtual void close(); virtual void reload(const Profile &); private: QString m_initString, m_resetString, m_dialPref1, m_dialSuf1, m_dialPref2, m_dialSuf2, m_dialPref3, m_dialSuf3, m_connect, m_hangup, m_cancel; int m_dialTime, m_delayRedial, m_numberTries, m_dtrDropTime, m_bpsDetect, m_dcdLines, m_multiLineUntag; Profile m_profile; - -private slots: - void slotExited(Opie::Core::OProcess* proc); - }; #endif diff --git a/noncore/apps/opie-console/mainwindow.cpp b/noncore/apps/opie-console/mainwindow.cpp index 291912c..b3cb208 100644 --- a/noncore/apps/opie-console/mainwindow.cpp +++ b/noncore/apps/opie-console/mainwindow.cpp @@ -7,20 +7,18 @@ #include "tabwidget.h" #include "transferdialog.h" #include "function_keyboard.h" #include "emulation_handler.h" #include "script.h" #include "fixit.h" /* OPIE */ -#include <opie2/odebug.h> #include <opie2/ofiledialog.h> #include <qpe/filemanager.h> -using namespace Opie::Core; using namespace Opie::Ui; /* QT */ #include <qaction.h> #include <qmenubar.h> #include <qtoolbar.h> #include <qmessagebox.h> #include <qwhatsthis.h> @@ -476,23 +474,21 @@ void MainWindow::slotConfigure() { * delete it * and set the currentSession() */ void MainWindow::slotClose() { if (!currentSession() ) return; Session* ses = currentSession(); - owarn << "removing! currentSession " << currentSession()->name().latin1() << "" << oendl; /* set to NULL to be safe, if its needed slotSessionChanged resets it automatically */ m_curSession = NULL; tabWidget()->remove( /*currentSession()*/ses ); /*it's autodelete */ m_sessions.remove( ses ); - owarn << "after remove!!" << oendl; if (!currentSession() ) { m_connect->setEnabled( false ); m_disconnect->setEnabled( false ); m_terminate->setEnabled( false ); m_transfer->setEnabled( false ); m_recordScript->setEnabled( false ); m_saveScript->setEnabled( false ); @@ -599,26 +595,23 @@ void MainWindow::slotOpenButtons( bool state ) { } else { m_buttonBar->hide(); } } void MainWindow::slotSessionChanged( Session* ses ) { - owarn << "changed!" << oendl; - if(m_curSession) if(m_curSession->transferDialog()) m_curSession->transferDialog()->hide(); if(ses) if(ses->transferDialog()) ses->transferDialog()->show(); if ( ses ) { m_curSession = ses; - odebug << QString("is connected : %1").arg( m_curSession->layer()->isConnected() ) << oendl; if ( m_curSession->layer()->isConnected() ) { m_connect->setEnabled( false ); m_disconnect->setEnabled( true ); m_recordScript->setEnabled(!m_curSession->emulationHandler()->isRecording()); m_saveScript->setEnabled(m_curSession->emulationHandler()->isRecording()); m_scripts->setItemEnabled(m_runScript_id, true); } else { m_connect->setEnabled( true ); diff --git a/noncore/apps/opie-console/modemconfigwidget.cpp b/noncore/apps/opie-console/modemconfigwidget.cpp index b2f5c68..eb4bd0d 100644 --- a/noncore/apps/opie-console/modemconfigwidget.cpp +++ b/noncore/apps/opie-console/modemconfigwidget.cpp @@ -1,36 +1,22 @@ #include "modemconfigwidget.h" #include "dialdialog.h" +#include "comboboxhelper.h" /* OPIE */ -#include <opie2/odebug.h> #include <qpe/qpeapplication.h> -using namespace Opie::Core; /* QT */ #include <qlabel.h> #include <qlayout.h> #include <qcombobox.h> #include <qpushbutton.h> #include <qhbox.h> -namespace { - void setCurrent( const QString& str, QComboBox* bo ) { - uint b = bo->count(); - for (int i = 0; i < bo->count(); i++ ) { - if ( bo->text(i) == str ) { - bo->setCurrentItem( i ); - return; - } - } - bo->insertItem( str ); - bo->setCurrentItem( b ); - } -} ModemConfigWidget::ModemConfigWidget( const QString& name, QWidget* parent, const char* na ) : ProfileDialogConnectionWidget( name, parent, na ) { m_lay = new QVBoxLayout( this ); m_device = new QLabel(tr( "Modem is attached to:" ), this ); m_deviceCmb = new QComboBox(this ); @@ -141,20 +127,19 @@ void ModemConfigWidget::load( const Profile& prof ) { m_base->setStop( IOLayerBase::Stop_OnePointFive ); } else { m_base->setStop( IOLayerBase::Stop_One ); } atConf->readConfig( prof ); if ( prof.readEntry( "Device" ).isEmpty() ) { - owarn << "device empty!" << oendl; return; } - setCurrent( prof.readEntry( "Device" ), m_deviceCmb ); + ComboboxHelper::setCurrent( prof.readEntry( "Device" ), m_deviceCmb ); } /* * save speed, * flow, * parity diff --git a/noncore/apps/opie-console/opie-console.pro b/noncore/apps/opie-console/opie-console.pro index d947eec..a7b9d5f 100644 --- a/noncore/apps/opie-console/opie-console.pro +++ b/noncore/apps/opie-console/opie-console.pro @@ -23,17 +23,18 @@ HEADERS = io_layer.h io_serial.h io_irda.h io_bt.h io_modem.h \ function_keyboard.h \ receive_layer.h filereceive.h \ script.h \ dialer.h logger.h \ terminalwidget.h \ emulation_handler.h TECommon.h \ TEHistory.h TEScreen.h TEWidget.h \ TEmuVt102.h TEmulation.h MyPty.h \ - consoleconfigwidget.h fixit.h + consoleconfigwidget.h fixit.h \ + comboboxhelper.h SOURCES = io_layer.cpp io_serial.cpp io_irda.cpp io_bt.cpp io_modem.cpp \ file_layer.cpp filetransfer.cpp \ main.cpp \ metafactory.cpp \ session.cpp \ mainwindow.cpp \ profile.cpp \ @@ -53,22 +54,23 @@ SOURCES = io_layer.cpp io_serial.cpp io_irda.cpp io_bt.cpp io_modem.cpp \ function_keyboard.cpp \ receive_layer.cpp filereceive.cpp \ script.cpp \ dialer.cpp logger.cpp \ terminalwidget.cpp \ emulation_handler.cpp TEHistory.cpp \ TEScreen.cpp TEWidget.cpp \ TEmuVt102.cpp TEmulation.cpp MyPty.cpp \ - consoleconfigwidget.cpp fixit.cpp + consoleconfigwidget.cpp fixit.cpp \ + comboboxhelper.cpp DESTDIR = $(OPIEDIR)/bin/ INTERFACES = configurebase.ui editbase.ui INCLUDEPATH += $(OPIEDIR)/include DEPENDPATH += $(OPIEDIR)/include LIBS += -lqpe -lopiecore2 -lopieui2 -lutil TARGET = opie-console DEFINES += HAVE_OPENPTY -#DEFINES += EAST FSCKED_DISTRI +DEFINES += EAST FSCKED_DISTRI include ( $(OPIEDIR)/include.pro ) diff --git a/noncore/apps/opie-console/profileeditordialog.cpp b/noncore/apps/opie-console/profileeditordialog.cpp index dc42d8b..8109070 100644 --- a/noncore/apps/opie-console/profileeditordialog.cpp +++ b/noncore/apps/opie-console/profileeditordialog.cpp @@ -1,29 +1,25 @@ +#include "profileeditordialog.h" +#include "metafactory.h" +#include "comboboxhelper.h" + + #include <qlayout.h> #include <qlineedit.h> #include <qlabel.h> #include <qmessagebox.h> #include <qcombobox.h> #include <qcheckbox.h> #include <qscrollview.h> -#include "metafactory.h" -#include "profileeditordialog.h" + using namespace Opie::Ui; -namespace { - void setCurrent( const QString& str, QComboBox* bo ) { - for (int i = 0; i < bo->count(); i++ ) { - if ( bo->text(i) == str ) { - bo->setCurrentItem( i ); - } - } - }; -} + ProfileEditorDialog::ProfileEditorDialog( MetaFactory* fact, const Profile& prof ) : QDialog(0, 0, TRUE), m_fact( fact ), m_prof( prof ) { initUI(); // Apply current profile @@ -119,18 +115,18 @@ void ProfileEditorDialog::initUI() list = m_fact->terminalWidgets(); for (it =list.begin(); it != list.end(); ++it ) { m_termCmb->insertItem( (*it) ); } // load profile values m_name->setText(m_prof.name()); slotKeyActivated( "Default Keyboard" ); - setCurrent( m_fact->external(m_prof.ioLayerName() ), m_conCmb ); - setCurrent( m_fact->external(m_prof.terminalName() ), m_termCmb ); + ComboboxHelper::setCurrent( m_fact->external(m_prof.ioLayerName() ), m_conCmb ); + ComboboxHelper::setCurrent( m_fact->external(m_prof.terminalName() ), m_termCmb ); slotConActivated( m_fact->external(m_prof.ioLayerName() ) ); slotTermActivated( m_fact->external(m_prof.terminalName() ) ); m_autoConnect->setChecked(m_prof.autoConnect()); // signal and slots connect(m_conCmb, SIGNAL(activated(const QString&) ), this, SLOT(slotConActivated(const QString&) ) ); diff --git a/noncore/apps/opie-console/serialconfigwidget.cpp b/noncore/apps/opie-console/serialconfigwidget.cpp index c4c9c99..4efb286 100644 --- a/noncore/apps/opie-console/serialconfigwidget.cpp +++ b/noncore/apps/opie-console/serialconfigwidget.cpp @@ -1,30 +1,17 @@ -#include <qlabel.h> -#include <qlayout.h> -#include <qcombobox.h> - #include "iolayerbase.h" #include "serialconfigwidget.h" +#include "comboboxhelper.h" -namespace { - void setCurrent( const QString& str, QComboBox* bo ) { - uint b = bo->count(); - for (int i = 0; i < bo->count(); i++ ) { - if ( bo->text(i) == str ) { - bo->setCurrentItem( i ); - return; - } - } - bo->insertItem( str ); - bo->setCurrentItem( b ); - } +#include <qlabel.h> +#include <qlayout.h> +#include <qcombobox.h> -} SerialConfigWidget::SerialConfigWidget( const QString& name, QWidget* parent, const char* na ) : ProfileDialogConnectionWidget( name, parent, na ) { m_lay = new QVBoxLayout(this ); m_device = new QLabel(tr("Device"), this ); @@ -111,17 +98,17 @@ void SerialConfigWidget::load( const Profile& prof ) { m_base->setStop( IOLayerBase::Stop_Two ); } else if ( sbits == 15 ) { m_base->setStop( IOLayerBase::Stop_OnePointFive ); } else { m_base->setStop( IOLayerBase::Stop_One ); } if ( prof.readEntry("Device").isEmpty() ) return; - setCurrent( prof.readEntry("Device"), m_deviceCmb ); + ComboboxHelper::setCurrent( prof.readEntry("Device"), m_deviceCmb ); } /* * save speed, * flow, * parity */ void SerialConfigWidget::save( Profile& prof ) { diff --git a/noncore/apps/opie-console/settings.ui b/noncore/apps/opie-console/settings.ui deleted file mode 100644 index 6944dd0..0000000 --- a/noncore/apps/opie-console/settings.ui +++ b/dev/null @@ -1,23 +0,0 @@ -<!DOCTYPE UI><UI> -<class>Settings</class> -<widget> - <class>QDialog</class> - <property stdset="1"> - <name>name</name> - <cstring>Settings</cstring> - </property> - <property stdset="1"> - <name>geometry</name> - <rect> - <x>0</x> - <y>0</y> - <width>596</width> - <height>480</height> - </rect> - </property> - <property stdset="1"> - <name>caption</name> - <string>Settings</string> - </property> -</widget> -</UI> diff --git a/noncore/apps/opie-console/sz_transfer.cpp b/noncore/apps/opie-console/sz_transfer.cpp index f505998..3299e33 100644 --- a/noncore/apps/opie-console/sz_transfer.cpp +++ b/noncore/apps/opie-console/sz_transfer.cpp @@ -35,52 +35,35 @@ void SzTransfer::sendFile(const QString& file) { this, SLOT(SzReceivedStderr(Opie::Core::OProcess*,char*,int))); connect(layer(), SIGNAL(received(const QByteArray&)), this, SLOT(receivedStdin(const QByteArray&))); proc->start(OProcess::NotifyOnExit, OProcess::All); } void SzTransfer::SzReceivedStdout(OProcess *, char *buffer, int buflen) { - - owarn << "recieved from sz on stdout " << buflen << " bytes" << oendl; - QByteArray data(buflen); data.fill(*buffer, buflen); + +#ifdef DEBUG_RECEIVE for (uint i = 0; i < data.count(); i++ ) { printf("%c", buffer[i] ); } printf("\n"); +#endif // send out through the io layer layer()->send(data); } void SzTransfer::SzReceivedStderr(OProcess *, char *buffer, int length) { - - // parse and show data in a progress dialog/widget - printf("stderr:\n"); - //for (int i = 0; i < length; i++) - // printf("%c", buffer[i]); - //printf("\n"); } void SzTransfer::receivedStdin(const QByteArray &data) { - - owarn << "recieved from io_serial " << data.size() << " bytes" << oendl; - // recieved data from the io layer goes to sz proc->writeStdin(data.data(), data.size()); - } void SzTransfer::sent() { - - owarn << "sent file" << oendl; - - //setcbreak(0); /* default */ - - delete proc; disconnect(layer(), SIGNAL(received(const QByteArray&)), this, SLOT(receivedStdin(const QByteArray&))); - } diff --git a/noncore/apps/opie-console/tabwidget.cpp b/noncore/apps/opie-console/tabwidget.cpp index 152c26b..79ccac5 100644 --- a/noncore/apps/opie-console/tabwidget.cpp +++ b/noncore/apps/opie-console/tabwidget.cpp @@ -1,28 +1,24 @@ #include "tabwidget.h" -/* OPIE */ -#include <opie2/odebug.h> -using namespace Opie::Core; using Opie::Ui::OTabWidget; TabWidget::TabWidget( QWidget* parent, const char* name ) : OTabWidget( parent, name ) { connect(this, SIGNAL( currentChanged(QWidget*) ), this, SLOT( slotCurChanged(QWidget*) ) ); } TabWidget::~TabWidget() { } void TabWidget::add( Session* ses ) { - owarn << "session ses " + ses->name() << oendl; if ( !ses->widgetStack() ) return; //reparent( ses->widgetStack(), QPoint() ); addTab( ses->widgetStack(), "console/konsole", ses->name() ); //addTab( ses->widgetStack(), ses->name() ); m_map.insert( ses->widgetStack(), ses ); } void TabWidget::remove( Session* ses ) { diff --git a/noncore/apps/opie-console/terminalwidget.cpp b/noncore/apps/opie-console/terminalwidget.cpp index 3e3b8a6..907de1b 100644 --- a/noncore/apps/opie-console/terminalwidget.cpp +++ b/noncore/apps/opie-console/terminalwidget.cpp @@ -1,15 +1,10 @@ #include "terminalwidget.h" -/* OPIE */ -#include <opie2/odebug.h> - -using namespace Opie::Core; - /* QT */ #include <qlabel.h> #include <qcheckbox.h> #include <qcombobox.h> #include <qradiobutton.h> #include <qhgroupbox.h> #include <qhbuttongroup.h> #include <qlayout.h> @@ -75,17 +70,16 @@ TerminalWidget::TerminalWidget( const QString& name, QWidget* parent, m_colorBox->add( m_colorLabel ); m_colorBox->add( m_colorCmb ); m_lroot->add( m_groupConv ); m_lroot->add( m_groupOptions ); m_lroot->addStretch( 0 ); // Fill in some options - owarn << "Options for terminal box" << oendl; m_terminalBox->insertItem( tr("VT 100"), 0 ); // /*, id_term_vt100*/ ); m_terminalBox->insertItem( tr("VT 102"), 1 ); // /* , id_term_vt102 */); m_terminalBox->insertItem( tr("Linux Console"), 2 ); //, id_term_linux ); m_terminalBox->insertItem( tr("X-Terminal"), 3 ); //, id_term_xterm ); //m_terminalBox->insertItem( tr("ANSI"), id_term_ansi ); m_colorCmb->insertItem( tr("black on white"), id_term_black ); m_colorCmb->insertItem( tr("white on black"), id_term_white ); diff --git a/noncore/apps/opie-console/vt102emulation.cpp b/noncore/apps/opie-console/vt102emulation.cpp deleted file mode 100644 index 35b789c..0000000 --- a/noncore/apps/opie-console/vt102emulation.cpp +++ b/dev/null @@ -1,1024 +0,0 @@ -/* ------------------------------------------------------------------------- */ -/* */ -/* [vt102emulation.cpp] VT102 Terminal Emulation */ -/* */ -/* ------------------------------------------------------------------------- */ -/* */ -/* Copyright (c) 1997,1998 by Lars Doelle <lars.doelle@on-line.de> */ -/* */ -/* This file is part of Konsole - an X terminal for KDE */ -/* */ -/* ------------------------------------------------------------------------- */ -/* */ -/* Ported Konsole to Qt/Embedded */ -/* */ -/* Copyright (C) 2000 by John Ryland <jryland@trolltech.com> */ -/* */ -/* -------------------------------------------------------------------------- */ - -/*! \class Vt102Emulation - - \brief Actual Emulation for Konsole - - \sa Widget \sa Screen \sa EmulationLayer -*/ - -#include "vt102emulation.h" - -#include <stdio.h> -#include <unistd.h> - - -/* VT102 Terminal Emulation - - This class puts together the screens, the pty and the widget to a - complete terminal emulation. Beside combining it's componentes, it - handles the emulations's protocol. - - This module consists of the following sections: - - - Constructor/Destructor - - Incoming Bytes Event pipeline - - Outgoing Bytes - - Mouse Events - - Keyboard Events - - Modes and Charset State - - Diagnostics -*/ - - -/* ------------------------------------------------------------------------- */ -/* */ -/* Constructor / Destructor */ -/* */ -/* ------------------------------------------------------------------------- */ - -/* - Nothing really intesting happens here. -*/ - -/*! -*/ - -Vt102Emulation::Vt102Emulation(WidgetLayer* gui) : EmulationLayer(gui) -{ - QObject::connect(gui,SIGNAL(mouseSignal(int,int,int)), - this,SLOT(onMouse(int,int,int))); - initTokenizer(); - reset(); -} - -/*! -*/ - -Vt102Emulation::~Vt102Emulation() -{ -} - -/*! -*/ - -void Vt102Emulation::reset() -{ - resetToken(); - resetModes(); - resetCharset(0); screen[0]->reset(); - resetCharset(1); screen[0]->reset(); - setCodec(0); - setKeytrans("linux.keytab"); -} - -/* ------------------------------------------------------------------------- */ -/* */ -/* Processing the incoming byte stream */ -/* */ -/* ------------------------------------------------------------------------- */ - -/* Incoming Bytes Event pipeline - - This section deals with decoding the incoming character stream. - Decoding means here, that the stream is first seperated into `tokens' - which are then mapped to a `meaning' provided as operations by the - `TEScreen' class or by the emulation class itself. - - The pipeline proceeds as follows: - - - Tokenizing the ESC codes (onRcvChar) - - VT100 code page translation of plain characters (applyCharset) - - Interpretation of ESC codes (tau) - - The escape codes and their meaning are described in the - technical reference of this program. -*/ - -// Tokens ------------------------------------------------------------------ -- - -/* - Since the tokens are the central notion if this section, we've put them - in front. They provide the syntactical elements used to represent the - terminals operations as byte sequences. - - They are encodes here into a single machine word, so that we can later - switch over them easily. Depending on the token itself, additional - argument variables are filled with parameter values. - - The tokens are defined below: - - - CHR - Printable characters (32..255 but DEL (=127)) - - CTL - Control characters (0..31 but ESC (= 27), DEL) - - ESC - Escape codes of the form <ESC><CHR but `[]()+*#'> - - ESC_DE - Escape codes of the form <ESC><any of `()+*#%'> C - - CSI_PN - Escape codes of the form <ESC>'[' {Pn} ';' {Pn} C - - CSI_PS - Escape codes of the form <ESC>'[' {Pn} ';' ... C - - CSI_PR - Escape codes of the form <ESC>'[' '?' {Pn} ';' ... C - - VT52 - VT52 escape codes - - <ESC><Chr> - - <ESC>'Y'{Pc}{Pc} - - XTE_HA - Xterm hacks <ESC>`]' {Pn} `;' {Text} <BEL> - note that this is handled differently - - 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), - they are includes within the token ('N'). - -*/ - -#define TY_CONSTR(T,A,N) ( ((((int)N) & 0xffff) << 16) | ((((int)A) & 0xff) << 8) | (((int)T) & 0xff) ) - -#define TY_CHR___( ) TY_CONSTR(0,0,0) -#define TY_CTL___(A ) TY_CONSTR(1,A,0) -#define TY_ESC___(A ) TY_CONSTR(2,A,0) -#define TY_ESC_CS(A,B) TY_CONSTR(3,A,B) -#define TY_ESC_DE(A ) TY_CONSTR(4,A,0) -#define TY_CSI_PS(A,N) TY_CONSTR(5,A,N) -#define TY_CSI_PN(A ) TY_CONSTR(6,A,0) -#define TY_CSI_PR(A,N) TY_CONSTR(7,A,N) - -#define TY_VT52__(A ) TY_CONSTR(8,A,0) - -// Tokenizer --------------------------------------------------------------- -- - -/* The tokenizers state - - The state is represented by the buffer (pbuf, ppos), - and accompanied by decoded arguments kept in (argv,argc). - Note that they are kept internal in the tokenizer. -*/ - -void Vt102Emulation::resetToken() -{ - ppos = 0; argc = 0; argv[0] = 0; argv[1] = 0; -} - -void Vt102Emulation::addDigit(int dig) -{ - argv[argc] = 10*argv[argc] + dig; -} - -void Vt102Emulation::addArgument() -{ - argc = QMIN(argc+1,MAXARGS-1); - argv[argc] = 0; -} - -void Vt102Emulation::pushToToken(int cc) -{ - pbuf[ppos] = cc; - ppos = QMIN(ppos+1,MAXPBUF-1); -} - -// Character Classes used while decoding - -#define CTL 1 -#define CHR 2 -#define CPN 4 -#define DIG 8 -#define SCS 16 -#define GRP 32 - -void Vt102Emulation::initTokenizer() -{ int i; UINT8* s; - for(i = 0; i < 256; i++) tbl[ i] = 0; - for(i = 0; i < 32; i++) tbl[ i] |= CTL; - for(i = 32; i < 256; i++) tbl[ i] |= CHR; - for(s = (UINT8*)"@ABCDGHLMPXcdfry"; *s; s++) tbl[*s] |= CPN; - for(s = (UINT8*)"0123456789" ; *s; s++) tbl[*s] |= DIG; - for(s = (UINT8*)"()+*%" ; *s; s++) tbl[*s] |= SCS; - for(s = (UINT8*)"()+*#[]%" ; *s; s++) tbl[*s] |= GRP; - resetToken(); -} - -/* Ok, here comes the nasty part of the decoder. - - Instead of keeping an explicit state, we deduce it from the - token scanned so far. It is then immediately combined with - the current character to form a scanning decision. - - This is done by the following defines. - - - P is the length of the token scanned so far. - - L (often P-1) is the position on which contents we base a decision. - - C is a character or a group of characters (taken from 'tbl'). - - Note that they need to applied in proper order. -*/ - -#define lec(P,L,C) (p == (P) && s[(L)] == (C)) -#define lun( ) (p == 1 && cc >= 32 ) -#define les(P,L,C) (p == (P) && s[L] < 256 && (tbl[s[(L)]] & (C)) == (C)) -#define eec(C) (p >= 3 && cc == (C)) -#define ees(C) (p >= 3 && cc < 256 && (tbl[ cc ] & (C)) == (C)) -#define eps(C) (p >= 3 && s[2] != '?' && cc < 256 && (tbl[ cc ] & (C)) == (C)) -#define epp( ) (p >= 3 && s[2] == '?' ) -#define egt( ) (p == 3 && s[2] == '>' ) -#define Xpe (ppos>=2 && pbuf[1] == ']' ) -#define Xte (Xpe && cc == 7 ) -#define ces(C) ( cc < 256 && (tbl[ cc ] & (C)) == (C) && !Xte) - -#define ESC 27 -#define CNTL(c) ((c)-'@') - -// process an incoming unicode character - -void Vt102Emulation::onRcvChar(int cc) -{ int i; - - if (cc == 127) return; //VT100: ignore. - - if (ces( CTL)) - { // DEC HACK ALERT! Control Characters are allowed *within* esc sequences in VT100 - // This means, they do neither a resetToken nor a pushToToken. Some of them, do - // of course. Guess this originates from a weakly layered handling of the X-on - // X-off protocol, which comes really below this level. - if (cc == CNTL('X') || cc == CNTL('Z') || cc == ESC) resetToken(); //VT100: CAN or SUB - if (cc != ESC) { tau( TY_CTL___(cc+'@' ), 0, 0); return; } - } - - pushToToken(cc); // advance the state - - int* s = pbuf; - int p = ppos; - - if (getMode(MODE_Ansi)) // decide on proper action - { - if (lec(1,0,ESC)) { return; } - if (les(2,1,GRP)) { return; } - if (Xte ) { XtermHack(); resetToken(); return; } - if (Xpe ) { return; } - if (lec(3,2,'?')) { return; } - if (lec(3,2,'>')) { return; } - if (lun( )) { tau( TY_CHR___(), applyCharset(cc), 0); resetToken(); return; } - if (lec(2,0,ESC)) { tau( TY_ESC___(s[1]), 0, 0); resetToken(); return; } - if (les(3,1,SCS)) { tau( TY_ESC_CS(s[1],s[2]), 0, 0); resetToken(); return; } - if (lec(3,1,'#')) { tau( TY_ESC_DE(s[2]), 0, 0); resetToken(); return; } -// if (egt( )) { tau( TY_CSI_PG(cc ), '>', 0); resetToken(); return; } - if (eps( CPN)) { tau( TY_CSI_PN(cc), argv[0],argv[1]); resetToken(); return; } - if (ees( DIG)) { addDigit(cc-'0'); return; } - if (eec( ';')) { addArgument(); return; } - for (i=0;i<=argc;i++) - if (epp( )) tau( TY_CSI_PR(cc,argv[i]), 0, 0); else - tau( TY_CSI_PS(cc,argv[i]), 0, 0); - resetToken(); - } - else // mode VT52 - { - if (lec(1,0,ESC)) return; - if (les(1,0,CHR)) { tau( TY_CHR___( ), s[0], 0); resetToken(); return; } - if (lec(2,1,'Y')) return; - if (lec(3,1,'Y')) return; - if (p < 4) { tau( TY_VT52__(s[1] ), 0, 0); resetToken(); return; } - tau( TY_VT52__(s[1] ), s[2],s[3]); resetToken(); return; - } -} - -void Vt102Emulation::XtermHack() -{ int i,arg = 0; - for (i = 2; i < ppos && '0'<=pbuf[i] && pbuf[i]<'9' ; i++) - arg = 10*arg + (pbuf[i]-'0'); - if (pbuf[i] != ';') { ReportErrorToken(); return; } - QChar *str = new QChar[ppos-i-2]; - for (int j = 0; j < ppos-i-2; j++) str[j] = pbuf[i+1+j]; - QString unistr(str,ppos-i-2); - // arg == 1 doesn't change the title. In XTerm it only changes the icon name - // (btw: arg=0 changes title and icon, arg=1 only icon, arg=2 only title - if (arg == 0 || arg == 2) emit changeTitle(arg,unistr); - delete [] str; -} - -// Interpreting Codes --------------------------------------------------------- - -/* - Now that the incoming character stream is properly tokenized, - 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 - possibly accompanied by two parameters. - - Likewise, the operations assigned to, come with up to two - arguments. One could consider to make up a proper table - from the function below. - - The technical reference manual provides more informations - about this mapping. -*/ - -void Vt102Emulation::tau( int token, int p, int q ) -{ -//scan_buffer_report(); -//if (token == TY_CHR___()) printf("%c",p); else -//printf("tau(%d,%d,%d, %d,%d)\n",(token>>0)&0xff,(token>>8)&0xff,(token>>16)&0xffff,p,q); - switch (token) - { - - case TY_CHR___( ) : scr->ShowCharacter (p ); break; //UTF16 - - // 127 DEL : ignored on input - - case TY_CTL___('@' ) : /* NUL: ignored */ break; - case TY_CTL___('A' ) : /* SOH: ignored */ break; - case TY_CTL___('B' ) : /* STX: ignored */ break; - case TY_CTL___('C' ) : /* ETX: ignored */ break; - case TY_CTL___('D' ) : /* EOT: ignored */ break; - case TY_CTL___('E' ) : reportAnswerBack ( ); break; //VT100 - case TY_CTL___('F' ) : /* ACK: ignored */ break; - case TY_CTL___('G' ) : gui->bell ( ); break; //VT100 - case TY_CTL___('H' ) : scr->BackSpace ( ); break; //VT100 - case TY_CTL___('I' ) : scr->Tabulate ( ); break; //VT100 - case TY_CTL___('J' ) : scr->NewLine ( ); break; //VT100 - case TY_CTL___('K' ) : scr->NewLine ( ); break; //VT100 - case TY_CTL___('L' ) : scr->NewLine ( ); break; //VT100 - case TY_CTL___('M' ) : scr->Return ( ); break; //VT100 - - case TY_CTL___('N' ) : useCharset ( 1); break; //VT100 - case TY_CTL___('O' ) : useCharset ( 0); break; //VT100 - - case TY_CTL___('P' ) : /* DLE: ignored */ break; - case TY_CTL___('Q' ) : /* DC1: XON continue */ break; //VT100 - case TY_CTL___('R' ) : /* DC2: ignored */ break; - case TY_CTL___('S' ) : /* DC3: XOFF halt */ break; //VT100 - case TY_CTL___('T' ) : /* DC4: ignored */ break; - case TY_CTL___('U' ) : /* NAK: ignored */ break; - case TY_CTL___('V' ) : /* SYN: ignored */ break; - case TY_CTL___('W' ) : /* ETB: ignored */ break; - case TY_CTL___('X' ) : scr->ShowCharacter ( 0x2592); break; //VT100 - case TY_CTL___('Y' ) : /* EM : ignored */ break; - case TY_CTL___('Z' ) : scr->ShowCharacter ( 0x2592); break; //VT100 - case TY_CTL___('[' ) : /* ESC: cannot be seen here. */ break; - case TY_CTL___('\\' ) : /* FS : ignored */ break; - case TY_CTL___(']' ) : /* GS : ignored */ break; - case TY_CTL___('^' ) : /* RS : ignored */ break; - case TY_CTL___('_' ) : /* US : ignored */ break; - - case TY_ESC___('D' ) : scr->index ( ); break; //VT100 - case TY_ESC___('E' ) : scr->NextLine ( ); break; //VT100 - case TY_ESC___('H' ) : scr->changeTabStop (TRUE ); break; //VT100 - case TY_ESC___('M' ) : scr->reverseIndex ( ); break; //VT100 - case TY_ESC___('Z' ) : reportTerminalType ( ); break; - case TY_ESC___('c' ) : reset ( ); break; - - case TY_ESC___('n' ) : useCharset ( 2); break; - case TY_ESC___('o' ) : useCharset ( 3); break; - case TY_ESC___('7' ) : saveCursor ( ); break; - case TY_ESC___('8' ) : restoreCursor ( ); break; - - case TY_ESC___('=' ) : setMode (MODE_AppKeyPad); break; - case TY_ESC___('>' ) : resetMode (MODE_AppKeyPad); break; - case TY_ESC___('<' ) : setMode (MODE_Ansi ); break; //VT100 - - case TY_ESC_CS('(', '0') : setCharset (0, '0'); break; //VT100 - case TY_ESC_CS('(', 'A') : setCharset (0, 'A'); break; //VT100 - case TY_ESC_CS('(', 'B') : setCharset (0, 'B'); break; //VT100 - - case TY_ESC_CS(')', '0') : setCharset (1, '0'); break; //VT100 - case TY_ESC_CS(')', 'A') : setCharset (1, 'A'); break; //VT100 - case TY_ESC_CS(')', 'B') : setCharset (1, 'B'); break; //VT100 - - case TY_ESC_CS('*', '0') : setCharset (2, '0'); break; //VT100 - case TY_ESC_CS('*', 'A') : setCharset (2, 'A'); break; //VT100 - case TY_ESC_CS('*', 'B') : setCharset (2, 'B'); break; //VT100 - - case TY_ESC_CS('+', '0') : setCharset (3, '0'); break; //VT100 - case TY_ESC_CS('+', 'A') : setCharset (3, 'A'); break; //VT100 - case TY_ESC_CS('+', 'B') : setCharset (3, 'B'); break; //VT100 - - case TY_ESC_CS('%', 'G') : setCodec (1 ); break; //LINUX - case TY_ESC_CS('%', '@') : setCodec (0 ); break; //LINUX - - case TY_ESC_DE('3' ) : /* IGNORED: double high, top half */ break; - case TY_ESC_DE('4' ) : /* IGNORED: double high, bottom half */ break; - case TY_ESC_DE('5' ) : /* IGNORED: single width, single high*/ break; - case TY_ESC_DE('6' ) : /* IGNORED: double width, single high*/ break; - case TY_ESC_DE('8' ) : scr->helpAlign ( ); break; - - case TY_CSI_PS('K', 0) : scr->clearToEndOfLine ( ); break; - case TY_CSI_PS('K', 1) : scr->clearToBeginOfLine ( ); break; - case TY_CSI_PS('K', 2) : scr->clearEntireLine ( ); break; - case TY_CSI_PS('J', 0) : scr->clearToEndOfScreen ( ); break; - case TY_CSI_PS('J', 1) : scr->clearToBeginOfScreen ( ); break; - case TY_CSI_PS('J', 2) : scr->clearEntireScreen ( ); break; - case TY_CSI_PS('g', 0) : scr->changeTabStop (FALSE ); break; //VT100 - case TY_CSI_PS('g', 3) : scr->clearTabStops ( ); break; //VT100 - case TY_CSI_PS('h', 4) : scr-> setMode (MODE_Insert ); break; - case TY_CSI_PS('h', 20) : setMode (MODE_NewLine ); break; - case TY_CSI_PS('i', 0) : /* IGNORE: attached printer */ break; //VT100 - case TY_CSI_PS('l', 4) : scr-> resetMode (MODE_Insert ); break; - case TY_CSI_PS('l', 20) : resetMode (MODE_NewLine ); break; - - case TY_CSI_PS('m', 0) : scr->setDefaultRendition ( ); break; - case TY_CSI_PS('m', 1) : scr-> setRendition (RE_BOLD ); break; //VT100 - case TY_CSI_PS('m', 4) : scr-> setRendition (RE_UNDERLINE); break; //VT100 - case TY_CSI_PS('m', 5) : scr-> setRendition (RE_BLINK ); break; //VT100 - case TY_CSI_PS('m', 7) : scr-> setRendition (RE_REVERSE ); break; - case TY_CSI_PS('m', 10) : /* IGNORED: mapping related */ break; //LINUX - 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) : scr->resetRendition (RE_BOLD ); break; - case TY_CSI_PS('m', 24) : scr->resetRendition (RE_UNDERLINE); break; - case TY_CSI_PS('m', 25) : scr->resetRendition (RE_BLINK ); break; - case TY_CSI_PS('m', 27) : scr->resetRendition (RE_REVERSE ); break; - - case TY_CSI_PS('m', 30) : scr->setForeColor ( 0); break; - case TY_CSI_PS('m', 31) : scr->setForeColor ( 1); break; - case TY_CSI_PS('m', 32) : scr->setForeColor ( 2); break; - case TY_CSI_PS('m', 33) : scr->setForeColor ( 3); break; - case TY_CSI_PS('m', 34) : scr->setForeColor ( 4); break; - case TY_CSI_PS('m', 35) : scr->setForeColor ( 5); break; - case TY_CSI_PS('m', 36) : scr->setForeColor ( 6); break; - case TY_CSI_PS('m', 37) : scr->setForeColor ( 7); break; - case TY_CSI_PS('m', 39) : scr->setForeColorToDefault( ); break; - - case TY_CSI_PS('m', 40) : scr->setBackColor ( 0); break; - case TY_CSI_PS('m', 41) : scr->setBackColor ( 1); break; - case TY_CSI_PS('m', 42) : scr->setBackColor ( 2); break; - case TY_CSI_PS('m', 43) : scr->setBackColor ( 3); break; - case TY_CSI_PS('m', 44) : scr->setBackColor ( 4); break; - case TY_CSI_PS('m', 45) : scr->setBackColor ( 5); break; - case TY_CSI_PS('m', 46) : scr->setBackColor ( 6); break; - case TY_CSI_PS('m', 47) : scr->setBackColor ( 7); break; - case TY_CSI_PS('m', 49) : scr->setBackColorToDefault( ); break; - - case TY_CSI_PS('m', 90) : scr->setForeColor ( 8); break; - case TY_CSI_PS('m', 91) : scr->setForeColor ( 9); break; - case TY_CSI_PS('m', 92) : scr->setForeColor ( 10); break; - case TY_CSI_PS('m', 93) : scr->setForeColor ( 11); break; - case TY_CSI_PS('m', 94) : scr->setForeColor ( 12); break; - case TY_CSI_PS('m', 95) : scr->setForeColor ( 13); break; - case TY_CSI_PS('m', 96) : scr->setForeColor ( 14); break; - case TY_CSI_PS('m', 97) : scr->setForeColor ( 15); break; - - case TY_CSI_PS('m', 100) : scr->setBackColor ( 8); break; - case TY_CSI_PS('m', 101) : scr->setBackColor ( 9); break; - case TY_CSI_PS('m', 102) : scr->setBackColor ( 10); break; - case TY_CSI_PS('m', 103) : scr->setBackColor ( 11); break; - case TY_CSI_PS('m', 104) : scr->setBackColor ( 12); break; - case TY_CSI_PS('m', 105) : scr->setBackColor ( 13); break; - case TY_CSI_PS('m', 106) : scr->setBackColor ( 14); break; - case TY_CSI_PS('m', 107) : scr->setBackColor ( 15); break; - - case TY_CSI_PS('n', 5) : reportStatus ( ); break; - case TY_CSI_PS('n', 6) : reportCursorPosition ( ); break; - case TY_CSI_PS('q', 0) : /* IGNORED: LEDs off */ break; //VT100 - case TY_CSI_PS('q', 1) : /* IGNORED: LED1 on */ break; //VT100 - case TY_CSI_PS('q', 2) : /* IGNORED: LED2 on */ break; //VT100 - case TY_CSI_PS('q', 3) : /* IGNORED: LED3 on */ break; //VT100 - case TY_CSI_PS('q', 4) : /* IGNORED: LED4 on */ break; //VT100 - case TY_CSI_PS('x', 0) : reportTerminalParms ( 2); break; //VT100 - case TY_CSI_PS('x', 1) : reportTerminalParms ( 3); break; //VT100 - - case TY_CSI_PN('@' ) : scr->insertChars (p ); break; - case TY_CSI_PN('A' ) : scr->cursorUp (p ); break; //VT100 - case TY_CSI_PN('B' ) : scr->cursorDown (p ); break; //VT100 - case TY_CSI_PN('C' ) : scr->cursorRight (p ); break; //VT100 - case TY_CSI_PN('D' ) : scr->cursorLeft (p ); break; //VT100 - case TY_CSI_PN('G' ) : scr->setCursorX (p ); break; //LINUX - case TY_CSI_PN('H' ) : scr->setCursorYX (p, q); break; //VT100 - case TY_CSI_PN('L' ) : scr->insertLines (p ); break; - case TY_CSI_PN('M' ) : scr->deleteLines (p ); break; - case TY_CSI_PN('P' ) : scr->deleteChars (p ); break; - case TY_CSI_PN('X' ) : scr->eraseChars (p ); break; - case TY_CSI_PN('c' ) : reportTerminalType ( ); break; //VT100 - case TY_CSI_PN('d' ) : scr->setCursorY (p ); break; //LINUX - case TY_CSI_PN('f' ) : scr->setCursorYX (p, q); break; //VT100 - case TY_CSI_PN('r' ) : scr->setMargins (p, q); break; //VT100 - case TY_CSI_PN('y' ) : /* IGNORED: Confidence test */ break; //VT100 - - case TY_CSI_PR('h', 1) : setMode (MODE_AppCuKeys); break; //VT100 - case TY_CSI_PR('l', 1) : resetMode (MODE_AppCuKeys); break; //VT100 - case TY_CSI_PR('s', 1) : saveMode (MODE_AppCuKeys); break; //FIXME - case TY_CSI_PR('r', 1) : restoreMode (MODE_AppCuKeys); break; //FIXME - - case TY_CSI_PR('l', 2) : resetMode (MODE_Ansi ); break; //VT100 - - case TY_CSI_PR('h', 3) : setColumns ( 132); break; //VT100 - case TY_CSI_PR('l', 3) : setColumns ( 80); break; //VT100 - - case TY_CSI_PR('h', 4) : /* IGNORED: soft scrolling */ break; //VT100 - case TY_CSI_PR('l', 4) : /* IGNORED: soft scrolling */ break; //VT100 - - case TY_CSI_PR('h', 5) : scr-> setMode (MODE_Screen ); break; //VT100 - case TY_CSI_PR('l', 5) : scr-> resetMode (MODE_Screen ); break; //VT100 - - case TY_CSI_PR('h', 6) : scr-> setMode (MODE_Origin ); break; //VT100 - case TY_CSI_PR('l', 6) : scr-> resetMode (MODE_Origin ); break; //VT100 - case TY_CSI_PR('s', 6) : scr-> saveMode (MODE_Origin ); break; //FIXME - case TY_CSI_PR('r', 6) : scr->restoreMode (MODE_Origin ); break; //FIXME - - case TY_CSI_PR('h', 7) : scr-> setMode (MODE_Wrap ); break; //VT100 - case TY_CSI_PR('l', 7) : scr-> resetMode (MODE_Wrap ); break; //VT100 - case TY_CSI_PR('s', 7) : scr-> saveMode (MODE_Wrap ); break; //FIXME - case TY_CSI_PR('r', 7) : scr->restoreMode (MODE_Wrap ); break; //FIXME - - case TY_CSI_PR('h', 8) : /* IGNORED: autorepeat on */ break; //VT100 - case TY_CSI_PR('l', 8) : /* IGNORED: autorepeat off */ break; //VT100 - - case TY_CSI_PR('h', 9) : /* IGNORED: interlace */ break; //VT100 - case TY_CSI_PR('l', 9) : /* IGNORED: interlace */ break; //VT100 - - case TY_CSI_PR('h', 25) : setMode (MODE_Cursor ); break; //VT100 - case TY_CSI_PR('l', 25) : resetMode (MODE_Cursor ); break; //VT100 - - case TY_CSI_PR('h', 41) : /* IGNORED: obsolete more(1) fix */ break; //XTERM - case TY_CSI_PR('l', 41) : /* IGNORED: obsolete more(1) fix */ break; //XTERM - case TY_CSI_PR('s', 41) : /* IGNORED: obsolete more(1) fix */ break; //XTERM - case TY_CSI_PR('r', 41) : /* IGNORED: obsolete more(1) fix */ break; //XTERM - - case TY_CSI_PR('h', 47) : setMode (MODE_AppScreen); break; //VT100 - case TY_CSI_PR('l', 47) : resetMode (MODE_AppScreen); break; //VT100 - - case TY_CSI_PR('h', 1000) : setMode (MODE_Mouse1000); break; //XTERM - case TY_CSI_PR('l', 1000) : resetMode (MODE_Mouse1000); break; //XTERM - case TY_CSI_PR('s', 1000) : saveMode (MODE_Mouse1000); break; //XTERM - case TY_CSI_PR('r', 1000) : restoreMode (MODE_Mouse1000); break; //XTERM - - case TY_CSI_PR('h', 1001) : /* IGNORED: hilite mouse tracking */ break; //XTERM - case TY_CSI_PR('l', 1001) : /* IGNORED: hilite mouse tracking */ break; //XTERM - case TY_CSI_PR('s', 1001) : /* IGNORED: hilite mouse tracking */ break; //XTERM - case TY_CSI_PR('r', 1001) : /* IGNORED: hilite mouse tracking */ break; //XTERM - - case TY_CSI_PR('h', 1047) : setMode (MODE_AppScreen); break; //XTERM - case TY_CSI_PR('l', 1047) : resetMode (MODE_AppScreen); break; //XTERM - - //FIXME: Unitoken: save translations - case TY_CSI_PR('h', 1048) : saveCursor ( ); break; //XTERM - case TY_CSI_PR('l', 1048) : restoreCursor ( ); break; //XTERM - - //FIXME: every once new sequences like this pop up in xterm. - // Here's a guess of what they could mean. - case TY_CSI_PR('h', 1049) : setMode (MODE_AppScreen); break; //XTERM - case TY_CSI_PR('l', 1049) : resetMode (MODE_AppScreen); break; //XTERM - - //FIXME: when changing between vt52 and ansi mode evtl do some resetting. - case TY_VT52__('A' ) : scr->cursorUp ( 1); break; //VT52 - case TY_VT52__('B' ) : scr->cursorDown ( 1); break; //VT52 - case TY_VT52__('C' ) : scr->cursorRight ( 1); break; //VT52 - case TY_VT52__('D' ) : scr->cursorLeft ( 1); break; //VT52 - - case TY_VT52__('F' ) : setAndUseCharset (0, '0'); break; //VT52 - case TY_VT52__('G' ) : setAndUseCharset (0, 'B'); break; //VT52 - - case TY_VT52__('H' ) : scr->setCursorYX (1,1 ); break; //VT52 - case TY_VT52__('I' ) : scr->reverseIndex ( ); break; //VT52 - case TY_VT52__('J' ) : scr->clearToEndOfScreen ( ); break; //VT52 - case TY_VT52__('K' ) : scr->clearToEndOfLine ( ); break; //VT52 - case TY_VT52__('Y' ) : scr->setCursorYX (p-31,q-31 ); break; //VT52 - case TY_VT52__('Z' ) : reportTerminalType ( ); break; //VT52 - case TY_VT52__('<' ) : setMode (MODE_Ansi ); break; //VT52 - case TY_VT52__('=' ) : setMode (MODE_AppKeyPad); break; //VT52 - case TY_VT52__('>' ) : resetMode (MODE_AppKeyPad); break; //VT52 - - default : ReportErrorToken(); break; - }; -} - -/* ------------------------------------------------------------------------- */ -/* */ -/* Terminal to Host protocol */ -/* */ -/* ------------------------------------------------------------------------- */ - -/* - Outgoing bytes originate from several sources: - - - Replies to Enquieries. - - Mouse Events - - Keyboard Events -*/ - -/*! -*/ - -void Vt102Emulation::sendString(const char* s) -{ - QByteArray tmp; - tmp.setRawData( s, strlen( s )); - emit sndBlock( tmp); -} - -void Vt102Emulation::sendString(const QByteArray& s) -{ - emit sndBlock( s ); -} - -// Replies ----------------------------------------------------------------- -- - -// This section copes with replies send as response to an enquiery control code. - -/*! -*/ - -void Vt102Emulation::reportCursorPosition() -{ char tmp[20]; - sprintf(tmp,"\033[%d;%dR",scr->getCursorY()+1,scr->getCursorX()+1); - sendString(tmp); -} - -/* - What follows here is rather obsolete and faked stuff. - The correspondent enquieries are neverthenless issued. -*/ - -/*! -*/ - -void Vt102Emulation::reportTerminalType() -{ -//FIXME: should change? - if (getMode(MODE_Ansi)) -// sendString("\033[?1;2c"); // I'm a VT100 with AP0 //FIXME: send only in response to ^[[0c - sendString("\033[>0;115;0c"); // I'm a VT220 //FIXME: send only in response to ^[[>c - else - sendString("\033/Z"); // I'm a VT52 -} - -void Vt102Emulation::reportTerminalParms(int p) -// DECREPTPARM -{ char tmp[100]; - sprintf(tmp,"\033[%d;1;1;112;112;1;0x",p); // not really true. - sendString(tmp); -} - -/*! -*/ - -void Vt102Emulation::reportStatus() -{ - sendString("\033[0n"); //VT100. Device status report. 0 = Ready. -} - -/*! -*/ - -#define ANSWER_BACK "" // This is really obsolete VT100 stuff. - -void Vt102Emulation::reportAnswerBack() -{ - sendString(ANSWER_BACK); -} - -// Mouse Handling ---------------------------------------------------------- -- - -/*! - Mouse clicks are possibly reported to the client - application if it has issued interest in them. - They are normally consumed by the widget for copy - and paste, but may be propagated from the widget - when gui->setMouseMarks is set via setMode(MODE_Mouse1000). - - `x',`y' are 1-based. - `ev' (event) indicates the button pressed (0-2) - or a general mouse release (3). -*/ - -void Vt102Emulation::onMouse( int cb, int cx, int cy ) -{ char tmp[20]; - if (!connected) return; - sprintf(tmp,"\033[M%c%c%c",cb+040,cx+040,cy+040); - sendString(tmp); -} - -// Keyboard Handling ------------------------------------------------------- -- - -#define encodeMode(M,B) BITS(B,getMode(M)) -#define encodeStat(M,B) BITS(B,((ev->state() & (M)) == (M))) - -/* - Keyboard event handling has been simplified somewhat by pushing - the complications towards a configuration file [see KeyTrans class]. -*/ - -void Vt102Emulation::onKeyPress( QKeyEvent* ev ) -{ - if (!connected) return; // someone else gets the keys - -//printf("State/Key: 0x%04x 0x%04x (%d,%d)\n",ev->state(),ev->key(),ev->text().length(),ev->text().length()?ev->text().ascii()[0]:0); - - // revert to non-history when typing - if (scr->getHistCursor() != scr->getHistLines()); - scr->setHistCursor(scr->getHistLines()); - - // lookup in keyboard translation table ... - int cmd; const char* txt; int len; - if (keytrans->findEntry(ev->key(), encodeMode(MODE_NewLine , BITS_NewLine ) + // OLD, - encodeMode(MODE_Ansi , BITS_Ansi ) + // OBSOLETE, - encodeMode(MODE_AppCuKeys, BITS_AppCuKeys ) + // VT100 stuff - encodeStat(ControlButton , BITS_Control ) + - encodeStat(ShiftButton , BITS_Shift ) + - encodeStat(AltButton , BITS_Alt ), - &cmd, &txt, &len )) -//printf("cmd: %d, %s, %d\n",cmd,txt,len); - { - switch(cmd) // ... and execute if found. - { - case CMD_emitSelection : gui->insertSelection(); return; - case CMD_scrollPageUp : gui->scroll(-gui->lines()/2); return; - case CMD_scrollPageDown : gui->scroll(+gui->lines()/2); return; - case CMD_scrollLineUp : gui->scroll(-1 ); return; - case CMD_scrollLineDown : gui->scroll(+1 ); return; - case CMD_send : sendString( txt ); return; - case CMD_prevSession : emit prevSession(); return; - case CMD_nextSession : emit nextSession(); return; - } - } - // fall back handling - if (!ev->text().isEmpty()) - { - if (ev->state() & AltButton) sendString("\033"); // ESC, this is the ALT prefix - /// very hacky - if ((ev->state() & ControlButton) && (ev->text().upper().ascii()[0]=='A')) sendString("\01"); - else if ((ev->state() & ControlButton) && (ev->text().upper().ascii()[0]=='B')) sendString("\02"); - else if ((ev->state() & ControlButton) && (ev->text().upper().ascii()[0]=='C')) sendString("\03"); - else if ((ev->state() & ControlButton) && (ev->text().upper().ascii()[0]=='D')) sendString("\04"); - else if ((ev->state() & ControlButton) && (ev->text().upper().ascii()[0]=='E')) sendString("\05"); - else if ((ev->state() & ControlButton) && (ev->text().upper().ascii()[0]=='F')) sendString("\06"); - else if ((ev->state() & ControlButton) && (ev->text().upper().ascii()[0]=='G')) sendString("\07"); - else if ((ev->state() & ControlButton) && (ev->text().upper().ascii()[0]=='H')) sendString("\010"); - else if ((ev->state() & ControlButton) && (ev->text().upper().ascii()[0]=='I')) sendString("\011"); - else if ((ev->state() & ControlButton) && (ev->text().upper().ascii()[0]=='J')) sendString("\012"); - else if ((ev->state() & ControlButton) && (ev->text().upper().ascii()[0]=='K')) sendString("\013"); - else if ((ev->state() & ControlButton) && (ev->text().upper().ascii()[0]=='L')) sendString("\014"); - else if ((ev->state() & ControlButton) && (ev->text().upper().ascii()[0]=='M')) sendString("\015"); - else if ((ev->state() & ControlButton) && (ev->text().upper().ascii()[0]=='N')) sendString("\016"); - else if ((ev->state() & ControlButton) && (ev->text().upper().ascii()[0]=='O')) sendString("\017"); - else if ((ev->state() & ControlButton) && (ev->text().upper().ascii()[0]=='P')) sendString("\020"); - else if ((ev->state() & ControlButton) && (ev->text().upper().ascii()[0]=='Q')) sendString("\021"); - else if ((ev->state() & ControlButton) && (ev->text().upper().ascii()[0]=='R')) sendString("\022"); - else if ((ev->state() & ControlButton) && (ev->text().upper().ascii()[0]=='S')) sendString("\023"); - else if ((ev->state() & ControlButton) && (ev->text().upper().ascii()[0]=='T')) sendString("\024"); - else if ((ev->state() & ControlButton) && (ev->text().upper().ascii()[0]=='U')) sendString("\025"); - else if ((ev->state() & ControlButton) && (ev->text().upper().ascii()[0]=='V')) sendString("\026"); - else if ((ev->state() & ControlButton) && (ev->text().upper().ascii()[0]=='W')) sendString("\027"); - else if ((ev->state() & ControlButton) && (ev->text().upper().ascii()[0]=='X')) sendString("\030"); - else if ((ev->state() & ControlButton) && (ev->text().upper().ascii()[0]=='Y')) sendString("\031"); - else if ((ev->state() & ControlButton) && (ev->text().upper().ascii()[0]=='Z')) sendString("\032"); - else - { - QCString s = codec->fromUnicode(ev->text()); // encode for application - sendString( s ); // we may well have s.length() > 1 - } - return; - } -} - -/* ------------------------------------------------------------------------- */ -/* */ -/* VT100 Charsets */ -/* */ -/* ------------------------------------------------------------------------- */ - -// Character Set Conversion ------------------------------------------------ -- - -/* - The processing contains a VT100 specific code translation layer. - It's still in use and mainly responsible for the line drawing graphics. - - These and some other glyphs are assigned to codes (0x5f-0xfe) - normally occupied by the latin letters. Since this codes also - appear within control sequences, the extra code conversion - does not permute with the tokenizer and is placed behind it - in the pipeline. It only applies to tokens, which represent - plain characters. - - This conversion it eventually continued in TEWidget.C, since - it might involve VT100 enhanced fonts, which have these - particular glyphs allocated in (0x00-0x1f) in their code page. -*/ - -#define CHARSET charset[scr==screen[1]] - -// Apply current character map. - -unsigned short Vt102Emulation::applyCharset(unsigned short c) -{ - if (CHARSET.graphic && 0x5f <= c && c <= 0x7e) return vt100_graphics[c-0x5f]; - if (CHARSET.pound && c == '#' ) return 0xa3; //This mode is obsolete - return c; -} - -/* - "Charset" related part of the emulation state. - This configures the VT100 charset filter. - - While most operation work on the current screen, - the following two are different. -*/ - -void Vt102Emulation::resetCharset(int scrno) -{ - charset[scrno].cu_cs = 0; - strncpy(charset[scrno].charset,"BBBB",4); - charset[scrno].sa_graphic = FALSE; - charset[scrno].sa_pound = FALSE; - charset[scrno].graphic = FALSE; - charset[scrno].pound = FALSE; -} - -/*! -*/ - -void Vt102Emulation::setCharset(int n, int cs) // on both screens. -{ - charset[0].charset[n&3] = cs; useCharset(charset[0].cu_cs); - charset[1].charset[n&3] = cs; useCharset(charset[1].cu_cs); -} - -/*! -*/ - -void Vt102Emulation::setAndUseCharset(int n, int cs) -{ - CHARSET.charset[n&3] = cs; - useCharset(n&3); -} - -/*! -*/ - -void Vt102Emulation::useCharset(int n) -{ - CHARSET.cu_cs = n&3; - CHARSET.graphic = (CHARSET.charset[n&3] == '0'); - CHARSET.pound = (CHARSET.charset[n&3] == 'A'); //This mode is obsolete -} - -/*! Save the cursor position and the rendition attribute settings. */ - -void Vt102Emulation::saveCursor() -{ - CHARSET.sa_graphic = CHARSET.graphic; - CHARSET.sa_pound = CHARSET.pound; //This mode is obsolete - // we are not clear about these - //sa_charset = charsets[cScreen->charset]; - //sa_charset_num = cScreen->charset; - scr->saveCursor(); -} - -/*! Restore the cursor position and the rendition attribute settings. */ - -void Vt102Emulation::restoreCursor() -{ - CHARSET.graphic = CHARSET.sa_graphic; - CHARSET.pound = CHARSET.sa_pound; //This mode is obsolete - scr->restoreCursor(); -} - -/* ------------------------------------------------------------------------- */ -/* */ -/* Mode Operations */ -/* */ -/* ------------------------------------------------------------------------- */ - -/* - Some of the emulations state is either added to the state of the screens. - - This causes some scoping problems, since different emulations choose to - located the mode either to the current screen or to both. - - For strange reasons, the extend of the rendition attributes ranges over - all screens and not over the actual screen. - - We decided on the precise precise extend, somehow. -*/ - -// "Mode" related part of the state. These are all booleans. - -void Vt102Emulation::resetModes() -{ - resetMode(MODE_Mouse1000); saveMode(MODE_Mouse1000); - resetMode(MODE_AppScreen); saveMode(MODE_AppScreen); - // here come obsolete modes - resetMode(MODE_AppCuKeys); saveMode(MODE_AppCuKeys); - resetMode(MODE_NewLine ); - setMode(MODE_Ansi ); -} - -void Vt102Emulation::setMode(int m) -{ - currParm.mode[m] = TRUE; - switch (m) - { - case MODE_Mouse1000 : //gui->setMouseMarks(FALSE); - break; - case MODE_AppScreen : screen[1]->clearSelection(); - screen[1]->clearEntireScreen(); - setScreen(1); - break; - } - if (m < MODES_SCREEN || m == MODE_NewLine) - { - screen[0]->setMode(m); - screen[1]->setMode(m); - } -} - -void Vt102Emulation::resetMode(int m) -{ - currParm.mode[m] = FALSE; - switch (m) - { - case MODE_Mouse1000 : //gui->setMouseMarks(TRUE); - break; - case MODE_AppScreen : screen[0]->clearSelection(); - setScreen(0); - break; - } - if (m < MODES_SCREEN || m == MODE_NewLine) - { - screen[0]->resetMode(m); - screen[1]->resetMode(m); - } -} - -void Vt102Emulation::saveMode(int m) -{ - saveParm.mode[m] = currParm.mode[m]; -} - -void Vt102Emulation::restoreMode(int m) -{ - if(saveParm.mode[m]) setMode(m); else resetMode(m); -} - -BOOL Vt102Emulation::getMode(int m) -{ - return currParm.mode[m]; -} - -void Vt102Emulation::setConnect(bool c) -{ - EmulationLayer::setConnect(c); - if (c) - { // refresh mouse mode - if (getMode(MODE_Mouse1000)) - setMode(MODE_Mouse1000); - else - resetMode(MODE_Mouse1000); - } -} - -/* ------------------------------------------------------------------------- */ -/* */ -/* Diagnostic */ -/* */ -/* ------------------------------------------------------------------------- */ - -/*! shows the contents of the scan buffer. - - This functions is used for diagnostics. It is called by \e ReportErrorToken - to inform about strings that cannot be decoded or handled by the emulation. - - \sa ReportErrorToken -*/ - -/*! -*/ - -static void hexdump(int* s, int len) -{ int i; - for (i = 0; i < len; i++) - { - if (s[i] == '\\') - printf("\\\\"); - else - if ((s[i]) > 32 && s[i] < 127) - printf("%c",s[i]); - else - printf("\\%04x(hex)",s[i]); - } -} - -void Vt102Emulation::scan_buffer_report() -{ - if (ppos == 0 || ppos == 1 && (pbuf[0] & 0xff) >= 32) return; - printf("token: "); hexdump(pbuf,ppos); printf("\n"); -} - -/*! -*/ - -void Vt102Emulation::ReportErrorToken() -{ - printf("undecodable "); scan_buffer_report(); -} diff --git a/noncore/apps/opie-console/vt102emulation.h b/noncore/apps/opie-console/vt102emulation.h deleted file mode 100644 index 17ab449..0000000 --- a/noncore/apps/opie-console/vt102emulation.h +++ b/dev/null @@ -1,153 +0,0 @@ -/* -------------------------------------------------------------------------- */ -/* */ -/* [TEmuVt102.h] X Terminal Emulation */ -/* */ -/* -------------------------------------------------------------------------- */ -/* */ -/* Copyright (c) 1997,1998 by Lars Doelle <lars.doelle@on-line.de> */ -/* */ -/* This file is part of Konsole - an X terminal for KDE */ -/* */ -/* -------------------------------------------------------------------------- */ -/* */ -/* Ported Konsole to Qt/Embedded */ -/* */ -/* Copyright (C) 2000 by John Ryland <jryland@trolltech.com> */ -/* */ -/* -------------------------------------------------------------------------- */ -/* Ported embedded-konsole to opie-terminal */ -/* */ -/* Copyright (C) 2002 by opie developers <opie@handhelds.org> */ -/* */ -/* -------------------------------------------------------------------------- */ - -#ifndef VT102EMU_H -#define VT102EMU_H - -#include "widget_layer.h" -#include "screen.h" -#include "emulation_layer.h" -#include <qtimer.h> -#include <stdio.h> - -// - -#define MODE_AppScreen (MODES_SCREEN+0) -#define MODE_AppCuKeys (MODES_SCREEN+1) -#define MODE_AppKeyPad (MODES_SCREEN+2) -#define MODE_Mouse1000 (MODES_SCREEN+3) -#define MODE_Ansi (MODES_SCREEN+4) -#define MODE_total (MODES_SCREEN+5) - -struct DECpar -{ - BOOL mode[MODE_total]; -}; - -struct CharCodes -{ - // coding info - char charset[4]; // - int cu_cs; // actual charset. - bool graphic; // Some VT100 tricks - bool pound ; // Some VT100 tricks - bool sa_graphic; // saved graphic - bool sa_pound; // saved pound -}; - -class Vt102Emulation: public EmulationLayer -{ Q_OBJECT - -public: - - Vt102Emulation(WidgetLayer* gui); - ~Vt102Emulation(); - -public slots: // signals incoming from Widget - - void onKeyPress(QKeyEvent*); - void onMouse(int cb, int cx, int cy); - -signals: - - void changeTitle(int,const QString&); - void prevSession(); - void nextSession(); - -public: - - void reset(); - - /** - * receive a char from IOLayer - */ - void onRcvChar(int cc); - - /** - * sends a list of bytes to the IOLayer - */ - void sendString(const QByteArray&); - - /** - * @deprecated use QByteArray instead - * see sendString() above - */ - void sendString(const char *); - -public: - - BOOL getMode (int m); - - void setMode (int m); - void resetMode (int m); - void saveMode (int m); - void restoreMode(int m); - void resetModes(); - - void setConnect(bool r); - -private: - - void resetToken(); -#define MAXPBUF 80 - void pushToToken(int cc); - int pbuf[MAXPBUF]; //FIXME: overflow? - int ppos; -#define MAXARGS 15 - void addDigit(int dig); - void addArgument(); - int argv[MAXARGS]; - int argc; - void initTokenizer(); - int tbl[256]; - - void scan_buffer_report(); //FIXME: rename - void ReportErrorToken(); //FIXME: rename - - void tau(int code, int p, int q); - void XtermHack(); - - // - - void reportTerminalType(); - void reportStatus(); - void reportAnswerBack(); - void reportCursorPosition(); - void reportTerminalParms(int p); - -protected: - - unsigned short applyCharset(unsigned short c); - void setCharset(int n, int cs); - void useCharset(int n); - void setAndUseCharset(int n, int cs); - void saveCursor(); - void restoreCursor(); - void resetCharset(int scrno); - CharCodes charset[2]; - - DECpar currParm; - DECpar saveParm; -}; - -#endif // ifndef ANSIEMU_H diff --git a/noncore/apps/opie-console/widget.cpp b/noncore/apps/opie-console/widget.cpp deleted file mode 100644 index 4a578be..0000000 --- a/noncore/apps/opie-console/widget.cpp +++ b/dev/null @@ -1,1278 +0,0 @@ -/* ------------------------------------------------------------------------ */ -/* */ -/* [TEWidget.C] Terminal Emulation Widget */ -/* */ -/* ------------------------------------------------------------------------ */ -/* */ -/* Copyright (c) 1997,1998 by Lars Doelle <lars.doelle@on-line.de> */ -/* */ -/* This file is part of Konsole - an X terminal for KDE */ -/* */ -/* ------------------------------------------------------------------------ */ -/* */ -/* Ported Konsole to Qt/Embedded */ -/* */ -/* Copyright (C) 2000 by John Ryland <jryland@trolltech.com> */ -/* */ -/* -------------------------------------------------------------------------- */ - -/* ibot: - i changed - "currentSession->getEmulation()->sendString()" to - "currentSession->layer()->send()" - # this is not right! EmulationLayer should send it... - i changed all those to use emulationLayer()->send() instead - i had to create a QByteArray before... - -TODO: -alter Widget to use only QByteArray, where applicable. -*/ - - - -/*! \class Widget - - \brief Visible screen contents - - This class is responsible to map the `image' of a terminal emulation to the - display. All the dependency of the emulation to a specific GUI or toolkit is - localized here. Further, this widget has no knowledge about being part of an - emulation, it simply work within the terminal emulation framework by exposing - size and key events and by being ordered to show a new image. - - <ul> - <li> The internal image has the size of the widget (evtl. rounded up) - <li> The external image used in setImage can have any size. - <li> (internally) the external image is simply copied to the internal - when a setImage happens. During a resizeEvent no painting is done - a paintEvent is expected to follow anyway. - </ul> - - \sa TEScreen \sa Emulation -*/ - -/* FIXME: - - 'image' may also be used uninitialized (it isn't in fact) in resizeEvent - - 'font_a' not used in mouse events - - add destructor -*/ - -/* TODO - - evtl. be sensitive to `paletteChange' while using default colors. - - set different 'rounding' styles? I.e. have a mode to show clipped chars? -*/ - -// #include "config.h" -#include "widget.h" -#include <qpe/config.h> - -#include <qclipboard.h> - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <ctype.h> -#include <sys/stat.h> -#include <sys/types.h> -#include <signal.h> - -#include <assert.h> - -// #include "widget.moc" -//#include <kapp.h> -//#include <kcursor.h> -//#include <kurl.h> -//#include <kdebug.h> -//#include <klocale.h> - -#define HERE printf("%s(%d): %s\n",__FILE__,__LINE__,__FUNCTION__) -#define HCNT(Name) // { static int cnt = 1; printf("%s(%d): %s %d\n",__FILE__,__LINE__,Name,cnt++); } - -#define loc(X,Y) ((Y)*columns+(X)) - -//FIXME: the rim should normally be 1, 0 only when running in full screen mode. -#define rimX 0 // left/right rim width -#define rimY 0 // top/bottom rim high - -#define yMouseScroll 1 -// scroll increment used when dragging selection at top/bottom of window. - -/* ------------------------------------------------------------------------- */ -/* */ -/* Colors */ -/* */ -/* ------------------------------------------------------------------------- */ - -//FIXME: the default color table is in session.C now. -// We need a way to get rid of this one, here. -static const ColorEntry base_color_table[TABLE_COLORS] = -// The following are almost IBM standard color codes, with some slight -// gamma correction for the dim colors to compensate for bright X screens. -// It contains the 8 ansiterm/xterm colors in 2 intensities. -{ - // Fixme: could add faint colors here, also. - // normal - ColorEntry(QColor(0x00,0x00,0x00), 0, 0 ), ColorEntry( QColor(0xB2,0xB2,0xB2), 1, 0 ), // Dfore, Dback - ColorEntry(QColor(0x00,0x00,0x00), 0, 0 ), ColorEntry( QColor(0xB2,0x18,0x18), 0, 0 ), // Black, Red - ColorEntry(QColor(0x18,0xB2,0x18), 0, 0 ), ColorEntry( QColor(0xB2,0x68,0x18), 0, 0 ), // Green, Yellow - ColorEntry(QColor(0x18,0x18,0xB2), 0, 0 ), ColorEntry( QColor(0xB2,0x18,0xB2), 0, 0 ), // Blue, Magenta - ColorEntry(QColor(0x18,0xB2,0xB2), 0, 0 ), ColorEntry( QColor(0xB2,0xB2,0xB2), 0, 0 ), // Cyan, White - // intensiv - ColorEntry(QColor(0x00,0x00,0x00), 0, 1 ), ColorEntry( QColor(0xFF,0xFF,0xFF), 1, 0 ), - ColorEntry(QColor(0x68,0x68,0x68), 0, 0 ), ColorEntry( QColor(0xFF,0x54,0x54), 0, 0 ), - ColorEntry(QColor(0x54,0xFF,0x54), 0, 0 ), ColorEntry( QColor(0xFF,0xFF,0x54), 0, 0 ), - ColorEntry(QColor(0x54,0x54,0xFF), 0, 0 ), ColorEntry( QColor(0xB2,0x18,0xB2), 0, 0 ), - ColorEntry(QColor(0x54,0xFF,0xFF), 0, 0 ), ColorEntry( QColor(0xFF,0xFF,0xFF), 0, 0 ) -}; - -/* Note that we use ANSI color order (bgr), while IBMPC color order is (rgb) - - Code 0 1 2 3 4 5 6 7 - ----------- ------- ------- ------- ------- ------- ------- ------- ------- - ANSI (bgr) Black Red Green Yellow Blue Magenta Cyan White - IBMPC (rgb) Black Blue Green Cyan Red Magenta Yellow White -*/ - -QColor Widget::getDefaultBackColor() -{ - return color_table[DEFAULT_BACK_COLOR].color; -} - -const ColorEntry* Widget::getColorTable() const -{ - return color_table; -} - -const ColorEntry* Widget::getdefaultColorTable() const -{ - return base_color_table; -} - - -const QPixmap *Widget::backgroundPixmap() -{ - static QPixmap *bg = new QPixmap("~/qpim/main/pics/faded_bg.xpm"); - const QPixmap *pm = bg; - return pm; -} - -void Widget::setColorTable(const ColorEntry table[]) -{ - for (int i = 0; i < TABLE_COLORS; i++) color_table[i] = table[i]; - - const QPixmap* pm = backgroundPixmap(); - if (!pm) setBackgroundColor(color_table[DEFAULT_BACK_COLOR].color); - update(); -} - -//FIXME: add backgroundPixmapChanged. - -/* ------------------------------------------------------------------------- */ -/* */ -/* Font */ -/* */ -/* ------------------------------------------------------------------------- */ - -/* - 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 requiered 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 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 -}; - -static QChar vt100extended(QChar c) -{ - switch (c.unicode()) - { - case 0x25c6 : return 1; - case 0x2592 : return 2; - case 0x2409 : return 3; - case 0x240c : return 4; - case 0x240d : return 5; - case 0x240a : return 6; - case 0x00b0 : return 7; - case 0x00b1 : return 8; - case 0x2424 : return 9; - case 0x240b : return 10; - case 0x2518 : return 11; - case 0x2510 : return 12; - case 0x250c : return 13; - case 0x2514 : return 14; - case 0x253c : return 15; - case 0xf800 : return 16; - case 0xf801 : return 17; - case 0x2500 : return 18; - case 0xf803 : return 19; - case 0xf804 : return 20; - case 0x251c : return 21; - case 0x2524 : return 22; - case 0x2534 : return 23; - case 0x252c : return 24; - case 0x2502 : return 25; - case 0x2264 : return 26; - case 0x2265 : return 27; - case 0x03c0 : return 28; - case 0x2260 : return 29; - case 0x00a3 : return 30; - case 0x00b7 : return 31; - } - return c; -} - -static QChar identicalMap(QChar c) -{ - return c; -} - -void Widget::fontChange(const QFont &) -{ - QFontMetrics fm(font()); - font_h = fm.height(); - font_w = fm.maxWidth(); - font_a = fm.ascent(); -//printf("font_h: %d\n",font_h); -//printf("font_w: %d\n",font_w); -//printf("font_a: %d\n",font_a); -//printf("charset: %s\n",QFont::encodingName(font().charSet()).ascii()); -//printf("rawname: %s\n",font().rawName().ascii()); - fontMap = -#if QT_VERSION < 300 - strcmp(QFont::encodingName(font().charSet()).ascii(),"iso10646") - ? vt100extended - : -#endif - identicalMap; - propagateSize(); - update(); -} - -void Widget::setVTFont(const QFont& f) -{ - QFrame::setFont(f); -} - -QFont Widget::getVTFont() { - return font(); -} - -void Widget::setFont(const QFont &) -{ - // ignore font change request if not coming from konsole itself -} - -/* ------------------------------------------------------------------------- */ -/* */ -/* Constructor / Destructor */ -/* */ -/* ------------------------------------------------------------------------- */ - -Widget::Widget(QWidget *parent, const char *name) : QFrame(parent,name) -{ -#ifndef QT_NO_CLIPBOARD - cb = QApplication::clipboard(); - QObject::connect( (QObject*)cb, SIGNAL(dataChanged()), - this, SLOT(onClearSelection()) ); -#endif - - scrollbar = new QScrollBar(this); - scrollbar->setCursor( arrowCursor ); - connect(scrollbar, SIGNAL(valueChanged(int)), this, SLOT(scrollChanged(int))); - - Config cfg("Konsole"); - cfg.setGroup("ScrollBar"); - switch( cfg.readNumEntry("Position",2)){ - case 0: - scrollLoc = SCRNONE; - break; - case 1: - scrollLoc = SCRLEFT; - break; - case 2: - scrollLoc = SCRRIGHT; - break; - }; - - blinkT = new QTimer(this); - connect(blinkT, SIGNAL(timeout()), this, SLOT(blinkEvent())); - // blinking = FALSE; - blinking = TRUE; - - resizing = FALSE; - actSel = 0; - image = 0; - lines = 1; - columns = 1; - font_w = 1; - font_h = 1; - font_a = 1; - word_selection_mode = FALSE; - - setMouseMarks(TRUE); - setVTFont( QFont("fixed") ); - setColorTable(base_color_table); // init color table - - qApp->installEventFilter( this ); //FIXME: see below -// KCursor::setAutoHideCursor( this, true ); - - // Init DnD //////////////////////////////////////////////////////////////// - currentSession = NULL; -// setAcceptDrops(true); // attempt -// m_drop = new QPopupMenu(this); -// m_drop->insertItem( QString("Paste"), 0); -// m_drop->insertItem( QString("cd"), 1); -// connect(m_drop, SIGNAL(activated(int)), SLOT(drop_menu_activated(int))); - - // we need focus so that the auto-hide cursor feature works - setFocus(); - setFocusPolicy( WheelFocus ); -} - -//FIXME: make proper destructor -// Here's a start (David) -Widget::~Widget() -{ - qApp->removeEventFilter( this ); - if (image) free(image); -} - -/* ------------------------------------------------------------------------- */ -/* */ -/* Display Operations */ -/* */ -/* ------------------------------------------------------------------------- */ - -/*! - attributed string draw primitive -*/ - -void Widget::drawAttrStr(QPainter &paint, QRect rect, - QString& str, Character attr, BOOL pm, BOOL clear) -{ - if (pm && color_table[attr.b].transparent) - { - paint.setBackgroundMode( TransparentMode ); - if (clear) erase(rect); - } - else - { - if (blinking) - paint.fillRect(rect, color_table[attr.b].color); - else - { - paint.setBackgroundMode( OpaqueMode ); - paint.setBackgroundColor( color_table[attr.b].color ); - } - } - - if (color_table[attr.f].bold) - paint.setPen(QColor( 0x8F, 0x00, 0x00 )); - else - paint.setPen(color_table[attr.f].color); - - paint.drawText(rect.x(),rect.y()+font_a, str); - - if (attr.r & RE_UNDERLINE) - paint.drawLine(rect.left(), rect.y()+font_a+1, rect.right(),rect.y()+font_a+1 ); -} - -/*! - The image can only be set completely. - - The size of the new image may or may not match the size of the widget. -*/ - -void Widget::setImage(const Character* const newimg, int lines, int columns) -{ int y,x,len; - const QPixmap* pm = backgroundPixmap(); - QPainter paint; - setUpdatesEnabled(FALSE); - paint.begin( this ); -HCNT("setImage"); - - QPoint tL = contentsRect().topLeft(); - int tLx = tL.x(); - int tLy = tL.y(); - hasBlinker = FALSE; - - int cf = -1; // undefined - int cb = -1; // undefined - int cr = -1; // undefined - - int lins = QMIN(this->lines, QMAX(0,lines )); - int cols = QMIN(this->columns,QMAX(0,columns)); - QChar *disstrU = new QChar[cols]; - -//{ static int cnt = 0; printf("setImage %d\n",cnt++); } - for (y = 0; y < lins; y++) - { - const Character* lcl = &image[y*this->columns]; - const Character* const ext = &newimg[y*columns]; - if (!resizing) // not while resizing, we're expecting a paintEvent - for (x = 0; x < cols; x++) - { - hasBlinker |= (ext[x].r & RE_BLINK); - if (ext[x] != lcl[x]) - { - cr = ext[x].r; - cb = ext[x].b; - if (ext[x].f != cf) cf = ext[x].f; - int lln = cols - x; - disstrU[0] = fontMap(ext[x+0].c); - for (len = 1; len < lln; len++) - { - if (ext[x+len].f != cf || ext[x+len].b != cb || ext[x+len].r != cr || - ext[x+len] == lcl[x+len] ) - break; - disstrU[len] = fontMap(ext[x+len].c); - } - QString unistr(disstrU,len); - drawAttrStr(paint, - QRect(blX+tLx+font_w*x,bY+tLy+font_h*y,font_w*len,font_h), - unistr, ext[x], pm != NULL, true); - x += len - 1; - } - } - // finally, make `image' become `newimg'. - memcpy((void*)lcl,(const void*)ext,cols*sizeof(Character)); - } - drawFrame( &paint ); - paint.end(); - setUpdatesEnabled(TRUE); - if ( hasBlinker && !blinkT->isActive()) blinkT->start(1000); // 1000 ms - if (!hasBlinker && blinkT->isActive()) { blinkT->stop(); blinking = FALSE; } - delete [] disstrU; -} - -// paint Event //////////////////////////////////////////////////// - -/*! - The difference of this routine vs. the `setImage' is, - that the drawing does not include a difference analysis - between the old and the new image. Instead, the internal - image is used and the painting bound by the PaintEvent box. -*/ - -void Widget::paintEvent( QPaintEvent* pe ) -{ - -//{ static int cnt = 0; printf("paint %d\n",cnt++); } - const QPixmap* pm = backgroundPixmap(); - QPainter paint; - setUpdatesEnabled(FALSE); - paint.begin( this ); - paint.setBackgroundMode( TransparentMode ); -HCNT("paintEvent"); - - // Note that the actual widget size can be slightly larger - // that the image (the size is truncated towards the smaller - // number of characters in `resizeEvent'. The paint rectangle - // can thus be larger than the image, but less then the size - // of one character. - - QRect rect = pe->rect().intersect(contentsRect()); - - QPoint tL = contentsRect().topLeft(); - int tLx = tL.x(); - int tLy = tL.y(); - - int lux = QMIN(columns-1, QMAX(0,(rect.left() - tLx - blX ) / font_w)); - int luy = QMIN(lines-1, QMAX(0,(rect.top() - tLy - bY ) / font_h)); - int rlx = QMIN(columns-1, QMAX(0,(rect.right() - tLx - blX ) / font_w)); - int rly = QMIN(lines-1, QMAX(0,(rect.bottom() - tLy - bY ) / font_h)); - - /* - printf("paintEvent: %d..%d, %d..%d (%d..%d, %d..%d)\n",lux,rlx,luy,rly, - rect.left(), rect.right(), rect.top(), rect.bottom()); - */ - - // if (pm != NULL && color_table[image->b].transparent) - // erase(rect); - // BL: I have no idea why we need this, and it breaks the refresh. - - QChar *disstrU = new QChar[columns]; - for (int y = luy; y <= rly; y++) - for (int x = lux; x <= rlx; x++) - { - int len = 1; - disstrU[0] = fontMap(image[loc(x,y)].c); - int cf = image[loc(x,y)].f; - int cb = image[loc(x,y)].b; - int cr = image[loc(x,y)].r; - while (x+len <= rlx && - image[loc(x+len,y)].f == cf && - image[loc(x+len,y)].b == cb && - image[loc(x+len,y)].r == cr ) - { - disstrU[len] = fontMap(image[loc(x+len,y)].c); - len += 1; - } - QString unistr(disstrU,len); - drawAttrStr(paint, - QRect(blX+tLx+font_w*x,bY+tLy+font_h*y,font_w*len,font_h), - unistr, image[loc(x,y)], pm != NULL, false); - x += len - 1; - } - delete [] disstrU; - drawFrame( &paint ); - paint.end(); - setUpdatesEnabled(TRUE); -} - -void Widget::blinkEvent() -{ - blinking = !blinking; - repaint(FALSE); -} - -/* ------------------------------------------------------------------------- */ -/* */ -/* Resizing */ -/* */ -/* ------------------------------------------------------------------------- */ - -void Widget::resizeEvent(QResizeEvent* ev) -{ -// printf("resize: %d,%d\n",ev->size().width(),ev->size().height()); - //printf("approx: %d,%d\n",ev->size().width()/font_w,ev->size().height()/font_h); - //printf("leaves: %d,%d\n",ev->size().width()%font_w,ev->size().height()%font_h); - //printf("curren: %d,%d\n",width(),height()); -HCNT("resizeEvent"); - - // see comment in `paintEvent' concerning the rounding. - //FIXME: could make a routine here; check width(),height() - assert(ev->size().width() == width()); - assert(ev->size().height() == height()); - - propagateSize(); -} - -void Widget::propagateSize() -{ - Character* oldimg = image; - int oldlin = lines; - int oldcol = columns; - makeImage(); - // we copy the old image to reduce flicker - int lins = QMIN(oldlin,lines); - int cols = QMIN(oldcol,columns); - if (oldimg) - { - for (int lin = 0; lin < lins; lin++) - memcpy((void*)&image[columns*lin], - (void*)&oldimg[oldcol*lin],cols*sizeof(Character)); - free(oldimg); //FIXME: try new,delete - } - else - clearImage(); - - //NOTE: control flows from the back through the chest right into the eye. - // `emu' will call back via `setImage'. - - resizing = TRUE; - emit changedImageSizeSignal(lines, columns); // expose resizeEvent - resizing = FALSE; -} - -/* ------------------------------------------------------------------------- */ -/* */ -/* Scrollbar */ -/* */ -/* ------------------------------------------------------------------------- */ - -void Widget::scrollChanged(int) -{ - emit changedHistoryCursor(scrollbar->value()); //expose -} - -void Widget::setScroll(int cursor, int slines) -{ - disconnect(scrollbar, SIGNAL(valueChanged(int)), this, SLOT(scrollChanged(int))); - scrollbar->setRange(0,slines); - scrollbar->setSteps(1,lines); - scrollbar->setValue(cursor); - connect(scrollbar, SIGNAL(valueChanged(int)), this, SLOT(scrollChanged(int))); -} - -void Widget::setScrollbarLocation(int loc) -{ - if (scrollLoc == loc) return; // quickly - scrollLoc = loc; - propagateSize(); - update(); -} - -/* ------------------------------------------------------------------------- */ -/* */ -/* Mouse */ -/* */ -/* ------------------------------------------------------------------------- */ - -/*! - Three different operations can be performed using the mouse, and the - routines in this section serve all of them: - - 1) The press/release events are exposed to the application - 2) Marking (press and move left button) and Pasting (press middle button) - 3) The right mouse button is used from the configuration menu - - NOTE: During the marking process we attempt to keep the cursor within - the bounds of the text as being displayed by setting the mouse position - whenever the mouse has left the text area. - - Two reasons to do so: - 1) QT does not allow the `grabMouse' to confine-to the Widget. - Thus a `XGrapPointer' would have to be used instead. - 2) Even if so, this would not help too much, since the text area - of the Widget is normally not identical with it's bounds. - - The disadvantage of the current handling is, that the mouse can visibly - leave the bounds of the widget and is then moved back. Because of the - current construction, and the reasons mentioned above, we cannot do better - without changing the overall construction. -*/ - -/*! -*/ - -void Widget::mousePressEvent(QMouseEvent* ev) -{ -//printf("press [%d,%d] %d\n",ev->x()/font_w,ev->y()/font_h,ev->button()); - if ( !contentsRect().contains(ev->pos()) ) return; - QPoint tL = contentsRect().topLeft(); - int tLx = tL.x(); - int tLy = tL.y(); - - word_selection_mode = FALSE; - -//printf("press top left [%d,%d] by=%d\n",tLx,tLy, bY); - if ( ev->button() == LeftButton) - { - QPoint pos = QPoint((ev->x()-tLx-blX)/font_w,(ev->y()-tLy-bY)/font_h); - - if ( ev->state() & ControlButton ) preserve_line_breaks = FALSE ; - - if (mouse_marks || (ev->state() & ShiftButton)) - { - emit clearSelectionSignal(); - iPntSel = pntSel = pos; - actSel = 1; // left mouse button pressed but nothing selected yet. - grabMouse( /*crossCursor*/ ); // handle with care! - } - else - { - emit mouseSignal( 0, pos.x() + 1, pos.y() + 1 ); // left button - } - } - if ( ev->button() == MidButton ) - { - emitSelection(); - } - if ( ev->button() == RightButton ) // Configure - { - emit configureRequest( this, ev->state()&(ShiftButton|ControlButton), ev->x(), ev->y() ); - } -} - -void Widget::mouseMoveEvent(QMouseEvent* ev) -{ - // for auto-hiding the cursor, we need mouseTracking - if (ev->state() == NoButton ) return; - - if (actSel == 0) return; - - // don't extend selection while pasting - if (ev->state() & MidButton) return; - - //if ( !contentsRect().contains(ev->pos()) ) return; - QPoint tL = contentsRect().topLeft(); - int tLx = tL.x(); - int tLy = tL.y(); - int scroll = scrollbar->value(); - - // we're in the process of moving the mouse with the left button pressed - // the mouse cursor will kept catched within the bounds of the text in - // this widget. - - // Adjust position within text area bounds. See FIXME above. - QPoint pos = ev->pos(); - if ( pos.x() < tLx+blX ) pos.setX( tLx+blX ); - if ( pos.x() > tLx+blX+columns*font_w-1 ) pos.setX( tLx+blX+columns*font_w ); - if ( pos.y() < tLy+bY ) pos.setY( tLy+bY ); - if ( pos.y() > tLy+bY+lines*font_h-1 ) pos.setY( tLy+bY+lines*font_h-1 ); - // check if we produce a mouse move event by this - if ( pos != ev->pos() ) cursor().setPos(mapToGlobal(pos)); - - if ( pos.y() == tLy+bY+lines*font_h-1 ) - { - scrollbar->setValue(scrollbar->value()+yMouseScroll); // scrollforward - } - if ( pos.y() == tLy+bY ) - { - scrollbar->setValue(scrollbar->value()-yMouseScroll); // scrollback - } - - QPoint here = QPoint((pos.x()-tLx-blX)/font_w,(pos.y()-tLy-bY)/font_h); - QPoint ohere; - bool swapping = FALSE; - - if ( word_selection_mode ) - { - // Extend to word boundaries - int i; - int selClass; - - bool left_not_right = ( here.y() < iPntSel.y() || - here.y() == iPntSel.y() && here.x() < iPntSel.x() ); - bool old_left_not_right = ( pntSel.y() < iPntSel.y() || - pntSel.y() == iPntSel.y() && pntSel.x() < iPntSel.x() ); - swapping = left_not_right != old_left_not_right; - - // Find left (left_not_right ? from here : from start) - QPoint left = left_not_right ? here : iPntSel; - i = loc(left.x(),left.y()); - selClass = charClass(image[i].c); - while ( left.x() > 0 && charClass(image[i-1].c) == selClass ) - { i--; left.rx()--; } - - // Find left (left_not_right ? from start : from here) - QPoint right = left_not_right ? iPntSel : here; - i = loc(right.x(),right.y()); - selClass = charClass(image[i].c); - while ( right.x() < columns-1 && charClass(image[i+1].c) == selClass ) - { i++; right.rx()++; } - - // Pick which is start (ohere) and which is extension (here) - if ( left_not_right ) - { - here = left; ohere = right; - } - else - { - here = right; ohere = left; - } - } - - if (here == pntSel && scroll == scrollbar->value()) return; // not moved - - if ( word_selection_mode ) { - if ( actSel < 2 || swapping ) { - emit beginSelectionSignal( ohere.x(), ohere.y() ); - } - } else if ( actSel < 2 ) { - emit beginSelectionSignal( pntSel.x(), pntSel.y() ); - } - - actSel = 2; // within selection - pntSel = here; - emit extendSelectionSignal( here.x(), here.y() ); -} - -void Widget::mouseReleaseEvent(QMouseEvent* ev) -{ -//printf("release [%d,%d] %d\n",ev->x()/font_w,ev->y()/font_h,ev->button()); - if ( ev->button() == LeftButton) - { - if ( actSel > 1 ) emit endSelectionSignal(preserve_line_breaks); - preserve_line_breaks = TRUE; - actSel = 0; - - //FIXME: emits a release event even if the mouse is - // outside the range. The procedure used in `mouseMoveEvent' - // applies here, too. - - QPoint tL = contentsRect().topLeft(); - int tLx = tL.x(); - int tLy = tL.y(); - - if (!mouse_marks && !(ev->state() & ShiftButton)) - emit mouseSignal( 3, // release - (ev->x()-tLx-blX)/font_w + 1, - (ev->y()-tLy-bY)/font_h + 1 ); - releaseMouse(); - } -} - -void Widget::mouseDoubleClickEvent(QMouseEvent* ev) -{ - if ( ev->button() != LeftButton) return; - - QPoint tL = contentsRect().topLeft(); - int tLx = tL.x(); - int tLy = tL.y(); - QPoint pos = QPoint((ev->x()-tLx-blX)/font_w,(ev->y()-tLy-bY)/font_h); - - // pass on double click as two clicks. - if (!mouse_marks && !(ev->state() & ShiftButton)) - { - emit mouseSignal( 0, pos.x()+1, pos.y()+1 ); // left button - emit mouseSignal( 3, pos.x()+1, pos.y()+1 ); // release - emit mouseSignal( 0, pos.x()+1, pos.y()+1 ); // left button - return; - } - - - emit clearSelectionSignal(); - QPoint bgnSel = pos; - QPoint endSel = QPoint((ev->x()-tLx-blX)/font_w,(ev->y()-tLy-bY)/font_h); - int i = loc(bgnSel.x(),bgnSel.y()); - iPntSel = bgnSel; - - word_selection_mode = TRUE; - - // find word boundaries... - int selClass = charClass(image[i].c); - { - // set the start... - int x = bgnSel.x(); - while ( x > 0 && charClass(image[i-1].c) == selClass ) - { i--; x--; } - bgnSel.setX(x); - emit beginSelectionSignal( bgnSel.x(), bgnSel.y() ); - - // set the end... - i = loc( endSel.x(), endSel.y() ); - x = endSel.x(); - while( x < columns-1 && charClass(image[i+1].c) == selClass ) - { i++; x++ ; } - endSel.setX(x); - actSel = 2; // within selection - emit extendSelectionSignal( endSel.x(), endSel.y() ); - emit endSelectionSignal(preserve_line_breaks); - preserve_line_breaks = TRUE; - } -} - -void Widget::focusInEvent( QFocusEvent * ) -{ - - // do nothing, to prevent repainting -} - - -void Widget::focusOutEvent( QFocusEvent * ) -{ - // do nothing, to prevent repainting -} - -bool Widget::focusNextPrevChild( bool next ) -{ - if (next) - return false; // This disables changing the active part in konqueror - // when pressing Tab - return QFrame::focusNextPrevChild( next ); -} - - -int Widget::charClass(char ch) const -{ - // This might seem like overkill, but imagine if ch was a Unicode - // character (Qt 2.0 QChar) - it might then be sensible to separate - // the different language ranges, etc. - - if ( isspace(ch) ) return ' '; - - static const char *word_characters = ":@-./_~"; - if ( isalnum(ch) || strchr(word_characters, ch) ) - return 'a'; - - // Everything else is weird - return 1; -} - -void Widget::setMouseMarks(bool on) -{ - mouse_marks = on; - setCursor( mouse_marks ? ibeamCursor : arrowCursor ); -} - -/* ------------------------------------------------------------------------- */ -/* */ -/* Clipboard */ -/* */ -/* ------------------------------------------------------------------------- */ - -#undef KeyPress - -void Widget::emitSelection() -// Paste Clipboard by simulating keypress events -{ -#ifndef QT_NO_CLIPBOARD - QString text = QApplication::clipboard()->text(); - if ( ! text.isNull() ) - { - text.replace(QRegExp("\n"), "\r"); - QKeyEvent e(QEvent::KeyPress, 0, -1, 0, text); - emit keyPressedSignal(&e); // expose as a big fat keypress event - emit clearSelectionSignal(); - } -#endif -} - -void Widget::emitText(QString text) -{ - QKeyEvent e(QEvent::KeyPress, 0, -1, 0, text); - emit keyPressedSignal(&e); // expose as a big fat keypress event -} - -void Widget::pasteClipboard( ) -{ - emitSelection(); -} - -void Widget::setSelection(const QString& t) -{ -#ifndef QT_NO_CLIPBOARD - // Disconnect signal while WE set the clipboard - QObject *cb = QApplication::clipboard(); - QObject::disconnect( cb, SIGNAL(dataChanged()), - this, SLOT(onClearSelection()) ); - - QApplication::clipboard()->setText(t); - - QObject::connect( cb, SIGNAL(dataChanged()), - this, SLOT(onClearSelection()) ); -#endif -} - -void Widget::onClearSelection() -{ - emit clearSelectionSignal(); -} - -/* ------------------------------------------------------------------------- */ -/* */ -/* Keyboard */ -/* */ -/* ------------------------------------------------------------------------- */ - -//FIXME: an `eventFilter' has been installed instead of a `keyPressEvent' -// due to a bug in `QT' or the ignorance of the author to prevent -// repaint events being emitted to the screen whenever one leaves -// or reenters the screen to/from another application. -// -// Troll says one needs to change focusInEvent() and focusOutEvent(), -// which would also let you have an in-focus cursor and an out-focus -// cursor like xterm does. - -// for the auto-hide cursor feature, I added empty focusInEvent() and -// focusOutEvent() so that update() isn't called. -// For auto-hide, we need to get keypress-events, but we only get them when -// we have focus. - -void Widget::doScroll(int lines) -{ - scrollbar->setValue(scrollbar->value()+lines); -} - -bool Widget::eventFilter( QObject *obj, QEvent *e ) -{ - if ( (e->type() == QEvent::Accel || - e->type() == QEvent::AccelAvailable ) && qApp->focusWidget() == this ) { - static_cast<QKeyEvent *>( e )->ignore(); - return true; - } - if ( obj != this /* when embedded */ && obj != parent() /* when standalone */ ) - return FALSE; // not us - if ( e->type() == QEvent::Wheel) { - QApplication::sendEvent(scrollbar, e); - } - -#ifdef FAKE_CTRL_AND_ALT - static bool control = FALSE; - static bool alt = FALSE; - bool dele=FALSE; - if ( e->type() == QEvent::KeyPress || e->type() == QEvent::KeyRelease ) { - QKeyEvent* ke = (QKeyEvent*)e; - bool keydown = e->type() == QEvent::KeyPress || ke->isAutoRepeat(); - switch (ke->key()) { - case Key_F9: // let this be "Control" - control = keydown; - e = new QKeyEvent(QEvent::KeyPress, Key_Control, 0, ke->state()); - dele=TRUE; - break; - case Key_F13: // let this be "Alt" - alt = keydown; - e = new QKeyEvent(QEvent::KeyPress, Key_Alt, 0, ke->state()); - dele=TRUE; - break; - default: - if ( control ) { - int a = toupper(ke->ascii())-64; - if ( a >= 0 && a < ' ' ) { - e = new QKeyEvent(e->type(), ke->key(), - a, ke->state()|ControlButton, QChar(a,0)); - dele=TRUE; - } - } - if ( alt ) { - e = new QKeyEvent(e->type(), ke->key(), - ke->ascii(), ke->state()|AltButton, ke->text()); - dele=TRUE; - } - } - } -#endif - - if ( e->type() == QEvent::KeyPress ) { - QKeyEvent* ke = (QKeyEvent*)e; - actSel=0; // Key stroke implies a screen update, so Widget won't - // know where the current selection is. - - if( ke->state() == ShiftButton && ke->key() == Key_Tab) { //lets hardcode this sucker - emitText("\\"); // expose - } else - emit keyPressedSignal(ke); // expose - ke->accept(); -#ifdef FAKE_CTRL_AND_ALT - if ( dele ) delete e; -#endif - return true; // stop the event - } - if ( e->type() == QEvent::Enter ) { - QObject::disconnect( (QObject*)cb, SIGNAL(dataChanged()), - this, SLOT(onClearSelection()) ); - } - if ( e->type() == QEvent::Leave ) { - QObject::connect( (QObject*)cb, SIGNAL(dataChanged()), - this, SLOT(onClearSelection()) ); - } - return QFrame::eventFilter( obj, e ); -} - -/* ------------------------------------------------------------------------- */ -/* */ -/* Frame */ -/* */ -/* ------------------------------------------------------------------------- */ - -void Widget::frameChanged() -{ - propagateSize(); - update(); -} - -/* ------------------------------------------------------------------------- */ -/* */ -/* Sound */ -/* */ -/* ------------------------------------------------------------------------- */ - -void Widget::Bell() -{ - QApplication::beep(); -} - -/* ------------------------------------------------------------------------- */ -/* */ -/* Auxiluary */ -/* */ -/* ------------------------------------------------------------------------- */ - -void Widget::clearImage() -// initialize the image -// for internal use only -{ - for (int y = 0; y < lines; y++) - for (int x = 0; x < columns; x++) - { - image[loc(x,y)].c = 0xff; //' '; - image[loc(x,y)].f = 0xff; //DEFAULT_FORE_COLOR; - image[loc(x,y)].b = 0xff; //DEFAULT_BACK_COLOR; - image[loc(x,y)].r = 0xff; //DEFAULT_RENDITION; - } -} - -// Create Image /////////////////////////////////////////////////////// - -void Widget::calcGeometry() -{ - //FIXME: set rimX == rimY == 0 when running in full screen mode. - - scrollbar->resize(QApplication::style().scrollBarExtent().width(), - contentsRect().height()); - switch(scrollLoc) - { - case SCRNONE : - columns = ( contentsRect().width() - 2 * rimX ) / font_w; - blX = (contentsRect().width() - (columns*font_w) ) / 2; - brX = blX; - scrollbar->hide(); - break; - case SCRLEFT : - columns = ( contentsRect().width() - 2 * rimX - scrollbar->width()) / font_w; - brX = (contentsRect().width() - (columns*font_w) - scrollbar->width() ) / 2; - blX = brX + scrollbar->width(); - scrollbar->move(contentsRect().topLeft()); - scrollbar->show(); - break; - case SCRRIGHT: - columns = ( contentsRect().width() - 2 * rimX - scrollbar->width()) / font_w; - blX = (contentsRect().width() - (columns*font_w) - scrollbar->width() ) / 2; - brX = blX; - scrollbar->move(contentsRect().topRight() - QPoint(scrollbar->width()-1,0)); - scrollbar->show(); - break; - } - //FIXME: support 'rounding' styles - lines = ( contentsRect().height() - 2 * rimY ) / font_h; - bY = (contentsRect().height() - (lines *font_h)) / 2; -} - -void Widget::makeImage() -//FIXME: rename 'calcGeometry? -{ - calcGeometry(); - image = (Character*) malloc(lines*columns*sizeof(Character)); - clearImage(); -} - -// calculate the needed size -QSize Widget::calcSize(int cols, int lins) const -{ - int frw = width() - contentsRect().width(); - int frh = height() - contentsRect().height(); - int scw = (scrollLoc==SCRNONE?0:scrollbar->width()); - return QSize( font_w*cols + 2*rimX + frw + scw, font_h*lins + 2*rimY + frh ); -} - -QSize Widget::sizeHint() const -{ - return size(); -} - -void Widget::styleChange(QStyle &) -{ - propagateSize(); -} - -#ifndef QT_NO_DRAGANDDROP - -/* --------------------------------------------------------------------- */ -/* */ -/* Drag & Drop */ -/* */ -/* --------------------------------------------------------------------- */ - - -void Widget::dragEnterEvent(QDragEnterEvent* e) -{ - e->accept(QTextDrag::canDecode(e) || - QUriDrag::canDecode(e)); -} - -void Widget::dropEvent(QDropEvent* event) -{ - // The current behaviour when url(s) are dropped is - // * if there is only ONE url and if it's a LOCAL one, ask for paste or cd - // * in all other cases, just paste - // (for non-local ones, or for a list of URLs, 'cd' is nonsense) - QStrList strlist; - int file_count = 0; - dropText = ""; - bool bPopup = true; - - if(QUriDrag::decode(event, strlist)) { - if (strlist.count()) { - for(const char* p = strlist.first(); p; p = strlist.next()) { - if(file_count++ > 0) { - dropText += " "; - bPopup = false; // more than one file, don't popup - } - -/* - KURL url(p); - if (url.isLocalFile()) { - dropText += url.path(); // local URL : remove protocol - } - else { - dropText += url.prettyURL(); - bPopup = false; // a non-local file, don't popup - } -*/ - - } - - if (bPopup) - // m_drop->popup(pos() + event->pos()); - m_drop->popup(mapToGlobal(event->pos())); - else - { - if (currentSession) { - //currentSession->getEmulation()->sendString(dropText.local8Bit()); - QByteArray tmp; - // ibot: this should be pretty wrong... - // now it sends to the right layer - currentSession-> emulationLayer()->send( tmp.setRawData( dropText.local8Bit())); - } - // kdDebug() << "Drop:" << dropText.local8Bit() << "\n"; - } - } - } - else if(QTextDrag::decode(event, dropText)) { -// kdDebug() << "Drop:" << dropText.local8Bit() << "\n"; - if (currentSession) { - //currentSession->getEmulation()->sendString(dropText.local8Bit()); - QByteArray tmp; - currentSession->emulationLayer()->send( tmp.setRawData( dropText.local8Bit())); - } - // Paste it - } -} -#endif - - -void Widget::drop_menu_activated(int item) -{ -#ifndef QT_NO_DRAGANDDROP - QByteArray tmp; - switch (item) - { - case 0: // paste - //currentSession->getEmulation()->sendString(dropText.local8Bit()); - currentSession->emulationLayer()->send( tmp.setRawData( dropText.local8Bit())); - -// KWM::activate((Window)this->winId()); - break; - case 1: // cd ... - //currentSession->getEmulation()->sendString("cd "); - tmp.setRawData( "cd " ); - currentSession->emulationLayer()->send( tmp ); - struct stat statbuf; - if ( ::stat( QFile::encodeName( dropText ), &statbuf ) == 0 ) - { - if ( !S_ISDIR(statbuf.st_mode) ) - { -/* - KURL url; - url.setPath( dropText ); - dropText = url.directory( true, false ); // remove filename -*/ - } - } - dropText.replace(QRegExp(" "), "\\ "); // escape spaces - QByteArray tmp2; - tmp.setRawDate( dropText.local8Bit() + "\n" ); - //currentSession->getEmulation()->sendString(dropText.local8Bit()); - //currentSession->getEmulation()->sendString("\n"); - currentSession->emulationLayer()->send( tmp ); -// KWM::activate((Window)this->winId()); - break; - } -#endif -} - diff --git a/noncore/apps/opie-console/widget.h b/noncore/apps/opie-console/widget.h deleted file mode 100644 index cfd709c..0000000 --- a/noncore/apps/opie-console/widget.h +++ b/dev/null @@ -1,213 +0,0 @@ -/* ----------------------------------------------------------------------- */ -/* */ -/* [widget.h] Terminal Emulation Widget */ -/* */ -/* ----------------------------------------------------------------------- */ -/* */ -/* Copyright (c) 1997,1998 by Lars Doelle <lars.doelle@on-line.de> */ -/* */ -/* This file was part of Konsole - an X terminal for KDE */ -/* */ -/* ----------------------------------------------------------------------- */ -/* */ -/* Ported Konsole to Qt/Embedded */ -/* */ -/* Copyright (C) 2000 by John Ryland <jryland@trolltech.com> */ -/* */ -/* -------------------------------------------------------------------------- */ -/* */ -/* modified to suit opie-console */ -/* */ -/* Copyright (c) 2002 by opie developers <opie@handhelds.org> */ -/* */ -/* ------------------------------------------------------------------------ */ - -// ibot: TODO * - -#ifndef WIDGET_H -#define WIDGET_H - -#include <qapplication.h> -#include <qwidget.h> -#include <qlabel.h> -#include <qtimer.h> -#include <qcolor.h> -#include <qkeycode.h> -#include <qscrollbar.h> - -#include <qpopupmenu.h> - -#include "common.h" - -extern unsigned short vt100_graphics[32]; - -class Session; - -// class Konsole; - -class Widget : public QFrame -// a widget representing attributed text -{ Q_OBJECT - -// friend class Konsole; - -public: - - Widget(QWidget *parent=0, const char *name=0); - virtual ~Widget(); - -public: - - QColor getDefaultBackColor(); - - const ColorEntry* getColorTable() const; - const ColorEntry* getdefaultColorTable() const; - void setColorTable(const ColorEntry table[]); - - void setScrollbarLocation(int loc); - enum { SCRNONE=0, SCRLEFT=1, SCRRIGHT=2 }; - - void setScroll(int cursor, int lines); - void doScroll(int lines); - - void emitSelection(); - -public: - - void setImage(const Character* const newimg, int lines, int columns); - - int Lines() { return lines; } - int Columns() { return columns; } - - void calcGeometry(); - void propagateSize(); - QSize calcSize(int cols, int lins) const; - - QSize sizeHint() const; - -public: - - void Bell(); - void emitText(QString text); - void pasteClipboard(); - -signals: - - void keyPressedSignal(QKeyEvent *e); - void mouseSignal(int cb, int cx, int cy); - void changedImageSizeSignal(int lines, int columns); - void changedHistoryCursor(int value); - void configureRequest( Widget*, int state, int x, int y ); - - void clearSelectionSignal(); - void beginSelectionSignal( const int x, const int y ); - void extendSelectionSignal( const int x, const int y ); - void endSelectionSignal(const BOOL preserve_line_breaks); - - -protected: - - virtual void styleChange( QStyle& ); - - bool eventFilter( QObject *, QEvent * ); - - void drawAttrStr(QPainter &paint, QRect rect, - QString& str, Character attr, BOOL pm, BOOL clear); - void paintEvent( QPaintEvent * ); - - void resizeEvent(QResizeEvent*); - - void fontChange(const QFont &font); - void frameChanged(); - - void mouseDoubleClickEvent(QMouseEvent* ev); - void mousePressEvent( QMouseEvent* ); - void mouseReleaseEvent( QMouseEvent* ); - void mouseMoveEvent( QMouseEvent* ); - - void focusInEvent( QFocusEvent * ); - void focusOutEvent( QFocusEvent * ); - bool focusNextPrevChild( bool next ); - -#ifndef QT_NO_DRAGANDDROP - // Dnd - void dragEnterEvent(QDragEnterEvent* event); - void dropEvent(QDropEvent* event); -#endif - - virtual int charClass(char) const; - - void clearImage(); - -public: - const QPixmap *backgroundPixmap(); - - void setSelection(const QString &t); - - virtual void setFont(const QFont &); - void setVTFont(const QFont &); - QFont getVTFont(); - - void setMouseMarks(bool on); - -public slots: - - void onClearSelection(); - -protected slots: - - void scrollChanged(int value); - void blinkEvent(); - -private: - - QChar (*fontMap)(QChar); // possible vt100 font extention - - bool fixed_font; // has fixed pitch - int font_h; // height - int font_w; // width - int font_a; // ascend - - int blX; // actual offset (left) - int brX; // actual offset (right) - int bY; // actual offset - - int lines; - int columns; - Character *image; // [lines][columns] - - ColorEntry color_table[TABLE_COLORS]; - - BOOL resizing; - bool mouse_marks; - - void makeImage(); - - QPoint iPntSel; // initial selection point - QPoint pntSel; // current selection point - int actSel; // selection state - BOOL word_selection_mode; - BOOL preserve_line_breaks; - - QClipboard* cb; - QScrollBar* scrollbar; - int scrollLoc; - -//#define SCRNONE 0 -//#define SCRLEFT 1 -//#define SCRRIGHT 2 - - BOOL blinking; // hide text in paintEvent - BOOL hasBlinker; // has characters to blink - QTimer* blinkT; // active when hasBlinker - QPopupMenu* m_drop; - QString dropText; - public: - // current session in this widget - // ibot: switch from TESession to Session! - Session *currentSession; -private slots: - void drop_menu_activated(int item); -}; - -#endif // TE_WIDGET_H diff --git a/noncore/apps/opie-console/widget_layer.cpp b/noncore/apps/opie-console/widget_layer.cpp deleted file mode 100644 index afded92..0000000 --- a/noncore/apps/opie-console/widget_layer.cpp +++ b/dev/null @@ -1,242 +0,0 @@ -/* ------------------------------------------------------------------------- */ -/* */ -/* widget_layer.cpp Widget Layer */ -/* */ -/* opie developers <opie@handhelds.org> */ -/* */ -/* ------------------------------------------------------------------------- */ - - - -#include "widget_layer.h" - - -#include <string.h> -//#include < - - - - -WidgetLayer::WidgetLayer( const Profile &config, QWidget *parent, const char *name ) : QFrame( parent, name ) -{ - // get the clipboard - m_clipboard = QApplication::clipboard(); - - // when data on clipboard changes, clear selection - QObject::connect( (QObject*) m_clipboard, SIGNAL( dataChanged() ), - (QObject*)this, SLOT( onClearSelection() ) ); - - // initialize vars: - m_lines = 1; - m_columns = 1; - m_resizing = false; - - // just for demonstrating - //m_image = QArray<Character>( m_lines * m_columns ); - m_image = QArray<Character>( 1 ); - - // we need to install an event filter, - // to emit keypresses. - qApp->installEventFilter( this ); - -} - - -WidgetLayer::~WidgetLayer() -{ - // clean up - delete m_image; -} - - -QSize WidgetLayer::sizeHint() -{ - return size(); -} - - -/* --------------------------------- audio ---------------------------------- */ - -void WidgetLayer::bell() -{ - QApplication::beep(); -} - -bool WidgetLayer::eventFilter( QObject *obj, QEvent *e ) -{ - if ( (e->type() == QEvent::Accel || - e->type() == QEvent::AccelAvailable ) && qApp->focusWidget() == this ) { - static_cast<QKeyEvent *>( e )->ignore(); - return true; - } - if ( obj != this /* when embedded */ && obj != parent() /* when standalone */ ) - return false; // not us - -#ifdef FAKE_CTRL_AND_ALT - static bool control = false; - static bool alt = false; - bool dele = false; - if ( e->type() == QEvent::KeyPress || e->type() == QEvent::KeyRelease ) { - QKeyEvent* ke = (QKeyEvent*)e; - bool keydown = e->type() == QEvent::KeyPress || ke->isAutoRepeat(); - switch (ke->key()) { - case Key_F9: // let this be "Control" - control = keydown; - e = new QKeyEvent(QEvent::KeyPress, Key_Control, 0, ke->state()); - dele=TRUE; - break; - case Key_F13: // let this be "Alt" - alt = keydown; - e = new QKeyEvent(QEvent::KeyPress, Key_Alt, 0, ke->state()); - dele=TRUE; - break; - default: - if ( control ) { - int a = toupper(ke->ascii())-64; - if ( a >= 0 && a < ' ' ) { - e = new QKeyEvent(e->type(), ke->key(), - a, ke->state()|ControlButton, -QChar(a,0)); - dele=TRUE; - } - } - if ( alt ) { - e = new QKeyEvent(e->type(), ke->key(), - ke->ascii(), ke->state()|AltButton, ke->text()); - dele=TRUE; - } - } - } -#endif - - if ( e->type() == QEvent::KeyPress ) { - QKeyEvent* ke = (QKeyEvent*)e; - //actSel=0; // Key stroke implies a screen update, so Widget won't - // know where the current selection is. - - if( ke->state() == ShiftButton && ke->key() == Key_Tab) { //lets hardcode this sucker - insertText("\\"); // expose - } else - emit keyPressed( ke ); // expose - ke->accept(); -#ifdef FAKE_CTRL_AND_ALT - if ( dele ) delete e; -#endif - return true; // stop the event - } - return QFrame::eventFilter( obj, e ); -} - - -/* --------------------------------- screen --------------------------------- */ - - -void WidgetLayer::propagateSize() -{ - QArray<Character> oldimage = m_image.copy(); - int oldlines = m_lines; - int oldcolumns = m_columns; - - makeImage(); - - // copy old image, to reduce flicker - if ( ! oldimage.isEmpty() ) - { - int lins = QMIN( oldlines, m_lines ); - int cols = QMIN( oldcolumns, m_columns ); - for ( int lin = 0; lin < lins; ++lin ) - { - memcpy( (void*) &m_image[m_columns*lin], - (void*) &oldimage[oldcolumns*lin], - cols*sizeof( Character ) ); - } - } - else - clearImage(); - - delete oldimage; - - m_resizing = true; - emit imageSizeChanged( m_lines, m_columns ); - m_resizing = false; -} - -void WidgetLayer::makeImage() -{ - calcGeometry(); - m_image = QArray<Character>( m_columns * m_lines ); - clearImage(); -} - -void WidgetLayer::clearImage() -{ - //should this belong here?? - for ( int y = 0; y < m_lines; y++ ) - for ( int x = 0; x < m_columns; x++ ) - { - m_image[loc(x,y)].c = 0xff; - m_image[loc(x,y)].f = 0xff; - m_image[loc(x,y)].b = 0xff; - m_image[loc(x,y)].r = 0xff; - } -} - -/* --------------------------------- selection ------------------------------ */ - -void WidgetLayer::pasteClipboard() -{ - insertSelection(); -} - - -void WidgetLayer::insertSelection() -{ - QString text = QApplication::clipboard()->text(); - if ( ! text.isNull() ) - { - text.replace( QRegExp( "\n" ), "\r" ); - insertText( text ); - // selection should be unselected - emit selectionCleared(); - } -} - -void WidgetLayer::insertText( QString text ) -{ - // text is inserted as key event - QKeyEvent e( QEvent::KeyPress, 0, -1, 0, text); - emit keyPressed( &e ); -} - -void WidgetLayer::onClearSelection() -{ - emit selectionCleared(); -} - -void WidgetLayer::setSelection( const QString& text ) -{ - // why get the clipboard, we have it as instance var... - QObject *m_clipboard = QApplication::clipboard(); - - // we know, that cliboard changes, when we change clipboard - QObject::disconnect( (QObject*) m_clipboard, SIGNAL( dataChanged() ), - (QObject*) this, SLOT( selectionCleared() ) ); - - QApplication::clipboard()->setText( text ); - - QObject::connect( (QObject*) m_clipboard, SIGNAL( dataChanged() ), - (QObject*) this, SLOT( selectionCleared() ) ); -} - - -///////// -// special font characters -///////// -unsigned short 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 -}; - diff --git a/noncore/apps/opie-console/widget_layer.h b/noncore/apps/opie-console/widget_layer.h deleted file mode 100644 index 6812711..0000000 --- a/noncore/apps/opie-console/widget_layer.h +++ b/dev/null @@ -1,265 +0,0 @@ -/* -------------------------------------------------------------------------- */ -/* */ -/* [widget_layer.h] Widget Layer */ -/* */ -/* -------------------------------------------------------------------------- */ - -// proposal of a widget Layer in opie-console -// -// fellow devels: -// just mail me (ibotty@web.de), what you additionally need from the main widget -// (or say in chat) - -#ifndef WIDGET_LAYER_H -#define WIDGET_LAYER_H - -// qt includes -#include <qapplication.h> -#include <qframe.h> -#include <qarray.h> -#include <qtimer.h> -#include <qkeycode.h> -#include <qclipboard.h> - - -// opie-console includes -#include "session.h" -#include "common.h" -#include "profile.h" - - -/* - * given a pseudo location ( column, line ), - * returns the actual index, in the QArray<Character> - */ -#define loc(X,Y) ((Y)*m_columns+(X)) - - - -extern unsigned short vt100_graphics[32]; - -class WidgetLayer : public QFrame -{ Q_OBJECT - -public: - - /** - * constructor - * @param const Profile &config, the configuration for this widget - * @param QWidget *parent, the parent widget - * @param const char *name, the name of the widget, defaults to "" - */ - WidgetLayer( const Profile& config, QWidget *parent=0, const char *name=0 ); - - /** - * destructor - */ - virtual ~WidgetLayer(); - -public: - /** - * sets the image - * @param QArray<Character> const newimg, the new image - * @param int lines, lines count of newimg - * @param int columns, columns count of newimg - */ - virtual void setImage( QArray<Character> const newimg, int lines, int colums ) = 0; - - /** - * annoy the user - */ - void bell(); - - /** - * @return int m_lines, the lines count - */ - int lines() { return m_lines; } - - /** - * @return int m_columns, the columns count - */ - int columns() { return m_columns; } - - /** - * insert current selection (currently this is only the clipboard) - */ - void insertSelection(); - - /** - * insert text - * @param QString text, the text to be inserted - */ - void insertText( QString text ); - - /** - * set selection (clipboard) to text - * @param const QString &text, the text to be selected - */ - void setSelection( const QString &text ); - - /** - * paste content of clipboard - */ - void pasteClipboard(); - - - /** - * reload configuration - * @param const Profile& config, the config to be used (may be the same as in constructor) - */ - virtual void reloadConfig( const Profile& config ) = 0; - - - /** - * sets the scrollbar (if implemented by successor of this class) - */ - virtual void setScroll( int cursor, int slines ) = 0; - - /** - * scrolls (if implemented, by successor of this class) - * @param int value, how much the widget should scroll up (positive value) or down (negative value) - */ - virtual void scroll( int value ) = 0; - - - virtual bool eventFilter( QObject *obj, QEvent *event ); - - - QSize sizeHint(); - - virtual QSize calcSize( int cols, int lins ) const = 0; -signals: - - /** - * key was pressed - */ - void keyPressed( QKeyEvent *e ); - - /** - * whenever Mouse selects something - * @param int button, the button that us pressed : - * 0 left Button - * 3 Button released - * @param int x, x position - * @param int y, y position - * - * // numbering due to layout in old TEWidget - */ - void mousePressed( int button, int x, int y ); - - /** - * size of image changed - * @param int lines, line count of new size - * @param int columns, column count of new size - */ - void imageSizeChanged( int lines, int columns ); - - /** - * cursor in history changed - * @param int value, value of history cursor - */ - void historyCursorChanged( int value ); - - /** - * selection should be cleared - */ - void selectionCleared(); - - /** - * selection begin - * @param const int x, x position - * @param const int y, y position - */ - void selectionBegin( const int x, const int y ); - - /** - * selection extended - * (from begin (s.a.) to x, y) - * @param const int x, x position - * @param const int y, y position - */ - void selectionExtended( const int x, const int y ); - - /** - * selection end - * @param const bool lineBreakPreserve, preserve line breaks in selection - */ - void selectionEnd( const bool lineBreakPreserve ); - - - -// protected methods -protected: - - // image operations - - /** - * changes image, to suit new size - * TODO: find meaningful name! - */ - void propagateSize(); - - /** - *determines count of lines and columns - */ - virtual void calcGeometry() = 0; - - /** - * makes an empty image - */ - void makeImage(); - - /** - * clears the image - */ - void clearImage(); - -protected slots: - - /** - * clear selection - */ - void onClearSelection(); - - -// protected vars -protected: - - /** - * current Session - */ - Session *m_session; - - /** - * current character image - * - * a Character at loc( column, line ) - * has the actual index: - * ix = line * m_columns + column; - * - * use loc( x, y ) macro to access. - */ - QArray<Character> m_image; - - /** - * lines count - */ - int m_lines; - - /** - * columns count - */ - int m_columns; - - /** - * clipboard - */ - QClipboard* m_clipboard; - - /** - * whether widget is resizing - */ - bool m_resizing; -}; - -#endif // WIDGET_LAYER_H |