source: trunk/src/gui/embedded/qwindowsystem_qws.h

Last change on this file was 846, checked in by Dmitry A. Kuminov, 14 years ago

trunk: Merged in qt 4.7.2 sources from branches/vendor/nokia/qt.

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