| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 // | |
| 5 // Originally from libjingle. Minor alterations to compile it in Chrome. | |
| 6 | |
| 7 #include "talk/base/common.h" | |
| 8 #include "talk/base/logging.h" | |
| 9 #include "talk/base/win32window.h" | |
| 10 | |
| 11 namespace talk_base { | |
| 12 | |
| 13 /////////////////////////////////////////////////////////////////////////////// | |
| 14 // Win32Window | |
| 15 /////////////////////////////////////////////////////////////////////////////// | |
| 16 | |
| 17 static const wchar_t kWindowBaseClassName[] = L"WindowBaseClass"; | |
| 18 HINSTANCE instance_ = GetModuleHandle(NULL); | |
| 19 ATOM window_class_ = 0; | |
| 20 | |
| 21 Win32Window::Win32Window() : wnd_(NULL) { | |
| 22 } | |
| 23 | |
| 24 Win32Window::~Win32Window() { | |
| 25 ASSERT(NULL == wnd_); | |
| 26 } | |
| 27 | |
| 28 bool Win32Window::Create(HWND parent, const wchar_t* title, DWORD style, | |
| 29 DWORD exstyle, int x, int y, int cx, int cy) { | |
| 30 if (wnd_) { | |
| 31 // Window already exists. | |
| 32 return false; | |
| 33 } | |
| 34 | |
| 35 if (!window_class_) { | |
| 36 // Class not registered, register it. | |
| 37 WNDCLASSEX wcex; | |
| 38 memset(&wcex, 0, sizeof(wcex)); | |
| 39 wcex.cbSize = sizeof(wcex); | |
| 40 wcex.hInstance = instance_; | |
| 41 wcex.lpfnWndProc = &Win32Window::WndProc; | |
| 42 wcex.lpszClassName = kWindowBaseClassName; | |
| 43 window_class_ = ::RegisterClassEx(&wcex); | |
| 44 if (!window_class_) { | |
| 45 LOG_GLE(LS_ERROR) << "RegisterClassEx failed"; | |
| 46 return false; | |
| 47 } | |
| 48 } | |
| 49 wnd_ = ::CreateWindowEx(exstyle, kWindowBaseClassName, title, style, | |
| 50 x, y, cx, cy, parent, NULL, instance_, this); | |
| 51 return (NULL != wnd_); | |
| 52 } | |
| 53 | |
| 54 void Win32Window::Destroy() { | |
| 55 VERIFY(::DestroyWindow(wnd_) != FALSE); | |
| 56 } | |
| 57 | |
| 58 #if 0 | |
| 59 void Win32Window::SetInstance(HINSTANCE instance) { | |
| 60 instance_ = instance; | |
| 61 } | |
| 62 | |
| 63 void Win32Window::Shutdown() { | |
| 64 if (window_class_) { | |
| 65 ::UnregisterClass(MAKEINTATOM(window_class_), instance_); | |
| 66 window_class_ = 0; | |
| 67 } | |
| 68 } | |
| 69 #endif | |
| 70 | |
| 71 bool Win32Window::OnMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, | |
| 72 LRESULT& result) { | |
| 73 switch (uMsg) { | |
| 74 case WM_CLOSE: | |
| 75 if (!OnClose()) { | |
| 76 result = 0; | |
| 77 return true; | |
| 78 } | |
| 79 break; | |
| 80 } | |
| 81 return false; | |
| 82 } | |
| 83 | |
| 84 LRESULT Win32Window::WndProc(HWND hwnd, UINT uMsg, | |
| 85 WPARAM wParam, LPARAM lParam) { | |
| 86 Win32Window* that = reinterpret_cast<Win32Window*>( | |
| 87 ::GetWindowLongPtr(hwnd, GWL_USERDATA)); | |
| 88 if (!that && (WM_CREATE == uMsg)) { | |
| 89 CREATESTRUCT* cs = reinterpret_cast<CREATESTRUCT*>(lParam); | |
| 90 that = static_cast<Win32Window*>(cs->lpCreateParams); | |
| 91 that->wnd_ = hwnd; | |
| 92 ::SetWindowLongPtr(hwnd, GWL_USERDATA, reinterpret_cast<LONG_PTR>(that)); | |
| 93 } | |
| 94 if (that) { | |
| 95 LRESULT result; | |
| 96 bool handled = that->OnMessage(uMsg, wParam, lParam, result); | |
| 97 if (WM_DESTROY == uMsg) { | |
| 98 for (HWND child = ::GetWindow(hwnd, GW_CHILD); child; | |
| 99 child = ::GetWindow(child, GW_HWNDNEXT)) { | |
| 100 LOG(LS_INFO) << "Child window: " << static_cast<void*>(child); | |
| 101 } | |
| 102 } | |
| 103 if (WM_NCDESTROY == uMsg) { | |
| 104 ::SetWindowLongPtr(hwnd, GWL_USERDATA, NULL); | |
| 105 that->wnd_ = NULL; | |
| 106 that->OnDestroyed(); | |
| 107 } | |
| 108 if (handled) { | |
| 109 return result; | |
| 110 } | |
| 111 } | |
| 112 return ::DefWindowProc(hwnd, uMsg, wParam, lParam); | |
| 113 } | |
| 114 | |
| 115 } // namespace talk_base | |
| OLD | NEW |