macros.qt5: +%_qt5_qmldir macro
pull in xcb-related upstream fixes backport hidpi-related patches from f25 branch
This commit is contained in:
parent
3a8fd71ba6
commit
425885b3cd
|
@ -0,0 +1,43 @@
|
|||
From 2cf3dee10be1d2163eff0893f51f9ece643c2540 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?B=C5=82a=C5=BCej=20Szczygie=C5=82?= <spaz16@wp.pl>
|
||||
Date: Mon, 12 Sep 2016 15:22:20 +0200
|
||||
Subject: [PATCH 019/352] xcb: Don't send "Qt::WindowNoState" event when hiding
|
||||
minimized window
|
||||
|
||||
This prevents getting "QWidget::showEvent()" when hiding minimized
|
||||
widget on some WMs like Marco or Xfwm4.
|
||||
|
||||
If QWindow is minimized and it gets the new "XCB_WM_STATE_WITHDRAWN"
|
||||
event from XCB, then don't change the QWindow state.
|
||||
|
||||
Task-number: QTBUG-55942
|
||||
Change-Id: I90cfc2bf55e507864ad8f26c8f569ea562c27314
|
||||
Reviewed-by: Uli Schlachter <psychon@znc.in>
|
||||
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
|
||||
---
|
||||
src/plugins/platforms/xcb/qxcbwindow.cpp | 9 +++++++--
|
||||
1 file changed, 7 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
|
||||
index da50201..d46228c 100644
|
||||
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
|
||||
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
|
||||
@@ -2543,8 +2543,13 @@ void QXcbWindow::handlePropertyNotifyEvent(const xcb_property_notify_event_t *ev
|
||||
|
||||
if (reply && reply->format == 32 && reply->type == atom(QXcbAtom::WM_STATE)) {
|
||||
const quint32 *data = (const quint32 *)xcb_get_property_value(reply);
|
||||
- if (reply->length != 0 && XCB_WM_STATE_ICONIC == data[0])
|
||||
- newState = Qt::WindowMinimized;
|
||||
+ if (reply->length != 0) {
|
||||
+ if (data[0] == XCB_WM_STATE_ICONIC
|
||||
+ || (data[0] == XCB_WM_STATE_WITHDRAWN
|
||||
+ && m_lastWindowStateEvent == Qt::WindowMinimized)) {
|
||||
+ newState = Qt::WindowMinimized;
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
free(reply);
|
||||
} else { // _NET_WM_STATE can't change minimized state
|
||||
--
|
||||
2.9.3
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
From 2c48695f04b0f4b3b11ec037b13132b146cad082 Mon Sep 17 00:00:00 2001
|
||||
From: Frederik Gladhorn <frederik.gladhorn@theqtcompany.com>
|
||||
Date: Thu, 15 Sep 2016 23:21:15 +0200
|
||||
Subject: [PATCH 032/352] XCB Drop from external app: fix keyboard modifier
|
||||
state
|
||||
|
||||
Fix inspired by Qt 4 sources. When we get drop events that are not
|
||||
coming from the same application, it's unlikely that the keyboard
|
||||
modifiers are in a sensible state (the usual XCB events are not sent
|
||||
during drag and drop), so set the keyboard modifier state explicitly.
|
||||
|
||||
Task-number: QTBUG-49645
|
||||
Change-Id: I9360f2b7ffeaa5243a4dfe7ccf96df134c5d2156
|
||||
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
|
||||
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
|
||||
---
|
||||
src/plugins/platforms/xcb/qxcbdrag.cpp | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/src/plugins/platforms/xcb/qxcbdrag.cpp b/src/plugins/platforms/xcb/qxcbdrag.cpp
|
||||
index f93e420..acfb580 100644
|
||||
--- a/src/plugins/platforms/xcb/qxcbdrag.cpp
|
||||
+++ b/src/plugins/platforms/xcb/qxcbdrag.cpp
|
||||
@@ -960,6 +960,9 @@ void QXcbDrag::handleDrop(QPlatformWindow *, const xcb_client_message_event_t *e
|
||||
} else {
|
||||
dropData = platformDropData();
|
||||
supported_drop_actions = accepted_drop_action;
|
||||
+
|
||||
+ // Drop coming from another app? Update keyboard modifiers.
|
||||
+ QGuiApplicationPrivate::modifier_buttons = QGuiApplication::queryKeyboardModifiers();
|
||||
}
|
||||
|
||||
if (!dropData)
|
||||
--
|
||||
2.9.3
|
||||
|
|
@ -0,0 +1,150 @@
|
|||
From 76adb6c29f9284a3d7cceb8fb09c3bb7c4cd5e1b Mon Sep 17 00:00:00 2001
|
||||
From: Albert Astals Cid <aacid@kde.org>
|
||||
Date: Thu, 21 Apr 2016 01:39:27 +0200
|
||||
Subject: [PATCH 036/352] xcb: Use the state of the key event to process it
|
||||
|
||||
Instead of the global state
|
||||
|
||||
Task-number: QTBUG-48795
|
||||
Change-Id: Ic2c545718adb68df41730e5a3bf25adb374ffce3
|
||||
Reviewed-by: Frederik Gladhorn <frederik.gladhorn@qt.io>
|
||||
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
|
||||
Reviewed-by: Gatis Paeglis <gatis.paeglis@qt.io>
|
||||
---
|
||||
src/plugins/platforms/xcb/qxcbkeyboard.cpp | 72 ++++++++++++++++++------------
|
||||
src/plugins/platforms/xcb/qxcbkeyboard.h | 2 +
|
||||
2 files changed, 46 insertions(+), 28 deletions(-)
|
||||
|
||||
diff --git a/src/plugins/platforms/xcb/qxcbkeyboard.cpp b/src/plugins/platforms/xcb/qxcbkeyboard.cpp
|
||||
index 28de86b..e0fcc01 100644
|
||||
--- a/src/plugins/platforms/xcb/qxcbkeyboard.cpp
|
||||
+++ b/src/plugins/platforms/xcb/qxcbkeyboard.cpp
|
||||
@@ -742,8 +742,7 @@ void QXcbKeyboard::updateKeymap()
|
||||
// update xkb state object
|
||||
xkb_state_unref(xkb_state);
|
||||
xkb_state = new_state;
|
||||
- if (!connection()->hasXKB())
|
||||
- updateXKBMods();
|
||||
+ updateXKBMods();
|
||||
|
||||
checkForLatinLayout();
|
||||
}
|
||||
@@ -768,32 +767,37 @@ void QXcbKeyboard::updateXKBState(xcb_xkb_state_notify_event_t *state)
|
||||
}
|
||||
#endif
|
||||
|
||||
+void QXcbKeyboard::updateXKBStateFromState(struct xkb_state *kb_state, quint16 state)
|
||||
+{
|
||||
+ const quint32 modsDepressed = xkb_state_serialize_mods(kb_state, XKB_STATE_MODS_DEPRESSED);
|
||||
+ const quint32 modsLatched = xkb_state_serialize_mods(kb_state, XKB_STATE_MODS_LATCHED);
|
||||
+ const quint32 modsLocked = xkb_state_serialize_mods(kb_state, XKB_STATE_MODS_LOCKED);
|
||||
+ const quint32 xkbMask = xkbModMask(state);
|
||||
+
|
||||
+ const quint32 latched = modsLatched & xkbMask;
|
||||
+ const quint32 locked = modsLocked & xkbMask;
|
||||
+ quint32 depressed = modsDepressed & xkbMask;
|
||||
+ // set modifiers in depressed if they don't appear in any of the final masks
|
||||
+ depressed |= ~(depressed | latched | locked) & xkbMask;
|
||||
+
|
||||
+ const xkb_state_component newState
|
||||
+ = xkb_state_update_mask(kb_state,
|
||||
+ depressed,
|
||||
+ latched,
|
||||
+ locked,
|
||||
+ 0,
|
||||
+ 0,
|
||||
+ (state >> 13) & 3); // bits 13 and 14 report the state keyboard group
|
||||
+
|
||||
+ if ((newState & XKB_STATE_LAYOUT_EFFECTIVE) == XKB_STATE_LAYOUT_EFFECTIVE) {
|
||||
+ //qWarning("TODO: Support KeyboardLayoutChange on QPA (QTBUG-27681)");
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
void QXcbKeyboard::updateXKBStateFromCore(quint16 state)
|
||||
{
|
||||
if (m_config && !connection()->hasXKB()) {
|
||||
- const quint32 modsDepressed = xkb_state_serialize_mods(xkb_state, XKB_STATE_MODS_DEPRESSED);
|
||||
- const quint32 modsLatched = xkb_state_serialize_mods(xkb_state, XKB_STATE_MODS_LATCHED);
|
||||
- const quint32 modsLocked = xkb_state_serialize_mods(xkb_state, XKB_STATE_MODS_LOCKED);
|
||||
- const quint32 xkbMask = xkbModMask(state);
|
||||
-
|
||||
- const quint32 latched = modsLatched & xkbMask;
|
||||
- const quint32 locked = modsLocked & xkbMask;
|
||||
- quint32 depressed = modsDepressed & xkbMask;
|
||||
- // set modifiers in depressed if they don't appear in any of the final masks
|
||||
- depressed |= ~(depressed | latched | locked) & xkbMask;
|
||||
-
|
||||
- const xkb_state_component newState
|
||||
- = xkb_state_update_mask(xkb_state,
|
||||
- depressed,
|
||||
- latched,
|
||||
- locked,
|
||||
- 0,
|
||||
- 0,
|
||||
- (state >> 13) & 3); // bits 13 and 14 report the state keyboard group
|
||||
-
|
||||
- if ((newState & XKB_STATE_LAYOUT_EFFECTIVE) == XKB_STATE_LAYOUT_EFFECTIVE) {
|
||||
- //qWarning("TODO: Support KeyboardLayoutChange on QPA (QTBUG-27681)");
|
||||
- }
|
||||
+ updateXKBStateFromState(xkb_state, state);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1455,7 +1459,16 @@ void QXcbKeyboard::handleKeyEvent(xcb_window_t sourceWindow, QEvent::Type type,
|
||||
if (type == QEvent::KeyPress)
|
||||
targetWindow->updateNetWmUserTime(time);
|
||||
|
||||
- xcb_keysym_t sym = xkb_state_key_get_one_sym(xkb_state, code);
|
||||
+ // Have a temporary keyboard state filled in from state
|
||||
+ // this way we allow for synthetic events to have different state
|
||||
+ // from the current state i.e. you can have Alt+Ctrl pressed
|
||||
+ // and receive a synthetic key event that has neither Alt nor Ctrl pressed
|
||||
+ struct xkb_state *kb_state = xkb_state_new(xkb_keymap);
|
||||
+ if (!kb_state)
|
||||
+ return;
|
||||
+ updateXKBStateFromState(kb_state, state);
|
||||
+
|
||||
+ xcb_keysym_t sym = xkb_state_key_get_one_sym(kb_state, code);
|
||||
|
||||
QPlatformInputContext *inputContext = QGuiApplicationPrivate::platformIntegration()->inputContext();
|
||||
QMetaMethod method;
|
||||
@@ -1474,11 +1487,13 @@ void QXcbKeyboard::handleKeyEvent(xcb_window_t sourceWindow, QEvent::Type type,
|
||||
Q_ARG(uint, code),
|
||||
Q_ARG(uint, state),
|
||||
Q_ARG(bool, type == QEvent::KeyPress));
|
||||
- if (retval)
|
||||
+ if (retval) {
|
||||
+ xkb_state_unref(kb_state);
|
||||
return;
|
||||
+ }
|
||||
}
|
||||
|
||||
- QString string = lookupString(xkb_state, code);
|
||||
+ QString string = lookupString(kb_state, code);
|
||||
|
||||
// Ιf control modifier is set we should prefer latin character, this is
|
||||
// used for standard shortcuts in checks like "key == QKeySequence::Copy",
|
||||
@@ -1547,6 +1562,7 @@ void QXcbKeyboard::handleKeyEvent(xcb_window_t sourceWindow, QEvent::Type type,
|
||||
QWindowSystemInterface::handleExtendedKeyEvent(window, time, QEvent::KeyPress, qtcode, modifiers,
|
||||
code, sym, state, string, isAutoRepeat);
|
||||
}
|
||||
+ xkb_state_unref(kb_state);
|
||||
}
|
||||
|
||||
QString QXcbKeyboard::lookupString(struct xkb_state *state, xcb_keycode_t code) const
|
||||
diff --git a/src/plugins/platforms/xcb/qxcbkeyboard.h b/src/plugins/platforms/xcb/qxcbkeyboard.h
|
||||
index 457a27a..dc27511 100644
|
||||
--- a/src/plugins/platforms/xcb/qxcbkeyboard.h
|
||||
+++ b/src/plugins/platforms/xcb/qxcbkeyboard.h
|
||||
@@ -98,6 +98,8 @@ protected:
|
||||
void checkForLatinLayout();
|
||||
|
||||
private:
|
||||
+ void updateXKBStateFromState(struct xkb_state *kb_state, quint16 state);
|
||||
+
|
||||
bool m_config;
|
||||
xcb_keycode_t m_autorepeat_code;
|
||||
|
||||
--
|
||||
2.9.3
|
||||
|
|
@ -0,0 +1,139 @@
|
|||
From 422838685c31d9b57133a8711bfd5db92095d96d Mon Sep 17 00:00:00 2001
|
||||
From: Robin Burchell <robin.burchell@viroteck.net>
|
||||
Date: Wed, 7 Sep 2016 14:34:03 +0200
|
||||
Subject: [PATCH 084/352] xcb: Treat bitmap cursors differently from shaped
|
||||
cursors
|
||||
|
||||
QXcbCursor had a "cache" of cursor handles. Unfortunately, as QXcbCursor has its
|
||||
lifetime tied to the screen, this cache grew unbounded whenever the cursor was
|
||||
set: this could be witnessed worst when repeatedly setting the current cursor to
|
||||
a different pixmap each time.
|
||||
|
||||
We fix this by keeping the cursor cache only for the "regular" shaped cursors
|
||||
that are often shared between windows, working on the assumption that custom
|
||||
cursors are generally specific only to a given window. This makes the lifetime
|
||||
of the bitmap cursors much more clear: they are tied to that window, and when
|
||||
the window is destroyed (or changes cursor), so too is the bitmap cursor
|
||||
destroyed (if set).
|
||||
|
||||
Reported-by: Will Thompson <wjt@endlessm.com>
|
||||
Change-Id: Ia558d858ff49e89cd5220344567203eb0267a133
|
||||
Reviewed-by: Uli Schlachter <psychon@znc.in>
|
||||
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
|
||||
---
|
||||
src/plugins/platforms/xcb/qxcbcursor.cpp | 24 +++++++++++++++++-------
|
||||
src/plugins/platforms/xcb/qxcbwindow.cpp | 22 +++++++++++++++++++---
|
||||
src/plugins/platforms/xcb/qxcbwindow.h | 3 ++-
|
||||
3 files changed, 38 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/src/plugins/platforms/xcb/qxcbcursor.cpp b/src/plugins/platforms/xcb/qxcbcursor.cpp
|
||||
index b321ed9..4646ced 100644
|
||||
--- a/src/plugins/platforms/xcb/qxcbcursor.cpp
|
||||
+++ b/src/plugins/platforms/xcb/qxcbcursor.cpp
|
||||
@@ -353,17 +353,27 @@ void QXcbCursor::changeCursor(QCursor *cursor, QWindow *widget)
|
||||
return;
|
||||
|
||||
xcb_cursor_t c = XCB_CURSOR_NONE;
|
||||
+ bool isBitmapCursor = false;
|
||||
+
|
||||
if (cursor) {
|
||||
- const QXcbCursorCacheKey key(*cursor);
|
||||
- CursorHash::iterator it = m_cursorHash.find(key);
|
||||
- if (it == m_cursorHash.end()) {
|
||||
- const Qt::CursorShape shape = cursor->shape();
|
||||
- it = m_cursorHash.insert(key, shape == Qt::BitmapCursor ? createBitmapCursor(cursor) : createFontCursor(shape));
|
||||
+ const Qt::CursorShape shape = cursor->shape();
|
||||
+ isBitmapCursor = shape == Qt::BitmapCursor;
|
||||
+
|
||||
+ if (!isBitmapCursor) {
|
||||
+ const QXcbCursorCacheKey key(*cursor);
|
||||
+ CursorHash::iterator it = m_cursorHash.find(key);
|
||||
+ if (it == m_cursorHash.end()) {
|
||||
+ it = m_cursorHash.insert(key, createFontCursor(shape));
|
||||
+ }
|
||||
+ c = it.value();
|
||||
+ } else {
|
||||
+ // Do not cache bitmap cursors, as otherwise they have unclear
|
||||
+ // lifetime (we effectively leak xcb_cursor_t).
|
||||
+ c = createBitmapCursor(cursor);
|
||||
}
|
||||
- c = it.value();
|
||||
}
|
||||
|
||||
- w->setCursor(c);
|
||||
+ w->setCursor(c, isBitmapCursor);
|
||||
}
|
||||
|
||||
static int cursorIdForShape(int cshape)
|
||||
diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
|
||||
index d46228c..5f402b6 100644
|
||||
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
|
||||
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
|
||||
@@ -302,6 +302,7 @@ QXcbWindow::QXcbWindow(QWindow *window)
|
||||
, m_lastWindowStateEvent(-1)
|
||||
, m_syncState(NoSyncNeeded)
|
||||
, m_pendingSyncRequest(0)
|
||||
+ , m_currentBitmapCursor(XCB_CURSOR_NONE)
|
||||
{
|
||||
setConnection(xcbScreen()->connection());
|
||||
}
|
||||
@@ -620,6 +621,9 @@ void QXcbWindow::create()
|
||||
|
||||
QXcbWindow::~QXcbWindow()
|
||||
{
|
||||
+ if (m_currentBitmapCursor != XCB_CURSOR_NONE) {
|
||||
+ xcb_free_cursor(xcb_connection(), m_currentBitmapCursor);
|
||||
+ }
|
||||
if (window()->type() != Qt::ForeignWindow)
|
||||
destroy();
|
||||
else {
|
||||
@@ -2665,10 +2669,22 @@ bool QXcbWindow::setMouseGrabEnabled(bool grab)
|
||||
return result;
|
||||
}
|
||||
|
||||
-void QXcbWindow::setCursor(xcb_cursor_t cursor)
|
||||
+void QXcbWindow::setCursor(xcb_cursor_t cursor, bool isBitmapCursor)
|
||||
{
|
||||
- xcb_change_window_attributes(xcb_connection(), m_window, XCB_CW_CURSOR, &cursor);
|
||||
- xcb_flush(xcb_connection());
|
||||
+ xcb_connection_t *conn = xcb_connection();
|
||||
+
|
||||
+ xcb_change_window_attributes(conn, m_window, XCB_CW_CURSOR, &cursor);
|
||||
+ xcb_flush(conn);
|
||||
+
|
||||
+ if (m_currentBitmapCursor != XCB_CURSOR_NONE) {
|
||||
+ xcb_free_cursor(conn, m_currentBitmapCursor);
|
||||
+ }
|
||||
+
|
||||
+ if (isBitmapCursor) {
|
||||
+ m_currentBitmapCursor = cursor;
|
||||
+ } else {
|
||||
+ m_currentBitmapCursor = XCB_CURSOR_NONE;
|
||||
+ }
|
||||
}
|
||||
|
||||
void QXcbWindow::windowEvent(QEvent *event)
|
||||
diff --git a/src/plugins/platforms/xcb/qxcbwindow.h b/src/plugins/platforms/xcb/qxcbwindow.h
|
||||
index b8bcf44..f2b6904 100644
|
||||
--- a/src/plugins/platforms/xcb/qxcbwindow.h
|
||||
+++ b/src/plugins/platforms/xcb/qxcbwindow.h
|
||||
@@ -97,7 +97,7 @@ public:
|
||||
bool setKeyboardGrabEnabled(bool grab) Q_DECL_OVERRIDE;
|
||||
bool setMouseGrabEnabled(bool grab) Q_DECL_OVERRIDE;
|
||||
|
||||
- void setCursor(xcb_cursor_t cursor);
|
||||
+ void setCursor(xcb_cursor_t cursor, bool isBitmapCursor);
|
||||
|
||||
QSurfaceFormat format() const Q_DECL_OVERRIDE;
|
||||
|
||||
@@ -263,6 +263,7 @@ protected:
|
||||
SyncState m_syncState;
|
||||
|
||||
QXcbSyncWindowRequest *m_pendingSyncRequest;
|
||||
+ xcb_cursor_t m_currentBitmapCursor;
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
--
|
||||
2.9.3
|
||||
|
|
@ -0,0 +1,85 @@
|
|||
From f43c9697bcae997be3eb6db9504f3d7b64601148 Mon Sep 17 00:00:00 2001
|
||||
From: Marc Mutz <marc.mutz@kdab.com>
|
||||
Date: Tue, 27 Sep 2016 14:55:09 +0200
|
||||
Subject: [PATCH 098/352] Plug QMimeData leaks in QXcbClipboard
|
||||
|
||||
QXcbClipboard failed to delete the various QMimeData instances
|
||||
it owns.
|
||||
|
||||
For m_xClipboard, where the two QXcbClipboardMime instances are
|
||||
never the same, fix the leak by using a scoped instead of a
|
||||
naked pointer.
|
||||
|
||||
For m_clientClipboard, where the two QMimeData could be identical
|
||||
objects, keep the naked pointers, but delete the objects manually
|
||||
in the QXcbClipboard destructor, paying attention to the case
|
||||
where they're the same object.
|
||||
|
||||
Change-Id: I5ce0e3e8fcec068aeb344ca806cdf2667378e946
|
||||
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
|
||||
---
|
||||
src/plugins/platforms/xcb/qxcbclipboard.cpp | 12 +++++++-----
|
||||
src/plugins/platforms/xcb/qxcbclipboard.h | 2 +-
|
||||
2 files changed, 8 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/src/plugins/platforms/xcb/qxcbclipboard.cpp b/src/plugins/platforms/xcb/qxcbclipboard.cpp
|
||||
index 8b75c13..d44ebae 100644
|
||||
--- a/src/plugins/platforms/xcb/qxcbclipboard.cpp
|
||||
+++ b/src/plugins/platforms/xcb/qxcbclipboard.cpp
|
||||
@@ -269,8 +269,6 @@ QXcbClipboard::QXcbClipboard(QXcbConnection *c)
|
||||
{
|
||||
Q_ASSERT(QClipboard::Clipboard == 0);
|
||||
Q_ASSERT(QClipboard::Selection == 1);
|
||||
- m_xClipboard[QClipboard::Clipboard] = 0;
|
||||
- m_xClipboard[QClipboard::Selection] = 0;
|
||||
m_clientClipboard[QClipboard::Clipboard] = 0;
|
||||
m_clientClipboard[QClipboard::Selection] = 0;
|
||||
m_timestamp[QClipboard::Clipboard] = XCB_CURRENT_TIME;
|
||||
@@ -323,6 +321,10 @@ QXcbClipboard::~QXcbClipboard()
|
||||
}
|
||||
free(reply);
|
||||
}
|
||||
+
|
||||
+ if (m_clientClipboard[QClipboard::Clipboard] != m_clientClipboard[QClipboard::Selection])
|
||||
+ delete m_clientClipboard[QClipboard::Clipboard];
|
||||
+ delete m_clientClipboard[QClipboard::Selection];
|
||||
}
|
||||
|
||||
void QXcbClipboard::incrTransactionPeeker(xcb_generic_event_t *ge, bool &accepted)
|
||||
@@ -372,9 +374,9 @@ QMimeData * QXcbClipboard::mimeData(QClipboard::Mode mode)
|
||||
return m_clientClipboard[mode];
|
||||
} else {
|
||||
if (!m_xClipboard[mode])
|
||||
- m_xClipboard[mode] = new QXcbClipboardMime(mode, this);
|
||||
+ m_xClipboard[mode].reset(new QXcbClipboardMime(mode, this));
|
||||
|
||||
- return m_xClipboard[mode];
|
||||
+ return m_xClipboard[mode].data();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -724,7 +726,7 @@ void QXcbClipboard::handleXFixesSelectionRequest(xcb_xfixes_selection_notify_eve
|
||||
// here we care only about the xfixes events that come from non Qt processes
|
||||
if (event->owner != XCB_NONE && event->owner != owner()) {
|
||||
if (!m_xClipboard[mode]) {
|
||||
- m_xClipboard[mode] = new QXcbClipboardMime(mode, this);
|
||||
+ m_xClipboard[mode].reset(new QXcbClipboardMime(mode, this));
|
||||
} else {
|
||||
m_xClipboard[mode]->reset();
|
||||
}
|
||||
diff --git a/src/plugins/platforms/xcb/qxcbclipboard.h b/src/plugins/platforms/xcb/qxcbclipboard.h
|
||||
index 10f0704..f9a34f4 100644
|
||||
--- a/src/plugins/platforms/xcb/qxcbclipboard.h
|
||||
+++ b/src/plugins/platforms/xcb/qxcbclipboard.h
|
||||
@@ -92,7 +92,7 @@ private:
|
||||
QClipboard::Mode modeForAtom(xcb_atom_t atom) const;
|
||||
|
||||
// Selection and Clipboard
|
||||
- QXcbClipboardMime *m_xClipboard[2];
|
||||
+ QScopedPointer<QXcbClipboardMime> m_xClipboard[2];
|
||||
QMimeData *m_clientClipboard[2];
|
||||
xcb_timestamp_t m_timestamp[2];
|
||||
|
||||
--
|
||||
2.9.3
|
||||
|
|
@ -0,0 +1,64 @@
|
|||
From f4fff02cbb1f9399f407c15a27741c6cd1a17133 Mon Sep 17 00:00:00 2001
|
||||
From: Edward Welbourne <edward.welbourne@qt.io>
|
||||
Date: Mon, 10 Oct 2016 16:09:32 +0200
|
||||
Subject: [PATCH 145/352] QXcbShmImage: don't use shmget()'s return unless it
|
||||
succeeds
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
When shmget() failed, we didn't set m_shm_info.shmid (not even to the
|
||||
-1 failure id) but did pass it (i.e. uninitialized noise) to shmat(),
|
||||
among other related functions. Guard against this; handle failure
|
||||
gracefully.
|
||||
|
||||
Task-number: QTBUG-56419
|
||||
Change-Id: Ie823c36c2ede03af6cb5d94ce7b4b5cd543c1008
|
||||
Reviewed-by: Timur Pocheptsov <timur.pocheptsov@theqtcompany.com>
|
||||
Reviewed-by: Błażej Szczygieł <spaz16@wp.pl>
|
||||
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
|
||||
Reviewed-by: Joni Poikelin <joni.poikelin@qt.io>
|
||||
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
|
||||
---
|
||||
src/plugins/platforms/xcb/qxcbbackingstore.cpp | 16 +++++++++-------
|
||||
1 file changed, 9 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/src/plugins/platforms/xcb/qxcbbackingstore.cpp b/src/plugins/platforms/xcb/qxcbbackingstore.cpp
|
||||
index 3b04c59..0b76830 100644
|
||||
--- a/src/plugins/platforms/xcb/qxcbbackingstore.cpp
|
||||
+++ b/src/plugins/platforms/xcb/qxcbbackingstore.cpp
|
||||
@@ -150,12 +150,13 @@ QXcbShmImage::QXcbShmImage(QXcbScreen *screen, const QSize &size, uint depth, QI
|
||||
return;
|
||||
|
||||
int id = shmget(IPC_PRIVATE, segmentSize, IPC_CREAT | 0600);
|
||||
- if (id == -1)
|
||||
+ if (id == -1) {
|
||||
qWarning("QXcbShmImage: shmget() failed (%d: %s) for size %d (%dx%d)",
|
||||
errno, strerror(errno), segmentSize, size.width(), size.height());
|
||||
- else
|
||||
- m_shm_info.shmid = id;
|
||||
- m_shm_info.shmaddr = m_xcb_image->data = (quint8 *)shmat (m_shm_info.shmid, 0, 0);
|
||||
+ } else {
|
||||
+ m_shm_info.shmaddr = m_xcb_image->data = (quint8 *)shmat(id, 0, 0);
|
||||
+ }
|
||||
+ m_shm_info.shmid = id;
|
||||
m_shm_info.shmseg = xcb_generate_id(xcb_connection());
|
||||
|
||||
const xcb_query_extension_reply_t *shm_reply = xcb_get_extension_data(xcb_connection(), &xcb_shm_id);
|
||||
@@ -166,9 +167,10 @@ QXcbShmImage::QXcbShmImage(QXcbScreen *screen, const QSize &size, uint depth, QI
|
||||
if (!shm_present || error || id == -1) {
|
||||
free(error);
|
||||
|
||||
- shmdt(m_shm_info.shmaddr);
|
||||
- shmctl(m_shm_info.shmid, IPC_RMID, 0);
|
||||
-
|
||||
+ if (id != -1) {
|
||||
+ shmdt(m_shm_info.shmaddr);
|
||||
+ shmctl(m_shm_info.shmid, IPC_RMID, 0);
|
||||
+ }
|
||||
m_shm_info.shmaddr = 0;
|
||||
|
||||
m_xcb_image->data = (uint8_t *)malloc(segmentSize);
|
||||
--
|
||||
2.9.3
|
||||
|
|
@ -0,0 +1,85 @@
|
|||
From ee22c6505a1f7cf52a862b1bd9219511db893417 Mon Sep 17 00:00:00 2001
|
||||
From: Clinton Stimpson <clinton@elemtech.com>
|
||||
Date: Tue, 30 Aug 2016 07:52:17 -0600
|
||||
Subject: [PATCH 177/352] xcb: fix passing of focus from child to its top level
|
||||
QWindow
|
||||
|
||||
With the client message _NET_ACTIVE_WINDOW, not all window managers
|
||||
will pass focus from a child window to its root window, Detect this
|
||||
child-to-root case, and use xcb_set_input_focus() instead.
|
||||
|
||||
Task-number: QTBUG-39362
|
||||
Change-Id: Ib32193018e3b725b323f87d7306c9ae9493d78a7
|
||||
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
|
||||
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
|
||||
Reviewed-by: Frederik Gladhorn <frederik.gladhorn@qt.io>
|
||||
---
|
||||
src/plugins/platforms/xcb/qxcbwindow.cpp | 3 ++-
|
||||
tests/auto/gui/kernel/qwindow/tst_qwindow.cpp | 20 +++++++++++++++++++-
|
||||
2 files changed, 21 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
|
||||
index 5f402b6..25a8b41 100644
|
||||
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
|
||||
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
|
||||
@@ -1698,9 +1698,11 @@ void QXcbWindow::requestActivateWindow()
|
||||
m_deferredActivation = false;
|
||||
|
||||
updateNetWmUserTime(connection()->time());
|
||||
+ QWindow *focusWindow = QGuiApplication::focusWindow();
|
||||
|
||||
if (window()->isTopLevel()
|
||||
&& !(window()->flags() & Qt::X11BypassWindowManagerHint)
|
||||
+ && (!focusWindow || !window()->isAncestorOf(focusWindow))
|
||||
&& connection()->wmSupport()->isSupportedByWM(atom(QXcbAtom::_NET_ACTIVE_WINDOW))) {
|
||||
xcb_client_message_event_t event;
|
||||
|
||||
@@ -1711,7 +1713,6 @@ void QXcbWindow::requestActivateWindow()
|
||||
event.type = atom(QXcbAtom::_NET_ACTIVE_WINDOW);
|
||||
event.data.data32[0] = 1;
|
||||
event.data.data32[1] = connection()->time();
|
||||
- QWindow *focusWindow = QGuiApplication::focusWindow();
|
||||
event.data.data32[2] = focusWindow ? focusWindow->winId() : XCB_NONE;
|
||||
event.data.data32[3] = 0;
|
||||
event.data.data32[4] = 0;
|
||||
diff --git a/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp b/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp
|
||||
index 0cce5a0..d904d48 100644
|
||||
--- a/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp
|
||||
+++ b/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp
|
||||
@@ -601,6 +601,24 @@ void tst_QWindow::isActive()
|
||||
// child has focus
|
||||
QVERIFY(window.isActive());
|
||||
|
||||
+ // test focus back to parent and then back to child (QTBUG-39362)
|
||||
+ // also verify the cumulative FocusOut and FocusIn counts
|
||||
+ // activate parent
|
||||
+ window.requestActivate();
|
||||
+ QTRY_COMPARE(QGuiApplication::focusWindow(), &window);
|
||||
+ QVERIFY(window.isActive());
|
||||
+ QCoreApplication::processEvents();
|
||||
+ QTRY_COMPARE(child.received(QEvent::FocusOut), 1);
|
||||
+ QTRY_COMPARE(window.received(QEvent::FocusIn), 2);
|
||||
+
|
||||
+ // activate child again
|
||||
+ child.requestActivate();
|
||||
+ QTRY_COMPARE(QGuiApplication::focusWindow(), &child);
|
||||
+ QVERIFY(child.isActive());
|
||||
+ QCoreApplication::processEvents();
|
||||
+ QTRY_COMPARE(window.received(QEvent::FocusOut), 2);
|
||||
+ QTRY_COMPARE(child.received(QEvent::FocusIn), 2);
|
||||
+
|
||||
Window dialog;
|
||||
dialog.setTransientParent(&window);
|
||||
dialog.setGeometry(QRect(m_availableTopLeft + QPoint(110, 100), m_testWindowSize));
|
||||
@@ -625,7 +643,7 @@ void tst_QWindow::isActive()
|
||||
QTRY_COMPARE(QGuiApplication::focusWindow(), &window);
|
||||
QCoreApplication::processEvents();
|
||||
QTRY_COMPARE(dialog.received(QEvent::FocusOut), 1);
|
||||
- QTRY_COMPARE(window.received(QEvent::FocusIn), 2);
|
||||
+ QTRY_COMPARE(window.received(QEvent::FocusIn), 3);
|
||||
|
||||
QVERIFY(window.isActive());
|
||||
|
||||
--
|
||||
2.9.3
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
From 10b9321c1dc19236620ba20bdf54cae73891d1ef Mon Sep 17 00:00:00 2001
|
||||
From: Anton Kudryavtsev <a.kudryavtsev@netris.ru>
|
||||
Date: Wed, 19 Oct 2016 15:30:58 +0300
|
||||
Subject: [PATCH 190/352] qxcbconnection.cpp: fix warning about unused function
|
||||
|
||||
isXIEvent() is used iff XCB_USE_XINPUT2 is defined.
|
||||
So move declaration of the function in XCB_USE_XINPUT2 define scope.
|
||||
|
||||
Change-Id: I6f045cd07d572ee7425ee6edc5ac73dcf0afdb37
|
||||
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
|
||||
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
|
||||
---
|
||||
src/plugins/platforms/xcb/qxcbconnection.cpp | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp
|
||||
index c533a2a..3d808d1 100644
|
||||
--- a/src/plugins/platforms/xcb/qxcbconnection.cpp
|
||||
+++ b/src/plugins/platforms/xcb/qxcbconnection.cpp
|
||||
@@ -110,6 +110,7 @@ Q_LOGGING_CATEGORY(lcQpaScreen, "qt.qpa.screen")
|
||||
#define XCB_GE_GENERIC 35
|
||||
#endif
|
||||
|
||||
+#if defined(XCB_USE_XINPUT2)
|
||||
// Starting from the xcb version 1.9.3 struct xcb_ge_event_t has changed:
|
||||
// - "pad0" became "extension"
|
||||
// - "pad1" and "pad" became "pad0"
|
||||
@@ -127,6 +128,7 @@ static inline bool isXIEvent(xcb_generic_event_t *event, int opCode)
|
||||
qt_xcb_ge_event_t *e = (qt_xcb_ge_event_t *)event;
|
||||
return e->extension == opCode;
|
||||
}
|
||||
+#endif // XCB_USE_XINPUT2
|
||||
|
||||
#ifdef XCB_USE_XLIB
|
||||
static const char * const xcbConnectionErrors[] = {
|
||||
--
|
||||
2.9.3
|
||||
|
|
@ -0,0 +1,82 @@
|
|||
From ca4d93d85ee446c5e30ec8e7814651e45cbf1218 Mon Sep 17 00:00:00 2001
|
||||
From: Thiago Macieira <thiago.macieira@intel.com>
|
||||
Date: Thu, 12 Nov 2015 10:14:51 -0800
|
||||
Subject: [PATCH 237/352] Stop unloading plugins in QPluginLoader and
|
||||
QFactoryLoader
|
||||
|
||||
QPluginLoader hasn't unloaded in its destructor since Qt 5.0, but we
|
||||
missed the equivalent code in QFactoryLoader (which bypasses
|
||||
QPluginLoader). Besides, QPluginLoader::unload() was still doing
|
||||
unloading, which it won't anymore.
|
||||
|
||||
Not unloading plugins is Qt's policy, as decided during the 5.0
|
||||
development process and reaffirmed now in 5.6. This is due to static
|
||||
data in plugins leaking out and remaining in use past the unloading of
|
||||
the plugin, causing crashes.
|
||||
|
||||
This does not affect QLibrary and QLibrary::unload(). Those are meant
|
||||
for non-Qt loadable modules, so unloading them may be safe.
|
||||
|
||||
Task-number: QTBUG-49061
|
||||
Discussed-on: http://lists.qt-project.org/pipermail/development/2015-November/023681.html
|
||||
Change-Id: I461e9fc7199748faa187ffff1416070f138df8db
|
||||
(cherry picked from commit 494376f980e96339b6f1eff7c41336ca4d853065)
|
||||
Discussed-again-on: http://lists.qt-project.org/pipermail/development/2016-October/027476.html
|
||||
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
|
||||
---
|
||||
src/corelib/plugin/qfactoryloader.cpp | 6 ++++--
|
||||
src/corelib/plugin/qpluginloader.cpp | 5 +++--
|
||||
2 files changed, 7 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/src/corelib/plugin/qfactoryloader.cpp b/src/corelib/plugin/qfactoryloader.cpp
|
||||
index dcf1b1a..b6558f5 100644
|
||||
--- a/src/corelib/plugin/qfactoryloader.cpp
|
||||
+++ b/src/corelib/plugin/qfactoryloader.cpp
|
||||
@@ -208,10 +208,12 @@ void QFactoryLoader::update()
|
||||
++keyUsageCount;
|
||||
}
|
||||
}
|
||||
- if (keyUsageCount || keys.isEmpty())
|
||||
+ if (keyUsageCount || keys.isEmpty()) {
|
||||
+ library->setLoadHints(QLibrary::PreventUnloadHint); // once loaded, don't unload
|
||||
d->libraryList += library;
|
||||
- else
|
||||
+ } else {
|
||||
library->release();
|
||||
+ }
|
||||
}
|
||||
}
|
||||
#else
|
||||
diff --git a/src/corelib/plugin/qpluginloader.cpp b/src/corelib/plugin/qpluginloader.cpp
|
||||
index 37f2368..0ea8280 100644
|
||||
--- a/src/corelib/plugin/qpluginloader.cpp
|
||||
+++ b/src/corelib/plugin/qpluginloader.cpp
|
||||
@@ -148,6 +148,7 @@ QPluginLoader::QPluginLoader(const QString &fileName, QObject *parent)
|
||||
: QObject(parent), d(0), did_load(false)
|
||||
{
|
||||
setFileName(fileName);
|
||||
+ setLoadHints(QLibrary::PreventUnloadHint);
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -342,7 +343,7 @@ static QString locatePlugin(const QString& fileName)
|
||||
void QPluginLoader::setFileName(const QString &fileName)
|
||||
{
|
||||
#if defined(QT_SHARED)
|
||||
- QLibrary::LoadHints lh;
|
||||
+ QLibrary::LoadHints lh = QLibrary::PreventUnloadHint;
|
||||
if (d) {
|
||||
lh = d->loadHints();
|
||||
d->release();
|
||||
@@ -391,7 +392,7 @@ Q_GLOBAL_STATIC(StaticPluginList, staticPluginList)
|
||||
\brief Give the load() function some hints on how it should behave.
|
||||
|
||||
You can give hints on how the symbols in the plugin are
|
||||
- resolved. By default, none of the hints are set.
|
||||
+ resolved. By default since Qt 5.7, QLibrary::PreventUnloadHint is set.
|
||||
|
||||
See the documentation of QLibrary::loadHints for a complete
|
||||
description of how this property works.
|
||||
--
|
||||
2.9.3
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
From 3c2cb87de2554b9c4f6e2080768fe9ede00aeab3 Mon Sep 17 00:00:00 2001
|
||||
From: Laszlo Agocs <laszlo.agocs@qt.io>
|
||||
Date: Mon, 7 Nov 2016 09:54:55 +0100
|
||||
Subject: [PATCH 263/352] xcb: Warn and bail out when even the basic, dummy
|
||||
context fails
|
||||
|
||||
Do not move on to glGet since the behavior is undefined.
|
||||
|
||||
Task-number: QTBUG-48986
|
||||
Change-Id: Ifd279635ed1b8441f92697965d15ae3ecb59a7e3
|
||||
Reviewed-by: Andy Nichols <andy.nichols@qt.io>
|
||||
---
|
||||
.../platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp | 7 +++++--
|
||||
1 file changed, 5 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp
|
||||
index 9bdedcc..c2b7a56 100644
|
||||
--- a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp
|
||||
+++ b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp
|
||||
@@ -672,8 +672,11 @@ void QGLXContext::queryDummyContext()
|
||||
}
|
||||
|
||||
QOpenGLContext context;
|
||||
- context.create();
|
||||
- context.makeCurrent(surface.data());
|
||||
+ if (!context.create() || !context.makeCurrent(surface.data())) {
|
||||
+ qWarning("QGLXContext: Failed to create dummy context");
|
||||
+ m_supportsThreading = false;
|
||||
+ return;
|
||||
+ }
|
||||
|
||||
m_supportsThreading = true;
|
||||
|
||||
--
|
||||
2.9.3
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
From 291eba6f8099a0fec8fbd9cf8a1fb67e5c9f4f8d Mon Sep 17 00:00:00 2001
|
||||
From: Palo Kisa <palo.kisa@gmail.com>
|
||||
Date: Mon, 7 Nov 2016 18:27:17 +0100
|
||||
Subject: [PATCH 276/352] QClipboard: Fix emitting changed() in XCB
|
||||
|
||||
In XCB environment the QClipboard::changed() was not delivered if the
|
||||
QClipboard::clear() was issued by other Qt app/process.
|
||||
|
||||
If the QClipboard::clear() is used, then the owner in
|
||||
xcb_xfixes_selection_notify_event_t is XCB_NONE, so we need make the
|
||||
decission to handle this event by the selection_timestamp and our
|
||||
m_timestamp[mode].
|
||||
|
||||
Task-number: QTBUG-56972
|
||||
Change-Id: If4c486ac02223eac506465cac7ff1a07bd02a187
|
||||
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
|
||||
---
|
||||
src/plugins/platforms/xcb/qxcbclipboard.cpp | 6 ++++--
|
||||
1 file changed, 4 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/plugins/platforms/xcb/qxcbclipboard.cpp b/src/plugins/platforms/xcb/qxcbclipboard.cpp
|
||||
index d44ebae..40abef4 100644
|
||||
--- a/src/plugins/platforms/xcb/qxcbclipboard.cpp
|
||||
+++ b/src/plugins/platforms/xcb/qxcbclipboard.cpp
|
||||
@@ -723,8 +723,10 @@ void QXcbClipboard::handleXFixesSelectionRequest(xcb_xfixes_selection_notify_eve
|
||||
if (mode > QClipboard::Selection)
|
||||
return;
|
||||
|
||||
- // here we care only about the xfixes events that come from non Qt processes
|
||||
- if (event->owner != XCB_NONE && event->owner != owner()) {
|
||||
+ // Note1: Here we care only about the xfixes events that come from other processes.
|
||||
+ // Note2: If the QClipboard::clear() is issued, event->owner is XCB_NONE,
|
||||
+ // so we check selection_timestamp to not handle our own QClipboard::clear().
|
||||
+ if (event->owner != owner() && event->selection_timestamp > m_timestamp[mode]) {
|
||||
if (!m_xClipboard[mode]) {
|
||||
m_xClipboard[mode].reset(new QXcbClipboardMime(mode, this));
|
||||
} else {
|
||||
--
|
||||
2.9.3
|
||||
|
|
@ -0,0 +1,80 @@
|
|||
From dd52fd0024600d3beffc82d6da02b4239a62d725 Mon Sep 17 00:00:00 2001
|
||||
From: Jocelyn Turcotte <jturcotte@woboq.com>
|
||||
Date: Tue, 17 Jan 2017 17:05:00 +0100
|
||||
Subject: [PATCH 295/420] Ensure a pixel density of at least 1 for
|
||||
Qt::AA_EnableHighDpiScaling
|
||||
|
||||
Very large 1080p TVs or any display which is running at an abnormally
|
||||
low resolution can have a DPI lower than 48, which means that
|
||||
qRound(dpi/96) will result in a 0 pixel density, causing critical
|
||||
issues for applications using Qt::AA_EnableHighDpiScaling.
|
||||
|
||||
Make sure that we always have a pixel density of at least 1 to allow
|
||||
applications not having to worry about such displays.
|
||||
|
||||
Task-number: QTBUG-56140
|
||||
Change-Id: I1dafbf7794a99ae6f872984c0337d8ff0d1fc1c0
|
||||
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
|
||||
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
|
||||
---
|
||||
src/plugins/platforms/eglfs/qeglfsdeviceintegration.cpp | 2 +-
|
||||
src/plugins/platforms/windows/qwindowsscreen.cpp | 2 +-
|
||||
src/plugins/platforms/winrt/qwinrtscreen.cpp | 2 +-
|
||||
src/plugins/platforms/xcb/qxcbscreen.cpp | 2 +-
|
||||
4 files changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/src/plugins/platforms/eglfs/qeglfsdeviceintegration.cpp b/src/plugins/platforms/eglfs/qeglfsdeviceintegration.cpp
|
||||
index 3e1e93f..863a115 100644
|
||||
--- a/src/plugins/platforms/eglfs/qeglfsdeviceintegration.cpp
|
||||
+++ b/src/plugins/platforms/eglfs/qeglfsdeviceintegration.cpp
|
||||
@@ -226,7 +226,7 @@ QDpi QEglFSDeviceIntegration::logicalDpi() const
|
||||
|
||||
qreal QEglFSDeviceIntegration::pixelDensity() const
|
||||
{
|
||||
- return qRound(logicalDpi().first / qreal(100));
|
||||
+ return qMax(1, qRound(logicalDpi().first / qreal(100)));
|
||||
}
|
||||
|
||||
Qt::ScreenOrientation QEglFSDeviceIntegration::nativeOrientation() const
|
||||
diff --git a/src/plugins/platforms/windows/qwindowsscreen.cpp b/src/plugins/platforms/windows/qwindowsscreen.cpp
|
||||
index 7a885b4..c70323c 100644
|
||||
--- a/src/plugins/platforms/windows/qwindowsscreen.cpp
|
||||
+++ b/src/plugins/platforms/windows/qwindowsscreen.cpp
|
||||
@@ -265,7 +265,7 @@ qreal QWindowsScreen::pixelDensity() const
|
||||
// the pixel density since it is reflects the Windows UI scaling.
|
||||
// High DPI auto scaling should be disabled when the user chooses
|
||||
// small fonts on a High DPI monitor, resulting in lower logical DPI.
|
||||
- return qRound(logicalDpi().first / 96);
|
||||
+ return qMax(1, qRound(logicalDpi().first / 96));
|
||||
}
|
||||
|
||||
/*!
|
||||
diff --git a/src/plugins/platforms/winrt/qwinrtscreen.cpp b/src/plugins/platforms/winrt/qwinrtscreen.cpp
|
||||
index f87ae9f..2a4b6c8 100644
|
||||
--- a/src/plugins/platforms/winrt/qwinrtscreen.cpp
|
||||
+++ b/src/plugins/platforms/winrt/qwinrtscreen.cpp
|
||||
@@ -647,7 +647,7 @@ QDpi QWinRTScreen::logicalDpi() const
|
||||
qreal QWinRTScreen::pixelDensity() const
|
||||
{
|
||||
Q_D(const QWinRTScreen);
|
||||
- return qRound(d->logicalDpi / 96);
|
||||
+ return qMax(1, qRound(d->logicalDpi / 96));
|
||||
}
|
||||
|
||||
qreal QWinRTScreen::scaleFactor() const
|
||||
diff --git a/src/plugins/platforms/xcb/qxcbscreen.cpp b/src/plugins/platforms/xcb/qxcbscreen.cpp
|
||||
index a967593..d8facdb 100644
|
||||
--- a/src/plugins/platforms/xcb/qxcbscreen.cpp
|
||||
+++ b/src/plugins/platforms/xcb/qxcbscreen.cpp
|
||||
@@ -631,7 +631,7 @@ void QXcbScreen::updateGeometry(const QRect &geom, uint8_t rotation)
|
||||
m_sizeMillimeters = sizeInMillimeters(xGeometry.size(), virtualDpi());
|
||||
|
||||
qreal dpi = xGeometry.width() / physicalSize().width() * qreal(25.4);
|
||||
- m_pixelDensity = qRound(dpi/96);
|
||||
+ m_pixelDensity = qMax(1, qRound(dpi/96));
|
||||
m_geometry = QRect(xGeometry.topLeft(), xGeometry.size());
|
||||
m_availableGeometry = xGeometry & m_virtualDesktop->workArea();
|
||||
QWindowSystemInterface::handleScreenGeometryChange(QPlatformScreen::screen(), m_geometry, m_availableGeometry);
|
||||
--
|
||||
2.9.3
|
||||
|
|
@ -13,6 +13,7 @@
|
|||
%_qt5_libdir %{_libdir}
|
||||
%_qt5_libexecdir %{_qt5_archdatadir}/libexec
|
||||
%_qt5_plugindir %{_qt5_archdatadir}/plugins
|
||||
%_qt5_qmldir %{_qt5_archdatadir}/qml
|
||||
%_qt5_qmake %{_qt5_bindir}/qmake
|
||||
%_qt5_settingsdir %{_sysconfdir}/xdg
|
||||
%_qt5_sysconfdir %{_qt5_settingsdir}
|
||||
|
|
|
@ -0,0 +1,48 @@
|
|||
diff -up qtbase-opensource-src-5.6.2/src/plugins/platforms/eglfs/qeglfsdeviceintegration.cpp.0295 qtbase-opensource-src-5.6.2/src/plugins/platforms/eglfs/qeglfsdeviceintegration.cpp
|
||||
--- qtbase-opensource-src-5.6.2/src/plugins/platforms/eglfs/qeglfsdeviceintegration.cpp.0295 2017-02-13 12:58:54.062341106 -0600
|
||||
+++ qtbase-opensource-src-5.6.2/src/plugins/platforms/eglfs/qeglfsdeviceintegration.cpp 2017-02-13 13:00:13.318163725 -0600
|
||||
@@ -224,7 +224,7 @@ QDpi QEGLDeviceIntegration::logicalDpi()
|
||||
|
||||
qreal QEGLDeviceIntegration::pixelDensity() const
|
||||
{
|
||||
- return qRound(logicalDpi().first / qreal(100));
|
||||
+ return qMax(1, qRound(logicalDpi().first / qreal(100)));
|
||||
}
|
||||
|
||||
Qt::ScreenOrientation QEGLDeviceIntegration::nativeOrientation() const
|
||||
diff -up qtbase-opensource-src-5.6.2/src/plugins/platforms/windows/qwindowsscreen.cpp.0295 qtbase-opensource-src-5.6.2/src/plugins/platforms/windows/qwindowsscreen.cpp
|
||||
--- qtbase-opensource-src-5.6.2/src/plugins/platforms/windows/qwindowsscreen.cpp.0295 2016-09-16 00:49:42.000000000 -0500
|
||||
+++ qtbase-opensource-src-5.6.2/src/plugins/platforms/windows/qwindowsscreen.cpp 2017-02-13 12:58:54.063341117 -0600
|
||||
@@ -258,7 +258,7 @@ qreal QWindowsScreen::pixelDensity() con
|
||||
// the pixel density since it is reflects the Windows UI scaling.
|
||||
// High DPI auto scaling should be disabled when the user chooses
|
||||
// small fonts on a High DPI monitor, resulting in lower logical DPI.
|
||||
- return qRound(logicalDpi().first / 96);
|
||||
+ return qMax(1, qRound(logicalDpi().first / 96));
|
||||
}
|
||||
|
||||
/*!
|
||||
diff -up qtbase-opensource-src-5.6.2/src/plugins/platforms/winrt/qwinrtscreen.cpp.0295 qtbase-opensource-src-5.6.2/src/plugins/platforms/winrt/qwinrtscreen.cpp
|
||||
--- qtbase-opensource-src-5.6.2/src/plugins/platforms/winrt/qwinrtscreen.cpp.0295 2016-09-16 00:49:42.000000000 -0500
|
||||
+++ qtbase-opensource-src-5.6.2/src/plugins/platforms/winrt/qwinrtscreen.cpp 2017-02-13 12:58:54.063341117 -0600
|
||||
@@ -641,7 +641,7 @@ QDpi QWinRTScreen::logicalDpi() const
|
||||
qreal QWinRTScreen::pixelDensity() const
|
||||
{
|
||||
Q_D(const QWinRTScreen);
|
||||
- return qRound(d->logicalDpi / 96);
|
||||
+ return qMax(1, qRound(d->logicalDpi / 96));
|
||||
}
|
||||
|
||||
qreal QWinRTScreen::scaleFactor() const
|
||||
diff -up qtbase-opensource-src-5.6.2/src/plugins/platforms/xcb/qxcbscreen.cpp.0295 qtbase-opensource-src-5.6.2/src/plugins/platforms/xcb/qxcbscreen.cpp
|
||||
--- qtbase-opensource-src-5.6.2/src/plugins/platforms/xcb/qxcbscreen.cpp.0295 2016-09-16 00:49:42.000000000 -0500
|
||||
+++ qtbase-opensource-src-5.6.2/src/plugins/platforms/xcb/qxcbscreen.cpp 2017-02-13 12:58:54.063341117 -0600
|
||||
@@ -565,7 +565,7 @@ void QXcbScreen::updateGeometry(const QR
|
||||
m_sizeMillimeters = sizeInMillimeters(xGeometry.size(), virtualDpi());
|
||||
|
||||
qreal dpi = xGeometry.width() / physicalSize().width() * qreal(25.4);
|
||||
- m_pixelDensity = qRound(dpi/96);
|
||||
+ m_pixelDensity = qMax(1, qRound(dpi/96));
|
||||
m_geometry = QRect(xGeometry.topLeft(), xGeometry.size());
|
||||
m_availableGeometry = xGeometry & m_virtualDesktop->workArea();
|
||||
QWindowSystemInterface::handleScreenGeometryChange(QPlatformScreen::screen(), m_geometry, m_availableGeometry);
|
|
@ -55,7 +55,7 @@ BuildRequires: pkgconfig(libsystemd)
|
|||
Summary: Qt5 - QtBase components
|
||||
Name: qt5-qtbase
|
||||
Version: 5.6.2
|
||||
Release: 2%{?dist}
|
||||
Release: 3%{?dist}
|
||||
|
||||
# See LGPL_EXCEPTIONS.txt, for exception details
|
||||
License: LGPLv2 with exceptions or GPLv3 with exceptions
|
||||
|
@ -81,6 +81,11 @@ Patch4: qtbase-opensource-src-5.6.2-QTBUG-35459.patch
|
|||
|
||||
# upstreamable patches
|
||||
|
||||
# 1381828 - Broken window scaling for some QT5 applications (#1381828)
|
||||
# This patch moves the threshold for 2x scaling from the DPI of 144 to 192,
|
||||
# the same value GNOME uses. It's not a complete solution...
|
||||
Patch51: qtbase-hidpi_scale_at_192.patch
|
||||
|
||||
# Workaround moc/multilib issues
|
||||
# https://bugzilla.redhat.com/show_bug.cgi?id=1290020
|
||||
# https://bugreports.qt.io/browse/QTBUG-49972
|
||||
|
@ -97,6 +102,20 @@ Patch60: qtbase-opensource-src-5.6.2-moc_system_defines.patch
|
|||
Patch61: qt5-qtbase-cxxflag.patch
|
||||
|
||||
## upstream patches
|
||||
Patch19: 0019-xcb-Don-t-send-Qt-WindowNoState-event-when-hiding-mi.patch
|
||||
Patch32: 0032-XCB-Drop-from-external-app-fix-keyboard-modifier-sta.patch
|
||||
Patch36: 0036-xcb-Use-the-state-of-the-key-event-to-process-it.patch
|
||||
Patch84: 0084-xcb-Treat-bitmap-cursors-differently-from-shaped-cur.patch
|
||||
Patch98: 0098-Plug-QMimeData-leaks-in-QXcbClipboard.patch
|
||||
Patch145: 0145-QXcbShmImage-don-t-use-shmget-s-return-unless-it-suc.patch
|
||||
Patch177: 0177-xcb-fix-passing-of-focus-from-child-to-its-top-level.patch
|
||||
Patch190: 0190-qxcbconnection.cpp-fix-warning-about-unused-function.patch
|
||||
Patch237: 0237-Stop-unloading-plugins-in-QPluginLoader-and-QFactory.patch
|
||||
Patch263: 0263-xcb-Warn-and-bail-out-when-even-the-basic-dummy-cont.patch
|
||||
Patch276: 0276-QClipboard-Fix-emitting-changed-in-XCB.patch
|
||||
|
||||
## upstream patches (5.8 branch)
|
||||
Patch500: qt5-qtbase-5.8-QTBUG-56140.patch
|
||||
|
||||
# macros, be mindful to keep sync'd with macros.qt5
|
||||
Source10: macros.qt5
|
||||
|
@ -356,8 +375,27 @@ RPM macros for building Qt5 packages.
|
|||
%prep
|
||||
%setup -q -n %{qt_module}-opensource-src-%{version}%{?prerelease:-%{prerelease}}
|
||||
|
||||
## upstream patches
|
||||
%patch19 -p1 -b .0019
|
||||
%patch32 -p1 -b .0032
|
||||
%patch36 -p1 -b .0036
|
||||
%patch84 -p1 -b .0084
|
||||
%patch98 -p1 -b .0098
|
||||
%patch145 -p1 -b .0145
|
||||
%patch177 -p1 -b .0177
|
||||
%patch190 -p1 -b .0190
|
||||
%patch237 -p1 -b .0237
|
||||
%patch263 -p1 -b .0263
|
||||
%patch276 -p1 -b .0276
|
||||
|
||||
## upstream patches (5.8)
|
||||
%patch500 -p1 -b .QTBUG-56140
|
||||
|
||||
## downstream patches
|
||||
|
||||
%patch4 -p1 -b .QTBUG-35459
|
||||
|
||||
%patch51 -p1 -b .hidpi_scale_at_192
|
||||
%patch52 -p1 -b .moc_WORDSIZE
|
||||
%patch54 -p1 -b .arm
|
||||
%patch60 -p1 -b .moc_system_defines
|
||||
|
@ -960,6 +998,11 @@ fi
|
|||
|
||||
|
||||
%changelog
|
||||
* Mon Feb 13 2017 Rex Dieter <rdieter@fedoraproject.org> - 5.6.2-3
|
||||
- macros.qt5: +%%_qt5_qmldir macro
|
||||
- pull in xcb-related upstream fixes
|
||||
- backport hidpi-related patches from f25 branch
|
||||
|
||||
* Wed Dec 07 2016 Rex Dieter <rdieter@fedoraproject.org> - 5.6.2-2
|
||||
- BR: perl-generators
|
||||
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
diff -up qtbase-opensource-src-5.7.1/src/plugins/platforms/xcb/qxcbscreen.cpp.hidpi_scale_at_192 qtbase-opensource-src-5.7.1/src/plugins/platforms/xcb/qxcbscreen.cpp
|
||||
--- qtbase-opensource-src-5.7.1/src/plugins/platforms/xcb/qxcbscreen.cpp.hidpi_scale_at_192 2017-02-09 07:47:26.060096259 -0600
|
||||
+++ qtbase-opensource-src-5.7.1/src/plugins/platforms/xcb/qxcbscreen.cpp 2017-02-09 07:48:11.497567447 -0600
|
||||
@@ -633,7 +633,7 @@ void QXcbScreen::updateGeometry(const QR
|
||||
m_sizeMillimeters = sizeInMillimeters(xGeometry.size(), virtualDpi());
|
||||
|
||||
qreal dpi = xGeometry.width() / physicalSize().width() * qreal(25.4);
|
||||
- m_pixelDensity = qMax(1, qRound(dpi/96));
|
||||
+ m_pixelDensity = qMax(1, (int) (dpi/96)); // instead of rounding at 1.5, round at 2.0 (same as GNOME)
|
||||
m_geometry = QRect(xGeometry.topLeft(), xGeometry.size());
|
||||
m_availableGeometry = xGeometry & m_virtualDesktop->workArea();
|
||||
QWindowSystemInterface::handleScreenGeometryChange(QPlatformScreen::screen(), m_geometry, m_availableGeometry);
|
Loading…
Reference in New Issue