// -*- 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 MOCKLAUNCHERICON_H #define MOCKLAUNCHERICON_H #include #include #include #include #include #include #include #include #include "unity-shared/ApplicationManager.h" #include "unity-shared/TimeUtil.h" #include "AbstractLauncherIcon.h" #include "MultiMonitor.h" namespace unity { namespace launcher { class MockApplicationWindow : public ApplicationWindow { public: MockApplicationWindow(Window xid) : xid_(xid) { title.SetGetterFunction([this] { return "MockApplicationWindow"; }); icon.SetGetterFunction([this] { return ""; }); } virtual WindowType type() const { return WindowType::UNKNOWN; } virtual Window window_id() const { return xid_; } virtual int monitor() const { return -1; } virtual ApplicationPtr application() const { return ApplicationPtr(); } virtual bool Focus() const { return false; } virtual void Quit() const {} private: Window xid_; }; class MockLauncherIcon : public AbstractLauncherIcon { NUX_DECLARE_OBJECT_TYPE(MockLauncherIcon, AbstractLauncherIcon); public: MockLauncherIcon(IconType type = IconType::APPLICATION) : icon_(0) , type_(type) , sort_priority_(DefaultPriority(type)) , quirks_(monitors::MAX) , quirk_progress_(monitors::MAX, decltype(quirk_progress_)::value_type(unsigned(Quirk::LAST), 0.0f)) , remote_uri_("fake") , is_tooltip_visible_(false) { tooltip_text = "Mock Icon"; position = Position::FLOATING; } std::string GetName() const { return "MockLauncherIcon"; } void AddProperties(debug::IntrospectionData& introspection) {} void ShowTooltip() { is_tooltip_visible_ = true; } void HideTooltip() { is_tooltip_visible_ = false; } void PromptHideTooltip() { is_tooltip_visible_ = false; } bool IsTooltipVisible() { return is_tooltip_visible_; } void SetShortcut(guint64 shortcut) {} guint64 GetShortcut() { return 0; } WindowList Windows () { WindowList result; result.push_back(std::make_shared((100 << 16) + 200)); result.push_back(std::make_shared((500 << 16) + 200)); result.push_back(std::make_shared((300 << 16) + 200)); result.push_back(std::make_shared((200 << 16) + 200)); result.push_back(std::make_shared((300 << 16) + 200)); result.push_back(std::make_shared((100 << 16) + 200)); result.push_back(std::make_shared((300 << 16) + 200)); result.push_back(std::make_shared((600 << 16) + 200)); return result; } WindowList WindowsOnViewport() { WindowList result; result.push_back(std::make_shared((100 << 16) + 200)); result.push_back(std::make_shared((500 << 16) + 200)); result.push_back(std::make_shared((300 << 16) + 200)); result.push_back(std::make_shared((200 << 16) + 200)); result.push_back(std::make_shared((300 << 16) + 200)); result.push_back(std::make_shared((100 << 16) + 200)); result.push_back(std::make_shared((300 << 16) + 200)); result.push_back(std::make_shared((600 << 16) + 200)); return result; } WindowList WindowsForMonitor(int monitor) { WindowList result; result.push_back(std::make_shared((100 << 16) + 200)); result.push_back(std::make_shared((500 << 16) + 200)); result.push_back(std::make_shared((300 << 16) + 200)); result.push_back(std::make_shared((200 << 16) + 200)); result.push_back(std::make_shared((300 << 16) + 200)); result.push_back(std::make_shared((100 << 16) + 200)); result.push_back(std::make_shared((300 << 16) + 200)); result.push_back(std::make_shared((600 << 16) + 200)); return result; } void SetSortPriority(int priority) { sort_priority_ = priority; } void SetOrder(int order) { order_ = order; } bool OpenQuicklist(bool select_first_item = false, int monitor = -1, bool restore_input_focus = false) { return false; } void CloseQuicklist() { } void SetCenter(nux::Point3 const& center, int monitor) { center_[monitor] = center; } void ResetCenters(int monitor = -1) { for (auto& pair : center_) pair.second.Set(0, 0, 0); } nux::Point3 GetCenter(int monitor) { return center_[monitor]; } nux::Point3 GetSavedCenter(int monitor) { return nux::Point3(); } void SaveCenter() {} void Activate(ActionArg arg) {} void OpenInstance(ActionArg arg) {} int SortPriority() { return sort_priority_; } int RelatedWindows() { return 7; } bool WindowVisibleOnViewport() const { return false; } bool WindowVisibleOnMonitor(int monitor) const { return false; } size_t WindowsVisibleOnMonitor(int monitor) const { return 0; } size_t WindowsVisibleOnViewport() const { return 0; } void SetVisibleOnMonitor(int monitor, bool visible) {} bool IsVisibleOnMonitor(int monitor) const { return true; } float PresentUrgency() { return 0.0f; } float GetProgress() { return 0.0f; } bool ShowInSwitcher(bool current) { return true; } bool AllowDetailViewInSwitcher() const override { return true; } void InsertEntryRemote(LauncherEntryRemote::Ptr const& remote) {} void RemoveEntryRemote(LauncherEntryRemote::Ptr const& remote) {} uint64_t SwitcherPriority() { return 0; } bool GetQuirk(Quirk quirk, int monitor = -1) const { if (monitor < 0) { for (unsigned i = 0; i < monitors::MAX; ++i) { if (!quirks_[i][unsigned(quirk)]) return false; } return true; } return quirks_[monitor][unsigned(quirk)]; } void SetQuirk(Quirk quirk, bool value, int monitor = -1) { if (monitor < 0) { for (unsigned i = 0; i < monitors::MAX; ++i) { quirks_[i][unsigned(quirk)] = value; quirk_progress_[i][unsigned(quirk)] = value ? 1.0f : 0.0f; } } else { quirks_[monitor][unsigned(quirk)] = value; quirk_progress_[monitor][unsigned(quirk)] = value ? 1.0f : 0.0f; } } void SkipQuirkAnimation(Quirk quirk, int monitor) { float value = GetQuirk(quirk, monitor) ? 1.0f : 0.0f; if (monitor < 0) { for (unsigned i = 0; i < monitors::MAX; ++i) quirk_progress_[i][unsigned(quirk)] = value; } else { quirk_progress_[monitor][unsigned(quirk)] = value; } } float GetQuirkProgress(Quirk quirk, int monitor) const { return quirk_progress_[monitor][unsigned(quirk)]; } void SetQuirkDuration(Quirk quirk, unsigned duration, int monitor = -1) {} IconType GetIconType() const { return type_; } nux::Color BackgroundColor() const { return nux::Color(0xFFAAAAAA); } nux::Color GlowColor() { return nux::Color(0xFFAAAAAA); } std::string RemoteUri() const { return remote_uri_; } nux::BaseTexture* TextureForSize(int size) { if (icon_ && size == icon_->GetHeight()) return icon_; if (icon_) icon_->UnReference(); icon_ = 0; icon_ = TextureFromGtkTheme("firefox", size); return icon_; } MenuItemsVector Menus() { return MenuItemsVector (); } nux::DndAction QueryAcceptDrop(DndData const& dnd_data) { return nux::DNDACTION_NONE; } bool ShouldHighlightOnDrag(DndData const& dnd_data) { return false; } void AcceptDrop(DndData const& dnd_data) {} void SendDndEnter() {} void SendDndLeave() {} std::string DesktopFile() const { return std::string(""); } bool IsSticky() const { return false; } bool IsVisible() const { return false; } void AboutToRemove() {} void Stick(bool save = true) {} void UnStick() {} void PerformScroll(ScrollDirection /*direction*/, Time /*timestamp*/) override {} private: nux::BaseTexture* TextureFromGtkTheme(const char* icon_name, int size) { GdkPixbuf* pbuf; glib::Object info; nux::BaseTexture* result = NULL; GError* error = NULL; GIcon* icon; GtkIconTheme* theme = gtk_icon_theme_get_default(); icon = g_icon_new_for_string(icon_name, NULL); if (G_IS_ICON(icon)) { info = gtk_icon_theme_lookup_by_gicon(theme, icon, size, GTK_ICON_LOOKUP_FORCE_SIZE); g_object_unref(icon); } else { info = gtk_icon_theme_lookup_icon(theme, icon_name, size, GTK_ICON_LOOKUP_FORCE_SIZE); } if (!info) return NULL; pbuf = gtk_icon_info_load_icon(info, &error); if (GDK_IS_PIXBUF(pbuf)) { result = nux::CreateTexture2DFromPixbuf(pbuf, true); g_object_unref(pbuf); } else { g_warning("Unable to load '%s' from icon theme: %s", icon_name, error ? error->message : "unknown"); g_error_free(error); } return result; } nux::BaseTexture* icon_; IconType type_; int sort_priority_; int order_; std::vector> quirks_; std::vector> quirk_progress_; std::map center_; std::string remote_uri_; bool is_tooltip_visible_; }; } } #endif // MOCKLAUNCHERICON_H