author | treke <treke> | 2002-09-04 17:53:12 (UTC) |
---|---|---|
committer | treke <treke> | 2002-09-04 17:53:12 (UTC) |
commit | 605d854057eb470a1d75210193b82eb0b1ad6b53 (patch) (side-by-side diff) | |
tree | c411b661d5211fefbd83a7c8f63eef8c9cca72ee | |
parent | c35a5eabd8f5ed18e4216f6c88ee6794bacfb491 (diff) | |
download | opie-605d854057eb470a1d75210193b82eb0b1ad6b53.zip opie-605d854057eb470a1d75210193b82eb0b1ad6b53.tar.gz opie-605d854057eb470a1d75210193b82eb0b1ad6b53.tar.bz2 |
Major modifications to the User Interface
1) Bookmark support added, all options are stored on a per bookmark basis
2) 16 Bit color is now a supported bit depth for the server
-rw-r--r-- | noncore/comm/keypebble/keypebble.pro | 16 | ||||
-rw-r--r-- | noncore/comm/keypebble/krfbbuffer.cpp | 31 | ||||
-rw-r--r-- | noncore/comm/keypebble/krfbcanvas.cpp | 39 | ||||
-rw-r--r-- | noncore/comm/keypebble/krfbcanvas.h | 6 | ||||
-rw-r--r-- | noncore/comm/keypebble/krfbconnection.cpp | 20 | ||||
-rw-r--r-- | noncore/comm/keypebble/krfbconnection.h | 19 | ||||
-rw-r--r-- | noncore/comm/keypebble/krfbdecoder.cpp | 3 | ||||
-rw-r--r-- | noncore/comm/keypebble/krfblogin.cpp | 8 | ||||
-rw-r--r-- | noncore/comm/keypebble/krfboptions.cpp | 56 | ||||
-rw-r--r-- | noncore/comm/keypebble/krfboptions.h | 31 | ||||
-rw-r--r-- | noncore/comm/keypebble/krfbserver.cpp | 39 | ||||
-rw-r--r-- | noncore/comm/keypebble/kvnc.cpp | 132 | ||||
-rw-r--r-- | noncore/comm/keypebble/kvnc.h | 14 | ||||
-rw-r--r-- | noncore/comm/keypebble/kvncbookmarkdlg.cpp | 220 | ||||
-rw-r--r-- | noncore/comm/keypebble/kvncconndlg.cpp | 75 | ||||
-rw-r--r-- | noncore/comm/keypebble/kvncconnectdlg.cpp | 79 | ||||
-rw-r--r-- | noncore/comm/keypebble/kvncconnectdlg.h | 39 | ||||
-rw-r--r-- | noncore/comm/keypebble/kvncoptionsdlg.cpp | 54 | ||||
-rw-r--r-- | noncore/comm/keypebble/kvncoptionsdlg.h | 30 | ||||
-rw-r--r-- | noncore/comm/keypebble/main.cpp | 4 |
20 files changed, 537 insertions, 378 deletions
diff --git a/noncore/comm/keypebble/keypebble.pro b/noncore/comm/keypebble/keypebble.pro index a102381..1017133 100644 --- a/noncore/comm/keypebble/keypebble.pro +++ b/noncore/comm/keypebble/keypebble.pro @@ -4,31 +4,33 @@ DESTDIR = $(OPIEDIR)/bin HEADERS = d3des.h \ krfbbuffer.h \ krfbcanvas.h \ krfbconnection.h \ krfbdecoder.h \ krfblogin.h \ - krfboptions.h \ + krfbserver.h \ krfbserverinfo.h \ kvnc.h \ - kvncconnectdlg.h \ - kvncoptionsdlg.h \ + kvncconndlg.h \ + kvncbookmarkdlg.h \ + version.h \ vncauth.h SOURCES = d3des.c \ vncauth.c \ krfbbuffer.cpp \ krfbcanvas.cpp \ krfbconnection.cpp \ krfbdecoder.cpp \ krfblogin.cpp \ - krfboptions.cpp \ + krfbserver.cpp \ kvnc.cpp \ - kvncconnectdlg.cpp \ - kvncoptionsdlg.cpp \ + kvncconndlg.cpp \ + kvncbookmarkdlg.cpp \ main.cpp -INTERFACES = vncoptionsbase.ui +INTERFACES = kvncconndlgbase.ui \ + kvncbookmarkdlgbase.ui TARGET = keypebble INCLUDEPATH += $(OPIEDIR)/include DEPENDPATH += $(OPIEDIR)/include LIBS += -lqpe TRANSLATIONS = ../../../i18n/de/keypebble.ts \ diff --git a/noncore/comm/keypebble/krfbbuffer.cpp b/noncore/comm/keypebble/krfbbuffer.cpp index 4885261..5a52f31 100644 --- a/noncore/comm/keypebble/krfbbuffer.cpp +++ b/noncore/comm/keypebble/krfbbuffer.cpp @@ -147,12 +147,43 @@ void KRFBBuffer::drawRawRectChunk( void *data, b = ( b * 255 ) / blueMax; uint *p = ( uint * ) img.scanLine( j ) + i; *p = qRgb( r,g,b ); } } + } else if (decoder->format->bpp == 16 ) { + + CARD16 *d = (CARD16 *) data; + + uint r,g,b; + + for ( int j = 0; j < h; j++ ) { + for ( int i = 0; i < w ; i++ ) { + CARD16 pixel = d[ j * w + i ]; + pixel = Swap16IfLE( pixel ); + + r = pixel; + r = r >> decoder->format->redShift; + r = r & redMax; + + g = pixel; + g = g >> decoder->format->greenShift; + g = g & greenMax; + + b = pixel; + b = b >> decoder->format->blueShift; + b = b & blueMax; + + r = ( r * 255 ) / redMax; + g = ( g * 255 ) / greenMax; + b = ( b * 255 ) / blueMax; + + ulong *p = ( ulong * ) img.scanLine( j ) + i; + *p = qRgb( r,g,b ); + } + } } else { p.setBrush( QBrush( Qt::black ) ); p.drawRect( x, y, w, h ); } diff --git a/noncore/comm/keypebble/krfbcanvas.cpp b/noncore/comm/keypebble/krfbcanvas.cpp index f74ab7b..8b56795 100644 --- a/noncore/comm/keypebble/krfbcanvas.cpp +++ b/noncore/comm/keypebble/krfbcanvas.cpp @@ -1,13 +1,13 @@ -#include "kvncconnectdlg.h" #include "krfbconnection.h" #include "krfbcanvas.h" -#include "krfboptions.h" +#include "krfbserver.h" #include "krfbbuffer.h" #include <qpe/config.h> +#include <qpe/qpeapplication.h> #include <qapplication.h> #include <qclipboard.h> #include <qaction.h> #include <qpixmap.h> #include <qapplication.h> @@ -15,50 +15,48 @@ #include <qiconset.h> KRFBCanvas::KRFBCanvas( QWidget *parent, const char *name ) : QScrollView( parent, name ) { connection_ = new KRFBConnection(); - connect( connection_, SIGNAL( passwordRequired( KRFBConnection * ) ), - this, SLOT( passwordRequired( KRFBConnection * ) ) ); connect( connection_, SIGNAL( loggedIn() ), this, SLOT( loggedIn() ) ); loggedIn_ = false; + QPEApplication::setStylusOperation(viewport(), QPEApplication::RightOnHold); viewport()->setFocusPolicy( QWidget::StrongFocus ); viewport()->setFocus(); } KRFBCanvas::~KRFBCanvas() { } -void KRFBCanvas::openConnection() + +void KRFBCanvas::openConnection(KRFBServer server) { - KVNCConnectDlg dlg( connection_, this, "connect dialog" ); - if ( dlg.exec() ) { - QCString host = dlg.hostname().latin1(); - password = dlg.password(); - connection_->connectTo( host, dlg.display() ); - } + + + QCString host = server.hostname.latin1(); + password=server.password; + connection_->connectTo( server); } + void KRFBCanvas::openURL( const QUrl &url ) { if ( loggedIn_ ) { qWarning( "openURL invoked when logged in\n" ); return; } QCString host = url.host().latin1(); int display = url.port(); - if ( url.hasPassword() ) - connection_->setPassword( url.password().latin1() ); - connection_->connectTo( host, display ); +// connection_->connectTo( host, display ); } void KRFBCanvas::closeConnection() { loggedIn_ = false; connection_->disconnect(); @@ -66,16 +64,12 @@ void KRFBCanvas::closeConnection() viewport()->setMouseTracking( false ); viewport()->setBackgroundMode( PaletteDark ); setBackgroundMode( PaletteDark ); update(); } -void KRFBCanvas::passwordRequired( KRFBConnection *con ) -{ - con->setPassword( password.latin1() ); -} void KRFBCanvas::bell() { if ( connection_->options()->deIconify ) { topLevelWidget()->raise(); topLevelWidget()->show(); @@ -164,6 +158,15 @@ void KRFBCanvas::refresh() void KRFBCanvas::clipboardChanged() { if ( loggedIn_ ) { connection_->sendCutText( qApp->clipboard()->text() ); } } +void KRFBCanvas::sendCtlAltDel( void) +{ + + qDebug("Here"); + if ( loggedIn_ ) { + connection_->buffer()->keyPressEvent( &QKeyEvent(QEvent::KeyPress,Qt::Key_Delete, 0x7f,ControlButton|AltButton)); + // connection_->buffer()->keyPressEvent( &QKeyEvent(QEvent::KeyRelease,Qt::Key_Delete, 0x7f,ControlButton|AltButton)); + } +} diff --git a/noncore/comm/keypebble/krfbcanvas.h b/noncore/comm/keypebble/krfbcanvas.h index 7864f1c..cd3047c 100644 --- a/noncore/comm/keypebble/krfbcanvas.h +++ b/noncore/comm/keypebble/krfbcanvas.h @@ -4,12 +4,13 @@ #define KRFBCANVAS_H #include <qscrollview.h> #include <qurl.h> class KRFBConnection; +class KRFBServer; /** * Displays data from an KRFBDecoder, and sends events to the * KRFBConnection. */ class KRFBCanvas : public QScrollView @@ -20,19 +21,20 @@ public: ~KRFBCanvas(); void setConnection( KRFBConnection * ); KRFBConnection *connection() { return connection_; }; public slots: - void openConnection(); + + void openConnection (KRFBServer); void openURL( const QUrl & ); void closeConnection(); - void passwordRequired( KRFBConnection * ); void refresh(); void bell(); + void sendCtlAltDel(void); protected: virtual void keyPressEvent( QKeyEvent * ); virtual void keyReleaseEvent( QKeyEvent * ); virtual void contentsMousePressEvent( QMouseEvent * ); virtual void contentsMouseReleaseEvent( QMouseEvent * ); diff --git a/noncore/comm/keypebble/krfbconnection.cpp b/noncore/comm/keypebble/krfbconnection.cpp index c51f18a..389c836 100644 --- a/noncore/comm/keypebble/krfbconnection.cpp +++ b/noncore/comm/keypebble/krfbconnection.cpp @@ -2,24 +2,24 @@ #include <qsocket.h> #include <qtimer.h> #include <string.h> #include "krfbconnection.h" #include "krfblogin.h" -#include "krfboptions.h" +#include "krfbserver.h" #include "krfbdecoder.h" #include "krfbbuffer.h" KRFBConnection::KRFBConnection( QObject *parent ) : QObject( parent, "KRFBConnection" ) { portBase_ = 5900; currentState_ = Disconnected; sock = 0; minData_ = 0; - options_ = new KRFBOptions(); + options_ = new KRFBServer(); updater = 0; decoder_ = 0; buffer_ = 0; } KRFBConnection::~KRFBConnection() @@ -27,31 +27,30 @@ KRFBConnection::~KRFBConnection() if ( ( currentState_ != Disconnected ) && ( currentState_ != Disconnecting ) && sock ) { disconnectDone(); } delete options_; } -void KRFBConnection::connectTo( const QCString &host, int display ) +void KRFBConnection::connectTo( KRFBServer server) { - if ( currentState_ != Disconnected ); + if ( currentState_ != Disconnected ) disconnect(); - this->host_= host; - this->display_ = display; + (*options_)=server; sock = new QSocket( this, "rfbSocket" ); CHECK_PTR( sock ); // Connect to something to notice connection or error connect( sock, SIGNAL( error( int ) ), SLOT( gotSocketError( int ) ) ); connect( sock, SIGNAL( connected() ), SLOT( gotSocketConnection() ) ); qWarning( "Connecting..." ); currentState_ = Connecting; - sock->connectToHost( host_, portBase_ + display_ ); + sock->connectToHost( options_->hostname.latin1(), portBase_ + options_->display ); } void KRFBConnection::disconnect() { qWarning( "Disconnecting from server" ); @@ -67,13 +66,12 @@ void KRFBConnection::disconnect() disconnectDone(); } } void KRFBConnection::disconnectDone() { - qWarning( "KRFBConnection disconnected" ); currentState_ = Disconnected; delete sock; sock = 0; minData_ = 0; delete updater; delete decoder_; @@ -177,13 +175,12 @@ void KRFBConnection::waitForData( unsigned int sz ) if ( sock->size() >= sz ) { // qWarning( "No need to wait for data" ); emit gotEnoughData(); } else { // qWarning( "Waiting for %u bytes", sz ); - minData_ = sz; connect( sock, SIGNAL( readyRead() ), SLOT( gotMoreData() ) ); } } int KRFBConnection::read( void *buf, int sz ) @@ -208,17 +205,12 @@ void KRFBConnection::setPortBase( int base ) int KRFBConnection::portBase() const { return portBase_; } -void KRFBConnection::setPassword( const QCString &pass ) -{ - this->pass_ = pass; -} - void KRFBConnection::updateTimer() { decoder_->sendUpdateRequest( true ); } void KRFBConnection::refresh() diff --git a/noncore/comm/keypebble/krfbconnection.h b/noncore/comm/keypebble/krfbconnection.h index fe477c1..a8d3457 100644 --- a/noncore/comm/keypebble/krfbconnection.h +++ b/noncore/comm/keypebble/krfbconnection.h @@ -3,17 +3,18 @@ #ifndef KRFBCONNECTION_H #define KRFBCONNECTION_H #include <qobject.h> #include <qstring.h> #include <qcstring.h> +#include "krfbserver.h" #include <qurl.h> class KRFBLogin; class KRBUpdateHandler; -class KRFBOptions; +class KRFBServer; class QSocket; class KRFBDecoder; class KRFBBuffer; class QTimer; /** @@ -42,38 +43,35 @@ public: ~KRFBConnection(); //* Get the state of a connection. State state() const; //* Get the options for this connection - KRFBOptions *options() const { return options_; }; + KRFBServer *options() const { return options_; }; KRFBBuffer *buffer() const { return buffer_; }; KRFBDecoder *decoder() const { return decoder_; }; //* Set the base from which the port for a given display will be calculated. void setPortBase( int base ); //* Get the base from which the port for a given display is calculated. int portBase() const; - //* Set the password which will be used to login - void setPassword( const QCString &pass ); - //* Open a connection - void connectTo( const QCString &host, int display ); + void connectTo( KRFBServer); //* Close the connection void disconnect(); //* Get the host - const QCString host() const { return host_; }; + const QCString host() const { return options_->hostname.latin1(); }; //* Get the display - int display() const { return display_; }; + int display() const { return options_->display; }; //* Get the current host/display as a URL const QUrl &url(); //* Reload the display void refresh(); @@ -130,23 +128,20 @@ private: void waitForData( unsigned int ); int read( void *buf, int sz ); int write( void *buf, int sz ); private: - QCString host_; int portBase_; - int display_; - QCString pass_; QSocket *sock; State currentState_; unsigned int minData_; QTimer *updater; KRFBLogin *login; KRFBDecoder *decoder_; - KRFBOptions *options_; + KRFBServer *options_; KRFBBuffer *buffer_; QUrl url_; }; #endif // KRFBCONNECTION_H diff --git a/noncore/comm/keypebble/krfbdecoder.cpp b/noncore/comm/keypebble/krfbdecoder.cpp index 174dd7b..a964c09 100644 --- a/noncore/comm/keypebble/krfbdecoder.cpp +++ b/noncore/comm/keypebble/krfbdecoder.cpp @@ -1,8 +1,8 @@ #include "krfbconnection.h" -#include "krfboptions.h" +#include "krfbserver.h" #include "krfbserverinfo.h" #include "krfbdecoder.h" #include "krfbbuffer.h" #include <qpe/qpeapplication.h> @@ -793,12 +793,13 @@ void KRFBDecoder::sendKeyReleaseEvent( QKeyEvent *event ) con->write( &mask, 1 ); con->write( &padding, 2 ); con->write( &key, 4 ); } } + int KRFBDecoder::toKeySym( QKeyEvent *k ) { int ke = 0; ke = k->ascii(); // Markus: Crappy hack. I dont know why lower case letters are diff --git a/noncore/comm/keypebble/krfblogin.cpp b/noncore/comm/keypebble/krfblogin.cpp index cc3a8fa..0d2a205 100644 --- a/noncore/comm/keypebble/krfblogin.cpp +++ b/noncore/comm/keypebble/krfblogin.cpp @@ -49,14 +49,12 @@ KRFBLogin::KRFBLogin( KRFBConnection *con ) this->con = con; currentState = AwaitingServerVersion; connect( this, SIGNAL( error( const QString & ) ), con, SIGNAL( error( const QString & ) ) ); - connect( this, SIGNAL( passwordRequired( KRFBConnection * ) ), - con, SIGNAL( passwordRequired( KRFBConnection * ) ) ); qWarning( "Waiting for server version..." ); static QString statusMsg = tr( "Waiting for server version..." ); emit status( statusMsg ); @@ -180,26 +178,26 @@ void KRFBLogin::getPassword() { // Got data CARD8 challenge[ ChallengeLength ]; con->read( challenge, ChallengeLength ); // Last chance to enter a password - if ( con->pass_.isNull() ) { + if ( con->options_->password.isNull() ) { qWarning( "krfblogin needs a password" ); emit passwordRequired( con ); } - if ( con->pass_.isNull() ) { + if ( con->options_->password.isNull() ) { QString msg = tr( "Error: This server requires a password, but none " "has been specified.\n" ); emit error( msg ); return; } - vncEncryptBytes( (unsigned char *) challenge, con->pass_.data() ); + vncEncryptBytes( (unsigned char *) challenge, QCString(con->options_->password.latin1()).data() ); con->write( challenge, ChallengeLength ); connect( con, SIGNAL( gotEnoughData() ), SLOT( gotAuthResult() ) ); con->waitForData( AuthResultLength ); } diff --git a/noncore/comm/keypebble/krfboptions.cpp b/noncore/comm/keypebble/krfboptions.cpp deleted file mode 100644 index 8c4320b..0000000 --- a/noncore/comm/keypebble/krfboptions.cpp +++ b/dev/null @@ -1,56 +0,0 @@ -#include <qpe/config.h> -#include <qpe/qpeapplication.h> -#include "krfboptions.h" - -KRFBOptions::KRFBOptions() -{ - readSettings(); -} - -KRFBOptions::~KRFBOptions() -{ - writeSettings(); -} - -void KRFBOptions::readSettings() -{ - Config config( "keypebble" ); - config.setGroup("Settings"); - hexTile = config.readBoolEntry( "HexTile", 0 ); - corre = config.readBoolEntry( "CORRE", 0 ); - rre = config.readBoolEntry( "RRE", 0 ); - copyrect = config.readBoolEntry( "CopyRect", 1 ); - colors256 = config.readBoolEntry( "Colors256", 0 ); - shared = config.readBoolEntry( "Shared", 0 ); - readOnly = config.readBoolEntry( "ReadOnly", 0 ); - updateRate = config.readNumEntry( "UpdateRate", 50 ); - deIconify = config.readBoolEntry( "DeIconify", 0 ); -} - -void KRFBOptions::writeSettings() -{ - Config config( "keypebble" ); - config.setGroup("Settings"); - config.writeEntry( "HexTile", hexTile ); - config.writeEntry( "CORRE", corre ); - config.writeEntry( "RRE", rre ); - config.writeEntry( "CopyRect", copyrect ); - config.writeEntry( "Colors256", colors256 ); - config.writeEntry( "Shared", shared ); - config.writeEntry( "ReadOnly", readOnly ); - config.writeEntry( "UpdateRate", updateRate ); - config.writeEntry( "DeIconify", deIconify ); -} - -int KRFBOptions::encodings() -{ - // Initially one because we always support raw encoding - int count = 1; - - count += hexTile ? 1 : 0; - count += corre ? 1 : 0; - count += rre ? 1 : 0; - count += copyrect ? 1 : 0; - - return count; -} diff --git a/noncore/comm/keypebble/krfboptions.h b/noncore/comm/keypebble/krfboptions.h deleted file mode 100644 index fd2b65c..0000000 --- a/noncore/comm/keypebble/krfboptions.h +++ b/dev/null @@ -1,31 +0,0 @@ -// -*- c++ -*- - -#ifndef KRFBOPTIONS_H -#define KRFBOPTIONS_H - -class Config; - -class KRFBOptions -{ -public: - KRFBOptions(); - ~KRFBOptions(); - - int encodings(); - void readSettings(); - void writeSettings(); - - bool hexTile; - bool corre; - bool rre; - bool copyrect; - - bool colors256; - bool shared; - bool readOnly; - bool deIconify; - - int updateRate; -}; - -#endif // KRFBOPTIONS_H diff --git a/noncore/comm/keypebble/krfbserver.cpp b/noncore/comm/keypebble/krfbserver.cpp new file mode 100644 index 0000000..5775f09 --- a/dev/null +++ b/noncore/comm/keypebble/krfbserver.cpp @@ -0,0 +1,39 @@ +#include <qpe/config.h> +#include <qpe/qpeapplication.h> +#include "krfbserver.h" + +KRFBServer::KRFBServer() +{ + QString name; + QString hostname; + QString password; + display=0; + + hexTile=0; + corre=0; + rre=0; + copyrect=1; + + colors256=1; + shared=0; + readOnly=0; + deIconify=0; + + updateRate=0; +} +KRFBServer::~KRFBServer() +{ +} + +int KRFBServer::encodings() +{ + // Initially one because we always support raw encoding + int count = 1; + + count += hexTile ? 1 : 0; + count += corre ? 1 : 0; + count += rre ? 1 : 0; + count += copyrect ? 1 : 0; + + return count; +} diff --git a/noncore/comm/keypebble/kvnc.cpp b/noncore/comm/keypebble/kvnc.cpp index 43cffc5..aa46e2f 100644 --- a/noncore/comm/keypebble/kvnc.cpp +++ b/noncore/comm/keypebble/kvnc.cpp @@ -7,20 +7,33 @@ #include <qstatusbar.h> #include <qpopupmenu.h> #include <qpushbutton.h> #include <qpe/qpetoolbar.h> #include <qtimer.h> #include <qmessagebox.h> +#include <qspinbox.h> +#include <qlistbox.h> +#include <qlineedit.h> #include <qpe/qpeapplication.h> #include <qpe/global.h> +#include <qpe/qpetoolbar.h> +#include <qpe/resource.h> + #include <assert.h> #include "kvnc.h" #include "krfbcanvas.h" -#include "kvncoptionsdlg.h" #include "krfbconnection.h" +#include "kvncconndlg.h" +#include "krfbserver.h" + +static int u_id = 1; +static int get_unique_id() +{ + return u_id++; +} /* XPM */ static char * menu_xpm[] = { "12 12 5 1", " c None", @@ -45,15 +58,25 @@ const int StatusTextId = 0; KVNC::KVNC( const char *name ) : QMainWindow( 0, name ) { setCaption( tr("VNC Viewer") ); fullscreen = false; - canvas = new KRFBCanvas( this, "canvas" ); - setCentralWidget( canvas ); + stack = new QWidgetStack( this ); + setCentralWidget( stack ); + bookmarkSelector=new KVNCBookmarkDlg(); + stack->addWidget(bookmarkSelector,get_unique_id()); + stack->raiseWidget( bookmarkSelector ); + + canvas = new KRFBCanvas( stack, "canvas" ); + stack->addWidget(canvas,get_unique_id()); + setCentralWidget( stack ); + + connect( bookmarkSelector->bookmarkList, SIGNAL(doubleClicked(QListBoxItem *)), + this, SLOT(openConnection(QListBoxItem *)) ); connect( canvas->connection(), SIGNAL(statusChanged(const QString &)), this, SLOT(statusMessage(const QString &)) ); connect( canvas->connection(), SIGNAL(error(const QString &)), this, SLOT(error(const QString &)) ); connect( canvas->connection(), SIGNAL(connected()), this, SLOT(connected()) ); connect( canvas->connection(), SIGNAL(loggedIn()), this, SLOT(loggedIn()) ); @@ -63,72 +86,131 @@ KVNC::KVNC( const char *name ) : QMainWindow( 0, name ) cornerButton = new QPushButton( this ); cornerButton->setPixmap( QPixmap( (const char**)menu_xpm ) ); connect( cornerButton, SIGNAL(pressed()), this, SLOT(showMenu()) ); canvas->setCornerWidget( cornerButton ); - QTimer::singleShot( 0, canvas, SLOT(openConnection()) ); + stack->raiseWidget( bookmarkSelector ); + + + QPEToolBar *bar = new QPEToolBar( this ); + + QAction *n = new QAction( tr( "New Connection" ), Resource::loadPixmap( "new" ), + QString::null, 0, this, 0 ); + connect( n, SIGNAL( activated() ), + this, SLOT( newConnection() ) ); + n->addTo( bar ); + + QAction *o = new QAction( tr( "Open Bookmark" ), Resource::loadPixmap( "edit" ), + QString::null, 0, this, 0 ); + connect( o, SIGNAL( activated() ), + this, SLOT( openConnection() ) ); + o->addTo( bar ); + + QAction *d = new QAction( tr( "Delete Bookmark" ), Resource::loadPixmap( "trash" ), + QString::null, 0, this, 0 ); + connect( d, SIGNAL( activated() ), + this, SLOT( deleteBookmark() ) ); + d->addTo( bar ); } KVNC::~KVNC() { + } -void KVNC::openURL( const QUrl &url ) +void KVNC::newConnection() { - canvas->openURL( url ); + curServer=new KRFBServer; + + KVNCConnDlg dlg( curServer,this); + dlg.showMaximized(); + if ( dlg.exec()) { + if (!curServer->name.isEmpty()) + bookmarkSelector->addBookmark(curServer); + canvas->openConnection(*curServer); + } else + curServer=0; +} + +void KVNC::openConnection( QString name) +{ + curServer=bookmarkSelector->getServer(name); + + if (curServer) { + KVNCConnDlg dlg( curServer,this); + dlg.showMaximized(); + + if ( dlg.exec() ) { + canvas->openConnection(*curServer); + bookmarkSelector->writeBookmarks(); + } else + curServer=0; + } +} + +void KVNC::openConnection( void ) +{ + openConnection( bookmarkSelector->selectedBookmark()); +} + +void KVNC::openConnection( QListBoxItem * item) +{ + openConnection(item->text()); } void KVNC::setupActions() { cornerMenu = new QPopupMenu( this ); fullScreenAction = new QAction( tr("Full Screen"), QString::null, 0, 0 ); connect( fullScreenAction, SIGNAL(activated()), this, SLOT( toggleFullScreen() ) ); fullScreenAction->addTo( cornerMenu ); fullScreenAction->setEnabled( false ); - optionsAction = new QAction( tr("Settings"), QString::null, 0, 0 ); - connect( optionsAction, SIGNAL(activated()), this, SLOT( showOptions() ) ); - optionsAction->addTo( cornerMenu ); - - connectAction = new QAction( tr("Connect..."), QString::null, 0, 0 ); - connect( connectAction, SIGNAL(activated()), - canvas, SLOT( openConnection() ) ); - connectAction->addTo( cornerMenu ); + ctlAltDelAction = new QAction( tr("Send Contrl-Alt-Delete"), QString::null, 0, 0 ); + connect( ctlAltDelAction, SIGNAL(activated()), + canvas, SLOT( sendCtlAltDel() ) ); + ctlAltDelAction->addTo( cornerMenu ); + ctlAltDelAction->setEnabled( false ); disconnectAction = new QAction( tr("Disconnect"), QString::null, 0, 0 ); connect( disconnectAction, SIGNAL(activated()), this, SLOT( closeConnection() ) ); disconnectAction->addTo( cornerMenu ); disconnectAction->setEnabled( false ); } void KVNC::toggleFullScreen() { if ( fullscreen ) { canvas->releaseKeyboard(); - canvas->reparent( this, 0, QPoint(0,0), false ); + canvas->reparent( stack, 0, QPoint(0,0), false ); canvas->setFrameStyle( QFrame::Panel | QFrame::Sunken ); - setCentralWidget( canvas ); + setCentralWidget( stack ); + stack->addWidget(canvas,get_unique_id()); + stack->raiseWidget(canvas); canvas->show(); + stack->show(); fullScreenAction->setText( tr("Full Screen") ); } else { canvas->setFrameStyle( QFrame::NoFrame ); + stack->removeWidget(canvas); canvas->reparent( 0,WStyle_Tool | WStyle_Customize | WStyle_StaysOnTop, QPoint(0,0),false); canvas->resize(qApp->desktop()->width(), qApp->desktop()->height()); canvas->raise(); canvas->setFocus(); canvas->grabKeyboard(); canvas->show(); fullScreenAction->setText( tr("Stop Full Screen") ); } + fullscreen = !fullscreen; } void KVNC::closeConnection() { if ( fullscreen ) @@ -146,45 +228,45 @@ void KVNC::showMenu() } void KVNC::connected() { static QString msg = tr( "Connected to remote host" ); statusMessage( msg ); - connectAction->setEnabled( false ); + ctlAltDelAction->setEnabled(true); disconnectAction->setEnabled( true ); fullScreenAction->setEnabled( true ); + stack->raiseWidget(canvas); } void KVNC::loggedIn() { static QString msg = tr( "Logged in to remote host" ); statusMessage( msg ); } void KVNC::disconnected() { + + if ( fullscreen ) + toggleFullScreen(); static QString msg = tr( "Connection closed" ); statusMessage( msg ); - connectAction->setEnabled( true ); + ctlAltDelAction->setEnabled(false); disconnectAction->setEnabled( false ); fullScreenAction->setEnabled( false ); + stack->raiseWidget(bookmarkSelector); } void KVNC::statusMessage( const QString &m ) { Global::statusMessage( m ); } void KVNC::error( const QString &msg ) { statusMessage( msg ); QMessageBox::warning( this, tr("VNC Viewer"), msg ); } - -void KVNC::showOptions() +void KVNC::deleteBookmark(void) { - KVNCOptionsDlg *wdg = new KVNCOptionsDlg( canvas->connection()->options(), this ); - wdg->showMaximized(); - wdg->exec(); - delete wdg; + bookmarkSelector->deleteBookmark(bookmarkSelector->selectedBookmark()); } - diff --git a/noncore/comm/keypebble/kvnc.h b/noncore/comm/keypebble/kvnc.h index 92666c5..6e0a385 100644 --- a/noncore/comm/keypebble/kvnc.h +++ b/noncore/comm/keypebble/kvnc.h @@ -2,12 +2,14 @@ #ifndef KVNC_H #define KVNC_H #include <qmainwindow.h> #include <qurl.h> +#include <qwidgetstack.h> +#include "kvncbookmarkdlg.h" class QAction; class KRFBCanvas; class QPushButton; class QToolBar; @@ -22,16 +24,19 @@ class KVNC : public QMainWindow Q_OBJECT public: KVNC( const char *name = 0 ); ~KVNC(); public slots: + void newConnection(); + void deleteBookmark(); + void openConnection(QListBoxItem *); + void openConnection(QString); + void openConnection(void); void toggleFullScreen(); - void openURL( const QUrl & ); void closeConnection(); - void showOptions(); protected: void setupActions(); protected slots: void showMenu(); @@ -47,10 +52,15 @@ private: KRFBCanvas *canvas; QPopupMenu *cornerMenu; QPushButton *cornerButton; QAction *fullScreenAction; QAction *optionsAction; QAction *disconnectAction; + QAction *ctlAltDelAction;; QAction *connectAction; + + KVNCBookmarkDlg * bookmarkSelector; + QWidgetStack * stack; + KRFBServer * curServer; }; #endif // KVNC_H diff --git a/noncore/comm/keypebble/kvncbookmarkdlg.cpp b/noncore/comm/keypebble/kvncbookmarkdlg.cpp new file mode 100644 index 0000000..1f97d13 --- a/dev/null +++ b/noncore/comm/keypebble/kvncbookmarkdlg.cpp @@ -0,0 +1,220 @@ +#include <qframe.h> +#include <qvbox.h> +#include <qcheckbox.h> +#include <qspinbox.h> +#include <qlabel.h> +#include <qlayout.h> +#include <qwhatsthis.h> +#include <qfile.h> +#include <qdir.h> +#include <qstring.h> +#include <qapplication.h> +#include <qlineedit.h> +#include <qtextstream.h> +#include <qpushbutton.h> +#include <qlistbox.h> +#include <qpe/config.h> +#include <qpe/global.h> +#include "krfbserver.h" +#include "kvncbookmarkdlg.h" + +KVNCBookmarkDlg::KVNCBookmarkDlg( QWidget * parent=0, const char * name=0, WFlags f=0 ) + +: KVNCBookmarkDlgBase( parent, name,f) +{ + readBookmarks(); + refresh(); + +} + +KVNCBookmarkDlg::~KVNCBookmarkDlg() +{ +} + +void KVNCBookmarkDlg::addBookmark(KRFBServer * server) +{ + if (server) { + servers.append(server); + bookmarkList->insertItem(server->name); + writeBookmarks(); + refresh(); + } +} + +void KVNCBookmarkDlg::deleteBookmark(QString name) +{ + KRFBServer * server=0; + for ( server=servers.first(); server != 0; server=servers.next() ) { + if (server->name==name) { + servers.remove(servers.at()); + writeBookmarks(); + refresh(); + return; + } + } +} +KRFBServer *KVNCBookmarkDlg::getServer(QString name) +{ + KRFBServer * server=0; + for ( server=servers.first(); server != 0; server=servers.next() ) { + if (server->name==name) + + return server; + } + return 0; +} + + +/* + Note that the degree of protection offered by the encryption here is + only sufficient to avoid the most casual observation of the configuration + files. People with access to the files can write down the contents and + decrypt it using this source code. + + Conceivably, and at some burden to the user, this encryption could + be improved. +*/ +QString KVNCBookmarkDlg::encipher(const QString& plain) +{ + // mainly, we make it long + QString cipher; + int mix=28730492; + for (int i=0; i<(int)plain.length(); i++) { + int u = plain[i].unicode(); + int c = u ^ mix; + QString x = QString::number(c,36); + cipher.append(QChar('a'+x.length())); + cipher.append(x); + mix *= u; + } + return cipher; +} + +QString KVNCBookmarkDlg::decipher(const QString& cipher) +{ + QString plain; + int mix=28730492; + for (int i=0; i<(int)cipher.length();) { + int l = cipher[i].unicode()-'a'; + QString x = cipher.mid(i+1,l); i+=l+1; + int u = x.toInt(0,36) ^ mix; + plain.append(QChar(u)); + mix *= u; + } + return plain; +} + +void KVNCBookmarkDlg::readBookmarks(void) +{ + QFile f(QDir::homeDirPath() + QString("/Applications/keypebble/bookmarks")); + + QStringList entry; + QString key, val; + KRFBServer * server=0; + + if ( f.open(IO_ReadOnly) ) { + QTextStream t( &f ); + QString s; + int n = 1; + while ( !t.eof() ) { + s = t.readLine(); + + + entry=QStringList::split('=',s); + key=entry[0].stripWhiteSpace().lower(); + val=entry[1].stripWhiteSpace(); + + if (key=="server") { + + if (server){ + servers.append(server); + server=0; + } + server = new KRFBServer(); + + if (!server) + return; + server->name=val; + + } + else if (key=="hostname") + server->hostname=val; + else if (key=="password") + server->password=decipher(val); + else if (key=="display") + server->display=val.toInt(); + else if (key=="hextile") + server->hexTile=val.toInt(); + else if (key=="corre") + server->corre=val.toInt(); + else if (key=="rre") + server->rre=val.toInt(); + else if (key=="copyrect") + server->copyrect=val.toInt(); + else if (key=="colors256") + server->colors256=val.toInt(); + else if (key=="shared") + server->shared=val.toInt(); + else if (key=="readonly") + server->readOnly=val.toInt(); + else if (key=="deiconify") + server->deIconify=val.toInt(); + else if (key=="updaterate") + server->updateRate=val.toInt(); + + } + if (server){ + servers.append(server); + server=0; + } + f.close(); + } +} + +void KVNCBookmarkDlg::writeBookmarks(void) +{ + QString filename=Global::applicationFileName("keypebble","bookmarks"); + + QFile f(filename); + + QString key, val; + KRFBServer * server=0; + + if ( f.open(IO_ReadWrite) ) { + QTextStream t( &f ); + QString s; + int n = 1; + KRFBServer *server; + + for ( server=servers.first(); server != 0; server=servers.next() ) { + qDebug(server->name); + t << "server=" << server->name << '\n'; + t << "\thostname=" << server->hostname << '\n'; + t << "\tpassword=" << encipher(server->password )<< '\n'; + t << "\tdisplay=" << server->display << '\n'; + t << "\thextile=" << server->hexTile << '\n'; + t << "\tcorre=" << server->corre << '\n'; + t << "\trre=" << server->rre << '\n'; + t << "\tcopyrect=" << server->copyrect << '\n'; + t << "\tshared=" << server->shared << '\n'; + t << "\treadonly=" << server->readOnly << '\n'; + t << "\tdeiconify=" << server->deIconify << '\n'; + t << "\tupdaterate=" << server->updateRate << '\n'; + + } + f.close(); + } +} +void KVNCBookmarkDlg::refresh(void) +{ + bookmarkList->clear(); + KRFBServer * server=0; + for ( server=servers.first(); server != 0; server=servers.next() ) { + bookmarkList->insertItem(server->name); + } +} + +QString KVNCBookmarkDlg::selectedBookmark() +{ + return bookmarkList->currentText(); +} diff --git a/noncore/comm/keypebble/kvncconndlg.cpp b/noncore/comm/keypebble/kvncconndlg.cpp new file mode 100644 index 0000000..6873feb --- a/dev/null +++ b/noncore/comm/keypebble/kvncconndlg.cpp @@ -0,0 +1,75 @@ +#include <qframe.h> +#include <qvbox.h> +#include <qcheckbox.h> +#include <qspinbox.h> +#include <qlabel.h> +#include <qlayout.h> +#include <qwhatsthis.h> +#include <qapplication.h> +#include <qlineedit.h> +#include <qpushbutton.h> +#include "krfbserver.h" + +#include "kvncconndlg.h" + +KVNCConnDlg::KVNCConnDlg( KRFBServer *options, + QWidget *parent, char *name, bool modal ) +: KVNCConnDlgBase( parent, name, modal ) +{ + this->options=options; + tmpOptions=*options; + + serverHostname->setText(options->hostname); + serverDisplay->setValue(options->display); + serverPassword->setText(options->password); + serverBookmark->setText(options->name); + + hex->setChecked( options->hexTile ); + corre->setChecked( options->corre ); + rre->setChecked( options->rre ); + copyRect->setChecked( options->copyrect ); + + // TODO + hex->setEnabled( false ); + corre->setEnabled( false ); + rre->setEnabled( false ); + // /TODO + + deIconify->setChecked( options->deIconify ); + bit->setChecked( options->colors256 ); + shared->setChecked( options->shared ); + timeBox->setValue( options->updateRate ); + + +} + +KVNCConnDlg::~KVNCConnDlg() +{ +} + +void KVNCConnDlg::accept() +{ + save(); + QDialog::accept(); +} + +void KVNCConnDlg::save() +{ + tmpOptions.hexTile = hex->isChecked(); + tmpOptions.corre = corre->isChecked(); + tmpOptions.rre = rre->isChecked(); + tmpOptions.copyrect = copyRect->isChecked(); + tmpOptions.deIconify = deIconify->isChecked(); + tmpOptions.colors256 = bit->isChecked(); + tmpOptions.shared = shared->isChecked(); + tmpOptions.hostname = serverHostname->text(); + tmpOptions.password = serverPassword->text(); + tmpOptions.display = serverDisplay->value(); + tmpOptions.name = serverBookmark->text(); + + if (!serverBookmark->text().isEmpty()) { + if ( options) { + *options=tmpOptions; + } + } +} diff --git a/noncore/comm/keypebble/kvncconnectdlg.cpp b/noncore/comm/keypebble/kvncconnectdlg.cpp deleted file mode 100644 index 467cebf..0000000 --- a/noncore/comm/keypebble/kvncconnectdlg.cpp +++ b/dev/null @@ -1,79 +0,0 @@ -#include <qstring.h> -#include <qlayout.h> -#include <qframe.h> -#include <qspinbox.h> -#include <qcombobox.h> -#include <qlabel.h> -#include <qfont.h> - -#include <assert.h> - -#include "krfbconnection.h" -#include "kvncoptionsdlg.h" -#include "kvncconnectdlg.h" - - -KVNCConnectDlg::KVNCConnectDlg( KRFBConnection *con, - QWidget *parent, const char *name ) - : QDialog( parent, name, true ) -{ - setCaption( tr("Connect to VNC server") ); - assert( con ); - this->con = con; - - QGridLayout *inner = new QGridLayout( this, 3, 2, 6 ); - - QLabel *label = new QLabel( tr("Host Name:"), - this , "hostLabel"); - hostNameCombo = new QComboBox( true, this ); - hostNameCombo->setInsertionPolicy( QComboBox::AtTop ); - hostNameCombo->setMaxCount( 10 ); - hostNameCombo->insertItem( "localhost" ); - hostNameCombo->setFocus(); - - inner->addWidget( label, 0, 0 ); - inner->addWidget( hostNameCombo, 0, 1 ); - - label = new QLabel( tr("Display Number:"), this, "displayNumber" ); - displayNumberEdit = new QSpinBox( this ); - - inner->addWidget( label, 1, 0 ); - inner->addWidget( displayNumberEdit, 1, 1 ); - - // if ( viewer->display() != -1 ) { - // displayNumberEdit->setValue( viewer->display() ); - displayNumberEdit->setValue( 1 ); - // } - - label = new QLabel( tr("Password:"), this ); - inner->addWidget( label, 2, 0 ); - - passwordEdit = new QLineEdit( this ); - passwordEdit->setEchoMode( QLineEdit::Password ); - inner->addWidget( passwordEdit, 2, 1 ); - - inner->setColStretch( 0, 0 ); - inner->setColStretch( 1, 15 ); -} - - -void KVNCConnectDlg::accept() -{ - int dis; - // viewer->setHost(hostNameCombo->currentText()); - QString temp = displayNumberEdit->text(); - if(temp.isEmpty()) - dis = -1; - else - dis = temp.toUInt(); - // viewer->setDisplay(dis); - QDialog::accept(); -} - -void KVNCConnectDlg::options() -{ - KVNCOptionsDlg *wdg = new KVNCOptionsDlg( con->options(), this ); - wdg->exec(); - delete wdg; -} - diff --git a/noncore/comm/keypebble/kvncconnectdlg.h b/noncore/comm/keypebble/kvncconnectdlg.h deleted file mode 100644 index cf34aab..0000000 --- a/noncore/comm/keypebble/kvncconnectdlg.h +++ b/dev/null @@ -1,39 +0,0 @@ -// -*- c++ -*- - -#ifndef KVNCCONNECTDLG_H -#define KVNCCONNECTDLG_H - -#include <qdialog.h> -#include <qspinbox.h> -#include <qcombobox.h> -#include <qlineedit.h> -#include <qurl.h> - -class KRFBConnection; - -class KVNCConnectDlg : public QDialog -{ - Q_OBJECT - -public: - KVNCConnectDlg( KRFBConnection *con, - QWidget *parent = 0, const char *name = 0 ); - - QString hostname() { return hostNameCombo->currentText(); }; - int display() { return displayNumberEdit->value(); }; - QString password() const { return passwordEdit->text(); } - -protected: - void accept(); - -protected slots: - void options(); - -private: - QComboBox *hostNameCombo; - QSpinBox *displayNumberEdit; - QLineEdit *passwordEdit; - KRFBConnection *con; -}; - -#endif // KVNCCONNECTDLG_H diff --git a/noncore/comm/keypebble/kvncoptionsdlg.cpp b/noncore/comm/keypebble/kvncoptionsdlg.cpp deleted file mode 100644 index 9d61c7b..0000000 --- a/noncore/comm/keypebble/kvncoptionsdlg.cpp +++ b/dev/null @@ -1,54 +0,0 @@ -#include <qframe.h> -#include <qvbox.h> -#include <qcheckbox.h> -#include <qspinbox.h> -#include <qlabel.h> -#include <qlayout.h> -#include <qwhatsthis.h> -#include <qapplication.h> -#include "krfboptions.h" - -#include "kvncoptionsdlg.h" - -KVNCOptionsDlg::KVNCOptionsDlg( KRFBOptions *options, - QWidget *parent, char *name, bool modal ) - : VncOptionsBase( parent, name, modal ) -{ - this->options = options; - - hex->setChecked( options->hexTile ); - corre->setChecked( options->corre ); - rre->setChecked( options->rre ); - copyRect->setChecked( options->copyrect ); - - // TODO - hex->setEnabled( false ); - corre->setEnabled( false ); - rre->setEnabled( false ); - // /TODO - - deIconify->setChecked( options->deIconify ); - bit->setChecked( options->colors256 ); - shared->setChecked( options->shared ); - timeBox->setValue( options->updateRate ); -} - -KVNCOptionsDlg::~KVNCOptionsDlg() -{ -} - -void KVNCOptionsDlg::accept() -{ - options->hexTile = hex->isChecked(); - options->corre = corre->isChecked(); - options->rre = rre->isChecked(); - options->copyrect = copyRect->isChecked(); - options->deIconify = deIconify->isChecked(); - options->colors256 = bit->isChecked(); - options->shared = shared->isChecked(); - options->updateRate = timeBox->value(); - options->writeSettings(); - - QDialog::accept(); -} - diff --git a/noncore/comm/keypebble/kvncoptionsdlg.h b/noncore/comm/keypebble/kvncoptionsdlg.h deleted file mode 100644 index a166490..0000000 --- a/noncore/comm/keypebble/kvncoptionsdlg.h +++ b/dev/null @@ -1,30 +0,0 @@ -// -*- c++ -*- - -#ifndef KVNCOPTIONSDIALOG_H -#define KVNCOPTIONSDIALOG_H - -#include "vncoptionsbase.h" - -class KRFBOptions; - -class KVNCOptionsDlg : public VncOptionsBase -{ -Q_OBJECT - -public: - KVNCOptionsDlg( KRFBOptions *options, - QWidget *parent = 0, char *name = 0, bool modal = true ); - ~KVNCOptionsDlg(); - -protected: - void accept(); - -private: - KRFBOptions *options; -}; - -#endif // KVNCOPTIONSDIALOG_H - - - - diff --git a/noncore/comm/keypebble/main.cpp b/noncore/comm/keypebble/main.cpp index ee3cd79..bc7782c 100644 --- a/noncore/comm/keypebble/main.cpp +++ b/noncore/comm/keypebble/main.cpp @@ -7,11 +7,9 @@ int main( int argc, char **argv ) { QPEApplication app( argc, argv ); KVNC *view = new KVNC( "Keypebble" ); app.showMainWidget( view ); - if ( argc > 1 ) - view->openURL( QUrl(argv[1]) ); - return app.exec(); } + |