Nikolay Sivov : comctl32/monthcal: Support new hittest fields for some cases.

Alexandre Julliard julliard at winehq.org
Mon Aug 16 12:24:57 CDT 2010


Module: wine
Branch: master
Commit: 76d3e1d553df0f8522cd04c242d44d9e2ef2ef07
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=76d3e1d553df0f8522cd04c242d44d9e2ef2ef07

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Sat Aug  7 18:07:03 2010 +0400

comctl32/monthcal: Support new hittest fields for some cases.

---

 dlls/comctl32/monthcal.c       |  109 +++++++++++++++++++++++++++-------------
 dlls/comctl32/tests/monthcal.c |   24 ++++----
 2 files changed, 85 insertions(+), 48 deletions(-)

diff --git a/dlls/comctl32/monthcal.c b/dlls/comctl32/monthcal.c
index 130e5f8..0b72603 100644
--- a/dlls/comctl32/monthcal.c
+++ b/dlls/comctl32/monthcal.c
@@ -557,7 +557,7 @@ static int MONTHCAL_CalcDayFromPos(const MONTHCAL_INFO *infoPtr, int x, int y,
  *  [O] y : week column (zero based)
  */
 static void MONTHCAL_CalcDayXY(const MONTHCAL_INFO *infoPtr,
-                               const SYSTEMTIME *date, int *x, int *y)
+                               const SYSTEMTIME *date, INT *x, INT *y)
 {
   SYSTEMTIME st = infoPtr->minSel;
   LONG cmp;
@@ -1633,10 +1633,22 @@ static INT MONTHCAL_GetCalendarFromPoint(const MONTHCAL_INFO *infoPtr, const POI
   return -1;
 }
 
+static inline UINT fill_hittest_info(const MCHITTESTINFO *src, MCHITTESTINFO *dest)
+{
+  dest->uHit = src->uHit;
+  dest->st = src->st;
+
+  if (dest->cbSize == sizeof(MCHITTESTINFO))
+    memcpy(&dest->rc, &src->rc, sizeof(MCHITTESTINFO) - MCHITTESTINFO_V1_SIZE);
+
+  return src->uHit;
+}
+
 static LRESULT
 MONTHCAL_HitTest(const MONTHCAL_INFO *infoPtr, MCHITTESTINFO *lpht)
 {
   INT day, wday, wnum, calIdx;
+  MCHITTESTINFO htinfo;
   SYSTEMTIME ht_month;
   UINT x, y;
 
@@ -1645,7 +1657,11 @@ MONTHCAL_HitTest(const MONTHCAL_INFO *infoPtr, MCHITTESTINFO *lpht)
   x = lpht->pt.x;
   y = lpht->pt.y;
 
-  memset(&lpht->st, 0, sizeof(lpht->st));
+  htinfo.st = st_null;
+
+  /* we should preserve passed fields if hit area doesn't need them */
+  if (lpht->cbSize == sizeof(MCHITTESTINFO))
+    memcpy(&htinfo.rc, &lpht->rc, sizeof(MCHITTESTINFO) - MCHITTESTINFO_V1_SIZE);
 
   /* Comment in for debugging...
   TRACE("%d %d wd[%d %d %d %d] d[%d %d %d %d] t[%d %d %d %d] wn[%d %d %d %d]\n", x, y,
@@ -1664,12 +1680,15 @@ MONTHCAL_HitTest(const MONTHCAL_INFO *infoPtr, MCHITTESTINFO *lpht)
   if (calIdx == -1)
   {
     if (PtInRect(&infoPtr->todayrect, lpht->pt))
-      lpht->uHit = MCHT_TODAYLINK;
+    {
+      htinfo.uHit = MCHT_TODAYLINK;
+      htinfo.rc = infoPtr->todayrect;
+    }
     else
       /* outside of calendar area? What's left must be background :-) */
-      lpht->uHit = MCHT_CALENDARBK;
+      htinfo.uHit = MCHT_CALENDARBK;
 
-    return lpht->uHit;
+    return fill_hittest_info(&htinfo, lpht);
   }
 
   ht_month = infoPtr->calendars[calIdx].month;
@@ -1680,83 +1699,101 @@ MONTHCAL_HitTest(const MONTHCAL_INFO *infoPtr, MCHITTESTINFO *lpht)
               two calendars have buttons */
     if (calIdx == 0 && PtInRect(&infoPtr->titlebtnprev, lpht->pt))
     {
-      lpht->uHit = MCHT_TITLEBTNPREV;
+      htinfo.uHit = MCHT_TITLEBTNPREV;
+      htinfo.rc = infoPtr->titlebtnprev;
     }
     else if (PtInRect(&infoPtr->titlebtnnext, lpht->pt))
     {
-      lpht->uHit = MCHT_TITLEBTNNEXT;
+      htinfo.uHit = MCHT_TITLEBTNNEXT;
+      htinfo.rc = infoPtr->titlebtnnext;
     }
     else if (PtInRect(&infoPtr->calendars[calIdx].titlemonth, lpht->pt))
     {
-      lpht->uHit = MCHT_TITLEMONTH;
+      htinfo.uHit = MCHT_TITLEMONTH;
+      htinfo.rc = infoPtr->calendars[calIdx].titlemonth;
+      htinfo.iOffset = calIdx;
     }
     else if (PtInRect(&infoPtr->calendars[calIdx].titleyear, lpht->pt))
     {
-      lpht->uHit = MCHT_TITLEYEAR;
+      htinfo.uHit = MCHT_TITLEYEAR;
+      htinfo.rc = infoPtr->calendars[calIdx].titleyear;
+      htinfo.iOffset = calIdx;
     }
     else
-      lpht->uHit = MCHT_TITLE;
+    {
+      htinfo.uHit = MCHT_TITLE;
+      htinfo.rc = infoPtr->calendars[calIdx].title;
+      htinfo.iOffset = calIdx;
+    }
 
-    return lpht->uHit;
+    return fill_hittest_info(&htinfo, lpht);
   }
 
   /* days area (including week days and week numbers */
   day = MONTHCAL_CalcDayFromPos(infoPtr, x, y, &wday, &wnum);
   if (PtInRect(&infoPtr->calendars[calIdx].wdays, lpht->pt))
   {
-    lpht->uHit = MCHT_CALENDARDAY;
-    lpht->st.wYear  = ht_month.wYear;
-    lpht->st.wMonth = (day < 1) ? ht_month.wMonth -1 : ht_month.wMonth;
-    lpht->st.wDay   = (day < 1) ?
+    htinfo.uHit = MCHT_CALENDARDAY;
+    htinfo.iOffset = calIdx;
+    htinfo.st.wYear  = ht_month.wYear;
+    htinfo.st.wMonth = (day < 1) ? ht_month.wMonth -1 : ht_month.wMonth;
+    htinfo.st.wDay   = (day < 1) ?
       MONTHCAL_MonthLength(ht_month.wMonth-1, ht_month.wYear) - day : day;
+
+    MONTHCAL_CalcDayXY(infoPtr, &htinfo.st, &htinfo.iCol, &htinfo.iRow);
   }
   else if(PtInRect(&infoPtr->calendars[calIdx].weeknums, lpht->pt))
   {
-    lpht->uHit = MCHT_CALENDARWEEKNUM;
-    lpht->st.wYear  = ht_month.wYear;
+    htinfo.uHit = MCHT_CALENDARWEEKNUM;
+    htinfo.st.wYear  = ht_month.wYear;
+    htinfo.iOffset = calIdx;
 
     if (day < 1)
     {
-      lpht->st.wMonth = ht_month.wMonth - 1;
-      lpht->st.wDay = MONTHCAL_MonthLength(ht_month.wMonth-1, ht_month.wYear) - day;
+      htinfo.st.wMonth = ht_month.wMonth - 1;
+      htinfo.st.wDay = MONTHCAL_MonthLength(ht_month.wMonth-1, ht_month.wYear) - day;
     }
     else if (day > MONTHCAL_MonthLength(ht_month.wMonth, ht_month.wYear))
     {
-      lpht->st.wMonth = ht_month.wMonth + 1;
-      lpht->st.wDay = day - MONTHCAL_MonthLength(ht_month.wMonth, ht_month.wYear);
+      htinfo.st.wMonth = ht_month.wMonth + 1;
+      htinfo.st.wDay = day - MONTHCAL_MonthLength(ht_month.wMonth, ht_month.wYear);
     }
     else
     {
-      lpht->st.wMonth = ht_month.wMonth;
-      lpht->st.wDay = day;
+      htinfo.st.wMonth = ht_month.wMonth;
+      htinfo.st.wDay = day;
     }
   }
   else if(PtInRect(&infoPtr->calendars[calIdx].days, lpht->pt))
   {
-      lpht->st.wYear  = ht_month.wYear;
-      lpht->st.wMonth = ht_month.wMonth;
+      htinfo.iOffset = calIdx;
+      htinfo.st.wYear  = ht_month.wYear;
+      htinfo.st.wMonth = ht_month.wMonth;
       if (day < 1)
       {
-	  lpht->uHit = MCHT_CALENDARDATEPREV;
-	  MONTHCAL_GetPrevMonth(&lpht->st);
-	  lpht->st.wDay = MONTHCAL_MonthLength(lpht->st.wMonth, lpht->st.wYear) + day;
+	  htinfo.uHit = MCHT_CALENDARDATEPREV;
+	  MONTHCAL_GetPrevMonth(&htinfo.st);
+	  htinfo.st.wDay = MONTHCAL_MonthLength(lpht->st.wMonth, lpht->st.wYear) + day;
       }
       else if (day > MONTHCAL_MonthLength(ht_month.wMonth, ht_month.wYear))
       {
-	  lpht->uHit = MCHT_CALENDARDATENEXT;
-	  MONTHCAL_GetNextMonth(&lpht->st);
-	  lpht->st.wDay = day - MONTHCAL_MonthLength(ht_month.wMonth, ht_month.wYear);
+	  htinfo.uHit = MCHT_CALENDARDATENEXT;
+	  MONTHCAL_GetNextMonth(&htinfo.st);
+	  htinfo.st.wDay = day - MONTHCAL_MonthLength(ht_month.wMonth, ht_month.wYear);
       }
-      else {
-	lpht->uHit = MCHT_CALENDARDATE;
-	lpht->st.wDay = day;
+      else
+      {
+	htinfo.uHit = MCHT_CALENDARDATE;
+	htinfo.st.wDay = day;
       }
 
+      MONTHCAL_CalcDayXY(infoPtr, &htinfo.st, &htinfo.iCol, &htinfo.iRow);
+      MONTHCAL_CalcDayRect(infoPtr, &htinfo.rc, htinfo.iCol, htinfo.iRow);
       /* always update day of week */
-      MONTHCAL_CalculateDayOfWeek(&lpht->st, TRUE);
+      MONTHCAL_CalculateDayOfWeek(&htinfo.st, TRUE);
   }
 
-  return lpht->uHit;
+  return fill_hittest_info(&htinfo, lpht);
 }
 
 /* MCN_GETDAYSTATE notification helper */
