Merge lp:~osomon/unity/4.0-dash-custom-home-screen into lp:unity/4.0

Proposed by Olivier Tilloy
Status: Merged
Approved by: Gord Allott
Approved revision: 1722
Merged at revision: 1727
Proposed branch: lp:~osomon/unity/4.0-dash-custom-home-screen
Merge into: lp:unity/4.0
Diff against target: 544 lines (+389/-59)
8 files modified
manual-tests/custom-dash-home/HomeShortcutsCustomized-4-entries.json (+22/-0)
manual-tests/custom-dash-home/HomeShortcutsCustomized-8-entries.json (+44/-0)
manual-tests/custom-dash-home/HomeShortcutsCustomized-broken.json (+23/-0)
manual-tests/custom-dash-home/custom-dash-home.txt (+46/-0)
plugins/unityshell/src/JSONParser.cpp (+13/-0)
plugins/unityshell/src/JSONParser.h (+4/-0)
plugins/unityshell/src/PlacesHomeView.cpp (+233/-59)
plugins/unityshell/src/PlacesHomeView.h (+4/-0)
To merge this branch: bzr merge lp:~osomon/unity/4.0-dash-custom-home-screen
Reviewer Review Type Date Requested Status
Unity Team Pending
Review via email: mp+85852@code.launchpad.net

Commit message

Allow customizing the dash’s home screen.

The contents of the custom home screen are described in a JSON file called HomeShortcutsCustomized.json.

The file is looked for in the following locations in decreasing order of priority:
    - $XDG_CONFIG_HOME/unity/ (defaults to $HOME/.config/unity/)
    - $DIR/unity/ for $DIR in $XDG_CONFIG_DIRS

The syntax of the file is as follows:
==========================================================================
{
  "shortcut1": {
    "source": $source,
    "name": $name,
    "name[fr]": $name_in_french,
    […]
    "icon": $icon
  },
  "shortcut2": {
    […]
  },
  […]
}
==========================================================================

The source attribute may either be a desktop file (full path or just its basename if it is located in a standard directory), or a lens file (basename only). This attribute is mandatory.
The 'name' attribute is optional. If present, it will override the default display name as advertised by the desktop file or by the lens. The name can be localized in several languages using the square brackets suffix notation, in which case the locale matching the system’s will be used, defaulting to the untranslated 'name' attribute if necessary.
The 'icon' attribute is optional. If present, it will override the default icon as advertised by the desktop file or by the lens. It should be a full path name.
If the source is a lens, the optional 'filter' attribute allows specifying a filter in the form "$name:$value", e.g. "type:videos" for the files lens.
If the source is a lens, the optional 'section' attribute allows specifying a section number (an integer starting at index 0).

