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 |