#include "windef.h"
#include "winbase.h"
#include "x11drv.h"
+#include "wine/list.h"
#include "wine/debug.h"
#include "wine/unicode.h"
#include "wine/server.h"
} WINE_CLIPFORMAT, *LPWINE_CLIPFORMAT;
typedef struct tagWINE_CLIPDATA {
+ struct list entry;
UINT wFormatID;
HANDLE hData;
UINT wFlags;
UINT drvData;
LPWINE_CLIPFORMAT lpFormat;
- struct tagWINE_CLIPDATA *PrevData;
- struct tagWINE_CLIPDATA *NextData;
} WINE_CLIPDATA, *LPWINE_CLIPDATA;
#define CF_FLAG_BUILTINFMT 0x0001 /* Built-in windows format */
/*
* Cached clipboard data.
*/
-static LPWINE_CLIPDATA ClipData = NULL;
+static struct list data_list = LIST_INIT( data_list );
static UINT ClipDataCount = 0;
/*
*/
static LPWINE_CLIPDATA X11DRV_CLIPBOARD_LookupData(DWORD wID)
{
- LPWINE_CLIPDATA lpData = ClipData;
+ WINE_CLIPDATA *data;
- if (lpData)
- {
- do
- {
- if (lpData->wFormatID == wID)
- break;
-
- lpData = lpData->NextData;
- }
- while(lpData != ClipData);
-
- if (lpData->wFormatID != wID)
- lpData = NULL;
- }
+ LIST_FOR_EACH_ENTRY( data, &data_list, WINE_CLIPDATA, entry )
+ if (data->wFormatID == wID) return data;
- return lpData;
+ return NULL;
}
lpData->lpFormat = lpFormat;
lpData->drvData = 0;
- if (ClipData)
- {
- LPWINE_CLIPDATA lpPrevData = ClipData->PrevData;
-
- lpData->PrevData = lpPrevData;
- lpData->NextData = ClipData;
-
- lpPrevData->NextData = lpData;
- ClipData->PrevData = lpData;
- }
- else
- {
- lpData->NextData = lpData;
- lpData->PrevData = lpData;
- ClipData = lpData;
- }
-
+ list_add_tail( &data_list, &lpData->entry );
ClipDataCount++;
}
*/
void CDECL X11DRV_EmptyClipboard(BOOL keepunowned)
{
- if (ClipData)
- {
- LPWINE_CLIPDATA lpData, lpStart;
- LPWINE_CLIPDATA lpNext = ClipData;
-
- TRACE(" called with %d entries in cache.\n", ClipDataCount);
-
- do
- {
- lpStart = ClipData;
- lpData = lpNext;
- lpNext = lpData->NextData;
-
- if (!keepunowned || !(lpData->wFlags & CF_FLAG_UNOWNED))
- {
- lpData->PrevData->NextData = lpData->NextData;
- lpData->NextData->PrevData = lpData->PrevData;
-
- if (lpData == ClipData)
- ClipData = lpNext != lpData ? lpNext : NULL;
-
- X11DRV_CLIPBOARD_FreeData(lpData);
- HeapFree(GetProcessHeap(), 0, lpData);
+ WINE_CLIPDATA *data, *next;
- ClipDataCount--;
- }
- } while (lpNext != lpStart);
+ LIST_FOR_EACH_ENTRY_SAFE( data, next, &data_list, WINE_CLIPDATA, entry )
+ {
+ if (keepunowned && (data->wFlags & CF_FLAG_UNOWNED)) continue;
+ list_remove( &data->entry );
+ X11DRV_CLIPBOARD_FreeData( data );
+ HeapFree( GetProcessHeap(), 0, data );
+ ClipDataCount--;
}
TRACE(" %d entries remaining in cache.\n", ClipDataCount);
UINT CDECL X11DRV_EnumClipboardFormats(UINT wFormat)
{
CLIPBOARDINFO cbinfo;
- UINT wNextFormat = 0;
+ struct list *ptr = NULL;
TRACE("(%04X)\n", wFormat);
if (!wFormat)
{
- if (ClipData)
- wNextFormat = ClipData->wFormatID;
+ ptr = list_head( &data_list );
}
else
{
LPWINE_CLIPDATA lpData = X11DRV_CLIPBOARD_LookupData(wFormat);
-
- if (lpData && lpData->NextData != ClipData)
- wNextFormat = lpData->NextData->wFormatID;
+ if (lpData) ptr = list_next( &data_list, &lpData->entry );
}
- return wNextFormat;
+ if (!ptr) return 0;
+ return LIST_ENTRY( ptr, WINE_CLIPDATA, entry )->wFormatID;
}
*/
cTargets = 1; /* Include TARGETS */
- if (!(lpData = ClipData)) return None;
+ if (!list_head( &data_list )) return None;
- do
+ LIST_FOR_EACH_ENTRY( lpData, &data_list, WINE_CLIPDATA, entry )
{
lpFormats = ClipFormats;
lpFormats = lpFormats->NextFormat;
}
-
- lpData = lpData->NextData;
}
- while (lpData != ClipData);
TRACE(" found %d formats\n", cTargets);
return None;
i = 0;
- lpData = ClipData;
targets[i++] = x11drv_atom(TARGETS);
- do
+ LIST_FOR_EACH_ENTRY( lpData, &data_list, WINE_CLIPDATA, entry )
{
lpFormats = ClipFormats;
lpFormats = lpFormats->NextFormat;
}
-
- lpData = lpData->NextData;
}
- while (lpData != ClipData);
wine_tsx11_lock();