This is the mail archive of the cygwin-xfree@cygwin.com mailing list for the Cygwin XFree86 project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

RemoteDesktop/Clipboard Crash Patch


Symptom: After coming back from remote desktop session first copy
         operation might crash XWin when using -clipboard (maybe 
         requiring -multiwindow too).

Cause:   XWin becomes its own next window in the clipboard chain
         after trying to ensure that it is still in the clipboard
         chain.

Fix:     Don't allow s_hwndNextViewer to get set to hwnd.

Also:    Added new -clipboarddebug flag which turns on more
         debugging messages from the clipboard manager.

ChangeLog:

2004-05-03 Dan Wilks <dan_wilks@intuit.com>

* iniOutput.c (winUseMsg): Add documentation for new -clipboarddebug flag.
* winclipboardwndproc.c: Add reference to new clipboard debug variable.
(winClipboardWindowProc): Change debugging messages from #if 0 to use
new debug flag.  Don't try to set the "next window" in the clipboard 
chain to ourself.
* winglobals.c: Add new g_fClipboardDebug for clipboard debugging.
* winprocarg.c (ddxProcessArgument): Process -clipboarddebug and turn
on g_fClipboardDebug.

Diffs:
 
Index: InitOutput.c
===================================================================
RCS file: /cvs/xorg/xc/programs/Xserver/hw/xwin/InitOutput.c,v
retrieving revision 1.1.4.1.2.39
diff -u -p -r1.1.4.1.2.39 InitOutput.c
--- InitOutput.c	26 Apr 2004 12:50:59 -0000	1.1.4.1.2.39
+++ InitOutput.c	3 May 2004 22:51:50 -0000
@@ -385,6 +385,10 @@ winUseMsg (void)
 	  "\tRun the clipboard integration module.\n"
 	  "\tDo not use at the same time as 'xwinclip'.\n");
 
+  ErrorF ("-clipboarddebug\n"
+	  "\tRun the clipboard integration module with debugging output.\n"
+	  "\tDo not use at the same time as 'xwinclip'.\n");
+
   ErrorF ("-nounicodeclipboard\n"
 	  "\tDo not use Unicode clipboard even if NT-based platform.\n");
 #endif
Index: winclipboardwndproc.c
===================================================================
RCS file: /cvs/xorg/xc/programs/Xserver/hw/xwin/winclipboardwndproc.c,v
retrieving revision 1.1.4.1.2.20
diff -u -p -r1.1.4.1.2.20 winclipboardwndproc.c
--- winclipboardwndproc.c	26 Apr 2004 19:53:49 -0000	1.1.4.1.2.20
+++ winclipboardwndproc.c	3 May 2004 22:51:50 -0000
@@ -44,6 +44,7 @@
  */
 
 extern Bool		g_fUnicodeSupport;
+extern Bool		g_fClipboardDebug;
 extern void		*g_pClipboardDisplay;
 extern Window		g_iClipboardWindow;
 extern Atom		g_atomLastOwnedSelection;
