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

Loading…
Cancel
Save