https://git.reactos.org/?p=reactos.git;a=commitdiff;h=edd99e8ccc10db74b2ec8…
commit edd99e8ccc10db74b2ec8eb84bd7353386eb5e03
Author: Amine Khaldi <amine.khaldi(a)reactos.org>
AuthorDate: Thu Jan 18 23:49:20 2018 +0100
Commit: Amine Khaldi <amine.khaldi(a)reactos.org>
CommitDate: Thu Jan 18 23:49:20 2018 +0100
[COMCTL32] Sync with Wine 3.0. CORE-14225
---
dll/win32/comctl32/comctl32.h | 17 ++-
dll/win32/comctl32/commctrl.c | 3 +-
dll/win32/comctl32/imagelist.c | 5 +-
dll/win32/comctl32/listview.c | 112 +++++++++----------
dll/win32/comctl32/rebar.c | 6 +-
dll/win32/comctl32/status.c | 4 +
dll/win32/comctl32/syslink.c | 12 +--
dll/win32/comctl32/taskdialog.c | 109 ++++++++++++++++---
dll/win32/comctl32/tooltips.c | 232 ++++++++++++++++------------------------
dll/win32/comctl32/updown.c | 11 +-
media/doc/README.WINE | 2 +-
11 files changed, 275 insertions(+), 238 deletions(-)
diff --git a/dll/win32/comctl32/comctl32.h b/dll/win32/comctl32/comctl32.h
index e347efd22c..17b6767bfe 100644
--- a/dll/win32/comctl32/comctl32.h
+++ b/dll/win32/comctl32/comctl32.h
@@ -77,6 +77,8 @@ typedef struct
extern COMCTL32_SysColor comctl32_color DECLSPEC_HIDDEN;
+#ifdef __REACTOS__
+
typedef struct _BUTTON_DATA {
LONG state;
HFONT font;
@@ -92,6 +94,8 @@ static inline PBUTTON_DATA _GetButtonData(HWND hwnd)
return (PBUTTON_DATA)GetWindowLongPtrW( hwnd, 0 );
}
+#endif /* __REACTOS__ */
+
/* Internal function */
HWND COMCTL32_CreateToolTip (HWND) DECLSPEC_HIDDEN;
VOID COMCTL32_RefreshSysColors(void) DECLSPEC_HIDDEN;
@@ -104,6 +108,10 @@ INT Str_GetPtrAtoW (LPCSTR lpSrc, LPWSTR lpDest, INT nMaxLen)
DECLSPEC_HIDDEN;
BOOL Str_SetPtrAtoW (LPWSTR *lppDest, LPCSTR lpSrc) DECLSPEC_HIDDEN;
BOOL Str_SetPtrWtoA (LPSTR *lppDest, LPCWSTR lpSrc) DECLSPEC_HIDDEN;
+#ifndef __REACTOS__
+#define COMCTL32_VERSION_MINOR 81
+#endif
+
/* Our internal stack structure of the window procedures to subclass */
typedef struct _SUBCLASSPROCS {
SUBCLASSPROC subproc;
@@ -175,18 +183,21 @@ extern void TREEVIEW_Register(void) DECLSPEC_HIDDEN;
extern void TREEVIEW_Unregister(void) DECLSPEC_HIDDEN;
extern void UPDOWN_Register(void) DECLSPEC_HIDDEN;
extern void UPDOWN_Unregister(void) DECLSPEC_HIDDEN;
+#ifdef __REACTOS__
extern void BUTTON_Register();
extern void BUTTON_Unregister();
-#ifdef __REACTOS__
extern void TOOLBARv6_Register(void) DECLSPEC_HIDDEN;
extern void TOOLBARv6_Unregister(void) DECLSPEC_HIDDEN;
-#endif
+#endif /* __REACTOS__ */
int MONTHCAL_MonthLength(int month, int year) DECLSPEC_HIDDEN;
int MONTHCAL_CalculateDayOfWeek(SYSTEMTIME *date, BOOL inplace) DECLSPEC_HIDDEN;
LONG MONTHCAL_CompareSystemTime(const SYSTEMTIME *first, const SYSTEMTIME *second)
DECLSPEC_HIDDEN;
-
+#ifdef __REACTOS__
extern void THEMING_Initialize(HANDLE hActCtx5, HANDLE hActCtx6) DECLSPEC_HIDDEN;
+#else
+extern void THEMING_Initialize(void) DECLSPEC_HIDDEN;
+#endif
extern void THEMING_Uninitialize(void) DECLSPEC_HIDDEN;
extern LRESULT THEMING_CallOriginalClass(HWND, UINT, WPARAM, LPARAM) DECLSPEC_HIDDEN;
extern void THEMING_SetSubclassData(HWND, ULONG_PTR) DECLSPEC_HIDDEN;
diff --git a/dll/win32/comctl32/commctrl.c b/dll/win32/comctl32/commctrl.c
index df063c0313..1bdc71d6ad 100644
--- a/dll/win32/comctl32/commctrl.c
+++ b/dll/win32/comctl32/commctrl.c
@@ -275,7 +275,7 @@ BOOLEAN WINAPI RegisterClassNameW(LPCWSTR className)
return TRUE;
}
-#endif
+#endif /* __REACTOS__ */
/***********************************************************************
* DllMain [Internal]
@@ -1120,7 +1120,6 @@ HRESULT WINAPI DllGetVersion (DLLVERSIONINFO *pdvi)
HRESULT WINAPI DllInstall(BOOL bInstall, LPCWSTR cmdline)
{
TRACE("(%u, %s): stub\n", bInstall, debugstr_w(cmdline));
-
return S_OK;
}
diff --git a/dll/win32/comctl32/imagelist.c b/dll/win32/comctl32/imagelist.c
index a47f879cf3..c07600217b 100644
--- a/dll/win32/comctl32/imagelist.c
+++ b/dll/win32/comctl32/imagelist.c
@@ -283,7 +283,7 @@ static BOOL add_with_alpha( HIMAGELIST himl, HDC hdc, int pos, int
count,
mask_info->bmiHeader = info->bmiHeader;
mask_info->bmiHeader.biBitCount = 1;
mask_info->bmiHeader.biSizeImage = mask_width * height;
- if (!(mask_bits = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
info->bmiHeader.biSizeImage )))
+ if (!(mask_bits = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
mask_info->bmiHeader.biSizeImage )))
goto done;
if (!GetDIBits( hdc, hbmMask, 0, height, mask_bits, mask_info, DIB_RGB_COLORS ))
goto done;
}
@@ -2132,7 +2132,8 @@ ImageList_LoadImageW (HINSTANCE hi, LPCWSTR lpbmp, INT cx, INT
cGrow,
nImageCount = dib.dsBm.bmWidth / cx;
- himl = ImageList_Create (cx, dib.dsBm.bmHeight, ILC_MASK | color, nImageCount,
cGrow);
+ if (clrMask != CLR_NONE) color |= ILC_MASK;
+ himl = ImageList_Create (cx, dib.dsBm.bmHeight, color, nImageCount, cGrow);
if (!himl) {
DeleteObject (handle);
return NULL;
diff --git a/dll/win32/comctl32/listview.c b/dll/win32/comctl32/listview.c
index 064de9536b..00c6ba2ad7 100644
--- a/dll/win32/comctl32/listview.c
+++ b/dll/win32/comctl32/listview.c
@@ -1001,7 +1001,7 @@ static BOOL notify_dispinfoT(const LISTVIEW_INFO *infoPtr, UINT
code, LPNMLVDISP
return ret;
}
- /* if dipsinfo holder changed notification code then convert */
+ /* if dispinfo holder changed notification code then convert */
if (!isW && (pdi->hdr.code == LVN_GETDISPINFOW) &&
(pdi->item.mask & LVIF_TEXT))
{
length = WideCharToMultiByte(CP_ACP, 0, pdi->item.pszText, -1, NULL, 0, NULL,
NULL);
@@ -1055,7 +1055,7 @@ static void prepaint_setup (const LISTVIEW_INFO *infoPtr, HDC hdc,
NMLVCUSTOMDRA
COLORREF backcolor, textcolor;
/* apparently, for selected items, we have to override the returned values */
- if (!SubItem || (infoPtr->dwLvExStyle & LVS_EX_FULLROWSELECT))
+ if (!SubItem)
{
if (lpnmlvcd->nmcd.uItemState & CDIS_SELECTED)
{
@@ -3843,33 +3843,44 @@ static LRESULT LISTVIEW_MouseHover(LISTVIEW_INFO *infoPtr, INT x,
INT y)
* None.
*/
static void LISTVIEW_MarqueeHighlight(LISTVIEW_INFO *infoPtr, const POINT *coords_orig,
- const POINT *coords_offs, const POINT *offset,
INT scroll)
{
BOOL controlDown = FALSE;
LVITEMW item;
ITERATOR old_elems, new_elems;
RECT rect;
+ POINT coords_offs, offset;
- if (coords_offs->x > infoPtr->marqueeOrigin.x)
+ /* Ensure coordinates are within client bounds */
+ coords_offs.x = max(min(coords_orig->x, infoPtr->rcList.right), 0);
+ coords_offs.y = max(min(coords_orig->y, infoPtr->rcList.bottom), 0);
+
+ /* Get offset */
+ LISTVIEW_GetOrigin(infoPtr, &offset);
+
+ /* Offset coordinates by the appropriate amount */
+ coords_offs.x -= offset.x;
+ coords_offs.y -= offset.y;
+
+ if (coords_offs.x > infoPtr->marqueeOrigin.x)
{
rect.left = infoPtr->marqueeOrigin.x;
- rect.right = coords_offs->x;
+ rect.right = coords_offs.x;
}
else
{
- rect.left = coords_offs->x;
+ rect.left = coords_offs.x;
rect.right = infoPtr->marqueeOrigin.x;
}
- if (coords_offs->y > infoPtr->marqueeOrigin.y)
+ if (coords_offs.y > infoPtr->marqueeOrigin.y)
{
rect.top = infoPtr->marqueeOrigin.y;
- rect.bottom = coords_offs->y;
+ rect.bottom = coords_offs.y;
}
else
{
- rect.top = coords_offs->y;
+ rect.top = coords_offs.y;
rect.bottom = infoPtr->marqueeOrigin.y;
}
@@ -3895,7 +3906,7 @@ static void LISTVIEW_MarqueeHighlight(LISTVIEW_INFO *infoPtr, const
POINT *coord
infoPtr->marqueeRect = rect;
infoPtr->marqueeDrawRect = rect;
- OffsetRect(&infoPtr->marqueeDrawRect, offset->x, offset->y);
+ OffsetRect(&infoPtr->marqueeDrawRect, offset.x, offset.y);
iterator_frameditems_absolute(&new_elems, infoPtr,
&infoPtr->marqueeRect);
iterator_remove_common_items(&old_elems, &new_elems);
@@ -3960,9 +3971,7 @@ static VOID CALLBACK LISTVIEW_ScrollTimer(HWND hWnd, UINT uMsg,
UINT_PTR idEvent
{
LISTVIEW_INFO *infoPtr;
SCROLLINFO scrollInfo;
- POINT coords_orig;
- POINT coords_offs;
- POINT offset;
+ POINT coords;
INT scroll = 0;
infoPtr = (LISTVIEW_INFO *) idEvent;
@@ -3971,19 +3980,8 @@ static VOID CALLBACK LISTVIEW_ScrollTimer(HWND hWnd, UINT uMsg,
UINT_PTR idEvent
return;
/* Get the current cursor position and convert to client coordinates */
- GetCursorPos(&coords_orig);
- ScreenToClient(hWnd, &coords_orig);
-
- /* Ensure coordinates are within client bounds */
- coords_offs.x = max(min(coords_orig.x, infoPtr->rcList.right), 0);
- coords_offs.y = max(min(coords_orig.y, infoPtr->rcList.bottom), 0);
-
- /* Get offset */
- LISTVIEW_GetOrigin(infoPtr, &offset);
-
- /* Offset coordinates by the appropriate amount */
- coords_offs.x -= offset.x;
- coords_offs.y -= offset.y;
+ GetCursorPos(&coords);
+ ScreenToClient(hWnd, &coords);
scrollInfo.cbSize = sizeof(SCROLLINFO);
scrollInfo.fMask = SIF_ALL;
@@ -4007,12 +4005,12 @@ static VOID CALLBACK LISTVIEW_ScrollTimer(HWND hWnd, UINT uMsg,
UINT_PTR idEvent
scroll |= SCROLL_RIGHT;
}
- if (((coords_orig.x <= 0) && (scroll & SCROLL_LEFT)) ||
- ((coords_orig.y <= 0) && (scroll & SCROLL_UP)) ||
- ((coords_orig.x >= infoPtr->rcList.right) && (scroll &
SCROLL_RIGHT)) ||
- ((coords_orig.y >= infoPtr->rcList.bottom) && (scroll &
SCROLL_DOWN)))
+ if (((coords.x <= 0) && (scroll & SCROLL_LEFT)) ||
+ ((coords.y <= 0) && (scroll & SCROLL_UP)) ||
+ ((coords.x >= infoPtr->rcList.right) && (scroll &
SCROLL_RIGHT)) ||
+ ((coords.y >= infoPtr->rcList.bottom) && (scroll &
SCROLL_DOWN)))
{
- LISTVIEW_MarqueeHighlight(infoPtr, &coords_orig, &coords_offs,
&offset, scroll);
+ LISTVIEW_MarqueeHighlight(infoPtr, &coords, scroll);
}
}
@@ -4034,6 +4032,9 @@ static LRESULT LISTVIEW_MouseMove(LISTVIEW_INFO *infoPtr, WORD
fwKeys, INT x, IN
RECT rect;
POINT pt;
+ pt.x = x;
+ pt.y = y;
+
if (!(fwKeys & MK_LBUTTON))
infoPtr->bLButtonDown = FALSE;
@@ -4046,24 +4047,6 @@ static LRESULT LISTVIEW_MouseMove(LISTVIEW_INFO *infoPtr, WORD
fwKeys, INT x, IN
if (infoPtr->bMarqueeSelect)
{
- POINT coords_orig;
- POINT coords_offs;
- POINT offset;
-
- coords_orig.x = x;
- coords_orig.y = y;
-
- /* Get offset */
- LISTVIEW_GetOrigin(infoPtr, &offset);
-
- /* Ensure coordinates are within client bounds */
- coords_offs.x = max(min(x, infoPtr->rcList.right), 0);
- coords_offs.y = max(min(y, infoPtr->rcList.bottom), 0);
-
- /* Offset coordinates by the appropriate amount */
- coords_offs.x -= offset.x;
- coords_offs.y -= offset.y;
-
/* Enable the timer if we're going outside our bounds, in case the user
doesn't
move the mouse again */
@@ -4082,13 +4065,10 @@ static LRESULT LISTVIEW_MouseMove(LISTVIEW_INFO *infoPtr, WORD
fwKeys, INT x, IN
KillTimer(infoPtr->hwndSelf, (UINT_PTR) infoPtr);
}
- LISTVIEW_MarqueeHighlight(infoPtr, &coords_orig, &coords_offs,
&offset, 0);
+ LISTVIEW_MarqueeHighlight(infoPtr, &pt, 0);
return 0;
}
- pt.x = x;
- pt.y = y;
-
ht.pt = pt;
LISTVIEW_HitTest(infoPtr, &ht, TRUE, TRUE);
@@ -4808,7 +4788,6 @@ static BOOL LISTVIEW_DrawItem(LISTVIEW_INFO *infoPtr, HDC hdc, INT
nItem, ITERAT
while (iterator_next(subitems))
{
DWORD subitemstage = CDRF_DODEFAULT;
- NMLVCUSTOMDRAW temp_nmlvcd;
/* We need to query for each subitem, item's data (subitem == 0) is
already here at this point */
if (subitems->nItem)
@@ -4835,16 +4814,19 @@ static BOOL LISTVIEW_DrawItem(LISTVIEW_INFO *infoPtr, HDC hdc, INT
nItem, ITERAT
if (cdsubitemmode & CDRF_NOTIFYSUBITEMDRAW)
subitemstage = notify_customdraw(infoPtr, CDDS_SUBITEM |
CDDS_ITEMPREPAINT, &nmlvcd);
+ else
+ {
+ nmlvcd.clrTextBk = infoPtr->clrTextBk;
+ nmlvcd.clrText = infoPtr->clrText;
+ }
- /*
- * A selection should neither affect the colors in the post paint
notification nor
- * affect the colors of the next drawn subitem. Copy the structure to prevent
this.
- */
- temp_nmlvcd = nmlvcd;
- prepaint_setup(infoPtr, hdc, &temp_nmlvcd, subitems->nItem);
+ if (subitems->nItem == 0 || (cdmode & CDRF_NOTIFYITEMDRAW))
+ prepaint_setup(infoPtr, hdc, &nmlvcd, FALSE);
+ else if (!(infoPtr->dwLvExStyle & LVS_EX_FULLROWSELECT))
+ prepaint_setup(infoPtr, hdc, &nmlvcd, TRUE);
if (!(subitemstage & CDRF_SKIPDEFAULT))
- LISTVIEW_DrawItemPart(infoPtr, &lvItem, &temp_nmlvcd, &pos);
+ LISTVIEW_DrawItemPart(infoPtr, &lvItem, &nmlvcd, &pos);
if (subitemstage & CDRF_NOTIFYPOSTPAINT)
subitemstage = notify_customdraw(infoPtr, CDDS_SUBITEM |
CDDS_ITEMPOSTPAINT, &nmlvcd);
@@ -8864,6 +8846,7 @@ static BOOL LISTVIEW_SetItemCount(LISTVIEW_INFO *infoPtr, INT
nItems, DWORD dwFl
if (infoPtr->nFocusedItem >= nItems)
{
LISTVIEW_SetItemFocus(infoPtr, -1);
+ infoPtr->nFocusedItem = -1;
SetRectEmpty(&infoPtr->rcFocus);
}
}
@@ -9483,7 +9466,7 @@ static VOID CALLBACK LISTVIEW_DelayedEditItem(HWND hwnd, UINT uMsg,
UINT_PTR idE
* Success: TRUE
* Failure: FALSE
*/
-static LRESULT LISTVIEW_NCCreate(HWND hwnd, const CREATESTRUCTW *lpcs)
+static LRESULT LISTVIEW_NCCreate(HWND hwnd, WPARAM wParam, const CREATESTRUCTW *lpcs)
{
LISTVIEW_INFO *infoPtr;
LOGFONTW logFont;
@@ -9545,7 +9528,8 @@ static LRESULT LISTVIEW_NCCreate(HWND hwnd, const CREATESTRUCTW
*lpcs)
if (!(infoPtr->hdpaPosX = DPA_Create(10))) goto fail;
if (!(infoPtr->hdpaPosY = DPA_Create(10))) goto fail;
if (!(infoPtr->hdpaColumns = DPA_Create(10))) goto fail;
- return TRUE;
+
+ return DefWindowProcW(hwnd, WM_NCCREATE, wParam, (LPARAM)lpcs);
fail:
DestroyWindow(infoPtr->hwndHeader);
@@ -11711,7 +11695,7 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM
lParam)
return LISTVIEW_Command(infoPtr, wParam, lParam);
case WM_NCCREATE:
- return LISTVIEW_NCCreate(hwnd, (LPCREATESTRUCTW)lParam);
+ return LISTVIEW_NCCreate(hwnd, wParam, (LPCREATESTRUCTW)lParam);
case WM_CREATE:
return LISTVIEW_Create(hwnd, (LPCREATESTRUCTW)lParam);
diff --git a/dll/win32/comctl32/rebar.c b/dll/win32/comctl32/rebar.c
index d4896142bd..38a700407a 100644
--- a/dll/win32/comctl32/rebar.c
+++ b/dll/win32/comctl32/rebar.c
@@ -613,6 +613,7 @@ REBAR_DrawBand (HDC hdc, const REBAR_INFO *infoPtr, REBAR_BAND
*lpBand)
oldcolor = SetTextColor (hdc, new);
}
+#ifdef __REACTOS__
if (!theme)
{
DrawTextW (hdc, lpBand->lpText, -1, &lpBand->rcCapText, DT_CENTER |
DT_VCENTER | DT_SINGLELINE);
@@ -621,6 +622,10 @@ REBAR_DrawBand (HDC hdc, const REBAR_INFO *infoPtr, REBAR_BAND
*lpBand)
{
DrawThemeText(theme, hdc, 0, 0, lpBand->lpText, -1, DT_CENTER | DT_VCENTER |
DT_SINGLELINE, 0, &lpBand->rcCapText);
}
+#else
+ DrawTextW (hdc, lpBand->lpText, -1, &lpBand->rcCapText,
+ DT_CENTER | DT_VCENTER | DT_SINGLELINE);
+#endif
if (oldBkMode != TRANSPARENT)
SetBkMode (hdc, oldBkMode);
@@ -1843,7 +1848,6 @@ static LRESULT REBAR_EraseBkGnd (const REBAR_INFO *infoPtr, HDC
hdc)
oldrow = -1;
for(i=0; i<infoPtr->uNumBands; i++) {
RECT rcBand;
-
lpBand = REBAR_GetBand(infoPtr, i);
if (HIDDENBAND(lpBand)) continue;
translate_rect(infoPtr, &rcBand, &lpBand->rcBand);
diff --git a/dll/win32/comctl32/status.c b/dll/win32/comctl32/status.c
index e18a47ed85..cdfad321a6 100644
--- a/dll/win32/comctl32/status.c
+++ b/dll/win32/comctl32/status.c
@@ -196,10 +196,14 @@ STATUSBAR_DrawPart (const STATUS_INFO *infoPtr, HDC hdc, const
STATUSWINDOWPART
SendMessageW (infoPtr->Notify, WM_DRAWITEM, dis.CtlID, (LPARAM)&dis);
} else {
r.left += x;
+#ifdef __REACTOS__
if (!theme)
DrawStatusTextW (hdc, &r, part->text, SBT_NOBORDERS);
else
DrawThemeText(theme, hdc, SP_PANE, 0, part->text, -1,
DT_VCENTER|DT_SINGLELINE|DT_NOPREFIX, 0, &r);
+#else
+ DrawStatusTextW (hdc, &r, part->text, SBT_NOBORDERS);
+#endif
}
}
diff --git a/dll/win32/comctl32/syslink.c b/dll/win32/comctl32/syslink.c
index 675ef62422..d54b0f5f35 100644
--- a/dll/win32/comctl32/syslink.c
+++ b/dll/win32/comctl32/syslink.c
@@ -1463,7 +1463,7 @@ static BOOL SYSLINK_NoNextLink (const SYSLINK_INFO *infoPtr, BOOL
Prev)
* SYSLINK_GetIdealSize
* Calculates the ideal size of a link control at a given maximum width.
*/
-static VOID SYSLINK_GetIdealSize (const SYSLINK_INFO *infoPtr, int cxMaxWidth, LPSIZE
lpSize)
+static LONG SYSLINK_GetIdealSize (const SYSLINK_INFO *infoPtr, int cxMaxWidth, SIZE
*lpSize)
{
RECT rc;
HDC hdc;
@@ -1484,6 +1484,8 @@ static VOID SYSLINK_GetIdealSize (const SYSLINK_INFO *infoPtr, int
cxMaxWidth, L
lpSize->cx = rc.right;
lpSize->cy = rc.bottom;
}
+
+ return rc.bottom;
}
/***********************************************************************
@@ -1655,11 +1657,9 @@ static LRESULT WINAPI SysLinkWindowProc(HWND hwnd, UINT message,
case LM_GETIDEALHEIGHT:
if (lParam)
- {
- /* LM_GETIDEALSIZE */
- SYSLINK_GetIdealSize(infoPtr, (int)wParam, (LPSIZE)lParam);
- }
- return SYSLINK_GetIdealHeight(infoPtr);
+ return SYSLINK_GetIdealSize(infoPtr, (int)wParam, (SIZE *)lParam);
+ else
+ return SYSLINK_GetIdealHeight(infoPtr);
case WM_SETFOCUS:
return SYSLINK_SetFocus(infoPtr);
diff --git a/dll/win32/comctl32/taskdialog.c b/dll/win32/comctl32/taskdialog.c
index 9cf2726786..339ebcea18 100644
--- a/dll/win32/comctl32/taskdialog.c
+++ b/dll/win32/comctl32/taskdialog.c
@@ -43,6 +43,15 @@ struct taskdialog_control
unsigned int template_size;
};
+struct taskdialog_button_desc
+{
+ int id;
+ const WCHAR *text;
+ unsigned int width;
+ unsigned int line;
+ HINSTANCE hinst;
+};
+
struct taskdialog_template_desc
{
const TASKDIALOGCONFIG *taskconfig;
@@ -53,15 +62,14 @@ struct taskdialog_template_desc
LONG x_baseunit;
LONG y_baseunit;
HFONT font;
+ struct taskdialog_button_desc *default_button;
};
-struct taskdialog_button_desc
+struct taskdialog_info
{
- int id;
- const WCHAR *text;
- unsigned int width;
- unsigned int line;
- HINSTANCE hinst;
+ HWND hwnd;
+ PFTASKDIALOGCALLBACK callback;
+ LONG_PTR callback_data;
};
static void pixels_to_dialogunits(const struct taskdialog_template_desc *desc, LONG
*width, LONG *height)
@@ -128,7 +136,7 @@ static void taskdialog_get_text_extent(const struct
taskdialog_template_desc *de
}
static unsigned int taskdialog_add_control(struct taskdialog_template_desc *desc, WORD
id, const WCHAR *class,
- HINSTANCE hInstance, const WCHAR *text, short x, short y, short cx, short cy)
+ HINSTANCE hInstance, const WCHAR *text, DWORD style, short x, short y, short cx,
short cy)
{
struct taskdialog_control *control = Alloc(sizeof(*control));
unsigned int size, class_size, text_size;
@@ -155,7 +163,7 @@ static unsigned int taskdialog_add_control(struct
taskdialog_template_desc *desc
control->template = template = Alloc(size);
control->template_size = size;
- template->style = WS_VISIBLE;
+ template->style = WS_VISIBLE | style;
template->dwExtendedStyle = 0;
template->x = x;
template->y = y;
@@ -183,7 +191,7 @@ static unsigned int taskdialog_add_static_label(struct
taskdialog_template_desc
taskdialog_get_text_extent(desc, str, TRUE, &sz);
desc->dialog_height += DIALOG_SPACING;
- size = taskdialog_add_control(desc, id, WC_STATICW,
desc->taskconfig->hInstance, str, DIALOG_SPACING,
+ size = taskdialog_add_control(desc, id, WC_STATICW,
desc->taskconfig->hInstance, str, 0, DIALOG_SPACING,
desc->dialog_height, sz.cx, sz.cy);
desc->dialog_height += sz.cy + DIALOG_SPACING;
return size;
@@ -211,6 +219,9 @@ static void taskdialog_init_button(struct taskdialog_button_desc
*button, struct
button->width = max(DIALOG_BUTTON_WIDTH, sz.cx + DIALOG_SPACING * 2);
button->line = 0;
button->hinst = custom_button ? desc->taskconfig->hInstance :
COMCTL32_hModule;
+
+ if (id == desc->taskconfig->nDefaultButton)
+ desc->default_button = button;
}
static void taskdialog_init_common_buttons(struct taskdialog_template_desc *desc, struct
taskdialog_button_desc *buttons,
@@ -267,6 +278,9 @@ static unsigned int taskdialog_add_buttons(struct
taskdialog_template_desc *desc
if (count == 0)
taskdialog_init_button(&buttons[count++], desc, IDOK,
MAKEINTRESOURCEW(IDS_BUTTON_OK), FALSE);
+ if (!desc->default_button)
+ desc->default_button = &buttons[0];
+
/* For easy handling just allocate as many lines as buttons, the worst case. */
line_widths = Alloc(count * sizeof(*line_widths));
@@ -321,14 +335,16 @@ static unsigned int taskdialog_add_buttons(struct
taskdialog_template_desc *desc
location_x = alignment;
for (i = 0; i < count; i++)
{
+ DWORD style = &buttons[i] == desc->default_button ? BS_DEFPUSHBUTTON :
BS_PUSHBUTTON;
+
if (i > 0 && buttons[i].line != buttons[i - 1].line) /* New line */
{
location_x = alignment;
desc->dialog_height += DIALOG_BUTTON_HEIGHT + DIALOG_SPACING;
}
- size += taskdialog_add_control(desc, buttons[i].id, WC_BUTTONW, buttons[i].hinst,
buttons[i].text, location_x,
- desc->dialog_height, buttons[i].width, DIALOG_BUTTON_HEIGHT);
+ size += taskdialog_add_control(desc, buttons[i].id, WC_BUTTONW, buttons[i].hinst,
buttons[i].text, style,
+ location_x, desc->dialog_height, buttons[i].width,
DIALOG_BUTTON_HEIGHT);
location_x += buttons[i].width + DIALOG_SPACING;
}
@@ -376,6 +392,20 @@ static unsigned int taskdialog_get_reference_rect(const struct
taskdialog_templa
return info.rcWork.right - info.rcWork.left;
}
+static WCHAR *taskdialog_get_exe_name(const TASKDIALOGCONFIG *taskconfig, WCHAR *name,
DWORD length)
+{
+ DWORD len = GetModuleFileNameW(NULL, name, length);
+ if (len && len < length)
+ {
+ WCHAR *p;
+ if ((p = strrchrW(name, '/'))) name = p + 1;
+ if ((p = strrchrW(name, '\\'))) name = p + 1;
+ return name;
+ }
+ else
+ return NULL;
+}
+
static DLGTEMPLATE *create_taskdialog_template(const TASKDIALOGCONFIG *taskconfig)
{
struct taskdialog_control *control, *control2;
@@ -386,15 +416,19 @@ static DLGTEMPLATE *create_taskdialog_template(const
TASKDIALOGCONFIG *taskconfi
const WCHAR *titleW = NULL;
DLGTEMPLATE *template;
NONCLIENTMETRICSW ncm;
+ WCHAR pathW[MAX_PATH];
RECT ref_rect;
char *ptr;
HDC hdc;
/* Window title */
if (!taskconfig->pszWindowTitle)
- FIXME("use executable name for window title\n");
+ titleW = taskdialog_get_exe_name(taskconfig, pathW,
sizeof(pathW)/sizeof(pathW[0]));
else if (IS_INTRESOURCE(taskconfig->pszWindowTitle))
- FIXME("load window title from resources\n");
+ {
+ if (!LoadStringW(taskconfig->hInstance, LOWORD(taskconfig->pszWindowTitle),
(WCHAR *)&titleW, 0))
+ titleW = taskdialog_get_exe_name(taskconfig, pathW,
sizeof(pathW)/sizeof(pathW[0]));
+ }
else
titleW = taskconfig->pszWindowTitle;
if (!titleW)
@@ -423,6 +457,7 @@ static DLGTEMPLATE *create_taskdialog_template(const TASKDIALOGCONFIG
*taskconfi
desc.dialog_height = 0;
desc.dialog_width = max(taskconfig->cxWidth, DIALOG_MIN_WIDTH);
desc.dialog_width = min(desc.dialog_width, screen_width);
+ desc.default_button = NULL;
size += taskdialog_add_main_instruction(&desc);
size += taskdialog_add_content(&desc);
@@ -466,20 +501,54 @@ static DLGTEMPLATE *create_taskdialog_template(const
TASKDIALOGCONFIG *taskconfi
return template;
}
+static HRESULT taskdialog_notify(struct taskdialog_info *dialog_info, UINT notification,
WPARAM wparam, LPARAM lparam)
+{
+ return dialog_info->callback ? dialog_info->callback(dialog_info->hwnd,
notification, wparam, lparam,
+ dialog_info->callback_data) : S_OK;
+}
+
+static void taskdialog_on_button_click(struct taskdialog_info *dialog_info, WORD
command_id)
+{
+ if (taskdialog_notify(dialog_info, TDN_BUTTON_CLICKED, command_id, 0) == S_OK)
+ EndDialog(dialog_info->hwnd, command_id);
+}
+
static INT_PTR CALLBACK taskdialog_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM
lParam)
{
+ static const WCHAR taskdialog_info_propnameW[] =
{'T','a','s','k','D','i','a','l','o','g','I','n','f','o',0};
+ struct taskdialog_info *dialog_info;
+
TRACE("hwnd=%p msg=0x%04x wparam=%lx lparam=%lx\n", hwnd, msg, wParam,
lParam);
+ if (msg != WM_INITDIALOG)
+ dialog_info = GetPropW(hwnd, taskdialog_info_propnameW);
+
switch (msg)
{
+ case TDM_CLICK_BUTTON:
+ taskdialog_on_button_click(dialog_info, LOWORD(wParam));
+ break;
+ case WM_INITDIALOG:
+ dialog_info = (struct taskdialog_info *)lParam;
+ dialog_info->hwnd = hwnd;
+ SetPropW(hwnd, taskdialog_info_propnameW, dialog_info);
+
+ taskdialog_notify(dialog_info, TDN_DIALOG_CONSTRUCTED, 0, 0);
+ break;
+ case WM_SHOWWINDOW:
+ taskdialog_notify(dialog_info, TDN_CREATED, 0, 0);
+ break;
case WM_COMMAND:
if (HIWORD(wParam) == BN_CLICKED)
{
- WORD command_id = LOWORD(wParam);
- EndDialog(hwnd, command_id);
+ taskdialog_on_button_click(dialog_info, LOWORD(wParam));
return TRUE;
}
break;
+ case WM_DESTROY:
+ taskdialog_notify(dialog_info, TDN_DESTROYED, 0, 0);
+ RemovePropW(hwnd, taskdialog_info_propnameW);
+ break;
}
return FALSE;
}
@@ -490,13 +559,21 @@ static INT_PTR CALLBACK taskdialog_proc(HWND hwnd, UINT msg, WPARAM
wParam, LPAR
HRESULT WINAPI TaskDialogIndirect(const TASKDIALOGCONFIG *taskconfig, int *button,
int *radio_button, BOOL *verification_flag_checked)
{
+ struct taskdialog_info dialog_info;
DLGTEMPLATE *template;
INT ret;
TRACE("%p, %p, %p, %p\n", taskconfig, button, radio_button,
verification_flag_checked);
+ if (!taskconfig || taskconfig->cbSize != sizeof(TASKDIALOGCONFIG))
+ return E_INVALIDARG;
+
+ dialog_info.callback = taskconfig->pfCallback;
+ dialog_info.callback_data = taskconfig->lpCallbackData;
+
template = create_taskdialog_template(taskconfig);
- ret = DialogBoxIndirectParamW(taskconfig->hInstance, template,
taskconfig->hwndParent, taskdialog_proc, 0);
+ ret = (short)DialogBoxIndirectParamW(taskconfig->hInstance, template,
taskconfig->hwndParent,
+ taskdialog_proc, (LPARAM)&dialog_info);
Free(template);
if (button) *button = ret;
diff --git a/dll/win32/comctl32/tooltips.c b/dll/win32/comctl32/tooltips.c
index f92dd1b8d1..b3144934c6 100644
--- a/dll/win32/comctl32/tooltips.c
+++ b/dll/win32/comctl32/tooltips.c
@@ -392,7 +392,7 @@ static void TOOLTIPS_GetDispInfoA(const TOOLTIPS_INFO *infoPtr,
TTTOOL_INFO *too
}
}
else {
- ERR("recursive text callback!\n");
+ ERR("recursive text callback\n");
buffer[0] = '\0';
}
@@ -448,7 +448,7 @@ static void TOOLTIPS_GetDispInfoW(const TOOLTIPS_INFO *infoPtr,
TTTOOL_INFO *too
}
}
else {
- ERR("recursive text callback!\n");
+ ERR("recursive text callback\n");
buffer[0] = '\0';
}
@@ -577,13 +577,13 @@ TOOLTIPS_Show (TOOLTIPS_INFO *infoPtr, BOOL track_activate)
NMHDR hdr;
int ptfx = 0;
DWORD style = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE);
- INT nTool;
+ INT nTool, current;
if (track_activate)
{
if (infoPtr->nTrackTool == -1)
{
- TRACE("invalid tracking tool (-1)!\n");
+ TRACE("invalid tracking tool %d\n", infoPtr->nTrackTool);
return;
}
nTool = infoPtr->nTrackTool;
@@ -592,25 +592,29 @@ TOOLTIPS_Show (TOOLTIPS_INFO *infoPtr, BOOL track_activate)
{
if (infoPtr->nTool == -1)
{
- TRACE("invalid tool (-1)!\n");
- return;
+ TRACE("invalid tool %d\n", infoPtr->nTool);
+ return;
}
nTool = infoPtr->nTool;
}
- TRACE("Show tooltip pre %d! (%p)\n", nTool, infoPtr->hwndSelf);
+ TRACE("Show tooltip pre %d, %p\n", nTool, infoPtr->hwndSelf);
+
+ current = infoPtr->nCurrentTool;
+ if (!track_activate)
+ infoPtr->nCurrentTool = infoPtr->nTool;
TOOLTIPS_GetTipText (infoPtr, nTool, infoPtr->szTipText);
if (infoPtr->szTipText[0] == '\0')
+ {
+ infoPtr->nCurrentTool = current;
return;
+ }
toolPtr = &infoPtr->tools[nTool];
- if (!track_activate)
- infoPtr->nCurrentTool = infoPtr->nTool;
-
- TRACE("Show tooltip %d!\n", nTool);
+ TRACE("Show tooltip %d\n", nTool);
hdr.hwndFrom = infoPtr->hwndSelf;
hdr.idFrom = toolPtr->uId;
@@ -820,9 +824,9 @@ TOOLTIPS_Show (TOOLTIPS_INFO *infoPtr, BOOL track_activate)
if (!track_activate)
{
SetTimer (infoPtr->hwndSelf, ID_TIMERPOP, infoPtr->nAutoPopTime, 0);
- TRACE("timer 2 started!\n");
+ TRACE("timer 2 started\n");
SetTimer (infoPtr->hwndSelf, ID_TIMERLEAVE, infoPtr->nReshowTime, 0);
- TRACE("timer 3 started!\n");
+ TRACE("timer 3 started\n");
}
}
@@ -833,7 +837,7 @@ TOOLTIPS_Hide (TOOLTIPS_INFO *infoPtr)
TTTOOL_INFO *toolPtr;
NMHDR hdr;
- TRACE("Hide tooltip %d! (%p)\n", infoPtr->nCurrentTool,
infoPtr->hwndSelf);
+ TRACE("Hide tooltip %d, %p.\n", infoPtr->nCurrentTool,
infoPtr->hwndSelf);
if (infoPtr->nCurrentTool == -1)
return;
@@ -942,8 +946,16 @@ TOOLTIPS_GetToolFromPoint (const TOOLTIPS_INFO *infoPtr, HWND hwnd,
const POINT
}
static inline void
-TOOLTIPS_CopyInfoT (const TTTOOL_INFO *toolPtr, TTTOOLINFOW *ti, BOOL isW)
+TOOLTIPS_CopyInfoT (const TOOLTIPS_INFO *infoPtr, INT index, TTTOOLINFOW *ti, BOOL isW)
{
+ const TTTOOL_INFO *toolPtr = &infoPtr->tools[index];
+
+ ti->uFlags = toolPtr->uFlags;
+ ti->hwnd = toolPtr->hwnd;
+ ti->uId = toolPtr->uId;
+ ti->rect = toolPtr->rect;
+ ti->hinst = toolPtr->hinst;
+
if (ti->lpszText) {
if (toolPtr->lpszText == NULL ||
IS_INTRESOURCE(toolPtr->lpszText) ||
@@ -956,6 +968,11 @@ TOOLTIPS_CopyInfoT (const TTTOOL_INFO *toolPtr, TTTOOLINFOW *ti, BOOL
isW)
WideCharToMultiByte(CP_ACP, 0, toolPtr->lpszText, -1,
(LPSTR)ti->lpszText, MAX_TEXT_SIZE_A, NULL, NULL);
}
+
+ if (ti->cbSize >= TTTOOLINFOW_V2_SIZE)
+ ti->lParam = toolPtr->lParam;
+
+ /* lpReserved is intentionally not set. */
}
static BOOL
@@ -1011,8 +1028,7 @@ TOOLTIPS_Activate (TOOLTIPS_INFO *infoPtr, BOOL activate)
{
infoPtr->bActive = activate;
- if (infoPtr->bActive)
- TRACE("activate!\n");
+ TRACE("activate %d\n", activate);
if (!(infoPtr->bActive) && (infoPtr->nCurrentTool != -1))
TOOLTIPS_Hide (infoPtr);
@@ -1029,9 +1045,8 @@ TOOLTIPS_AddToolT (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOW *ti,
BOOL isW)
if (!ti) return FALSE;
- TRACE("add tool (%p) %p %ld%s!\n",
- infoPtr->hwndSelf, ti->hwnd, ti->uId,
- (ti->uFlags & TTF_IDISHWND) ? " TTF_IDISHWND" : "");
+ TRACE("add tool (%p) %p %ld%s\n", infoPtr->hwndSelf, ti->hwnd,
ti->uId,
+ (ti->uFlags & TTF_IDISHWND) ? " TTF_IDISHWND" : "");
if (ti->cbSize >= TTTOOLINFOW_V2_SIZE && !ti->lpszText &&
isW)
return FALSE;
@@ -1067,27 +1082,18 @@ TOOLTIPS_AddToolT (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOW *ti,
BOOL isW)
}
else if (ti->lpszText) {
if (TOOLTIPS_IsCallbackString(ti->lpszText, isW)) {
- TRACE("add CALLBACK!\n");
+ TRACE("add CALLBACK\n");
toolPtr->lpszText = LPSTR_TEXTCALLBACKW;
}
else if (isW) {
- __TRY
- {
- INT len = lstrlenW (ti->lpszText);
- TRACE("add text %s!\n", debugstr_w(ti->lpszText));
- toolPtr->lpszText = Alloc ((len + 1)*sizeof(WCHAR));
- strcpyW (toolPtr->lpszText, ti->lpszText);
- }
- __EXCEPT_PAGE_FAULT
- {
- WARN("Invalid lpszText.\n");
- return FALSE;
- }
- __ENDTRY
+ INT len = lstrlenW (ti->lpszText);
+ TRACE("add text %s\n", debugstr_w(ti->lpszText));
+ toolPtr->lpszText = Alloc ((len + 1)*sizeof(WCHAR));
+ strcpyW (toolPtr->lpszText, ti->lpszText);
}
else {
INT len = MultiByteToWideChar(CP_ACP, 0, (LPSTR)ti->lpszText, -1,
NULL, 0);
- TRACE("add text \"%s\"!\n", (LPSTR)ti->lpszText);
+ TRACE("add text \"%s\"\n", debugstr_a((char
*)ti->lpszText));
toolPtr->lpszText = Alloc (len * sizeof(WCHAR));
MultiByteToWideChar(CP_ACP, 0, (LPSTR)ti->lpszText, -1,
toolPtr->lpszText, len);
}
@@ -1107,7 +1113,7 @@ TOOLTIPS_AddToolT (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOW *ti,
BOOL isW)
SetWindowSubclass(toolPtr->hwnd, TOOLTIPS_SubclassProc, 1,
(DWORD_PTR)infoPtr->hwndSelf);
}
- TRACE("subclassing installed!\n");
+ TRACE("subclassing installed\n");
}
nResult = SendMessageW (toolPtr->hwnd, WM_NOTIFYFORMAT,
@@ -1119,12 +1125,19 @@ TOOLTIPS_AddToolT (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOW *ti,
BOOL isW)
toolPtr->bNotifyUnicode = TRUE;
TRACE(" -- WM_NOTIFYFORMAT returns: NFR_UNICODE\n");
} else {
- TRACE (" -- WM_NOTIFYFORMAT returns: error!\n");
+ TRACE (" -- WM_NOTIFYFORMAT returns: %d\n", nResult);
}
return TRUE;
}
+static void TOOLTIPS_ResetSubclass (const TTTOOL_INFO *toolPtr)
+{
+ /* Reset subclassing data. */
+ if (toolPtr->uInternalFlags & TTF_SUBCLASS)
+ SetWindowSubclass(toolPtr->uInternalFlags & TTF_IDISHWND ?
(HWND)toolPtr->uId : toolPtr->hwnd,
+ TOOLTIPS_SubclassProc, 1, 0);
+}
static LRESULT
TOOLTIPS_DelToolT (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOW *ti, BOOL isW)
@@ -1157,15 +1170,7 @@ TOOLTIPS_DelToolT (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOW *ti,
BOOL isW)
Free (toolPtr->lpszText);
}
- /* remove subclassing */
- if (toolPtr->uInternalFlags & TTF_SUBCLASS) {
- if (toolPtr->uInternalFlags & TTF_IDISHWND) {
- RemoveWindowSubclass((HWND)toolPtr->uId, TOOLTIPS_SubclassProc, 1);
- }
- else {
- RemoveWindowSubclass(toolPtr->hwnd, TOOLTIPS_SubclassProc, 1);
- }
- }
+ TOOLTIPS_ResetSubclass (toolPtr);
/* delete tool from tool list */
if (infoPtr->uNumTools == 1) {
@@ -1218,28 +1223,14 @@ static LRESULT
TOOLTIPS_EnumToolsT (const TOOLTIPS_INFO *infoPtr, UINT uIndex, TTTOOLINFOW *ti,
BOOL isW)
{
- TTTOOL_INFO *toolPtr;
-
- if (!ti) return FALSE;
- if (ti->cbSize < TTTOOLINFOW_V1_SIZE)
+ if (!ti || ti->cbSize < TTTOOLINFOW_V1_SIZE)
return FALSE;
if (uIndex >= infoPtr->uNumTools)
return FALSE;
TRACE("index=%u\n", uIndex);
- toolPtr = &infoPtr->tools[uIndex];
-
- /* copy tool data */
- ti->uFlags = toolPtr->uFlags;
- ti->hwnd = toolPtr->hwnd;
- ti->uId = toolPtr->uId;
- ti->rect = toolPtr->rect;
- ti->hinst = toolPtr->hinst;
- TOOLTIPS_CopyInfoT (toolPtr, ti, isW);
-
- if (ti->cbSize >= TTTOOLINFOA_V2_SIZE)
- ti->lParam = toolPtr->lParam;
+ TOOLTIPS_CopyInfoT (infoPtr, uIndex, ti, isW);
return TRUE;
}
@@ -1269,31 +1260,15 @@ TOOLTIPS_GetBubbleSize (const TOOLTIPS_INFO *infoPtr, const
TTTOOLINFOW *lpToolI
static LRESULT
TOOLTIPS_GetCurrentToolT (const TOOLTIPS_INFO *infoPtr, TTTOOLINFOW *ti, BOOL isW)
{
- TTTOOL_INFO *toolPtr;
-
if (ti) {
if (ti->cbSize < TTTOOLINFOW_V1_SIZE)
return FALSE;
- if (infoPtr->nCurrentTool > -1) {
- toolPtr = &infoPtr->tools[infoPtr->nCurrentTool];
-
- /* copy tool data */
- ti->uFlags = toolPtr->uFlags;
- ti->rect = toolPtr->rect;
- ti->hinst = toolPtr->hinst;
- TOOLTIPS_CopyInfoT (toolPtr, ti, isW);
-
- if (ti->cbSize >= TTTOOLINFOW_V2_SIZE)
- ti->lParam = toolPtr->lParam;
-
- return TRUE;
- }
- else
- return FALSE;
+ if (infoPtr->nCurrentTool != -1)
+ TOOLTIPS_CopyInfoT (infoPtr, infoPtr->nCurrentTool, ti, isW);
}
- else
- return (infoPtr->nCurrentTool != -1);
+
+ return infoPtr->nCurrentTool != -1;
}
@@ -1398,8 +1373,8 @@ TOOLTIPS_GetToolCount (const TOOLTIPS_INFO *infoPtr)
static LRESULT
TOOLTIPS_GetToolInfoT (const TOOLTIPS_INFO *infoPtr, TTTOOLINFOW *ti, BOOL isW)
{
- TTTOOL_INFO *toolPtr;
INT nTool;
+ HWND hwnd;
if (!ti) return FALSE;
if (ti->cbSize < TTTOOLINFOW_V1_SIZE)
@@ -1413,16 +1388,9 @@ TOOLTIPS_GetToolInfoT (const TOOLTIPS_INFO *infoPtr, TTTOOLINFOW
*ti, BOOL isW)
TRACE("tool %d\n", nTool);
- toolPtr = &infoPtr->tools[nTool];
-
- /* copy tool data */
- ti->uFlags = toolPtr->uFlags;
- ti->rect = toolPtr->rect;
- ti->hinst = toolPtr->hinst;
- TOOLTIPS_CopyInfoT (toolPtr, ti, isW);
-
- if (ti->cbSize >= TTTOOLINFOW_V2_SIZE)
- ti->lParam = toolPtr->lParam;
+ hwnd = ti->hwnd;
+ TOOLTIPS_CopyInfoT (infoPtr, nTool, ti, isW);
+ ti->hwnd = hwnd;
return TRUE;
}
@@ -1432,7 +1400,6 @@ static LRESULT
TOOLTIPS_HitTestT (const TOOLTIPS_INFO *infoPtr, LPTTHITTESTINFOW lptthit,
BOOL isW)
{
- TTTOOL_INFO *toolPtr;
INT nTool;
if (lptthit == 0)
@@ -1442,21 +1409,11 @@ TOOLTIPS_HitTestT (const TOOLTIPS_INFO *infoPtr, LPTTHITTESTINFOW
lptthit,
if (nTool == -1)
return FALSE;
- TRACE("tool %d!\n", nTool);
+ TRACE("tool %d\n", nTool);
/* copy tool data */
- if (lptthit->ti.cbSize >= TTTOOLINFOW_V1_SIZE) {
- toolPtr = &infoPtr->tools[nTool];
-
- lptthit->ti.uFlags = toolPtr->uFlags;
- lptthit->ti.hwnd = toolPtr->hwnd;
- lptthit->ti.uId = toolPtr->uId;
- lptthit->ti.rect = toolPtr->rect;
- lptthit->ti.hinst = toolPtr->hinst;
- TOOLTIPS_CopyInfoT (toolPtr, &lptthit->ti, isW);
- if (lptthit->ti.cbSize >= TTTOOLINFOW_V2_SIZE)
- lptthit->ti.lParam = toolPtr->lParam;
- }
+ if (lptthit->ti.cbSize >= TTTOOLINFOW_V1_SIZE)
+ TOOLTIPS_CopyInfoT (infoPtr, nTool, &lptthit->ti, isW);
return TRUE;
}
@@ -1499,7 +1456,7 @@ TOOLTIPS_RelayEvent (TOOLTIPS_INFO *infoPtr, LPMSG lpMsg)
INT nOldTool;
if (!lpMsg) {
- ERR("lpMsg == NULL!\n");
+ ERR("lpMsg == NULL\n");
return 0;
}
@@ -1530,14 +1487,14 @@ TOOLTIPS_RelayEvent (TOOLTIPS_INFO *infoPtr, LPMSG lpMsg)
} else if (nOldTool == -1) { /* Moved from outside */
if(infoPtr->bActive) {
SetTimer(infoPtr->hwndSelf, ID_TIMERSHOW, infoPtr->nInitialTime, 0);
- TRACE("timer 1 started!\n");
+ TRACE("timer 1 started\n");
}
} else { /* Moved from one to another */
TOOLTIPS_Hide (infoPtr);
KillTimer(infoPtr->hwndSelf, ID_TIMERLEAVE);
if(infoPtr->bActive) {
SetTimer (infoPtr->hwndSelf, ID_TIMERSHOW, infoPtr->nReshowTime, 0);
- TRACE("timer 1 started!\n");
+ TRACE("timer 1 started\n");
}
}
} else if(infoPtr->nCurrentTool != -1) { /* restart autopop */
@@ -1547,7 +1504,7 @@ TOOLTIPS_RelayEvent (TOOLTIPS_INFO *infoPtr, LPMSG lpMsg)
} else if(infoPtr->nTool != -1 && infoPtr->bActive) {
/* previous show attempt didn't result in tooltip so try again */
SetTimer(infoPtr->hwndSelf, ID_TIMERSHOW, infoPtr->nInitialTime, 0);
- TRACE("timer 1 started!\n");
+ TRACE("timer 1 started\n");
}
break;
}
@@ -1703,7 +1660,7 @@ TOOLTIPS_SetToolInfoT (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOW
*ti, BOOL isW)
toolPtr->hinst = ti->hinst;
if (IS_INTRESOURCE(ti->lpszText)) {
- TRACE("set string id %x!\n", LOWORD(ti->lpszText));
+ TRACE("set string id %x\n", LOWORD(ti->lpszText));
toolPtr->lpszText = ti->lpszText;
}
else {
@@ -1762,7 +1719,7 @@ TOOLTIPS_TrackActivate (TOOLTIPS_INFO *infoPtr, BOOL track_activate,
const TTTOO
/* activate */
infoPtr->nTrackTool = TOOLTIPS_GetToolFromInfoT (infoPtr, (const TTTOOLINFOW*)ti);
if (infoPtr->nTrackTool != -1) {
- TRACE("activated!\n");
+ TRACE("activated\n");
infoPtr->bTrackActive = TRUE;
TOOLTIPS_TrackShow (infoPtr);
}
@@ -1774,7 +1731,7 @@ TOOLTIPS_TrackActivate (TOOLTIPS_INFO *infoPtr, BOOL track_activate,
const TTTOO
infoPtr->bTrackActive = FALSE;
infoPtr->nTrackTool = -1;
- TRACE("deactivated!\n");
+ TRACE("deactivated\n");
}
return 0;
@@ -1919,16 +1876,9 @@ TOOLTIPS_Destroy (TOOLTIPS_INFO *infoPtr)
}
}
- /* remove subclassing */
- if (toolPtr->uInternalFlags & TTF_SUBCLASS) {
- if (toolPtr->uInternalFlags & TTF_IDISHWND) {
- RemoveWindowSubclass((HWND)toolPtr->uId, TOOLTIPS_SubclassProc, 1);
- }
- else {
- RemoveWindowSubclass(toolPtr->hwnd, TOOLTIPS_SubclassProc, 1);
- }
+ TOOLTIPS_ResetSubclass (toolPtr);
}
- }
+
Free (infoPtr->tools);
}
@@ -1997,7 +1947,7 @@ TOOLTIPS_NCHitTest (const TOOLTIPS_INFO *infoPtr, WPARAM wParam,
LPARAM lParam)
if ((nTool > -1) && (nTool < infoPtr->uNumTools)) {
if (infoPtr->tools[nTool].uFlags & TTF_TRANSPARENT) {
- TRACE("-- in transparent mode!\n");
+ TRACE("-- in transparent mode\n");
return HTTRANSPARENT;
}
}
@@ -2073,9 +2023,8 @@ TOOLTIPS_SetFont (TOOLTIPS_INFO *infoPtr, HFONT hFont, BOOL redraw)
lf.lfWeight = FW_BOLD;
infoPtr->hTitleFont = CreateFontIndirectW(&lf);
- if (redraw && infoPtr->nCurrentTool != -1) {
- FIXME("full redraw needed!\n");
- }
+ if (redraw && infoPtr->nCurrentTool != -1)
+ FIXME("full redraw needed\n");
return 0;
}
@@ -2124,7 +2073,7 @@ TOOLTIPS_Timer (TOOLTIPS_INFO *infoPtr, INT iTimer)
{
INT nOldTool;
- TRACE("timer %d (%p) expired!\n", iTimer, infoPtr->hwndSelf);
+ TRACE("timer %d (%p) expired\n", iTimer, infoPtr->hwndSelf);
switch (iTimer) {
case ID_TIMERSHOW:
@@ -2178,12 +2127,13 @@ TOOLTIPS_WinIniChange (TOOLTIPS_INFO *infoPtr)
static LRESULT CALLBACK
-TOOLTIPS_SubclassProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uID,
DWORD_PTR dwRef)
+TOOLTIPS_SubclassProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam, UINT_PTR
uID, DWORD_PTR dwRef)
{
TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr ((HWND)dwRef);
MSG msg;
- switch(uMsg) {
+ switch (message)
+ {
case WM_MOUSEMOVE:
case WM_LBUTTONDOWN:
case WM_LBUTTONUP:
@@ -2191,17 +2141,23 @@ TOOLTIPS_SubclassProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM
lParam, UINT_
case WM_MBUTTONUP:
case WM_RBUTTONDOWN:
case WM_RBUTTONUP:
- msg.hwnd = hwnd;
- msg.message = uMsg;
- msg.wParam = wParam;
- msg.lParam = lParam;
- TOOLTIPS_RelayEvent(infoPtr, &msg);
- break;
-
+ if (infoPtr)
+ {
+ msg.hwnd = hwnd;
+ msg.message = message;
+ msg.wParam = wParam;
+ msg.lParam = lParam;
+ TOOLTIPS_RelayEvent(infoPtr, &msg);
+ }
+ break;
+ case WM_NCDESTROY:
+ RemoveWindowSubclass(hwnd, TOOLTIPS_SubclassProc, 1);
+ break;
default:
break;
}
- return DefSubclassProc(hwnd, uMsg, wParam, lParam);
+
+ return DefSubclassProc(hwnd, message, wParam, lParam);
}
diff --git a/dll/win32/comctl32/updown.c b/dll/win32/comctl32/updown.c
index 9aff605dc8..0a53c7baf6 100644
--- a/dll/win32/comctl32/updown.c
+++ b/dll/win32/comctl32/updown.c
@@ -607,11 +607,11 @@ static HWND UPDOWN_SetBuddy (UPDOWN_INFO* infoPtr, HWND bud)
RECT budRect; /* new coord for the buddy */
int x, width; /* new x position and width for the up-down */
WCHAR buddyClass[40];
- HWND ret;
+ HWND old_buddy;
TRACE("(hwnd=%p, bud=%p)\n", infoPtr->Self, bud);
- ret = infoPtr->Buddy;
+ old_buddy = infoPtr->Buddy;
/* there is already a buddy assigned */
if (infoPtr->Buddy) RemoveWindowSubclass(infoPtr->Buddy,
UPDOWN_Buddy_SubclassProc,
@@ -648,7 +648,7 @@ static HWND UPDOWN_SetBuddy (UPDOWN_INFO* infoPtr, HWND bud)
x = budRect.right+DEFAULT_XSEP;
} else {
/* nothing to do */
- return ret;
+ return old_buddy;
}
/* first adjust the buddy to accommodate the up/down */
@@ -677,14 +677,15 @@ static HWND UPDOWN_SetBuddy (UPDOWN_INFO* infoPtr, HWND bud)
budRect.top - DEFAULT_ADDTOP, width,
budRect.bottom - budRect.top + DEFAULT_ADDTOP + DEFAULT_ADDBOT,
SWP_NOACTIVATE|SWP_FRAMECHANGED|SWP_NOZORDER);
- } else {
+ } else if (!(infoPtr->dwStyle & UDS_HORZ) && old_buddy != NULL) {
RECT rect;
GetWindowRect(infoPtr->Self, &rect);
MapWindowPoints(HWND_DESKTOP, GetParent(infoPtr->Self), (POINT *)&rect,
2);
SetWindowPos(infoPtr->Self, 0, rect.left, rect.top, DEFAULT_WIDTH, rect.bottom
- rect.top,
SWP_NOACTIVATE|SWP_FRAMECHANGED|SWP_NOZORDER);
}
- return ret;
+
+ return old_buddy;
}
/***********************************************************************
diff --git a/media/doc/README.WINE b/media/doc/README.WINE
index 3910789a16..270a296417 100644
--- a/media/doc/README.WINE
+++ b/media/doc/README.WINE
@@ -54,7 +54,7 @@ reactos/dll/win32/browseui # Out of sync
reactos/dll/win32/cabinet # Synced to WineStaging-2.9
reactos/dll/win32/clusapi # Synced to WineStaging-2.9
reactos/dll/win32/comcat # Synced to WineStaging-2.9
-reactos/dll/win32/comctl32 # Synced to WineStaging-2.16
+reactos/dll/win32/comctl32 # Synced to Wine-3.0
reactos/dll/win32/comdlg32 # Synced to WineStaging-2.16
reactos/dll/win32/compstui # Synced to WineStaging-2.9
reactos/dll/win32/credui # Synced to WineStaging-2.9