qwindowsystem_qws.h
上传用户:detong
上传日期:2022-06-22
资源大小:20675k
文件大小:14k
源码类别:

系统编程

开发平台:

Unix_Linux

  1. /****************************************************************************
  2. **
  3. ** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
  4. ** Contact: Qt Software Information (qt-info@nokia.com)
  5. **
  6. ** This file is part of the QtGui module of the Qt Toolkit.
  7. **
  8. ** Commercial Usage
  9. ** Licensees holding valid Qt Commercial licenses may use this file in
  10. ** accordance with the Qt Commercial License Agreement provided with the
  11. ** Software or, alternatively, in accordance with the terms contained in
  12. ** a written agreement between you and Nokia.
  13. **
  14. **
  15. ** GNU General Public License Usage
  16. ** Alternatively, this file may be used under the terms of the GNU
  17. ** General Public License versions 2.0 or 3.0 as published by the Free
  18. ** Software Foundation and appearing in the file LICENSE.GPL included in
  19. ** the packaging of this file.  Please review the following information
  20. ** to ensure GNU General Public Licensing requirements will be met:
  21. ** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
  22. ** http://www.gnu.org/copyleft/gpl.html.
  23. **
  24. ** Qt for Windows(R) Licensees
  25. ** As a special exception, Nokia, as the sole copyright holder for Qt
  26. ** Designer, grants users of the Qt/Eclipse Integration plug-in the
  27. ** right for the Qt/Eclipse Integration to link to functionality
  28. ** provided by Qt Designer and its related libraries.
  29. **
  30. ** If you are unsure which license is appropriate for your use, please
  31. ** contact the sales department at qt-sales@nokia.com.
  32. **
  33. ****************************************************************************/
  34. #ifndef QWINDOWSYSTEM_QWS_H
  35. #define QWINDOWSYSTEM_QWS_H
  36. #include <QtCore/qbytearray.h>
  37. #include <QtCore/qmap.h>
  38. #include <QtCore/qdatetime.h>
  39. #include <QtCore/qlist.h>
  40. #include <QtGui/qwsevent_qws.h>
  41. #include <QtGui/qkbd_qws.h>
  42. #include <QtGui/qregion.h>
  43. QT_BEGIN_HEADER
  44. QT_BEGIN_NAMESPACE
  45. QT_MODULE(Gui)
  46. struct QWSWindowPrivate;
  47. class QWSCursor;
  48. class QWSClient;
  49. class QWSRegionManager;
  50. class QBrush;
  51. class QVariant;
  52. class QInputMethodEvent;
  53. class QWSInputMethod;
  54. class QWSBackingStore;
  55. class QWSWindowSurface;
  56. #ifdef QT3_SUPPORT
  57. class QImage;
  58. class QColor;
  59. #endif
  60. class QWSInternalWindowInfo
  61. {
  62. public:
  63.     int winid;
  64.     unsigned int clientid;
  65.     QString name;   // Corresponds to QObject name of top-level widget
  66. };
  67. class Q_GUI_EXPORT QWSScreenSaver
  68. {
  69. public:
  70.     virtual ~QWSScreenSaver();
  71.     virtual void restore()=0;
  72.     virtual bool save(int level)=0;
  73. };
  74. class Q_GUI_EXPORT QWSWindow
  75. {
  76.     friend class QWSServer;
  77.     friend class QWSServerPrivate;
  78. public:
  79.     QWSWindow(int i, QWSClient* client);
  80.     ~QWSWindow();
  81.     int winId() const { return id; }
  82.     const QString &name() const { return rgnName; }
  83.     const QString &caption() const { return rgnCaption; }
  84.     QWSClient* client() const { return c; }
  85.     const QRegion &requestedRegion() const { return requested_region; }
  86.     QRegion allocatedRegion() const;
  87.     QRegion paintedRegion() const;
  88.     bool isVisible() const { return !requested_region.isEmpty(); }
  89.     bool isPartiallyObscured() const { return requested_region != allocatedRegion(); }
  90.     bool isFullyObscured() const { return allocatedRegion().isEmpty(); }
  91.     enum State { NoState, Hidden, Showing, Visible, Hiding, Raising, Lowering, Moving, ChangingGeometry, Destroyed };
  92.     State state() const;
  93.     Qt::WindowFlags windowFlags() const;
  94.     QRegion dirtyOnScreen() const;
  95.     void raise();
  96.     void lower();
  97.     void show();
  98.     void hide();
  99.     void setActiveWindow();
  100.     bool isOpaque() const {return opaque && _opacity == 255;}
  101.     uint opacity() const { return _opacity; }
  102.     QWSWindowSurface* windowSurface() const { return surface; }
  103. private:
  104.     bool hidden() const { return requested_region.isEmpty(); }
  105.     bool forClient(const QWSClient* cl) const { return cl==c; }
  106.     void setName(const QString &n);
  107.     void setCaption(const QString &c);
  108.     void focus(bool get);
  109.     int focusPriority() const { return last_focus_time; }
  110.     void operation(QWSWindowOperationEvent::Operation o);
  111.     void shuttingDown() { last_focus_time=0; }
  112. #ifdef QT_QWS_CLIENTBLIT
  113.     QRegion directPaintRegion() const;
  114.     inline void setDirectPaintRegion(const QRegion &topmost);
  115. #endif
  116.     inline void setAllocatedRegion(const QRegion &region);
  117.     void createSurface(const QString &key, const QByteArray &data);
  118. #ifndef QT_NO_QWSEMBEDWIDGET
  119.     void startEmbed(QWSWindow *window);
  120.     void stopEmbed(QWSWindow *window);
  121. #endif
  122. private:
  123.     int id;
  124.     QString rgnName;
  125.     QString rgnCaption;
  126.     bool modified;
  127.     bool onTop;
  128.     QWSClient* c;
  129.     QRegion requested_region;
  130.     QRegion exposed;
  131.     int last_focus_time;
  132.     QWSWindowSurface *surface;
  133.     uint _opacity;
  134.     bool opaque;
  135.     QWSWindowPrivate *d;
  136. #ifdef QT3_SUPPORT
  137.     inline QT3_SUPPORT QRegion requested() const { return requested_region; }
  138. //    inline QT3_SUPPORT QRegion allocation() const { return allocated_region; }
  139. #endif
  140. };
  141. #ifndef QT_NO_SOUND
  142. class QWSSoundServer;
  143. #ifdef QT_USE_OLD_QWS_SOUND
  144. class QWSSoundServerData;
  145. class Q_GUI_EXPORT QWSSoundServer : public QObject {
  146.     Q_OBJECT
  147. public:
  148.     QWSSoundServer(QObject* parent);
  149.     ~QWSSoundServer();
  150.     void playFile(const QString& filename);
  151. private Q_SLOTS:
  152.     void feedDevice(int fd);
  153. private:
  154.     QWSSoundServerData* d;
  155. };
  156. #endif
  157. #endif
  158. /*********************************************************************
  159.  *
  160.  * Class: QWSServer
  161.  *
  162.  *********************************************************************/
  163. class QWSMouseHandler;
  164. struct QWSCommandStruct;
  165. class QWSServerPrivate;
  166. class QWSServer;
  167. extern QWSServer *qwsServer;
  168. class Q_GUI_EXPORT QWSServer : public QObject
  169. {
  170.     friend class QCopChannel;
  171.     friend class QWSMouseHandler;
  172.     friend class QWSWindow;
  173.     friend class QWSDisplay;
  174.     friend class QWSInputMethod;
  175.     Q_OBJECT
  176.     Q_DECLARE_PRIVATE(QWSServer)
  177. public:
  178.     explicit QWSServer(int flags = 0, QObject *parent=0);
  179. #ifdef QT3_SUPPORT
  180.     QT3_SUPPORT_CONSTRUCTOR QWSServer(int flags, QObject *parent, const char *name);
  181. #endif
  182.     ~QWSServer();
  183.     enum ServerFlags { DisableKeyboard = 0x01,
  184.                        DisableMouse = 0x02 };
  185.     static void sendKeyEvent(int unicode, int keycode, Qt::KeyboardModifiers modifiers,
  186.                              bool isPress, bool autoRepeat);
  187. #ifndef QT_NO_QWS_KEYBOARD
  188.     static void processKeyEvent(int unicode, int keycode, Qt::KeyboardModifiers modifiers,
  189.                                 bool isPress, bool autoRepeat);
  190. #endif
  191.     static QWSServer* instance() { return qwsServer; }
  192. #ifndef QT_NO_QWS_INPUTMETHODS
  193. #ifdef QT3_SUPPORT
  194.     enum IMState { IMCompose, IMEnd, IMStart = IMCompose };
  195. #endif
  196.     enum IMMouse { MousePress, MouseRelease, MouseMove, MouseOutside }; //MouseMove reserved but not used
  197.     void sendIMEvent(const QInputMethodEvent*);
  198.     void sendIMQuery(int property);
  199. #endif
  200. #ifndef QT_NO_QWS_KEYBOARD
  201.     class KeyboardFilter
  202.     {
  203.     public:
  204.         virtual ~KeyboardFilter() {}
  205.         virtual bool filter(int unicode, int keycode, int modifiers,
  206.                             bool isPress, bool autoRepeat)=0;
  207.     };
  208.     static void addKeyboardFilter(KeyboardFilter *f);
  209.     static void removeKeyboardFilter();
  210. #endif
  211. #ifndef QT_NO_QWS_INPUTMETHODS
  212.     static void setCurrentInputMethod(QWSInputMethod *im);
  213.     static void resetInputMethod();
  214. #endif
  215.     static void setDefaultMouse(const char *);
  216.     static void setDefaultKeyboard(const char *);
  217.     static void setMaxWindowRect(const QRect&);
  218.     static void sendMouseEvent(const QPoint& pos, int state, int wheel = 0);
  219.     static void setBackground(const QBrush &);
  220. #ifdef QT3_SUPPORT
  221.     static QT3_SUPPORT void setDesktopBackground(const QImage &img);
  222.     static QT3_SUPPORT void setDesktopBackground(const QColor &);
  223. #endif
  224.     static QWSMouseHandler *mouseHandler();
  225.     static void setMouseHandler(QWSMouseHandler*);
  226. #ifndef QT_NO_QWS_KEYBOARD
  227.     static QWSKeyboardHandler* keyboardHandler();
  228.     static void setKeyboardHandler(QWSKeyboardHandler* kh);
  229. #endif
  230.     QWSWindow *windowAt(const QPoint& pos);
  231.     const QList<QWSWindow*> &clientWindows();
  232.     void openMouse();
  233.     void closeMouse();
  234.     void suspendMouse();
  235.     void resumeMouse();
  236. #ifndef QT_NO_QWS_KEYBOARD
  237.     void openKeyboard();
  238.     void closeKeyboard();
  239. #endif
  240.     static void setScreenSaver(QWSScreenSaver*);
  241.     static void setScreenSaverIntervals(int* ms);
  242.     static void setScreenSaverInterval(int);
  243.     static void setScreenSaverBlockLevel(int);
  244.     static bool screenSaverActive();
  245.     static void screenSaverActivate(bool);
  246.     // the following are internal.
  247.     void refresh();
  248.     void refresh(QRegion &);
  249.     void enablePainting(bool);
  250.     static void processEventQueue();
  251.     static QList<QWSInternalWindowInfo*> * windowList();
  252.     void sendPropertyNotifyEvent(int property, int state);
  253.     static QPoint mousePosition;
  254.     static void startup(int flags);
  255.     static void closedown();
  256.     static void beginDisplayReconfigure();
  257.     static void endDisplayReconfigure();
  258. #ifndef QT_NO_QWS_CURSOR
  259.     static void setCursorVisible(bool);
  260.     static bool isCursorVisible();
  261. #endif
  262.     const QBrush &backgroundBrush() const;
  263.     enum WindowEvent { Create=0x0001, Destroy=0x0002, Hide=0x0004, Show=0x0008,
  264.                        Raise=0x0010, Lower=0x0020, Geometry=0x0040, Active = 0x0080,
  265.                        Name=0x0100 };
  266. Q_SIGNALS:
  267.     void windowEvent(QWSWindow *w, QWSServer::WindowEvent e);
  268. #ifndef QT_NO_COP
  269.     void newChannel(const QString& channel);
  270.     void removedChannel(const QString& channel);
  271. #endif
  272. #ifndef QT_NO_QWS_INPUTMETHODS
  273.     void markedText(const QString &);
  274. #endif
  275. protected:
  276.     void timerEvent(QTimerEvent *e);
  277. private:
  278.     friend class QApplicationPrivate;
  279.     void updateWindowRegions() const;
  280. #ifdef QT3_SUPPORT
  281. #ifndef QT_NO_QWS_KEYBOARD
  282.     static inline QT3_SUPPORT void setKeyboardFilter(QWSServer::KeyboardFilter *f)
  283.         { if (f) addKeyboardFilter(f); else removeKeyboardFilter(); }
  284. #endif
  285. #endif
  286. private:
  287. #ifndef QT_NO_QWS_MULTIPROCESS
  288.     Q_PRIVATE_SLOT(d_func(), void _q_clientClosed())
  289.     Q_PRIVATE_SLOT(d_func(), void _q_doClient())
  290.     Q_PRIVATE_SLOT(d_func(), void _q_deleteWindowsLater())
  291. #endif
  292.     Q_PRIVATE_SLOT(d_func(), void _q_screenSaverWake())
  293.     Q_PRIVATE_SLOT(d_func(), void _q_screenSaverSleep())
  294.     Q_PRIVATE_SLOT(d_func(), void _q_screenSaverTimeout())
  295. #ifndef QT_NO_QWS_MULTIPROCESS
  296.     Q_PRIVATE_SLOT(d_func(), void _q_newConnection())
  297. #endif
  298. };
  299. #ifndef QT_NO_QWS_INPUTMETHODS
  300. class Q_GUI_EXPORT QWSInputMethod : public QObject
  301. {
  302.     Q_OBJECT
  303. public:
  304.     QWSInputMethod();
  305.     virtual ~QWSInputMethod();
  306.     enum UpdateType {Update, FocusIn, FocusOut, Reset, Destroyed};
  307.     virtual bool filter(int unicode, int keycode, int modifiers,
  308.                         bool isPress, bool autoRepeat);
  309.     virtual bool filter(const QPoint &, int state, int wheel);
  310.     virtual void reset();
  311.     virtual void updateHandler(int type);
  312.     virtual void mouseHandler(int pos, int state);
  313.     virtual void queryResponse(int property, const QVariant&);
  314. protected:
  315.     uint setInputResolution(bool isHigh);
  316.     uint inputResolutionShift() const;
  317.     // needed for required transform
  318.     void sendMouseEvent(const QPoint &pos, int state, int wheel);
  319.     void sendEvent(const QInputMethodEvent*);
  320.     void sendPreeditString(const QString &preeditString, int cursorPosition, int selectionLength = 0);
  321.     void sendCommitString(const QString &commitString, int replaceFrom = 0, int replaceLength = 0);
  322.     void sendQuery(int property);
  323. #ifdef QT3_SUPPORT
  324.     inline void sendIMEvent(QWSServer::IMState, const QString& txt, int cpos, int selLen = 0);
  325. #endif
  326. private:
  327.     bool mIResolution;
  328. };
  329. inline void QWSInputMethod::sendEvent(const QInputMethodEvent *ime)
  330. {
  331.     qwsServer->sendIMEvent(ime);
  332. }
  333. #ifdef QT3_SUPPORT
  334. inline void QWSInputMethod::sendIMEvent(QWSServer::IMState state, const QString& txt, int cpos, int selLen)
  335. {
  336.     if (state == QWSServer::IMCompose) sendPreeditString(txt, cpos, selLen); else sendCommitString(txt);
  337. }
  338. #endif
  339. inline void QWSInputMethod::sendQuery(int property)
  340. {
  341.     qwsServer->sendIMQuery(property);
  342. }
  343. // mouse events not inline as involve transformations.
  344. #endif // QT_NO_QWS_INPUTMETHODS
  345. /*********************************************************************
  346.  *
  347.  * Class: QWSClient
  348.  *
  349.  *********************************************************************/
  350. struct QWSMouseEvent;
  351. typedef QMap<int, QWSCursor*> QWSCursorMap;
  352. class QWSClientPrivate;
  353. class QWSCommand;
  354. class QWSConvertSelectionCommand;
  355. class Q_GUI_EXPORT QWSClient : public QObject
  356. {
  357.     Q_OBJECT
  358.     Q_DECLARE_PRIVATE(QWSClient)
  359. public:
  360.     QWSClient(QObject* parent, QWS_SOCK_BASE *, int id);
  361.     ~QWSClient();
  362.     int socket() const;
  363.     void setIdentity(const QString&);
  364.     QString identity() const { return id; }
  365.     void sendEvent(QWSEvent* event);
  366.     void sendConnectedEvent(const char *display_spec);
  367.     void sendMaxWindowRectEvent(const QRect &rect);
  368.     void sendPropertyNotifyEvent(int property, int state);
  369.     void sendPropertyReplyEvent(int property, int len, const char *data);
  370.     void sendSelectionClearEvent(int windowid);
  371.     void sendSelectionRequestEvent(QWSConvertSelectionCommand *cmd, int windowid);
  372. #ifndef QT_QWS_CLIENTBLIT
  373.     void sendRegionEvent(int winid, QRegion rgn, int type);
  374. #else
  375.     void sendRegionEvent(int winid, QRegion rgn, int type, int id = 0);
  376. #endif
  377. #ifndef QT_NO_QWSEMBEDWIDGET
  378.     void sendEmbedEvent(int winid, QWSEmbedEvent::Type type,
  379.                         const QRegion &region = QRegion());
  380. #endif
  381.     QWSCommand* readMoreCommand();
  382.     int clientId() const { return cid; }
  383.     QWSCursorMap cursors; // cursors defined by this client
  384. Q_SIGNALS:
  385.     void connectionClosed();
  386.     void readyRead();
  387. private Q_SLOTS:
  388.     void closeHandler();
  389.     void errorHandler();
  390. private:
  391. #ifndef QT_NO_QWS_MULTIPROCESS
  392.     friend class QWSWindow;
  393.     void removeUnbufferedSurface();
  394.     void addUnbufferedSurface();
  395. #endif
  396. private:
  397.     int socketDescriptor;
  398. #ifndef QT_NO_QWS_MULTIPROCESS
  399.     QWSSocket *csocket;
  400. #endif
  401.     QWSCommand* command;
  402.     uint isClosed : 1;
  403.     QString id;
  404.     int cid;
  405.     friend class QWSServerPrivate;
  406. };
  407. QT_END_NAMESPACE
  408. QT_END_HEADER
  409. #endif // QWINDOWSYSTEM_QWS_H