XWin Server - Sync with 4.3.0-40 release. Simplify setlocale() handling,

fix crashes in clipboard code, fix crash on startup when using
    -clipboard and -multiwindow.
This commit is contained in:
Harold L Hunt II 2004-01-13 01:08:37 +00:00
parent b0266a4e7f
commit d1b62d8fe9
6 changed files with 73 additions and 114 deletions

View file

@ -32,6 +32,7 @@ from The Open Group.
#include "winmsg.h"
#include "winconfig.h"
#include "winprefs.h"
#include "Xlocale.h"
/*
@ -117,8 +118,6 @@ extern Bool g_fClipboard;
void
OsVendorReset ()
{
int i;
ErrorF ("OsVendorReset - Hello\n");
/* Close down clipboard resources */
@ -454,6 +453,16 @@ InitOutput (ScreenInfo *screenInfo, int argc, char *argv[])
if (g_fXdmcpEnabled)
winGenerateAuthorization ();
/* Perform some one time initialization */
if (1 == serverGeneration)
{
/*
* setlocale applies to all threads in the current process.
* Apply locale specified in LANG environment variable.
*/
setlocale (LC_ALL, "");
}
#if CYGDEBUG || YES
winErrorFVerb (2, "InitOutput - Returning.\n");
#endif

View file

@ -44,7 +44,6 @@
* References to external symbols
*/
extern Bool g_fCalledSetLocale;
extern Bool g_fUnicodeClipboard;
extern unsigned long serverGeneration;
extern unsigned int g_uiAuthDataLen;
@ -102,28 +101,6 @@ winClipboardProc ()
/* Save the Unicode support flag in a global */
g_fUnicodeSupport = fUnicodeSupport;
/* Set the current locale? What does this do? */
if (!g_fCalledSetLocale)
{
ErrorF ("winClipboardProc - Calling setlocale ()\n");
if (!setlocale (LC_ALL, ""))
{
ErrorF ("winClipboardProc - setlocale () error\n");
pthread_exit (NULL);
}
ErrorF ("winClipboardProc - setlocale () returned\n");
/* See if X supports the current locale */
if (XSupportsLocale () == False)
{
ErrorF ("winClipboardProc - Locale not supported by X\n");
pthread_exit (NULL);
}
}
/* Flag that we have called setlocale */
g_fCalledSetLocale = TRUE;
/* Allow multiple threads to access Xlib */
if (XInitThreads () == 0)
{
@ -131,7 +108,12 @@ winClipboardProc ()
pthread_exit (NULL);
}
ErrorF ("winClipboardProc - XInitThreads () returned.\n");
/* See if X supports the current locale */
if (XSupportsLocale () == False)
{
ErrorF ("winClipboardProc - Locale not supported by X. Exiting.\n");
pthread_exit (NULL);
}
/* Set jump point for Error exits */
iReturn = setjmp (g_jmpEntry);

View file

@ -279,10 +279,12 @@ winProcEstablishConnection (ClientPtr client)
int
winProcSetSelectionOwner (ClientPtr client)
{
int i;
DrawablePtr pDrawable;
WindowPtr pWindow = None;
Bool fOwnedToNotOwned = FALSE;
static Window g_iOwners[CLIP_NUM_SELECTIONS] = {None};
static Window s_iOwners[CLIP_NUM_SELECTIONS] = {None};
static unsigned long s_ulServerGeneration = 0;
REQUEST(xSetSelectionOwnerReq);
REQUEST_SIZE_MATCH(xSetSelectionOwnerReq);
@ -291,6 +293,17 @@ winProcSetSelectionOwner (ClientPtr client)
ErrorF ("winProcSetSelectionOwner - Hello.\n");
#endif
/* Watch for server reset */
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;
}
/* Abort if clipboard not completely initialized yet */
if (!g_fClipboardStarted)
{
@ -319,37 +332,37 @@ winProcSetSelectionOwner (ClientPtr client)
{
/* Look for owned -> not owned transition */
if (None == stuff->window
&& None != g_iOwners[CLIP_OWN_PRIMARY])
&& None != s_iOwners[CLIP_OWN_PRIMARY])
{
fOwnedToNotOwned = TRUE;
/* Adjust last owned selection */
if (None != g_iOwners[CLIP_OWN_CLIPBOARD])
if (None != s_iOwners[CLIP_OWN_CLIPBOARD])
g_atomLastOwnedSelection = MakeAtom ("CLIPBOARD", 9, FALSE);
else
g_atomLastOwnedSelection = None;
}
/* Save new selection owner or None */
g_iOwners[CLIP_OWN_PRIMARY] = stuff->window;
s_iOwners[CLIP_OWN_PRIMARY] = stuff->window;
}
else if (MakeAtom ("CLIPBOARD", 9, FALSE) == stuff->selection)
{
/* Look for owned -> not owned transition */
if (None == stuff->window
&& None != g_iOwners[CLIP_OWN_CLIPBOARD])
&& None != s_iOwners[CLIP_OWN_CLIPBOARD])
{
fOwnedToNotOwned = TRUE;
/* Adjust last owned selection */
if (None != g_iOwners[CLIP_OWN_PRIMARY])
if (None != s_iOwners[CLIP_OWN_PRIMARY])
g_atomLastOwnedSelection = XA_PRIMARY;
else
g_atomLastOwnedSelection = None;
}
/* Save new selection owner or None */
g_iOwners[CLIP_OWN_CLIPBOARD] = stuff->window;
s_iOwners[CLIP_OWN_CLIPBOARD] = stuff->window;
}
else
goto winProcSetSelectionOwner_Done;
@ -363,8 +376,8 @@ winProcSetSelectionOwner (ClientPtr client)
*/
if (None == stuff->window
&& g_iClipboardWindow != client->lastDrawableID
&& None == g_iOwners[CLIP_OWN_PRIMARY]
&& None == g_iOwners[CLIP_OWN_CLIPBOARD]
&& None == s_iOwners[CLIP_OWN_PRIMARY]
&& None == s_iOwners[CLIP_OWN_CLIPBOARD]
&& fOwnedToNotOwned
&& g_hwndClipboard != NULL
&& g_hwndClipboard == GetClipboardOwner ())

