OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2015 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 #include "components/browser_watcher/endsession_watcher_window_win.h" |
| 6 |
| 7 #include "base/logging.h" |
| 8 #include "base/win/wrapped_window_proc.h" |
| 9 |
| 10 namespace browser_watcher { |
| 11 |
| 12 namespace { |
| 13 |
| 14 const wchar_t kWindowClassName[] = L"Chrome_BrowserWatcherWindow"; |
| 15 |
| 16 } // namespace |
| 17 |
| 18 EndSessionWatcherWindow::EndSessionWatcherWindow( |
| 19 const EndSessionCallback& on_end_session) : |
| 20 on_end_session_(on_end_session) { |
| 21 WNDCLASSEX window_class = {0}; |
| 22 base::win::InitializeWindowClass( |
| 23 kWindowClassName, |
| 24 &base::win::WrappedWindowProc<EndSessionWatcherWindow::WndProcThunk>, |
| 25 0, 0, 0, NULL, NULL, NULL, NULL, NULL, |
| 26 &window_class); |
| 27 instance_ = window_class.hInstance; |
| 28 ATOM clazz = ::RegisterClassEx(&window_class); |
| 29 DCHECK(clazz); |
| 30 |
| 31 // TODO(siggi): will a message window do here? |
| 32 window_ = ::CreateWindow(kWindowClassName, |
| 33 0, 0, 0, 0, 0, 0, 0, 0, instance_, 0); |
| 34 ::SetWindowLongPtr(window_, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(this)); |
| 35 DCHECK_EQ(::GetWindowLongPtr(window_, GWLP_USERDATA), |
| 36 reinterpret_cast<LONG_PTR>(this)); |
| 37 } |
| 38 |
| 39 EndSessionWatcherWindow::~EndSessionWatcherWindow() { |
| 40 if (window_) { |
| 41 ::DestroyWindow(window_); |
| 42 ::UnregisterClass(kWindowClassName, instance_); |
| 43 } |
| 44 } |
| 45 |
| 46 LRESULT EndSessionWatcherWindow::OnEndSession(WPARAM wparam, LPARAM lparam) { |
| 47 on_end_session_.Run(lparam); |
| 48 return 0; |
| 49 } |
| 50 |
| 51 LRESULT CALLBACK EndSessionWatcherWindow::WndProcThunk(HWND hwnd, |
| 52 UINT message, |
| 53 WPARAM wparam, |
| 54 LPARAM lparam) { |
| 55 EndSessionWatcherWindow* msg_wnd = |
| 56 reinterpret_cast<EndSessionWatcherWindow*>( |
| 57 ::GetWindowLongPtr(hwnd, GWLP_USERDATA)); |
| 58 if (msg_wnd) |
| 59 return msg_wnd->WndProc(hwnd, message, wparam, lparam); |
| 60 |
| 61 return ::DefWindowProc(hwnd, message, wparam, lparam); |
| 62 } |
| 63 |
| 64 LRESULT EndSessionWatcherWindow::WndProc(HWND hwnd, |
| 65 UINT message, |
| 66 WPARAM wparam, |
| 67 LPARAM lparam) { |
| 68 switch (message) { |
| 69 case WM_ENDSESSION: |
| 70 return OnEndSession(wparam, lparam); |
| 71 default: |
| 72 break; |
| 73 } |
| 74 |
| 75 return ::DefWindowProc(hwnd, message, wparam, lparam); |
| 76 } |
| 77 |
| 78 } // namespace browser_watcher |
OLD | NEW |