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

Proposed by Olivier Tilloy
Status: Rejected
Rejected by: Gord Allott
Proposed branch: lp:~osomon/unity/dash-custom-home-screen
Merge into: lp:unity
Diff against target: 387 lines (+254/-59)
4 files modified
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/dash-custom-home-screen
Reviewer Review Type Date Requested Status
Olivier Tilloy Disapprove
Gord Allott (community) Needs Information
Review via email: mp+83175@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).

Description of the change

So it seems that the patch I wrote some time ago to make the home screen of the dash customizable just like in unity-2d is being considered for inclusion in Oneiric…

I refreshed it to apply against the current trunk, functional testing and comments are welcome. Please bear with me as I’m not really familiar with unity’s code base, coding style and conventions.

To post a comment you must log in.
Revision history for this message
Mikkel Kamstrup Erlandsen (kamstrup) wrote :

I am not sure how this relates to bug #885738...

Revision history for this message
Olivier Tilloy (osomon) wrote :

Yeah, I know this is in apparent contradiction with the description of bug #885738 and with what was discussed at UDS.
But OEM needs this functionality for a project running Oneiric, and they want the patch reviewed and approved by Unity core developers, hence this merge request. Whether it should actually be merged into trunk is beyond me, but a review and functional tests would be nice. Thanks!

Revision history for this message
Gary Ekker (gekker) wrote :

We need an SRU for oneiric that includes this patch.

As per bug #885738, this won't be a problem for precise and beyond.

Revision history for this message
Gord Allott (gordallott) wrote :

On 23/11/11 15:31, Olivier Tilloy wrote:
> Olivier Tilloy has proposed merging lp:~osomon/unity/dash-custom-home-screen into lp:unity.
>
> Requested reviews:
> Unity Team (unity-team): code functional
> Related bugs:
> Bug #785840 in unity: "Home dash icons need to be customizable"
> https://bugs.launchpad.net/unity/+bug/785840
>
> For more details, see:
> https://code.launchpad.net/~osomon/unity/dash-custom-home-screen/+merge/83175
>
> So it seems that the patch I wrote some time ago to make the home screen of the dash customizable just like in unity-2d is being considered for inclusion in Oneiric…
>
> I refreshed it to apply against the current trunk, functional testing and comments are welcome. Please bear with me as I’m not really familiar with unity’s code base, coding style and conventions.

So I have a few questions and a few notes;

I have some concerns over adding extra translation in a non standard
format, there are good well established formats for .desktop files and
in source code, but nothing for a custom json file. We should really
either be extending the desktop files to include an even more generic
name that is translated such as:
X-Unity-Generic-Action=Browse the web

or creating new desktop files and installing them somewhere like
/usr/share/unity/dash/home - using those to store the required
information. I'd like a compelling reason to be using json over desktop
files really.

I'm not a fan of having the old code and this new code sit side-by-side,
we should stick to one method and lose the other. Which means that we
should be including a default json file in unity that gets installed to
somewhere sane like /usr/share/unity/dash/.

There is also an issue in that non of this is tested, thus it can't be
approved until tests exist.

small thing, but style wise, we shouldn't be using #define's, (the
define that exists is from quite old code before we started using this
style)

namespace
{
  std::string custom_shortcuts_file =
"/unity/HomeShortcuts/Customized.json";
}

is a preferred style.

Apart from that the code looks good

 review needs-info

--
Gordon Allott
Canonical Ltd.
27 Floor, Millbank Tower
London SW1P 4QP
www.canonical.com

review: Needs Information
1741. By Olivier Tilloy

Cosmetics: replace a #define by a global variable in the unnamed namespace.

Revision history for this message
Olivier Tilloy (osomon) wrote :

Thanks for the review Gordon!