View file

@ -51,7 +51,6 @@ DWORD g_dwEnginesSupported = 0;
HINSTANCE g_hInstance = 0;
HWND g_hDlgDepthChange = NULL;
HWND g_hDlgExit = NULL;
Bool g_fCalledSetLocale = FALSE;
const char * g_pszQueryHost = NULL;
Bool g_fUnicodeClipboard = TRUE;
Bool g_fClipboard = FALSE;
@ -91,9 +90,6 @@ HWND g_hwndClipboard;
void *g_pClipboardDisplay;
Window g_iClipboardWindow;
Atom g_atomLastOwnedSelection;
#if 0
Window g_iClipboardOwner[CLIP_NUM_SELECTIONS];
#endif
/*
@ -104,6 +100,5 @@ Window g_iClipboardOwner[CLIP_NUM_SELECTIONS];
void
winInitializeGlobals ()
{
g_fCalledSetLocale = FALSE;
g_fClipboardLaunched = FALSE;
}

View file

@ -60,11 +60,6 @@ winUpdateWindowsWindow (WindowPtr pWin);
static void
winFindWindow (pointer value, XID id, pointer cdata);
#if 0
static void
winRestackXWindow (WindowPtr pWin, int smode);
#endif
/*
* Constant defines
@ -756,37 +751,6 @@ winFindWindow (pointer value, XID id, pointer cdata)
}
#if 0
/*
* winRestackXWindow -
*/
static void
winRestackXWindow (WindowPtr pWin, int smode)
{
XID *vlist = malloc(sizeof(unsigned long));
if (vlist == NULL)
{
ErrorF ("winRestackXWindow - malloc () failed\n");
return;
}
if (pWin == NULL)
{
ErrorF ("winRestackXWindow - NULL window\n");
free(vlist);
return;
}
*((unsigned long*)vlist) = smode;
ConfigureWindow (pWin, CWStackMode, vlist, wClient(pWin));
free(vlist);
}
#endif
/*
* winReorderWindowsMultiWindow -
*/

View file

