summaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2017-08-15 16:30:10 +0200
committerLiang Qi <liang.qi@qt.io>2017-08-15 16:31:48 +0200
commit106d3b9bf93325ea93c678270290b2c3dda9b764 (patch)
tree26c56932d60964c83e81d9c33d6f37ebc36d6c56 /src/plugins
parent79f679da9483c12979500dd48bc096d33af9ca6f (diff)
parent8bebded9ab02b8eec67c44bfddf802d6bf9cda3c (diff)
Merge remote-tracking branch 'origin/5.9' into dev
Conflicts: src/plugins/platforms/cocoa/qcocoamenu.h src/plugins/platforms/cocoa/qcocoamenu.mm src/plugins/platforms/cocoa/qcocoawindow.mm src/widgets/styles/qstylehelper_p.h Change-Id: I54247c98dd79d2b3826fc062b8b11048c9c7d9bb
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/platforms/cocoa/qcocoamenu.h4
-rw-r--r--src/plugins/platforms/cocoa/qcocoamenu.mm26
-rw-r--r--src/plugins/platforms/cocoa/qcocoamenubar.mm2
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindow.mm11
-rw-r--r--src/plugins/platformthemes/gtk3/qgtk3theme.cpp17
-rw-r--r--src/plugins/styles/mac/qmacstyle_mac.mm22
-rw-r--r--src/plugins/styles/mac/qmacstyle_mac_p_p.h8
-rw-r--r--src/plugins/styles/windowsvista/qwindowsvistastyle_p_p.h6
-rw-r--r--src/plugins/styles/windowsvista/qwindowsxpstyle.cpp12
9 files changed, 91 insertions, 17 deletions
diff --git a/src/plugins/platforms/cocoa/qcocoamenu.h b/src/plugins/platforms/cocoa/qcocoamenu.h
index 903d41220a..484f185fc0 100644
--- a/src/plugins/platforms/cocoa/qcocoamenu.h
+++ b/src/plugins/platforms/cocoa/qcocoamenu.h
@@ -91,13 +91,17 @@ public:
bool isOpen() const;
void setIsOpen(bool isOpen);
+ void timerEvent(QTimerEvent *e) Q_DECL_OVERRIDE;
+
private:
QCocoaMenuItem *itemOrNull(int index) const;
void insertNative(QCocoaMenuItem *item, QCocoaMenuItem *beforeItem);
+ void scheduleUpdate();
QList<QCocoaMenuItem *> m_menuItems;
NSMenu *m_nativeMenu;
NSMenuItem *m_attachedItem;
+ int m_updateTimer;
bool m_enabled:1;
bool m_parentEnabled:1;
bool m_visible:1;
diff --git a/src/plugins/platforms/cocoa/qcocoamenu.mm b/src/plugins/platforms/cocoa/qcocoamenu.mm
index ada6334cf4..77a531f25d 100644
--- a/src/plugins/platforms/cocoa/qcocoamenu.mm
+++ b/src/plugins/platforms/cocoa/qcocoamenu.mm
@@ -259,6 +259,7 @@ QT_BEGIN_NAMESPACE
QCocoaMenu::QCocoaMenu() :
m_attachedItem(0),
+ m_updateTimer(0),
m_enabled(true),
m_parentEnabled(true),
m_visible(true),
@@ -326,6 +327,13 @@ void QCocoaMenu::insertMenuItem(QPlatformMenuItem *menuItem, QPlatformMenuItem *
}
insertNative(cocoaItem, beforeItem);
+
+ // Empty menus on a menubar are hidden by default. If the menu gets
+ // added to the menubar before it contains any item, we need to sync.
+ if (isVisible() && attachedItem().hidden) {
+ if (auto *mb = qobject_cast<QCocoaMenuBar *>(menuParent()))
+ mb->syncMenu(this);
+ }
}
void QCocoaMenu::insertNative(QCocoaMenuItem *item, QCocoaMenuItem *beforeItem)
@@ -409,6 +417,20 @@ QCocoaMenuItem *QCocoaMenu::itemOrNull(int index) const
return m_menuItems.at(index);
}
+void QCocoaMenu::scheduleUpdate()
+{
+ if (!m_updateTimer)
+ m_updateTimer = startTimer(0);
+}
+
+void QCocoaMenu::timerEvent(QTimerEvent *e)
+{
+ if (e->timerId() == m_updateTimer) {
+ m_updateTimer = 0;
+ [m_nativeMenu update];
+ }
+}
+
void QCocoaMenu::syncMenuItem(QPlatformMenuItem *menuItem)
{
QMacAutoReleasePool pool;
@@ -435,9 +457,9 @@ void QCocoaMenu::syncMenuItem(QPlatformMenuItem *menuItem)
QCocoaMenuItem* beforeItem = itemOrNull(m_menuItems.indexOf(cocoaItem) + 1);
insertNative(cocoaItem, beforeItem);
} else {
- // Force NSMenuValidation to kick in. This is needed e.g.
+ // Schedule NSMenuValidation to kick in. This is needed e.g.
// when an item's enabled state changes after menuWillOpen:
- [m_nativeMenu update];
+ scheduleUpdate();
}
}
diff --git a/src/plugins/platforms/cocoa/qcocoamenubar.mm b/src/plugins/platforms/cocoa/qcocoamenubar.mm
index 4cdf004dd1..70fcb40774 100644
--- a/src/plugins/platforms/cocoa/qcocoamenubar.mm
+++ b/src/plugins/platforms/cocoa/qcocoamenubar.mm
@@ -370,7 +370,7 @@ void QCocoaMenuBar::updateMenuBarImmediately()
QCocoaMenuLoader *loader = [QCocoaMenuLoader sharedMenuLoader];
[loader ensureAppMenuInMenu:mb->nsMenu()];
- NSMutableSet *mergedItems = [[NSMutableSet setWithCapacity:0] retain];
+ NSMutableSet *mergedItems = [[NSMutableSet setWithCapacity:mb->merged().count()] retain];
foreach (QCocoaMenuItem *m, mb->merged()) {
[mergedItems addObject:m->nsItem()];
m->syncMerged();
diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm
index 7a19303f5d..6cdabf606b 100644
--- a/src/plugins/platforms/cocoa/qcocoawindow.mm
+++ b/src/plugins/platforms/cocoa/qcocoawindow.mm
@@ -588,7 +588,16 @@ void QCocoaWindow::setWindowFlags(Qt::WindowFlags flags)
}
setWindowZoomButton(flags);
- m_view.window.ignoresMouseEvents = flags & Qt::WindowTransparentForInput;
+ // Make window ignore mouse events if WindowTransparentForInput is set.
+ // Note that ignoresMouseEvents has a special initial state where events
+ // are ignored (passed through) based on window transparency, and that
+ // setting the property to false does not return us to that state. Instead,
+ // this makes the window capture all mouse events. Take care to only
+ // set the property if needed. FIXME: recreate window if needed or find
+ // some other way to implement WindowTransparentForInput.
+ bool ignoreMouse = flags & Qt::WindowTransparentForInput;
+ if (m_view.window.ignoresMouseEvents != ignoreMouse)
+ m_view.window.ignoresMouseEvents = ignoreMouse;
}
m_windowFlags = flags;
diff --git a/src/plugins/platformthemes/gtk3/qgtk3theme.cpp b/src/plugins/platformthemes/gtk3/qgtk3theme.cpp
index 7e64906476..6447776f25 100644
--- a/src/plugins/platformthemes/gtk3/qgtk3theme.cpp
+++ b/src/plugins/platformthemes/gtk3/qgtk3theme.cpp
@@ -102,6 +102,15 @@ QGtk3Theme::QGtk3Theme()
g_log_set_handler("Gtk", G_LOG_LEVEL_MESSAGE, gtkMessageHandler, NULL);
}
+static inline QVariant gtkGetLongPressTime()
+{
+ const char *gtk_long_press_time = "gtk-long-press-time";
+ static bool found = g_object_class_find_property(G_OBJECT_GET_CLASS(gtk_settings_get_default()), gtk_long_press_time);
+ if (!found)
+ return QVariant();
+ return QVariant(gtkSetting<guint>(gtk_long_press_time)); // Since 3.14, apparently we support >= 3.6
+}
+
QVariant QGtk3Theme::themeHint(QPlatformTheme::ThemeHint hint) const
{
switch (hint) {
@@ -111,8 +120,12 @@ QVariant QGtk3Theme::themeHint(QPlatformTheme::ThemeHint hint) const
return QVariant(gtkSetting<gint>("gtk-double-click-distance"));
case QPlatformTheme::MouseDoubleClickInterval:
return QVariant(gtkSetting<gint>("gtk-double-click-time"));
- case QPlatformTheme::MousePressAndHoldInterval:
- return QVariant(gtkSetting<guint>("gtk-long-press-time"));
+ case QPlatformTheme::MousePressAndHoldInterval: {
+ QVariant v = gtkGetLongPressTime();
+ if (!v.isValid())
+ v = QGnomeTheme::themeHint(hint);
+ return v;
+ }
case QPlatformTheme::PasswordMaskDelay:
return QVariant(gtkSetting<guint>("gtk-entry-password-hint-timeout"));
case QPlatformTheme::StartDragDistance:
diff --git a/src/plugins/styles/mac/qmacstyle_mac.mm b/src/plugins/styles/mac/qmacstyle_mac.mm
index a6ece7632a..4bcfa75f36 100644
--- a/src/plugins/styles/mac/qmacstyle_mac.mm
+++ b/src/plugins/styles/mac/qmacstyle_mac.mm
@@ -82,7 +82,9 @@
#include <qpainter.h>
#include <qpixmapcache.h>
#include <qpointer.h>
+#if QT_CONFIG(progressbar)
#include <qprogressbar.h>
+#endif
#if QT_CONFIG(pushbutton)
#include <qpushbutton.h>
#endif
@@ -90,11 +92,15 @@
#if QT_CONFIG(rubberband)
#include <qrubberband.h>
#endif
+#if QT_CONFIG(scrollbar)
#include <qscrollbar.h>
+#endif
#include <qsizegrip.h>
#include <qstyleoption.h>
#include <qtoolbar.h>
+#if QT_CONFIG(toolbutton)
#include <qtoolbutton.h>
+#endif
#if QT_CONFIG(treeview)
#include <qtreeview.h>
#endif
@@ -112,7 +118,9 @@
#endif
#include <qmath.h>
#include <QtWidgets/qgraphicsproxywidget.h>
+#if QT_CONFIG(graphicsview)
#include <QtWidgets/qgraphicsview.h>
+#endif
#include <QtCore/qvariant.h>
#include <private/qstylehelper_p.h>
#include <private/qstyleanimation_p.h>
@@ -781,13 +789,13 @@ static QSize qt_aqua_get_known_size(QStyle::ContentsType ct, const QWidget *widg
else if (qobject_cast<const QComboBox *>(widg))
ct = QStyle::CT_ComboBox;
#endif
-#ifndef QT_NO_TOOLBUTTON
+#if QT_CONFIG(toolbutton)
else if (qobject_cast<const QToolButton *>(widg))
ct = QStyle::CT_ToolButton;
#endif
else if (qobject_cast<const QSlider *>(widg))
ct = QStyle::CT_Slider;
-#ifndef QT_NO_PROGRESSBAR
+#if QT_CONFIG(progressbar)
else if (qobject_cast<const QProgressBar *>(widg))
ct = QStyle::CT_ProgressBar;
#endif
@@ -916,7 +924,7 @@ static QSize qt_aqua_get_known_size(QStyle::ContentsType ct, const QWidget *widg
if (sz == QStyleHelper::SizeSmall) {
int width = 0, height = 0;
if (szHint == QSize(-1, -1)) { //just 'guess'..
-#ifndef QT_NO_TOOLBUTTON
+#if QT_CONFIG(toolbutton)
const QToolButton *bt = qobject_cast<const QToolButton *>(widg);
// If this conversion fails then the widget was not what it claimed to be.
if(bt) {
@@ -1003,7 +1011,7 @@ static QSize qt_aqua_get_known_size(QStyle::ContentsType ct, const QWidget *widg
ret.setWidth(w);
break;
}
-#ifndef QT_NO_PROGRESSBAR
+#if QT_CONFIG(progressbar)
case QStyle::CT_ProgressBar: {
int finalValue = -1;
Qt::Orientation orient = Qt::Horizontal;
@@ -3336,7 +3344,7 @@ void QMacStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, QPai
HIThemeGroupBoxDrawInfo gdi;
gdi.version = qt_mac_hitheme_version;
gdi.state = tds;
-#ifndef QT_NO_GROUPBOX
+#if QT_CONFIG(groupbox)
if (w && qobject_cast<QGroupBox *>(w->parentWidget()))
gdi.kind = kHIThemeGroupBoxKindSecondary;
else
@@ -5901,7 +5909,7 @@ void QMacStyle::drawComplexControl(ComplexControl cc, const QStyleOptionComplex
#endif
}
break;
-#ifndef QT_NO_DIAL
+#if QT_CONFIG(dial)
case CC_Dial:
if (const QStyleOptionSlider *dial = qstyleoption_cast<const QStyleOptionSlider *>(opt))
QStyleHelper::drawDial(dial, p);
@@ -6721,7 +6729,7 @@ bool QMacStyle::event(QEvent *e)
if(e->type() == QEvent::FocusIn) {
QWidget *f = 0;
QWidget *focusWidget = QApplication::focusWidget();
-#ifndef QT_NO_GRAPHICSVIEW
+#if QT_CONFIG(graphicsview)
if (QGraphicsView *graphicsView = qobject_cast<QGraphicsView *>(focusWidget)) {
QGraphicsItem *focusItem = graphicsView->scene() ? graphicsView->scene()->focusItem() : 0;
if (focusItem && focusItem->type() == QGraphicsProxyWidget::Type) {
diff --git a/src/plugins/styles/mac/qmacstyle_mac_p_p.h b/src/plugins/styles/mac/qmacstyle_mac_p_p.h
index 8574a52a87..b453e3c2d7 100644
--- a/src/plugins/styles/mac/qmacstyle_mac_p_p.h
+++ b/src/plugins/styles/mac/qmacstyle_mac_p_p.h
@@ -68,7 +68,9 @@
#include <qevent.h>
#include <qfocusframe.h>
#include <qformlayout.h>
+#if QT_CONFIG(groupbox)
#include <qgroupbox.h>
+#endif
#include <qhash.h>
#include <qheaderview.h>
#include <qlayout.h>
@@ -83,7 +85,9 @@
#include <qpainter.h>
#include <qpixmapcache.h>
#include <qpointer.h>
+#if QT_CONFIG(progressbar)
#include <qprogressbar.h>
+#endif
#if QT_CONFIG(pushbutton)
#include <qpushbutton.h>
#endif
@@ -93,12 +97,16 @@
#endif
#include <qsizegrip.h>
#include <qspinbox.h>
+#if QT_CONFIG(splitter)
#include <qsplitter.h>
+#endif
#include <qstyleoption.h>
#include <qtextedit.h>
#include <qtextstream.h>
#include <qtoolbar.h>
+#if QT_CONFIG(toolbutton)
#include <qtoolbutton.h>
+#endif
#if QT_CONFIG(treeview)
#include <qtreeview.h>
#endif
diff --git a/src/plugins/styles/windowsvista/qwindowsvistastyle_p_p.h b/src/plugins/styles/windowsvista/qwindowsvistastyle_p_p.h
index 14af2c6bbc..a6744ff915 100644
--- a/src/plugins/styles/windowsvista/qwindowsvistastyle_p_p.h
+++ b/src/plugins/styles/windowsvista/qwindowsvistastyle_p_p.h
@@ -67,14 +67,20 @@
#include <qradiobutton.h>
#include <qlineedit.h>
#include <qgroupbox.h>
+#if QT_CONFIG(toolbutton)
#include <qtoolbutton.h>
+#endif
#include <qspinbox.h>
#include <qtoolbar.h>
#if QT_CONFIG(combobox)
#include <qcombobox.h>
#endif
+#if QT_CONFIG(scrollbar)
#include <qscrollbar.h>
+#endif
+#if QT_CONFIG(progressbar)
#include <qprogressbar.h>
+#endif
#if QT_CONFIG(dockwidget)
#include <qdockwidget.h>
#endif
diff --git a/src/plugins/styles/windowsvista/qwindowsxpstyle.cpp b/src/plugins/styles/windowsvista/qwindowsxpstyle.cpp
index a3a665f22b..9880edf0b4 100644
--- a/src/plugins/styles/windowsvista/qwindowsxpstyle.cpp
+++ b/src/plugins/styles/windowsvista/qwindowsxpstyle.cpp
@@ -55,14 +55,18 @@
#include <qpa/qplatformnativeinterface.h>
#include <qdesktopwidget.h>
+#if QT_CONFIG(toolbutton)
#include <qtoolbutton.h>
+#endif
#if QT_CONFIG(tabbar)
#include <qtabbar.h>
#endif
#if QT_CONFIG(combobox)
#include <qcombobox.h>
#endif
+#if QT_CONFIG(scrollbar)
#include <qscrollbar.h>
+#endif
#include <qheaderview.h>
#include <qspinbox.h>
#if QT_CONFIG(listview)
@@ -2857,7 +2861,7 @@ void QWindowsXPStyle::drawComplexControl(ComplexControl cc, const QStyleOptionCo
}
break;
#endif
-#ifndef QT_NO_TOOLBUTTON
+#if QT_CONFIG(toolbutton)
case CC_ToolButton:
if (const QStyleOptionToolButton *toolbutton
= qstyleoption_cast<const QStyleOptionToolButton *>(option)) {
@@ -2971,7 +2975,7 @@ void QWindowsXPStyle::drawComplexControl(ComplexControl cc, const QStyleOptionCo
}
}
break;
-#endif // QT_NO_TOOLBUTTON
+#endif // QT_CONFIG(toolbutton)
case CC_TitleBar:
{
@@ -3231,12 +3235,12 @@ void QWindowsXPStyle::drawComplexControl(ComplexControl cc, const QStyleOptionCo
}
break;
#endif //QT_NO_MDIAREA
-#ifndef QT_NO_DIAL
+#if QT_CONFIG(dial)
case CC_Dial:
if (const QStyleOptionSlider *dial = qstyleoption_cast<const QStyleOptionSlider *>(option))
QStyleHelper::drawDial(dial, p);
break;
-#endif // QT_NO_DIAL
+#endif // QT_CONFIG(dial)
default:
QWindowsStyle::drawComplexControl(cc, option, p, widget);
break;