// -*- Mode: C++; indent-tabs-mode: nil; tab-width: 2 -*- /* * Copyright (C) 2010-2012 Canonical Ltd * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * Authored by: Jason Smith */ #ifndef UNITYSHARED_PLUGINADAPTER_H #define UNITYSHARED_PLUGINADAPTER_H /* Compiz */ #include #include #include #include "XWindowManager.h" namespace unity { typedef struct { unsigned long flags; unsigned long functions; unsigned long decorations; long input_mode; unsigned long status; } MotifWmHints, MwmHints; class MultiActionList { public: MultiActionList() : primary_action_(nullptr) {} void Initiate(std::string const& name, CompOption::Vector const& extra_args = CompOption::Vector(), int state = 0) const; void InitiateAll(CompOption::Vector const& extra_args = CompOption::Vector(), int state = 0) const; void TerminateAll(CompOption::Vector const& extra_args = CompOption::Vector()) const; void AddNewAction(std::string const& name, CompAction*, bool primary); void RemoveAction(std::string const& name); bool HasPrimary() const; private: CompAction* GetAction(std::string const& name) const; CompAction* primary_action_; std::map actions_; }; class PluginAdapter : public sigc::trackable, public XWindowManager { public: // You shouldn't get the PluginAdapter if you really want a WindowManager. // The PluginAdapter::Default should really only be called from within unityshell plugin. static PluginAdapter& Default(); static void Initialize(CompScreen* screen); nux::Property bias_active_to_viewport; ~PluginAdapter(); void SetScaleAction(MultiActionList& scale); void SetExpoAction(MultiActionList& expo); void SetShowHandlesAction(CompAction* action) { _grab_show_action = action; } void SetHideHandlesAction(CompAction* action) { _grab_hide_action = action; } void SetToggleHandlesAction(CompAction* action) { _grab_toggle_action = action; } void OnWindowClosed (CompWindow *); void OnScreenGrabbed(); void OnScreenUngrabbed(); void OnShowDesktop (); void OnLeaveDesktop (); void UpdateShowDesktopState(); void TerminateScale(); bool IsScaleActive() const; bool IsScaleActiveForGroup() const; void InitiateExpo(); void TerminateExpo(); bool IsExpoActive() const; bool IsWallActive() const; bool IsAnyWindowMoving() const override; void ShowGrabHandles(CompWindow* window, bool use_timer); void HideGrabHandles(CompWindow* window); void ToggleGrabHandles(CompWindow* window); void Notify(CompWindow* window, CompWindowNotify notify); void NotifyMoved(CompWindow* window, int x, int y); void NotifyResized(CompWindow* window, int x, int y, int w, int h); void NotifyStateChange(CompWindow* window, unsigned int state, unsigned int last_state); void NotifyCompizEvent(const char* plugin, const char* event, CompOption::Vector& option); void NotifyNewDecorationState(Window xid); Window GetActiveWindow() const; std::vector GetWindowsInStackingOrder() const override; void Decorate(Window xid) const; void Undecorate(Window xid) const; // WindowManager implementation bool IsWindowMaximized(Window window_id) const; bool IsWindowVerticallyMaximized(Window window_id) const; bool IsWindowHorizontallyMaximized(Window window_id) const; bool IsWindowDecorated(Window window_id) const; bool IsWindowOnCurrentDesktop(Window window_id) const; bool IsWindowObscured(Window window_id) const; bool IsWindowMapped(Window window_id) const; bool IsWindowVisible(Window window_id) const; bool IsWindowOnTop(Window window_id) const; bool IsWindowClosable(Window window_id) const; bool IsWindowMinimized(Window window_id) const; bool IsWindowMinimizable(Window window_id) const; bool IsWindowMaximizable(Window window_id) const; bool HasWindowDecorations(Window window_id) const; void Maximize(Window window_id); void LeftMaximize(Window window_id); void RightMaximize(Window window_id); void Restore(Window window_id); void RestoreAt(Window window_id, int x, int y); void Minimize(Window window_id); void UnMinimize(Window window_id); void Close(Window window_id); void Activate(Window window_id); void Raise(Window window_id); void Lower(Window window_id); void RestackBelow(Window window_id, Window sibiling_id) override; void ShowDesktop(); bool InShowDesktop() const; void SetWindowIconGeometry(Window window, nux::Geometry const& geo); void FocusWindowGroup(std::vector const& windows, FocusVisibility, int monitor = -1, bool only_top_win = true); bool ScaleWindowGroup(std::vector const& windows, int state, bool force); bool IsScreenGrabbed() const; bool IsViewPortSwitchStarted() const; uint64_t GetWindowActiveNumber(Window window_id) const; bool MaximizeIfBigEnough(CompWindow* window) const; int GetWindowMonitor(Window window_id) const; nux::Geometry GetWindowGeometry(Window window_id) const; nux::Geometry GetWindowSavedGeometry(Window window_id) const; nux::Geometry GetScreenGeometry() const; nux::Geometry GetWorkAreaGeometry(Window window_id = 0) const; nux::Size GetWindowDecorationSize(Window window_id, Edge) const; std::string GetWindowName(Window window_id) const; void CheckWindowIntersections(nux::Geometry const& region, bool &active, bool &any); int WorkspaceCount() const; nux::Point GetCurrentViewport() const override; void SetViewportSize(int horizontal, int vertical) override; int GetViewportHSize() const override; int GetViewportVSize() const override; void SetCoverageAreaBeforeAutomaximize(float area); bool SaveInputFocus(); bool RestoreInputFocus(); void MoveResizeWindow(Window window_id, nux::Geometry geometry); Window GetTopWindowAbove(Window xid) const; void MoveResizeWindow(guint32 xid, nux::Geometry geometry); protected: PluginAdapter(CompScreen* screen); void AddProperties(GVariantBuilder* builder); private: std::string MatchStringForXids(std::vector const& windows); void InitiateScale(std::string const& match, int state = 0); bool CheckWindowIntersection(nux::Geometry const& region, CompWindow* window) const; void SetMwmWindowHints(Window xid, MotifWmHints* new_hints) const; unsigned long GetMwnDecorations(Window xid) const; Window GetTopMostValidWindowInViewport() const; bool IsCurrentViewportEmpty() const; std::string GetTextProperty(Window xid, Atom atom) const; std::string GetUtf8Property(Window xid, Atom atom) const; std::vector GetCardinalProperty(Window xid, Atom atom) const; void VerticallyMaximizeWindowAt(CompWindow* window, nux::Geometry const& geo); CompScreen* m_Screen; MultiActionList m_ExpoActionList; MultiActionList m_ScaleActionList; bool _spread_state; bool _spread_windows_state; bool _expo_state; bool _vp_switch_started; CompAction* _grab_show_action; CompAction* _grab_hide_action; CompAction* _grab_toggle_action; float _coverage_area_before_automaximize; bool _in_show_desktop; CompWindow* _last_focused_window; mutable std::map _window_decoration_state; }; } #endif