- deal with dpiRatio when sending WM move resize events

- check event "local" position instead of global, for starting drag, because global can get +1 offsets in high
dpi mode.
BUG: 351321
wilder-pre-rebase
Hugo Pereira Da Costa 11 years ago
parent d0fd815dec
commit 6d8c9bfde5
  1. 29
      kstyle/breezewindowmanager.cpp

@ -76,6 +76,11 @@
#include <QTextStream> #include <QTextStream>
#if QT_VERSION >= 0x050300
// needed to deal with device pixel ratio
#include <QWindow>
#endif
#if BREEZE_HAVE_X11 #if BREEZE_HAVE_X11
#include <QX11Info> #include <QX11Info>
#endif #endif
@ -389,7 +394,7 @@ namespace Breeze
if( _dragAboutToStart ) if( _dragAboutToStart )
{ {
if( mouseEvent->globalPos() == _globalDragPoint ) if( mouseEvent->pos() == _dragPoint )
{ {
// start timer, // start timer,
_dragAboutToStart = false; _dragAboutToStart = false;
@ -740,6 +745,16 @@ namespace Breeze
// window // window
const WId window( widget->window()->winId() ); const WId window( widget->window()->winId() );
#if QT_VERSION >= 0x050300
qreal dpiRatio = 1;
QWindow* windowHandle = widget->window()->windowHandle();
if( windowHandle ) dpiRatio = windowHandle->devicePixelRatio();
else dpiRatio = qApp->devicePixelRatio();
dpiRatio = qApp->devicePixelRatio();
#else
const qreal dpiRatio = 1;
#endif
// from bespin/virtuality // from bespin/virtuality
xcb_button_release_event_t releaseEvent; xcb_button_release_event_t releaseEvent;
memset(&releaseEvent, 0, sizeof(releaseEvent)); memset(&releaseEvent, 0, sizeof(releaseEvent));
@ -748,10 +763,10 @@ namespace Breeze
releaseEvent.event = window; releaseEvent.event = window;
releaseEvent.child = XCB_WINDOW_NONE; releaseEvent.child = XCB_WINDOW_NONE;
releaseEvent.root = QX11Info::appRootWindow(); releaseEvent.root = QX11Info::appRootWindow();
releaseEvent.event_x = _dragPoint.x(); releaseEvent.event_x = _dragPoint.x()*dpiRatio;
releaseEvent.event_y = _dragPoint.y(); releaseEvent.event_y = _dragPoint.y()*dpiRatio;
releaseEvent.root_x = position.x(); releaseEvent.root_x = position.x()*dpiRatio;
releaseEvent.root_y = position.y(); releaseEvent.root_y = position.y()*dpiRatio;
releaseEvent.detail = XCB_BUTTON_INDEX_1; releaseEvent.detail = XCB_BUTTON_INDEX_1;
releaseEvent.state = XCB_BUTTON_MASK_1; releaseEvent.state = XCB_BUTTON_MASK_1;
releaseEvent.time = XCB_CURRENT_TIME; releaseEvent.time = XCB_CURRENT_TIME;
@ -768,8 +783,8 @@ namespace Breeze
clientMessageEvent.format = 32; clientMessageEvent.format = 32;
clientMessageEvent.window = window; clientMessageEvent.window = window;
clientMessageEvent.type = _moveResizeAtom; clientMessageEvent.type = _moveResizeAtom;
clientMessageEvent.data.data32[0] = position.x(); clientMessageEvent.data.data32[0] = position.x()*dpiRatio;
clientMessageEvent.data.data32[1] = position.y(); clientMessageEvent.data.data32[1] = position.y()*dpiRatio;
clientMessageEvent.data.data32[2] = 8; // NET::Move clientMessageEvent.data.data32[2] = 8; // NET::Move
clientMessageEvent.data.data32[3] = XCB_KEY_BUT_MASK_BUTTON_1; clientMessageEvent.data.data32[3] = XCB_KEY_BUT_MASK_BUTTON_1;
xcb_send_event( connection, false, QX11Info::appRootWindow(), xcb_send_event( connection, false, QX11Info::appRootWindow(),

Loading…
Cancel
Save