Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(86)

Side by Side Diff: remoting/host/disconnect_window_win.cc

Issue 10825251: Reposition the Disconnect dialog when work area dimensions change. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "remoting/host/disconnect_window.h" 5 #include "remoting/host/disconnect_window.h"
6 6
7 #include <windows.h> 7 #include <windows.h>
8 8
9 #include "base/compiler_specific.h" 9 #include "base/compiler_specific.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
44 44
45 private: 45 private:
46 static BOOL CALLBACK DialogProc(HWND hwmd, UINT msg, WPARAM wParam, 46 static BOOL CALLBACK DialogProc(HWND hwmd, UINT msg, WPARAM wParam,
47 LPARAM lParam); 47 LPARAM lParam);
48 48
49 BOOL OnDialogMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); 49 BOOL OnDialogMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
50 50
51 void ShutdownHost(); 51 void ShutdownHost();
52 void EndDialog(); 52 void EndDialog();
53 void SetStrings(const UiStrings& strings, const std::string& username); 53 void SetStrings(const UiStrings& strings, const std::string& username);
54 void SetDialogPosition();
54 55
55 DisconnectCallback disconnect_callback_; 56 DisconnectCallback disconnect_callback_;
56 HWND hwnd_; 57 HWND hwnd_;
57 bool has_hotkey_; 58 bool has_hotkey_;
58 base::win::ScopedGDIObject<HPEN> border_pen_; 59 base::win::ScopedGDIObject<HPEN> border_pen_;
59 60
60 DISALLOW_COPY_AND_ASSIGN(DisconnectWindowWin); 61 DISALLOW_COPY_AND_ASSIGN(DisconnectWindowWin);
61 }; 62 };
62 63
63 DisconnectWindowWin::DisconnectWindowWin() 64 DisconnectWindowWin::DisconnectWindowWin()
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
102 ShutdownHost(); 103 ShutdownHost();
103 return TRUE; 104 return TRUE;
104 } 105 }
105 return FALSE; 106 return FALSE;
106 107
107 // Ensure we don't try to use the HWND anymore. 108 // Ensure we don't try to use the HWND anymore.
108 case WM_DESTROY: 109 case WM_DESTROY:
109 hwnd_ = NULL; 110 hwnd_ = NULL;
110 return TRUE; 111 return TRUE;
111 112
113 // Ensure the dialog stays visible if the work area dimensions change.
114 case WM_SETTINGCHANGE:
115 if (wParam == SPI_SETWORKAREA)
116 SetDialogPosition();
117 return FALSE;
alexeypa (please no reviews) 2012/08/08 22:05:08 Return TRUE if the message was processed, FALSE ot
Wez 2012/08/09 21:58:08 We'd only do that if we wanted to suppress any add
Wez 2012/08/09 21:58:08 Done.
118
119 // Ensure the dialog stays visible if the display dimensions change.
120 case WM_DISPLAYCHANGE:
121 SetDialogPosition();
122 return FALSE;
alexeypa (please no reviews) 2012/08/08 22:05:08 return TRUE;
Wez 2012/08/09 21:58:08 Same here.
Wez 2012/08/09 21:58:08 Done.
123
112 // Handle the disconnect hot-key. 124 // Handle the disconnect hot-key.
113 case WM_HOTKEY: 125 case WM_HOTKEY:
114 EndDialog(); 126 EndDialog();
115 ShutdownHost(); 127 ShutdownHost();
116 return TRUE; 128 return TRUE;
117 129
118 // Let the window be draggable by its client area by responding 130 // Let the window be draggable by its client area by responding
119 // that the entire window is the title bar. 131 // that the entire window is the title bar.
120 case WM_NCHITTEST: 132 case WM_NCHITTEST:
121 SetWindowLong(hwnd, DWL_MSGRESULT, HTCAPTION); 133 SetWindowLong(hwnd, DWL_MSGRESULT, HTCAPTION);
122 return TRUE; 134 return TRUE;
123 135
124 case WM_PAINT: 136 case WM_PAINT: {
137 PAINTSTRUCT ps;
138 HDC hdc = BeginPaint(hwnd_, &ps);
alexeypa (please no reviews) 2012/08/08 22:05:08 BeginPaint can return NULL.
Wez 2012/08/09 21:58:08 Technically yes, but unless your system is horribl
alexeypa (please no reviews) 2012/08/10 17:28:01 The default assumption a person reading the code m
Wez 2012/08/10 20:06:17 I think this specific code should be pretty safe,
alexeypa (please no reviews) 2012/08/10 20:30:03 OK, thanks!
139 RECT rect;
140 GetClientRect(hwnd_, &rect);
alexeypa (please no reviews) 2012/08/08 22:05:08 GetClientRect can fail.
125 { 141 {
126 PAINTSTRUCT ps; 142 base::win::ScopedSelectObject border(hdc, border_pen_);
127 HDC hdc = BeginPaint(hwnd_, &ps); 143 base::win::ScopedSelectObject brush(hdc, GetStockObject(NULL_BRUSH));
alexeypa (please no reviews) 2012/08/08 22:05:08 GetStockObject can fail.
128 RECT rect; 144 RoundRect(hdc, rect.left, rect.top, rect.right - 1, rect.bottom - 1,
alexeypa (please no reviews) 2012/08/08 22:05:08 RoundRect can fail.
129 GetClientRect(hwnd_, &rect); 145 kWindowBorderRadius, kWindowBorderRadius);
130 {
131 base::win::ScopedSelectObject border(hdc, border_pen_);
132 base::win::ScopedSelectObject brush(hdc, GetStockObject(NULL_BRUSH));
133 RoundRect(hdc, rect.left, rect.top, rect.right - 1, rect.bottom - 1,
134 kWindowBorderRadius, kWindowBorderRadius);
135 }
136 EndPaint(hwnd_, &ps);
137 return TRUE;
138 } 146 }
147 EndPaint(hwnd_, &ps);
148 return TRUE;
alexeypa (please no reviews) 2012/08/08 22:05:08 The application should return TRUE it processes WM
Wez 2012/08/09 21:58:08 Yes, it is doing.
alexeypa (please no reviews) 2012/08/10 17:28:01 :-) I'm not sure what my comment was doing there.
149 }
139 } 150 }
140 return FALSE; 151 return FALSE;
141 } 152 }
142 153
143 void DisconnectWindowWin::Show(ChromotingHost* host, 154 void DisconnectWindowWin::Show(ChromotingHost* host,
144 const DisconnectCallback& disconnect_callback, 155 const DisconnectCallback& disconnect_callback,
145 const std::string& username) { 156 const std::string& username) {
146 CHECK(!hwnd_); 157 CHECK(!hwnd_);
147 disconnect_callback_ = disconnect_callback; 158 disconnect_callback_ = disconnect_callback;
148 159
(...skipping 26 matching lines...) Expand all
175 (DLGPROC)DialogProc, (LPARAM)this); 186 (DLGPROC)DialogProc, (LPARAM)this);
176 CHECK(hwnd_); 187 CHECK(hwnd_);
177 188
178 // Set up handler for Ctrl-Alt-Esc shortcut. 189 // Set up handler for Ctrl-Alt-Esc shortcut.
179 if (!has_hotkey_ && RegisterHotKey(hwnd_, DISCONNECT_HOTKEY_ID, 190 if (!has_hotkey_ && RegisterHotKey(hwnd_, DISCONNECT_HOTKEY_ID,
180 MOD_ALT | MOD_CONTROL, VK_ESCAPE)) { 191 MOD_ALT | MOD_CONTROL, VK_ESCAPE)) {
181 has_hotkey_ = true; 192 has_hotkey_ = true;
182 } 193 }
183 194
184 SetStrings(host->ui_strings(), username); 195 SetStrings(host->ui_strings(), username);
185 196 SetDialogPosition();
186 // Try to center the window above the task-bar. If that fails, use the
187 // primary monitor. If that fails (very unlikely), use the default position.
188 HWND taskbar = FindWindow(L"Shell_TrayWnd", NULL);
189 HMONITOR monitor = MonitorFromWindow(taskbar, MONITOR_DEFAULTTOPRIMARY);
190 MONITORINFO monitor_info = {sizeof(monitor_info)};
191 RECT window_rect;
192 if (GetMonitorInfo(monitor, &monitor_info) &&
193 GetWindowRect(hwnd_, &window_rect)) {
194 int window_width = window_rect.right - window_rect.left;
195 int window_height = window_rect.bottom - window_rect.top;
196 int top = monitor_info.rcWork.bottom - window_height;
197 int left = (monitor_info.rcWork.right + monitor_info.rcWork.left -
198 window_width) / 2;
199 SetWindowPos(hwnd_, NULL, left, top, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
200 }
201 ShowWindow(hwnd_, SW_SHOW); 197 ShowWindow(hwnd_, SW_SHOW);
202 } 198 }
203 199
204 void DisconnectWindowWin::ShutdownHost() { 200 void DisconnectWindowWin::ShutdownHost() {
205 CHECK(!disconnect_callback_.is_null()); 201 CHECK(!disconnect_callback_.is_null());
206 disconnect_callback_.Run(); 202 disconnect_callback_.Run();
207 } 203 }
208 204
209 static int GetControlTextWidth(HWND control) { 205 static int GetControlTextWidth(HWND control) {
210 RECT rect = {0, 0, 0, 0}; 206 RECT rect = {0, 0, 0, 0};
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
266 GetWindowRect(hwnd_, &window_rect); 262 GetWindowRect(hwnd_, &window_rect);
267 int width = (window_rect.right - window_rect.left) + 263 int width = (window_rect.right - window_rect.left) +
268 button_width_delta + label_width_delta; 264 button_width_delta + label_width_delta;
269 int height = window_rect.bottom - window_rect.top; 265 int height = window_rect.bottom - window_rect.top;
270 SetWindowPos(hwnd_, NULL, 0, 0, width, height, SWP_NOMOVE|SWP_NOZORDER); 266 SetWindowPos(hwnd_, NULL, 0, 0, width, height, SWP_NOMOVE|SWP_NOZORDER);
271 HRGN rgn = CreateRoundRectRgn(0, 0, width, height, kWindowBorderRadius, 267 HRGN rgn = CreateRoundRectRgn(0, 0, width, height, kWindowBorderRadius,
272 kWindowBorderRadius); 268 kWindowBorderRadius);
273 SetWindowRgn(hwnd_, rgn, TRUE); 269 SetWindowRgn(hwnd_, rgn, TRUE);
274 } 270 }
275 271
272 void DisconnectWindowWin::SetDialogPosition() {
273 // Try to center the window above the task-bar. If that fails, use the
274 // primary monitor. If that fails (very unlikely), use the default position.
275 HWND taskbar = FindWindow(L"Shell_TrayWnd", NULL);
alexeypa (please no reviews) 2012/08/08 22:05:08 nit: Define a constant for the window name.
alexeypa (please no reviews) 2012/08/08 22:05:08 All the API functions can fail.
alexeypa (please no reviews) 2012/08/08 22:05:08 It would be nice if the window could be correctly
Wez 2012/08/09 21:58:08 That's what this code does; see the comment and pa
Wez 2012/08/09 21:58:08 If FindWindow() fails then MonitorFromWindow() wil
Wez 2012/08/09 21:58:08 Done.
276 HMONITOR monitor = MonitorFromWindow(taskbar, MONITOR_DEFAULTTOPRIMARY);
277 MONITORINFO monitor_info = {sizeof(monitor_info)};
278 RECT window_rect;
279 if (GetMonitorInfo(monitor, &monitor_info) &&
280 GetWindowRect(hwnd_, &window_rect)) {
281 int window_width = window_rect.right - window_rect.left;
282 int window_height = window_rect.bottom - window_rect.top;
283 int top = monitor_info.rcWork.bottom - window_height;
284 int left = (monitor_info.rcWork.right + monitor_info.rcWork.left -
285 window_width) / 2;
286 SetWindowPos(hwnd_, NULL, left, top, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
287 }
288 }
289
276 void DisconnectWindowWin::Hide() { 290 void DisconnectWindowWin::Hide() {
277 EndDialog(); 291 EndDialog();
278 } 292 }
279 293
280 void DisconnectWindowWin::EndDialog() { 294 void DisconnectWindowWin::EndDialog() {
281 if (has_hotkey_) { 295 if (has_hotkey_) {
282 UnregisterHotKey(hwnd_, DISCONNECT_HOTKEY_ID); 296 UnregisterHotKey(hwnd_, DISCONNECT_HOTKEY_ID);
283 has_hotkey_ = false; 297 has_hotkey_ = false;
284 } 298 }
285 299
286 if (hwnd_) { 300 if (hwnd_) {
287 ::DestroyWindow(hwnd_); 301 ::DestroyWindow(hwnd_);
288 hwnd_ = NULL; 302 hwnd_ = NULL;
289 } 303 }
290 } 304 }
291 305
292 scoped_ptr<DisconnectWindow> DisconnectWindow::Create() { 306 scoped_ptr<DisconnectWindow> DisconnectWindow::Create() {
293 return scoped_ptr<DisconnectWindow>(new DisconnectWindowWin()); 307 return scoped_ptr<DisconnectWindow>(new DisconnectWindowWin());
294 } 308 }
295 309
296 } // namespace remoting 310 } // namespace remoting
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698