0

Lazily create the clipboard owner window. CreateWindow can take ~.5ms, and we don't need to do this until the clipboard is actually used (ctrl-c/ctrl-v).

Review URL: http://codereview.chromium.org/11398

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@5963 0039d316-1c4b-4281-b951-d872f2087c98
This commit is contained in:
deanm@chromium.org
2008-11-25 03:48:48 +00:00
parent 85624c55e5
commit ca1a894970
2 changed files with 26 additions and 13 deletions

@ -175,7 +175,12 @@ class Clipboard {
// Free a handle depending on its type (as intuited from format)
static void FreeData(FormatType format, HANDLE data);
HWND clipboard_owner_;
// Return the window that should be the clipboard owner, creating it
// if neccessary. Marked const for lazily initialization by const methods.
HWND GetClipboardWindow() const;
// Mark this as mutable so const methods can still do lazy initialization.
mutable HWND clipboard_owner_;
#elif defined(OS_LINUX)
// Data is stored in the |clipboard_data_| map until it is saved to the system
// clipboard. The Store* functions save data to the |clipboard_data_| map. The

@ -131,15 +131,12 @@ Clipboard::Clipboard() {
wcex.lpszClassName = L"ClipboardOwnerWindowClass";
::RegisterClassEx(&wcex);
clipboard_owner_ = ::CreateWindow(L"ClipboardOwnerWindowClass",
L"ClipboardOwnerWindow",
0, 0, 0, 0, 0,
HWND_MESSAGE,
0, 0, 0);
clipboard_owner_ = NULL;
}
Clipboard::~Clipboard() {
::DestroyWindow(clipboard_owner_);
if (clipboard_owner_)
::DestroyWindow(clipboard_owner_);
clipboard_owner_ = NULL;
}
@ -150,7 +147,7 @@ void Clipboard::WriteObjects(const ObjectMap& objects) {
void Clipboard::WriteObjects(const ObjectMap& objects,
base::ProcessHandle process) {
ScopedClipboard clipboard;
if (!clipboard.Acquire(clipboard_owner_))
if (!clipboard.Acquire(GetClipboardWindow()))
return;
::EmptyClipboard();
@ -385,7 +382,7 @@ void Clipboard::ReadText(std::wstring* result) const {
// Acquire the clipboard.
ScopedClipboard clipboard;
if (!clipboard.Acquire(clipboard_owner_))
if (!clipboard.Acquire(GetClipboardWindow()))
return;
HANDLE data = ::GetClipboardData(CF_UNICODETEXT);
@ -406,7 +403,7 @@ void Clipboard::ReadAsciiText(std::string* result) const {
// Acquire the clipboard.
ScopedClipboard clipboard;
if (!clipboard.Acquire(clipboard_owner_))
if (!clipboard.Acquire(GetClipboardWindow()))
return;
HANDLE data = ::GetClipboardData(CF_TEXT);
@ -426,7 +423,7 @@ void Clipboard::ReadHTML(std::wstring* markup, std::string* src_url) const {
// Acquire the clipboard.
ScopedClipboard clipboard;
if (!clipboard.Acquire(clipboard_owner_))
if (!clipboard.Acquire(GetClipboardWindow()))
return;
HANDLE data = ::GetClipboardData(GetHtmlFormatType());
@ -450,7 +447,7 @@ void Clipboard::ReadBookmark(std::wstring* title, std::string* url) const {
// Acquire the clipboard.
ScopedClipboard clipboard;
if (!clipboard.Acquire(clipboard_owner_))
if (!clipboard.Acquire(GetClipboardWindow()))
return;
HANDLE data = ::GetClipboardData(GetUrlWFormatType());
@ -489,7 +486,7 @@ void Clipboard::ReadFiles(std::vector<std::wstring>* files) const {
files->clear();
ScopedClipboard clipboard;
if (!clipboard.Acquire(clipboard_owner_))
if (!clipboard.Acquire(GetClipboardWindow()))
return;
HDROP drop = static_cast<HDROP>(::GetClipboardData(CF_HDROP));
@ -605,3 +602,14 @@ void Clipboard::FreeData(FormatType format, HANDLE data) {
else
::GlobalFree(data);
}
HWND Clipboard::GetClipboardWindow() const {
if (!clipboard_owner_) {
clipboard_owner_ = ::CreateWindow(L"ClipboardOwnerWindowClass",
L"ClipboardOwnerWindow",
0, 0, 0, 0, 0,
HWND_MESSAGE,
0, 0, 0);
}
return clipboard_owner_;
}