Module: wine Branch: master Commit: 916017d42099121f7f4e364ced2b1d88f505e7d7 URL: http://source.winehq.org/git/wine.git/?a=commit;h=916017d42099121f7f4e364ced...
Author: Nikolay Sivov bunglehead@gmail.com Date: Wed Sep 30 00:22:51 2009 +0400
comctl32/monthcal: Move selection logic to LButton release handler, fix notifications order.
---
dlls/comctl32/monthcal.c | 70 +++++++++++++++++++-------------------------- 1 files changed, 30 insertions(+), 40 deletions(-)
diff --git a/dlls/comctl32/monthcal.c b/dlls/comctl32/monthcal.c index bbf6cb7..d68076d 100644 --- a/dlls/comctl32/monthcal.c +++ b/dlls/comctl32/monthcal.c @@ -1498,34 +1498,9 @@ MONTHCAL_LButtonDown(MONTHCAL_INFO *infoPtr, LPARAM lParam) } case MCHT_CALENDARDATE: { - RECT rcDay; /* used in determining area to invalidate */ - SYSTEMTIME selArray[2]; - NMSELCHANGE nmsc; - - selArray[0] = ht.st; - selArray[1] = ht.st; - MONTHCAL_SetSelRange(infoPtr, selArray); - MONTHCAL_SetCurSel(infoPtr, &selArray[0]); TRACE("MCHT_CALENDARDATE\n"); - nmsc.nmhdr.hwndFrom = infoPtr->hwndSelf; - nmsc.nmhdr.idFrom = GetWindowLongPtrW(infoPtr->hwndSelf, GWLP_ID); - nmsc.nmhdr.code = MCN_SELCHANGE; - nmsc.stSelStart = infoPtr->minSel; - nmsc.stSelEnd = infoPtr->maxSel; - - SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, nmsc.nmhdr.idFrom, (LPARAM)&nmsc); - - /* redraw both old and new days if the selected day changed */ - if(infoPtr->curSel.wDay != ht.st.wDay) { - MONTHCAL_CalcPosFromDay(infoPtr, ht.st.wDay, ht.st.wMonth, &rcDay); - InvalidateRect(infoPtr->hwndSelf, &rcDay, TRUE); - - MONTHCAL_CalcPosFromDay(infoPtr, infoPtr->curSel.wDay, infoPtr->curSel.wMonth, &rcDay); - InvalidateRect(infoPtr->hwndSelf, &rcDay, TRUE); - }
infoPtr->firstSelDay = ht.st.wDay; - infoPtr->curSel.wDay = ht.st.wDay; infoPtr->status = MC_SEL_LBUTDOWN; return 0; } @@ -1557,6 +1532,14 @@ MONTHCAL_LButtonUp(MONTHCAL_INFO *infoPtr, LPARAM lParam) redraw = TRUE; }
+ /* always send NM_RELEASEDCAPTURE notification */ + nmhdr.hwndFrom = infoPtr->hwndSelf; + nmhdr.idFrom = GetWindowLongPtrW(infoPtr->hwndSelf, GWLP_ID); + nmhdr.code = NM_RELEASEDCAPTURE; + TRACE("Sent notification from %p to %p\n", infoPtr->hwndSelf, infoPtr->hwndNotify); + + SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, nmhdr.idFrom, (LPARAM)&nmhdr); + ht.cbSize = sizeof(MCHITTESTINFO); ht.pt.x = (short)LOWORD(lParam); ht.pt.y = (short)HIWORD(lParam); @@ -1564,28 +1547,29 @@ MONTHCAL_LButtonUp(MONTHCAL_INFO *infoPtr, LPARAM lParam)
infoPtr->status = MC_SEL_LBUTUP;
- if((hit == MCHT_CALENDARDATENEXT) || (hit == MCHT_CALENDARDATEPREV)) { - SYSTEMTIME st[2]; + if((hit == MCHT_CALENDARDATENEXT) || + (hit == MCHT_CALENDARDATEPREV) || + (hit == MCHT_CALENDARDATE)) + { + SYSTEMTIME st[2], sel = infoPtr->curSel;
st[0] = st[1] = ht.st; MONTHCAL_SetSelRange(infoPtr, st); + /* will be invalidated here */ MONTHCAL_SetCurSel(infoPtr, &st[0]);
- InvalidateRect(infoPtr->hwndSelf, NULL, FALSE); - return TRUE; - } + /* send MCN_SELCHANGE only if new date selected */ + if (!MONTHCAL_IsDateEqual(&sel, &ht.st)) + { + nmsc.nmhdr.hwndFrom = infoPtr->hwndSelf; + nmsc.nmhdr.idFrom = GetWindowLongPtrW(infoPtr->hwndSelf, GWLP_ID); + nmsc.nmhdr.code = MCN_SELCHANGE; + nmsc.stSelStart = infoPtr->minSel; + nmsc.stSelEnd = infoPtr->maxSel;
- nmhdr.hwndFrom = infoPtr->hwndSelf; - nmhdr.idFrom = GetWindowLongPtrW(infoPtr->hwndSelf, GWLP_ID); - nmhdr.code = NM_RELEASEDCAPTURE; - TRACE("Sent notification from %p to %p\n", infoPtr->hwndSelf, infoPtr->hwndNotify); + SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, nmsc.nmhdr.idFrom, (LPARAM)&nmsc); + }
- SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, nmhdr.idFrom, (LPARAM)&nmhdr); - /* redraw if necessary */ - if(redraw) - InvalidateRect(infoPtr->hwndSelf, NULL, FALSE); - /* only send MCN_SELECT if currently displayed month's day was selected */ - if(hit == MCHT_CALENDARDATE) { nmsc.nmhdr.hwndFrom = infoPtr->hwndSelf; nmsc.nmhdr.idFrom = GetWindowLongPtrW(infoPtr->hwndSelf, GWLP_ID); nmsc.nmhdr.code = MCN_SELECT; @@ -1594,7 +1578,13 @@ MONTHCAL_LButtonUp(MONTHCAL_INFO *infoPtr, LPARAM lParam)
SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, nmsc.nmhdr.idFrom, (LPARAM)&nmsc);
+ return 0; } + + /* redraw if necessary */ + if(redraw) + InvalidateRect(infoPtr->hwndSelf, NULL, FALSE); + return 0; }