// -*- 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: Neil Jagdish Patel
* Marco Trevisan <3v1n0@ubuntu.com>
*/
#ifndef PANEL_MENU_VIEW_H
#define PANEL_MENU_VIEW_H
#include
#include
#include
#include
#include "PanelIndicatorsView.h"
#include "unity-shared/StaticCairoText.h"
#include "unity-shared/WindowButtons.h"
#include "PanelTitlebarGrabAreaView.h"
#include "unity-shared/UBusWrapper.h"
namespace unity
{
class PanelMenuView : public PanelIndicatorsView
{
public:
PanelMenuView();
~PanelMenuView();
void SetMenuShowTimings(int fadein, int fadeout, int discovery,
int discovery_fadein, int discovery_fadeout);
void SetMousePosition(int x, int y);
void SetMonitor(int monitor);
Window GetTopWindow() const;
Window GetMaximizedWindow() const;
bool GetControlsActive() const;
void NotifyAllMenusClosed();
virtual void AddIndicator(indicator::Indicator::Ptr const& indicator);
virtual void OverlayShown();
virtual void OverlayHidden();
protected:
std::string GetName() const;
void AddProperties(GVariantBuilder* builder);
virtual void Draw(nux::GraphicsEngine& GfxContext, bool force_draw);
virtual void DrawContent(nux::GraphicsEngine& GfxContext, bool force_draw);
virtual void PreLayoutManagement();
virtual nux::Area* FindAreaUnderMouse(const nux::Point& mouse_position,
nux::NuxEventType event_type);
virtual void OnEntryAdded(indicator::Entry::Ptr const& entry);
virtual std::string GetActiveViewName(bool use_appname = false) const;
private:
friend class TestPanelMenuView;
void SetupPanelMenuViewSignals();
void SetupWindowButtons();
void SetupLayout();
void SetupTitlebarGrabArea();
void SetupWindowManagerSignals();
void SetupUBusManagerInterests();
void OnActiveChanged(PanelIndicatorEntryView* view, bool is_active);
void OnViewOpened(BamfMatcher* matcher, BamfView* view);
void OnViewClosed(BamfMatcher* matcher, BamfView* view);
void OnApplicationClosed(BamfApplication* app);
void OnActiveWindowChanged(BamfMatcher* matcher, BamfView* old_view, BamfView* new_view);
void OnActiveAppChanged(BamfMatcher* matcher, BamfApplication* old_app, BamfApplication* new_app);
void OnNameChanged(BamfView* bamf_view, gchar* new_name, gchar* old_name);
void OnSpreadInitiate();
void OnSpreadTerminate();
void OnExpoInitiate();
void OnExpoTerminate();
void OnWindowMinimized(guint32 xid);
void OnWindowUnminimized(guint32 xid);
void OnWindowUnmapped(guint32 xid);
void OnWindowMapped(guint32 xid);
void OnWindowMaximized(guint32 xid);
void OnWindowRestored(guint32 xid);
void OnWindowMoved(guint32 xid);
void OnWindowDecorated(guint32 xid);
void OnWindowUndecorated(guint32 xid);
void OnMaximizedActivate(int x, int y);
void OnMaximizedRestore(int x, int y);
void OnMaximizedLower(int x, int y);
void OnMaximizedGrabStart(int x, int y);
void OnMaximizedGrabMove(int x, int y);
void OnMaximizedGrabEnd(int x, int y);
void FullRedraw();
std::string GetCurrentTitle() const;
void Refresh(bool force = false);
void UpdateTitleTexture(cairo_t *cr_real, nux::Geometry const& geo, std::string const& label) const;
void UpdateLastGeometry(nux::Geometry const& geo);
void UpdateTitleGradientTexture();
void OnPanelViewMouseEnter(int x, int y, unsigned long mouse_button_state, unsigned long special_keys_state);
void OnPanelViewMouseLeave(int x, int y, unsigned long mouse_button_state, unsigned long special_keys_state);
void OnPanelViewMouseMove(int x, int y, int dx, int dy, unsigned long mouse_button_state, unsigned long special_keys_state);
BamfWindow* GetBamfWindowForXid(Window xid) const;
void OnSwitcherShown(GVariant* data);
void OnLauncherKeyNavStarted(GVariant* data);
void OnLauncherKeyNavEnded(GVariant* data);
void OnLauncherSelectionChanged(GVariant* data);
void UpdateShowNow(bool ignore);
bool UpdateActiveWindowPosition();
bool UpdateShowNowWithDelay();
bool OnNewAppShow();
bool OnNewAppHide();
bool IsValidWindow(Window xid) const;
bool IsWindowUnderOurControl(Window xid) const;
bool ShouldDrawMenus() const;
bool ShouldDrawButtons() const;
bool ShouldDrawFadingTitle() const;
bool HasVisibleMenus() const;
double GetTitleOpacity() const;
void StartFadeIn(int duration = -1);
void StartFadeOut(int duration = -1);
void OnFadeAnimatorUpdated(double opacity);
glib::Object matcher_;
nux::TextureLayer* title_layer_;
nux::ObjectPtr window_buttons_;
nux::ObjectPtr titlebar_grab_area_;
nux::ObjectPtr title_texture_;
nux::ObjectPtr gradient_texture_;
bool is_inside_;
bool is_grabbed_;
bool is_maximized_;
PanelIndicatorEntryView* last_active_view_;
glib::Object new_application_;
std::map decor_map_;
std::set maximized_set_;
std::list> new_apps_;
std::string panel_title_;
nux::Geometry last_geo_;
bool overlay_showing_;
bool switcher_showing_;
bool launcher_keynav_;
bool show_now_activated_;
bool we_control_active_;
bool new_app_menu_shown_;
int monitor_;
Window active_xid_;
nux::Geometry monitor_geo_;
const std::string desktop_name_;
int menus_fadein_;
int menus_fadeout_;
int menus_discovery_;
int menus_discovery_fadein_;
int menus_discovery_fadeout_;
glib::Signal view_opened_signal_;
glib::Signal view_closed_signal_;
glib::Signal active_win_changed_signal_;
glib::Signal active_app_changed_signal_;
glib::Signal view_name_changed_signal_;
glib::Signal app_name_changed_signal_;
connection::Wrapper style_changed_connection_;
UBusManager ubus_manager_;
glib::SourceManager sources_;
nux::animation::AnimateValue opacity_animator_;
};
}
#endif