Chromium Code Reviews| Index: remoting/host/disconnect_window_win.cc |
| diff --git a/remoting/host/disconnect_window_win.cc b/remoting/host/disconnect_window_win.cc |
| index 06434a874a33e136540f2da44c8fdb8a11a3dac6..a71038787f8a651e0fa8878b1c7e9c09e28e92ab 100644 |
| --- a/remoting/host/disconnect_window_win.cc |
| +++ b/remoting/host/disconnect_window_win.cc |
| @@ -27,8 +27,13 @@ |
| // SimpleHost: simple_host_process.cc |
| extern HMODULE g_hModule; |
| +namespace { |
| + |
| const int DISCONNECT_HOTKEY_ID = 1000; |
| const int kWindowBorderRadius = 14; |
| +const WCHAR kShellTrayWindowName[] = L"Shell_TrayWnd"; |
|
alexeypa (please no reviews)
2012/08/10 17:28:02
nit: WCHAR -> wchar_t. L"" gives a wide string, wh
Wez
2012/08/10 20:06:17
Which are the same thing on Windows. ;)
Wez
2012/08/10 20:06:17
Done.
alexeypa (please no reviews)
2012/08/10 20:30:03
Yeah, I know. It is messy.
|
| + |
| +} // namespace anonymous |
| namespace remoting { |
| @@ -51,6 +56,7 @@ private: |
| void ShutdownHost(); |
| void EndDialog(); |
| void SetStrings(const UiStrings& strings, const std::string& username); |
| + void SetDialogPosition(); |
| DisconnectCallback disconnect_callback_; |
| HWND hwnd_; |
| @@ -109,6 +115,17 @@ BOOL DisconnectWindowWin::OnDialogMessage(HWND hwnd, UINT msg, |
| hwnd_ = NULL; |
| return TRUE; |
| + // Ensure the dialog stays visible if the work area dimensions change. |
| + case WM_SETTINGCHANGE: |
| + if (wParam == SPI_SETWORKAREA) |
| + SetDialogPosition(); |
| + return TRUE; |
| + |
| + // Ensure the dialog stays visible if the display dimensions change. |
| + case WM_DISPLAYCHANGE: |
| + SetDialogPosition(); |
| + return TRUE; |
| + |
| // Handle the disconnect hot-key. |
| case WM_HOTKEY: |
| EndDialog(); |
| @@ -121,21 +138,20 @@ BOOL DisconnectWindowWin::OnDialogMessage(HWND hwnd, UINT msg, |
| SetWindowLong(hwnd, DWL_MSGRESULT, HTCAPTION); |
| return TRUE; |
| - case WM_PAINT: |
| + case WM_PAINT: { |
| + PAINTSTRUCT ps; |
| + HDC hdc = BeginPaint(hwnd_, &ps); |
| + RECT rect; |
| + GetClientRect(hwnd_, &rect); |
| { |
| - PAINTSTRUCT ps; |
| - HDC hdc = BeginPaint(hwnd_, &ps); |
| - RECT rect; |
| - GetClientRect(hwnd_, &rect); |
| - { |
| - base::win::ScopedSelectObject border(hdc, border_pen_); |
| - base::win::ScopedSelectObject brush(hdc, GetStockObject(NULL_BRUSH)); |
| - RoundRect(hdc, rect.left, rect.top, rect.right - 1, rect.bottom - 1, |
| - kWindowBorderRadius, kWindowBorderRadius); |
| - } |
| - EndPaint(hwnd_, &ps); |
| - return TRUE; |
| + base::win::ScopedSelectObject border(hdc, border_pen_); |
| + base::win::ScopedSelectObject brush(hdc, GetStockObject(NULL_BRUSH)); |
| + RoundRect(hdc, rect.left, rect.top, rect.right - 1, rect.bottom - 1, |
| + kWindowBorderRadius, kWindowBorderRadius); |
| } |
| + EndPaint(hwnd_, &ps); |
| + return TRUE; |
| + } |
| } |
| return FALSE; |
| } |
| @@ -182,22 +198,7 @@ void DisconnectWindowWin::Show(ChromotingHost* host, |
| } |
| SetStrings(host->ui_strings(), username); |
| - |
| - // Try to center the window above the task-bar. If that fails, use the |
| - // primary monitor. If that fails (very unlikely), use the default position. |
| - HWND taskbar = FindWindow(L"Shell_TrayWnd", NULL); |
| - HMONITOR monitor = MonitorFromWindow(taskbar, MONITOR_DEFAULTTOPRIMARY); |
| - MONITORINFO monitor_info = {sizeof(monitor_info)}; |
| - RECT window_rect; |
| - if (GetMonitorInfo(monitor, &monitor_info) && |
| - GetWindowRect(hwnd_, &window_rect)) { |
| - int window_width = window_rect.right - window_rect.left; |
| - int window_height = window_rect.bottom - window_rect.top; |
| - int top = monitor_info.rcWork.bottom - window_height; |
| - int left = (monitor_info.rcWork.right + monitor_info.rcWork.left - |
| - window_width) / 2; |
| - SetWindowPos(hwnd_, NULL, left, top, 0, 0, SWP_NOSIZE | SWP_NOZORDER); |
| - } |
| + SetDialogPosition(); |
| ShowWindow(hwnd_, SW_SHOW); |
| } |
| @@ -273,6 +274,24 @@ void DisconnectWindowWin::SetStrings(const UiStrings& strings, |
| SetWindowRgn(hwnd_, rgn, TRUE); |
| } |
| +void DisconnectWindowWin::SetDialogPosition() { |
| + // Try to center the window above the task-bar. If that fails, use the |
| + // primary monitor. If that fails (very unlikely), use the default position. |
| + HWND taskbar = FindWindow(kShellTrayWindowName, NULL); |
| + HMONITOR monitor = MonitorFromWindow(taskbar, MONITOR_DEFAULTTOPRIMARY); |
| + MONITORINFO monitor_info = {sizeof(monitor_info)}; |
| + RECT window_rect; |
| + if (GetMonitorInfo(monitor, &monitor_info) && |
| + GetWindowRect(hwnd_, &window_rect)) { |
| + int window_width = window_rect.right - window_rect.left; |
| + int window_height = window_rect.bottom - window_rect.top; |
| + int top = monitor_info.rcWork.bottom - window_height; |
| + int left = (monitor_info.rcWork.right + monitor_info.rcWork.left - |
| + window_width) / 2; |
| + SetWindowPos(hwnd_, NULL, left, top, 0, 0, SWP_NOSIZE | SWP_NOZORDER); |
| + } |
| +} |
| + |
| void DisconnectWindowWin::Hide() { |
| EndDialog(); |
| } |