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

Unified Diff: ui/base/x/x11_foreign_window_manager.cc

Issue 397223002: Enable copying long text to Chrome and pasting long text from Chrome (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 5 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 side-by-side diff with in-line comments
Download patch
Index: ui/base/x/x11_foreign_window_manager.cc
diff --git a/ui/base/x/x11_foreign_window_manager.cc b/ui/base/x/x11_foreign_window_manager.cc
new file mode 100644
index 0000000000000000000000000000000000000000..a663c2d54359c46fbf76ee177e6a0de2f7b2e41d
--- /dev/null
+++ b/ui/base/x/x11_foreign_window_manager.cc
@@ -0,0 +1,74 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/base/x/x11_foreign_window_manager.h"
+
+#include <X11/Xlib.h>
+
+#include "base/memory/singleton.h"
+
+namespace ui {
+
+// static
+XForeignWindowManager* XForeignWindowManager::GetInstance() {
+ return Singleton<XForeignWindowManager>::get();
+}
+
+int XForeignWindowManager::RequestEvents(XID xid, long event_mask) {
+ request_map_[xid].push_back(Request(next_request_id_, event_mask));
+ UpdateSelectedEvents(xid);
+ return next_request_id_++;
+}
+
+void XForeignWindowManager::CancelRequest(int request_id) {
+ for (std::map<XID, RequestList>::iterator map_it = request_map_.begin();
+ map_it != request_map_.end(); ++map_it) {
+ RequestList* list = &map_it->second;
+ for (RequestList::iterator list_it = list->begin();
+ list_it != list->end(); ++list_it) {
+ if (list_it->request_id == request_id) {
+ XID xid = map_it->first;
+
+ list->erase(list_it);
+ if (list->empty())
+ request_map_.erase(map_it);
+ UpdateSelectedEvents(xid);
+ return;
+ }
+ }
+ }
+}
+
+void XForeignWindowManager::OnWindowDestroyed(XID xid) {
+ request_map_.erase(xid);
+}
+
+XForeignWindowManager::XForeignWindowManager() : next_request_id_(0) {
+}
+
+XForeignWindowManager::~XForeignWindowManager() {
+}
+
+void XForeignWindowManager::UpdateSelectedEvents(XID xid) {
+ std::map<XID, RequestList>::iterator it = request_map_.find(xid);
+ if (it == request_map_.end())
Daniel Erat 2014/07/25 19:38:44 i think there's a bug here. when removing the last
pkotwicz 2014/07/26 20:09:53 You're right. Thanks for catching the bug!
+ return;
+
+ long event_mask = NoEventMask;
+ const RequestList& list = it->second;
+ for (size_t i = 0; i < list.size(); ++i)
+ event_mask |= list[i].event_mask;
+
+ XSelectInput(gfx::GetXDisplay(), xid, event_mask);
Daniel Erat 2014/07/25 19:38:44 do we crash in response to X errors? i'm wondering
pkotwicz 2014/07/26 20:09:53 We do not crash. We just log errors via ui::LogErr
+}
+
+XForeignWindowManager::Request::Request(int request_id, long event_mask)
+ : request_id(request_id),
+ event_mask(event_mask) {
+}
+
+XForeignWindowManager::Request::~Request() {
+}
+
+} // namespace ui

Powered by Google App Engine
This is Rietveld 408576698