root/ui/base/x/root_window_property_watcher_x.cc

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. GetInstance
  2. OnWindowXEvent

// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "ui/base/x/root_window_property_watcher_x.h"

#include <gdk/gdk.h>
#include <gdk/gdkx.h>

#include "base/memory/singleton.h"
#include "ui/base/x/active_window_watcher_x.h"
#include "ui/base/x/work_area_watcher_x.h"

namespace ui {

namespace internal {

// static
RootWindowPropertyWatcherX* RootWindowPropertyWatcherX::GetInstance() {
  return Singleton<RootWindowPropertyWatcherX>::get();
}

RootWindowPropertyWatcherX::RootWindowPropertyWatcherX() {
  GdkWindow* root = gdk_get_default_root_window();

  // Set up X Event filter to listen for PropertyChange X events.
  // Don't use XSelectInput directly here, as gdk internally seems to cache the
  // mask and reapply XSelectInput after this, resetting any mask we set here.
  gdk_window_set_events(root,
                        static_cast<GdkEventMask>(gdk_window_get_events(root) |
                                                  GDK_PROPERTY_CHANGE_MASK));
  gdk_window_add_filter(root,
                        &RootWindowPropertyWatcherX::OnWindowXEventThunk,
                        this);
}

RootWindowPropertyWatcherX::~RootWindowPropertyWatcherX() {
  gdk_window_remove_filter(NULL,
                           &RootWindowPropertyWatcherX::OnWindowXEventThunk,
                           this);
}

GdkFilterReturn RootWindowPropertyWatcherX::OnWindowXEvent(
    GdkXEvent* xevent, GdkEvent* event) {
  XEvent* xev = static_cast<XEvent*>(xevent);

  if (xev->xany.type == PropertyNotify) {
    if (xev->xproperty.atom == ActiveWindowWatcherX::GetPropertyAtom())
      ActiveWindowWatcherX::Notify();
    else if (xev->xproperty.atom == WorkAreaWatcherX::GetPropertyAtom())
      WorkAreaWatcherX::Notify();
  }

  return GDK_FILTER_CONTINUE;
}

}  // namespace internal

}  // namespace ui

/* [<][>][^][v][top][bottom][index][help] */