Merge lp:~3v1n0/unity/app-title-icon-properties into lp:unity

Proposed by Marco Trevisan (Treviño)
Status: Merged
Approved by: Andrea Azzarone
Approved revision: no longer in the source branch.
Merged at revision: 3387
Proposed branch: lp:~3v1n0/unity/app-title-icon-properties
Merge into: lp:unity
Diff against target: 531 lines (+94/-92)
14 files modified
debian/control (+1/-1)
launcher/ApplicationLauncherIcon.cpp (+13/-14)
launcher/ApplicationLauncherIcon.h (+2/-0)
launcher/MockLauncherIcon.h (+5/-3)
launcher/StandaloneLauncher.cpp (+2/-0)
panel/PanelMenuView.cpp (+4/-1)
panel/PanelMenuView.h (+1/-0)
tests/mock-application.h (+15/-22)
tests/test_application_launcher_icon.cpp (+8/-10)
tests/test_switcher_controller.h (+0/-2)
tests/test_switcher_controller_class.cpp (+3/-2)
unity-shared/ApplicationManager.h (+6/-4)
unity-shared/BamfApplicationManager.cpp (+32/-27)
unity-shared/BamfApplicationManager.h (+2/-6)
To merge this branch: bzr merge lp:~3v1n0/unity/app-title-icon-properties
Reviewer Review Type Date Requested Status
Andrea Azzarone (community) Approve
PS Jenkins bot (community) continuous-integration Approve
Review via email: mp+171770@code.launchpad.net

Commit message

ApplicationManager: Use nux::ROProperty for Window and Application title and icon

So BamfApplicationManager connect to {name,icon}-changed signals, set getters for properties
and ApplicationLauncherIcon update icon tooltip_text and icon when App title/icon changes

Description of the change

Use nux::ROProperty's to handle an application title and icon, update the code to work with it and connect to related BamfApplication signals so that we can update these values if they change (unlikely, but it can happen on some desktop-less applications, especially after that lp:~3v1n0/bamf/app-main-view will land).

Removed one workaround that is not needed anymore since we moved to libgdbus properties on libbamf.

Tests updated.

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Andrea Azzarone (azzar1) wrote :

