OLD | NEW |
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 <windows.h> | 5 #include <windows.h> |
6 | 6 |
7 #include "base/compiler_specific.h" | 7 #include "base/compiler_specific.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/process/memory.h" | 9 #include "base/process/memory.h" |
10 #include "base/strings/string_util.h" | 10 #include "base/strings/string_util.h" |
11 #include "base/strings/utf_string_conversions.h" | 11 #include "base/strings/utf_string_conversions.h" |
12 #include "base/win/scoped_gdi_object.h" | 12 #include "base/win/scoped_gdi_object.h" |
13 #include "base/win/scoped_hdc.h" | 13 #include "base/win/scoped_hdc.h" |
14 #include "base/win/scoped_select_object.h" | 14 #include "base/win/scoped_select_object.h" |
15 #include "remoting/host/client_session_control.h" | 15 #include "remoting/host/client_session_control.h" |
16 #include "remoting/host/host_window.h" | 16 #include "remoting/host/host_window.h" |
17 #include "remoting/host/ui_strings.h" | |
18 #include "remoting/host/win/core_resource.h" | 17 #include "remoting/host/win/core_resource.h" |
19 | 18 |
20 namespace remoting { | 19 namespace remoting { |
21 | 20 |
22 namespace { | 21 namespace { |
23 | 22 |
24 const int DISCONNECT_HOTKEY_ID = 1000; | 23 const int DISCONNECT_HOTKEY_ID = 1000; |
25 | 24 |
26 // Maximum length of "Your desktop is shared with ..." message in UTF-16 | 25 // Maximum length of "Your desktop is shared with ..." message in UTF-16 |
27 // characters. | 26 // characters. |
28 const size_t kMaxSharingWithTextLength = 100; | 27 const size_t kMaxSharingWithTextLength = 100; |
29 | 28 |
30 const wchar_t kShellTrayWindowName[] = L"Shell_TrayWnd"; | 29 const wchar_t kShellTrayWindowName[] = L"Shell_TrayWnd"; |
31 const int kWindowBorderRadius = 14; | 30 const int kWindowBorderRadius = 14; |
32 | 31 |
33 // Margin between dialog controls (in dialog units). | 32 // Margin between dialog controls (in dialog units). |
34 const int kWindowTextMargin = 8; | 33 const int kWindowTextMargin = 8; |
35 | 34 |
36 class DisconnectWindowWin : public HostWindow { | 35 class DisconnectWindowWin : public HostWindow { |
37 public: | 36 public: |
38 explicit DisconnectWindowWin(const UiStrings& ui_strings); | 37 DisconnectWindowWin(); |
39 virtual ~DisconnectWindowWin(); | 38 virtual ~DisconnectWindowWin(); |
40 | 39 |
41 // HostWindow overrides. | 40 // HostWindow overrides. |
42 virtual void Start( | 41 virtual void Start( |
43 const base::WeakPtr<ClientSessionControl>& client_session_control) | 42 const base::WeakPtr<ClientSessionControl>& client_session_control) |
44 OVERRIDE; | 43 OVERRIDE; |
45 | 44 |
46 protected: | 45 protected: |
47 static INT_PTR CALLBACK DialogProc(HWND hwnd, UINT message, WPARAM wparam, | 46 static INT_PTR CALLBACK DialogProc(HWND hwnd, UINT message, WPARAM wparam, |
48 LPARAM lparam); | 47 LPARAM lparam); |
(...skipping 12 matching lines...) Expand all Loading... |
61 | 60 |
62 // Trys to position the dialog window above the taskbar. | 61 // Trys to position the dialog window above the taskbar. |
63 void SetDialogPosition(); | 62 void SetDialogPosition(); |
64 | 63 |
65 // Applies localization string and resizes the dialog. | 64 // Applies localization string and resizes the dialog. |
66 bool SetStrings(); | 65 bool SetStrings(); |
67 | 66 |
68 // Used to disconnect the client session. | 67 // Used to disconnect the client session. |
69 base::WeakPtr<ClientSessionControl> client_session_control_; | 68 base::WeakPtr<ClientSessionControl> client_session_control_; |
70 | 69 |
71 // Localized UI strings. | |
72 UiStrings ui_strings_; | |
73 | |
74 // Specifies the remote user name. | 70 // Specifies the remote user name. |
75 std::string username_; | 71 std::string username_; |
76 | 72 |
77 HWND hwnd_; | 73 HWND hwnd_; |
78 bool has_hotkey_; | 74 bool has_hotkey_; |
79 base::win::ScopedGDIObject<HPEN> border_pen_; | 75 base::win::ScopedGDIObject<HPEN> border_pen_; |
80 | 76 |
81 DISALLOW_COPY_AND_ASSIGN(DisconnectWindowWin); | 77 DISALLOW_COPY_AND_ASSIGN(DisconnectWindowWin); |
82 }; | 78 }; |
83 | 79 |
(...skipping 16 matching lines...) Expand all Loading... |
100 base::win::ScopedGetDC dc(control); | 96 base::win::ScopedGetDC dc(control); |
101 base::win::ScopedSelectObject font( | 97 base::win::ScopedSelectObject font( |
102 dc, (HFONT)SendMessage(control, WM_GETFONT, 0, 0)); | 98 dc, (HFONT)SendMessage(control, WM_GETFONT, 0, 0)); |
103 if (!DrawText(dc, text.c_str(), -1, &rect, DT_CALCRECT | DT_SINGLELINE)) | 99 if (!DrawText(dc, text.c_str(), -1, &rect, DT_CALCRECT | DT_SINGLELINE)) |
104 return false; | 100 return false; |
105 | 101 |
106 *width = rect.right; | 102 *width = rect.right; |
107 return true; | 103 return true; |
108 } | 104 } |
109 | 105 |
110 DisconnectWindowWin::DisconnectWindowWin(const UiStrings& ui_strings) | 106 DisconnectWindowWin::DisconnectWindowWin() |
111 : ui_strings_(ui_strings), | 107 : hwnd_(NULL), |
112 hwnd_(NULL), | |
113 has_hotkey_(false), | 108 has_hotkey_(false), |
114 border_pen_(CreatePen(PS_SOLID, 5, | 109 border_pen_(CreatePen(PS_SOLID, 5, |
115 RGB(0.13 * 255, 0.69 * 255, 0.11 * 255))) { | 110 RGB(0.13 * 255, 0.69 * 255, 0.11 * 255))) { |
116 } | 111 } |
117 | 112 |
118 DisconnectWindowWin::~DisconnectWindowWin() { | 113 DisconnectWindowWin::~DisconnectWindowWin() { |
119 EndDialog(); | 114 EndDialog(); |
120 } | 115 } |
121 | 116 |
122 void DisconnectWindowWin::Start( | 117 void DisconnectWindowWin::Start( |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
224 return TRUE; | 219 return TRUE; |
225 } | 220 } |
226 } | 221 } |
227 return FALSE; | 222 return FALSE; |
228 } | 223 } |
229 | 224 |
230 bool DisconnectWindowWin::BeginDialog() { | 225 bool DisconnectWindowWin::BeginDialog() { |
231 DCHECK(CalledOnValidThread()); | 226 DCHECK(CalledOnValidThread()); |
232 DCHECK(!hwnd_); | 227 DCHECK(!hwnd_); |
233 | 228 |
234 // Load the dialog resource so that we can modify the RTL flags if necessary. | |
235 HMODULE module = base::GetModuleFromAddress(&DialogProc); | 229 HMODULE module = base::GetModuleFromAddress(&DialogProc); |
236 HRSRC dialog_resource = | 230 hwnd_ = CreateDialogParam(module, MAKEINTRESOURCE(IDD_DISCONNECT), NULL, |
237 FindResource(module, MAKEINTRESOURCE(IDD_DISCONNECT), RT_DIALOG); | 231 DialogProc, reinterpret_cast<LPARAM>(this)); |
238 if (!dialog_resource) | |
239 return false; | |
240 | |
241 HGLOBAL dialog_template = LoadResource(module, dialog_resource); | |
242 if (!dialog_template) | |
243 return false; | |
244 | |
245 DLGTEMPLATE* dialog_pointer = | |
246 reinterpret_cast<DLGTEMPLATE*>(LockResource(dialog_template)); | |
247 if (!dialog_pointer) | |
248 return false; | |
249 | |
250 // The actual resource type is DLGTEMPLATEEX, but this is not defined in any | |
251 // standard headers, so we treat it as a generic pointer and manipulate the | |
252 // correct offsets explicitly. | |
253 scoped_ptr<unsigned char[]> rtl_dialog_template; | |
254 if (ui_strings_.direction == UiStrings::RTL) { | |
255 unsigned long dialog_template_size = | |
256 SizeofResource(module, dialog_resource); | |
257 rtl_dialog_template.reset(new unsigned char[dialog_template_size]); | |
258 memcpy(rtl_dialog_template.get(), dialog_pointer, dialog_template_size); | |
259 DWORD* rtl_dwords = reinterpret_cast<DWORD*>(rtl_dialog_template.get()); | |
260 rtl_dwords[2] |= (WS_EX_LAYOUTRTL | WS_EX_RTLREADING); | |
261 dialog_pointer = reinterpret_cast<DLGTEMPLATE*>(rtl_dwords); | |
262 } | |
263 | |
264 hwnd_ = CreateDialogIndirectParam(module, dialog_pointer, NULL, | |
265 DialogProc, reinterpret_cast<LPARAM>(this)); | |
266 if (!hwnd_) | 232 if (!hwnd_) |
267 return false; | 233 return false; |
268 | 234 |
269 // Set up handler for Ctrl-Alt-Esc shortcut. | 235 // Set up handler for Ctrl-Alt-Esc shortcut. |
270 if (!has_hotkey_ && RegisterHotKey(hwnd_, DISCONNECT_HOTKEY_ID, | 236 if (!has_hotkey_ && RegisterHotKey(hwnd_, DISCONNECT_HOTKEY_ID, |
271 MOD_ALT | MOD_CONTROL, VK_ESCAPE)) { | 237 MOD_ALT | MOD_CONTROL, VK_ESCAPE)) { |
272 has_hotkey_ = true; | 238 has_hotkey_ = true; |
273 } | 239 } |
274 | 240 |
275 if (!SetStrings()) | 241 if (!SetStrings()) |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
417 return false; | 383 return false; |
418 if (!SetWindowRgn(hwnd_, rgn, TRUE)) | 384 if (!SetWindowRgn(hwnd_, rgn, TRUE)) |
419 return false; | 385 return false; |
420 | 386 |
421 return true; | 387 return true; |
422 } | 388 } |
423 | 389 |
424 } // namespace | 390 } // namespace |
425 | 391 |
426 // static | 392 // static |
427 scoped_ptr<HostWindow> HostWindow::CreateDisconnectWindow( | 393 scoped_ptr<HostWindow> HostWindow::CreateDisconnectWindow() { |
428 const UiStrings& ui_strings) { | 394 return scoped_ptr<HostWindow>(new DisconnectWindowWin()); |
429 return scoped_ptr<HostWindow>(new DisconnectWindowWin(ui_strings)); | |
430 } | 395 } |
431 | 396 |
432 } // namespace remoting | 397 } // namespace remoting |
OLD | NEW |