> I have some concerns over adding extra translation in a non standard
> format, there are good well established formats for .desktop files and
> in source code, but nothing for a custom json file. We should really
> either be extending the desktop files to include an even more generic
> name that is translated such as:
> X-Unity-Generic-Action=Browse the web
>
> or creating new desktop files and installing them somewhere like
> /usr/share/unity/dash/home - using those to store the required
> information. I'd like a compelling reason to be using json over desktop
> files really.

Right, installing desktop files in a custom location to override attributes such as (translated) name, icon, etc. sounds like a good option.
The reason I allowed overriding those attributes directly in the JSON file was to minimize the work of whoever wants to customize the dash, especially in the context of OEM customizations: in most cases that’s only one additional file to ship.

> I'm not a fan of having the old code and this new code sit side-by-side,
> we should stick to one method and lose the other. Which means that we
> should be including a default json file in unity that gets installed to
> somewhere sane like /usr/share/unity/dash/.

That sounds like a very good idea, thanks for the suggestion.

> There is also an issue in that non of this is tested, thus it can't be
> approved until tests exist.

Right. At this point it’s unclear to me whether we actually want this in the trunk, since the (presumably) only target is Oneiric. The point of the exercise of submitting a merge request against the trunk was to have a formal review by someone competent. I’ll clarify this with involved parties.
Obviously tests would be very nice to have, but it may be beyond the scope of the patch at this point.

> small thing, but style wise, we shouldn't be using #define's, (the
> define that exists is from quite old code before we started using this
> style)

Thanks for pointing this out, I fixed it.

Revision history for this message
Gord Allott (gordallott) wrote :

> Right. At this point it’s unclear to me whether we actually want this in the trunk, since the (presumably) only target is Oneiric. The point of the exercise of submitting a merge request against the trunk was to have a formal review by someone competent. I’ll clarify this with involved parties.
> Obviously tests would be very nice to have, but it may be beyond the scope of the patch at this point.

So if we aren't targeting trunk you need to re-submit this against lp:unity/4.0 not lp:unity - small thing, but the auto lander will put this in trunk if we leave it against lp:unity

Revision history for this message
Olivier Tilloy (osomon) wrote :

Rejecting as this functionality should target oneiric (4.0), not trunk.

Superseded by https://code.launchpad.net/~osomon/unity/4.0-dash-custom-home-screen/+merge/85852.

review: Disapprove

Unmerged revisions

1741. By Olivier Tilloy

Cosmetics: replace a #define by a global variable in the unnamed namespace.

