Nikolay Sivov : comctl32/syslink: Use wine list to keep items.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri May 20 11:27:54 CDT 2016
Module: wine
Branch: master
Commit: 986306cddb69dd2fd267d32b82c5d1b41a5ebec2
URL: http://source.winehq.org/git/wine.git/?a=commit;h=986306cddb69dd2fd267d32b82c5d1b41a5ebec2
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Fri May 20 08:04:22 2016 +0300
comctl32/syslink: Use wine list to keep items.
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/comctl32/syslink.c | 119 ++++++++++++++++++------------------------------
1 file changed, 44 insertions(+), 75 deletions(-)
diff --git a/dlls/comctl32/syslink.c b/dlls/comctl32/syslink.c
index f7655b6..08e5230 100644
--- a/dlls/comctl32/syslink.c
+++ b/dlls/comctl32/syslink.c
@@ -38,6 +38,7 @@
#include "comctl32.h"
#include "wine/unicode.h"
#include "wine/debug.h"
+#include "wine/list.h"
WINE_DEFAULT_DEBUG_CHANNEL(syslink);
@@ -61,7 +62,7 @@ typedef enum
typedef struct _DOC_ITEM
{
- struct _DOC_ITEM *Next; /* Address to the next item */
+ struct list entry;
UINT nText; /* Number of characters of the text */
SL_ITEM_TYPE Type; /* type of the item */
PDOC_TEXTBLOCK Blocks; /* Array of text blocks */
@@ -86,7 +87,7 @@ typedef struct
HWND Self; /* The window handle for this control */
HWND Notify; /* The parent handle to receive notifications */
DWORD Style; /* Styles for this control */
- PDOC_ITEM Items; /* Address to the first document item */
+ struct list Items; /* Document items list */
BOOL HasFocus; /* Whether the control has the input focus */
int MouseDownID; /* ID of the link that the mouse button first selected */
HFONT Font; /* Handle to the font for text */
@@ -147,22 +148,15 @@ static PDOC_ITEM SYSLINK_AppendDocItem (SYSLINK_INFO *infoPtr, LPCWSTR Text, UIN
return NULL;
}
- Item->Next = NULL;
Item->nText = textlen;
Item->Type = type;
Item->Blocks = NULL;
-
- if(LastItem != NULL)
- {
- LastItem->Next = Item;
- }
- else
- {
- infoPtr->Items = Item;
- }
-
lstrcpynW(Item->Text, Text, textlen + 1);
-
+ if (LastItem)
+ list_add_after(&LastItem->entry, &Item->entry);
+ else
+ list_add_tail(&infoPtr->Items, &Item->entry);
+
return Item;
}
@@ -172,17 +166,13 @@ static PDOC_ITEM SYSLINK_AppendDocItem (SYSLINK_INFO *infoPtr, LPCWSTR Text, UIN
*/
static VOID SYSLINK_ClearDoc (SYSLINK_INFO *infoPtr)
{
- PDOC_ITEM Item, Next;
-
- Item = infoPtr->Items;
- while(Item != NULL)
+ DOC_ITEM *Item, *Item2;
+
+ LIST_FOR_EACH_ENTRY_SAFE(Item, Item2, &infoPtr->Items, DOC_ITEM, entry)
{
- Next = Item->Next;
+ list_remove(&Item->entry);
SYSLINK_FreeDocItem(Item);
- Item = Next;
}
-
- infoPtr->Items = NULL;
}
/***********************************************************************
@@ -526,15 +516,12 @@ static VOID SYSLINK_RepaintLink (const SYSLINK_INFO *infoPtr, const DOC_ITEM *Do
*/
static PDOC_ITEM SYSLINK_GetLinkItemByIndex (const SYSLINK_INFO *infoPtr, int iLink)
{
- PDOC_ITEM Current = infoPtr->Items;
+ DOC_ITEM *Current;
- while(Current != NULL)
+ LIST_FOR_EACH_ENTRY(Current, &infoPtr->Items, DOC_ITEM, entry)
{
- if((Current->Type == slLink) && (iLink-- <= 0))
- {
+ if ((Current->Type == slLink) && (iLink-- <= 0))
return Current;
- }
- Current = Current->Next;
}
return NULL;
}
@@ -545,10 +532,10 @@ static PDOC_ITEM SYSLINK_GetLinkItemByIndex (const SYSLINK_INFO *infoPtr, int iL
*/
static PDOC_ITEM SYSLINK_GetFocusLink (const SYSLINK_INFO *infoPtr, int *LinkId)
{
- PDOC_ITEM Current = infoPtr->Items;
+ DOC_ITEM *Current;
int id = 0;
- while(Current != NULL)
+ LIST_FOR_EACH_ENTRY(Current, &infoPtr->Items, DOC_ITEM, entry)
{
if(Current->Type == slLink)
{
@@ -560,8 +547,8 @@ static PDOC_ITEM SYSLINK_GetFocusLink (const SYSLINK_INFO *infoPtr, int *LinkId)
}
id++;
}
- Current = Current->Next;
}
+
return NULL;
}
@@ -571,13 +558,13 @@ static PDOC_ITEM SYSLINK_GetFocusLink (const SYSLINK_INFO *infoPtr, int *LinkId)
*/
static PDOC_ITEM SYSLINK_GetNextLink (const SYSLINK_INFO *infoPtr, PDOC_ITEM Current)
{
- for(Current = (Current != NULL ? Current->Next : infoPtr->Items);
- Current != NULL;
- Current = Current->Next)
+ DOC_ITEM *Next;
+
+ LIST_FOR_EACH_ENTRY(Next, Current ? &Current->entry : &infoPtr->Items, DOC_ITEM, entry)
{
- if(Current->Type == slLink)
+ if (Next->Type == slLink)
{
- return Current;
+ return Next;
}
}
return NULL;
@@ -589,38 +576,17 @@ static PDOC_ITEM SYSLINK_GetNextLink (const SYSLINK_INFO *infoPtr, PDOC_ITEM Cur
*/
static PDOC_ITEM SYSLINK_GetPrevLink (const SYSLINK_INFO *infoPtr, PDOC_ITEM Current)
{
- if(Current == NULL)
- {
- /* returns the last link */
- PDOC_ITEM Last = NULL;
-
- for(Current = infoPtr->Items; Current != NULL; Current = Current->Next)
- {
- if(Current->Type == slLink)
- {
- Last = Current;
- }
- }
- return Last;
- }
- else
+ DOC_ITEM *Prev;
+
+ LIST_FOR_EACH_ENTRY_REV(Prev, Current ? &Current->entry : list_tail(&infoPtr->Items), DOC_ITEM, entry)
{
- /* returns the previous link */
- PDOC_ITEM Cur, Prev = NULL;
-
- for(Cur = infoPtr->Items; Cur != NULL; Cur = Cur->Next)
+ if (Prev->Type == slLink)
{
- if(Cur == Current)
- {
- break;
- }
- if(Cur->Type == slLink)
- {
- Prev = Cur;
- }
+ return Prev;
}
- return Prev;
}
+
+ return NULL;
}
/***********************************************************************
@@ -684,7 +650,7 @@ static VOID SYSLINK_Render (const SYSLINK_INFO *infoPtr, HDC hdc, PRECT pRect)
GetTextMetricsW( hdc, &tm );
LineHeight = tm.tmHeight + tm.tmExternalLeading;
- for(Current = infoPtr->Items; Current != NULL; Current = Current->Next)
+ LIST_FOR_EACH_ENTRY(Current, &infoPtr->Items, DOC_ITEM, entry)
{
int n, nBlocks;
LPWSTR tx;
@@ -861,7 +827,7 @@ static LRESULT SYSLINK_Draw (const SYSLINK_INFO *infoPtr, HDC hdc)
DeleteObject(hBrush);
- for(Current = infoPtr->Items; Current != NULL; Current = Current->Next)
+ LIST_FOR_EACH_ENTRY(Current, &infoPtr->Items, DOC_ITEM, entry)
{
int n;
LPWSTR tx;
@@ -1025,8 +991,8 @@ static LRESULT SYSLINK_SetText (SYSLINK_INFO *infoPtr, LPCWSTR Text)
static PDOC_ITEM SYSLINK_SetFocusLink (const SYSLINK_INFO *infoPtr, const DOC_ITEM *DocItem)
{
PDOC_ITEM Current, PrevFocus = NULL;
-
- for(Current = infoPtr->Items; Current != NULL; Current = Current->Next)
+
+ LIST_FOR_EACH_ENTRY(Current, &infoPtr->Items, DOC_ITEM, entry)
{
if(Current->Type == slLink)
{
@@ -1234,7 +1200,7 @@ static LRESULT SYSLINK_HitTest (const SYSLINK_INFO *infoPtr, PLHITTESTINFO HitTe
PDOC_ITEM Current;
int id = 0;
- for(Current = infoPtr->Items; Current != NULL; Current = Current->Next)
+ LIST_FOR_EACH_ENTRY(Current, &infoPtr->Items, DOC_ITEM, entry)
{
if(Current->Type == slLink)
{
@@ -1383,7 +1349,7 @@ static PDOC_ITEM SYSLINK_LinkAtPt (const SYSLINK_INFO *infoPtr, const POINT *pt,
PDOC_ITEM Current;
int id = 0;
- for(Current = infoPtr->Items; Current != NULL; Current = Current->Next)
+ LIST_FOR_EACH_ENTRY(Current, &infoPtr->Items, DOC_ITEM, entry)
{
if((Current->Type == slLink) && SYSLINK_PtInDocItem(Current, *pt) &&
(!MustBeEnabled || (Current->u.Link.state & LIS_ENABLED)))
@@ -1749,6 +1715,9 @@ static LRESULT WINAPI SysLinkWindowProc(HWND hwnd, UINT message,
return 0;
case WM_CREATE:
+ {
+ CREATESTRUCTW *cs = (CREATESTRUCTW*)lParam;
+
/* allocate memory for info struct */
infoPtr = Alloc (sizeof(SYSLINK_INFO));
if (!infoPtr) return -1;
@@ -1756,11 +1725,11 @@ static LRESULT WINAPI SysLinkWindowProc(HWND hwnd, UINT message,
/* initialize the info struct */
infoPtr->Self = hwnd;
- infoPtr->Notify = ((LPCREATESTRUCTW)lParam)->hwndParent;
- infoPtr->Style = ((LPCREATESTRUCTW)lParam)->style;
+ infoPtr->Notify = cs->hwndParent;
+ infoPtr->Style = cs->style;
infoPtr->Font = 0;
infoPtr->LinkFont = 0;
- infoPtr->Items = NULL;
+ list_init(&infoPtr->Items);
infoPtr->HasFocus = FALSE;
infoPtr->MouseDownID = -1;
infoPtr->TextColor = comctl32_color.clrWindowText;
@@ -1769,9 +1738,9 @@ static LRESULT WINAPI SysLinkWindowProc(HWND hwnd, UINT message,
infoPtr->BreakChar = ' ';
infoPtr->IgnoreReturn = infoPtr->Style & LWS_IGNORERETURN;
TRACE("SysLink Ctrl creation, hwnd=%p\n", hwnd);
- SYSLINK_SetText(infoPtr, ((LPCREATESTRUCTW)lParam)->lpszName);
+ SYSLINK_SetText(infoPtr, cs->lpszName);
return 0;
-
+ }
case WM_DESTROY:
TRACE("SysLink Ctrl destruction, hwnd=%p\n", hwnd);
SYSLINK_ClearDoc(infoPtr);
More information about the wine-cvs
mailing list