diff options
Diffstat (limited to 'xorg-server/hw/xwin/winclipboardwrappers.c')
-rw-r--r-- | xorg-server/hw/xwin/winclipboardwrappers.c | 80 |
1 files changed, 24 insertions, 56 deletions
diff --git a/xorg-server/hw/xwin/winclipboardwrappers.c b/xorg-server/hw/xwin/winclipboardwrappers.c index bfd6bff8b..2671fc000 100644 --- a/xorg-server/hw/xwin/winclipboardwrappers.c +++ b/xorg-server/hw/xwin/winclipboardwrappers.c @@ -62,6 +62,7 @@ extern Bool g_fClipboard; extern Window g_iClipboardWindow; extern Atom g_atomLastOwnedSelection; extern HWND g_hwndClipboard; +extern Bool g_fClipboardPrimary; /* @@ -77,12 +78,14 @@ winProcEstablishConnection(ClientPtr client) static int s_iCallCount = 0; static unsigned long s_ulServerGeneration = 0; + #ifdef WINDBG if (s_iCallCount == 0) winDebug("winProcEstablishConnection - Hello\n"); + #endif /* Do nothing if clipboard is not enabled */ if (!g_fClipboard) { - ErrorF("winProcEstablishConnection - Clipboard is not enabled, " + winDebug ("winProcEstablishConnection - Clipboard is not enabled, " "returning.\n"); /* Unwrap the original function, call it, and return */ @@ -129,7 +132,7 @@ winProcEstablishConnection(ClientPtr client) /* If the clipboard client has already been started, abort */ if (g_fClipboardLaunched) { - ErrorF("winProcEstablishConnection - Clipboard client already " + winDebug ("winProcEstablishConnection - Clipboard client already " "launched, returning.\n"); return iReturn; } @@ -160,7 +163,7 @@ winProcEstablishConnection(ClientPtr client) return iReturn; } - ErrorF("winProcEstablishConnection - winInitClipboard returned.\n"); + winDebug ("winProcEstablishConnection - winInitClipboard returned.\n"); } /* Flag that clipboard client has been launched */ @@ -173,14 +176,12 @@ winProcEstablishConnection(ClientPtr client) * Wrapper for internal SetSelectionOwner function. * Grabs ownership of Windows clipboard when X11 clipboard owner changes. */ - int winProcSetSelectionOwner(ClientPtr client) { int i; DrawablePtr pDrawable; WindowPtr pWindow = None; - Bool fOwnedToNotOwned = FALSE; static Window s_iOwners[CLIP_NUM_SELECTIONS] = { None }; static unsigned long s_ulServerGeneration = 0; @@ -194,7 +195,7 @@ winProcSetSelectionOwner(ClientPtr client) if (s_ulServerGeneration != serverGeneration) { /* Save new generation number */ s_ulServerGeneration = serverGeneration; - + /* Initialize static variables */ for (i = 0; i < CLIP_NUM_SELECTIONS; ++i) s_iOwners[i] = None; @@ -202,8 +203,8 @@ winProcSetSelectionOwner(ClientPtr client) /* Abort if clipboard not completely initialized yet */ if (!g_fClipboardStarted) { - /* ErrorF ("winProcSetSelectionOwner - Clipboard not yet started, " - "aborting.\n"); */ + winDebug ("winProcSetSelectionOwner - Clipboard not yet started, " + "aborting.\n"); goto winProcSetSelectionOwner_Done; } @@ -221,11 +222,9 @@ winProcSetSelectionOwner(ClientPtr client) /* Now we either have a valid window or None */ /* Save selection owners for monitored selections, ignore other selections */ - if (XA_PRIMARY == stuff->selection) { + if (XA_PRIMARY == stuff->selection && g_fClipboardPrimary) { /* Look for owned -> not owned transition */ if (None == stuff->window && None != s_iOwners[CLIP_OWN_PRIMARY]) { - fOwnedToNotOwned = TRUE; - winDebug("winProcSetSelectionOwner - PRIMARY - Going from " "owned to not owned.\n"); @@ -239,19 +238,17 @@ winProcSetSelectionOwner(ClientPtr client) /* Save new selection owner or None */ s_iOwners[CLIP_OWN_PRIMARY] = stuff->window; - winDebug("winProcSetSelectionOwner - PRIMARY - Now owned by: %d\n", - stuff->window); + winDebug ("winProcSetSelectionOwner - PRIMARY - Now owned by: 0x%x (clipboard is 0x%x)\n", + stuff->window,g_iClipboardWindow); } else if (MakeAtom("CLIPBOARD", 9, TRUE) == stuff->selection) { /* Look for owned -> not owned transition */ if (None == stuff->window && None != s_iOwners[CLIP_OWN_CLIPBOARD]) { - fOwnedToNotOwned = TRUE; - winDebug("winProcSetSelectionOwner - CLIPBOARD - Going from " "owned to not owned.\n"); /* Adjust last owned selection */ - if (None != s_iOwners[CLIP_OWN_PRIMARY]) + if ((None != s_iOwners[CLIP_OWN_PRIMARY]) && g_fClipboardPrimary) g_atomLastOwnedSelection = XA_PRIMARY; else g_atomLastOwnedSelection = None; @@ -260,9 +257,8 @@ winProcSetSelectionOwner(ClientPtr client) /* Save new selection owner or None */ s_iOwners[CLIP_OWN_CLIPBOARD] = stuff->window; - winDebug("winProcSetSelectionOwner - CLIPBOARD - Now owned by: %d\n", - stuff->window); - + winDebug ("winProcSetSelectionOwner - CLIPBOARD - Now owned by: 0x%x, clipboard is 0x%x\n", + stuff->window,g_iClipboardWindow); } else goto winProcSetSelectionOwner_Done; @@ -277,40 +273,15 @@ winProcSetSelectionOwner(ClientPtr client) if (g_iClipboardWindow == s_iOwners[CLIP_OWN_CLIPBOARD]) s_iOwners[CLIP_OWN_CLIPBOARD] = None; - /* - * Handle case when selection is being disowned, - * WM_DRAWCLIPBOARD did not do the disowning, - * both monitored selections are no longer owned, - * an owned to not owned transition was detected, - * and we currently own the Win32 clipboard. - */ - if (stuff->window == None - && s_iOwners[CLIP_OWN_PRIMARY] == None - && s_iOwners[CLIP_OWN_CLIPBOARD] == None - && fOwnedToNotOwned - && g_hwndClipboard != NULL && g_hwndClipboard == GetClipboardOwner()) { - winDebug("winProcSetSelectionOwner - We currently own the " - "clipboard and neither the PRIMARY nor the CLIPBOARD " - "selections are owned, releasing ownership of Win32 " - "clipboard.\n"); - - /* Release ownership of the Windows clipboard */ - OpenClipboard(NULL); - EmptyClipboard(); - CloseClipboard(); - - goto winProcSetSelectionOwner_Done; - } - /* Abort if no window at this point */ if (None == stuff->window) { - winDebug("winProcSetSelectionOwner - No window, returning.\n"); + winDebug ("winProcSetSelectionOwner - No window, returning.\n"); goto winProcSetSelectionOwner_Done; } /* Abort if invalid selection */ if (!ValidAtom(stuff->selection)) { - ErrorF("winProcSetSelectionOwner - Found BadAtom, aborting.\n"); + winDebug ("winProcSetSelectionOwner - Found BadAtom, aborting.\n"); goto winProcSetSelectionOwner_Done; } @@ -319,27 +290,22 @@ winProcSetSelectionOwner(ClientPtr client) /* Abort if clipboard manager is owning the selection */ if (pDrawable->id == g_iClipboardWindow) { - winDebug("winProcSetSelectionOwner - We changed ownership, " + winDebug ("winProcSetSelectionOwner - We changed ownership, " "aborting.\n"); goto winProcSetSelectionOwner_Done; } /* Abort if root window is taking ownership */ if (pDrawable->id == 0) { - ErrorF("winProcSetSelectionOwner - Root window taking ownership, " + winDebug ("winProcSetSelectionOwner - Root window taking ownership, " "aborting\n"); goto winProcSetSelectionOwner_Done; } - /* Close clipboard if we have it open already */ - if (GetOpenClipboardWindow() == g_hwndClipboard) { - CloseClipboard(); - } - /* Access the Windows clipboard */ if (!OpenClipboard(g_hwndClipboard)) { - ErrorF("winProcSetSelectionOwner - OpenClipboard () failed: %08x\n", - (int) GetLastError()); + ErrorF ("winProcSetSelectionOwner - OpenClipboard () failed: %08x, hwnd: %08x\n", + (int) GetLastError (),g_hwndClipboard); goto winProcSetSelectionOwner_Done; } @@ -347,9 +313,11 @@ winProcSetSelectionOwner(ClientPtr client) if (!EmptyClipboard()) { ErrorF("winProcSetSelectionOwner - EmptyClipboard () failed: %08x\n", (int) GetLastError()); + CloseClipboard (); goto winProcSetSelectionOwner_Done; } + winDebug("winProcSetSelectionOwner - SetClipboardData NULL\n"); /* Advertise regular text and unicode */ SetClipboardData(CF_UNICODETEXT, NULL); SetClipboardData(CF_TEXT, NULL); @@ -364,6 +332,6 @@ winProcSetSelectionOwner(ClientPtr client) goto winProcSetSelectionOwner_Done; } - winProcSetSelectionOwner_Done: +winProcSetSelectionOwner_Done: return (*winProcSetSelectionOwnerOrig) (client); } |