1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "ui/base/x/x11_foreign_window_manager.h" 6 7 #include <X11/Xlib.h> 8 9 #include "base/memory/singleton.h" 10 11 namespace ui { 12 13 // static 14 XForeignWindowManager* XForeignWindowManager::GetInstance() { 15 return Singleton<XForeignWindowManager>::get(); 16 } 17 18 int XForeignWindowManager::RequestEvents(XID xid, long event_mask) { 19 request_map_[xid].push_back(Request(next_request_id_, event_mask)); 20 UpdateSelectedEvents(xid); 21 return next_request_id_++; 22 } 23 24 void XForeignWindowManager::CancelRequest(int request_id) { 25 for (std::map<XID, RequestVector>::iterator map_it = request_map_.begin(); 26 map_it != request_map_.end(); ++map_it) { 27 RequestVector* vector = &map_it->second; 28 for (RequestVector::iterator vector_it = vector->begin(); 29 vector_it != vector->end(); ++vector_it) { 30 if (vector_it->request_id == request_id) { 31 vector->erase(vector_it); 32 UpdateSelectedEvents(map_it->first); 33 if (vector->empty()) 34 request_map_.erase(map_it); 35 return; 36 } 37 } 38 } 39 } 40 41 void XForeignWindowManager::OnWindowDestroyed(XID xid) { 42 request_map_.erase(xid); 43 } 44 45 XForeignWindowManager::XForeignWindowManager() : next_request_id_(0) { 46 } 47 48 XForeignWindowManager::~XForeignWindowManager() { 49 } 50 51 void XForeignWindowManager::UpdateSelectedEvents(XID xid) { 52 std::map<XID, RequestVector>::iterator it = request_map_.find(xid); 53 if (it == request_map_.end()) 54 return; 55 56 long event_mask = NoEventMask; 57 const RequestVector& list = it->second; 58 for (size_t i = 0; i < list.size(); ++i) 59 event_mask |= list[i].event_mask; 60 61 XSelectInput(gfx::GetXDisplay(), xid, event_mask); 62 } 63 64 XForeignWindowManager::Request::Request(int request_id, long event_mask) 65 : request_id(request_id), 66 event_mask(event_mask) { 67 } 68 69 XForeignWindowManager::Request::~Request() { 70 } 71 72 } // namespace ui 73