QXcbConnection::getTimestamp: do not return stale timestamp
The problem is `PropertyNotify` event generated by `xcb_delete_property()` at return could be reported as an actual timestamp at next call due to a missing `state` filter. Because `PropertyNotify` is generated even if an unchanged property value is set we can get rid of this delete event easily. This issue causes observable problems in kwin_x11 (KDE project) too. Fixes: QTBUG-56595 Pick-to: 5.15 6.2 6.4 6.5 Change-Id: Ice6cfa934e3769d86e9f7264e369dc5918c8542a Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com> Reviewed-by: Liang Qi <liang.qi@qt.io> Reviewed-by: JiDe Zhang <zhangjide@uniontech.com>
This commit is contained in:
parent
b464119dd4
commit
03ac8c7397
@ -54,6 +54,8 @@ static const char *xcb_atomnames = {
|
|||||||
|
|
||||||
"_QT_CLOSE_CONNECTION\0"
|
"_QT_CLOSE_CONNECTION\0"
|
||||||
|
|
||||||
|
"_QT_GET_TIMESTAMP\0"
|
||||||
|
|
||||||
"_MOTIF_WM_HINTS\0"
|
"_MOTIF_WM_HINTS\0"
|
||||||
|
|
||||||
"DTWM_IS_RUNNING\0"
|
"DTWM_IS_RUNNING\0"
|
||||||
|
@ -55,6 +55,8 @@ public:
|
|||||||
// Qt/XCB specific
|
// Qt/XCB specific
|
||||||
_QT_CLOSE_CONNECTION,
|
_QT_CLOSE_CONNECTION,
|
||||||
|
|
||||||
|
_QT_GET_TIMESTAMP,
|
||||||
|
|
||||||
_MOTIF_WM_HINTS,
|
_MOTIF_WM_HINTS,
|
||||||
|
|
||||||
DTWM_IS_RUNNING,
|
DTWM_IS_RUNNING,
|
||||||
|
@ -822,8 +822,8 @@ xcb_timestamp_t QXcbConnection::getTimestamp()
|
|||||||
{
|
{
|
||||||
// send a dummy event to myself to get the timestamp from X server.
|
// send a dummy event to myself to get the timestamp from X server.
|
||||||
xcb_window_t window = rootWindow();
|
xcb_window_t window = rootWindow();
|
||||||
xcb_atom_t dummyAtom = atom(QXcbAtom::CLIP_TEMPORARY);
|
xcb_atom_t dummyAtom = atom(QXcbAtom::_QT_GET_TIMESTAMP);
|
||||||
xcb_change_property(xcb_connection(), XCB_PROP_MODE_APPEND, window, dummyAtom,
|
xcb_change_property(xcb_connection(), XCB_PROP_MODE_REPLACE, window, dummyAtom,
|
||||||
XCB_ATOM_INTEGER, 32, 0, nullptr);
|
XCB_ATOM_INTEGER, 32, 0, nullptr);
|
||||||
|
|
||||||
connection()->flush();
|
connection()->flush();
|
||||||
@ -855,8 +855,6 @@ xcb_timestamp_t QXcbConnection::getTimestamp()
|
|||||||
xcb_timestamp_t timestamp = pn->time;
|
xcb_timestamp_t timestamp = pn->time;
|
||||||
free(event);
|
free(event);
|
||||||
|
|
||||||
xcb_delete_property(xcb_connection(), window, dummyAtom);
|
|
||||||
|
|
||||||
return timestamp;
|
return timestamp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user