@@ -145,9 +146,10 @@ winClipboardWindowProc (HWND hwnd, UINT 
     {
     case WM_DESTROY:
       {
-#if 0
-	ErrorF ("winClipboardWindowProc - WM_DESTROY\n");
-#endif
+	if (g_fClipboardDebug)
+	  {
+	    ErrorF ("winClipboardWindowProc - WM_DESTROY\n");
+	  }
 
 	/* Remove ourselves from the clipboard chain */
 	ChangeClipboardChain (hwnd, s_hwndNextViewer);
@@ -161,18 +163,27 @@ winClipboardWindowProc (HWND hwnd, UINT 
 
     case WM_CREATE:
       {
-#if 0
-	ErrorF ("winClipboardWindowProc - WM_CREATE\n");
-#endif
+	if (g_fClipboardDebug) 
+	  {
+	    ErrorF ("winClipboardWindowProc - WM_CREATE\n");
+	  }
 	
 	/* Add ourselves to the clipboard viewer chain */
 	s_hwndNextViewer = SetClipboardViewer (hwnd);
+	if (s_hwndNextViewer == hwnd)
+	  {
+	    s_hwndNextViewer = NULL;
+	  }
       }
       return 0;
 
 
     case WM_CHANGECBCHAIN:
       {
+	if (g_fClipboardDebug)
+	  {
+	    ErrorF ("winClipboardWindowProc - WM_CHANGECBCHAIN: wParam(%x)
s_hwndNextViewer(%x)\n", wParam, s_hwndNextViewer);
+	  }
 	if ((HWND) wParam == s_hwndNextViewer)
 	  s_hwndNextViewer = (HWND) lParam;
 	else if (s_hwndNextViewer)
@@ -197,10 +208,22 @@ winClipboardWindowProc (HWND hwnd, UINT 
 	 */
 
         s_fCBCInitialized = FALSE;
+	if (g_fClipboardDebug)
+	  {
+	    ErrorF ("winClipboardWindowProc - WM_WM_REINIT: Removing
ourselves\n");
+	  }
         ChangeClipboardChain (hwnd, s_hwndNextViewer);
         s_hwndNextViewer = NULL;
         s_fCBCInitialized = FALSE;
+	if (g_fClipboardDebug)
+	  {
+	    ErrorF ("winClipboardWindowProc - WM_WM_REINIT: Readding
ourselves\n");
+	  }
         s_hwndNextViewer = SetClipboardViewer (hwnd);
+	if (s_hwndNextViewer == hwnd)
+	  {
+	    s_hwndNextViewer = NULL;
+	  }
       }
       return 0;
 
@@ -211,9 +234,20 @@ winClipboardWindowProc (HWND hwnd, UINT 
 	Window	iWindow = g_iClipboardWindow;
 	int	iReturn;
 
+	if (g_fClipboardDebug)
+	  {
+	    ErrorF ("winClipboardWindowProc - WM_DRAWCLIPBOARD\n");
+	  }
+
 	/* Pass the message on the next window in the clipboard viewer chain
*/
-	if (s_hwndNextViewer)
-	  SendMessage (s_hwndNextViewer, message, 0, 0);
+	if (s_hwndNextViewer) 
+	  {
+	    if (g_fClipboardDebug)
+	      {
+		ErrorF ("winClipboardWindowProc - WM_DRAWCLIPBOARD:
Forwarding message to %x\n", s_hwndNextViewer);
+	      }
+	    SendMessage (s_hwndNextViewer, message, 0, 0);
+	  }
 	
 	/* Bail on first message */
 	if (!s_fCBCInitialized)
@@ -233,10 +267,11 @@ winClipboardWindowProc (HWND hwnd, UINT 
 	/* Bail when we still own the clipboard */
 	if (hwnd == GetClipboardOwner ())
 	  {
-#if 0
-	    ErrorF ("winClipboardWindowProc - WM_DRAWCLIPBOARD - "
-		    "We own the clipboard, returning.\n");
-#endif
+	    if (g_fClipboardDebug) 
+	      {
+		ErrorF ("winClipboardWindowProc - WM_DRAWCLIPBOARD - "
+			"We own the clipboard, returning.\n");
+	      }
 	    return 0;
 	  }
 
@@ -248,11 +283,12 @@ winClipboardWindowProc (HWND hwnd, UINT 
 	if (!IsClipboardFormatAvailable (CF_TEXT)
 	    && !IsClipboardFormatAvailable (CF_UNICODETEXT))
 	  {
-#if 0
-	    ErrorF ("winClipboardWindowProc - WM_DRAWCLIPBOARD - "
-		    "Clipboard does not contain CF_TEXT nor "
-		    "CF_UNICODETEXT.\n");
-#endif
+	    if (g_fClipboardDebug) 
+	      {
+		ErrorF ("winClipboardWindowProc - WM_DRAWCLIPBOARD - "
+			"Clipboard does not contain CF_TEXT nor "
+			"CF_UNICODETEXT.\n");
+	      }
 
 	    /*
 	     * We need to make sure that the X Server has processed
@@ -264,10 +300,11 @@ winClipboardWindowProc (HWND hwnd, UINT 
 	    iReturn = XGetSelectionOwner (pDisplay, XA_PRIMARY);
 	    if (iReturn == g_iClipboardWindow)
 	      {
-#if 0
-		ErrorF ("winClipboardWindowProc - WM_DRAWCLIPBOARD - "
-			"PRIMARY selection is owned by us.\n");
-#endif
+		if (g_fClipboardDebug) 
+		  {
+		    ErrorF ("winClipboardWindowProc - WM_DRAWCLIPBOARD - "
+			    "PRIMARY selection is owned by us.\n");
+		  }
 		XSetSelectionOwner (pDisplay,
 				    XA_PRIMARY,
 				    None,
@@ -284,10 +321,11 @@ winClipboardWindowProc (HWND hwnd, UINT 
 						       False));
 	    if (iReturn == g_iClipboardWindow)
 	      {
-#if 0
-		ErrorF ("winClipboardWindowProc - WM_DRAWCLIPBOARD - "
-			"CLIPBOARD selection is owned by us.\n");
-#endif
+		if (g_fClipboardDebug) 
+		  {
+		    ErrorF ("winClipboardWindowProc - WM_DRAWCLIPBOARD - "
+			    "CLIPBOARD selection is owned by us.\n");
+		  }
 		XSetSelectionOwner (pDisplay,
 				    XInternAtom (pDisplay,
 						 "CLIPBOARD",
@@ -312,13 +350,11 @@ winClipboardWindowProc (HWND hwnd, UINT 
 	    ErrorF ("winClipboardWindowProc - WM_DRAWCLIPBOARD - "
 		    "Could not reassert ownership of PRIMARY\n");
 	  }
-#if 0
-	else
+	else if (g_fClipboardDebug)
 	  {
 	    ErrorF ("winClipboardWindowProc - WM_DRAWCLIPBOARD - "
 		    "Reasserted ownership of PRIMARY\n");
 	  }
-#endif
 	
 	/* Reassert ownership of the CLIPBOARD */	  
 	iReturn = XSetSelectionOwner (pDisplay,
@@ -332,13 +368,11 @@ winClipboardWindowProc (HWND hwnd, UINT 
 	    ErrorF ("winClipboardWindowProc - WM_DRAWCLIPBOARD - "
 		    "Could not reassert ownership of CLIPBOARD\n");
 	  }
-#if 0
-	else
+	else if (g_fClipboardDebug) 
 	  {
 	    ErrorF ("winClipboardWindowProc - WM_DRAWCLIPBOARD - "
 		    "Reasserted ownership of CLIPBOARD\n");
 	  }
-#endif
 	
 	/* Flush the pending SetSelectionOwner event now */
 	XFlush (pDisplay);
@@ -368,9 +402,10 @@ winClipboardWindowProc (HWND hwnd, UINT 
 	Window	iWindow = g_iClipboardWindow;
 	Bool	fConvertToUnicode;
 
-#if 0
-	ErrorF ("winClipboardWindowProc - WM_RENDER*FORMAT - Hello.\n");
-#endif
+	if (g_fClipboardDebug) 
+	  {
+	    ErrorF ("winClipboardWindowProc - WM_RENDER*FORMAT - Hello.\n");
+	  }
 
 	/* Flag whether to convert to Unicode or not */
 	if (message == WM_RENDERALLFORMATS)
@@ -472,9 +507,10 @@ winClipboardWindowProc (HWND hwnd, UINT 
 	      }
 	  }
 
-#if 0
-	ErrorF ("winClipboardWindowProc - WM_RENDER*FORMAT - Returning.\n");
-#endif
+	if (g_fClipboardDebug) 
+	  {
+	    ErrorF ("winClipboardWindowProc - WM_RENDER*FORMAT -
Returning.\n");
+	  }
 	return 0;
       }
     }
Index: winglobals.c
===================================================================
RCS file: /cvs/xorg/xc/programs/Xserver/hw/xwin/Attic/winglobals.c,v
retrieving revision 1.1.2.20
diff -u -p -r1.1.2.20 winglobals.c
--- winglobals.c	22 Apr 2004 20:16:51 -0000	1.1.2.20
+++ winglobals.c	3 May 2004 22:51:50 -0000
@@ -95,6 +95,7 @@ winDispatchProcPtr	winProcSetSelectionOw
 
 Bool			g_fUnicodeClipboard = TRUE;
 Bool			g_fClipboard = FALSE;
+Bool			g_fClipboardDebug = FALSE;
 Bool			g_fClipboardLaunched = FALSE;
 Bool			g_fClipboardStarted = FALSE;
 pthread_t		g_ptClipboardProc = 0;
Index: winprocarg.c
===================================================================
RCS file: /cvs/xorg/xc/programs/Xserver/hw/xwin/Attic/winprocarg.c,v
retrieving revision 1.1.2.17
diff -u -p -r1.1.2.17 winprocarg.c
--- winprocarg.c	22 Apr 2004 20:16:51 -0000	1.1.2.17
+++ winprocarg.c	3 May 2004 22:51:50 -0000
@@ -42,6 +42,7 @@ extern Bool			g_fInitializedDefaultScree
 #ifdef XWIN_CLIPBOARD
 extern Bool			g_fUnicodeClipboard;
 extern Bool			g_fClipboard;
+extern Bool			g_fClipboardDebug;
 #endif
 extern int			g_iLogVerbose;
 extern char *			g_pszLogFile;
@@ -610,6 +611,18 @@ ddxProcessArgument (int argc, char *argv
       /* Indicate that we have processed this argument */
       return 1;
     }
+
+  /*
+   * Look for the '-clipboarddebug' argument
+   */
+  if (IS_OPTION ("-clipboarddebug"))
+    {
+      g_fClipboard = TRUE;
+      g_fClipboardDebug = TRUE;
+
+      /* Indicate that we have processed this argument */
+      return 1;
+    }
 #endif
 



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]