Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(162)

Side by Side Diff: ui/base/x/x11_foreign_window_manager.cc

Issue 2313033002: Refactor X11ForeignWindowManager (Reland) (Closed)
Patch Set: Rebase Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ui/base/x/x11_foreign_window_manager.h ('k') | ui/base/x/x11_window_event_manager.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
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 <stddef.h>
8 #include <X11/Xlib.h>
9
10 #include "base/compiler_specific.h"
11 #include "base/memory/singleton.h"
12
13 namespace ui {
14
15 // static
16 XForeignWindowManager* XForeignWindowManager::GetInstance() {
17 return base::Singleton<XForeignWindowManager>::get();
18 }
19
20 int XForeignWindowManager::RequestEvents(XID xid, long event_mask) {
21 request_map_[xid].push_back(Request(next_request_id_, event_mask));
22 UpdateSelectedEvents(xid);
23 return next_request_id_++;
24 }
25
26 void XForeignWindowManager::CancelRequest(int request_id) {
27 for (std::map<XID, RequestVector>::iterator map_it = request_map_.begin();
28 map_it != request_map_.end(); ++map_it) {
29 RequestVector* vector = &map_it->second;
30 for (RequestVector::iterator vector_it = vector->begin();
31 vector_it != vector->end(); ++vector_it) {
32 if (vector_it->request_id == request_id) {
33 vector->erase(vector_it);
34 UpdateSelectedEvents(map_it->first);
35 if (vector->empty())
36 request_map_.erase(map_it);
37 return;
38 }
39 }
40 }
41 }
42
43 void XForeignWindowManager::OnWindowDestroyed(XID xid) {
44 request_map_.erase(xid);
45 }
46
47 XForeignWindowManager::XForeignWindowManager() : next_request_id_(0) {
48 }
49
50 XForeignWindowManager::~XForeignWindowManager() {
51 }
52
53 void XForeignWindowManager::UpdateSelectedEvents(XID xid) {
54 std::map<XID, RequestVector>::iterator it = request_map_.find(xid);
55 if (it == request_map_.end())
56 return;
57
58 long event_mask = NoEventMask;
59 const RequestVector& list = it->second;
60 for (size_t i = 0; i < list.size(); ++i)
61 event_mask |= list[i].event_mask;
62
63 XSelectInput(gfx::GetXDisplay(), xid, event_mask);
64 }
65
66 XForeignWindowManager::Request::Request(int request_id, long event_mask)
67 : request_id(request_id),
68 event_mask(event_mask) {
69 }
70
71 XForeignWindowManager::Request::~Request() {
72 }
73
74 } // namespace ui
OLDNEW
« no previous file with comments | « ui/base/x/x11_foreign_window_manager.h ('k') | ui/base/x/x11_window_event_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698