// -*- Mode: C++; indent-tabs-mode: nil; tab-width: 2 -*- /* * Copyright (C) 2010 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 LAUNCHERICON_H #define LAUNCHERICON_H #include #include #include #include #include #include #include #include "AbstractLauncherIcon.h" #include "MultiMonitor.h" #include "Tooltip.h" #include "QuicklistView.h" #include "LauncherEntryRemote.h" #include "unity-shared/TimeUtil.h" namespace unity { namespace launcher { class Launcher; class LauncherIcon : public AbstractLauncherIcon { NUX_DECLARE_OBJECT_TYPE(LauncherIcon, AbstractLauncherIcon); public: typedef nux::ObjectPtr BaseTexturePtr; LauncherIcon(IconType type); void SetShortcut(guint64 shortcut); guint64 GetShortcut(); void SetSortPriority(int priority); void RecvMouseEnter(int monitor); void RecvMouseLeave(int monitor); void RecvMouseDown(int button, int monitor, unsigned long key_flags = 0); void RecvMouseUp(int button, int monitor, unsigned long key_flags = 0); void RecvMouseClick(int button, int monitor, unsigned long key_flags = 0); void HideTooltip(); void PromptHideTooltip(); void ShowTooltip(); bool OpenQuicklist(bool select_first_item = false, int monitor = -1, bool restore_input_focus = false); void CloseQuicklist(); void SetCenter(nux::Point3 const& center, int parent_monitor); void ResetCenters(int monitor = -1); nux::Point3 GetCenter(int monitor); void Activate(ActionArg arg); void OpenInstance(ActionArg arg); void SaveCenter(); nux::Point3 GetSavedCenter(int monitor); int SortPriority(); void SetOrder(int order); WindowList Windows() { return WindowList(); } WindowList WindowsOnViewport() { return WindowList(); } WindowList WindowsForMonitor(int monitor) { return WindowList(); } bool WindowVisibleOnMonitor(int monitor) const; bool WindowVisibleOnViewport() const; size_t WindowsVisibleOnMonitor(int monitor) const; size_t WindowsVisibleOnViewport() const; float PresentUrgency(); float GetProgress(); void SetEmblemIconName(std::string const& name); void SetEmblemText(std::string const& text); void DeleteEmblem(); virtual bool ShowInSwitcher(bool current) { return false; }; virtual bool AllowDetailViewInSwitcher() const override { return false; } virtual uint64_t SwitcherPriority() { return 0; } bool GetQuirk(Quirk quirk, int monitor = -1) const; void SetQuirk(Quirk quirk, bool value, int monitor = -1); float GetQuirkProgress(Quirk quirk, int monitor) const; void SetQuirkDuration(Quirk quirk, unsigned duration, int monitor = -1); void SkipQuirkAnimation(Quirk quirk, int monitor = -1); IconType GetIconType() const; virtual nux::Color BackgroundColor() const; virtual nux::Color GlowColor(); std::string RemoteUri() const { return GetRemoteUri(); } nux::BaseTexture* TextureForSize(int size); nux::BaseTexture* Emblem() const override; nux::BaseTexture* CountTexture(double scale) override; MenuItemsVector Menus(); unsigned Count() const; void InsertEntryRemote(LauncherEntryRemote::Ptr const&); void SelectEntryRemote(LauncherEntryRemote::Ptr const&); void RemoveEntryRemote(LauncherEntryRemote::Ptr const&); nux::DndAction QueryAcceptDrop(DndData const& dnd_data) { return OnQueryAcceptDrop(dnd_data); } bool ShouldHighlightOnDrag(DndData const& dnd_data) { return OnShouldHighlightOnDrag(dnd_data); } void AcceptDrop(DndData const& dnd_data) { return OnAcceptDrop(dnd_data); } void SendDndEnter() { OnDndEnter(); } void SendDndLeave() { OnDndLeave(); } virtual std::string DesktopFile() const { return std::string(); } virtual bool IsSticky() const { return _sticky; } virtual bool IsVisible() const { return GetQuirk(Quirk::VISIBLE); } virtual bool IsVisibleOnMonitor(int monitor) const; virtual void SetVisibleOnMonitor(int monitor, bool visible); virtual void AboutToRemove() {} virtual void Stick(bool save = true); virtual void UnStick(); virtual glib::Object GetRemoteMenus() const; void PerformScroll(ScrollDirection direction, Time timestamp) override; protected: std::vector GetCenters(); std::pair GetCenterForMonitor(int monitor) const; std::string GetName() const; void AddProperties(debug::IntrospectionData&); void FullyAnimateQuirkDelayed(guint ms, Quirk quirk, int monitor = -1); void FullyAnimateQuirk(Quirk quirk, int monitor = -1); void Remove(); void SetProgress(float progress); void SetNumberOfWindowsVisibleOnMonitor(int number_of_windows, int monitor); void Present(float urgency, int length, int monitor = -1); void Unpresent(int monitor = -1); void SetEmblem(BaseTexturePtr const& emblem); virtual MenuItemsVector GetMenus(); virtual nux::BaseTexture* GetTextureForSize(int size) = 0; virtual void OnCenterStabilized(std::vector const& centers) {} virtual std::string GetRemoteUri() const { return ""; } virtual nux::DndAction OnQueryAcceptDrop(DndData const& dnd_data) { return nux::DNDACTION_NONE; } virtual bool OnShouldHighlightOnDrag(DndData const& dnd_data) { return false; } virtual void OnAcceptDrop(DndData const& dnd_data) {} virtual void OnDndEnter() {} virtual void OnDndLeave() {} virtual void ActivateLauncherIcon(ActionArg arg) {} virtual void OpenInstanceLauncherIcon(Time timestamp) {} virtual bool HandlesSpread () { return false; } BaseTexturePtr TextureFromPixbuf(GdkPixbuf *pixbuf, int size, bool update_glow_colors = true); BaseTexturePtr TextureFromGtkTheme(std::string name, int size, bool update_glow_colors = true); BaseTexturePtr TextureFromSpecificGtkTheme(GtkIconTheme* theme, std::string const& name, int size, bool update_glow_colors = true, bool is_default_theme = false); BaseTexturePtr TextureFromPath(std::string const& name, int size, bool update_glow_colors = true); void OnRemoteEmblemChanged(LauncherEntryRemote* remote); void OnRemoteCountChanged(LauncherEntryRemote* remote); void OnRemoteProgressChanged(LauncherEntryRemote* remote); void OnRemoteQuicklistChanged(LauncherEntryRemote* remote); void OnRemoteUrgentChanged(LauncherEntryRemote* remote); void OnRemoteEmblemVisibleChanged(LauncherEntryRemote* remote); void OnRemoteCountVisibleChanged(LauncherEntryRemote* remote); void OnRemoteProgressVisibleChanged(LauncherEntryRemote* remote); void EmitNeedsRedraw(int monitor = -1); void EmitRemove(); bool IsActionArgValid(ActionArg const&); typedef nux::animation::AnimateValue Animation; inline Animation& GetQuirkAnimation(Quirk quirk, int monitor) const { return *_quirk_animations[monitor][unsigned(quirk)]; } private: IconType _icon_type; nux::ObjectPtr _tooltip; nux::ObjectPtr _quicklist; static void ChildRealized(DbusmenuMenuitem* newitem, QuicklistView* quicklist); static void RootChanged(DbusmenuClient* client, DbusmenuMenuitem* newroot, QuicklistView* quicklist); void ColorForIcon(GdkPixbuf* pixbuf, nux::Color& background, nux::Color& glow); nux::Point GetTipPosition(int monitor) const; void LoadTooltip(); void LoadQuicklist(); void OnTooltipEnabledChanged(bool value); void CleanCountTextures(); BaseTexturePtr DrawCountTexture(unsigned count, double scale); bool _sticky; float _present_urgency; float _progress; int _sort_priority; int _order; int _last_monitor; nux::Color _background_color; nux::Color _glow_color; gint64 _shortcut; bool _allow_quicklist_to_show; std::vector _center; std::bitset _has_visible_window; std::vector _number_of_visible_windows; std::vector> _quirks; std::vector>> _quirk_animations; std::vector _last_stable; std::vector _saved_center; time::Spec _last_action; BaseTexturePtr _emblem; std::unordered_map _counts; std::vector _remote_entries; connection::Manager _remote_connections; glib::Object _remote_menus; protected: glib::SourceManager _source_manager; }; } } #endif // LAUNCHERICON_H