diff --git a/hw/xwin/winclipboard/thread.c b/hw/xwin/winclipboard/thread.c index 9ec61f8f5..bbb3a2142 100644 --- a/hw/xwin/winclipboard/thread.c +++ b/hw/xwin/winclipboard/thread.c @@ -56,7 +56,6 @@ */ extern Bool g_fUnicodeClipboard; -extern Bool g_fClipboard; /* * Global variables @@ -85,10 +84,12 @@ static int winClipboardIOErrorHandler(Display * pDisplay); /* - * Main thread function + * Create X11 and Win32 messaging windows, and run message processing loop + * + * returns TRUE if shutdown was signalled to loop, FALSE if some error occurred */ -void * +Bool winClipboardProc(char *szDisplay) { Atom atomClipboard; @@ -108,6 +109,7 @@ winClipboardProc(char *szDisplay) int iRetries; Bool fUseUnicode; int iSelectError; + Bool fShutdown = FALSE; winDebug("winClipboardProc - Hello\n"); @@ -349,8 +351,8 @@ winClipboardProc(char *szDisplay) } winClipboardProc_Exit: - /* disable the clipboard, which means the thread will die */ - g_fClipboard = FALSE; + /* broke out of while loop on a shutdown message */ + fShutdown = TRUE; winClipboardProc_Done: /* Close our Windows window */ @@ -394,7 +396,7 @@ winClipboardProc(char *szDisplay) /* global clipboard variable reset */ g_hwndClipboard = NULL; - return NULL; + return fShutdown; } /* diff --git a/hw/xwin/winclipboard/winclipboard.h b/hw/xwin/winclipboard/winclipboard.h index 58e35dc75..95b18a6e8 100644 --- a/hw/xwin/winclipboard/winclipboard.h +++ b/hw/xwin/winclipboard/winclipboard.h @@ -96,7 +96,7 @@ void * winclipboardthread.c */ -void *winClipboardProc(char *szDisplay); +Bool winClipboardProc(char *szDisplay); void winClipboardWindowDestroy(void); diff --git a/hw/xwin/winclipboardinit.c b/hw/xwin/winclipboardinit.c index 2e400f65b..25790d044 100644 --- a/hw/xwin/winclipboardinit.c +++ b/hw/xwin/winclipboardinit.c @@ -68,6 +68,8 @@ winClipboardThreadProc(void *arg) while (1) { + Bool fShutdown; + ++clipboardRestarts; /* Use our generated cookie for authentication */ @@ -89,11 +91,14 @@ winClipboardThreadProc(void *arg) /* Flag that clipboard client has been launched */ g_fClipboardStarted = TRUE; - winClipboardProc(szDisplay); + fShutdown = winClipboardProc(szDisplay); /* Flag that clipboard client has stopped */ g_fClipboardStarted = FALSE; + if (fShutdown) + break; + /* checking if we need to restart */ if (clipboardRestarts >= WIN_CLIPBOARD_RETRIES) { /* terminates clipboard thread but the main server still lives */