// 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 #include #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::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(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); 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