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:
@ -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_;
|
||||
}
|
||||
|
Reference in New Issue
Block a user