Merge remote-tracking branch 'origin/5.11' into dev
Change-Id: I01dfc41e18333ac55954296cef8f01475adab27e
This commit is contained in:
commit
efb46ea7cc
@ -214,8 +214,7 @@
|
|||||||
"compile": [ "verifyspec" ],
|
"compile": [ "verifyspec" ],
|
||||||
"detectPkgConfig": [ "cross_compile", "machineTuple" ],
|
"detectPkgConfig": [ "cross_compile", "machineTuple" ],
|
||||||
"library": [ "pkg-config" ],
|
"library": [ "pkg-config" ],
|
||||||
"getPkgConfigVariable": [ "pkg-config" ],
|
"getPkgConfigVariable": [ "pkg-config" ]
|
||||||
"subarch": [ "architecture" ]
|
|
||||||
},
|
},
|
||||||
|
|
||||||
"testTypeAliases": {
|
"testTypeAliases": {
|
||||||
@ -451,21 +450,6 @@
|
|||||||
"type": "x86SimdAlways",
|
"type": "x86SimdAlways",
|
||||||
"test": "x86_simd"
|
"test": "x86_simd"
|
||||||
},
|
},
|
||||||
"mips_dsp": {
|
|
||||||
"label": "MIPS DSP instructions",
|
|
||||||
"type": "subarch",
|
|
||||||
"subarch": "dsp"
|
|
||||||
},
|
|
||||||
"mips_dspr2": {
|
|
||||||
"label": "MIPS DSPr2 instructions",
|
|
||||||
"type": "subarch",
|
|
||||||
"subarch": "dspr2"
|
|
||||||
},
|
|
||||||
"neon": {
|
|
||||||
"label": "NEON instructions",
|
|
||||||
"type": "subarch",
|
|
||||||
"subarch": "neon"
|
|
||||||
},
|
|
||||||
"posix_fallocate": {
|
"posix_fallocate": {
|
||||||
"label": "POSIX fallocate()",
|
"label": "POSIX fallocate()",
|
||||||
"type": "compile",
|
"type": "compile",
|
||||||
@ -1015,7 +999,7 @@
|
|||||||
},
|
},
|
||||||
"mips_dsp": {
|
"mips_dsp": {
|
||||||
"label": "DSP",
|
"label": "DSP",
|
||||||
"condition": "arch.mips && tests.mips_dsp",
|
"condition": "arch.mips && subarch.dsp",
|
||||||
"output": [
|
"output": [
|
||||||
"privateConfig",
|
"privateConfig",
|
||||||
{ "type": "define", "name": "QT_COMPILER_SUPPORTS_MIPS_DSP", "value": 1 }
|
{ "type": "define", "name": "QT_COMPILER_SUPPORTS_MIPS_DSP", "value": 1 }
|
||||||
@ -1023,7 +1007,7 @@
|
|||||||
},
|
},
|
||||||
"mips_dspr2": {
|
"mips_dspr2": {
|
||||||
"label": "DSPr2",
|
"label": "DSPr2",
|
||||||
"condition": "arch.mips && tests.mips_dspr2",
|
"condition": "arch.mips && subarch.dspr2",
|
||||||
"output": [
|
"output": [
|
||||||
"privateConfig",
|
"privateConfig",
|
||||||
{ "type": "define", "name": "QT_COMPILER_SUPPORTS_MIPS_DSPR2", "value": 1 }
|
{ "type": "define", "name": "QT_COMPILER_SUPPORTS_MIPS_DSPR2", "value": 1 }
|
||||||
@ -1031,7 +1015,7 @@
|
|||||||
},
|
},
|
||||||
"neon": {
|
"neon": {
|
||||||
"label": "NEON",
|
"label": "NEON",
|
||||||
"condition": "(arch.arm || arch.arm64) && tests.neon",
|
"condition": "(arch.arm || arch.arm64) && subarch.neon",
|
||||||
"output": [
|
"output": [
|
||||||
"privateConfig",
|
"privateConfig",
|
||||||
{ "type": "define", "name": "QT_COMPILER_SUPPORTS_NEON", "value": 1 }
|
{ "type": "define", "name": "QT_COMPILER_SUPPORTS_NEON", "value": 1 }
|
||||||
|
@ -366,12 +366,6 @@ defineTest(qtConfTest_detectPkgConfig) {
|
|||||||
return(true)
|
return(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
defineTest(qtConfTest_subarch) {
|
|
||||||
subarch = $$eval($${1}.subarch)
|
|
||||||
contains($${currentConfig}.tests.architecture.subarch, $${subarch}): return(true)
|
|
||||||
return(false)
|
|
||||||
}
|
|
||||||
|
|
||||||
defineTest(qtConfTest_buildParts) {
|
defineTest(qtConfTest_buildParts) {
|
||||||
parts = $$config.input.make
|
parts = $$config.input.make
|
||||||
isEmpty(parts) {
|
isEmpty(parts) {
|
||||||
@ -914,6 +908,7 @@ defineTest(qtConfOutput_sanitizer) {
|
|||||||
|
|
||||||
defineTest(qtConfOutput_architecture) {
|
defineTest(qtConfOutput_architecture) {
|
||||||
arch = $$qtConfEvaluate("tests.architecture.arch")
|
arch = $$qtConfEvaluate("tests.architecture.arch")
|
||||||
|
subarch = $$qtConfEvaluate('tests.architecture.subarch')
|
||||||
buildabi = $$qtConfEvaluate("tests.architecture.buildabi")
|
buildabi = $$qtConfEvaluate("tests.architecture.buildabi")
|
||||||
|
|
||||||
$$qtConfEvaluate("features.cross_compile") {
|
$$qtConfEvaluate("features.cross_compile") {
|
||||||
@ -924,7 +919,7 @@ defineTest(qtConfOutput_architecture) {
|
|||||||
"host_build {" \
|
"host_build {" \
|
||||||
" QT_CPU_FEATURES.$$host_arch = $$qtConfEvaluate('tests.host_architecture.subarch')" \
|
" QT_CPU_FEATURES.$$host_arch = $$qtConfEvaluate('tests.host_architecture.subarch')" \
|
||||||
"} else {" \
|
"} else {" \
|
||||||
" QT_CPU_FEATURES.$$arch = $$qtConfEvaluate('tests.architecture.subarch')" \
|
" QT_CPU_FEATURES.$$arch = $$subarch" \
|
||||||
"}"
|
"}"
|
||||||
publicPro = \
|
publicPro = \
|
||||||
"host_build {" \
|
"host_build {" \
|
||||||
@ -939,7 +934,7 @@ defineTest(qtConfOutput_architecture) {
|
|||||||
|
|
||||||
} else {
|
} else {
|
||||||
privatePro = \
|
privatePro = \
|
||||||
"QT_CPU_FEATURES.$$arch = $$qtConfEvaluate('tests.architecture.subarch')"
|
"QT_CPU_FEATURES.$$arch = $$subarch"
|
||||||
publicPro = \
|
publicPro = \
|
||||||
"QT_ARCH = $$arch" \
|
"QT_ARCH = $$arch" \
|
||||||
"QT_BUILDABI = $$buildabi"
|
"QT_BUILDABI = $$buildabi"
|
||||||
@ -950,9 +945,11 @@ defineTest(qtConfOutput_architecture) {
|
|||||||
$${currentConfig}.output.privatePro += $$privatePro
|
$${currentConfig}.output.privatePro += $$privatePro
|
||||||
export($${currentConfig}.output.privatePro)
|
export($${currentConfig}.output.privatePro)
|
||||||
|
|
||||||
# setup QT_ARCH variable used by qtConfEvaluate
|
# setup QT_ARCH and QT_CPU_FEATURES variables used by qtConfEvaluate
|
||||||
QT_ARCH = $$arch
|
QT_ARCH = $$arch
|
||||||
export(QT_ARCH)
|
export(QT_ARCH)
|
||||||
|
QT_CPU_FEATURES.$$arch = $$subarch
|
||||||
|
export(QT_CPU_FEATURES.$$arch)
|
||||||
}
|
}
|
||||||
|
|
||||||
defineTest(qtConfOutput_qreal) {
|
defineTest(qtConfOutput_qreal) {
|
||||||
|
@ -1270,6 +1270,12 @@ defineReplace(qtConfEvaluateSingleExpression) {
|
|||||||
isEmpty(QT_ARCH): \
|
isEmpty(QT_ARCH): \
|
||||||
qtConfCheckFeature(architecture)
|
qtConfCheckFeature(architecture)
|
||||||
contains(QT_ARCH, $$var): result = true
|
contains(QT_ARCH, $$var): result = true
|
||||||
|
} else: contains(e, "^subarch\..*") {
|
||||||
|
var = $$replace(e, "^subarch\.", "")
|
||||||
|
result = false
|
||||||
|
isEmpty(QT_ARCH): \
|
||||||
|
qtConfCheckFeature(architecture)
|
||||||
|
contains(QT_CPU_FEATURES.$$QT_ARCH, $$var): result = true
|
||||||
} else: contains(e, "^input\..*") {
|
} else: contains(e, "^input\..*") {
|
||||||
result = $$eval(config.$$e)
|
result = $$eval(config.$$e)
|
||||||
} else: contains(e, "^var\..*") {
|
} else: contains(e, "^var\..*") {
|
||||||
|
@ -12,7 +12,8 @@ QMAKE_CC = clang-cl
|
|||||||
QMAKE_CXX = $$QMAKE_CC
|
QMAKE_CXX = $$QMAKE_CC
|
||||||
|
|
||||||
QMAKE_CFLAGS += -Wno-microsoft-enum-value
|
QMAKE_CFLAGS += -Wno-microsoft-enum-value
|
||||||
QMAKE_CXXFLAGS = $$QMAKE_CFLAGS
|
|
||||||
|
QMAKE_CXXFLAGS += -Wno-microsoft-enum-value
|
||||||
|
|
||||||
# Precompiled headers are not supported yet by clang
|
# Precompiled headers are not supported yet by clang
|
||||||
CONFIG -= precompile_header
|
CONFIG -= precompile_header
|
||||||
|
@ -16,7 +16,7 @@ QMAKE_CFLAGS += -fno-keep-inline-dllexport
|
|||||||
QMAKE_CFLAGS_WARN_ON += -Wextra
|
QMAKE_CFLAGS_WARN_ON += -Wextra
|
||||||
|
|
||||||
QMAKE_CXX = $${CROSS_COMPILE}g++
|
QMAKE_CXX = $${CROSS_COMPILE}g++
|
||||||
QMAKE_CXXFLAGS = $$QMAKE_CFLAGS
|
QMAKE_CXXFLAGS += -fno-keep-inline-dllexport
|
||||||
QMAKE_CXXFLAGS_WARN_ON = $$QMAKE_CFLAGS_WARN_ON
|
QMAKE_CXXFLAGS_WARN_ON = $$QMAKE_CFLAGS_WARN_ON
|
||||||
|
|
||||||
QMAKE_LINK = $${CROSS_COMPILE}g++
|
QMAKE_LINK = $${CROSS_COMPILE}g++
|
||||||
|
@ -16,9 +16,9 @@ QMAKE_COMPILER += intel_icl
|
|||||||
QMAKE_CFLAGS_OPTIMIZE_FULL = -O3
|
QMAKE_CFLAGS_OPTIMIZE_FULL = -O3
|
||||||
|
|
||||||
QMAKE_CC = icl
|
QMAKE_CC = icl
|
||||||
QMAKE_CFLAGS = -nologo -Zc:wchar_t -Qprec -Zm200 -Qdiag-disable:1744,1738,809,3373
|
QMAKE_CFLAGS += -Qprec -Zm200
|
||||||
QMAKE_CFLAGS_WARN_ON = -W3 -Qdiag-disable:673
|
QMAKE_CFLAGS_WARN_ON = -W3 -Qdiag-disable:673,809,1738,1744,3373
|
||||||
QMAKE_CFLAGS_WARN_OFF = -W0 -Qdiag-disable:673
|
QMAKE_CFLAGS_WARN_OFF = -W0
|
||||||
QMAKE_CFLAGS_DEBUG = $$QMAKE_CFLAGS_OPTIMIZE_DEBUG -Zi -MDd
|
QMAKE_CFLAGS_DEBUG = $$QMAKE_CFLAGS_OPTIMIZE_DEBUG -Zi -MDd
|
||||||
QMAKE_CFLAGS_UTF8_SOURCE = -Qoption,cpp,--unicode_source_kind,UTF-8
|
QMAKE_CFLAGS_UTF8_SOURCE = -Qoption,cpp,--unicode_source_kind,UTF-8
|
||||||
QMAKE_CFLAGS_LTCG = -Qipo
|
QMAKE_CFLAGS_LTCG = -Qipo
|
||||||
@ -43,7 +43,7 @@ QMAKE_CFLAGS_AESNI = -QxSSE2
|
|||||||
QMAKE_CFLAGS_SHANI = -QxSSE4.2
|
QMAKE_CFLAGS_SHANI = -QxSSE4.2
|
||||||
|
|
||||||
QMAKE_CXX = $$QMAKE_CC
|
QMAKE_CXX = $$QMAKE_CC
|
||||||
QMAKE_CXXFLAGS = $$QMAKE_CFLAGS /Zc:forScope
|
QMAKE_CXXFLAGS += -Qprec -Zm200 -Zc:forScope
|
||||||
QMAKE_CXXFLAGS_WARN_ON = $$QMAKE_CFLAGS_WARN_ON
|
QMAKE_CXXFLAGS_WARN_ON = $$QMAKE_CFLAGS_WARN_ON
|
||||||
QMAKE_CXXFLAGS_WARN_OFF = $$QMAKE_CFLAGS_WARN_OFF
|
QMAKE_CXXFLAGS_WARN_OFF = $$QMAKE_CFLAGS_WARN_OFF
|
||||||
QMAKE_CXXFLAGS_CXX11 = -Qstd=c++11
|
QMAKE_CXXFLAGS_CXX11 = -Qstd=c++11
|
||||||
|
@ -5,4 +5,9 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
include(../common/msvc-desktop.conf)
|
include(../common/msvc-desktop.conf)
|
||||||
|
|
||||||
|
QMAKE_CFLAGS +=
|
||||||
|
|
||||||
|
QMAKE_CXXFLAGS +=
|
||||||
|
|
||||||
load(qt_config)
|
load(qt_config)
|
||||||
|
@ -85,6 +85,9 @@
|
|||||||
<signal name="NewOverlayIcon">
|
<signal name="NewOverlayIcon">
|
||||||
</signal>
|
</signal>
|
||||||
|
|
||||||
|
<signal name="NewMenu">
|
||||||
|
</signal>
|
||||||
|
|
||||||
<signal name="NewToolTip">
|
<signal name="NewToolTip">
|
||||||
</signal>
|
</signal>
|
||||||
|
|
||||||
|
@ -446,12 +446,13 @@ Qt::KeyboardModifiers QPlatformIntegration::queryKeyboardModifiers() const
|
|||||||
|
|
||||||
/*!
|
/*!
|
||||||
Should be used to obtain a list of possible shortcuts for the given key
|
Should be used to obtain a list of possible shortcuts for the given key
|
||||||
event. As that needs system functionality it cannot be done in qkeymapper.
|
event. Shortcuts should be encoded as int(Qt::Key + Qt::KeyboardModifiers).
|
||||||
|
|
||||||
One example for more than 1 possibility is the key combination of Shift+5.
|
One example for more than one possibility is the key combination of Shift+5.
|
||||||
That one might trigger a shortcut which is set as "Shift+5" as well as one
|
That one might trigger a shortcut which is set as "Shift+5" as well as one
|
||||||
using %. These combinations depend on the currently set keyboard layout
|
using %. These combinations depend on the currently set keyboard layout.
|
||||||
which cannot be obtained by Qt functionality.
|
|
||||||
|
\note This function should be called only from key event handlers.
|
||||||
*/
|
*/
|
||||||
QList<int> QPlatformIntegration::possibleKeys(const QKeyEvent *) const
|
QList<int> QPlatformIntegration::possibleKeys(const QKeyEvent *) const
|
||||||
{
|
{
|
||||||
|
@ -126,6 +126,7 @@ QDBusTrayIcon::QDBusTrayIcon()
|
|||||||
connect(this, SIGNAL(tooltipChanged()), m_adaptor, SIGNAL(NewToolTip()));
|
connect(this, SIGNAL(tooltipChanged()), m_adaptor, SIGNAL(NewToolTip()));
|
||||||
connect(this, SIGNAL(iconChanged()), m_adaptor, SIGNAL(NewIcon()));
|
connect(this, SIGNAL(iconChanged()), m_adaptor, SIGNAL(NewIcon()));
|
||||||
connect(this, SIGNAL(attention()), m_adaptor, SIGNAL(NewAttentionIcon()));
|
connect(this, SIGNAL(attention()), m_adaptor, SIGNAL(NewAttentionIcon()));
|
||||||
|
connect(this, SIGNAL(menuChanged()), m_adaptor, SIGNAL(NewMenu()));
|
||||||
connect(this, SIGNAL(attention()), m_adaptor, SIGNAL(NewTitle()));
|
connect(this, SIGNAL(attention()), m_adaptor, SIGNAL(NewTitle()));
|
||||||
connect(&m_attentionTimer, SIGNAL(timeout()), this, SLOT(attentionTimerExpired()));
|
connect(&m_attentionTimer, SIGNAL(timeout()), this, SLOT(attentionTimerExpired()));
|
||||||
m_attentionTimer.setSingleShot(true);
|
m_attentionTimer.setSingleShot(true);
|
||||||
@ -268,6 +269,7 @@ void QDBusTrayIcon::updateMenu(QPlatformMenu * menu)
|
|||||||
connect(m_menu, SIGNAL(updated(uint,int)),
|
connect(m_menu, SIGNAL(updated(uint,int)),
|
||||||
m_menuAdaptor, SIGNAL(LayoutUpdated(uint,int)));
|
m_menuAdaptor, SIGNAL(LayoutUpdated(uint,int)));
|
||||||
dBusConnection()->registerTrayIconMenu(this);
|
dBusConnection()->registerTrayIconMenu(this);
|
||||||
|
emit menuChanged();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -129,6 +129,7 @@ class QStatusNotifierItemAdaptor: public QDBusAbstractAdaptor
|
|||||||
" <signal name=\"NewIcon\"/>\n"
|
" <signal name=\"NewIcon\"/>\n"
|
||||||
" <signal name=\"NewAttentionIcon\"/>\n"
|
" <signal name=\"NewAttentionIcon\"/>\n"
|
||||||
" <signal name=\"NewOverlayIcon\"/>\n"
|
" <signal name=\"NewOverlayIcon\"/>\n"
|
||||||
|
" <signal name=\"NewMenu\"/>\n"
|
||||||
" <signal name=\"NewToolTip\"/>\n"
|
" <signal name=\"NewToolTip\"/>\n"
|
||||||
" <signal name=\"NewStatus\">\n"
|
" <signal name=\"NewStatus\">\n"
|
||||||
" <arg type=\"s\" name=\"status\"/>\n"
|
" <arg type=\"s\" name=\"status\"/>\n"
|
||||||
@ -191,6 +192,7 @@ Q_SIGNALS: // SIGNALS
|
|||||||
void NewAttentionIcon();
|
void NewAttentionIcon();
|
||||||
void NewIcon();
|
void NewIcon();
|
||||||
void NewOverlayIcon();
|
void NewOverlayIcon();
|
||||||
|
void NewMenu();
|
||||||
void NewStatus(const QString &status);
|
void NewStatus(const QString &status);
|
||||||
void NewTitle();
|
void NewTitle();
|
||||||
void NewToolTip();
|
void NewToolTip();
|
||||||
|
@ -233,25 +233,28 @@ QPixmap QCocoaScreen::grabWindow(WId window, int x, int y, int width, int height
|
|||||||
windowSize.setHeight(windowRect.height());
|
windowSize.setHeight(windowRect.height());
|
||||||
}
|
}
|
||||||
|
|
||||||
QPixmap windowPixmap(windowSize * devicePixelRatio());
|
const qreal dpr = devicePixelRatio();
|
||||||
|
QPixmap windowPixmap(windowSize * dpr);
|
||||||
windowPixmap.fill(Qt::transparent);
|
windowPixmap.fill(Qt::transparent);
|
||||||
|
|
||||||
for (uint i = 0; i < displayCount; ++i) {
|
for (uint i = 0; i < displayCount; ++i) {
|
||||||
const CGRect bounds = CGDisplayBounds(displays[i]);
|
const CGRect bounds = CGDisplayBounds(displays[i]);
|
||||||
int w = (width < 0 ? bounds.size.width : width) * devicePixelRatio();
|
|
||||||
int h = (height < 0 ? bounds.size.height : height) * devicePixelRatio();
|
|
||||||
QRect displayRect = QRect(x, y, w, h);
|
|
||||||
displayRect = displayRect.translated(qRound(-bounds.origin.x), qRound(-bounds.origin.y));
|
|
||||||
QCFType<CGImageRef> image = CGDisplayCreateImageForRect(displays[i],
|
|
||||||
CGRectMake(displayRect.x(), displayRect.y(), displayRect.width(), displayRect.height()));
|
|
||||||
QPixmap pix(w, h);
|
|
||||||
pix.fill(Qt::transparent);
|
|
||||||
CGRect rect = CGRectMake(0, 0, w, h);
|
|
||||||
QMacCGContext ctx(&pix);
|
|
||||||
qt_mac_drawCGImage(ctx, &rect, image);
|
|
||||||
|
|
||||||
|
// Calculate the position and size of the requested area
|
||||||
|
QPoint pos(qAbs(bounds.origin.x - x), qAbs(bounds.origin.y - y));
|
||||||
|
QSize size(qMin(pos.x() + width, qRound(bounds.size.width)),
|
||||||
|
qMin(pos.y() + height, qRound(bounds.size.height)));
|
||||||
|
pos *= dpr;
|
||||||
|
size *= dpr;
|
||||||
|
|
||||||
|
// Take the whole screen and crop it afterwards, because CGDisplayCreateImageForRect
|
||||||
|
// has a strange behavior when mixing highDPI and non-highDPI displays
|
||||||
|
QCFType<CGImageRef> cgImage = CGDisplayCreateImage(displays[i]);
|
||||||
|
const QImage image = qt_mac_toQImage(cgImage);
|
||||||
|
|
||||||
|
// Draw into windowPixmap only the requested size
|
||||||
QPainter painter(&windowPixmap);
|
QPainter painter(&windowPixmap);
|
||||||
painter.drawPixmap(0, 0, pix);
|
painter.drawImage(windowPixmap.rect(), image, QRect(pos, size));
|
||||||
}
|
}
|
||||||
return windowPixmap;
|
return windowPixmap;
|
||||||
}
|
}
|
||||||
|
@ -112,6 +112,7 @@ Q_LOGGING_CATEGORY(lcQpaScreen, "qt.qpa.screen")
|
|||||||
Q_LOGGING_CATEGORY(lcQpaEvents, "qt.qpa.events")
|
Q_LOGGING_CATEGORY(lcQpaEvents, "qt.qpa.events")
|
||||||
Q_LOGGING_CATEGORY(lcQpaXcb, "qt.qpa.xcb") // for general (uncategorized) XCB logging
|
Q_LOGGING_CATEGORY(lcQpaXcb, "qt.qpa.xcb") // for general (uncategorized) XCB logging
|
||||||
Q_LOGGING_CATEGORY(lcQpaPeeker, "qt.qpa.peeker")
|
Q_LOGGING_CATEGORY(lcQpaPeeker, "qt.qpa.peeker")
|
||||||
|
Q_LOGGING_CATEGORY(lcQpaKeyboard, "qt.qpa.xkeyboard")
|
||||||
|
|
||||||
// this event type was added in libxcb 1.10,
|
// this event type was added in libxcb 1.10,
|
||||||
// but we support also older version
|
// but we support also older version
|
||||||
|
@ -92,6 +92,7 @@ Q_DECLARE_LOGGING_CATEGORY(lcQpaScreen)
|
|||||||
Q_DECLARE_LOGGING_CATEGORY(lcQpaEvents)
|
Q_DECLARE_LOGGING_CATEGORY(lcQpaEvents)
|
||||||
Q_DECLARE_LOGGING_CATEGORY(lcQpaXcb)
|
Q_DECLARE_LOGGING_CATEGORY(lcQpaXcb)
|
||||||
Q_DECLARE_LOGGING_CATEGORY(lcQpaPeeker)
|
Q_DECLARE_LOGGING_CATEGORY(lcQpaPeeker)
|
||||||
|
Q_DECLARE_LOGGING_CATEGORY(lcQpaKeyboard)
|
||||||
|
|
||||||
class QXcbVirtualDesktop;
|
class QXcbVirtualDesktop;
|
||||||
class QXcbScreen;
|
class QXcbScreen;
|
||||||
|
@ -1267,27 +1267,32 @@ static bool isLatin(xkb_keysym_t sym)
|
|||||||
return ((sym >= 'a' && sym <= 'z') || (sym >= 'A' && sym <= 'Z'));
|
return ((sym >= 'a' && sym <= 'z') || (sym >= 'A' && sym <= 'Z'));
|
||||||
}
|
}
|
||||||
|
|
||||||
void QXcbKeyboard::checkForLatinLayout()
|
void QXcbKeyboard::checkForLatinLayout() const
|
||||||
{
|
{
|
||||||
m_hasLatinLayout = false;
|
|
||||||
const xkb_layout_index_t layoutCount = xkb_keymap_num_layouts(xkb_keymap);
|
const xkb_layout_index_t layoutCount = xkb_keymap_num_layouts(xkb_keymap);
|
||||||
const xcb_keycode_t minKeycode = connection()->setup()->min_keycode;
|
const xcb_keycode_t minKeycode = connection()->setup()->min_keycode;
|
||||||
const xcb_keycode_t maxKeycode = connection()->setup()->max_keycode;
|
const xcb_keycode_t maxKeycode = connection()->setup()->max_keycode;
|
||||||
struct xkb_state *kb_state = xkb_state_new(xkb_keymap);
|
|
||||||
|
ScopedXKBState state(xkb_state_new(xkb_keymap));
|
||||||
for (xkb_layout_index_t layout = 0; layout < layoutCount; ++layout) {
|
for (xkb_layout_index_t layout = 0; layout < layoutCount; ++layout) {
|
||||||
xkb_state_update_mask(kb_state, 0, 0, 0, 0, 0, layout);
|
xkb_state_update_mask(state.get(), 0, 0, 0, 0, 0, layout);
|
||||||
for (xcb_keycode_t code = minKeycode; code < maxKeycode; ++code) {
|
for (xcb_keycode_t code = minKeycode; code < maxKeycode; ++code) {
|
||||||
xkb_keysym_t sym = xkb_state_key_get_one_sym(kb_state, code);
|
xkb_keysym_t sym = xkb_state_key_get_one_sym(state.get(), code);
|
||||||
// if layout can produce any of these latin letters (chosen
|
// if layout can produce any of these latin letters (chosen
|
||||||
// arbitrarily) then it must be a latin key based layout
|
// arbitrarily) then it must be a latin key based layout
|
||||||
if (sym == XK_q || sym == XK_a || sym == XK_e) {
|
if (sym == XK_q || sym == XK_a || sym == XK_e)
|
||||||
m_hasLatinLayout = true;
|
|
||||||
xkb_state_unref(kb_state);
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
xkb_state_unref(kb_state);
|
// This means that lookupLatinKeysym() will not find anything and latin
|
||||||
|
// key shortcuts might not work. This is a bug in the affected desktop
|
||||||
|
// environment. Usually can be solved via system settings by adding e.g. 'us'
|
||||||
|
// layout to the list of seleced layouts, or by using command line, "setxkbmap
|
||||||
|
// -layout rus,en". The position of latin key based layout in the list of the
|
||||||
|
// selected layouts is irrelevant. Properly functioning desktop environments
|
||||||
|
// handle this behind the scenes, even if no latin key based layout has been
|
||||||
|
// explicitly listed in the selected layouts.
|
||||||
|
qCWarning(lcQpaKeyboard, "no keyboard layouts with latin keys present");
|
||||||
}
|
}
|
||||||
|
|
||||||
xkb_keysym_t QXcbKeyboard::lookupLatinKeysym(xkb_keycode_t keycode) const
|
xkb_keysym_t QXcbKeyboard::lookupLatinKeysym(xkb_keycode_t keycode) const
|
||||||
@ -1310,39 +1315,13 @@ xkb_keysym_t QXcbKeyboard::lookupLatinKeysym(xkb_keycode_t keycode) const
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// If user layouts don't contain any layout that results in a latin key, we query a
|
|
||||||
// key from "US" layout, this allows for latin-key-based shorcuts to work even when
|
|
||||||
// users have only one (non-latin) layout set.
|
|
||||||
// But don't do this if using keymap obtained through the core protocol, as the key
|
|
||||||
// codes may not match up with those expected by the XKB keymap.
|
|
||||||
xkb_mod_mask_t latchedMods = xkb_state_serialize_mods(xkb_state, XKB_STATE_MODS_LATCHED);
|
|
||||||
xkb_mod_mask_t lockedMods = xkb_state_serialize_mods(xkb_state, XKB_STATE_MODS_LOCKED);
|
|
||||||
if (sym == XKB_KEY_NoSymbol && !m_hasLatinLayout && !m_keymap_is_core) {
|
|
||||||
if (!latin_keymap) {
|
|
||||||
const struct xkb_rule_names names = { xkb_names.rules, xkb_names.model, "us", 0, 0 };
|
|
||||||
latin_keymap = xkb_keymap_new_from_names(xkb_context, &names, (xkb_keymap_compile_flags)0);
|
|
||||||
static bool printFailure = true;
|
|
||||||
if (!latin_keymap && printFailure) {
|
|
||||||
// print message about failure to compile US keymap only once,
|
|
||||||
// no need to do this on every key press.
|
|
||||||
printFailure = false;
|
|
||||||
printKeymapError("Qt: Failed to compile US keymap, shortcut handling with "
|
|
||||||
"non-Latin keyboard layouts may not be fully functional!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (latin_keymap) {
|
|
||||||
struct xkb_state *latin_state = xkb_state_new(latin_keymap);
|
|
||||||
if (latin_state) {
|
|
||||||
xkb_state_update_mask(latin_state, 0, latchedMods, lockedMods, 0, 0, 0);
|
|
||||||
sym = xkb_state_key_get_one_sym(latin_state, keycode);
|
|
||||||
xkb_state_unref(latin_state);
|
|
||||||
} else {
|
|
||||||
qWarning("QXcbKeyboard: failed to create a state for US keymap!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (sym == XKB_KEY_NoSymbol)
|
if (sym == XKB_KEY_NoSymbol)
|
||||||
return sym;
|
return sym;
|
||||||
|
|
||||||
|
xkb_mod_mask_t latchedMods = xkb_state_serialize_mods(xkb_state, XKB_STATE_MODS_LATCHED);
|
||||||
|
xkb_mod_mask_t lockedMods = xkb_state_serialize_mods(xkb_state, XKB_STATE_MODS_LOCKED);
|
||||||
|
|
||||||
// Check for uniqueness, consider the following setup:
|
// Check for uniqueness, consider the following setup:
|
||||||
// setxkbmap -layout us,ru,us -variant dvorak,, -option 'grp:ctrl_alt_toggle' (set 'ru' as active).
|
// setxkbmap -layout us,ru,us -variant dvorak,, -option 'grp:ctrl_alt_toggle' (set 'ru' as active).
|
||||||
// In this setup, the user would expect to trigger a ctrl+q shortcut by pressing ctrl+<physical x key>,
|
// In this setup, the user would expect to trigger a ctrl+q shortcut by pressing ctrl+<physical x key>,
|
||||||
@ -1353,18 +1332,18 @@ xkb_keysym_t QXcbKeyboard::lookupLatinKeysym(xkb_keycode_t keycode) const
|
|||||||
// generate the same shortcut event in this case.
|
// generate the same shortcut event in this case.
|
||||||
const xcb_keycode_t minKeycode = connection()->setup()->min_keycode;
|
const xcb_keycode_t minKeycode = connection()->setup()->min_keycode;
|
||||||
const xcb_keycode_t maxKeycode = connection()->setup()->max_keycode;
|
const xcb_keycode_t maxKeycode = connection()->setup()->max_keycode;
|
||||||
struct xkb_state *kb_state = xkb_state_new(xkb_keymap);
|
ScopedXKBState state(xkb_state_new(xkb_keymap));
|
||||||
for (xkb_layout_index_t prevLayout = 0; prevLayout < layout; ++prevLayout) {
|
for (xkb_layout_index_t prevLayout = 0; prevLayout < layout; ++prevLayout) {
|
||||||
xkb_state_update_mask(kb_state, 0, latchedMods, lockedMods, 0, 0, prevLayout);
|
xkb_state_update_mask(state.get(), 0, latchedMods, lockedMods, 0, 0, prevLayout);
|
||||||
for (xcb_keycode_t code = minKeycode; code < maxKeycode; ++code) {
|
for (xcb_keycode_t code = minKeycode; code < maxKeycode; ++code) {
|
||||||
xkb_keysym_t prevSym = xkb_state_key_get_one_sym(kb_state, code);
|
xkb_keysym_t prevSym = xkb_state_key_get_one_sym(state.get(), code);
|
||||||
if (prevSym == sym) {
|
if (prevSym == sym) {
|
||||||
sym = XKB_KEY_NoSymbol;
|
sym = XKB_KEY_NoSymbol;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
xkb_state_unref(kb_state);
|
|
||||||
return sym;
|
return sym;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1563,7 +1542,6 @@ QXcbKeyboard::~QXcbKeyboard()
|
|||||||
xkb_state_unref(xkb_state);
|
xkb_state_unref(xkb_state);
|
||||||
xkb_keymap_unref(xkb_keymap);
|
xkb_keymap_unref(xkb_keymap);
|
||||||
xkb_context_unref(xkb_context);
|
xkb_context_unref(xkb_context);
|
||||||
xkb_keymap_unref(latin_keymap);
|
|
||||||
if (!connection()->hasXKB())
|
if (!connection()->hasXKB())
|
||||||
xcb_key_symbols_free(m_key_symbols);
|
xcb_key_symbols_free(m_key_symbols);
|
||||||
clearXKBConfig();
|
clearXKBConfig();
|
||||||
|
@ -106,7 +106,7 @@ protected:
|
|||||||
void updateVModToRModMapping();
|
void updateVModToRModMapping();
|
||||||
|
|
||||||
xkb_keysym_t lookupLatinKeysym(xkb_keycode_t keycode) const;
|
xkb_keysym_t lookupLatinKeysym(xkb_keycode_t keycode) const;
|
||||||
void checkForLatinLayout();
|
void checkForLatinLayout() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void updateXKBStateFromState(struct xkb_state *kb_state, quint16 state);
|
void updateXKBStateFromState(struct xkb_state *kb_state, quint16 state);
|
||||||
@ -119,7 +119,6 @@ private:
|
|||||||
struct xkb_keymap *xkb_keymap = nullptr;
|
struct xkb_keymap *xkb_keymap = nullptr;
|
||||||
struct xkb_state *xkb_state = nullptr;
|
struct xkb_state *xkb_state = nullptr;
|
||||||
struct xkb_rule_names xkb_names;
|
struct xkb_rule_names xkb_names;
|
||||||
mutable struct xkb_keymap *latin_keymap = nullptr;
|
|
||||||
|
|
||||||
struct _mod_masks {
|
struct _mod_masks {
|
||||||
uint alt;
|
uint alt;
|
||||||
@ -149,7 +148,11 @@ private:
|
|||||||
_mod_masks vmod_masks;
|
_mod_masks vmod_masks;
|
||||||
int core_device_id;
|
int core_device_id;
|
||||||
#endif
|
#endif
|
||||||
bool m_hasLatinLayout = false;
|
|
||||||
|
struct XKBStateDeleter {
|
||||||
|
void operator()(struct xkb_state *state) const { return xkb_state_unref(state); }
|
||||||
|
};
|
||||||
|
using ScopedXKBState = std::unique_ptr<struct xkb_state, XKBStateDeleter>;
|
||||||
};
|
};
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
@ -411,6 +411,9 @@ static void qt_gtk_menu_position_func(GtkMenu *, gint *x, gint *y, gboolean *pus
|
|||||||
{
|
{
|
||||||
QGtk3Menu *menu = static_cast<QGtk3Menu *>(data);
|
QGtk3Menu *menu = static_cast<QGtk3Menu *>(data);
|
||||||
QPoint targetPos = menu->targetPos();
|
QPoint targetPos = menu->targetPos();
|
||||||
|
#if GTK_CHECK_VERSION(3, 10, 0)
|
||||||
|
targetPos /= gtk_widget_get_scale_factor(menu->handle());
|
||||||
|
#endif
|
||||||
*x = targetPos.x();
|
*x = targetPos.x();
|
||||||
*y = targetPos.y();
|
*y = targetPos.y();
|
||||||
*push_in = true;
|
*push_in = true;
|
||||||
|
@ -817,19 +817,21 @@ QSqlRecord QPSQLResult::record() const
|
|||||||
else
|
else
|
||||||
f.setName(QString::fromLocal8Bit(PQfname(d->result, i)));
|
f.setName(QString::fromLocal8Bit(PQfname(d->result, i)));
|
||||||
const int tableOid = PQftable(d->result, i);
|
const int tableOid = PQftable(d->result, i);
|
||||||
auto &tableName = d->drv_d_func()->oidToTable[tableOid];
|
|
||||||
// WARNING: We cannot execute any other SQL queries on
|
// WARNING: We cannot execute any other SQL queries on
|
||||||
// the same db connection while forward-only mode is active
|
// the same db connection while forward-only mode is active
|
||||||
// (this would discard all results of forward-only query).
|
// (this would discard all results of forward-only query).
|
||||||
// So we just skip this...
|
// So we just skip this...
|
||||||
if (tableName.isEmpty() && !isForwardOnly()) {
|
if (tableOid != InvalidOid && !isForwardOnly()) {
|
||||||
QSqlQuery qry(driver()->createResult());
|
auto &tableName = d->drv_d_func()->oidToTable[tableOid];
|
||||||
if (qry.exec(QStringLiteral("SELECT relname FROM pg_class WHERE pg_class.oid = %1")
|
if (tableName.isEmpty()) {
|
||||||
.arg(tableOid)) && qry.next()) {
|
QSqlQuery qry(driver()->createResult());
|
||||||
tableName = qry.value(0).toString();
|
if (qry.exec(QStringLiteral("SELECT relname FROM pg_class WHERE pg_class.oid = %1")
|
||||||
|
.arg(tableOid)) && qry.next()) {
|
||||||
|
tableName = qry.value(0).toString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
f.setTableName(tableName);
|
||||||
}
|
}
|
||||||
f.setTableName(tableName);
|
|
||||||
int ptype = PQftype(d->result, i);
|
int ptype = PQftype(d->result, i);
|
||||||
f.setType(qDecodePSQLType(ptype));
|
f.setType(qDecodePSQLType(ptype));
|
||||||
int len = PQfsize(d->result, i);
|
int len = PQfsize(d->result, i);
|
||||||
|
6
src/testlib/3rdparty/qt_attribution.json
vendored
6
src/testlib/3rdparty/qt_attribution.json
vendored
@ -32,12 +32,12 @@ Copyright (c) 2003, 2006 Massachusetts Institute of Technology"
|
|||||||
"Id": "linuxperf",
|
"Id": "linuxperf",
|
||||||
"Name": "Linux Performance Events",
|
"Name": "Linux Performance Events",
|
||||||
"QDocModule": "qttestlib",
|
"QDocModule": "qttestlib",
|
||||||
"QtUsage": "Used on Linux and Android in the Qt Test module.",
|
"QtUsage": "Used on Linux and Android in the Qt Test module. Note that this is a copy of the respective Linux header, and the clarifications of the Linux Syscall Note apply.",
|
||||||
"Files": "linux_perf_event_p.h",
|
"Files": "linux_perf_event_p.h",
|
||||||
|
|
||||||
"Description": "Allows access to the Linux kernel's performance events.",
|
"Description": "Allows access to the Linux kernel's performance events.",
|
||||||
"License": "GNU General Public License v2.0 only",
|
"License": "GNU General Public License v2.0 only with Linux Syscall Note",
|
||||||
"LicenseId": "GPL-2.0",
|
"LicenseId": "GPL-2.0 WITH Linux-syscall-note",
|
||||||
"LicenseFile": "LINUX_LICENSE.txt",
|
"LicenseFile": "LINUX_LICENSE.txt",
|
||||||
"Copyright": "Copyright (C) 2008-2009, Thomas Gleixner <tglx@linutronix.de>
|
"Copyright": "Copyright (C) 2008-2009, Thomas Gleixner <tglx@linutronix.de>
|
||||||
Copyright (C) 2008-2011, Red Hat, Inc., Ingo Molnar
|
Copyright (C) 2008-2011, Red Hat, Inc., Ingo Molnar
|
||||||
|
@ -21,8 +21,9 @@ windows
|
|||||||
# QTBUG-66247
|
# QTBUG-66247
|
||||||
[ioHttpRedirect]
|
[ioHttpRedirect]
|
||||||
windows
|
windows
|
||||||
|
# QTBUG-66602
|
||||||
[ioHttpRedirectMultipartPost]
|
[ioHttpRedirectMultipartPost]
|
||||||
linux
|
*
|
||||||
[ioHttpRedirectPolicy]
|
[ioHttpRedirectPolicy]
|
||||||
b2qt 64bit
|
b2qt 64bit
|
||||||
linux
|
linux
|
||||||
|
@ -50,6 +50,10 @@ public slots:
|
|||||||
private slots:
|
private slots:
|
||||||
void benchmarkRecord_data() { generic_data(); }
|
void benchmarkRecord_data() { generic_data(); }
|
||||||
void benchmarkRecord();
|
void benchmarkRecord();
|
||||||
|
void benchFieldName_data() { generic_data(); }
|
||||||
|
void benchFieldName();
|
||||||
|
void benchFieldIndex_data() { generic_data(); }
|
||||||
|
void benchFieldIndex();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void generic_data(const QString &engine = QString());
|
void generic_data(const QString &engine = QString());
|
||||||
@ -188,4 +192,33 @@ void tst_QSqlRecord::benchmarkRecord()
|
|||||||
tst_Databases::safeDropTables(db, QStringList() << tableName);
|
tst_Databases::safeDropTables(db, QStringList() << tableName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tst_QSqlRecord::benchFieldName()
|
||||||
|
{
|
||||||
|
QFETCH(QString, dbName);
|
||||||
|
QSqlDatabase db = QSqlDatabase::database(dbName);
|
||||||
|
if (tst_Databases::getDatabaseType(db) == QSqlDriver::PostgreSQL) {
|
||||||
|
QSqlQuery qry(db);
|
||||||
|
QVERIFY_SQL(qry, exec("SELECT GENERATE_SERIES(1,5000) AS r"));
|
||||||
|
QBENCHMARK {
|
||||||
|
while (qry.next())
|
||||||
|
qry.value("r");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void tst_QSqlRecord::benchFieldIndex()
|
||||||
|
{
|
||||||
|
QFETCH(QString, dbName);
|
||||||
|
QSqlDatabase db = QSqlDatabase::database(dbName);
|
||||||
|
if (tst_Databases::getDatabaseType(db) == QSqlDriver::PostgreSQL) {
|
||||||
|
QSqlQuery qry(db);
|
||||||
|
QVERIFY_SQL(qry, exec("SELECT GENERATE_SERIES(1,5000) AS r"));
|
||||||
|
qry = db.exec("SELECT GENERATE_SERIES(1,5000) AS r");
|
||||||
|
QBENCHMARK {
|
||||||
|
while (qry.next())
|
||||||
|
qry.value(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#include "tst_qsqlrecord.moc"
|
#include "tst_qsqlrecord.moc"
|
||||||
|
@ -94,7 +94,7 @@ static inline std::string permissions(const QFileInfo &fi)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ls(int argCount, char **args)
|
static int ls(int argCount, const char **args, bool recursive = false)
|
||||||
{
|
{
|
||||||
for (int i = 0 ; i < argCount; ++i) {
|
for (int i = 0 ; i < argCount; ++i) {
|
||||||
const QFileInfo fi(QString::fromLocal8Bit(args[i]));
|
const QFileInfo fi(QString::fromLocal8Bit(args[i]));
|
||||||
@ -112,6 +112,16 @@ static int ls(int argCount, char **args)
|
|||||||
std::cout << " [dir]";
|
std::cout << " [dir]";
|
||||||
|
|
||||||
std::cout << std::endl;
|
std::cout << std::endl;
|
||||||
|
|
||||||
|
if (recursive && fi.isDir()) {
|
||||||
|
QDir dir(fi.fileName());
|
||||||
|
const QStringList entries = dir.entryList(QDir::AllEntries | QDir::NoDotAndDotDot);
|
||||||
|
for (const QString &s : entries) {
|
||||||
|
QByteArray encoded = QFile::encodeName(s);
|
||||||
|
const char *ptr = encoded.constData();
|
||||||
|
ls(1, &ptr, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -205,7 +215,7 @@ int main(int argc, char *argv[])
|
|||||||
QCoreApplication a(argc, argv);
|
QCoreApplication a(argc, argv);
|
||||||
Q_UNUSED(a)
|
Q_UNUSED(a)
|
||||||
if (argc >= 3 && !qstrcmp(argv[1], "ls"))
|
if (argc >= 3 && !qstrcmp(argv[1], "ls"))
|
||||||
return ls(argc -2, argv + 2);
|
return ls(argc -2, const_cast<const char **>(argv + 2), true);
|
||||||
|
|
||||||
if (argc >= 3 && !qstrcmp(argv[1], "stat"))
|
if (argc >= 3 && !qstrcmp(argv[1], "stat"))
|
||||||
return stat(argc -2, argv + 2);
|
return stat(argc -2, argv + 2);
|
||||||
|
@ -31,106 +31,202 @@
|
|||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
#include <QLabel>
|
#include <QLabel>
|
||||||
#include <QPushButton>
|
#include <QPushButton>
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
class ShortcutTester : public QWidget
|
class ShortcutTester : public QWidget
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ShortcutTester() {
|
ShortcutTester() {
|
||||||
setupLayout();
|
setupLayout();
|
||||||
setFixedWidth(200);
|
|
||||||
}
|
}
|
||||||
protected:
|
protected:
|
||||||
void setupLayout()
|
void setupLayout()
|
||||||
{
|
{
|
||||||
QVBoxLayout *layout = new QVBoxLayout(this);
|
QVBoxLayout *layout = new QVBoxLayout(this);
|
||||||
|
setLayout(layout);
|
||||||
QKeySequence sq1(Qt::AltModifier + Qt::ShiftModifier + Qt::Key_G);
|
|
||||||
QPushButton *b1 = new QPushButton(sq1.toString());
|
|
||||||
b1->setShortcut(sq1);
|
|
||||||
|
|
||||||
QKeySequence sq2(Qt::AltModifier + Qt::Key_G);
|
|
||||||
QPushButton *b2 = new QPushButton(sq2.toString());
|
|
||||||
b2->setShortcut(sq2);
|
|
||||||
|
|
||||||
QKeySequence sq3(Qt::ControlModifier + Qt::ShiftModifier + Qt::Key_R);
|
|
||||||
QPushButton *b3 = new QPushButton(sq3.toString());
|
|
||||||
b3->setShortcut(sq3);
|
|
||||||
|
|
||||||
QKeySequence sq4(Qt::ControlModifier + Qt::Key_R);
|
|
||||||
QPushButton *b4 = new QPushButton(sq4.toString());
|
|
||||||
b4->setShortcut(sq4);
|
|
||||||
|
|
||||||
QKeySequence sq5(Qt::ControlModifier + Qt::Key_Return);
|
|
||||||
QPushButton *b5 = new QPushButton(sq5.toString());
|
|
||||||
b5->setShortcut(sq5);
|
|
||||||
|
|
||||||
QKeySequence sq6(Qt::ControlModifier + Qt::ShiftModifier + Qt::AltModifier + Qt::Key_R);
|
|
||||||
QPushButton *b6 = new QPushButton(sq6.toString());
|
|
||||||
b6->setShortcut(sq6);
|
|
||||||
|
|
||||||
QKeySequence sq7(Qt::ShiftModifier + Qt::Key_5);
|
|
||||||
QPushButton *b7 = new QPushButton(sq7.toString());
|
|
||||||
b7->setShortcut(sq7);
|
|
||||||
|
|
||||||
QKeySequence sq8(Qt::ControlModifier + Qt::Key_Q);
|
|
||||||
QPushButton *b8 = new QPushButton(sq8.toString());
|
|
||||||
b8->setShortcut(sq8);
|
|
||||||
|
|
||||||
QKeySequence sq9(Qt::ControlModifier + Qt::Key_Plus);
|
|
||||||
QPushButton *b9 = new QPushButton(sq9.toString());
|
|
||||||
b9->setShortcut(sq9);
|
|
||||||
|
|
||||||
QKeySequence sq10(Qt::ControlModifier + Qt::Key_Y);
|
|
||||||
QPushButton *b10 = new QPushButton(sq10.toString());
|
|
||||||
b10->setShortcut(sq10);
|
|
||||||
|
|
||||||
QKeySequence sq11(Qt::ShiftModifier + Qt::Key_Comma);
|
|
||||||
QPushButton *b11 = new QPushButton(sq11.toString());
|
|
||||||
b11->setShortcut(sq11);
|
|
||||||
|
|
||||||
QKeySequence sq12(Qt::ControlModifier + Qt::Key_Slash);
|
|
||||||
QPushButton *b12 = new QPushButton(sq12.toString());
|
|
||||||
b12->setShortcut(sq12);
|
|
||||||
|
|
||||||
QKeySequence sq13(Qt::ControlModifier + Qt::Key_BracketRight);
|
|
||||||
QPushButton *b13 = new QPushButton(sq13.toString());
|
|
||||||
b13->setShortcut(sq13);
|
|
||||||
|
|
||||||
// LATIN SMALL LETTER O WITH STROKE
|
|
||||||
QKeySequence sq14(QString(QChar(ushort(0xf8))));
|
|
||||||
QPushButton *b14 = new QPushButton(sq14.toString());
|
|
||||||
b14->setShortcut(sq14);
|
|
||||||
|
|
||||||
// CYRILLIC SMALL LETTER ZHE
|
|
||||||
QKeySequence sq15(QString(QChar(ushort(0x436))));
|
|
||||||
QPushButton *b15 = new QPushButton(sq15.toString());
|
|
||||||
b15->setShortcut(sq15);
|
|
||||||
|
|
||||||
QLabel *testPurpose = new QLabel();
|
QLabel *testPurpose = new QLabel();
|
||||||
testPurpose->setWordWrap(true);
|
testPurpose->setWordWrap(true);
|
||||||
testPurpose->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Expanding);
|
testPurpose->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Expanding);
|
||||||
testPurpose->setText("This test come in handy to verify shortcuts under different"
|
testPurpose->setText("This test come in handy to verify shortcuts under different "
|
||||||
" keyboard layouts - qwerty, dvorak, non-latin (russian, arabic), etc.");
|
"keyboard layouts - qwerty, dvorak, non-latin (russian, arabic), etc.");
|
||||||
layout->addWidget(testPurpose);
|
layout->addWidget(testPurpose);
|
||||||
layout->addWidget(b1);
|
|
||||||
layout->addWidget(b2);
|
|
||||||
layout->addWidget(b3);
|
|
||||||
layout->addWidget(b4);
|
|
||||||
layout->addWidget(b5);
|
|
||||||
layout->addWidget(b6);
|
|
||||||
layout->addWidget(b7);
|
|
||||||
layout->addWidget(b8);
|
|
||||||
layout->addWidget(b9);
|
|
||||||
layout->addWidget(b10);
|
|
||||||
layout->addWidget(b11);
|
|
||||||
layout->addWidget(b12);
|
|
||||||
layout->addWidget(b13);
|
|
||||||
layout->addWidget(new QLabel("Norwegian layout"));
|
|
||||||
layout->addWidget(b14);
|
|
||||||
layout->addWidget(new QLabel("Russian layout"));
|
|
||||||
layout->addWidget(b15);
|
|
||||||
|
|
||||||
setLayout(layout);
|
QKeySequence altShiftG(Qt::AltModifier + Qt::ShiftModifier + Qt::Key_G);
|
||||||
|
QPushButton *_altShiftG = new QPushButton(altShiftG.toString());
|
||||||
|
_altShiftG->setShortcut(altShiftG);
|
||||||
|
layout->addWidget(_altShiftG);
|
||||||
|
|
||||||
|
QKeySequence altG(Qt::AltModifier + Qt::Key_G);
|
||||||
|
QPushButton *_altG = new QPushButton(altG.toString());
|
||||||
|
_altG->setShortcut(altG);
|
||||||
|
layout->addWidget(_altG);
|
||||||
|
|
||||||
|
QKeySequence ctrlShiftR(Qt::ControlModifier + Qt::ShiftModifier + Qt::Key_R);
|
||||||
|
QPushButton *_ctrlShiftR = new QPushButton(ctrlShiftR.toString());
|
||||||
|
_ctrlShiftR->setShortcut(ctrlShiftR);
|
||||||
|
layout->addWidget(_ctrlShiftR);
|
||||||
|
|
||||||
|
QKeySequence ctrlR(Qt::ControlModifier + Qt::Key_R);
|
||||||
|
QPushButton *_ctrlR = new QPushButton(ctrlR.toString());
|
||||||
|
_ctrlR->setShortcut(ctrlR);
|
||||||
|
layout->addWidget(_ctrlR);
|
||||||
|
|
||||||
|
QKeySequence ctrlReturn(Qt::ControlModifier + Qt::Key_Return);
|
||||||
|
QPushButton *_ctrlReturn = new QPushButton(ctrlReturn.toString());
|
||||||
|
_ctrlReturn->setShortcut(ctrlReturn);
|
||||||
|
layout->addWidget(_ctrlReturn);
|
||||||
|
|
||||||
|
QKeySequence ctrlEnter(Qt::ControlModifier + Qt::Key_Enter);
|
||||||
|
QPushButton *_ctrlEnter = new QPushButton(ctrlEnter.toString());
|
||||||
|
_ctrlEnter->setShortcut(ctrlEnter);
|
||||||
|
layout->addWidget(_ctrlEnter);
|
||||||
|
|
||||||
|
QKeySequence ctrlShiftAltR(Qt::ControlModifier + Qt::ShiftModifier + Qt::AltModifier + Qt::Key_R);
|
||||||
|
QPushButton *_ctrlShiftAltR = new QPushButton(ctrlShiftAltR.toString());
|
||||||
|
_ctrlShiftAltR->setShortcut(ctrlShiftAltR);
|
||||||
|
layout->addWidget(_ctrlShiftAltR);
|
||||||
|
|
||||||
|
QKeySequence shift5(Qt::ShiftModifier + Qt::Key_5);
|
||||||
|
QPushButton *_shift5 = new QPushButton(shift5.toString());
|
||||||
|
_shift5->setShortcut(shift5);
|
||||||
|
layout->addWidget(_shift5);
|
||||||
|
|
||||||
|
QKeySequence shiftPercent(Qt::ShiftModifier + Qt::Key_Percent);
|
||||||
|
QPushButton *_shiftPercent = new QPushButton(shiftPercent.toString());
|
||||||
|
_shiftPercent->setShortcut(shiftPercent);
|
||||||
|
layout->addWidget(_shiftPercent);
|
||||||
|
|
||||||
|
QKeySequence percent(Qt::Key_Percent);
|
||||||
|
QPushButton *_percent = new QPushButton(percent.toString());
|
||||||
|
_percent->setShortcut(percent);
|
||||||
|
layout->addWidget(_percent);
|
||||||
|
|
||||||
|
QKeySequence key5(Qt::Key_5);
|
||||||
|
QPushButton *_key5 = new QPushButton(key5.toString());
|
||||||
|
_key5->setShortcut(key5);
|
||||||
|
layout->addWidget(_key5);
|
||||||
|
|
||||||
|
QKeySequence keyQ(Qt::Key_Q);
|
||||||
|
QPushButton *_keyQ = new QPushButton(keyQ.toString());
|
||||||
|
_keyQ->setShortcut(keyQ);
|
||||||
|
layout->addWidget(_keyQ);
|
||||||
|
|
||||||
|
QKeySequence ctrlPercent(Qt::ControlModifier + Qt::Key_Percent);
|
||||||
|
QPushButton *_ctrlPercent = new QPushButton(ctrlPercent.toString());
|
||||||
|
_ctrlPercent->setShortcut(ctrlPercent);
|
||||||
|
layout->addWidget(_ctrlPercent);
|
||||||
|
|
||||||
|
QKeySequence ctrlShift5(Qt::ControlModifier + Qt::ShiftModifier + Qt::Key_5);
|
||||||
|
QPushButton *_ctrlShift5 = new QPushButton(ctrlShift5.toString());
|
||||||
|
_ctrlShift5->setShortcut(ctrlShift5);
|
||||||
|
layout->addWidget(_ctrlShift5);
|
||||||
|
|
||||||
|
QKeySequence ctrl5(Qt::ControlModifier + Qt::Key_5);
|
||||||
|
QPushButton *_ctrl5 = new QPushButton(ctrl5.toString());
|
||||||
|
_ctrl5->setShortcut(ctrl5);
|
||||||
|
layout->addWidget(_ctrl5);
|
||||||
|
|
||||||
|
QKeySequence alt5(Qt::AltModifier + Qt::Key_5);
|
||||||
|
QPushButton *_alt5 = new QPushButton(alt5.toString());
|
||||||
|
_alt5->setShortcut(alt5);
|
||||||
|
layout->addWidget(_alt5);
|
||||||
|
|
||||||
|
QKeySequence ctrlPlus(Qt::ControlModifier + Qt::Key_Plus);
|
||||||
|
QPushButton *_ctrlPlus = new QPushButton(ctrlPlus.toString());
|
||||||
|
_ctrlPlus->setShortcut(ctrlPlus);
|
||||||
|
layout->addWidget(_ctrlPlus);
|
||||||
|
|
||||||
|
QKeySequence ctrlShiftPlus(Qt::ControlModifier + Qt::ShiftModifier + Qt::Key_Plus);
|
||||||
|
QPushButton *_ctrlShiftPlus = new QPushButton(ctrlShiftPlus.toString());
|
||||||
|
_ctrlShiftPlus->setShortcut(ctrlShiftPlus);
|
||||||
|
layout->addWidget(_ctrlShiftPlus);
|
||||||
|
|
||||||
|
QKeySequence ctrlY(Qt::ControlModifier + Qt::Key_Y);
|
||||||
|
QPushButton *_ctrlY = new QPushButton(ctrlY.toString());
|
||||||
|
_ctrlY->setShortcut(ctrlY);
|
||||||
|
layout->addWidget(_ctrlY);
|
||||||
|
|
||||||
|
QKeySequence shiftComma(Qt::ShiftModifier + Qt::Key_Comma);
|
||||||
|
QPushButton *_shiftComma = new QPushButton(shiftComma.toString());
|
||||||
|
_shiftComma->setShortcut(shiftComma);
|
||||||
|
layout->addWidget(_shiftComma);
|
||||||
|
|
||||||
|
QKeySequence ctrlComma(Qt::ControlModifier + Qt::Key_Comma);
|
||||||
|
QPushButton *_ctrlComma = new QPushButton(ctrlComma.toString());
|
||||||
|
_ctrlComma->setShortcut(ctrlComma);
|
||||||
|
layout->addWidget(_ctrlComma);
|
||||||
|
|
||||||
|
QKeySequence ctrlSlash(Qt::ControlModifier + Qt::Key_Slash);
|
||||||
|
QPushButton *_ctrlSlash = new QPushButton(ctrlSlash.toString());
|
||||||
|
_ctrlSlash->setShortcut(ctrlSlash);
|
||||||
|
layout->addWidget(_ctrlSlash);
|
||||||
|
|
||||||
|
QKeySequence ctrlBackslash(Qt::ControlModifier + Qt::Key_Backslash);
|
||||||
|
QPushButton *_ctrlBackslash = new QPushButton(ctrlBackslash.toString());
|
||||||
|
_ctrlBackslash->setShortcut(ctrlBackslash);
|
||||||
|
layout->addWidget(_ctrlBackslash);
|
||||||
|
|
||||||
|
QKeySequence metaShiftA(Qt::MetaModifier + Qt::ShiftModifier + Qt::Key_A);
|
||||||
|
QPushButton *_metaShiftA = new QPushButton(metaShiftA.toString());
|
||||||
|
_metaShiftA->setShortcut(metaShiftA);
|
||||||
|
layout->addWidget(_metaShiftA);
|
||||||
|
|
||||||
|
QKeySequence metaShift5(Qt::MetaModifier + Qt::ShiftModifier + Qt::Key_5);
|
||||||
|
QPushButton *_metaShift5 = new QPushButton(metaShift5.toString());
|
||||||
|
_metaShift5->setShortcut(metaShift5);
|
||||||
|
layout->addWidget(_metaShift5);
|
||||||
|
|
||||||
|
QKeySequence ctrlBracketRigth(Qt::ControlModifier + Qt::Key_BracketRight);
|
||||||
|
QPushButton *_ctrlBracketRigth = new QPushButton(ctrlBracketRigth.toString());
|
||||||
|
_ctrlBracketRigth->setShortcut(ctrlBracketRigth);
|
||||||
|
layout->addWidget(_ctrlBracketRigth);
|
||||||
|
|
||||||
|
QKeySequence shiftF3(Qt::ShiftModifier + Qt::Key_F3);
|
||||||
|
QPushButton *_shiftF3 = new QPushButton(shiftF3.toString());
|
||||||
|
_shiftF3->setShortcut(shiftF3);
|
||||||
|
layout->addWidget(_shiftF3);
|
||||||
|
|
||||||
|
QKeySequence ctrlF3(Qt::ControlModifier + Qt::Key_F3);
|
||||||
|
QPushButton *_ctrlF3 = new QPushButton(ctrlF3.toString());
|
||||||
|
_ctrlF3->setShortcut(ctrlF3);
|
||||||
|
layout->addWidget(_ctrlF3);
|
||||||
|
|
||||||
|
QKeySequence euro(0x20AC); // EURO SIGN e.g. US (with euro on 5) on 3rd keyboard level
|
||||||
|
QPushButton *_euro = new QPushButton(euro.toString());
|
||||||
|
_euro->setShortcut(euro);
|
||||||
|
layout->addWidget(_euro);
|
||||||
|
|
||||||
|
QKeySequence ctrlEuro(Qt::ControlModifier + 0x20AC);
|
||||||
|
QPushButton *_ctrlEuro = new QPushButton(ctrlEuro.toString());
|
||||||
|
_ctrlEuro->setShortcut(ctrlEuro);
|
||||||
|
layout->addWidget(_ctrlEuro);
|
||||||
|
|
||||||
|
// with german (neo 2) layout on linux under ISO_Level3_Shift + ISO_Level5_Shift + I
|
||||||
|
QKeySequence greekPsi(QString(QStringLiteral("\u03A8")));
|
||||||
|
QPushButton *_greekPsi = new QPushButton(greekPsi.toString());
|
||||||
|
_greekPsi->setShortcut(greekPsi);
|
||||||
|
layout->addWidget(_greekPsi);
|
||||||
|
|
||||||
|
layout->addWidget(new QLabel("Norwegian layout"));
|
||||||
|
// LATIN SMALL LETTER O WITH STROKE
|
||||||
|
QKeySequence norwegianO(QString(QStringLiteral("\u00F8")));
|
||||||
|
QPushButton *_norwegianO = new QPushButton(norwegianO.toString());
|
||||||
|
_norwegianO->setShortcut(norwegianO);
|
||||||
|
layout->addWidget(_norwegianO);
|
||||||
|
|
||||||
|
layout->addWidget(new QLabel("Russian layout"));
|
||||||
|
// CYRILLIC SMALL LETTER ZHE
|
||||||
|
QKeySequence zhe(QString(QStringLiteral("\u0436")));
|
||||||
|
QPushButton *_zhe = new QPushButton(zhe.toString());
|
||||||
|
_zhe->setShortcut(zhe);
|
||||||
|
layout->addWidget(_zhe);
|
||||||
|
|
||||||
|
// for sequence definitons see qplatformtheme.cpp
|
||||||
|
layout->addWidget(new QLabel("QKeySequence::StandardKey(s)"));
|
||||||
|
QPushButton *_open = new QPushButton("Open");
|
||||||
|
_open->setShortcut(QKeySequence::Open); // Qt::CTRL | Qt::Key_O
|
||||||
|
layout->addWidget(_open);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -138,6 +234,8 @@ int main(int argc, char *argv[])
|
|||||||
{
|
{
|
||||||
QApplication a(argc, argv);
|
QApplication a(argc, argv);
|
||||||
|
|
||||||
|
qDebug() << qVersion();
|
||||||
|
|
||||||
ShortcutTester tester;
|
ShortcutTester tester;
|
||||||
tester.show();
|
tester.show();
|
||||||
|
|
||||||
|
@ -59,7 +59,7 @@ ControllerWidget::ControllerWidget(QWidget *parent)
|
|||||||
QLabel *label = new QLabel(tr("Parent window"));
|
QLabel *label = new QLabel(tr("Parent window"));
|
||||||
parentWindow->setCentralWidget(label);
|
parentWindow->setCentralWidget(label);
|
||||||
|
|
||||||
previewWindow = new QWindow;
|
previewWindow = new PreviewWindow;
|
||||||
previewWindow->installEventFilter(this);
|
previewWindow->installEventFilter(this);
|
||||||
previewWidget = new PreviewWidget;
|
previewWidget = new PreviewWidget;
|
||||||
previewWidget->installEventFilter(this);
|
previewWidget->installEventFilter(this);
|
||||||
@ -123,8 +123,8 @@ void ControllerWidget::updatePreview(QWindow *preview)
|
|||||||
preview->setFlags(flags);
|
preview->setFlags(flags);
|
||||||
|
|
||||||
if (fixedSizeWindowCheckBox->isChecked()) {
|
if (fixedSizeWindowCheckBox->isChecked()) {
|
||||||
preview->setMinimumSize(QSize(300, 300));
|
preview->setMinimumSize(preview->size());
|
||||||
preview->setMaximumSize(QSize(300, 300));
|
preview->setMaximumSize(preview->size());
|
||||||
} else {
|
} else {
|
||||||
preview->setMinimumSize(QSize(0, 0));
|
preview->setMinimumSize(QSize(0, 0));
|
||||||
preview->setMaximumSize(QSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX));
|
preview->setMaximumSize(QSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX));
|
||||||
@ -153,7 +153,7 @@ void ControllerWidget::updatePreview(QWidget *preview)
|
|||||||
preview->setWindowFlags(flags);
|
preview->setWindowFlags(flags);
|
||||||
|
|
||||||
QSize fixedSize = fixedSizeWindowCheckBox->isChecked() ?
|
QSize fixedSize = fixedSizeWindowCheckBox->isChecked() ?
|
||||||
QSize(300, 300) : QSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX);
|
preview->size() : QSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX);
|
||||||
preview->setFixedSize(fixedSize);
|
preview->setFixedSize(fixedSize);
|
||||||
|
|
||||||
QPoint pos = preview->pos();
|
QPoint pos = preview->pos();
|
||||||
|
@ -32,9 +32,20 @@
|
|||||||
#include <QVBoxLayout>
|
#include <QVBoxLayout>
|
||||||
#include <QTextStream>
|
#include <QTextStream>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
|
#include <QPainter>
|
||||||
|
#include <QLinearGradient>
|
||||||
|
|
||||||
#include "previewwindow.h"
|
#include "previewwindow.h"
|
||||||
|
|
||||||
|
void PreviewWindow::paintEvent(QPaintEvent *event)
|
||||||
|
{
|
||||||
|
QPainter painter(this);
|
||||||
|
QLinearGradient gradient(0, 0, width(), height());
|
||||||
|
gradient.setColorAt(0, QColor("#64b3f4"));
|
||||||
|
gradient.setColorAt(1, QColor("#c2e59c"));
|
||||||
|
painter.fillRect(QRect(0, 0, width(), height()), gradient);
|
||||||
|
}
|
||||||
|
|
||||||
static void formatWindowFlags(QTextStream &str, Qt::WindowFlags flags)
|
static void formatWindowFlags(QTextStream &str, Qt::WindowFlags flags)
|
||||||
{
|
{
|
||||||
str << "Window flags: " << hex << showbase << unsigned(flags) << noshowbase << dec << ' ';
|
str << "Window flags: " << hex << showbase << unsigned(flags) << noshowbase << dec << ' ';
|
||||||
|
@ -30,11 +30,17 @@
|
|||||||
#define PREVIEWWINDOW_H
|
#define PREVIEWWINDOW_H
|
||||||
|
|
||||||
#include <QDialog>
|
#include <QDialog>
|
||||||
|
#include <QRasterWindow>
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
class QPlainTextEdit;
|
class QPlainTextEdit;
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
|
class PreviewWindow : public QRasterWindow
|
||||||
|
{
|
||||||
|
void paintEvent(QPaintEvent *event);
|
||||||
|
};
|
||||||
|
|
||||||
class PreviewWidget : public QWidget
|
class PreviewWidget : public QWidget
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
Loading…
Reference in New Issue
Block a user