diff --git a/dlls/comctl32/tests/monthcal.c b/dlls/comctl32/tests/monthcal.c
index 59dd0d5..a522bd7 100644
--- a/dlls/comctl32/tests/monthcal.c
+++ b/dlls/comctl32/tests/monthcal.c
@@ -1698,7 +1698,7 @@ static void test_hittest_v6(void)
     mchit.iOffset = -1;
     ret = SendMessage(hwnd, MCM_HITTEST, 0, (LPARAM)&mchit);
     expect_hex(MCHT_CALENDARDATE, ret);
-    todo_wine expect(0, mchit.iOffset);
+    expect(0, mchit.iOffset);
 
     /* over day area */
     mchit.pt.x = r.right / (7*2);
@@ -1710,12 +1710,12 @@ static void test_hittest_v6(void)
     ret = SendMessage(hwnd, MCM_HITTEST, 0, (LPARAM)&mchit);
     expect_hex(MCHT_CALENDARDATE, ret);
     expect_hex(MCHT_CALENDARDATE, mchit.uHit);
-    todo_wine expect(0, mchit.iOffset);
-    todo_wine expect(2, mchit.iRow);
-    todo_wine expect(0, mchit.iCol);
+    expect(0, mchit.iOffset);
+    expect(2, mchit.iRow);
+    expect(0, mchit.iCol);
     /* returned a one day rectangle */
