summaryrefslogtreecommitdiff
diff options
-rw-r--r--plugins/unityshell/src/SwitcherController.cpp144
-rw-r--r--plugins/unityshell/src/SwitcherController.h16
2 files changed, 107 insertions, 53 deletions
diff --git a/plugins/unityshell/src/SwitcherController.cpp b/plugins/unityshell/src/SwitcherController.cpp
index 21b84f5e9..06bc540f5 100644
--- a/plugins/unityshell/src/SwitcherController.cpp
+++ b/plugins/unityshell/src/SwitcherController.cpp
@@ -22,7 +22,6 @@
#include <Nux/HLayout.h>
#include "UBusMessages.h"
-#include "ubus-server.h"
#include "WindowManager.h"
#include "SwitcherController.h"
@@ -36,41 +35,53 @@ using ui::LayoutWindowList;
namespace switcher
{
-Controller::Controller()
- : view_window_(0)
+Controller::Controller(unsigned int load_timeout)
+ : construct_timeout_(load_timeout)
+ , view_window_(nullptr)
+ , main_layout_(nullptr)
+ , monitor_(0)
, visible_(false)
, show_timer_(0)
, detail_timer_(0)
+ , lazy_timer_(0)
+ , view_idle_timer_(0)
+ , bg_color_(0, 0, 0, 0.5)
{
timeout_length = 75;
detail_on_timeout = true;
detail_timeout_length = 1500;
- monitor_ = 0;
- bg_color_ = nux::Color(0.0, 0.0, 0.0, 0.5);
+ ubus_manager_.RegisterInterest(UBUS_BACKGROUND_COLOR_CHANGED, sigc::mem_fun(this, &Controller::OnBackgroundUpdate));
- UBusServer *ubus = ubus_server_get_default();
- bg_update_handle_ =
- ubus_server_register_interest(ubus, UBUS_BACKGROUND_COLOR_CHANGED,
- (UBusCallback)&Controller::OnBackgroundUpdate,
- this);
+ /* Construct the view after a prefixed timeout, to improve the startup time */
+ lazy_timer_ = g_timeout_add_seconds_full(G_PRIORITY_LOW, construct_timeout_, [] (gpointer data) -> gboolean {
+ auto self = static_cast<Controller*>(data);
+ self->lazy_timer_ = 0;
+ self->ConstructWindow();
+ return FALSE;
+ }, this, nullptr);
}
Controller::~Controller()
{
- ubus_server_unregister_interest(ubus_server_get_default(), bg_update_handle_);
if (view_window_)
view_window_->UnReference();
+
+ if (lazy_timer_)
+ g_source_remove(lazy_timer_);
+
+ if (view_idle_timer_)
+ g_source_remove(view_idle_timer_);
}
-void Controller::OnBackgroundUpdate(GVariant* data, Controller* self)
+void Controller::OnBackgroundUpdate(GVariant* data)
{
gdouble red, green, blue, alpha;
g_variant_get(data, "(dddd)", &red, &green, &blue, &alpha);
- self->bg_color_ = nux::Color(red, green, blue, alpha);
+ bg_color_ = nux::Color(red, green, blue, alpha);
- if (self->view_)
- self->view_->background_color = self->bg_color_;
+ if (view_)
+ view_->background_color = bg_color_;
}
void Controller::Show(ShowMode show, SortMode sort, bool reverse,
@@ -92,13 +103,29 @@ void Controller::Show(ShowMode show, SortMode sort, bool reverse,
if (timeout_length > 0)
{
+ if (view_idle_timer_)
+ g_source_remove(view_idle_timer_);
+
+ view_idle_timer_ = g_idle_add_full(G_PRIORITY_LOW, [] (gpointer data) -> gboolean {
+ auto self = static_cast<Controller*>(data);
+ self->ConstructView();
+ self->view_idle_timer_ = 0;
+ return FALSE;
+ }, this, NULL);
+
if (show_timer_)
g_source_remove (show_timer_);
- show_timer_ = g_timeout_add(timeout_length, &Controller::OnShowTimer, this);
+
+ show_timer_ = g_timeout_add(timeout_length, [] (gpointer data) -> gboolean {
+ auto self = static_cast<Controller*>(data);
+ self->ShowView();
+ self->show_timer_ = 0;
+ return FALSE;
+ }, this);
}
else
{
- ConstructView();
+ ShowView();
}
if (detail_on_timeout)
@@ -108,12 +135,8 @@ void Controller::Show(ShowMode show, SortMode sort, bool reverse,
detail_timer_ = g_timeout_add(detail_timeout_length, &Controller::OnDetailTimer, this);
}
- ubus_server_send_message(ubus_server_get_default(),
- UBUS_PLACE_VIEW_CLOSE_REQUEST,
- NULL);
-
- ubus_server_send_message(ubus_server_get_default(),
- UBUS_SWITCHER_SHOWN, g_variant_new_boolean(true));
+ ubus_manager_.SendMessage(UBUS_PLACE_VIEW_CLOSE_REQUEST);
+ ubus_manager_.SendMessage(UBUS_SWITCHER_SHOWN, g_variant_new_boolean(true));
}
void Controller::Select(int index)
@@ -122,17 +145,6 @@ void Controller::Select(int index)
model_->Select(index);
}
-gboolean Controller::OnShowTimer(gpointer data)
-{
- Controller* self = static_cast<Controller*>(data);
-
- if (self->visible_)
- self->ConstructView();
-
- self->show_timer_ = 0;
- return FALSE;
-}
-
gboolean Controller::OnDetailTimer(gpointer data)
{
Controller* self = static_cast<Controller*>(data);
@@ -157,18 +169,28 @@ void Controller::OnModelSelectionChanged(AbstractLauncherIcon::Ptr icon)
detail_timer_ = g_timeout_add(detail_timeout_length, &Controller::OnDetailTimer, this);
}
- ubus_server_send_message(ubus_server_get_default(),
- UBUS_SWITCHER_SELECTION_CHANGED,
- g_variant_new_string(icon->tooltip_text().c_str()));
+ ubus_manager_.SendMessage(UBUS_SWITCHER_SELECTION_CHANGED,
+ g_variant_new_string(icon->tooltip_text().c_str()));
}
-void Controller::ConstructView()
+void Controller::ShowView()
{
- view_ = SwitcherView::Ptr(new SwitcherView());
- AddChild(view_.GetPointer());
- view_->SetModel(model_);
- view_->background_color = bg_color_;
- view_->monitor = monitor_;
+ if (!visible_)
+ return;
+
+ ConstructView();
+
+ if (view_window_)
+ view_window_->SetOpacity(1.0f);
+}
+
+void Controller::ConstructWindow()
+{
+ if (lazy_timer_)
+ {
+ g_source_remove(lazy_timer_);
+ lazy_timer_ = 0;
+ }
if (!view_window_)
{
@@ -180,12 +202,32 @@ void Controller::ConstructView()
view_window_->SinkReference();
view_window_->SetLayout(main_layout_);
view_window_->SetBackgroundColor(nux::Color(0x00000000));
+ view_window_->SetGeometry(workarea_);
}
+}
- main_layout_->AddView(view_.GetPointer(), 1);
+void Controller::ConstructView()
+{
+ if (view_ || !model_)
+ return;
- view_window_->SetGeometry(workarea_);
+ if (view_idle_timer_)
+ {
+ g_source_remove(view_idle_timer_);
+ view_idle_timer_ = 0;
+ }
+
+ view_ = SwitcherView::Ptr(new SwitcherView());
+ AddChild(view_.GetPointer());
+ view_->SetModel(model_);
+ view_->background_color = bg_color_;
+ view_->monitor = monitor_;
view_->SetupBackground();
+
+ ConstructWindow();
+ main_layout_->AddView(view_.GetPointer(), 1);
+ view_window_->SetGeometry(workarea_);
+ view_window_->SetOpacity(0.0f);
view_window_->ShowWindow(true);
}
@@ -227,6 +269,12 @@ void Controller::Hide(bool accept_state)
}
}
+ if (view_idle_timer_)
+ {
+ g_source_remove(view_idle_timer_);
+ view_idle_timer_ = 0;
+ }
+
model_.reset();
visible_ = false;
@@ -234,7 +282,10 @@ void Controller::Hide(bool accept_state)
main_layout_->RemoveChildObject(view_.GetPointer());
if (view_window_)
+ {
+ view_window_->SetOpacity(0.0f);
view_window_->ShowWindow(false);
+ }
if (show_timer_)
g_source_remove(show_timer_);
@@ -244,8 +295,7 @@ void Controller::Hide(bool accept_state)
g_source_remove(detail_timer_);
detail_timer_ = 0;
- ubus_server_send_message(ubus_server_get_default(),
- UBUS_SWITCHER_SHOWN, g_variant_new_boolean(false));
+ ubus_manager_.SendMessage(UBUS_SWITCHER_SHOWN, g_variant_new_boolean(false));
view_.Release();
}
diff --git a/plugins/unityshell/src/SwitcherController.h b/plugins/unityshell/src/SwitcherController.h
index 75a768e5e..8af38c885 100644
--- a/plugins/unityshell/src/SwitcherController.h
+++ b/plugins/unityshell/src/SwitcherController.h
@@ -27,6 +27,7 @@
#include "SwitcherModel.h"
#include "SwitcherView.h"
+#include "UBusWrapper.h"
#include <boost/shared_ptr.hpp>
#include <sigc++/sigc++.h>
@@ -62,11 +63,10 @@ class Controller : public debug::Introspectable, public sigc::trackable
public:
typedef std::shared_ptr<Controller> Ptr;
- Controller();
+ Controller(unsigned int load_timeout = 20);
virtual ~Controller();
nux::Property<int> timeout_length;
-
nux::Property<bool> detail_on_timeout;
nux::Property<int> detail_timeout_length;
@@ -98,6 +98,8 @@ protected:
std::string GetName() const;
void AddProperties(GVariantBuilder* builder);
+ unsigned int construct_timeout_;
+
private:
enum DetailMode
{
@@ -106,15 +108,17 @@ private:
TAB_NEXT_TILE,
};
+ void ConstructWindow();
void ConstructView();
+ void ShowView();
void OnModelSelectionChanged(launcher::AbstractLauncherIcon::Ptr icon);
-
- static void OnBackgroundUpdate(GVariant* data, Controller* self);
+ void OnBackgroundUpdate(GVariant* data);
SwitcherModel::Ptr model_;
SwitcherView::Ptr view_;
+ UBusManager ubus_manager_;
nux::Geometry workarea_;
nux::BaseWindow* view_window_;
@@ -124,11 +128,11 @@ private:
bool visible_;
guint show_timer_;
guint detail_timer_;
+ guint lazy_timer_;
+ guint view_idle_timer_;
nux::Color bg_color_;
DetailMode detail_mode_;
- guint bg_update_handle_;
- static gboolean OnShowTimer(gpointer data);
static gboolean OnDetailTimer(gpointer data);
static bool CompareSwitcherItemsPriority(launcher::AbstractLauncherIcon::Ptr first, launcher::AbstractLauncherIcon::Ptr second);