// Copyright (c) 2011 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_LEGACY_WINDOW_MANAGER_WM_IPC_H_ #define CHROME_BROWSER_CHROMEOS_LEGACY_WINDOW_MANAGER_WM_IPC_H_ #pragma once #include #include #include #include #include #include "base/logging.h" #include "third_party/cros_system_api/window_manager/chromeos_wm_ipc_enums.h" typedef unsigned long Atom; typedef unsigned long XID; namespace base { template struct DefaultLazyInstanceTraits; } namespace gfx { class Rect; } namespace chromeos { class WmIpc { public: enum AtomType { ATOM_CHROME_LAYOUT_MODE = 0, ATOM_CHROME_LOGGED_IN, ATOM_CHROME_STATE, ATOM_CHROME_STATE_COLLAPSED_PANEL, ATOM_CHROME_STATE_STATUS_HIDDEN, ATOM_CHROME_STATUS_BOUNDS, 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(); WmIpcLayoutMode layout_mode() const { return layout_mode_; } // 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* params); // Gets the string name of an atom from the AtomType enum. std::string GetAtomName(AtomType type) const; // 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* params); // Gets the set of atoms contained in a window's _CHROME_STATE property. // Returns false if the property isn't set. bool GetWindowState(GtkWidget* widget, std::set* atom_types); // 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); // Handle an event reporting a property change on the root window. void HandleRootWindowPropertyEvent(const GdkEventProperty& 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); // Sets a _CHROME_STATUS_BOUNDS property on toplevel window |widget| // describing the status area's bounds within the window. void SetStatusBoundsProperty(GtkWidget* widget, const gfx::Rect& bounds); // Sends a message to the window manager notifying it that we're signing out. void NotifyAboutSignout(); private: friend struct base::DefaultLazyInstanceTraits; WmIpc(); ~WmIpc(); // Initializes 'wm_' and sends 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(); // Updates |layout_mode_| based on the current value of the root window's // _CHROME_LAYOUT_MODE property. void FetchLayoutModeProperty(); // Maps between our Atom enum and the X server's atom IDs and from the // server's IDs to atoms' string names. std::map type_to_atom_; std::map atom_to_type_; std::map 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_; // The current value of the root window's _CHROME_LAYOUT_MODE property. WmIpcLayoutMode layout_mode_; DISALLOW_COPY_AND_ASSIGN(WmIpc); }; } // namespace chromeos #endif // CHROME_BROWSER_CHROMEOS_LEGACY_WINDOW_MANAGER_WM_IPC_H_