Merge remote-tracking branch 'jturney/master'
This commit is contained in:
		
						commit
						6e438a0e18
					
				| 
						 | 
				
			
			@ -5,7 +5,6 @@ SRCS_CLIPBOARD = \
 | 
			
		|||
	winclipboardinit.c \
 | 
			
		||||
	winclipboardtextconv.c \
 | 
			
		||||
	winclipboardthread.c \
 | 
			
		||||
	winclipboardunicode.c \
 | 
			
		||||
	winclipboardwndproc.c \
 | 
			
		||||
	winclipboardwrappers.c \
 | 
			
		||||
	winclipboardxevents.c
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										141
									
								
								hw/xwin/README
								
								
								
								
							
							
						
						
									
										141
									
								
								hw/xwin/README
								
								
								
								
							| 
						 | 
				
			
			@ -1,141 +0,0 @@
 | 
			
		|||
Cygwin/X Release Notes
 | 
			
		||||
======================
 | 
			
		||||
 | 
			
		||||
Release X11R6.7
 | 
			
		||||
===============
 | 
			
		||||
 | 
			
		||||
Cygwin/X has continued its rapid pace of development that it has sustained
 | 
			
		||||
since Spring 2001 and this release shows it, we now have: a stable and fast
 | 
			
		||||
multi-window mode, seamless clipboard integration, a configurable tray menu
 | 
			
		||||
icon, popups on error messages pointing users to the log file and our mailing
 | 
			
		||||
list, the beginnings of indirect 3D acceleration for OpenGL applications,
 | 
			
		||||
improved non-US keyboard and clipboard support, and only a handful of bugs
 | 
			
		||||
that continue to be reported.
 | 
			
		||||
 | 
			
		||||
Between the XFree86 4.3.0 release and the X.Org X11R6.7 release the Cyg-
 | 
			
		||||
win/XFree86 project broke away from The XFree86 Project, Inc. due to a lack
 | 
			
		||||
of support from the XFree86 project.  As such, the Cygwin/XFree86 project was
 | 
			
		||||
renamed to the Cygwin/X project and the upstream source code tree that Cyg-
 | 
			
		||||
win/X pulls from and pushes to is now the tree managed by the X.Org Founda-
 | 
			
		||||
tion.  The Cygwin/X project has seen a rush of development and interest in
 | 
			
		||||
the project since the split; one metric showing this is that the number of
 | 
			
		||||
CVS committers we have has gone from zero to six.
 | 
			
		||||
 | 
			
		||||
The most outstanding features of this release are
 | 
			
		||||
 | 
			
		||||
   o Major multi-window mode improvements. (Takuma Murakami, Earle F. 
 | 
			
		||||
     Philhower III)
 | 
			
		||||
 | 
			
		||||
   o Initial work of accelerated OpenGL using the windows OpenGL drivers. 
 | 
			
		||||
     (Alexander Gottwald)
 | 
			
		||||
 | 
			
		||||
   o Massive rework of clipboard integration with windows. (Harold L Hunt II,
 | 
			
		||||
     Kensuke Matsuzaki)
 | 
			
		||||
 | 
			
		||||
   o Improved Japanese clipboard and keyboard support. (Kensuke Matsuzaki,
 | 
			
		||||
     Takuma Murakami, Alexander Gottwald)
 | 
			
		||||
 | 
			
		||||
   o Customizable tray menu icon allowing shortcuts to start programs,
 | 
			
		||||
     etc.(Earle F. Philhower III)
 | 
			
		||||
 | 
			
		||||
   o New icons. (Jehan Bing, Michael Bax, Benjamin Rienfenstahl)
 | 
			
		||||
 | 
			
		||||
   o Fix some multi-monitor problems.(Takuma Murakami)
 | 
			
		||||
 | 
			
		||||
   o Fix repeated key strokes. (Ivan Pascal)
 | 
			
		||||
 | 
			
		||||
   o Automatic keyboard layouts for the most frequently used keyboard lay-
 | 
			
		||||
     outs. (Alexander Gottwald)
 | 
			
		||||
 | 
			
		||||
   o Built in SHM support with detection of the SHM engine (cygserver).
 | 
			
		||||
     (Ralf Habacker, Harold L Hunt II)
 | 
			
		||||
 | 
			
		||||
   o Merged in work on the NativeGDI engine. (Alan Hourihane)
 | 
			
		||||
 | 
			
		||||
OpenGL with Cygwin/X
 | 
			
		||||
====================
 | 
			
		||||
 | 
			
		||||
Cygwin/X has supported GLX only with software rendering provided by the Mesa
 | 
			
		||||
library. Starting with X11R6.7 we add support for hardware accelerated OpenGL.
 | 
			
		||||
 | 
			
		||||
This support is still under development and still has some bigger problems. 
 | 
			
		||||
To provide both versions (the stable software rendering and the new hardware
 | 
			
		||||
accelerated) we ship to binaries. XWin.exe contains the software rendering 
 | 
			
		||||
and XWin_GL.exe uses the hardware acceleration provided by the windows drivers.
 | 
			
		||||
 | 
			
		||||
The known problems with hardware accelerated OpenGL are:
 | 
			
		||||
 | 
			
		||||
   o Only multiwindow mode is useful. In the other modes the OpenGL output 
 | 
			
		||||
     does not align with the X11 windows.
 | 
			
		||||
 | 
			
		||||
   o Using two programs which require different visuals will fail. For example
 | 
			
		||||
     glxgears and glxinfo will not work without restarting XWin_GL.exe.
 | 
			
		||||
 | 
			
		||||
   o OpenGL extensions and functions from OpenGL 1.2 and later should work 
 | 
			
		||||
     but are not completely tested.
 | 
			
		||||
 | 
			
		||||
   o The standard Windows OpenGL driver will produce no output. Use the one 
 | 
			
		||||
     from your video adapter vendor.  
 | 
			
		||||
 | 
			
		||||
If you notice problems with some programs please send a message with the 
 | 
			
		||||
logfile /tmp/XWin.log and a short error description to <cygwin-xfree@cygwin.com>
 | 
			
		||||
 | 
			
		||||
The hardware accelerated OpenGL was tested using: 
 | 
			
		||||
 | 
			
		||||
   o glxgears
 | 
			
		||||
   o glxinfo
 | 
			
		||||
   o blender
 | 
			
		||||
   o tuxkart
 | 
			
		||||
   o GLUT demos (some did fail)
 | 
			
		||||
   o tuxracer (currently not working)
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
Release X11R6.8
 | 
			
		||||
===============
 | 
			
		||||
 | 
			
		||||
Having reached a quite mature state in release X11R6.7 the development 
 | 
			
		||||
has slowed down a little bit. Some of the former active developers have
 | 
			
		||||
retired or cut their work for the Cygwin/X project due to conflicts with 
 | 
			
		||||
job, study and family. 
 | 
			
		||||
 | 
			
		||||
The X11R6.8 release now includes major improvements from the xserver project.
 | 
			
		||||
This includes the XFixes, Damage, Composite and XEVIE extension which is a 
 | 
			
		||||
major step towards allowing Cygwin/X to have real transparency. 
 | 
			
		||||
 | 
			
		||||
But at the current state Composite is not working with Cygwin/X. Not all code
 | 
			
		||||
in the Cygwin/X Server has been updated to support the Composite feature and
 | 
			
		||||
using it will even crash the xserver. But as a second problem nearly all
 | 
			
		||||
functions required for compositing are lacking acceleration in Cygwin/X so
 | 
			
		||||
the feature would not be very useful if it would work. So it is disabled by
 | 
			
		||||
default. 
 | 
			
		||||
 | 
			
		||||
OpenGL with Cygwin/X
 | 
			
		||||
====================
 | 
			
		||||
 | 
			
		||||
The OpenGL support has lost some of it's limitations from the last release 
 | 
			
		||||
and should be much more stable. But due to missing wide spread testing in 
 | 
			
		||||
the community it is still available in a separate program. XWin still uses 
 | 
			
		||||
the old software OpenGL which is known to be stable.
 | 
			
		||||
 | 
			
		||||
The known problems with hardware accelerated OpenGL are:
 | 
			
		||||
 | 
			
		||||
   o Only multiwindow mode is useful. In the other modes the OpenGL output 
 | 
			
		||||
     does not align with the X11 windows.
 | 
			
		||||
 | 
			
		||||
   o OpenGL extensions and functions from OpenGL 1.2 and later should work 
 | 
			
		||||
     but are not completely tested.
 | 
			
		||||
 | 
			
		||||
   o The standard Windows OpenGL driver will produce no output. Use the one 
 | 
			
		||||
     from your video adapter vendor.  
 | 
			
		||||
 | 
			
		||||
