2003-11-14 17:48:57 +01:00
/*
2004-06-21 15:19:32 +02:00
* Copyright ( C ) 2003 - 2004 Harold L Hunt II All Rights Reserved .
2003-11-14 17:48:57 +01:00
*
* Permission is hereby granted , free of charge , to any person obtaining
* a copy of this software and associated documentation files ( the
* " Software " ) , to deal in the Software without restriction , including
* without limitation the rights to use , copy , modify , merge , publish ,
* distribute , sublicense , and / or sell copies of the Software , and to
* permit persons to whom the Software is furnished to do so , subject to
* the following conditions :
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software .
*
* THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND ,
* EXPRESS OR IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY , FITNESS FOR A PARTICULAR PURPOSE AND
2004-06-21 15:19:32 +02:00
* NONINFRINGEMENT . IN NO EVENT SHALL HAROLD L HUNT II BE LIABLE FOR
2003-11-14 17:48:57 +01:00
* ANY CLAIM , DAMAGES OR OTHER LIABILITY , WHETHER IN AN ACTION OF
* CONTRACT , TORT OR OTHERWISE , ARISING FROM , OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE .
*
2004-06-21 15:19:32 +02:00
* Except as contained in this notice , the name of Harold L Hunt II
2003-11-14 17:48:57 +01:00
* shall not be used in advertising or otherwise to promote the sale , use
* or other dealings in this Software without prior written authorization
2004-06-21 15:19:32 +02:00
* from Harold L Hunt II .
2003-11-14 17:48:57 +01:00
*
* Authors : Harold L Hunt II
*/
2005-07-05 00:10:43 +02:00
# ifdef HAVE_XWIN_CONFIG_H
# include <xwin-config.h>
# endif
2013-06-17 00:57:17 +02:00
# include <unistd.h>
# include <pthread.h>
2013-06-17 19:27:56 +02:00
# include "win.h"
2013-06-17 01:38:47 +02:00
# include "winclipboard/winclipboard.h"
2013-06-17 03:01:27 +02:00
# include "windisplay.h"
2003-11-14 17:48:57 +01:00
2013-06-17 00:57:17 +02:00
# define WIN_CLIPBOARD_RETRIES 40
# define WIN_CLIPBOARD_DELAY 1
2013-06-17 01:07:01 +02:00
/*
* Local variables
*/
static pthread_t g_ptClipboardProc ;
2004-06-21 15:19:32 +02:00
2013-06-17 00:57:17 +02:00
/*
*
*/
static void *
winClipboardThreadProc ( void * arg )
{
2013-06-17 03:01:27 +02:00
char szDisplay [ 512 ] ;
2013-06-17 00:57:17 +02:00
int clipboardRestarts = 0 ;
while ( 1 )
{
2013-06-18 01:32:53 +02:00
Bool fShutdown ;
2013-06-17 00:57:17 +02:00
+ + clipboardRestarts ;
2013-06-17 03:01:27 +02:00
/* Use our generated cookie for authentication */
winSetAuthorization ( ) ;
/* Setup the display connection string */
/*
* NOTE : Always connect to screen 0 since we require that screen
* numbers start at 0 and increase without gaps . We only need
* to connect to one screen on the display to get events
* for all screens on the display . That is why there is only
* one clipboard client thread .
*/
winGetDisplayName ( szDisplay , 0 ) ;
/* Print the display connection string */
ErrorF ( " winClipboardThreadProc - DISPLAY=%s \n " , szDisplay ) ;
2013-06-17 00:57:17 +02:00
/* Flag that clipboard client has been launched */
2013-06-17 02:30:09 +02:00
g_fClipboardStarted = TRUE ;
2013-06-17 00:57:17 +02:00
2013-06-17 20:07:05 +02:00
fShutdown = winClipboardProc ( g_fUnicodeClipboard , szDisplay ) ;
2013-06-17 00:57:17 +02:00
2013-06-17 02:30:09 +02:00
/* Flag that clipboard client has stopped */
g_fClipboardStarted = FALSE ;
2013-06-18 01:32:53 +02:00
if ( fShutdown )
break ;
2013-06-17 00:57:17 +02:00
/* checking if we need to restart */
if ( clipboardRestarts > = WIN_CLIPBOARD_RETRIES ) {
/* terminates clipboard thread but the main server still lives */
ErrorF ( " winClipboardProc - the clipboard thread has restarted %d times and seems to be unstable, disabling clipboard integration \n " , clipboardRestarts ) ;
g_fClipboard = FALSE ;
break ;
}
sleep ( WIN_CLIPBOARD_DELAY ) ;
ErrorF ( " winClipboardProc - trying to restart clipboard thread \n " ) ;
}
return NULL ;
}
2003-11-14 17:48:57 +01:00
/*
* Intialize the Clipboard module
*/
Bool
2012-03-21 20:55:09 +01:00
winInitClipboard ( void )
2003-11-14 17:48:57 +01:00
{
2012-07-05 14:19:02 +02:00
winDebug ( " winInitClipboard () \n " ) ;
2003-11-14 17:48:57 +01:00
2012-03-21 20:55:09 +01:00
/* Spawn a thread for the Clipboard module */
2013-06-17 00:57:17 +02:00
if ( pthread_create ( & g_ptClipboardProc , NULL , winClipboardThreadProc , NULL ) ) {
2012-03-21 20:55:09 +01:00
/* Bail if thread creation failed */
ErrorF ( " winInitClipboard - pthread_create failed. \n " ) ;
return FALSE ;
2003-11-14 17:48:57 +01:00
}
2012-03-21 20:55:09 +01:00
return TRUE ;
2003-11-14 17:48:57 +01:00
}
2013-06-17 01:07:01 +02:00
void
winClipboardShutdown ( void )
{
/* Close down clipboard resources */
2013-06-17 02:55:46 +02:00
if ( g_fClipboard & & g_fClipboardStarted ) {
2013-06-17 01:07:01 +02:00
/* Synchronously destroy the clipboard window */
2013-06-17 14:18:16 +02:00
winClipboardWindowDestroy ( ) ;
2013-06-17 01:07:01 +02:00
/* Wait for the clipboard thread to exit */
pthread_join ( g_ptClipboardProc , NULL ) ;
g_fClipboardStarted = FALSE ;
winDebug ( " winClipboardShutdown - Clipboard thread has exited. \n " ) ;
}
}