summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--x11/ipc/client/ocopclient.cpp25
-rw-r--r--x11/ipc/client/ocopclient.h4
-rw-r--r--x11/libqpe-x11/qpe/qpeapplication.cpp207
-rw-r--r--x11/libqpe-x11/qpe/qpeapplication.h23
4 files changed, 243 insertions, 16 deletions
diff --git a/x11/ipc/client/ocopclient.cpp b/x11/ipc/client/ocopclient.cpp
index 43e426c..ac6e4a3 100644
--- a/x11/ipc/client/ocopclient.cpp
+++ b/x11/ipc/client/ocopclient.cpp
@@ -1,11 +1,12 @@
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
+#include <sys/types.h>
#include <sys/un.h>
#include <qfile.h>
#include <qtimer.h>
@@ -13,33 +14,44 @@
#include "ocopclient.h"
OCOPClient::OCOPClient( const QString& path, QObject* obj )
: QObject( obj )
{
+ m_tries = 0;
init(QFile::encodeName(path) );
}
OCOPClient::~OCOPClient() {
+ delete m_notify;
close( m_socket );
}
+void OCOPClient::init() {
+ // failed start ther server NOW!!!
+ startUP();
+ QCString str;
+ init(str );
+}
void OCOPClient::init( const QCString& ) {
+ m_tries++;
struct sockaddr_un unix_adr;
if ( (m_socket = socket(PF_UNIX, SOCK_STREAM, 0) ) < 0 ) {
qWarning("could not socket");
- QTimer::singleShot(400, this,SLOT(init() ) );
+ if ( m_tries < 8 )
+ QTimer::singleShot(400, this,SLOT(init() ) );
return;
}
memset(&unix_adr, 0, sizeof(unix_adr ) );
unix_adr.sun_family = AF_UNIX;
sprintf(unix_adr.sun_path,"%s/.opie.cop", getenv("HOME") );
int length = sizeof(unix_adr.sun_family) + strlen(unix_adr.sun_path);
if ( ::connect(m_socket, (struct sockaddr*)&unix_adr, length ) < 0 ) {
qWarning("could not connect %d", errno );
close( m_socket );
- QTimer::singleShot(400, this, SLOT(init() ) );
+ if ( m_tries < 8 )
+ QTimer::singleShot(400, this, SLOT(init() ) );
return;
}
m_notify = new QSocketNotifier(m_socket, QSocketNotifier::Read, this );
connect( m_notify, SIGNAL(activated(int) ),
this, SLOT(newData() ) );
}
@@ -124,6 +136,15 @@ void OCOPClient::call( const OCOPPacket& pack ) {
OCOPHead head = pack.head();
write(m_socket, &head, sizeof(head) );
write(m_socket, pack.channel().data(), pack.channel().size() );
write(m_socket, pack.header().data(), pack.header().size() );
write(m_socket, pack.content().data(), pack.content().size() );
}
+void OCOPClient::startUP() {
+ qWarning("Start me up");
+ pid_t pi = fork();
+ if ( pi == 0 ) {
+ setsid();
+ execlp("opie-ipc", "opie-ipc", NULL );
+ _exit(1);
+ }
+}
diff --git a/x11/ipc/client/ocopclient.h b/x11/ipc/client/ocopclient.h
index e9544b9..53018a5 100644
--- a/x11/ipc/client/ocopclient.h
+++ b/x11/ipc/client/ocopclient.h
@@ -41,19 +41,21 @@ public:
/* make it singleton? */
//static OCOPClient* self();
/* no direct signals due the design */
signals:
void called(const QCString&, const QCString&, const QByteArray& );
private slots:
+ void init();
void init(const QCString& pa);
void newData();
private:
+ void startUP();
OCOPPacket packet()const;
void call( const OCOPPacket& );
QSocketNotifier* m_notify;
int m_socket;
-private slots:
+ int m_tries;
};
#endif
diff --git a/x11/libqpe-x11/qpe/qpeapplication.cpp b/x11/libqpe-x11/qpe/qpeapplication.cpp
index 891e132..6e4a96c 100644
--- a/x11/libqpe-x11/qpe/qpeapplication.cpp
+++ b/x11/libqpe-x11/qpe/qpeapplication.cpp
@@ -200,12 +200,22 @@ namespace {
while ( !r && sl > 0 );
}
return r;
};
};
// QPEApplication
+QPEApplication::~QPEApplication() {
+ qWarning("~QPEApplication");
+ ungrabKeyboard();
+ qWarning("UngrabKeyboard");
+
+// delete m_sys;
+// delete m_pid;
+
+ delete d;
+}
QPEApplication::QPEApplication(int &arg, char** argv, Type t)
: QApplication( arg, argv, t ) {
d = new Private;
d->loadTextCodecs();
d->loadImageCodecs();
@@ -231,22 +241,25 @@ QPEApplication::QPEApplication(int &arg, char** argv, Type t)
qcopfn += QString( argv[0] ); // append command name to the QCOP name
QFile file( qcopfn );
if (file.open(IO_ReadOnly ) ) {
flock( file.handle(), LOCK_EX );
}
- m_sys = new QCopChannel( "QPE/System", this );
+ /* Hmmm damn we need to make the parent 0l otherwise it get's deleted
+ * past the QApplication
+ */
+ m_sys = new QCopChannel( "QPE/System", 0l);
connect(m_sys, SIGNAL( received( const QCString&, const QByteArray& ) ),
this, SLOT(systemMessage( const QCString&, const QByteArray& ) ) );
// private channel QPE/Application/appname
QCString channel = QCString( argv[0] );
channel.replace( QRegExp( ".*/"), "" );
d->appName = channel;
channel = "QPE/Application/"+ channel;
- m_pid = new QCopChannel( channel, this );
+ m_pid = new QCopChannel( channel, 0l );
connect(m_pid, SIGNAL( received( const QCString&, const QByteArray& ) ),
this, SLOT( pidMessage( const QCString&, const QByteArray& ) ) );
// read the Pre QCOP Stuff from the file
if ( file.isOpen() ) {
d->keep_running = FALSE;
@@ -303,15 +316,12 @@ void QPEApplication::initTranslations() {
if ( trans->load( tfn ) )
installTranslator( trans );
else
delete trans;
}
}
-QPEApplication::~QPEApplication() {
- delete d;
-}
QString QPEApplication::qpeDir() {
const char * base = getenv( "OPIEDIR" );
if ( base )
return QString( base ) + "/";
return QString( "../" );
@@ -383,18 +393,12 @@ void QPEApplication::ungrabKeyboard() {
e << QString::null;
d->kbregrab = FALSE;
d->kbgrabber = 0;
}
}
-void QPEApplication::setStylusOperation( QWidget*, StylusMode ) {
-
-}
-QPEApplication::StylusMode QPEApplication::stylusOperation( QWidget* ) {
-
-}
void QPEApplication::showMainWidget( QWidget* wid, bool b) {
d->show(wid, b );
}
void QPEApplication::showMainDocumentWidget( QWidget* mw, bool m) {
if ( mw && argc() == 2 )
Global::setDocument( mw, QString::fromUtf8(argv()[1] ) );
@@ -432,27 +436,204 @@ bool QPEApplication::keyboardGrabbed()const {
return d->kbgrabber;
}
int QPEApplication::exec() {
/* now send the QCOP stuff gotten from the file */
d->sendQCopQ();
- if ( d->keep_running )
- return QApplication::exec();
+ if ( d->keep_running ) {
+ qWarning("going to exec");
+ int a = QApplication::exec();
+ qWarning("left");
+ return a;
+ }
{
QCopEnvelope e( "QPE/System", "closing(QString)" );
e << d->appName;
}
+ qWarning("processing events!");
processEvents();
return 0;
}
void QPEApplication::internalSetStyle( const QString& ) {
}
+void QPEApplication::systemMessage( const QCString&, const QByteArray& ) {
+
+}
+void QPEApplication::pidMessage( const QCString&, const QByteArray& ) {
+
+}
+void QPEApplication::timerEvent( QTimerEvent* e ) {
+ if ( e->timerId() == d->presstimer && d->presswidget ) {
+ // Right pressed
+ postEvent( d->presswidget,
+ new QMouseEvent( QEvent::MouseButtonPress, d->presspos,
+ RightButton, LeftButton ) );
+ killTimer( d->presstimer );
+ d->presstimer = 0;
+ }
+}
+
+// InputMethods Hints
+namespace {
+ static QPtrDict<void>* inputMethodDict = 0;
+ static void createInputMethodDict(){
+ if ( !inputMethodDict )
+ inputMethodDict = new QPtrDict<void>;
+ }
+
+ static QPtrDict<void>* stylusDict = 0;
+ static void createDict() {
+ if ( !stylusDict )
+ stylusDict = new QPtrDict<void>;
+ }
+};
+
+void QPEApplication::setInputMethodHint( QWidget* w, InputMethodHint mode ) {
+ createInputMethodDict();
+ if ( mode == Normal ) {
+ inputMethodDict->remove
+ ( w );
+ }else {
+ inputMethodDict->insert( w, ( void* ) mode );
+ }
+}
+QPEApplication::InputMethodHint QPEApplication::inputMethodHint( QWidget* w) {
+ if ( inputMethodDict && w )
+ return ( InputMethodHint ) ( int ) inputMethodDict->find( w );
+ return Normal;
+}
+
+
+void QPEApplication::removeSenderFromStylusDict() {
+ stylusDict->remove( ( void* ) sender() );
+ if ( d->presswidget == sender() )
+ d->presswidget = 0;
+}
+void QPEApplication::setStylusOperation( QWidget* w, StylusMode mode) {
+ createDict();
+ if ( mode == LeftOnly ) {
+ stylusDict->remove
+ ( w );
+ w->removeEventFilter( qApp );
+ }else {
+ stylusDict->insert( w, ( void* ) mode );
+ connect( w, SIGNAL( destroyed() ), qApp, SLOT( removeSenderFromStylusDict() ) );
+ w->installEventFilter( qApp );
+ }
+}
+QPEApplication::StylusMode QPEApplication::stylusOperation( QWidget* w) {
+ if ( stylusDict )
+ return ( StylusMode ) ( int ) stylusDict->find( w );
+ return LeftOnly;
+}
+
+// eventFilter......
+bool QPEApplication::eventFilter( QObject* o, QEvent* e ) {
+ if ( stylusDict && e->type() >= QEvent::MouseButtonPress && e->type() <= QEvent::MouseMove ) {
+ QMouseEvent * me = ( QMouseEvent* ) e;
+ StylusMode mode = (StylusMode)(int)stylusDict->find(o);
+ switch (mode) {
+ case RightOnHold:
+ switch ( me->type() ) {
+ case QEvent::MouseButtonPress:
+ if ( me->button() == LeftButton ) {
+ d->presstimer = startTimer(500); // #### pref.
+ d->presswidget = (QWidget*)o;
+ d->presspos = me->pos();
+ d->rightpressed = FALSE;
+ }
+ break;
+ case QEvent::MouseMove:
+ if (d->presstimer && (me->pos() - d->presspos).manhattanLength() > 8) {
+ killTimer(d->presstimer);
+ d->presstimer = 0;
+ }
+ break;
+ case QEvent::MouseButtonRelease:
+ if ( me->button() == LeftButton ) {
+ if ( d->presstimer ) {
+ killTimer(d->presstimer);
+ d->presstimer = 0;
+ }
+ if ( d->rightpressed && d->presswidget ) {
+ // Right released
+ postEvent( d->presswidget,
+ new QMouseEvent( QEvent::MouseButtonRelease, me->pos(),
+ RightButton, LeftButton + RightButton ) );
+ // Left released, off-widget
+ postEvent( d->presswidget,
+ new QMouseEvent( QEvent::MouseMove, QPoint( -1, -1),
+ LeftButton, LeftButton ) );
+ postEvent( d->presswidget,
+ new QMouseEvent( QEvent::MouseButtonRelease, QPoint( -1, -1),
+ LeftButton, LeftButton ) );
+ d->rightpressed = FALSE;
+ return TRUE; // don't send the real Left release
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ ;
+ }
+ }
+ else if ( e->type() == QEvent::KeyPress || e->type() == QEvent::KeyRelease ) {
+ QKeyEvent *ke = (QKeyEvent *)e;
+ if ( ke->key() == Key_Enter ) {
+ if ( o->isA( "QRadioButton" ) || o->isA( "QCheckBox" ) ) {
+ postEvent( o, new QKeyEvent( e->type(), Key_Space, ' ',
+ ke->state(), " ", ke->isAutoRepeat(), ke->count() ) );
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+}
+
+// Quit stuff
+void QPEApplication::restart() {
+
+}
+void QPEApplication::shutdown() {
+}
+void QPEApplication::tryQuit() {
+ qWarning("TryQuit!!");
+ if ( activeModalWidget() || strcmp( argv() [ 0 ], "embeddedkonsole" ) == 0 )
+ return ; // Inside modal loop or konsole. Too hard to save state.
+ {
+ QCopEnvelope e( "QPE/System", "closing(QString)" );
+ e << d->appName;
+ }
+ processEvents();
+ quit();
+}
+void QPEApplication::hideOrQuit() {
+ qWarning("hide or close");
+ processEvents();
+ qWarning("past processing");
+
+ // If we are a preloaded application we don't actually quit, so emit
+ // a System message indicating we're quasi-closing.
+ if ( d->preloaded && d->qpe_main_widget )
+
+ {
+ qWarning("hiding");
+ QCopEnvelope e("QPE/System", "fastAppHiding(QString)" );
+ e << d->appName;
+ d->qpe_main_widget->hide();
+ }
+ else
+ quit();
+}
#if defined(QT_QWS_IPAQ) || defined(QT_QWS_EBX)
// The libraries with the skiff package (and possibly others) have
// completely useless implementations of builtin new and delete that
// use about 50% of your CPU. Here we revert to the simple libc
diff --git a/x11/libqpe-x11/qpe/qpeapplication.h b/x11/libqpe-x11/qpe/qpeapplication.h
index cd385db..2af1c66 100644
--- a/x11/libqpe-x11/qpe/qpeapplication.h
+++ b/x11/libqpe-x11/qpe/qpeapplication.h
@@ -3,22 +3,24 @@
/**
* LGPLed
*/
#include <qapplication.h>
+#include <qevent.h>
#include <qpe/timestring.h>
class QCopChannel;
class QPEApplication : public QApplication {
Q_OBJECT
public:
QPEApplication(int& argc, char** argv, Type=GuiClient );
~QPEApplication();
+
static QString qpeDir();
static QString documentDir();
void applyStyle();
static int defaultRotation();
static void setDefaultRotation( int r );
@@ -29,12 +31,20 @@ public:
LeftOnly,
RightOnHold
};
static void setStylusOperation( QWidget*, StylusMode );
static StylusMode stylusOperation( QWidget* );
+ enum InputMethodHint {
+ Normal,
+ AlwaysOff,
+ AlwaysOn
+ };
+ static void setInputMethodHint( QWidget*, InputMethodHint );
+ static InputMethodHint inputMethodHint( QWidget* );
+
void showMainWidget( QWidget*, bool nomax = FALSE );
void showMainDocumentWidget( QWidget*, bool nomax = FALSE );
static void showDialog( QDialog*, bool nomax = FALSE );
static int execDialog( QDialog*, bool nomax = FALSE );
@@ -57,12 +67,25 @@ signals:
void reload();
private:
void initTranslations();
void internalSetStyle(const QString&);
+private slots:
+ void hideOrQuit();
+ void systemMessage( const QCString&, const QByteArray& );
+ void pidMessage( const QCString&, const QByteArray& );
+ void removeSenderFromStylusDict();
+protected:
+ virtual void restart();
+ virtual void shutdown();
+ bool eventFilter( QObject*, QEvent* );
+ void timerEvent( QTimerEvent* );
+ void raiseAppropriateWindow();
+ virtual void tryQuit();
+
private:
class Private;
Private* d;
QCopChannel *m_sys;
QCopChannel *m_pid;
};