1740. By Olivier Tilloy

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).

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'plugins/unityshell/src/JSONParser.cpp'
--- plugins/unityshell/src/JSONParser.cpp 2011-09-15 04:28:49 +0000
+++ plugins/unityshell/src/JSONParser.cpp 2011-11-30 10:25:11 +0000
@@ -145,6 +145,19 @@
145 values[i] = json_array_get_double_element(array, i);145 values[i] = json_array_get_double_element(array, i);
146}146}
147147
148void Parser::ReadString(std::string const& node_name,
149 std::string const& member_name,
150 std::string& value) const
151{
152 JsonObject* object = GetNodeObject(node_name);
153
154 if (!object)
155 return;
156
157 if (json_object_has_member(object, member_name.c_str()))
158 value = json_object_get_string_member(object, member_name.c_str());
159}
160
148void Parser::ReadColor(std::string const& node_name,161void Parser::ReadColor(std::string const& node_name,
149 std::string const& member_name,162 std::string const& member_name,
150 std::string const& opacity_name,163 std::string const& opacity_name,
151164
=== modified file 'plugins/unityshell/src/JSONParser.h'
--- plugins/unityshell/src/JSONParser.h 2011-09-15 04:28:49 +0000
+++ plugins/unityshell/src/JSONParser.h 2011-11-30 10:25:11 +0000
@@ -58,6 +58,10 @@
58 std::string const& member_name,58 std::string const& member_name,
59 std::vector<double>& values) const;59 std::vector<double>& values) const;
6060
61 void ReadString(std::string const& node_name,
62 std::string const& member_name,
63 std::string& value) const;
64
61 void ReadColor(std::string const& node_name,65 void ReadColor(std::string const& node_name,
62 std::string const& member_name,66 std::string const& member_name,
63 std::string const& opacity_name,67 std::string const& opacity_name,
6468
=== modified file 'plugins/unityshell/src/PlacesHomeView.cpp'
--- plugins/unityshell/src/PlacesHomeView.cpp 2011-10-25 16:32:49 +0000
+++ plugins/unityshell/src/PlacesHomeView.cpp 2011-11-30 10:25:11 +0000
@@ -39,16 +39,25 @@
3939
40#include "PlacesHomeView.h"40#include "PlacesHomeView.h"
41#include "PlacesSimpleTile.h"41#include "PlacesSimpleTile.h"
42#include "JSONParser.h"
4243
43#include "DashStyle.h"44#include "DashStyle.h"
44#include <UnityCore/GLibWrapper.h>45#include <UnityCore/GLibWrapper.h>
45#include <UnityCore/Variant.h>46#include <UnityCore/Variant.h>
4647
48#include <sstream>
47#include <string>49#include <string>
48#include <vector>50#include <vector>
4951
52#include <boost/algorithm/string.hpp>
53
50#define DELTA_DOUBLE_REQUEST 50000000054#define DELTA_DOUBLE_REQUEST 500000000
5155
56namespace
57{
58 const std::string custom_shortcuts_file = "/unity/HomeShortcutsCustomized.json";
59}
60
52namespace unity61namespace unity
53{62{
5463
@@ -135,7 +144,9 @@
135144
136 expanded.connect(sigc::mem_fun(this, &PlacesHomeView::Refresh));145 expanded.connect(sigc::mem_fun(this, &PlacesHomeView::Refresh));
137146
138 Refresh();147 // Wait for the asynchronous loading of the lenses to complete
148 // before refreshing the view for the first time.
149 _lenses.lenses_loaded.connect(sigc::bind(sigc::mem_fun(this, &PlacesHomeView::Refresh), (PlacesGroup*) NULL));
139}150}
140151
141PlacesHomeView::~PlacesHomeView()152PlacesHomeView::~PlacesHomeView()
@@ -161,64 +172,227 @@
161172
162 _layout->Clear();173 _layout->Clear();
163174
164 // Media Apps175 // The following code path allows one to replace the default dash home screen
165 markup = g_strdup_printf(temp, _("Media Apps"));176 // with a custom home screen, the contents of which are described in a JSON
166 shortcut = new Shortcut(PKGDATADIR"/find_media_apps.png",177 // file. The file is looked for in the following locations in decreasing order
167 markup,178 // of priority:
168 icon_size);179 // - $XDG_CONFIG_HOME/unity/ (defaults to $HOME/.config/unity/)
169 shortcut->_id = TYPE_PLACE;180 // - $DIR/unity/ for $DIR in $XDG_CONFIG_DIRS
170 shortcut->_place_id = g_strdup("applications.lens?filter_type=media");181 // The syntax of the file is as follows:
171 shortcut->_place_section = 9;182 // ==========================================================================
172 _layout->AddView(shortcut, 1, nux::eLeft, nux::eFull);183 // {
173 shortcut->sigClick.connect(sigc::mem_fun(this, &PlacesHomeView::OnShortcutClicked));184 // "shortcut1": {
174 g_free(markup);185 // "source": $source,
175186 // "name": $name,
176 // Internet Apps187 // "name[fr]": $name_in_french,
177 markup = g_strdup_printf(temp, _("Internet Apps"));188 // […]
178 shortcut = new Shortcut(PKGDATADIR"/find_internet_apps.png",189 // "icon": $icon
179 markup,190 // },
180 icon_size);191 // "shortcut2": {
181 shortcut->_id = TYPE_PLACE;192 // […]
182 shortcut->_place_id = g_strdup("applications.lens?filter_type=internet");193 // },
183 shortcut->_place_section = 8;194 // […]
184 _layout->AddView(shortcut, 1, nux::eLeft, nux::eFull);195 // }
185 shortcut->sigClick.connect(sigc::mem_fun(this, &PlacesHomeView::OnShortcutClicked));196 // ==========================================================================
186 g_free(markup);197 // The source attribute may either be a desktop file (full path or just its
187198 // basename if it is located in a standard directory), or a lens file
188 // More Apps199 // (basename only). This attribute is mandatory.
189 markup = g_strdup_printf(temp, _("More Apps"));200 // The 'name' attribute is optional. If present, it will override the default
190 shortcut = new Shortcut(PKGDATADIR"/find_more_apps.png",201 // display name as advertised by the desktop file or by the lens. The name can
191 markup,202 // be localized in several languages using the square brackets suffix
192 icon_size);203 // notation, in which case the locale matching the system’s will be used,
193 shortcut->_id = TYPE_PLACE;204 // defaulting to the untranslated 'name' attribute if necessary.
194 shortcut->_place_id = g_strdup("applications.lens");205 // The 'icon' attribute is optional. If present, it will override the default
195 shortcut->_place_section = 0;206 // icon as advertised by the desktop file or by the lens. It should be a full
196 _layout->AddView(shortcut, 1, nux::eLeft, nux::eFull);207 // path name.
197 shortcut->sigClick.connect(sigc::mem_fun(this, &PlacesHomeView::OnShortcutClicked));208 // If the source is a lens, the optional 'filter' attribute allows specifying
198 g_free(markup);209 // a filter in the form "$name:$value", e.g. "type:videos" for the files lens.
199210 // If the source is a lens, the optional 'section' attribute allows specifying
200 // Find Files211 // a section number (an integer starting at index 0).
201 markup = g_strdup_printf(temp, _("Find Files"));212
202 shortcut = new Shortcut(PKGDATADIR"/find_files.png",213 std::string customShortcuts;
203 markup,214 std::ostringstream file;
204 icon_size);215 // Look for a custom shortcuts file in the user’s home directory first.
205 shortcut->_id = TYPE_PLACE;216 file << g_get_user_config_dir() << custom_shortcuts_file;
206 shortcut->_place_id = g_strdup("files.lens");217 if (g_file_test(file.str().c_str(), G_FILE_TEST_EXISTS))
207 shortcut->_place_section = 0;218 {
208 _layout->AddView(shortcut, 1, nux::eLeft, nux::eFull);219 customShortcuts = file.str();
209 shortcut->sigClick.connect(sigc::mem_fun(this, &PlacesHomeView::OnShortcutClicked));220 }
210 g_free(markup);221 else
211222 {
212 // Browser223 // Fall back on the standard XDG directories.
213 CreateShortcutFromMime("x-scheme-handler/http", _("Browse the Web"), _browser_alternatives);224 gchar** config = (gchar**) g_get_system_config_dirs();
214225 for (gint i = 0; config[i]; ++i)
215 // Photos226 {
216 // FIXME: Need to figure out the default227 std::ostringstream file;
217 CreateShortcutFromExec("shotwell", _("View Photos"), _photo_alternatives);228 file << config[i] << custom_shortcuts_file;
218229 if (g_file_test(file.str().c_str(), G_FILE_TEST_EXISTS))
219 CreateShortcutFromMime("x-scheme-handler/mailto", _("Check Email"), _email_alternatives);230 {
220231 customShortcuts = file.str();
221 CreateShortcutFromMime("audio/x-vorbis+ogg", _("Listen to Music"), _music_alternatives);232 break;
233 }
234 }
235 }
236 json::Parser parser;
237 if ((customShortcuts == "") || !parser.Open(customShortcuts))
238 {
239 // Media Apps
240 markup = g_strdup_printf(temp, _("Media Apps"));
241 shortcut = new Shortcut(PKGDATADIR"/find_media_apps.png",
242 markup,
243 icon_size);
244 shortcut->_id = TYPE_PLACE;
245 shortcut->_place_id = g_strdup("applications.lens?filter_type=media");
246 shortcut->_place_section = 9;
247 _layout->AddView(shortcut, 1, nux::eLeft, nux::eFull);
248 shortcut->sigClick.connect(sigc::mem_fun(this, &PlacesHomeView::OnShortcutClicked));
249 g_free(markup);
250
251 // Internet Apps
252 markup = g_strdup_printf(temp, _("Internet Apps"));
253 shortcut = new Shortcut(PKGDATADIR"/find_internet_apps.png",
254 markup,
255 icon_size);
256 shortcut->_id = TYPE_PLACE;
257 shortcut->_place_id = g_strdup("applications.lens?filter_type=internet");
258 shortcut->_place_section = 8;
259 _layout->AddView(shortcut, 1, nux::eLeft, nux::eFull);
260 shortcut->sigClick.connect(sigc::mem_fun(this, &PlacesHomeView::OnShortcutClicked));
261 g_free(markup);
262
263 // More Apps
264 markup = g_strdup_printf(temp, _("More Apps"));
265 shortcut = new Shortcut(PKGDATADIR"/find_more_apps.png",
266 markup,
267 icon_size);
268 shortcut->_id = TYPE_PLACE;
269 shortcut->_place_id = g_strdup("applications.lens");
270 shortcut->_place_section = 0;
271 _layout->AddView(shortcut, 1, nux::eLeft, nux::eFull);
272 shortcut->sigClick.connect(sigc::mem_fun(this, &PlacesHomeView::OnShortcutClicked));
273 g_free(markup);
274
275 // Find Files
276 markup = g_strdup_printf(temp, _("Find Files"));
277 shortcut = new Shortcut(PKGDATADIR"/find_files.png",
278 markup,
279 icon_size);
280 shortcut->_id = TYPE_PLACE;
281 shortcut->_place_id = g_strdup("files.lens");
282 shortcut->_place_section = 0;
283 _layout->AddView(shortcut, 1, nux::eLeft, nux::eFull);
284 shortcut->sigClick.connect(sigc::mem_fun(this, &PlacesHomeView::OnShortcutClicked));
285 g_free(markup);
286
287 // Browser
288 CreateShortcutFromMime("x-scheme-handler/http", _("Browse the Web"), _browser_alternatives);
289
290 // Photos
291 // FIXME: Need to figure out the default
292 CreateShortcutFromExec("shotwell", _("View Photos"), _photo_alternatives);
293
294 CreateShortcutFromMime("x-scheme-handler/mailto", _("Check Email"), _email_alternatives);
295
296 CreateShortcutFromMime("audio/x-vorbis+ogg", _("Listen to Music"), _music_alternatives);
297 }
298 else
299 {
300 // The custom shortcuts file can contain up to 8 shortcuts.
301 for (int i = 0; i < 8; ++i)
302 {
303 std::ostringstream oss;
304 oss << "shortcut" << (i + 1);
305 std::string slot = oss.str();
306 std::string source;
307 parser.ReadString(slot, "source", source);
308 if (source != "")
309 {
310 std::string icon;
311 parser.ReadString(slot, "icon", icon);
312
313 std::string name;
314 gchar** languages = (gchar**) g_get_language_names();
315 for (gint i = 0; languages[i]; ++i)
316 {
317 std::ostringstream key;
318 key << "name[" << languages[i] << "]";
319 parser.ReadString(slot, key.str(), name);
320 if (name != "")
321 break;
322 }
323 if (name == "")
324 {
325 parser.ReadString(slot, "name", name);
326 }
327
328 if (boost::iends_with(source, ".desktop"))
329 {
330 GDesktopAppInfo* info = NULL;
331 if (boost::istarts_with(source, "/"))
332 info = g_desktop_app_info_new_from_filename(source.c_str());
333 else
334 info = g_desktop_app_info_new(source.c_str());
335 if (G_IS_DESKTOP_APP_INFO(info))
336 {
337 if (name == "")
338 name = g_app_info_get_display_name(G_APP_INFO(info));
339 if (icon == "")
340 {
341 gchar* cicon = g_icon_to_string(g_app_info_get_icon(G_APP_INFO(info)));
342 icon = cicon;
343 g_free(cicon);
344 }
345 gchar* exec = g_strdup(g_app_info_get_executable(G_APP_INFO(info)));
346 markup = g_strdup_printf(temp, name.c_str());
347 shortcut = new Shortcut(icon.c_str(), markup, icon_size);
348 shortcut->_id = TYPE_EXEC;
349 shortcut->_exec = exec;
350 _layout->AddView(shortcut, 1, nux::eLeft, nux::eFull);
351 shortcut->sigClick.connect(sigc::mem_fun(this, &PlacesHomeView::OnShortcutClicked));
352 g_free(markup);
353 g_object_unref(info);
354 }
355 }
356 else if (boost::iends_with(source, ".lens"))
357 {
358 unity::dash::Lens::Ptr lens = _lenses.GetLens(source);
359 if (lens)
360 {
361 if (name == "")
362 name = lens->name;
363 if (icon == "")
364 icon = lens->icon_hint;
365 }
366 std::string filter;
367 parser.ReadString(slot, "filter", filter);
368 int section = -1;
369 parser.ReadInt(slot, "section", section);
370 markup = g_strdup_printf(temp, name.c_str());
371 shortcut = new Shortcut(icon.c_str(), markup, icon_size);
372 shortcut->_id = TYPE_PLACE;
373 if (filter != "")
374 {
375 std::vector<std::string> filter_key_value;
376 boost::split(filter_key_value, filter, boost::is_any_of(":"));
377 if (filter_key_value.size() == 2)
378 shortcut->_place_id = g_strdup_printf("%s?filter_%s=%s",
379 source.c_str(),
380 filter_key_value[0].c_str(),
381 filter_key_value[1].c_str());
382 else
383 shortcut->_place_id = g_strdup(source.c_str());
384 }
385 else
386 shortcut->_place_id = g_strdup(source.c_str());
387 if (section != -1)
388 shortcut->_place_section = section;
389 _layout->AddView(shortcut, 1, nux::eLeft, nux::eFull);
390 shortcut->sigClick.connect(sigc::mem_fun(this, &PlacesHomeView::OnShortcutClicked));
391 g_free(markup);
392 }
393 }
394 }
395 }
222396
223 SetExpanded(true);397 SetExpanded(true);
224 SetCounts(8, 8);398 SetCounts(8, 8);
225399
=== modified file 'plugins/unityshell/src/PlacesHomeView.h'
--- plugins/unityshell/src/PlacesHomeView.h 2011-09-02 03:40:15 +0000
+++ plugins/unityshell/src/PlacesHomeView.h 2011-11-30 10:25:11 +0000
@@ -29,6 +29,8 @@
2929
30#include <Nux/GridHLayout.h>30#include <Nux/GridHLayout.h>
3131
32#include <UnityCore/FilesystemLenses.h>
33
32#include "PlacesTile.h"34#include "PlacesTile.h"
33#include "PlacesGroup.h"35#include "PlacesGroup.h"
3436
@@ -67,6 +69,8 @@
67 std::vector<std::string> _music_alternatives;69 std::vector<std::string> _music_alternatives;
6870
69 guint _ubus_handle;71 guint _ubus_handle;
72
73 unity::dash::FilesystemLenses _lenses;
70};74};
7175
72}76}