If an item was updated while the display was in sleep mode then when the
display came back from sleep it would not be updated. This change detects
when the display returns from sleep and repaints the windows to ensure
the updated items are presented.
Fixes: QTBUG-76307
Change-Id: I5fff5209e8a5c359d06ba1df61944690e9475ea6
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
Instead of using the address of a function pointer, we name-mangle window
classes by using an UUID.
This fixes a real-world problem with multiple Qt instances where for some
reasons the window function appears to be mapped to the same address.
Change-Id: Id27e8d7aa17a4db9c14559224395f49d3ecd8d78
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
Special applications like screen recorders can create special, invisible
windows which are detected by the ChildWindowFromPointEx() as used in
QWindowsContext::findPlatformWindowAt(). Fall back to WindowFromPoint()
which skips those in case nothing is found.
Fixes: QTBUG-40815
Change-Id: Idb5253c412fb4522c844edf5eadedc6e0fad3979
Reviewed-by: André de la Rocha <andre.rocha@qt.io>
When the left or right mouse buttons are pressed over the window title
bar a WM_NCLBUTTONDOWN/WM_NCRBUTTONDOWN message is received. But when the
button is released, no corresponding UP message is received, but only
a WM_NCMOUSEMOVE or WM_MOUSEMOVE. This makes the internal mouse button
state stored in QGuiApplication get out of sync with the actual state,
resulting in an incorrect button state being used in QWheelEvent.
This patch detects the button release condition and generates the missing
release event.
Change-Id: I6dd9f8580bd6ba772522574f9a08298e49c43e61
Fixes: QTBUG-75678
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
Postpone the screen change until the DPI changed event in case a move
between screens with different DPI is detected.
Task-number: QTBUG-65580
Change-Id: I356f144b243d7d1ce7feabf0434c3f534b903965
Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
Reviewed-by: Andre de la Rocha <andre.rocha@qt.io>
When introducing EnableNonClientDpiScaling() for QTBUG-53255, the window
frame calculation was not adapted. That is, window frames were calculated
from the style for the primary screen only, causing
- minimum size constraints not being calculated correctly for applications
on secondary screens when populating the MINMAXINFO structure.
- warnings about not being able to apply a geometry when moving fixed
size windows across screens.
The calculation of the frames for propagating size hints is also no longer
required after 3035400f36, which retrieves
them from the WM_NCCALCSIZE message; QWindowsWindow::fullFrameMargins() can
be used instead.
For newly created windows, use the newly added AdjustWindowRectExForDpi()
function to calculate the initial frame size.
Change QWindowsGeometryHint from a class to a collection of static functions
and add overloads to calculate the frame.
In checkForScreenChanged(), update the margins until WM_NCCALCSIZE is
received.
Task-number: QTBUG-67777
Task-number: QTBUG-65580
Task-number: QTBUG-53255
Change-Id: Iff2d382b2b316adec6c1a0622ae8015dba6de371
Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
Reviewed-by: Andre de la Rocha <andre.rocha@qt.io>
Include screen and MINMAXINFO values in the message about not being able to
set the geometry.
Suppress output of some window finding functions unless verbose.
Change-Id: Iaaae59ecb302438b3444735067d018c77d2af162
Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
Handle WM_SETCURSOR to apply override cursors to window that do not have
mouse capture (as is done in Qt 4).
Fixes: QTBUG-58590
Change-Id: I7ff6f799da1b8d4b4396c0a6137778a11a192617
Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
Reviewed-by: Andre de la Rocha <andre.rocha@qt.io>
This change reverts to using legacy mouse messages when handling mouse
and touchpad input, while using pointer messages to handle touchscreen
and pen input. The use of pointer messages to handle everything, added
in 5.12.0, caused issues in some particular cases, due mainly to
differences in behavior or bugs in the pointer messages, which required
workarounds in the Windows QPA, which didn't work well in all cases and
led to additional issues. For instance, DoDragDrop() does not work when
called by pointer (or touch/pen) handlers, but only after OS-synthesized
legacy mouse messages are generated. Also, in some cases pointer messages
for mouse movement are generated as non-client for client area events.
Modal loops like the ones in window resize/move and menu handling caused
some issues with pointer messages, as well. Also, we have to handle the
OS-synthesized legacy mouse message generated for touch and pen. Ignoring
them while letting the gui layer synthesize mouse events for touch/pen
may break Drag and Drop by triggering DoDragDrop() before legacy messages,
which can result in a hang inside the DoDragDrop() modal loop. This change
should fix most regressions related to pointer messages, while keeping
the enhancements in pen and touch input.
Fixes: QTBUG-73389
Fixes: QTBUG-72624
Fixes: QTBUG-72801
Fixes: QTBUG-73290
Fixes: QTBUG-72458
Fixes: QTBUG-73358
Fixes: QTBUG-72992
Change-Id: I919f78930d3965270ef2094401e827ab87174979
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
The fix for QTBUG-50371 caused an overhead when you hover over a
secondary window like a tool tip, menu or combo box due to the
forcedScreenForGLWindow() function being called, which loads
dx9.dll and sub-dlls and unloads them afterwards. This fix
caches the required info on the first call, and only refreshes
it when required by a display/settings change.
Fixes: QTBUG-73008
Change-Id: Ie604ba4034ad8041b971f5aa46bd43ae03decd55
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
Use newly introduced SystemParametersInfoForDpi() API with some convenience
overloads.
Task-number: QTBUG-4362
Change-Id: I4c41c700007bf7cc4fd5868356e3145c136704c0
Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
The message is not sent to the QAbstractEventDispatcher, so it needs to be
excluded from the list of input messages not sent to
QAbstractNativeEventFilter.
Amends a0a22037cd.
Fixes: QTBUG-70873
Change-Id: Id84d73b46e8954867c06a4ddf5dc9e536ecd897e
Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
Repeatedly attempt to open the clipboard in case it is opened
by other applications.
Task-number: QTBUG-27097
Change-Id: Ic1cfec0bb17e34f8c7f744add21a4431dae4f5b7
Reviewed-by: Andy Shaw <andy.shaw@qt.io>
If the hardware produces events faster than the app can consume between
two updates, Windows automatically coalesces them into a single message
with the latest touch/pen pointer state and coordinates, effectively
compressing those events. But the pointer API also supports querying
and retrieving the skipped individual touch and pen frames.
There are cases where keeping all the events generated by the hardware
is desired, especially for pen events where having the most sampled
points available is critical to precisely rendering curves.
Qt already defines application attributes to control event compression
for general high frequency events and for tablet events in particular.
Use them on Windows also to control whether to retrieve skipped frames.
[ChangeLog][Windows] The application attributes AA_CompressTabletEvents
and AA_CompressHighFrequencyEvents are now supported on Windows 8 and
above for touch/pen input, with the same defaults as on X11 (compress
touch events, don't compress tablet events)
Task-number: QTBUG-44964
Task-number: QTBUG-60437
Change-Id: I1b11a043e2d71ee502895971fafb3a46306a89d8
Reviewed-by: Andre de la Rocha <andre.rocha@qt.io>
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
These fake mouse events should be synthesized by QtGui, not the QPA plugin,
when the tablet/touch events are not handled by the application and the
Qt::AA_SynthesizeMouseForUnhandledTouchEvents or
Qt::AA_SynthesizeMouseForUnhandledTabletEvents flags are set.
Task-number: QTBUG-47007
Task-number: QTBUG-60437
Change-Id: I4d6d5e6667d245c45a4eb4f3a94db05cf9772f52
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
Reviewed-by: Romain Pokrzywka <romain.pokrzywka@gmail.com>
Reviewed-by: Jan Arve Sæther <jan-arve.saether@qt.io>
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
translateTouchEvent needs to filter events based on the message type
passed in msg, as Windows sends more than just down/up/update events,
it also sends enter/leave for each touch and occasionally a few more.
One of them is WM_POINTERCAPTURECHANGED which indicates a general loss
of touch input, which needs to be translated to a touch cancel event.
Ignore WM_POINTERENTER/WM_POINTERLEAVE events as they result in sending
duplicate Qt::TouchPointPressed/Qt::TouchPointReleased events otherwise.
Also avoid sending duplicate events for each additional touchpoint:
Windows already bundles all available touchpoints for a touch event
when calling GetPointerFrameTouchInfo, so we get all points at once,
but we'll still receive other events for each additional touchpoint,
resulting in reading the same bundled data again for each one and
sending duplicate events to QWindowSystemInterface.
Use SkipPointerFrameMessages() to avoid receiving the additional
events for the frame we just processed.
Finally, add raw event logging when the platform verbose level is >1.
Change-Id: I55d840285f642a00f6ffcda4a3efd7ae3985310b
Reviewed-by: Andre de la Rocha <andre.rocha@qt.io>
Compute QPointF hi-res screen coordinates based on the HIMETRIC values
contained in the native message. This gives the same high-precision
screen coordinates as what the old WinTab handler supported.
Add the possibility to not synthesize mouse events if the platform
plugin option DontPassOsMouseEventsSynthesizedFromTouch is set,
just like we do for finger touches. This makes it possible to have
clean Pen events without mouse duplicates for an application that
handles both input types in parallel.
Add raw event logging when the platform verbose level is >1.
Change-Id: Ibf68b6275400388a76f8d5c573eed8f4b9bf4e9d
Reviewed-by: Andre de la Rocha <andre.rocha@qt.io>
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
According to MSDN, AltGr key presses are sent as a
sequence of SYS left Ctrl + right Alt.
Add an option to detect AltGr as modifier key.
Task-number: QTBUG-69317
Change-Id: I30ce169d2e6dbbae194ff714abfbc732b53652ce
Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
Replaces the handling of tablet/touchscreen/touchpad/mouse input with a
unified implementation based on the Windows Pointer Input Messages added
to Windows 8. The legacy implementation is still used for Windows 7.
Task-number: QTBUG-60437
Change-Id: I0a0f48ee9d5365f84ba528aa04c6ab1fe4253c50
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
Adding missing "override" keywords in overridden interfaces, using
"#if QT_CONFIG(accessibility)" instead of "#ifndef QT_NO_ACCESSIBILITY",
and other minor bits. No change in behavior expected.
Change-Id: Ief0e23cb7b577dd3e4af21750b6beccc80d6a2f8
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
...for consistency with the other platform plugins.
Change-Id: I85946d610a62c19140618c83f80c4aa63fce4bc3
Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
Change a0a22037cd wrongly introduced
a level of indirection when passing the MSG * as void * to
QWindowSystemInterface::handleNativeEvent() in
QWindowsContext::filterNativeEvent(). Remove the indirection.
Task-number: QTBUG-67095
Change-Id: Ibc2db7ae56bca38f79bafabfabb6127d6ff8cf09
Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
Change
#include <QtCore/QDebug>
to
#include <QtCore/qdebug.h>
according to the coding style.
Change-Id: I6ba8a7424c548ddde1d18f3f6f4f87e30973d710
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
Windows 10 windows contain an invisible area within the NC window frame
on which the mouse cursor is enabled to perform resizing. This change
captures the geometry of the invisible margins and considers it when
moving a window, so that, for instance, a move(0,0) does not generate
gap between the window and the beginning of screen.
[ChangeLog][Windows] The dimensions of invisible margins inside the
frames of Windows 10 windows will now be disregarded in the positioning
of Qt windows to avoid a misplaced look (offset by a few pixels from
the expected position).
Task-number: QTBUG-55762
Change-Id: I1f537756eb1a093f78b919de9d44992528199700
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
When moving a window by dragging the title bar, no WM_NCLBUTTONUP is
received after WM_NCLBUTTONDOWN, WM_NCMOUSEMOVE (due to internal mouse
capture), which can leave the left mouse button 'pressed' in
QGuiApplication's state. Intercept WM_EXITSIZEMOVE to sync the buttons.
Complements 4589440891.
Change-Id: I94d18d1d4a4796dcecb1a9731809d05c7f9ddd65
Reviewed-by: Andre de la Rocha <andre.rocha@qt.io>
Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
Add utility functions to QWindowsContext input messages sent to
native event filters (event dispatcher and window system interface).
Do not send input and similar events to the event dispatcher since
QEventDispatcherWin32::processEvents() also sends them.
Note though that QEventDispatcherWin32 does not receive all windows
messages.
In QWindowsKeyMapper, send the WM_CHAR/WM_IMECHAR events from
where the messages are removed.
Task-number: QTBUG-67095
Change-Id: I5f61294fcb3aee7e0eacd840a2010d128cd02a5d
Reviewed-by: Andre de la Rocha <andre.rocha@qt.io>
Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
Add more message codes and fix the whitespaces in the output:
EVENT: hwd= 0x280484 WM_WINDOWPOSCHANGED msg=0x 47 et=0x 21e wp= 0 at -2208 -31887 handled= false
->
EVENT: hwd=0x2204d6 WM_WINDOWPOSCHANGED msg=0x47 et=0x21e wp=0 at -3280,-19633 handled=false
Change-Id: I89a7b3bd328748ef39fe2dcd789497f43e9d4a2a
Reviewed-by: Andre de la Rocha <andre.rocha@qt.io>
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
Replaces the Qt Accessibility Windows back end, formerly based on legacy
MSAA, with a new implementation based on UI Automation. Fixes issues with
accessibility tools like screen readers and magnifiers, and with the
automatic showing and hiding of the virtual keyboard in touchscreen-based
Windows computers.
[ChangeLog][Windows] The Windows Accessibility back end, formerly based on
Microsoft Active Accessibility, was replaced with a new implementation
based on Microsoft UI Automation.
Task-number: QTPM-487
Task-number: QTBUG-53024
Task-number: QTBUG-43190
Task-number: QTBUG-61926
Task-number: QTBUG-38499
Task-number: QTBUG-38337
Task-number: QTBUG-38501
Task-number: QTBUG-38502
Task-number: QTBUG-38504
Task-number: QTBUG-38505
Task-number: QTBUG-38507
Change-Id: I20b4f8f5e938fef791c6e9c577fcd919140999bd
Reviewed-by: Jan Arve Sæther <jan-arve.saether@qt.io>
Use QOperatingSystemVersion for comparisons and remove
code for versions < Windows 7.
Change-Id: I5a5e3d08a29accd42f170da3ee9c9021ca499f82
Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
Reviewed-by: Jake Petroules <jake.petroules@qt.io>
When dragging a window by its border, detect the screen by mouse position
to prevent it from oscillating between screens when it resizes.
Task-number: QTBUG-62971
Change-Id: I0a4a584ef8ff3bb7288d1abec4de51fb4091dccd
Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
Reviewed-by: Thorbjørn Lund Martsum <tmartsum@gmail.com>
Remaining uses of Q_NULLPTR are in:
src/corelib/global/qcompilerdetection.h
(definition and documentation of Q_NULLPTR)
tests/manual/qcursor/qcursorhighdpi/main.cpp
(a test executable compilable both under Qt4 and Qt5)
Change-Id: If6b074d91486e9b784138f4514f5c6d072acda9a
Reviewed-by: Ville Voutilainen <ville.voutilainen@qt.io>
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Reviewed-by: Olivier Goffart (Woboq GmbH) <ogoffart@woboq.com>