| // Copyright (c) 2015 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "components/browser_watcher/endsession_watcher_window_win.h" |
| |
| #include "base/logging.h" |
| #include "base/win/wrapped_window_proc.h" |
| |
| namespace browser_watcher { |
| |
| namespace { |
| |
| const wchar_t kWindowClassName[] = L"Chrome_BrowserWatcherWindow"; |
| |
| } // namespace |
| |
| EndSessionWatcherWindow::EndSessionWatcherWindow( |
| const EndSessionMessageCallback& on_end_session_message) : |
| on_end_session_message_(on_end_session_message) { |
| WNDCLASSEX window_class = {0}; |
| base::win::InitializeWindowClass( |
| kWindowClassName, |
| &base::win::WrappedWindowProc<EndSessionWatcherWindow::WndProcThunk>, |
| 0, 0, 0, NULL, NULL, NULL, NULL, NULL, |
| &window_class); |
| instance_ = window_class.hInstance; |
| ATOM clazz = ::RegisterClassEx(&window_class); |
| DCHECK(clazz); |
| |
| // TODO(siggi): will a message window do here? |
| window_ = ::CreateWindow(kWindowClassName, |
| 0, 0, 0, 0, 0, 0, 0, 0, instance_, 0); |
| ::SetWindowLongPtr(window_, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(this)); |
| DCHECK_EQ(::GetWindowLongPtr(window_, GWLP_USERDATA), |
| reinterpret_cast<LONG_PTR>(this)); |
| } |
| |
| EndSessionWatcherWindow::~EndSessionWatcherWindow() { |
| if (window_) { |
| ::DestroyWindow(window_); |
| ::UnregisterClass(kWindowClassName, instance_); |
| } |
| } |
| |
| LRESULT EndSessionWatcherWindow::OnEndSessionMessage(UINT message, |
| WPARAM wparam, |
| LPARAM lparam) { |
| on_end_session_message_.Run(message, lparam); |
| return 0; |
| } |
| |
| LRESULT CALLBACK EndSessionWatcherWindow::WndProcThunk(HWND hwnd, |
| UINT message, |
| WPARAM wparam, |
| LPARAM lparam) { |
| EndSessionWatcherWindow* msg_wnd = |
| reinterpret_cast<EndSessionWatcherWindow*>( |
| ::GetWindowLongPtr(hwnd, GWLP_USERDATA)); |
| if (msg_wnd) |
| return msg_wnd->WndProc(hwnd, message, wparam, lparam); |
| |
| return ::DefWindowProc(hwnd, message, wparam, lparam); |
| } |
| |
| LRESULT EndSessionWatcherWindow::WndProc(HWND hwnd, |
| UINT message, |
| WPARAM wparam, |
| LPARAM lparam) { |
| switch (message) { |
| case WM_ENDSESSION: |
| case WM_QUERYENDSESSION: |
| return OnEndSessionMessage(message, wparam, lparam); |
| default: |
| break; |
| } |
| |
| return ::DefWindowProc(hwnd, message, wparam, lparam); |
| } |
| |
| } // namespace browser_watcher |