namespace glws {
+static LRESULT CALLBACK
+WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ MINMAXINFO *pMMI;
+ switch (uMsg) {
+ case WM_GETMINMAXINFO:
+ // Allow to create a window bigger than the desktop
+ pMMI = (MINMAXINFO *)lParam;
+ pMMI->ptMaxSize.x = 60000;
+ pMMI->ptMaxSize.y = 60000;
+ pMMI->ptMaxTrackSize.x = 60000;
+ pMMI->ptMaxTrackSize.y = 60000;
+ break;
+ default:
+ break;
+ }
+
+ return DefWindowProc(hWnd, uMsg, wParam, lParam);
+}
+
+
class WglDrawable : public Drawable
{
public:
PIXELFORMATDESCRIPTOR pfd;
int iPixelFormat;
- WglDrawable(const Visual *vis) :
- Drawable(vis)
+ WglDrawable(const Visual *vis, int width, int height) :
+ Drawable(vis, width, height)
{
static bool first = TRUE;
RECT rect;
wc.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
- wc.lpfnWndProc = DefWindowProc;
+ wc.lpfnWndProc = WndProc;
wc.lpszClassName = "glretrace";
wc.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
RegisterClass(&wc);
}
dwExStyle = 0;
- dwStyle = WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_VISIBLE | WS_OVERLAPPEDWINDOW;
+ dwStyle = WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW;
- int x = 0, y = 0, width = 256, height = 256;
+ int x = 0, y = 0;
rect.left = x;
rect.top = y;
"glretrace", /* wc.lpszClassName */
NULL,
dwStyle,
- CW_USEDEFAULT, /* x */
- CW_USEDEFAULT, /* y */
+ 0, /* x */
+ 0, /* y */
rect.right - rect.left, /* width */
rect.bottom - rect.top, /* height */
NULL,
hDC = GetDC(hWnd);
memset(&pfd, 0, sizeof pfd);
- pfd.cColorBits = 3;
+ pfd.cColorBits = 4;
pfd.cRedBits = 1;
pfd.cGreenBits = 1;
pfd.cBlueBits = 1;
+ pfd.cAlphaBits = 1;
+ pfd.cDepthBits = 1;
+ pfd.cStencilBits = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL;
pfd.iLayerType = PFD_MAIN_PLANE;
pfd.iPixelType = PFD_TYPE_RGBA;
}
void
- resize(unsigned w, unsigned h) {
+ resize(int w, int h) {
Drawable::resize(w, h);
RECT rClient, rWindow;
GetClientRect(hWnd, &rClient);
GetWindowRect(hWnd, &rWindow);
w += (rWindow.right - rWindow.left) - rClient.right;
h += (rWindow.bottom - rWindow.top) - rClient.bottom;
- MoveWindow(hWnd, rWindow.left, rWindow.top, w, h, TRUE);
+ SetWindowPos(hWnd, NULL, rWindow.left, rWindow.top, w, h, SWP_NOMOVE);
+ }
+
+ void show(void) {
+ if (!visible) {
+ ShowWindow(hWnd, SW_SHOW);
+
+ Drawable::show();
+ }
}
void swapBuffers(void) {
{
public:
HGLRC hglrc;
-
- WglContext(const Visual *vis) :
+ WglContext *shareContext;
+
+ WglContext(const Visual *vis, WglContext *share) :
Context(vis),
- hglrc(0)
+ hglrc(0),
+ shareContext(share)
{}
~WglContext() {
}
Drawable *
- createDrawable(const Visual *visual)
+ createDrawable(const Visual *visual, int width, int height)
{
- return new WglDrawable(visual);
+ return new WglDrawable(visual, width, height);
}
Context *
- createContext(const Visual *visual)
+ createContext(const Visual *visual, Context *shareContext)
{
- return new WglContext(visual);
+ return new WglContext(visual, dynamic_cast<WglContext *>(shareContext));
}
bool
if (!wglContext->hglrc) {
return false;
}
+ if (wglContext->shareContext) {
+ wglShareLists(wglContext->shareContext->hglrc,
+ wglContext->hglrc);
+ }
}
return wglMakeCurrent(wglDrawable->hDC, wglContext->hglrc);