winpriv.c revision 706f2543
1/*
2 * Export window information for the Windows-OpenGL GLX implementation.
3 *
4 * Authors: Alexander Gottwald
5 */
6
7#ifdef HAVE_XWIN_CONFIG_H
8#include <xwin-config.h>
9#endif
10#include "win.h"
11#include "winpriv.h"
12#include "winwindow.h"
13
14void
15winCreateWindowsWindow (WindowPtr pWin);
16/**
17 * Return size and handles of a window.
18 * If pWin is NULL, then the information for the root window is requested.
19 */
20HWND winGetWindowInfo(WindowPtr pWin)
21{
22    winDebug("%s: pWin=%p\n", __FUNCTION__, pWin);
23
24    /* a real window was requested */
25    if (pWin != NULL)
26    {
27        /* Get the window and screen privates */
28        ScreenPtr pScreen = pWin->drawable.pScreen;
29        winPrivScreenPtr pWinScreen = winGetScreenPriv(pScreen);
30        winScreenInfoPtr pScreenInfo = NULL;
31        HWND hwnd = NULL;
32
33        if (pWinScreen == NULL)
34        {
35            ErrorF("winGetWindowInfo: screen has no privates\n");
36            return NULL;
37        }
38
39        hwnd = pWinScreen->hwndScreen;
40
41        pScreenInfo = pWinScreen->pScreenInfo;
42#ifdef XWIN_MULTIWINDOW
43        /* check for multiwindow mode */
44        if (pScreenInfo->fMultiWindow)
45        {
46            winWindowPriv(pWin);
47
48            if (pWinPriv == NULL)
49            {
50                ErrorF("winGetWindowInfo: window has no privates\n");
51                return hwnd;
52            }
53
54            if (pWinPriv->hWnd == NULL)
55            {
56              winCreateWindowsWindow(pWin);
57              ErrorF("winGetWindowInfo: forcing window to exist...\n");
58            }
59
60            if (pWinPriv->hWnd != NULL)
61              {
62                /* copy window handle */
63                hwnd = pWinPriv->hWnd;
64              }
65
66            return hwnd;
67        }
68#endif
69#ifdef XWIN_MULTIWINDOWEXTWM
70        /* check for multiwindow external wm mode */
71        if (pScreenInfo->fMWExtWM)
72        {
73            win32RootlessWindowPtr pRLWinPriv
74                = (win32RootlessWindowPtr) RootlessFrameForWindow (pWin, FALSE);
75
76            if (pRLWinPriv == NULL) {
77                ErrorF("winGetWindowInfo: window has no privates\n");
78                return hwnd;
79            }
80
81            if (pRLWinPriv->hWnd != NULL)
82            {
83                /* copy window handle */
84                hwnd = pRLWinPriv->hWnd;
85            }
86            return hwnd;
87        }
88#endif
89    }
90    else
91    {
92        ScreenPtr pScreen = g_ScreenInfo[0].pScreen;
93        winPrivScreenPtr pWinScreen = winGetScreenPriv(pScreen);
94
95        if (pWinScreen == NULL)
96        {
97            ErrorF("winGetWindowInfo: screen has no privates\n");
98            return NULL;
99        }
100
101        ErrorF("winGetWindowInfo: returning root window\n");
102
103        return pWinScreen->hwndScreen;
104    }
105
106    return NULL;
107}
108
109Bool
110winCheckScreenAiglxIsSupported(ScreenPtr pScreen)
111{
112  winPrivScreenPtr pWinScreen = winGetScreenPriv(pScreen);
113  winScreenInfoPtr pScreenInfo = pWinScreen->pScreenInfo;
114
115#ifdef XWIN_MULTIWINDOW
116  if (pScreenInfo->fMultiWindow)
117    return TRUE;
118#endif
119
120#ifdef XWIN_MULTIWINDOWEXTWM
121  if (pScreenInfo->fMWExtWM)
122    return TRUE;
123#endif
124
125  return FALSE;
126}
127