1 // Copyright (c) 2012 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/gfx/x/x11_atom_cache.h" 6 7 #include <X11/Xatom.h> 8 9 #include "base/logging.h" 10 #include "base/memory/scoped_ptr.h" 11 12 namespace ui { 13 14 X11AtomCache::X11AtomCache(Display* xdisplay, const char** to_cache) 15 : xdisplay_(xdisplay), 16 uncached_atoms_allowed_(false) { 17 int cache_count = 0; 18 for (const char** i = to_cache; *i != NULL; i++) 19 cache_count++; 20 21 scoped_ptr< ::Atom[]> cached_atoms(new ::Atom[cache_count]); 22 23 // Grab all the atoms we need now to minimize roundtrips to the X11 server. 24 XInternAtoms(xdisplay_, 25 const_cast<char**>(to_cache), cache_count, False, 26 cached_atoms.get()); 27 28 for (int i = 0; i < cache_count; ++i) 29 cached_atoms_.insert(std::make_pair(to_cache[i], cached_atoms[i])); 30 } 31 32 X11AtomCache::~X11AtomCache() {} 33 34 ::Atom X11AtomCache::GetAtom(const char* name) const { 35 std::map<std::string, ::Atom>::const_iterator it = cached_atoms_.find(name); 36 37 if (uncached_atoms_allowed_ && it == cached_atoms_.end()) { 38 ::Atom atom = XInternAtom(xdisplay_, name, false); 39 cached_atoms_.insert(std::make_pair(name, atom)); 40 return atom; 41 } 42 43 CHECK(it != cached_atoms_.end()) << " Atom " << name << " not found"; 44 return it->second; 45 } 46 47 } // namespace ui 48