00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 #ifndef QWINDOWSYSTEM_QWS_H
00043 #define QWINDOWSYSTEM_QWS_H
00044
00045 #include <QtCore/qbytearray.h>
00046 #include <QtCore/qmap.h>
00047 #include <QtCore/qdatetime.h>
00048 #include <QtCore/qlist.h>
00049
00050 #include <QtGui/qwsevent_qws.h>
00051 #include <QtGui/qkbd_qws.h>
00052 #include <QtGui/qregion.h>
00053
00054 QT_BEGIN_HEADER
00055
00056 QT_BEGIN_NAMESPACE
00057
00058 QT_MODULE(Gui)
00059
00060 struct QWSWindowPrivate;
00061 class QWSCursor;
00062 class QWSClient;
00063 class QWSRegionManager;
00064 class QBrush;
00065 class QVariant;
00066 class QInputMethodEvent;
00067 class QWSInputMethod;
00068 class QWSBackingStore;
00069 class QWSWindowSurface;
00070
00071 #ifdef QT3_SUPPORT
00072 class QImage;
00073 class QColor;
00074 #endif
00075
00076 class QWSInternalWindowInfo
00077 {
00078 public:
00079 int winid;
00080 unsigned int clientid;
00081 QString name;
00082 };
00083
00084
00085 class Q_GUI_EXPORT QWSScreenSaver
00086 {
00087 public:
00088 virtual ~QWSScreenSaver();
00089 virtual void restore()=0;
00090 virtual bool save(int level)=0;
00091 };
00092
00093
00094 class Q_GUI_EXPORT QWSWindow
00095 {
00096 friend class QWSServer;
00097 friend class QWSServerPrivate;
00098
00099 public:
00100 QWSWindow(int i, QWSClient* client);
00101 ~QWSWindow();
00102
00103 int winId() const { return id; }
00104 const QString &name() const { return rgnName; }
00105 const QString &caption() const { return rgnCaption; }
00106 QWSClient* client() const { return c; }
00107 const QRegion &requestedRegion() const { return requested_region; }
00108 QRegion allocatedRegion() const;
00109 QRegion paintedRegion() const;
00110 bool isVisible() const { return !requested_region.isEmpty(); }
00111 bool isPartiallyObscured() const { return requested_region != allocatedRegion(); }
00112 bool isFullyObscured() const { return allocatedRegion().isEmpty(); }
00113
00114 enum State { NoState, Hidden, Showing, Visible, Hiding, Raising, Lowering, Moving, ChangingGeometry, Destroyed };
00115 State state() const;
00116 Qt::WindowFlags windowFlags() const;
00117 QRegion dirtyOnScreen() const;
00118
00119 void raise();
00120 void lower();
00121 void show();
00122 void hide();
00123 void setActiveWindow();
00124
00125 bool isOpaque() const {return opaque && _opacity == 255;}
00126 uint opacity() const { return _opacity; }
00127
00128 QWSWindowSurface* windowSurface() const { return surface; }
00129
00130 private:
00131 bool hidden() const { return requested_region.isEmpty(); }
00132 bool forClient(const QWSClient* cl) const { return cl==c; }
00133
00134 void setName(const QString &n);
00135 void setCaption(const QString &c);
00136
00137 void focus(bool get);
00138 int focusPriority() const { return last_focus_time; }
00139 void operation(QWSWindowOperationEvent::Operation o);
00140 void shuttingDown() { last_focus_time=0; }
00141
00142 #ifdef QT_QWS_CLIENTBLIT
00143 QRegion directPaintRegion() const;
00144 inline void setDirectPaintRegion(const QRegion &topmost);
00145 #endif
00146 inline void setAllocatedRegion(const QRegion ®ion);
00147
00148 void createSurface(const QString &key, const QByteArray &data);
00149
00150 #ifndef QT_NO_QWSEMBEDWIDGET
00151 void startEmbed(QWSWindow *window);
00152 void stopEmbed(QWSWindow *window);
00153 #endif
00154
00155 private:
00156 int id;
00157 QString rgnName;
00158 QString rgnCaption;
00159 bool modified;
00160 bool onTop;
00161 QWSClient* c;
00162 QRegion requested_region;
00163 QRegion exposed;
00164 int last_focus_time;
00165 QWSWindowSurface *surface;
00166 uint _opacity;
00167 bool opaque;
00168 QWSWindowPrivate *d;
00169 #ifdef QT3_SUPPORT
00170 inline QT3_SUPPORT QRegion requested() const { return requested_region; }
00171
00172 #endif
00173 };
00174
00175
00176 #ifndef QT_NO_SOUND
00177 class QWSSoundServer;
00178 #ifdef QT_USE_OLD_QWS_SOUND
00179 class QWSSoundServerData;
00180
00181 class Q_GUI_EXPORT QWSSoundServer : public QObject {
00182 Q_OBJECT
00183 public:
00184 QWSSoundServer(QObject* parent);
00185 ~QWSSoundServer();
00186 void playFile(const QString& filename);
00187 private Q_SLOTS:
00188 void feedDevice(int fd);
00189 private:
00190 QWSSoundServerData* d;
00191 };
00192 #endif
00193 #endif
00194
00195
00196
00197
00198
00199
00200
00201
00202 class QWSMouseHandler;
00203 struct QWSCommandStruct;
00204 class QWSServerPrivate;
00205 class QWSServer;
00206
00207 extern Q_GUI_EXPORT QWSServer *qwsServer;
00208
00209 class Q_GUI_EXPORT QWSServer : public QObject
00210 {
00211 friend class QCopChannel;
00212 friend class QWSMouseHandler;
00213 friend class QWSWindow;
00214 friend class QWSDisplay;
00215 friend class QWSInputMethod;
00216 Q_OBJECT
00217 Q_DECLARE_PRIVATE(QWSServer)
00218 public:
00219 explicit QWSServer(int flags = 0, QObject *parent=0);
00220 #ifdef QT3_SUPPORT
00221 QT3_SUPPORT_CONSTRUCTOR QWSServer(int flags, QObject *parent, const char *name);
00222 #endif
00223 ~QWSServer();
00224 enum ServerFlags { DisableKeyboard = 0x01,
00225 DisableMouse = 0x02 };
00226
00227 static void sendKeyEvent(int unicode, int keycode, Qt::KeyboardModifiers modifiers,
00228 bool isPress, bool autoRepeat);
00229 #ifndef QT_NO_QWS_KEYBOARD
00230 static void processKeyEvent(int unicode, int keycode, Qt::KeyboardModifiers modifiers,
00231 bool isPress, bool autoRepeat);
00232 #endif
00233
00234 static QWSServer* instance() { return qwsServer; }
00235
00236 #ifndef QT_NO_QWS_INPUTMETHODS
00237 #ifdef QT3_SUPPORT
00238 enum IMState { IMCompose, IMEnd, IMStart = IMCompose };
00239 #endif
00240 enum IMMouse { MousePress, MouseRelease, MouseMove, MouseOutside };
00241 void sendIMEvent(const QInputMethodEvent*);
00242 void sendIMQuery(int property);
00243 #endif
00244
00245 #ifndef QT_NO_QWS_KEYBOARD
00246 class KeyboardFilter
00247 {
00248 public:
00249 virtual ~KeyboardFilter() {}
00250 virtual bool filter(int unicode, int keycode, int modifiers,
00251 bool isPress, bool autoRepeat)=0;
00252 };
00253 static void addKeyboardFilter(KeyboardFilter *f);
00254 static void removeKeyboardFilter();
00255 #endif
00256
00257 #ifndef QT_NO_QWS_INPUTMETHODS
00258 static void setCurrentInputMethod(QWSInputMethod *im);
00259 static void resetInputMethod();
00260 #endif
00261
00262 static void setDefaultMouse(const char *);
00263 static void setDefaultKeyboard(const char *);
00264 static void setMaxWindowRect(const QRect&);
00265 static void sendMouseEvent(const QPoint& pos, int state, int wheel = 0);
00266
00267 static void setBackground(const QBrush &);
00268 #ifdef QT3_SUPPORT
00269 static QT3_SUPPORT void setDesktopBackground(const QImage &img);
00270 static QT3_SUPPORT void setDesktopBackground(const QColor &);
00271 #endif
00272 static QWSMouseHandler *mouseHandler();
00273 static const QList<QWSMouseHandler*>& mouseHandlers();
00274 static void setMouseHandler(QWSMouseHandler*);
00275 #ifndef QT_NO_QWS_KEYBOARD
00276 static QWSKeyboardHandler* keyboardHandler();
00277 static void setKeyboardHandler(QWSKeyboardHandler* kh);
00278 #endif
00279 QWSWindow *windowAt(const QPoint& pos);
00280
00281 const QList<QWSWindow*> &clientWindows();
00282
00283 void openMouse();
00284 void closeMouse();
00285 void suspendMouse();
00286 void resumeMouse();
00287 #ifndef QT_NO_QWS_KEYBOARD
00288 void openKeyboard();
00289 void closeKeyboard();
00290 #endif
00291
00292 static void setScreenSaver(QWSScreenSaver*);
00293 static void setScreenSaverIntervals(int* ms);
00294 static void setScreenSaverInterval(int);
00295 static void setScreenSaverBlockLevel(int);
00296 static bool screenSaverActive();
00297 static void screenSaverActivate(bool);
00298
00299
00300 void refresh();
00301 void refresh(QRegion &);
00302
00303 void enablePainting(bool);
00304 static void processEventQueue();
00305 static QList<QWSInternalWindowInfo*> * windowList();
00306
00307 void sendPropertyNotifyEvent(int property, int state);
00308
00309 static QPoint mousePosition;
00310
00311 static void startup(int flags);
00312 static void closedown();
00313
00314 static void beginDisplayReconfigure();
00315 static void endDisplayReconfigure();
00316
00317 #ifndef QT_NO_QWS_CURSOR
00318 static void setCursorVisible(bool);
00319 static bool isCursorVisible();
00320 #endif
00321
00322 const QBrush &backgroundBrush() const;
00323
00324 enum WindowEvent { Create=0x0001, Destroy=0x0002, Hide=0x0004, Show=0x0008,
00325 Raise=0x0010, Lower=0x0020, Geometry=0x0040, Active = 0x0080,
00326 Name=0x0100 };
00327
00328 Q_SIGNALS:
00329 void windowEvent(QWSWindow *w, QWSServer::WindowEvent e);
00330
00331 #ifndef QT_NO_COP
00332 void newChannel(const QString& channel);
00333 void removedChannel(const QString& channel);
00334
00335 #endif
00336 #ifndef QT_NO_QWS_INPUTMETHODS
00337 void markedText(const QString &);
00338 #endif
00339
00340 protected:
00341 void timerEvent(QTimerEvent *e);
00342
00343 private:
00344 friend class QApplicationPrivate;
00345 void updateWindowRegions() const;
00346
00347 #ifdef QT3_SUPPORT
00348 #ifndef QT_NO_QWS_KEYBOARD
00349 static inline QT3_SUPPORT void setKeyboardFilter(QWSServer::KeyboardFilter *f)
00350 { if (f) addKeyboardFilter(f); else removeKeyboardFilter(); }
00351 #endif
00352 #endif
00353
00354 private:
00355 #ifndef QT_NO_QWS_MULTIPROCESS
00356 Q_PRIVATE_SLOT(d_func(), void _q_clientClosed())
00357 Q_PRIVATE_SLOT(d_func(), void _q_doClient())
00358 Q_PRIVATE_SLOT(d_func(), void _q_deleteWindowsLater())
00359 #endif
00360
00361 Q_PRIVATE_SLOT(d_func(), void _q_screenSaverWake())
00362 Q_PRIVATE_SLOT(d_func(), void _q_screenSaverSleep())
00363 Q_PRIVATE_SLOT(d_func(), void _q_screenSaverTimeout())
00364
00365 #ifndef QT_NO_QWS_MULTIPROCESS
00366 Q_PRIVATE_SLOT(d_func(), void _q_newConnection())
00367 #endif
00368 };
00369
00370 #ifndef QT_NO_QWS_INPUTMETHODS
00371 class Q_GUI_EXPORT QWSInputMethod : public QObject
00372 {
00373 Q_OBJECT
00374 public:
00375 QWSInputMethod();
00376 virtual ~QWSInputMethod();
00377
00378 enum UpdateType {Update, FocusIn, FocusOut, Reset, Destroyed};
00379
00380 virtual bool filter(int unicode, int keycode, int modifiers,
00381 bool isPress, bool autoRepeat);
00382
00383 virtual bool filter(const QPoint &, int state, int wheel);
00384
00385 virtual void reset();
00386 virtual void updateHandler(int type);
00387 virtual void mouseHandler(int pos, int state);
00388 virtual void queryResponse(int property, const QVariant&);
00389
00390 protected:
00391 uint setInputResolution(bool isHigh);
00392 uint inputResolutionShift() const;
00393
00394 void sendMouseEvent(const QPoint &pos, int state, int wheel);
00395
00396 void sendEvent(const QInputMethodEvent*);
00397 void sendPreeditString(const QString &preeditString, int cursorPosition, int selectionLength = 0);
00398 void sendCommitString(const QString &commitString, int replaceFrom = 0, int replaceLength = 0);
00399 void sendQuery(int property);
00400
00401 #ifdef QT3_SUPPORT
00402 inline void sendIMEvent(QWSServer::IMState, const QString& txt, int cpos, int selLen = 0);
00403 #endif
00404 private:
00405 bool mIResolution;
00406 };
00407
00408 inline void QWSInputMethod::sendEvent(const QInputMethodEvent *ime)
00409 {
00410 qwsServer->sendIMEvent(ime);
00411 }
00412 #ifdef QT3_SUPPORT
00413 inline void QWSInputMethod::sendIMEvent(QWSServer::IMState state, const QString& txt, int cpos, int selLen)
00414 {
00415 if (state == QWSServer::IMCompose) sendPreeditString(txt, cpos, selLen); else sendCommitString(txt);
00416 }
00417 #endif
00418
00419 inline void QWSInputMethod::sendQuery(int property)
00420 {
00421 qwsServer->sendIMQuery(property);
00422 }
00423
00424
00425 #endif // QT_NO_QWS_INPUTMETHODS
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435 struct QWSMouseEvent;
00436
00437 typedef QMap<int, QWSCursor*> QWSCursorMap;
00438
00439 class QWSClientPrivate;
00440 class QWSCommand;
00441 class QWSConvertSelectionCommand;
00442
00443 class Q_GUI_EXPORT QWSClient : public QObject
00444 {
00445 Q_OBJECT
00446 Q_DECLARE_PRIVATE(QWSClient)
00447 public:
00448 QWSClient(QObject* parent, QWS_SOCK_BASE *, int id);
00449 ~QWSClient();
00450
00451 int socket() const;
00452
00453 void setIdentity(const QString&);
00454 QString identity() const { return id; }
00455
00456 void sendEvent(QWSEvent* event);
00457 void sendConnectedEvent(const char *display_spec);
00458 void sendMaxWindowRectEvent(const QRect &rect);
00459 void sendPropertyNotifyEvent(int property, int state);
00460 void sendPropertyReplyEvent(int property, int len, const char *data);
00461 void sendSelectionClearEvent(int windowid);
00462 void sendSelectionRequestEvent(QWSConvertSelectionCommand *cmd, int windowid);
00463 #ifndef QT_QWS_CLIENTBLIT
00464 void sendRegionEvent(int winid, QRegion rgn, int type);
00465 #else
00466 void sendRegionEvent(int winid, QRegion rgn, int type, int id = 0);
00467 #endif
00468 #ifndef QT_NO_QWSEMBEDWIDGET
00469 void sendEmbedEvent(int winid, QWSEmbedEvent::Type type,
00470 const QRegion ®ion = QRegion());
00471 #endif
00472 QWSCommand* readMoreCommand();
00473
00474 int clientId() const { return cid; }
00475
00476 QWSCursorMap cursors;
00477 Q_SIGNALS:
00478 void connectionClosed();
00479 void readyRead();
00480 private Q_SLOTS:
00481 void closeHandler();
00482 void errorHandler();
00483
00484 private:
00485 #ifndef QT_NO_QWS_MULTIPROCESS
00486 friend class QWSWindow;
00487 void removeUnbufferedSurface();
00488 void addUnbufferedSurface();
00489 #endif
00490
00491 private:
00492 int socketDescriptor;
00493 #ifndef QT_NO_QWS_MULTIPROCESS
00494 QWSSocket *csocket;
00495 #endif
00496 QWSCommand* command;
00497 uint isClosed : 1;
00498 QString id;
00499 int cid;
00500
00501 friend class QWSServerPrivate;
00502 };
00503
00504 QT_END_NAMESPACE
00505
00506 QT_END_HEADER
00507
00508 #endif // QWINDOWSYSTEM_QWS_H