Alexandre Julliard : winex11: Merge converting the selection and importing it.
Alexandre Julliard
julliard at winehq.org
Wed Sep 21 10:14:50 CDT 2016
Module: wine
Branch: master
Commit: 2215d770c5bff07f06756dab793936757cd8d9b3
URL: http://source.winehq.org/git/wine.git/?a=commit;h=2215d770c5bff07f06756dab793936757cd8d9b3
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Sep 21 12:01:15 2016 +0900
winex11: Merge converting the selection and importing it.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/winex11.drv/clipboard.c | 62 ++++++++++++++++++++----------------------
dlls/winex11.drv/x11drv.h | 4 +--
dlls/winex11.drv/x11drv_main.c | 1 -
dlls/winex11.drv/xdnd.c | 28 ++-----------------
4 files changed, 34 insertions(+), 61 deletions(-)
diff --git a/dlls/winex11.drv/clipboard.c b/dlls/winex11.drv/clipboard.c
index f2062f0..728d75c 100644
--- a/dlls/winex11.drv/clipboard.c
+++ b/dlls/winex11.drv/clipboard.c
@@ -1225,17 +1225,32 @@ static HANDLE import_data( Atom type, const void *data, size_t size )
/**************************************************************************
* import_selection
*
- * Import a selection target, depending on its type.
+ * Import the specified format from the selection and return a global handle to the data.
*/
-static HANDLE import_selection( Display *display, Window win, Atom prop, struct clipboard_format *format )
+static HANDLE import_selection( Display *display, Window win, Atom selection,
+ struct clipboard_format *format )
{
unsigned char *data;
unsigned long size;
- Atom type;
+ Atom prop, type;
HANDLE ret;
if (!format->import) return 0;
- if (!X11DRV_CLIPBOARD_ReadProperty( display, win, prop, &type, &data, &size )) return 0;
+
+ TRACE( "import %s from %s win %lx to format %s\n",
+ debugstr_xatom( format->atom ), debugstr_xatom( selection ),
+ win, debugstr_format( format->id ) );
+
+ if ((prop = convert_selection( display, win, selection, format->atom )) == None)
+ {
+ TRACE( "failed to convert selection\n" );
+ return 0;
+ }
+ if (!X11DRV_CLIPBOARD_ReadProperty( display, win, prop, &type, &data, &size ))
+ {
+ TRACE( "failed to read property\n" );
+ return 0;
+ }
ret = format->import( type, data, size );
HeapFree( GetProcessHeap(), 0, data );
return ret;
@@ -1247,12 +1262,13 @@ static HANDLE import_selection( Display *display, Window win, Atom prop, struct
*
* Import the X selection into the clipboard format registered for the given X target.
*/
-HANDLE X11DRV_CLIPBOARD_ImportSelection(Display *display, Atom target, Window win, Atom prop, UINT *windowsFormat)
+HANDLE X11DRV_CLIPBOARD_ImportSelection( Display *display, Window win, Atom selection,
+ Atom target, UINT *windowsFormat )
{
struct clipboard_format *format = X11DRV_CLIPBOARD_LookupProperty( NULL, target );
if (!format) return 0;
*windowsFormat = format->id;
- return import_selection( display, win, prop, format );
+ return import_selection( display, win, selection, format );
}
@@ -1872,9 +1888,7 @@ static int X11DRV_CLIPBOARD_QueryAvailableData(Display *display)
static BOOL X11DRV_CLIPBOARD_ReadSelectionData(Display *display, LPWINE_CLIPDATA lpData)
{
BOOL bRet = FALSE;
- Atom prop;
-
- TRACE("%04x\n", lpData->wFormatID);
+ HANDLE hData;
if (!lpData->lpFormat)
{
@@ -1892,28 +1906,9 @@ static BOOL X11DRV_CLIPBOARD_ReadSelectionData(Display *display, LPWINE_CLIPDATA
return FALSE;
}
- TRACE("Requesting conversion of %s property %s from selection type %08x\n",
- debugstr_format( lpData->lpFormat->id ), debugstr_xatom( lpData->lpFormat->atom ),
- (UINT)selectionCacheSrc);
-
- prop = convert_selection( display, w, selectionCacheSrc, lpData->lpFormat->atom );
- if (prop != None)
- {
- /*
- * Read the contents of the X selection property
- * into WINE's clipboard cache and converting the
- * data format if necessary.
- */
- HANDLE hData = import_selection( display, w, prop, lpData->lpFormat );
- if (hData)
- bRet = X11DRV_CLIPBOARD_InsertClipboardData(lpData->wFormatID, hData, lpData->lpFormat, TRUE);
- else
- TRACE("Import function failed\n");
- }
- else
- {
- TRACE("Failed to convert selection\n");
- }
+ hData = import_selection( display, w, selectionCacheSrc, lpData->lpFormat );
+ if (hData)
+ bRet = X11DRV_CLIPBOARD_InsertClipboardData(lpData->wFormatID, hData, lpData->lpFormat, TRUE);
}
else
{
@@ -1937,8 +1932,6 @@ static BOOL X11DRV_CLIPBOARD_GetProperty(Display *display, Window w, Atom prop,
unsigned long pos = 0, nitems, remain, count;
unsigned char *val = NULL, *buffer;
- TRACE( "Reading property %s from X window %lx\n", debugstr_xatom( prop ), w );
-
for (;;)
{
if (XGetWindowProperty(display, w, prop, pos, INT_MAX / 4, False,
@@ -1971,6 +1964,9 @@ static BOOL X11DRV_CLIPBOARD_GetProperty(Display *display, Window w, Atom prop,
pos += count / sizeof(int);
}
+ TRACE( "got property %s type %s format %u len %lu from window %lx\n",
+ debugstr_xatom( prop ), debugstr_xatom( *atype ), aformat, *datasize, w );
+
/* Delete the property on the window now that we are done
* This will send a PropertyNotify event to the selection owner. */
XDeleteProperty(display, w, prop);
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
index 2d37138..48f3999 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -239,7 +239,8 @@ extern void X11DRV_XDND_EnterEvent( HWND hWnd, XClientMessageEvent *event ) DECL
extern void X11DRV_XDND_PositionEvent( HWND hWnd, XClientMessageEvent *event ) DECLSPEC_HIDDEN;
extern void X11DRV_XDND_DropEvent( HWND hWnd, XClientMessageEvent *event ) DECLSPEC_HIDDEN;
extern void X11DRV_XDND_LeaveEvent( HWND hWnd, XClientMessageEvent *event ) DECLSPEC_HIDDEN;
-extern HANDLE X11DRV_CLIPBOARD_ImportSelection(Display *d, Atom target, Window w, Atom prop, UINT *windowsFormat) DECLSPEC_HIDDEN;
+extern HANDLE X11DRV_CLIPBOARD_ImportSelection( Display *display, Window win, Atom selection,
+ Atom target, UINT *windowsFormat ) DECLSPEC_HIDDEN;
/**************************************************************************
* X11 GDI driver
@@ -453,7 +454,6 @@ enum x11drv_atoms
XATOM_XdndActionAsk,
XATOM_XdndActionPrivate,
XATOM_XdndSelection,
- XATOM_XdndTarget,
XATOM_XdndTypeList,
XATOM_HTML_Format,
XATOM_WCF_BITMAP,
diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c
index c2e0969..142c9b1 100644
--- a/dlls/winex11.drv/x11drv_main.c
+++ b/dlls/winex11.drv/x11drv_main.c
@@ -167,7 +167,6 @@ static const char * const atom_names[NB_XATOMS - FIRST_XATOM] =
"XdndActionAsk",
"XdndActionPrivate",
"XdndSelection",
- "XdndTarget",
"XdndTypeList",
"HTML Format",
"WCF_BITMAP",
diff --git a/dlls/winex11.drv/xdnd.c b/dlls/winex11.drv/xdnd.c
index cbc917a..eb9b117 100644
--- a/dlls/winex11.drv/xdnd.c
+++ b/dlls/winex11.drv/xdnd.c
@@ -49,10 +49,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(xdnd);
-/* Maximum wait time for selection notify */
-#define SELECTION_RETRIES 500 /* wait for .1 seconds */
-#define SELECTION_WAIT 1000 /* us */
-
typedef struct tagXDNDDATA
{
int cf_win;
@@ -496,9 +492,7 @@ void X11DRV_XDND_LeaveEvent( HWND hWnd, XClientMessageEvent *event )
static void X11DRV_XDND_ResolveProperty(Display *display, Window xwin, Time tm,
Atom *types, unsigned long count)
{
- unsigned int i, j;
- BOOL res;
- XEvent xe;
+ unsigned int i;
XDNDDATA *current, *next;
BOOL haveHDROP = FALSE;
@@ -516,24 +510,8 @@ static void X11DRV_XDND_ResolveProperty(Display *display, Window xwin, Time tm,
if (types[i] == 0)
continue;
- XConvertSelection(display, x11drv_atom(XdndSelection), types[i],
- x11drv_atom(XdndTarget), xwin, /*tm*/CurrentTime);
-
- /*
- * Wait for SelectionNotify
- */
- for (j = 0; j < SELECTION_RETRIES; j++)
- {
- res = XCheckTypedWindowEvent(display, xwin, SelectionNotify, &xe);
- if (res && xe.xselection.selection == x11drv_atom(XdndSelection)) break;
-
- usleep(SELECTION_WAIT);
- }
-
- if (xe.xselection.property == None)
- continue;
-
- contents = X11DRV_CLIPBOARD_ImportSelection(display, types[i], xwin, x11drv_atom(XdndTarget), &windowsFormat);
+ contents = X11DRV_CLIPBOARD_ImportSelection( display, xwin, x11drv_atom(XdndSelection),
+ types[i], &windowsFormat );
if (contents)
X11DRV_XDND_InsertXDNDData(types[i], windowsFormat, contents);
}
More information about the wine-cvs
mailing list