If you notice problems with some programs please send a message with the 
 | 
			
		||||
logfile /tmp/XWin.log and a short error description to <cygwin-xfree@cygwin.com>
 | 
			
		||||
 | 
			
		||||
The hardware accelerated OpenGL was tested using: 
 | 
			
		||||
 | 
			
		||||
   o glxgears
 | 
			
		||||
   o glxinfo
 | 
			
		||||
   o blender
 | 
			
		||||
   o tuxkart
 | 
			
		||||
   o GLUT demos (some did fail)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -313,18 +313,22 @@ exit silently and don't display any error message.
 | 
			
		|||
.B "\-xkbvariant \fIvariant\fp"
 | 
			
		||||
These options configure the xkeyboard extension to load
 | 
			
		||||
a particular keyboard map as the X server starts.  The behavior is similar
 | 
			
		||||
to the \fIsetxkbmap\fP program.  The layout data is located at \fI
 | 
			
		||||
__datadir__/X11/xkb/\fP.  Additional information is found in the
 | 
			
		||||
README files therein and in the man page of \fIsetxkbmap\fP.  For example
 | 
			
		||||
in order to load a German layout for a pc105 keyboard one uses
 | 
			
		||||
the options:
 | 
			
		||||
to the \fIsetxkbmap\fP(1) program.
 | 
			
		||||
 | 
			
		||||
See the \fIxkeyboard-config\fP(__miscmansuffix__) manual page for a list of
 | 
			
		||||
keyboard configurations.
 | 
			
		||||
 | 
			
		||||
The keyboard layout data is located at \fI__datadir__/X11/xkb/\fP.  Additional information
 | 
			
		||||
can be found in the README files there and in the \fIsetxkbmap\fP(1) manual page.
 | 
			
		||||
 | 
			
		||||
For example, in order to load a German layout for a pc105 keyboard, use the options:
 | 
			
		||||
.br
 | 
			
		||||
.I " \-xkblayout de \-xkbmodel pc105"
 | 
			
		||||
 | 
			
		||||
Alternatively one may use the \fIsetxkbmap\fP program after \fIXWin\fP is
 | 
			
		||||
Alternatively, you can use the \fIsetxkbmap\fP(1) program after \fIXWin\fP is
 | 
			
		||||
running.
 | 
			
		||||
 | 
			
		||||
The default is to select a configuration matching your current layout as
 | 
			
		||||
The default is to select a keyboard configuration matching your current layout as
 | 
			
		||||
reported by \fIWindows\fP, if known, or the default X server configuration
 | 
			
		||||
if no matching keyboard configuration was found.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -370,7 +374,7 @@ window, in both the generic case and for particular programs.
 | 
			
		|||
* To change the style that is associated to the \fIWindows\fP window that
 | 
			
		||||
\fXWin I-multiwindow\fP produces for each top-level X window.
 | 
			
		||||
.PP
 | 
			
		||||
The format of the \fI.XWinrc\fP file is given in the man page XWinrc(5).
 | 
			
		||||
The format of the \fI.XWinrc\fP file is given in the XWinrc(5) manual page.
 | 
			
		||||
 | 
			
		||||
.SH EXAMPLES
 | 
			
		||||
Need some examples
 | 
			
		||||
| 
						 | 
				
			
			@ -378,15 +382,15 @@ Need some examples
 | 
			
		|||
 | 
			
		||||
.SH "SEE ALSO"
 | 
			
		||||
X(__miscmansuffix__), Xserver(1), xdm(1), xinit(1), XWinrc(__filemansuffix__),
 | 
			
		||||
setxkbmap(1), xkeyboard-config (__miscmansuffix__).
 | 
			
		||||
setxkbmap(1), xkeyboard-config(__miscmansuffix__).
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.SH BUGS
 | 
			
		||||
.I XWin
 | 
			
		||||
and this man page still have many limitations.
 | 
			
		||||
and this manual page still have many limitations.
 | 
			
		||||
 | 
			
		||||
The \fIXWin\fP software is continuously developing; it is therefore possible that
 | 
			
		||||
this man page is not up to date.  It is always prudent to
 | 
			
		||||
this manual page is not up to date.  It is always prudent to
 | 
			
		||||
look also at the output of \fIXWin -help\fP in order to
 | 
			
		||||
