132 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			132 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C
		
	
	
	
/*
 | 
						|
 * Export window information for the Windows-OpenGL GLX implementation.
 | 
						|
 *
 | 
						|
 * Authors: Alexander Gottwald
 | 
						|
 */
 | 
						|
 | 
						|
#include "win.h"
 | 
						|
#include "winpriv.h"
 | 
						|
#include "winwindow.h"
 | 
						|
 | 
						|
void
 | 
						|
winCreateWindowsWindow (WindowPtr pWin);
 | 
						|
/**
 | 
						|
 * Return size and handles of a window.
 | 
						|
 * If pWin is NULL, then the information for the root window is requested.
 | 
						|
 */ 
 | 
						|
extern void winGetWindowInfo(WindowPtr pWin, winWindowInfoPtr pWinInfo)
 | 
						|
{
 | 
						|
    /* Sanity check */
 | 
						|
    if (pWinInfo == NULL)
 | 
						|
        return;
 | 
						|
 | 
						|
    winDebug("%s:%d pWin=%p\n", __FUNCTION__, __LINE__, pWin);
 | 
						|
 | 
						|
    /* a real window was requested */
 | 
						|
    if (pWin != NULL) 
 | 
						|
    {
 | 
						|
        /* Initialize the size information */
 | 
						|
        RECT rect = {
 | 
						|
            pWin->drawable.x,
 | 
						|
            pWin->drawable.y,
 | 
						|
            pWin->drawable.x + pWin->drawable.width,
 | 
						|
            pWin->drawable.y + pWin->drawable.height
 | 
						|
        }, rect_extends;
 | 
						|
        /* Get the window and screen privates */
 | 
						|
        ScreenPtr pScreen = pWin->drawable.pScreen;
 | 
						|
        winPrivScreenPtr pWinScreen = winGetScreenPriv(pScreen);
 | 
						|
        winScreenInfoPtr pScreenInfo = NULL;
 | 
						|
 | 
						|
        rect_extends = rect;
 | 
						|
        OffsetRect(&rect_extends, -pWin->drawable.x, -pWin->drawable.y);
 | 
						|
 | 
						|
        if (pWinScreen == NULL) 
 | 
						|
        {
 | 
						|
            ErrorF("winGetWindowInfo: screen has no privates\n");
 | 
						|
            return;
 | 
						|
        }
 | 
						|
        
 | 
						|
        pWinInfo->hwnd = pWinScreen->hwndScreen;
 | 
						|
        pWinInfo->hrgn = NULL;
 | 
						|
        pWinInfo->rect = rect;
 | 
						|
    
 | 
						|
 | 
						|
        pScreenInfo = pWinScreen->pScreenInfo;
 | 
						|
#ifdef XWIN_MULTIWINDOW
 | 
						|
        /* check for multiwindow mode */
 | 
						|
        if (pScreenInfo->fMultiWindow)
 | 
						|
        {
 | 
						|
            winWindowPriv(pWin);
 | 
						|
 | 
						|
            if (pWinPriv == NULL)
 | 
						|
            {
 | 
						|
                ErrorF("winGetWindowInfo: window has no privates\n");
 | 
						|
                return;
 | 
						|
            }
 | 
						|
 | 
						|
            if (pWinPriv->hWnd == NULL)
 | 
						|
            {
 | 
						|
                winCreateWindowsWindow(pWin);
 | 
						|
            }
 | 
						|
            if (pWinPriv->hWnd != NULL) { 
 | 
						|
                
 | 
						|
                /* copy size and window handle */
 | 
						|
                pWinInfo->rect = rect_extends;
 | 
						|
                pWinInfo->hwnd = pWinPriv->hWnd;
 | 
						|
 | 
						|
                /* Copy window region */
 | 
						|
                if (pWinInfo->hrgn)
 | 
						|
                    DeleteObject(pWinInfo->hrgn);
 | 
						|
                pWinInfo->hrgn = CreateRectRgn(0,0,0,0);
 | 
						|
                CombineRgn(pWinInfo->hrgn, pWinPriv->hRgn, pWinPriv->hRgn, 
 | 
						|
                        RGN_COPY);
 | 
						|
            }
 | 
						|
            
 | 
						|
            return;
 | 
						|
        }
 | 
						|
#endif
 | 
						|
#ifdef XWIN_MULTIWINDOWEXTWM
 | 
						|
        /* check for multiwindow external wm mode */
 | 
						|
        if (pScreenInfo->fMWExtWM)
 | 
						|
        {
 | 
						|
            win32RootlessWindowPtr pRLWinPriv
 | 
						|
                = (win32RootlessWindowPtr) RootlessFrameForWindow (pWin, FALSE);
 | 
						|
 | 
						|
            if (pRLWinPriv == NULL) {
 | 
						|
                ErrorF("winGetWindowInfo: window has no privates\n");
 | 
						|
                return;
 | 
						|
            }
 | 
						|
            
 | 
						|
            if (pRLWinPriv->hWnd != NULL)
 | 
						|
            {
 | 
						|
                /* copy size and window handle */
 | 
						|
                pWinInfo->rect = rect_extends;
 | 
						|
                pWinInfo->hwnd = pRLWinPriv->hWnd;
 | 
						|
            }
 | 
						|
            return;
 | 
						|
        }
 | 
						|
#endif
 | 
						|
    } 
 | 
						|
    else 
 | 
						|
    {
 | 
						|
        RECT rect = {0, 0, 0, 0};
 | 
						|
        ScreenPtr pScreen = g_ScreenInfo[0].pScreen;
 | 
						|
        winPrivScreenPtr pWinScreen = winGetScreenPriv(pScreen);
 | 
						|
 | 
						|
        pWinInfo->hwnd = NULL;
 | 
						|
        pWinInfo->hrgn = NULL;
 | 
						|
        pWinInfo->rect = rect;
 | 
						|
        
 | 
						|
        if (pWinScreen == NULL)
 | 
						|
        {
 | 
						|
            ErrorF("winGetWindowInfo: screen has no privates\n");
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
        ErrorF("winGetWindowInfo: returning root window\n");
 | 
						|
 | 
						|
        pWinInfo->hwnd = pWinScreen->hwndScreen;
 | 
						|
    }
 | 
						|
    return;
 | 
						|
}
 |