// TODO: quite possibly the real logic for generating "click" events is // more complicated // (x, y) is in the coordinates of the root window LRESULT EventMgr::OnLButtonUp(WPARAM keys, int x, int y, bool& wasHandled) { Vec<CtrlAndOffset> controls; uint16 wantedInputMask = bit::FromBit<uint16>(Control::WantsMouseClickBit); size_t count = CollectWindowsAt(wndRoot, x, y, wantedInputMask, &controls); if (0 == count) return 0; // TODO: should this take z-order into account? Control *c = controls.Last().c; c->MapRootToMyPos(x, y); NotifyClicked(c, x, y); NotifyNamedEventClicked(c, x, y); return 0; }
// TODO: optimize by getting both mouse over and mouse move windows in one call // x, y is a position in the root window LRESULT EventMgr::OnMouseMove(WPARAM keys, int x, int y, bool& wasHandled) { Vec<CtrlAndOffset> windows; Control *c; uint16 wantedInputMask = bit::FromBit<uint16>(Control::WantsMouseOverBit); size_t count = CollectWindowsAt(wndRoot, x, y, wantedInputMask, &windows); if (0 == count) { if (currOver) { currOver->SetIsMouseOver(false); currOver->NotifyMouseLeave(); currOver = nullptr; } } else { // TODO: should this take z-order into account ? c = windows.Last().c; if (c != currOver) { if (currOver) { currOver->SetIsMouseOver(false); currOver->NotifyMouseLeave(); } currOver = c; currOver->SetIsMouseOver(true); currOver->NotifyMouseEnter(); } } wantedInputMask = bit::FromBit<uint16>(Control::WantsMouseMoveBit); count = CollectWindowsAt(wndRoot, x, y, wantedInputMask, &windows); if (0 == count) return 0; c = windows.Last().c; c->MapRootToMyPos(x, y); c->NotifyMouseMove(x, y); return 0; }