void OverlayControl::MouseDown(HWND hwnd, WPARAM wParam, LPARAM lParam) { if (!ActiveOverlay) return; // Left or right button clicked -- select the element under cursor. RECT clipRect, clientRect; GetWindowRect(hwnd, &clipRect); GetClientRect(hwnd, &clientRect); // Save original mouse position. GetCursorPosition(hwnd, &clickAnchor); // Element could be activated only if no element active AND user doesn't click // within the active element. if (!ActiveOverlay->ActiveElement || !ActiveOverlay->HitTestElement(ActiveOverlay->ActiveElement, &clientRect, &clickAnchor, &hitTestAnchor)) { // Find overlay element under cursor. OverlayElement *element = ActiveOverlay->FindElementFromPoint(&clientRect, &clickAnchor, &hitTestAnchor); ActivateElement(hwnd, element); } if (!ActiveOverlay->ActiveElement) { ResetCursor(); } if (0 != (wParam & MK_LBUTTON)) { if (ActiveOverlay->ActiveElement) { ActiveOverlay->ActiveElement->GetRect(&clientRect, &elementRectAnchor); // Show that we're about to drag the object. UpdateCursor(hitTestAnchor); // Capture the mouse. SetCapture(hwnd); ClipCursor(&clipRect); } return; } if (0 != (wParam & MK_RBUTTON)) { // Show popup menu. POINT pt; GetCursorPos(&pt); __raise RightMouseButtonClicked(ActiveOverlay->ActiveElement, &pt); return; } }
static void ElementStateEventProc(ClientData clientData, XEvent *ev) { ElementStateTracker *es = (ElementStateTracker *)clientData; Ttk_LayoutNode *node; switch (ev->type) { case MotionNotify : node = Ttk_LayoutIdentify( es->corePtr->layout,ev->xmotion.x,ev->xmotion.y); ActivateElement(es, node); break; case LeaveNotify: ActivateElement(es, 0); if (ev->xcrossing.mode == NotifyGrab) PressElement(es, 0); break; case EnterNotify: node = Ttk_LayoutIdentify( es->corePtr->layout,ev->xcrossing.x,ev->xcrossing.y); ActivateElement(es, node); break; case ButtonPress: node = Ttk_LayoutIdentify( es->corePtr->layout, ev->xbutton.x, ev->xbutton.y); if (node) PressElement(es, node); break; case ButtonRelease: ReleaseElement(es); break; case DestroyNotify: /* Unregister this event handler and free client data. */ Tk_DeleteEventHandler(es->corePtr->tkwin, ElementStateMask, ElementStateEventProc, es); ckfree(clientData); break; } }