Home | History | Annotate | Download | only in x
      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