Home | History | Annotate | Download | only in x
      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/base/x/x11_atom_cache.h"
      6 
      7 #include <X11/Xatom.h>
      8 
      9 #include "base/memory/scoped_ptr.h"
     10 #include "base/message_loop/message_pump_aurax11.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