From ea9d6955f4c1c1141d0909ddb32abb59c032ac3c Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Fri, 25 Nov 2016 16:46:35 +0100 Subject: D3D12: Output error messages Format error messages via struct _com_error. Change-Id: Ice755597ec56a106e9fc5ac0288b69d9411a6ea8 Reviewed-by: Laszlo Agocs --- src/plugins/scenegraph/d3d12/qsgd3d12engine.cpp | 72 +++++++++++++++++-------- 1 file changed, 49 insertions(+), 23 deletions(-) (limited to 'src/plugins') diff --git a/src/plugins/scenegraph/d3d12/qsgd3d12engine.cpp b/src/plugins/scenegraph/d3d12/qsgd3d12engine.cpp index caf64ebb8b..908f1221ab 100644 --- a/src/plugins/scenegraph/d3d12/qsgd3d12engine.cpp +++ b/src/plugins/scenegraph/d3d12/qsgd3d12engine.cpp @@ -61,6 +61,8 @@ #include #endif +#include + QT_BEGIN_NAMESPACE // NOTE: Avoid categorized logging. It is slow. @@ -98,6 +100,19 @@ static const int BUCKETS_PER_HEAP = 8; // must match freeMap static const int DESCRIPTORS_PER_BUCKET = 32; // the bit map (freeMap) is quint32 static const int MAX_DESCRIPTORS_PER_HEAP = BUCKETS_PER_HEAP * DESCRIPTORS_PER_BUCKET; +static QString comErrorMessage(HRESULT hr) +{ +#ifndef Q_OS_WINRT + const _com_error comError(hr); +#else + const _com_error comError(hr, nullptr); +#endif + QString result = QLatin1String("Error 0x") + QString::number(ulong(hr), 16); + if (const wchar_t *msg = comError.ErrorMessage()) + result += QLatin1String(": ") + QString::fromWCharArray(msg); + return result; +} + D3D12_CPU_DESCRIPTOR_HANDLE QSGD3D12CPUDescriptorHeapManager::allocate(D3D12_DESCRIPTOR_HEAP_TYPE type) { D3D12_CPU_DESCRIPTOR_HANDLE h = {}; @@ -128,7 +143,8 @@ D3D12_CPU_DESCRIPTOR_HANDLE QSGD3D12CPUDescriptorHeapManager::allocate(D3D12_DES HRESULT hr = m_device->CreateDescriptorHeap(&heapDesc, IID_PPV_ARGS(&heap.heap)); if (FAILED(hr)) { - qWarning("Failed to create heap with type 0x%x: %x", type, hr); + qWarning("Failed to create heap with type 0x%x: %s", + type, qPrintable(comErrorMessage(hr))); return h; } @@ -211,7 +227,8 @@ static void getHardwareAdapter(IDXGIFactory1 *factory, IDXGIAdapter1 **outAdapte *outAdapter = adapter.Detach(); return; } else { - qWarning("Failed to create device for requested adapter '%s': 0x%x", qPrintable(name), hr); + qWarning("Failed to create device for requested adapter '%s': %s", + qPrintable(name), qPrintable(comErrorMessage(hr))); } } } @@ -270,7 +287,7 @@ void QSGD3D12DeviceManager::ensureCreated() HRESULT hr = CreateDXGIFactory2(0, IID_PPV_ARGS(&m_factory)); if (FAILED(hr)) { - qWarning("Failed to create DXGI: 0x%x", hr); + qWarning("Failed to create DXGI: %s", qPrintable(comErrorMessage(hr))); return; } @@ -283,7 +300,7 @@ void QSGD3D12DeviceManager::ensureCreated() if (SUCCEEDED(hr)) warp = false; else - qWarning("Failed to create device: 0x%x", hr); + qWarning("Failed to create device: %s", qPrintable(comErrorMessage(hr))); } if (warp) { @@ -291,7 +308,7 @@ void QSGD3D12DeviceManager::ensureCreated() m_factory->EnumWarpAdapter(IID_PPV_ARGS(&adapter)); HRESULT hr = D3D12CreateDevice(adapter.Get(), D3D_FEATURE_LEVEL_11_0, IID_PPV_ARGS(&m_device)); if (FAILED(hr)) { - qWarning("Failed to create WARP device: 0x%x", hr); + qWarning("Failed to create WARP device: %s", qPrintable(comErrorMessage(hr))); return; } } @@ -798,15 +815,18 @@ void QSGD3D12EnginePrivate::initialize(WId w, const QSize &size, float dpr, int if (SUCCEEDED(hr)) { hr = dcompDevice->CreateVisual(&dcompVisual); if (FAILED(hr)) { - qWarning("Failed to create DirectComposition visual: 0x%x", hr); + qWarning("Failed to create DirectComposition visual: %s", + qPrintable(comErrorMessage(hr))); windowAlpha = false; } } else { - qWarning("Failed to create DirectComposition target: 0x%x", hr); + qWarning("Failed to create DirectComposition target: %s", + qPrintable(comErrorMessage(hr))); windowAlpha = false; } } else { - qWarning("Failed to create DirectComposition device: 0x%x", hr); + qWarning("Failed to create DirectComposition device: %s", + qPrintable(comErrorMessage(hr))); windowAlpha = false; } } @@ -833,11 +853,13 @@ void QSGD3D12EnginePrivate::initialize(WId w, const QSize &size, float dpr, int if (SUCCEEDED(hr)) { hr = dcompTarget->SetRoot(dcompVisual.Get()); if (FAILED(hr)) { - qWarning("SetRoot failed for DirectComposition target: 0x%x", hr); + qWarning("SetRoot failed for DirectComposition target: %s", + qPrintable(comErrorMessage(hr))); windowAlpha = false; } } else { - qWarning("SetContent failed for DirectComposition visual: 0x%x", hr); + qWarning("SetContent failed for DirectComposition visual: %s", + qPrintable(comErrorMessage(hr))); windowAlpha = false; } } else { @@ -867,11 +889,12 @@ void QSGD3D12EnginePrivate::initialize(WId w, const QSize &size, float dpr, int ComPtr baseSwapChain; HRESULT hr = dev->dxgi()->CreateSwapChain(commandQueue.Get(), &swapChainDesc, &baseSwapChain); if (FAILED(hr)) { - qWarning("Failed to create swap chain: 0x%x", hr); + qWarning("Failed to create swap chain: %s", qPrintable(comErrorMessage(hr))); return; } - if (FAILED(baseSwapChain.As(&swapChain))) { - qWarning("Failed to cast swap chain"); + hr = baseSwapChain.As(&swapChain); + if (FAILED(hr)) { + qWarning("Failed to cast swap chain: %s", qPrintable(comErrorMessage(hr))); return; } } @@ -1165,7 +1188,7 @@ void QSGD3D12EnginePrivate::setWindowSize(const QSize &size, float dpr) deviceManager()->deviceLossDetected(); return; } else if (FAILED(hr)) { - qWarning("Failed to resize buffers: 0x%x", hr); + qWarning("Failed to resize buffers: %s", qPrintable(comErrorMessage(hr))); return; } @@ -1188,7 +1211,7 @@ QSGD3D12CPUWaitableFence *QSGD3D12EnginePrivate::createCPUWaitableFence() const QSGD3D12CPUWaitableFence *f = new QSGD3D12CPUWaitableFence; HRESULT hr = device->CreateFence(f->value, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&f->fence)); if (FAILED(hr)) { - qWarning("Failed to create fence: 0x%x", hr); + qWarning("Failed to create fence: %s", qPrintable(comErrorMessage(hr))); return f; } f->event = CreateEvent(nullptr, FALSE, FALSE, nullptr); @@ -1202,7 +1225,7 @@ void QSGD3D12EnginePrivate::waitForGPU(QSGD3D12CPUWaitableFence *f) const if (f->fence->GetCompletedValue() < newValue) { HRESULT hr = f->fence->SetEventOnCompletion(newValue, f->event); if (FAILED(hr)) { - qWarning("SetEventOnCompletion failed: 0x%x", hr); + qWarning("SetEventOnCompletion failed: %s", qPrintable(comErrorMessage(hr))); return; } WaitForSingleObject(f->event, INFINITE); @@ -1283,7 +1306,7 @@ ID3D12Resource *QSGD3D12EnginePrivate::createBuffer(int size) HRESULT hr = device->CreateCommittedResource(&uploadHeapProp, D3D12_HEAP_FLAG_NONE, &bufDesc, D3D12_RESOURCE_STATE_GENERIC_READ, nullptr, IID_PPV_ARGS(&buf)); if (FAILED(hr)) - qWarning("Failed to create buffer resource: 0x%x", hr); + qWarning("Failed to create buffer resource: %s", qPrintable(comErrorMessage(hr))); return buf; } @@ -1640,7 +1663,7 @@ void QSGD3D12EnginePrivate::endDrawCalls(bool lastInFrame) // Go! HRESULT hr = frameCommandList->Close(); if (FAILED(hr)) { - qWarning("Failed to close command list: 0x%x", hr); + qWarning("Failed to close command list: %s", qPrintable(comErrorMessage(hr))); if (hr == E_INVALIDARG) qWarning("Invalid arguments. Some of the commands in the list is invalid in some way."); } @@ -1874,7 +1897,8 @@ void QSGD3D12EnginePrivate::finalizePipeline(const QSGD3D12PipelineState &pipeli HRESULT hr = device->CreateGraphicsPipelineState(&psoDesc, IID_PPV_ARGS(&cachedPso->pso)); if (FAILED(hr)) { - qWarning("Failed to create graphics pipeline state"); + qWarning("Failed to create graphics pipeline state: %s", + qPrintable(comErrorMessage(hr))); return; } @@ -2179,7 +2203,7 @@ void QSGD3D12EnginePrivate::present() deviceManager()->deviceLossDetected(); return; } else if (FAILED(hr)) { - qWarning("Present failed: 0x%x", hr); + qWarning("Present failed: %s", qPrintable(comErrorMessage(hr))); return; } @@ -2433,7 +2457,7 @@ void QSGD3D12EnginePrivate::createTexture(uint id, const QSize &size, QImage::Fo HRESULT hr = device->CreateCommittedResource(&defaultHeapProp, D3D12_HEAP_FLAG_NONE, &textureDesc, D3D12_RESOURCE_STATE_COMMON, nullptr, IID_PPV_ARGS(&t.texture)); if (FAILED(hr)) { - qWarning("Failed to create texture resource: 0x%x", hr); + qWarning("Failed to create texture resource: %s", qPrintable(comErrorMessage(hr))); return; } @@ -2498,7 +2522,8 @@ void QSGD3D12EnginePrivate::queueTextureResize(uint id, const QSize &size) HRESULT hr = device->CreateCommittedResource(&defaultHeapProp, D3D12_HEAP_FLAG_NONE, &textureDesc, D3D12_RESOURCE_STATE_COMMON, nullptr, IID_PPV_ARGS(&t.texture)); if (FAILED(hr)) { - qWarning("Failed to create resized texture resource: 0x%x", hr); + qWarning("Failed to create resized texture resource: %s", + qPrintable(comErrorMessage(hr))); return; } @@ -2954,7 +2979,8 @@ void QSGD3D12EnginePrivate::createRenderTarget(uint id, const QSize &size, const HRESULT hr = device->CreateCommittedResource(&defaultHeapProp, D3D12_HEAP_FLAG_NONE, &textureDesc, D3D12_RESOURCE_STATE_COMMON, nullptr, IID_PPV_ARGS(&rt.colorResolve)); if (FAILED(hr)) { - qWarning("Failed to create resolve buffer: 0x%x", hr); + qWarning("Failed to create resolve buffer: %s", + qPrintable(comErrorMessage(hr))); return; } -- cgit v1.2.3 From e579076bb36e6594003b2ade7f3d062944ef6f47 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Wed, 16 Nov 2016 14:22:36 +0100 Subject: Get rid of most QT_NO_FOO usages Instead use QT_CONFIG(foo). This change actually detected a few mis-spelled macros and invalid usages. Change-Id: I06ac327098dd1a458e6bc379d637b8e2dac52f85 Reviewed-by: Simon Hausmann --- src/plugins/qmltooling/qmldbg_inspector/qquickwindowinspector.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/plugins') diff --git a/src/plugins/qmltooling/qmldbg_inspector/qquickwindowinspector.cpp b/src/plugins/qmltooling/qmldbg_inspector/qquickwindowinspector.cpp index 2525500e65..7d260a4d2a 100644 --- a/src/plugins/qmltooling/qmldbg_inspector/qquickwindowinspector.cpp +++ b/src/plugins/qmltooling/qmldbg_inspector/qquickwindowinspector.cpp @@ -153,7 +153,7 @@ bool QQuickWindowInspector::eventFilter(QObject *obj, QEvent *event) case QEvent::MouseButtonDblClick: m_tool->mouseDoubleClickEvent(static_cast(event)); return true; -#ifndef QT_NO_WHEELEVENT +#if QT_CONFIG(wheelevent) case QEvent::Wheel: return true; #endif -- cgit v1.2.3 From 8a6383775a301c8dd8c917a936655c534932a726 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Mon, 28 Nov 2016 15:33:48 +0100 Subject: Start cleaning up the QmlContextWrapper The class should get merged with the QV4::QmlContext class. Simplify the cleanup by moving both classes into a common file. Change-Id: I0074da79701d5f41eb51681b70fcde85bfd45fc1 Reviewed-by: Simon Hausmann --- src/plugins/qmltooling/qmldbg_debugger/qv4debugjob.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'src/plugins') diff --git a/src/plugins/qmltooling/qmldbg_debugger/qv4debugjob.cpp b/src/plugins/qmltooling/qmldbg_debugger/qv4debugjob.cpp index a2d2fff72b..d5cc765ea8 100644 --- a/src/plugins/qmltooling/qmldbg_debugger/qv4debugjob.cpp +++ b/src/plugins/qmltooling/qmldbg_debugger/qv4debugjob.cpp @@ -41,6 +41,7 @@ #include #include +#include #include #include @@ -81,7 +82,7 @@ void JavaScriptJob::run() } } if (!engine->qmlContext()) { - engine->pushContext(ctx->newQmlContext(QQmlContextData::get(qmlRootContext), + engine->pushContext(QV4::QmlContext::create(ctx, QQmlContextData::get(qmlRootContext), &scopeObject)); ctx = engine->currentContext; } @@ -201,7 +202,7 @@ void ValueLookupJob::run() QV4::ExecutionEngine *engine = collector->engine(); if (engine->qmlEngine() && !engine->qmlContext()) { scopeObject.reset(new QObject); - engine->pushContext(engine->currentContext->newQmlContext( + engine->pushContext(QV4::QmlContext::create(engine->currentContext, QQmlContextData::get(engine->qmlEngine()->rootContext()), scopeObject.data())); } -- cgit v1.2.3 From e31e72925f857be56c77b494c0fa10e55de72cfc Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Tue, 29 Nov 2016 14:58:48 +0100 Subject: Cleanup and reduce the number of overloads for QQmlBinding::create() Change-Id: Ibcd277bc434638e5c6e8e9ccea634aa25cde1643 Reviewed-by: Simon Hausmann --- src/plugins/qmltooling/qmldbg_debugger/qqmlenginedebugservice.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/plugins') diff --git a/src/plugins/qmltooling/qmldbg_debugger/qqmlenginedebugservice.cpp b/src/plugins/qmltooling/qmldbg_debugger/qqmlenginedebugservice.cpp index f72b8a51f9..2b8dcc19ee 100644 --- a/src/plugins/qmltooling/qmldbg_debugger/qqmlenginedebugservice.cpp +++ b/src/plugins/qmltooling/qmldbg_debugger/qqmlenginedebugservice.cpp @@ -660,7 +660,7 @@ bool QQmlEngineDebugServiceImpl::setBinding(int objectId, filename, line, column); QQmlPropertyPrivate::takeSignalExpression(property, qmlExpression); } else if (property.isProperty()) { - QQmlBinding *binding = QQmlBinding::create(&QQmlPropertyPrivate::get(property)->core, expression.toString(), object, QQmlContextData::get(context), filename, line, column); + QQmlBinding *binding = QQmlBinding::create(&QQmlPropertyPrivate::get(property)->core, expression.toString(), object, QQmlContextData::get(context), filename, line); binding->setTarget(property); QQmlPropertyPrivate::setBinding(binding); binding->update(); -- cgit v1.2.3 From b4ccdf004af8ab5b9e327abf7f87d0bd34ee13c0 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Wed, 30 Nov 2016 16:20:32 +0100 Subject: Change ExecutionContext::getFunctionObject() to getFunction() And return a QV4::Function from now on. This simplifies code in other places and provides all the info required for stack traces and debugging. Change-Id: I512a8ac3932268d8cfc60675e75c4661d1f16fd8 Reviewed-by: Simon Hausmann --- .../qmldbg_debugger/qqmlnativedebugservice.cpp | 24 ++++++++-------------- .../qmltooling/qmldbg_debugger/qv4debugger.cpp | 5 ++--- 2 files changed, 11 insertions(+), 18 deletions(-) (limited to 'src/plugins') diff --git a/src/plugins/qmltooling/qmldbg_debugger/qqmlnativedebugservice.cpp b/src/plugins/qmltooling/qmldbg_debugger/qqmlnativedebugservice.cpp index 5b96163b48..14dfc5356e 100644 --- a/src/plugins/qmltooling/qmldbg_debugger/qqmlnativedebugservice.cpp +++ b/src/plugins/qmltooling/qmldbg_debugger/qqmlnativedebugservice.cpp @@ -336,18 +336,16 @@ void NativeDebugger::handleBacktrace(QJsonObject *response, const QJsonObject &a QJsonArray frameArray; QV4::ExecutionContext *executionContext = m_engine->currentContext; for (int i = 0; i < limit && executionContext; ++i) { - QV4::Heap::FunctionObject *heapFunctionObject = executionContext->getFunctionObject(); - if (heapFunctionObject) { + if (QV4::Function *function = executionContext->getFunction()) { QJsonObject frame; frame[QStringLiteral("language")] = QStringLiteral("js"); frame[QStringLiteral("context")] = encodeContext(executionContext); - if (QV4::Function *function = heapFunctionObject->function) { - if (QV4::Heap::String *functionName = function->name()) - frame[QStringLiteral("function")] = functionName->toQString(); - frame[QStringLiteral("file")] = function->sourceFile(); - } + if (QV4::Heap::String *functionName = function->name()) + frame[QStringLiteral("function")] = functionName->toQString(); + frame[QStringLiteral("file")] = function->sourceFile(); + int line = executionContext->d()->lineNumber; frame[QStringLiteral("line")] = (line < 0 ? -line : line); @@ -667,11 +665,9 @@ void NativeDebugger::aboutToThrow() QV4::Function *NativeDebugger::getFunction() const { - QV4::Scope scope(m_engine); QV4::ExecutionContext *context = m_engine->currentContext; - QV4::ScopedFunctionObject function(scope, context->getFunctionObject()); - if (function) - return function->function(); + if (QV4::Function *function = context->getFunction()) + return function; else return context->d()->engine->globalCode; } @@ -683,10 +679,8 @@ void NativeDebugger::pauseAndWait() event.insert(QStringLiteral("event"), QStringLiteral("break")); event.insert(QStringLiteral("language"), QStringLiteral("js")); if (QV4::ExecutionContext *executionContext = m_engine->currentContext) { - QV4::Heap::FunctionObject *heapFunctionObject = executionContext->getFunctionObject(); - if (heapFunctionObject) { - if (QV4::Function *function = heapFunctionObject->function) - event.insert(QStringLiteral("file"), function->sourceFile()); + if (QV4::Function *function = executionContext->getFunction()) { + event.insert(QStringLiteral("file"), function->sourceFile()); int line = executionContext->d()->lineNumber; event.insert(QStringLiteral("line"), (line < 0 ? -line : line)); } diff --git a/src/plugins/qmltooling/qmldbg_debugger/qv4debugger.cpp b/src/plugins/qmltooling/qmldbg_debugger/qv4debugger.cpp index 44810dd4cb..5cc2043cb1 100644 --- a/src/plugins/qmltooling/qmldbg_debugger/qv4debugger.cpp +++ b/src/plugins/qmltooling/qmldbg_debugger/qv4debugger.cpp @@ -252,9 +252,8 @@ QV4::Function *QV4Debugger::getFunction() const { QV4::Scope scope(m_engine); QV4::ExecutionContext *context = m_engine->currentContext; - QV4::ScopedFunctionObject function(scope, context->getFunctionObject()); - if (function) - return function->function(); + if (QV4::Function *function = context->getFunction()) + return function; else return context->d()->engine->globalCode; } -- cgit v1.2.3 From deec039008c4df5ec2686459ee8c00801ee9d852 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Thu, 1 Dec 2016 15:37:32 +0100 Subject: Refactor the calling code for (Simple)ScriptFunction Factor the common code out into separate methods that can later on be reused by the QQmlJavaScriptExpression. Also ensure a CallContext is safe to use with a 0 FunctionObject. Change-Id: I1181a8e320b8c931d9df5b2c91bc143d8587fb60 Reviewed-by: Simon Hausmann --- src/plugins/qmltooling/qmldbg_debugger/qv4datacollector.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/plugins') diff --git a/src/plugins/qmltooling/qmldbg_debugger/qv4datacollector.cpp b/src/plugins/qmltooling/qmldbg_debugger/qv4datacollector.cpp index b2db23d78c..aed2759383 100644 --- a/src/plugins/qmltooling/qmldbg_debugger/qv4datacollector.cpp +++ b/src/plugins/qmltooling/qmldbg_debugger/qv4datacollector.cpp @@ -60,7 +60,7 @@ QV4::CallContext *QV4DataCollector::findContext(int frame) QV4::ExecutionContext *ctx = engine()->currentContext; while (ctx) { QV4::CallContext *cCtxt = ctx->asCallContext(); - if (cCtxt && cCtxt->d()->function) { + if (cCtxt && cCtxt->d()->v4Function) { if (frame < 1) return cCtxt; --frame; -- cgit v1.2.3 From d7ef2aa02c9ba736104fe973bfce7d87e30f81af Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Wed, 7 Dec 2016 13:56:45 +0100 Subject: Qml Inspector: Avoid taking a QPointer of an object being deleted As we manually remove items to be deleted from the list of selected items, we don't need to keep them as QPointer in the first place. Change-Id: Ie416b47d4f193cb3dc7cfb07e66ab2b36ad6721c Reviewed-by: Simon Hausmann --- src/plugins/qmltooling/qmldbg_inspector/globalinspector.cpp | 4 +--- src/plugins/qmltooling/qmldbg_inspector/globalinspector.h | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) (limited to 'src/plugins') diff --git a/src/plugins/qmltooling/qmldbg_inspector/globalinspector.cpp b/src/plugins/qmltooling/qmldbg_inspector/globalinspector.cpp index 107d54c626..ca7c76ab50 100644 --- a/src/plugins/qmltooling/qmldbg_inspector/globalinspector.cpp +++ b/src/plugins/qmltooling/qmldbg_inspector/globalinspector.cpp @@ -234,9 +234,7 @@ bool GlobalInspector::syncSelectedItems(const QList &items) bool selectionChanged = false; // Disconnect and remove items that are no longer selected - foreach (const QPointer &item, m_selectedItems) { - if (!item) // Don't see how this can happen due to handling of destroyed() - continue; + foreach (QQuickItem *item, m_selectedItems) { if (items.contains(item)) continue; diff --git a/src/plugins/qmltooling/qmldbg_inspector/globalinspector.h b/src/plugins/qmltooling/qmldbg_inspector/globalinspector.h index 338eee14c3..f7b325c454 100644 --- a/src/plugins/qmltooling/qmldbg_inspector/globalinspector.h +++ b/src/plugins/qmltooling/qmldbg_inspector/globalinspector.h @@ -84,7 +84,7 @@ private: bool syncSelectedItems(const QList &items); // Hash< object to be destroyed, QPair > - QList > m_selectedItems; + QList m_selectedItems; QHash m_highlightItems; QList m_windowInspectors; int m_eventId; -- cgit v1.2.3