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 11namespace ui { 12 13// static 14XForeignWindowManager* XForeignWindowManager::GetInstance() { 15 return Singleton<XForeignWindowManager>::get(); 16} 17 18int 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 24void 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 41void XForeignWindowManager::OnWindowDestroyed(XID xid) { 42 request_map_.erase(xid); 43} 44 45XForeignWindowManager::XForeignWindowManager() : next_request_id_(0) { 46} 47 48XForeignWindowManager::~XForeignWindowManager() { 49} 50 51void 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 64XForeignWindowManager::Request::Request(int request_id, long event_mask) 65 : request_id(request_id), 66 event_mask(event_mask) { 67} 68 69XForeignWindowManager::Request::~Request() { 70} 71 72} // namespace ui 73