-    todo_wine expect_d(r.right / 7, mchit.rc.right - mchit.rc.left);
-    todo_wine expect_d(r.bottom / 10, mchit.rc.bottom - mchit.rc.top);
+    expect_d(r.right / 7, mchit.rc.right - mchit.rc.left);
+    expect_d(r.bottom / 10, mchit.rc.bottom - mchit.rc.top);
 
     /* title */
     mchit.pt.x = 1;
@@ -1727,13 +1727,13 @@ static void test_hittest_v6(void)
     ret = SendMessage(hwnd, MCM_HITTEST, 0, (LPARAM)&mchit);
     expect_hex(MCHT_TITLE, ret);
     expect_hex(MCHT_TITLE, mchit.uHit);
-    todo_wine expect(0, mchit.iOffset);
+    expect(0, mchit.iOffset);
     expect(-1, mchit.iRow);
     expect(-1, mchit.iCol);
-    todo_wine expect(0, mchit.rc.left);
-    todo_wine expect(0, mchit.rc.top);
-    todo_wine expect_d(r.right, mchit.rc.right);
-    todo_wine ok(mchit.rc.bottom > 0, "got %d\n", mchit.rc.bottom);
+    expect(0, mchit.rc.left);
+    expect(0, mchit.rc.top);
+    expect_d(r.right, mchit.rc.right);
+    ok(mchit.rc.bottom > 0, "got %d\n", mchit.rc.bottom);
 
     /* between two calendars */
     MoveWindow(hwnd, 0, 0, r.right * 5/2, r.bottom, FALSE);
@@ -1741,7 +1741,7 @@ static void test_hittest_v6(void)
     mchit.pt.y = r.bottom / 2;
     mchit.iOffset = -2;
     mchit.iCol = mchit.iRow = -2;
-    mchit.uHit = 0;
+    mchit.uHit = ~0;
     mchit.rc.left = mchit.rc.right = mchit.rc.top = mchit.rc.bottom = -1;
     ret = SendMessage(hwnd, MCM_HITTEST, 0, (LPARAM)&mchit);
     todo_wine expect_hex(MCHT_NOWHERE, ret);




More information about the wine-cvs mailing list