@ -84,6 +84,7 @@ typedef struct _WMMsgQueueRec {
struct _WMMsgNodeRec *pTail;
pthread_mutex_t pmMutex;
pthread_cond_t pcNotEmpty;
int nQueueSize;
} WMMsgQueueRec, *WMMsgQueuePtr;
typedef struct _WMInfo {
@ -101,9 +102,9 @@ typedef struct _WMProcArgRec {
} WMProcArgRec, *WMProcArgPtr;
typedef struct _XMsgProcArgRec {
Display *pDisplay;
DWORD dwScreen;
WMInfoPtr pWMInfo;
Display *pDisplay;
DWORD dwScreen;
WMInfoPtr pWMInfo;
pthread_mutex_t *ppmServerStarted;
} XMsgProcArgRec, *XMsgProcArgPtr;
@ -114,7 +115,6 @@ typedef struct _XMsgProcArgRec {
extern char *display;
extern void ErrorF (const char* /*f*/, ...);
extern Bool g_fCalledSetLocale;
/*
@ -165,13 +165,11 @@ winInitMultiWindowWM (WMInfoPtr pWMInfo, WMProcArgPtr pProcArg);
* Local globals
*/
static int g_nQueueSize;
static jmp_buf g_jmpWMEntry;
static jmp_buf g_jmpXMsgProcEntry;
static Bool g_shutdown = FALSE;
/*
* PushMessage - Push a message onto the queue
*/
@ -225,7 +223,7 @@ PushMessage (WMMsgQueuePtr pQueue, WMMsgNodePtr pNode)
#endif
/* Increase the count of elements in the queue by one */
++g_nQueueSize;
++(pQueue->nQueueSize);
/* Release the queue mutex */
pthread_mutex_unlock (&pQueue->pmMutex);
@ -285,10 +283,10 @@ PopMessage (WMMsgQueuePtr pQueue, WMInfoPtr pWMInfo)
}
/* Drop the number of elements in the queue by one */
--g_nQueueSize;
--(pQueue->nQueueSize);
#if CYGMULTIWINDOW_DEBUG
ErrorF ("Queue Size %d %d\n", g_nQueueSize, QueueSize(pQueue));
ErrorF ("Queue Size %d %d\n", pQueue->nQueueSize, QueueSize(pQueue));
#endif
/* Release the queue mutex */
@ -339,10 +337,11 @@ InitQueue (WMMsgQueuePtr pQueue)
pQueue->pTail = NULL;
/* There are no elements initially */
g_nQueueSize = 0;
pQueue->nQueueSize = 0;
#if CYGMULTIWINDOW_DEBUG
ErrorF ("InitQueue - Queue Size %d %d\n", g_nQueueSize, QueueSize(pQueue));
ErrorF ("InitQueue - Queue Size %d %d\n", pQueue->nQueueSize,
QueueSize(pQueue));
#endif
ErrorF ("InitQueue - Calling pthread_mutex_init\n");
@ -421,7 +420,6 @@ GetWindowName (Display *pDisplay, Window iWin, char **ppName)
#endif
}
#if CYGMULTIWINDOW_DEBUG
ErrorF ("GetWindowName - Returning\n");
#endif
@ -538,7 +536,7 @@ winMultiWindowWMProc (void *pArg)
{
/* Bail if PopMessage returns without a message */
/* NOTE: Remember that PopMessage is a blocking function. */
ErrorF ("winMultiWindowWMProc - Queue is Empty?\n");
ErrorF ("winMultiWindowWMProc - Queue is Empty? Exiting.\n");
pthread_exit (NULL);
}
@ -737,7 +735,15 @@ winMultiWindowXMsgProc (void *pArg)
ErrorF ("winMultiWindowXMsgProc - XInitThreads () failed.\n");
pthread_exit (NULL);
}
/* See if X supports the current locale */
if (XSupportsLocale () == False)
{
ErrorF ("winMultiWindowXMsgProc - Locale not supported by X. "
"Exiting.\n");
pthread_exit (NULL);
}
/* Release the server started mutex */
pthread_mutex_unlock (pProcArg->ppmServerStarted);
@ -797,7 +803,7 @@ winMultiWindowXMsgProc (void *pArg)
/* Make sure that the display opened */
if (pProcArg->pDisplay == NULL)
{
ErrorF ("winMultiWindowXMsgProcwinInitMultiWindowWM - "
ErrorF ("winMultiWindowXMsgProc - "
"Failed opening the display, giving up.\n\f");
pthread_exit (NULL);
}
@ -905,10 +911,15 @@ winInitWM (void **ppWMInfo,
/* Bail if the input parameters are bad */
if (pArg == NULL || pWMInfo == NULL)
{
ErrorF ("winInitWM - malloc fail.\n");
ErrorF ("winInitWM - malloc failed.\n");
return FALSE;
}
/* Zero the allocated memory */
ZeroMemory (pArg, sizeof (WMProcArgRec));
ZeroMemory (pWMInfo, sizeof (WMInfoRec));
ZeroMemory (pXMsgArg, sizeof (XMsgProcArgRec));
/* Set a return pointer to the Window Manager info structure */
*ppWMInfo = pWMInfo;
@ -984,28 +995,6 @@ winInitMultiWindowWM (WMInfoPtr pWMInfo, WMProcArgPtr pProcArg)
ErrorF ("winInitMultiWindowWM - pthread_mutex_lock () returned.\n");
/* Set the current locale? What does this do? */
if (!g_fCalledSetLocale)
{
ErrorF ("winInitMultiWindowWM - Calling setlocale ()\n");
if (!setlocale (LC_ALL, ""))
{
ErrorF ("winInitMultiWindowWM - setlocale () error\n");
pthread_exit (NULL);
}
ErrorF ("winInitMultiWindowWM - setlocale () returned\n");
/* See if X supports the current locale */
if (XSupportsLocale () == False)
{
ErrorF ("winInitMultiWindowWM - Locale not supported by X\n");
pthread_exit (NULL);
}
}
/* Flag that we have called setlocale */
g_fCalledSetLocale = TRUE;
/* Allow multiple threads to access Xlib */
if (XInitThreads () == 0)
{
@ -1013,6 +1002,13 @@ winInitMultiWindowWM (WMInfoPtr pWMInfo, WMProcArgPtr pProcArg)
pthread_exit (NULL);
}
/* See if X supports the current locale */
if (XSupportsLocale () == False)
{
ErrorF ("winInitMultiWindowWM - Locale not supported by X. Exiting.\n");
pthread_exit (NULL);
}
/* Release the server started mutex */
pthread_mutex_unlock (pProcArg->ppmServerStarted);