Tue Jul 13 20:31:31 1993 Bob Amstadt (bob at pooh) * [global.c] Completed global memory pool API Sun Jul 11 16:59:52 1993 Alexandre Julliard * [message.c] [user.c] [user.spec] [windows.h] Added emulation of Windows message queue. Thu Jul 8 19:29:27 1993 Bob Amstadt (bob at pooh) * [build.c] Original by Bob Amstadt * [callback.c] Original by Bob Amstadt, updates by Alexandre Julliard * [dump.c] Original by Bob Amstadt * [global.c] Original by Bob Amstadt * [heap.c] Original by Bob Amstadt * [kernel.c] Original by Bob Amstadt * [ldt.c] Original by Bob Amstadt * [ldtlib.c] Original by Bob Amstadt * [relay.c] Original by Bob Amstadt * [resource.c] Original by Bob Amstadt, updates by Alexandre Juliard * [selector.c] Original by Bob Amstadt, updates by Eric Youngdale * [user.c] Original by Bob Amstadt * [wine.c] Original by Bob Amstadt, updates by Eric Youngdale and Alexandre Julliard * [wintcl.c] Original by Regents of the University of California, updates by Peter MacDonald and Alexandre Julliard * [callback.h] Original by Bob Amstadt * [dlls.h] Original by Bob Amstadt * [heap.h] Original by Bob Amstadt * [neexe.h] Original by Bob Amstadt * [prototypes.h] Original by Bob Amstadt, updates by Eric Youngdale * [segmem.h] Original by Bob Amstadt * [tkInt.h] Original by Regents of the University of California * [windows.h] Original by Peter MacDonald, updates by Alexandre Julliard and Bob Amstadt * [wine.h] Original by Eric Youngdale * [kernel.spec] Original by Bob Amstadt, updates by Alexandre Julliard * [gdi.spec] Original by Bob Amstadt, updates by Alexandre Julliard * [shell.spec] Original by Bob Amstadt * [unixlib.spec] Original by Bob Amstadt * [user.spec] Original by Bob Amstadt, updates by Alexandre Julliard * [win87em.spec] Original by Bob Amstadt * [Windows.tcl] Original by Peter MacDonald, updates by Alexandre Julliard * [build-spec.txt] Original by Bob Amstadt * [if1632.S] Original by Bob Amstadt, updates by Eric Youngdale
287 lines
7 KiB
C
287 lines
7 KiB
C
/*
|
|
* Window related functions
|
|
*
|
|
* Copyright 1993 Alexandre Julliard
|
|
*/
|
|
|
|
static char Copyright[] = "Copyright Alexandre Julliard, 1993";
|
|
|
|
#include <X11/Intrinsic.h>
|
|
#include <X11/StringDefs.h>
|
|
#include <X11/Core.h>
|
|
#include <X11/Shell.h>
|
|
|
|
#include "class.h"
|
|
#include "win.h"
|
|
|
|
extern Widget XT_topLevelWidget;
|
|
|
|
|
|
static HWND firstWindow = 0;
|
|
|
|
|
|
/***********************************************************************
|
|
* WIN_FindWndPtr
|
|
*
|
|
* Return a pointer to the WND structure corresponding to a HWND.
|
|
* The caller must GlobalUnlock the pointer.
|
|
*/
|
|
WND * WIN_FindWndPtr( HWND hwnd )
|
|
{
|
|
WND * ptr;
|
|
|
|
if (!hwnd) return NULL;
|
|
ptr = (WND *) GlobalLock( hwnd );
|
|
if (ptr->dwMagic != WND_MAGIC)
|
|
{
|
|
GlobalUnlock( hwnd );
|
|
return NULL;
|
|
}
|
|
return ptr;
|
|
}
|
|
|
|
|
|
/***********************************************************************
|
|
* CreateWindow (USER.41)
|
|
*/
|
|
HWND CreateWindow( LPSTR className, LPSTR windowName,
|
|
DWORD style, int x, int y, int width, int height,
|
|
HWND parent, HMENU menu, HANDLE instance, LPSTR data )
|
|
{
|
|
HANDLE class, hwnd;
|
|
CLASS *classPtr;
|
|
WND *wndPtr, *parentPtr = NULL;
|
|
CREATESTRUCT createStruct;
|
|
Widget parentWidget = 0;
|
|
|
|
printf( "CreateWindow: %s\n", windowName );
|
|
|
|
if (x == CW_USEDEFAULT) x = 0;
|
|
if (y == CW_USEDEFAULT) y = 0;
|
|
if (width == CW_USEDEFAULT) width = 600;
|
|
if (height == CW_USEDEFAULT) height = 400;
|
|
|
|
/* Find the parent and class */
|
|
|
|
if (parent)
|
|
{
|
|
/* Check if parent is valid */
|
|
parentPtr = WIN_FindWndPtr( parent );
|
|
if (!parentPtr) return 0;
|
|
}
|
|
else if (style & WS_CHILD) return 0; /* WS_CHILD needs a parent */
|
|
|
|
if (!(class = CLASS_FindClassByName( className, &classPtr )))
|
|
{
|
|
GlobalUnlock( parent );
|
|
return 0;
|
|
}
|
|
|
|
/* Create the window structure */
|
|
|
|
hwnd = GlobalAlloc( GMEM_MOVEABLE, sizeof(WND)+classPtr->wc.cbWndExtra );
|
|
if (!hwnd)
|
|
{
|
|
GlobalUnlock( parent );
|
|
GlobalUnlock( class );
|
|
return 0;
|
|
}
|
|
|
|
/* Fill the structure */
|
|
|
|
wndPtr = (WND *) GlobalLock( hwnd );
|
|
wndPtr->hwndNext = 0;
|
|
wndPtr->hwndChild = 0;
|
|
wndPtr->dwMagic = WND_MAGIC;
|
|
wndPtr->hwndParent = parent;
|
|
wndPtr->hwndOwner = parent; /* What else? */
|
|
wndPtr->hClass = class;
|
|
wndPtr->hInstance = instance;
|
|
wndPtr->rectClient.left = x;
|
|
wndPtr->rectClient.top = y;
|
|
wndPtr->rectClient.right = x + width;
|
|
wndPtr->rectClient.bottom = y + height;
|
|
wndPtr->rectWindow = wndPtr->rectClient;
|
|
wndPtr->hrgnUpdate = 0;
|
|
wndPtr->hwndLastActive = 0;
|
|
wndPtr->lpfnWndProc = classPtr->wc.lpfnWndProc;
|
|
wndPtr->dwStyle = style;
|
|
wndPtr->hDCE = 0;
|
|
wndPtr->hmenuSystem = 0;
|
|
wndPtr->wIDmenu = menu;
|
|
if (classPtr->wc.cbWndExtra)
|
|
memset( wndPtr->wExtra, 0, classPtr->wc.cbWndExtra );
|
|
classPtr->cWindows++;
|
|
|
|
/* Insert the window in the linked list */
|
|
|
|
if (parent)
|
|
{
|
|
wndPtr->hwndNext = parentPtr->hwndChild;
|
|
parentPtr->hwndChild = hwnd;
|
|
}
|
|
else /* Top-level window */
|
|
{
|
|
wndPtr->hwndNext = firstWindow;
|
|
firstWindow = hwnd;
|
|
}
|
|
|
|
/* Fill the CREATESTRUCT */
|
|
|
|
createStruct.lpCreateParams = data;
|
|
createStruct.hInstance = instance;
|
|
createStruct.hMenu = menu;
|
|
createStruct.hwndParent = parent;
|
|
createStruct.cx = width;
|
|
createStruct.cy = height;
|
|
createStruct.x = x;
|
|
createStruct.y = y;
|
|
createStruct.style = style;
|
|
createStruct.lpszName = windowName;
|
|
createStruct.lpszClass = className;
|
|
createStruct.dwExStyle = 0;
|
|
|
|
/* Create the widgets */
|
|
|
|
if (style & WS_CHILD)
|
|
{
|
|
wndPtr->shellWidget = 0;
|
|
wndPtr->winWidget = XtVaCreateManagedWidget(className,
|
|
coreWidgetClass,
|
|
parentPtr->winWidget,
|
|
XtNx, x,
|
|
XtNy, y,
|
|
XtNwidth, width,
|
|
XtNheight, height,
|
|
NULL );
|
|
}
|
|
else
|
|
{
|
|
wndPtr->shellWidget = XtVaAppCreateShell(className,
|
|
windowName,
|
|
topLevelShellWidgetClass,
|
|
XtDisplay(XT_topLevelWidget),
|
|
XtNx, x,
|
|
XtNy, y,
|
|
NULL );
|
|
wndPtr->winWidget = XtVaCreateManagedWidget(className,
|
|
compositeWidgetClass,
|
|
wndPtr->shellWidget,
|
|
XtNwidth, width,
|
|
XtNheight, height,
|
|
NULL );
|
|
}
|
|
|
|
/* Send the WM_CREATE message */
|
|
|
|
if (CallWindowProc( wndPtr->lpfnWndProc, hwnd,
|
|
WM_CREATE, 0, (LONG) &createStruct ) == -1)
|
|
{
|
|
/* Abort window creation */
|
|
if (wndPtr->shellWidget) XtDestroyWidget( wndPtr->shellWidget );
|
|
else XtDestroyWidget( wndPtr->winWidget );
|
|
GlobalUnlock( parent );
|
|
GlobalUnlock( class );
|
|
GlobalUnlock( hwnd );
|
|
GlobalFree( hwnd );
|
|
return 0;
|
|
}
|
|
|
|
EVENT_AddHandlers( wndPtr->winWidget, hwnd );
|
|
|
|
GlobalUnlock( parent );
|
|
GlobalUnlock( class );
|
|
GlobalUnlock( hwnd );
|
|
return hwnd;
|
|
}
|
|
|
|
/***********************************************************************
|
|
* DestroyWindow (USER.53)
|
|
*/
|
|
BOOL DestroyWindow( HWND hwnd )
|
|
{
|
|
WND *wndPtr, *parentPtr;
|
|
CLASS * classPtr;
|
|
|
|
wndPtr = WIN_FindWndPtr( hwnd );
|
|
if (!wndPtr) return FALSE;
|
|
|
|
if (wndPtr->hwndParent)
|
|
{
|
|
parentPtr = WIN_FindWndPtr( wndPtr->hwndParent );
|
|
printf( "INTERNAL ERROR: DestroyWindow: Invalid window parent\n" );
|
|
return FALSE;
|
|
}
|
|
|
|
classPtr = CLASS_FindClassPtr( wndPtr->hClass );
|
|
if (!classPtr)
|
|
{
|
|
printf( "INTERNAL ERROR: DestroyWindow: Invalid window class\n" );
|
|
return FALSE;
|
|
}
|
|
|
|
SendMessage( hwnd, WM_DESTROY, 0, 0 );
|
|
|
|
/* Destroy all children */
|
|
|
|
/* ........... */
|
|
|
|
/* Remove the window from the linked list */
|
|
|
|
/* ........... */
|
|
|
|
/* Destroy the window */
|
|
|
|
if (wndPtr->shellWidget) XtDestroyWidget( wndPtr->shellWidget );
|
|
else XtDestroyWidget( wndPtr->winWidget );
|
|
classPtr->cWindows--;
|
|
GlobalUnlock( wndPtr->hClass );
|
|
if (wndPtr->hwndParent) GlobalUnlock( wndPtr->hwndParent );
|
|
GlobalUnlock( hwnd );
|
|
GlobalFree( hwnd );
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/***********************************************************************
|
|
* GetClientRect (USER.33)
|
|
*/
|
|
void GetClientRect( HWND hwnd, LPRECT rect )
|
|
{
|
|
WND * wndPtr = WIN_FindWndPtr( hwnd );
|
|
rect->left = rect->top = rect->right = rect->bottom = 0;
|
|
if (wndPtr)
|
|
{
|
|
XtVaGetValues(wndPtr->winWidget,
|
|
XtNwidth, &rect->right,
|
|
XtNheight, &rect->bottom,
|
|
NULL );
|
|
GlobalUnlock( hwnd );
|
|
}
|
|
}
|
|
|
|
|
|
/***********************************************************************
|
|
* ShowWindow (USER.42)
|
|
*/
|
|
BOOL ShowWindow( HWND hwnd, int cmd )
|
|
{
|
|
WND * wndPtr = WIN_FindWndPtr( hwnd );
|
|
if (wndPtr)
|
|
{
|
|
if (wndPtr->shellWidget) XtRealizeWidget( wndPtr->shellWidget );
|
|
GlobalUnlock( hwnd );
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/***********************************************************************
|
|
* UpdateWindow (USER.124)
|
|
*/
|
|
void UpdateWindow( HWND hwnd )
|
|
{
|
|
SendMessage( hwnd, WM_PAINT, 0, 0 );
|
|
}
|
|
|
|
|