// -*- 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 * Authored by: Jay Taoko */ #ifndef LAUNCHER_H #define LAUNCHER_H #include #include #include #include #ifndef USE_GLES # include #endif #include "unity-shared/AbstractIconRenderer.h" #include "unity-shared/BackgroundEffectHelper.h" #include "unity-shared/EMConverter.h" #include "unity-shared/RawPixel.h" #include "DevicesSettings.h" #include "DndData.h" #include "unity-shared/Introspectable.h" #include "LauncherModel.h" #include "LauncherOptions.h" #include "LauncherDragWindow.h" #include "LauncherHideMachine.h" #include "LauncherHoverMachine.h" #include "unity-shared/MockableBaseWindow.h" #include "unity-shared/UBusWrapper.h" #include "SoftwareCenterLauncherIcon.h" #include "TooltipManager.h" #ifdef USE_X11 # include "PointerBarrier.h" # include "EdgeBarrierController.h" #endif namespace unity { enum class LauncherPosition; namespace launcher { extern const char* window_title; class AbstractLauncherIcon; class Launcher : public unity::debug::Introspectable, #ifdef USE_X11 // TODO: abstract this into a more generic class. public ui::EdgeBarrierSubscriber, #endif public nux::View { NUX_DECLARE_OBJECT_TYPE(Launcher, nux::View); public: Launcher(MockableBaseWindow* parent, NUX_FILE_LINE_PROTO); nux::Property monitor; nux::Property options; virtual void Draw(nux::GraphicsEngine& GfxContext, bool force_draw); virtual void DrawContent(nux::GraphicsEngine& GfxContext, bool force_draw); AbstractLauncherIcon::Ptr GetSelectedMenuIcon() const; void SetScrollInactiveIcons(bool scroll); void SetLauncherMinimizeWindow(bool click_to_minimize); void SetIconSize(int tile_size, int icon_size); int GetIconSize() const; bool Hidden() const { return hidden_; } void ForceReveal(bool force); void ShowShortcuts(bool show); void SetModel(LauncherModel::Ptr model); LauncherModel::Ptr GetModel() const; void StartKeyShowLauncher(); void EndKeyShowLauncher(); void EnsureIconOnScreen(AbstractLauncherIcon::Ptr const& icon); void SetBacklightMode(BacklightMode mode); BacklightMode GetBacklightMode() const; bool IsBackLightModeToggles() const; MockableBaseWindow* GetParent() const { return parent_; }; nux::ObjectPtr const& GetActiveTooltip() const; LauncherDragWindow::Ptr const& GetDraggedIcon() const; virtual void RecvMouseUp(int x, int y, unsigned long button_flags, unsigned long key_flags); virtual void RecvMouseDown(int x, int y, unsigned long button_flags, unsigned long key_flags); virtual void RecvMouseDrag(int x, int y, int dx, int dy, unsigned long button_flags, unsigned long key_flags); virtual void RecvMouseEnter(int x, int y, unsigned long button_flags, unsigned long key_flags); virtual void RecvMouseLeave(int x, int y, unsigned long button_flags, unsigned long key_flags); virtual void RecvMouseMove(int x, int y, int dx, int dy, unsigned long button_flags, unsigned long key_flags); virtual void RecvMouseWheel(int x, int y, int wheel_delta, unsigned long button_flags, unsigned long key_flags); virtual void RecvQuicklistOpened(nux::ObjectPtr const& quicklist); virtual void RecvQuicklistClosed(nux::ObjectPtr const& quicklist); void ScrollLauncher(int wheel_delta); int GetMouseX() const; int GetMouseY() const; void Resize(nux::Point const& offset, int height); int GetDragDelta() const; void SetHover(bool hovered); void DndStarted(std::string const& mimes); void DndFinished(); void SetDndQuirk(); void UnsetDndQuirk(); sigc::signal add_request; sigc::signal remove_request; sigc::signal selection_change; sigc::signal hidden_changed; sigc::signal sc_launcher_icon_animation; sigc::signal key_nav_terminate_request; virtual bool InspectKeyEvent(unsigned int eventType, unsigned int keysym, const char* character); void EnterKeyNavMode(); void ExitKeyNavMode(); bool IsInKeyNavMode() const; bool IsOverlayOpen() const; void ClearTooltip(); void RenderIconToTexture(nux::GraphicsEngine&, nux::ObjectPtr const&, AbstractLauncherIcon::Ptr const&); #ifdef NUX_GESTURES_SUPPORT virtual nux::GestureDeliveryRequest GestureEvent(const nux::GestureEvent &event); #endif protected: // Introspectable methods std::string GetName() const; void AddProperties(debug::IntrospectionData&); void ProcessDndEnter(); void ProcessDndLeave(); void ProcessDndMove(int x, int y, std::list mimes); void ProcessDndDrop(int x, int y); private: typedef nux::ObjectPtr BaseTexturePtr; LauncherHideMode GetHideMode() const; void SetHideMode(LauncherHideMode hidemode); typedef enum { ACTION_NONE, ACTION_DRAG_LAUNCHER, ACTION_DRAG_ICON, ACTION_DRAG_ICON_CANCELLED, ACTION_DRAG_EXTERNAL, } LauncherActionState; void ConfigureBarrier(); void OnMonitorChanged(int monitor); void OnOptionsChanged(Options::Ptr options); void OnOptionChanged(); void UpdateOptions(Options::Ptr options); #ifdef NUX_GESTURES_SUPPORT void OnDragStart(const nux::GestureEvent &event); void OnDragUpdate(const nux::GestureEvent &event); void OnDragFinish(const nux::GestureEvent &event); #endif #ifdef USE_X11 ui::EdgeBarrierSubscriber::Result HandleBarrierEvent(ui::PointerBarrierWrapper::Ptr const& owner, ui::BarrierEvent::Ptr event); #endif void OnExpoChanged(); void OnSpreadChanged(); void OnSelectionChanged(AbstractLauncherIcon::Ptr const& selection); bool StrutHack(); bool StartIconDragTimeout(int x, int y); bool OnScrollTimeout(); void SetUrgentTimer(int urgent_wiggle_period); void AnimateUrgentIcon(AbstractLauncherIcon::Ptr const& icon); void HandleUrgentIcon(AbstractLauncherIcon::Ptr const& icon); bool OnUrgentTimeout(); void SetMousePosition(int x, int y); void SetIconUnderMouse(AbstractLauncherIcon::Ptr const& icon); void SetStateMouseOverLauncher(bool over_launcher); bool MouseBeyondDragThreshold() const; void OnDragWindowAnimCompleted(); bool IconDrawEdgeOnly(AbstractLauncherIcon::Ptr const& icon) const; void SetActionState(LauncherActionState actionstate); LauncherActionState GetActionState() const; void EnsureScrollTimer(); bool MouseOverTopScrollArea(); bool MouseOverBottomScrollArea(); float DragOutProgress() const; float IconUrgentPulseValue(AbstractLauncherIcon::Ptr const& icon) const; float IconPulseOnceValue(AbstractLauncherIcon::Ptr const& icon) const; float IconUrgentWiggleValue(AbstractLauncherIcon::Ptr const& icon) const; float IconStartingBlinkValue(AbstractLauncherIcon::Ptr const& icon) const; float IconStartingPulseValue(AbstractLauncherIcon::Ptr const& icon) const; float IconBackgroundIntensity(AbstractLauncherIcon::Ptr const& icon) const; float IconProgressBias(AbstractLauncherIcon::Ptr const& icon) const; void SetHidden(bool hidden); void UpdateChangeInMousePosition(int delta_x, int delta_y); void SetDndDelta(float x, float y, nux::Geometry const& geo); float DragLimiter(float x); void SetupRenderArg(AbstractLauncherIcon::Ptr const& icon, ui::RenderArg& arg); void FillRenderArg(AbstractLauncherIcon::Ptr const& icon, ui::RenderArg& arg, nux::Point3& center, nux::Geometry const& parent_abs_geo, float folding_threshold, float folded_size, float folded_spacing, float autohide_offset, float folded_z_distance, float animation_neg_rads); void RenderArgs(std::list &launcher_args, nux::Geometry& box_geo, float* launcher_alpha, nux::Geometry const& parent_abs_geo, bool& force_show_window); void OnIconAdded(AbstractLauncherIcon::Ptr const& icon); void OnIconRemoved(AbstractLauncherIcon::Ptr const& icon); void OnIconNeedsRedraw(AbstractLauncherIcon::Ptr const& icon, int monitor); void SetupIconAnimations(AbstractLauncherIcon::Ptr const& icon); void OnTooltipVisible(nux::ObjectPtr view); void OnOverlayHidden(GVariant* data); void OnOverlayShown(GVariant* data); void DesaturateIcons(); void SaturateIcons(); void OnBGColorChanged(GVariant *data); void OnLockHideChanged(GVariant *data); void OnActionDone(GVariant* data); virtual AbstractLauncherIcon::Ptr MouseIconIntersection(int x, int y) const; void EventLogic(); void MouseDownLogic(int x, int y, unsigned long button_flags, unsigned long key_flags); void MouseUpLogic(int x, int y, unsigned long button_flags, unsigned long key_flags); void StartIconDragRequest(int x, int y); void StartIconDrag(AbstractLauncherIcon::Ptr const& icon); void EndIconDrag(); void ShowDragWindow(); void UpdateDragWindowPosition(int x, int y); void HideDragWindow(); void ResetMouseDragState(); float GetAutohidePositionMin() const; float GetAutohidePositionMax() const; virtual long PostLayoutManagement(long LayoutResult); void DndReset(); void DndHoveredIconReset(); bool DndIsSpecialRequest(std::string const& uri) const; void OnDPIChanged(); void LoadTextures(); LauncherModel::Ptr model_; MockableBaseWindow* parent_; ui::AbstractIconRenderer::Ptr icon_renderer_; nux::ObjectPtr active_tooltip_; std::set animating_urgent_icons_; // used by keyboard/a11y-navigation AbstractLauncherIcon::Ptr icon_under_mouse_; AbstractLauncherIcon::Ptr icon_mouse_down_; AbstractLauncherIcon::Ptr drag_icon_; AbstractLauncherIcon::Ptr dnd_hovered_icon_; bool hovered_; bool hidden_; bool folded_; bool render_drag_window_; bool shortcuts_shown_; bool data_checked_; bool steal_drag_; bool drag_edge_touching_; bool initial_drag_animation_; bool dash_is_open_; bool hud_is_open_; LauncherActionState launcher_action_state_; RawPixel icon_size_; int dnd_delta_y_; int dnd_delta_x_; int postreveal_mousemove_delta_x_; int postreveal_mousemove_delta_y_; int launcher_drag_delta_; int launcher_drag_delta_max_; int launcher_drag_delta_min_; int enter_x_; int enter_y_; int last_button_press_; int drag_icon_position_; int urgent_animation_period_; bool urgent_ack_needed_; float drag_out_delta_x_; bool drag_gesture_ongoing_; float last_reveal_progress_; nux::Point mouse_position_; LauncherDragWindow::Ptr drag_window_; LauncherHideMachine hide_machine_; LauncherHoverMachine hover_machine_; TooltipManager tooltip_manager_; unity::DndData dnd_data_; nux::DndAction drag_action_; BaseTexturePtr launcher_sheen_; BaseTexturePtr launcher_pressure_effect_; BackgroundEffectHelper bg_effect_helper_; LauncherPosition launcher_position_; connection::Wrapper launcher_position_changed_; nux::animation::AnimateValue auto_hide_animation_; nux::animation::AnimateValue hover_animation_; nux::animation::AnimateValue drag_over_animation_; nux::animation::AnimateValue drag_out_animation_; nux::animation::AnimateValue drag_icon_animation_; nux::animation::AnimateValue dnd_hide_animation_; nux::animation::AnimateValue dash_showing_animation_; UBusManager ubus_; glib::SourceManager sources_; EMConverter::Ptr cv_; friend class TestLauncher; }; } } #endif // LAUNCHER_H