/* * Export window information for the Windows-OpenGL GLX implementation. * * Authors: Alexander Gottwald */ #ifdef HAVE_XWIN_CONFIG_H #include #endif #include "win.h" #include "winpriv.h" #include "winwindow.h" extern Bool g_fXdmcpEnabled; void winCreateWindowsWindow (WindowPtr pWin); /** * Return size and handles of a window. * If pWin is NULL, then the information for the root window is requested. */ 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); ErrorF("winGetWindowInfo: forcing window to exist...\n"); } if (pWinPriv->hWnd != NULL) { /* copy size and window handle */ pWinInfo->rect = rect_extends; pWinInfo->hwnd = pWinPriv->hWnd; /* Copy window region */ if (pWinPriv->hRgn) { if (!pWinInfo->hrgn) { pWinInfo->hrgn = CreateRectRgn(0,0,0,0); } CombineRgn(pWinInfo->hrgn, pWinPriv->hRgn, pWinPriv->hRgn, RGN_COPY); } else if (pWinInfo->hrgn) { DeleteObject(pWinInfo->hrgn); pWinInfo->hrgn=NULL; } } return; } else if (g_fXdmcpEnabled) { winWindowPriv(pWin); if (pWinPriv == NULL) { ErrorF("winGetWindowInfo: window has no privates\n"); return; } if (pWinPriv->hWnd == NULL) { if (!((pWin->drawable.x==0) && (pWin->drawable.y==0) && (pWin->drawable.width==pScreen->width) && (pWin->drawable.height==pScreen->height) ) ) { int ExtraClass=(pWin->realized)?WS_VISIBLE:0; pWinPriv->hWnd=CreateWindowExA(WS_EX_TRANSPARENT, WIN_GL_WINDOW_CLASS, "", WS_CHILD |WS_CLIPSIBLINGS | WS_CLIPCHILDREN | ExtraClass, pWin->drawable.x, pWin->drawable.y, pWin->drawable.width, pWin->drawable.height, pWinScreen->hwndScreen, NULL, GetModuleHandle(NULL), NULL); pWinPriv->GlCtxWnd=TRUE; /* copy size and window handle */ pWinInfo->hwnd = pWinPriv->hWnd; } else { pWinInfo->hwnd = pWinScreen->hwndScreen; } pWinInfo->rect = rect_extends; if (pWinInfo->hrgn) { DeleteObject(pWinInfo->hrgn); pWinInfo->hrgn = NULL; } } else { pWinInfo->rect = rect_extends; pWinInfo->hwnd = pWinPriv->hWnd; pWinInfo->hrgn = NULL; } } #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; } winDebug("winGetWindowInfo: returning root window\n"); pWinInfo->hwnd = pWinScreen->hwndScreen; } return; } Bool winCheckScreenAiglxIsSupported(ScreenPtr pScreen) { winPrivScreenPtr pWinScreen = winGetScreenPriv(pScreen); winScreenInfoPtr pScreenInfo = pWinScreen->pScreenInfo; #ifdef XWIN_MULTIWINDOW if (pScreenInfo->fMultiWindow) return TRUE; #endif #ifdef XWIN_MULTIWINDOWEXTWM if (pScreenInfo->fMWExtWM) return TRUE; #endif if (g_fXdmcpEnabled) return TRUE; return FALSE; }