Fix warnings in qtbase.
[profile/ivi/qtbase.git] / src / widgets / kernel / qwidget.cpp
1 /****************************************************************************
2 **
3 ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/
5 **
6 ** This file is part of the QtGui module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** GNU Lesser General Public License Usage
10 ** This file may be used under the terms of the GNU Lesser General Public
11 ** License version 2.1 as published by the Free Software Foundation and
12 ** appearing in the file LICENSE.LGPL included in the packaging of this
13 ** file. Please review the following information to ensure the GNU Lesser
14 ** General Public License version 2.1 requirements will be met:
15 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
16 **
17 ** In addition, as a special exception, Nokia gives you certain additional
18 ** rights. These rights are described in the Nokia Qt LGPL Exception
19 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
20 **
21 ** GNU General Public License Usage
22 ** Alternatively, this file may be used under the terms of the GNU General
23 ** Public License version 3.0 as published by the Free Software Foundation
24 ** and appearing in the file LICENSE.GPL included in the packaging of this
25 ** file. Please review the following information to ensure the GNU General
26 ** Public License version 3.0 requirements will be met:
27 ** http://www.gnu.org/copyleft/gpl.html.
28 **
29 ** Other Usage
30 ** Alternatively, this file may be used in accordance with the terms and
31 ** conditions contained in a signed written agreement between you and Nokia.
32 **
33 **
34 **
35 **
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41
42 #include "qapplication.h"
43 #include "qapplication_p.h"
44 #include "qbrush.h"
45 #include "qcursor.h"
46 #include "qdesktopwidget.h"
47 #include "qevent.h"
48 #include "qhash.h"
49 #include "qlayout.h"
50 #include "qmenu.h"
51 #include "qmetaobject.h"
52 #include "qpixmap.h"
53 #include "qpointer.h"
54 #include "qstack.h"
55 #include "qstyle.h"
56 #include "qstylefactory.h"
57 #include "qvariant.h"
58 #include "qwidget.h"
59 #include "qstyleoption.h"
60 #ifndef QT_NO_ACCESSIBILITY
61 # include "qaccessible.h"
62 #endif
63 #ifdef Q_WS_MAC
64 # include "qt_mac_p.h"
65 # include "qt_cocoa_helpers_mac_p.h"
66 # include "qmainwindow.h"
67 # include "qtoolbar.h"
68 # include <private/qmainwindowlayout_p.h>
69 #endif
70 #include "qplatformwindow_qpa.h"
71 #include "private/qwidgetwindow_qpa_p.h"
72 #include "qpainter.h"
73 #include "qtooltip.h"
74 #include "qwhatsthis.h"
75 #include "qdebug.h"
76 #include "private/qstylesheetstyle_p.h"
77 #include "private/qstyle_p.h"
78 #include "qfileinfo.h"
79 #include "private/qsoftkeymanager_p.h"
80 #include <QtGui/qinputmethod.h>
81
82 #include <private/qgraphicseffect_p.h>
83 #include <qbackingstore.h>
84 #include <private/qwidgetbackingstore_p.h>
85 #ifdef Q_WS_MAC
86 # include <private/qpaintengine_mac_p.h>
87 #endif
88 #include <private/qpaintengine_raster_p.h>
89
90 #include "qwidget_p.h"
91 #include <QtGui/private/qwindow_p.h>
92 #include "qaction_p.h"
93 #include "qlayout_p.h"
94 #include "QtWidgets/qgraphicsproxywidget.h"
95 #include "QtWidgets/qgraphicsscene.h"
96 #include "private/qgraphicsproxywidget_p.h"
97 #include "QtWidgets/qabstractscrollarea.h"
98 #include "private/qabstractscrollarea_p.h"
99 #include "private/qevent_p.h"
100
101 #include "private/qgesturemanager_p.h"
102
103 #ifdef QT_KEYPAD_NAVIGATION
104 #include "qtabwidget.h" // Needed in inTabWidget()
105 #endif // QT_KEYPAD_NAVIGATION
106
107
108 // widget/widget data creation count
109 //#define QWIDGET_EXTRA_DEBUG
110 //#define ALIEN_DEBUG
111
112 QT_BEGIN_NAMESPACE
113
114 static bool qt_enable_backingstore = true;
115 #ifdef Q_WS_X11
116 // for compatibility with Qt 4.0
117 Q_WIDGETS_EXPORT void qt_x11_set_global_double_buffer(bool enable)
118 {
119     qt_enable_backingstore = enable;
120 }
121 #endif
122
123 #ifdef Q_WS_MAC
124 bool qt_mac_clearDirtyOnWidgetInsideDrawWidget = false;
125 #endif
126
127 static inline bool qRectIntersects(const QRect &r1, const QRect &r2)
128 {
129     return (qMax(r1.left(), r2.left()) <= qMin(r1.right(), r2.right()) &&
130             qMax(r1.top(), r2.top()) <= qMin(r1.bottom(), r2.bottom()));
131 }
132
133 static inline bool hasBackingStoreSupport()
134 {
135     return true;
136 }
137
138 #ifdef Q_WS_MAC
139 #  define QT_NO_PAINT_DEBUG
140 #endif
141
142 extern bool qt_sendSpontaneousEvent(QObject*, QEvent*); // qapplication.cpp
143 extern QDesktopWidget *qt_desktopWidget; // qapplication.cpp
144
145 /*!
146     \internal
147     \class QWidgetBackingStoreTracker
148     \brief Class which allows tracking of which widgets are using a given backing store
149
150     QWidgetBackingStoreTracker is a thin wrapper around a QWidgetBackingStore pointer,
151     which maintains a list of the QWidgets which are currently using the backing
152     store.  This list is modified via the registerWidget and unregisterWidget functions.
153  */
154
155 QWidgetBackingStoreTracker::QWidgetBackingStoreTracker()
156     :   m_ptr(0)
157 {
158
159 }
160
161 QWidgetBackingStoreTracker::~QWidgetBackingStoreTracker()
162 {
163     delete m_ptr;
164 }
165
166 /*!
167     \internal
168     Destroy the contained QWidgetBackingStore, if not null, and clear the list of
169     widgets using the backing store, then create a new QWidgetBackingStore, providing
170     the QWidget.
171  */
172 void QWidgetBackingStoreTracker::create(QWidget *widget)
173 {
174     destroy();
175     m_ptr = new QWidgetBackingStore(widget);
176 }
177
178 /*!
179     \internal
180     Destroy the contained QWidgetBackingStore, if not null, and clear the list of
181     widgets using the backing store.
182  */
183 void QWidgetBackingStoreTracker::destroy()
184 {
185     delete m_ptr;
186     m_ptr = 0;
187     m_widgets.clear();
188 }
189
190 /*!
191     \internal
192     Add the widget to the list of widgets currently using the backing store.
193     If the widget was already in the list, this function is a no-op.
194  */
195 void QWidgetBackingStoreTracker::registerWidget(QWidget *w)
196 {
197     Q_ASSERT(m_ptr);
198     Q_ASSERT(w->internalWinId());
199     Q_ASSERT(qt_widget_private(w)->maybeBackingStore() == m_ptr);
200     m_widgets.insert(w);
201 }
202
203 /*!
204     \internal
205     Remove the widget from the list of widgets currently using the backing store.
206     If the widget was in the list, and removing it causes the list to be empty,
207     the backing store is deleted.
208     If the widget was not in the list, this function is a no-op.
209  */
210 void QWidgetBackingStoreTracker::unregisterWidget(QWidget *w)
211 {
212     if (m_widgets.remove(w) && m_widgets.isEmpty()) {
213         delete m_ptr;
214         m_ptr = 0;
215     }
216 }
217
218 /*!
219     \internal
220     Recursively remove widget and all of its descendents.
221  */
222 void QWidgetBackingStoreTracker::unregisterWidgetSubtree(QWidget *widget)
223 {
224     unregisterWidget(widget);
225     foreach (QObject *child, widget->children())
226         if (QWidget *childWidget = qobject_cast<QWidget *>(child))
227             unregisterWidgetSubtree(childWidget);
228 }
229
230 QWidgetPrivate::QWidgetPrivate(int version)
231     : QObjectPrivate(version)
232       , extra(0)
233       , focus_next(0)
234       , focus_prev(0)
235       , focus_child(0)
236       , layout(0)
237       , needsFlush(0)
238       , redirectDev(0)
239       , widgetItem(0)
240       , extraPaintEngine(0)
241       , polished(0)
242       , graphicsEffect(0)
243 #if !defined(QT_NO_IM)
244       , imHints(Qt::ImhNone)
245 #endif
246       , inheritedFontResolveMask(0)
247       , inheritedPaletteResolveMask(0)
248       , leftmargin(0)
249       , topmargin(0)
250       , rightmargin(0)
251       , bottommargin(0)
252       , leftLayoutItemMargin(0)
253       , topLayoutItemMargin(0)
254       , rightLayoutItemMargin(0)
255       , bottomLayoutItemMargin(0)
256       , hd(0)
257       , size_policy(QSizePolicy::Preferred, QSizePolicy::Preferred)
258       , fg_role(QPalette::NoRole)
259       , bg_role(QPalette::NoRole)
260       , dirtyOpaqueChildren(1)
261       , isOpaque(0)
262       , inDirtyList(0)
263       , isScrolled(0)
264       , isMoved(0)
265       , isGLWidget(0)
266       , usesDoubleBufferedGLContext(0)
267 #ifndef QT_NO_IM
268       , inheritsInputMethodHints(0)
269 #endif
270       , inSetParent(0)
271 #if defined(Q_WS_X11)
272       , picture(0)
273 #elif defined(Q_WS_WIN)
274       , noPaintOnScreen(0)
275   #ifndef QT_NO_GESTURES
276       , nativeGesturePanEnabled(0)
277   #endif
278 #elif defined(Q_WS_MAC)
279       , needWindowChange(0)
280       , window_event(0)
281       , qd_hd(0)
282 #endif
283 {
284     if (!qApp) {
285         qFatal("QWidget: Must construct a QApplication before a QPaintDevice");
286         return;
287     }
288
289     if (version != QObjectPrivateVersion)
290         qFatal("Cannot mix incompatible Qt libraries");
291
292     isWidget = true;
293     memset(high_attributes, 0, sizeof(high_attributes));
294 #ifdef Q_WS_MAC
295     drawRectOriginalAdded = false;
296     originalDrawMethod = true;
297     changeMethods = false;
298     isInUnifiedToolbar = false;
299     unifiedSurface = 0;
300     toolbar_ancestor = 0;
301     flushRequested = false;
302     touchEventsEnabled = false;
303 #endif // Q_WS_MAC
304 #ifdef QWIDGET_EXTRA_DEBUG
305     static int count = 0;
306     qDebug() << "widgets" << ++count;
307 #endif
308 }
309
310
311 QWidgetPrivate::~QWidgetPrivate()
312 {
313     if (widgetItem)
314         widgetItem->wid = 0;
315
316     if (extra)
317         deleteExtra();
318
319 #ifndef QT_NO_GRAPHICSEFFECT
320     delete graphicsEffect;
321 #endif //QT_NO_GRAPHICSEFFECT
322 }
323
324 /*!
325     \internal
326 */
327 void QWidgetPrivate::scrollChildren(int dx, int dy)
328 {
329     Q_Q(QWidget);
330     if (q->children().size() > 0) {        // scroll children
331         QPoint pd(dx, dy);
332         QObjectList childObjects = q->children();
333         for (int i = 0; i < childObjects.size(); ++i) { // move all children
334             QWidget *w = qobject_cast<QWidget*>(childObjects.at(i));
335             if (w && !w->isWindow()) {
336                 QPoint oldp = w->pos();
337                 QRect  r(w->pos() + pd, w->size());
338                 w->data->crect = r;
339                 if (w->testAttribute(Qt::WA_WState_Created))
340                     w->d_func()->setWSGeometry();
341                 w->d_func()->setDirtyOpaqueRegion();
342                 QMoveEvent e(r.topLeft(), oldp);
343                 QApplication::sendEvent(w, &e);
344             }
345         }
346     }
347 }
348
349 void QWidgetPrivate::updateWidgetTransform()
350 {
351     Q_Q(QWidget);
352     if (q == qGuiApp->focusObject()) {
353         QTransform t;
354         QPoint p = q->mapTo(q->topLevelWidget(), QPoint(0,0));
355         t.translate(p.x(), p.y());
356         qApp->inputMethod()->setInputItemTransform(t);
357     }
358 }
359
360 #ifdef QT_KEYPAD_NAVIGATION
361 QPointer<QWidget> QWidgetPrivate::editingWidget;
362
363 /*!
364     Returns true if this widget currently has edit focus; otherwise false.
365
366     This feature is only available in Qt for Embedded Linux.
367
368     \sa setEditFocus(), QApplication::keypadNavigationEnabled()
369 */
370 bool QWidget::hasEditFocus() const
371 {
372     const QWidget* w = this;
373     while (w->d_func()->extra && w->d_func()->extra->focus_proxy)
374         w = w->d_func()->extra->focus_proxy;
375     return QWidgetPrivate::editingWidget == w;
376 }
377
378 /*!
379     \fn void QWidget::setEditFocus(bool enable)
380
381     If \a enable is true, make this widget have edit focus, in which
382     case Qt::Key_Up and Qt::Key_Down will be delivered to the widget
383     normally; otherwise, Qt::Key_Up and Qt::Key_Down are used to
384     change focus.
385
386     This feature is only available in Qt for Embedded Linux.
387
388     \sa hasEditFocus(), QApplication::keypadNavigationEnabled()
389 */
390 void QWidget::setEditFocus(bool on)
391 {
392     QWidget *f = this;
393     while (f->d_func()->extra && f->d_func()->extra->focus_proxy)
394         f = f->d_func()->extra->focus_proxy;
395
396     if (QWidgetPrivate::editingWidget && QWidgetPrivate::editingWidget != f)
397         QWidgetPrivate::editingWidget->setEditFocus(false);
398
399     if (on && !f->hasFocus())
400         f->setFocus();
401
402     if ((!on && !QWidgetPrivate::editingWidget)
403         || (on && QWidgetPrivate::editingWidget == f)) {
404         return;
405     }
406
407     if (!on && QWidgetPrivate::editingWidget == f) {
408         QWidgetPrivate::editingWidget = 0;
409         QEvent event(QEvent::LeaveEditFocus);
410         QApplication::sendEvent(f, &event);
411         QApplication::sendEvent(f->style(), &event);
412     } else if (on) {
413         QWidgetPrivate::editingWidget = f;
414         QEvent event(QEvent::EnterEditFocus);
415         QApplication::sendEvent(f, &event);
416         QApplication::sendEvent(f->style(), &event);
417     }
418 }
419 #endif
420
421 /*!
422     \property QWidget::autoFillBackground
423     \brief whether the widget background is filled automatically
424     \since 4.1
425
426     If enabled, this property will cause Qt to fill the background of the
427     widget before invoking the paint event. The color used is defined by the
428     QPalette::Window color role from the widget's \l{QPalette}{palette}.
429
430     In addition, Windows are always filled with QPalette::Window, unless the
431     WA_OpaquePaintEvent or WA_NoSystemBackground attributes are set.
432
433     This property cannot be turned off (i.e., set to false) if a widget's
434     parent has a static gradient for its background.
435
436     \warning Use this property with caution in conjunction with
437     \l{Qt Style Sheets}. When a widget has a style sheet with a valid
438     background or a border-image, this property is automatically disabled.
439
440     By default, this property is false.
441
442     \sa Qt::WA_OpaquePaintEvent, Qt::WA_NoSystemBackground,
443     {QWidget#Transparency and Double Buffering}{Transparency and Double Buffering}
444 */
445 bool QWidget::autoFillBackground() const
446 {
447     Q_D(const QWidget);
448     return d->extra && d->extra->autoFillBackground;
449 }
450
451 void QWidget::setAutoFillBackground(bool enabled)
452 {
453     Q_D(QWidget);
454     if (!d->extra)
455         d->createExtra();
456     if (d->extra->autoFillBackground == enabled)
457         return;
458
459     d->extra->autoFillBackground = enabled;
460     d->updateIsOpaque();
461     update();
462     d->updateIsOpaque();
463 }
464
465 /*!
466     \class QWidget
467     \brief The QWidget class is the base class of all user interface objects.
468
469     \ingroup basicwidgets
470     \inmodule QtWidgets
471
472     The widget is the atom of the user interface: it receives mouse, keyboard
473     and other events from the window system, and paints a representation of
474     itself on the screen. Every widget is rectangular, and they are sorted in a
475     Z-order. A widget is clipped by its parent and by the widgets in front of
476     it.
477
478     A widget that is not embedded in a parent widget is called a window.
479     Usually, windows have a frame and a title bar, although it is also possible
480     to create windows without such decoration using suitable
481     \l{Qt::WindowFlags}{window flags}). In Qt, QMainWindow and the various
482     subclasses of QDialog are the most common window types.
483
484     Every widget's constructor accepts one or two standard arguments:
485
486     \list 1
487         \li  \c{QWidget *parent = 0} is the parent of the new widget. If it is 0
488             (the default), the new widget will be a window. If not, it will be
489             a child of \e parent, and be constrained by \e parent's geometry
490             (unless you specify Qt::Window as window flag).
491         \li  \c{Qt::WindowFlags f = 0} (where available) sets the window flags;
492             the default is suitable for almost all widgets, but to get, for
493             example, a window without a window system frame, you must use
494             special flags.
495     \endlist
496
497     QWidget has many member functions, but some of them have little direct
498     functionality; for example, QWidget has a font property, but never uses
499     this itself. There are many subclasses which provide real functionality,
500     such as QLabel, QPushButton, QListWidget, and QTabWidget.
501
502
503     \section1 Top-Level and Child Widgets
504
505     A widget without a parent widget is always an independent window (top-level
506     widget). For these widgets, setWindowTitle() and setWindowIcon() set the
507     title bar and icon respectively.
508
509     Non-window widgets are child widgets, displayed within their parent
510     widgets. Most widgets in Qt are mainly useful as child widgets. For
511     example, it is possible to display a button as a top-level window, but most
512     people prefer to put their buttons inside other widgets, such as QDialog.
513
514     \image parent-child-widgets.png A parent widget containing various child widgets.
515
516     The diagram above shows a QGroupBox widget being used to hold various child
517     widgets in a layout provided by QGridLayout. The QLabel child widgets have
518     been outlined to indicate their full sizes.
519
520     If you want to use a QWidget to hold child widgets you will usually want to
521     add a layout to the parent QWidget. See \l{Layout Management} for more
522     information.
523
524
525     \section1 Composite Widgets
526
527     When a widget is used as a container to group a number of child widgets, it
528     is known as a composite widget. These can be created by constructing a
529     widget with the required visual properties - a QFrame, for example - and
530     adding child widgets to it, usually managed by a layout. The above diagram
531     shows such a composite widget that was created using \l{Qt Designer}.
532
533     Composite widgets can also be created by subclassing a standard widget,
534     such as QWidget or QFrame, and adding the necessary layout and child
535     widgets in the constructor of the subclass. Many of the \l{Qt Examples}
536     {examples provided with Qt} use this approach, and it is also covered in
537     the Qt \l{Tutorials}.
538
539
540     \section1 Custom Widgets and Painting
541
542     Since QWidget is a subclass of QPaintDevice, subclasses can be used to
543     display custom content that is composed using a series of painting
544     operations with an instance of the QPainter class. This approach contrasts
545     with the canvas-style approach used by the \l{Graphics View}
546     {Graphics View Framework} where items are added to a scene by the
547     application and are rendered by the framework itself.
548
549     Each widget performs all painting operations from within its paintEvent()
550     function. This is called whenever the widget needs to be redrawn, either
551     as a result of some external change or when requested by the application.
552
553     The \l{widgets/analogclock}{Analog Clock example} shows how a simple widget
554     can handle paint events.
555
556
557     \section1 Size Hints and Size Policies
558
559     When implementing a new widget, it is almost always useful to reimplement
560     sizeHint() to provide a reasonable default size for the widget and to set
561     the correct size policy with setSizePolicy().
562
563     By default, composite widgets which do not provide a size hint will be
564     sized according to the space requirements of their child widgets.
565
566     The size policy lets you supply good default behavior for the layout
567     management system, so that other widgets can contain and manage yours
568     easily. The default size policy indicates that the size hint represents
569     the preferred size of the widget, and this is often good enough for many
570     widgets.
571
572     \note The size of top-level widgets are constrained to 2/3 of the desktop's
573     height and width. You can resize() the widget manually if these bounds are
574     inadequate.
575
576
577     \section1 Events
578
579     Widgets respond to events that are typically caused by user actions. Qt
580     delivers events to widgets by calling specific event handler functions with
581     instances of QEvent subclasses containing information about each event.
582
583     If your widget only contains child widgets, you probably do not need to
584     implement any event handlers. If you want to detect a mouse click in a
585     child widget call the child's underMouse() function inside the widget's
586     mousePressEvent().
587
588     The \l{widgets/scribble}{Scribble example} implements a wider set of
589     events to handle mouse movement, button presses, and window resizing.
590
591     You will need to supply the behavior and content for your own widgets, but
592     here is a brief overview of the events that are relevant to QWidget,
593     starting with the most common ones:
594
595     \list
596         \li  paintEvent() is called whenever the widget needs to be repainted.
597             Every widget displaying custom content must implement it. Painting
598             using a QPainter can only take place in a paintEvent() or a
599             function called by a paintEvent().
600         \li  resizeEvent() is called when the widget has been resized.
601         \li  mousePressEvent() is called when a mouse button is pressed while
602             the mouse cursor is inside the widget, or when the widget has
603             grabbed the mouse using grabMouse(). Pressing the mouse without
604             releasing it is effectively the same as calling grabMouse().
605         \li  mouseReleaseEvent() is called when a mouse button is released. A
606             widget receives mouse release events when it has received the
607             corresponding mouse press event. This means that if the user
608             presses the mouse inside \e your widget, then drags the mouse
609             somewhere else before releasing the mouse button, \e your widget
610             receives the release event. There is one exception: if a popup menu
611             appears while the mouse button is held down, this popup immediately
612             steals the mouse events.
613         \li  mouseDoubleClickEvent() is called when the user double-clicks in
614             the widget. If the user double-clicks, the widget receives a mouse
615             press event, a mouse release event, (a mouse click event,) a second
616             mouse press, this event and finally a second mouse release event.
617             (Some mouse move events may also be
618             received if the mouse is not held steady during this operation.) It
619             is \e{not possible} to distinguish a click from a double-click
620             until the second click arrives. (This is one reason why most GUI
621             books recommend that double-clicks be an extension of
622             single-clicks, rather than trigger a different action.)
623     \endlist
624
625     Widgets that accept keyboard input need to reimplement a few more event
626     handlers:
627
628     \list
629         \li  keyPressEvent() is called whenever a key is pressed, and again when
630             a key has been held down long enough for it to auto-repeat. The
631             \key Tab and \key Shift+Tab keys are only passed to the widget if
632             they are not used by the focus-change mechanisms. To force those
633             keys to be processed by your widget, you must reimplement
634             QWidget::event().
635         \li  focusInEvent() is called when the widget gains keyboard focus
636             (assuming you have called setFocusPolicy()). Well-behaved widgets
637             indicate that they own the keyboard focus in a clear but discreet
638             way.
639         \li  focusOutEvent() is called when the widget loses keyboard focus.
640     \endlist
641
642     You may be required to also reimplement some of the less common event
643     handlers:
644
645     \list
646         \li  mouseMoveEvent() is called whenever the mouse moves while a mouse
647             button is held down. This can be useful during drag and drop
648             operations. If you call \l{setMouseTracking()}{setMouseTracking}(true),
649             you get mouse move events even when no buttons are held down.
650             (See also the \l{Drag and Drop} guide.)
651         \li  keyReleaseEvent() is called whenever a key is released and while it
652             is held down (if the key is auto-repeating). In that case, the
653             widget will receive a pair of key release and key press event for
654             every repeat. The \key Tab and \key Shift+Tab keys are only passed
655             to the widget if they are not used by the focus-change mechanisms.
656             To force those keys to be processed by your widget, you must
657             reimplement QWidget::event().
658         \li  wheelEvent() is called whenever the user turns the mouse wheel
659             while the widget has the focus.
660         \li  enterEvent() is called when the mouse enters the widget's screen
661             space. (This excludes screen space owned by any of the widget's
662             children.)
663         \li  leaveEvent() is called when the mouse leaves the widget's screen
664             space. If the mouse enters a child widget it will not cause a
665             leaveEvent().
666         \li  moveEvent() is called when the widget has been moved relative to
667             its parent.
668         \li  closeEvent() is called when the user closes the widget (or when
669             close() is called).
670     \endlist
671
672     There are also some rather obscure events described in the documentation
673     for QEvent::Type. To handle these events, you need to reimplement event()
674     directly.
675
676     The default implementation of event() handles \key Tab and \key Shift+Tab
677     (to move the keyboard focus), and passes on most of the other events to
678     one of the more specialized handlers above.
679
680     Events and the mechanism used to deliver them are covered in 
681     \l{The Event System}.
682
683     \section1 Groups of Functions and Properties
684
685     \table
686     \header \li Context \li Functions and Properties
687
688     \row \li Window functions \li
689         show(),
690         hide(),
691         raise(),
692         lower(),
693         close().
694
695     \row \li Top-level windows \li
696         \l windowModified, \l windowTitle, \l windowIcon, \l windowIconText,
697         \l isActiveWindow, activateWindow(), \l minimized, showMinimized(),
698         \l maximized, showMaximized(), \l fullScreen, showFullScreen(),
699         showNormal().
700
701     \row \li Window contents \li
702         update(),
703         repaint(),
704         scroll().
705
706     \row \li Geometry \li
707         \l pos, x(), y(), \l rect, \l size, width(), height(), move(), resize(),
708         \l sizePolicy, sizeHint(), minimumSizeHint(),
709         updateGeometry(), layout(),
710         \l frameGeometry, \l geometry, \l childrenRect, \l childrenRegion,
711         adjustSize(),
712         mapFromGlobal(), mapToGlobal(),
713         mapFromParent(), mapToParent(),
714         \l maximumSize, \l minimumSize, \l sizeIncrement,
715         \l baseSize, setFixedSize()
716
717     \row \li Mode \li
718         \l visible, isVisibleTo(),
719         \l enabled, isEnabledTo(),
720         \l modal,
721         isWindow(),
722         \l mouseTracking,
723         \l updatesEnabled,
724         visibleRegion().
725
726     \row \li Look and feel \li
727         style(),
728         setStyle(),
729         \l styleSheet,
730         \l cursor,
731         \l font,
732         \l palette,
733         backgroundRole(), setBackgroundRole(),
734         fontInfo(), fontMetrics().
735
736     \row \li Keyboard focus functions \li
737         \l focus, \l focusPolicy,
738         setFocus(), clearFocus(), setTabOrder(), setFocusProxy(),
739         focusNextChild(), focusPreviousChild().
740
741     \row \li Mouse and keyboard grabbing \li
742         grabMouse(), releaseMouse(),
743         grabKeyboard(), releaseKeyboard(),
744         mouseGrabber(), keyboardGrabber().
745
746     \row \li Event handlers \li
747         event(),
748         mousePressEvent(),
749         mouseReleaseEvent(),
750         mouseDoubleClickEvent(),
751         mouseMoveEvent(),
752         keyPressEvent(),
753         keyReleaseEvent(),
754         focusInEvent(),
755         focusOutEvent(),
756         wheelEvent(),
757         enterEvent(),
758         leaveEvent(),
759         paintEvent(),
760         moveEvent(),
761         resizeEvent(),
762         closeEvent(),
763         dragEnterEvent(),
764         dragMoveEvent(),
765         dragLeaveEvent(),
766         dropEvent(),
767         childEvent(),
768         showEvent(),
769         hideEvent(),
770         customEvent().
771         changeEvent(),
772
773     \row \li System functions \li
774         parentWidget(), window(), setParent(), winId(),
775         find(), metric().
776
777     \row \li Interactive help \li
778         setToolTip(), setWhatsThis()
779
780     \endtable
781
782
783     \section1 Widget Style Sheets
784
785     In addition to the standard widget styles for each platform, widgets can
786     also be styled according to rules specified in a \l{styleSheet}
787     {style sheet}. This feature enables you to customize the appearance of
788     specific widgets to provide visual cues to users about their purpose. For
789     example, a button could be styled in a particular way to indicate that it
790     performs a destructive action.
791
792     The use of widget style sheets is described in more detail in the
793     \l{Qt Style Sheets} document.
794
795
796     \section1 Transparency and Double Buffering
797
798     Since Qt 4.0, QWidget automatically double-buffers its painting, so there
799     is no need to write double-buffering code in paintEvent() to avoid
800     flicker.
801
802     Since Qt 4.1, the Qt::WA_ContentsPropagated widget attribute has been
803     deprecated. Instead, the contents of parent widgets are propagated by
804     default to each of their children as long as Qt::WA_PaintOnScreen is not
805     set. Custom widgets can be written to take advantage of this feature by
806     updating irregular regions (to create non-rectangular child widgets), or
807     painting with colors that have less than full alpha component. The
808     following diagram shows how attributes and properties of a custom widget
809     can be fine-tuned to achieve different effects.
810
811     \image propagation-custom.png
812
813     In the above diagram, a semi-transparent rectangular child widget with an
814     area removed is constructed and added to a parent widget (a QLabel showing
815     a pixmap). Then, different properties and widget attributes are set to
816     achieve different effects:
817
818     \list
819         \li  The left widget has no additional properties or widget attributes
820             set. This default state suits most custom widgets using
821             transparency, are irregularly-shaped, or do not paint over their
822             entire area with an opaque brush.
823         \li  The center widget has the \l autoFillBackground property set. This
824             property is used with custom widgets that rely on the widget to
825             supply a default background, and do not paint over their entire
826             area with an opaque brush.
827         \li  The right widget has the Qt::WA_OpaquePaintEvent widget attribute
828             set. This indicates that the widget will paint over its entire area
829             with opaque colors. The widget's area will initially be
830             \e{uninitialized}, represented in the diagram with a red diagonal
831             grid pattern that shines through the overpainted area. The
832             Qt::WA_OpaquePaintArea attribute is useful for widgets that need to
833             paint their own specialized contents quickly and do not need a
834             default filled background.
835     \endlist
836
837     To rapidly update custom widgets with simple background colors, such as
838     real-time plotting or graphing widgets, it is better to define a suitable
839     background color (using setBackgroundRole() with the
840     QPalette::Window role), set the \l autoFillBackground property, and only
841     implement the necessary drawing functionality in the widget's paintEvent().
842
843     To rapidly update custom widgets that constantly paint over their entire
844     areas with opaque content, e.g., video streaming widgets, it is better to
845     set the widget's Qt::WA_OpaquePaintEvent, avoiding any unnecessary overhead
846     associated with repainting the widget's background.
847
848     If a widget has both the Qt::WA_OpaquePaintEvent widget attribute \e{and}
849     the \l autoFillBackground property set, the Qt::WA_OpaquePaintEvent
850     attribute takes precedence. Depending on your requirements, you should
851     choose either one of them.
852
853     Since Qt 4.1, the contents of parent widgets are also propagated to
854     standard Qt widgets. This can lead to some unexpected results if the
855     parent widget is decorated in a non-standard way, as shown in the diagram
856     below.
857
858     \image propagation-standard.png
859
860     The scope for customizing the painting behavior of standard Qt widgets,
861     without resorting to subclassing, is slightly less than that possible for
862     custom widgets. Usually, the desired appearance of a standard widget can be
863     achieved by setting its \l autoFillBackground property.
864
865
866     \section1 Creating Translucent Windows
867
868     Since Qt 4.5, it has been possible to create windows with translucent regions
869     on window systems that support compositing.
870
871     To enable this feature in a top-level widget, set its Qt::WA_TranslucentBackground
872     attribute with setAttribute() and ensure that its background is painted with
873     non-opaque colors in the regions you want to be partially transparent.
874
875     Platform notes:
876
877     \list
878     \li X11: This feature relies on the use of an X server that supports ARGB visuals
879     and a compositing window manager.
880     \li Windows: The widget needs to have the Qt::FramelessWindowHint window flag set
881     for the translucency to work.
882     \endlist
883
884
885     \section1 Native Widgets vs Alien Widgets
886
887     Introduced in Qt 4.4, alien widgets are widgets unknown to the windowing
888     system. They do not have a native window handle associated with them. This
889     feature significantly speeds up widget painting, resizing, and removes flicker.
890
891     Should you require the old behavior with native windows, you can choose
892     one of the following options:
893
894     \list 1
895         \li  Use the \c{QT_USE_NATIVE_WINDOWS=1} in your environment.
896         \li  Set the Qt::AA_NativeWindows attribute on your application. All
897             widgets will be native widgets.
898         \li  Set the Qt::WA_NativeWindow attribute on widgets: The widget itself
899             and all of its ancestors will become native (unless
900             Qt::WA_DontCreateNativeAncestors is set).
901         \li  Call QWidget::winId to enforce a native window (this implies 3).
902         \li  Set the Qt::WA_PaintOnScreen attribute to enforce a native window
903             (this implies 3).
904     \endlist
905
906     \sa QEvent, QPainter, QGridLayout, QBoxLayout
907
908     \section1 Softkeys
909
910     Since Qt 4.6, Softkeys are usually physical keys on a device that have a corresponding label or
911     other visual representation on the screen that is generally located next to its
912     physical counterpart. They are most often found on mobile phone platforms. In
913     modern touch based user interfaces it is also possible to have softkeys that do
914     not correspond to any physical keys. Softkeys differ from other onscreen labels
915     in that they are contextual.
916
917     In Qt, contextual softkeys are added to a widget by calling addAction() and
918     passing a \c QAction with a softkey role set on it. When the widget
919     containing the softkey actions has focus, its softkeys should appear in
920     the user interface. Softkeys are discovered by traversing the widget
921     hierarchy so it is possible to define a single set of softkeys that are
922     present at all times by calling addAction() for a given top level widget.
923
924     On some platforms, this concept overlaps with \c QMenuBar such that if no
925     other softkeys are found and the top level widget is a QMainWindow containing
926     a QMenuBar, the menubar actions may appear on one of the softkeys.
927
928     Note: Currently softkeys are only supported on the Symbian Platform.
929
930     \sa addAction(), QAction, QMenuBar
931
932 */
933
934 QWidgetMapper *QWidgetPrivate::mapper = 0;          // widget with wid
935 QWidgetSet *QWidgetPrivate::allWidgets = 0;         // widgets with no wid
936
937
938 /*****************************************************************************
939   QWidget utility functions
940  *****************************************************************************/
941
942 QRegion qt_dirtyRegion(QWidget *widget)
943 {
944     if (!widget)
945         return QRegion();
946
947     QWidgetBackingStore *bs = qt_widget_private(widget)->maybeBackingStore();
948     if (!bs)
949         return QRegion();
950
951     return bs->dirtyRegion(widget);
952 }
953
954 /*****************************************************************************
955   QWidget member functions
956  *****************************************************************************/
957
958 /*
959     Widget state flags:
960   \list
961   \li Qt::WA_WState_Created The widget has a valid winId().
962   \li Qt::WA_WState_Visible The widget is currently visible.
963   \li Qt::WA_WState_Hidden The widget is hidden, i.e. it won't
964   become visible unless you call show() on it. Qt::WA_WState_Hidden
965   implies !Qt::WA_WState_Visible.
966   \li Qt::WA_WState_CompressKeys Compress keyboard events.
967   \li Qt::WA_WState_BlockUpdates Repaints and updates are disabled.
968   \li Qt::WA_WState_InPaintEvent Currently processing a paint event.
969   \li Qt::WA_WState_Reparented The widget has been reparented.
970   \li Qt::WA_WState_ConfigPending A configuration (resize/move) event is pending.
971   \li Qt::WA_WState_DND (Deprecated) The widget supports drag and drop, see setAcceptDrops().
972   \endlist
973 */
974
975 struct QWidgetExceptionCleaner
976 {
977     /* this cleans up when the constructor throws an exception */
978     static inline void cleanup(QWidget *that, QWidgetPrivate *d)
979     {
980 #ifdef QT_NO_EXCEPTIONS
981         Q_UNUSED(that);
982         Q_UNUSED(d);
983 #else
984         QWidgetPrivate::allWidgets->remove(that);
985         if (d->focus_next != that) {
986             if (d->focus_next)
987                 d->focus_next->d_func()->focus_prev = d->focus_prev;
988             if (d->focus_prev)
989                 d->focus_prev->d_func()->focus_next = d->focus_next;
990         }
991 #endif
992     }
993 };
994
995 /*!
996     Constructs a widget which is a child of \a parent, with  widget
997     flags set to \a f.
998
999     If \a parent is 0, the new widget becomes a window. If
1000     \a parent is another widget, this widget becomes a child window
1001     inside \a parent. The new widget is deleted when its \a parent is
1002     deleted.
1003
1004     The widget flags argument, \a f, is normally 0, but it can be set
1005     to customize the frame of a window (i.e. \a
1006     parent must be 0). To customize the frame, use a value composed
1007     from the bitwise OR of any of the \l{Qt::WindowFlags}{window flags}.
1008
1009     If you add a child widget to an already visible widget you must
1010     explicitly show the child to make it visible.
1011
1012     Note that the X11 version of Qt may not be able to deliver all
1013     combinations of style flags on all systems. This is because on
1014     X11, Qt can only ask the window manager, and the window manager
1015     can override the application's settings. On Windows, Qt can set
1016     whatever flags you want.
1017
1018     \sa windowFlags
1019 */
1020 QWidget::QWidget(QWidget *parent, Qt::WindowFlags f)
1021     : QObject(*new QWidgetPrivate, 0), QPaintDevice()
1022 {
1023     QT_TRY {
1024         d_func()->init(parent, f);
1025     } QT_CATCH(...) {
1026         QWidgetExceptionCleaner::cleanup(this, d_func());
1027         QT_RETHROW;
1028     }
1029 }
1030
1031
1032 /*! \internal
1033 */
1034 QWidget::QWidget(QWidgetPrivate &dd, QWidget* parent, Qt::WindowFlags f)
1035     : QObject(dd, 0), QPaintDevice()
1036 {
1037     Q_D(QWidget);
1038     QT_TRY {
1039         d->init(parent, f);
1040     } QT_CATCH(...) {
1041         QWidgetExceptionCleaner::cleanup(this, d_func());
1042         QT_RETHROW;
1043     }
1044 }
1045
1046 /*!
1047     \internal
1048 */
1049 int QWidget::devType() const
1050 {
1051     return QInternal::Widget;
1052 }
1053
1054
1055 //### w is a "this" ptr, passed as a param because QWorkspace needs special logic
1056 void QWidgetPrivate::adjustFlags(Qt::WindowFlags &flags, QWidget *w)
1057 {
1058     bool customize =  (flags & (Qt::CustomizeWindowHint
1059             | Qt::FramelessWindowHint
1060             | Qt::WindowTitleHint
1061             | Qt::WindowSystemMenuHint
1062             | Qt::WindowMinimizeButtonHint
1063             | Qt::WindowMaximizeButtonHint
1064             | Qt::WindowCloseButtonHint
1065             | Qt::WindowContextHelpButtonHint));
1066
1067     uint type = (flags & Qt::WindowType_Mask);
1068
1069     if ((type == Qt::Widget || type == Qt::SubWindow) && w && !w->parent()) {
1070         type = Qt::Window;
1071         flags |= Qt::Window;
1072     }
1073
1074     if (flags & Qt::CustomizeWindowHint) {
1075         // modify window flags to make them consistent.
1076         // Only enable this on non-Mac platforms. Since the old way of doing this would
1077         // interpret WindowSystemMenuHint as a close button and we can't change that behavior
1078         // we can't just add this in.
1079 #ifndef Q_WS_MAC
1080         if (flags & (Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint | Qt::WindowContextHelpButtonHint)) {
1081             flags |= Qt::WindowSystemMenuHint;
1082 #else
1083         if (flags & (Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint
1084                      | Qt::WindowSystemMenuHint)) {
1085 #endif
1086             flags |= Qt::WindowTitleHint;
1087             flags &= ~Qt::FramelessWindowHint;
1088         }
1089     } else if (customize && !(flags & Qt::FramelessWindowHint)) {
1090         // if any of the window hints that affect the titlebar are set
1091         // and the window is supposed to have frame, we add a titlebar
1092         // and system menu by default.
1093         flags |= Qt::WindowSystemMenuHint;
1094         flags |= Qt::WindowTitleHint;
1095     }
1096     if (customize)
1097         ; // don't modify window flags if the user explicitly set them.
1098     else if (type == Qt::Dialog || type == Qt::Sheet)
1099 #ifndef Q_OS_WINCE
1100         flags |= Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowContextHelpButtonHint | Qt::WindowCloseButtonHint;
1101 #else
1102         flags |= Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint;
1103 #endif
1104     else if (type == Qt::Tool)
1105         flags |= Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint;
1106     else
1107         flags |= Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint | Qt::WindowCloseButtonHint;
1108
1109
1110 }
1111
1112 void QWidgetPrivate::init(QWidget *parentWidget, Qt::WindowFlags f)
1113 {
1114     Q_Q(QWidget);
1115     if (QApplication::type() == QApplication::Tty)
1116         qFatal("QWidget: Cannot create a QWidget when no GUI is being used");
1117
1118     Q_ASSERT(allWidgets);
1119     if (allWidgets)
1120         allWidgets->insert(q);
1121
1122     QWidget *desktopWidget = 0;
1123     if (parentWidget && parentWidget->windowType() == Qt::Desktop) {
1124         desktopWidget = parentWidget;
1125         parentWidget = 0;
1126     }
1127
1128     q->data = &data;
1129
1130 #ifndef QT_NO_THREAD
1131     if (!parent) {
1132         Q_ASSERT_X(q->thread() == qApp->thread(), "QWidget",
1133                    "Widgets must be created in the GUI thread.");
1134     }
1135 #endif
1136
1137 #if defined(Q_WS_X11)
1138     if (desktopWidget) {
1139         // make sure the widget is created on the same screen as the
1140         // programmer specified desktop widget
1141         xinfo = desktopWidget->d_func()->xinfo;
1142     }
1143 #endif
1144     if (desktopWidget) {
1145         const int screen = desktopWidget->d_func()->topData()->screenIndex;
1146         if (QWindow *window = q->windowHandle())
1147             window->setScreen(QGuiApplication::screens().value(screen, 0));
1148     }
1149
1150     data.fstrut_dirty = true;
1151
1152     data.winid = 0;
1153     data.widget_attributes = 0;
1154     data.window_flags = f;
1155     data.window_state = 0;
1156     data.focus_policy = 0;
1157     data.context_menu_policy = Qt::DefaultContextMenu;
1158     data.window_modality = Qt::NonModal;
1159
1160     data.sizehint_forced = 0;
1161     data.is_closing = 0;
1162     data.in_show = 0;
1163     data.in_set_window_state = 0;
1164     data.in_destructor = false;
1165
1166     // Widgets with Qt::MSWindowsOwnDC (typically QGLWidget) must have a window handle.
1167     if (f & Qt::MSWindowsOwnDC)
1168         q->setAttribute(Qt::WA_NativeWindow);
1169
1170 //#ifdef Q_WS_MAC
1171 //    q->setAttribute(Qt::WA_NativeWindow);
1172 //#endif
1173
1174     q->setAttribute(Qt::WA_QuitOnClose); // might be cleared in adjustQuitOnCloseAttribute()
1175     adjustQuitOnCloseAttribute();
1176
1177     q->setAttribute(Qt::WA_WState_Hidden);
1178
1179     //give potential windows a bigger "pre-initial" size; create_sys() will give them a new size later
1180     data.crect = parentWidget ? QRect(0,0,100,30) : QRect(0,0,640,480);
1181     focus_next = focus_prev = q;
1182
1183     if ((f & Qt::WindowType_Mask) == Qt::Desktop)
1184         q->create();
1185     else if (parentWidget)
1186         q->setParent(parentWidget, data.window_flags);
1187     else {
1188         adjustFlags(data.window_flags, q);
1189         resolveLayoutDirection();
1190         // opaque system background?
1191         const QBrush &background = q->palette().brush(QPalette::Window);
1192         setOpaque(q->isWindow() && background.style() != Qt::NoBrush && background.isOpaque());
1193     }
1194     data.fnt = QFont(data.fnt, q);
1195 #if defined(Q_WS_X11)
1196     data.fnt.x11SetScreen(xinfo.screen());
1197 #endif // Q_WS_X11
1198
1199     q->setAttribute(Qt::WA_PendingMoveEvent);
1200     q->setAttribute(Qt::WA_PendingResizeEvent);
1201
1202     if (++QWidgetPrivate::instanceCounter > QWidgetPrivate::maxInstances)
1203         QWidgetPrivate::maxInstances = QWidgetPrivate::instanceCounter;
1204
1205     if (QApplicationPrivate::testAttribute(Qt::AA_ImmediateWidgetCreation))
1206         q->create();
1207
1208     QEvent e(QEvent::Create);
1209     QApplication::sendEvent(q, &e);
1210     QApplication::postEvent(q, new QEvent(QEvent::PolishRequest));
1211
1212     extraPaintEngine = 0;
1213
1214 #ifdef Q_WS_MAC
1215     // If we add a child to the unified toolbar, we have to redirect the painting.
1216     if (parentWidget && parentWidget->d_func() && parentWidget->d_func()->isInUnifiedToolbar) {
1217         if (parentWidget->d_func()->unifiedSurface) {
1218             QWidget *toolbar = parentWidget->d_func()->toolbar_ancestor;
1219             parentWidget->d_func()->unifiedSurface->recursiveRedirect(toolbar, toolbar, toolbar->d_func()->toolbar_offset);
1220         }
1221     }
1222 #endif // Q_WS_MAC
1223 }
1224
1225
1226
1227 void QWidgetPrivate::createRecursively()
1228 {
1229     Q_Q(QWidget);
1230     q->create(0, true, true);
1231     for (int i = 0; i < children.size(); ++i) {
1232         QWidget *child = qobject_cast<QWidget *>(children.at(i));
1233         if (child && !child->isHidden() && !child->isWindow() && !child->testAttribute(Qt::WA_WState_Created))
1234             child->d_func()->createRecursively();
1235     }
1236 }
1237
1238
1239
1240
1241 /*!
1242     Creates a new widget window if \a window is 0, otherwise sets the
1243     widget's window to \a window.
1244
1245     Initializes the window (sets the geometry etc.) if \a
1246     initializeWindow is true. If \a initializeWindow is false, no
1247     initialization is performed. This parameter only makes sense if \a
1248     window is a valid window.
1249
1250     Destroys the old window if \a destroyOldWindow is true. If \a
1251     destroyOldWindow is false, you are responsible for destroying the
1252     window yourself (using platform native code).
1253
1254     The QWidget constructor calls create(0,true,true) to create a
1255     window for this widget.
1256 */
1257
1258 void QWidget::create(WId window, bool initializeWindow, bool destroyOldWindow)
1259 {
1260     Q_D(QWidget);
1261     if (testAttribute(Qt::WA_WState_Created) && window == 0 && internalWinId())
1262         return;
1263
1264     if (d->data.in_destructor)
1265         return;
1266
1267     Qt::WindowType type = windowType();
1268     Qt::WindowFlags &flags = data->window_flags;
1269
1270     if ((type == Qt::Widget || type == Qt::SubWindow) && !parentWidget()) {
1271         type = Qt::Window;
1272         flags |= Qt::Window;
1273     }
1274
1275     if (QWidget *parent = parentWidget()) {
1276         if (type & Qt::Window) {
1277             if (!parent->testAttribute(Qt::WA_WState_Created))
1278                 parent->createWinId();
1279         } else if (testAttribute(Qt::WA_NativeWindow) && !parent->internalWinId()
1280                    && !testAttribute(Qt::WA_DontCreateNativeAncestors)) {
1281             // We're about to create a native child widget that doesn't have a native parent;
1282             // enforce a native handle for the parent unless the Qt::WA_DontCreateNativeAncestors
1283             // attribute is set.
1284             d->createWinId(window);
1285             // Nothing more to do.
1286             Q_ASSERT(testAttribute(Qt::WA_WState_Created));
1287             Q_ASSERT(internalWinId());
1288             return;
1289         }
1290     }
1291
1292
1293     static int paintOnScreenEnv = -1;
1294     if (paintOnScreenEnv == -1)
1295         paintOnScreenEnv = qgetenv("QT_ONSCREEN_PAINT").toInt() > 0 ? 1 : 0;
1296     if (paintOnScreenEnv == 1)
1297         setAttribute(Qt::WA_PaintOnScreen);
1298
1299     if (QApplicationPrivate::testAttribute(Qt::AA_NativeWindows))
1300         setAttribute(Qt::WA_NativeWindow);
1301
1302 #ifdef ALIEN_DEBUG
1303     qDebug() << "QWidget::create:" << this << "parent:" << parentWidget()
1304              << "Alien?" << !testAttribute(Qt::WA_NativeWindow);
1305 #endif
1306
1307 #if defined (Q_WS_WIN) && !defined(QT_NO_DRAGANDDROP)
1308     // Unregister the dropsite (if already registered) before we
1309     // re-create the widget with a native window.
1310     if (testAttribute(Qt::WA_WState_Created) && !internalWinId() && testAttribute(Qt::WA_NativeWindow)
1311             && d->extra && d->extra->dropTarget) {
1312         d->registerDropSite(false);
1313     }
1314 #endif // defined (Q_WS_WIN) && !defined(QT_NO_DRAGANDDROP)
1315
1316     d->updateIsOpaque();
1317
1318     setAttribute(Qt::WA_WState_Created);                        // set created flag
1319     d->create_sys(window, initializeWindow, destroyOldWindow);
1320
1321     // a real toplevel window needs a backing store
1322     if (isWindow() && windowType() != Qt::Desktop) {
1323         d->topData()->backingStoreTracker.destroy();
1324         if (hasBackingStoreSupport())
1325             d->topData()->backingStoreTracker.create(this);
1326     }
1327
1328     d->setModal_sys();
1329
1330     if (!isWindow() && parentWidget() && parentWidget()->testAttribute(Qt::WA_DropSiteRegistered))
1331         setAttribute(Qt::WA_DropSiteRegistered, true);
1332
1333 #ifdef QT_EVAL
1334     extern void qt_eval_init_widget(QWidget *w);
1335     qt_eval_init_widget(this);
1336 #endif
1337
1338     // need to force the resting of the icon after changing parents
1339     if (testAttribute(Qt::WA_SetWindowIcon))
1340         d->setWindowIcon_sys(true);
1341     if (isWindow() && !d->topData()->iconText.isEmpty())
1342         d->setWindowIconText_helper(d->topData()->iconText);
1343     if (isWindow() && !d->topData()->caption.isEmpty())
1344         d->setWindowTitle_helper(d->topData()->caption);
1345     if (windowType() != Qt::Desktop) {
1346         d->updateSystemBackground();
1347
1348         if (isWindow() && !testAttribute(Qt::WA_SetWindowIcon))
1349             d->setWindowIcon_sys();
1350     }
1351 }
1352
1353 /*!
1354     Destroys the widget.
1355
1356     All this widget's children are deleted first. The application
1357     exits if this widget is the main widget.
1358 */
1359
1360 QWidget::~QWidget()
1361 {
1362     Q_D(QWidget);
1363     d->data.in_destructor = true;
1364
1365 #if defined (QT_CHECK_STATE)
1366     if (paintingActive())
1367         qWarning("QWidget: %s (%s) deleted while being painted", className(), name());
1368 #endif
1369
1370 #ifndef QT_NO_GESTURES
1371     foreach (Qt::GestureType type, d->gestureContext.keys())
1372         ungrabGesture(type);
1373 #endif
1374
1375     // force acceptDrops false before winId is destroyed.
1376     d->registerDropSite(false);
1377
1378 #ifndef QT_NO_ACTION
1379     // remove all actions from this widget
1380     for (int i = 0; i < d->actions.size(); ++i) {
1381         QActionPrivate *apriv = d->actions.at(i)->d_func();
1382         apriv->widgets.removeAll(this);
1383     }
1384     d->actions.clear();
1385 #endif
1386
1387 #ifndef QT_NO_SHORTCUT
1388     // Remove all shortcuts grabbed by this
1389     // widget, unless application is closing
1390     if (!QApplicationPrivate::is_app_closing && testAttribute(Qt::WA_GrabbedShortcut))
1391         qApp->d_func()->shortcutMap.removeShortcut(0, this, QKeySequence());
1392 #endif
1393
1394     // delete layout while we still are a valid widget
1395     delete d->layout;
1396     d->layout = 0;
1397     // Remove myself from focus list
1398
1399     Q_ASSERT(d->focus_next->d_func()->focus_prev == this);
1400     Q_ASSERT(d->focus_prev->d_func()->focus_next == this);
1401
1402     if (d->focus_next != this) {
1403         d->focus_next->d_func()->focus_prev = d->focus_prev;
1404         d->focus_prev->d_func()->focus_next = d->focus_next;
1405         d->focus_next = d->focus_prev = 0;
1406     }
1407
1408
1409     QT_TRY {
1410         clearFocus();
1411     } QT_CATCH(...) {
1412         // swallow this problem because we are in a destructor
1413     }
1414
1415     d->setDirtyOpaqueRegion();
1416
1417     if (isWindow() && isVisible() && internalWinId()) {
1418         QT_TRY {
1419             d->close_helper(QWidgetPrivate::CloseNoEvent);
1420         } QT_CATCH(...) {
1421             // if we're out of memory, at least hide the window.
1422             QT_TRY {
1423                 hide();
1424             } QT_CATCH(...) {
1425                 // and if that also doesn't work, then give up
1426             }
1427         }
1428     }
1429
1430 #if defined(Q_WS_WIN) || defined(Q_WS_X11)|| defined(Q_WS_MAC)
1431     else if (!internalWinId() && isVisible()) {
1432         qApp->d_func()->sendSyntheticEnterLeave(this);
1433     }
1434 #endif
1435     else if (isVisible()) {
1436         qApp->d_func()->sendSyntheticEnterLeave(this);
1437     }
1438
1439     if (QWidgetBackingStore *bs = d->maybeBackingStore()) {
1440         bs->removeDirtyWidget(this);
1441         if (testAttribute(Qt::WA_StaticContents))
1442             bs->removeStaticWidget(this);
1443     }
1444
1445     delete d->needsFlush;
1446     d->needsFlush = 0;
1447
1448     if (d->declarativeData) {
1449         QAbstractDeclarativeData::destroyed(d->declarativeData, this);
1450         d->declarativeData = 0;                 // don't activate again in ~QObject
1451     }
1452
1453 #ifdef Q_WS_MAC
1454     // QCocoaView holds a pointer back to this widget. Clear it now
1455     // to make sure it's not followed later on. The lifetime of the
1456     // QCocoaView might exceed the lifetime of this widget in cases
1457     // where Cocoa itself holds references to it.
1458     extern void qt_mac_clearCocoaViewQWidgetPointers(QWidget *);
1459     qt_mac_clearCocoaViewQWidgetPointers(this);
1460 #endif
1461
1462     if (!d->children.isEmpty())
1463         d->deleteChildren();
1464
1465     QApplication::removePostedEvents(this);
1466
1467     QT_TRY {
1468         destroy();                                        // platform-dependent cleanup
1469     } QT_CATCH(...) {
1470         // if this fails we can't do anything about it but at least we are not allowed to throw.
1471     }
1472     --QWidgetPrivate::instanceCounter;
1473
1474     if (QWidgetPrivate::allWidgets) // might have been deleted by ~QApplication
1475         QWidgetPrivate::allWidgets->remove(this);
1476
1477     QT_TRY {
1478         QEvent e(QEvent::Destroy);
1479         QCoreApplication::sendEvent(this, &e);
1480     } QT_CATCH(const std::exception&) {
1481         // if this fails we can't do anything about it but at least we are not allowed to throw.
1482     }
1483 }
1484
1485 int QWidgetPrivate::instanceCounter = 0;  // Current number of widget instances
1486 int QWidgetPrivate::maxInstances = 0;     // Maximum number of widget instances
1487
1488 void QWidgetPrivate::setWinId(WId id)                // set widget identifier
1489 {
1490     Q_Q(QWidget);
1491     // the user might create a widget with Qt::Desktop window
1492     // attribute (or create another QDesktopWidget instance), which
1493     // will have the same windowid (the root window id) as the
1494     // qt_desktopWidget. We should not add the second desktop widget
1495     // to the mapper.
1496     bool userDesktopWidget = qt_desktopWidget != 0 && qt_desktopWidget != q && q->windowType() == Qt::Desktop;
1497     if (mapper && data.winid && !userDesktopWidget) {
1498         mapper->remove(data.winid);
1499     }
1500
1501     const WId oldWinId = data.winid;
1502
1503     data.winid = id;
1504 #if defined(Q_WS_X11)
1505     hd = id; // X11: hd == ident
1506 #endif
1507     if (mapper && id && !userDesktopWidget) {
1508         mapper->insert(data.winid, q);
1509     }
1510
1511     if(oldWinId != id) {
1512         QEvent e(QEvent::WinIdChange);
1513         QCoreApplication::sendEvent(q, &e);
1514     }
1515 }
1516
1517 void QWidgetPrivate::createTLExtra()
1518 {
1519     if (!extra)
1520         createExtra();
1521     if (!extra->topextra) {
1522         QTLWExtra* x = extra->topextra = new QTLWExtra;
1523         x->icon = 0;
1524         x->iconPixmap = 0;
1525         x->backingStore = 0;
1526         x->sharedPainter = 0;
1527         x->incw = x->inch = 0;
1528         x->basew = x->baseh = 0;
1529         x->frameStrut.setCoords(0, 0, 0, 0);
1530         x->normalGeometry = QRect(0,0,-1,-1);
1531         x->savedFlags = 0;
1532         x->opacity = 255;
1533         x->posFromMove = false;
1534         x->sizeAdjusted = false;
1535         x->inTopLevelResize = false;
1536         x->inRepaint = false;
1537         x->embedded = 0;
1538 #ifdef Q_WS_MAC
1539         x->wasMaximized = false;
1540 #endif // Q_WS_MAC
1541         createTLSysExtra();
1542 #ifdef QWIDGET_EXTRA_DEBUG
1543         static int count = 0;
1544         qDebug() << "tlextra" << ++count;
1545 #endif
1546     }
1547 }
1548
1549 /*!
1550   \internal
1551   Creates the widget extra data.
1552 */
1553
1554 void QWidgetPrivate::createExtra()
1555 {
1556     if (!extra) {                                // if not exists
1557         extra = new QWExtra;
1558         extra->glContext = 0;
1559         extra->topextra = 0;
1560 #ifndef QT_NO_GRAPHICSVIEW
1561         extra->proxyWidget = 0;
1562 #endif
1563 #ifndef QT_NO_CURSOR
1564         extra->curs = 0;
1565 #endif
1566         extra->minw = 0;
1567         extra->minh = 0;
1568         extra->maxw = QWIDGETSIZE_MAX;
1569         extra->maxh = QWIDGETSIZE_MAX;
1570         extra->customDpiX = 0;
1571         extra->customDpiY = 0;
1572         extra->explicitMinSize = 0;
1573         extra->explicitMaxSize = 0;
1574         extra->autoFillBackground = 0;
1575         extra->nativeChildrenForced = 0;
1576         extra->inRenderWithPainter = 0;
1577         extra->hasMask = 0;
1578         createSysExtra();
1579 #ifdef QWIDGET_EXTRA_DEBUG
1580         static int count = 0;
1581         qDebug() << "extra" << ++count;
1582 #endif
1583     }
1584 }
1585
1586
1587 /*!
1588   \internal
1589   Deletes the widget extra data.
1590 */
1591
1592 void QWidgetPrivate::deleteExtra()
1593 {
1594     if (extra) {                                // if exists
1595 #ifndef QT_NO_CURSOR
1596         delete extra->curs;
1597 #endif
1598         deleteSysExtra();
1599 #ifndef QT_NO_STYLE_STYLESHEET
1600         // dereference the stylesheet style
1601         if (QStyleSheetStyle *proxy = qobject_cast<QStyleSheetStyle *>(extra->style))
1602             proxy->deref();
1603 #endif
1604         if (extra->topextra) {
1605             deleteTLSysExtra();
1606             extra->topextra->backingStoreTracker.destroy();
1607             delete extra->topextra->icon;
1608             delete extra->topextra->iconPixmap;
1609             delete extra->topextra->backingStore;
1610             delete extra->topextra;
1611         }
1612         delete extra;
1613         // extra->xic destroyed in QWidget::destroy()
1614         extra = 0;
1615     }
1616 }
1617
1618 /*
1619   Returns true if there are widgets above this which overlap with
1620   \a rect, which is in parent's coordinate system (same as crect).
1621 */
1622
1623 bool QWidgetPrivate::isOverlapped(const QRect &rect) const
1624 {
1625     Q_Q(const QWidget);
1626
1627     const QWidget *w = q;
1628     QRect r = rect;
1629     while (w) {
1630         if (w->isWindow())
1631             return false;
1632         QWidgetPrivate *pd = w->parentWidget()->d_func();
1633         bool above = false;
1634         for (int i = 0; i < pd->children.size(); ++i) {
1635             QWidget *sibling = qobject_cast<QWidget *>(pd->children.at(i));
1636             if (!sibling || !sibling->isVisible() || sibling->isWindow())
1637                 continue;
1638             if (!above) {
1639                 above = (sibling == w);
1640                 continue;
1641             }
1642
1643             if (qRectIntersects(sibling->d_func()->effectiveRectFor(sibling->data->crect), r)) {
1644                 const QWExtra *siblingExtra = sibling->d_func()->extra;
1645                 if (siblingExtra && siblingExtra->hasMask && !sibling->d_func()->graphicsEffect
1646                     && !siblingExtra->mask.translated(sibling->data->crect.topLeft()).intersects(r)) {
1647                     continue;
1648                 }
1649                 return true;
1650             }
1651         }
1652         w = w->parentWidget();
1653         r.translate(pd->data.crect.topLeft());
1654     }
1655     return false;
1656 }
1657
1658 void QWidgetPrivate::syncBackingStore()
1659 {
1660     if (paintOnScreen()) {
1661         repaint_sys(dirty);
1662         dirty = QRegion();
1663     } else if (QWidgetBackingStore *bs = maybeBackingStore()) {
1664         bs->sync();
1665     }
1666 }
1667
1668 void QWidgetPrivate::syncBackingStore(const QRegion &region)
1669 {
1670     if (paintOnScreen())
1671         repaint_sys(region);
1672     else if (QWidgetBackingStore *bs = maybeBackingStore()) {
1673         bs->sync(q_func(), region);
1674     }
1675 }
1676
1677 void QWidgetPrivate::setUpdatesEnabled_helper(bool enable)
1678 {
1679     Q_Q(QWidget);
1680
1681     if (enable && !q->isWindow() && q->parentWidget() && !q->parentWidget()->updatesEnabled())
1682         return; // nothing we can do
1683
1684     if (enable != q->testAttribute(Qt::WA_UpdatesDisabled))
1685         return; // nothing to do
1686
1687     q->setAttribute(Qt::WA_UpdatesDisabled, !enable);
1688     if (enable)
1689         q->update();
1690
1691     Qt::WidgetAttribute attribute = enable ? Qt::WA_ForceUpdatesDisabled : Qt::WA_UpdatesDisabled;
1692     for (int i = 0; i < children.size(); ++i) {
1693         QWidget *w = qobject_cast<QWidget *>(children.at(i));
1694         if (w && !w->isWindow() && !w->testAttribute(attribute))
1695             w->d_func()->setUpdatesEnabled_helper(enable);
1696     }
1697 }
1698
1699 /*!
1700     \internal
1701
1702     Propagate this widget's palette to all children, except style sheet
1703     widgets, and windows that don't enable window propagation (palettes don't
1704     normally propagate to windows).
1705 */
1706 void QWidgetPrivate::propagatePaletteChange()
1707 {
1708     Q_Q(QWidget);
1709     // Propagate a new inherited mask to all children.
1710 #ifndef QT_NO_GRAPHICSVIEW
1711     if (!q->parentWidget() && extra && extra->proxyWidget) {
1712         QGraphicsProxyWidget *p = extra->proxyWidget;
1713         inheritedPaletteResolveMask = p->d_func()->inheritedPaletteResolveMask | p->palette().resolve();
1714     } else
1715 #endif //QT_NO_GRAPHICSVIEW
1716         if (q->isWindow() && !q->testAttribute(Qt::WA_WindowPropagation)) {
1717         inheritedPaletteResolveMask = 0;
1718     }
1719     int mask = data.pal.resolve() | inheritedPaletteResolveMask;
1720
1721     QEvent pc(QEvent::PaletteChange);
1722     QApplication::sendEvent(q, &pc);
1723     for (int i = 0; i < children.size(); ++i) {
1724         QWidget *w = qobject_cast<QWidget*>(children.at(i));
1725         if (w && !w->testAttribute(Qt::WA_StyleSheet)
1726             && (!w->isWindow() || w->testAttribute(Qt::WA_WindowPropagation))) {
1727             QWidgetPrivate *wd = w->d_func();
1728             wd->inheritedPaletteResolveMask = mask;
1729             wd->resolvePalette();
1730         }
1731     }
1732 }
1733
1734 /*
1735   Returns the widget's clipping rectangle.
1736 */
1737 QRect QWidgetPrivate::clipRect() const
1738 {
1739     Q_Q(const QWidget);
1740     const QWidget * w = q;
1741     if (!w->isVisible())
1742         return QRect();
1743     QRect r = effectiveRectFor(q->rect());
1744     int ox = 0;
1745     int oy = 0;
1746     while (w
1747             && w->isVisible()
1748             && !w->isWindow()
1749             && w->parentWidget()) {
1750         ox -= w->x();
1751         oy -= w->y();
1752         w = w->parentWidget();
1753         r &= QRect(ox, oy, w->width(), w->height());
1754     }
1755     return r;
1756 }
1757
1758 /*
1759   Returns the widget's clipping region (without siblings).
1760 */
1761 QRegion QWidgetPrivate::clipRegion() const
1762 {
1763     Q_Q(const QWidget);
1764     if (!q->isVisible())
1765         return QRegion();
1766     QRegion r(q->rect());
1767     const QWidget * w = q;
1768     const QWidget *ignoreUpTo;
1769     int ox = 0;
1770     int oy = 0;
1771     while (w
1772            && w->isVisible()
1773            && !w->isWindow()
1774            && w->parentWidget()) {
1775         ox -= w->x();
1776         oy -= w->y();
1777         ignoreUpTo = w;
1778         w = w->parentWidget();
1779         r &= QRegion(ox, oy, w->width(), w->height());
1780
1781         int i = 0;
1782         while(w->d_func()->children.at(i++) != static_cast<const QObject *>(ignoreUpTo))
1783             ;
1784         for ( ; i < w->d_func()->children.size(); ++i) {
1785             if(QWidget *sibling = qobject_cast<QWidget *>(w->d_func()->children.at(i))) {
1786                 if(sibling->isVisible() && !sibling->isWindow()) {
1787                     QRect siblingRect(ox+sibling->x(), oy+sibling->y(),
1788                                       sibling->width(), sibling->height());
1789                     if (qRectIntersects(siblingRect, q->rect()))
1790                         r -= QRegion(siblingRect);
1791                 }
1792             }
1793         }
1794     }
1795     return r;
1796 }
1797
1798 #ifndef QT_NO_GRAPHICSEFFECT
1799 void QWidgetPrivate::invalidateGraphicsEffectsRecursively()
1800 {
1801     Q_Q(QWidget);
1802     QWidget *w = q;
1803     do {
1804         if (w->graphicsEffect()) {
1805             QWidgetEffectSourcePrivate *sourced =
1806                 static_cast<QWidgetEffectSourcePrivate *>(w->graphicsEffect()->source()->d_func());
1807             if (!sourced->updateDueToGraphicsEffect)
1808                 w->graphicsEffect()->source()->d_func()->invalidateCache();
1809         }
1810         w = w->parentWidget();
1811     } while (w);
1812 }
1813 #endif //QT_NO_GRAPHICSEFFECT
1814
1815 void QWidgetPrivate::setDirtyOpaqueRegion()
1816 {
1817     Q_Q(QWidget);
1818
1819     dirtyOpaqueChildren = true;
1820
1821 #ifndef QT_NO_GRAPHICSEFFECT
1822     invalidateGraphicsEffectsRecursively();
1823 #endif //QT_NO_GRAPHICSEFFECT
1824
1825     if (q->isWindow())
1826         return;
1827
1828     QWidget *parent = q->parentWidget();
1829     if (!parent)
1830         return;
1831
1832     // TODO: instead of setting dirtyflag, manipulate the dirtyregion directly?
1833     QWidgetPrivate *pd = parent->d_func();
1834     if (!pd->dirtyOpaqueChildren)
1835         pd->setDirtyOpaqueRegion();
1836 }
1837
1838 const QRegion &QWidgetPrivate::getOpaqueChildren() const
1839 {
1840     if (!dirtyOpaqueChildren)
1841         return opaqueChildren;
1842
1843     QWidgetPrivate *that = const_cast<QWidgetPrivate*>(this);
1844     that->opaqueChildren = QRegion();
1845
1846     for (int i = 0; i < children.size(); ++i) {
1847         QWidget *child = qobject_cast<QWidget *>(children.at(i));
1848         if (!child || !child->isVisible() || child->isWindow())
1849             continue;
1850
1851         const QPoint offset = child->geometry().topLeft();
1852         QWidgetPrivate *childd = child->d_func();
1853         QRegion r = childd->isOpaque ? child->rect() : childd->getOpaqueChildren();
1854         if (childd->extra && childd->extra->hasMask)
1855             r &= childd->extra->mask;
1856         if (r.isEmpty())
1857             continue;
1858         r.translate(offset);
1859         that->opaqueChildren += r;
1860     }
1861
1862     that->opaqueChildren &= q_func()->rect();
1863     that->dirtyOpaqueChildren = false;
1864
1865     return that->opaqueChildren;
1866 }
1867
1868 void QWidgetPrivate::subtractOpaqueChildren(QRegion &source, const QRect &clipRect) const
1869 {
1870     if (children.isEmpty() || clipRect.isEmpty())
1871         return;
1872
1873     const QRegion &r = getOpaqueChildren();
1874     if (!r.isEmpty())
1875         source -= (r & clipRect);
1876 }
1877
1878 //subtract any relatives that are higher up than me --- this is too expensive !!!
1879 void QWidgetPrivate::subtractOpaqueSiblings(QRegion &sourceRegion, bool *hasDirtySiblingsAbove,
1880                                             bool alsoNonOpaque) const
1881 {
1882     Q_Q(const QWidget);
1883     static int disableSubtractOpaqueSiblings = qgetenv("QT_NO_SUBTRACTOPAQUESIBLINGS").toInt();
1884     if (disableSubtractOpaqueSiblings || q->isWindow())
1885         return;
1886
1887 #ifdef Q_WS_MAC
1888     if (q->d_func()->isInUnifiedToolbar)
1889         return;
1890 #endif // Q_WS_MAC
1891
1892     QRect clipBoundingRect;
1893     bool dirtyClipBoundingRect = true;
1894
1895     QRegion parentClip;
1896     bool dirtyParentClip = true;
1897
1898     QPoint parentOffset = data.crect.topLeft();
1899
1900     const QWidget *w = q;
1901
1902     while (w) {
1903         if (w->isWindow())
1904             break;
1905         QWidgetPrivate *pd = w->parentWidget()->d_func();
1906         const int myIndex = pd->children.indexOf(const_cast<QWidget *>(w));
1907         const QRect widgetGeometry = w->d_func()->effectiveRectFor(w->data->crect);
1908         for (int i = myIndex + 1; i < pd->children.size(); ++i) {
1909             QWidget *sibling = qobject_cast<QWidget *>(pd->children.at(i));
1910             if (!sibling || !sibling->isVisible() || sibling->isWindow())
1911                 continue;
1912
1913             const QRect siblingGeometry = sibling->d_func()->effectiveRectFor(sibling->data->crect);
1914             if (!qRectIntersects(siblingGeometry, widgetGeometry))
1915                 continue;
1916
1917             if (dirtyClipBoundingRect) {
1918                 clipBoundingRect = sourceRegion.boundingRect();
1919                 dirtyClipBoundingRect = false;
1920             }
1921
1922             if (!qRectIntersects(siblingGeometry, clipBoundingRect.translated(parentOffset)))
1923                 continue;
1924
1925             if (dirtyParentClip) {
1926                 parentClip = sourceRegion.translated(parentOffset);
1927                 dirtyParentClip = false;
1928             }
1929
1930             const QPoint siblingPos(sibling->data->crect.topLeft());
1931             const QRect siblingClipRect(sibling->d_func()->clipRect());
1932             QRegion siblingDirty(parentClip);
1933             siblingDirty &= (siblingClipRect.translated(siblingPos));
1934             const bool hasMask = sibling->d_func()->extra && sibling->d_func()->extra->hasMask
1935                                  && !sibling->d_func()->graphicsEffect;
1936             if (hasMask)
1937                 siblingDirty &= sibling->d_func()->extra->mask.translated(siblingPos);
1938             if (siblingDirty.isEmpty())
1939                 continue;
1940
1941             if (sibling->d_func()->isOpaque || alsoNonOpaque) {
1942                 if (hasMask) {
1943                     siblingDirty.translate(-parentOffset);
1944                     sourceRegion -= siblingDirty;
1945                 } else {
1946                     sourceRegion -= siblingGeometry.translated(-parentOffset);
1947                 }
1948             } else {
1949                 if (hasDirtySiblingsAbove)
1950                     *hasDirtySiblingsAbove = true;
1951                 if (sibling->d_func()->children.isEmpty())
1952                     continue;
1953                 QRegion opaqueSiblingChildren(sibling->d_func()->getOpaqueChildren());
1954                 opaqueSiblingChildren.translate(-parentOffset + siblingPos);
1955                 sourceRegion -= opaqueSiblingChildren;
1956             }
1957             if (sourceRegion.isEmpty())
1958                 return;
1959
1960             dirtyClipBoundingRect = true;
1961             dirtyParentClip = true;
1962         }
1963
1964         w = w->parentWidget();
1965         parentOffset += pd->data.crect.topLeft();
1966         dirtyParentClip = true;
1967     }
1968 }
1969
1970 void QWidgetPrivate::clipToEffectiveMask(QRegion &region) const
1971 {
1972     Q_Q(const QWidget);
1973
1974     const QWidget *w = q;
1975     QPoint offset;
1976
1977 #ifndef QT_NO_GRAPHICSEFFECT
1978     if (graphicsEffect) {
1979         w = q->parentWidget();
1980         offset -= data.crect.topLeft();
1981     }
1982 #endif //QT_NO_GRAPHICSEFFECT
1983
1984     while (w) {
1985         const QWidgetPrivate *wd = w->d_func();
1986         if (wd->extra && wd->extra->hasMask)
1987             region &= (w != q) ? wd->extra->mask.translated(offset) : wd->extra->mask;
1988         if (w->isWindow())
1989             return;
1990         offset -= wd->data.crect.topLeft();
1991         w = w->parentWidget();
1992     }
1993 }
1994
1995 bool QWidgetPrivate::paintOnScreen() const
1996 {
1997 #if defined(QT_NO_BACKINGSTORE)
1998     return true;
1999 #else
2000     Q_Q(const QWidget);
2001     if (q->testAttribute(Qt::WA_PaintOnScreen)
2002             || (!q->isWindow() && q->window()->testAttribute(Qt::WA_PaintOnScreen))) {
2003         return true;
2004     }
2005
2006     return !qt_enable_backingstore;
2007 #endif
2008 }
2009
2010 void QWidgetPrivate::updateIsOpaque()
2011 {
2012     // hw: todo: only needed if opacity actually changed
2013     setDirtyOpaqueRegion();
2014
2015 #ifndef QT_NO_GRAPHICSEFFECT
2016     if (graphicsEffect) {
2017         // ### We should probably add QGraphicsEffect::isOpaque at some point.
2018         setOpaque(false);
2019         return;
2020     }
2021 #endif //QT_NO_GRAPHICSEFFECT
2022
2023     Q_Q(QWidget);
2024 #ifdef Q_WS_X11
2025     if (q->testAttribute(Qt::WA_X11OpenGLOverlay)) {
2026         setOpaque(false);
2027         return;
2028     }
2029 #endif
2030
2031     if (q->testAttribute(Qt::WA_OpaquePaintEvent) || q->testAttribute(Qt::WA_PaintOnScreen)) {
2032         setOpaque(true);
2033         return;
2034     }
2035
2036     const QPalette &pal = q->palette();
2037
2038     if (q->autoFillBackground()) {
2039         const QBrush &autoFillBrush = pal.brush(q->backgroundRole());
2040         if (autoFillBrush.style() != Qt::NoBrush && autoFillBrush.isOpaque()) {
2041             setOpaque(true);
2042             return;
2043         }
2044     }
2045
2046     if (q->isWindow() && !q->testAttribute(Qt::WA_NoSystemBackground)) {
2047         const QBrush &windowBrush = q->palette().brush(QPalette::Window);
2048         if (windowBrush.style() != Qt::NoBrush && windowBrush.isOpaque()) {
2049             setOpaque(true);
2050             return;
2051         }
2052     }
2053     setOpaque(false);
2054 }
2055
2056 void QWidgetPrivate::setOpaque(bool opaque)
2057 {
2058     if (isOpaque == opaque)
2059         return;
2060     isOpaque = opaque;
2061 #ifdef Q_WS_MAC
2062     macUpdateIsOpaque();
2063 #endif
2064 #ifdef Q_WS_X11
2065     x11UpdateIsOpaque();
2066 #endif
2067 #ifdef Q_WS_WIN
2068     winUpdateIsOpaque();
2069 #endif
2070 }
2071
2072 void QWidgetPrivate::updateIsTranslucent()
2073 {
2074 #ifdef Q_WS_MAC
2075     macUpdateIsOpaque();
2076 #endif
2077 #ifdef Q_WS_X11
2078     x11UpdateIsOpaque();
2079 #endif
2080 #ifdef Q_WS_WIN
2081     winUpdateIsOpaque();
2082 #endif
2083 }
2084
2085 static inline void fillRegion(QPainter *painter, const QRegion &rgn, const QBrush &brush)
2086 {
2087     Q_ASSERT(painter);
2088
2089     if (brush.style() == Qt::TexturePattern) {
2090 #ifdef Q_WS_MAC
2091         // Optimize pattern filling on mac by using HITheme directly
2092         // when filling with the standard widget background.
2093         // Defined in qmacstyle_mac.cpp
2094         extern void qt_mac_fill_background(QPainter *painter, const QRegion &rgn, const QBrush &brush);
2095         qt_mac_fill_background(painter, rgn, brush);
2096 #else
2097         {
2098             const QRect rect(rgn.boundingRect());
2099             painter->setClipRegion(rgn);
2100             painter->drawTiledPixmap(rect, brush.texture(), rect.topLeft());
2101         }
2102 #endif // Q_WS_MAC
2103
2104     } else if (brush.gradient()
2105                && brush.gradient()->coordinateMode() == QGradient::ObjectBoundingMode) {
2106         painter->save();
2107         painter->setClipRegion(rgn);
2108         painter->fillRect(0, 0, painter->device()->width(), painter->device()->height(), brush);
2109         painter->restore();
2110     } else {
2111         const QVector<QRect> &rects = rgn.rects();
2112         for (int i = 0; i < rects.size(); ++i)
2113             painter->fillRect(rects.at(i), brush);
2114     }
2115 }
2116
2117 void QWidgetPrivate::paintBackground(QPainter *painter, const QRegion &rgn, int flags) const
2118 {
2119     Q_Q(const QWidget);
2120
2121 #ifndef QT_NO_SCROLLAREA
2122     bool resetBrushOrigin = false;
2123     QPointF oldBrushOrigin;
2124     //If we are painting the viewport of a scrollarea, we must apply an offset to the brush in case we are drawing a texture
2125     QAbstractScrollArea *scrollArea = qobject_cast<QAbstractScrollArea *>(parent);
2126     if (scrollArea && scrollArea->viewport() == q) {
2127         QObjectData *scrollPrivate = static_cast<QWidget *>(scrollArea)->d_ptr.data();
2128         QAbstractScrollAreaPrivate *priv = static_cast<QAbstractScrollAreaPrivate *>(scrollPrivate);
2129         oldBrushOrigin = painter->brushOrigin();
2130         resetBrushOrigin = true;
2131         painter->setBrushOrigin(-priv->contentsOffset());
2132
2133     }
2134 #endif // QT_NO_SCROLLAREA
2135
2136     const QBrush autoFillBrush = q->palette().brush(q->backgroundRole());
2137
2138     if ((flags & DrawAsRoot) && !(q->autoFillBackground() && autoFillBrush.isOpaque())) {
2139         const QBrush bg = q->palette().brush(QPalette::Window);
2140         fillRegion(painter, rgn, bg);
2141     }
2142
2143     if (q->autoFillBackground())
2144         fillRegion(painter, rgn, autoFillBrush);
2145
2146     if (q->testAttribute(Qt::WA_StyledBackground)) {
2147         painter->setClipRegion(rgn);
2148         QStyleOption opt;
2149         opt.initFrom(q);
2150         q->style()->drawPrimitive(QStyle::PE_Widget, &opt, painter, q);
2151     }
2152
2153 #ifndef QT_NO_SCROLLAREA
2154     if (resetBrushOrigin)
2155         painter->setBrushOrigin(oldBrushOrigin);
2156 #endif // QT_NO_SCROLLAREA
2157 }
2158
2159 /*
2160   \internal
2161   This function is called when a widget is hidden or destroyed.
2162   It resets some application global pointers that should only refer active,
2163   visible widgets.
2164 */
2165
2166 #ifdef Q_WS_MAC
2167     extern QPointer<QWidget> qt_button_down;
2168 #else
2169     extern QWidget *qt_button_down;
2170 #endif
2171
2172 void QWidgetPrivate::deactivateWidgetCleanup()
2173 {
2174     Q_Q(QWidget);
2175     // If this was the active application window, reset it
2176     if (QApplication::activeWindow() == q)
2177         QApplication::setActiveWindow(0);
2178     // If the is the active mouse press widget, reset it
2179     if (q == qt_button_down)
2180         qt_button_down = 0;
2181 }
2182
2183
2184 /*!
2185     Returns a pointer to the widget with window identifer/handle \a
2186     id.
2187
2188     The window identifier type depends on the underlying window
2189     system, see \c qwindowdefs.h for the actual definition. If there
2190     is no widget with this identifier, 0 is returned.
2191 */
2192
2193 QWidget *QWidget::find(WId id)
2194 {
2195     return QWidgetPrivate::mapper ? QWidgetPrivate::mapper->value(id, 0) : 0;
2196 }
2197
2198
2199
2200 /*!
2201     \fn WId QWidget::internalWinId() const
2202     \internal
2203     Returns the window system identifier of the widget, or 0 if the widget is not created yet.
2204
2205 */
2206
2207 /*!
2208     \fn WId QWidget::winId() const
2209
2210     Returns the window system identifier of the widget.
2211
2212     Portable in principle, but if you use it you are probably about to
2213     do something non-portable. Be careful.
2214
2215     If a widget is non-native (alien) and winId() is invoked on it, that widget
2216     will be provided a native handle.
2217
2218     On Mac OS X, the type returned depends on which framework Qt was linked
2219     against. If Qt is using Carbon, the {WId} is actually an HIViewRef. If Qt
2220     is using Cocoa, {WId} is a pointer to an NSView.
2221
2222     This value may change at run-time. An event with type QEvent::WinIdChange
2223     will be sent to the widget following a change in window system identifier.
2224
2225     \sa find()
2226 */
2227 WId QWidget::winId() const
2228 {
2229     if (!testAttribute(Qt::WA_WState_Created) || !internalWinId()) {
2230 #ifdef ALIEN_DEBUG
2231         qDebug() << "QWidget::winId: creating native window for" << this;
2232 #endif
2233         QWidget *that = const_cast<QWidget*>(this);
2234         that->setAttribute(Qt::WA_NativeWindow);
2235         that->d_func()->createWinId();
2236         return that->data->winid;
2237     }
2238     return data->winid;
2239 }
2240
2241
2242 void QWidgetPrivate::createWinId(WId winid)
2243 {
2244     Q_Q(QWidget);
2245
2246 #ifdef ALIEN_DEBUG
2247     qDebug() << "QWidgetPrivate::createWinId for" << q << winid;
2248 #endif
2249     const bool forceNativeWindow = q->testAttribute(Qt::WA_NativeWindow);
2250     if (!q->testAttribute(Qt::WA_WState_Created) || (forceNativeWindow && !q->internalWinId())) {
2251         if (!q->isWindow()) {
2252             QWidget *parent = q->parentWidget();
2253             QWidgetPrivate *pd = parent->d_func();
2254             if (forceNativeWindow && !q->testAttribute(Qt::WA_DontCreateNativeAncestors))
2255                 parent->setAttribute(Qt::WA_NativeWindow);
2256             if (!parent->internalWinId()) {
2257                 pd->createWinId();
2258             }
2259
2260             for (int i = 0; i < pd->children.size(); ++i) {
2261                 QWidget *w = qobject_cast<QWidget *>(pd->children.at(i));
2262                 if (w && !w->isWindow() && (!w->testAttribute(Qt::WA_WState_Created)
2263                                             || (!w->internalWinId() && w->testAttribute(Qt::WA_NativeWindow)))) {
2264                     if (w!=q) {
2265                         w->create();
2266                     } else {
2267                         w->create(winid);
2268                         // if the window has already been created, we
2269                         // need to raise it to its proper stacking position
2270                         if (winid)
2271                             w->raise();
2272                     }
2273                 }
2274             }
2275         } else {
2276             q->create();
2277         }
2278     }
2279 }
2280
2281
2282 /*!
2283 \internal
2284 Ensures that the widget has a window system identifier, i.e. that it is known to the windowing system.
2285
2286 */
2287
2288 void QWidget::createWinId()
2289 {
2290     Q_D(QWidget);
2291 #ifdef ALIEN_DEBUG
2292     qDebug()  << "QWidget::createWinId" << this;
2293 #endif
2294 //    qWarning("QWidget::createWinId is obsolete, please fix your code.");
2295     d->createWinId();
2296 }
2297
2298 /*!
2299     \since 4.4
2300
2301     Returns the effective window system identifier of the widget, i.e. the
2302     native parent's window system identifier.
2303
2304     If the widget is native, this function returns the native widget ID.
2305     Otherwise, the window ID of the first native parent widget, i.e., the
2306     top-level widget that contains this widget, is returned.
2307
2308     \note We recommend that you do not store this value as it is likely to
2309     change at run-time.
2310
2311     \sa nativeParentWidget()
2312 */
2313 WId QWidget::effectiveWinId() const
2314 {
2315     WId id = internalWinId();
2316     if (id || !testAttribute(Qt::WA_WState_Created))
2317         return id;
2318     QWidget *realParent = nativeParentWidget();
2319     if (!realParent && d_func()->inSetParent) {
2320         // In transitional state. This is really just a workaround. The real problem
2321         // is that QWidgetPrivate::setParent_sys (platform specific code) first sets
2322         // the window id to 0 (setWinId(0)) before it sets the Qt::WA_WState_Created
2323         // attribute to false. The correct way is to do it the other way around, and
2324         // in that case the Qt::WA_WState_Created logic above will kick in and
2325         // return 0 whenever the widget is in a transitional state. However, changing
2326         // the original logic for all platforms is far more intrusive and might
2327         // break existing applications.
2328         // Note: The widget can only be in a transitional state when changing its
2329         // parent -- everything else is an internal error -- hence explicitly checking
2330         // against 'inSetParent' rather than doing an unconditional return whenever
2331         // 'realParent' is 0 (which may cause strange artifacts and headache later).
2332         return 0;
2333     }
2334     // This widget *must* have a native parent widget.
2335     Q_ASSERT(realParent);
2336     Q_ASSERT(realParent->internalWinId());
2337     return realParent->internalWinId();
2338 }
2339
2340 #ifndef QT_NO_STYLE_STYLESHEET
2341
2342 /*!
2343     \property QWidget::styleSheet
2344     \brief the widget's style sheet
2345     \since 4.2
2346
2347     The style sheet contains a textual description of customizations to the
2348     widget's style, as described in the \l{Qt Style Sheets} document.
2349
2350     Since Qt 4.5, Qt style sheets fully supports Mac OS X.
2351
2352     \warning Qt style sheets are currently not supported for custom QStyle
2353     subclasses. We plan to address this in some future release.
2354
2355     \sa setStyle(), QApplication::styleSheet, {Qt Style Sheets}
2356 */
2357 QString QWidget::styleSheet() const
2358 {
2359     Q_D(const QWidget);
2360     if (!d->extra)
2361         return QString();
2362     return d->extra->styleSheet;
2363 }
2364
2365 void QWidget::setStyleSheet(const QString& styleSheet)
2366 {
2367     Q_D(QWidget);
2368     d->createExtra();
2369
2370     QStyleSheetStyle *proxy = qobject_cast<QStyleSheetStyle *>(d->extra->style);
2371     d->extra->styleSheet = styleSheet;
2372     if (styleSheet.isEmpty()) { // stylesheet removed
2373         if (!proxy)
2374             return;
2375
2376         d->inheritStyle();
2377         return;
2378     }
2379
2380     if (proxy) { // style sheet update
2381         proxy->repolish(this);
2382         return;
2383     }
2384
2385     if (testAttribute(Qt::WA_SetStyle)) {
2386         d->setStyle_helper(new QStyleSheetStyle(d->extra->style), true);
2387     } else {
2388         d->setStyle_helper(new QStyleSheetStyle(0), true);
2389     }
2390 }
2391
2392 #endif // QT_NO_STYLE_STYLESHEET
2393
2394 /*!
2395     \sa QWidget::setStyle(), QApplication::setStyle(), QApplication::style()
2396 */
2397
2398 QStyle *QWidget::style() const
2399 {
2400     Q_D(const QWidget);
2401
2402     if (d->extra && d->extra->style)
2403         return d->extra->style;
2404     return QApplication::style();
2405 }
2406
2407 /*!
2408     Sets the widget's GUI style to \a style. The ownership of the style
2409     object is not transferred.
2410
2411     If no style is set, the widget uses the application's style,
2412     QApplication::style() instead.
2413
2414     Setting a widget's style has no effect on existing or future child
2415     widgets.
2416
2417     \warning This function is particularly useful for demonstration
2418     purposes, where you want to show Qt's styling capabilities. Real
2419     applications should avoid it and use one consistent GUI style
2420     instead.
2421
2422     \warning Qt style sheets are currently not supported for custom QStyle
2423     subclasses. We plan to address this in some future release.
2424
2425     \sa style(), QStyle, QApplication::style(), QApplication::setStyle()
2426 */
2427
2428 void QWidget::setStyle(QStyle *style)
2429 {
2430     Q_D(QWidget);
2431     setAttribute(Qt::WA_SetStyle, style != 0);
2432     d->createExtra();
2433 #ifndef QT_NO_STYLE_STYLESHEET
2434     if (QStyleSheetStyle *proxy = qobject_cast<QStyleSheetStyle *>(style)) {
2435         //if for some reason someone try to set a QStyleSheetStyle, ref it
2436         //(this may happen for exemple in QButtonDialogBox which propagates its style)
2437         proxy->ref();
2438         d->setStyle_helper(style, false);
2439     } else if (qobject_cast<QStyleSheetStyle *>(d->extra->style) || !qApp->styleSheet().isEmpty()) {
2440         // if we have an application stylesheet or have a proxy already, propagate
2441         d->setStyle_helper(new QStyleSheetStyle(style), true);
2442     } else
2443 #endif
2444         d->setStyle_helper(style, false);
2445 }
2446
2447 void QWidgetPrivate::setStyle_helper(QStyle *newStyle, bool propagate, bool
2448 #ifdef Q_WS_MAC
2449         metalHack
2450 #endif
2451         )
2452 {
2453     Q_Q(QWidget);
2454     QStyle *oldStyle  = q->style();
2455 #ifndef QT_NO_STYLE_STYLESHEET
2456     QWeakPointer<QStyle> origStyle;
2457 #endif
2458
2459 #ifdef Q_WS_MAC
2460     // the metalhack boolean allows Qt/Mac to do a proper re-polish depending
2461     // on how the Qt::WA_MacBrushedMetal attribute is set. It is only ever
2462     // set when changing that attribute and passes the widget's CURRENT style.
2463     // therefore no need to do a reassignment.
2464     if (!metalHack)
2465 #endif
2466     {
2467         createExtra();
2468
2469 #ifndef QT_NO_STYLE_STYLESHEET
2470         origStyle = extra->style.data();
2471 #endif
2472         extra->style = newStyle;
2473     }
2474
2475     // repolish
2476     if (q->windowType() != Qt::Desktop) {
2477         if (polished) {
2478             oldStyle->unpolish(q);
2479 #ifdef Q_WS_MAC
2480             if (metalHack)
2481                 macUpdateMetalAttribute();
2482 #endif
2483             q->style()->polish(q);
2484 #ifdef Q_WS_MAC
2485         } else if (metalHack) {
2486             macUpdateMetalAttribute();
2487 #endif
2488         }
2489     }
2490
2491     if (propagate) {
2492         for (int i = 0; i < children.size(); ++i) {
2493             QWidget *c = qobject_cast<QWidget*>(children.at(i));
2494             if (c)
2495                 c->d_func()->inheritStyle();
2496         }
2497     }
2498
2499 #ifndef QT_NO_STYLE_STYLESHEET
2500     if (!qobject_cast<QStyleSheetStyle*>(newStyle)) {
2501         if (const QStyleSheetStyle* cssStyle = qobject_cast<QStyleSheetStyle*>(origStyle.data())) {
2502             cssStyle->clearWidgetFont(q);
2503         }
2504     }
2505 #endif
2506
2507     QEvent e(QEvent::StyleChange);
2508     QApplication::sendEvent(q, &e);
2509
2510 #ifndef QT_NO_STYLE_STYLESHEET
2511     // dereference the old stylesheet style
2512     if (QStyleSheetStyle *proxy = qobject_cast<QStyleSheetStyle *>(origStyle.data()))
2513         proxy->deref();
2514 #endif
2515 }
2516
2517 // Inherits style from the current parent and propagates it as necessary
2518 void QWidgetPrivate::inheritStyle()
2519 {
2520 #ifndef QT_NO_STYLE_STYLESHEET
2521     Q_Q(QWidget);
2522
2523     QStyleSheetStyle *proxy = extra ? qobject_cast<QStyleSheetStyle *>(extra->style) : 0;
2524
2525     if (!q->styleSheet().isEmpty()) {
2526         Q_ASSERT(proxy);
2527         proxy->repolish(q);
2528         return;
2529     }
2530
2531     QStyle *origStyle = proxy ? proxy->base : (extra ? (QStyle*)extra->style : 0);
2532     QWidget *parent = q->parentWidget();
2533     QStyle *parentStyle = (parent && parent->d_func()->extra) ? (QStyle*)parent->d_func()->extra->style : 0;
2534     // If we have stylesheet on app or parent has stylesheet style, we need
2535     // to be running a proxy
2536     if (!qApp->styleSheet().isEmpty() || qobject_cast<QStyleSheetStyle *>(parentStyle)) {
2537         QStyle *newStyle = parentStyle;
2538         if (q->testAttribute(Qt::WA_SetStyle))
2539             newStyle = new QStyleSheetStyle(origStyle);
2540         else if (QStyleSheetStyle *newProxy = qobject_cast<QStyleSheetStyle *>(parentStyle))
2541             newProxy->ref();
2542
2543         setStyle_helper(newStyle, true);
2544         return;
2545     }
2546
2547     // So, we have no stylesheet on parent/app and we have an empty stylesheet
2548     // we just need our original style back
2549     if (origStyle == (extra ? (QStyle*)extra->style : 0)) // is it any different?
2550         return;
2551
2552     // We could have inherited the proxy from our parent (which has a custom style)
2553     // In such a case we need to start following the application style (i.e revert
2554     // the propagation behavior of QStyleSheetStyle)
2555     if (!q->testAttribute(Qt::WA_SetStyle))
2556         origStyle = 0;
2557
2558     setStyle_helper(origStyle, true);
2559 #endif // QT_NO_STYLE_STYLESHEET
2560 }
2561
2562
2563 /*!
2564     \fn bool QWidget::isWindow() const
2565
2566     Returns true if the widget is an independent window, otherwise
2567     returns false.
2568
2569     A window is a widget that isn't visually the child of any other
2570     widget and that usually has a frame and a
2571     \l{QWidget::setWindowTitle()}{window title}.
2572
2573     A window can have a \l{QWidget::parentWidget()}{parent widget}.
2574     It will then be grouped with its parent and deleted when the
2575     parent is deleted, minimized when the parent is minimized etc. If
2576     supported by the window manager, it will also have a common
2577     taskbar entry with its parent.
2578
2579     QDialog and QMainWindow widgets are by default windows, even if a
2580     parent widget is specified in the constructor. This behavior is
2581     specified by the Qt::Window flag.
2582
2583     \sa window(), isModal(), parentWidget()
2584 */
2585
2586 /*!
2587     \property QWidget::modal
2588     \brief whether the widget is a modal widget
2589
2590     This property only makes sense for windows. A modal widget
2591     prevents widgets in all other windows from getting any input.
2592
2593     By default, this property is false.
2594
2595     \sa isWindow(), windowModality, QDialog
2596 */
2597
2598 /*!
2599     \property QWidget::windowModality
2600     \brief which windows are blocked by the modal widget
2601     \since 4.1
2602
2603     This property only makes sense for windows. A modal widget
2604     prevents widgets in other windows from getting input. The value of
2605     this property controls which windows are blocked when the widget
2606     is visible. Changing this property while the window is visible has
2607     no effect; you must hide() the widget first, then show() it again.
2608
2609     By default, this property is Qt::NonModal.
2610
2611     \sa isWindow(), QWidget::modal, QDialog
2612 */
2613
2614 Qt::WindowModality QWidget::windowModality() const
2615 {
2616     return static_cast<Qt::WindowModality>(data->window_modality);
2617 }
2618
2619 void QWidget::setWindowModality(Qt::WindowModality windowModality)
2620 {
2621     data->window_modality = windowModality;
2622     // setModal_sys() will be called by setAttribute()
2623     setAttribute(Qt::WA_ShowModal, (data->window_modality != Qt::NonModal));
2624     setAttribute(Qt::WA_SetWindowModality, true);
2625 }
2626
2627 /*!
2628     \fn bool QWidget::underMouse() const
2629
2630     Returns true if the widget is under the mouse cursor; otherwise
2631     returns false.
2632
2633     This value is not updated properly during drag and drop
2634     operations.
2635
2636     \sa enterEvent(), leaveEvent()
2637 */
2638
2639 /*!
2640     \property QWidget::minimized
2641     \brief whether this widget is minimized (iconified)
2642
2643     This property is only relevant for windows.
2644
2645     By default, this property is false.
2646
2647     \sa showMinimized(), visible, show(), hide(), showNormal(), maximized
2648 */
2649 bool QWidget::isMinimized() const
2650 { return data->window_state & Qt::WindowMinimized; }
2651
2652 /*!
2653     Shows the widget minimized, as an icon.
2654
2655     Calling this function only affects \l{isWindow()}{windows}.
2656
2657     \sa showNormal(), showMaximized(), show(), hide(), isVisible(),
2658         isMinimized()
2659 */
2660 void QWidget::showMinimized()
2661 {
2662     bool isMin = isMinimized();
2663     if (isMin && isVisible())
2664         return;
2665
2666     ensurePolished();
2667
2668     if (!isMin)
2669         setWindowState((windowState() & ~Qt::WindowActive) | Qt::WindowMinimized);
2670     show();
2671 }
2672
2673 /*!
2674     \property QWidget::maximized
2675     \brief whether this widget is maximized
2676
2677     This property is only relevant for windows.
2678
2679     \note Due to limitations on some window systems, this does not always
2680     report the expected results (e.g., if the user on X11 maximizes the
2681     window via the window manager, Qt has no way of distinguishing this
2682     from any other resize). This is expected to improve as window manager
2683     protocols evolve.
2684
2685     By default, this property is false.
2686
2687     \sa windowState(), showMaximized(), visible, show(), hide(), showNormal(), minimized
2688 */
2689 bool QWidget::isMaximized() const
2690 { return data->window_state & Qt::WindowMaximized; }
2691
2692
2693
2694 /*!
2695     Returns the current window state. The window state is a OR'ed
2696     combination of Qt::WindowState: Qt::WindowMinimized,
2697     Qt::WindowMaximized, Qt::WindowFullScreen, and Qt::WindowActive.
2698
2699   \sa Qt::WindowState setWindowState()
2700  */
2701 Qt::WindowStates QWidget::windowState() const
2702 {
2703     return Qt::WindowStates(data->window_state);
2704 }
2705
2706 /*!\internal
2707
2708    The function sets the window state on child widgets similar to
2709    setWindowState(). The difference is that the window state changed
2710    event has the isOverride() flag set. It exists mainly to keep
2711    QWorkspace working.
2712  */
2713 void QWidget::overrideWindowState(Qt::WindowStates newstate)
2714 {
2715     QWindowStateChangeEvent e(Qt::WindowStates(data->window_state), true);
2716     data->window_state  = newstate;
2717     QApplication::sendEvent(this, &e);
2718 }
2719
2720 /*!
2721     \fn void QWidget::setWindowState(Qt::WindowStates windowState)
2722
2723     Sets the window state to \a windowState. The window state is a OR'ed
2724     combination of Qt::WindowState: Qt::WindowMinimized,
2725     Qt::WindowMaximized, Qt::WindowFullScreen, and Qt::WindowActive.
2726
2727     If the window is not visible (i.e. isVisible() returns false), the
2728     window state will take effect when show() is called. For visible
2729     windows, the change is immediate. For example, to toggle between
2730     full-screen and normal mode, use the following code:
2731
2732     \snippet doc/src/snippets/code/src_gui_kernel_qwidget.cpp 0
2733
2734     In order to restore and activate a minimized window (while
2735     preserving its maximized and/or full-screen state), use the following:
2736
2737     \snippet doc/src/snippets/code/src_gui_kernel_qwidget.cpp 1
2738
2739     Calling this function will hide the widget. You must call show() to make
2740     the widget visible again.
2741
2742     \note On some window systems Qt::WindowActive is not immediate, and may be
2743     ignored in certain cases.
2744
2745     When the window state changes, the widget receives a changeEvent()
2746     of type QEvent::WindowStateChange.
2747
2748     \sa Qt::WindowState windowState()
2749 */
2750
2751 /*!
2752     \property QWidget::fullScreen
2753     \brief whether the widget is shown in full screen mode
2754
2755     A widget in full screen mode occupies the whole screen area and does not
2756     display window decorations, such as a title bar.
2757
2758     By default, this property is false.
2759
2760     \sa windowState(), minimized, maximized
2761 */
2762 bool QWidget::isFullScreen() const
2763 { return data->window_state & Qt::WindowFullScreen; }
2764
2765 /*!
2766     Shows the widget in full-screen mode.
2767
2768     Calling this function only affects \l{isWindow()}{windows}.
2769
2770     To return from full-screen mode, call showNormal().
2771
2772     Full-screen mode works fine under Windows, but has certain
2773     problems under X. These problems are due to limitations of the
2774     ICCCM protocol that specifies the communication between X11
2775     clients and the window manager. ICCCM simply does not understand
2776     the concept of non-decorated full-screen windows. Therefore, the
2777     best we can do is to request a borderless window and place and
2778     resize it to fill the entire screen. Depending on the window
2779     manager, this may or may not work. The borderless window is
2780     requested using MOTIF hints, which are at least partially
2781     supported by virtually all modern window managers.
2782
2783     An alternative would be to bypass the window manager entirely and
2784     create a window with the Qt::X11BypassWindowManagerHint flag. This
2785     has other severe problems though, like totally broken keyboard focus
2786     and very strange effects on desktop changes or when the user raises
2787     other windows.
2788
2789     X11 window managers that follow modern post-ICCCM specifications
2790     support full-screen mode properly.
2791
2792     \sa showNormal(), showMaximized(), show(), hide(), isVisible()
2793 */
2794 void QWidget::showFullScreen()
2795 {
2796 #ifdef Q_WS_MAC
2797     // If the unified toolbar is enabled, we have to disable it before going fullscreen.
2798     QMainWindow *mainWindow = qobject_cast<QMainWindow*>(this);
2799     if (mainWindow && mainWindow->unifiedTitleAndToolBarOnMac()) {
2800         mainWindow->setUnifiedTitleAndToolBarOnMac(false);
2801         QMainWindowLayout *mainLayout = qobject_cast<QMainWindowLayout*>(mainWindow->layout());
2802         mainLayout->activateUnifiedToolbarAfterFullScreen = true;
2803     }
2804 #endif // Q_WS_MAC
2805     ensurePolished();
2806
2807     setWindowState((windowState() & ~(Qt::WindowMinimized | Qt::WindowMaximized))
2808                    | Qt::WindowFullScreen);
2809     show();
2810     activateWindow();
2811 }
2812
2813 /*!
2814     Shows the widget maximized.
2815
2816     Calling this function only affects \l{isWindow()}{windows}.
2817
2818     On X11, this function may not work properly with certain window
2819     managers. See the \l{Window Geometry} documentation for an explanation.
2820
2821     \sa setWindowState(), showNormal(), showMinimized(), show(), hide(), isVisible()
2822 */
2823 void QWidget::showMaximized()
2824 {
2825     ensurePolished();
2826
2827     setWindowState((windowState() & ~(Qt::WindowMinimized | Qt::WindowFullScreen))
2828                    | Qt::WindowMaximized);
2829 #ifdef Q_WS_MAC
2830     // If the unified toolbar was enabled before going fullscreen, we have to enable it back.
2831     QMainWindow *mainWindow = qobject_cast<QMainWindow*>(this);
2832     if (mainWindow)
2833     {
2834         QMainWindowLayout *mainLayout = qobject_cast<QMainWindowLayout*>(mainWindow->layout());
2835         if (mainLayout->activateUnifiedToolbarAfterFullScreen) {
2836             mainWindow->setUnifiedTitleAndToolBarOnMac(true);
2837             mainLayout->activateUnifiedToolbarAfterFullScreen = false;
2838         }
2839     }
2840 #endif // Q_WS_MAC
2841     show();
2842 }
2843
2844 /*!
2845     Restores the widget after it has been maximized or minimized.
2846
2847     Calling this function only affects \l{isWindow()}{windows}.
2848
2849     \sa setWindowState(), showMinimized(), showMaximized(), show(), hide(), isVisible()
2850 */
2851 void QWidget::showNormal()
2852 {
2853     ensurePolished();
2854
2855     setWindowState(windowState() & ~(Qt::WindowMinimized
2856                                      | Qt::WindowMaximized
2857                                      | Qt::WindowFullScreen));
2858 #ifdef Q_WS_MAC
2859     // If the unified toolbar was enabled before going fullscreen, we have to enable it back.
2860     QMainWindow *mainWindow = qobject_cast<QMainWindow*>(this);
2861     if (mainWindow)
2862     {
2863         QMainWindowLayout *mainLayout = qobject_cast<QMainWindowLayout*>(mainWindow->layout());
2864         if (mainLayout->activateUnifiedToolbarAfterFullScreen) {
2865             mainWindow->setUnifiedTitleAndToolBarOnMac(true);
2866             mainLayout->activateUnifiedToolbarAfterFullScreen = false;
2867         }
2868     }
2869 #endif // Q_WS_MAC
2870     show();
2871 }
2872
2873 /*!
2874     Returns true if this widget would become enabled if \a ancestor is
2875     enabled; otherwise returns false.
2876
2877
2878
2879     This is the case if neither the widget itself nor every parent up
2880     to but excluding \a ancestor has been explicitly disabled.
2881
2882     isEnabledTo(0) is equivalent to isEnabled().
2883
2884     \sa setEnabled() enabled
2885 */
2886
2887 bool QWidget::isEnabledTo(QWidget* ancestor) const
2888 {
2889     const QWidget * w = this;
2890     while (!w->testAttribute(Qt::WA_ForceDisabled)
2891             && !w->isWindow()
2892             && w->parentWidget()
2893             && w->parentWidget() != ancestor)
2894         w = w->parentWidget();
2895     return !w->testAttribute(Qt::WA_ForceDisabled);
2896 }
2897
2898 #ifndef QT_NO_ACTION
2899 /*!
2900     Appends the action \a action to this widget's list of actions.
2901
2902     All QWidgets have a list of \l{QAction}s, however they can be
2903     represented graphically in many different ways. The default use of
2904     the QAction list (as returned by actions()) is to create a context
2905     QMenu.
2906
2907     A QWidget should only have one of each action and adding an action
2908     it already has will not cause the same action to be in the widget twice.
2909
2910     The ownership of \a action is not transferred to this QWidget.
2911
2912     \sa removeAction(), insertAction(), actions(), QMenu
2913 */
2914 void QWidget::addAction(QAction *action)
2915 {
2916     insertAction(0, action);
2917 }
2918
2919 /*!
2920     Appends the actions \a actions to this widget's list of actions.
2921
2922     \sa removeAction(), QMenu, addAction()
2923 */
2924 void QWidget::addActions(QList<QAction*> actions)
2925 {
2926     for(int i = 0; i < actions.count(); i++)
2927         insertAction(0, actions.at(i));
2928 }
2929
2930 /*!
2931     Inserts the action \a action to this widget's list of actions,
2932     before the action \a before. It appends the action if \a before is 0 or
2933     \a before is not a valid action for this widget.
2934
2935     A QWidget should only have one of each action.
2936
2937     \sa removeAction(), addAction(), QMenu, contextMenuPolicy, actions()
2938 */
2939 void QWidget::insertAction(QAction *before, QAction *action)
2940 {
2941     if(!action) {
2942         qWarning("QWidget::insertAction: Attempt to insert null action");
2943         return;
2944     }
2945
2946     Q_D(QWidget);
2947     if(d->actions.contains(action))
2948         removeAction(action);
2949
2950     int pos = d->actions.indexOf(before);
2951     if (pos < 0) {
2952         before = 0;
2953         pos = d->actions.size();
2954     }
2955     d->actions.insert(pos, action);
2956
2957     QActionPrivate *apriv = action->d_func();
2958     apriv->widgets.append(this);
2959
2960     QActionEvent e(QEvent::ActionAdded, action, before);
2961     QApplication::sendEvent(this, &e);
2962 }
2963
2964 /*!
2965     Inserts the actions \a actions to this widget's list of actions,
2966     before the action \a before. It appends the action if \a before is 0 or
2967     \a before is not a valid action for this widget.
2968
2969     A QWidget can have at most one of each action.
2970
2971     \sa removeAction(), QMenu, insertAction(), contextMenuPolicy
2972 */
2973 void QWidget::insertActions(QAction *before, QList<QAction*> actions)
2974 {
2975     for(int i = 0; i < actions.count(); ++i)
2976         insertAction(before, actions.at(i));
2977 }
2978
2979 /*!
2980     Removes the action \a action from this widget's list of actions.
2981     \sa insertAction(), actions(), insertAction()
2982 */
2983 void QWidget::removeAction(QAction *action)
2984 {
2985     if (!action)
2986         return;
2987
2988     Q_D(QWidget);
2989
2990     QActionPrivate *apriv = action->d_func();
2991     apriv->widgets.removeAll(this);
2992
2993     if (d->actions.removeAll(action)) {
2994         QActionEvent e(QEvent::ActionRemoved, action);
2995         QApplication::sendEvent(this, &e);
2996     }
2997 }
2998
2999 /*!
3000     Returns the (possibly empty) list of this widget's actions.
3001
3002     \sa contextMenuPolicy, insertAction(), removeAction()
3003 */
3004 QList<QAction*> QWidget::actions() const
3005 {
3006     Q_D(const QWidget);
3007     return d->actions;
3008 }
3009 #endif // QT_NO_ACTION
3010
3011 /*!
3012   \fn bool QWidget::isEnabledToTLW() const
3013   \obsolete
3014
3015   This function is deprecated. It is equivalent to isEnabled()
3016 */
3017
3018 /*!
3019     \property QWidget::enabled
3020     \brief whether the widget is enabled
3021
3022     In general an enabled widget handles keyboard and mouse events; a disabled
3023     widget does not. An exception is made with \l{QAbstractButton}.
3024
3025     Some widgets display themselves differently when they are
3026     disabled. For example a button might draw its label grayed out. If
3027     your widget needs to know when it becomes enabled or disabled, you
3028     can use the changeEvent() with type QEvent::EnabledChange.
3029
3030     Disabling a widget implicitly disables all its children. Enabling
3031     respectively enables all child widgets unless they have been
3032     explicitly disabled.
3033
3034     By default, this property is true.
3035
3036     \sa isEnabledTo(), QKeyEvent, QMouseEvent, changeEvent()
3037 */
3038 void QWidget::setEnabled(bool enable)
3039 {
3040     Q_D(QWidget);
3041     setAttribute(Qt::WA_ForceDisabled, !enable);
3042     d->setEnabled_helper(enable);
3043 }
3044
3045 void QWidgetPrivate::setEnabled_helper(bool enable)
3046 {
3047     Q_Q(QWidget);
3048
3049     if (enable && !q->isWindow() && q->parentWidget() && !q->parentWidget()->isEnabled())
3050         return; // nothing we can do
3051
3052     if (enable != q->testAttribute(Qt::WA_Disabled))
3053         return; // nothing to do
3054
3055     q->setAttribute(Qt::WA_Disabled, !enable);
3056     updateSystemBackground();
3057
3058     if (!enable && q->window()->focusWidget() == q) {
3059         bool parentIsEnabled = (!q->parentWidget() || q->parentWidget()->isEnabled());
3060         if (!parentIsEnabled || !q->focusNextChild())
3061             q->clearFocus();
3062     }
3063
3064     Qt::WidgetAttribute attribute = enable ? Qt::WA_ForceDisabled : Qt::WA_Disabled;
3065     for (int i = 0; i < children.size(); ++i) {
3066         QWidget *w = qobject_cast<QWidget *>(children.at(i));
3067         if (w && !w->testAttribute(attribute))
3068             w->d_func()->setEnabled_helper(enable);
3069     }
3070 #if defined(Q_WS_X11)
3071     if (q->testAttribute(Qt::WA_SetCursor) || q->isWindow()) {
3072         // enforce the windows behavior of clearing the cursor on
3073         // disabled widgets
3074         qt_x11_enforce_cursor(q);
3075     }
3076 #endif
3077     if (q->testAttribute(Qt::WA_SetCursor) || q->isWindow()) {
3078         // enforce the windows behavior of clearing the cursor on
3079         // disabled widgets
3080         qt_qpa_set_cursor(q, false);
3081     }
3082 #if defined(Q_WS_MAC)
3083     setEnabled_helper_sys(enable);
3084 #endif
3085 #ifndef QT_NO_IM
3086     if (q->testAttribute(Qt::WA_InputMethodEnabled) && q->hasFocus()) {
3087         QWidget *focusWidget = effectiveFocusWidget();
3088
3089         if (enable) {
3090             if (focusWidget->testAttribute(Qt::WA_InputMethodEnabled))
3091                 qApp->inputMethod()->update(Qt::ImEnabled);
3092         } else {
3093             qApp->inputMethod()->reset();
3094             qApp->inputMethod()->update(Qt::ImEnabled);
3095         }
3096     }
3097 #endif //QT_NO_IM
3098     QEvent e(QEvent::EnabledChange);
3099     QApplication::sendEvent(q, &e);
3100 }
3101
3102 /*!
3103     \property QWidget::acceptDrops
3104     \brief whether drop events are enabled for this widget
3105
3106     Setting this property to true announces to the system that this
3107     widget \e may be able to accept drop events.
3108
3109     If the widget is the desktop (windowType() == Qt::Desktop), this may
3110     fail if another application is using the desktop; you can call
3111     acceptDrops() to test if this occurs.
3112
3113     \warning Do not modify this property in a drag and drop event handler.
3114
3115     By default, this property is false.
3116
3117     \sa {Drag and Drop}
3118 */
3119 bool QWidget::acceptDrops() const
3120 {
3121     return testAttribute(Qt::WA_AcceptDrops);
3122 }
3123
3124 void QWidget::setAcceptDrops(bool on)
3125 {
3126     setAttribute(Qt::WA_AcceptDrops, on);
3127
3128 }
3129
3130
3131 /*!
3132     Disables widget input events if \a disable is true; otherwise
3133     enables input events.
3134
3135     See the \l enabled documentation for more information.
3136
3137     \sa isEnabledTo(), QKeyEvent, QMouseEvent, changeEvent()
3138 */
3139 void QWidget::setDisabled(bool disable)
3140 {
3141     setEnabled(!disable);
3142 }
3143
3144 /*!
3145     \property QWidget::frameGeometry
3146     \brief geometry of the widget relative to its parent including any
3147     window frame
3148
3149     See the \l{Window Geometry} documentation for an overview of geometry
3150     issues with windows.
3151
3152     By default, this property contains a value that depends on the user's
3153     platform and screen geometry.
3154
3155     \sa geometry() x() y() pos()
3156 */
3157 QRect QWidget::frameGeometry() const
3158 {
3159     Q_D(const QWidget);
3160     if (isWindow() && ! (windowType() == Qt::Popup)) {
3161         QRect fs = d->frameStrut();
3162         return QRect(data->crect.x() - fs.left(),
3163                      data->crect.y() - fs.top(),
3164                      data->crect.width() + fs.left() + fs.right(),
3165                      data->crect.height() + fs.top() + fs.bottom());
3166     }
3167     return data->crect;
3168 }
3169
3170 /*!
3171     \property QWidget::x
3172
3173     \brief the x coordinate of the widget relative to its parent including
3174     any window frame
3175
3176     See the \l{Window Geometry} documentation for an overview of geometry
3177     issues with windows.
3178
3179     By default, this property has a value of 0.
3180
3181     \sa frameGeometry, y, pos
3182 */
3183 int QWidget::x() const
3184 {
3185     Q_D(const QWidget);
3186     if (isWindow() && ! (windowType() == Qt::Popup))
3187         return data->crect.x() - d->frameStrut().left();
3188     return data->crect.x();
3189 }
3190
3191 /*!
3192     \property QWidget::y
3193     \brief the y coordinate of the widget relative to its parent and
3194     including any window frame
3195
3196     See the \l{Window Geometry} documentation for an overview of geometry
3197     issues with windows.
3198
3199     By default, this property has a value of 0.
3200
3201     \sa frameGeometry, x, pos
3202 */
3203 int QWidget::y() const
3204 {
3205     Q_D(const QWidget);
3206     if (isWindow() && ! (windowType() == Qt::Popup))
3207         return data->crect.y() - d->frameStrut().top();
3208     return data->crect.y();
3209 }
3210
3211 /*!
3212     \property QWidget::pos
3213     \brief the position of the widget within its parent widget
3214
3215     If the widget is a window, the position is that of the widget on
3216     the desktop, including its frame.
3217
3218     When changing the position, the widget, if visible, receives a
3219     move event (moveEvent()) immediately. If the widget is not
3220     currently visible, it is guaranteed to receive an event before it
3221     is shown.
3222
3223     By default, this property contains a position that refers to the
3224     origin.
3225
3226     \warning Calling move() or setGeometry() inside moveEvent() can
3227     lead to infinite recursion.
3228
3229     See the \l{Window Geometry} documentation for an overview of geometry
3230     issues with windows.
3231
3232     \sa frameGeometry, size x(), y()
3233 */
3234 QPoint QWidget::pos() const
3235 {
3236     Q_D(const QWidget);
3237     if (isWindow() && ! (windowType() == Qt::Popup)) {
3238         QRect fs = d->frameStrut();
3239         return QPoint(data->crect.x() - fs.left(), data->crect.y() - fs.top());
3240     }
3241     return data->crect.topLeft();
3242 }
3243
3244 /*!
3245     \property QWidget::geometry
3246     \brief the geometry of the widget relative to its parent and
3247     excluding the window frame
3248
3249     When changing the geometry, the widget, if visible, receives a
3250     move event (moveEvent()) and/or a resize event (resizeEvent())
3251     immediately. If the widget is not currently visible, it is
3252     guaranteed to receive appropriate events before it is shown.
3253
3254     The size component is adjusted if it lies outside the range
3255     defined by minimumSize() and maximumSize().
3256
3257     \warning Calling setGeometry() inside resizeEvent() or moveEvent()
3258     can lead to infinite recursion.
3259
3260     See the \l{Window Geometry} documentation for an overview of geometry
3261     issues with windows.
3262
3263     By default, this property contains a value that depends on the user's
3264     platform and screen geometry.
3265
3266     \sa frameGeometry(), rect(), move(), resize(), moveEvent(),
3267         resizeEvent(), minimumSize(), maximumSize()
3268 */
3269
3270 /*!
3271     \property QWidget::normalGeometry
3272
3273     \brief the geometry of the widget as it will appear when shown as
3274     a normal (not maximized or full screen) top-level widget
3275
3276     For child widgets this property always holds an empty rectangle.
3277
3278     By default, this property contains an empty rectangle.
3279
3280     \sa QWidget::windowState(), QWidget::geometry
3281 */
3282
3283 /*!
3284     \property QWidget::size
3285     \brief the size of the widget excluding any window frame
3286
3287     If the widget is visible when it is being resized, it receives a resize event
3288     (resizeEvent()) immediately. If the widget is not currently
3289     visible, it is guaranteed to receive an event before it is shown.
3290
3291     The size is adjusted if it lies outside the range defined by
3292     minimumSize() and maximumSize().
3293
3294     By default, this property contains a value that depends on the user's
3295     platform and screen geometry.
3296
3297     \warning Calling resize() or setGeometry() inside resizeEvent() can
3298     lead to infinite recursion.
3299
3300     \note Setting the size to \c{QSize(0, 0)} will cause the widget to not
3301     appear on screen. This also applies to windows.
3302
3303     \sa pos, geometry, minimumSize, maximumSize, resizeEvent(), adjustSize()
3304 */
3305
3306 /*!
3307     \property QWidget::width
3308     \brief the width of the widget excluding any window frame
3309
3310     See the \l{Window Geometry} documentation for an overview of geometry
3311     issues with windows.
3312
3313     \note Do not use this function to find the width of a screen on
3314     a \l{QDesktopWidget}{multiple screen desktop}. Read
3315     \l{QDesktopWidget#Screen Geometry}{this note} for details.
3316
3317     By default, this property contains a value that depends on the user's
3318     platform and screen geometry.
3319
3320     \sa geometry, height, size
3321 */
3322
3323 /*!
3324     \property QWidget::height
3325     \brief the height of the widget excluding any window frame
3326
3327     See the \l{Window Geometry} documentation for an overview of geometry
3328     issues with windows.
3329
3330     \note Do not use this function to find the height of a screen
3331     on a \l{QDesktopWidget}{multiple screen desktop}. Read
3332     \l{QDesktopWidget#Screen Geometry}{this note} for details.
3333
3334     By default, this property contains a value that depends on the user's
3335     platform and screen geometry.
3336
3337     \sa geometry, width, size
3338 */
3339
3340 /*!
3341     \property QWidget::rect
3342     \brief the internal geometry of the widget excluding any window
3343     frame
3344
3345     The rect property equals QRect(0, 0, width(), height()).
3346
3347     See the \l{Window Geometry} documentation for an overview of geometry
3348     issues with windows.
3349
3350     By default, this property contains a value that depends on the user's
3351     platform and screen geometry.
3352
3353     \sa size
3354 */
3355
3356
3357 QRect QWidget::normalGeometry() const
3358 {
3359     Q_D(const QWidget);
3360     if (!d->extra || !d->extra->topextra)
3361         return QRect();
3362
3363     if (!isMaximized() && !isFullScreen())
3364         return geometry();
3365
3366     return d->topData()->normalGeometry;
3367 }
3368
3369
3370 /*!
3371     \property QWidget::childrenRect
3372     \brief the bounding rectangle of the widget's children
3373
3374     Hidden children are excluded.
3375
3376     By default, for a widget with no children, this property contains a
3377     rectangle with zero width and height located at the origin.
3378
3379     \sa childrenRegion() geometry()
3380 */
3381
3382 QRect QWidget::childrenRect() const
3383 {
3384     Q_D(const QWidget);
3385     QRect r(0, 0, 0, 0);
3386     for (int i = 0; i < d->children.size(); ++i) {
3387         QWidget *w = qobject_cast<QWidget *>(d->children.at(i));
3388         if (w && !w->isWindow() && !w->isHidden())
3389             r |= w->geometry();
3390     }
3391     return r;
3392 }
3393
3394 /*!
3395     \property QWidget::childrenRegion
3396     \brief the combined region occupied by the widget's children
3397
3398     Hidden children are excluded.
3399
3400     By default, for a widget with no children, this property contains an
3401     empty region.
3402
3403     \sa childrenRect() geometry() mask()
3404 */
3405
3406 QRegion QWidget::childrenRegion() const
3407 {
3408     Q_D(const QWidget);
3409     QRegion r;
3410     for (int i = 0; i < d->children.size(); ++i) {
3411         QWidget *w = qobject_cast<QWidget *>(d->children.at(i));
3412         if (w && !w->isWindow() && !w->isHidden()) {
3413             QRegion mask = w->mask();
3414             if (mask.isEmpty())
3415                 r |= w->geometry();
3416             else
3417                 r |= mask.translated(w->pos());
3418         }
3419     }
3420     return r;
3421 }
3422
3423
3424 /*!
3425     \property QWidget::minimumSize
3426     \brief the widget's minimum size
3427
3428     The widget cannot be resized to a smaller size than the minimum
3429     widget size. The widget's size is forced to the minimum size if
3430     the current size is smaller.
3431
3432     The minimum size set by this function will override the minimum size
3433     defined by QLayout. In order to unset the minimum size, use a
3434     value of \c{QSize(0, 0)}.
3435
3436     By default, this property contains a size with zero width and height.
3437
3438     \sa minimumWidth, minimumHeight, maximumSize, sizeIncrement
3439 */
3440
3441 QSize QWidget::minimumSize() const
3442 {
3443     Q_D(const QWidget);
3444     return d->extra ? QSize(d->extra->minw, d->extra->minh) : QSize(0, 0);
3445 }
3446
3447 /*!
3448     \property QWidget::maximumSize
3449     \brief the widget's maximum size in pixels
3450
3451     The widget cannot be resized to a larger size than the maximum
3452     widget size.
3453
3454     By default, this property contains a size in which both width and height
3455     have values of 16777215.
3456
3457     \note The definition of the \c QWIDGETSIZE_MAX macro limits the maximum size
3458     of widgets.
3459
3460     \sa maximumWidth, maximumHeight, minimumSize, sizeIncrement
3461 */
3462
3463 QSize QWidget::maximumSize() const
3464 {
3465     Q_D(const QWidget);
3466     return d->extra ? QSize(d->extra->maxw, d->extra->maxh)
3467                  : QSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX);
3468 }
3469
3470
3471 /*!
3472     \property QWidget::minimumWidth
3473     \brief the widget's minimum width in pixels
3474
3475     This property corresponds to the width held by the \l minimumSize property.
3476
3477     By default, this property has a value of 0.
3478
3479     \sa minimumSize, minimumHeight
3480 */
3481
3482 /*!
3483     \property QWidget::minimumHeight
3484     \brief the widget's minimum height in pixels
3485
3486     This property corresponds to the height held by the \l minimumSize property.
3487
3488     By default, this property has a value of 0.
3489
3490     \sa minimumSize, minimumWidth
3491 */
3492
3493 /*!
3494     \property QWidget::maximumWidth
3495     \brief the widget's maximum width in pixels
3496
3497     This property corresponds to the width held by the \l maximumSize property.
3498
3499     By default, this property contains a value of 16777215.
3500
3501     \note The definition of the \c QWIDGETSIZE_MAX macro limits the maximum size
3502     of widgets.
3503
3504     \sa maximumSize, maximumHeight
3505 */
3506
3507 /*!
3508     \property QWidget::maximumHeight
3509     \brief the widget's maximum height in pixels
3510
3511     This property corresponds to the height held by the \l maximumSize property.
3512
3513     By default, this property contains a value of 16777215.
3514
3515     \note The definition of the \c QWIDGETSIZE_MAX macro limits the maximum size
3516     of widgets.
3517
3518     \sa maximumSize, maximumWidth
3519 */
3520
3521 /*!
3522     \property QWidget::sizeIncrement
3523     \brief the size increment of the widget
3524
3525     When the user resizes the window, the size will move in steps of
3526     sizeIncrement().width() pixels horizontally and
3527     sizeIncrement.height() pixels vertically, with baseSize() as the
3528     basis. Preferred widget sizes are for non-negative integers \e i
3529     and \e j:
3530     \snippet doc/src/snippets/code/src_gui_kernel_qwidget.cpp 2
3531
3532     Note that while you can set the size increment for all widgets, it
3533     only affects windows.
3534
3535     By default, this property contains a size with zero width and height.
3536
3537     \warning The size increment has no effect under Windows, and may
3538     be disregarded by the window manager on X11.
3539
3540     \sa size, minimumSize, maximumSize
3541 */
3542 QSize QWidget::sizeIncrement() const
3543 {
3544     Q_D(const QWidget);
3545     return (d->extra && d->extra->topextra)
3546         ? QSize(d->extra->topextra->incw, d->extra->topextra->inch)
3547         : QSize(0, 0);
3548 }
3549
3550 /*!
3551     \property QWidget::baseSize
3552     \brief the base size of the widget
3553
3554     The base size is used to calculate a proper widget size if the
3555     widget defines sizeIncrement().
3556
3557     By default, for a newly-created widget, this property contains a size with
3558     zero width and height.
3559
3560     \sa setSizeIncrement()
3561 */
3562
3563 QSize QWidget::baseSize() const
3564 {
3565     Q_D(const QWidget);
3566     return (d->extra != 0 && d->extra->topextra != 0)
3567         ? QSize(d->extra->topextra->basew, d->extra->topextra->baseh)
3568         : QSize(0, 0);
3569 }
3570
3571 bool QWidgetPrivate::setMinimumSize_helper(int &minw, int &minh)
3572 {
3573     Q_Q(QWidget);
3574
3575     int mw = minw, mh = minh;
3576     if (mw == QWIDGETSIZE_MAX)
3577         mw = 0;
3578     if (mh == QWIDGETSIZE_MAX)
3579         mh = 0;
3580     if (minw > QWIDGETSIZE_MAX || minh > QWIDGETSIZE_MAX) {
3581         qWarning("QWidget::setMinimumSize: (%s/%s) "
3582                 "The largest allowed size is (%d,%d)",
3583                  q->objectName().toLocal8Bit().data(), q->metaObject()->className(), QWIDGETSIZE_MAX,
3584                 QWIDGETSIZE_MAX);
3585         minw = mw = qMin<int>(minw, QWIDGETSIZE_MAX);
3586         minh = mh = qMin<int>(minh, QWIDGETSIZE_MAX);
3587     }
3588     if (minw < 0 || minh < 0) {
3589         qWarning("QWidget::setMinimumSize: (%s/%s) Negative sizes (%d,%d) "
3590                 "are not possible",
3591                 q->objectName().toLocal8Bit().data(), q->metaObject()->className(), minw, minh);
3592         minw = mw = qMax(minw, 0);
3593         minh = mh = qMax(minh, 0);
3594     }
3595     createExtra();
3596     if (extra->minw == mw && extra->minh == mh)
3597         return false;
3598     extra->minw = mw;
3599     extra->minh = mh;
3600     extra->explicitMinSize = (mw ? Qt::Horizontal : 0) | (mh ? Qt::Vertical : 0);
3601     return true;
3602 }
3603
3604 /*!
3605     \overload
3606
3607     This function corresponds to setMinimumSize(QSize(minw, minh)).
3608     Sets the minimum width to \a minw and the minimum height to \a
3609     minh.
3610 */
3611
3612 void QWidget::setMinimumSize(int minw, int minh)
3613 {
3614     Q_D(QWidget);
3615     if (!d->setMinimumSize_helper(minw, minh))
3616         return;
3617
3618     if (isWindow())
3619         d->setConstraints_sys();
3620     if (minw > width() || minh > height()) {
3621         bool resized = testAttribute(Qt::WA_Resized);
3622         bool maximized = isMaximized();
3623         resize(qMax(minw,width()), qMax(minh,height()));
3624         setAttribute(Qt::WA_Resized, resized); //not a user resize
3625         if (maximized)
3626             data->window_state = data->window_state | Qt::WindowMaximized;
3627     }
3628 #ifndef QT_NO_GRAPHICSVIEW
3629     if (d->extra) {
3630         if (d->extra->proxyWidget)
3631             d->extra->proxyWidget->setMinimumSize(minw, minh);
3632     }
3633 #endif
3634     d->updateGeometry_helper(d->extra->minw == d->extra->maxw && d->extra->minh == d->extra->maxh);
3635 }
3636
3637 bool QWidgetPrivate::setMaximumSize_helper(int &maxw, int &maxh)
3638 {
3639     Q_Q(QWidget);
3640     if (maxw > QWIDGETSIZE_MAX || maxh > QWIDGETSIZE_MAX) {
3641         qWarning("QWidget::setMaximumSize: (%s/%s) "
3642                 "The largest allowed size is (%d,%d)",
3643                  q->objectName().toLocal8Bit().data(), q->metaObject()->className(), QWIDGETSIZE_MAX,
3644                 QWIDGETSIZE_MAX);
3645         maxw = qMin<int>(maxw, QWIDGETSIZE_MAX);
3646         maxh = qMin<int>(maxh, QWIDGETSIZE_MAX);
3647     }
3648     if (maxw < 0 || maxh < 0) {
3649         qWarning("QWidget::setMaximumSize: (%s/%s) Negative sizes (%d,%d) "
3650                 "are not possible",
3651                 q->objectName().toLocal8Bit().data(), q->metaObject()->className(), maxw, maxh);
3652         maxw = qMax(maxw, 0);
3653         maxh = qMax(maxh, 0);
3654     }
3655     createExtra();
3656     if (extra->maxw == maxw && extra->maxh == maxh)
3657         return false;
3658     extra->maxw = maxw;
3659     extra->maxh = maxh;
3660     extra->explicitMaxSize = (maxw != QWIDGETSIZE_MAX ? Qt::Horizontal : 0) |
3661                              (maxh != QWIDGETSIZE_MAX ? Qt::Vertical : 0);
3662     return true;
3663 }
3664
3665 /*!
3666     \overload
3667
3668     This function corresponds to setMaximumSize(QSize(\a maxw, \a
3669     maxh)). Sets the maximum width to \a maxw and the maximum height
3670     to \a maxh.
3671 */
3672 void QWidget::setMaximumSize(int maxw, int maxh)
3673 {
3674     Q_D(QWidget);
3675     if (!d->setMaximumSize_helper(maxw, maxh))
3676         return;
3677
3678     if (isWindow())
3679         d->setConstraints_sys();
3680     if (maxw < width() || maxh < height()) {
3681         bool resized = testAttribute(Qt::WA_Resized);
3682         resize(qMin(maxw,width()), qMin(maxh,height()));
3683         setAttribute(Qt::WA_Resized, resized); //not a user resize
3684     }
3685
3686 #ifndef QT_NO_GRAPHICSVIEW
3687     if (d->extra) {
3688         if (d->extra->proxyWidget)
3689             d->extra->proxyWidget->setMaximumSize(maxw, maxh);
3690     }
3691 #endif
3692
3693     d->updateGeometry_helper(d->extra->minw == d->extra->maxw && d->extra->minh == d->extra->maxh);
3694 }
3695
3696 /*!
3697     \overload
3698
3699     Sets the x (width) size increment to \a w and the y (height) size
3700     increment to \a h.
3701 */
3702 void QWidget::setSizeIncrement(int w, int h)
3703 {
3704     Q_D(QWidget);
3705     d->createTLExtra();
3706     QTLWExtra* x = d->topData();
3707     if (x->incw == w && x->inch == h)
3708         return;
3709     x->incw = w;
3710     x->inch = h;
3711     if (isWindow())
3712         d->setConstraints_sys();
3713 }
3714
3715 /*!
3716     \overload
3717
3718     This corresponds to setBaseSize(QSize(\a basew, \a baseh)). Sets
3719     the widgets base size to width \a basew and height \a baseh.
3720 */
3721 void QWidget::setBaseSize(int basew, int baseh)
3722 {
3723     Q_D(QWidget);
3724     d->createTLExtra();
3725     QTLWExtra* x = d->topData();
3726     if (x->basew == basew && x->baseh == baseh)
3727         return;
3728     x->basew = basew;
3729     x->baseh = baseh;
3730     if (isWindow())
3731         d->setConstraints_sys();
3732 }
3733
3734 /*!
3735     Sets both the minimum and maximum sizes of the widget to \a s,
3736     thereby preventing it from ever growing or shrinking.
3737
3738     This will override the default size constraints set by QLayout.
3739
3740     To remove constraints, set the size to QWIDGETSIZE_MAX.
3741
3742     Alternatively, if you want the widget to have a
3743     fixed size based on its contents, you can call
3744     QLayout::setSizeConstraint(QLayout::SetFixedSize);
3745
3746     \sa maximumSize, minimumSize
3747 */
3748
3749 void QWidget::setFixedSize(const QSize & s)
3750 {
3751     setFixedSize(s.width(), s.height());
3752 }
3753
3754
3755 /*!
3756     \fn void QWidget::setFixedSize(int w, int h)
3757     \overload
3758
3759     Sets the width of the widget to \a w and the height to \a h.
3760 */
3761
3762 void QWidget::setFixedSize(int w, int h)
3763 {
3764     Q_D(QWidget);
3765     bool minSizeSet = d->setMinimumSize_helper(w, h);
3766     bool maxSizeSet = d->setMaximumSize_helper(w, h);
3767     if (!minSizeSet && !maxSizeSet)
3768         return;
3769
3770     if (isWindow())
3771         d->setConstraints_sys();
3772     else
3773         d->updateGeometry_helper(true);
3774
3775     if (w != QWIDGETSIZE_MAX || h != QWIDGETSIZE_MAX)
3776         resize(w, h);
3777 }
3778
3779 void QWidget::setMinimumWidth(int w)
3780 {
3781     Q_D(QWidget);
3782     d->createExtra();
3783     uint expl = d->extra->explicitMinSize | (w ? Qt::Horizontal : 0);
3784     setMinimumSize(w, minimumSize().height());
3785     d->extra->explicitMinSize = expl;
3786 }
3787
3788 void QWidget::setMinimumHeight(int h)
3789 {
3790     Q_D(QWidget);
3791     d->createExtra();
3792     uint expl = d->extra->explicitMinSize | (h ? Qt::Vertical : 0);
3793     setMinimumSize(minimumSize().width(), h);
3794     d->extra->explicitMinSize = expl;
3795 }
3796
3797 void QWidget::setMaximumWidth(int w)
3798 {
3799     Q_D(QWidget);
3800     d->createExtra();
3801     uint expl = d->extra->explicitMaxSize | (w == QWIDGETSIZE_MAX ? 0 : Qt::Horizontal);
3802     setMaximumSize(w, maximumSize().height());
3803     d->extra->explicitMaxSize = expl;
3804 }
3805
3806 void QWidget::setMaximumHeight(int h)
3807 {
3808     Q_D(QWidget);
3809     d->createExtra();
3810     uint expl = d->extra->explicitMaxSize | (h == QWIDGETSIZE_MAX ? 0 : Qt::Vertical);
3811     setMaximumSize(maximumSize().width(), h);
3812     d->extra->explicitMaxSize = expl;
3813 }
3814
3815 /*!
3816     Sets both the minimum and maximum width of the widget to \a w
3817     without changing the heights. Provided for convenience.
3818
3819     \sa sizeHint() minimumSize() maximumSize() setFixedSize()
3820 */
3821
3822 void QWidget::setFixedWidth(int w)
3823 {
3824     Q_D(QWidget);
3825     d->createExtra();
3826     uint explMin = d->extra->explicitMinSize | Qt::Horizontal;
3827     uint explMax = d->extra->explicitMaxSize | Qt::Horizontal;
3828     setMinimumSize(w, minimumSize().height());
3829     setMaximumSize(w, maximumSize().height());
3830     d->extra->explicitMinSize = explMin;
3831     d->extra->explicitMaxSize = explMax;
3832 }
3833
3834
3835 /*!
3836     Sets both the minimum and maximum heights of the widget to \a h
3837     without changing the widths. Provided for convenience.
3838
3839     \sa sizeHint() minimumSize() maximumSize() setFixedSize()
3840 */
3841
3842 void QWidget::setFixedHeight(int h)
3843 {
3844     Q_D(QWidget);
3845     d->createExtra();
3846     uint explMin = d->extra->explicitMinSize | Qt::Vertical;
3847     uint explMax = d->extra->explicitMaxSize | Qt::Vertical;
3848     setMinimumSize(minimumSize().width(), h);
3849     setMaximumSize(maximumSize().width(), h);
3850     d->extra->explicitMinSize = explMin;
3851     d->extra->explicitMaxSize = explMax;
3852 }
3853
3854
3855 /*!
3856     Translates the widget coordinate \a pos to the coordinate system
3857     of \a parent. The \a parent must not be 0 and must be a parent
3858     of the calling widget.
3859
3860     \sa mapFrom() mapToParent() mapToGlobal() underMouse()
3861 */
3862
3863 QPoint QWidget::mapTo(QWidget * parent, const QPoint & pos) const
3864 {
3865     QPoint p = pos;
3866     if (parent) {
3867         const QWidget * w = this;
3868         while (w != parent) {
3869             Q_ASSERT_X(w, "QWidget::mapTo(QWidget *parent, const QPoint &pos)",
3870                        "parent must be in parent hierarchy");
3871             p = w->mapToParent(p);
3872             w = w->parentWidget();
3873         }
3874     }
3875     return p;
3876 }
3877
3878
3879 /*!
3880     Translates the widget coordinate \a pos from the coordinate system
3881     of \a parent to this widget's coordinate system. The \a parent
3882     must not be 0 and must be a parent of the calling widget.
3883
3884     \sa mapTo() mapFromParent() mapFromGlobal() underMouse()
3885 */
3886
3887 QPoint QWidget::mapFrom(QWidget * parent, const QPoint & pos) const
3888 {
3889     QPoint p(pos);
3890     if (parent) {
3891         const QWidget * w = this;
3892         while (w != parent) {
3893             Q_ASSERT_X(w, "QWidget::mapFrom(QWidget *parent, const QPoint &pos)",
3894                        "parent must be in parent hierarchy");
3895
3896             p = w->mapFromParent(p);
3897             w = w->parentWidget();
3898         }
3899     }
3900     return p;
3901 }
3902
3903
3904 /*!
3905     Translates the widget coordinate \a pos to a coordinate in the
3906     parent widget.
3907
3908     Same as mapToGlobal() if the widget has no parent.
3909
3910     \sa mapFromParent() mapTo() mapToGlobal() underMouse()
3911 */
3912
3913 QPoint QWidget::mapToParent(const QPoint &pos) const
3914 {
3915     return pos + data->crect.topLeft();
3916 }
3917
3918 /*!
3919     Translates the parent widget coordinate \a pos to widget
3920     coordinates.
3921
3922     Same as mapFromGlobal() if the widget has no parent.
3923
3924     \sa mapToParent() mapFrom() mapFromGlobal() underMouse()
3925 */
3926
3927 QPoint QWidget::mapFromParent(const QPoint &pos) const
3928 {
3929     return pos - data->crect.topLeft();
3930 }
3931
3932
3933 /*!
3934     Returns the window for this widget, i.e. the next ancestor widget
3935     that has (or could have) a window-system frame.
3936
3937     If the widget is a window, the widget itself is returned.
3938
3939     Typical usage is changing the window title:
3940
3941     \snippet doc/src/snippets/code/src_gui_kernel_qwidget.cpp 3
3942
3943     \sa isWindow()
3944 */
3945
3946 QWidget *QWidget::window() const
3947 {
3948     QWidget *w = (QWidget *)this;
3949     QWidget *p = w->parentWidget();
3950     while (!w->isWindow() && p) {
3951         w = p;
3952         p = p->parentWidget();
3953     }
3954     return w;
3955 }
3956
3957 /*!
3958     \since 4.4
3959
3960     Returns the native parent for this widget, i.e. the next ancestor widget
3961     that has a system identifier, or 0 if it does not have any native parent.
3962
3963     \sa effectiveWinId()
3964 */
3965 QWidget *QWidget::nativeParentWidget() const
3966 {
3967     QWidget *parent = parentWidget();
3968     while (parent && !parent->internalWinId())
3969         parent = parent->parentWidget();
3970     return parent;
3971 }
3972
3973 /*! \fn QWidget *QWidget::topLevelWidget() const
3974     \obsolete
3975
3976     Use window() instead.
3977 */
3978
3979
3980
3981 /*!
3982   Returns the background role of the widget.
3983
3984   The background role defines the brush from the widget's \l palette that
3985   is used to render the background.
3986
3987   If no explicit background role is set, the widget inherts its parent
3988   widget's background role.
3989
3990   \sa setBackgroundRole(), foregroundRole()
3991  */
3992 QPalette::ColorRole QWidget::backgroundRole() const
3993 {
3994
3995     const QWidget *w = this;
3996     do {
3997         QPalette::ColorRole role = w->d_func()->bg_role;
3998         if (role != QPalette::NoRole)
3999             return role;
4000         if (w->isWindow() || w->windowType() == Qt::SubWindow)
4001             break;
4002         w = w->parentWidget();
4003     } while (w);
4004     return QPalette::Window;
4005 }
4006
4007 /*!
4008   Sets the background role of the widget to \a role.
4009
4010   The background role defines the brush from the widget's \l palette that
4011   is used to render the background.
4012
4013   If \a role is QPalette::NoRole, then the widget inherits its
4014   parent's background role.
4015
4016   Note that styles are free to choose any color from the palette.
4017   You can modify the palette or set a style sheet if you don't
4018   achieve the result you want with setBackgroundRole().
4019
4020   \sa backgroundRole(), foregroundRole()
4021  */
4022
4023 void QWidget::setBackgroundRole(QPalette::ColorRole role)
4024 {
4025     Q_D(QWidget);
4026     d->bg_role = role;
4027     d->updateSystemBackground();
4028     d->propagatePaletteChange();
4029     d->updateIsOpaque();
4030 }
4031
4032 /*!
4033   Returns the foreground role.
4034
4035   The foreground role defines the color from the widget's \l palette that
4036   is used to draw the foreground.
4037
4038   If no explicit foreground role is set, the function returns a role
4039   that contrasts with the background role.
4040
4041   \sa setForegroundRole(), backgroundRole()
4042  */
4043 QPalette::ColorRole QWidget::foregroundRole() const
4044 {
4045     Q_D(const QWidget);
4046     QPalette::ColorRole rl = QPalette::ColorRole(d->fg_role);
4047     if (rl != QPalette::NoRole)
4048         return rl;
4049     QPalette::ColorRole role = QPalette::WindowText;
4050     switch (backgroundRole()) {
4051     case QPalette::Button:
4052         role = QPalette::ButtonText;
4053         break;
4054     case QPalette::Base:
4055         role = QPalette::Text;
4056         break;
4057     case QPalette::Dark:
4058     case QPalette::Shadow:
4059         role = QPalette::Light;
4060         break;
4061     case QPalette::Highlight:
4062         role = QPalette::HighlightedText;
4063         break;
4064     case QPalette::ToolTipBase:
4065         role = QPalette::ToolTipText;
4066         break;
4067     default:
4068         ;
4069     }
4070     return role;
4071 }
4072
4073 /*!
4074   Sets the foreground role of the widget to \a role.
4075
4076   The foreground role defines the color from the widget's \l palette that
4077   is used to draw the foreground.
4078
4079   If \a role is QPalette::NoRole, the widget uses a foreground role
4080   that contrasts with the background role.
4081
4082   Note that styles are free to choose any color from the palette.
4083   You can modify the palette or set a style sheet if you don't
4084   achieve the result you want with setForegroundRole().
4085
4086   \sa foregroundRole(), backgroundRole()
4087  */
4088 void QWidget::setForegroundRole(QPalette::ColorRole role)
4089 {
4090     Q_D(QWidget);
4091     d->fg_role = role;
4092     d->updateSystemBackground();
4093     d->propagatePaletteChange();
4094 }
4095
4096 /*!
4097     \property QWidget::palette
4098     \brief the widget's palette
4099
4100     This property describes the widget's palette. The palette is used by the
4101     widget's style when rendering standard components, and is available as a
4102     means to ensure that custom widgets can maintain consistency with the
4103     native platform's look and feel. It's common that different platforms, or
4104     different styles, have different palettes.
4105
4106     When you assign a new palette to a widget, the color roles from this
4107     palette are combined with the widget's default palette to form the
4108     widget's final palette. The palette entry for the widget's background role
4109     is used to fill the widget's background (see QWidget::autoFillBackground),
4110     and the foreground role initializes QPainter's pen.
4111
4112     The default depends on the system environment. QApplication maintains a
4113     system/theme palette which serves as a default for all widgets.  There may
4114     also be special palette defaults for certain types of widgets (e.g., on
4115     Windows XP and Vista, all classes that derive from QMenuBar have a special
4116     default palette). You can also define default palettes for widgets
4117     yourself by passing a custom palette and the name of a widget to
4118     QApplication::setPalette(). Finally, the style always has the option of
4119     polishing the palette as it's assigned (see QStyle::polish()).
4120
4121     QWidget propagates explicit palette roles from parent to child. If you
4122     assign a brush or color to a specific role on a palette and assign that
4123     palette to a widget, that role will propagate to all the widget's
4124     children, overriding any system defaults for that role. Note that palettes
4125     by default don't propagate to windows (see isWindow()) unless the
4126     Qt::WA_WindowPropagation attribute is enabled.
4127
4128     QWidget's palette propagation is similar to its font propagation.
4129
4130     The current style, which is used to render the content of all standard Qt
4131     widgets, is free to choose colors and brushes from the widget palette, or
4132     in some cases, to ignore the palette (partially, or completely). In
4133     particular, certain styles like GTK style, Mac style, Windows XP, and
4134     Vista style, depend on third party APIs to render the content of widgets,
4135     and these styles typically do not follow the palette. Because of this,
4136     assigning roles to a widget's palette is not guaranteed to change the
4137     appearance of the widget. Instead, you may choose to apply a \l
4138     styleSheet. You can refer to our Knowledge Base article
4139     \l{http://qt.nokia.com/developer/knowledgebase/22}{here} for more
4140     information.
4141
4142     \warning Do not use this function in conjunction with \l{Qt Style Sheets}.
4143     When using style sheets, the palette of a widget can be customized using
4144     the "color", "background-color", "selection-color",
4145     "selection-background-color" and "alternate-background-color".
4146
4147     \sa QApplication::palette(), QWidget::font()
4148 */
4149 const QPalette &QWidget::palette() const
4150 {
4151     if (!isEnabled()) {
4152         data->pal.setCurrentColorGroup(QPalette::Disabled);
4153     } else if ((!isVisible() || isActiveWindow())
4154 #if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
4155         && !QApplicationPrivate::isBlockedByModal(const_cast<QWidget *>(this))
4156 #endif
4157         ) {
4158         data->pal.setCurrentColorGroup(QPalette::Active);
4159     } else {
4160 #ifdef Q_WS_MAC
4161         extern bool qt_mac_can_clickThrough(const QWidget *); //qwidget_mac.cpp
4162         if (qt_mac_can_clickThrough(this))
4163             data->pal.setCurrentColorGroup(QPalette::Active);
4164         else
4165 #endif
4166             data->pal.setCurrentColorGroup(QPalette::Inactive);
4167     }
4168     return data->pal;
4169 }
4170
4171 void QWidget::setPalette(const QPalette &palette)
4172 {
4173     Q_D(QWidget);
4174     setAttribute(Qt::WA_SetPalette, palette.resolve() != 0);
4175
4176     // Determine which palette is inherited from this widget's ancestors and
4177     // QApplication::palette, resolve this against \a palette (attributes from
4178     // the inherited palette are copied over this widget's palette). Then
4179     // propagate this palette to this widget's children.
4180     QPalette naturalPalette = d->naturalWidgetPalette(d->inheritedPaletteResolveMask);
4181     QPalette resolvedPalette = palette.resolve(naturalPalette);
4182     d->setPalette_helper(resolvedPalette);
4183 }
4184
4185 /*!
4186     \internal
4187
4188     Returns the palette that the widget \a w inherits from its ancestors and
4189     QApplication::palette. \a inheritedMask is the combination of the widget's
4190     ancestors palette request masks (i.e., which attributes from the parent
4191     widget's palette are implicitly imposed on this widget by the user). Note
4192     that this font does not take into account the palette set on \a w itself.
4193 */
4194 QPalette QWidgetPrivate::naturalWidgetPalette(uint inheritedMask) const
4195 {
4196     Q_Q(const QWidget);
4197     QPalette naturalPalette = QApplication::palette(q);
4198     if (!q->testAttribute(Qt::WA_StyleSheet)
4199         && (!q->isWindow() || q->testAttribute(Qt::WA_WindowPropagation)
4200 #ifndef QT_NO_GRAPHICSVIEW
4201             || (extra && extra->proxyWidget)
4202 #endif //QT_NO_GRAPHICSVIEW
4203             )) {
4204         if (QWidget *p = q->parentWidget()) {
4205             if (!p->testAttribute(Qt::WA_StyleSheet)) {
4206                 if (!naturalPalette.isCopyOf(QApplication::palette())) {
4207                     QPalette inheritedPalette = p->palette();
4208                     inheritedPalette.resolve(inheritedMask);
4209                     naturalPalette = inheritedPalette.resolve(naturalPalette);
4210                 } else {
4211                     naturalPalette = p->palette();
4212                 }
4213             }
4214         }
4215 #ifndef QT_NO_GRAPHICSVIEW
4216         else if (extra && extra->proxyWidget) {
4217             QPalette inheritedPalette = extra->proxyWidget->palette();
4218             inheritedPalette.resolve(inheritedMask);
4219             naturalPalette = inheritedPalette.resolve(naturalPalette);
4220         }
4221 #endif //QT_NO_GRAPHICSVIEW
4222     }
4223     naturalPalette.resolve(0);
4224     return naturalPalette;
4225 }
4226 /*!
4227     \internal
4228
4229     Determine which palette is inherited from this widget's ancestors and
4230     QApplication::palette, resolve this against this widget's palette
4231     (attributes from the inherited palette are copied over this widget's
4232     palette). Then propagate this palette to this widget's children.
4233 */
4234 void QWidgetPrivate::resolvePalette()
4235 {
4236     QPalette naturalPalette = naturalWidgetPalette(inheritedPaletteResolveMask);
4237     QPalette resolvedPalette = data.pal.resolve(naturalPalette);
4238     setPalette_helper(resolvedPalette);
4239 }
4240
4241 void QWidgetPrivate::setPalette_helper(const QPalette &palette)
4242 {
4243     Q_Q(QWidget);
4244     if (data.pal == palette && data.pal.resolve() == palette.resolve())
4245         return;
4246     data.pal = palette;
4247     updateSystemBackground();
4248     propagatePaletteChange();
4249     updateIsOpaque();
4250     q->update();
4251     updateIsOpaque();
4252 }
4253
4254 /*!
4255     \property QWidget::font
4256     \brief the font currently set for the widget
4257
4258     This property describes the widget's requested font. The font is used by
4259     the widget's style when rendering standard components, and is available as
4260     a means to ensure that custom widgets can maintain consistency with the
4261     native platform's look and feel. It's common that different platforms, or
4262     different styles, define different fonts for an application.
4263
4264     When you assign a new font to a widget, the properties from this font are
4265     combined with the widget's default font to form the widget's final
4266     font. You can call fontInfo() to get a copy of the widget's final
4267     font. The final font is also used to initialize QPainter's font.
4268
4269     The default depends on the system environment. QApplication maintains a
4270     system/theme font which serves as a default for all widgets.  There may
4271     also be special font defaults for certain types of widgets. You can also
4272     define default fonts for widgets yourself by passing a custom font and the
4273     name of a widget to QApplication::setFont(). Finally, the font is matched
4274     against Qt's font database to find the best match.
4275
4276     QWidget propagates explicit font properties from parent to child. If you
4277     change a specific property on a font and assign that font to a widget,
4278     that property will propagate to all the widget's children, overriding any
4279     system defaults for that property. Note that fonts by default don't
4280     propagate to windows (see isWindow()) unless the Qt::WA_WindowPropagation
4281     attribute is enabled.
4282
4283     QWidget's font propagation is similar to its palette propagation.
4284
4285     The current style, which is used to render the content of all standard Qt
4286     widgets, is free to choose to use the widget font, or in some cases, to
4287     ignore it (partially, or completely). In particular, certain styles like
4288     GTK style, Mac style, Windows XP, and Vista style, apply special
4289     modifications to the widget font to match the platform's native look and
4290     feel. Because of this, assigning properties to a widget's font is not
4291     guaranteed to change the appearance of the widget. Instead, you may choose
4292     to apply a \l styleSheet.
4293
4294     \note If \l{Qt Style Sheets} are used on the same widget as setFont(),
4295     style sheets will take precedence if the settings conflict.
4296
4297     \sa fontInfo(), fontMetrics()
4298 */
4299
4300 void QWidget::setFont(const QFont &font)
4301 {
4302     Q_D(QWidget);
4303
4304 #ifndef QT_NO_STYLE_STYLESHEET
4305     const QStyleSheetStyle* style;
4306     if (d->extra && (style = qobject_cast<const QStyleSheetStyle*>(d->extra->style))) {
4307         style->saveWidgetFont(this, font);
4308     }
4309 #endif
4310
4311     setAttribute(Qt::WA_SetFont, font.resolve() != 0);
4312
4313     // Determine which font is inherited from this widget's ancestors and
4314     // QApplication::font, resolve this against \a font (attributes from the
4315     // inherited font are copied over). Then propagate this font to this
4316     // widget's children.
4317     QFont naturalFont = d->naturalWidgetFont(d->inheritedFontResolveMask);
4318     QFont resolvedFont = font.resolve(naturalFont);
4319     d->setFont_helper(resolvedFont);
4320 }
4321
4322 /*
4323     \internal
4324
4325     Returns the font that the widget \a w inherits from its ancestors and
4326     QApplication::font. \a inheritedMask is the combination of the widget's
4327     ancestors font request masks (i.e., which attributes from the parent
4328     widget's font are implicitly imposed on this widget by the user). Note
4329     that this font does not take into account the font set on \a w itself.
4330
4331     ### Stylesheet has a different font propagation mechanism. When a stylesheet
4332         is applied, fonts are not propagated anymore
4333 */
4334 QFont QWidgetPrivate::naturalWidgetFont(uint inheritedMask) const
4335 {
4336     Q_Q(const QWidget);
4337     QFont naturalFont = QApplication::font(q);
4338     if (!q->testAttribute(Qt::WA_StyleSheet)
4339         && (!q->isWindow() || q->testAttribute(Qt::WA_WindowPropagation)
4340 #ifndef QT_NO_GRAPHICSVIEW
4341             || (extra && extra->proxyWidget)
4342 #endif //QT_NO_GRAPHICSVIEW
4343             )) {
4344         if (QWidget *p = q->parentWidget()) {
4345             if (!p->testAttribute(Qt::WA_StyleSheet)) {
4346                 if (!naturalFont.isCopyOf(QApplication::font())) {
4347                     QFont inheritedFont = p->font();
4348                     inheritedFont.resolve(inheritedMask);
4349                     naturalFont = inheritedFont.resolve(naturalFont);
4350                 } else {
4351                     naturalFont = p->font();
4352                 }
4353             }
4354         }
4355 #ifndef QT_NO_GRAPHICSVIEW
4356         else if (extra && extra->proxyWidget) {
4357             QFont inheritedFont = extra->proxyWidget->font();
4358             inheritedFont.resolve(inheritedMask);
4359             naturalFont = inheritedFont.resolve(naturalFont);
4360         }
4361 #endif //QT_NO_GRAPHICSVIEW
4362     }
4363     naturalFont.resolve(0);
4364     return naturalFont;
4365 }
4366
4367 /*!
4368     \internal
4369
4370     Determine which font is implicitly imposed on this widget by its ancestors
4371     and QApplication::font, resolve this against its own font (attributes from
4372     the implicit font are copied over). Then propagate this font to this
4373     widget's children.
4374 */
4375 void QWidgetPrivate::resolveFont()
4376 {
4377     QFont naturalFont = naturalWidgetFont(inheritedFontResolveMask);
4378     QFont resolvedFont = data.fnt.resolve(naturalFont);
4379     setFont_helper(resolvedFont);
4380 }
4381
4382 /*!
4383     \internal
4384
4385     Assign \a font to this widget, and propagate it to all children, except
4386     style sheet widgets (handled differently) and windows that don't enable
4387     window propagation.  \a implicitMask is the union of all ancestor widgets'
4388     font request masks, and determines which attributes from this widget's
4389     font should propagate.
4390 */
4391 void QWidgetPrivate::updateFont(const QFont &font)
4392 {
4393     Q_Q(QWidget);
4394 #ifndef QT_NO_STYLE_STYLESHEET
4395     const QStyleSheetStyle* cssStyle;
4396     cssStyle = extra ? qobject_cast<const QStyleSheetStyle*>(extra->style) : 0;
4397 #endif
4398
4399     data.fnt = QFont(font, q);
4400 #if defined(Q_WS_X11)
4401     // make sure the font set on this widget is associated with the correct screen
4402     data.fnt.x11SetScreen(xinfo.screen());
4403 #endif
4404     // Combine new mask with natural mask and propagate to children.
4405 #ifndef QT_NO_GRAPHICSVIEW
4406     if (!q->parentWidget() && extra && extra->proxyWidget) {
4407         QGraphicsProxyWidget *p = extra->proxyWidget;
4408         inheritedFontResolveMask = p->d_func()->inheritedFontResolveMask | p->font().resolve();
4409     } else
4410 #endif //QT_NO_GRAPHICSVIEW
4411     if (q->isWindow() && !q->testAttribute(Qt::WA_WindowPropagation)) {
4412         inheritedFontResolveMask = 0;
4413     }
4414     uint newMask = data.fnt.resolve() | inheritedFontResolveMask;
4415
4416     for (int i = 0; i < children.size(); ++i) {
4417         QWidget *w = qobject_cast<QWidget*>(children.at(i));
4418         if (w) {
4419             if (0) {
4420 #ifndef QT_NO_STYLE_STYLESHEET
4421             } else if (w->testAttribute(Qt::WA_StyleSheet)) {
4422                 // Style sheets follow a different font propagation scheme.
4423                 if (cssStyle)
4424                     cssStyle->updateStyleSheetFont(w);
4425 #endif
4426             } else if ((!w->isWindow() || w->testAttribute(Qt::WA_WindowPropagation))) {
4427                 // Propagate font changes.
4428                 QWidgetPrivate *wd = w->d_func();
4429                 wd->inheritedFontResolveMask = newMask;
4430                 wd->resolveFont();
4431             }
4432         }
4433     }
4434
4435 #ifndef QT_NO_STYLE_STYLESHEET
4436     if (cssStyle) {
4437         cssStyle->updateStyleSheetFont(q);
4438     }
4439 #endif
4440
4441     QEvent e(QEvent::FontChange);
4442     QApplication::sendEvent(q, &e);
4443 }
4444
4445 void QWidgetPrivate::setLayoutDirection_helper(Qt::LayoutDirection direction)
4446 {
4447     Q_Q(QWidget);
4448
4449     if ( (direction == Qt::RightToLeft) == q->testAttribute(Qt::WA_RightToLeft))
4450         return;
4451     q->setAttribute(Qt::WA_RightToLeft, (direction == Qt::RightToLeft));
4452     if (!children.isEmpty()) {
4453         for (int i = 0; i < children.size(); ++i) {
4454             QWidget *w = qobject_cast<QWidget*>(children.at(i));
4455             if (w && !w->isWindow() && !w->testAttribute(Qt::WA_SetLayoutDirection))
4456                 w->d_func()->setLayoutDirection_helper(direction);
4457         }
4458     }
4459     QEvent e(QEvent::LayoutDirectionChange);
4460     QApplication::sendEvent(q, &e);
4461 }
4462
4463 void QWidgetPrivate::resolveLayoutDirection()
4464 {
4465     Q_Q(const QWidget);
4466     if (!q->testAttribute(Qt::WA_SetLayoutDirection))
4467         setLayoutDirection_helper(q->isWindow() ? QApplication::layoutDirection() : q->parentWidget()->layoutDirection());
4468 }
4469
4470 /*!
4471     \property QWidget::layoutDirection
4472
4473     \brief the layout direction for this widget
4474
4475     By default, this property is set to Qt::LeftToRight.
4476
4477     When the layout direction is set on a widget, it will propagate to
4478     the widget's children, but not to a child that is a window and not
4479     to a child for which setLayoutDirection() has been explicitly
4480     called. Also, child widgets added \e after setLayoutDirection()
4481     has been called for the parent do not inherit the parent's layout
4482     direction.
4483
4484     This method no longer affects text layout direction since Qt 4.7.
4485
4486     \sa QApplication::layoutDirection
4487 */
4488 void QWidget::setLayoutDirection(Qt::LayoutDirection direction)
4489 {
4490     Q_D(QWidget);
4491
4492     if (direction == Qt::LayoutDirectionAuto) {
4493         unsetLayoutDirection();
4494         return;
4495     }
4496
4497     setAttribute(Qt::WA_SetLayoutDirection);
4498     d->setLayoutDirection_helper(direction);
4499 }
4500
4501 Qt::LayoutDirection QWidget::layoutDirection() const
4502 {
4503     return testAttribute(Qt::WA_RightToLeft) ? Qt::RightToLeft : Qt::LeftToRight;
4504 }
4505
4506 void QWidget::unsetLayoutDirection()
4507 {
4508     Q_D(QWidget);
4509     setAttribute(Qt::WA_SetLayoutDirection, false);
4510     d->resolveLayoutDirection();
4511 }
4512
4513 /*!
4514     \fn QFontMetrics QWidget::fontMetrics() const
4515
4516     Returns the font metrics for the widget's current font.
4517     Equivalent to QFontMetrics(widget->font()).
4518
4519     \sa font(), fontInfo(), setFont()
4520 */
4521
4522 /*!
4523     \fn QFontInfo QWidget::fontInfo() const
4524
4525     Returns the font info for the widget's current font.
4526     Equivalent to QFontInto(widget->font()).
4527
4528     \sa font(), fontMetrics(), setFont()
4529 */
4530
4531
4532 /*!
4533     \property QWidget::cursor
4534     \brief the cursor shape for this widget
4535
4536     The mouse cursor will assume this shape when it's over this
4537     widget. See the \link Qt::CursorShape list of predefined cursor
4538     objects\endlink for a range of useful shapes.
4539
4540     An editor widget might use an I-beam cursor:
4541     \snippet doc/src/snippets/code/src_gui_kernel_qwidget.cpp 6
4542
4543     If no cursor has been set, or after a call to unsetCursor(), the
4544     parent's cursor is used.
4545
4546     By default, this property contains a cursor with the Qt::ArrowCursor
4547     shape.
4548
4549     Some underlying window implementations will reset the cursor if it
4550     leaves a widget even if the mouse is grabbed. If you want to have
4551     a cursor set for all widgets, even when outside the window, consider
4552     QApplication::setOverrideCursor().
4553
4554     \sa QApplication::setOverrideCursor()
4555 */
4556
4557 #ifndef QT_NO_CURSOR
4558 QCursor QWidget::cursor() const
4559 {
4560     Q_D(const QWidget);
4561     if (testAttribute(Qt::WA_SetCursor))
4562         return (d->extra && d->extra->curs)
4563             ? *d->extra->curs
4564             : QCursor(Qt::ArrowCursor);
4565     if (isWindow() || !parentWidget())
4566         return QCursor(Qt::ArrowCursor);
4567     return parentWidget()->cursor();
4568 }
4569
4570 void QWidget::setCursor(const QCursor &cursor)
4571 {
4572     Q_D(QWidget);
4573 // On Mac we must set the cursor even if it is the ArrowCursor.
4574 #if !defined(Q_WS_MAC)
4575     if (cursor.shape() != Qt::ArrowCursor
4576         || (d->extra && d->extra->curs))
4577 #endif
4578     {
4579         d->createExtra();
4580         QCursor *newCursor = new QCursor(cursor);
4581         delete d->extra->curs;
4582         d->extra->curs = newCursor;
4583     }
4584     setAttribute(Qt::WA_SetCursor);
4585     d->setCursor_sys(cursor);
4586
4587     QEvent event(QEvent::CursorChange);
4588     QApplication::sendEvent(this, &event);
4589 }
4590
4591 void QWidget::unsetCursor()
4592 {
4593     Q_D(QWidget);
4594     if (d->extra) {
4595         delete d->extra->curs;
4596         d->extra->curs = 0;
4597     }
4598     if (!isWindow())
4599         setAttribute(Qt::WA_SetCursor, false);
4600     d->unsetCursor_sys();
4601
4602     QEvent event(QEvent::CursorChange);
4603     QApplication::sendEvent(this, &event);
4604 }
4605
4606 #endif
4607
4608 /*!
4609     \enum QWidget::RenderFlag
4610
4611     This enum describes how to render the widget when calling QWidget::render().
4612
4613     \value DrawWindowBackground If you enable this option, the widget's background
4614     is rendered into the target even if autoFillBackground is not set. By default,
4615     this option is enabled.
4616
4617     \value DrawChildren If you enable this option, the widget's children
4618     are rendered recursively into the target. By default, this option is enabled.
4619
4620     \value IgnoreMask If you enable this option, the widget's QWidget::mask()
4621     is ignored when rendering into the target. By default, this option is disabled.
4622
4623     \since 4.3
4624 */
4625
4626 /*!
4627     \since 4.3
4628
4629     Renders the \a sourceRegion of this widget into the \a target
4630     using \a renderFlags to determine how to render. Rendering
4631     starts at \a targetOffset in the \a target. For example:
4632
4633     \snippet doc/src/snippets/code/src_gui_kernel_qwidget.cpp 7
4634
4635     If \a sourceRegion is a null region, this function will use QWidget::rect() as
4636     the region, i.e. the entire widget.
4637
4638     Ensure that you call QPainter::end() for the \a target device's
4639     active painter (if any) before rendering. For example:
4640
4641     \snippet doc/src/snippets/code/src_gui_kernel_qwidget.cpp 8
4642
4643     \note To obtain the contents of an OpenGL widget, use QGLWidget::grabFrameBuffer()
4644     or QGLWidget::renderPixmap() instead.
4645 */
4646 void QWidget::render(QPaintDevice *target, const QPoint &targetOffset,
4647                      const QRegion &sourceRegion, RenderFlags renderFlags)
4648 {
4649     d_func()->render(target, targetOffset, sourceRegion, renderFlags, false);
4650 }
4651
4652 /*!
4653     \overload
4654
4655     Renders the widget into the \a painter's QPainter::device().
4656
4657     Transformations and settings applied to the \a painter will be used
4658     when rendering.
4659
4660     \note The \a painter must be active. On Mac OS X the widget will be
4661     rendered into a QPixmap and then drawn by the \a painter.
4662
4663     \sa QPainter::device()
4664 */
4665 void QWidget::render(QPainter *painter, const QPoint &targetOffset,
4666                      const QRegion &sourceRegion, RenderFlags renderFlags)
4667 {
4668     if (!painter) {
4669         qWarning("QWidget::render: Null pointer to painter");
4670         return;
4671     }
4672
4673     if (!painter->isActive()) {
4674         qWarning("QWidget::render: Cannot render with an inactive painter");
4675         return;
4676     }
4677
4678     const qreal opacity = painter->opacity();
4679     if (qFuzzyIsNull(opacity))
4680         return; // Fully transparent.
4681
4682     Q_D(QWidget);
4683     const bool inRenderWithPainter = d->extra && d->extra->inRenderWithPainter;
4684     const QRegion toBePainted = !inRenderWithPainter ? d->prepareToRender(sourceRegion, renderFlags)
4685                                                      : sourceRegion;
4686     if (toBePainted.isEmpty())
4687         return;
4688
4689     if (!d->extra)
4690         d->createExtra();
4691     d->extra->inRenderWithPainter = true;
4692
4693 #ifdef Q_WS_MAC
4694     d->render_helper(painter, targetOffset, toBePainted, renderFlags);
4695 #else
4696     QPaintEngine *engine = painter->paintEngine();
4697     Q_ASSERT(engine);
4698     QPaintEnginePrivate *enginePriv = engine->d_func();
4699     Q_ASSERT(enginePriv);
4700     QPaintDevice *target = engine->paintDevice();
4701     Q_ASSERT(target);
4702
4703     // Render via a pixmap when dealing with non-opaque painters or printers.
4704     if (!inRenderWithPainter && (opacity < 1.0 || (target->devType() == QInternal::Printer))) {
4705         d->render_helper(painter, targetOffset, toBePainted, renderFlags);
4706         d->extra->inRenderWithPainter = false;
4707         return;
4708     }
4709
4710     // Set new shared painter.
4711     QPainter *oldPainter = d->sharedPainter();
4712     d->setSharedPainter(painter);
4713
4714     // Save current system clip, viewport and transform,
4715     const QTransform oldTransform = enginePriv->systemTransform;
4716     const QRegion oldSystemClip = enginePriv->systemClip;
4717     const QRegion oldSystemViewport = enginePriv->systemViewport;
4718
4719     // This ensures that all painting triggered by render() is clipped to the current engine clip.
4720     if (painter->hasClipping()) {
4721         const QRegion painterClip = painter->deviceTransform().map(painter->clipRegion());
4722         enginePriv->setSystemViewport(oldSystemClip.isEmpty() ? painterClip : oldSystemClip & painterClip);
4723     } else {
4724         enginePriv->setSystemViewport(oldSystemClip);
4725     }
4726
4727     render(target, targetOffset, toBePainted, renderFlags);
4728
4729     // Restore system clip, viewport and transform.
4730     enginePriv->systemClip = oldSystemClip;
4731     enginePriv->setSystemViewport(oldSystemViewport);
4732     enginePriv->setSystemTransform(oldTransform);
4733
4734     // Restore shared painter.
4735     d->setSharedPainter(oldPainter);
4736 #endif
4737
4738     d->extra->inRenderWithPainter = false;
4739 }
4740
4741 static void sendResizeEvents(QWidget *target)
4742 {
4743     QResizeEvent e(target->size(), QSize());
4744     QApplication::sendEvent(target, &e);
4745
4746     const QObjectList children = target->children();
4747     for (int i = 0; i < children.size(); ++i) {
4748         QWidget *child = static_cast<QWidget*>(children.at(i));
4749         if (child->isWidgetType() && !child->isWindow() && child->testAttribute(Qt::WA_PendingResizeEvent))
4750             sendResizeEvents(child);
4751     }
4752 }
4753
4754 /*!
4755     \since 5.0
4756
4757     Renders the widget into a pixmap restricted by the
4758     given \a rectangle. If the \a widget has any children, then
4759     they are also painted in the appropriate positions.
4760
4761     If no rectangle is specified (the default) the entire widget is
4762     painted.
4763
4764     Replacement for Qt 4's QPixmap::grabWidget().
4765
4766     \sa render(), QPixmap
4767 */
4768
4769 /* INVOKABLE since used by QPixmap::grabWidget(). */
4770 QPixmap QWidget::grab(const QRect &rectangle)
4771 {
4772     Q_D(const QWidget);
4773     if (testAttribute(Qt::WA_PendingResizeEvent) || !testAttribute(Qt::WA_WState_Created))
4774         sendResizeEvents(this);
4775
4776     adjustSize();
4777
4778     QRect r(rectangle);
4779     if (r.width() < 0)
4780         r.setWidth(width() - rectangle.x());
4781     if (r.height() < 0)
4782         r.setHeight(height() - rectangle.y());
4783
4784     if (!r.intersects(rect()))
4785         return QPixmap();
4786
4787     QPixmap res(r.size());
4788     if (!d->isOpaque)
4789         res.fill(Qt::transparent);
4790     render(&res, QPoint(), QRegion(r), QWidget::DrawWindowBackground
4791            | QWidget::DrawChildren | QWidget::IgnoreMask);
4792     return res;
4793 }
4794
4795 /*!
4796     \brief The graphicsEffect function returns a pointer to the
4797     widget's graphics effect.
4798
4799     If the widget has no graphics effect, 0 is returned.
4800
4801     \since 4.6
4802
4803     \sa setGraphicsEffect()
4804 */
4805 #ifndef QT_NO_GRAPHICSEFFECT
4806 QGraphicsEffect *QWidget::graphicsEffect() const
4807 {
4808     Q_D(const QWidget);
4809     return d->graphicsEffect;
4810 }
4811 #endif //QT_NO_GRAPHICSEFFECT
4812
4813 /*!
4814
4815   \brief The setGraphicsEffect function is for setting the widget's graphics effect.
4816
4817     Sets \a effect as the widget's effect. If there already is an effect installed
4818     on this widget, QWidget will delete the existing effect before installing
4819     the new \a effect.
4820
4821     If \a effect is the installed on a different widget, setGraphicsEffect() will remove
4822     the effect from the widget and install it on this widget.
4823
4824     QWidget takes ownership of \a effect.
4825
4826     \note This function will apply the effect on itself and all its children.
4827
4828     \since 4.6
4829
4830     \sa graphicsEffect()
4831 */
4832 #ifndef QT_NO_GRAPHICSEFFECT
4833 void QWidget::setGraphicsEffect(QGraphicsEffect *effect)
4834 {
4835     Q_D(QWidget);
4836     if (d->graphicsEffect == effect)
4837         return;
4838
4839     if (d->graphicsEffect) {
4840         d->invalidateBuffer(rect());
4841         delete d->graphicsEffect;
4842         d->graphicsEffect = 0;
4843     }
4844
4845     if (effect) {
4846         // Set new effect.
4847         QGraphicsEffectSourcePrivate *sourced = new QWidgetEffectSourcePrivate(this);
4848         QGraphicsEffectSource *source = new QGraphicsEffectSource(*sourced);
4849         d->graphicsEffect = effect;
4850         effect->d_func()->setGraphicsEffectSource(source);
4851         update();
4852     }
4853
4854     d->updateIsOpaque();
4855 }
4856 #endif //QT_NO_GRAPHICSEFFECT
4857
4858 bool QWidgetPrivate::isAboutToShow() const
4859 {
4860     if (data.in_show)
4861         return true;
4862
4863     Q_Q(const QWidget);
4864     if (q->isHidden())
4865         return false;
4866
4867     // The widget will be shown if any of its ancestors are about to show.
4868     QWidget *parent = q->parentWidget();
4869     return parent ? parent->d_func()->isAboutToShow() : false;
4870 }
4871
4872 QRegion QWidgetPrivate::prepareToRender(const QRegion &region, QWidget::RenderFlags renderFlags)
4873 {
4874     Q_Q(QWidget);
4875     const bool isVisible = q->isVisible();
4876
4877     // Make sure the widget is laid out correctly.
4878     if (!isVisible && !isAboutToShow()) {
4879         QWidget *topLevel = q->window();
4880         (void)topLevel->d_func()->topData(); // Make sure we at least have top-data.
4881         topLevel->ensurePolished();
4882
4883         // Invalidate the layout of hidden ancestors (incl. myself) and pretend
4884         // they're not explicitly hidden.
4885         QWidget *widget = q;
4886         QWidgetList hiddenWidgets;
4887         while (widget) {
4888             if (widget->isHidden()) {
4889                 widget->setAttribute(Qt::WA_WState_Hidden, false);
4890                 hiddenWidgets.append(widget);
4891                 if (!widget->isWindow() && widget->parentWidget()->d_func()->layout)
4892                     widget->d_func()->updateGeometry_helper(true);
4893             }
4894             widget = widget->parentWidget();
4895         }
4896
4897         // Activate top-level layout.
4898         if (topLevel->d_func()->layout)
4899             topLevel->d_func()->layout->activate();
4900
4901         // Adjust size if necessary.
4902         QTLWExtra *topLevelExtra = topLevel->d_func()->maybeTopData();
4903         if (topLevelExtra && !topLevelExtra->sizeAdjusted
4904             && !topLevel->testAttribute(Qt::WA_Resized)) {
4905             topLevel->adjustSize();
4906             topLevel->setAttribute(Qt::WA_Resized, false);
4907         }
4908
4909         // Activate child layouts.
4910         topLevel->d_func()->activateChildLayoutsRecursively();
4911
4912         // We're not cheating with WA_WState_Hidden anymore.
4913         for (int i = 0; i < hiddenWidgets.size(); ++i) {
4914             QWidget *widget = hiddenWidgets.at(i);
4915             widget->setAttribute(Qt::WA_WState_Hidden);
4916             if (!widget->isWindow() && widget->parentWidget()->d_func()->layout)
4917                 widget->parentWidget()->d_func()->layout->invalidate();
4918         }
4919     } else if (isVisible) {
4920         q->window()->d_func()->sendPendingMoveAndResizeEvents(true, true);
4921     }
4922
4923     // Calculate the region to be painted.
4924     QRegion toBePainted = !region.isEmpty() ? region : QRegion(q->rect());
4925     if (!(renderFlags & QWidget::IgnoreMask) && extra && extra->hasMask)
4926         toBePainted &= extra->mask;
4927     return toBePainted;
4928 }
4929
4930 void QWidgetPrivate::render_helper(QPainter *painter, const QPoint &targetOffset, const QRegion &toBePainted,
4931                                    QWidget::RenderFlags renderFlags)
4932 {
4933     Q_ASSERT(painter);
4934     Q_ASSERT(!toBePainted.isEmpty());
4935
4936     Q_Q(QWidget);
4937 #ifndef Q_WS_MAC
4938     const QTransform originalTransform = painter->worldTransform();
4939     const bool useDeviceCoordinates = originalTransform.isScaling();
4940     if (!useDeviceCoordinates) {
4941 #endif
4942         // Render via a pixmap.
4943         const QRect rect = toBePainted.boundingRect();
4944         const QSize size = rect.size();
4945         if (size.isNull())
4946             return;
4947
4948         QPixmap pixmap(size);
4949         if (!(renderFlags & QWidget::DrawWindowBackground) || !isOpaque)
4950             pixmap.fill(Qt::transparent);
4951         q->render(&pixmap, QPoint(), toBePainted, renderFlags);
4952
4953         const bool restore = !(painter->renderHints() & QPainter::SmoothPixmapTransform);
4954         painter->setRenderHints(QPainter::SmoothPixmapTransform, true);
4955
4956         painter->drawPixmap(targetOffset, pixmap);
4957
4958         if (restore)
4959             painter->setRenderHints(QPainter::SmoothPixmapTransform, false);
4960
4961 #ifndef Q_WS_MAC
4962     } else {
4963         // Render via a pixmap in device coordinates (to avoid pixmap scaling).
4964         QTransform transform = originalTransform;
4965         transform.translate(targetOffset.x(), targetOffset.y());
4966
4967         QPaintDevice *device = painter->device();
4968         Q_ASSERT(device);
4969
4970         // Calculate device rect.
4971         const QRectF rect(toBePainted.boundingRect());
4972         QRect deviceRect = transform.mapRect(QRectF(0, 0, rect.width(), rect.height())).toAlignedRect();
4973         deviceRect &= QRect(0, 0, device->width(), device->height());
4974
4975         QPixmap pixmap(deviceRect.size());
4976         pixmap.fill(Qt::transparent);
4977
4978         // Create a pixmap device coordinate painter.
4979         QPainter pixmapPainter(&pixmap);
4980         pixmapPainter.setRenderHints(painter->renderHints());
4981         transform *= QTransform::fromTranslate(-deviceRect.x(), -deviceRect.y());
4982         pixmapPainter.setTransform(transform);
4983
4984         q->render(&pixmapPainter, QPoint(), toBePainted, renderFlags);
4985         pixmapPainter.end();
4986
4987         // And then draw the pixmap.
4988         painter->setTransform(QTransform());
4989         painter->drawPixmap(deviceRect.topLeft(), pixmap);
4990         painter->setTransform(originalTransform);
4991     }
4992 #endif
4993 }
4994
4995 void QWidgetPrivate::drawWidget(QPaintDevice *pdev, const QRegion &rgn, const QPoint &offset, int flags,
4996                                 QPainter *sharedPainter, QWidgetBackingStore *backingStore)
4997 {
4998     if (rgn.isEmpty())
4999         return;
5000
5001 #ifdef Q_WS_MAC
5002     if (qt_mac_clearDirtyOnWidgetInsideDrawWidget)
5003         dirtyOnWidget = QRegion();
5004
5005     // We disable the rendering of QToolBar in the backingStore if
5006     // it's supposed to be in the unified toolbar on Mac OS X.
5007     if (backingStore && isInUnifiedToolbar)
5008         return;
5009 #endif // Q_WS_MAC
5010
5011
5012     Q_Q(QWidget);
5013 #ifndef QT_NO_GRAPHICSEFFECT
5014     if (graphicsEffect && graphicsEffect->isEnabled()) {
5015         QGraphicsEffectSource *source = graphicsEffect->d_func()->source;
5016         QWidgetEffectSourcePrivate *sourced = static_cast<QWidgetEffectSourcePrivate *>
5017                                                          (source->d_func());
5018         if (!sourced->context) {
5019             QWidgetPaintContext context(pdev, rgn, offset, flags, sharedPainter, backingStore);
5020             sourced->context = &context;
5021             if (!sharedPainter) {
5022                 QPaintEngine *paintEngine = pdev->paintEngine();
5023                 paintEngine->d_func()->systemClip = rgn.translated(offset);
5024                 QPainter p(pdev);
5025                 p.translate(offset);
5026                 context.painter = &p;
5027                 graphicsEffect->draw(&p);
5028                 paintEngine->d_func()->systemClip = QRegion();
5029             } else {
5030                 context.painter = sharedPainter;
5031                 if (sharedPainter->worldTransform() != sourced->lastEffectTransform) {
5032                     sourced->invalidateCache();
5033                     sourced->lastEffectTransform = sharedPainter->worldTransform();
5034                 }
5035                 sharedPainter->save();
5036                 sharedPainter->translate(offset);
5037                 graphicsEffect->draw(sharedPainter);
5038                 sharedPainter->restore();
5039             }
5040             sourced->context = 0;
5041             return;
5042         }
5043     }
5044 #endif //QT_NO_GRAFFICSEFFECT
5045
5046     const bool asRoot = flags & DrawAsRoot;
5047     const bool alsoOnScreen = flags & DrawPaintOnScreen;
5048     const bool recursive = flags & DrawRecursive;
5049     const bool alsoInvisible = flags & DrawInvisible;
5050
5051     Q_ASSERT(sharedPainter ? sharedPainter->isActive() : true);
5052
5053     QRegion toBePainted(rgn);
5054     if (asRoot && !alsoInvisible)
5055         toBePainted &= clipRect(); //(rgn & visibleRegion());
5056     if (!(flags & DontSubtractOpaqueChildren))
5057         subtractOpaqueChildren(toBePainted, q->rect());
5058
5059     if (!toBePainted.isEmpty()) {
5060         bool onScreen = paintOnScreen();
5061         if (!onScreen || alsoOnScreen) {
5062             //update the "in paint event" flag
5063             if (q->testAttribute(Qt::WA_WState_InPaintEvent))
5064                 qWarning("QWidget::repaint: Recursive repaint detected");
5065             q->setAttribute(Qt::WA_WState_InPaintEvent);
5066
5067             //clip away the new area
5068 #ifndef QT_NO_PAINT_DEBUG
5069             bool flushed = QWidgetBackingStore::flushPaint(q, toBePainted);
5070 #endif
5071             QPaintEngine *paintEngine = pdev->paintEngine();
5072             if (paintEngine) {
5073                 setRedirected(pdev, -offset);
5074
5075 #ifdef Q_WS_MAC
5076                 // (Alien support) Special case for Mac when redirecting: If the paint device
5077                 // is of the Widget type we need to set WA_WState_InPaintEvent since painting
5078                 // outside the paint event is not supported on QWidgets. The attributeis
5079                 // restored further down.
5080                 if (pdev->devType() == QInternal::Widget)
5081                     static_cast<QWidget *>(pdev)->setAttribute(Qt::WA_WState_InPaintEvent);
5082
5083 #endif
5084                 if (sharedPainter)
5085                     paintEngine->d_func()->systemClip = toBePainted;
5086                 else
5087                     paintEngine->d_func()->systemRect = q->data->crect;
5088
5089                 //paint the background
5090                 if ((asRoot || q->autoFillBackground() || onScreen || q->testAttribute(Qt::WA_StyledBackground))
5091                     && !q->testAttribute(Qt::WA_OpaquePaintEvent) && !q->testAttribute(Qt::WA_NoSystemBackground)) {
5092                     QPainter p(q);
5093                     paintBackground(&p, toBePainted, (asRoot || onScreen) ? flags | DrawAsRoot : 0);
5094                 }
5095
5096                 if (!sharedPainter)
5097                     paintEngine->d_func()->systemClip = toBePainted.translated(offset);
5098
5099                 if (!onScreen && !asRoot && !isOpaque && q->testAttribute(Qt::WA_TintedBackground)) {
5100                     QPainter p(q);
5101                     QColor tint = q->palette().window().color();
5102                     tint.setAlphaF(qreal(.6));
5103                     p.fillRect(toBePainted.boundingRect(), tint);
5104                 }
5105             }
5106
5107 #if 0
5108             qDebug() << "painting" << q << "opaque ==" << isOpaque();
5109             qDebug() << "clipping to" << toBePainted << "location == " << offset
5110                      << "geometry ==" << QRect(q->mapTo(q->window(), QPoint(0, 0)), q->size());
5111 #endif
5112
5113             //actually send the paint event
5114             QPaintEvent e(toBePainted);
5115             QCoreApplication::sendSpontaneousEvent(q, &e);
5116
5117             //restore
5118             if (paintEngine) {
5119 #ifdef Q_WS_MAC
5120                 if (pdev->devType() == QInternal::Widget)
5121                     static_cast<QWidget *>(pdev)->setAttribute(Qt::WA_WState_InPaintEvent, false);
5122 #endif
5123                 restoreRedirected();
5124                 if (!sharedPainter)
5125                     paintEngine->d_func()->systemRect = QRect();
5126                 else
5127                     paintEngine->d_func()->currentClipDevice = 0;
5128                 paintEngine->d_func()->systemClip = QRegion();
5129             }
5130             q->setAttribute(Qt::WA_WState_InPaintEvent, false);
5131             if (q->paintingActive() && !q->testAttribute(Qt::WA_PaintOutsidePaintEvent))
5132                 qWarning("QWidget::repaint: It is dangerous to leave painters active on a widget outside of the PaintEvent");
5133
5134             if (paintEngine && paintEngine->autoDestruct()) {
5135                 delete paintEngine;
5136             }
5137
5138 #ifndef QT_NO_PAINT_DEBUG
5139             if (flushed)
5140                 QWidgetBackingStore::unflushPaint(q, toBePainted);
5141 #endif
5142         } else if (q->isWindow()) {
5143             QPaintEngine *engine = pdev->paintEngine();
5144             if (engine) {
5145                 QPainter p(pdev);
5146                 p.setClipRegion(toBePainted);
5147                 const QBrush bg = q->palette().brush(QPalette::Window);
5148                 if (bg.style() == Qt::TexturePattern)
5149                     p.drawTiledPixmap(q->rect(), bg.texture());
5150                 else
5151                     p.fillRect(q->rect(), bg);
5152
5153                 if (engine->autoDestruct())
5154                     delete engine;
5155             }
5156         }
5157     }
5158
5159     if (recursive && !children.isEmpty()) {
5160         paintSiblingsRecursive(pdev, children, children.size() - 1, rgn, offset, flags & ~DrawAsRoot
5161                                 , sharedPainter, backingStore);
5162     }
5163 }
5164
5165 void QWidgetPrivate::render(QPaintDevice *target, const QPoint &targetOffset,
5166                             const QRegion &sourceRegion, QWidget::RenderFlags renderFlags,
5167                             bool readyToRender)
5168 {
5169     if (!target) {
5170         qWarning("QWidget::render: null pointer to paint device");
5171         return;
5172     }
5173
5174     const bool inRenderWithPainter = extra && extra->inRenderWithPainter;
5175     QRegion paintRegion = !inRenderWithPainter && !readyToRender
5176                           ? prepareToRender(sourceRegion, renderFlags)
5177                           : sourceRegion;
5178     if (paintRegion.isEmpty())
5179         return;
5180
5181 #ifndef Q_WS_MAC
5182     QPainter *oldSharedPainter = inRenderWithPainter ? sharedPainter() : 0;
5183
5184     // Use the target's shared painter if set (typically set when doing
5185     // "other->render(widget);" in the widget's paintEvent.
5186     if (target->devType() == QInternal::Widget) {
5187         QWidgetPrivate *targetPrivate = static_cast<QWidget *>(target)->d_func();
5188         if (targetPrivate->extra && targetPrivate->extra->inRenderWithPainter) {
5189             QPainter *targetPainter = targetPrivate->sharedPainter();
5190             if (targetPainter && targetPainter->isActive())
5191                 setSharedPainter(targetPainter);
5192         }
5193     }
5194 #endif
5195
5196     // Use the target's redirected device if set and adjust offset and paint
5197     // region accordingly. This is typically the case when people call render
5198     // from the paintEvent.
5199     QPoint offset = targetOffset;
5200     offset -= paintRegion.boundingRect().topLeft();
5201     QPoint redirectionOffset;
5202     QPaintDevice *redirected = 0;
5203
5204     if (target->devType() == QInternal::Widget)
5205         redirected = static_cast<QWidget *>(target)->d_func()->redirected(&redirectionOffset);
5206     if (!redirected)
5207         redirected = QPainter::redirected(target, &redirectionOffset);
5208
5209     if (redirected) {
5210         target = redirected;
5211         offset -= redirectionOffset;
5212     }
5213
5214     if (!inRenderWithPainter) { // Clip handled by shared painter (in qpainter.cpp).
5215         if (QPaintEngine *targetEngine = target->paintEngine()) {
5216             const QRegion targetSystemClip = targetEngine->systemClip();
5217             if (!targetSystemClip.isEmpty())
5218                 paintRegion &= targetSystemClip.translated(-offset);
5219         }
5220     }
5221
5222     // Set backingstore flags.
5223     int flags = DrawPaintOnScreen | DrawInvisible;
5224     if (renderFlags & QWidget::DrawWindowBackground)
5225         flags |= DrawAsRoot;
5226
5227     if (renderFlags & QWidget::DrawChildren)
5228         flags |= DrawRecursive;
5229     else
5230         flags |= DontSubtractOpaqueChildren;
5231
5232     if (target->devType() == QInternal::Printer) {
5233         QPainter p(target);
5234         render_helper(&p, targetOffset, paintRegion, renderFlags);
5235         return;
5236     }
5237
5238 #ifndef Q_WS_MAC
5239     // Render via backingstore.
5240     drawWidget(target, paintRegion, offset, flags, sharedPainter());
5241
5242     // Restore shared painter.
5243     if (oldSharedPainter)
5244         setSharedPainter(oldSharedPainter);
5245 #else
5246     // Render via backingstore (no shared painter).
5247     drawWidget(target, paintRegion, offset, flags, 0);
5248 #endif
5249 }
5250
5251 void QWidgetPrivate::paintSiblingsRecursive(QPaintDevice *pdev, const QObjectList& siblings, int index, const QRegion &rgn,
5252                                             const QPoint &offset, int flags
5253                                             , QPainter *sharedPainter, QWidgetBackingStore *backingStore)
5254 {
5255     QWidget *w = 0;
5256     QRect boundingRect;
5257     bool dirtyBoundingRect = true;
5258     const bool exludeOpaqueChildren = (flags & DontDrawOpaqueChildren);
5259     const bool excludeNativeChildren = (flags & DontDrawNativeChildren);
5260
5261     do {
5262         QWidget *x =  qobject_cast<QWidget*>(siblings.at(index));
5263         if (x && !(exludeOpaqueChildren && x->d_func()->isOpaque) && !x->isHidden() && !x->isWindow()
5264             && !(excludeNativeChildren && x->internalWinId())) {
5265             if (dirtyBoundingRect) {
5266                 boundingRect = rgn.boundingRect();
5267                 dirtyBoundingRect = false;
5268             }
5269
5270             if (qRectIntersects(boundingRect, x->d_func()->effectiveRectFor(x->data->crect))) {
5271                 w = x;
5272                 break;
5273             }
5274         }
5275         --index;
5276     } while (index >= 0);
5277
5278     if (!w)
5279         return;
5280
5281     QWidgetPrivate *wd = w->d_func();
5282     const QPoint widgetPos(w->data->crect.topLeft());
5283     const bool hasMask = wd->extra && wd->extra->hasMask && !wd->graphicsEffect;
5284     if (index > 0) {
5285         QRegion wr(rgn);
5286         if (wd->isOpaque)
5287             wr -= hasMask ? wd->extra->mask.translated(widgetPos) : w->data->crect;
5288         paintSiblingsRecursive(pdev, siblings, --index, wr, offset, flags
5289                                , sharedPainter, backingStore);
5290     }
5291
5292     if (w->updatesEnabled()
5293 #ifndef QT_NO_GRAPHICSVIEW
5294             && (!w->d_func()->extra || !w->d_func()->extra->proxyWidget)
5295 #endif //QT_NO_GRAPHICSVIEW
5296        ) {
5297         QRegion wRegion(rgn);
5298         wRegion &= wd->effectiveRectFor(w->data->crect);
5299         wRegion.translate(-widgetPos);
5300         if (hasMask)
5301             wRegion &= wd->extra->mask;
5302         wd->drawWidget(pdev, wRegion, offset + widgetPos, flags, sharedPainter, backingStore);
5303     }
5304 }
5305
5306 #ifndef QT_NO_GRAPHICSEFFECT
5307 QRectF QWidgetEffectSourcePrivate::boundingRect(Qt::CoordinateSystem system) const
5308 {
5309     if (system != Qt::DeviceCoordinates)
5310         return m_widget->rect();
5311
5312     if (!context) {
5313         // Device coordinates without context not yet supported.
5314         qWarning("QGraphicsEffectSource::boundingRect: Not yet implemented, lacking device context");
5315         return QRectF();
5316     }
5317
5318     return context->painter->worldTransform().mapRect(m_widget->rect());
5319 }
5320
5321 void QWidgetEffectSourcePrivate::draw(QPainter *painter)
5322 {
5323     if (!context || context->painter != painter) {
5324         m_widget->render(painter);
5325         return;
5326     }
5327
5328     // The region saved in the context is neither clipped to the rect
5329     // nor the mask, so we have to clip it here before calling drawWidget.
5330     QRegion toBePainted = context->rgn;
5331     toBePainted &= m_widget->rect();
5332     QWidgetPrivate *wd = qt_widget_private(m_widget);
5333     if (wd->extra && wd->extra->hasMask)
5334         toBePainted &= wd->extra->mask;
5335
5336     wd->drawWidget(context->pdev, toBePainted, context->offset, context->flags,
5337                    context->sharedPainter, context->backingStore);
5338 }
5339
5340 QPixmap QWidgetEffectSourcePrivate::pixmap(Qt::CoordinateSystem system, QPoint *offset,
5341                                            QGraphicsEffect::PixmapPadMode mode) const
5342 {
5343     const bool deviceCoordinates = (system == Qt::DeviceCoordinates);
5344     if (!context && deviceCoordinates) {
5345         // Device coordinates without context not yet supported.
5346         qWarning("QGraphicsEffectSource::pixmap: Not yet implemented, lacking device context");
5347         return QPixmap();
5348     }
5349
5350     QPoint pixmapOffset;
5351     QRectF sourceRect = m_widget->rect();
5352
5353     if (deviceCoordinates) {
5354         const QTransform &painterTransform = context->painter->worldTransform();
5355         sourceRect = painterTransform.mapRect(sourceRect);
5356         pixmapOffset = painterTransform.map(pixmapOffset);
5357     }
5358
5359     QRect effectRect;
5360
5361     if (mode == QGraphicsEffect::PadToEffectiveBoundingRect)
5362         effectRect = m_widget->graphicsEffect()->boundingRectFor(sourceRect).toAlignedRect();
5363     else if (mode == QGraphicsEffect::PadToTransparentBorder)
5364         effectRect = sourceRect.adjusted(-1, -1, 1, 1).toAlignedRect();
5365     else
5366         effectRect = sourceRect.toAlignedRect();
5367
5368     if (offset)
5369         *offset = effectRect.topLeft();
5370
5371     pixmapOffset -= effectRect.topLeft();
5372
5373     QPixmap pixmap(effectRect.size());
5374     pixmap.fill(Qt::transparent);
5375     m_widget->render(&pixmap, pixmapOffset, QRegion(), QWidget::DrawChildren);
5376     return pixmap;
5377 }
5378 #endif //QT_NO_GRAPHICSEFFECT
5379
5380 #ifndef QT_NO_GRAPHICSVIEW
5381 /*!
5382     \internal
5383
5384     Finds the nearest widget embedded in a graphics proxy widget along the chain formed by this
5385     widget and its ancestors. The search starts at \a origin (inclusive).
5386     If successful, the function returns the proxy that embeds the widget, or 0 if no embedded
5387     widget was found.
5388 */
5389 QGraphicsProxyWidget * QWidgetPrivate::nearestGraphicsProxyWidget(const QWidget *origin)
5390 {
5391     if (origin) {
5392         QWExtra *extra = origin->d_func()->extra;
5393         if (extra && extra->proxyWidget)
5394             return extra->proxyWidget;
5395         return nearestGraphicsProxyWidget(origin->parentWidget());
5396     }
5397     return 0;
5398 }
5399 #endif
5400
5401 /*!
5402     \property QWidget::locale
5403     \brief the widget's locale
5404     \since 4.3
5405
5406     As long as no special locale has been set, this is either
5407     the parent's locale or (if this widget is a top level widget),
5408     the default locale.
5409
5410     If the widget displays dates or numbers, these should be formatted
5411     using the widget's locale.
5412
5413     \sa QLocale QLocale::setDefault()
5414 */
5415
5416 void QWidgetPrivate::setLocale_helper(const QLocale &loc, bool forceUpdate)
5417 {
5418     Q_Q(QWidget);
5419     if (locale == loc && !forceUpdate)
5420         return;
5421
5422     locale = loc;
5423
5424     if (!children.isEmpty()) {
5425         for (int i = 0; i < children.size(); ++i) {
5426             QWidget *w = qobject_cast<QWidget*>(children.at(i));
5427             if (!w)
5428                 continue;
5429             if (w->testAttribute(Qt::WA_SetLocale))
5430                 continue;
5431             if (w->isWindow() && !w->testAttribute(Qt::WA_WindowPropagation))
5432                 continue;
5433             w->d_func()->setLocale_helper(loc, forceUpdate);
5434         }
5435     }
5436     QEvent e(QEvent::LocaleChange);
5437     QApplication::sendEvent(q, &e);
5438 }
5439
5440 void QWidget::setLocale(const QLocale &locale)
5441 {
5442     Q_D(QWidget);
5443
5444     setAttribute(Qt::WA_SetLocale);
5445     d->setLocale_helper(locale);
5446 }
5447
5448 QLocale QWidget::locale() const
5449 {
5450     Q_D(const QWidget);
5451
5452     return d->locale;
5453 }
5454
5455 void QWidgetPrivate::resolveLocale()
5456 {
5457     Q_Q(const QWidget);
5458
5459     if (!q->testAttribute(Qt::WA_SetLocale)) {
5460         setLocale_helper(q->isWindow()
5461                             ? QLocale()
5462                             : q->parentWidget()->locale());
5463     }
5464 }
5465
5466 void QWidget::unsetLocale()
5467 {
5468     Q_D(QWidget);
5469     setAttribute(Qt::WA_SetLocale, false);
5470     d->resolveLocale();
5471 }
5472
5473 static QString constructWindowTitleFromFilePath(const QString &filePath)
5474 {
5475     QFileInfo fi(filePath);
5476     QString windowTitle = fi.fileName() + QLatin1String("[*]");
5477 #ifndef Q_WS_MAC
5478     QString appName = QApplication::applicationName();
5479     if (!appName.isEmpty())
5480         windowTitle += QLatin1Char(' ') + QChar(0x2014) + QLatin1Char(' ') + appName;
5481 #endif
5482     return windowTitle;
5483 }
5484
5485 /*!
5486     \property QWidget::windowTitle
5487     \brief the window title (caption)
5488
5489     This property only makes sense for top-level widgets, such as
5490     windows and dialogs. If no caption has been set, the title is based of the
5491     \l windowFilePath. If neither of these is set, then the title is
5492     an empty string.
5493
5494     If you use the \l windowModified mechanism, the window title must
5495     contain a "[*]" placeholder, which indicates where the '*' should
5496     appear. Normally, it should appear right after the file name
5497     (e.g., "document1.txt[*] - Text Editor"). If the \l
5498     windowModified property is false (the default), the placeholder
5499     is simply removed.
5500
5501     \sa windowIcon, windowIconText, windowModified, windowFilePath
5502 */
5503 QString QWidget::windowTitle() const
5504 {
5505     Q_D(const QWidget);
5506     if (d->extra && d->extra->topextra) {
5507         if (!d->extra->topextra->caption.isEmpty())
5508             return d->extra->topextra->caption;
5509         if (!d->extra->topextra->filePath.isEmpty())
5510             return constructWindowTitleFromFilePath(d->extra->topextra->filePath);
5511     }
5512     return QString();
5513 }
5514
5515 /*!
5516     Returns a modified window title with the [*] place holder
5517     replaced according to the rules described in QWidget::setWindowTitle
5518
5519     This function assumes that "[*]" can be quoted by another
5520     "[*]", so it will replace two place holders by one and
5521     a single last one by either "*" or nothing depending on
5522     the modified flag.
5523
5524     \internal
5525 */
5526 QString qt_setWindowTitle_helperHelper(const QString &title, const QWidget *widget)
5527 {
5528     Q_ASSERT(widget);
5529
5530 #ifdef QT_EVAL
5531     extern QString qt_eval_adapt_window_title(const QString &title);
5532     QString cap = qt_eval_adapt_window_title(title);
5533 #else
5534     QString cap = title;
5535 #endif
5536
5537     if (cap.isEmpty())
5538         return cap;
5539
5540     QLatin1String placeHolder("[*]");
5541     int placeHolderLength = 3; // QLatin1String doesn't have length()
5542
5543     int index = cap.indexOf(placeHolder);
5544
5545     // here the magic begins
5546     while (index != -1) {
5547         index += placeHolderLength;
5548         int count = 1;
5549         while (cap.indexOf(placeHolder, index) == index) {
5550             ++count;
5551             index += placeHolderLength;
5552         }
5553
5554         if (count%2) { // odd number of [*] -> replace last one
5555             int lastIndex = cap.lastIndexOf(placeHolder, index - 1);
5556             if (widget->isWindowModified()
5557              && widget->style()->styleHint(QStyle::SH_TitleBar_ModifyNotification, 0, widget))
5558                 cap.replace(lastIndex, 3, QWidget::tr("*"));
5559             else
5560                 cap.remove(lastIndex, 3);
5561         }
5562
5563         index = cap.indexOf(placeHolder, index);
5564     }
5565
5566     cap.replace(QLatin1String("[*][*]"), placeHolder);
5567
5568     return cap;
5569 }
5570
5571 void QWidgetPrivate::setWindowTitle_helper(const QString &title)
5572 {
5573     Q_Q(QWidget);
5574     if (q->testAttribute(Qt::WA_WState_Created))
5575         setWindowTitle_sys(qt_setWindowTitle_helperHelper(title, q));
5576 }
5577
5578 void QWidgetPrivate::setWindowIconText_helper(const QString &title)
5579 {
5580     Q_Q(QWidget);
5581     if (q->testAttribute(Qt::WA_WState_Created))
5582         setWindowIconText_sys(qt_setWindowTitle_helperHelper(title, q));
5583 }
5584
5585 void QWidget::setWindowIconText(const QString &iconText)
5586 {
5587     if (QWidget::windowIconText() == iconText)
5588         return;
5589
5590     Q_D(QWidget);
5591     d->topData()->iconText = iconText;
5592     d->setWindowIconText_helper(iconText);
5593
5594     QEvent e(QEvent::IconTextChange);
5595     QApplication::sendEvent(this, &e);
5596 }
5597
5598 void QWidget::setWindowTitle(const QString &title)
5599 {
5600     if (QWidget::windowTitle() == title && !title.isEmpty() && !title.isNull())
5601         return;
5602
5603     Q_D(QWidget);
5604     d->topData()->caption = title;
5605     d->setWindowTitle_helper(title);
5606
5607     QEvent e(QEvent::WindowTitleChange);
5608     QApplication::sendEvent(this, &e);
5609 }
5610
5611
5612 /*!
5613     \property QWidget::windowIcon
5614     \brief the widget's icon
5615
5616     This property only makes sense for windows. If no icon
5617     has been set, windowIcon() returns the application icon
5618     (QApplication::windowIcon()).
5619
5620     \sa windowIconText, windowTitle
5621 */
5622 QIcon QWidget::windowIcon() const
5623 {
5624     const QWidget *w = this;
5625     while (w) {
5626         const QWidgetPrivate *d = w->d_func();
5627         if (d->extra && d->extra->topextra && d->extra->topextra->icon)
5628             return *d->extra->topextra->icon;
5629         w = w->parentWidget();
5630     }
5631     return QApplication::windowIcon();
5632 }
5633
5634 void QWidgetPrivate::setWindowIcon_helper()
5635 {
5636     QEvent e(QEvent::WindowIconChange);
5637     QApplication::sendEvent(q_func(), &e);
5638     for (int i = 0; i < children.size(); ++i) {
5639         QWidget *w = qobject_cast<QWidget *>(children.at(i));
5640         if (w && !w->isWindow())
5641             QApplication::sendEvent(w, &e);
5642     }
5643 }
5644
5645 void QWidget::setWindowIcon(const QIcon &icon)
5646 {
5647     Q_D(QWidget);
5648
5649     setAttribute(Qt::WA_SetWindowIcon, !icon.isNull());
5650     d->createTLExtra();
5651
5652     if (!d->extra->topextra->icon)
5653         d->extra->topextra->icon = new QIcon();
5654     *d->extra->topextra->icon = icon;
5655
5656     delete d->extra->topextra->iconPixmap;
5657     d->extra->topextra->iconPixmap = 0;
5658
5659     d->setWindowIcon_sys();
5660     d->setWindowIcon_helper();
5661 }
5662
5663
5664 /*!
5665     \property QWidget::windowIconText
5666     \brief the widget's icon text
5667
5668     This property only makes sense for windows. If no icon
5669     text has been set, this functions returns an empty string.
5670
5671     \sa windowIcon, windowTitle
5672 */
5673
5674 QString QWidget::windowIconText() const
5675 {
5676     Q_D(const QWidget);
5677     return (d->extra && d->extra->topextra) ? d->extra->topextra->iconText : QString();
5678 }
5679
5680 /*!
5681     \property QWidget::windowFilePath
5682     \since 4.4
5683     \brief the file path associated with a widget
5684
5685     This property only makes sense for windows. It associates a file path with
5686     a window. If you set the file path, but have not set the window title, Qt
5687     sets the window title to contain a string created using the following
5688     components.
5689
5690     On Mac OS X:
5691
5692     \list
5693     \li The file name of the specified path, obtained using QFileInfo::fileName().
5694     \endlist
5695
5696     On Windows and X11:
5697
5698     \list
5699     \li The file name of the specified path, obtained using QFileInfo::fileName().
5700     \li An optional \c{*} character, if the \l windowModified property is set.
5701     \li The \c{0x2014} unicode character, padded either side by spaces.
5702     \li The application name, obtained from the application's
5703     \l{QCoreApplication::}{applicationName} property.
5704     \endlist
5705
5706     If the window title is set at any point, then the window title takes precedence and
5707     will be shown instead of the file path string.
5708
5709     Additionally, on Mac OS X, this has an added benefit that it sets the
5710     \l{http://developer.apple.com/documentation/UserExperience/Conceptual/OSXHIGuidelines/XHIGWindows/chapter_17_section_3.html}{proxy icon}
5711     for the window, assuming that the file path exists.
5712
5713     If no file path is set, this property contains an empty string.
5714
5715     By default, this property contains an empty string.
5716
5717     \sa windowTitle, windowIcon
5718 */
5719
5720 QString QWidget::windowFilePath() const
5721 {
5722     Q_D(const QWidget);
5723     return (d->extra && d->extra->topextra) ? d->extra->topextra->filePath : QString();
5724 }
5725
5726 void QWidget::setWindowFilePath(const QString &filePath)
5727 {
5728     if (filePath == windowFilePath())
5729         return;
5730
5731     Q_D(QWidget);
5732
5733     d->createTLExtra();
5734     d->extra->topextra->filePath = filePath;
5735     d->setWindowFilePath_helper(filePath);
5736 }
5737
5738 void QWidgetPrivate::setWindowFilePath_helper(const QString &filePath)
5739 {
5740     if (extra->topextra && extra->topextra->caption.isEmpty()) {
5741 #ifdef Q_WS_MAC
5742         setWindowTitle_helper(QFileInfo(filePath).fileName());
5743 #else
5744         Q_Q(QWidget);
5745         Q_UNUSED(filePath);
5746         setWindowTitle_helper(q->windowTitle());
5747 #endif
5748     }
5749 #ifdef Q_WS_MAC
5750     setWindowFilePath_sys(filePath);
5751 #endif
5752 }
5753
5754 /*!
5755     Returns the window's role, or an empty string.
5756
5757     \sa windowIcon, windowTitle
5758 */
5759
5760 QString QWidget::windowRole() const
5761 {
5762     Q_D(const QWidget);
5763     return (d->extra && d->extra->topextra) ? d->extra->topextra->role : QString();
5764 }
5765
5766 /*!
5767     Sets the window's role to \a role. This only makes sense for
5768     windows on X11.
5769 */
5770 void QWidget::setWindowRole(const QString &role)
5771 {
5772 #if defined(Q_WS_X11)
5773     Q_D(QWidget);
5774     d->topData()->role = role;
5775     d->setWindowRole();
5776 #else
5777     Q_UNUSED(role)
5778 #endif
5779 }
5780
5781 /*!
5782     \property QWidget::mouseTracking
5783     \brief whether mouse tracking is enabled for the widget
5784
5785     If mouse tracking is disabled (the default), the widget only
5786     receives mouse move events when at least one mouse button is
5787     pressed while the mouse is being moved.
5788
5789     If mouse tracking is enabled, the widget receives mouse move
5790     events even if no buttons are pressed.
5791
5792     \sa mouseMoveEvent()
5793 */
5794
5795
5796 /*!
5797     Sets the widget's focus proxy to widget \a w. If \a w is 0, the
5798     function resets this widget to have no focus proxy.
5799
5800     Some widgets can "have focus", but create a child widget, such as
5801     QLineEdit, to actually handle the focus. In this case, the widget
5802     can set the line edit to be its focus proxy.
5803
5804     setFocusProxy() sets the widget which will actually get focus when
5805     "this widget" gets it. If there is a focus proxy, setFocus() and
5806     hasFocus() operate on the focus proxy.
5807
5808     \sa focusProxy()
5809 */
5810
5811 void QWidget::setFocusProxy(QWidget * w)
5812 {
5813     Q_D(QWidget);
5814     if (!w && !d->extra)
5815         return;
5816
5817     for (QWidget* fp  = w; fp; fp = fp->focusProxy()) {
5818         if (fp == this) {
5819             qWarning("QWidget: %s (%s) already in focus proxy chain", metaObject()->className(), objectName().toLocal8Bit().constData());
5820             return;
5821         }
5822     }
5823
5824     d->createExtra();
5825     d->extra->focus_proxy = w;
5826 }
5827
5828
5829 /*!
5830     Returns the focus proxy, or 0 if there is no focus proxy.
5831
5832     \sa setFocusProxy()
5833 */
5834
5835 QWidget * QWidget::focusProxy() const
5836 {
5837     Q_D(const QWidget);
5838     return d->extra ? (QWidget *)d->extra->focus_proxy : 0;
5839 }
5840
5841
5842 /*!
5843     \property QWidget::focus
5844     \brief whether this widget (or its focus proxy) has the keyboard
5845     input focus
5846
5847     By default, this property is false.
5848
5849     \note Obtaining the value of this property for a widget is effectively equivalent
5850     to checking whether QApplication::focusWidget() refers to the widget.
5851
5852     \sa setFocus(), clearFocus(), setFocusPolicy(), QApplication::focusWidget()
5853 */
5854 bool QWidget::hasFocus() const
5855 {
5856     const QWidget* w = this;
5857     while (w->d_func()->extra && w->d_func()->extra->focus_proxy)
5858         w = w->d_func()->extra->focus_proxy;
5859     if (QWidget *window = w->window()) {
5860 #ifndef QT_NO_GRAPHICSVIEW
5861         QWExtra *e = window->d_func()->extra;
5862         if (e && e->proxyWidget && e->proxyWidget->hasFocus() && window->focusWidget() == w)
5863             return true;
5864 #endif
5865     }
5866     return (QApplication::focusWidget() == w);
5867 }
5868
5869 /*!
5870     Gives the keyboard input focus to this widget (or its focus
5871     proxy) if this widget or one of its parents is the \link
5872     isActiveWindow() active window\endlink. The \a reason argument will
5873     be passed into any focus event sent from this function, it is used
5874     to give an explanation of what caused the widget to get focus.
5875     If the window is not active, the widget will be given the focus when
5876     the window becomes active.
5877
5878     First, a focus about to change event is sent to the focus widget (if any) to
5879     tell it that it is about to lose the focus. Then focus is changed, a
5880     focus out event is sent to the previous focus item and a focus in event is sent
5881     to the new item to tell it that it just received the focus.
5882     (Nothing happens if the focus in and focus out widgets are the
5883     same.)
5884
5885     \note On embedded platforms, setFocus() will not cause an input panel
5886     to be opened by the input method. If you want this to happen, you
5887     have to send a QEvent::RequestSoftwareInputPanel event to the
5888     widget yourself.
5889
5890     setFocus() gives focus to a widget regardless of its focus policy,
5891     but does not clear any keyboard grab (see grabKeyboard()).
5892
5893     Be aware that if the widget is hidden, it will not accept focus
5894     until it is shown.
5895
5896     \warning If you call setFocus() in a function which may itself be
5897     called from focusOutEvent() or focusInEvent(), you may get an
5898     infinite recursion.
5899
5900     \sa hasFocus(), clearFocus(), focusInEvent(), focusOutEvent(),
5901     setFocusPolicy(), focusWidget(), QApplication::focusWidget(), grabKeyboard(),
5902     grabMouse(), {Keyboard Focus}, QEvent::RequestSoftwareInputPanel
5903 */
5904
5905 void QWidget::setFocus(Qt::FocusReason reason)
5906 {
5907     if (!isEnabled())
5908         return;
5909
5910     QWidget *f = this;
5911     while (f->d_func()->extra && f->d_func()->extra->focus_proxy)
5912         f = f->d_func()->extra->focus_proxy;
5913
5914     if (QApplication::focusWidget() == f
5915 #if defined(Q_WS_WIN)
5916         && GetFocus() == f->internalWinId()
5917 #endif
5918        )
5919         return;
5920
5921 #ifndef QT_NO_GRAPHICSVIEW
5922     QWidget *previousProxyFocus = 0;
5923     if (QWExtra *topData = window()->d_func()->extra) {
5924         if (topData->proxyWidget && topData->proxyWidget->hasFocus()) {
5925             previousProxyFocus = topData->proxyWidget->widget()->focusWidget();
5926             if (previousProxyFocus && previousProxyFocus->focusProxy())
5927                 previousProxyFocus = previousProxyFocus->focusProxy();
5928             if (previousProxyFocus == this && !topData->proxyWidget->d_func()->proxyIsGivingFocus)
5929                 return;
5930         }
5931     }
5932 #endif
5933
5934 #ifndef QT_NO_GRAPHICSVIEW
5935     // Update proxy state
5936     if (QWExtra *topData = window()->d_func()->extra) {
5937         if (topData->proxyWidget && !topData->proxyWidget->hasFocus()) {
5938             f->d_func()->updateFocusChild();
5939             topData->proxyWidget->d_func()->focusFromWidgetToProxy = 1;
5940             topData->proxyWidget->setFocus(reason);
5941             topData->proxyWidget->d_func()->focusFromWidgetToProxy = 0;
5942         }
5943     }
5944 #endif
5945
5946     if (f->isActiveWindow()) {
5947         QWidget *prev = QApplicationPrivate::focus_widget;
5948         if (prev) {
5949             if (reason != Qt::PopupFocusReason && reason != Qt::MenuBarFocusReason
5950                 && prev->testAttribute(Qt::WA_InputMethodEnabled)) {
5951                 qApp->inputMethod()->reset();
5952             }
5953
5954             if (reason != Qt::NoFocusReason) {
5955                 QFocusEvent focusAboutToChange(QEvent::FocusAboutToChange, reason);
5956                 QApplication::sendEvent(prev, &focusAboutToChange);
5957             }
5958         }
5959
5960         f->d_func()->updateFocusChild();
5961
5962         QApplicationPrivate::setFocusWidget(f, reason);
5963 #ifndef QT_NO_ACCESSIBILITY
5964 # ifdef Q_OS_WIN
5965         // The negation of the condition in setFocus_sys
5966         if (!(testAttribute(Qt::WA_WState_Created) && window()->windowType() != Qt::Popup && internalWinId()))
5967             //setFocusWidget will already post a focus event for us (that the AT client receives) on Windows
5968 # endif
5969 # ifdef  Q_OS_UNIX
5970         // menus update the focus manually and this would create bogus events
5971         if (!(f->inherits("QMenuBar") || f->inherits("QMenu") || f->inherits("QMenuItem")))
5972 # endif
5973         {
5974             QAccessibleEvent event(f, QAccessible::Focus);
5975             QAccessible::updateAccessibility(&event);
5976         }
5977 #endif
5978 #ifndef QT_NO_GRAPHICSVIEW
5979         if (QWExtra *topData = window()->d_func()->extra) {
5980             if (topData->proxyWidget) {
5981                 if (previousProxyFocus && previousProxyFocus != f) {
5982                     // Send event to self
5983                     QFocusEvent event(QEvent::FocusOut, reason);
5984                     QPointer<QWidget> that = previousProxyFocus;
5985                     QApplication::sendEvent(previousProxyFocus, &event);
5986                     if (that)
5987                         QApplication::sendEvent(that->style(), &event);
5988                 }
5989                 if (!isHidden()) {
5990 #ifndef QT_NO_GRAPHICSVIEW
5991                     // Update proxy state
5992                     if (QWExtra *topData = window()->d_func()->extra)
5993                         if (topData->proxyWidget && topData->proxyWidget->hasFocus())
5994                             topData->proxyWidget->d_func()->updateProxyInputMethodAcceptanceFromWidget();
5995 #endif
5996                     // Send event to self
5997                     QFocusEvent event(QEvent::FocusIn, reason);
5998                     QPointer<QWidget> that = f;
5999                     QApplication::sendEvent(f, &event);
6000                     if (that)
6001                         QApplication::sendEvent(that->style(), &event);
6002                 }
6003             }
6004         }
6005 #endif
6006     } else {
6007         f->d_func()->updateFocusChild();
6008     }
6009
6010     if (QTLWExtra *extra = f->window()->d_func()->maybeTopData())
6011         emit extra->window->focusObjectChanged(f);
6012 }
6013
6014 // updates focus_child on parent widgets to point into this widget
6015 void QWidgetPrivate::updateFocusChild()
6016 {
6017     Q_Q(QWidget);
6018
6019     QWidget *w = q;
6020     if (q->isHidden()) {
6021         while (w && w->isHidden()) {
6022             w->d_func()->focus_child = q;
6023             w = w->isWindow() ? 0 : w->parentWidget();
6024         }
6025     } else {
6026         while (w) {
6027             w->d_func()->focus_child = q;
6028             w = w->isWindow() ? 0 : w->parentWidget();
6029         }
6030     }
6031 }
6032
6033 /*!
6034     \fn void QWidget::setFocus()
6035     \overload
6036
6037     Gives the keyboard input focus to this widget (or its focus
6038     proxy) if this widget or one of its parents is the
6039     \l{isActiveWindow()}{active window}.
6040 */
6041
6042 /*!
6043     Takes keyboard input focus from the widget.
6044
6045     If the widget has active focus, a \link focusOutEvent() focus out
6046     event\endlink is sent to this widget to tell it that it has
6047     lost the focus.
6048
6049     This widget must enable focus setting in order to get the keyboard
6050     input focus, i.e. it must call setFocusPolicy().
6051
6052     \sa hasFocus(), setFocus(), focusInEvent(), focusOutEvent(),
6053     setFocusPolicy(), QApplication::focusWidget()
6054 */
6055
6056 void QWidget::clearFocus()
6057 {
6058     if (hasFocus()) {
6059         if (testAttribute(Qt::WA_InputMethodEnabled))
6060             qApp->inputMethod()->reset();
6061
6062         QFocusEvent focusAboutToChange(QEvent::FocusAboutToChange);
6063         QApplication::sendEvent(this, &focusAboutToChange);
6064     }
6065
6066     QWidget *w = this;
6067     while (w) {
6068         if (w->d_func()->focus_child == this)
6069             w->d_func()->focus_child = 0;
6070         w = w->parentWidget();
6071     }
6072 #ifndef QT_NO_GRAPHICSVIEW
6073     QWExtra *topData = d_func()->extra;
6074     if (topData && topData->proxyWidget)
6075         topData->proxyWidget->clearFocus();
6076 #endif
6077
6078     if (hasFocus()) {
6079         // Update proxy state
6080         QApplicationPrivate::setFocusWidget(0, Qt::OtherFocusReason);
6081 #if defined(Q_WS_WIN)
6082         if (!(windowType() == Qt::Popup) && GetFocus() == internalWinId())
6083             SetFocus(0);
6084         else
6085 #endif
6086         {
6087 #ifndef QT_NO_ACCESSIBILITY
6088             QAccessibleEvent event(this, QAccessible::Focus);
6089             QAccessible::updateAccessibility(&event);
6090 #endif
6091         }
6092     }
6093 }
6094
6095
6096 /*!
6097     \fn bool QWidget::focusNextChild()
6098
6099     Finds a new widget to give the keyboard focus to, as appropriate
6100     for \key Tab, and returns true if it can find a new widget, or
6101     false if it can't.
6102
6103     \sa focusPreviousChild()
6104 */
6105
6106 /*!
6107     \fn bool QWidget::focusPreviousChild()
6108
6109     Finds a new widget to give the keyboard focus to, as appropriate
6110     for \key Shift+Tab, and returns true if it can find a new widget,
6111     or false if it can't.
6112
6113     \sa focusNextChild()
6114 */
6115
6116 /*!
6117     Finds a new widget to give the keyboard focus to, as appropriate
6118     for Tab and Shift+Tab, and returns true if it can find a new
6119     widget, or false if it can't.
6120
6121     If \a next is true, this function searches forward, if \a next
6122     is false, it searches backward.
6123
6124     Sometimes, you will want to reimplement this function. For
6125     example, a web browser might reimplement it to move its "current
6126     active link" forward or backward, and call
6127     focusNextPrevChild() only when it reaches the last or
6128     first link on the "page".
6129
6130     Child widgets call focusNextPrevChild() on their parent widgets,
6131     but only the window that contains the child widgets decides where
6132     to redirect focus. By reimplementing this function for an object,
6133     you thus gain control of focus traversal for all child widgets.
6134
6135     \sa focusNextChild(), focusPreviousChild()
6136 */
6137
6138 bool QWidget::focusNextPrevChild(bool next)
6139 {
6140     Q_D(QWidget);
6141     QWidget* p = parentWidget();
6142     bool isSubWindow = (windowType() == Qt::SubWindow);
6143     if (!isWindow() && !isSubWindow && p)
6144         return p->focusNextPrevChild(next);
6145 #ifndef QT_NO_GRAPHICSVIEW
6146     if (d->extra && d->extra->proxyWidget)
6147         return d->extra->proxyWidget->focusNextPrevChild(next);
6148 #endif
6149     QWidget *w = QApplicationPrivate::focusNextPrevChild_helper(this, next);
6150     if (!w) return false;
6151
6152     w->setFocus(next ? Qt::TabFocusReason : Qt::BacktabFocusReason);
6153     return true;
6154 }
6155
6156 /*!
6157     Returns the last child of this widget that setFocus had been
6158     called on.  For top level widgets this is the widget that will get
6159     focus in case this window gets activated
6160
6161     This is not the same as QApplication::focusWidget(), which returns
6162     the focus widget in the currently active window.
6163 */
6164
6165 QWidget *QWidget::focusWidget() const
6166 {
6167     return const_cast<QWidget *>(d_func()->focus_child);
6168 }
6169
6170 /*!
6171     Returns the next widget in this widget's focus chain.
6172
6173     \sa previousInFocusChain()
6174 */
6175 QWidget *QWidget::nextInFocusChain() const
6176 {
6177     return const_cast<QWidget *>(d_func()->focus_next);
6178 }
6179
6180 /*!
6181     \brief The previousInFocusChain function returns the previous
6182     widget in this widget's focus chain.
6183
6184     \sa nextInFocusChain()
6185
6186     \since 4.6
6187 */
6188 QWidget *QWidget::previousInFocusChain() const
6189 {
6190     return const_cast<QWidget *>(d_func()->focus_prev);
6191 }
6192
6193 /*!
6194     \property QWidget::isActiveWindow
6195     \brief whether this widget's window is the active window
6196
6197     The active window is the window that contains the widget that has
6198     keyboard focus (The window may still have focus if it has no
6199     widgets or none of its widgets accepts keyboard focus).
6200
6201     When popup windows are visible, this property is true for both the
6202     active window \e and for the popup.
6203
6204     By default, this property is false.
6205
6206     \sa activateWindow(), QApplication::activeWindow()
6207 */
6208 bool QWidget::isActiveWindow() const
6209 {
6210     QWidget *tlw = window();
6211     if(tlw == QApplication::activeWindow() || (isVisible() && (tlw->windowType() == Qt::Popup)))
6212         return true;
6213
6214 #ifndef QT_NO_GRAPHICSVIEW
6215     if (QWExtra *tlwExtra = tlw->d_func()->extra) {
6216         if (isVisible() && tlwExtra->proxyWidget)
6217             return tlwExtra->proxyWidget->isActiveWindow();
6218     }
6219 #endif
6220
6221 #ifdef Q_WS_MAC
6222     extern bool qt_mac_is_macdrawer(const QWidget *); //qwidget_mac.cpp
6223     if(qt_mac_is_macdrawer(tlw) &&
6224        tlw->parentWidget() && tlw->parentWidget()->isActiveWindow())
6225         return true;
6226
6227     extern bool qt_mac_insideKeyWindow(const QWidget *); //qwidget_mac.cpp
6228     if (QApplication::testAttribute(Qt::AA_MacPluginApplication) && qt_mac_insideKeyWindow(tlw))
6229         return true;
6230 #endif
6231     if(style()->styleHint(QStyle::SH_Widget_ShareActivation, 0, this)) {
6232         if(tlw->windowType() == Qt::Tool &&
6233            !tlw->isModal() &&
6234            (!tlw->parentWidget() || tlw->parentWidget()->isActiveWindow()))
6235            return true;
6236         QWidget *w = QApplication::activeWindow();
6237         while(w && tlw->windowType() == Qt::Tool &&
6238               !w->isModal() && w->parentWidget()) {
6239             w = w->parentWidget()->window();
6240             if(w == tlw)
6241                 return true;
6242         }
6243     }
6244 #if defined(Q_WS_WIN32)
6245     HWND active = GetActiveWindow();
6246     if (!tlw->testAttribute(Qt::WA_WState_Created))
6247         return false;
6248     return active == tlw->internalWinId() || ::IsChild(active, tlw->internalWinId());
6249 #else
6250     return false;
6251 #endif
6252 }
6253
6254 /*!
6255     Puts the \a second widget after the \a first widget in the focus order.
6256
6257     Note that since the tab order of the \a second widget is changed, you
6258     should order a chain like this:
6259
6260     \snippet doc/src/snippets/code/src_gui_kernel_qwidget.cpp 9
6261
6262     \e not like this:
6263
6264     \snippet doc/src/snippets/code/src_gui_kernel_qwidget.cpp 10
6265
6266     If \a first or \a second has a focus proxy, setTabOrder()
6267     correctly substitutes the proxy.
6268
6269     \sa setFocusPolicy(), setFocusProxy(), {Keyboard Focus}
6270 */
6271 void QWidget::setTabOrder(QWidget* first, QWidget *second)
6272 {
6273     if (!first || !second || first->focusPolicy() == Qt::NoFocus || second->focusPolicy() == Qt::NoFocus)
6274         return;
6275
6276     if (first->window() != second->window()) {
6277         qWarning("QWidget::setTabOrder: 'first' and 'second' must be in the same window");
6278         return;
6279     }
6280
6281     QWidget *fp = first->focusProxy();
6282     if (fp) {
6283         // If first is redirected, set first to the last child of first
6284         // that can take keyboard focus so that second is inserted after
6285         // that last child, and the focus order within first is (more
6286         // likely to be) preserved.
6287         QList<QWidget *> l = first->findChildren<QWidget *>();
6288         for (int i = l.size()-1; i >= 0; --i) {
6289             QWidget * next = l.at(i);
6290             if (next->window() == fp->window()) {
6291                 fp = next;
6292                 if (fp->focusPolicy() != Qt::NoFocus)
6293                     break;
6294             }
6295         }
6296         first = fp;
6297     }
6298
6299     if (fp == second)
6300         return;
6301
6302     if (QWidget *sp = second->focusProxy())
6303         second = sp;
6304
6305 //    QWidget *fp = first->d_func()->focus_prev;
6306     QWidget *fn = first->d_func()->focus_next;
6307
6308     if (fn == second || first == second)
6309         return;
6310
6311     QWidget *sp = second->d_func()->focus_prev;
6312     QWidget *sn = second->d_func()->focus_next;
6313
6314     fn->d_func()->focus_prev = second;
6315     first->d_func()->focus_next = second;
6316
6317     second->d_func()->focus_next = fn;
6318     second->d_func()->focus_prev = first;
6319
6320     sp->d_func()->focus_next = sn;
6321     sn->d_func()->focus_prev = sp;
6322
6323
6324     Q_ASSERT(first->d_func()->focus_next->d_func()->focus_prev == first);
6325     Q_ASSERT(first->d_func()->focus_prev->d_func()->focus_next == first);
6326
6327     Q_ASSERT(second->d_func()->focus_next->d_func()->focus_prev == second);
6328     Q_ASSERT(second->d_func()->focus_prev->d_func()->focus_next == second);
6329 }
6330
6331 /*!\internal
6332
6333   Moves the relevant subwidgets of this widget from the \a oldtlw's
6334   tab chain to that of the new parent, if there's anything to move and
6335   we're really moving
6336
6337   This function is called from QWidget::reparent() *after* the widget
6338   has been reparented.
6339
6340   \sa reparent()
6341 */
6342
6343 void QWidgetPrivate::reparentFocusWidgets(QWidget * oldtlw)
6344 {
6345     Q_Q(QWidget);
6346     if (oldtlw == q->window())
6347         return; // nothing to do
6348
6349     if(focus_child)
6350         focus_child->clearFocus();
6351
6352     // separate the focus chain into new (children of myself) and old (the rest)
6353     QWidget *firstOld = 0;
6354     //QWidget *firstNew = q; //invariant
6355     QWidget *o = 0; // last in the old list
6356     QWidget *n = q; // last in the new list
6357
6358     bool prevWasNew = true;
6359     QWidget *w = focus_next;
6360
6361     //Note: for efficiency, we do not maintain the list invariant inside the loop
6362     //we append items to the relevant list, and we optimize by not changing pointers
6363     //when subsequent items are going into the same list.
6364     while (w  != q) {
6365         bool currentIsNew =  q->isAncestorOf(w);
6366         if (currentIsNew) {
6367             if (!prevWasNew) {
6368                 //prev was old -- append to new list
6369                 n->d_func()->focus_next = w;
6370                 w->d_func()->focus_prev = n;
6371             }
6372             n = w;
6373         } else {
6374             if (prevWasNew) {
6375                 //prev was new -- append to old list, if there is one
6376                 if (o) {
6377                     o->d_func()->focus_next = w;
6378                     w->d_func()->focus_prev = o;
6379                 } else {
6380                     // "create" the old list
6381                     firstOld = w;
6382                 }
6383             }
6384             o = w;
6385         }
6386         w = w->d_func()->focus_next;
6387         prevWasNew = currentIsNew;
6388     }
6389
6390     //repair the old list:
6391     if (firstOld) {
6392         o->d_func()->focus_next = firstOld;
6393         firstOld->d_func()->focus_prev = o;
6394     }
6395
6396     if (!q->isWindow()) {
6397         QWidget *topLevel = q->window();
6398         //insert new chain into toplevel's chain
6399
6400         QWidget *prev = topLevel->d_func()->focus_prev;
6401
6402         topLevel->d_func()->focus_prev = n;
6403         prev->d_func()->focus_next = q;
6404
6405         focus_prev = prev;
6406         n->d_func()->focus_next = topLevel;
6407     } else {
6408         //repair the new list
6409             n->d_func()->focus_next = q;
6410             focus_prev = n;
6411     }
6412
6413 }
6414
6415 /*!\internal
6416
6417   Measures the shortest distance from a point to a rect.
6418
6419   This function is called from QDesktopwidget::screen(QPoint) to find the
6420   closest screen for a point.
6421   In directional KeypadNavigation, it is called to find the closest
6422   widget to the current focus widget center.
6423 */
6424 int QWidgetPrivate::pointToRect(const QPoint &p, const QRect &r)
6425 {
6426     int dx = 0;
6427     int dy = 0;
6428     if (p.x() < r.left())
6429         dx = r.left() - p.x();
6430     else if (p.x() > r.right())
6431         dx = p.x() - r.right();
6432     if (p.y() < r.top())
6433         dy = r.top() - p.y();
6434     else if (p.y() > r.bottom())
6435         dy = p.y() - r.bottom();
6436     return dx + dy;
6437 }
6438
6439 /*!
6440     \property QWidget::frameSize
6441     \brief the size of the widget including any window frame
6442
6443     By default, this property contains a value that depends on the user's
6444     platform and screen geometry.
6445 */
6446 QSize QWidget::frameSize() const
6447 {
6448     Q_D(const QWidget);
6449     if (isWindow() && !(windowType() == Qt::Popup)) {
6450         QRect fs = d->frameStrut();
6451         return QSize(data->crect.width() + fs.left() + fs.right(),
6452                       data->crect.height() + fs.top() + fs.bottom());
6453     }
6454     return data->crect.size();
6455 }
6456
6457 /*! \fn void QWidget::move(int x, int y)
6458
6459     \overload
6460
6461     This corresponds to move(QPoint(\a x, \a y)).
6462 */
6463
6464 void QWidget::move(const QPoint &p)
6465 {
6466     Q_D(QWidget);
6467     setAttribute(Qt::WA_Moved);
6468     if (isWindow())
6469         d->topData()->posFromMove = true;
6470     if (testAttribute(Qt::WA_WState_Created)) {
6471         d->setGeometry_sys(p.x() + geometry().x() - QWidget::x(),
6472                        p.y() + geometry().y() - QWidget::y(),
6473                        width(), height(), true);
6474         d->setDirtyOpaqueRegion();
6475     } else {
6476         data->crect.moveTopLeft(p); // no frame yet
6477         setAttribute(Qt::WA_PendingMoveEvent);
6478     }
6479 }
6480
6481 /*! \fn void QWidget::resize(int w, int h)
6482     \overload
6483
6484     This corresponds to resize(QSize(\a w, \a h)).
6485 */
6486
6487 void QWidget::resize(const QSize &s)
6488 {
6489     Q_D(QWidget);
6490     setAttribute(Qt::WA_Resized);
6491     if (testAttribute(Qt::WA_WState_Created)) {
6492         d->setGeometry_sys(geometry().x(), geometry().y(), s.width(), s.height(), false);
6493         d->setDirtyOpaqueRegion();
6494     } else {
6495         data->crect.setSize(s.boundedTo(maximumSize()).expandedTo(minimumSize()));
6496         setAttribute(Qt::WA_PendingResizeEvent);
6497     }
6498 }
6499
6500 void QWidget::setGeometry(const QRect &r)
6501 {
6502     Q_D(QWidget);
6503     setAttribute(Qt::WA_Resized);
6504     setAttribute(Qt::WA_Moved);
6505     if (isWindow())
6506         d->topData()->posFromMove = false;
6507     if (testAttribute(Qt::WA_WState_Created)) {
6508         d->setGeometry_sys(r.x(), r.y(), r.width(), r.height(), true);
6509         d->setDirtyOpaqueRegion();
6510     } else {
6511         data->crect.setTopLeft(r.topLeft());
6512         data->crect.setSize(r.size().boundedTo(maximumSize()).expandedTo(minimumSize()));
6513         setAttribute(Qt::WA_PendingMoveEvent);
6514         setAttribute(Qt::WA_PendingResizeEvent);
6515     }
6516 }
6517
6518 /*!
6519     \since 4.2
6520     Saves the current geometry and state for top-level widgets.
6521
6522     To save the geometry when the window closes, you can
6523     implement a close event like this:
6524
6525     \snippet doc/src/snippets/code/src_gui_kernel_qwidget.cpp 11
6526
6527     See the \l{Window Geometry} documentation for an overview of geometry
6528     issues with windows.
6529
6530     Use QMainWindow::saveState() to save the geometry and the state of
6531     toolbars and dock widgets.
6532
6533     \sa restoreGeometry(), QMainWindow::saveState(), QMainWindow::restoreState()
6534 */
6535 QByteArray QWidget::saveGeometry() const
6536 {
6537 #ifdef Q_WS_MAC
6538     // We check if the window was maximized during this invocation. If so, we need to record the
6539     // starting position as 0,0.
6540     Q_D(const QWidget);
6541     QRect newFramePosition = frameGeometry();
6542     QRect newNormalPosition = normalGeometry();
6543     if(d->topData()->wasMaximized && !(windowState() & Qt::WindowMaximized)) {
6544         // Change the starting position
6545         newFramePosition.moveTo(0, 0);
6546         newNormalPosition.moveTo(0, 0);
6547     }
6548 #endif // Q_WS_MAC
6549     QByteArray array;
6550     QDataStream stream(&array, QIODevice::WriteOnly);
6551     stream.setVersion(QDataStream::Qt_4_0);
6552     const quint32 magicNumber = 0x1D9D0CB;
6553     quint16 majorVersion = 1;
6554     quint16 minorVersion = 0;
6555     stream << magicNumber
6556            << majorVersion
6557            << minorVersion
6558 #ifdef Q_WS_MAC
6559            << newFramePosition
6560            << newNormalPosition
6561 #else
6562            << frameGeometry()
6563            << normalGeometry()
6564 #endif // Q_WS_MAC
6565            << qint32(QApplication::desktop()->screenNumber(this))
6566            << quint8(windowState() & Qt::WindowMaximized)
6567            << quint8(windowState() & Qt::WindowFullScreen);
6568     return array;
6569 }
6570
6571 /*!
6572     \since 4.2
6573
6574     Restores the geometry and state top-level widgets stored in the
6575     byte array \a geometry. Returns true on success; otherwise
6576     returns false.
6577
6578     If the restored geometry is off-screen, it will be modified to be
6579     inside the available screen geometry.
6580
6581     To restore geometry saved using QSettings, you can use code like
6582     this:
6583
6584     \snippet doc/src/snippets/code/src_gui_kernel_qwidget.cpp 12
6585
6586     See the \l{Window Geometry} documentation for an overview of geometry
6587     issues with windows.
6588
6589     Use QMainWindow::restoreState() to restore the geometry and the
6590     state of toolbars and dock widgets.
6591
6592     \sa saveGeometry(), QSettings, QMainWindow::saveState(), QMainWindow::restoreState()
6593 */
6594 bool QWidget::restoreGeometry(const QByteArray &geometry)
6595 {
6596     if (geometry.size() < 4)
6597         return false;
6598     QDataStream stream(geometry);
6599     stream.setVersion(QDataStream::Qt_4_0);
6600
6601     const quint32 magicNumber = 0x1D9D0CB;
6602     quint32 storedMagicNumber;
6603     stream >> storedMagicNumber;
6604     if (storedMagicNumber != magicNumber)
6605         return false;
6606
6607     const quint16 currentMajorVersion = 1;
6608     quint16 majorVersion = 0;
6609     quint16 minorVersion = 0;
6610
6611     stream >> majorVersion >> minorVersion;
6612
6613     if (majorVersion != currentMajorVersion)
6614         return false;
6615     // (Allow all minor versions.)
6616
6617     QRect restoredFrameGeometry;
6618      QRect restoredNormalGeometry;
6619     qint32 restoredScreenNumber;
6620     quint8 maximized;
6621     quint8 fullScreen;
6622
6623     stream >> restoredFrameGeometry
6624            >> restoredNormalGeometry
6625            >> restoredScreenNumber
6626            >> maximized
6627            >> fullScreen;
6628
6629     const int frameHeight = 20;
6630     if (!restoredFrameGeometry.isValid())
6631         restoredFrameGeometry = QRect(QPoint(0,0), sizeHint());
6632
6633     if (!restoredNormalGeometry.isValid())
6634         restoredNormalGeometry = QRect(QPoint(0, frameHeight), sizeHint());
6635     if (!restoredNormalGeometry.isValid()) {
6636         // use the widget's adjustedSize if the sizeHint() doesn't help
6637         restoredNormalGeometry.setSize(restoredNormalGeometry
6638                                        .size()
6639                                        .expandedTo(d_func()->adjustedSize()));
6640     }
6641
6642     const QDesktopWidget * const desktop = QApplication::desktop();
6643     if (restoredScreenNumber >= desktop->numScreens())
6644         restoredScreenNumber = desktop->primaryScreen();
6645
6646     const QRect availableGeometry = desktop->availableGeometry(restoredScreenNumber);
6647
6648     // Modify the restored geometry if we are about to restore to coordinates
6649     // that would make the window "lost". This happens if:
6650     // - The restored geometry is completely oustside the available geometry
6651     // - The title bar is outside the available geometry.
6652     // - (Mac only) The window is higher than the available geometry. It must
6653     //   be possible to bring the size grip on screen by moving the window.
6654 #ifdef Q_WS_MAC
6655     restoredFrameGeometry.setHeight(qMin(restoredFrameGeometry.height(), availableGeometry.height()));
6656     restoredNormalGeometry.setHeight(qMin(restoredNormalGeometry.height(), availableGeometry.height() - frameHeight));
6657 #endif
6658
6659     if (!restoredFrameGeometry.intersects(availableGeometry)) {
6660         restoredFrameGeometry.moveBottom(qMin(restoredFrameGeometry.bottom(), availableGeometry.bottom()));
6661         restoredFrameGeometry.moveLeft(qMax(restoredFrameGeometry.left(), availableGeometry.left()));
6662         restoredFrameGeometry.moveRight(qMin(restoredFrameGeometry.right(), availableGeometry.right()));
6663     }
6664     restoredFrameGeometry.moveTop(qMax(restoredFrameGeometry.top(), availableGeometry.top()));
6665
6666     if (!restoredNormalGeometry.intersects(availableGeometry)) {
6667         restoredNormalGeometry.moveBottom(qMin(restoredNormalGeometry.bottom(), availableGeometry.bottom()));
6668         restoredNormalGeometry.moveLeft(qMax(restoredNormalGeometry.left(), availableGeometry.left()));
6669         restoredNormalGeometry.moveRight(qMin(restoredNormalGeometry.right(), availableGeometry.right()));
6670     }
6671     restoredNormalGeometry.moveTop(qMax(restoredNormalGeometry.top(), availableGeometry.top() + frameHeight));
6672
6673     if (maximized || fullScreen) {
6674         // set geomerty before setting the window state to make
6675         // sure the window is maximized to the right screen.
6676         // Skip on windows: the window is restored into a broken
6677         // half-maximized state.
6678 #ifndef Q_WS_WIN
6679         setGeometry(restoredNormalGeometry);
6680 #endif
6681         Qt::WindowStates ws = windowState();
6682         if (maximized)
6683             ws |= Qt::WindowMaximized;
6684         if (fullScreen)
6685             ws |= Qt::WindowFullScreen;
6686        setWindowState(ws);
6687        d_func()->topData()->normalGeometry = restoredNormalGeometry;
6688     } else {
6689         QPoint offset;
6690 #ifdef Q_WS_X11
6691         if (isFullScreen())
6692             offset = d_func()->topData()->fullScreenOffset;
6693 #endif
6694         setWindowState(windowState() & ~(Qt::WindowMaximized | Qt::WindowFullScreen));
6695         move(restoredFrameGeometry.topLeft() + offset);
6696         resize(restoredNormalGeometry.size());
6697     }
6698     return true;
6699 }
6700
6701 /*!\fn void QWidget::setGeometry(int x, int y, int w, int h)
6702     \overload
6703
6704     This corresponds to setGeometry(QRect(\a x, \a y, \a w, \a h)).
6705 */
6706
6707 /*!
6708   Sets the margins around the contents of the widget to have the sizes
6709   \a left, \a top, \a right, and \a bottom. The margins are used by
6710   the layout system, and may be used by subclasses to specify the area
6711   to draw in (e.g. excluding the frame).
6712
6713   Changing the margins will trigger a resizeEvent().
6714
6715   \sa contentsRect(), getContentsMargins()
6716 */
6717 void QWidget::setContentsMargins(int left, int top, int right, int bottom)
6718 {
6719     Q_D(QWidget);
6720     if (left == d->leftmargin && top == d->topmargin
6721          && right == d->rightmargin && bottom == d->bottommargin)
6722         return;
6723     d->leftmargin = left;
6724     d->topmargin = top;
6725     d->rightmargin = right;
6726     d->bottommargin = bottom;
6727
6728     if (QLayout *l=d->layout)
6729         l->update(); //force activate; will do updateGeometry
6730     else
6731         updateGeometry();
6732
6733     // ### Qt 5: compat, remove
6734     if (isVisible()) {
6735         update();
6736         QResizeEvent e(data->crect.size(), data->crect.size());
6737         QApplication::sendEvent(this, &e);
6738     } else {
6739         setAttribute(Qt::WA_PendingResizeEvent, true);
6740     }
6741
6742     QEvent e(QEvent::ContentsRectChange);
6743     QApplication::sendEvent(this, &e);
6744 }
6745
6746 /*!
6747   \overload
6748   \since 4.6
6749
6750   \brief The setContentsMargins function sets the margins around the
6751   widget's contents.
6752
6753   Sets the margins around the contents of the widget to have the
6754   sizes determined by \a margins. The margins are
6755   used by the layout system, and may be used by subclasses to
6756   specify the area to draw in (e.g. excluding the frame).
6757
6758   Changing the margins will trigger a resizeEvent().
6759
6760   \sa contentsRect(), getContentsMargins()
6761 */
6762 void QWidget::setContentsMargins(const QMargins &margins)
6763 {
6764     setContentsMargins(margins.left(), margins.top(),
6765                        margins.right(), margins.bottom());
6766 }
6767
6768 /*!
6769   Returns the widget's contents margins for \a left, \a top, \a
6770   right, and \a bottom.
6771
6772   \sa setContentsMargins(), contentsRect()
6773  */
6774 void QWidget::getContentsMargins(int *left, int *top, int *right, int *bottom) const
6775 {
6776     Q_D(const QWidget);
6777     if (left)
6778         *left = d->leftmargin;
6779     if (top)
6780         *top = d->topmargin;
6781     if (right)
6782         *right = d->rightmargin;
6783     if (bottom)
6784         *bottom = d->bottommargin;
6785 }
6786
6787 /*!
6788   \since 4.6
6789
6790   \brief The contentsMargins function returns the widget's contents margins.
6791
6792   \sa getContentsMargins(), setContentsMargins(), contentsRect()
6793  */
6794 QMargins QWidget::contentsMargins() const
6795 {
6796     Q_D(const QWidget);
6797     return QMargins(d->leftmargin, d->topmargin, d->rightmargin, d->bottommargin);
6798 }
6799
6800
6801 /*!
6802     Returns the area inside the widget's margins.
6803
6804     \sa setContentsMargins(), getContentsMargins()
6805 */
6806 QRect QWidget::contentsRect() const
6807 {
6808     Q_D(const QWidget);
6809     return QRect(QPoint(d->leftmargin, d->topmargin),
6810                  QPoint(data->crect.width() - 1 - d->rightmargin,
6811                         data->crect.height() - 1 - d->bottommargin));
6812
6813 }
6814
6815
6816
6817 /*!
6818   \fn void QWidget::customContextMenuRequested(const QPoint &pos)
6819
6820   This signal is emitted when the widget's \l contextMenuPolicy is
6821   Qt::CustomContextMenu, and the user has requested a context menu on
6822   the widget. The position \a pos is the position of the context menu
6823   event that the widget receives. Normally this is in widget
6824   coordinates. The exception to this rule is QAbstractScrollArea and
6825   its subclasses that map the context menu event to coordinates of the
6826   \link QAbstractScrollArea::viewport() viewport() \endlink .
6827
6828
6829   \sa mapToGlobal() QMenu contextMenuPolicy
6830 */
6831
6832
6833 /*!
6834     \property QWidget::contextMenuPolicy
6835     \brief how the widget shows a context menu
6836
6837     The default value of this property is Qt::DefaultContextMenu,
6838     which means the contextMenuEvent() handler is called. Other values
6839     are Qt::NoContextMenu, Qt::PreventContextMenu,
6840     Qt::ActionsContextMenu, and Qt::CustomContextMenu. With
6841     Qt::CustomContextMenu, the signal customContextMenuRequested() is
6842     emitted.
6843
6844     \sa contextMenuEvent(), customContextMenuRequested(), actions()
6845 */
6846
6847 Qt::ContextMenuPolicy QWidget::contextMenuPolicy() const
6848 {
6849     return (Qt::ContextMenuPolicy)data->context_menu_policy;
6850 }
6851
6852 void QWidget::setContextMenuPolicy(Qt::ContextMenuPolicy policy)
6853 {
6854     data->context_menu_policy = (uint) policy;
6855 }
6856
6857 /*!
6858     \property QWidget::focusPolicy
6859     \brief the way the widget accepts keyboard focus
6860
6861     The policy is Qt::TabFocus if the widget accepts keyboard
6862     focus by tabbing, Qt::ClickFocus if the widget accepts
6863     focus by clicking, Qt::StrongFocus if it accepts both, and
6864     Qt::NoFocus (the default) if it does not accept focus at
6865     all.
6866
6867     You must enable keyboard focus for a widget if it processes
6868     keyboard events. This is normally done from the widget's
6869     constructor. For instance, the QLineEdit constructor calls
6870     setFocusPolicy(Qt::StrongFocus).
6871
6872     If the widget has a focus proxy, then the focus policy will
6873     be propagated to it.
6874
6875     \sa focusInEvent(), focusOutEvent(), keyPressEvent(), keyReleaseEvent(), enabled
6876 */
6877
6878
6879 Qt::FocusPolicy QWidget::focusPolicy() const
6880 {
6881     return (Qt::FocusPolicy)data->focus_policy;
6882 }
6883
6884 void QWidget::setFocusPolicy(Qt::FocusPolicy policy)
6885 {
6886     data->focus_policy = (uint) policy;
6887     Q_D(QWidget);
6888     if (d->extra && d->extra->focus_proxy)
6889         d->extra->focus_proxy->setFocusPolicy(policy);
6890 }
6891
6892 /*!
6893     \property QWidget::updatesEnabled
6894     \brief whether updates are enabled
6895
6896     An updates enabled widget receives paint events and has a system
6897     background; a disabled widget does not. This also implies that
6898     calling update() and repaint() has no effect if updates are
6899     disabled.
6900
6901     By default, this property is true.
6902
6903     setUpdatesEnabled() is normally used to disable updates for a
6904     short period of time, for instance to avoid screen flicker during
6905     large changes. In Qt, widgets normally do not generate screen
6906     flicker, but on X11 the server might erase regions on the screen
6907     when widgets get hidden before they can be replaced by other
6908     widgets. Disabling updates solves this.
6909
6910     Example:
6911     \snippet doc/src/snippets/code/src_gui_kernel_qwidget.cpp 13
6912
6913     Disabling a widget implicitly disables all its children. Enabling a widget
6914     enables all child widgets \e except top-level widgets or those that
6915     have been explicitly disabled. Re-enabling updates implicitly calls
6916     update() on the widget.
6917
6918     \sa paintEvent()
6919 */
6920 void QWidget::setUpdatesEnabled(bool enable)
6921 {
6922     Q_D(QWidget);
6923     setAttribute(Qt::WA_ForceUpdatesDisabled, !enable);
6924     d->setUpdatesEnabled_helper(enable);
6925 }
6926
6927 /*!  \fn void QWidget::show()
6928
6929     Shows the widget and its child widgets. This function is
6930     equivalent to setVisible(true).
6931
6932     \sa raise(), showEvent(), hide(), setVisible(), showMinimized(), showMaximized(),
6933     showNormal(), isVisible()
6934 */
6935
6936
6937 /*! \internal
6938
6939    Makes the widget visible in the isVisible() meaning of the word.
6940    It is only called for toplevels or widgets with visible parents.
6941  */
6942 void QWidgetPrivate::show_recursive()
6943 {
6944     Q_Q(QWidget);
6945     // polish if necessary
6946
6947     if (!q->testAttribute(Qt::WA_WState_Created))
6948         createRecursively();
6949     q->ensurePolished();
6950
6951     if (!q->isWindow() && q->parentWidget()->d_func()->layout && !q->parentWidget()->data->in_show)
6952         q->parentWidget()->d_func()->layout->activate();
6953     // activate our layout before we and our children become visible
6954     if (layout)
6955         layout->activate();
6956
6957     show_helper();
6958 }
6959
6960 void QWidgetPrivate::sendPendingMoveAndResizeEvents(bool recursive, bool disableUpdates)
6961 {
6962     Q_Q(QWidget);
6963
6964     disableUpdates = disableUpdates && q->updatesEnabled();
6965     if (disableUpdates)
6966         q->setAttribute(Qt::WA_UpdatesDisabled);
6967
6968     if (q->testAttribute(Qt::WA_PendingMoveEvent)) {
6969         QMoveEvent e(data.crect.topLeft(), data.crect.topLeft());
6970         QApplication::sendEvent(q, &e);
6971         q->setAttribute(Qt::WA_PendingMoveEvent, false);
6972     }
6973
6974     if (q->testAttribute(Qt::WA_PendingResizeEvent)) {
6975         QResizeEvent e(data.crect.size(), QSize());
6976         QApplication::sendEvent(q, &e);
6977         q->setAttribute(Qt::WA_PendingResizeEvent, false);
6978     }
6979
6980     if (disableUpdates)
6981         q->setAttribute(Qt::WA_UpdatesDisabled, false);
6982
6983     if (!recursive)
6984         return;
6985
6986     for (int i = 0; i < children.size(); ++i) {
6987         if (QWidget *child = qobject_cast<QWidget *>(children.at(i)))
6988             child->d_func()->sendPendingMoveAndResizeEvents(recursive, disableUpdates);
6989     }
6990 }
6991
6992 void QWidgetPrivate::activateChildLayoutsRecursively()
6993 {
6994     sendPendingMoveAndResizeEvents(false, true);
6995
6996     for (int i = 0; i < children.size(); ++i) {
6997         QWidget *child = qobject_cast<QWidget *>(children.at(i));
6998         if (!child || child->isHidden() || child->isWindow())
6999             continue;
7000
7001         child->ensurePolished();
7002
7003         // Activate child's layout
7004         QWidgetPrivate *childPrivate = child->d_func();
7005         if (childPrivate->layout)
7006             childPrivate->layout->activate();
7007
7008         // Pretend we're visible.
7009         const bool wasVisible = child->isVisible();
7010         if (!wasVisible)
7011             child->setAttribute(Qt::WA_WState_Visible);
7012
7013         // Do the same for all my children.
7014         childPrivate->activateChildLayoutsRecursively();
7015
7016         // We're not cheating anymore.
7017         if (!wasVisible)
7018             child->setAttribute(Qt::WA_WState_Visible, false);
7019     }
7020 }
7021
7022 void QWidgetPrivate::show_helper()
7023 {
7024     Q_Q(QWidget);
7025     data.in_show = true; // qws optimization
7026     // make sure we receive pending move and resize events
7027     sendPendingMoveAndResizeEvents();
7028
7029     // become visible before showing all children
7030     q->setAttribute(Qt::WA_WState_Visible);
7031
7032     // finally show all children recursively
7033     showChildren(false);
7034
7035
7036
7037     // popup handling: new popups and tools need to be raised, and
7038     // existing popups must be closed. Also propagate the current
7039     // windows's KeyboardFocusChange status.
7040     if (q->isWindow()) {
7041         if ((q->windowType() == Qt::Tool) || (q->windowType() == Qt::Popup) || q->windowType() == Qt::ToolTip) {
7042             q->raise();
7043             if (q->parentWidget() && q->parentWidget()->window()->testAttribute(Qt::WA_KeyboardFocusChange))
7044                 q->setAttribute(Qt::WA_KeyboardFocusChange);
7045         } else {
7046             while (QApplication::activePopupWidget()) {
7047                 if (!QApplication::activePopupWidget()->close())
7048                     break;
7049             }
7050         }
7051     }
7052
7053     // Automatic embedding of child windows of widgets already embedded into
7054     // QGraphicsProxyWidget when they are shown the first time.
7055     bool isEmbedded = false;
7056 #ifndef QT_NO_GRAPHICSVIEW
7057     if (q->isWindow()) {
7058         isEmbedded = q->graphicsProxyWidget() ? true : false;
7059         if (!isEmbedded && !bypassGraphicsProxyWidget(q)) {
7060             QGraphicsProxyWidget *ancestorProxy = nearestGraphicsProxyWidget(q->parentWidget());
7061             if (ancestorProxy) {
7062                 isEmbedded = true;
7063                 ancestorProxy->d_func()->embedSubWindow(q);
7064             }
7065         }
7066     }
7067 #else
7068     Q_UNUSED(isEmbedded);
7069 #endif
7070
7071     // On Windows, show the popup now so that our own focus handling
7072     // stores the correct old focus widget even if it's stolen in the
7073     // showevent
7074 #if defined(Q_WS_WIN) || defined(Q_WS_MAC)
7075     if (!isEmbedded && q->windowType() == Qt::Popup)
7076         qApp->d_func()->openPopup(q);
7077 #endif
7078
7079     // send the show event before showing the window
7080     QShowEvent showEvent;
7081     QApplication::sendEvent(q, &showEvent);
7082
7083     if (!isEmbedded && q->isModal() && q->isWindow())
7084         // QApplicationPrivate::enterModal *before* show, otherwise the initial
7085         // stacking might be wrong
7086         QApplicationPrivate::enterModal(q);
7087
7088
7089     show_sys();
7090
7091     if (!isEmbedded && q->windowType() == Qt::Popup)
7092         qApp->d_func()->openPopup(q);
7093
7094 #ifndef QT_NO_ACCESSIBILITY
7095     if (q->windowType() != Qt::ToolTip) {    // Tooltips are read aloud twice in MS narrator.
7096         QAccessibleEvent event(q, QAccessible::ObjectShow);
7097         QAccessible::updateAccessibility(&event);
7098     }
7099 #endif
7100
7101     if (QApplicationPrivate::hidden_focus_widget == q) {
7102         QApplicationPrivate::hidden_focus_widget = 0;
7103         q->setFocus(Qt::OtherFocusReason);
7104     }
7105
7106     // Process events when showing a Qt::SplashScreen widget before the event loop
7107     // is spinnning; otherwise it might not show up on particular platforms.
7108     // This makes QSplashScreen behave the same on all platforms.
7109     if (!qApp->d_func()->in_exec && q->windowType() == Qt::SplashScreen)
7110         QApplication::processEvents();
7111
7112     data.in_show = false;  // reset qws optimization
7113 }
7114
7115 /*! \fn void QWidget::hide()
7116
7117     Hides the widget. This function is equivalent to
7118     setVisible(false).
7119
7120
7121     \note If you are working with QDialog or its subclasses and you invoke
7122     the show() function after this function, the dialog will be displayed in
7123     its original position.
7124
7125     \sa hideEvent(), isHidden(), show(), setVisible(), isVisible(), close()
7126 */
7127
7128 /*!\internal
7129  */
7130 void QWidgetPrivate::hide_helper()
7131 {
7132     Q_Q(QWidget);
7133
7134     bool isEmbedded = false;
7135 #if !defined QT_NO_GRAPHICSVIEW
7136     isEmbedded = q->isWindow() && !bypassGraphicsProxyWidget(q) && nearestGraphicsProxyWidget(q->parentWidget()) != 0;
7137 #else
7138     Q_UNUSED(isEmbedded);
7139 #endif
7140
7141     if (!isEmbedded && (q->windowType() == Qt::Popup))
7142         qApp->d_func()->closePopup(q);
7143
7144     // Move test modal here.  Otherwise, a modal dialog could get
7145     // destroyed and we lose all access to its parent because we haven't
7146     // left modality.  (Eg. modal Progress Dialog)
7147     if (!isEmbedded && q->isModal() && q->isWindow())
7148         QApplicationPrivate::leaveModal(q);
7149
7150 #if defined(Q_WS_WIN)
7151     if (q->isWindow() && !(q->windowType() == Qt::Popup) && q->parentWidget()
7152         && !q->parentWidget()->isHidden() && q->isActiveWindow())
7153         q->parentWidget()->activateWindow();        // Activate parent
7154 #endif
7155
7156     q->setAttribute(Qt::WA_Mapped, false);
7157     hide_sys();
7158
7159     bool wasVisible = q->testAttribute(Qt::WA_WState_Visible);
7160
7161     if (wasVisible) {
7162         q->setAttribute(Qt::WA_WState_Visible, false);
7163
7164     }
7165
7166     QHideEvent hideEvent;
7167     QApplication::sendEvent(q, &hideEvent);
7168     hideChildren(false);
7169
7170     // next bit tries to move the focus if the focus widget is now
7171     // hidden.
7172     if (wasVisible) {
7173         qApp->d_func()->sendSyntheticEnterLeave(q);
7174         QWidget *fw = QApplication::focusWidget();
7175         while (fw &&  !fw->isWindow()) {
7176             if (fw == q) {
7177                 q->focusNextPrevChild(true);
7178                 break;
7179             }
7180             fw = fw->parentWidget();
7181         }
7182     }
7183
7184     if (QWidgetBackingStore *bs = maybeBackingStore())
7185         bs->removeDirtyWidget(q);
7186
7187 #ifndef QT_NO_ACCESSIBILITY
7188     if (wasVisible) {
7189         QAccessibleEvent event(q, QAccessible::ObjectHide);
7190         QAccessible::updateAccessibility(&event);
7191     }
7192 #endif
7193 }
7194
7195 /*!
7196     \fn bool QWidget::isHidden() const
7197
7198     Returns true if the widget is hidden, otherwise returns false.
7199
7200     A hidden widget will only become visible when show() is called on
7201     it. It will not be automatically shown when the parent is shown.
7202
7203     To check visibility, use !isVisible() instead (notice the exclamation mark).
7204
7205     isHidden() implies !isVisible(), but a widget can be not visible
7206     and not hidden at the same time. This is the case for widgets that are children of
7207     widgets that are not visible.
7208
7209
7210     Widgets are hidden if:
7211     \list
7212         \li they were created as independent windows,
7213         \li they were created as children of visible widgets,
7214         \li hide() or setVisible(false) was called.
7215     \endlist
7216 */
7217
7218
7219 void QWidget::setVisible(bool visible)
7220 {
7221     if (visible) { // show
7222         if (testAttribute(Qt::WA_WState_ExplicitShowHide) && !testAttribute(Qt::WA_WState_Hidden))
7223             return;
7224
7225         Q_D(QWidget);
7226
7227         // Designer uses a trick to make grabWidget work without showing
7228         if (!isWindow() && parentWidget() && parentWidget()->isVisible()
7229             && !parentWidget()->testAttribute(Qt::WA_WState_Created))
7230             parentWidget()->window()->d_func()->createRecursively();
7231
7232         //we have to at least create toplevels before applyX11SpecificCommandLineArguments
7233         //but not children of non-visible parents
7234         QWidget *pw = parentWidget();
7235         if (!testAttribute(Qt::WA_WState_Created)
7236             && (isWindow() || pw->testAttribute(Qt::WA_WState_Created))) {
7237             create();
7238         }
7239
7240 #if defined(Q_WS_X11)
7241         if (windowType() == Qt::Window)
7242             QApplicationPrivate::applyX11SpecificCommandLineArguments(this);
7243 #endif
7244
7245         bool wasResized = testAttribute(Qt::WA_Resized);
7246         Qt::WindowStates initialWindowState = windowState();
7247
7248         // polish if necessary
7249         ensurePolished();
7250
7251         // remember that show was called explicitly
7252         setAttribute(Qt::WA_WState_ExplicitShowHide);
7253         // whether we need to inform the parent widget immediately
7254         bool needUpdateGeometry = !isWindow() && testAttribute(Qt::WA_WState_Hidden);
7255         // we are no longer hidden
7256         setAttribute(Qt::WA_WState_Hidden, false);
7257
7258         if (needUpdateGeometry)
7259             d->updateGeometry_helper(true);
7260
7261         // activate our layout before we and our children become visible
7262         if (d->layout)
7263             d->layout->activate();
7264
7265         if (!isWindow()) {
7266             QWidget *parent = parentWidget();
7267             while (parent && parent->isVisible() && parent->d_func()->layout  && !parent->data->in_show) {
7268                 parent->d_func()->layout->activate();
7269                 if (parent->isWindow())
7270                     break;
7271                 parent = parent->parentWidget();
7272             }
7273             if (parent)
7274                 parent->d_func()->setDirtyOpaqueRegion();
7275         }
7276
7277         // adjust size if necessary
7278         if (!wasResized
7279             && (isWindow() || !parentWidget()->d_func()->layout))  {
7280             if (isWindow()) {
7281                 adjustSize();
7282                 if (windowState() != initialWindowState)
7283                     setWindowState(initialWindowState);
7284             } else {
7285                 adjustSize();
7286             }
7287             setAttribute(Qt::WA_Resized, false);
7288         }
7289
7290         setAttribute(Qt::WA_KeyboardFocusChange, false);
7291
7292         if (isWindow() || parentWidget()->isVisible()) {
7293             d->show_helper();
7294
7295             qApp->d_func()->sendSyntheticEnterLeave(this);
7296         }
7297
7298         QEvent showToParentEvent(QEvent::ShowToParent);
7299         QApplication::sendEvent(this, &showToParentEvent);
7300     } else { // hide
7301         if (testAttribute(Qt::WA_WState_ExplicitShowHide) && testAttribute(Qt::WA_WState_Hidden))
7302             return;
7303 #if defined(Q_WS_WIN)
7304         // reset WS_DISABLED style in a Blocked window
7305         if(isWindow() && testAttribute(Qt::WA_WState_Created)
7306            && QApplicationPrivate::isBlockedByModal(this))
7307         {
7308             LONG dwStyle = GetWindowLong(winId(), GWL_STYLE);
7309             dwStyle &= ~WS_DISABLED;
7310             SetWindowLong(winId(), GWL_STYLE, dwStyle);
7311         }
7312 #endif
7313         if (QApplicationPrivate::hidden_focus_widget == this)
7314             QApplicationPrivate::hidden_focus_widget = 0;
7315
7316         Q_D(QWidget);
7317
7318         // hw: The test on getOpaqueRegion() needs to be more intelligent
7319         // currently it doesn't work if the widget is hidden (the region will
7320         // be clipped). The real check should be testing the cached region
7321         // (and dirty flag) directly.
7322         if (!isWindow() && parentWidget()) // && !d->getOpaqueRegion().isEmpty())
7323             parentWidget()->d_func()->setDirtyOpaqueRegion();
7324
7325         setAttribute(Qt::WA_WState_Hidden);
7326         setAttribute(Qt::WA_WState_ExplicitShowHide);
7327         if (testAttribute(Qt::WA_WState_Created))
7328             d->hide_helper();
7329
7330         // invalidate layout similar to updateGeometry()
7331         if (!isWindow() && parentWidget()) {
7332             if (parentWidget()->d_func()->layout)
7333                 parentWidget()->d_func()->layout->invalidate();
7334             else if (parentWidget()->isVisible())
7335                 QApplication::postEvent(parentWidget(), new QEvent(QEvent::LayoutRequest));
7336         }
7337
7338         QEvent hideToParentEvent(QEvent::HideToParent);
7339         QApplication::sendEvent(this, &hideToParentEvent);
7340     }
7341 }
7342
7343 /*!\fn void QWidget::setHidden(bool hidden)
7344
7345     Convenience function, equivalent to setVisible(!\a hidden).
7346 */
7347
7348
7349 void QWidgetPrivate::_q_showIfNotHidden()
7350 {
7351     Q_Q(QWidget);
7352     if ( !(q->isHidden() && q->testAttribute(Qt::WA_WState_ExplicitShowHide)) )
7353         q->setVisible(true);
7354 }
7355
7356 void QWidgetPrivate::showChildren(bool spontaneous)
7357 {
7358     QList<QObject*> childList = children;
7359     for (int i = 0; i < childList.size(); ++i) {
7360         QWidget *widget = qobject_cast<QWidget*>(childList.at(i));
7361         if (!widget
7362             || widget->isWindow()
7363             || widget->testAttribute(Qt::WA_WState_Hidden))
7364             continue;
7365         if (spontaneous) {
7366             widget->setAttribute(Qt::WA_Mapped);
7367             widget->d_func()->showChildren(true);
7368             QShowEvent e;
7369             QApplication::sendSpontaneousEvent(widget, &e);
7370         } else {
7371             if (widget->testAttribute(Qt::WA_WState_ExplicitShowHide))
7372                 widget->d_func()->show_recursive();
7373             else
7374                 widget->show();
7375         }
7376     }
7377 }
7378
7379 void QWidgetPrivate::hideChildren(bool spontaneous)
7380 {
7381     QList<QObject*> childList = children;
7382     for (int i = 0; i < childList.size(); ++i) {
7383         QWidget *widget = qobject_cast<QWidget*>(childList.at(i));
7384         if (!widget || widget->isWindow() || widget->testAttribute(Qt::WA_WState_Hidden))
7385             continue;
7386 #ifdef Q_WS_MAC
7387         // Before doing anything we need to make sure that we don't leave anything in a non-consistent state.
7388         // When hiding a widget we need to make sure that no mouse_down events are active, because
7389         // the mouse_up event will never be received by a hidden widget or one of its descendants.
7390         // The solution is simple, before going through with this we check if there are any mouse_down events in
7391         // progress, if so we check if it is related to this widget or not. If so, we just reset the mouse_down and
7392         // then we continue.
7393         // In X11 and Windows we send a mouse_release event, however we don't do that here because we were already
7394         // ignoring that from before. I.e. Carbon did not send the mouse release event, so we will not send the
7395         // mouse release event. There are two ways to interpret this:
7396         // 1. If we don't send the mouse release event, the widget might get into an inconsistent state, i.e. it
7397         // might be waiting for a release event that will never arrive.
7398         // 2. If we send the mouse release event, then the widget might decide to trigger an action that is not
7399         // supposed to trigger because it is not visible.
7400         if(widget == qt_button_down)
7401             qt_button_down = 0;
7402 #endif // Q_WS_MAC
7403         if (spontaneous)
7404             widget->setAttribute(Qt::WA_Mapped, false);
7405         else
7406             widget->setAttribute(Qt::WA_WState_Visible, false);
7407         widget->d_func()->hideChildren(spontaneous);
7408         QHideEvent e;
7409         if (spontaneous) {
7410             QApplication::sendSpontaneousEvent(widget, &e);
7411         } else {
7412             QApplication::sendEvent(widget, &e);
7413             if (widget->internalWinId()
7414                 && widget->testAttribute(Qt::WA_DontCreateNativeAncestors)) {
7415                 // hide_sys() on an ancestor won't have any affect on this
7416                 // widget, so it needs an explicit hide_sys() of its own
7417                 widget->d_func()->hide_sys();
7418             }
7419         }
7420         qApp->d_func()->sendSyntheticEnterLeave(widget);
7421 #ifndef QT_NO_ACCESSIBILITY
7422         if (!spontaneous) {
7423             QAccessibleEvent event(widget, QAccessible::ObjectHide);
7424             QAccessible::updateAccessibility(&event);
7425         }
7426 #endif
7427     }
7428 }
7429
7430 bool QWidgetPrivate::close_helper(CloseMode mode)
7431 {
7432     if (data.is_closing)
7433         return true;
7434
7435     Q_Q(QWidget);
7436     data.is_closing = 1;
7437
7438     QPointer<QWidget> that = q;
7439     QPointer<QWidget> parentWidget = q->parentWidget();
7440
7441     bool quitOnClose = q->testAttribute(Qt::WA_QuitOnClose);
7442     if (mode != CloseNoEvent) {
7443         QCloseEvent e;
7444         if (mode == CloseWithSpontaneousEvent)
7445             QApplication::sendSpontaneousEvent(q, &e);
7446         else
7447             QApplication::sendEvent(q, &e);
7448         if (!that.isNull() && !e.isAccepted()) {
7449             data.is_closing = 0;
7450             return false;
7451         }
7452     }
7453
7454     if (!that.isNull() && !q->isHidden())
7455         q->hide();
7456
7457     // Attempt to close the application only if this has WA_QuitOnClose set and a non-visible parent
7458     quitOnClose = quitOnClose && (parentWidget.isNull() || !parentWidget->isVisible());
7459
7460     if (quitOnClose) {
7461         /* if there is no non-withdrawn primary window left (except
7462            the ones without QuitOnClose), we emit the lastWindowClosed
7463            signal */
7464         QWidgetList list = QApplication::topLevelWidgets();
7465         bool lastWindowClosed = true;
7466         for (int i = 0; i < list.size(); ++i) {
7467             QWidget *w = list.at(i);
7468             if (!w->isVisible() || w->parentWidget() || !w->testAttribute(Qt::WA_QuitOnClose))
7469                 continue;
7470             lastWindowClosed = false;
7471             break;
7472         }
7473         if (lastWindowClosed) {
7474             QGuiApplicationPrivate::emitLastWindowClosed();
7475             QCoreApplicationPrivate *applicationPrivate = static_cast<QCoreApplicationPrivate*>(QObjectPrivate::get(QCoreApplication::instance()));
7476             applicationPrivate->maybeQuit();
7477         }
7478     }
7479
7480
7481     if (!that.isNull()) {
7482         data.is_closing = 0;
7483         if (q->testAttribute(Qt::WA_DeleteOnClose)) {
7484             q->setAttribute(Qt::WA_DeleteOnClose, false);
7485             q->deleteLater();
7486         }
7487     }
7488     return true;
7489 }
7490
7491
7492 /*!
7493     Closes this widget. Returns true if the widget was closed;
7494     otherwise returns false.
7495
7496     First it sends the widget a QCloseEvent. The widget is \link
7497     hide() hidden\endlink if it \link QCloseEvent::accept()
7498     accepts\endlink the close event. If it \link QCloseEvent::ignore()
7499     ignores\endlink the event, nothing happens. The default
7500     implementation of QWidget::closeEvent() accepts the close event.
7501
7502     If the widget has the Qt::WA_DeleteOnClose flag, the widget
7503     is also deleted. A close events is delivered to the widget no
7504     matter if the widget is visible or not.
7505
7506     The \l QApplication::lastWindowClosed() signal is emitted when the
7507     last visible primary window (i.e. window with no parent) with the
7508     Qt::WA_QuitOnClose attribute set is closed. By default this
7509     attribute is set for all widgets except transient windows such as
7510     splash screens, tool windows, and popup menus.
7511
7512 */
7513
7514 bool QWidget::close()
7515 {
7516     return d_func()->close_helper(QWidgetPrivate::CloseWithEvent);
7517 }
7518
7519 /*!
7520     \property QWidget::visible
7521     \brief whether the widget is visible
7522
7523     Calling setVisible(true) or show() sets the widget to visible
7524     status if all its parent widgets up to the window are visible. If
7525     an ancestor is not visible, the widget won't become visible until
7526     all its ancestors are shown. If its size or position has changed,
7527     Qt guarantees that a widget gets move and resize events just
7528     before it is shown. If the widget has not been resized yet, Qt
7529     will adjust the widget's size to a useful default using
7530     adjustSize().
7531
7532     Calling setVisible(false) or hide() hides a widget explicitly. An
7533     explicitly hidden widget will never become visible, even if all
7534     its ancestors become visible, unless you show it.
7535
7536     A widget receives show and hide events when its visibility status
7537     changes. Between a hide and a show event, there is no need to
7538     waste CPU cycles preparing or displaying information to the user.
7539     A video application, for example, might simply stop generating new
7540     frames.
7541
7542     A widget that happens to be obscured by other windows on the
7543     screen is considered to be visible. The same applies to iconified
7544     windows and windows that exist on another virtual
7545     desktop (on platforms that support this concept). A widget
7546     receives spontaneous show and hide events when its mapping status
7547     is changed by the window system, e.g. a spontaneous hide event
7548     when the user minimizes the window, and a spontaneous show event
7549     when the window is restored again.
7550
7551     You almost never have to reimplement the setVisible() function. If
7552     you need to change some settings before a widget is shown, use
7553     showEvent() instead. If you need to do some delayed initialization
7554     use the Polish event delivered to the event() function.
7555
7556     \sa show(), hide(), isHidden(), isVisibleTo(), isMinimized(),
7557     showEvent(), hideEvent()
7558 */
7559
7560
7561 /*!
7562     Returns true if this widget would become visible if \a ancestor is
7563     shown; otherwise returns false.
7564
7565     The true case occurs if neither the widget itself nor any parent
7566     up to but excluding \a ancestor has been explicitly hidden.
7567
7568     This function will still return true if the widget is obscured by
7569     other windows on the screen, but could be physically visible if it
7570     or they were to be moved.
7571
7572     isVisibleTo(0) is identical to isVisible().
7573
7574     \sa show() hide() isVisible()
7575 */
7576
7577 bool QWidget::isVisibleTo(QWidget* ancestor) const
7578 {
7579     if (!ancestor)
7580         return isVisible();
7581     const QWidget * w = this;
7582     while (!w->isHidden()
7583             && !w->isWindow()
7584             && w->parentWidget()
7585             && w->parentWidget() != ancestor)
7586         w = w->parentWidget();
7587     return !w->isHidden();
7588 }
7589
7590
7591 /*!
7592     Returns the unobscured region where paint events can occur.
7593
7594     For visible widgets, this is an approximation of the area not
7595     covered by other widgets; otherwise, this is an empty region.
7596
7597     The repaint() function calls this function if necessary, so in
7598     general you do not need to call it.
7599
7600 */
7601 QRegion QWidget::visibleRegion() const
7602 {
7603     Q_D(const QWidget);
7604
7605     QRect clipRect = d->clipRect();
7606     if (clipRect.isEmpty())
7607         return QRegion();
7608     QRegion r(clipRect);
7609     d->subtractOpaqueChildren(r, clipRect);
7610     d->subtractOpaqueSiblings(r);
7611     return r;
7612 }
7613
7614
7615 QSize QWidgetPrivate::adjustedSize() const
7616 {
7617     Q_Q(const QWidget);
7618
7619     QSize s = q->sizeHint();
7620
7621     if (q->isWindow()) {
7622         Qt::Orientations exp;
7623         if (layout) {
7624             if (layout->hasHeightForWidth())
7625                 s.setHeight(layout->totalHeightForWidth(s.width()));
7626             exp = layout->expandingDirections();
7627         } else
7628         {
7629             if (q->sizePolicy().hasHeightForWidth())
7630                 s.setHeight(q->heightForWidth(s.width()));
7631             exp = q->sizePolicy().expandingDirections();
7632         }
7633         if (exp & Qt::Horizontal)
7634             s.setWidth(qMax(s.width(), 200));
7635         if (exp & Qt::Vertical)
7636             s.setHeight(qMax(s.height(), 100));
7637 #if defined(Q_WS_X11)
7638         QRect screen = QApplication::desktop()->screenGeometry(q->x11Info().screen());
7639 #else // all others
7640         QRect screen = QApplication::desktop()->screenGeometry(q->pos());
7641 #endif
7642 #if defined (Q_OS_WINCE)
7643         s.setWidth(qMin(s.width(), screen.width()));
7644         s.setHeight(qMin(s.height(), screen.height()));
7645 #else
7646         s.setWidth(qMin(s.width(), screen.width()*2/3));
7647         s.setHeight(qMin(s.height(), screen.height()*2/3));
7648 #endif
7649         if (QTLWExtra *extra = maybeTopData())
7650             extra->sizeAdjusted = true;
7651     }
7652
7653     if (!s.isValid()) {
7654         QRect r = q->childrenRect(); // get children rectangle
7655         if (r.isNull())
7656             return s;
7657         s = r.size() + QSize(2 * r.x(), 2 * r.y());
7658     }
7659
7660     return s;
7661 }
7662
7663 /*!
7664     Adjusts the size of the widget to fit its contents.
7665
7666     This function uses sizeHint() if it is valid, i.e., the size hint's width
7667     and height are \>= 0. Otherwise, it sets the size to the children
7668     rectangle that covers all child widgets (the union of all child widget
7669     rectangles).
7670
7671     For windows, the screen size is also taken into account. If the sizeHint()
7672     is less than (200, 100) and the size policy is \l{QSizePolicy::Expanding}
7673     {expanding}, the window will be at least (200, 100). The maximum size of
7674     a window is 2/3 of the screen's width and height.
7675
7676     \sa sizeHint(), childrenRect()
7677 */
7678
7679 void QWidget::adjustSize()
7680 {
7681     Q_D(QWidget);
7682     ensurePolished();
7683     QSize s = d->adjustedSize();
7684
7685     if (d->layout)
7686         d->layout->activate();
7687
7688     if (s.isValid())
7689         resize(s);
7690 }
7691
7692
7693 /*!
7694     \property QWidget::sizeHint
7695     \brief the recommended size for the widget
7696
7697     If the value of this property is an invalid size, no size is
7698     recommended.
7699
7700     The default implementation of sizeHint() returns an invalid size
7701     if there is no layout for this widget, and returns the layout's
7702     preferred size otherwise.
7703
7704     \sa QSize::isValid(), minimumSizeHint(), sizePolicy(),
7705     setMinimumSize(), updateGeometry()
7706 */
7707
7708 QSize QWidget::sizeHint() const
7709 {
7710     Q_D(const QWidget);
7711     if (d->layout)
7712         return d->layout->totalSizeHint();
7713     return QSize(-1, -1);
7714 }
7715
7716 /*!
7717     \property QWidget::minimumSizeHint
7718     \brief the recommended minimum size for the widget
7719
7720     If the value of this property is an invalid size, no minimum size
7721     is recommended.
7722
7723     The default implementation of minimumSizeHint() returns an invalid
7724     size if there is no layout for this widget, and returns the
7725     layout's minimum size otherwise. Most built-in widgets reimplement
7726     minimumSizeHint().
7727
7728     \l QLayout will never resize a widget to a size smaller than the
7729     minimum size hint unless minimumSize() is set or the size policy is
7730     set to QSizePolicy::Ignore. If minimumSize() is set, the minimum
7731     size hint will be ignored.
7732
7733     \sa QSize::isValid(), resize(), setMinimumSize(), sizePolicy()
7734 */
7735 QSize QWidget::minimumSizeHint() const
7736 {
7737     Q_D(const QWidget);
7738     if (d->layout)
7739         return d->layout->totalMinimumSize();
7740     return QSize(-1, -1);
7741 }
7742
7743
7744 /*!
7745     \fn QWidget *QWidget::parentWidget() const
7746
7747     Returns the parent of this widget, or 0 if it does not have any
7748     parent widget.
7749 */
7750
7751
7752 /*!
7753     Returns true if this widget is a parent, (or grandparent and so on
7754     to any level), of the given \a child, and both widgets are within
7755     the same window; otherwise returns false.
7756 */
7757
7758 bool QWidget::isAncestorOf(const QWidget *child) const
7759 {
7760     while (child) {
7761         if (child == this)
7762             return true;
7763         if (child->isWindow())
7764             return false;
7765         child = child->parentWidget();
7766     }
7767     return false;
7768 }
7769
7770 #if defined(Q_WS_WIN)
7771 inline void setDisabledStyle(QWidget *w, bool setStyle)
7772 {
7773     // set/reset WS_DISABLED style.
7774     if(w && w->isWindow() && w->isVisible() && w->isEnabled()) {
7775         LONG dwStyle = GetWindowLong(w->winId(), GWL_STYLE);
7776         LONG newStyle = dwStyle;
7777         if (setStyle)
7778             newStyle |= WS_DISABLED;
7779         else
7780             newStyle &= ~WS_DISABLED;
7781         if (newStyle != dwStyle) {
7782             SetWindowLong(w->winId(), GWL_STYLE, newStyle);
7783             // we might need to repaint in some situations (eg. menu)
7784             w->repaint();
7785         }
7786     }
7787 }
7788 #endif
7789
7790 /*****************************************************************************
7791   QWidget event handling
7792  *****************************************************************************/
7793
7794 /*!
7795     This is the main event handler; it handles event \a event. You can
7796     reimplement this function in a subclass, but we recommend using
7797     one of the specialized event handlers instead.
7798
7799     Key press and release events are treated differently from other
7800     events. event() checks for Tab and Shift+Tab and tries to move the
7801     focus appropriately. If there is no widget to move the focus to
7802     (or the key press is not Tab or Shift+Tab), event() calls
7803     keyPressEvent().
7804
7805     Mouse and tablet event handling is also slightly special: only
7806     when the widget is \l enabled, event() will call the specialized
7807     handlers such as mousePressEvent(); otherwise it will discard the
7808     event.
7809
7810     This function returns true if the event was recognized, otherwise
7811     it returns false.  If the recognized event was accepted (see \l
7812     QEvent::accepted), any further processing such as event
7813     propagation to the parent widget stops.
7814
7815     \sa closeEvent(), focusInEvent(), focusOutEvent(), enterEvent(),
7816     keyPressEvent(), keyReleaseEvent(), leaveEvent(),
7817     mouseDoubleClickEvent(), mouseMoveEvent(), mousePressEvent(),
7818     mouseReleaseEvent(), moveEvent(), paintEvent(), resizeEvent(),
7819     QObject::event(), QObject::timerEvent()
7820 */
7821
7822 bool QWidget::event(QEvent *event)
7823 {
7824     Q_D(QWidget);
7825
7826     // ignore mouse events when disabled
7827     if (!isEnabled()) {
7828         switch(event->type()) {
7829         case QEvent::TabletPress:
7830         case QEvent::TabletRelease:
7831         case QEvent::TabletMove:
7832         case QEvent::MouseButtonPress:
7833         case QEvent::MouseButtonRelease:
7834         case QEvent::MouseButtonDblClick:
7835         case QEvent::MouseMove:
7836         case QEvent::TouchBegin:
7837         case QEvent::TouchUpdate:
7838         case QEvent::TouchEnd:
7839         case QEvent::TouchCancel:
7840         case QEvent::ContextMenu:
7841 #ifndef QT_NO_WHEELEVENT
7842         case QEvent::Wheel:
7843 #endif
7844             return false;
7845         default:
7846             break;
7847         }
7848     }
7849     switch (event->type()) {
7850     case QEvent::MouseMove:
7851         mouseMoveEvent((QMouseEvent*)event);
7852         break;
7853
7854     case QEvent::MouseButtonPress:
7855         mousePressEvent((QMouseEvent*)event);
7856         break;
7857
7858     case QEvent::MouseButtonRelease:
7859         mouseReleaseEvent((QMouseEvent*)event);
7860         break;
7861
7862     case QEvent::MouseButtonDblClick:
7863         mouseDoubleClickEvent((QMouseEvent*)event);
7864         break;
7865 #ifndef QT_NO_WHEELEVENT
7866     case QEvent::Wheel:
7867         wheelEvent((QWheelEvent*)event);
7868         break;
7869 #endif
7870 #ifndef QT_NO_TABLETEVENT
7871     case QEvent::TabletMove:
7872     case QEvent::TabletPress:
7873     case QEvent::TabletRelease:
7874         tabletEvent((QTabletEvent*)event);
7875         break;
7876 #endif
7877     case QEvent::KeyPress: {
7878         QKeyEvent *k = (QKeyEvent *)event;
7879         bool res = false;
7880         if (!(k->modifiers() & (Qt::ControlModifier | Qt::AltModifier))) {  //### Add MetaModifier?
7881             if (k->key() == Qt::Key_Backtab
7882                 || (k->key() == Qt::Key_Tab && (k->modifiers() & Qt::ShiftModifier)))
7883                 res = focusNextPrevChild(false);
7884             else if (k->key() == Qt::Key_Tab)
7885                 res = focusNextPrevChild(true);
7886             if (res)
7887                 break;
7888         }
7889         keyPressEvent(k);
7890 #ifdef QT_KEYPAD_NAVIGATION
7891         if (!k->isAccepted() && QApplication::keypadNavigationEnabled()
7892             && !(k->modifiers() & (Qt::ControlModifier | Qt::AltModifier | Qt::ShiftModifier))) {
7893             if (QApplication::navigationMode() == Qt::NavigationModeKeypadTabOrder) {
7894                 if (k->key() == Qt::Key_Up)
7895                     res = focusNextPrevChild(false);
7896                 else if (k->key() == Qt::Key_Down)
7897                     res = focusNextPrevChild(true);
7898             } else if (QApplication::navigationMode() == Qt::NavigationModeKeypadDirectional) {
7899                 if (k->key() == Qt::Key_Up)
7900                     res = QWidgetPrivate::navigateToDirection(QWidgetPrivate::DirectionNorth);
7901                 else if (k->key() == Qt::Key_Right)
7902                     res = QWidgetPrivate::navigateToDirection(QWidgetPrivate::DirectionEast);
7903                 else if (k->key() == Qt::Key_Down)
7904                     res = QWidgetPrivate::navigateToDirection(QWidgetPrivate::DirectionSouth);
7905                 else if (k->key() == Qt::Key_Left)
7906                     res = QWidgetPrivate::navigateToDirection(QWidgetPrivate::DirectionWest);
7907             }
7908             if (res) {
7909                 k->accept();
7910                 break;
7911             }
7912         }
7913 #endif
7914 #ifndef QT_NO_WHATSTHIS
7915         if (!k->isAccepted()
7916             && k->modifiers() & Qt::ShiftModifier && k->key() == Qt::Key_F1
7917             && d->whatsThis.size()) {
7918             QWhatsThis::showText(mapToGlobal(inputMethodQuery(Qt::ImCursorRectangle).toRect().center()), d->whatsThis, this);
7919             k->accept();
7920         }
7921 #endif
7922     }
7923         break;
7924
7925     case QEvent::KeyRelease:
7926         keyReleaseEvent((QKeyEvent*)event);
7927         // fall through
7928     case QEvent::ShortcutOverride:
7929         break;
7930
7931     case QEvent::InputMethod:
7932         inputMethodEvent((QInputMethodEvent *) event);
7933         break;
7934
7935     case QEvent::InputMethodQuery:
7936         if (testAttribute(Qt::WA_InputMethodEnabled)) {
7937             QInputMethodQueryEvent *query = static_cast<QInputMethodQueryEvent *>(event);
7938             Qt::InputMethodQueries queries = query->queries();
7939             for (uint i = 0; i < 32; ++i) {
7940                 Qt::InputMethodQuery q = (Qt::InputMethodQuery)(int)(queries & (1<<i));
7941                 if (q) {
7942                     QVariant v = inputMethodQuery(q);
7943                     if (q == Qt::ImEnabled && !v.isValid() && isEnabled())
7944                         v = QVariant(true); // special case for Qt4 compatibility
7945                     query->setValue(q, v);
7946                 }
7947             }
7948             query->accept();
7949             break;
7950         }
7951
7952     case QEvent::PolishRequest:
7953         ensurePolished();
7954         break;
7955
7956     case QEvent::Polish: {
7957         style()->polish(this);
7958         setAttribute(Qt::WA_WState_Polished);
7959         if (!QApplication::font(this).isCopyOf(QApplication::font()))
7960             d->resolveFont();
7961         if (!QApplication::palette(this).isCopyOf(QApplication::palette()))
7962             d->resolvePalette();
7963     }
7964         break;
7965
7966     case QEvent::ApplicationWindowIconChange:
7967         if (isWindow() && !testAttribute(Qt::WA_SetWindowIcon)) {
7968             d->setWindowIcon_sys();
7969             d->setWindowIcon_helper();
7970         }
7971         break;
7972     case QEvent::FocusIn:
7973 #ifdef QT_SOFTKEYS_ENABLED
7974         QSoftKeyManager::updateSoftKeys();
7975 #endif
7976         focusInEvent((QFocusEvent*)event);
7977         d->updateWidgetTransform();
7978         break;
7979
7980     case QEvent::FocusOut:
7981         focusOutEvent((QFocusEvent*)event);
7982         break;
7983
7984     case QEvent::Enter:
7985 #ifndef QT_NO_STATUSTIP
7986         if (d->statusTip.size()) {
7987             QStatusTipEvent tip(d->statusTip);
7988             QApplication::sendEvent(const_cast<QWidget *>(this), &tip);
7989         }
7990 #endif
7991         enterEvent(event);
7992         break;
7993
7994     case QEvent::Leave:
7995 #ifndef QT_NO_STATUSTIP
7996         if (d->statusTip.size()) {
7997             QString empty;
7998             QStatusTipEvent tip(empty);
7999             QApplication::sendEvent(const_cast<QWidget *>(this), &tip);
8000         }
8001 #endif
8002         leaveEvent(event);
8003         break;
8004
8005     case QEvent::HoverEnter:
8006     case QEvent::HoverLeave:
8007         update();
8008         break;
8009
8010     case QEvent::Paint:
8011         // At this point the event has to be delivered, regardless
8012         // whether the widget isVisible() or not because it
8013         // already went through the filters
8014         paintEvent((QPaintEvent*)event);
8015         break;
8016
8017     case QEvent::Move:
8018         moveEvent((QMoveEvent*)event);
8019         d->updateWidgetTransform();
8020         break;
8021
8022     case QEvent::Resize:
8023         resizeEvent((QResizeEvent*)event);
8024         d->updateWidgetTransform();
8025         break;
8026
8027     case QEvent::Close:
8028         closeEvent((QCloseEvent *)event);
8029         break;
8030
8031 #ifndef QT_NO_CONTEXTMENU
8032     case QEvent::ContextMenu:
8033         switch (data->context_menu_policy) {
8034         case Qt::PreventContextMenu:
8035             break;
8036         case Qt::DefaultContextMenu:
8037             contextMenuEvent(static_cast<QContextMenuEvent *>(event));
8038             break;
8039         case Qt::CustomContextMenu:
8040             emit customContextMenuRequested(static_cast<QContextMenuEvent *>(event)->pos());
8041             break;
8042 #ifndef QT_NO_MENU
8043         case Qt::ActionsContextMenu:
8044             if (d->actions.count()) {
8045                 QMenu::exec(d->actions, static_cast<QContextMenuEvent *>(event)->globalPos(),
8046                             0, this);
8047                 break;
8048             }
8049             // fall through
8050 #endif
8051         default:
8052             event->ignore();
8053             break;
8054         }
8055         break;
8056 #endif // QT_NO_CONTEXTMENU
8057
8058 #ifndef QT_NO_DRAGANDDROP
8059     case QEvent::Drop:
8060         dropEvent((QDropEvent*) event);
8061         break;
8062
8063     case QEvent::DragEnter:
8064         dragEnterEvent((QDragEnterEvent*) event);
8065         break;
8066
8067     case QEvent::DragMove:
8068         dragMoveEvent((QDragMoveEvent*) event);
8069         break;
8070
8071     case QEvent::DragLeave:
8072         dragLeaveEvent((QDragLeaveEvent*) event);
8073         break;
8074 #endif
8075
8076     case QEvent::Show:
8077         showEvent((QShowEvent*) event);
8078         break;
8079
8080     case QEvent::Hide:
8081         hideEvent((QHideEvent*) event);
8082         break;
8083
8084     case QEvent::ShowWindowRequest:
8085         if (!isHidden())
8086             d->show_sys();
8087         break;
8088
8089     case QEvent::ApplicationFontChange:
8090         d->resolveFont();
8091         break;
8092     case QEvent::ApplicationPaletteChange:
8093         if (!(windowType() == Qt::Desktop))
8094             d->resolvePalette();
8095         break;
8096
8097     case QEvent::ToolBarChange:
8098     case QEvent::ActivationChange:
8099     case QEvent::EnabledChange:
8100     case QEvent::FontChange:
8101     case QEvent::StyleChange:
8102     case QEvent::PaletteChange:
8103     case QEvent::WindowTitleChange:
8104     case QEvent::IconTextChange:
8105     case QEvent::ModifiedChange:
8106     case QEvent::MouseTrackingChange:
8107     case QEvent::ParentChange:
8108     case QEvent::WindowStateChange:
8109     case QEvent::LocaleChange:
8110     case QEvent::MacSizeChange:
8111     case QEvent::ContentsRectChange:
8112     case QEvent::ThemeChange:
8113         changeEvent(event);
8114         break;
8115
8116     case QEvent::WindowActivate:
8117     case QEvent::WindowDeactivate: {
8118         if (isVisible() && !palette().isEqual(QPalette::Active, QPalette::Inactive))
8119             update();
8120         QList<QObject*> childList = d->children;
8121         for (int i = 0; i < childList.size(); ++i) {
8122             QWidget *w = qobject_cast<QWidget *>(childList.at(i));
8123             if (w && w->isVisible() && !w->isWindow())
8124                 QApplication::sendEvent(w, event);
8125         }
8126
8127 #ifdef QT_SOFTKEYS_ENABLED
8128         if (isWindow())
8129             QSoftKeyManager::updateSoftKeys();
8130 #endif
8131
8132         break; }
8133
8134     case QEvent::LanguageChange:
8135         changeEvent(event);
8136         {
8137             QList<QObject*> childList = d->children;
8138             for (int i = 0; i < childList.size(); ++i) {
8139                 QObject *o = childList.at(i);
8140                 if (o)
8141                     QApplication::sendEvent(o, event);
8142             }
8143         }
8144         update();
8145         break;
8146
8147     case QEvent::ApplicationLayoutDirectionChange:
8148         d->resolveLayoutDirection();
8149         break;
8150
8151     case QEvent::LayoutDirectionChange:
8152         if (d->layout)
8153             d->layout->invalidate();
8154         update();
8155         changeEvent(event);
8156         break;
8157     case QEvent::UpdateRequest:
8158         d->syncBackingStore();
8159         break;
8160     case QEvent::UpdateLater:
8161         update(static_cast<QUpdateLaterEvent*>(event)->region());
8162         break;
8163
8164     case QEvent::WindowBlocked:
8165     case QEvent::WindowUnblocked:
8166         {
8167             QList<QObject*> childList = d->children;
8168             for (int i = 0; i < childList.size(); ++i) {
8169                 QObject *o = childList.at(i);
8170                 if (o && o != QApplication::activeModalWidget()) {
8171                     if (qobject_cast<QWidget *>(o) && static_cast<QWidget *>(o)->isWindow()) {
8172                         // do not forward the event to child windows,
8173                         // QApplication does this for us
8174                         continue;
8175                     }
8176                     QApplication::sendEvent(o, event);
8177                 }
8178             }
8179 #if defined(Q_WS_WIN)
8180             setDisabledStyle(this, (event->type() == QEvent::WindowBlocked));
8181 #endif
8182         }
8183         break;
8184 #ifndef QT_NO_TOOLTIP
8185     case QEvent::ToolTip:
8186         if (!d->toolTip.isEmpty())
8187             QToolTip::showText(static_cast<QHelpEvent*>(event)->globalPos(), d->toolTip, this);
8188         else
8189             event->ignore();
8190         break;
8191 #endif
8192 #ifndef QT_NO_WHATSTHIS
8193     case QEvent::WhatsThis:
8194         if (d->whatsThis.size())
8195             QWhatsThis::showText(static_cast<QHelpEvent *>(event)->globalPos(), d->whatsThis, this);
8196         else
8197             event->ignore();
8198         break;
8199     case QEvent::QueryWhatsThis:
8200         if (d->whatsThis.isEmpty())
8201             event->ignore();
8202         break;
8203 #endif
8204     case QEvent::EmbeddingControl:
8205         d->topData()->frameStrut.setCoords(0 ,0, 0, 0);
8206         data->fstrut_dirty = false;
8207 #if defined(Q_WS_WIN) || defined(Q_WS_X11)
8208         d->topData()->embedded = 1;
8209 #endif
8210         break;
8211 #ifndef QT_NO_ACTION
8212     case QEvent::ActionAdded:
8213     case QEvent::ActionRemoved:
8214     case QEvent::ActionChanged:
8215 #ifdef QT_SOFTKEYS_ENABLED
8216         QSoftKeyManager::updateSoftKeys();
8217 #endif
8218         actionEvent((QActionEvent*)event);
8219         break;
8220 #endif
8221
8222     case QEvent::KeyboardLayoutChange:
8223         {
8224             changeEvent(event);
8225
8226             // inform children of the change
8227             QList<QObject*> childList = d->children;
8228             for (int i = 0; i < childList.size(); ++i) {
8229                 QWidget *w = qobject_cast<QWidget *>(childList.at(i));
8230                 if (w && w->isVisible() && !w->isWindow())
8231                     QApplication::sendEvent(w, event);
8232             }
8233             break;
8234         }
8235 #ifdef Q_WS_MAC
8236     case QEvent::MacGLWindowChange:
8237         d->needWindowChange = false;
8238         break;
8239 #endif
8240     case QEvent::TouchBegin:
8241     case QEvent::TouchUpdate:
8242     case QEvent::TouchEnd:
8243     case QEvent::TouchCancel:
8244     {
8245         event->ignore();
8246         break;
8247     }
8248 #ifndef QT_NO_GESTURES
8249     case QEvent::Gesture:
8250         event->ignore();
8251         break;
8252 #endif
8253 #ifndef QT_NO_PROPERTIES
8254     case QEvent::DynamicPropertyChange: {
8255         const QByteArray &propName = static_cast<QDynamicPropertyChangeEvent *>(event)->propertyName();
8256         if (!qstrncmp(propName, "_q_customDpi", 12) && propName.length() == 13) {
8257             uint value = property(propName.constData()).toUInt();
8258             if (!d->extra)
8259                 d->createExtra();
8260             const char axis = propName.at(12);
8261             if (axis == 'X')
8262                 d->extra->customDpiX = value;
8263             else if (axis == 'Y')
8264                 d->extra->customDpiY = value;
8265             d->updateFont(d->data.fnt);
8266         }
8267         // fall through
8268     }
8269 #endif
8270     default:
8271         return QObject::event(event);
8272     }
8273     return true;
8274 }
8275
8276 /*!
8277   This event handler can be reimplemented to handle state changes.
8278
8279   The state being changed in this event can be retrieved through the \a event
8280   supplied.
8281
8282   Change events include: QEvent::ToolBarChange,
8283   QEvent::ActivationChange, QEvent::EnabledChange, QEvent::FontChange,
8284   QEvent::StyleChange, QEvent::PaletteChange,
8285   QEvent::WindowTitleChange, QEvent::IconTextChange,
8286   QEvent::ModifiedChange, QEvent::MouseTrackingChange,
8287   QEvent::ParentChange, QEvent::WindowStateChange,
8288   QEvent::LanguageChange, QEvent::LocaleChange,
8289   QEvent::LayoutDirectionChange.
8290
8291 */
8292 void QWidget::changeEvent(QEvent * event)
8293 {
8294     switch(event->type()) {
8295     case QEvent::EnabledChange: {
8296         update();
8297 #ifndef QT_NO_ACCESSIBILITY
8298         QAccessible::State s;
8299         s.disabled = true;
8300         QAccessibleStateChangeEvent event(this, s);
8301         QAccessible::updateAccessibility(&event);
8302 #endif
8303         break;
8304     }
8305
8306     case QEvent::FontChange:
8307     case QEvent::StyleChange: {
8308         Q_D(QWidget);
8309         update();
8310         updateGeometry();
8311         if (d->layout)
8312             d->layout->invalidate();
8313         break;
8314     }
8315
8316     case QEvent::PaletteChange:
8317         update();
8318         break;
8319
8320     case QEvent::ThemeChange:
8321         if (QApplication::desktopSettingsAware() && windowType() != Qt::Desktop
8322             && qApp && !QApplication::closingDown()) {
8323             if (testAttribute(Qt::WA_WState_Polished))
8324                 QApplication::style()->unpolish(this);
8325             if (testAttribute(Qt::WA_WState_Polished))
8326                 QApplication::style()->polish(this);
8327             QEvent styleChangedEvent(QEvent::StyleChange);
8328             QCoreApplication::sendEvent(this, &styleChangedEvent);
8329             if (isVisible())
8330                 update();
8331         }
8332         break;
8333
8334 #ifdef Q_WS_MAC
8335     case QEvent::MacSizeChange:
8336         updateGeometry();
8337         break;
8338     case QEvent::ToolTipChange:
8339     case QEvent::MouseTrackingChange:
8340         qt_mac_update_mouseTracking(this);
8341         break;
8342 #endif
8343
8344     default:
8345         break;
8346     }
8347 }
8348
8349 /*!
8350     This event handler, for event \a event, can be reimplemented in a
8351     subclass to receive mouse move events for the widget.
8352
8353     If mouse tracking is switched off, mouse move events only occur if
8354     a mouse button is pressed while the mouse is being moved. If mouse
8355     tracking is switched on, mouse move events occur even if no mouse
8356     button is pressed.
8357
8358     QMouseEvent::pos() reports the position of the mouse cursor,
8359     relative to this widget. For press and release events, the
8360     position is usually the same as the position of the last mouse
8361     move event, but it might be different if the user's hand shakes.
8362     This is a feature of the underlying window system, not Qt.
8363
8364     If you want to show a tooltip immediately, while the mouse is
8365     moving (e.g., to get the mouse coordinates with QMouseEvent::pos()
8366     and show them as a tooltip), you must first enable mouse tracking
8367     as described above. Then, to ensure that the tooltip is updated
8368     immediately, you must call QToolTip::showText() instead of
8369     setToolTip() in your implementation of mouseMoveEvent().
8370
8371     \sa setMouseTracking(), mousePressEvent(), mouseReleaseEvent(),
8372     mouseDoubleClickEvent(), event(), QMouseEvent, {Scribble Example}
8373 */
8374
8375 void QWidget::mouseMoveEvent(QMouseEvent *event)
8376 {
8377     event->ignore();
8378 }
8379
8380 /*!
8381     This event handler, for event \a event, can be reimplemented in a
8382     subclass to receive mouse press events for the widget.
8383
8384     If you create new widgets in the mousePressEvent() the
8385     mouseReleaseEvent() may not end up where you expect, depending on
8386     the underlying window system (or X11 window manager), the widgets'
8387     location and maybe more.
8388
8389     The default implementation implements the closing of popup widgets
8390     when you click outside the window. For other widget types it does
8391     nothing.
8392
8393     \sa mouseReleaseEvent(), mouseDoubleClickEvent(),
8394     mouseMoveEvent(), event(), QMouseEvent, {Scribble Example}
8395 */
8396
8397 void QWidget::mousePressEvent(QMouseEvent *event)
8398 {
8399     event->ignore();
8400     if ((windowType() == Qt::Popup)) {
8401         event->accept();
8402         QWidget* w;
8403         while ((w = QApplication::activePopupWidget()) && w != this){
8404             w->close();
8405             if (QApplication::activePopupWidget() == w) // widget does not want to disappear
8406                 w->hide(); // hide at least
8407         }
8408         if (!rect().contains(event->pos())){
8409             close();
8410         }
8411     }
8412 }
8413
8414 /*!
8415     This event handler, for event \a event, can be reimplemented in a
8416     subclass to receive mouse release events for the widget.
8417
8418     \sa mousePressEvent(), mouseDoubleClickEvent(),
8419     mouseMoveEvent(), event(), QMouseEvent, {Scribble Example}
8420 */
8421
8422 void QWidget::mouseReleaseEvent(QMouseEvent *event)
8423 {
8424     event->ignore();
8425 }
8426
8427 /*!
8428     This event handler, for event \a event, can be reimplemented in a
8429     subclass to receive mouse double click events for the widget.
8430
8431     The default implementation generates a normal mouse press event.
8432
8433     \note The widget will also receive mouse press and mouse release
8434     events in addition to the double click event. It is up to the
8435     developer to ensure that the application interprets these events
8436     correctly.
8437
8438     \sa mousePressEvent(), mouseReleaseEvent() mouseMoveEvent(),
8439     event(), QMouseEvent
8440 */
8441
8442 void QWidget::mouseDoubleClickEvent(QMouseEvent *event)
8443 {
8444     Q_UNUSED(event)
8445 }
8446
8447 #ifndef QT_NO_WHEELEVENT
8448 /*!
8449     This event handler, for event \a event, can be reimplemented in a
8450     subclass to receive wheel events for the widget.
8451
8452     If you reimplement this handler, it is very important that you
8453     \link QWheelEvent ignore()\endlink the event if you do not handle
8454     it, so that the widget's parent can interpret it.
8455
8456     The default implementation ignores the event.
8457
8458     \sa QWheelEvent::ignore(), QWheelEvent::accept(), event(),
8459     QWheelEvent
8460 */
8461
8462 void QWidget::wheelEvent(QWheelEvent *event)
8463 {
8464     event->ignore();
8465 }
8466 #endif // QT_NO_WHEELEVENT
8467
8468 #ifndef QT_NO_TABLETEVENT
8469 /*!
8470     This event handler, for event \a event, can be reimplemented in a
8471     subclass to receive tablet events for the widget.
8472
8473     If you reimplement this handler, it is very important that you
8474     \link QTabletEvent ignore()\endlink the event if you do not handle
8475     it, so that the widget's parent can interpret it.
8476
8477     The default implementation ignores the event.
8478
8479     \sa QTabletEvent::ignore(), QTabletEvent::accept(), event(),
8480     QTabletEvent
8481 */
8482
8483 void QWidget::tabletEvent(QTabletEvent *event)
8484 {
8485     event->ignore();
8486 }
8487 #endif // QT_NO_TABLETEVENT
8488
8489 /*!
8490     This event handler, for event \a event, can be reimplemented in a
8491     subclass to receive key press events for the widget.
8492
8493     A widget must call setFocusPolicy() to accept focus initially and
8494     have focus in order to receive a key press event.
8495
8496     If you reimplement this handler, it is very important that you
8497     call the base class implementation if you do not act upon the key.
8498
8499     The default implementation closes popup widgets if the user
8500     presses Esc. Otherwise the event is ignored, so that the widget's
8501     parent can interpret it.
8502
8503     Note that QKeyEvent starts with isAccepted() == true, so you do not
8504     need to call QKeyEvent::accept() - just do not call the base class
8505     implementation if you act upon the key.
8506
8507     \sa keyReleaseEvent(), setFocusPolicy(),
8508     focusInEvent(), focusOutEvent(), event(), QKeyEvent, {Tetrix Example}
8509 */
8510
8511 void QWidget::keyPressEvent(QKeyEvent *event)
8512 {
8513     if ((windowType() == Qt::Popup) && event->key() == Qt::Key_Escape) {
8514         event->accept();
8515         close();
8516     } else {
8517         event->ignore();
8518     }
8519 }
8520
8521 /*!
8522     This event handler, for event \a event, can be reimplemented in a
8523     subclass to receive key release events for the widget.
8524
8525     A widget must \link setFocusPolicy() accept focus\endlink
8526     initially and \link hasFocus() have focus\endlink in order to
8527     receive a key release event.
8528
8529     If you reimplement this handler, it is very important that you
8530     call the base class implementation if you do not act upon the key.
8531
8532     The default implementation ignores the event, so that the widget's
8533     parent can interpret it.
8534
8535     Note that QKeyEvent starts with isAccepted() == true, so you do not
8536     need to call QKeyEvent::accept() - just do not call the base class
8537     implementation if you act upon the key.
8538
8539     \sa keyPressEvent(), QKeyEvent::ignore(), setFocusPolicy(),
8540     focusInEvent(), focusOutEvent(), event(), QKeyEvent
8541 */
8542
8543 void QWidget::keyReleaseEvent(QKeyEvent *event)
8544 {
8545     event->ignore();
8546 }
8547
8548 /*!
8549     \fn void QWidget::focusInEvent(QFocusEvent *event)
8550
8551     This event handler can be reimplemented in a subclass to receive
8552     keyboard focus events (focus received) for the widget. The event
8553     is passed in the \a event parameter
8554
8555     A widget normally must setFocusPolicy() to something other than
8556     Qt::NoFocus in order to receive focus events. (Note that the
8557     application programmer can call setFocus() on any widget, even
8558     those that do not normally accept focus.)
8559
8560     The default implementation updates the widget (except for windows
8561     that do not specify a focusPolicy()).
8562
8563     \sa focusOutEvent(), setFocusPolicy(), keyPressEvent(),
8564     keyReleaseEvent(), event(), QFocusEvent
8565 */
8566
8567 void QWidget::focusInEvent(QFocusEvent *)
8568 {
8569     if (focusPolicy() != Qt::NoFocus || !isWindow()) {
8570         update();
8571     }
8572 }
8573
8574 /*!
8575     \fn void QWidget::focusOutEvent(QFocusEvent *event)
8576
8577     This event handler can be reimplemented in a subclass to receive
8578     keyboard focus events (focus lost) for the widget. The events is
8579     passed in the \a event parameter.
8580
8581     A widget normally must setFocusPolicy() to something other than
8582     Qt::NoFocus in order to receive focus events. (Note that the
8583     application programmer can call setFocus() on any widget, even
8584     those that do not normally accept focus.)
8585
8586     The default implementation updates the widget (except for windows
8587     that do not specify a focusPolicy()).
8588
8589     \sa focusInEvent(), setFocusPolicy(), keyPressEvent(),
8590     keyReleaseEvent(), event(), QFocusEvent
8591 */
8592
8593 void QWidget::focusOutEvent(QFocusEvent *)
8594 {
8595     if (focusPolicy() != Qt::NoFocus || !isWindow())
8596         update();
8597 }
8598
8599 /*!
8600     \fn void QWidget::enterEvent(QEvent *event)
8601
8602     This event handler can be reimplemented in a subclass to receive
8603     widget enter events which are passed in the \a event parameter.
8604
8605     An event is sent to the widget when the mouse cursor enters the
8606     widget.
8607
8608     \sa leaveEvent(), mouseMoveEvent(), event()
8609 */
8610
8611 void QWidget::enterEvent(QEvent *)
8612 {
8613 }
8614
8615 /*!
8616     \fn void QWidget::leaveEvent(QEvent *event)
8617
8618     This event handler can be reimplemented in a subclass to receive
8619     widget leave events which are passed in the \a event parameter.
8620
8621     A leave event is sent to the widget when the mouse cursor leaves
8622     the widget.
8623
8624     \sa enterEvent(), mouseMoveEvent(), event()
8625 */
8626
8627 void QWidget::leaveEvent(QEvent *)
8628 {
8629 }
8630
8631 /*!
8632     \fn void QWidget::paintEvent(QPaintEvent *event)
8633
8634     This event handler can be reimplemented in a subclass to receive paint
8635     events passed in \a event.
8636
8637     A paint event is a request to repaint all or part of a widget. It can
8638     happen for one of the following reasons:
8639
8640     \list
8641         \li repaint() or update() was invoked,
8642         \li the widget was obscured and has now been uncovered, or
8643         \li many other reasons.
8644     \endlist
8645
8646     Many widgets can simply repaint their entire surface when asked to, but
8647     some slow widgets need to optimize by painting only the requested region:
8648     QPaintEvent::region(). This speed optimization does not change the result,
8649     as painting is clipped to that region during event processing. QListView
8650     and QTableView do this, for example.
8651
8652     Qt also tries to speed up painting by merging multiple paint events into
8653     one. When update() is called several times or the window system sends
8654     several paint events, Qt merges these events into one event with a larger
8655     region (see QRegion::united()). The repaint() function does not permit this
8656     optimization, so we suggest using update() whenever possible.
8657
8658     When the paint event occurs, the update region has normally been erased, so
8659     you are painting on the widget's background.
8660
8661     The background can be set using setBackgroundRole() and setPalette().
8662
8663     Since Qt 4.0, QWidget automatically double-buffers its painting, so there
8664     is no need to write double-buffering code in paintEvent() to avoid flicker.
8665
8666     \b{Note for the X11 platform}: It is possible to toggle global double
8667     buffering by calling \c qt_x11_set_global_double_buffer(). For example,
8668
8669     \snippet doc/src/snippets/code/src_gui_kernel_qwidget.cpp 14
8670
8671     \note Generally, you should refrain from calling update() or repaint()
8672     \b{inside} a paintEvent(). For example, calling update() or repaint() on
8673     children inside a paintevent() results in undefined behavior; the child may
8674     or may not get a paint event.
8675
8676     \warning If you are using a custom paint engine without Qt's backingstore,
8677     Qt::WA_PaintOnScreen must be set. Otherwise, QWidget::paintEngine() will
8678     never be called; the backingstore will be used instead.
8679
8680     \sa event(), repaint(), update(), QPainter, QPixmap, QPaintEvent,
8681     {Analog Clock Example}
8682 */
8683
8684 void QWidget::paintEvent(QPaintEvent *)
8685 {
8686 }
8687
8688
8689 /*!
8690     \fn void QWidget::moveEvent(QMoveEvent *event)
8691
8692     This event handler can be reimplemented in a subclass to receive
8693     widget move events which are passed in the \a event parameter.
8694     When the widget receives this event, it is already at the new
8695     position.
8696
8697     The old position is accessible through QMoveEvent::oldPos().
8698
8699     \sa resizeEvent(), event(), move(), QMoveEvent
8700 */
8701
8702 void QWidget::moveEvent(QMoveEvent *)
8703 {
8704 }
8705
8706
8707 /*!
8708     This event handler can be reimplemented in a subclass to receive
8709     widget resize events which are passed in the \a event parameter.
8710     When resizeEvent() is called, the widget already has its new
8711     geometry. The old size is accessible through
8712     QResizeEvent::oldSize().
8713
8714     The widget will be erased and receive a paint event immediately
8715     after processing the resize event. No drawing need be (or should
8716     be) done inside this handler.
8717
8718
8719     \sa moveEvent(), event(), resize(), QResizeEvent, paintEvent(),
8720         {Scribble Example}
8721 */
8722
8723 void QWidget::resizeEvent(QResizeEvent * /* event */)
8724 {
8725 }
8726
8727 #ifndef QT_NO_ACTION
8728 /*!
8729     \fn void QWidget::actionEvent(QActionEvent *event)
8730
8731     This event handler is called with the given \a event whenever the
8732     widget's actions are changed.
8733
8734     \sa addAction(), insertAction(), removeAction(), actions(), QActionEvent
8735 */
8736 void QWidget::actionEvent(QActionEvent *)
8737 {
8738
8739 }
8740 #endif
8741
8742 /*!
8743     This event handler is called with the given \a event when Qt receives a window
8744     close request for a top-level widget from the window system.
8745
8746     By default, the event is accepted and the widget is closed. You can reimplement
8747     this function to change the way the widget responds to window close requests.
8748     For example, you can prevent the window from closing by calling \l{QEvent::}{ignore()}
8749     on all events.
8750
8751     Main window applications typically use reimplementations of this function to check
8752     whether the user's work has been saved and ask for permission before closing.
8753     For example, the \l{Application Example} uses a helper function to determine whether
8754     or not to close the window:
8755
8756     \snippet mainwindows/application/mainwindow.cpp 3
8757     \snippet mainwindows/application/mainwindow.cpp 4
8758
8759     \sa event(), hide(), close(), QCloseEvent, {Application Example}
8760 */
8761
8762 void QWidget::closeEvent(QCloseEvent *event)
8763 {
8764     event->accept();
8765 }
8766
8767 #ifndef QT_NO_CONTEXTMENU
8768 /*!
8769     This event handler, for event \a event, can be reimplemented in a
8770     subclass to receive widget context menu events.
8771
8772     The handler is called when the widget's \l contextMenuPolicy is
8773     Qt::DefaultContextMenu.
8774
8775     The default implementation ignores the context event.
8776     See the \l QContextMenuEvent documentation for more details.
8777
8778     \sa event(), QContextMenuEvent customContextMenuRequested()
8779 */
8780
8781 void QWidget::contextMenuEvent(QContextMenuEvent *event)
8782 {
8783     event->ignore();
8784 }
8785 #endif // QT_NO_CONTEXTMENU
8786
8787
8788 /*!
8789     This event handler, for event \a event, can be reimplemented in a
8790     subclass to receive Input Method composition events. This handler
8791     is called when the state of the input method changes.
8792
8793     Note that when creating custom text editing widgets, the
8794     Qt::WA_InputMethodEnabled window attribute must be set explicitly
8795     (using the setAttribute() function) in order to receive input
8796     method events.
8797
8798     The default implementation calls event->ignore(), which rejects the
8799     Input Method event. See the \l QInputMethodEvent documentation for more
8800     details.
8801
8802     \sa event(), QInputMethodEvent
8803 */
8804 void QWidget::inputMethodEvent(QInputMethodEvent *event)
8805 {
8806     event->ignore();
8807 }
8808
8809 /*!
8810     This method is only relevant for input widgets. It is used by the
8811     input method to query a set of properties of the widget to be
8812     able to support complex input method operations as support for
8813     surrounding text and reconversions.
8814
8815     \a query specifies which property is queried.
8816
8817     \sa inputMethodEvent(), QInputMethodEven, inputMethodHints
8818 */
8819 QVariant QWidget::inputMethodQuery(Qt::InputMethodQuery query) const
8820 {
8821     switch(query) {
8822     case Qt::ImCursorRectangle:
8823         return QRect(width()/2, 0, 1, height());
8824     case Qt::ImFont:
8825         return font();
8826     case Qt::ImAnchorPosition:
8827         // Fallback.
8828         return inputMethodQuery(Qt::ImCursorPosition);
8829     case Qt::ImHints:
8830         return (int)inputMethodHints();
8831     default:
8832         return QVariant();
8833     }
8834 }
8835
8836 /*!
8837     \property QWidget::inputMethodHints
8838     \brief What input method specific hints the widget has.
8839
8840     This is only relevant for input widgets. It is used by
8841     the input method to retrieve hints as to how the input method
8842     should operate. For example, if the Qt::ImhFormattedNumbersOnly flag
8843     is set, the input method may change its visual components to reflect
8844     that only numbers can be entered.
8845
8846     \note The flags are only hints, so the particular input method
8847           implementation is free to ignore them. If you want to be
8848           sure that a certain type of characters are entered,
8849           you should also set a QValidator on the widget.
8850
8851     The default value is Qt::ImhNone.
8852
8853     \since 4.6
8854
8855     \sa inputMethodQuery()
8856 */
8857 Qt::InputMethodHints QWidget::inputMethodHints() const
8858 {
8859 #ifndef QT_NO_IM
8860     const QWidgetPrivate *priv = d_func();
8861     while (priv->inheritsInputMethodHints) {
8862         priv = priv->q_func()->parentWidget()->d_func();
8863         Q_ASSERT(priv);
8864     }
8865     return priv->imHints;
8866 #else //QT_NO_IM
8867     return 0;
8868 #endif //QT_NO_IM
8869 }
8870
8871 void QWidget::setInputMethodHints(Qt::InputMethodHints hints)
8872 {
8873 #ifndef QT_NO_IM
8874     Q_D(QWidget);
8875     d->imHints = hints;
8876     qApp->inputMethod()->update(Qt::ImHints);
8877 #endif //QT_NO_IM
8878 }
8879
8880
8881 #ifndef QT_NO_DRAGANDDROP
8882
8883 /*!
8884     \fn void QWidget::dragEnterEvent(QDragEnterEvent *event)
8885
8886     This event handler is called when a drag is in progress and the
8887     mouse enters this widget. The event is passed in the \a event parameter.
8888
8889     If the event is ignored, the widget won't receive any \l{dragMoveEvent()}{drag
8890     move events}.
8891
8892     See the \link dnd.html Drag-and-drop documentation\endlink for an
8893     overview of how to provide drag-and-drop in your application.
8894
8895     \sa QDrag, QDragEnterEvent
8896 */
8897 void QWidget::dragEnterEvent(QDragEnterEvent *)
8898 {
8899 }
8900
8901 /*!
8902     \fn void QWidget::dragMoveEvent(QDragMoveEvent *event)
8903
8904     This event handler is called if a drag is in progress, and when
8905     any of the following conditions occur: the cursor enters this widget,
8906     the cursor moves within this widget, or a modifier key is pressed on
8907     the keyboard while this widget has the focus. The event is passed
8908     in the \a event parameter.
8909
8910     See the \link dnd.html Drag-and-drop documentation\endlink for an
8911     overview of how to provide drag-and-drop in your application.
8912
8913     \sa QDrag, QDragMoveEvent
8914 */
8915 void QWidget::dragMoveEvent(QDragMoveEvent *)
8916 {
8917 }
8918
8919 /*!
8920     \fn void QWidget::dragLeaveEvent(QDragLeaveEvent *event)
8921
8922     This event handler is called when a drag is in progress and the
8923     mouse leaves this widget. The event is passed in the \a event
8924     parameter.
8925
8926     See the \link dnd.html Drag-and-drop documentation\endlink for an
8927     overview of how to provide drag-and-drop in your application.
8928
8929     \sa QDrag, QDragLeaveEvent
8930 */
8931 void QWidget::dragLeaveEvent(QDragLeaveEvent *)
8932 {
8933 }
8934
8935 /*!
8936     \fn void QWidget::dropEvent(QDropEvent *event)
8937
8938     This event handler is called when the drag is dropped on this
8939     widget. The event is passed in the \a event parameter.
8940
8941     See the \link dnd.html Drag-and-drop documentation\endlink for an
8942     overview of how to provide drag-and-drop in your application.
8943
8944     \sa QDrag, QDropEvent
8945 */
8946 void QWidget::dropEvent(QDropEvent *)
8947 {
8948 }
8949
8950 #endif // QT_NO_DRAGANDDROP
8951
8952 /*!
8953     \fn void QWidget::showEvent(QShowEvent *event)
8954
8955     This event handler can be reimplemented in a subclass to receive
8956     widget show events which are passed in the \a event parameter.
8957
8958     Non-spontaneous show events are sent to widgets immediately
8959     before they are shown. The spontaneous show events of windows are
8960     delivered afterwards.
8961
8962     Note: A widget receives spontaneous show and hide events when its
8963     mapping status is changed by the window system, e.g. a spontaneous
8964     hide event when the user minimizes the window, and a spontaneous
8965     show event when the window is restored again. After receiving a
8966     spontaneous hide event, a widget is still considered visible in
8967     the sense of isVisible().
8968
8969     \sa visible, event(), QShowEvent
8970 */
8971 void QWidget::showEvent(QShowEvent *)
8972 {
8973 }
8974
8975 /*!
8976     \fn void QWidget::hideEvent(QHideEvent *event)
8977
8978     This event handler can be reimplemented in a subclass to receive
8979     widget hide events. The event is passed in the \a event parameter.
8980
8981     Hide events are sent to widgets immediately after they have been
8982     hidden.
8983
8984     Note: A widget receives spontaneous show and hide events when its
8985     mapping status is changed by the window system, e.g. a spontaneous
8986     hide event when the user minimizes the window, and a spontaneous
8987     show event when the window is restored again. After receiving a
8988     spontaneous hide event, a widget is still considered visible in
8989     the sense of isVisible().
8990
8991     \sa visible, event(), QHideEvent
8992 */
8993 void QWidget::hideEvent(QHideEvent *)
8994 {
8995 }
8996
8997 /*!
8998     This special event handler can be reimplemented in a subclass to
8999     receive native platform events identified by \a eventType
9000     which are passed in the \a message parameter.
9001
9002     In your reimplementation of this function, if you want to stop the
9003     event being handled by Qt, return true and set \a result.
9004     If you return false, this native event is passed back to Qt,
9005     which translates the event into a Qt event and sends it to the widget.
9006
9007     \note Events are only delivered to this event handler if the widget is
9008     has a native Window handle.
9009
9010     \note This function superseedes the event filter functions
9011     x11Event(), winEvent() and macEvent() of Qt 4.
9012
9013     \table
9014     \header \li Platform \li Event Type Identifier \li Message Type \li Result Type
9015     \row \li Windows \li "windows_generic_MSG" \li MSG * \li LRESULT
9016     \endtable
9017 */
9018
9019 bool QWidget::nativeEvent(const QByteArray &eventType, void *message, long *result)
9020 {
9021     Q_UNUSED(eventType);
9022     Q_UNUSED(message);
9023     Q_UNUSED(result);
9024     return false;
9025 }
9026
9027 /*!
9028     Ensures that the widget has been polished by QStyle (i.e., has a
9029     proper font and palette).
9030
9031     QWidget calls this function after it has been fully constructed
9032     but before it is shown the very first time. You can call this
9033     function if you want to ensure that the widget is polished before
9034     doing an operation, e.g., the correct font size might be needed in
9035     the widget's sizeHint() reimplementation. Note that this function
9036     \e is called from the default implementation of sizeHint().
9037
9038     Polishing is useful for final initialization that must happen after
9039     all constructors (from base classes as well as from subclasses)
9040     have been called.
9041
9042     If you need to change some settings when a widget is polished,
9043     reimplement event() and handle the QEvent::Polish event type.
9044
9045     \b{Note:} The function is declared const so that it can be called from
9046     other const functions (e.g., sizeHint()).
9047
9048     \sa event()
9049 */
9050 void QWidget::ensurePolished() const
9051 {
9052     Q_D(const QWidget);
9053
9054     const QMetaObject *m = metaObject();
9055     if (m == d->polished)
9056         return;
9057     d->polished = m;
9058
9059     QEvent e(QEvent::Polish);
9060     QCoreApplication::sendEvent(const_cast<QWidget *>(this), &e);
9061
9062     // polish children after 'this'
9063     QList<QObject*> children = d->children;
9064     for (int i = 0; i < children.size(); ++i) {
9065         QObject *o = children.at(i);
9066         if(!o->isWidgetType())
9067             continue;
9068         if (QWidget *w = qobject_cast<QWidget *>(o))
9069             w->ensurePolished();
9070     }
9071
9072     if (d->parent && d->sendChildEvents) {
9073         QChildEvent e(QEvent::ChildPolished, const_cast<QWidget *>(this));
9074         QCoreApplication::sendEvent(d->parent, &e);
9075     }
9076     if (d->extra && d->extra->topextra && d->extra->topextra->window
9077         && d->extra->topextra->window->objectName().isEmpty()) {
9078         QString on = objectName();
9079         if (on.isEmpty()) {
9080             on = QString::fromUtf8(metaObject()->className());
9081             on += QStringLiteral("Class");
9082         }
9083         on += QStringLiteral("Window");
9084         d->extra->topextra->window->setObjectName(on);
9085     }
9086 }
9087
9088 /*!
9089     Returns the mask currently set on a widget. If no mask is set the
9090     return value will be an empty region.
9091
9092     \sa setMask(), clearMask(), QRegion::isEmpty(), {Shaped Clock Example}
9093 */
9094 QRegion QWidget::mask() const
9095 {
9096     Q_D(const QWidget);
9097     return d->extra ? d->extra->mask : QRegion();
9098 }
9099
9100 /*!
9101     Returns the layout manager that is installed on this widget, or 0
9102     if no layout manager is installed.
9103
9104     The layout manager sets the geometry of the widget's children
9105     that have been added to the layout.
9106
9107     \sa setLayout(), sizePolicy(), {Layout Management}
9108 */
9109 QLayout *QWidget::layout() const
9110 {
9111     return d_func()->layout;
9112 }
9113
9114
9115 /*!
9116     \fn void QWidget::setLayout(QLayout *layout)
9117
9118     Sets the layout manager for this widget to \a layout.
9119
9120     If there already is a layout manager installed on this widget,
9121     QWidget won't let you install another. You must first delete the
9122     existing layout manager (returned by layout()) before you can
9123     call setLayout() with the new layout.
9124
9125     If \a layout is the layout manger on a different widget, setLayout()
9126     will reparent the layout and make it the layout manager for this widget.
9127
9128     Example:
9129
9130     \snippet examples/uitools/textfinder/textfinder.cpp 3b
9131
9132     An alternative to calling this function is to pass this widget to
9133     the layout's constructor.
9134
9135     The QWidget will take ownership of \a layout.
9136
9137     \sa layout(), {Layout Management}
9138 */
9139
9140 void QWidget::setLayout(QLayout *l)
9141 {
9142     if (!l) {
9143         qWarning("QWidget::setLayout: Cannot set layout to 0");
9144         return;
9145     }
9146     if (layout()) {
9147         if (layout() != l)
9148             qWarning("QWidget::setLayout: Attempting to set QLayout \"%s\" on %s \"%s\", which already has a"
9149                      " layout", l->objectName().toLocal8Bit().data(), metaObject()->className(),
9150                      objectName().toLocal8Bit().data());
9151         return;
9152     }
9153
9154     QObject *oldParent = l->parent();
9155     if (oldParent && oldParent != this) {
9156         if (oldParent->isWidgetType()) {
9157             // Steal the layout off a widget parent. Takes effect when
9158             // morphing laid-out container widgets in Designer.
9159             QWidget *oldParentWidget = static_cast<QWidget *>(oldParent);
9160             oldParentWidget->takeLayout();
9161         } else {
9162             qWarning("QWidget::setLayout: Attempting to set QLayout \"%s\" on %s \"%s\", when the QLayout already has a parent",
9163                      l->objectName().toLocal8Bit().data(), metaObject()->className(),
9164                      objectName().toLocal8Bit().data());
9165             return;
9166         }
9167     }
9168
9169     Q_D(QWidget);
9170     l->d_func()->topLevel = true;
9171     d->layout = l;
9172     if (oldParent != this) {
9173         l->setParent(this);
9174         l->d_func()->reparentChildWidgets(this);
9175         l->invalidate();
9176     }
9177
9178     if (isWindow() && d->maybeTopData())
9179         d->topData()->sizeAdjusted = false;
9180 }
9181
9182 /*!
9183     \fn QLayout *QWidget::takeLayout()
9184
9185     Remove the layout from the widget.
9186     \since 4.5
9187 */
9188
9189 QLayout *QWidget::takeLayout()
9190 {
9191     Q_D(QWidget);
9192     QLayout *l =  layout();
9193     if (!l)
9194         return 0;
9195     d->layout = 0;
9196     l->setParent(0);
9197     return l;
9198 }
9199
9200 /*!
9201     \property QWidget::sizePolicy
9202     \brief the default layout behavior of the widget
9203
9204     If there is a QLayout that manages this widget's children, the
9205     size policy specified by that layout is used. If there is no such
9206     QLayout, the result of this function is used.
9207
9208     The default policy is Preferred/Preferred, which means that the
9209     widget can be freely resized, but prefers to be the size
9210     sizeHint() returns. Button-like widgets set the size policy to
9211     specify that they may stretch horizontally, but are fixed
9212     vertically. The same applies to lineedit controls (such as
9213     QLineEdit, QSpinBox or an editable QComboBox) and other
9214     horizontally orientated widgets (such as QProgressBar).
9215     QToolButton's are normally square, so they allow growth in both
9216     directions. Widgets that support different directions (such as
9217     QSlider, QScrollBar or QHeader) specify stretching in the
9218     respective direction only. Widgets that can provide scroll bars
9219     (usually subclasses of QScrollArea) tend to specify that they can
9220     use additional space, and that they can make do with less than
9221     sizeHint().
9222
9223     \sa sizeHint() QLayout QSizePolicy updateGeometry()
9224 */
9225 QSizePolicy QWidget::sizePolicy() const
9226 {
9227     Q_D(const QWidget);
9228     return d->size_policy;
9229 }
9230
9231 void QWidget::setSizePolicy(QSizePolicy policy)
9232 {
9233     Q_D(QWidget);
9234     setAttribute(Qt::WA_WState_OwnSizePolicy);
9235     if (policy == d->size_policy)
9236         return;
9237     d->size_policy = policy;
9238
9239 #ifndef QT_NO_GRAPHICSVIEW
9240     if (QWExtra *extra = d->extra) {
9241         if (extra->proxyWidget)
9242             extra->proxyWidget->setSizePolicy(policy);
9243     }
9244 #endif
9245
9246     updateGeometry();
9247
9248     if (isWindow() && d->maybeTopData())
9249         d->topData()->sizeAdjusted = false;
9250 }
9251
9252 /*!
9253     \fn void QWidget::setSizePolicy(QSizePolicy::Policy horizontal, QSizePolicy::Policy vertical)
9254     \overload
9255
9256     Sets the size policy of the widget to \a horizontal and \a
9257     vertical, with standard stretch and no height-for-width.
9258
9259     \sa QSizePolicy::QSizePolicy()
9260 */
9261
9262 /*!
9263     Returns the preferred height for this widget, given the width \a w.
9264
9265     If this widget has a layout, the default implementation returns
9266     the layout's preferred height.  if there is no layout, the default
9267     implementation returns -1 indicating that the preferred height
9268     does not depend on the width.
9269 */
9270
9271 int QWidget::heightForWidth(int w) const
9272 {
9273     if (layout() && layout()->hasHeightForWidth())
9274         return layout()->totalHeightForWidth(w);
9275     return -1;
9276 }
9277
9278
9279 /*!
9280     \Since 5.0
9281
9282     Returns true if the widget's preferred height depends on its width; otherwise returns false.
9283 */ 
9284 bool QWidget::hasHeightForWidth() const
9285 {
9286     Q_D(const QWidget);
9287     return d->layout ? d->layout->hasHeightForWidth() : d->size_policy.hasHeightForWidth();
9288 }
9289
9290 /*!
9291     \fn QWidget *QWidget::childAt(int x, int y) const
9292
9293     Returns the visible child widget at the position (\a{x}, \a{y})
9294     in the widget's coordinate system. If there is no visible child
9295     widget at the specified position, the function returns 0.
9296 */
9297
9298 /*!
9299     \overload
9300
9301     Returns the visible child widget at point \a p in the widget's own
9302     coordinate system.
9303 */
9304
9305 QWidget *QWidget::childAt(const QPoint &p) const
9306 {
9307     return d_func()->childAt_helper(p, false);
9308 }
9309
9310 QWidget *QWidgetPrivate::childAt_helper(const QPoint &p, bool ignoreChildrenInDestructor) const
9311 {
9312     if (children.isEmpty())
9313         return 0;
9314
9315 #ifdef Q_WS_MAC
9316     Q_Q(const QWidget);
9317     // Unified tool bars on the Mac require special handling since they live outside
9318     // QMainWindow's geometry(). See commit: 35667fd45ada49269a5987c235fdedfc43e92bb8
9319     bool includeFrame = q->isWindow() && qobject_cast<const QMainWindow *>(q)
9320                         && static_cast<const QMainWindow *>(q)->unifiedTitleAndToolBarOnMac();
9321     if (includeFrame)
9322         return childAtRecursiveHelper(p, ignoreChildrenInDestructor, includeFrame);
9323 #endif
9324
9325     if (!pointInsideRectAndMask(p))
9326         return 0;
9327     return childAtRecursiveHelper(p, ignoreChildrenInDestructor);
9328 }
9329
9330 QWidget *QWidgetPrivate::childAtRecursiveHelper(const QPoint &p, bool ignoreChildrenInDestructor, bool includeFrame) const
9331 {
9332 #ifndef Q_WS_MAC
9333     Q_UNUSED(includeFrame);
9334 #endif
9335     for (int i = children.size() - 1; i >= 0; --i) {
9336         QWidget *child = qobject_cast<QWidget *>(children.at(i));
9337         if (!child || child->isWindow() || child->isHidden() || child->testAttribute(Qt::WA_TransparentForMouseEvents)
9338             || (ignoreChildrenInDestructor && child->data->in_destructor)) {
9339             continue;
9340         }
9341
9342         // Map the point 'p' from parent coordinates to child coordinates.
9343         QPoint childPoint = p;
9344 #ifdef Q_WS_MAC
9345         // 'includeFrame' is true if the child's parent is a top-level QMainWindow with an unified tool bar.
9346         // An unified tool bar on the Mac lives outside QMainWindow's geometry(), so a normal
9347         // QWidget::mapFromParent won't do the trick.
9348         if (includeFrame && qobject_cast<QToolBar *>(child))
9349             childPoint = qt_mac_nativeMapFromParent(child, p);
9350         else
9351 #endif
9352         childPoint -= child->data->crect.topLeft();
9353
9354         // Check if the point hits the child.
9355         if (!child->d_func()->pointInsideRectAndMask(childPoint))
9356             continue;
9357
9358         // Do the same for the child's descendants.
9359         if (QWidget *w = child->d_func()->childAtRecursiveHelper(childPoint, ignoreChildrenInDestructor))
9360             return w;
9361
9362         // We have found our target; namely the child at position 'p'.
9363         return child;
9364     }
9365     return 0;
9366 }
9367
9368 void QWidgetPrivate::updateGeometry_helper(bool forceUpdate)
9369 {
9370     Q_Q(QWidget);
9371     if (widgetItem)
9372         widgetItem->invalidateSizeCache();
9373     QWidget *parent;
9374     if (forceUpdate || !extra || extra->minw != extra->maxw || extra->minh != extra->maxh) {
9375         if (!q->isWindow() && !q->isHidden() && (parent = q->parentWidget())) {
9376             if (parent->d_func()->layout)
9377                 parent->d_func()->layout->invalidate();
9378             else if (parent->isVisible())
9379                 QApplication::postEvent(parent, new QEvent(QEvent::LayoutRequest));
9380         }
9381     }
9382 }
9383
9384 /*!
9385     Notifies the layout system that this widget has changed and may
9386     need to change geometry.
9387
9388     Call this function if the sizeHint() or sizePolicy() have changed.
9389
9390     For explicitly hidden widgets, updateGeometry() is a no-op. The
9391     layout system will be notified as soon as the widget is shown.
9392 */
9393
9394 void QWidget::updateGeometry()
9395 {
9396     Q_D(QWidget);
9397     d->updateGeometry_helper(false);
9398 }
9399
9400 /*! \property QWidget::windowFlags
9401
9402     Window flags are a combination of a type (e.g. Qt::Dialog) and
9403     zero or more hints to the window system (e.g.
9404     Qt::FramelessWindowHint).
9405
9406     If the widget had type Qt::Widget or Qt::SubWindow and becomes a
9407     window (Qt::Window, Qt::Dialog, etc.), it is put at position (0,
9408     0) on the desktop. If the widget is a window and becomes a
9409     Qt::Widget or Qt::SubWindow, it is put at position (0, 0)
9410     relative to its parent widget.
9411
9412     \note This function calls setParent() when changing the flags for
9413     a window, causing the widget to be hidden. You must call show() to make
9414     the widget visible again..
9415
9416     \sa windowType(), {Window Flags Example}
9417 */
9418 void QWidget::setWindowFlags(Qt::WindowFlags flags)
9419 {
9420     if (data->window_flags == flags)
9421         return;
9422
9423     Q_D(QWidget);
9424
9425     if ((data->window_flags | flags) & Qt::Window) {
9426         // the old type was a window and/or the new type is a window
9427         QPoint oldPos = pos();
9428         bool visible = isVisible();
9429         setParent(parentWidget(), flags);
9430
9431         // if both types are windows or neither of them are, we restore
9432         // the old position
9433         if (!((data->window_flags ^ flags) & Qt::Window)
9434             && (visible || testAttribute(Qt::WA_Moved))) {
9435             move(oldPos);
9436         }
9437         // for backward-compatibility we change Qt::WA_QuitOnClose attribute value only when the window was recreated.
9438         d->adjustQuitOnCloseAttribute();
9439     } else {
9440         data->window_flags = flags;
9441     }
9442 }
9443
9444 /*!
9445     Sets the window flags for the widget to \a flags,
9446     \e without telling the window system.
9447
9448     \warning Do not call this function unless you really know what
9449     you're doing.
9450
9451     \sa setWindowFlags()
9452 */
9453 void QWidget::overrideWindowFlags(Qt::WindowFlags flags)
9454 {
9455     data->window_flags = flags;
9456 }
9457
9458 /*!
9459     \fn Qt::WindowType QWidget::windowType() const
9460
9461     Returns the window type of this widget. This is identical to
9462     windowFlags() & Qt::WindowType_Mask.
9463
9464     \sa windowFlags
9465 */
9466
9467 /*!
9468     Sets the parent of the widget to \a parent, and resets the window
9469     flags. The widget is moved to position (0, 0) in its new parent.
9470
9471     If the new parent widget is in a different window, the
9472     reparented widget and its children are appended to the end of the
9473     \l{setFocusPolicy()}{tab chain} of the new parent
9474     widget, in the same internal order as before. If one of the moved
9475     widgets had keyboard focus, setParent() calls clearFocus() for that
9476     widget.
9477
9478     If the new parent widget is in the same window as the
9479     old parent, setting the parent doesn't change the tab order or
9480     keyboard focus.
9481
9482     If the "new" parent widget is the old parent widget, this function
9483     does nothing.
9484
9485     \note The widget becomes invisible as part of changing its parent,
9486     even if it was previously visible. You must call show() to make the
9487     widget visible again.
9488
9489     \warning It is very unlikely that you will ever need this
9490     function. If you have a widget that changes its content
9491     dynamically, it is far easier to use \l QStackedWidget.
9492
9493     \sa setWindowFlags()
9494 */
9495 void QWidget::setParent(QWidget *parent)
9496 {
9497     if (parent == parentWidget())
9498         return;
9499     setParent((QWidget*)parent, windowFlags() & ~Qt::WindowType_Mask);
9500 }
9501
9502 /*!
9503     \overload
9504
9505     This function also takes widget flags, \a f as an argument.
9506 */
9507
9508 void QWidget::setParent(QWidget *parent, Qt::WindowFlags f)
9509 {
9510     Q_D(QWidget);
9511     d->inSetParent = true;
9512     bool resized = testAttribute(Qt::WA_Resized);
9513     bool wasCreated = testAttribute(Qt::WA_WState_Created);
9514     QWidget *oldtlw = window();
9515
9516     QWidget *desktopWidget = 0;
9517     if (parent && parent->windowType() == Qt::Desktop)
9518         desktopWidget = parent;
9519     bool newParent = (parent != parentWidget()) || !wasCreated || desktopWidget;
9520
9521 #if defined(Q_WS_X11) || defined(Q_WS_WIN) || defined(Q_WS_MAC)
9522     if (newParent && parent && !desktopWidget) {
9523         if (testAttribute(Qt::WA_NativeWindow) && !qApp->testAttribute(Qt::AA_DontCreateNativeWidgetSiblings)
9524 #ifdef Q_WS_MAC
9525             // On Mac, toolbars inside the unified title bar will never overlap with
9526             // siblings in the content view. So we skip enforce native siblings in that case
9527             && !d->isInUnifiedToolbar && parentWidget() && parentWidget()->isWindow()
9528 #endif // Q_WS_MAC
9529         )
9530             parent->d_func()->enforceNativeChildren();
9531         else if (parent->d_func()->nativeChildrenForced() || parent->testAttribute(Qt::WA_PaintOnScreen))
9532             setAttribute(Qt::WA_NativeWindow);
9533     }
9534 #endif
9535
9536     if (wasCreated) {
9537         if (!testAttribute(Qt::WA_WState_Hidden)) {
9538             hide();
9539             setAttribute(Qt::WA_WState_ExplicitShowHide, false);
9540         }
9541         if (newParent) {
9542             QEvent e(QEvent::ParentAboutToChange);
9543             QApplication::sendEvent(this, &e);
9544         }
9545     }
9546     if (newParent && isAncestorOf(focusWidget()))
9547         focusWidget()->clearFocus();
9548
9549     QTLWExtra *oldTopExtra = window()->d_func()->maybeTopData();
9550     QWidgetBackingStoreTracker *oldBsTracker = oldTopExtra ? &oldTopExtra->backingStoreTracker : 0;
9551
9552     d->setParent_sys(parent, f);
9553
9554     QTLWExtra *topExtra = window()->d_func()->maybeTopData();
9555     QWidgetBackingStoreTracker *bsTracker = topExtra ? &topExtra->backingStoreTracker : 0;
9556     if (oldBsTracker && oldBsTracker != bsTracker)
9557         oldBsTracker->unregisterWidgetSubtree(this);
9558
9559     if (desktopWidget)
9560         parent = 0;
9561
9562     if (QWidgetBackingStore *oldBs = oldtlw->d_func()->maybeBackingStore()) {
9563         if (newParent)
9564             oldBs->removeDirtyWidget(this);
9565         // Move the widget and all its static children from
9566         // the old backing store to the new one.
9567         oldBs->moveStaticWidgets(this);
9568     }
9569
9570     if (QApplicationPrivate::testAttribute(Qt::AA_ImmediateWidgetCreation) && !testAttribute(Qt::WA_WState_Created))
9571         create();
9572
9573     d->reparentFocusWidgets(oldtlw);
9574     setAttribute(Qt::WA_Resized, resized);
9575     if (!testAttribute(Qt::WA_StyleSheet)
9576         && (!parent || !parent->testAttribute(Qt::WA_StyleSheet))) {
9577         d->resolveFont();
9578         d->resolvePalette();
9579     }
9580     d->resolveLayoutDirection();
9581     d->resolveLocale();
9582
9583     // Note: GL widgets under WGL or EGL will always need a ParentChange
9584     // event to handle recreation/rebinding of the GL context, hence the
9585     // (f & Qt::MSWindowsOwnDC) clause (which is set on QGLWidgets on all
9586     // platforms).
9587     if (newParent
9588 #if defined(Q_WS_WIN) || defined(QT_OPENGL_ES)
9589         || (f & Qt::MSWindowsOwnDC)
9590 #endif
9591         ) {
9592         // propagate enabled updates enabled state to non-windows
9593         if (!isWindow()) {
9594             if (!testAttribute(Qt::WA_ForceDisabled))
9595                 d->setEnabled_helper(parent ? parent->isEnabled() : true);
9596             if (!testAttribute(Qt::WA_ForceUpdatesDisabled))
9597                 d->setUpdatesEnabled_helper(parent ? parent->updatesEnabled() : true);
9598         }
9599         d->inheritStyle();
9600
9601         // send and post remaining QObject events
9602         if (parent && d->sendChildEvents) {
9603             QChildEvent e(QEvent::ChildAdded, this);
9604             QApplication::sendEvent(parent, &e);
9605         }
9606
9607 //### already hidden above ---> must probably do something smart on the mac
9608 // #ifdef Q_WS_MAC
9609 //             extern bool qt_mac_is_macdrawer(const QWidget *); //qwidget_mac.cpp
9610 //             if(!qt_mac_is_macdrawer(q)) //special case
9611 //                 q->setAttribute(Qt::WA_WState_Hidden);
9612 // #else
9613 //             q->setAttribute(Qt::WA_WState_Hidden);
9614 //#endif
9615
9616         if (parent && d->sendChildEvents && d->polished) {
9617             QChildEvent e(QEvent::ChildPolished, this);
9618             QCoreApplication::sendEvent(parent, &e);
9619         }
9620
9621         QEvent e(QEvent::ParentChange);
9622         QApplication::sendEvent(this, &e);
9623     }
9624
9625     if (!wasCreated) {
9626         if (isWindow() || parentWidget()->isVisible())
9627             setAttribute(Qt::WA_WState_Hidden, true);
9628         else if (!testAttribute(Qt::WA_WState_ExplicitShowHide))
9629             setAttribute(Qt::WA_WState_Hidden, false);
9630     }
9631
9632     d->updateIsOpaque();
9633
9634 #ifndef QT_NO_GRAPHICSVIEW
9635     // Embed the widget into a proxy if the parent is embedded.
9636     // ### Doesn't handle reparenting out of an embedded widget.
9637     if (oldtlw->graphicsProxyWidget()) {
9638         if (QGraphicsProxyWidget *ancestorProxy = d->nearestGraphicsProxyWidget(oldtlw))
9639             ancestorProxy->d_func()->unembedSubWindow(this);
9640     }
9641     if (isWindow() && parent && !graphicsProxyWidget() && !bypassGraphicsProxyWidget(this)) {
9642         if (QGraphicsProxyWidget *ancestorProxy = d->nearestGraphicsProxyWidget(parent))
9643             ancestorProxy->d_func()->embedSubWindow(this);
9644     }
9645 #endif
9646
9647     d->inSetParent = false;
9648 }
9649
9650 /*!
9651     Scrolls the widget including its children \a dx pixels to the
9652     right and \a dy downward. Both \a dx and \a dy may be negative.
9653
9654     After scrolling, the widgets will receive paint events for
9655     the areas that need to be repainted. For widgets that Qt knows to
9656     be opaque, this is only the newly exposed parts.
9657     For example, if an opaque widget is scrolled 8 pixels to the left,
9658     only an 8-pixel wide stripe at the right edge needs updating.
9659
9660     Since widgets propagate the contents of their parents by default,
9661     you need to set the \l autoFillBackground property, or use
9662     setAttribute() to set the Qt::WA_OpaquePaintEvent attribute, to make
9663     a widget opaque.
9664
9665     For widgets that use contents propagation, a scroll will cause an
9666     update of the entire scroll area.
9667
9668     \sa {Transparency and Double Buffering}
9669 */
9670
9671 void QWidget::scroll(int dx, int dy)
9672 {
9673     if ((!updatesEnabled() && children().size() == 0) || !isVisible())
9674         return;
9675     if (dx == 0 && dy == 0)
9676         return;
9677     Q_D(QWidget);
9678 #ifndef QT_NO_GRAPHICSVIEW
9679     if (QGraphicsProxyWidget *proxy = QWidgetPrivate::nearestGraphicsProxyWidget(this)) {
9680         // Graphics View maintains its own dirty region as a list of rects;
9681         // until we can connect item updates directly to the view, we must
9682         // separately add a translated dirty region.
9683         if (!d->dirty.isEmpty()) {
9684             foreach (const QRect &rect, (d->dirty.translated(dx, dy)).rects())
9685                 proxy->update(rect);
9686         }
9687         proxy->scroll(dx, dy, proxy->subWidgetRect(this));
9688         return;
9689     }
9690 #endif
9691     d->setDirtyOpaqueRegion();
9692     d->scroll_sys(dx, dy);
9693 }
9694
9695 /*!
9696     \overload
9697
9698     This version only scrolls \a r and does not move the children of
9699     the widget.
9700
9701     If \a r is empty or invalid, the result is undefined.
9702
9703     \sa QScrollArea
9704 */
9705 void QWidget::scroll(int dx, int dy, const QRect &r)
9706 {
9707
9708     if ((!updatesEnabled() && children().size() == 0) || !isVisible())
9709         return;
9710     if (dx == 0 && dy == 0)
9711         return;
9712     Q_D(QWidget);
9713 #ifndef QT_NO_GRAPHICSVIEW
9714     if (QGraphicsProxyWidget *proxy = QWidgetPrivate::nearestGraphicsProxyWidget(this)) {
9715         // Graphics View maintains its own dirty region as a list of rects;
9716         // until we can connect item updates directly to the view, we must
9717         // separately add a translated dirty region.
9718         if (!d->dirty.isEmpty()) {
9719             foreach (const QRect &rect, (d->dirty.translated(dx, dy) & r).rects())
9720                 proxy->update(rect);
9721         }
9722         proxy->scroll(dx, dy, r.translated(proxy->subWidgetRect(this).topLeft().toPoint()));
9723         return;
9724     }
9725 #endif
9726     d->scroll_sys(dx, dy, r);
9727 }
9728
9729 /*!
9730     Repaints the widget directly by calling paintEvent() immediately,
9731     unless updates are disabled or the widget is hidden.
9732
9733     We suggest only using repaint() if you need an immediate repaint,
9734     for example during animation. In almost all circumstances update()
9735     is better, as it permits Qt to optimize for speed and minimize
9736     flicker.
9737
9738     \warning If you call repaint() in a function which may itself be
9739     called from paintEvent(), you may get infinite recursion. The
9740     update() function never causes recursion.
9741
9742     \sa update(), paintEvent(), setUpdatesEnabled()
9743 */
9744
9745 void QWidget::repaint()
9746 {
9747     repaint(rect());
9748 }
9749
9750 /*! \overload
9751
9752     This version repaints a rectangle (\a x, \a y, \a w, \a h) inside
9753     the widget.
9754
9755     If \a w is negative, it is replaced with \c{width() - x}, and if
9756     \a h is negative, it is replaced width \c{height() - y}.
9757 */
9758 void QWidget::repaint(int x, int y, int w, int h)
9759 {
9760     if (x > data->crect.width() || y > data->crect.height())
9761         return;
9762
9763     if (w < 0)
9764         w = data->crect.width()  - x;
9765     if (h < 0)
9766         h = data->crect.height() - y;
9767
9768     repaint(QRect(x, y, w, h));
9769 }
9770
9771 /*! \overload
9772
9773     This version repaints a rectangle \a rect inside the widget.
9774 */
9775 void QWidget::repaint(const QRect &rect)
9776 {
9777     Q_D(QWidget);
9778
9779     if (testAttribute(Qt::WA_WState_ConfigPending)) {
9780         update(rect);
9781         return;
9782     }
9783
9784     if (!isVisible() || !updatesEnabled() || rect.isEmpty())
9785         return;
9786
9787     if (hasBackingStoreSupport()) {
9788 #ifdef Q_WS_MAC
9789         if (qt_widget_private(this)->isInUnifiedToolbar) {
9790             qt_widget_private(this)->unifiedSurface->renderToolbar(this, true);
9791             return;
9792         }
9793 #endif // Q_WS_MAC
9794         QTLWExtra *tlwExtra = window()->d_func()->maybeTopData();
9795         if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore) {
9796             tlwExtra->inRepaint = true;
9797             tlwExtra->backingStoreTracker->markDirty(rect, this, true);
9798             tlwExtra->inRepaint = false;
9799         }
9800     } else {
9801         d->repaint_sys(rect);
9802     }
9803 }
9804
9805 /*!
9806     \overload
9807
9808     This version repaints a region \a rgn inside the widget.
9809 */
9810 void QWidget::repaint(const QRegion &rgn)
9811 {
9812     Q_D(QWidget);
9813
9814     if (testAttribute(Qt::WA_WState_ConfigPending)) {
9815         update(rgn);
9816         return;
9817     }
9818
9819     if (!isVisible() || !updatesEnabled() || rgn.isEmpty())
9820         return;
9821
9822     if (hasBackingStoreSupport()) {
9823 #ifdef Q_WS_MAC
9824         if (qt_widget_private(this)->isInUnifiedToolbar) {
9825             qt_widget_private(this)->unifiedSurface->renderToolbar(this, true);
9826             return;
9827         }
9828 #endif // Q_WS_MAC
9829         QTLWExtra *tlwExtra = window()->d_func()->maybeTopData();
9830         if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore) {
9831             tlwExtra->inRepaint = true;
9832             tlwExtra->backingStoreTracker->markDirty(rgn, this, true);
9833             tlwExtra->inRepaint = false;
9834         }
9835     } else {
9836         d->repaint_sys(rgn);
9837     }
9838 }
9839
9840 /*!
9841     Updates the widget unless updates are disabled or the widget is
9842     hidden.
9843
9844     This function does not cause an immediate repaint; instead it
9845     schedules a paint event for processing when Qt returns to the main
9846     event loop. This permits Qt to optimize for more speed and less
9847     flicker than a call to repaint() does.
9848
9849     Calling update() several times normally results in just one
9850     paintEvent() call.
9851
9852     Qt normally erases the widget's area before the paintEvent() call.
9853     If the Qt::WA_OpaquePaintEvent widget attribute is set, the widget is
9854     responsible for painting all its pixels with an opaque color.
9855
9856     \sa repaint() paintEvent(), setUpdatesEnabled(), {Analog Clock Example}
9857 */
9858 void QWidget::update()
9859 {
9860     update(rect());
9861 }
9862
9863 /*! \fn void QWidget::update(int x, int y, int w, int h)
9864     \overload
9865
9866     This version updates a rectangle (\a x, \a y, \a w, \a h) inside
9867     the widget.
9868 */
9869
9870 /*!
9871     \overload
9872
9873     This version updates a rectangle \a rect inside the widget.
9874 */
9875 void QWidget::update(const QRect &rect)
9876 {
9877     if (!isVisible() || !updatesEnabled() || rect.isEmpty())
9878         return;
9879
9880     if (testAttribute(Qt::WA_WState_InPaintEvent)) {
9881         QApplication::postEvent(this, new QUpdateLaterEvent(rect));
9882         return;
9883     }
9884
9885     if (hasBackingStoreSupport()) {
9886 #ifdef Q_WS_MAC
9887         if (qt_widget_private(this)->isInUnifiedToolbar) {
9888             qt_widget_private(this)->unifiedSurface->renderToolbar(this, true);
9889             return;
9890         }
9891 #endif // Q_WS_MAC
9892         QTLWExtra *tlwExtra = window()->d_func()->maybeTopData();
9893         if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore)
9894             tlwExtra->backingStoreTracker->markDirty(rect, this);
9895     } else {
9896         d_func()->repaint_sys(rect);
9897     }
9898 }
9899
9900 /*!
9901     \overload
9902
9903     This version repaints a region \a rgn inside the widget.
9904 */
9905 void QWidget::update(const QRegion &rgn)
9906 {
9907     if (!isVisible() || !updatesEnabled() || rgn.isEmpty())
9908         return;
9909
9910     if (testAttribute(Qt::WA_WState_InPaintEvent)) {
9911         QApplication::postEvent(this, new QUpdateLaterEvent(rgn));
9912         return;
9913     }
9914
9915     if (hasBackingStoreSupport()) {
9916 #ifdef Q_WS_MAC
9917         if (qt_widget_private(this)->isInUnifiedToolbar) {
9918             qt_widget_private(this)->unifiedSurface->renderToolbar(this, true);
9919             return;
9920         }
9921 #endif // Q_WS_MAC
9922         QTLWExtra *tlwExtra = window()->d_func()->maybeTopData();
9923         if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore)
9924             tlwExtra->backingStoreTracker->markDirty(rgn, this);
9925     } else {
9926         d_func()->repaint_sys(rgn);
9927     }
9928 }
9929
9930
9931  /*!
9932   \internal
9933
9934   This just sets the corresponding attribute bit to 1 or 0
9935  */
9936 static void setAttribute_internal(Qt::WidgetAttribute attribute, bool on, QWidgetData *data,
9937                                   QWidgetPrivate *d)
9938 {
9939     if (attribute < int(8*sizeof(uint))) {
9940         if (on)
9941             data->widget_attributes |= (1<<attribute);
9942         else
9943             data->widget_attributes &= ~(1<<attribute);
9944     } else {
9945         const int x = attribute - 8*sizeof(uint);
9946         const int int_off = x / (8*sizeof(uint));
9947         if (on)
9948             d->high_attributes[int_off] |= (1<<(x-(int_off*8*sizeof(uint))));
9949         else
9950             d->high_attributes[int_off] &= ~(1<<(x-(int_off*8*sizeof(uint))));
9951     }
9952 }
9953
9954 /*!
9955     Sets the attribute \a attribute on this widget if \a on is true;
9956     otherwise clears the attribute.
9957
9958     \sa testAttribute()
9959 */
9960 void QWidget::setAttribute(Qt::WidgetAttribute attribute, bool on)
9961 {
9962     if (testAttribute(attribute) == on)
9963         return;
9964
9965     Q_D(QWidget);
9966     Q_ASSERT_X(sizeof(d->high_attributes)*8 >= (Qt::WA_AttributeCount - sizeof(uint)*8),
9967                "QWidget::setAttribute(WidgetAttribute, bool)",
9968                "QWidgetPrivate::high_attributes[] too small to contain all attributes in WidgetAttribute");
9969 #ifdef Q_WS_WIN
9970     // ### Don't use PaintOnScreen+paintEngine() to do native painting in 5.0
9971     if (attribute == Qt::WA_PaintOnScreen && on && !inherits("QGLWidget")) {
9972         // see qwidget_win.cpp, ::paintEngine for details
9973         paintEngine();
9974         if (d->noPaintOnScreen)
9975             return;
9976     }
9977 #endif
9978
9979     setAttribute_internal(attribute, on, data, d);
9980
9981     switch (attribute) {
9982
9983 #ifndef QT_NO_DRAGANDDROP
9984     case Qt::WA_AcceptDrops:  {
9985         if (on && !testAttribute(Qt::WA_DropSiteRegistered))
9986             setAttribute(Qt::WA_DropSiteRegistered, true);
9987         else if (!on && (isWindow() || !parentWidget() || !parentWidget()->testAttribute(Qt::WA_DropSiteRegistered)))
9988             setAttribute(Qt::WA_DropSiteRegistered, false);
9989         QEvent e(QEvent::AcceptDropsChange);
9990         QApplication::sendEvent(this, &e);
9991         break;
9992     }
9993     case Qt::WA_DropSiteRegistered:  {
9994         d->registerDropSite(on);
9995         for (int i = 0; i < d->children.size(); ++i) {
9996             QWidget *w = qobject_cast<QWidget *>(d->children.at(i));
9997             if (w && !w->isWindow() && !w->testAttribute(Qt::WA_AcceptDrops) && w->testAttribute(Qt::WA_DropSiteRegistered) != on)
9998                 w->setAttribute(Qt::WA_DropSiteRegistered, on);
9999         }
10000         break;
10001     }
10002 #endif
10003
10004     case Qt::WA_NoChildEventsForParent:
10005         d->sendChildEvents = !on;
10006         break;
10007     case Qt::WA_NoChildEventsFromChildren:
10008         d->receiveChildEvents = !on;
10009         break;
10010     case Qt::WA_MacBrushedMetal:
10011 #ifdef Q_WS_MAC
10012         d->setStyle_helper(style(), false, true);  // Make sure things get unpolished/polished correctly.
10013         // fall through since changing the metal attribute affects the opaque size grip.
10014     case Qt::WA_MacOpaqueSizeGrip:
10015         d->macUpdateOpaqueSizeGrip();
10016         break;
10017     case Qt::WA_MacShowFocusRect:
10018         if (hasFocus()) {
10019             clearFocus();
10020             setFocus();
10021         }
10022         break;
10023     case Qt::WA_Hover:
10024         qt_mac_update_mouseTracking(this);
10025         break;
10026 #endif
10027     case Qt::WA_MacAlwaysShowToolWindow:
10028 #ifdef Q_WS_MAC
10029         d->macUpdateHideOnSuspend();
10030 #endif
10031         break;
10032     case Qt::WA_MacNormalSize:
10033     case Qt::WA_MacSmallSize:
10034     case Qt::WA_MacMiniSize:
10035 #ifdef Q_WS_MAC
10036         {
10037             // We can only have one of these set at a time
10038             const Qt::WidgetAttribute MacSizes[] = { Qt::WA_MacNormalSize, Qt::WA_MacSmallSize,
10039                                                      Qt::WA_MacMiniSize };
10040             for (int i = 0; i < 3; ++i) {
10041                 if (MacSizes[i] != attribute)
10042                     setAttribute_internal(MacSizes[i], false, data, d);
10043             }
10044             d->macUpdateSizeAttribute();
10045         }
10046 #endif
10047         break;
10048     case Qt::WA_ShowModal:
10049         if (!on) {
10050             if (isVisible())
10051                 QApplicationPrivate::leaveModal(this);
10052             // reset modality type to Modeless when clearing WA_ShowModal
10053             data->window_modality = Qt::NonModal;
10054         } else if (data->window_modality == Qt::NonModal) {
10055             // determine the modality type if it hasn't been set prior
10056             // to setting WA_ShowModal. set the default to WindowModal
10057             // if we are the child of a group leader; otherwise use
10058             // ApplicationModal.
10059             QWidget *w = parentWidget();
10060             if (w)
10061                 w = w->window();
10062             while (w && !w->testAttribute(Qt::WA_GroupLeader)) {
10063                 w = w->parentWidget();
10064                 if (w)
10065                     w = w->window();
10066             }
10067             data->window_modality = (w && w->testAttribute(Qt::WA_GroupLeader))
10068                                     ? Qt::WindowModal
10069                                     : Qt::ApplicationModal;
10070             // Some window managers does not allow us to enter modal after the
10071             // window is showing. Therefore, to be consistent, we cannot call
10072             // QApplicationPrivate::enterModal(this) here. The window must be
10073             // hidden before changing modality.
10074         }
10075         if (testAttribute(Qt::WA_WState_Created)) {
10076             // don't call setModal_sys() before create_sys()
10077             d->setModal_sys();
10078         }
10079         break;
10080     case Qt::WA_MouseTracking: {
10081         QEvent e(QEvent::MouseTrackingChange);
10082         QApplication::sendEvent(this, &e);
10083         break; }
10084     case Qt::WA_NativeWindow: {
10085         d->createTLExtra();
10086 #ifndef QT_NO_IM
10087         QWidget *focusWidget = d->effectiveFocusWidget();
10088         if (on && !internalWinId() && hasFocus()
10089             && focusWidget->testAttribute(Qt::WA_InputMethodEnabled)) {
10090             qApp->inputMethod()->reset();
10091             qApp->inputMethod()->update(Qt::ImEnabled);
10092         }
10093         if (!qApp->testAttribute(Qt::AA_DontCreateNativeWidgetSiblings) && parentWidget()
10094 #ifdef Q_WS_MAC
10095             // On Mac, toolbars inside the unified title bar will never overlap with
10096             // siblings in the content view. So we skip enforce native siblings in that case
10097             && !d->isInUnifiedToolbar && parentWidget()->isWindow()
10098 #endif // Q_WS_MAC
10099         )
10100             parentWidget()->d_func()->enforceNativeChildren();
10101         if (on && !internalWinId() && testAttribute(Qt::WA_WState_Created))
10102             d->createWinId();
10103         if (isEnabled() && focusWidget->isEnabled()
10104             && focusWidget->testAttribute(Qt::WA_InputMethodEnabled)) {
10105             qApp->inputMethod()->update(Qt::ImEnabled);
10106         }
10107 #endif //QT_NO_IM
10108         break;
10109     }
10110     case Qt::WA_PaintOnScreen:
10111         d->updateIsOpaque();
10112 #if defined(Q_WS_WIN) || defined(Q_WS_X11) || defined(Q_WS_MAC)
10113         // Recreate the widget if it's already created as an alien widget and
10114         // WA_PaintOnScreen is enabled. Paint on screen widgets must have win id.
10115         // So must their children.
10116         if (on) {
10117             setAttribute(Qt::WA_NativeWindow);
10118             d->enforceNativeChildren();
10119         }
10120 #endif
10121         // fall through
10122     case Qt::WA_OpaquePaintEvent:
10123         d->updateIsOpaque();
10124         break;
10125     case Qt::WA_NoSystemBackground:
10126         d->updateIsOpaque();
10127         // fall through...
10128     case Qt::WA_UpdatesDisabled:
10129         d->updateSystemBackground();
10130         break;
10131     case Qt::WA_TransparentForMouseEvents:
10132 #ifdef Q_WS_MAC
10133         d->macUpdateIgnoreMouseEvents();
10134 #endif
10135         break;
10136     case Qt::WA_InputMethodEnabled: {
10137 #ifndef QT_NO_IM
10138         if (qApp->focusObject() == this) {
10139             if (!on)
10140                 qApp->inputMethod()->reset();
10141             qApp->inputMethod()->update(Qt::ImEnabled);
10142         }
10143 #endif //QT_NO_IM
10144         break;
10145     }
10146     case Qt::WA_WindowPropagation:
10147         d->resolvePalette();
10148         d->resolveFont();
10149         d->resolveLocale();
10150         break;
10151 #ifdef Q_WS_X11
10152     case Qt::WA_NoX11EventCompression:
10153         if (!d->extra)
10154             d->createExtra();
10155         d->extra->compress_events = on;
10156         break;
10157     case Qt::WA_X11OpenGLOverlay:
10158         d->updateIsOpaque();
10159         break;
10160     case Qt::WA_X11DoNotAcceptFocus:
10161         if (testAttribute(Qt::WA_WState_Created))
10162             d->updateX11AcceptFocus();
10163         break;
10164 #endif
10165     case Qt::WA_DontShowOnScreen: {
10166         if (on && isVisible()) {
10167             // Make sure we keep the current state and only hide the widget
10168             // from the desktop. show_sys will only update platform specific
10169             // attributes at this point.
10170             d->hide_sys();
10171             d->show_sys();
10172         }
10173         break;
10174     }
10175
10176 #ifdef Q_WS_X11
10177     case Qt::WA_X11NetWmWindowTypeDesktop:
10178     case Qt::WA_X11NetWmWindowTypeDock:
10179     case Qt::WA_X11NetWmWindowTypeToolBar:
10180     case Qt::WA_X11NetWmWindowTypeMenu:
10181     case Qt::WA_X11NetWmWindowTypeUtility:
10182     case Qt::WA_X11NetWmWindowTypeSplash:
10183     case Qt::WA_X11NetWmWindowTypeDialog:
10184     case Qt::WA_X11NetWmWindowTypeDropDownMenu:
10185     case Qt::WA_X11NetWmWindowTypePopupMenu:
10186     case Qt::WA_X11NetWmWindowTypeToolTip:
10187     case Qt::WA_X11NetWmWindowTypeNotification:
10188     case Qt::WA_X11NetWmWindowTypeCombo:
10189     case Qt::WA_X11NetWmWindowTypeDND:
10190         if (testAttribute(Qt::WA_WState_Created))
10191             d->setNetWmWindowTypes();
10192         break;
10193 #endif
10194
10195     case Qt::WA_StaticContents:
10196         if (QWidgetBackingStore *bs = d->maybeBackingStore()) {
10197             if (on)
10198                 bs->addStaticWidget(this);
10199             else
10200                 bs->removeStaticWidget(this);
10201         }
10202         break;
10203     case Qt::WA_TranslucentBackground:
10204         if (on) {
10205             setAttribute(Qt::WA_NoSystemBackground);
10206             d->updateIsTranslucent();
10207         }
10208
10209         break;
10210     case Qt::WA_AcceptTouchEvents:
10211 #if defined(Q_WS_WIN) || defined(Q_WS_MAC)
10212         if (on)
10213             d->registerTouchWindow();
10214 #endif
10215         break;
10216     default:
10217         break;
10218     }
10219 }
10220
10221 /*! \fn bool QWidget::testAttribute(Qt::WidgetAttribute attribute) const
10222
10223   Returns true if attribute \a attribute is set on this widget;
10224   otherwise returns false.
10225
10226   \sa setAttribute()
10227  */
10228 bool QWidget::testAttribute_helper(Qt::WidgetAttribute attribute) const
10229 {
10230     Q_D(const QWidget);
10231     const int x = attribute - 8*sizeof(uint);
10232     const int int_off = x / (8*sizeof(uint));
10233     return (d->high_attributes[int_off] & (1<<(x-(int_off*8*sizeof(uint)))));
10234 }
10235
10236 /*!
10237   \property QWidget::windowOpacity
10238
10239   \brief The level of opacity for the window.
10240
10241   The valid range of opacity is from 1.0 (completely opaque) to
10242   0.0 (completely transparent).
10243
10244   By default the value of this property is 1.0.
10245
10246   This feature is available on Embedded Linux, Mac OS X, Windows,
10247   and X11 platforms that support the Composite extension.
10248
10249   This feature is not available on Windows CE.
10250
10251   Note that under X11 you need to have a composite manager running,
10252   and the X11 specific _NET_WM_WINDOW_OPACITY atom needs to be
10253   supported by the window manager you are using.
10254
10255   \warning Changing this property from opaque to transparent might issue a
10256   paint event that needs to be processed before the window is displayed
10257   correctly. This affects mainly the use of QPixmap::grabWindow(). Also note
10258   that semi-transparent windows update and resize significantly slower than
10259   opaque windows.
10260
10261   \sa setMask()
10262 */
10263 qreal QWidget::windowOpacity() const
10264 {
10265     Q_D(const QWidget);
10266     return (isWindow() && d->maybeTopData()) ? d->maybeTopData()->opacity / 255. : 1.0;
10267 }
10268
10269 void QWidget::setWindowOpacity(qreal opacity)
10270 {
10271     Q_D(QWidget);
10272     if (!isWindow())
10273         return;
10274
10275     opacity = qBound(qreal(0.0), opacity, qreal(1.0));
10276     QTLWExtra *extra = d->topData();
10277     extra->opacity = uint(opacity * 255);
10278     setAttribute(Qt::WA_WState_WindowOpacitySet);
10279
10280     if (!testAttribute(Qt::WA_WState_Created))
10281         return;
10282
10283 #ifndef QT_NO_GRAPHICSVIEW
10284     if (QGraphicsProxyWidget *proxy = graphicsProxyWidget()) {
10285         // Avoid invalidating the cache if set.
10286         if (proxy->cacheMode() == QGraphicsItem::NoCache)
10287             proxy->update();
10288         else if (QGraphicsScene *scene = proxy->scene())
10289             scene->update(proxy->sceneBoundingRect());
10290         return;
10291     }
10292 #endif
10293
10294     d->setWindowOpacity_sys(opacity);
10295 }
10296
10297 /*!
10298     \property QWidget::windowModified
10299     \brief whether the document shown in the window has unsaved changes
10300
10301     A modified window is a window whose content has changed but has
10302     not been saved to disk. This flag will have different effects
10303     varied by the platform. On Mac OS X the close button will have a
10304     modified look; on other platforms, the window title will have an
10305     '*' (asterisk).
10306
10307     The window title must contain a "[*]" placeholder, which
10308     indicates where the '*' should appear. Normally, it should appear
10309     right after the file name (e.g., "document1.txt[*] - Text
10310     Editor"). If the window isn't modified, the placeholder is simply
10311     removed.
10312
10313     Note that if a widget is set as modified, all its ancestors will
10314     also be set as modified. However, if you call \c
10315     {setWindowModified(false)} on a widget, this will not propagate to
10316     its parent because other children of the parent might have been
10317     modified.
10318
10319     \sa windowTitle, {Application Example}, {SDI Example}, {MDI Example}
10320 */
10321 bool QWidget::isWindowModified() const
10322 {
10323     return testAttribute(Qt::WA_WindowModified);
10324 }
10325
10326 void QWidget::setWindowModified(bool mod)
10327 {
10328     Q_D(QWidget);
10329     setAttribute(Qt::WA_WindowModified, mod);
10330
10331 #ifndef Q_WS_MAC
10332     if (!windowTitle().contains(QLatin1String("[*]")) && mod)
10333         qWarning("QWidget::setWindowModified: The window title does not contain a '[*]' placeholder");
10334 #endif
10335     d->setWindowTitle_helper(windowTitle());
10336     d->setWindowIconText_helper(windowIconText());
10337 #ifdef Q_WS_MAC
10338     d->setWindowModified_sys(mod);
10339 #endif
10340
10341     QEvent e(QEvent::ModifiedChange);
10342     QApplication::sendEvent(this, &e);
10343 }
10344
10345 #ifndef QT_NO_TOOLTIP
10346 /*!
10347   \property QWidget::toolTip
10348
10349   \brief the widget's tooltip
10350
10351   Note that by default tooltips are only shown for widgets that are
10352   children of the active window. You can change this behavior by
10353   setting the attribute Qt::WA_AlwaysShowToolTips on the \e window,
10354   not on the widget with the tooltip.
10355
10356   If you want to control a tooltip's behavior, you can intercept the
10357   event() function and catch the QEvent::ToolTip event (e.g., if you
10358   want to customize the area for which the tooltip should be shown).
10359
10360   By default, this property contains an empty string.
10361
10362   \sa QToolTip statusTip whatsThis
10363 */
10364 void QWidget::setToolTip(const QString &s)
10365 {
10366     Q_D(QWidget);
10367     d->toolTip = s;
10368
10369     QEvent event(QEvent::ToolTipChange);
10370     QApplication::sendEvent(this, &event);
10371 }
10372
10373 QString QWidget::toolTip() const
10374 {
10375     Q_D(const QWidget);
10376     return d->toolTip;
10377 }
10378 #endif // QT_NO_TOOLTIP
10379
10380
10381 #ifndef QT_NO_STATUSTIP
10382 /*!
10383   \property QWidget::statusTip
10384   \brief the widget's status tip
10385
10386   By default, this property contains an empty string.
10387
10388   \sa toolTip whatsThis
10389 */
10390 void QWidget::setStatusTip(const QString &s)
10391 {
10392     Q_D(QWidget);
10393     d->statusTip = s;
10394 }
10395
10396 QString QWidget::statusTip() const
10397 {
10398     Q_D(const QWidget);
10399     return d->statusTip;
10400 }
10401 #endif // QT_NO_STATUSTIP
10402
10403 #ifndef QT_NO_WHATSTHIS
10404 /*!
10405   \property QWidget::whatsThis
10406
10407   \brief the widget's What's This help text.
10408
10409   By default, this property contains an empty string.
10410
10411   \sa QWhatsThis QWidget::toolTip QWidget::statusTip
10412 */
10413 void QWidget::setWhatsThis(const QString &s)
10414 {
10415     Q_D(QWidget);
10416     d->whatsThis = s;
10417 }
10418
10419 QString QWidget::whatsThis() const
10420 {
10421     Q_D(const QWidget);
10422     return d->whatsThis;
10423 }
10424 #endif // QT_NO_WHATSTHIS
10425
10426 #ifndef QT_NO_ACCESSIBILITY
10427 /*!
10428   \property QWidget::accessibleName
10429
10430   \brief the widget's name as seen by assistive technologies
10431
10432   This property is used by accessible clients to identify, find, or announce
10433   the widget for accessible clients.
10434
10435   By default, this property contains an empty string.
10436
10437   \sa QAccessibleInterface::text()
10438 */
10439 void QWidget::setAccessibleName(const QString &name)
10440 {
10441     Q_D(QWidget);
10442     d->accessibleName = name;
10443     QAccessibleEvent event(this, QAccessible::NameChanged);
10444     QAccessible::updateAccessibility(&event);
10445 }
10446
10447 QString QWidget::accessibleName() const
10448 {
10449     Q_D(const QWidget);
10450     return d->accessibleName;
10451 }
10452
10453 /*!
10454   \property QWidget::accessibleDescription
10455
10456   \brief the widget's description as seen by assistive technologies
10457
10458   By default, this property contains an empty string.
10459
10460   \sa QAccessibleInterface::text()
10461 */
10462 void QWidget::setAccessibleDescription(const QString &description)
10463 {
10464     Q_D(QWidget);
10465     d->accessibleDescription = description;
10466     QAccessibleEvent event(this, QAccessible::DescriptionChanged);
10467     QAccessible::updateAccessibility(&event);
10468 }
10469
10470 QString QWidget::accessibleDescription() const
10471 {
10472     Q_D(const QWidget);
10473     return d->accessibleDescription;
10474 }
10475 #endif // QT_NO_ACCESSIBILITY
10476
10477 #ifndef QT_NO_SHORTCUT
10478 /*!
10479     Adds a shortcut to Qt's shortcut system that watches for the given
10480     \a key sequence in the given \a context. If the \a context is
10481     Qt::ApplicationShortcut, the shortcut applies to the application as a
10482     whole. Otherwise, it is either local to this widget, Qt::WidgetShortcut,
10483     or to the window itself, Qt::WindowShortcut.
10484
10485     If the same \a key sequence has been grabbed by several widgets,
10486     when the \a key sequence occurs a QEvent::Shortcut event is sent
10487     to all the widgets to which it applies in a non-deterministic
10488     order, but with the ``ambiguous'' flag set to true.
10489
10490     \warning You should not normally need to use this function;
10491     instead create \l{QAction}s with the shortcut key sequences you
10492     require (if you also want equivalent menu options and toolbar
10493     buttons), or create \l{QShortcut}s if you just need key sequences.
10494     Both QAction and QShortcut handle all the event filtering for you,
10495     and provide signals which are triggered when the user triggers the
10496     key sequence, so are much easier to use than this low-level
10497     function.
10498
10499     \sa releaseShortcut() setShortcutEnabled()
10500 */
10501 int QWidget::grabShortcut(const QKeySequence &key, Qt::ShortcutContext context)
10502 {
10503     Q_ASSERT(qApp);
10504     if (key.isEmpty())
10505         return 0;
10506     setAttribute(Qt::WA_GrabbedShortcut);
10507     return qApp->d_func()->shortcutMap.addShortcut(this, key, context, qWidgetShortcutContextMatcher);
10508 }
10509
10510 /*!
10511     Removes the shortcut with the given \a id from Qt's shortcut
10512     system. The widget will no longer receive QEvent::Shortcut events
10513     for the shortcut's key sequence (unless it has other shortcuts
10514     with the same key sequence).
10515
10516     \warning You should not normally need to use this function since
10517     Qt's shortcut system removes shortcuts automatically when their
10518     parent widget is destroyed. It is best to use QAction or
10519     QShortcut to handle shortcuts, since they are easier to use than
10520     this low-level function. Note also that this is an expensive
10521     operation.
10522
10523     \sa grabShortcut() setShortcutEnabled()
10524 */
10525 void QWidget::releaseShortcut(int id)
10526 {
10527     Q_ASSERT(qApp);
10528     if (id)
10529         qApp->d_func()->shortcutMap.removeShortcut(id, this, 0);
10530 }
10531
10532 /*!
10533     If \a enable is true, the shortcut with the given \a id is
10534     enabled; otherwise the shortcut is disabled.
10535
10536     \warning You should not normally need to use this function since
10537     Qt's shortcut system enables/disables shortcuts automatically as
10538     widgets become hidden/visible and gain or lose focus. It is best
10539     to use QAction or QShortcut to handle shortcuts, since they are
10540     easier to use than this low-level function.
10541
10542     \sa grabShortcut() releaseShortcut()
10543 */
10544 void QWidget::setShortcutEnabled(int id, bool enable)
10545 {
10546     Q_ASSERT(qApp);
10547     if (id)
10548         qApp->d_func()->shortcutMap.setShortcutEnabled(enable, id, this, 0);
10549 }
10550
10551 /*!
10552     \since 4.2
10553
10554     If \a enable is true, auto repeat of the shortcut with the
10555     given \a id is enabled; otherwise it is disabled.
10556
10557     \sa grabShortcut() releaseShortcut()
10558 */
10559 void QWidget::setShortcutAutoRepeat(int id, bool enable)
10560 {
10561     Q_ASSERT(qApp);
10562     if (id)
10563         qApp->d_func()->shortcutMap.setShortcutAutoRepeat(enable, id, this, 0);
10564 }
10565 #endif // QT_NO_SHORTCUT
10566
10567 /*!
10568     Updates the widget's micro focus.
10569 */
10570 void QWidget::updateMicroFocus()
10571 {
10572     // updating everything since this is currently called for any kind of state change
10573     qApp->inputMethod()->update(Qt::ImQueryAll);
10574 }
10575
10576 /*!
10577     Raises this widget to the top of the parent widget's stack.
10578
10579     After this call the widget will be visually in front of any
10580     overlapping sibling widgets.
10581
10582     \note When using activateWindow(), you can call this function to
10583     ensure that the window is stacked on top.
10584
10585     \sa lower(), stackUnder()
10586 */
10587
10588 void QWidget::raise()
10589 {
10590     Q_D(QWidget);
10591     if (!isWindow()) {
10592         QWidget *p = parentWidget();
10593         const int parentChildCount = p->d_func()->children.size();
10594         if (parentChildCount < 2)
10595             return;
10596         const int from = p->d_func()->children.indexOf(this);
10597         Q_ASSERT(from >= 0);
10598         // Do nothing if the widget is already in correct stacking order _and_ created.
10599         if (from != parentChildCount -1)
10600             p->d_func()->children.move(from, parentChildCount - 1);
10601         if (!testAttribute(Qt::WA_WState_Created) && p->testAttribute(Qt::WA_WState_Created))
10602             create();
10603         else if (from == parentChildCount - 1)
10604             return;
10605
10606         QRegion region(rect());
10607         d->subtractOpaqueSiblings(region);
10608         d->invalidateBuffer(region);
10609     }
10610     if (testAttribute(Qt::WA_WState_Created))
10611         d->raise_sys();
10612
10613     QEvent e(QEvent::ZOrderChange);
10614     QApplication::sendEvent(this, &e);
10615 }
10616
10617 /*!
10618     Lowers the widget to the bottom of the parent widget's stack.
10619
10620     After this call the widget will be visually behind (and therefore
10621     obscured by) any overlapping sibling widgets.
10622
10623     \sa raise(), stackUnder()
10624 */
10625
10626 void QWidget::lower()
10627 {
10628     Q_D(QWidget);
10629     if (!isWindow()) {
10630         QWidget *p = parentWidget();
10631         const int parentChildCount = p->d_func()->children.size();
10632         if (parentChildCount < 2)
10633             return;
10634         const int from = p->d_func()->children.indexOf(this);
10635         Q_ASSERT(from >= 0);
10636         // Do nothing if the widget is already in correct stacking order _and_ created.
10637         if (from != 0)
10638             p->d_func()->children.move(from, 0);
10639         if (!testAttribute(Qt::WA_WState_Created) && p->testAttribute(Qt::WA_WState_Created))
10640             create();
10641         else if (from == 0)
10642             return;
10643     }
10644     if (testAttribute(Qt::WA_WState_Created))
10645         d->lower_sys();
10646
10647     QEvent e(QEvent::ZOrderChange);
10648     QApplication::sendEvent(this, &e);
10649 }
10650
10651
10652 /*!
10653     Places the widget under \a w in the parent widget's stack.
10654
10655     To make this work, the widget itself and \a w must be siblings.
10656
10657     \sa raise(), lower()
10658 */
10659 void QWidget::stackUnder(QWidget* w)
10660 {
10661     Q_D(QWidget);
10662     QWidget *p = parentWidget();
10663     if (!w || isWindow() || p != w->parentWidget() || this == w)
10664         return;
10665     if (p) {
10666         int from = p->d_func()->children.indexOf(this);
10667         int to = p->d_func()->children.indexOf(w);
10668         Q_ASSERT(from >= 0);
10669         Q_ASSERT(to >= 0);
10670         if (from < to)
10671             --to;
10672         // Do nothing if the widget is already in correct stacking order _and_ created.
10673         if (from != to)
10674             p->d_func()->children.move(from, to);
10675         if (!testAttribute(Qt::WA_WState_Created) && p->testAttribute(Qt::WA_WState_Created))
10676             create();
10677         else if (from == to)
10678             return;
10679     }
10680     if (testAttribute(Qt::WA_WState_Created))
10681         d->stackUnder_sys(w);
10682
10683     QEvent e(QEvent::ZOrderChange);
10684     QApplication::sendEvent(this, &e);
10685 }
10686
10687
10688 /*!
10689     \fn bool QWidget::isTopLevel() const
10690     \obsolete
10691
10692     Use isWindow() instead.
10693 */
10694
10695 /*!
10696     \fn bool QWidget::isRightToLeft() const
10697     \internal
10698 */
10699
10700 /*!
10701     \fn bool QWidget::isLeftToRight() const
10702     \internal
10703 */
10704
10705 /*!
10706      \macro QWIDGETSIZE_MAX
10707      \relates QWidget
10708
10709      Defines the maximum size for a QWidget object.
10710
10711      The largest allowed size for a widget is QSize(QWIDGETSIZE_MAX,
10712      QWIDGETSIZE_MAX), i.e. QSize (16777215,16777215).
10713
10714      \sa QWidget::setMaximumSize()
10715 */
10716
10717 /*!
10718     \fn QWidget::setupUi(QWidget *widget)
10719
10720     Sets up the user interface for the specified \a widget.
10721
10722     \note This function is available with widgets that derive from user
10723     interface descriptions created using \l{uic}.
10724
10725     \sa {Using a Designer UI File in Your Application}
10726 */
10727
10728 QRect QWidgetPrivate::frameStrut() const
10729 {
10730     Q_Q(const QWidget);
10731     if (!q->isWindow() || (q->windowType() == Qt::Desktop) || q->testAttribute(Qt::WA_DontShowOnScreen)) {
10732         // x2 = x1 + w - 1, so w/h = 1
10733         return QRect(0, 0, 1, 1);
10734     }
10735
10736     if (data.fstrut_dirty
10737 #ifndef Q_WS_WIN
10738         // ### Fix properly for 4.3
10739         && q->isVisible()
10740 #endif
10741         && q->testAttribute(Qt::WA_WState_Created))
10742         const_cast<QWidgetPrivate *>(this)->updateFrameStrut();
10743
10744     return maybeTopData() ? maybeTopData()->frameStrut : QRect();
10745 }
10746
10747 #ifdef QT_KEYPAD_NAVIGATION
10748 /*!
10749     \internal
10750
10751     Changes the focus  from the current focusWidget to a widget in
10752     the \a direction.
10753
10754     Returns true, if there was a widget in that direction
10755 */
10756 bool QWidgetPrivate::navigateToDirection(Direction direction)
10757 {
10758     QWidget *targetWidget = widgetInNavigationDirection(direction);
10759     if (targetWidget)
10760         targetWidget->setFocus();
10761     return (targetWidget != 0);
10762 }
10763
10764 /*!
10765     \internal
10766
10767     Searches for a widget that is positioned in the \a direction, starting
10768     from the current focusWidget.
10769
10770     Returns the pointer to a found widget or 0, if there was no widget in
10771     that direction.
10772 */
10773 QWidget *QWidgetPrivate::widgetInNavigationDirection(Direction direction)
10774 {
10775     const QWidget *sourceWidget = QApplication::focusWidget();
10776     if (!sourceWidget)
10777         return 0;
10778     const QRect sourceRect = sourceWidget->rect().translated(sourceWidget->mapToGlobal(QPoint()));
10779     const int sourceX =
10780             (direction == DirectionNorth || direction == DirectionSouth) ?
10781                 (sourceRect.left() + (sourceRect.right() - sourceRect.left()) / 2)
10782                 :(direction == DirectionEast ? sourceRect.right() : sourceRect.left());
10783     const int sourceY =
10784             (direction == DirectionEast || direction == DirectionWest) ?
10785                 (sourceRect.top() + (sourceRect.bottom() - sourceRect.top()) / 2)
10786                 :(direction == DirectionSouth ? sourceRect.bottom() : sourceRect.top());
10787     const QPoint sourcePoint(sourceX, sourceY);
10788     const QPoint sourceCenter = sourceRect.center();
10789     const QWidget *sourceWindow = sourceWidget->window();
10790
10791     QWidget *targetWidget = 0;
10792     int shortestDistance = INT_MAX;
10793     foreach(QWidget *targetCandidate, QApplication::allWidgets()) {
10794
10795         const QRect targetCandidateRect = targetCandidate->rect().translated(targetCandidate->mapToGlobal(QPoint()));
10796
10797         // For focus proxies, the child widget handling the focus can have keypad navigation focus,
10798         // but the owner of the proxy cannot.
10799         // Additionally, empty widgets should be ignored.
10800         if (targetCandidate->focusProxy() || targetCandidateRect.isEmpty())
10801             continue;
10802
10803         // Only navigate to a target widget that...
10804         if (       targetCandidate != sourceWidget
10805                    // ...takes the focus,
10806                 && targetCandidate->focusPolicy() & Qt::TabFocus
10807                    // ...is above if DirectionNorth,
10808                 && !(direction == DirectionNorth && targetCandidateRect.bottom() > sourceRect.top())
10809                    // ...is on the right if DirectionEast,
10810                 && !(direction == DirectionEast  && targetCandidateRect.left()   < sourceRect.right())
10811                    // ...is below if DirectionSouth,
10812                 && !(direction == DirectionSouth && targetCandidateRect.top()    < sourceRect.bottom())
10813                    // ...is on the left if DirectionWest,
10814                 && !(direction == DirectionWest  && targetCandidateRect.right()  > sourceRect.left())
10815                    // ...is enabled,
10816                 && targetCandidate->isEnabled()
10817                    // ...is visible,
10818                 && targetCandidate->isVisible()
10819                    // ...is in the same window,
10820                 && targetCandidate->window() == sourceWindow) {
10821             const int targetCandidateDistance = pointToRect(sourcePoint, targetCandidateRect);
10822             if (targetCandidateDistance < shortestDistance) {
10823                 shortestDistance = targetCandidateDistance;
10824                 targetWidget = targetCandidate;
10825             }
10826         }
10827     }
10828     return targetWidget;
10829 }
10830
10831 /*!
10832     \internal
10833
10834     Tells us if it there is currently a reachable widget by keypad navigation in
10835     a certain \a orientation.
10836     If no navigation is possible, occurring key events in that \a orientation may
10837     be used to interact with the value in the focused widget, even though it
10838     currently has not the editFocus.
10839
10840     \sa QWidgetPrivate::widgetInNavigationDirection(), QWidget::hasEditFocus()
10841 */
10842 bool QWidgetPrivate::canKeypadNavigate(Qt::Orientation orientation)
10843 {
10844     return orientation == Qt::Horizontal?
10845             (QWidgetPrivate::widgetInNavigationDirection(QWidgetPrivate::DirectionEast)
10846                     || QWidgetPrivate::widgetInNavigationDirection(QWidgetPrivate::DirectionWest))
10847             :(QWidgetPrivate::widgetInNavigationDirection(QWidgetPrivate::DirectionNorth)
10848                     || QWidgetPrivate::widgetInNavigationDirection(QWidgetPrivate::DirectionSouth));
10849 }
10850 /*!
10851     \internal
10852
10853     Checks, if the \a widget is inside a QTabWidget. If is is inside
10854     one, left/right key events will be used to switch between tabs in keypad
10855     navigation. If there is no QTabWidget, the horizontal key events can be used
10856 to
10857     interact with the value in the focused widget, even though it currently has
10858     not the editFocus.
10859
10860     \sa QWidget::hasEditFocus()
10861 */
10862 bool QWidgetPrivate::inTabWidget(QWidget *widget)
10863 {
10864     for (QWidget *tabWidget = widget; tabWidget; tabWidget = tabWidget->parentWidget())
10865         if (qobject_cast<const QTabWidget*>(tabWidget))
10866             return true;
10867     return false;
10868 }
10869 #endif
10870
10871 /*!
10872     \since 5.0
10873     \internal
10874
10875     Sets the backing store to be the \a store specified.
10876     The QWidget will take ownership of the \a store.
10877 */
10878 void QWidget::setBackingStore(QBackingStore *store)
10879 {
10880     // ### createWinId() ??
10881
10882     if (!isTopLevel())
10883         return;
10884
10885     Q_D(QWidget);
10886
10887     QTLWExtra *topData = d->topData();
10888     if (topData->backingStore == store)
10889         return;
10890
10891     QBackingStore *oldStore = topData->backingStore;
10892     delete topData->backingStore;
10893     topData->backingStore = store;
10894
10895     QWidgetBackingStore *bs = d->maybeBackingStore();
10896     if (!bs)
10897         return;
10898
10899     if (isTopLevel()) {
10900         if (bs->store != oldStore && bs->store != store)
10901             delete bs->store;
10902         bs->store = store;
10903     }
10904 }
10905
10906 /*!
10907     \since 5.0
10908
10909     Returns the QBackingStore this widget will be drawn into.
10910 */
10911 QBackingStore *QWidget::backingStore() const
10912 {
10913     Q_D(const QWidget);
10914     QTLWExtra *extra = d->maybeTopData();
10915     if (extra && extra->backingStore)
10916         return extra->backingStore;
10917
10918     QWidgetBackingStore *bs = d->maybeBackingStore();
10919
10920     return bs ? bs->store : 0;
10921 }
10922
10923 void QWidgetPrivate::getLayoutItemMargins(int *left, int *top, int *right, int *bottom) const
10924 {
10925     if (left)
10926         *left = (int)leftLayoutItemMargin;
10927     if (top)
10928         *top = (int)topLayoutItemMargin;
10929     if (right)
10930         *right = (int)rightLayoutItemMargin;
10931     if (bottom)
10932         *bottom = (int)bottomLayoutItemMargin;
10933 }
10934
10935 void QWidgetPrivate::setLayoutItemMargins(int left, int top, int right, int bottom)
10936 {
10937     if (leftLayoutItemMargin == left
10938         && topLayoutItemMargin == top
10939         && rightLayoutItemMargin == right
10940         && bottomLayoutItemMargin == bottom)
10941         return;
10942
10943     Q_Q(QWidget);
10944     leftLayoutItemMargin = (signed char)left;
10945     topLayoutItemMargin = (signed char)top;
10946     rightLayoutItemMargin = (signed char)right;
10947     bottomLayoutItemMargin = (signed char)bottom;
10948     q->updateGeometry();
10949 }
10950
10951 void QWidgetPrivate::setLayoutItemMargins(QStyle::SubElement element, const QStyleOption *opt)
10952 {
10953     Q_Q(QWidget);
10954     QStyleOption myOpt;
10955     if (!opt) {
10956         myOpt.initFrom(q);
10957         myOpt.rect.setRect(0, 0, 32768, 32768);     // arbitrary
10958         opt = &myOpt;
10959     }
10960
10961     QRect liRect = q->style()->subElementRect(element, opt, q);
10962     if (liRect.isValid()) {
10963         leftLayoutItemMargin = (signed char)(opt->rect.left() - liRect.left());
10964         topLayoutItemMargin = (signed char)(opt->rect.top() - liRect.top());
10965         rightLayoutItemMargin = (signed char)(liRect.right() - opt->rect.right());
10966         bottomLayoutItemMargin = (signed char)(liRect.bottom() - opt->rect.bottom());
10967     } else {
10968         leftLayoutItemMargin = 0;
10969         topLayoutItemMargin = 0;
10970         rightLayoutItemMargin = 0;
10971         bottomLayoutItemMargin = 0;
10972     }
10973 }
10974 // resets the Qt::WA_QuitOnClose attribute to the default value for transient widgets.
10975 void QWidgetPrivate::adjustQuitOnCloseAttribute()
10976 {
10977     Q_Q(QWidget);
10978
10979     if (!q->parentWidget()) {
10980         Qt::WindowType type = q->windowType();
10981         if (type == Qt::Widget || type == Qt::SubWindow)
10982             type = Qt::Window;
10983         if (type != Qt::Widget && type != Qt::Window && type != Qt::Dialog)
10984             q->setAttribute(Qt::WA_QuitOnClose, false);
10985     }
10986 }
10987
10988
10989
10990 Q_WIDGETS_EXPORT QWidgetData *qt_qwidget_data(QWidget *widget)
10991 {
10992     return widget->data;
10993 }
10994
10995 Q_WIDGETS_EXPORT QWidgetPrivate *qt_widget_private(QWidget *widget)
10996 {
10997     return widget->d_func();
10998 }
10999
11000
11001 #ifndef QT_NO_GRAPHICSVIEW
11002 /*!
11003    \since 4.5
11004
11005    Returns the proxy widget for the corresponding embedded widget in a graphics
11006    view; otherwise returns 0.
11007
11008    \sa QGraphicsProxyWidget::createProxyForChildWidget(),
11009        QGraphicsScene::addWidget()
11010  */
11011 QGraphicsProxyWidget *QWidget::graphicsProxyWidget() const
11012 {
11013     Q_D(const QWidget);
11014     if (d->extra) {
11015         return d->extra->proxyWidget;
11016     }
11017     return 0;
11018 }
11019 #endif
11020
11021
11022 /*!
11023     \typedef QWidgetList
11024     \relates QWidget
11025
11026     Synonym for QList<QWidget *>.
11027 */
11028
11029 #ifndef QT_NO_GESTURES
11030 /*!
11031     Subscribes the widget to a given \a gesture with specific \a flags.
11032
11033     \sa ungrabGesture(), QGestureEvent
11034     \since 4.6
11035 */
11036 void QWidget::grabGesture(Qt::GestureType gesture, Qt::GestureFlags flags)
11037 {
11038     Q_D(QWidget);
11039     d->gestureContext.insert(gesture, flags);
11040     (void)QGestureManager::instance(); // create a gesture manager
11041 }
11042
11043 /*!
11044     Unsubscribes the widget from a given \a gesture type
11045
11046     \sa grabGesture(), QGestureEvent
11047     \since 4.6
11048 */
11049 void QWidget::ungrabGesture(Qt::GestureType gesture)
11050 {
11051     Q_D(QWidget);
11052     if (d->gestureContext.remove(gesture)) {
11053         if (QGestureManager *manager = QGestureManager::instance())
11054             manager->cleanupCachedGestures(this, gesture);
11055     }
11056 }
11057 #endif // QT_NO_GESTURES
11058
11059 /*!
11060     \typedef WId
11061     \relates QWidget
11062
11063     Platform dependent window identifier.
11064 */
11065
11066 /*!
11067     \fn void QWidget::destroy(bool destroyWindow, bool destroySubWindows)
11068
11069     Frees up window system resources. Destroys the widget window if \a
11070     destroyWindow is true.
11071
11072     destroy() calls itself recursively for all the child widgets,
11073     passing \a destroySubWindows for the \a destroyWindow parameter.
11074     To have more control over destruction of subwidgets, destroy
11075     subwidgets selectively first.
11076
11077     This function is usually called from the QWidget destructor.
11078 */
11079
11080 /*!
11081     \fn QPaintEngine *QWidget::paintEngine() const
11082
11083     Returns the widget's paint engine.
11084
11085     Note that this function should not be called explicitly by the
11086     user, since it's meant for reimplementation purposes only. The
11087     function is called by Qt internally, and the default
11088     implementation may not always return a valid pointer.
11089 */
11090
11091 /*!
11092     \fn QPoint QWidget::mapToGlobal(const QPoint &pos) const
11093
11094     Translates the widget coordinate \a pos to global screen
11095     coordinates. For example, \c{mapToGlobal(QPoint(0,0))} would give
11096     the global coordinates of the top-left pixel of the widget.
11097
11098     \sa mapFromGlobal() mapTo() mapToParent()
11099 */
11100
11101 /*!
11102     \fn QPoint QWidget::mapFromGlobal(const QPoint &pos) const
11103
11104     Translates the global screen coordinate \a pos to widget
11105     coordinates.
11106
11107     \sa mapToGlobal() mapFrom() mapFromParent()
11108 */
11109
11110 /*!
11111     \fn void QWidget::grabMouse()
11112
11113     Grabs the mouse input.
11114
11115     This widget receives all mouse events until releaseMouse() is
11116     called; other widgets get no mouse events at all. Keyboard
11117     events are not affected. Use grabKeyboard() if you want to grab
11118     that.
11119
11120     \warning Bugs in mouse-grabbing applications very often lock the
11121     terminal. Use this function with extreme caution, and consider
11122     using the \c -nograb command line option while debugging.
11123
11124     It is almost never necessary to grab the mouse when using Qt, as
11125     Qt grabs and releases it sensibly. In particular, Qt grabs the
11126     mouse when a mouse button is pressed and keeps it until the last
11127     button is released.
11128
11129     \note Only visible widgets can grab mouse input. If isVisible()
11130     returns false for a widget, that widget cannot call grabMouse().
11131
11132     \note \b{(Mac OS X developers)} For \e Cocoa, calling
11133     grabMouse() on a widget only works when the mouse is inside the
11134     frame of that widget.  For \e Carbon, it works outside the widget's
11135     frame as well, like for Windows and X11.
11136
11137     \sa releaseMouse() grabKeyboard() releaseKeyboard()
11138 */
11139
11140 /*!
11141     \fn void QWidget::grabMouse(const QCursor &cursor)
11142     \overload grabMouse()
11143
11144     Grabs the mouse input and changes the cursor shape.
11145
11146     The cursor will assume shape \a cursor (for as long as the mouse
11147     focus is grabbed) and this widget will be the only one to receive
11148     mouse events until releaseMouse() is called().
11149
11150     \warning Grabbing the mouse might lock the terminal.
11151
11152     \note \b{(Mac OS X developers)} See the note in QWidget::grabMouse().
11153
11154     \sa releaseMouse(), grabKeyboard(), releaseKeyboard(), setCursor()
11155 */
11156
11157 /*!
11158     \fn void QWidget::releaseMouse()
11159
11160     Releases the mouse grab.
11161
11162     \sa grabMouse(), grabKeyboard(), releaseKeyboard()
11163 */
11164
11165 /*!
11166     \fn void QWidget::grabKeyboard()
11167
11168     Grabs the keyboard input.
11169
11170     This widget receives all keyboard events until releaseKeyboard()
11171     is called; other widgets get no keyboard events at all. Mouse
11172     events are not affected. Use grabMouse() if you want to grab that.
11173
11174     The focus widget is not affected, except that it doesn't receive
11175     any keyboard events. setFocus() moves the focus as usual, but the
11176     new focus widget receives keyboard events only after
11177     releaseKeyboard() is called.
11178
11179     If a different widget is currently grabbing keyboard input, that
11180     widget's grab is released first.
11181
11182     \sa releaseKeyboard() grabMouse() releaseMouse() focusWidget()
11183 */
11184
11185 /*!
11186     \fn void QWidget::releaseKeyboard()
11187
11188     Releases the keyboard grab.
11189
11190     \sa grabKeyboard(), grabMouse(), releaseMouse()
11191 */
11192
11193 /*!
11194     \fn QWidget *QWidget::mouseGrabber()
11195
11196     Returns the widget that is currently grabbing the mouse input.
11197
11198     If no widget in this application is currently grabbing the mouse,
11199     0 is returned.
11200
11201     \sa grabMouse(), keyboardGrabber()
11202 */
11203
11204 /*!
11205     \fn QWidget *QWidget::keyboardGrabber()
11206
11207     Returns the widget that is currently grabbing the keyboard input.
11208
11209     If no widget in this application is currently grabbing the
11210     keyboard, 0 is returned.
11211
11212     \sa grabMouse(), mouseGrabber()
11213 */
11214
11215 /*!
11216     \fn void QWidget::activateWindow()
11217
11218     Sets the top-level widget containing this widget to be the active
11219     window.
11220
11221     An active window is a visible top-level window that has the
11222     keyboard input focus.
11223
11224     This function performs the same operation as clicking the mouse on
11225     the title bar of a top-level window. On X11, the result depends on
11226     the Window Manager. If you want to ensure that the window is
11227     stacked on top as well you should also call raise(). Note that the
11228     window must be visible, otherwise activateWindow() has no effect.
11229
11230     On Windows, if you are calling this when the application is not
11231     currently the active one then it will not make it the active
11232     window.  It will change the color of the taskbar entry to indicate
11233     that the window has changed in some way. This is because Microsoft
11234     does not allow an application to interrupt what the user is currently
11235     doing in another application.
11236
11237     \sa isActiveWindow(), window(), show()
11238 */
11239
11240 /*!
11241     \fn int QWidget::metric(PaintDeviceMetric m) const
11242
11243     Internal implementation of the virtual QPaintDevice::metric()
11244     function.
11245
11246     \a m is the metric to get.
11247 */
11248
11249 void QWidget::init(QPainter *painter) const
11250 {
11251     const QPalette &pal = palette();
11252     painter->d_func()->state->pen = QPen(pal.brush(foregroundRole()), 0);
11253     painter->d_func()->state->bgBrush = pal.brush(backgroundRole());
11254     QFont f(font(), const_cast<QWidget *>(this));
11255     painter->d_func()->state->deviceFont = f;
11256     painter->d_func()->state->font = f;
11257 }
11258
11259 QPaintDevice *QWidget::redirected(QPoint *offset) const
11260 {
11261     return d_func()->redirected(offset);
11262 }
11263
11264 QPainter *QWidget::sharedPainter() const
11265 {
11266     // Someone sent a paint event directly to the widget
11267     if (!d_func()->redirectDev)
11268         return 0;
11269
11270     QPainter *sp = d_func()->sharedPainter();
11271     if (!sp || !sp->isActive())
11272         return 0;
11273
11274     if (sp->paintEngine()->paintDevice() != d_func()->redirectDev)
11275         return 0;
11276
11277     return sp;
11278 }
11279
11280 /*!
11281     \fn void QWidget::setMask(const QRegion &region)
11282     \overload
11283
11284     Causes only the parts of the widget which overlap \a region to be
11285     visible. If the region includes pixels outside the rect() of the
11286     widget, window system controls in that area may or may not be
11287     visible, depending on the platform.
11288
11289     Note that this effect can be slow if the region is particularly
11290     complex.
11291
11292     \sa windowOpacity
11293 */
11294 void QWidget::setMask(const QRegion &newMask)
11295 {
11296     Q_D(QWidget);
11297
11298     d->createExtra();
11299     if (newMask == d->extra->mask)
11300         return;
11301
11302 #ifndef QT_NO_BACKINGSTORE
11303     const QRegion oldMask(d->extra->mask);
11304 #endif
11305
11306     d->extra->mask = newMask;
11307     d->extra->hasMask = !newMask.isEmpty();
11308
11309 #ifndef Q_WS_MAC
11310     if (!testAttribute(Qt::WA_WState_Created))
11311         return;
11312 #endif
11313
11314     d->setMask_sys(newMask);
11315
11316 #ifndef QT_NO_BACKINGSTORE
11317     if (!isVisible())
11318         return;
11319
11320     if (!d->extra->hasMask) {
11321         // Mask was cleared; update newly exposed area.
11322         QRegion expose(rect());
11323         expose -= oldMask;
11324         if (!expose.isEmpty()) {
11325             d->setDirtyOpaqueRegion();
11326             update(expose);
11327         }
11328         return;
11329     }
11330
11331     if (!isWindow()) {
11332         // Update newly exposed area on the parent widget.
11333         QRegion parentExpose(rect());
11334         parentExpose -= newMask;
11335         if (!parentExpose.isEmpty()) {
11336             d->setDirtyOpaqueRegion();
11337             parentExpose.translate(data->crect.topLeft());
11338             parentWidget()->update(parentExpose);
11339         }
11340
11341         // Update newly exposed area on this widget
11342         if (!oldMask.isEmpty())
11343             update(newMask - oldMask);
11344     }
11345 #endif
11346 }
11347
11348 /*!
11349     \fn void QWidget::setMask(const QBitmap &bitmap)
11350
11351     Causes only the pixels of the widget for which \a bitmap has a
11352     corresponding 1 bit to be visible. If the region includes pixels
11353     outside the rect() of the widget, window system controls in that
11354     area may or may not be visible, depending on the platform.
11355
11356     Note that this effect can be slow if the region is particularly
11357     complex.
11358
11359     The following code shows how an image with an alpha channel can be
11360     used to generate a mask for a widget:
11361
11362     \snippet doc/src/snippets/widget-mask/main.cpp 0
11363
11364     The label shown by this code is masked using the image it contains,
11365     giving the appearance that an irregularly-shaped image is being drawn
11366     directly onto the screen.
11367
11368     Masked widgets receive mouse events only on their visible
11369     portions.
11370
11371     \sa clearMask(), windowOpacity(), {Shaped Clock Example}
11372 */
11373 void QWidget::setMask(const QBitmap &bitmap)
11374 {
11375     setMask(QRegion(bitmap));
11376 }
11377
11378 /*!
11379     \fn void QWidget::clearMask()
11380
11381     Removes any mask set by setMask().
11382
11383     \sa setMask()
11384 */
11385 void QWidget::clearMask()
11386 {
11387     setMask(QRegion());
11388 }
11389
11390 /*! \fn Qt::HANDLE QWidget::x11PictureHandle() const
11391     Returns the X11 Picture handle of the widget for XRender
11392     support. Use of this function is not portable. This function will
11393     return 0 if XRender support is not compiled into Qt, if the
11394     XRender extension is not supported on the X11 display, or if the
11395     handle could not be created.
11396 */
11397
11398 #ifdef Q_WS_MAC
11399 void QWidgetPrivate::syncUnifiedMode() {
11400     // The whole purpose of this method is to keep the unifiedToolbar in sync.
11401     // That means making sure we either exchange the drawing methods or we let
11402     // the toolbar know that it does not require to draw the baseline.
11403     Q_Q(QWidget);
11404     // This function makes sense only if this is a top level
11405     if(!q->isWindow())
11406         return;
11407     OSWindowRef window = qt_mac_window_for(q);
11408     if(changeMethods) {
11409         // Ok, we are in documentMode.
11410         if(originalDrawMethod)
11411             qt_mac_replaceDrawRect(window, this);
11412     } else {
11413         if(!originalDrawMethod)
11414             qt_mac_replaceDrawRectOriginal(window, this);
11415     }
11416 }
11417
11418 #endif // Q_WS_MAC
11419
11420 QT_END_NAMESPACE
11421
11422 #include "moc_qwidget.cpp"
11423