blob: d7fe3a2c88e43c5116407576c9171845aa349cf9 [file] [log] [blame]
/*
* 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 <X11/Xaw/Box.h>
#include "class.h"
#include "win.h"
#include "user.h"
extern Display * XT_display;
extern Screen * XT_screen;
extern Colormap COLOR_WinColormap;
static HWND firstWindow = 0;
void SCROLLBAR_CreateScrollBar(LPSTR className, LPSTR Label, HWND hwnd);
void LISTBOX_CreateListBox(LPSTR className, LPSTR Label, HWND hwnd);
void COMBOBOX_CreateComboBox(LPSTR className, LPSTR Label, HWND hwnd);
/***********************************************************************
* WIN_FindWndPtr
*
* Return a pointer to the WND structure corresponding to a HWND.
*/
WND * WIN_FindWndPtr( HWND hwnd )
{
WND * ptr;
if (!hwnd) return NULL;
ptr = (WND *) USER_HEAP_ADDR( hwnd );
if (ptr->dwMagic != WND_MAGIC) return NULL;
return ptr;
}
/***********************************************************************
* WIN_FindWinToRepaint
*
* Find a window that needs repaint.
*/
HWND WIN_FindWinToRepaint( HWND hwnd )
{
WND * wndPtr;
if (!hwnd) hwnd = firstWindow;
for ( ; hwnd != 0; hwnd = wndPtr->hwndNext )
{
if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
if (!wndPtr || !wndPtr->winWidget) continue;
if (!XtIsRealized( wndPtr->winWidget )) continue;
if (wndPtr->hrgnUpdate) return hwnd;
if (wndPtr->hwndChild)
{
HWND child;
if ((child = WIN_FindWinToRepaint( wndPtr->hwndChild )))
return child;
}
}
return 0;
}
/***********************************************************************
* WIN_SendParentNotify
*
* Send a WM_PARENTNOTIFY to all ancestors of the given window, unless
* the window has the WS_EX_NOPARENTNOTIFY style.
*/
static void WIN_SendParentNotify( HWND hwnd, WND * wndPtr, WORD event )
{
HWND current = wndPtr->hwndParent;
if (wndPtr->dwExStyle & WS_EX_NOPARENTNOTIFY) return;
while (current)
{
SendMessage( current, WM_PARENTNOTIFY,
event, MAKELONG( hwnd, wndPtr->wIDmenu ) );
current = GetParent( current );
}
}
/***********************************************************************
* CreateWindow (USER.41)
*/
HWND CreateWindow( LPSTR className, LPSTR windowName,
DWORD style, short x, short y, short width, short height,
HWND parent, HMENU menu, HANDLE instance, LPSTR data )
{
return CreateWindowEx( 0, className, windowName, style,
x, y, width, height, parent, menu, instance, data );
}
/***********************************************************************
* CreateWindowEx (USER.452)
*/
HWND CreateWindowEx( DWORD exStyle, LPSTR className, LPSTR windowName,
DWORD style, short x, short y, short width, short height,
HWND parent, HMENU menu, HANDLE instance, LPSTR data )
{
HANDLE class, hwnd;
CLASS *classPtr;
WND *wndPtr, *parentPtr = NULL;
CREATESTRUCT *createStruct;
HANDLE hcreateStruct;
int wmcreate;
#ifdef DEBUG_WIN
printf( "CreateWindowEx: %s %s %d,%d %dx%d\n", className, windowName, x, y, width, height );
#endif
if (x == CW_USEDEFAULT) x = 0;
if (y == CW_USEDEFAULT) y = 0;
if (width == CW_USEDEFAULT) width = 600;
if (height == CW_USEDEFAULT) height = 400;
if (width == 0) width = 1;
if (height == 0) height = 1;
/* Find the parent and class */
if (parent)
{
/* Check if parent is valid */
parentPtr = WIN_FindWndPtr( parent );
if (!parent) return 0;
}
else if (style & WS_CHILD) return 0; /* WS_CHILD needs a parent */
if (!(class = CLASS_FindClassByName( className, &classPtr ))) {
printf("CreateWindow BAD CLASSNAME '%s' !\n", className);
return 0;
}
/* Create the window structure */
hwnd = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(WND)+classPtr->wc.cbWndExtra);
if (!hwnd) return 0;
/* Fill the structure */
wndPtr = (WND *) USER_HEAP_ADDR( 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->dwExStyle = exStyle;
wndPtr->hmenuSystem = 0;
wndPtr->wIDmenu = menu;
wndPtr->hText = 0;
wndPtr->flags = 0;
if (classPtr->wc.cbWndExtra)
memset( wndPtr->wExtra, 0, classPtr->wc.cbWndExtra );
if (classPtr->wc.style & CS_OWNDC)
wndPtr->hdc = CreateDC( "DISPLAY", NULL, NULL, NULL);
else wndPtr->hdc = 0;
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;
}
if (!strcasecmp(className, "SCROLLBAR"))
{
SCROLLBAR_CreateScrollBar(className, windowName, hwnd);
goto WinCreated;
}
if (!strcasecmp(className, "LISTBOX"))
{
LISTBOX_CreateListBox(className, windowName, hwnd);
goto WinCreated;
}
if (!strcasecmp(className, "COMBOBOX"))
{
COMBOBOX_CreateComboBox(className, windowName, hwnd);
goto WinCreated;
}
/* Create the widgets */
if (style & WS_CHILD)
{
wndPtr->shellWidget = 0;
if (style & (WS_BORDER | WS_DLGFRAME | WS_THICKFRAME))
{
int borderCol = 0;
if (COLOR_WinColormap == DefaultColormapOfScreen(XT_screen))
borderCol = BlackPixelOfScreen(XT_screen);
wndPtr->winWidget = XtVaCreateManagedWidget(className,
compositeWidgetClass,
parentPtr->winWidget,
XtNx, x,
XtNy, y,
XtNwidth, width,
XtNheight, height,
XtNborderColor, borderCol,
NULL );
}
else
{
wndPtr->winWidget = XtVaCreateManagedWidget(className,
compositeWidgetClass,
parentPtr->winWidget,
XtNx, x,
XtNy, y,
XtNwidth, width,
XtNheight, height,
XtNborderWidth, 0,
NULL );
}
}
else
{
wndPtr->shellWidget = XtVaAppCreateShell(windowName,
className,
topLevelShellWidgetClass,
XT_display,
XtNx, x,
XtNy, y,
XtNcolormap, COLOR_WinColormap,
NULL );
wndPtr->compositeWidget = XtVaCreateManagedWidget(className,
formWidgetClass,
wndPtr->shellWidget,
NULL );
/* wndPtr->winWidget = wndPtr->compositeWidget; */
wndPtr->winWidget = wndPtr->shellWidget;
if (wndPtr->wIDmenu == 0)
{
wndPtr->menuBarPtr =
MENU_CreateMenuBar(wndPtr->compositeWidget,
instance, hwnd,
classPtr->wc.lpszMenuName,
width);
if (wndPtr->menuBarPtr)
wndPtr->wIDmenu =
GlobalHandleFromPointer(wndPtr->menuBarPtr->firstItem);
}
else
{
wndPtr->menuBarPtr = MENU_UseMenu(wndPtr->compositeWidget,
instance, hwnd,
wndPtr->wIDmenu, width);
}
if (wndPtr->menuBarPtr != NULL)
{
wndPtr->winWidget =
XtVaCreateManagedWidget(className,
compositeWidgetClass,
wndPtr->compositeWidget,
XtNwidth, width,
XtNheight, height,
XtNfromVert,
wndPtr->menuBarPtr->menuBarWidget,
XtNvertDistance, 4,
NULL );
}
else
{
wndPtr->winWidget =
XtVaCreateManagedWidget(className,
compositeWidgetClass,
wndPtr->compositeWidget,
XtNwidth, width,
XtNheight, height,
NULL );
}
}
WinCreated:
/* Send the WM_CREATE message */
hcreateStruct = GlobalAlloc( GMEM_MOVEABLE, sizeof(CREATESTRUCT) );
createStruct = (CREATESTRUCT *) GlobalLock( hcreateStruct );
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;
wmcreate = SendMessage( hwnd, WM_NCCREATE, 0, (LONG)createStruct );
if (!wmcreate) wmcreate = -1;
else wmcreate = SendMessage( hwnd, WM_CREATE, 0, (LONG)createStruct );
GlobalUnlock( hcreateStruct );
GlobalFree( hcreateStruct );
if (wmcreate == -1)
{
/* Abort window creation */
if (parent) parentPtr->hwndChild = wndPtr->hwndNext;
else firstWindow = wndPtr->hwndNext;
if (wndPtr->shellWidget) XtDestroyWidget( wndPtr->shellWidget );
else XtDestroyWidget( wndPtr->winWidget );
if (wndPtr->hdc) DeleteDC( wndPtr->hdc );
classPtr->cWindows--;
USER_HEAP_FREE( hwnd );
return 0;
}
EVENT_AddHandlers( wndPtr->winWidget, hwnd );
if (style & WS_VISIBLE) ShowWindow( hwnd, SW_SHOW );
WIN_SendParentNotify( hwnd, wndPtr, WM_CREATE );
return hwnd;
}
/***********************************************************************
* DestroyWindow (USER.53)
*/
BOOL DestroyWindow( HWND hwnd )
{
WND * wndPtr;
HWND * curWndPtr;
CLASS * classPtr;
/* Initialisation */
if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return FALSE;
if (!(classPtr = CLASS_FindClassPtr( wndPtr->hClass ))) return FALSE;
WIN_SendParentNotify( hwnd, wndPtr, WM_DESTROY );
/* Send destroy messages */
SendMessage( hwnd, WM_DESTROY, 0, 0 );
SendMessage( hwnd, WM_NCDESTROY, 0, 0 );
/* Destroy all children */
while (wndPtr->hwndChild) /* The child removes itself from the list */
DestroyWindow( wndPtr->hwndChild );
/* Remove the window from the linked list */
if (wndPtr->hwndParent)
{
WND * parentPtr = WIN_FindWndPtr( wndPtr->hwndParent );
curWndPtr = &parentPtr->hwndChild;
}
else curWndPtr = &firstWindow;
while (*curWndPtr != hwnd)
{
WND * curPtr = WIN_FindWndPtr( *curWndPtr );
curWndPtr = &curPtr->hwndNext;
}
*curWndPtr = wndPtr->hwndNext;
/* Destroy the window */
if (wndPtr->shellWidget) XtDestroyWidget( wndPtr->shellWidget );
else XtDestroyWidget( wndPtr->winWidget );
if (wndPtr->hdc) DeleteDC( wndPtr->hdc );
classPtr->cWindows--;
USER_HEAP_FREE( hwnd );
return TRUE;
}
/***********************************************************************
* GetWindowRect (USER.32)
*/
void GetWindowRect( HWND hwnd, LPRECT rect )
{
int x, y, width, height;
WND * wndPtr = WIN_FindWndPtr( hwnd );
if (wndPtr)
{
XtVaGetValues(wndPtr->winWidget,
XtNx, &x, XtNy, &y,
XtNwidth, &width,
XtNheight, &height,
NULL );
rect->left = x & 0xffff;
rect->top = y & 0xffff;
rect->right = width & 0xffff;
rect->bottom = height & 0xffff;
}
}
/***********************************************************************
* GetClientRect (USER.33)
*/
void GetClientRect( HWND hwnd, LPRECT rect )
{
int width, height;
WND * wndPtr = WIN_FindWndPtr( hwnd );
rect->left = rect->top = rect->right = rect->bottom = 0;
if (wndPtr)
{
XtVaGetValues(wndPtr->winWidget,
XtNwidth, &width,
XtNheight, &height,
NULL );
rect->right = width & 0xffff;
rect->bottom = height & 0xffff;
}
}
/***********************************************************************
* ShowWindow (USER.42)
*/
BOOL ShowWindow( HWND hwnd, int cmd )
{
int width, height;
WND * wndPtr = WIN_FindWndPtr( hwnd );
if (wndPtr)
{
if (wndPtr->shellWidget) XtRealizeWidget( wndPtr->shellWidget );
XtVaGetValues(wndPtr->winWidget,
XtNwidth, &width,
XtNheight, &height,
NULL );
switch(cmd)
{
case SW_HIDE:
XtSetMappedWhenManaged(wndPtr->winWidget, FALSE);
wndPtr->dwStyle &= (WS_VISIBLE ^ 0xFFFFFFFL);
SendMessage( hwnd, WM_SHOWWINDOW, FALSE, 0 );
break;
case SW_SHOWMINNOACTIVE:
case SW_SHOWMINIMIZED:
case SW_MINIMIZE:
wndPtr->dwStyle |= WS_ICONIC;
goto WINVisible;
case SW_SHOWNA:
case SW_SHOWNOACTIVATE:
case SW_MAXIMIZE:
case SW_SHOWMAXIMIZED:
case SW_SHOW:
case SW_NORMAL:
case SW_SHOWNORMAL:
wndPtr->dwStyle &= (WS_ICONIC ^ 0xFFFFFFFL);
WINVisible:
XtSetMappedWhenManaged(wndPtr->winWidget, TRUE);
wndPtr->dwStyle |= WS_VISIBLE;
SendMessage( hwnd, WM_SIZE, SIZE_RESTORED,
(width & 0xffff) | (height << 16) );
SendMessage( hwnd, WM_SHOWWINDOW, TRUE, 0 );
break;
default:
break;
}
}
return TRUE;
}
/***********************************************************************
* CloseWindow (USER.43)
*/
void CloseWindow(HWND hWnd)
{
WND * wndPtr = WIN_FindWndPtr(hWnd);
if (wndPtr->dwStyle & WS_CHILD) return;
ShowWindow(hWnd, SW_MINIMIZE);
PostMessage(hWnd, WM_CLOSE, 0, 0L);
}
/***********************************************************************
* OpenIcon (USER.44)
*/
BOOL OpenIcon(HWND hWnd)
{
WND * wndPtr = WIN_FindWndPtr(hWnd);
if (!IsIconic(hWnd)) return FALSE;
ShowWindow(hWnd, SW_SHOWNORMAL);
return(TRUE);
}
/***********************************************************************
* FindWindow (USER.50)
*/
HWND FindWindow(LPSTR ClassMatch, LPSTR TitleMatch)
{
return((HWND)NULL);
}
/***********************************************************************
* MoveWindow (USER.56)
*/
void MoveWindow(HWND hWnd, short x, short y, short w, short h, BOOL bRepaint)
{
WND * wndPtr = WIN_FindWndPtr( hWnd );
if (wndPtr)
{
wndPtr->rectClient.left = x;
wndPtr->rectClient.top = y;
wndPtr->rectClient.right = x + w;
wndPtr->rectClient.bottom = y + h;
XtVaSetValues(wndPtr->winWidget, XtNx, x, XtNy, y,
XtNwidth, w, XtNheight, h, NULL );
SendMessage(hWnd, WM_MOVE, 0, MAKELONG(x, y));
printf("MoveWindow(%X, %d, %d, %d, %d, %d); !\n",
hWnd, x, y, w, h, bRepaint);
if (bRepaint) {
InvalidateRect(hWnd, NULL, TRUE);
UpdateWindow(hWnd);
}
}
}
/***********************************************************************
* UpdateWindow (USER.124)
*/
void UpdateWindow( HWND hwnd )
{
if (GetUpdateRect( hwnd, NULL, FALSE ))
{
if (IsWindowVisible( hwnd )) SendMessage( hwnd, WM_PAINT, 0, 0 );
}
}
/**********************************************************************
* GetMenu (USER.157)
*/
HMENU GetMenu( HWND hwnd )
{
WND * wndPtr = WIN_FindWndPtr(hwnd);
if (wndPtr == NULL)
return 0;
return wndPtr->wIDmenu;
}
/**********************************************************************
* SetMenu (USER.158)
*/
BOOL SetMenu(HWND hwnd, HMENU hmenu)
{
WND *wndPtr;
wndPtr = WIN_FindWndPtr(hwnd);
if (wndPtr == NULL)
return FALSE;
if (wndPtr->dwStyle & WS_CHILD) return FALSE;
if (wndPtr->menuBarPtr != NULL)
{
XtVaSetValues(wndPtr->winWidget, XtNfromVert, NULL, NULL);
MENU_CollapseMenu(wndPtr->menuBarPtr);
}
wndPtr->menuBarPtr = MENU_UseMenu(wndPtr->compositeWidget,
wndPtr->hInstance, hwnd, hmenu,
wndPtr->rectClient.right -
wndPtr->rectClient.left);
if (wndPtr->menuBarPtr != NULL)
{
XtVaSetValues(wndPtr->winWidget,
XtNfromVert, wndPtr->menuBarPtr->menuBarWidget,
XtNvertDistance, 4,
NULL);
}
else
{
if (wndPtr->wIDmenu != 0)
{
wndPtr->menuBarPtr = MENU_UseMenu(wndPtr->compositeWidget,
wndPtr->hInstance, hwnd,
wndPtr->wIDmenu,
wndPtr->rectClient.right -
wndPtr->rectClient.left);
}
return FALSE;
}
return TRUE;
}
/***********************************************************************
* SetWindowPos (USER.232)
*/
void SetWindowPos(HWND hWnd, HWND hWndInsertAfter, short x, short y, short w, short h, WORD wFlag)
{
WND * wndPtr = WIN_FindWndPtr( hWnd );
if (wndPtr)
{
if ((wFlag & SWP_NOMOVE) != SWP_NOMOVE) {
wndPtr->rectClient.left = x;
wndPtr->rectClient.top = y;
XtVaSetValues(wndPtr->winWidget, XtNx, x, XtNy, y, NULL );
}
if ((wFlag & SWP_NOSIZE) != SWP_NOSIZE) {
wndPtr->rectClient.right = x + w;
wndPtr->rectClient.bottom = y + h;
XtVaSetValues(wndPtr->winWidget, XtNwidth, w, XtNheight, h, NULL );
}
if ((wFlag & SWP_NOREDRAW) != SWP_NOREDRAW) {
InvalidateRect(hWnd, NULL, TRUE);
UpdateWindow(hWnd);
}
if ((wFlag & SWP_HIDEWINDOW) == SWP_HIDEWINDOW)
ShowWindow(hWnd, SW_HIDE);
if ((wFlag & SWP_SHOWWINDOW) == SWP_SHOWWINDOW)
ShowWindow(hWnd, SW_SHOW);
/*
if ((wFlag & SWP_NOACTIVATE) != SWP_NOACTIVATE)
SetActiveWindow(hWnd);
if ((wFlag & SWP_NOZORDER) != SWP_NOZORDER)
{ }
*/
printf("SetWindowPos(%X, %X, %d, %d, %d, %d, %X); !\n",
hWnd, hWndInsertAfter, x, y, w, h, wFlag);
}
}
/**********************************************************************
* GetDesktopWindow (USER.286)
*/
HWND GetDesktopWindow()
{
return 0;
}
/**********************************************************************
* GetWindowWord (USER.133)
*/
WORD GetWindowWord( HWND hwnd, short offset )
{
WND * wndPtr = WIN_FindWndPtr( hwnd );
if (!wndPtr) return 0;
if (offset >= 0) return *(WORD *)(((char *)wndPtr->wExtra) + offset);
switch(offset)
{
case GWW_ID: return wndPtr->wIDmenu;
case GWW_HWNDPARENT: return wndPtr->hwndParent;
case GWW_HINSTANCE: return wndPtr->hInstance;
}
return 0;
}
/**********************************************************************
* SetWindowWord (USER.134)
*/
WORD SetWindowWord( HWND hwnd, short offset, WORD newval )
{
WORD *ptr, retval;
WND * wndPtr = WIN_FindWndPtr( hwnd );
if (!wndPtr) return 0;
if (offset >= 0) ptr = (WORD *)(((char *)wndPtr->wExtra) + offset);
else switch(offset)
{
case GWW_ID: ptr = &wndPtr->wIDmenu;
case GWW_HINSTANCE: ptr = &wndPtr->hInstance;
default: return 0;
}
retval = *ptr;
*ptr = newval;
return retval;
}
/**********************************************************************
* GetWindowLong (USER.135)
*/
LONG GetWindowLong( HWND hwnd, short offset )
{
WND * wndPtr = WIN_FindWndPtr( hwnd );
if (!wndPtr) return 0;
if (offset >= 0) return *(LONG *)(((char *)wndPtr->wExtra) + offset);
switch(offset)
{
case GWL_STYLE: return wndPtr->dwStyle;
case GWL_EXSTYLE: return wndPtr->dwExStyle;
case GWL_WNDPROC: return (LONG)wndPtr->lpfnWndProc;
}
return 0;
}
/**********************************************************************
* SetWindowLong (USER.136)
*/
LONG SetWindowLong( HWND hwnd, short offset, LONG newval )
{
LONG *ptr, retval;
WND * wndPtr = WIN_FindWndPtr( hwnd );
if (!wndPtr) return 0;
if (offset >= 0) ptr = (LONG *)(((char *)wndPtr->wExtra) + offset);
else switch(offset)
{
case GWL_STYLE: ptr = &wndPtr->dwStyle;
case GWL_EXSTYLE: ptr = &wndPtr->dwExStyle;
case GWL_WNDPROC: ptr = (LONG *)(&wndPtr->lpfnWndProc);
default: return 0;
}
retval = *ptr;
*ptr = newval;
return retval;
}
/***********************************************************************
* IsIconic (USER.31)
*/
BOOL IsIconic(HWND hWnd)
{
WND * wndPtr;
if (hWnd == 0) return(FALSE);
wndPtr = WIN_FindWndPtr(hWnd);
if (wndPtr == 0) return(FALSE);
if (wndPtr->dwStyle & WS_ICONIC) return(TRUE);
return(FALSE);
}
/*******************************************************************
* GetWindowText (USER.36)
*/
int GetWindowText(HWND hwnd, LPSTR lpString, int nMaxCount)
{
return (int)SendMessage(hwnd, WM_GETTEXT, (WORD)nMaxCount,
(DWORD)lpString);
}
/*******************************************************************
* SetWindowText (USER.37)
*/
void SetWindowText(HWND hwnd, LPSTR lpString)
{
SendMessage(hwnd, WM_SETTEXT, (WORD)NULL, (DWORD)lpString);
}
/*******************************************************************
* GetWindowTextLength (USER.38)
*/
int GetWindowTextLength(HWND hwnd)
{
return (int)SendMessage(hwnd, WM_GETTEXTLENGTH, (WORD)NULL,
(DWORD)NULL);
}
/*******************************************************************
* IsWindow (USER.47)
*/
BOOL IsWindow( HWND hwnd )
{
WND * wndPtr = WIN_FindWndPtr( hwnd );
return (wndPtr->dwMagic == WND_MAGIC);
}
/*****************************************************************
* GetParent (USER.46)
*/
HWND GetParent(HWND hwnd)
{
WND *wndPtr = WIN_FindWndPtr(hwnd);
return wndPtr->hwndParent;
}
/*******************************************************************
* IsChild (USER.48)
*/
BOOL IsChild( HWND parent, HWND child )
{
HWND curChild;
WND * parentPtr;
WND * childPtr;
if (!(parentPtr = WIN_FindWndPtr( parent ))) return FALSE;
curChild = parentPtr->hwndChild;
while (curChild)
{
if (curChild == child) return TRUE;
if (IsChild( curChild, child )) return TRUE;
if (!(childPtr = WIN_FindWndPtr( curChild ))) return FALSE;
curChild = childPtr->hwndNext;
}
return FALSE;
}
/***********************************************************************
* IsWindowVisible (USER.49)
*/
BOOL IsWindowVisible(HWND hWnd)
{
WND * wndPtr;
if (hWnd == 0) return(FALSE);
wndPtr = WIN_FindWndPtr(hWnd);
if (wndPtr == 0) return(FALSE);
if (wndPtr->dwStyle & WS_VISIBLE) {
if (XtIsRealized(wndPtr->winWidget)) return(TRUE);
}
return(FALSE);
}
/*******************************************************************
* GetTopWindow (USER.229)
*/
HWND GetTopWindow( HWND hwnd )
{
WND * wndPtr = WIN_FindWndPtr( hwnd );
if (wndPtr) return wndPtr->hwndChild;
else return 0;
}
/*******************************************************************
* GetWindow (USER.262)
*/
HWND GetWindow( HWND hwnd, WORD rel )
{
WND * wndPtr = WIN_FindWndPtr( hwnd );
if (!wndPtr) return 0;
switch(rel)
{
case GW_HWNDFIRST:
if (wndPtr->hwndParent)
{
WND * parentPtr = WIN_FindWndPtr( wndPtr->hwndParent );
return parentPtr->hwndChild;
}
else return firstWindow;
case GW_HWNDLAST:
while (wndPtr->hwndNext)
{
hwnd = wndPtr->hwndNext;
wndPtr = WIN_FindWndPtr( hwnd );
}
return hwnd;
case GW_HWNDNEXT:
return wndPtr->hwndNext;
case GW_HWNDPREV:
{
HWND hwndPrev;
if (wndPtr->hwndParent)
{
WND * parentPtr = WIN_FindWndPtr( wndPtr->hwndParent );
hwndPrev = parentPtr->hwndChild;
}
else hwndPrev = firstWindow;
if (hwndPrev == hwnd) return 0;
while (hwndPrev)
{
wndPtr = WIN_FindWndPtr( hwndPrev );
if (wndPtr->hwndNext == hwnd) break;
hwndPrev = wndPtr->hwndNext;
}
return hwndPrev;
}
case GW_OWNER:
return wndPtr->hwndOwner;
case GW_CHILD:
return wndPtr->hwndChild;
}
return 0;
}
/*******************************************************************
* GetNextWindow (USER.230)
*/
HWND GetNextWindow( HWND hwnd, WORD flag )
{
if ((flag != GW_HWNDNEXT) && (flag != GW_HWNDPREV)) return 0;
return GetWindow( hwnd, flag );
}