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

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

Issue 2326223002: Revert of Refactor X11ForeignWindowManager (Closed)
Patch Set: 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
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_window_event_manager.h"
6
7 #include <stddef.h>
8 #include <X11/Xlib.h>
9 #include <X11/Xlib-xcb.h>
10 #include <xcb/xcb.h>
11
12 #include "base/compiler_specific.h"
13 #include "base/memory/singleton.h"
14
15 namespace ui {
16
17 XScopedEventSelector::XScopedEventSelector(XID xid, uint32_t event_mask)
18 : xid_(xid), event_mask_(event_mask) {
19 XWindowEventManager::GetInstance()->SelectEvents(xid_, event_mask_);
20 }
21
22 XScopedEventSelector::~XScopedEventSelector() {
23 XWindowEventManager::GetInstance()->DeselectEvents(xid_, event_mask_);
24 }
25
26 // static
27 XWindowEventManager* XWindowEventManager::GetInstance() {
28 return base::Singleton<XWindowEventManager>::get();
29 }
30
31 class XWindowEventManager::MultiMask {
32 public:
33 MultiMask() {
34 for (int i = 0; i < kMaskSize; i++)
35 mask_bits_[i] = 0;
36 }
37
38 ~MultiMask() {}
39
40 void AddMask(uint32_t mask) {
41 for (int i = 0; i < kMaskSize; i++) {
42 if (mask & (1 << i))
43 mask_bits_[i]++;
44 }
45 }
46
47 void RemoveMask(uint32_t mask) {
48 for (int i = 0; i < kMaskSize; i++) {
49 if (mask & (1 << i))
50 DCHECK(mask_bits_[i]);
51 mask_bits_[i]--;
52 }
53 }
54
55 uint32_t ToMask() const {
56 uint32_t mask = NoEventMask;
57 for (int i = 0; i < kMaskSize; i++) {
58 if (mask_bits_[i])
59 mask |= (1 << i);
60 }
61 return mask;
62 }
63
64 private:
65 static constexpr auto kMaskSize = 25;
66
67 int mask_bits_[kMaskSize];
68
69 DISALLOW_COPY_AND_ASSIGN(MultiMask);
70 };
71
72 XWindowEventManager::XWindowEventManager() {}
73 XWindowEventManager::~XWindowEventManager() {}
74
75 void XWindowEventManager::SelectEvents(XID xid, uint32_t event_mask) {
76 std::unique_ptr<MultiMask>& mask = mask_map_[xid];
77 if (!mask)
78 mask.reset(new MultiMask());
79 uint32_t old_mask = mask_map_[xid]->ToMask();
80 mask->AddMask(event_mask);
81 AfterMaskChanged(xid, old_mask);
82 }
83
84 void XWindowEventManager::DeselectEvents(XID xid, uint32_t event_mask) {
85 DCHECK(mask_map_.find(xid) != mask_map_.end());
86 std::unique_ptr<MultiMask>& mask = mask_map_[xid];
87 uint32_t old_mask = mask->ToMask();
88 mask->RemoveMask(event_mask);
89 AfterMaskChanged(xid, old_mask);
90 }
91
92 void XWindowEventManager::AfterMaskChanged(XID xid, uint32_t old_mask) {
93 uint32_t new_mask = mask_map_[xid]->ToMask();
94 if (new_mask == old_mask)
95 return;
96
97 XDisplay* display = gfx::GetXDisplay();
98 xcb_connection_t* connection = XGetXCBConnection(display);
99 auto cookie = xcb_change_window_attributes(connection, xid, XCB_CW_EVENT_MASK,
100 &new_mask);
101 // Window |xid| may already be destroyed at this point, so the
102 // change_attributes request may give a BadWindow error. In this case, just
103 // ignore the error.
104 xcb_discard_reply(connection, cookie.sequence);
105
106 if (new_mask == NoEventMask)
107 mask_map_.erase(xid);
108 }
109
110 } // namespace ui
OLDNEW
« no previous file with comments | « ui/base/x/x11_window_event_manager.h ('k') | ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698