Chromium Code Reviews| 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 |