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