Merge remote-tracking branch 'origin/5.9' into 5.10
Conflicts: src/plugins/platforms/cocoa/qcocoamenu.mm Change-Id: I11c5f8466c5b51e13e5ef6a8fc6e3f2dd79122a7
This commit is contained in:
commit
3061730c2a
303
src/3rdparty/angle/src/libANGLE/Debug2.cpp
vendored
303
src/3rdparty/angle/src/libANGLE/Debug2.cpp
vendored
@ -1,303 +0,0 @@
|
||||
//
|
||||
// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
// Debug.cpp: Defines debug state used for GL_KHR_debug
|
||||
|
||||
#include "libANGLE/Debug.h"
|
||||
|
||||
#include "common/debug.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <tuple>
|
||||
|
||||
namespace gl
|
||||
{
|
||||
|
||||
Debug::Debug()
|
||||
: mOutputEnabled(false),
|
||||
mCallbackFunction(nullptr),
|
||||
mCallbackUserParam(nullptr),
|
||||
mMessages(),
|
||||
mMaxLoggedMessages(0),
|
||||
mOutputSynchronous(false),
|
||||
mGroups()
|
||||
{
|
||||
pushDefaultGroup();
|
||||
}
|
||||
|
||||
void Debug::setMaxLoggedMessages(GLuint maxLoggedMessages)
|
||||
{
|
||||
mMaxLoggedMessages = maxLoggedMessages;
|
||||
}
|
||||
|
||||
void Debug::setOutputEnabled(bool enabled)
|
||||
{
|
||||
mOutputEnabled = enabled;
|
||||
}
|
||||
|
||||
bool Debug::isOutputEnabled() const
|
||||
{
|
||||
return mOutputEnabled;
|
||||
}
|
||||
|
||||
void Debug::setOutputSynchronous(bool synchronous)
|
||||
{
|
||||
mOutputSynchronous = synchronous;
|
||||
}
|
||||
|
||||
bool Debug::isOutputSynchronous() const
|
||||
{
|
||||
return mOutputSynchronous;
|
||||
}
|
||||
|
||||
void Debug::setCallback(GLDEBUGPROCKHR callback, const void *userParam)
|
||||
{
|
||||
mCallbackFunction = callback;
|
||||
mCallbackUserParam = userParam;
|
||||
}
|
||||
|
||||
GLDEBUGPROCKHR Debug::getCallback() const
|
||||
{
|
||||
return mCallbackFunction;
|
||||
}
|
||||
|
||||
const void *Debug::getUserParam() const
|
||||
{
|
||||
return mCallbackUserParam;
|
||||
}
|
||||
|
||||
void Debug::insertMessage(GLenum source,
|
||||
GLenum type,
|
||||
GLuint id,
|
||||
GLenum severity,
|
||||
const std::string &message)
|
||||
{
|
||||
std::string messageCopy(message);
|
||||
insertMessage(source, type, id, severity, std::move(messageCopy));
|
||||
}
|
||||
|
||||
void Debug::insertMessage(GLenum source,
|
||||
GLenum type,
|
||||
GLuint id,
|
||||
GLenum severity,
|
||||
std::string &&message)
|
||||
{
|
||||
if (!isMessageEnabled(source, type, id, severity))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (mCallbackFunction != nullptr)
|
||||
{
|
||||
// TODO(geofflang) Check the synchronous flag and potentially flush messages from another
|
||||
// thread.
|
||||
mCallbackFunction(source, type, id, severity, static_cast<GLsizei>(message.length()),
|
||||
message.c_str(), mCallbackUserParam);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (mMessages.size() >= mMaxLoggedMessages)
|
||||
{
|
||||
// Drop messages over the limit
|
||||
return;
|
||||
}
|
||||
|
||||
Message m;
|
||||
m.source = source;
|
||||
m.type = type;
|
||||
m.id = id;
|
||||
m.severity = severity;
|
||||
m.message = std::move(message);
|
||||
|
||||
mMessages.push_back(std::move(m));
|
||||
}
|
||||
}
|
||||
|
||||
size_t Debug::getMessages(GLuint count,
|
||||
GLsizei bufSize,
|
||||
GLenum *sources,
|
||||
GLenum *types,
|
||||
GLuint *ids,
|
||||
GLenum *severities,
|
||||
GLsizei *lengths,
|
||||
GLchar *messageLog)
|
||||
{
|
||||
size_t messageCount = 0;
|
||||
size_t messageStringIndex = 0;
|
||||
while (messageCount <= count && !mMessages.empty())
|
||||
{
|
||||
const Message &m = mMessages.front();
|
||||
|
||||
if (messageLog != nullptr)
|
||||
{
|
||||
// Check that this message can fit in the message buffer
|
||||
if (messageStringIndex + m.message.length() + 1 > static_cast<size_t>(bufSize))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
std::copy(m.message.begin(), m.message.end(), messageLog + messageStringIndex);
|
||||
messageStringIndex += m.message.length();
|
||||
|
||||
messageLog[messageStringIndex] = '\0';
|
||||
messageStringIndex += 1;
|
||||
}
|
||||
|
||||
if (sources != nullptr)
|
||||
{
|
||||
sources[messageCount] = m.source;
|
||||
}
|
||||
|
||||
if (types != nullptr)
|
||||
{
|
||||
types[messageCount] = m.type;
|
||||
}
|
||||
|
||||
if (ids != nullptr)
|
||||
{
|
||||
ids[messageCount] = m.id;
|
||||
}
|
||||
|
||||
if (severities != nullptr)
|
||||
{
|
||||
severities[messageCount] = m.severity;
|
||||
}
|
||||
|
||||
if (lengths != nullptr)
|
||||
{
|
||||
lengths[messageCount] = static_cast<GLsizei>(m.message.length());
|
||||
}
|
||||
|
||||
mMessages.pop_front();
|
||||
|
||||
messageCount++;
|
||||
}
|
||||
|
||||
return messageCount;
|
||||
}
|
||||
|
||||
size_t Debug::getNextMessageLength() const
|
||||
{
|
||||
return mMessages.empty() ? 0 : mMessages.front().message.length();
|
||||
}
|
||||
|
||||
size_t Debug::getMessageCount() const
|
||||
{
|
||||
return mMessages.size();
|
||||
}
|
||||
|
||||
void Debug::setMessageControl(GLenum source,
|
||||
GLenum type,
|
||||
GLenum severity,
|
||||
std::vector<GLuint> &&ids,
|
||||
bool enabled)
|
||||
{
|
||||
Control c;
|
||||
c.source = source;
|
||||
c.type = type;
|
||||
c.severity = severity;
|
||||
c.ids = std::move(ids);
|
||||
c.enabled = enabled;
|
||||
|
||||
auto &controls = mGroups.back().controls;
|
||||
controls.push_back(std::move(c));
|
||||
}
|
||||
|
||||
void Debug::pushGroup(GLenum source, GLuint id, std::string &&message)
|
||||
{
|
||||
insertMessage(source, GL_DEBUG_TYPE_PUSH_GROUP, id, GL_DEBUG_SEVERITY_NOTIFICATION,
|
||||
std::string(message));
|
||||
|
||||
Group g;
|
||||
g.source = source;
|
||||
g.id = id;
|
||||
g.message = std::move(message);
|
||||
mGroups.push_back(std::move(g));
|
||||
}
|
||||
|
||||
void Debug::popGroup()
|
||||
{
|
||||
// Make sure the default group is not about to be popped
|
||||
ASSERT(mGroups.size() > 1);
|
||||
|
||||
Group g = mGroups.back();
|
||||
mGroups.pop_back();
|
||||
|
||||
insertMessage(g.source, GL_DEBUG_TYPE_POP_GROUP, g.id, GL_DEBUG_SEVERITY_NOTIFICATION,
|
||||
g.message);
|
||||
}
|
||||
|
||||
size_t Debug::getGroupStackDepth() const
|
||||
{
|
||||
return mGroups.size();
|
||||
}
|
||||
|
||||
bool Debug::isMessageEnabled(GLenum source, GLenum type, GLuint id, GLenum severity) const
|
||||
{
|
||||
if (!mOutputEnabled)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
for (auto groupIter = mGroups.rbegin(); groupIter != mGroups.rend(); groupIter++)
|
||||
{
|
||||
const auto &controls = groupIter->controls;
|
||||
for (auto controlIter = controls.rbegin(); controlIter != controls.rend(); controlIter++)
|
||||
{
|
||||
const auto &control = *controlIter;
|
||||
|
||||
if (control.source != GL_DONT_CARE && control.source != source)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (control.type != GL_DONT_CARE && control.type != type)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (control.severity != GL_DONT_CARE && control.severity != severity)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!control.ids.empty() &&
|
||||
std::find(control.ids.begin(), control.ids.end(), id) == control.ids.end())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
return control.enabled;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void Debug::pushDefaultGroup()
|
||||
{
|
||||
Group g;
|
||||
g.source = GL_NONE;
|
||||
g.id = 0;
|
||||
g.message = "";
|
||||
|
||||
Control c0;
|
||||
c0.source = GL_DONT_CARE;
|
||||
c0.type = GL_DONT_CARE;
|
||||
c0.severity = GL_DONT_CARE;
|
||||
c0.enabled = true;
|
||||
g.controls.push_back(std::move(c0));
|
||||
|
||||
Control c1;
|
||||
c1.source = GL_DONT_CARE;
|
||||
c1.type = GL_DONT_CARE;
|
||||
c1.severity = GL_DEBUG_SEVERITY_LOW;
|
||||
c1.enabled = false;
|
||||
g.controls.push_back(std::move(c1));
|
||||
|
||||
mGroups.push_back(std::move(g));
|
||||
}
|
||||
} // namespace gl
|
120
src/3rdparty/angle/src/libANGLE/Debug2.h
vendored
120
src/3rdparty/angle/src/libANGLE/Debug2.h
vendored
@ -1,120 +0,0 @@
|
||||
//
|
||||
// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
// Debug.h: Defines debug state used for GL_KHR_debug
|
||||
|
||||
#ifndef LIBANGLE_DEBUG_H_
|
||||
#define LIBANGLE_DEBUG_H_
|
||||
|
||||
#include "angle_gl.h"
|
||||
#include "common/angleutils.h"
|
||||
|
||||
#include <deque>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
namespace gl
|
||||
{
|
||||
|
||||
class LabeledObject
|
||||
{
|
||||
public:
|
||||
virtual ~LabeledObject() {}
|
||||
virtual void setLabel(const std::string &label) = 0;
|
||||
virtual const std::string &getLabel() const = 0;
|
||||
};
|
||||
|
||||
class Debug : angle::NonCopyable
|
||||
{
|
||||
public:
|
||||
Debug();
|
||||
|
||||
void setMaxLoggedMessages(GLuint maxLoggedMessages);
|
||||
|
||||
void setOutputEnabled(bool enabled);
|
||||
bool isOutputEnabled() const;
|
||||
|
||||
void setOutputSynchronous(bool synchronous);
|
||||
bool isOutputSynchronous() const;
|
||||
|
||||
void setCallback(GLDEBUGPROCKHR callback, const void *userParam);
|
||||
GLDEBUGPROCKHR getCallback() const;
|
||||
const void *getUserParam() const;
|
||||
|
||||
void insertMessage(GLenum source,
|
||||
GLenum type,
|
||||
GLuint id,
|
||||
GLenum severity,
|
||||
const std::string &message);
|
||||
void insertMessage(GLenum source,
|
||||
GLenum type,
|
||||
GLuint id,
|
||||
GLenum severity,
|
||||
std::string &&message);
|
||||
|
||||
void setMessageControl(GLenum source,
|
||||
GLenum type,
|
||||
GLenum severity,
|
||||
std::vector<GLuint> &&ids,
|
||||
bool enabled);
|
||||
size_t getMessages(GLuint count,
|
||||
GLsizei bufSize,
|
||||
GLenum *sources,
|
||||
GLenum *types,
|
||||
GLuint *ids,
|
||||
GLenum *severities,
|
||||
GLsizei *lengths,
|
||||
GLchar *messageLog);
|
||||
size_t getNextMessageLength() const;
|
||||
size_t getMessageCount() const;
|
||||
|
||||
void pushGroup(GLenum source, GLuint id, std::string &&message);
|
||||
void popGroup();
|
||||
size_t getGroupStackDepth() const;
|
||||
|
||||
private:
|
||||
bool isMessageEnabled(GLenum source, GLenum type, GLuint id, GLenum severity) const;
|
||||
|
||||
void pushDefaultGroup();
|
||||
|
||||
struct Message
|
||||
{
|
||||
GLenum source;
|
||||
GLenum type;
|
||||
GLuint id;
|
||||
GLenum severity;
|
||||
std::string message;
|
||||
};
|
||||
|
||||
struct Control
|
||||
{
|
||||
GLenum source;
|
||||
GLenum type;
|
||||
GLenum severity;
|
||||
std::vector<GLuint> ids;
|
||||
bool enabled;
|
||||
};
|
||||
|
||||
struct Group
|
||||
{
|
||||
GLenum source;
|
||||
GLuint id;
|
||||
std::string message;
|
||||
|
||||
std::vector<Control> controls;
|
||||
};
|
||||
|
||||
bool mOutputEnabled;
|
||||
GLDEBUGPROCKHR mCallbackFunction;
|
||||
const void *mCallbackUserParam;
|
||||
std::deque<Message> mMessages;
|
||||
GLuint mMaxLoggedMessages;
|
||||
bool mOutputSynchronous;
|
||||
std::vector<Group> mGroups;
|
||||
};
|
||||
} // namespace gl
|
||||
|
||||
#endif // LIBANGLE_DEBUG_H_
|
@ -1,4 +1,4 @@
|
||||
CONFIG += simd no_batch
|
||||
CONFIG += simd no_batch object_parallel_to_source
|
||||
include(common.pri)
|
||||
|
||||
INCLUDEPATH += $$OUT_PWD/.. $$ANGLE_DIR/src/libANGLE
|
||||
@ -48,6 +48,7 @@ HEADERS += \
|
||||
$$ANGLE_DIR/src/libANGLE/Constants.h \
|
||||
$$ANGLE_DIR/src/libANGLE/Context.h \
|
||||
$$ANGLE_DIR/src/libANGLE/Data.h \
|
||||
$$ANGLE_DIR/src/libANGLE/Debug.h \
|
||||
$$ANGLE_DIR/src/libANGLE/Device.h \
|
||||
$$ANGLE_DIR/src/libANGLE/Display.h \
|
||||
$$ANGLE_DIR/src/libANGLE/Error.h \
|
||||
@ -169,6 +170,7 @@ SOURCES += \
|
||||
$$ANGLE_DIR/src/libANGLE/Config.cpp \
|
||||
$$ANGLE_DIR/src/libANGLE/Context.cpp \
|
||||
$$ANGLE_DIR/src/libANGLE/Data.cpp \
|
||||
$$ANGLE_DIR/src/libANGLE/Debug.cpp \
|
||||
$$ANGLE_DIR/src/libANGLE/Device.cpp \
|
||||
$$ANGLE_DIR/src/libANGLE/Display.cpp \
|
||||
$$ANGLE_DIR/src/libANGLE/Error.cpp \
|
||||
@ -241,14 +243,6 @@ SOURCES += \
|
||||
|
||||
SSE2_SOURCES += $$ANGLE_DIR/src/libANGLE/renderer/d3d/loadimageSSE2.cpp
|
||||
|
||||
DEBUG_SOURCE = $$ANGLE_DIR/src/libANGLE/Debug.cpp
|
||||
debug_copy.input = DEBUG_SOURCE
|
||||
debug_copy.output = $$ANGLE_DIR/src/libANGLE/Debug2.cpp
|
||||
debug_copy.commands = $$QMAKE_COPY ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT}
|
||||
debug_copy.variable_out = GENERATED_SOURCES
|
||||
debug_copy.CONFIG = target_predeps
|
||||
QMAKE_EXTRA_COMPILERS += debug_copy
|
||||
|
||||
angle_d3d11 {
|
||||
HEADERS += \
|
||||
$$ANGLE_DIR/src/libANGLE/renderer/d3d/d3d11/Blit11.h \
|
||||
|
@ -318,7 +318,8 @@ QJsonArray QJsonArray::fromVariantList(const QVariantList &list)
|
||||
array.a->tableOffset = currentOffset;
|
||||
if (!array.detach2(sizeof(QJsonPrivate::offset)*values.size()))
|
||||
return QJsonArray();
|
||||
memcpy(array.a->table(), values.constData(), values.size()*sizeof(uint));
|
||||
memcpy(static_cast<void *>(array.a->table()),
|
||||
static_cast<const void *>(values.constData()), values.size()*sizeof(uint));
|
||||
array.a->length = values.size();
|
||||
array.a->size = currentOffset + sizeof(QJsonPrivate::offset)*values.size();
|
||||
|
||||
|
@ -76,7 +76,8 @@ struct QPodArrayOps
|
||||
Q_ASSERT(b < e);
|
||||
Q_ASSERT(size_t(e - b) <= this->alloc - uint(this->size));
|
||||
|
||||
::memcpy(this->end(), b, (e - b) * sizeof(T));
|
||||
::memcpy(static_cast<void *>(this->end()), static_cast<const void *>(b),
|
||||
(e - b) * sizeof(T));
|
||||
this->size += e - b;
|
||||
}
|
||||
|
||||
|
@ -341,7 +341,7 @@ Q_OUTOFLINE_TEMPLATE void QVarLengthArray<T, Prealloc>::append(const T *abuf, in
|
||||
while (s < asize)
|
||||
new (ptr+(s++)) T(*abuf++);
|
||||
} else {
|
||||
memcpy(&ptr[s], abuf, increment * sizeof(T));
|
||||
memcpy(static_cast<void *>(&ptr[s]), static_cast<const void *>(abuf), increment * sizeof(T));
|
||||
s = asize;
|
||||
}
|
||||
}
|
||||
@ -389,7 +389,7 @@ Q_OUTOFLINE_TEMPLATE void QVarLengthArray<T, Prealloc>::realloc(int asize, int a
|
||||
QT_RETHROW;
|
||||
}
|
||||
} else {
|
||||
memcpy(ptr, oldPtr, copySize * sizeof(T));
|
||||
memcpy(static_cast<void *>(ptr), static_cast<const void *>(oldPtr), copySize * sizeof(T));
|
||||
}
|
||||
}
|
||||
s = copySize;
|
||||
|
@ -651,7 +651,8 @@ public:
|
||||
inline void reserve(int extraCapacity) {
|
||||
if (tos + extraCapacity + 1 > cap) {
|
||||
cap = qMax(tos + extraCapacity + 1, cap << 1 );
|
||||
data = reinterpret_cast<T *>(realloc(data, cap * sizeof(T)));
|
||||
void *ptr = realloc(static_cast<void *>(data), cap * sizeof(T));
|
||||
data = reinterpret_cast<T *>(ptr);
|
||||
Q_CHECK_PTR(data);
|
||||
}
|
||||
}
|
||||
|
@ -993,9 +993,7 @@ int QFontEngineFT::loadFlags(QGlyphSet *set, GlyphFormat format, int flags,
|
||||
static inline bool areMetricsTooLarge(const QFontEngineFT::GlyphInfo &info)
|
||||
{
|
||||
// false if exceeds QFontEngineFT::Glyph metrics
|
||||
return (short)(info.linearAdvance) != info.linearAdvance
|
||||
|| (uchar)(info.width) != info.width
|
||||
|| (uchar)(info.height) != info.height;
|
||||
return info.width > 0xFF || info.height > 0xFF;
|
||||
}
|
||||
|
||||
static inline void transformBoundingBox(int *left, int *top, int *right, int *bottom, FT_Matrix *matrix)
|
||||
|
@ -133,7 +133,7 @@ public:
|
||||
/* we don't cache glyphs that are too large anyway, so we can make this struct rather small */
|
||||
struct Glyph {
|
||||
~Glyph();
|
||||
short linearAdvance;
|
||||
int linearAdvance : 22;
|
||||
unsigned char width;
|
||||
unsigned char height;
|
||||
short x;
|
||||
|
@ -46,9 +46,11 @@
|
||||
#include <QtCore/private/qthread_p.h>
|
||||
#include <QtGui/private/qguiapplication_p.h>
|
||||
#include "qcocoaapplication.h"
|
||||
#include "qcocoaintegration.h"
|
||||
#include "qcocoamenuloader.h"
|
||||
#include "qcocoamenubar.h"
|
||||
#include "qcocoawindow.h"
|
||||
#include "qcocoascreen.h"
|
||||
#import "qnsview.h"
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
@ -584,8 +586,9 @@ void QCocoaMenu::showPopup(const QWindow *parentWindow, const QRect &targetRect,
|
||||
[popupCell setMenu:m_nativeMenu];
|
||||
[popupCell selectItem:nsItem];
|
||||
|
||||
int availableHeight = screen->availableSize().height();
|
||||
const QPoint &globalPos = parentWindow->mapToGlobal(pos);
|
||||
QCocoaScreen *cocoaScreen = static_cast<QCocoaScreen *>(screen->handle());
|
||||
int availableHeight = cocoaScreen->availableGeometry().height();
|
||||
const QPoint &globalPos = cocoaWindow->mapToGlobal(pos);
|
||||
int menuHeight = m_nativeMenu.size.height;
|
||||
if (globalPos.y() + menuHeight > availableHeight) {
|
||||
// Maybe we need to fix the vertical popup position but we don't know the
|
||||
|
@ -2535,7 +2535,7 @@ void QWindowsWindow::setCustomMargins(const QMargins &newCustomMargins)
|
||||
newFrame.moveTo(topLeft);
|
||||
qCDebug(lcQpaWindows) << __FUNCTION__ << oldCustomMargins << "->" << newCustomMargins
|
||||
<< currentFrameGeometry << "->" << newFrame;
|
||||
SetWindowPos(m_data.hwnd, 0, newFrame.x(), newFrame.y(), newFrame.width(), newFrame.height(), SWP_NOZORDER | SWP_FRAMECHANGED);
|
||||
SetWindowPos(m_data.hwnd, 0, newFrame.x(), newFrame.y(), newFrame.width(), newFrame.height(), SWP_NOZORDER | SWP_FRAMECHANGED | SWP_NOACTIVATE);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2114,7 +2114,7 @@ bool QXcbWindow::isEmbedded() const
|
||||
QPoint QXcbWindow::mapToGlobal(const QPoint &pos) const
|
||||
{
|
||||
if (!m_embedded)
|
||||
return pos;
|
||||
return QPlatformWindow::mapToGlobal(pos);
|
||||
|
||||
QPoint ret;
|
||||
auto reply = Q_XCB_REPLY(xcb_translate_coordinates, xcb_connection(),
|
||||
@ -2131,7 +2131,7 @@ QPoint QXcbWindow::mapToGlobal(const QPoint &pos) const
|
||||
QPoint QXcbWindow::mapFromGlobal(const QPoint &pos) const
|
||||
{
|
||||
if (!m_embedded)
|
||||
return pos;
|
||||
return QPlatformWindow::mapFromGlobal(pos);
|
||||
|
||||
QPoint ret;
|
||||
auto reply = Q_XCB_REPLY(xcb_translate_coordinates, xcb_connection(),
|
||||
|
@ -41,6 +41,7 @@
|
||||
|
||||
#include <QtGui/qwindow.h>
|
||||
#include <QtGui/qpa/qplatformtheme.h>
|
||||
#include <QtGui/qpa/qplatformwindow.h>
|
||||
|
||||
#undef signals
|
||||
#include <gtk/gtk.h>
|
||||
@ -426,9 +427,11 @@ void QGtk3Menu::showPopup(const QWindow *parentWindow, const QRect &targetRect,
|
||||
if (index != -1)
|
||||
gtk_menu_set_active(GTK_MENU(m_menu), index);
|
||||
|
||||
m_targetPos = targetRect.bottomLeft();
|
||||
if (parentWindow)
|
||||
m_targetPos = parentWindow->mapToGlobal(m_targetPos);
|
||||
m_targetPos = QPoint(targetRect.x(), targetRect.y() + targetRect.height());
|
||||
|
||||
QPlatformWindow *pw = parentWindow ? parentWindow->handle() : nullptr;
|
||||
if (pw)
|
||||
m_targetPos = pw->mapToGlobal(m_targetPos);
|
||||
|
||||
gtk_menu_popup(GTK_MENU(m_menu), NULL, NULL, qt_gtk_menu_position_func, this, 0, gtk_get_current_event_time());
|
||||
}
|
||||
|
@ -67,6 +67,7 @@
|
||||
#include <qabstractproxymodel.h>
|
||||
#include <qstylehints.h>
|
||||
#include <private/qguiapplication_p.h>
|
||||
#include <private/qhighdpiscaling_p.h>
|
||||
#include <private/qapplication_p.h>
|
||||
#include <private/qcombobox_p.h>
|
||||
#include <private/qabstractitemmodel_p.h>
|
||||
@ -2582,7 +2583,8 @@ bool QComboBoxPrivate::showNativePopup()
|
||||
else if (q->testAttribute(Qt::WA_MacMiniSize))
|
||||
offset = QPoint(-2, 6);
|
||||
|
||||
m_platformMenu->showPopup(tlw, QRect(tlw->mapFromGlobal(q->mapToGlobal(offset)), QSize()), currentItem);
|
||||
const QRect targetRect = QRect(tlw->mapFromGlobal(q->mapToGlobal(offset)), QSize());
|
||||
m_platformMenu->showPopup(tlw, QHighDpi::toNativePixels(targetRect, tlw), currentItem);
|
||||
|
||||
#ifdef Q_OS_OSX
|
||||
// The Cocoa popup will swallow any mouse release event.
|
||||
|
Loading…
Reference in New Issue
Block a user