void ChoosePositionPushButton::mouseReleaseEvent(QMouseEvent *event) { QPushButton::mouseReleaseEvent(event); emit positionChosen(event->globalPos()); stopMouseCapture(); }
ChoosePositionPushButton::~ChoosePositionPushButton() { if(mSearching) stopMouseCapture(); nativeEventFilteringApp->removeNativeEventFilter(this); delete mCrossIcon; }
ChoosePositionPushButton::~ChoosePositionPushButton() { if(mSearching) stopMouseCapture(); #ifdef Q_OS_UNIX QCoreApplication::instance()->removeNativeEventFilter(this); XFreeCursor(QX11Info::display(), mCrossCursor); #endif delete mCrossIcon; }
bool ChoosePositionPushButton::x11EventFilter(XEvent *event) { if(event->type == ButtonRelease) { emit positionChosen(QCursor::pos()); stopMouseCapture(); return true; } return false; }
ChooseWindowPushButton::~ChooseWindowPushButton() { if(mSearching) stopMouseCapture(); nativeEventFilteringApp->removeNativeEventFilter(this); #ifdef Q_WS_WIN DeleteObject(mRectanglePen); #endif delete mCrossIcon; }
bool ChooseWindowPushButton::x11EventFilter(XEvent *event) { if(event->type == ButtonRelease) { Window window = windowAtPointer(); if(window == None) return true; if(isWindowValid(window)) mLastFoundWindow = window; stopMouseCapture(); return true; } return false; }
bool ChoosePositionPushButton::nativeEventFilter(const QByteArray &eventType, void *message, long *) { if(eventType == "xcb_generic_event_t") { auto* event = static_cast<xcb_generic_event_t *>(message); switch(event->response_type) { case XCB_BUTTON_RELEASE: emit positionChosen(QCursor::pos()); stopMouseCapture(); return false; } return false; } return false; }
bool ChooseWindowPushButton::winEventFilter(MSG *msg, long *result) { Q_UNUSED(result); if(!msg || !mSearching) return false; switch(msg->message) { case WM_LBUTTONUP: stopMouseCapture(); break; case WM_MOUSEMOVE: { POINT screenpoint; GetCursorPos(&screenpoint); HWND window = NULL; HWND firstWindow = WindowFromPoint(screenpoint); if(firstWindow && IsWindow(firstWindow)) { // try to go to child window if(!GetParent(firstWindow)) { POINT pt; pt.x = screenpoint.x; pt.y = screenpoint.y; ScreenToClient(firstWindow, &pt); HWND childWindow = ChildWindowFromPoint(firstWindow, pt); if(firstWindow != childWindow) { RECT rc; GetWindowRect(childWindow, &rc); if(PtInRect(screenpoint, rc)) // it may seem strange to check this condition after above lines // but try to comment it and work with MSDN main window, // you will hardly "find" it firstWindow = childWindow; } } // find the best child if(GetParent(firstWindow)) { RECT rcFirst; GetWindowRect(firstWindow, &rcFirst); // find next/prev windows in the Z-order bool bBestFound = false; HWND hOther = firstWindow; do { hOther = GetNextWindow(hOther, GW_HWNDPREV); if(!hOther) break; RECT rcOther; GetWindowRect(hOther, &rcOther); if(PtInRect(screenpoint, rcOther) && PtInRect(RectTopLeft(rcOther), rcFirst) && PtInRect(RectBottomRight(rcOther), rcFirst)) { firstWindow = hOther; bBestFound = true; } } while(!bBestFound); if(!bBestFound) { hOther = firstWindow; do { hOther = GetNextWindow(hOther, GW_HWNDNEXT); if (!hOther) break; RECT rcOther; GetWindowRect(hOther, &rcOther); if(PtInRect(screenpoint, rcOther) && PtInRect(RectTopLeft(rcOther), rcFirst) && PtInRect(RectBottomRight(rcOther), rcFirst)) { firstWindow = hOther; bBestFound = true; } } while(!bBestFound); } } window = firstWindow; } else break; foundWindow(WindowHandle(window)); } break; } return false; }
void ChooseWindowPushButton::mouseReleaseEvent(QMouseEvent *event) { QPushButton::mouseReleaseEvent(event); stopMouseCapture(); }