LGTM.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'debian/control'
2--- debian/control 2013-06-26 14:29:55 +0000
3+++ debian/control 2013-06-27 10:54:34 +0000
4@@ -15,7 +15,7 @@
5 libsigc++-2.0-dev,
6 libgee-dev (>= 0.5.0),
7 libunique-dev,
8- libbamf3-dev (>= 0.4),
9+ libbamf3-dev (>= 0.5.0+13.10.20130626),
10 gsettings-desktop-schemas-dev,
11 libglib2.0-dev (>= 2.30),
12 libdbusmenu-glib-dev (>= 0.3.91),
13
14=== modified file 'launcher/ApplicationLauncherIcon.cpp'
15--- launcher/ApplicationLauncherIcon.cpp 2013-05-17 22:53:57 +0000
16+++ launcher/ApplicationLauncherIcon.cpp 2013-06-27 10:54:34 +0000
17@@ -69,7 +69,7 @@
18 app->seen = true;
19
20 tooltip_text = app->title();
21- std::string icon = app->icon();
22+ std::string const& icon = app->icon();
23 icon_name = (icon.empty() ? DEFAULT_ICON : icon);
24
25 SetQuirk(Quirk::VISIBLE, app->visible());
26@@ -148,6 +148,16 @@
27 SetQuirk(Quirk::ACTIVE, active);
28 });
29
30+ title_changed_connection_ = app_->title.changed.connect([this](std::string const& name) {
31+ LOG_DEBUG(logger) << tooltip_text() << " name now " << name;
32+ tooltip_text = name;
33+ });
34+
35+ icon_changed_connection_ = app_->icon.changed.connect([this](std::string const& icon) {
36+ LOG_DEBUG(logger) << tooltip_text() << " icon now " << icon;
37+ icon_name = (icon.empty() ? DEFAULT_ICON : icon);
38+ });
39+
40 running_changed_connection_ = app_->running.changed.connect([this](bool const& running) {
41 LOG_DEBUG(logger) << tooltip_text() << " running now " << (running ? "true" : "false");
42 SetQuirk(Quirk::RUNNING, running);
43@@ -156,19 +166,6 @@
44 {
45 _source_manager.Remove(ICON_REMOVE_TIMEOUT);
46
47- /* It can happen that these values are not set
48- * during initialization if the view is closed
49- * very early, so we need to make sure that they
50- * are updated as soon as the view is re-opened. */
51- if (tooltip_text().empty())
52- tooltip_text = app_->title();
53-
54- if (icon_name == DEFAULT_ICON)
55- {
56- std::string icon = app_->icon();
57- icon_name = (icon.empty() ? DEFAULT_ICON : icon);
58- }
59-
60 EnsureWindowState();
61 UpdateIconGeometries(GetCenters());
62 }
63@@ -207,6 +204,8 @@
64 active_changed_connection_.disconnect();
65 running_changed_connection_.disconnect();
66 visible_changed_connection_.disconnect();
67+ title_changed_connection_.disconnect();
68+ icon_changed_connection_.disconnect();
69 closed_changed_connection_.disconnect();
70 }
71
72
73=== modified file 'launcher/ApplicationLauncherIcon.h'
74--- launcher/ApplicationLauncherIcon.h 2013-05-17 22:53:57 +0000
75+++ launcher/ApplicationLauncherIcon.h 2013-06-27 10:54:34 +0000
76@@ -153,6 +153,8 @@
77 sigc::connection window_opened_connection_;
78 sigc::connection window_closed_connection_;
79 sigc::connection window_moved_connection_;
80+ sigc::connection icon_changed_connection_;
81+ sigc::connection title_changed_connection_;
82 sigc::connection urgent_changed_connection_;
83 sigc::connection active_changed_connection_;
84 sigc::connection running_changed_connection_;
85
86=== modified file 'launcher/MockLauncherIcon.h'
87--- launcher/MockLauncherIcon.h 2013-05-17 22:53:57 +0000
88+++ launcher/MockLauncherIcon.h 2013-06-27 10:54:34 +0000
89@@ -43,10 +43,12 @@
90 class MockApplicationWindow : public ApplicationWindow
91 {
92 public:
93- MockApplicationWindow(Window xid) : xid_(xid) {}
94+ MockApplicationWindow(Window xid) : xid_(xid)
95+ {
96+ title.SetGetterFunction([this] { return "MockApplicationWindow"; });
97+ icon.SetGetterFunction([this] { return ""; });
98+ }
99
100- std::string title() const { return "MockApplicationWindow"; }
101- virtual std::string icon() const { return ""; }
102 virtual std::string type() const { return "mock"; }
103
104 virtual Window window_id() const { return xid_; }
105
106=== modified file 'launcher/StandaloneLauncher.cpp'
107--- launcher/StandaloneLauncher.cpp 2013-03-19 12:41:22 +0000
108+++ launcher/StandaloneLauncher.cpp 2013-06-27 10:54:34 +0000
109@@ -21,6 +21,7 @@
110 #include <Nux/Nux.h>
111 #include <Nux/NuxTimerTickSource.h>
112 #include <NuxCore/AnimationController.h>
113+#include <NuxCore/Logger.h>
114 #include <gtk/gtk.h>
115
116 #include "unity-shared/BackgroundEffectHelper.h"
117@@ -96,6 +97,7 @@
118 int main(int argc, char** argv)
119 {
120 gtk_init(&argc, &argv);
121+ nux::logging::configure_logging(::getenv("UNITY_LOG_SEVERITY"));
122 nux::NuxInitialize(0);
123
124 LauncherWindow lc;
125
126=== modified file 'panel/PanelMenuView.cpp'
127--- panel/PanelMenuView.cpp 2013-02-21 13:43:48 +0000
128+++ panel/PanelMenuView.cpp 2013-06-27 10:54:34 +0000
129@@ -1019,6 +1019,10 @@
130 {
131 if (BAMF_IS_APPLICATION(new_app))
132 {
133+ app_name_changed_signal_.Disconnect();
134+ app_name_changed_signal_.Connect(BAMF_VIEW(new_app), "name-changed",
135+ sigc::mem_fun(this, &PanelMenuView::OnNameChanged));
136+
137 if (std::find(new_apps_.begin(), new_apps_.end(), new_app) != new_apps_.end())
138 {
139 if (new_application_ != new_app)
140@@ -1087,7 +1091,6 @@
141
142 // first see if we need to remove and old callback
143 view_name_changed_signal_.Disconnect();
144-
145 // register callback for new view
146 view_name_changed_signal_.Connect(new_view, "name-changed",
147 sigc::mem_fun(this, &PanelMenuView::OnNameChanged));
148
149=== modified file 'panel/PanelMenuView.h'
150--- panel/PanelMenuView.h 2013-02-01 18:13:40 +0000
151+++ panel/PanelMenuView.h 2013-06-27 10:54:34 +0000
152@@ -194,6 +194,7 @@
153 glib::Signal<void, BamfMatcher*, BamfView*, BamfView*> active_win_changed_signal_;
154 glib::Signal<void, BamfMatcher*, BamfApplication*, BamfApplication*> active_app_changed_signal_;
155 glib::Signal<void, BamfView*, gchar*, gchar*> view_name_changed_signal_;
156+ glib::Signal<void, BamfView*, gchar*, gchar*> app_name_changed_signal_;
157 sigc::connection style_changed_connection_;
158
159 UBusManager ubus_manager_;
160
161=== modified file 'tests/mock-application.h'
162--- tests/mock-application.h 2013-04-17 19:16:54 +0000
163+++ tests/mock-application.h 2013-06-27 10:54:34 +0000
164@@ -40,6 +40,8 @@
165 visible.SetGetterFunction([this] { return visible_; });
166 active.SetGetterFunction([this] { return active_; });
167 urgent.SetGetterFunction([this] { return urgent_; });
168+ title.SetGetterFunction([this] { return title_; });
169+ icon.SetGetterFunction([this] { return icon_; });
170 }
171
172 Window xid_;
173@@ -52,8 +54,6 @@
174 bool active_;
175 bool urgent_;
176
177- virtual std::string title() const { return title_; }
178- virtual std::string icon() const { return icon_; }
179 virtual std::string type() const { return type_; }
180
181 virtual Window window_id() const { return xid_; }
182@@ -73,11 +73,11 @@
183 struct MockApplication : unity::Application
184 {
185 MockApplication(std::string const& desktop_file,
186- std::string const& icon = "",
187- std::string const& title = "")
188+ std::string const& icon_name = "",
189+ std::string const& title_str = "")
190 : desktop_file_(desktop_file)
191- , icon_(icon)
192- , title_(title)
193+ , icon_(icon_name)
194+ , title_(title_str)
195 , seen_(false)
196 , sticky_(false)
197 , visible_(false)
198@@ -86,14 +86,17 @@
199 , urgent_(false)
200 , type_("mock")
201 {
202- seen.SetGetterFunction(sigc::mem_fun(this, &MockApplication::GetSeen));
203 seen.SetSetterFunction(sigc::mem_fun(this, &MockApplication::SetSeen));
204- sticky.SetGetterFunction(sigc::mem_fun(this, &MockApplication::GetSticky));
205 sticky.SetSetterFunction(sigc::mem_fun(this, &MockApplication::SetSticky));
206- visible.SetGetterFunction(sigc::mem_fun(this, &MockApplication::GetVisible));
207- active.SetGetterFunction(sigc::mem_fun(this, &MockApplication::GetActive));
208- running.SetGetterFunction(sigc::mem_fun(this, &MockApplication::GetRunning));
209- urgent.SetGetterFunction(sigc::mem_fun(this, &MockApplication::GetUrgent));
210+
211+ seen.SetGetterFunction([this] { return seen_; });
212+ sticky.SetGetterFunction([this] { return sticky_; });
213+ visible.SetGetterFunction([this] { return visible_; });
214+ active.SetGetterFunction([this] { return active_; });
215+ running.SetGetterFunction([this] { return running_; });
216+ urgent.SetGetterFunction([this] { return urgent_; });
217+ title.SetGetterFunction([this] { return title_; });
218+ icon.SetGetterFunction([this] { return icon_; });
219 }
220
221 std::string desktop_file_;
222@@ -108,9 +111,6 @@
223 unity::WindowList windows_;
224 std::string type_;
225
226-
227- virtual std::string icon() const { return icon_; }
228- virtual std::string title() const { return title_; }
229 virtual std::string desktop_file() const { return desktop_file_; }
230 virtual std::string type() const { return type_; }
231 virtual std::string repr() const { return "MockApplication"; }
232@@ -133,7 +133,6 @@
233 running.changed.emit(state);
234 }
235
236- bool GetSeen() const { return seen_; }
237 bool SetSeen(bool const& param) {
238 if (param != seen_) {
239 seen_ = param;
240@@ -142,7 +141,6 @@
241 return false;
242 }
243
244- bool GetSticky() const { return sticky_; }
245 bool SetSticky(bool const& param) {
246 if (param != sticky_) {
247 sticky_ = param;
248@@ -158,11 +156,6 @@
249 active_ = state;
250 active.changed.emit(state);
251 }
252-
253- bool GetVisible() const { return visible_; }
254- bool GetActive() const { return active_; }
255- bool GetRunning() const { return running_; }
256- bool GetUrgent() const { return urgent_; }
257 };
258
259 class MockApplicationManager : public unity::ApplicationManager
260
261=== modified file 'tests/test_application_launcher_icon.cpp'
262--- tests/test_application_launcher_icon.cpp 2013-05-17 22:02:43 +0000
263+++ tests/test_application_launcher_icon.cpp 2013-06-27 10:54:34 +0000
264@@ -195,35 +195,33 @@
265 EXPECT_TRUE(mock_icon->RemoteUri().empty());
266 }
267
268-TEST_F(TestApplicationLauncherIcon, EmptyTooltipUpdatesOnRunning)
269+TEST_F(TestApplicationLauncherIcon, TooltipUpdates)
270 {
271 ASSERT_TRUE(mock_icon->tooltip_text().empty());
272 mock_app->title_ = "Got Name";
273 ASSERT_TRUE(mock_icon->tooltip_text().empty());
274
275- mock_app->SetRunState(true);
276+ mock_app->title.changed.emit(mock_app->title_);
277 EXPECT_EQ(mock_icon->tooltip_text(), "Got Name");
278
279- mock_app->SetRunState(false);
280 mock_app->title_ = "New Name";
281- mock_app->SetRunState(true);
282- EXPECT_EQ(mock_icon->tooltip_text(), "Got Name");
283+ mock_app->title.changed.emit(mock_app->title_);
284+ EXPECT_EQ(mock_icon->tooltip_text(), "New Name");
285 }
286
287-TEST_F(TestApplicationLauncherIcon, InvalidIconUpdatesOnRunning)
288+TEST_F(TestApplicationLauncherIcon, IconUpdates)
289 {
290 ASSERT_EQ(mock_icon->icon_name(), DEFAULT_EMPTY_ICON);
291 mock_app->icon_ = "icon-name";
292
293 ASSERT_EQ(mock_icon->icon_name(), DEFAULT_EMPTY_ICON);
294
295- mock_app->SetRunState(true);
296+ mock_app->icon.changed.emit(mock_app->icon_);
297 EXPECT_EQ(mock_icon->icon_name(), "icon-name");
298
299- mock_app->SetRunState(false);
300 mock_app->icon_ = "new-icon-name";
301- mock_app->SetRunState(true);
302- EXPECT_EQ(mock_icon->icon_name(), "icon-name");
303+ mock_app->icon.changed.emit(mock_app->icon_);
304+ EXPECT_EQ(mock_icon->icon_name(), "new-icon-name");
305 }
306
307 TEST_F(TestApplicationLauncherIcon, PerformScrollTowardsTheUser)
308
309=== modified file 'tests/test_switcher_controller.h'
310--- tests/test_switcher_controller.h 2013-05-17 22:53:57 +0000
311+++ tests/test_switcher_controller.h 2013-06-27 10:54:34 +0000
312@@ -54,8 +54,6 @@
313 public:
314 FakeApplicationWindow(Window xid, uint64_t active_number = 0);
315
316- std::string title() const;
317- virtual std::string icon() const;
318 virtual std::string type() const;
319
320 virtual Window window_id() const;
321
322=== modified file 'tests/test_switcher_controller_class.cpp'
323--- tests/test_switcher_controller_class.cpp 2013-05-17 22:53:57 +0000
324+++ tests/test_switcher_controller_class.cpp 2013-06-27 10:54:34 +0000
325@@ -32,10 +32,11 @@
326 auto standalone_window = std::make_shared<StandaloneWindow>(xid_);
327 standalone_window->active_number = active_number;
328 WM->AddStandaloneWindow(standalone_window);
329+
330+ title.SetGetterFunction([this] { return "FakeApplicationWindow"; });
331+ icon.SetGetterFunction([this] { return ""; });
332 }
333
334-std::string FakeApplicationWindow::title() const { return "FakeApplicationWindow"; }
335-std::string FakeApplicationWindow::icon() const { return ""; }
336 std::string FakeApplicationWindow::type() const { return "mock"; }
337
338 Window FakeApplicationWindow::window_id() const { return xid_; }
339
340=== modified file 'unity-shared/ApplicationManager.h'
341--- unity-shared/ApplicationManager.h 2012-12-19 22:34:22 +0000
342+++ unity-shared/ApplicationManager.h 2013-06-27 10:54:34 +0000
343@@ -46,8 +46,6 @@
344 public:
345 virtual ~ApplicationWindow() {}
346
347- virtual std::string title() const = 0;
348- virtual std::string icon() const = 0;
349 virtual std::string type() const = 0; // 'window' or 'tab'
350
351 virtual Window window_id() const = 0;
352@@ -62,6 +60,9 @@
353 // Closes the window, or the browser tab if a webapp.
354 virtual void Quit() const = 0;
355
356+ nux::ROProperty<std::string> title;
357+ nux::ROProperty<std::string> icon;
358+
359 nux::ROProperty<bool> visible;
360 nux::ROProperty<bool> active;
361 nux::ROProperty<bool> urgent;
362@@ -73,8 +74,6 @@
363 public:
364 virtual ~Application() {}
365
366- virtual std::string icon() const = 0;
367- virtual std::string title() const = 0;
368 virtual std::string desktop_file() const = 0;
369 virtual std::string type() const = 0;
370
371@@ -91,6 +90,9 @@
372 // Calls quit on all the Windows for this application.
373 virtual void Quit() const = 0;
374
375+ nux::ROProperty<std::string> title;
376+ nux::ROProperty<std::string> icon;
377+
378 // Considering using a property for the "unity-seen" quark
379 nux::RWProperty<bool> seen;
380 nux::RWProperty<bool> sticky;
381
382=== modified file 'unity-shared/BamfApplicationManager.cpp'
383--- unity-shared/BamfApplicationManager.cpp 2013-06-01 02:10:49 +0000
384+++ unity-shared/BamfApplicationManager.cpp 2013-06-27 10:54:34 +0000
385@@ -44,12 +44,12 @@
386 {
387 }
388
389-std::string View::title() const
390+std::string View::GetTitle() const
391 {
392 return glib::String(bamf_view_get_name(bamf_view_)).Str();
393 }
394
395-std::string View::icon() const
396+std::string View::GetIcon() const
397 {
398 return glib::String(bamf_view_get_icon(bamf_view_)).Str();
399 }
400@@ -81,15 +81,32 @@
401 }
402
403
404+std::string WindowBase::type() const
405+{
406+ return View::type();
407+}
408+
409 WindowBase::WindowBase(ApplicationManager const& manager,
410 glib::Object<BamfView> const& window)
411 : View(manager, window)
412 {
413+ title.SetGetterFunction(sigc::mem_fun(this, &View::GetTitle));
414+ icon.SetGetterFunction(sigc::mem_fun(this, &View::GetIcon));
415 visible.SetGetterFunction(sigc::mem_fun(this, &View::GetVisible));
416 active.SetGetterFunction(sigc::mem_fun(this, &View::GetActive));
417 urgent.SetGetterFunction(sigc::mem_fun(this, &View::GetUrgent));
418
419 glib::SignalBase* sig;
420+ sig = new glib::Signal<void, BamfView*, const char*, const char*>(bamf_view_, "name-changed",
421+ [this] (BamfView*, const char*, const char* new_name) {
422+ this->title.changed.emit(glib::gchar_to_string(new_name));
423+ });
424+ signals_.Add(sig);
425+ sig = new glib::Signal<void, BamfView*, const char*>(bamf_view_, "icon-changed",
426+ [this] (BamfView*, const char* icon) {
427+ this->icon.changed.emit(glib::gchar_to_string(icon));
428+ });
429+ signals_.Add(sig);
430 sig = new glib::Signal<void, BamfView*, gboolean>(bamf_view_, "user-visible-changed",
431 [this] (BamfView*, gboolean visible) {
432 this->visible.changed.emit(visible);
433@@ -107,21 +124,6 @@
434 signals_.Add(sig);
435 }
436
437-std::string WindowBase::title() const
438-{
439- return View::title();
440-}
441-
442-std::string WindowBase::icon() const
443-{
444- return View::icon();
445-}
446-
447-std::string WindowBase::type() const
448-{
449- return View::type();
450-}
451-
452 bool WindowBase::Focus() const
453 {
454 Window xid = window_id();
455@@ -238,6 +240,8 @@
456 void Application::HookUpEvents()
457 {
458 // Hook up the property set/get functions
459+ title.SetGetterFunction(sigc::mem_fun(this, &View::GetTitle));
460+ icon.SetGetterFunction(sigc::mem_fun(this, &View::GetIcon));
461 seen.SetGetterFunction(sigc::mem_fun(this, &Application::GetSeen));
462 seen.SetSetterFunction(sigc::mem_fun(this, &Application::SetSeen));
463 sticky.SetGetterFunction(sigc::mem_fun(this, &Application::GetSticky));
464@@ -247,7 +251,18 @@
465 running.SetGetterFunction(sigc::mem_fun(this, &View::GetRunning));
466 urgent.SetGetterFunction(sigc::mem_fun(this, &View::GetUrgent));
467
468+ // Use signals_.Add....
469 glib::SignalBase* sig;
470+ sig = new glib::Signal<void, BamfView*, const char*, const char*>(bamf_view_, "name-changed",
471+ [this] (BamfView*, const char*, const char* new_name) {
472+ this->title.changed.emit(glib::gchar_to_string(new_name));
473+ });
474+ signals_.Add(sig);
475+ sig = new glib::Signal<void, BamfView*, const char*>(bamf_view_, "icon-changed",
476+ [this] (BamfView*, const char* icon) {
477+ this->icon.changed.emit(glib::gchar_to_string(icon));
478+ });
479+ signals_.Add(sig);
480 sig = new glib::Signal<void, BamfView*, gboolean>(bamf_view_, "user-visible-changed",
481 [this] (BamfView*, gboolean visible) {
482 LOG_TRACE(logger) << "user-visible-changed " << visible;
483@@ -305,16 +320,6 @@
484 signals_.Add(sig);
485 }
486
487-std::string Application::title() const
488-{
489- return View::title();
490-}
491-
492-std::string Application::icon() const
493-{
494- return View::icon();
495-}
496-
497 std::string Application::desktop_file() const
498 {
499 const gchar* file = bamf_application_get_desktop_file(bamf_app_);
500
501=== modified file 'unity-shared/BamfApplicationManager.h'
502--- unity-shared/BamfApplicationManager.h 2012-12-19 22:34:22 +0000
503+++ unity-shared/BamfApplicationManager.h 2013-06-27 10:54:34 +0000
504@@ -37,8 +37,8 @@
505 View(ApplicationManager const& manager,
506 glib::Object<BamfView> const& view);
507
508- std::string title() const;
509- std::string icon() const;
510+ std::string GetTitle() const;
511+ std::string GetIcon() const;
512 std::string type() const;
513
514 bool GetVisible() const;
515@@ -59,8 +59,6 @@
516 glib::Object<BamfView> const& window);
517
518 public:
519- virtual std::string title() const;
520- virtual std::string icon() const;
521 virtual std::string type() const; // 'window' or 'tab'
522
523 virtual bool Focus() const;
524@@ -110,8 +108,6 @@
525 Application(ApplicationManager const& manager,
526 glib::Object<BamfApplication> const& app);
527
528- virtual std::string title() const;
529- virtual std::string icon() const;
530 virtual std::string desktop_file() const;
531 virtual std::string type() const;
532