Dan Kegel : x11drv: Fix two clipboard bugs.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Apr 11 07:43:13 CDT 2006
Module: wine
Branch: refs/heads/master
Commit: d5292cb3f43c882d46e8a83475b047edec0ea633
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=d5292cb3f43c882d46e8a83475b047edec0ea633
Author: Dan Kegel <dank at kegel.com>
Date: Sun Apr 9 14:47:21 2006 -0700
x11drv: Fix two clipboard bugs.
Fix two clipboard problems that caused BadAtom crashes and caused some
clipboard formats to not be exported properly.
---
dlls/x11drv/clipboard.c | 24 ++++++++++++++++--------
1 files changed, 16 insertions(+), 8 deletions(-)
diff --git a/dlls/x11drv/clipboard.c b/dlls/x11drv/clipboard.c
index 567edd9..49a7ccc 100644
--- a/dlls/x11drv/clipboard.c
+++ b/dlls/x11drv/clipboard.c
@@ -1784,6 +1784,10 @@ static VOID X11DRV_CLIPBOARD_InsertSelec
if (names)
{
wine_tsx11_lock();
+ /* FIXME: we're at the mercy of the app sending the event here.
+ * Currently if they send a bogus atom, we will crash.
+ * We should handle BadAtom errors gracefully in this call.
+ */
XGetAtomNames( display, atoms, nb_atoms, names );
wine_tsx11_unlock();
for (i = 0; i < nb_atoms; i++)
@@ -2790,6 +2794,13 @@ static Atom X11DRV_SelectionRequest_TARG
LPWINE_CLIPFORMAT lpFormats;
LPWINE_CLIPDATA lpData;
+ /* Create X atoms for any clipboard types which don't have atoms yet.
+ * This avoids sending bogus zero atoms.
+ * Without this, copying might not have access to all clipboard types.
+ * FIXME: is it safe to call this here?
+ */
+ intern_atoms();
+
/*
* Count the number of items we wish to expose as selection targets.
*/
@@ -2804,7 +2815,7 @@ static Atom X11DRV_SelectionRequest_TARG
while (lpFormats)
{
if ((lpFormats->wFormatID == lpData->wFormatID) &&
- lpFormats->lpDrvExportFunc)
+ lpFormats->lpDrvExportFunc && lpFormats->drvData)
cTargets++;
lpFormats = lpFormats->NextFormat;
@@ -2832,7 +2843,7 @@ static Atom X11DRV_SelectionRequest_TARG
while (lpFormats)
{
if ((lpFormats->wFormatID == lpData->wFormatID) &&
- lpFormats->lpDrvExportFunc)
+ lpFormats->lpDrvExportFunc && lpFormats->drvData)
targets[i++] = lpFormats->drvData;
lpFormats = lpFormats->NextFormat;
@@ -2849,12 +2860,9 @@ static Atom X11DRV_SelectionRequest_TARG
unsigned int i;
for ( i = 0; i < cTargets; i++)
{
- if (targets[i])
- {
- char *itemFmtName = XGetAtomName(display, targets[i]);
- TRACE("\tAtom# %d: Property %ld Type %s\n", i, targets[i], itemFmtName);
- XFree(itemFmtName);
- }
+ char *itemFmtName = XGetAtomName(display, targets[i]);
+ TRACE("\tAtom# %d: Property %ld Type %s\n", i, targets[i], itemFmtName);
+ XFree(itemFmtName);
}
}
More information about the wine-cvs
mailing list