Merge ~3v1n0/unity:gnome-file-manager-changes into unity:master

Proposed by Marco Trevisan (Treviño)
Status: Merged
Approved by: Dmitry Shachnev
Approved revision: 63d81dddb42e02aa886ac7cc3ca1078571336b95
Merged at revision: 0b76574a3cd68b9d955badd03eb027bd630a4016
Proposed branch: ~3v1n0/unity:gnome-file-manager-changes
Merge into: unity:master
Diff against target: 822 lines (+370/-122)
21 files modified
.gitignore (+16/-0)
AUTHORS (+2/-0)
CMakeLists.txt (+2/-2)
dash/DashView.cpp (+1/-1)
dash/PlacesGroup.cpp (+0/-14)
dash/previews/ApplicationPreview.cpp (+2/-50)
debian/changelog (+11/-0)
debian/control (+0/-1)
launcher/DeviceLauncherSection.cpp (+2/-2)
launcher/FileManagerLauncherIcon.cpp (+2/-2)
launcher/QuicklistView.cpp (+0/-26)
launcher/StandaloneLauncher.cpp (+3/-0)
launcher/Tooltip.cpp (+0/-18)
launcher/TrashLauncherIcon.cpp (+2/-2)
resources/launcher_bfb.svg (+13/-0)
tests/test_previews_application.cpp (+0/-4)
unity-shared/CMakeLists.txt (+2/-0)
unity-shared/FileManager.cpp (+58/-0)
unity-shared/FileManager.h (+2/-0)
unity-shared/NemoFileManager.cpp (+202/-0)
unity-shared/NemoFileManager.h (+50/-0)
Reviewer Review Type Date Requested Status
Unity Team Pending
Review via email: mp+429779@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Dmitry Shachnev (mitya57) :

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/.gitignore b/.gitignore
2new file mode 100644
3index 0000000..d58747c
4--- /dev/null
5+++ b/.gitignore
6@@ -0,0 +1,16 @@
7+build
8+services/panel-marshal.c
9+services/panel-marshal.h
10+.AUTHORS.sed
11+tests/autopilot/dist
12+tests/autopilot/unity.egg-info
13+*.log
14+*.debhelper
15+*.substvars
16+*.swp
17+debian/tmp
18+debian/files
19+obj-*/
20+debian/libunity-core-*/
21+debian/unity-*/
22+debian/unity/
23diff --git a/AUTHORS b/AUTHORS
24index 007b35a..f304a63 100644
25--- a/AUTHORS
26+++ b/AUTHORS
27@@ -1,3 +1,5 @@
28+ Rudra Saraswat <rs2009@ubuntu.com>
29+ Khurshid Alam <khurshid.alam@linuxmail.org>
30 3v1n0 <mail@3v1n0.net>
31 Adam Conrad <adconrad@0c3.net>
32 agateau <aurelien.gateau@canonical.com>
33diff --git a/CMakeLists.txt b/CMakeLists.txt
34index 76ff07f..1d58a46 100644
35--- a/CMakeLists.txt
36+++ b/CMakeLists.txt
37@@ -10,8 +10,8 @@ include (GNUInstallDirs)
38 #
39 set (PROJECT_NAME "unity")
40 set (UNITY_MAJOR 7)
41-set (UNITY_MINOR 5)
42-set (UNITY_MICRO 1)
43+set (UNITY_MINOR 6)
44+set (UNITY_MICRO 0)
45 set (UNITY_VERSION "${UNITY_MAJOR}.${UNITY_MINOR}.${UNITY_MICRO}")
46 set (UNITY_API_VERSION "6.0")
47 set (UNITY_COMPONENTS_VERSION "6")
48diff --git a/dash/DashView.cpp b/dash/DashView.cpp
49index e7c516c..dc4e1b2 100644
50--- a/dash/DashView.cpp
51+++ b/dash/DashView.cpp
52@@ -1420,7 +1420,7 @@ bool DashView::DoFallbackActivation(std::string const& uri)
53 return application_starter_->Launch(appname, last_activated_timestamp_);
54 }
55 else
56- return gtk_show_uri(NULL, uri.c_str(), last_activated_timestamp_, NULL);
57+ return gtk_show_uri_on_window(NULL, uri.c_str(), last_activated_timestamp_, NULL);
58
59 return false;
60 }
61diff --git a/dash/PlacesGroup.cpp b/dash/PlacesGroup.cpp
62index 3eb5b9e..7a1f8db 100755
63--- a/dash/PlacesGroup.cpp
64+++ b/dash/PlacesGroup.cpp
65@@ -491,20 +491,6 @@ void PlacesGroup::Draw(nux::GraphicsEngine& graphics_engine,
66 _focus_layer->Renderlayer(graphics_engine);
67 }
68
69- if (_background_layer)
70- {
71- nux::Geometry bg_geo = base;
72- int bg_width = _background_layer->GetDeviceTexture()->GetWidth();
73- bg_geo.x = std::max(bg_geo.width - bg_width, 0);
74-
75- // to render into a space left over by the scrollview (1 has NOT to be scaled)
76- bg_geo.width = std::min(bg_width, bg_geo.GetWidth()) + 1;
77- bg_geo.height = _background_layer->GetDeviceTexture()->GetHeight();
78-
79- _background_layer->SetGeometry(bg_geo);
80- _background_layer->Renderlayer(graphics_engine);
81- }
82-
83 graphics_engine.PopClippingRectangle();
84 }
85
86diff --git a/dash/previews/ApplicationPreview.cpp b/dash/previews/ApplicationPreview.cpp
87index 19d5172..49fb94b 100644
88--- a/dash/previews/ApplicationPreview.cpp
89+++ b/dash/previews/ApplicationPreview.cpp
90@@ -132,7 +132,7 @@ void ApplicationPreview::SetupViews()
91 image_data_layout_->SetSpaceBetweenChildren(style.GetPanelSplitWidth().CP(scale));
92
93 /////////////////////
94- // Image
95+ // Image (not used)
96 image_ = new CoverArt();
97 image_->scale = scale();
98 AddChild(image_.GetPointer());
99@@ -161,19 +161,6 @@ void ApplicationPreview::SetupViews()
100 app_icon_->mouse_click.connect(on_mouse_down);
101 icon_layout_->AddView(app_icon_.GetPointer(), 0);
102
103- if (app_preview_model->rating >= 0)
104- {
105- app_rating_ = new PreviewRatingsWidget();
106- AddChild(app_rating_.GetPointer());
107- app_rating_->scale = scale();
108- app_rating_->SetMaximumHeight(style.GetRatingWidgetHeight().CP(scale));
109- app_rating_->SetMinimumHeight(style.GetRatingWidgetHeight().CP(scale));
110- app_rating_->SetRating(app_preview_model->rating);
111- app_rating_->SetReviews(app_preview_model->num_ratings);
112- app_rating_->request_close().connect([this]() { preview_container_->request_close.emit(); });
113- icon_layout_->AddView(app_rating_.GetPointer(), 0);
114- }
115-
116 /////////////////////
117
118 /////////////////////
119@@ -192,6 +179,7 @@ void ApplicationPreview::SetupViews()
120 title_->SetFont(style.title_font().c_str());
121 title_->mouse_click.connect(on_mouse_down);
122 title_subtitle_layout_->AddView(title_.GetPointer(), 1);
123+ title_subtitle_layout_->SetPadding(34, 0, 0, 0);
124
125 if (!preview_model_->subtitle.Get().empty())
126 {
127@@ -207,41 +195,6 @@ void ApplicationPreview::SetupViews()
128 app_updated_copywrite_layout_ = new nux::VLayout();
129 app_updated_copywrite_layout_->SetSpaceBetweenChildren(COPYRIGHT_SPACE_CHILDREN.CP(scale));
130
131- if (!app_preview_model->license.Get().empty())
132- {
133- license_ = new StaticCairoText(app_preview_model->license, true, NUX_TRACKER_LOCATION);
134- AddChild(license_.GetPointer());
135- license_->SetFont(style.app_license_font().c_str());
136- license_->SetLines(-1);
137- license_->SetScale(scale);
138- license_->mouse_click.connect(on_mouse_down);
139- app_updated_copywrite_layout_->AddView(license_.GetPointer(), 1);
140- }
141-
142- if (!app_preview_model->last_update.Get().empty())
143- {
144- std::stringstream last_update;
145- last_update << _("Last Updated") << " " << app_preview_model->last_update.Get();
146-
147- last_update_ = new StaticCairoText(last_update.str(), true, NUX_TRACKER_LOCATION);
148- AddChild(last_update_.GetPointer());
149- last_update_->SetFont(style.app_last_update_font().c_str());
150- last_update_->SetScale(scale);
151- last_update_->mouse_click.connect(on_mouse_down);
152- app_updated_copywrite_layout_->AddView(last_update_.GetPointer(), 1);
153- }
154-
155- if (!app_preview_model->copyright.Get().empty())
156- {
157- copywrite_ = new StaticCairoText(app_preview_model->copyright, true, NUX_TRACKER_LOCATION);
158- AddChild(copywrite_.GetPointer());
159- copywrite_->SetFont(style.app_copywrite_font().c_str());
160- copywrite_->SetLines(-1);
161- copywrite_->SetScale(scale);
162- copywrite_->mouse_click.connect(on_mouse_down);
163- app_updated_copywrite_layout_->AddView(copywrite_.GetPointer(), 1);
164- }
165-
166 app_data_layout_->AddLayout(title_subtitle_layout_);
167 app_data_layout_->AddLayout(app_updated_copywrite_layout_);
168
169@@ -297,7 +250,6 @@ void ApplicationPreview::SetupViews()
170 full_data_layout_->AddLayout(actions_layout_, 0);
171 /////////////////////
172
173- image_data_layout_->AddView(image_.GetPointer(), 0);
174 image_data_layout_->AddLayout(full_data_layout_, 1);
175
176 mouse_click.connect(on_mouse_down);
177diff --git a/debian/changelog b/debian/changelog
178index 15b5358..59a96ca 100644
179--- a/debian/changelog
180+++ b/debian/changelog
181@@ -1,3 +1,14 @@
182+unity (7.6.0) UNRELEASED; urgency=medium
183+
184+ * Added transparent dash border
185+ * Replaced launcher bfb with Ubuntu Unity logo
186+ * Removed broken app info and ratings from dash
187+ * Simplified app preview in dash
188+ * Fixed the 'Empty Trash' button in the launcher
189+ * Fixed the standalone testing Unity7 launcher
190+
191+ -- Rudra Saraswat <rs2009@ubuntu.com> Fri, 29 Apr 2022 15:28:29 +0530
192+
193 unity (7.5.1+22.10.20220818-0ubuntu1) kinetic; urgency=medium
194
195 [ Alberts Muktupāvels ]
196diff --git a/debian/control b/debian/control
197index 59eabf9..c61edb5 100644
198--- a/debian/control
199+++ b/debian/control
200@@ -90,7 +90,6 @@ Depends: ${shlibs:Depends},
201 unity-scope-home,
202 Recommends: unity-control-center,
203 ${unity-default-masterscopes}
204- nautilus (>> 3.37.1),
205 nemo,
206 gnome-disk-utility,
207 hud,
208diff --git a/launcher/DeviceLauncherSection.cpp b/launcher/DeviceLauncherSection.cpp
209index bfc922d..90b1203 100644
210--- a/launcher/DeviceLauncherSection.cpp
211+++ b/launcher/DeviceLauncherSection.cpp
212@@ -22,7 +22,7 @@
213 #include "DevicesSettingsImp.h"
214 #include "VolumeImp.h"
215 #include "VolumeMonitorWrapper.h"
216-#include "unity-shared/GnomeFileManager.h"
217+#include "unity-shared/FileManager.h"
218
219 namespace unity
220 {
221@@ -34,7 +34,7 @@ DeviceLauncherSection::DeviceLauncherSection(AbstractVolumeMonitorWrapper::Ptr c
222 DeviceNotificationDisplay::Ptr const& notify)
223 : monitor_(vm ? vm : std::make_shared<VolumeMonitorWrapper>())
224 , devices_settings_(ds ? ds : std::make_shared<DevicesSettingsImp>())
225- , file_manager_(GnomeFileManager::Get())
226+ , file_manager_(FileManager::GetDefault())
227 , device_notification_display_(notify ? notify : std::make_shared<DeviceNotificationDisplayImp>())
228 {
229 monitor_->volume_added.connect(sigc::mem_fun(this, &DeviceLauncherSection::OnVolumeAdded));
230diff --git a/launcher/FileManagerLauncherIcon.cpp b/launcher/FileManagerLauncherIcon.cpp
231index 0926997..019c550 100644
232--- a/launcher/FileManagerLauncherIcon.cpp
233+++ b/launcher/FileManagerLauncherIcon.cpp
234@@ -23,7 +23,7 @@
235 #include <NuxCore/Logger.h>
236 #include <UnityCore/DesktopUtilities.h>
237
238-#include "unity-shared/GnomeFileManager.h"
239+#include "unity-shared/FileManager.h"
240
241 namespace unity
242 {
243@@ -40,7 +40,7 @@ const std::string DEFAULT_ICON = "system-file-manager";
244 FileManagerLauncherIcon::FileManagerLauncherIcon(ApplicationPtr const& app, DeviceLauncherSection::Ptr const& dev, FileManager::Ptr const& fm)
245 : WindowedLauncherIcon(IconType::APPLICATION)
246 , ApplicationLauncherIcon(app)
247- , StorageLauncherIcon(GetIconType(), fm ? fm : GnomeFileManager::Get())
248+ , StorageLauncherIcon(GetIconType(), fm ? fm : FileManager::GetDefault())
249 , devices_(dev)
250 {
251 // We disconnect from ApplicationLauncherIcon app signals, as we manage them manually
252diff --git a/launcher/QuicklistView.cpp b/launcher/QuicklistView.cpp
253index 55251f9..f9a8365 100644
254--- a/launcher/QuicklistView.cpp
255+++ b/launcher/QuicklistView.cpp
256@@ -886,32 +886,6 @@ void ql_tint_dot_hl(cairo_t* cr,
257 cairo_rectangle(dots_cr, 2.0f, 2.0f, 1.0f, 1.0f);
258 cairo_fill(dots_cr);
259 dots_pattern = cairo_pattern_create_for_surface(dots_surf.GetSurface());
260-
261- // fill path of normal context with dot-pattern
262- cairo_set_operator(cr, CAIRO_OPERATOR_OVER);
263- cairo_set_source(cr, dots_pattern);
264- cairo_pattern_set_extend(dots_pattern, CAIRO_EXTEND_REPEAT);
265- cairo_fill_preserve(cr);
266- cairo_pattern_destroy(dots_pattern);
267-
268- // draw highlight
269- cairo_set_operator(cr, CAIRO_OPERATOR_OVER);
270- hl_pattern = cairo_pattern_create_radial(hl_x,
271- hl_y,
272- 0.0f,
273- hl_x,
274- hl_y,
275- hl_size);
276- cairo_pattern_add_color_stop_rgba(hl_pattern,
277- 0.0f,
278- hl_color.red,
279- hl_color.green,
280- hl_color.blue,
281- hl_color.alpha);
282- cairo_pattern_add_color_stop_rgba(hl_pattern, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f);
283- cairo_set_source(cr, hl_pattern);
284- cairo_fill(cr);
285- cairo_pattern_destroy(hl_pattern);
286 }
287
288 void ql_setup(cairo_surface_t** surf,
289diff --git a/launcher/StandaloneLauncher.cpp b/launcher/StandaloneLauncher.cpp
290index 3c44939..0af7d0c 100644
291--- a/launcher/StandaloneLauncher.cpp
292+++ b/launcher/StandaloneLauncher.cpp
293@@ -30,6 +30,7 @@
294 #include "LauncherController.h"
295 #include "Launcher.h"
296 #include "unity-shared/IconRenderer.h"
297+#include "unity-shared/InputMonitor.h"
298 #include "unity-shared/PanelStyle.h"
299 #include "unity-shared/UBusMessages.h"
300 #include "unity-shared/UnitySettings.h"
301@@ -72,6 +73,8 @@ private:
302
303 void Init()
304 {
305+ input::Monitor im_;
306+
307 SetupBackground();
308 controller.reset(new launcher::Controller(std::make_shared<StandaloneDndManager>(), std::make_shared<ui::EdgeBarrierController>()));
309
310diff --git a/launcher/Tooltip.cpp b/launcher/Tooltip.cpp
311index 35e88a3..67898ee 100644
312--- a/launcher/Tooltip.cpp
313+++ b/launcher/Tooltip.cpp
314@@ -275,24 +275,6 @@ void tint_dot_hl(cairo_t* cr,
315 tint_color.blue,
316 tint_color.alpha);
317 cairo_fill_preserve(cr);
318-
319- // draw glow
320- hl_pattern = cairo_pattern_create_radial(hl_x,
321- hl_y - hl_size / 1.4f,
322- 0.0f,
323- hl_x,
324- hl_y - hl_size / 1.4f,
325- hl_size);
326- cairo_pattern_add_color_stop_rgba(hl_pattern,
327- 0.0f,
328- hl_color.red,
329- hl_color.green,
330- hl_color.blue,
331- hl_color.alpha);
332- cairo_pattern_add_color_stop_rgba(hl_pattern, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f);
333- cairo_set_source(cr, hl_pattern);
334- cairo_fill(cr);
335- cairo_pattern_destroy(hl_pattern);
336 }
337
338 void _setup(cairo_surface_t** surf,
339diff --git a/launcher/TrashLauncherIcon.cpp b/launcher/TrashLauncherIcon.cpp
340index 9c6502e..15dc9a6 100644
341--- a/launcher/TrashLauncherIcon.cpp
342+++ b/launcher/TrashLauncherIcon.cpp
343@@ -29,7 +29,7 @@
344
345 #include "QuicklistMenuItemLabel.h"
346 #include "unity-shared/DesktopApplicationManager.h"
347-#include "unity-shared/GnomeFileManager.h"
348+#include "unity-shared/FileManager.h"
349
350 namespace unity
351 {
352@@ -45,7 +45,7 @@ namespace
353
354 TrashLauncherIcon::TrashLauncherIcon(FileManager::Ptr const& fm)
355 : WindowedLauncherIcon(IconType::TRASH)
356- , StorageLauncherIcon(GetIconType(), fm ? fm : GnomeFileManager::Get())
357+ , StorageLauncherIcon(GetIconType(), fm ? fm : FileManager::GetDefault())
358 , empty_(true)
359 {
360 tooltip_text = _("Trash");
361diff --git a/resources/arrow_right.png b/resources/arrow_right.png
362index 07556d7..3703bed 100644
363Binary files a/resources/arrow_right.png and b/resources/arrow_right.png differ
364diff --git a/resources/dash_bottom_border_tile.png b/resources/dash_bottom_border_tile.png
365index 7fdc159..4317893 100644
366Binary files a/resources/dash_bottom_border_tile.png and b/resources/dash_bottom_border_tile.png differ
367diff --git a/resources/dash_bottom_left_corner.png b/resources/dash_bottom_left_corner.png
368index dd31801..47c10bb 100644
369Binary files a/resources/dash_bottom_left_corner.png and b/resources/dash_bottom_left_corner.png differ
370diff --git a/resources/dash_bottom_left_corner_mask.png b/resources/dash_bottom_left_corner_mask.png
371index ed8b233..47c10bb 100644
372Binary files a/resources/dash_bottom_left_corner_mask.png and b/resources/dash_bottom_left_corner_mask.png differ
373diff --git a/resources/dash_bottom_right_corner.png b/resources/dash_bottom_right_corner.png
374index 1923a6a..3ab6638 100644
375Binary files a/resources/dash_bottom_right_corner.png and b/resources/dash_bottom_right_corner.png differ
376diff --git a/resources/dash_left_tile.png b/resources/dash_left_tile.png
377index 395784c..47c10bb 100644
378Binary files a/resources/dash_left_tile.png and b/resources/dash_left_tile.png differ
379diff --git a/resources/dash_noise.png b/resources/dash_noise.png
380index 1ae11be..f6ec0f3 100644
381Binary files a/resources/dash_noise.png and b/resources/dash_noise.png differ
382diff --git a/resources/dash_right_border_tile.png b/resources/dash_right_border_tile.png
383index 24ac7f9..57525fb 100644
384Binary files a/resources/dash_right_border_tile.png and b/resources/dash_right_border_tile.png differ
385diff --git a/resources/dash_top_edge.png b/resources/dash_top_edge.png
386index d024df6..47c10bb 100644
387Binary files a/resources/dash_top_edge.png and b/resources/dash_top_edge.png differ
388diff --git a/resources/dash_top_right_corner.png b/resources/dash_top_right_corner.png
389index 4af9f56..47c10bb 100644
390Binary files a/resources/dash_top_right_corner.png and b/resources/dash_top_right_corner.png differ
391diff --git a/resources/dash_top_right_corner_mask.png b/resources/dash_top_right_corner_mask.png
392index be81ecd..47c10bb 100644
393Binary files a/resources/dash_top_right_corner_mask.png and b/resources/dash_top_right_corner_mask.png differ
394diff --git a/resources/dash_top_tile.png b/resources/dash_top_tile.png
395index 854e300..47c10bb 100644
396Binary files a/resources/dash_top_tile.png and b/resources/dash_top_tile.png differ
397diff --git a/resources/launcher_bfb.svg b/resources/launcher_bfb.svg
398new file mode 100644
399index 0000000..74e60e9
400--- /dev/null
401+++ b/resources/launcher_bfb.svg
402@@ -0,0 +1,13 @@
403+<svg version="1.1" viewBox="0 0 136.53 136.53" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
404+ <defs>
405+ <filter id="a" x="-.075" y="-.075" width="1.15" height="1.15" color-interpolation-filters="sRGB">
406+ <feGaussianBlur stdDeviation="2.4999998"/>
407+ </filter>
408+ </defs>
409+ <image width="136.53" height="136.53" preserveAspectRatio="none" xlink:href="data:image/png;base64,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 4K+6lV/77/8DTX3gKAGJXUUAAAAASUVORK5CYII= "/>
410+ <g>
411+ <ellipse cx="68.267" cy="68.267" rx="40" ry="40" fill="#9005d5"/>
412+ <path d="m68.244 28.267a40 40 0 0 0-39.978 40 40 40 0 0 0 40 40 40 40 0 0 0 40-40 40 40 0 0 0-40-40 40 40 0 0 0-0.0223 0zm0.43912 12.8a27.2 27.2 0 0 1 5.2476 0.51106l-3.8886 6.7353a20 20 0 0 0-1.359-0.04632 20 20 0 0 0-1.3588 0.04608l-3.4e-4 -5.52e-4a20 20 0 0 0-8.6411 2.6333 20 20 0 0 0-2e-3 8e-4 20 20 0 0 0-6.5993 6.1657l4.9e-4 5.44e-4a20 20 0 0 0-1.359 2.3538l-7.7772 9.6e-5a27.2 27.2 0 0 1 5.2474-9.0889l-5.5e-4 -5.52e-4a27.2 27.2 0 0 1 5.4498-4.7744l1.9133 3.314 2.933-1.6933-1.9133-3.3139a27.2 27.2 0 0 1 6.8594-2.332l4.4e-4 5.44e-4a27.2 27.2 0 0 1 5.2474-0.51097zm8.6027 1.4841 5.7186 9.6e-5c0.38588 7.2e-5 0.73999 0.20394 0.93828 0.5309l2.8616 4.7698c0.0837 0.12732 0.17604 0.33828 0.16272 0.60168-8e-3 0.15803-0.0538 0.33549-0.16272 0.52421l-2.8616 4.7756c-0.19839 0.32682-0.55229 0.53025-0.9382 0.53024l-5.7186-8e-5c-0.19298 1.28e-4 -0.37827-0.04912-0.53974-0.14023-0.16143-0.09116-0.29882-0.22444-0.39836-0.39034l-2.862-4.7755c-0.20902-0.34837-0.20905-0.77678 0-1.1251l2.862-4.7706c0.0992-0.16344 0.23645-0.29694 0.39854-0.38769 0.16151-0.09178 0.34654-0.14284 0.53949-0.14288zm-11.115 3.7637c0.0455 0.08294 0.0932 0.16574 0.14346 0.24846zm23.002 4.0632v1.76e-4a27.2 27.2 0 0 1 5.2475 9.0889h-5e-3a27.2 27.2 0 0 1 1.41 7.1068h-3.8789v3.3867h3.8793a27.2 27.2 0 0 1-1.4101 7.1067h4e-3a27.2 27.2 0 0 1-5.2475 9.089l-3.8886-6.7352a20 20 0 0 0 1.359-2.3536h-4e-3a20 20 0 0 0 2.0401-8.8 20 20 0 0 0-5.6e-4 -0.0024 20 20 0 0 0-2.0399-8.7985l5e-3 8e-5a20 20 0 0 0-1.3584-2.3536zm-46.255 11.84 5.5666 0.09045c0.38224 0.0084 0.73533 0.21324 0.92828 0.54744l2.8592 4.9525c0.0966 0.16707 0.14668 0.3521 0.1485 0.53751l-9e-5 -8e-5c2e-3 0.18537-0.045 0.37099-0.1389 0.54017l-2.7046 4.8664c-0.19718 0.35519-0.5682 0.56943-0.9744 0.56257l-5.5624-0.09335c-0.19113-4e-3 -0.3754-0.05632-0.53504-0.1513-0.16024-0.09399-0.29698-0.22863-0.39349-0.39572l-2.8592-4.9525c-0.19287-0.33421-0.19334-0.7428-9e-3 -1.078l2.6999-4.8631c0.0684-0.13618 0.20503-0.3216 0.43979-0.44177 0.14087-0.07208 0.31738-0.12122 0.53528-0.12122zm0.0284 14.849h7.7773a20 20 0 0 0 1.3589 2.3536l-6e-3 0.0097a20 20 0 0 0 15.242 8.8l-3.883 6.7258 3.8886-6.7352a20 20 0 0 0 1.3588 0.04608 20 20 0 0 0 1.3591-0.04664l3.8885 6.7354a27.2 27.2 0 0 1-5.2475 0.51106 27.2 27.2 0 0 1-5.2476-0.51106l-6e-3 9e-3a27.2 27.2 0 0 1-6.8595-2.332l1.9133-3.314-2.933-1.6934-1.9134 3.314a27.2 27.2 0 0 1-5.4496-4.7746l6e-3 -0.0094a27.2 27.2 0 0 1-5.2475-9.089zm40.045 5.0986c0.40294-0.0064 0.77107 0.20574 0.96664 0.55811l2.6786 4.8249c0.0913 0.16622 0.13786 0.35033 0.13544 0.53461-8e-4 0.18428-0.0492 0.36861-0.14487 0.53439l-2.8364 4.9126c-0.19146 0.33149-0.5422 0.5345-0.92142 0.54266l-5.5169 0.0926c-0.1509 9e-3 -0.37795-0.0166-0.59762-0.15867-0.13179-0.0853-0.26151-0.2125-0.36958-0.39967l-2.6833-4.827c-0.18236-0.33255-0.18149-0.7375 0.01-1.069l2.8364-4.9127c0.0956-0.16586 0.22973-0.30062 0.38811-0.39414 0.15837-0.09346 0.34107-0.14544 0.53297-0.14866z" filter="url(#a)" opacity=".5" style="mix-blend-mode:normal;paint-order:stroke markers fill"/>
413+ <path d="m68.244 28.267a40 40 0 0 0-39.978 40 40 40 0 0 0 40 40 40 40 0 0 0 40-40 40 40 0 0 0-40-40 40 40 0 0 0-0.0223 0zm0.43913 12.8a27.2 27.2 0 0 1 5.2476 0.51106l-3.8886 6.7353a20 20 0 0 0-1.359-0.04632 20 20 0 0 0-1.3588 0.04608l-3.4e-4 -5.52e-4a20 20 0 0 0-8.6411 2.6333 20 20 0 0 0-2e-3 8e-4 20 20 0 0 0-6.5993 6.1657l4.9e-4 5.44e-4a20 20 0 0 0-1.359 2.3538l-7.7773 9.6e-5a27.2 27.2 0 0 1 5.2474-9.0889l-5.5e-4 -5.52e-4a27.2 27.2 0 0 1 5.4498-4.7744l1.9133 3.314 2.933-1.6933-1.9133-3.3139a27.2 27.2 0 0 1 6.8594-2.332l4.3e-4 5.44e-4a27.2 27.2 0 0 1 5.2474-0.51097zm8.6027 1.4841 5.7186 9.6e-5c0.38587 7.2e-5 0.73998 0.20394 0.93827 0.5309l2.8616 4.7698c0.0837 0.12732 0.17603 0.33828 0.16272 0.60168-8e-3 0.15803-0.0538 0.33549-0.16272 0.52421l-2.8616 4.7756c-0.19839 0.32682-0.55229 0.53025-0.9382 0.53024l-5.7186-8e-5c-0.19299 1.28e-4 -0.37827-0.04912-0.53975-0.14023-0.16143-0.09116-0.29881-0.22444-0.39836-0.39034l-2.862-4.7755c-0.20903-0.34837-0.20906-0.77678 0-1.1251l2.862-4.7706c0.0992-0.16344 0.23644-0.29694 0.39853-0.38769 0.16151-0.09178 0.34655-0.14284 0.5395-0.14288zm-11.115 3.7637c0.0455 0.08294 0.0932 0.16574 0.14346 0.24846zm23.002 4.0632v1.76e-4a27.2 27.2 0 0 1 5.2475 9.0889h-5e-3a27.2 27.2 0 0 1 1.41 7.1068h-3.8789v3.3867h3.8793a27.2 27.2 0 0 1-1.4102 7.1067h4e-3a27.2 27.2 0 0 1-5.2475 9.089l-3.8886-6.7352a20 20 0 0 0 1.359-2.3536h-4e-3a20 20 0 0 0 2.0401-8.8 20 20 0 0 0-5.5e-4 -0.0024 20 20 0 0 0-2.0399-8.7985l5e-3 8e-5a20 20 0 0 0-1.3584-2.3536zm-46.255 11.84 5.5666 0.09045c0.38223 0.0084 0.73532 0.21324 0.92828 0.54744l2.8592 4.9525c0.0966 0.16707 0.14668 0.3521 0.1485 0.53751l-9e-5 -8e-5c2e-3 0.18537-0.045 0.37099-0.1389 0.54017l-2.7046 4.8664c-0.19719 0.35519-0.5682 0.56943-0.97441 0.56257l-5.5624-0.09335c-0.19113-4e-3 -0.3754-0.05632-0.53504-0.1513-0.16024-0.09399-0.29697-0.22863-0.39349-0.39572l-2.8592-4.9525c-0.19287-0.33421-0.19333-0.7428-9e-3 -1.078l2.6999-4.8631c0.0684-0.13618 0.20502-0.3216 0.43978-0.44177 0.14087-0.07208 0.31738-0.12122 0.53529-0.12122zm0.0284 14.849h7.7773a20 20 0 0 0 1.3589 2.3536l-6e-3 0.0097a20 20 0 0 0 15.242 8.8l-3.883 6.7258 3.8886-6.7352a20 20 0 0 0 1.3588 0.0461 20 20 0 0 0 1.3591-0.0466l3.8885 6.7354a27.2 27.2 0 0 1-5.2475 0.51106 27.2 27.2 0 0 1-5.2476-0.51106l-6e-3 9e-3a27.2 27.2 0 0 1-6.8595-2.332l1.9133-3.314-2.933-1.6934-1.9134 3.3141a27.2 27.2 0 0 1-5.4496-4.7746l6e-3 -9e-3a27.2 27.2 0 0 1-5.2475-9.0889zm40.045 5.0986c0.40295-0.0064 0.77107 0.20574 0.96664 0.55811l2.6786 4.8249c0.0913 0.16621 0.13786 0.35032 0.13544 0.5346-8e-4 0.18428-0.0492 0.36861-0.14486 0.5344l-2.8364 4.9126c-0.19146 0.3315-0.54219 0.53451-0.92142 0.54267l-5.5169 0.0926c-0.15091 9e-3 -0.37795-0.0166-0.59763-0.15868-0.13179-0.0853-0.26151-0.21249-0.36958-0.39967l-2.6833-4.827c-0.18236-0.33255-0.18148-0.73749 0.01-1.069l2.8364-4.9127c0.0956-0.16586 0.22974-0.30062 0.38811-0.39414 0.15838-0.09346 0.34107-0.14544 0.53297-0.14866z" fill="#fff" style="paint-order:stroke markers fill"/>
414+ </g>
415+</svg>
416diff --git a/resources/launcher_pressure_effect.png b/resources/launcher_pressure_effect.png
417index 7111517..824f7a5 100644
418Binary files a/resources/launcher_pressure_effect.png and b/resources/launcher_pressure_effect.png differ
419diff --git a/resources/overlay_top_left_tile.png b/resources/overlay_top_left_tile.png
420index 19157c2..35e5c30 100644
421Binary files a/resources/overlay_top_left_tile.png and b/resources/overlay_top_left_tile.png differ
422diff --git a/resources/panel_shadow.png b/resources/panel_shadow.png
423index a37c8fe..d76818a 100644
424Binary files a/resources/panel_shadow.png and b/resources/panel_shadow.png differ
425diff --git a/resources/refine_gradient_panel.png b/resources/refine_gradient_panel.png
426index fa23f12..0b58160 100644
427Binary files a/resources/refine_gradient_panel.png and b/resources/refine_gradient_panel.png differ
428diff --git a/resources/round_outline_54x54.png b/resources/round_outline_54x54.png
429index 93e8283..a605229 100644
430Binary files a/resources/round_outline_54x54.png and b/resources/round_outline_54x54.png differ
431diff --git a/resources/squircle_base_54.png b/resources/squircle_base_54.png
432index dacfb7d..35be241 100644
433Binary files a/resources/squircle_base_54.png and b/resources/squircle_base_54.png differ
434diff --git a/resources/squircle_glow_62.png b/resources/squircle_glow_62.png
435index 87411ed..653dfe9 100644
436Binary files a/resources/squircle_glow_62.png and b/resources/squircle_glow_62.png differ
437diff --git a/resources/squircle_shadow_62.png b/resources/squircle_shadow_62.png
438index 70713de..b30b646 100644
439Binary files a/resources/squircle_shadow_62.png and b/resources/squircle_shadow_62.png differ
440diff --git a/resources/star_highlight.png b/resources/star_highlight.png
441index 3319d15..ef189d6 100644
442Binary files a/resources/star_highlight.png and b/resources/star_highlight.png differ
443diff --git a/resources/star_selected.png b/resources/star_selected.png
444index 27be912..b335dca 100644
445Binary files a/resources/star_selected.png and b/resources/star_selected.png differ
446diff --git a/tests/test_previews_application.cpp b/tests/test_previews_application.cpp
447index 77ea7cc..82afc29 100644
448--- a/tests/test_previews_application.cpp
449+++ b/tests/test_previews_application.cpp
450@@ -117,11 +117,7 @@ TEST_F(TestPreviewApplication, TestUIValues)
451 EXPECT_EQ(preview_view->title_->GetText(), "Application Title &amp; special char");
452 EXPECT_EQ(preview_view->subtitle_->GetText(), "Application Subtitle &gt; special char");
453 EXPECT_EQ(preview_view->description_->GetText(), "Application Desctiption &lt; special char");
454- EXPECT_EQ(preview_view->license_->GetText(), "License &amp; special char");
455- //EXPECT_EQ(preview_view->last_update_->GetText(), "Last Updated 11th Apr 2012"); // Not 100% sure this will work with translations.
456- EXPECT_EQ(preview_view->copywrite_->GetText(), "Copywrite &amp; special char");
457
458- EXPECT_EQ(preview_view->app_rating_->GetRating(), 0.8f);
459 EXPECT_EQ(preview_view->action_buttons_.size(), 2u);
460
461 if (preview_view->action_buttons_.size() >= 2)
462diff --git a/unity-shared/CMakeLists.txt b/unity-shared/CMakeLists.txt
463index b0ac7b1..eddc807 100644
464--- a/unity-shared/CMakeLists.txt
465+++ b/unity-shared/CMakeLists.txt
466@@ -30,6 +30,7 @@ set (UNITY_SHARED_SOURCES
467 DesktopApplicationManager.cpp
468 EMConverter.cpp
469 ExpanderView.cpp
470+ FileManager.cpp
471 GnomeFileManager.cpp
472 FontSettings.cpp
473 GraphicsUtils.cpp
474@@ -45,6 +46,7 @@ set (UNITY_SHARED_SOURCES
475 LayoutSystem.cpp
476 LineSeparator.cpp
477 MenuManager.cpp
478+ NemoFileManager.cpp
479 OverlayRenderer.cpp
480 OverlayScrollView.cpp
481 OverlayWindowButtons.cpp
482diff --git a/unity-shared/FileManager.cpp b/unity-shared/FileManager.cpp
483new file mode 100644
484index 0000000..c48a466
485--- /dev/null
486+++ b/unity-shared/FileManager.cpp
487@@ -0,0 +1,58 @@
488+// -*- Mode: C++; indent-tabs-mode: nil; tab-width: 2 -*-
489+/*
490+ * Copyright (C) 2022 Canonical Ltd
491+ *
492+ * This program is free software: you can redistribute it and/or modify
493+ * it under the terms of the GNU General Public License version 3 as
494+ * published by the Free Software Foundation.
495+ *
496+ * This program is distributed in the hope that it will be useful,
497+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
498+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
499+ * GNU General Public License for more details.
500+ *
501+ * You should have received a copy of the GNU General Public License
502+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
503+ *
504+ * Authored by: Marco Trevisan <marco.trevisan@canonical.com>
505+ */
506+
507+#include "FileManager.h"
508+
509+#include <UnityCore/GLibWrapper.h>
510+
511+#include "GnomeFileManager.h"
512+#include "NemoFileManager.h"
513+
514+#include <gio/gdesktopappinfo.h>
515+
516+namespace unity
517+{
518+
519+FileManager::Ptr FileManager::GetDefault()
520+{
521+ /* Some logic to choose the default */
522+ static FileManager::Ptr fm;
523+
524+ if (!fm) {
525+ glib::Object<GAppInfo> directory_app(g_app_info_get_default_for_type("inode/directory", TRUE));
526+
527+ if (directory_app)
528+ {
529+ auto app_id = glib::gchar_to_string(g_app_info_get_id (directory_app));
530+
531+ if (app_id == "org.gnome.Nautilus.desktop")
532+ fm = GnomeFileManager::Get();
533+ else if (app_id == "nemo.desktop")
534+ fm = NemoFileManager::Get();
535+ }
536+ else
537+ {
538+ fm = NemoFileManager::Get();
539+ }
540+ }
541+
542+ return fm;
543+}
544+
545+} // namespace unity
546diff --git a/unity-shared/FileManager.h b/unity-shared/FileManager.h
547index d3f7c46..bb636d4 100644
548--- a/unity-shared/FileManager.h
549+++ b/unity-shared/FileManager.h
550@@ -38,6 +38,8 @@ class FileManager : public sigc::trackable
551 public:
552 typedef std::shared_ptr<FileManager> Ptr;
553
554+ static Ptr GetDefault();
555+
556 FileManager() = default;
557 virtual ~FileManager() = default;
558
559diff --git a/unity-shared/NemoFileManager.cpp b/unity-shared/NemoFileManager.cpp
560new file mode 100644
561index 0000000..81432cf
562--- /dev/null
563+++ b/unity-shared/NemoFileManager.cpp
564@@ -0,0 +1,202 @@
565+// -*- Mode: C++; indent-tabs-mode: nil; tab-width: 2 -*-
566+/*
567+ * Copyright (C) 2012-2022 Canonical Ltd
568+ *
569+ * This program is free software: you can redistribute it and/or modify
570+ * it under the terms of the GNU General Public License version 3 as
571+ * published by the Free Software Foundation.
572+ *
573+ * This program is distributed in the hope that it will be useful,
574+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
575+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
576+ * GNU General Public License for more details.
577+ *
578+ * You should have received a copy of the GNU General Public License
579+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
580+ *
581+ * Authored by: Marco Trevisan <marco.trevisan@canonical.com>
582+ */
583+
584+#include "NemoFileManager.h"
585+#include <NuxCore/Logger.h>
586+
587+#include <UnityCore/GLibDBusProxy.h>
588+#include <UnityCore/GLibWrapper.h>
589+#include <gio/gdesktopappinfo.h>
590+#include <gdk/gdk.h>
591+#include <gio/gio.h>
592+
593+namespace unity
594+{
595+
596+namespace
597+{
598+DECLARE_LOGGER(logger, "unity.filemanager.nemo");
599+
600+const std::string TRASH_URI = "trash:///";
601+const std::string FILE_SCHEMA = "file://";
602+
603+const std::string NEMO_DESKTOP_ID = "nemo.desktop";
604+const std::string NEMO_NAME = "org.Nemo";
605+const std::string NEMO_PATH = "/org/Nemo";
606+}
607+
608+struct NemoFileManager::Impl
609+{
610+ Impl(NemoFileManager* parent)
611+ : parent_(parent)
612+ , app_info_(g_desktop_app_info_new(NEMO_DESKTOP_ID.c_str()))
613+ {
614+ }
615+
616+ glib::DBusProxy::Ptr NemoOperationsProxy() const
617+ {
618+ auto flags = static_cast<GDBusProxyFlags>(G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES|G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS);
619+ return std::make_shared<glib::DBusProxy>(NEMO_NAME, NEMO_PATH,
620+ "org.Nemo.FileOperations",
621+ G_BUS_TYPE_SESSION, flags);
622+ }
623+
624+ void Activate(uint64_t timestamp)
625+ {
626+ if (!app_info_)
627+ return;
628+
629+ GdkDisplay* display = gdk_display_get_default();
630+ glib::Object<GdkAppLaunchContext> context(gdk_display_get_app_launch_context(display));
631+
632+ if (timestamp > 0)
633+ gdk_app_launch_context_set_timestamp(context, timestamp);
634+
635+ auto const& gcontext = glib::object_cast<GAppLaunchContext>(context);
636+ auto proxy = std::make_shared<glib::DBusProxy>(NEMO_NAME, NEMO_PATH,
637+ "org.freedesktop.Application");
638+
639+ glib::String context_string(g_app_launch_context_get_startup_notify_id(
640+ gcontext, glib::object_cast<GAppInfo>(app_info_), nullptr));
641+
642+ if (context_string && g_utf8_validate(context_string, -1, nullptr))
643+ {
644+ GVariantBuilder builder;
645+ g_variant_builder_init(&builder, G_VARIANT_TYPE("a{sv}"));
646+ g_variant_builder_add(&builder, "{sv}", "desktop-startup-id", g_variant_new("s", context_string.Value()));
647+ GVariant *param = g_variant_new("(@a{sv})", g_variant_builder_end(&builder));
648+
649+ // Passing the proxy to the lambda we ensure that it will be destroyed when needed
650+ proxy->CallBegin("Activate", param, [proxy] (GVariant*, glib::Error const&) {});
651+ }
652+ }
653+
654+ glib::Object<GDesktopAppInfo> app_info_;
655+ NemoFileManager* parent_;
656+};
657+
658+
659+FileManager::Ptr NemoFileManager::Get()
660+{
661+ static FileManager::Ptr instance(new NemoFileManager());
662+ return instance;
663+}
664+
665+NemoFileManager::NemoFileManager()
666+ : impl_(new Impl(this))
667+{}
668+
669+NemoFileManager::~NemoFileManager()
670+{}
671+
672+void NemoFileManager::Open(std::string const& uri, uint64_t timestamp)
673+{
674+ if (uri.empty())
675+ {
676+ LOG_ERROR(logger) << "Impossible to open an empty location";
677+ return;
678+ }
679+
680+ glib::Error error;
681+ GdkDisplay* display = gdk_display_get_default();
682+ glib::Object<GdkAppLaunchContext> context(gdk_display_get_app_launch_context(display));
683+
684+ if (timestamp > 0)
685+ gdk_app_launch_context_set_timestamp(context, timestamp);
686+
687+ auto const& gcontext = glib::object_cast<GAppLaunchContext>(context);
688+ g_app_info_launch_default_for_uri(uri.c_str(), gcontext, &error);
689+
690+ if (error)
691+ {
692+ LOG_ERROR(logger) << "Impossible to open the location: " << error.Message();
693+ }
694+}
695+
696+void NemoFileManager::OpenTrash(uint64_t timestamp)
697+{
698+ Open(TRASH_URI, timestamp);
699+}
700+
701+bool NemoFileManager::TrashFile(std::string const& uri)
702+{
703+ glib::Cancellable cancellable;
704+ glib::Object<GFile> file(g_file_new_for_uri(uri.c_str()));
705+ glib::Error error;
706+
707+ if (g_file_trash(file, cancellable, &error))
708+ return true;
709+
710+ LOG_ERROR(logger) << "Impossible to trash file '" << uri << "': " << error;
711+ return false;
712+}
713+
714+void NemoFileManager::EmptyTrash(uint64_t timestamp, Window parent_xid)
715+{
716+ auto const& proxy = impl_->NemoOperationsProxy();
717+
718+ // Passing the proxy to the lambda we ensure that it will be destroyed when needed
719+ impl_->Activate(timestamp);
720+ proxy->CallBegin("EmptyTrash", nullptr, [proxy] (GVariant*, glib::Error const&) {});
721+}
722+
723+void NemoFileManager::CopyFiles(std::set<std::string> const& uris, std::string const& dest, uint64_t timestamp, Window parent_xid)
724+{
725+ if (uris.empty() || dest.empty())
726+ return;
727+
728+ bool found_valid = false;
729+ GVariantBuilder b;
730+ g_variant_builder_init(&b, G_VARIANT_TYPE("(ass)"));
731+ g_variant_builder_open(&b, G_VARIANT_TYPE("as"));
732+
733+ for (auto const& uri : uris)
734+ {
735+ if (uri.find(FILE_SCHEMA) == 0)
736+ {
737+ found_valid = true;
738+ g_variant_builder_add(&b, "s", uri.c_str());
739+ }
740+ }
741+
742+ g_variant_builder_close(&b);
743+ g_variant_builder_add(&b, "s", dest.c_str());
744+ glib::Variant parameters(g_variant_builder_end(&b));
745+
746+ if (found_valid)
747+ {
748+ // Passing the proxy to the lambda we ensure that it will be destroyed when needed
749+ auto const& proxy = impl_->NemoOperationsProxy();
750+ proxy->CallBegin("CopyURIs", parameters, [proxy] (GVariant*, glib::Error const&) {});
751+ impl_->Activate(timestamp);
752+ }
753+}
754+
755+WindowList NemoFileManager::WindowsForLocation(std::string const& location) const
756+{
757+ std::vector<ApplicationWindowPtr> windows;
758+ return windows;
759+}
760+
761+std::string NemoFileManager::LocationForWindow(ApplicationWindowPtr const& win) const
762+{
763+ return std::string();
764+}
765+
766+} // namespace unity
767diff --git a/unity-shared/NemoFileManager.h b/unity-shared/NemoFileManager.h
768new file mode 100644
769index 0000000..aaa4e91
770--- /dev/null
771+++ b/unity-shared/NemoFileManager.h
772@@ -0,0 +1,50 @@
773+// -*- Mode: C++; indent-tabs-mode: nil; tab-width: 2 -*-
774+/*
775+ * Copyright (C) 2012-2022 Canonical Ltd
776+ *
777+ * This program is free software: you can redistribute it and/or modify
778+ * it under the terms of the GNU General Public License version 3 as
779+ * published by the Free Software Foundation.
780+ *
781+ * This program is distributed in the hope that it will be useful,
782+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
783+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
784+ * GNU General Public License for more details.
785+ *
786+ * You should have received a copy of the GNU General Public License
787+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
788+ *
789+ * Authored by: Marco Trevisan <marco.trevisan@canonical.com>
790+ */
791+
792+#pragma once
793+
794+#include "FileManager.h"
795+
796+namespace unity
797+{
798+
799+class NemoFileManager : public FileManager
800+{
801+public:
802+ static FileManager::Ptr Get();
803+ ~NemoFileManager();
804+
805+ void Open(std::string const& uri, uint64_t timestamp);
806+ void OpenTrash(uint64_t timestamp);
807+
808+ void CopyFiles(std::set<std::string> const& uris, std::string const& dest, uint64_t timestamp, Window parent_xid);
809+ bool TrashFile(std::string const& uri);
810+ void EmptyTrash(uint64_t timestamp, Window parent_xid);
811+
812+ WindowList WindowsForLocation(std::string const& location) const;
813+ std::string LocationForWindow(ApplicationWindowPtr const&) const;
814+
815+private:
816+ NemoFileManager();
817+
818+ struct Impl;
819+ std::unique_ptr<Impl> impl_;
820+};
821+
822+} // namespace unity

Subscribers

People subscribed via source and target branches