X11GlContext::X11GlContext(std::shared_ptr<X11Display>& d, ::GLXFBConfig chosenFbc, std::shared_ptr<X11GlContext> shared_context) : display(d), shared_context(shared_context) { // prevent chained sharing while(shared_context && shared_context->shared_context) { shared_context = shared_context->shared_context; } // Contexts can't be shared across different displays. if(shared_context && shared_context->display != d) { shared_context.reset(); } glcontext = CreateGlContext(display->display, chosenFbc, shared_context ? shared_context->glcontext : 0); }
static void CreateMainWindows(void) { WNDCLASSEX wc; memset(&wc, 0, sizeof(wc)); wc.cbSize = sizeof(wc); // The graphics window, where the sketch is drawn and shown. wc.style = CS_BYTEALIGNCLIENT | CS_BYTEALIGNWINDOW | CS_OWNDC | CS_DBLCLKS; wc.lpfnWndProc = (WNDPROC)GraphicsWndProc; wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wc.lpszClassName = "GraphicsWnd"; wc.lpszMenuName = NULL; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hIcon = (HICON)LoadImage(Instance, MAKEINTRESOURCE(4000), IMAGE_ICON, 32, 32, 0); wc.hIconSm = (HICON)LoadImage(Instance, MAKEINTRESOURCE(4000), IMAGE_ICON, 16, 16, 0); if(!RegisterClassEx(&wc)) oops(); HMENU top = CreateGraphicsWindowMenus(); GraphicsWnd = CreateWindowEx(0, "GraphicsWnd", "SolveSpace (not yet saved)", WS_OVERLAPPED | WS_THICKFRAME | WS_CLIPCHILDREN | WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_SYSMENU | WS_SIZEBOX | WS_CLIPSIBLINGS, 50, 50, 900, 600, NULL, top, Instance, NULL); if(!GraphicsWnd) oops(); GraphicsEditControl = CreateWindowEx(WS_EX_CLIENTEDGE, WC_EDIT, "", WS_CHILD | ES_AUTOHSCROLL | WS_TABSTOP | WS_CLIPSIBLINGS, 50, 50, 100, 21, GraphicsWnd, NULL, Instance, NULL); SendMessage(GraphicsEditControl, WM_SETFONT, (WPARAM)FixedFont, true); // The text window, with a comand line and some textual information // about the sketch. wc.style &= ~CS_DBLCLKS; wc.lpfnWndProc = (WNDPROC)TextWndProc; wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); wc.lpszClassName = "TextWnd"; wc.hCursor = NULL; if(!RegisterClassEx(&wc)) oops(); // We get the desired Alt+Tab behaviour by specifying that the text // window is a child of the graphics window. TextWnd = CreateWindowEx(0, "TextWnd", "SolveSpace - Browser", WS_THICKFRAME | WS_CLIPCHILDREN, 650, 500, 420, 300, GraphicsWnd, (HMENU)NULL, Instance, NULL); if(!TextWnd) oops(); TextWndScrollBar = CreateWindowEx(0, WC_SCROLLBAR, "", WS_CHILD | SBS_VERT | SBS_LEFTALIGN | WS_VISIBLE | WS_CLIPSIBLINGS, 200, 100, 100, 100, TextWnd, NULL, Instance, NULL); // Force the scrollbar to get resized to the window, TextWndProc(TextWnd, WM_SIZE, 0, 0); TextEditControl = CreateWindowEx(WS_EX_CLIENTEDGE, WC_EDIT, "", WS_CHILD | ES_AUTOHSCROLL | WS_TABSTOP | WS_CLIPSIBLINGS, 50, 50, 100, 21, TextWnd, NULL, Instance, NULL); SendMessage(TextEditControl, WM_SETFONT, (WPARAM)FixedFont, true); // Now that all our windows exist, set up gl contexts. CreateGlContext(TextWnd, &TextGl); CreateGlContext(GraphicsWnd, &GraphicsGl); RECT r, rc; GetWindowRect(TextWnd, &r); GetClientRect(TextWnd, &rc); ClientIsSmallerBy = (r.bottom - r.top) - (rc.bottom - rc.top); }