39
Controller::Controller()
38
Controller::Controller(unsigned int load_timeout)
39
: construct_timeout_(load_timeout)
40
, view_window_(nullptr)
41
, main_layout_(nullptr)
48
, bg_color_(0, 0, 0, 0.5)
46
51
detail_on_timeout = true;
47
52
detail_timeout_length = 1500;
49
bg_color_ = nux::Color(0.0, 0.0, 0.0, 0.5);
54
ubus_manager_.RegisterInterest(UBUS_BACKGROUND_COLOR_CHANGED, sigc::mem_fun(this, &Controller::OnBackgroundUpdate));
51
UBusServer *ubus = ubus_server_get_default();
53
ubus_server_register_interest(ubus, UBUS_BACKGROUND_COLOR_CHANGED,
54
(UBusCallback)&Controller::OnBackgroundUpdate,
56
/* Construct the view after a prefixed timeout, to improve the startup time */
57
lazy_timer_ = g_timeout_add_seconds_full(G_PRIORITY_LOW, construct_timeout_, [] (gpointer data) -> gboolean {
58
auto self = static_cast<Controller*>(data);
59
self->lazy_timer_ = 0;
60
self->ConstructWindow();
58
65
Controller::~Controller()
60
ubus_server_unregister_interest(ubus_server_get_default(), bg_update_handle_);
62
68
view_window_->UnReference();
71
g_source_remove(lazy_timer_);
74
g_source_remove(view_idle_timer_);
65
void Controller::OnBackgroundUpdate(GVariant* data, Controller* self)
77
void Controller::OnBackgroundUpdate(GVariant* data)
67
79
gdouble red, green, blue, alpha;
68
80
g_variant_get(data, "(dddd)", &red, &green, &blue, &alpha);
69
self->bg_color_ = nux::Color(red, green, blue, alpha);
72
self->view_->background_color = self->bg_color_;
75
bool IsOnOtherViewport (AbstractLauncherIcon* icon)
77
return !icon->HasWindowOnViewport();
81
bg_color_ = nux::Color(red, green, blue, alpha);
84
view_->background_color = bg_color_;
80
87
void Controller::Show(ShowMode show, SortMode sort, bool reverse,
81
std::vector<AbstractLauncherIcon*> results)
88
std::vector<AbstractLauncherIcon::Ptr> results)
83
90
if (sort == SortMode::FOCUS_ORDER)
85
92
std::sort(results.begin(), results.end(), CompareSwitcherItemsPriority);
88
if (show == ShowMode::CURRENT_VIEWPORT)
90
results.erase(std::remove_if(results.begin(), results.end(), IsOnOtherViewport), results.end());
93
95
model_.reset(new SwitcherModel(results));
94
96
AddChild(model_.get());
95
97
model_->selection_changed.connect(sigc::mem_fun(this, &Controller::OnModelSelectionChanged));
102
104
if (timeout_length > 0)
106
if (view_idle_timer_)
107
g_source_remove(view_idle_timer_);
109
view_idle_timer_ = g_idle_add_full(G_PRIORITY_LOW, [] (gpointer data) -> gboolean {
110
auto self = static_cast<Controller*>(data);
111
self->ConstructView();
112
self->view_idle_timer_ = 0;
105
117
g_source_remove (show_timer_);
106
show_timer_ = g_timeout_add(timeout_length, &Controller::OnShowTimer, this);
119
show_timer_ = g_timeout_add(timeout_length, [] (gpointer data) -> gboolean {
120
auto self = static_cast<Controller*>(data);
122
self->show_timer_ = 0;
113
131
if (detail_on_timeout)
117
135
detail_timer_ = g_timeout_add(detail_timeout_length, &Controller::OnDetailTimer, this);
120
ubus_server_send_message(ubus_server_get_default(),
121
UBUS_PLACE_VIEW_CLOSE_REQUEST,
124
ubus_server_send_message(ubus_server_get_default(),
125
UBUS_SWITCHER_SHOWN, g_variant_new_boolean(true));
138
ubus_manager_.SendMessage(UBUS_PLACE_VIEW_CLOSE_REQUEST);
139
ubus_manager_.SendMessage(UBUS_SWITCHER_SHOWN, g_variant_new_boolean(true));
128
142
void Controller::Select(int index)
166
169
detail_timer_ = g_timeout_add(detail_timeout_length, &Controller::OnDetailTimer, this);
169
ubus_server_send_message(ubus_server_get_default(),
170
UBUS_SWITCHER_SELECTION_CHANGED,
171
g_variant_new_string(icon->tooltip_text().c_str()));
174
void Controller::ConstructView()
176
view_ = SwitcherView::Ptr(new SwitcherView());
177
AddChild(view_.GetPointer());
178
view_->SetModel(model_);
179
view_->background_color = bg_color_;
172
ubus_manager_.SendMessage(UBUS_SWITCHER_SELECTION_CHANGED,
173
g_variant_new_string(icon->tooltip_text().c_str()));
176
void Controller::ShowView()
184
view_window_->SetOpacity(1.0f);
187
void Controller::ConstructWindow()
191
g_source_remove(lazy_timer_);
181
195
if (!view_window_)
188
202
view_window_->SinkReference();
189
203
view_window_->SetLayout(main_layout_);
190
204
view_window_->SetBackgroundColor(nux::Color(0x00000000));
205
view_window_->SetGeometry(workarea_);
209
void Controller::ConstructView()
211
if (view_ || !model_)
214
if (view_idle_timer_)
216
g_source_remove(view_idle_timer_);
217
view_idle_timer_ = 0;
220
view_ = SwitcherView::Ptr(new SwitcherView());
221
AddChild(view_.GetPointer());
222
view_->SetModel(model_);
223
view_->background_color = bg_color_;
224
view_->monitor = monitor_;
225
view_->SetupBackground();
193
228
main_layout_->AddView(view_.GetPointer(), 1);
195
229
view_window_->SetGeometry(workarea_);
196
view_->SetupBackground();
230
view_window_->SetOpacity(0.0f);
197
231
view_window_->ShowWindow(true);
200
void Controller::SetWorkspace(nux::Geometry geo)
234
void Controller::SetWorkspace(nux::Geometry geo, int monitor)
240
view_->monitor = monitor_;
205
243
void Controller::Hide(bool accept_state)
378
424
return view_->ExternalTargets();
381
bool Controller::CompareSwitcherItemsPriority(AbstractLauncherIcon* first,
382
AbstractLauncherIcon* second)
427
bool Controller::CompareSwitcherItemsPriority(AbstractLauncherIcon::Ptr first,
428
AbstractLauncherIcon::Ptr second)
384
if (first->Type() == second->Type())
430
if (first->GetIconType() == second->GetIconType())
385
431
return first->SwitcherPriority() > second->SwitcherPriority();
386
return first->Type() < second->Type();
432
return first->GetIconType() < second->GetIconType();
389
435
void Controller::SelectFirstItem()