summaryrefslogtreecommitdiff
path: root/x11/libqpe-x11
Side-by-side diff
Diffstat (limited to 'x11/libqpe-x11') (more/less context) (show whitespace changes)
-rw-r--r--x11/libqpe-x11/qpe/qpeapplication.cpp90
-rw-r--r--x11/libqpe-x11/qpe/qpeapplication.h2
2 files changed, 92 insertions, 0 deletions
diff --git a/x11/libqpe-x11/qpe/qpeapplication.cpp b/x11/libqpe-x11/qpe/qpeapplication.cpp
index 8785c74..75a8189 100644
--- a/x11/libqpe-x11/qpe/qpeapplication.cpp
+++ b/x11/libqpe-x11/qpe/qpeapplication.cpp
@@ -1,48 +1,59 @@
#define QTOPIA_INTERNAL_LANGLIST
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/file.h>
+
#include <qdir.h>
#include <qdialog.h>
#include <qdragobject.h>
#include <qevent.h>
#include <qlabel.h>
#include <qlist.h>
#include <qtextstream.h>
#include <qtextcodec.h>
#include <qpalette.h>
#include <qptrdict.h>
#include <qregexp.h>
+#include <qtimer.h>
#include <qpe/alarmserver.h>
#include <qpe/applnk.h>
#include <qpe/qpemenubar.h>
#include <qpe/textcodecinterface.h>
#include <qpe/imagecodecinterface.h>
#include <qpe/qlibrary.h>
#include <qpe/qpestyle.h>
#include <qpe/styleinterface.h>
#include <qpe/global.h>
#include <qpe/resource.h>
#include <qpe/config.h>
#include <qpe/network.h>
#include <qpe/qpeapplication.h>
#include <qpe/timestring.h>
#include <qpe/qcopenvelope_qws.h>
+
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+
+const int XKeyPress = KeyPress;
+const int XKeyRelease = KeyRelease;
+#undef KeyPress
+#undef KeyRelease
+
namespace {
struct QCopRec{
QCopRec( const QCString& ch, const QCString& msg, const QByteArray& ar )
: channel(ch), message(msg), data(ar) {
}
QCString channel;
QCString message;
QByteArray data;
};
};
@@ -67,24 +78,29 @@ public:
bool notbusysent : 1;
bool preloaded : 1;
bool forceshow : 1;
bool nomaximize : 1;
bool keep_running : 1;
QWidget* presswidget;
QPoint presspos;
QWidget* qpe_main_widget;
QString appName;
QString styleName;
QString decorationName;
+ Atom wm_delete_window;
+ Atom wm_take_focus;
+ Atom wm_context_help;
+ Atom wm_context_accept;
+ Atom wm_protocols;
private:
QList<QCopRec> qcopq;
};
QPEApplication::Private::~Private() {
}
QPEApplication::Private::Private()
: kbgrabber(0 ), presstimer(0 ), rightpressed( FALSE ), kbregrab( FALSE ), notbusysent( FALSE ),
preloaded( FALSE ), forceshow( FALSE ), nomaximize( FALSE ), keep_running( TRUE ),
presswidget( 0 ), qpe_main_widget(0 ) {
qcopq.setAutoDelete( TRUE );
@@ -210,24 +226,50 @@ QPEApplication::~QPEApplication() {
// 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();
+ // Init X-Atom
+ Atom *atoms[5];
+ Atom atoms_re[5];
+ char* names[5];
+ int n = 0;
+ atoms[n] = &d->wm_delete_window;
+ names[n++] = "WM_DELETE_WINDOW";
+
+ atoms[n] = &d->wm_take_focus;
+ names[n++] = "WM_TAKE_FOCUS";
+
+ atoms[n] = &d->wm_context_help;
+ names[n++] = "_NET_WM_CONTEXT_HELP";
+
+ atoms[n] = &d->wm_context_accept;
+ names[n++] = "_NET_WM_CONTEXT_ACCEPT";
+
+ atoms[n] = &d->wm_protocols;
+ names[n++] = "WM_PROTOCOLS";
+
+ XInternAtoms( qt_xdisplay(), names, n, FALSE, atoms_re);
+ // now copy the values over to the properties
+ for (int i = 0; i < n; i++ )
+ *atoms[i] = atoms_re[i];
+ // done with X11 Stuff
+
int dw = desktop()->width();
if ( dw < 200 ) {
setFont( QFont( "helvetica", 8 ) );
AppLnk::setSmallIconSize( 10 );
AppLnk::setBigIconSize( 28 );
}else if ( dw > 600 ) {
setFont( QFont( "helvetica", 12 ) );
AppLnk::setSmallIconSize( 24 );
AppLnk::setBigIconSize( 48 );
}else if ( dw > 200 ) {
setFont( QFont( "helvetica", 10 ) );
AppLnk::setSmallIconSize( 16 );
@@ -521,24 +563,44 @@ void QPEApplication::setStylusOperation( QWidget* w, StylusMode 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 ) {
+ /*
+ * We want our WM to show Ok and a X button
+ * on dialogs
+ * our part is to set the _NET_WM_CONTEXT_ACCEPT
+ * propery
+ * and then wait for a client message -zecke
+ * on show we will add the prop
+ */
+ if (o->inherits("QDialog") && e->type() == QEvent::Show ) {
+ QDialog* dialog = (QDialog*)o;
+ Atom wm_prot[45];
+ int n = 0;
+ wm_prot[n++] = d->wm_delete_window;
+ wm_prot[n++] = d->wm_take_focus;
+ wm_prot[n++] = d->wm_context_accept;
+ if ( dialog->testWFlags( WStyle_ContextHelp ) )
+ wm_prot[n++] = d->wm_context_help;
+ XSetWMProtocols( qt_xdisplay(), dialog->winId(), wm_prot, n );
+ return TRUE; // should be save
+ }
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;
@@ -648,24 +710,52 @@ void QPEApplication::prepareForTermination( bool willrestart )
lblWait->setPixmap( pix );
lblWait->setAlignment( QWidget::AlignCenter );
lblWait->show();
lblWait->showMaximized();
}
#ifndef SINGLE_APP
{ QCopEnvelope envelope( "QPE/System", "forceQuit()" );
}
processEvents(); // ensure the message goes out.
sleep( 1 ); // You have 1 second to comply.
#endif
}
+int QPEApplication::x11ClientMessage(QWidget* w, XEvent* event, bool b ) {
+ qWarning("X11 ClientMessage %d %d", event->type, ClientMessage);
+ if ( event->type == ClientMessage ) {
+ if ( (event->xclient.message_type == d->wm_protocols) &&
+ (event->xclient.data.l[0] == d->wm_context_accept ) ) {
+ qWarning("accepted!!!");
+ /*
+ * I'm not sure if we should use activeWidget
+ * or activeModalWidget
+ * a QDialog could be not modal too
+ */
+ if ( w->inherits("QDialog" ) ) {
+ qWarning("inherits QDialog!!!");
+ QDialog* dia = (QDialog*)w;
+ /*
+ * call it directly or via QTimer::singleShot?
+ */
+ QTimer::singleShot(0, dia, SLOT(reject() ) );
+ return 0;
+ }
+
+ }
+ }
+ return QApplication::x11ClientMessage(w, event, b );
+}
+
+#define KeyPress XKeyPress
+#define KeyRelease XKeyRelease
#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
// functions.
void* operator new[]( size_t size )
{
return malloc( size );
}
diff --git a/x11/libqpe-x11/qpe/qpeapplication.h b/x11/libqpe-x11/qpe/qpeapplication.h
index 333f331..254fbfa 100644
--- a/x11/libqpe-x11/qpe/qpeapplication.h
+++ b/x11/libqpe-x11/qpe/qpeapplication.h
@@ -52,24 +52,26 @@ public:
bool keepRunning()const;
bool keyboardGrabbed()const;
int exec();
// QWS bits
enum screenSaverHint {
Disable = 0,
DisableLightOff = 1,
DisableSuspend = 2,
Enable = 100
};
+ /* reimplemented for internal purposes */
+ int x11ClientMessage( QWidget*, XEvent*, bool );
signals:
void clientMoused();
void timeChanged();
void clockChanged( bool pm );
void micChanged( bool muted );
void volumeChanged( bool muted );
void appMessage( const QCString& msg, const QByteArray& data);
void weekChanged( bool startOnMonday );
void dateFormatChanged( DateFormat );
void flush();
void reload();