check the options that are operative.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -388,6 +388,7 @@ typedef struct {
 | 
			
		|||
    DWORD dwScreen;
 | 
			
		||||
 | 
			
		||||
    int iMonitor;
 | 
			
		||||
    HMONITOR hMonitor;
 | 
			
		||||
    DWORD dwUserWidth;
 | 
			
		||||
    DWORD dwUserHeight;
 | 
			
		||||
    DWORD dwWidth;
 | 
			
		||||
| 
						 | 
				
			
			@ -578,7 +579,6 @@ typedef struct _winPrivScreenRec {
 | 
			
		|||
    UnrealizeWindowProcPtr UnrealizeWindow;
 | 
			
		||||
    ValidateTreeProcPtr ValidateTree;
 | 
			
		||||
    PostValidateTreeProcPtr PostValidateTree;
 | 
			
		||||
    WindowExposuresProcPtr WindowExposures;
 | 
			
		||||
    CopyWindowProcPtr CopyWindow;
 | 
			
		||||
    ClearToBackgroundProcPtr ClearToBackground;
 | 
			
		||||
    ClipNotifyProcPtr ClipNotify;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -58,7 +58,7 @@ winBlockHandler(ScreenPtr pScreen,
 | 
			
		|||
    if (pScreenPriv != NULL && !pScreenPriv->fServerStarted) {
 | 
			
		||||
        int iReturn;
 | 
			
		||||
 | 
			
		||||
        winDebug("winBlockHandler - Releasing pmServerStarted\n");
 | 
			
		||||
        ErrorF("winBlockHandler - pthread_mutex_unlock()\n");
 | 
			
		||||
 | 
			
		||||
        /* Flag that modules are to be started */
 | 
			
		||||
        pScreenPriv->fServerStarted = TRUE;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -111,13 +111,6 @@ void *winClipboardProc(void *);
 | 
			
		|||
void
 | 
			
		||||
 winDeinitClipboard(void);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * winclipboardunicode.c
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
Bool
 | 
			
		||||
 winClipboardDetectUnicodeSupport(void);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * winclipboardwndproc.c
 | 
			
		||||
 */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -58,7 +58,7 @@ extern HWND g_hwndClipboard;
 | 
			
		|||
Bool
 | 
			
		||||
winInitClipboard(void)
 | 
			
		||||
{
 | 
			
		||||
    ErrorF("winInitClipboard ()\n");
 | 
			
		||||
    winDebug("winInitClipboard ()\n");
 | 
			
		||||
 | 
			
		||||
    /* Wrap some internal server functions */
 | 
			
		||||
    if (ProcVector[X_SetSelectionOwner] != winProcSetSelectionOwner) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -64,7 +64,6 @@ static int clipboardRestarts = 0;
 | 
			
		|||
static XIOErrorHandler g_winClipboardOldIOErrorHandler;
 | 
			
		||||
static pthread_t g_winClipboardProcThread;
 | 
			
		||||
 | 
			
		||||
Bool g_fUnicodeSupport = FALSE;
 | 
			
		||||
Bool g_fUseUnicode = FALSE;
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
| 
						 | 
				
			
			@ -103,14 +102,11 @@ winClipboardProc(void *pvNotUsed)
 | 
			
		|||
    char szDisplay[512];
 | 
			
		||||
    int iSelectError;
 | 
			
		||||
 | 
			
		||||
    ErrorF("winClipboardProc - Hello\n");
 | 
			
		||||
    winDebug("winClipboardProc - Hello\n");
 | 
			
		||||
    ++clipboardRestarts;
 | 
			
		||||
 | 
			
		||||
    /* Do we have Unicode support? */
 | 
			
		||||
    g_fUnicodeSupport = winClipboardDetectUnicodeSupport();
 | 
			
		||||
 | 
			
		||||
    /* Do we use Unicode clipboard? */
 | 
			
		||||
    fUseUnicode = g_fUnicodeClipboard && g_fUnicodeSupport;
 | 
			
		||||
    fUseUnicode = g_fUnicodeClipboard;
 | 
			
		||||
 | 
			
		||||
    /* Save the Unicode support flag in a global */
 | 
			
		||||
    g_fUseUnicode = fUseUnicode;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,65 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 *Copyright (C) 2003-2004 Harold L Hunt II All Rights Reserved.
 | 
			
		||||
 *
 | 
			
		||||
 *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
 | 
			
		||||
 *NONINFRINGEMENT. IN NO EVENT SHALL HAROLD L HUNT II BE LIABLE FOR
 | 
			
		||||
 *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.
 | 
			
		||||
 *
 | 
			
		||||
 *Except as contained in this notice, the name of Harold L Hunt II
 | 
			
		||||
 *shall not be used in advertising or otherwise to promote the sale, use
 | 
			
		||||
 *or other dealings in this Software without prior written authorization
 | 
			
		||||
 *from Harold L Hunt II.
 | 
			
		||||
 *
 | 
			
		||||
 * Authors:	Harold L Hunt II
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_XWIN_CONFIG_H
 | 
			
		||||
#include <xwin-config.h>
 | 
			
		||||
#endif
 | 
			
		||||
#include "winclipboard.h"
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Determine whether we suport Unicode or not.
 | 
			
		||||
 * NOTE: Currently, just check if we are on an NT-based platform or not.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
Bool
 | 
			
		||||
winClipboardDetectUnicodeSupport(void)
 | 
			
		||||
{
 | 
			
		||||
    Bool fReturn = FALSE;
 | 
			
		||||
    OSVERSIONINFO osvi = { 0 };
 | 
			
		||||
 | 
			
		||||
    /* Get operating system version information */
 | 
			
		||||
    osvi.dwOSVersionInfoSize = sizeof(osvi);
 | 
			
		||||
    GetVersionEx(&osvi);
 | 
			
		||||
 | 
			
		||||
    /* Branch on platform ID */
 | 
			
		||||
    switch (osvi.dwPlatformId) {
 | 
			
		||||
    case VER_PLATFORM_WIN32_NT:
 | 
			
		||||
        /* Unicode supported on NT only */
 | 
			
		||||
        fReturn = TRUE;
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
    case VER_PLATFORM_WIN32_WINDOWS:
 | 
			
		||||
        /* Unicode is not supported on non-NT */
 | 
			
		||||
        fReturn = FALSE;
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return fReturn;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -49,7 +49,6 @@
 | 
			
		|||
 */
 | 
			
		||||
 | 
			
		||||
extern Bool g_fUseUnicode;
 | 
			
		||||
extern Bool g_fUnicodeSupport;
 | 
			
		||||
extern void *g_pClipboardDisplay;
 | 
			
		||||
extern Window g_iClipboardWindow;
 | 
			
		||||
extern Atom g_atomLastOwnedSelection;
 | 
			
		||||
| 
						 | 
				
			
			@ -60,6 +59,7 @@ extern Atom g_atomLastOwnedSelection;
 | 
			
		|||
 | 
			
		||||
static int
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
winProcessXEventsTimeout(HWND hwnd, int iWindow, Display * pDisplay,
 | 
			
		||||
                         Bool fUseUnicode, int iTimeoutSec);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -415,7 +415,7 @@ winClipboardWindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
 | 
			
		|||
        if (message == WM_RENDERALLFORMATS)
 | 
			
		||||
            fConvertToUnicode = FALSE;
 | 
			
		||||
        else
 | 
			
		||||
            fConvertToUnicode = g_fUnicodeSupport && (CF_UNICODETEXT == wParam);
 | 
			
		||||
            fConvertToUnicode = (CF_UNICODETEXT == wParam);
 | 
			
		||||
 | 
			
		||||
        /* Request the selection contents */
 | 
			
		||||
        iReturn = XConvertSelection(pDisplay,
 | 
			
		||||
| 
						 | 
				
			
			@ -470,7 +470,6 @@ winClipboardWindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
 | 
			
		|||
         */
 | 
			
		||||
        if (WIN_XEVENTS_NOTIFY != iReturn) {
 | 
			
		||||
            /* Paste no data, to satisfy required call to SetClipboardData */
 | 
			
		||||
            if (g_fUnicodeSupport)
 | 
			
		||||
            SetClipboardData(CF_UNICODETEXT, NULL);
 | 
			
		||||
            SetClipboardData(CF_TEXT, NULL);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -60,7 +60,6 @@ DISPATCH_PROC(winProcSetSelectionOwner);
 | 
			
		|||
 * References to external symbols
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
extern Bool g_fUnicodeSupport;
 | 
			
		||||
extern int g_iNumScreens;
 | 
			
		||||
extern unsigned int g_uiAuthDataLen;
 | 
			
		||||
extern char *g_pAuthData;
 | 
			
		||||
| 
						 | 
				
			
			@ -90,7 +89,7 @@ winProcEstablishConnection(ClientPtr client)
 | 
			
		|||
    static unsigned long s_ulServerGeneration = 0;
 | 
			
		||||
 | 
			
		||||
    if (s_iCallCount == 0)
 | 
			
		||||
        ErrorF("winProcEstablishConnection - Hello\n");
 | 
			
		||||
        winDebug("winProcEstablishConnection - Hello\n");
 | 
			
		||||
 | 
			
		||||
    /* Do nothing if clipboard is not enabled */
 | 
			
		||||
    if (!g_fClipboard) {
 | 
			
		||||
| 
						 | 
				
			
			@ -362,11 +361,8 @@ winProcSetSelectionOwner(ClientPtr client)
 | 
			
		|||
        goto winProcSetSelectionOwner_Done;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Advertise Unicode if we support it */
 | 
			
		||||
    if (g_fUnicodeSupport)
 | 
			
		||||
    /* Advertise regular text and unicode */
 | 
			
		||||
    SetClipboardData(CF_UNICODETEXT, NULL);
 | 
			
		||||
 | 
			
		||||
    /* Always advertise regular text */
 | 
			
		||||
    SetClipboardData(CF_TEXT, NULL);
 | 
			
		||||
 | 
			
		||||
    /* Save handle to last owned selection */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,12 +36,6 @@
 | 
			
		|||
#include "winclipboard.h"
 | 
			
		||||
#include "misc.h"
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * References to external symbols
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
extern Bool g_fUnicodeSupport;
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Process any pending X events
 | 
			
		||||
 */
 | 
			
		||||
| 
						 | 
				
			
			@ -228,10 +222,6 @@ winClipboardFlushXEvents(HWND hwnd,
 | 
			
		|||
            else
 | 
			
		||||
                xiccesStyle = XStringStyle;
 | 
			
		||||
 | 
			
		||||
            /*
 | 
			
		||||
             * FIXME: Can't pass CF_UNICODETEXT on Windows 95/98/Me
 | 
			
		||||
             */
 | 
			
		||||
 | 
			
		||||
            /* Get a pointer to the clipboard text, in desired format */
 | 
			
		||||
            if (fUseUnicode) {
 | 
			
		||||
                /* Retrieve clipboard data */
 | 
			
		||||
| 
						 | 
				
			
			@ -687,10 +677,10 @@ winClipboardFlushXEvents(HWND hwnd,
 | 
			
		|||
            free(pwszUnicodeStr);
 | 
			
		||||
            if (hGlobal && pszGlobalData)
 | 
			
		||||
                GlobalUnlock(hGlobal);
 | 
			
		||||
            if (fSetClipboardData && g_fUnicodeSupport)
 | 
			
		||||
            if (fSetClipboardData) {
 | 
			
		||||
                SetClipboardData(CF_UNICODETEXT, NULL);
 | 
			
		||||
            if (fSetClipboardData)
 | 
			
		||||
                SetClipboardData(CF_TEXT, NULL);
 | 
			
		||||
            }
 | 
			
		||||
            return WIN_XEVENTS_NOTIFY;
 | 
			
		||||
 | 
			
		||||
        case SelectionClear:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -34,10 +34,6 @@
 | 
			
		|||
#include "win.h"
 | 
			
		||||
#include "shellapi.h"
 | 
			
		||||
 | 
			
		||||
#ifndef ABS_AUTOHIDE
 | 
			
		||||
#define ABS_AUTOHIDE 1
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Local function prototypes
 | 
			
		||||
 */
 | 
			
		||||
| 
						 | 
				
			
			@ -46,7 +42,7 @@ static Bool
 | 
			
		|||
 winGetWorkArea(RECT * prcWorkArea, winScreenInfo * pScreenInfo);
 | 
			
		||||
 | 
			
		||||
static Bool
 | 
			
		||||
 winAdjustForAutoHide(RECT * prcWorkArea);
 | 
			
		||||
 winAdjustForAutoHide(RECT * prcWorkArea, winScreenInfo * pScreenInfo);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Create a full screen window
 | 
			
		||||
| 
						 | 
				
			
			@ -218,7 +214,7 @@ winCreateBoundingWindowWindowed(ScreenPtr pScreen)
 | 
			
		|||
    winGetWorkArea(&rcWorkArea, pScreenInfo);
 | 
			
		||||
 | 
			
		||||
    /* Adjust for auto-hide taskbars */
 | 
			
		||||
    winAdjustForAutoHide(&rcWorkArea);
 | 
			
		||||
    winAdjustForAutoHide(&rcWorkArea, pScreenInfo);
 | 
			
		||||
 | 
			
		||||
    /* Did the user specify a position? */
 | 
			
		||||
    if (pScreenInfo->fUserGavePosition) {
 | 
			
		||||
| 
						 | 
				
			
			@ -501,14 +497,32 @@ winGetWorkArea(RECT * prcWorkArea, winScreenInfo * pScreenInfo)
 | 
			
		|||
    int iLeft, iTop;
 | 
			
		||||
    int iPrimaryNonWorkAreaWidth, iPrimaryNonWorkAreaHeight;
 | 
			
		||||
 | 
			
		||||
    /* Use GetMonitorInfo to get work area for monitor */
 | 
			
		||||
    if (!pScreenInfo->fMultipleMonitors) {
 | 
			
		||||
        MONITORINFO mi;
 | 
			
		||||
 | 
			
		||||
        mi.cbSize = sizeof(MONITORINFO);
 | 
			
		||||
        if (GetMonitorInfo(pScreenInfo->hMonitor, &mi)) {
 | 
			
		||||
            *prcWorkArea = mi.rcWork;
 | 
			
		||||
 | 
			
		||||
            winDebug("winGetWorkArea - Monitor %d WorkArea: %d %d %d %d\n",
 | 
			
		||||
                     pScreenInfo->iMonitor,
 | 
			
		||||
                     (int) prcWorkArea->top, (int) prcWorkArea->left,
 | 
			
		||||
                     (int) prcWorkArea->bottom, (int) prcWorkArea->right);
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            ErrorF("winGetWorkArea - GetMonitorInfo() failed for monitor %d\n",
 | 
			
		||||
                   pScreenInfo->iMonitor);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /* Bail out here if we aren't using multiple monitors */
 | 
			
		||||
        return TRUE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* SPI_GETWORKAREA only gets the work area of the primary screen. */
 | 
			
		||||
    SystemParametersInfo(SPI_GETWORKAREA, 0, prcWorkArea, 0);
 | 
			
		||||
 | 
			
		||||
    /* Bail out here if we aren't using multiple monitors */
 | 
			
		||||
    if (!pScreenInfo->fMultipleMonitors)
 | 
			
		||||
        return TRUE;
 | 
			
		||||
 | 
			
		||||
    winDebug("winGetWorkArea - Original WorkArea: %d %d %d %d\n",
 | 
			
		||||
    winDebug("winGetWorkArea - Primary Monitor WorkArea: %d %d %d %d\n",
 | 
			
		||||
             (int) prcWorkArea->top, (int) prcWorkArea->left,
 | 
			
		||||
             (int) prcWorkArea->bottom, (int) prcWorkArea->right);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -556,16 +570,39 @@ winGetWorkArea(RECT * prcWorkArea, winScreenInfo * pScreenInfo)
 | 
			
		|||
    return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Bool
 | 
			
		||||
winTaskbarOnScreenEdge(unsigned int uEdge, winScreenInfo * pScreenInfo)
 | 
			
		||||
{
 | 
			
		||||
    APPBARDATA abd;
 | 
			
		||||
    HWND hwndAutoHide;
 | 
			
		||||
 | 
			
		||||
    ZeroMemory(&abd, sizeof(abd));
 | 
			
		||||
    abd.cbSize = sizeof(abd);
 | 
			
		||||
    abd.uEdge = uEdge;
 | 
			
		||||
 | 
			
		||||
    hwndAutoHide = (HWND) SHAppBarMessage(ABM_GETAUTOHIDEBAR, &abd);
 | 
			
		||||
    if (hwndAutoHide != NULL) {
 | 
			
		||||
        /*
 | 
			
		||||
           Found an autohide taskbar on that edge, but is it on the
 | 
			
		||||
           same monitor as the screen window?
 | 
			
		||||
         */
 | 
			
		||||
        if (pScreenInfo->fMultipleMonitors ||
 | 
			
		||||
            (MonitorFromWindow(hwndAutoHide, MONITOR_DEFAULTTONULL) ==
 | 
			
		||||
             pScreenInfo->hMonitor))
 | 
			
		||||
            return TRUE;
 | 
			
		||||
    }
 | 
			
		||||
    return FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Adjust the client area so that any auto-hide toolbars
 | 
			
		||||
 * will work correctly.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
static Bool
 | 
			
		||||
winAdjustForAutoHide(RECT * prcWorkArea)
 | 
			
		||||
winAdjustForAutoHide(RECT * prcWorkArea, winScreenInfo * pScreenInfo)
 | 
			
		||||
{
 | 
			
		||||
    APPBARDATA abd;
 | 
			
		||||
    HWND hwndAutoHide;
 | 
			
		||||
 | 
			
		||||
    winDebug("winAdjustForAutoHide - Original WorkArea: %d %d %d %d\n",
 | 
			
		||||
             (int) prcWorkArea->top, (int) prcWorkArea->left,
 | 
			
		||||
| 
						 | 
				
			
			@ -577,34 +614,31 @@ winAdjustForAutoHide(RECT * prcWorkArea)
 | 
			
		|||
    if (SHAppBarMessage(ABM_GETSTATE, &abd) & ABS_AUTOHIDE)
 | 
			
		||||
        winDebug("winAdjustForAutoHide - Taskbar is auto hide\n");
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
       Despite the forgoing, we are checking for any AppBar
 | 
			
		||||
       hiding along a monitor edge, not just the Windows TaskBar.
 | 
			
		||||
     */
 | 
			
		||||
 | 
			
		||||
    /* Look for a TOP auto-hide taskbar */
 | 
			
		||||
    abd.uEdge = ABE_TOP;
 | 
			
		||||
    hwndAutoHide = (HWND) SHAppBarMessage(ABM_GETAUTOHIDEBAR, &abd);
 | 
			
		||||
    if (hwndAutoHide != NULL) {
 | 
			
		||||
    if (winTaskbarOnScreenEdge(ABE_TOP, pScreenInfo)) {
 | 
			
		||||
        winDebug("winAdjustForAutoHide - Found TOP auto-hide taskbar\n");
 | 
			
		||||
        prcWorkArea->top += 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Look for a LEFT auto-hide taskbar */
 | 
			
		||||
    abd.uEdge = ABE_LEFT;
 | 
			
		||||
    hwndAutoHide = (HWND) SHAppBarMessage(ABM_GETAUTOHIDEBAR, &abd);
 | 
			
		||||
    if (hwndAutoHide != NULL) {
 | 
			
		||||
    if (winTaskbarOnScreenEdge(ABE_LEFT, pScreenInfo)) {
 | 
			
		||||
        winDebug("winAdjustForAutoHide - Found LEFT auto-hide taskbar\n");
 | 
			
		||||
        prcWorkArea->left += 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Look for a BOTTOM auto-hide taskbar */
 | 
			
		||||
    abd.uEdge = ABE_BOTTOM;
 | 
			
		||||
    hwndAutoHide = (HWND) SHAppBarMessage(ABM_GETAUTOHIDEBAR, &abd);
 | 
			
		||||
    if (hwndAutoHide != NULL) {
 | 
			
		||||
    if (winTaskbarOnScreenEdge(ABE_BOTTOM, pScreenInfo)) {
 | 
			
		||||
        winDebug("winAdjustForAutoHide - Found BOTTOM auto-hide taskbar\n");
 | 
			
		||||
        prcWorkArea->bottom -= 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Look for a RIGHT auto-hide taskbar */
 | 
			
		||||
    abd.uEdge = ABE_RIGHT;
 | 
			
		||||
    hwndAutoHide = (HWND) SHAppBarMessage(ABM_GETAUTOHIDEBAR, &abd);
 | 
			
		||||
    if (hwndAutoHide != NULL) {
 | 
			
		||||
    if (winTaskbarOnScreenEdge(ABE_RIGHT, pScreenInfo)) {
 | 
			
		||||
        winDebug("winAdjustForAutoHide - Found RIGHT auto-hide taskbar\n");
 | 
			
		||||
        prcWorkArea->right -= 1;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -613,14 +647,5 @@ winAdjustForAutoHide(RECT * prcWorkArea)
 | 
			
		|||
             (int) prcWorkArea->top, (int) prcWorkArea->left,
 | 
			
		||||
             (int) prcWorkArea->bottom, (int) prcWorkArea->right);
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
    /* Obtain the task bar window dimensions */
 | 
			
		||||
    abd.hWnd = hwndAutoHide;
 | 
			
		||||
    hwndAutoHide = (HWND) SHAppBarMessage(ABM_GETTASKBARPOS, &abd);
 | 
			
		||||
    winDebug("hwndAutoHide %08x abd.hWnd %08x %d %d %d %d\n",
 | 
			
		||||
             hwndAutoHide, abd.hWnd,
 | 
			
		||||
             abd.rc.top, abd.rc.left, abd.rc.bottom, abd.rc.right);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    return TRUE;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -492,7 +492,7 @@ winChangeDepthDlgProc(HWND hwndDialog, UINT message,
 | 
			
		|||
        switch (LOWORD(wParam)) {
 | 
			
		||||
        case IDOK:
 | 
			
		||||
        case IDCANCEL:
 | 
			
		||||
            ErrorF("winChangeDepthDlgProc - WM_COMMAND - IDOK or IDCANCEL\n");
 | 
			
		||||
            winDebug("winChangeDepthDlgProc - WM_COMMAND - IDOK or IDCANCEL\n");
 | 
			
		||||
 | 
			
		||||
            /* 
 | 
			
		||||
             * User dismissed the dialog, hide it until the
 | 
			
		||||
| 
						 | 
				
			
			@ -504,7 +504,7 @@ winChangeDepthDlgProc(HWND hwndDialog, UINT message,
 | 
			
		|||
        break;
 | 
			
		||||
 | 
			
		||||
    case WM_CLOSE:
 | 
			
		||||
        ErrorF("winChangeDepthDlgProc - WM_CLOSE\n");
 | 
			
		||||
        winDebug("winChangeDepthDlgProc - WM_CLOSE\n");
 | 
			
		||||
 | 
			
		||||
        DestroyWindow(g_hDlgAbout);
 | 
			
		||||
        g_hDlgAbout = NULL;
 | 
			
		||||
| 
						 | 
				
			
			@ -609,7 +609,7 @@ winAboutDlgProc(HWND hwndDialog, UINT message, WPARAM wParam, LPARAM lParam)
 | 
			
		|||
        switch (LOWORD(wParam)) {
 | 
			
		||||
        case IDOK:
 | 
			
		||||
        case IDCANCEL:
 | 
			
		||||
            ErrorF("winAboutDlgProc - WM_COMMAND - IDOK or IDCANCEL\n");
 | 
			
		||||
            winDebug("winAboutDlgProc - WM_COMMAND - IDOK or IDCANCEL\n");
 | 
			
		||||
 | 
			
		||||
            DestroyWindow(g_hDlgAbout);
 | 
			
		||||
            g_hDlgAbout = NULL;
 | 
			
		||||
| 
						 | 
				
			
			@ -699,7 +699,7 @@ winAboutDlgProc(HWND hwndDialog, UINT message, WPARAM wParam, LPARAM lParam)
 | 
			
		|||
        break;
 | 
			
		||||
 | 
			
		||||
    case WM_CLOSE:
 | 
			
		||||
        ErrorF("winAboutDlgProc - WM_CLOSE\n");
 | 
			
		||||
        winDebug("winAboutDlgProc - WM_CLOSE\n");
 | 
			
		||||
 | 
			
		||||
        DestroyWindow(g_hDlgAbout);
 | 
			
		||||
        g_hDlgAbout = NULL;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -111,7 +111,7 @@ winMessageBoxF(const char *pszError, UINT uType, ...)
 | 
			
		|||
#define MESSAGEBOXF \
 | 
			
		||||
	"%s\n" \
 | 
			
		||||
	"Vendor: %s\n" \
 | 
			
		||||
	"Release: %d.%d.%d.%d (%d)\n" \
 | 
			
		||||
	"Release: %d.%d.%d.%d\n" \
 | 
			
		||||
	"Contact: %s\n" \
 | 
			
		||||
	"%s\n\n" \
 | 
			
		||||
	"XWin was started with the following command-line:\n\n" \
 | 
			
		||||
| 
						 | 
				
			
			@ -120,7 +120,7 @@ winMessageBoxF(const char *pszError, UINT uType, ...)
 | 
			
		|||
    size = asprintf(&pszMsgBox, MESSAGEBOXF,
 | 
			
		||||
                    pszErrorF, XVENDORNAME,
 | 
			
		||||
                    XORG_VERSION_MAJOR, XORG_VERSION_MINOR, XORG_VERSION_PATCH,
 | 
			
		||||
                    XORG_VERSION_SNAP, XORG_VERSION_CURRENT,
 | 
			
		||||
                    XORG_VERSION_SNAP,
 | 
			
		||||
                    BUILDERADDR, BUILDERSTRING, g_pszCommandLine);
 | 
			
		||||
 | 
			
		||||
    if (size == -1) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -133,24 +133,6 @@ winKeyboardMessageHookLL(int iCode, WPARAM wParam, LPARAM lParam)
 | 
			
		|||
Bool
 | 
			
		||||
winInstallKeyboardHookLL(void)
 | 
			
		||||
{
 | 
			
		||||
    OSVERSIONINFO osvi = { 0 };
 | 
			
		||||
 | 
			
		||||
    /* Get operating system version information */
 | 
			
		||||
    osvi.dwOSVersionInfoSize = sizeof(osvi);
 | 
			
		||||
    GetVersionEx(&osvi);
 | 
			
		||||
 | 
			
		||||
    /* Branch on platform ID */
 | 
			
		||||
    switch (osvi.dwPlatformId) {
 | 
			
		||||
    case VER_PLATFORM_WIN32_NT:
 | 
			
		||||
        /* Low-level is supported on NT 4.0 SP3+ only */
 | 
			
		||||
        /* TODO: Return FALSE on NT 4.0 with no SP, SP1, or SP2 */
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
    case VER_PLATFORM_WIN32_WINDOWS:
 | 
			
		||||
        /* Low-level hook is not supported on non-NT */
 | 
			
		||||
        return FALSE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Install the hook only once */
 | 
			
		||||
    if (!g_hhookKeyboardLL)
 | 
			
		||||
        g_hhookKeyboardLL = SetWindowsHookEx(WH_KEYBOARD_LL,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -48,6 +48,7 @@ getMonitorInfo(HMONITOR hMonitor, HDC hdc, LPRECT rect, LPARAM _data)
 | 
			
		|||
        data->monitorOffsetY = rect->top;
 | 
			
		||||
        data->monitorHeight = rect->bottom - rect->top;
 | 
			
		||||
        data->monitorWidth = rect->right - rect->left;
 | 
			
		||||
        data->monitorHandle = hMonitor;
 | 
			
		||||
        return FALSE;
 | 
			
		||||
    }
 | 
			
		||||
    return TRUE;
 | 
			
		||||
| 
						 | 
				
			
			@ -63,5 +64,7 @@ QueryMonitor(int index, struct GetMonitorInfoData *data)
 | 
			
		|||
    data->requestedMonitor = index;
 | 
			
		||||
 | 
			
		||||
    /* query information */
 | 
			
		||||
    return EnumDisplayMonitors(NULL, NULL, getMonitorInfo, (LPARAM) data);
 | 
			
		||||
    EnumDisplayMonitors(NULL, NULL, getMonitorInfo, (LPARAM) data);
 | 
			
		||||
 | 
			
		||||
    return TRUE;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,3 +1,31 @@
 | 
			
		|||
/*
 | 
			
		||||
 | 
			
		||||
Copyright 1993, 1998  The Open Group
 | 
			
		||||
Copyright (C) Colin Harrison 2005-2008
 | 
			
		||||
 | 
			
		||||
Permission to use, copy, modify, distribute, and sell this software and its
 | 
			
		||||
documentation for any purpose is hereby granted without fee, provided that
 | 
			
		||||
the above copyright notice appear in all copies and that both that
 | 
			
		||||
copyright notice and this permission notice appear in supporting
 | 
			
		||||
documentation.
 | 
			
		||||
 | 
			
		||||
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 NONINFRINGEMENT.
 | 
			
		||||
IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR 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.
 | 
			
		||||
 | 
			
		||||
Except as contained in this notice, the name of The Open Group shall
 | 
			
		||||
not be used in advertising or otherwise to promote the sale, use or
 | 
			
		||||
other dealings in this Software without prior written authorization
 | 
			
		||||
from The Open Group.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/* data returned for monitor information */
 | 
			
		||||
struct GetMonitorInfoData {
 | 
			
		||||
| 
						 | 
				
			
			@ -9,6 +37,7 @@ struct GetMonitorInfoData {
 | 
			
		|||
    int monitorOffsetY;
 | 
			
		||||
    int monitorHeight;
 | 
			
		||||
    int monitorWidth;
 | 
			
		||||
    HMONITOR monitorHandle;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
Bool QueryMonitor(int index, struct GetMonitorInfoData *data);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -380,21 +380,21 @@ InitQueue(WMMsgQueuePtr pQueue)
 | 
			
		|||
    pQueue->nQueueSize = 0;
 | 
			
		||||
 | 
			
		||||
#if CYGMULTIWINDOW_DEBUG
 | 
			
		||||
    ErrorF("InitQueue - Queue Size %d %d\n", pQueue->nQueueSize,
 | 
			
		||||
    winDebug("InitQueue - Queue Size %d %d\n", pQueue->nQueueSize,
 | 
			
		||||
             QueueSize(pQueue));
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    ErrorF("InitQueue - Calling pthread_mutex_init\n");
 | 
			
		||||
    winDebug("InitQueue - Calling pthread_mutex_init\n");
 | 
			
		||||
 | 
			
		||||
    /* Create synchronization objects */
 | 
			
		||||
    pthread_mutex_init(&pQueue->pmMutex, NULL);
 | 
			
		||||
 | 
			
		||||
    ErrorF("InitQueue - pthread_mutex_init returned\n");
 | 
			
		||||
    ErrorF("InitQueue - Calling pthread_cond_init\n");
 | 
			
		||||
    winDebug("InitQueue - pthread_mutex_init returned\n");
 | 
			
		||||
    winDebug("InitQueue - Calling pthread_cond_init\n");
 | 
			
		||||
 | 
			
		||||
    pthread_cond_init(&pQueue->pcNotEmpty, NULL);
 | 
			
		||||
 | 
			
		||||
    ErrorF("InitQueue - pthread_cond_init returned\n");
 | 
			
		||||
    winDebug("InitQueue - pthread_cond_init returned\n");
 | 
			
		||||
 | 
			
		||||
    return TRUE;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -477,23 +477,23 @@ SendXMessage(Display * pDisplay, Window iWin, Atom atmType, long nData)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Updates the name of a HWND according to its X WM_NAME property
 | 
			
		||||
 * See if we can get the stored HWND for this window...
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
UpdateName(WMInfoPtr pWMInfo, Window iWindow)
 | 
			
		||||
static HWND
 | 
			
		||||
getHwnd(WMInfoPtr pWMInfo, Window iWindow)
 | 
			
		||||
{
 | 
			
		||||
    wchar_t *pszName;
 | 
			
		||||
    Atom atmType;
 | 
			
		||||
    int fmtRet;
 | 
			
		||||
    unsigned long items, remain;
 | 
			
		||||
    HWND *retHwnd, hWnd;
 | 
			
		||||
    XWindowAttributes attr;
 | 
			
		||||
    HWND *retHwnd, hWnd = NULL;
 | 
			
		||||
 | 
			
		||||
    hWnd = 0;
 | 
			
		||||
 | 
			
		||||
    /* See if we can get the cached HWND for this window... */
 | 
			
		||||
    if (XGetWindowProperty(pWMInfo->pDisplay, iWindow, pWMInfo->atmPrivMap, 0, 1, False, XA_INTEGER,    //pWMInfo->atmPrivMap,
 | 
			
		||||
    if (XGetWindowProperty(pWMInfo->pDisplay,
 | 
			
		||||
                           iWindow,
 | 
			
		||||
                           pWMInfo->atmPrivMap,
 | 
			
		||||
                           0,
 | 
			
		||||
                           1,
 | 
			
		||||
                           False,
 | 
			
		||||
                           XA_INTEGER,
 | 
			
		||||
                           &atmType,
 | 
			
		||||
                           &fmtRet,
 | 
			
		||||
                           &items,
 | 
			
		||||
| 
						 | 
				
			
			@ -506,8 +506,26 @@ UpdateName(WMInfoPtr pWMInfo, Window iWindow)
 | 
			
		|||
 | 
			
		||||
    /* Some sanity checks */
 | 
			
		||||
    if (!hWnd)
 | 
			
		||||
        return;
 | 
			
		||||
        return NULL;
 | 
			
		||||
    if (!IsWindow(hWnd))
 | 
			
		||||
        return NULL;
 | 
			
		||||
 | 
			
		||||
    return hWnd;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Updates the name of a HWND according to its X WM_NAME property
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
UpdateName(WMInfoPtr pWMInfo, Window iWindow)
 | 
			
		||||
{
 | 
			
		||||
    wchar_t *pszName;
 | 
			
		||||
    HWND hWnd;
 | 
			
		||||
    XWindowAttributes attr;
 | 
			
		||||
 | 
			
		||||
    hWnd = getHwnd(pWMInfo, iWindow);
 | 
			
		||||
    if (!hWnd)
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    /* Set the Windows window name */
 | 
			
		||||
| 
						 | 
				
			
			@ -532,27 +550,12 @@ UpdateName(WMInfoPtr pWMInfo, Window iWindow)
 | 
			
		|||
static void
 | 
			
		||||
PreserveWin32Stack(WMInfoPtr pWMInfo, Window iWindow, UINT direction)
 | 
			
		||||
{
 | 
			
		||||
    Atom atmType;
 | 
			
		||||
    int fmtRet;
 | 
			
		||||
    unsigned long items, remain;
 | 
			
		||||
    HWND hWnd, *retHwnd;
 | 
			
		||||
    HWND hWnd;
 | 
			
		||||
    DWORD myWinProcID, winProcID;
 | 
			
		||||
    Window xWindow;
 | 
			
		||||
    WINDOWPLACEMENT wndPlace;
 | 
			
		||||
 | 
			
		||||
    hWnd = NULL;
 | 
			
		||||
    /* See if we can get the cached HWND for this window... */
 | 
			
		||||
    if (XGetWindowProperty(pWMInfo->pDisplay, iWindow, pWMInfo->atmPrivMap, 0, 1, False, XA_INTEGER,    //pWMInfo->atmPrivMap,
 | 
			
		||||
                           &atmType,
 | 
			
		||||
                           &fmtRet,
 | 
			
		||||
                           &items,
 | 
			
		||||
                           &remain, (unsigned char **) &retHwnd) == Success) {
 | 
			
		||||
        if (retHwnd) {
 | 
			
		||||
            hWnd = *retHwnd;
 | 
			
		||||
            XFree(retHwnd);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    hWnd = getHwnd(pWMInfo, iWindow);
 | 
			
		||||
    if (!hWnd)
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -802,7 +805,7 @@ winMultiWindowXMsgProc(void *pArg)
 | 
			
		|||
    int iReturn;
 | 
			
		||||
    XIconSize *xis;
 | 
			
		||||
 | 
			
		||||
    ErrorF("winMultiWindowXMsgProc - Hello\n");
 | 
			
		||||
    winDebug("winMultiWindowXMsgProc - Hello\n");
 | 
			
		||||
 | 
			
		||||
    /* Check that argument pointer is not invalid */
 | 
			
		||||
    if (pProcArg == NULL) {
 | 
			
		||||
| 
						 | 
				
			
			@ -1172,7 +1175,7 @@ winInitMultiWindowWM(WMInfoPtr pWMInfo, WMProcArgPtr pProcArg)
 | 
			
		|||
    char pszDisplay[512];
 | 
			
		||||
    int iReturn;
 | 
			
		||||
 | 
			
		||||
    ErrorF("winInitMultiWindowWM - Hello\n");
 | 
			
		||||
    winDebug("winInitMultiWindowWM - Hello\n");
 | 
			
		||||
 | 
			
		||||
    /* Check that argument pointer is not invalid */
 | 
			
		||||
    if (pProcArg == NULL) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -101,20 +101,22 @@ winInitializeScreenDefaults(void)
 | 
			
		|||
            int dpiY = GetDeviceCaps(hdc, LOGPIXELSY);
 | 
			
		||||
 | 
			
		||||
            winErrorFVerb(2,
 | 
			
		||||
                          "winInitializeDefaultScreens - native DPI x %d y %d\n",
 | 
			
		||||
                          "winInitializeScreenDefaults - native DPI x %d y %d\n",
 | 
			
		||||
                          dpiX, dpiY);
 | 
			
		||||
 | 
			
		||||
            monitorResolution = dpiY;
 | 
			
		||||
            ReleaseDC(NULL, hdc);
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            winErrorFVerb(1,
 | 
			
		||||
                          "winInitializeDefaultScreens - Failed to retrieve native DPI, falling back to default of %d DPI\n",
 | 
			
		||||
                          "winInitializeScreenDefaults - Failed to retrieve native DPI, falling back to default of %d DPI\n",
 | 
			
		||||
                          WIN_DEFAULT_DPI);
 | 
			
		||||
            monitorResolution = WIN_DEFAULT_DPI;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    defaultScreenInfo.iMonitor = 1;
 | 
			
		||||
    defaultScreenInfo.hMonitor = MonitorFromWindow(NULL, MONITOR_DEFAULTTOPRIMARY);
 | 
			
		||||
    defaultScreenInfo.dwWidth = dwWidth;
 | 
			
		||||
    defaultScreenInfo.dwHeight = dwHeight;
 | 
			
		||||
    defaultScreenInfo.dwUserWidth = dwWidth;
 | 
			
		||||
| 
						 | 
				
			
			@ -159,7 +161,7 @@ winInitializeScreenDefaults(void)
 | 
			
		|||
static void
 | 
			
		||||
winInitializeScreen(int i)
 | 
			
		||||
{
 | 
			
		||||
    winErrorFVerb(2, "winInitializeScreen - %d\n", i);
 | 
			
		||||
    winErrorFVerb(3, "winInitializeScreen - %d\n", i);
 | 
			
		||||
 | 
			
		||||
    /* Initialize default screen values, if needed */
 | 
			
		||||
    winInitializeScreenDefaults();
 | 
			
		||||
| 
						 | 
				
			
			@ -176,7 +178,7 @@ winInitializeScreens(int maxscreens)
 | 
			
		|||
{
 | 
			
		||||
    int i;
 | 
			
		||||
 | 
			
		||||
    winErrorFVerb(2, "winInitializeScreens - %i\n", maxscreens);
 | 
			
		||||
    winErrorFVerb(3, "winInitializeScreens - %i\n", maxscreens);
 | 
			
		||||
 | 
			
		||||
    if (maxscreens > g_iNumScreens) {
 | 
			
		||||
        /* Reallocate the memory for DDX-specific screen info */
 | 
			
		||||
| 
						 | 
				
			
			@ -333,6 +335,7 @@ ddxProcessArgument(int argc, char *argv[], int i)
 | 
			
		|||
                g_ScreenInfo[nScreenNum].fUserGaveHeightAndWidth = FALSE;
 | 
			
		||||
                g_ScreenInfo[nScreenNum].fUserGavePosition = TRUE;
 | 
			
		||||
                g_ScreenInfo[nScreenNum].iMonitor = iMonitor;
 | 
			
		||||
                g_ScreenInfo[nScreenNum].hMonitor = data.monitorHandle;
 | 
			
		||||
                g_ScreenInfo[nScreenNum].dwWidth = data.monitorWidth;
 | 
			
		||||
                g_ScreenInfo[nScreenNum].dwHeight = data.monitorHeight;
 | 
			
		||||
                g_ScreenInfo[nScreenNum].dwUserWidth = data.monitorWidth;
 | 
			
		||||
| 
						 | 
				
			
			@ -383,6 +386,7 @@ ddxProcessArgument(int argc, char *argv[], int i)
 | 
			
		|||
                    }
 | 
			
		||||
                    else if (data.bMonitorSpecifiedExists == TRUE) {
 | 
			
		||||
                        g_ScreenInfo[nScreenNum].iMonitor = iMonitor;
 | 
			
		||||
                        g_ScreenInfo[nScreenNum].hMonitor = data.monitorHandle;
 | 
			
		||||
                        g_ScreenInfo[nScreenNum].dwInitialX +=
 | 
			
		||||
                            data.monitorOffsetX;
 | 
			
		||||
                        g_ScreenInfo[nScreenNum].dwInitialY +=
 | 
			
		||||
| 
						 | 
				
			
			@ -415,6 +419,7 @@ ddxProcessArgument(int argc, char *argv[], int i)
 | 
			
		|||
                                  iMonitor);
 | 
			
		||||
                    g_ScreenInfo[nScreenNum].fUserGavePosition = TRUE;
 | 
			
		||||
                    g_ScreenInfo[nScreenNum].iMonitor = iMonitor;
 | 
			
		||||
                    g_ScreenInfo[nScreenNum].hMonitor = data.monitorHandle;
 | 
			
		||||
                    g_ScreenInfo[nScreenNum].dwInitialX = data.monitorOffsetX;
 | 
			
		||||
                    g_ScreenInfo[nScreenNum].dwInitialY = data.monitorOffsetY;
 | 
			
		||||
                }
 | 
			
		||||
| 
						 | 
				
			
			@ -1158,9 +1163,8 @@ winLogVersionInfo(void)
 | 
			
		|||
 | 
			
		||||
    ErrorF("Welcome to the XWin X Server\n");
 | 
			
		||||
    ErrorF("Vendor: %s\n", XVENDORNAME);
 | 
			
		||||
    ErrorF("Release: %d.%d.%d.%d (%d)\n", XORG_VERSION_MAJOR,
 | 
			
		||||
           XORG_VERSION_MINOR, XORG_VERSION_PATCH, XORG_VERSION_SNAP,
 | 
			
		||||
           XORG_VERSION_CURRENT);
 | 
			
		||||
    ErrorF("Release: %d.%d.%d.%d\n", XORG_VERSION_MAJOR,
 | 
			
		||||
           XORG_VERSION_MINOR, XORG_VERSION_PATCH, XORG_VERSION_SNAP);
 | 
			
		||||
    ErrorF("%s\n\n", BUILDERSTRING);
 | 
			
		||||
    ErrorF("Contact: %s\n", BUILDERADDR);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -432,7 +432,7 @@ winFinishScreenInitFB(int index, ScreenPtr pScreen, int argc, char **argv)
 | 
			
		|||
    if (pScreen->a) { \
 | 
			
		||||
        pScreenPriv->a = pScreen->a; \
 | 
			
		||||
    } else { \
 | 
			
		||||
        ErrorF("null screen fn " #a "\n"); \
 | 
			
		||||
        winDebug("winScreenInit - null screen fn " #a "\n"); \
 | 
			
		||||
        pScreenPriv->a = NULL; \
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -466,7 +466,7 @@ winFinishScreenInitFB(int index, ScreenPtr pScreen, int argc, char **argv)
 | 
			
		|||
    if (pScreen->a) { \
 | 
			
		||||
        pScreenPriv->a = pScreen->a; \
 | 
			
		||||
    } else { \
 | 
			
		||||
        ErrorF("null screen fn " #a "\n"); \
 | 
			
		||||
        winDebug("null screen fn " #a "\n"); \
 | 
			
		||||
        pScreenPriv->a = NULL; \
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -428,6 +428,13 @@ winWindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
 | 
			
		|||
    }
 | 
			
		||||
        return 0;
 | 
			
		||||
 | 
			
		||||
    case WM_SYSCOMMAND:
 | 
			
		||||
        if (s_pScreenInfo->iResizeMode == resizeWithRandr &&
 | 
			
		||||
            ((wParam & 0xfff0) == SC_MAXIMIZE ||
 | 
			
		||||
             (wParam & 0xfff0) == SC_RESTORE))
 | 
			
		||||
            PostMessage(hwnd, WM_EXITSIZEMOVE, 0, 0);
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
    case WM_ENTERSIZEMOVE:
 | 
			
		||||
        ErrorF("winWindowProc - WM_ENTERSIZEMOVE\n");
 | 
			
		||||
        break;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										10
									
								
								include/os.h
								
								
								
								
							
							
						
						
									
										10
									
								
								include/os.h
								
								
								
								
							| 
						 | 
				
			
			@ -359,9 +359,13 @@ Fopen(const char *, const char *);
 | 
			
		|||
extern _X_EXPORT int
 | 
			
		||||
Fclose(pointer);
 | 
			
		||||
#else
 | 
			
		||||
#define System(a) system(a)
 | 
			
		||||
#define Popen(a,b) popen(a,b)
 | 
			
		||||
#define Pclose(a) pclose(a)
 | 
			
		||||
 | 
			
		||||
extern const char *
 | 
			
		||||
Win32TempDir(void);
 | 
			
		||||
 | 
			
		||||
extern int
 | 
			
		||||
System(const char *cmdline);
 | 
			
		||||
 | 
			
		||||
#define Fopen(a,b) fopen(a,b)
 | 
			
		||||
#define Fclose(a) fclose(a)
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										73
									
								
								os/utils.c
								
								
								
								
							
							
						
						
									
										73
									
								
								os/utils.c
								
								
								
								
							| 
						 | 
				
			
			@ -1561,6 +1561,79 @@ Fclose(pointer iop)
 | 
			
		|||
 | 
			
		||||
#endif                          /* !WIN32 */
 | 
			
		||||
 | 
			
		||||
#ifdef WIN32
 | 
			
		||||
 | 
			
		||||
#include <X11/Xwindows.h>
 | 
			
		||||
 | 
			
		||||
const char *
 | 
			
		||||
Win32TempDir()
 | 
			
		||||
{
 | 
			
		||||
    static char buffer[PATH_MAX];
 | 
			
		||||
 | 
			
		||||
    if (GetTempPath(sizeof(buffer), buffer)) {
 | 
			
		||||
        int len;
 | 
			
		||||
 | 
			
		||||
        buffer[sizeof(buffer) - 1] = 0;
 | 
			
		||||
        len = strlen(buffer);
 | 
			
		||||
        if (len > 0)
 | 
			
		||||
            if (buffer[len - 1] == '\\')
 | 
			
		||||
                buffer[len - 1] = 0;
 | 
			
		||||
        return buffer;
 | 
			
		||||
    }
 | 
			
		||||
    if (getenv("TEMP") != NULL)
 | 
			
		||||
        return getenv("TEMP");
 | 
			
		||||
    else if (getenv("TMP") != NULL)
 | 
			
		||||
        return getenv("TEMP");
 | 
			
		||||
    else
 | 
			
		||||
        return "/tmp";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
System(const char *cmdline)
 | 
			
		||||
{
 | 
			
		||||
    STARTUPINFO si;
 | 
			
		||||
    PROCESS_INFORMATION pi;
 | 
			
		||||
    DWORD dwExitCode;
 | 
			
		||||
    char *cmd = strdup(cmdline);
 | 
			
		||||
 | 
			
		||||
    ZeroMemory(&si, sizeof(si));
 | 
			
		||||
    si.cb = sizeof(si);
 | 
			
		||||
    ZeroMemory(&pi, sizeof(pi));
 | 
			
		||||
 | 
			
		||||
    if (!CreateProcess(NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) {
 | 
			
		||||
        LPVOID buffer;
 | 
			
		||||
 | 
			
		||||
        if (!FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
 | 
			
		||||
                           FORMAT_MESSAGE_FROM_SYSTEM |
 | 
			
		||||
                           FORMAT_MESSAGE_IGNORE_INSERTS,
 | 
			
		||||
                           NULL,
 | 
			
		||||
                           GetLastError(),
 | 
			
		||||
                           MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
 | 
			
		||||
                           (LPTSTR) & buffer, 0, NULL)) {
 | 
			
		||||
            ErrorF("[xkb] Starting '%s' failed!\n", cmdline);
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            ErrorF("[xkb] Starting '%s' failed: %s", cmdline, (char *) buffer);
 | 
			
		||||
            LocalFree(buffer);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        free(cmd);
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
    /* Wait until child process exits. */
 | 
			
		||||
    WaitForSingleObject(pi.hProcess, INFINITE);
 | 
			
		||||
 | 
			
		||||
    GetExitCodeProcess(pi.hProcess, &dwExitCode);
 | 
			
		||||
 | 
			
		||||
    /* Close process and thread handles. */
 | 
			
		||||
    CloseHandle(pi.hProcess);
 | 
			
		||||
    CloseHandle(pi.hThread);
 | 
			
		||||
    free(cmd);
 | 
			
		||||
 | 
			
		||||
    return dwExitCode;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * CheckUserParameters: check for long command line arguments and long
 | 
			
		||||
 * environment variables.  By default, these checks are only done when
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -44,12 +44,6 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
 | 
			
		|||
 | 
			
		||||
#ifdef WIN32
 | 
			
		||||
/* from ddxLoad.c */
 | 
			
		||||
extern const char *Win32TempDir(void);
 | 
			
		||||
extern int Win32System(const char *cmdline);
 | 
			
		||||
 | 
			
		||||
#undef System
 | 
			
		||||
#define System Win32System
 | 
			
		||||
 | 
			
		||||
#define W32_tmparg " '%s'"
 | 
			
		||||
#define W32_tmpfile ,tmpname
 | 
			
		||||
#define W32_tmplen strlen(tmpname)+3
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -68,81 +68,6 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
 | 
			
		|||
#define PATHSEPARATOR "/"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef WIN32
 | 
			
		||||
 | 
			
		||||
#include <X11/Xwindows.h>
 | 
			
		||||
const char *
 | 
			
		||||
Win32TempDir()
 | 
			
		||||
{
 | 
			
		||||
    static char buffer[PATH_MAX];
 | 
			
		||||
 | 
			
		||||
    if (GetTempPath(sizeof(buffer), buffer)) {
 | 
			
		||||
        int len;
 | 
			
		||||
 | 
			
		||||
        buffer[sizeof(buffer) - 1] = 0;
 | 
			
		||||
        len = strlen(buffer);
 | 
			
		||||
        if (len > 0)
 | 
			
		||||
            if (buffer[len - 1] == '\\')
 | 
			
		||||
                buffer[len - 1] = 0;
 | 
			
		||||
        return buffer;
 | 
			
		||||
    }
 | 
			
		||||
    if (getenv("TEMP") != NULL)
 | 
			
		||||
        return getenv("TEMP");
 | 
			
		||||
    else if (getenv("TMP") != NULL)
 | 
			
		||||
        return getenv("TEMP");
 | 
			
		||||
    else
 | 
			
		||||
        return "/tmp";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
Win32System(const char *cmdline)
 | 
			
		||||
{
 | 
			
		||||
    STARTUPINFO si;
 | 
			
		||||
    PROCESS_INFORMATION pi;
 | 
			
		||||
    DWORD dwExitCode;
 | 
			
		||||
    char *cmd = strdup(cmdline);
 | 
			
		||||
 | 
			
		||||
    ZeroMemory(&si, sizeof(si));
 | 
			
		||||
    si.cb = sizeof(si);
 | 
			
		||||
    ZeroMemory(&pi, sizeof(pi));
 | 
			
		||||
 | 
			
		||||
    if (!CreateProcess(NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) {
 | 
			
		||||
        LPVOID buffer;
 | 
			
		||||
 | 
			
		||||
        if (!FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
 | 
			
		||||
                           FORMAT_MESSAGE_FROM_SYSTEM |
 | 
			
		||||
                           FORMAT_MESSAGE_IGNORE_INSERTS,
 | 
			
		||||
                           NULL,
 | 
			
		||||
                           GetLastError(),
 | 
			
		||||
                           MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
 | 
			
		||||
                           (LPTSTR) & buffer, 0, NULL)) {
 | 
			
		||||
            ErrorF("[xkb] Starting '%s' failed!\n", cmdline);
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            ErrorF("[xkb] Starting '%s' failed: %s", cmdline, (char *) buffer);
 | 
			
		||||
            LocalFree(buffer);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        free(cmd);
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
    /* Wait until child process exits. */
 | 
			
		||||
    WaitForSingleObject(pi.hProcess, INFINITE);
 | 
			
		||||
 | 
			
		||||
    GetExitCodeProcess(pi.hProcess, &dwExitCode);
 | 
			
		||||
 | 
			
		||||
    /* Close process and thread handles. */
 | 
			
		||||
    CloseHandle(pi.hProcess);
 | 
			
		||||
    CloseHandle(pi.hThread);
 | 
			
		||||
    free(cmd);
 | 
			
		||||
 | 
			
		||||
    return dwExitCode;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#undef System
 | 
			
		||||
#define System(x) Win32System(x)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
OutputDirectory(char *outdir, size_t size)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue