// Copyright (c) 2010 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. #ifndef CHROME_BROWSER_CHROMEOS_WM_IPC_H_ #define CHROME_BROWSER_CHROMEOS_WM_IPC_H_ #pragma once #include <gtk/gtk.h> #include <map> #include <string> #include <vector> #include "base/logging.h" #include "third_party/cros/chromeos_wm_ipc_enums.h" typedef unsigned long Atom; typedef unsigned long XID; namespace base { template <typename T> struct DefaultLazyInstanceTraits; } namespace chromeos { class WmIpc { public: enum AtomType { ATOM_CHROME_LOGGED_IN = 0, ATOM_CHROME_WINDOW_TYPE, ATOM_CHROME_WM_MESSAGE, ATOM_MANAGER, ATOM_STRING, ATOM_UTF8_STRING, ATOM_WM_S0, kNumAtoms, }; struct Message { public: Message() { Init(WM_IPC_MESSAGE_UNKNOWN); } // WmIpcMessageType is defined in chromeos_wm_ipc_enums.h. explicit Message(WmIpcMessageType type) { Init(type); } WmIpcMessageType type() const { return type_; } void set_type(WmIpcMessageType type) { type_ = type; } inline int max_params() const { return arraysize(params_); } long param(int index) const { DCHECK_GE(index, 0); DCHECK_LT(index, max_params()); return params_[index]; } void set_param(int index, long value) { DCHECK_GE(index, 0); DCHECK_LT(index, max_params()); params_[index] = value; } private: // Common initialization code shared between constructors. void Init(WmIpcMessageType type) { set_type(type); for (int i = 0; i < max_params(); ++i) { set_param(i, 0); } } // Type of message that was sent. WmIpcMessageType type_; // Type-specific data. This is bounded by the number of 32-bit values // that we can pack into a ClientMessageEvent -- it holds five, but we // use the first one to store the message type. long params_[4]; }; // Returns the single instance of WmIpc. static WmIpc* instance(); // Gets or sets a property describing a window's type. // WmIpcMessageType is defined in chromeos_wm_ipc_enums.h. Type-specific // parameters may also be supplied. The caller is responsible for trapping // errors from the X server. bool SetWindowType(GtkWidget* widget, WmIpcWindowType type, const std::vector<int>* params); // Gets the type of the window, and any associated parameters. The // caller is responsible for trapping errors from the X server. If // the parameters are not interesting to the caller, NULL may be // passed for |params|. WmIpcWindowType GetWindowType(GtkWidget* widget, std::vector<int>* params); // Sends a message to the WM. void SendMessage(const Message& msg); // If |event| is a valid Message it is decoded into |msg| and true is // returned. If false is returned, |event| is not a valid Message. bool DecodeMessage(const GdkEventClient& event, Message* msg); // Handles ClientMessage events that weren't decodable using DecodeMessage(). // Specifically, this catches messages about the WM_S0 selection that get sent // when a window manager process starts (so that we can re-run InitWmInfo()). // See ICCCM 2.8 for more info about MANAGER selections. void HandleNonChromeClientMessageEvent(const GdkEventClient& event); // Sets a _CHROME_LOGGED_IN property on the root window describing whether // the user is currently logged in or not. void SetLoggedInProperty(bool logged_in); // Sends a message to the window manager notifying it that we're signing out. void NotifyAboutSignout(); private: friend struct base::DefaultLazyInstanceTraits<WmIpc>; WmIpc(); // Initialize 'wm_' and send the window manager a message telling it the // version of the IPC protocol that we support. This is called in our // constructor, but needs to be re-run if the window manager gets restarted. void InitWmInfo(); // Maps from our Atom enum to the X server's atom IDs and from the // server's IDs to atoms' string names. These maps aren't necessarily in // sync; 'atom_to_xatom_' is constant after the constructor finishes but // GetName() caches additional string mappings in 'xatom_to_string_'. std::map<AtomType, Atom> type_to_atom_; std::map<Atom, std::string> atom_to_string_; // Cached value of type_to_atom_[ATOM_CHROME_WM_MESSAGE]. Atom wm_message_atom_; // Handle to the wm. Used for sending messages. XID wm_; DISALLOW_COPY_AND_ASSIGN(WmIpc); }; } // namespace chromeos #endif // CHROME_BROWSER_CHROMEOS_WM_IPC_H_