To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== added directory 'manual-tests'
2=== added directory 'manual-tests/custom-dash-home'
3=== added file 'manual-tests/custom-dash-home/HomeShortcutsCustomized-4-entries.json'
4--- manual-tests/custom-dash-home/HomeShortcutsCustomized-4-entries.json 1970-01-01 00:00:00 +0000
5+++ manual-tests/custom-dash-home/HomeShortcutsCustomized-4-entries.json 2011-12-15 12:51:34 +0000
6@@ -0,0 +1,22 @@
7+{
8+ "shortcut1": {
9+ "source": "/usr/share/applications/ubuntu-software-center.desktop",
10+ "name": "Software Center",
11+ "name[fr]": "Logithèque",
12+ "icon": "/usr/share/icons/Humanity/places/64/start-here.svg"
13+ },
14+ "shortcut2": {
15+ "source": "music.lens",
16+ "filter": "genre:rock",
17+ "name": "Rock Music"
18+ },
19+ "shortcut3": {
20+ "source": "files.lens",
21+ "filter": "type:videos",
22+ "name": "Vidéos",
23+ "icon": "/usr/share/icons/Humanity/actions/64/help-about.svg"
24+ },
25+ "shortcut4": {
26+ "source": "transmission-gtk.desktop"
27+ }
28+}
29
30=== added file 'manual-tests/custom-dash-home/HomeShortcutsCustomized-8-entries.json'
31--- manual-tests/custom-dash-home/HomeShortcutsCustomized-8-entries.json 1970-01-01 00:00:00 +0000
32+++ manual-tests/custom-dash-home/HomeShortcutsCustomized-8-entries.json 2011-12-15 12:51:34 +0000
33@@ -0,0 +1,44 @@
34+{
35+ "shortcut1": {
36+ "source": "/usr/share/applications/ubuntu-software-center.desktop",
37+ "name": "Software Center",
38+ "name[fr]": "Logithèque",
39+ "icon": "/usr/share/icons/Humanity/places/64/start-here.svg"
40+ },
41+ "shortcut2": {
42+ "source": "music.lens",
43+ "filter": "genre:rock",
44+ "name": "Rock Music"
45+ },
46+ "shortcut3": {
47+ "source": "files.lens",
48+ "filter": "type:videos",
49+ "name": "Vidéos",
50+ "icon": "/usr/share/icons/Humanity/actions/64/help-about.svg"
51+ },
52+ "shortcut4": {
53+ "source": "transmission-gtk.desktop"
54+ },
55+ "shortcut5": {
56+ "source": "/usr/share/applications/eog.desktop",
57+ "name": "Eye Of Gnome",
58+ "name[de]": "Auge des Zwergs",
59+ "icon": "/usr/share/icons/hicolor/scalable/apps/eog.svg"
60+ },
61+ "shortcut6": {
62+ "source": "/usr/share/applications/jockey-gtk.desktop",
63+ "name": "Jockey",
64+ "name[de]": "Jockey",
65+ "icon": "/usr/share/icons/hicolor/scalable/apps/jockey.svg"
66+ },
67+ "shortcut7": {
68+ "source": "/usr/share/applications/gwibber.desktop",
69+ "name": "gwibber",
70+ "icon": "/usr/share/icons/hicolor/scalable/apps/gwibber.svg"
71+ },
72+ "shortcut8": {
73+ "source": "/usr/share/applications/giggle.desktop",
74+ "name": "Giggle",
75+ "icon": "/usr/share/icons/hicolor/scalable/apps/giggle.svg"
76+ }
77+}
78
79=== added file 'manual-tests/custom-dash-home/HomeShortcutsCustomized-broken.json'
80--- manual-tests/custom-dash-home/HomeShortcutsCustomized-broken.json 1970-01-01 00:00:00 +0000
81+++ manual-tests/custom-dash-home/HomeShortcutsCustomized-broken.json 2011-12-15 12:51:34 +0000
82@@ -0,0 +1,23 @@
83+this is some intentional garbage with lots of errors
84+{
85+ "shortcut1": {
86+ "source": "/usr/share/applications/ubuntu-software-center.desktop",
87+ "name": "Software Center",
88+ "name[fr]": "Logithèque",
89+ "icn": "/usr/share/icons/Humanity/places/64/start-here.svg"
90+ },
91+ "shortcut2": {
92+ "sorce": "music.lens",
93+ "filter": "genre:rock",
94+ "name": "Rock Music"
95+ },
96+ "shortcut3": {
97+ "source": "files.lens",
98+ "filter": "type:videos",
99+ "name": "Vidéos",
100+ "icon": "/usr/share/icons/Humanity/actions/64/hep-about.svg"
101+ },
102+ "shortcut12": {
103+ "source": "transmission-gtk.destop"
104+ }
105+}
106
107=== added file 'manual-tests/custom-dash-home/custom-dash-home.txt'
108--- manual-tests/custom-dash-home/custom-dash-home.txt 1970-01-01 00:00:00 +0000
109+++ manual-tests/custom-dash-home/custom-dash-home.txt 2011-12-15 12:51:34 +0000
110@@ -0,0 +1,46 @@
111+Manual tests for the 'dash custom home screen' functionality
112+============================================================
113+
114+How to test
115+-----------
116+
117+To test the functionality, create the folder $HOME/.config/unity/, and copy the
118+three files HomeShortcutsCustomized*.json there.
119+
120+Then for each of them repeat the following steps:
121+
122+ cd $HOME/.config/unity/
123+ rm HomeShortcutsCustomized.json
124+ ln -s $FILE HomeShortcutsCustomized.json # replace $FILE with the json file being considered
125+ # restart unity
126+ # open the dash
127+ # check the visual appearance against the expected results detailed below
128+
129+
130+Expected results
131+----------------
132+
133+With 'HomeShortcutsCustomized-4-entries.json', the home screen of the dash
134+contains 4 icons that fill the first row. The second row is empty.
135+Those icons are:
136+ - "Software Center": launches the Ubuntu Software Center, the icon is the
137+ Ubuntu Circle Of Friends, and if you are running with a French locale the
138+ name is localized to "Logithèque".
139+ - "Rock Music": opens the music lens with the genre filter set to "Rock".
140+ - "Vidéos": opens the files lens with the type filter set to "videos", the icon
141+ is a yellow star.
142+ - "Transmission BitTorrent Client": launches transmission-gtk.
143+
144+With 'HomeShortcutsCustomized-8-entries.json', the home screen of the dash
145+contains 8 icons that fill the two rows. The first row contains the exact same
146+icons as 'HomeShortcutsCustomized-4-entries.json' (see details above). The icons
147+on the second row are:
148+ - "Eye Of Gnome": launches eog, if you are running with a German locale the
149+ name is localized to "Auge des Zwergs".
150+ - "Jockey": launches jockey-gtk.
151+ - "gwibber": launches gwibber.
152+ - "Giggle": this icon appears only if giggle is installed, it launches giggle.
153+
154+With 'HomeShortcutsCustomized-broken.json', the home screen of the dash contains
155+the default icons because the file fails to be parsed.
156+
157
158=== modified file 'plugins/unityshell/src/JSONParser.cpp'
159--- plugins/unityshell/src/JSONParser.cpp 2011-09-15 04:28:49 +0000
160+++ plugins/unityshell/src/JSONParser.cpp 2011-12-15 12:51:34 +0000
161@@ -145,6 +145,19 @@
162 values[i] = json_array_get_double_element(array, i);
163 }
164
165+void Parser::ReadString(std::string const& node_name,
166+ std::string const& member_name,
167+ std::string& value) const
168+{
169+ JsonObject* object = GetNodeObject(node_name);
170+
171+ if (!object)
172+ return;
173+
174+ if (json_object_has_member(object, member_name.c_str()))
175+ value = json_object_get_string_member(object, member_name.c_str());
176+}
177+
178 void Parser::ReadColor(std::string const& node_name,
179 std::string const& member_name,
180 std::string const& opacity_name,
181
182=== modified file 'plugins/unityshell/src/JSONParser.h'
183--- plugins/unityshell/src/JSONParser.h 2011-09-15 04:28:49 +0000
184+++ plugins/unityshell/src/JSONParser.h 2011-12-15 12:51:34 +0000
185@@ -58,6 +58,10 @@
186 std::string const& member_name,
187 std::vector<double>& values) const;
188
189+ void ReadString(std::string const& node_name,
190+ std::string const& member_name,
191+ std::string& value) const;
192+
193 void ReadColor(std::string const& node_name,
194 std::string const& member_name,
195 std::string const& opacity_name,
196
197=== modified file 'plugins/unityshell/src/PlacesHomeView.cpp'
198--- plugins/unityshell/src/PlacesHomeView.cpp 2011-09-02 03:40:15 +0000
199+++ plugins/unityshell/src/PlacesHomeView.cpp 2011-12-15 12:51:34 +0000
200@@ -39,16 +39,25 @@
201
202 #include "PlacesHomeView.h"
203
204+#include "JSONParser.h"
205 #include "PlacesSimpleTile.h"
206 #include "PlacesStyle.h"
207 #include <UnityCore/GLibWrapper.h>
208 #include <UnityCore/Variant.h>
209
210+#include <sstream>
211 #include <string>
212 #include <vector>
213
214+#include <boost/algorithm/string.hpp>
215+
216 #define DELTA_DOUBLE_REQUEST 500000000
217
218+namespace
219+{
220+ const std::string custom_shortcuts_file = "/unity/HomeShortcutsCustomized.json";
221+}
222+
223 namespace unity
224 {
225
226@@ -136,7 +145,9 @@
227
228 expanded.connect(sigc::mem_fun(this, &PlacesHomeView::Refresh));
229
230- Refresh();
231+ // Wait for the asynchronous loading of the lenses to complete
232+ // before refreshing the view for the first time.
233+ _lenses.lenses_loaded.connect(sigc::bind(sigc::mem_fun(this, &PlacesHomeView::Refresh), (PlacesGroup*) NULL));
234 }
235
236 PlacesHomeView::~PlacesHomeView()
237@@ -163,64 +174,227 @@
238
239 _layout->Clear();
240
241- // Media Apps
242- markup = g_strdup_printf(temp, _("Media Apps"));
243- shortcut = new Shortcut(PKGDATADIR"/find_media_apps.png",
244- markup,
245- icon_size);
246- shortcut->_id = TYPE_PLACE;
247- shortcut->_place_id = g_strdup("applications.lens?filter_type=media");
248- shortcut->_place_section = 9;
249- _layout->AddView(shortcut, 1, nux::eLeft, nux::eFull);
250- shortcut->sigClick.connect(sigc::mem_fun(this, &PlacesHomeView::OnShortcutClicked));
251- g_free(markup);
252-
253- // Internet Apps
254- markup = g_strdup_printf(temp, _("Internet Apps"));
255- shortcut = new Shortcut(PKGDATADIR"/find_internet_apps.png",
256- markup,
257- icon_size);
258- shortcut->_id = TYPE_PLACE;
259- shortcut->_place_id = g_strdup("applications.lens?filter_type=internet");
260- shortcut->_place_section = 8;
261- _layout->AddView(shortcut, 1, nux::eLeft, nux::eFull);
262- shortcut->sigClick.connect(sigc::mem_fun(this, &PlacesHomeView::OnShortcutClicked));
263- g_free(markup);
264-
265- // More Apps
266- markup = g_strdup_printf(temp, _("More Apps"));
267- shortcut = new Shortcut(PKGDATADIR"/find_more_apps.png",
268- markup,
269- icon_size);
270- shortcut->_id = TYPE_PLACE;
271- shortcut->_place_id = g_strdup("applications.lens");
272- shortcut->_place_section = 0;
273- _layout->AddView(shortcut, 1, nux::eLeft, nux::eFull);
274- shortcut->sigClick.connect(sigc::mem_fun(this, &PlacesHomeView::OnShortcutClicked));
275- g_free(markup);
276-
277- // Find Files
278- markup = g_strdup_printf(temp, _("Find Files"));
279- shortcut = new Shortcut(PKGDATADIR"/find_files.png",
280- markup,
281- icon_size);
282- shortcut->_id = TYPE_PLACE;
283- shortcut->_place_id = g_strdup("files.lens");
284- shortcut->_place_section = 0;
285- _layout->AddView(shortcut, 1, nux::eLeft, nux::eFull);
286- shortcut->sigClick.connect(sigc::mem_fun(this, &PlacesHomeView::OnShortcutClicked));
287- g_free(markup);
288-
289- // Browser
290- CreateShortcutFromMime("x-scheme-handler/http", _("Browse the Web"), _browser_alternatives);
291-
292- // Photos
293- // FIXME: Need to figure out the default
294- CreateShortcutFromExec("shotwell", _("View Photos"), _photo_alternatives);
295-
296- CreateShortcutFromMime("x-scheme-handler/mailto", _("Check Email"), _email_alternatives);
297-
298- CreateShortcutFromMime("audio/x-vorbis+ogg", _("Listen to Music"), _music_alternatives);
299+ // The following code path allows one to replace the default dash home screen
300+ // with a custom home screen, the contents of which are described in a JSON
301+ // file. The file is looked for in the following locations in decreasing order
302+ // of priority:
303+ // - $XDG_CONFIG_HOME/unity/ (defaults to $HOME/.config/unity/)
304+ // - $DIR/unity/ for $DIR in $XDG_CONFIG_DIRS
305+ // The syntax of the file is as follows:
306+ // ==========================================================================
307+ // {
308+ // "shortcut1": {
309+ // "source": $source,
310+ // "name": $name,
311+ // "name[fr]": $name_in_french,
312+ // […]
313+ // "icon": $icon
314+ // },
315+ // "shortcut2": {
316+ // […]
317+ // },
318+ // […]
319+ // }
320+ // ==========================================================================
321+ // The source attribute may either be a desktop file (full path or just its
322+ // basename if it is located in a standard directory), or a lens file
323+ // (basename only). This attribute is mandatory.
324+ // The 'name' attribute is optional. If present, it will override the default
325+ // display name as advertised by the desktop file or by the lens. The name can
326+ // be localized in several languages using the square brackets suffix
327+ // notation, in which case the locale matching the system’s will be used,
328+ // defaulting to the untranslated 'name' attribute if necessary.
329+ // The 'icon' attribute is optional. If present, it will override the default
330+ // icon as advertised by the desktop file or by the lens. It should be a full
331+ // path name.
332+ // If the source is a lens, the optional 'filter' attribute allows specifying
333+ // a filter in the form "$name:$value", e.g. "type:videos" for the files lens.
334+ // If the source is a lens, the optional 'section' attribute allows specifying
335+ // a section number (an integer starting at index 0).
336+
337+ std::string customShortcuts;
338+ std::ostringstream file;
339+ // Look for a custom shortcuts file in the user’s home directory first.
340+ file << g_get_user_config_dir() << custom_shortcuts_file;
341+ if (g_file_test(file.str().c_str(), G_FILE_TEST_EXISTS))
342+ {
343+ customShortcuts = file.str();
344+ }
345+ else
346+ {
347+ // Fall back on the standard XDG directories.
348+ gchar** config = (gchar**) g_get_system_config_dirs();
349+ for (gint i = 0; config[i]; ++i)
350+ {
351+ std::ostringstream file;
352+ file << config[i] << custom_shortcuts_file;
353+ if (g_file_test(file.str().c_str(), G_FILE_TEST_EXISTS))
354+ {
355+ customShortcuts = file.str();
356+ break;
357+ }
358+ }
359+ }
360+ json::Parser parser;
361+ if ((customShortcuts == "") || !parser.Open(customShortcuts))
362+ {
363+ // Media Apps
364+ markup = g_strdup_printf(temp, _("Media Apps"));
365+ shortcut = new Shortcut(PKGDATADIR"/find_media_apps.png",
366+ markup,
367+ icon_size);
368+ shortcut->_id = TYPE_PLACE;
369+ shortcut->_place_id = g_strdup("applications.lens?filter_type=media");
370+ shortcut->_place_section = 9;
371+ _layout->AddView(shortcut, 1, nux::eLeft, nux::eFull);
372+ shortcut->sigClick.connect(sigc::mem_fun(this, &PlacesHomeView::OnShortcutClicked));
373+ g_free(markup);
374+
375+ // Internet Apps
376+ markup = g_strdup_printf(temp, _("Internet Apps"));
377+ shortcut = new Shortcut(PKGDATADIR"/find_internet_apps.png",
378+ markup,
379+ icon_size);
380+ shortcut->_id = TYPE_PLACE;
381+ shortcut->_place_id = g_strdup("applications.lens?filter_type=internet");
382+ shortcut->_place_section = 8;
383+ _layout->AddView(shortcut, 1, nux::eLeft, nux::eFull);
384+ shortcut->sigClick.connect(sigc::mem_fun(this, &PlacesHomeView::OnShortcutClicked));
385+ g_free(markup);
386+
387+ // More Apps
388+ markup = g_strdup_printf(temp, _("More Apps"));
389+ shortcut = new Shortcut(PKGDATADIR"/find_more_apps.png",
390+ markup,
391+ icon_size);
392+ shortcut->_id = TYPE_PLACE;
393+ shortcut->_place_id = g_strdup("applications.lens");
394+ shortcut->_place_section = 0;
395+ _layout->AddView(shortcut, 1, nux::eLeft, nux::eFull);
396+ shortcut->sigClick.connect(sigc::mem_fun(this, &PlacesHomeView::OnShortcutClicked));
397+ g_free(markup);
398+
399+ // Find Files
400+ markup = g_strdup_printf(temp, _("Find Files"));
401+ shortcut = new Shortcut(PKGDATADIR"/find_files.png",
402+ markup,
403+ icon_size);
404+ shortcut->_id = TYPE_PLACE;
405+ shortcut->_place_id = g_strdup("files.lens");
406+ shortcut->_place_section = 0;
407+ _layout->AddView(shortcut, 1, nux::eLeft, nux::eFull);
408+ shortcut->sigClick.connect(sigc::mem_fun(this, &PlacesHomeView::OnShortcutClicked));
409+ g_free(markup);
410+
411+ // Browser
412+ CreateShortcutFromMime("x-scheme-handler/http", _("Browse the Web"), _browser_alternatives);
413+
414+ // Photos
415+ // FIXME: Need to figure out the default
416+ CreateShortcutFromExec("shotwell", _("View Photos"), _photo_alternatives);
417+
418+ CreateShortcutFromMime("x-scheme-handler/mailto", _("Check Email"), _email_alternatives);
419+
420+ CreateShortcutFromMime("audio/x-vorbis+ogg", _("Listen to Music"), _music_alternatives);
421+ }
422+ else
423+ {
424+ // The custom shortcuts file can contain up to 8 shortcuts.
425+ for (int i = 0; i < 8; ++i)
426+ {
427+ std::ostringstream oss;
428+ oss << "shortcut" << (i + 1);
429+ std::string slot = oss.str();
430+ std::string source;
431+ parser.ReadString(slot, "source", source);
432+ if (source != "")
433+ {
434+ std::string icon;
435+ parser.ReadString(slot, "icon", icon);
436+
437+ std::string name;
438+ gchar** languages = (gchar**) g_get_language_names();
439+ for (gint i = 0; languages[i]; ++i)
440+ {
441+ std::ostringstream key;
442+ key << "name[" << languages[i] << "]";
443+ parser.ReadString(slot, key.str(), name);
444+ if (name != "")
445+ break;
446+ }
447+ if (name == "")
448+ {
449+ parser.ReadString(slot, "name", name);
450+ }
451+
452+ if (boost::iends_with(source, ".desktop"))
453+ {
454+ GDesktopAppInfo* info = NULL;
455+ if (boost::istarts_with(source, "/"))
456+ info = g_desktop_app_info_new_from_filename(source.c_str());
457+ else
458+ info = g_desktop_app_info_new(source.c_str());
459+ if (G_IS_DESKTOP_APP_INFO(info))
460+ {
461+ if (name == "")
462+ name = g_app_info_get_display_name(G_APP_INFO(info));
463+ if (icon == "")
464+ {
465+ gchar* cicon = g_icon_to_string(g_app_info_get_icon(G_APP_INFO(info)));
466+ icon = cicon;
467+ g_free(cicon);
468+ }
469+ gchar* exec = g_strdup(g_app_info_get_executable(G_APP_INFO(info)));
470+ markup = g_strdup_printf(temp, name.c_str());
471+ shortcut = new Shortcut(icon.c_str(), markup, style->GetHomeTileIconSize());
472+ shortcut->_id = TYPE_EXEC;
473+ shortcut->_exec = exec;
474+ _layout->AddView(shortcut, 1, nux::eLeft, nux::eFull);
475+ shortcut->sigClick.connect(sigc::mem_fun(this, &PlacesHomeView::OnShortcutClicked));
476+ g_free(markup);
477+ g_object_unref(info);
478+ }
479+ }
480+ else if (boost::iends_with(source, ".lens"))
481+ {
482+ unity::dash::Lens::Ptr lens = _lenses.GetLens(source);
483+ if (lens)
484+ {
485+ if (name == "")
486+ name = lens->name;
487+ if (icon == "")
488+ icon = lens->icon_hint;
489+ }
490+ std::string filter;
491+ parser.ReadString(slot, "filter", filter);
492+ int section = -1;
493+ parser.ReadInt(slot, "section", section);
494+ markup = g_strdup_printf(temp, name.c_str());
495+ shortcut = new Shortcut(icon.c_str(), markup, style->GetHomeTileIconSize());
496+ shortcut->_id = TYPE_PLACE;
497+ if (filter != "")
498+ {
499+ std::vector<std::string> filter_key_value;
500+ boost::split(filter_key_value, filter, boost::is_any_of(":"));
501+ if (filter_key_value.size() == 2)
502+ shortcut->_place_id = g_strdup_printf("%s?filter_%s=%s",
503+ source.c_str(),
504+ filter_key_value[0].c_str(),
505+ filter_key_value[1].c_str());
506+ else
507+ shortcut->_place_id = g_strdup(source.c_str());
508+ }
509+ else
510+ shortcut->_place_id = g_strdup(source.c_str());
511+ if (section != -1)
512+ shortcut->_place_section = section;
513+ _layout->AddView(shortcut, 1, nux::eLeft, nux::eFull);
514+ shortcut->sigClick.connect(sigc::mem_fun(this, &PlacesHomeView::OnShortcutClicked));
515+ g_free(markup);
516+ }
517+ }
518+ }
519+ }
520
521 SetExpanded(true);
522 SetCounts(8, 8);
523
524=== modified file 'plugins/unityshell/src/PlacesHomeView.h'
525--- plugins/unityshell/src/PlacesHomeView.h 2011-09-02 03:40:15 +0000
526+++ plugins/unityshell/src/PlacesHomeView.h 2011-12-15 12:51:34 +0000
527@@ -29,6 +29,8 @@
528
529 #include <Nux/GridHLayout.h>
530
531+#include <UnityCore/FilesystemLenses.h>
532+
533 #include "PlacesTile.h"
534 #include "PlacesGroup.h"
535
536@@ -67,6 +69,8 @@
537 std::vector<std::string> _music_alternatives;
538
539 guint _ubus_handle;
540+
541+ unity::dash::FilesystemLenses _lenses;
542 };
543
544 }

Subscribers

People subscribed via source and target branches

to all changes: