summaryrefslogtreecommitdiffstats
path: root/ui
diff options
context:
space:
mode:
Diffstat (limited to 'ui')
-rw-r--r--ui/gfx/gl/gl_surface_wgl.cc88
-rw-r--r--ui/gfx/gl/gl_surface_wgl.h1
2 files changed, 72 insertions, 17 deletions
diff --git a/ui/gfx/gl/gl_surface_wgl.cc b/ui/gfx/gl/gl_surface_wgl.cc
index 0218266..73ff12e 100644
--- a/ui/gfx/gl/gl_surface_wgl.cc
+++ b/ui/gfx/gl/gl_surface_wgl.cc
@@ -10,6 +10,7 @@
namespace gfx {
+static ATOM g_class_registration;
static HWND g_window;
static int g_pixel_format = 0;
@@ -37,7 +38,19 @@ static LRESULT CALLBACK IntermediateWindowProc(HWND window,
UINT message,
WPARAM w_param,
LPARAM l_param) {
- return ::DefWindowProc(window, message, w_param, l_param);
+ switch (message) {
+ case WM_ERASEBKGND:
+ // Prevent windows from erasing the background.
+ return 1;
+ case WM_PAINT:
+ // Do not paint anything.
+ PAINTSTRUCT paint;
+ if (BeginPaint(window, &paint))
+ EndPaint(window, &paint);
+ return 0;
+ default:
+ return DefWindowProc(window, message, w_param, l_param);
+ }
}
GLSurfaceWGL::GLSurfaceWGL() {
@@ -63,7 +76,7 @@ bool GLSurfaceWGL::InitializeOneOff() {
}
WNDCLASS intermediate_class;
- intermediate_class.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
+ intermediate_class.style = CS_OWNDC;
intermediate_class.lpfnWndProc = IntermediateWindowProc;
intermediate_class.cbClsExtra = 0;
intermediate_class.cbWndExtra = 0;
@@ -74,14 +87,14 @@ bool GLSurfaceWGL::InitializeOneOff() {
intermediate_class.lpszMenuName = NULL;
intermediate_class.lpszClassName = L"Intermediate GL Window";
- ATOM class_registration = ::RegisterClass(&intermediate_class);
- if (!class_registration) {
+ g_class_registration = ::RegisterClass(&intermediate_class);
+ if (!g_class_registration) {
LOG(ERROR) << "RegisterClass failed.";
return false;
}
g_window = CreateWindow(
- reinterpret_cast<wchar_t*>(class_registration),
+ reinterpret_cast<wchar_t*>(g_class_registration),
L"",
WS_OVERLAPPEDWINDOW,
0, 0,
@@ -92,7 +105,7 @@ bool GLSurfaceWGL::InitializeOneOff() {
NULL);
if (!g_window) {
- UnregisterClass(reinterpret_cast<wchar_t*>(class_registration),
+ UnregisterClass(reinterpret_cast<wchar_t*>(g_class_registration),
module_handle);
LOG(ERROR) << "CreateWindow failed.";
return false;
@@ -106,7 +119,7 @@ bool GLSurfaceWGL::InitializeOneOff() {
if (g_pixel_format == 0) {
LOG(ERROR) << "Unable to get the pixel format for GL context.";
ReleaseDC(g_window, temporary_dc);
- UnregisterClass(reinterpret_cast<wchar_t*>(class_registration),
+ UnregisterClass(reinterpret_cast<wchar_t*>(g_class_registration),
module_handle);
return false;
}
@@ -116,7 +129,7 @@ bool GLSurfaceWGL::InitializeOneOff() {
&kPixelFormatDescriptor)) {
LOG(ERROR) << "Unable to set the pixel format for temporary GL context.";
ReleaseDC(g_window, temporary_dc);
- UnregisterClass(reinterpret_cast<wchar_t*>(class_registration),
+ UnregisterClass(reinterpret_cast<wchar_t*>(g_class_registration),
module_handle);
return false;
}
@@ -126,7 +139,7 @@ bool GLSurfaceWGL::InitializeOneOff() {
if (!gl_context) {
LOG(ERROR) << "Failed to create temporary context.";
ReleaseDC(g_window, temporary_dc);
- UnregisterClass(reinterpret_cast<wchar_t*>(class_registration),
+ UnregisterClass(reinterpret_cast<wchar_t*>(g_class_registration),
module_handle);
return false;
}
@@ -135,7 +148,7 @@ bool GLSurfaceWGL::InitializeOneOff() {
LOG(ERROR) << "Failed to make temporary GL context current.";
wglDeleteContext(gl_context);
ReleaseDC(g_window, temporary_dc);
- UnregisterClass(reinterpret_cast<wchar_t*>(class_registration),
+ UnregisterClass(reinterpret_cast<wchar_t*>(g_class_registration),
module_handle);
return false;
}
@@ -148,8 +161,6 @@ bool GLSurfaceWGL::InitializeOneOff() {
wglMakeCurrent(NULL, NULL);
wglDeleteContext(gl_context);
ReleaseDC(g_window, temporary_dc);
- UnregisterClass(reinterpret_cast<wchar_t*>(class_registration),
- module_handle);
initialized = true;
return true;
@@ -157,6 +168,7 @@ bool GLSurfaceWGL::InitializeOneOff() {
NativeViewGLSurfaceWGL::NativeViewGLSurfaceWGL(gfx::PluginWindowHandle window)
: window_(window),
+ child_window_(NULL),
device_context_(NULL) {
DCHECK(window);
}
@@ -168,8 +180,34 @@ NativeViewGLSurfaceWGL::~NativeViewGLSurfaceWGL() {
bool NativeViewGLSurfaceWGL::Initialize() {
DCHECK(!device_context_);
+ RECT rect;
+ if (!GetClientRect(window_, &rect)) {
+ LOG(ERROR) << "GetClientRect failed.\n";
+ Destroy();
+ return false;
+ }
+
+ // Create a child window. WGL has problems using a window handle owned by
+ // another process.
+ child_window_ = CreateWindow(
+ reinterpret_cast<wchar_t*>(g_class_registration),
+ L"",
+ WS_CHILDWINDOW | WS_DISABLED | WS_VISIBLE,
+ 0, 0,
+ rect.right - rect.left,
+ rect.bottom - rect.top,
+ window_,
+ NULL,
+ NULL,
+ NULL);
+ if (!child_window_) {
+ LOG(ERROR) << "CreateWindow failed.\n";
+ Destroy();
+ return false;
+ }
+
// The GL context will render to this window.
- device_context_ = GetDC(window_);
+ device_context_ = GetDC(child_window_);
if (!device_context_) {
LOG(ERROR) << "Unable to get device context for window.";
Destroy();
@@ -188,10 +226,13 @@ bool NativeViewGLSurfaceWGL::Initialize() {
}
void NativeViewGLSurfaceWGL::Destroy() {
- if (window_ && device_context_)
- ReleaseDC(window_, device_context_);
+ if (child_window_ && device_context_)
+ ReleaseDC(child_window_, device_context_);
+
+ if (child_window_)
+ DestroyWindow(child_window_);
- window_ = NULL;
+ child_window_ = NULL;
device_context_ = NULL;
}
@@ -200,13 +241,26 @@ bool NativeViewGLSurfaceWGL::IsOffscreen() {
}
bool NativeViewGLSurfaceWGL::SwapBuffers() {
+ // Resize the child window to match the parent before swapping. Do not repaint
+ // it as it moves.
+ RECT rect;
+ if (!GetClientRect(window_, &rect))
+ return false;
+ if (!MoveWindow(child_window_,
+ 0, 0,
+ rect.right - rect.left,
+ rect.bottom - rect.top,
+ FALSE)) {
+ return false;
+ }
+
DCHECK(device_context_);
return ::SwapBuffers(device_context_) == TRUE;
}
gfx::Size NativeViewGLSurfaceWGL::GetSize() {
RECT rect;
- DCHECK(GetClientRect(window_, &rect));
+ DCHECK(GetClientRect(child_window_, &rect));
return gfx::Size(rect.right - rect.left, rect.bottom - rect.top);
}
diff --git a/ui/gfx/gl/gl_surface_wgl.h b/ui/gfx/gl/gl_surface_wgl.h
index b768655..1684fdb 100644
--- a/ui/gfx/gl/gl_surface_wgl.h
+++ b/ui/gfx/gl/gl_surface_wgl.h
@@ -37,6 +37,7 @@ class NativeViewGLSurfaceWGL : public GLSurfaceWGL {
private:
gfx::PluginWindowHandle window_;
+ gfx::PluginWindowHandle child_window_;
HDC device_context_;
DISALLOW_COPY_AND_ASSIGN(NativeViewGLSurfaceWGL);