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:
Roland Pallai 2023-01-27 14:29:56 +01:00
parent b464119dd4
commit 03ac8c7397
3 changed files with 6 additions and 4 deletions

View File

@ -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"

View File

@ -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,

View File

@ -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;
} }