Merge ~3v1n0/unity:gnome-file-manager-changes into unity:master
- Git
- lp:~3v1n0/unity
- gnome-file-manager-changes
- Merge into 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) |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Unity Team | Pending | ||
Review via email: mp+429779@code.launchpad.net |
Commit message
Description of the change
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
1 | diff --git a/.gitignore b/.gitignore |
2 | new file mode 100644 |
3 | index 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/ |
23 | diff --git a/AUTHORS b/AUTHORS |
24 | index 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> |
33 | diff --git a/CMakeLists.txt b/CMakeLists.txt |
34 | index 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") |
48 | diff --git a/dash/DashView.cpp b/dash/DashView.cpp |
49 | index 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 | } |
61 | diff --git a/dash/PlacesGroup.cpp b/dash/PlacesGroup.cpp |
62 | index 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 | |
86 | diff --git a/dash/previews/ApplicationPreview.cpp b/dash/previews/ApplicationPreview.cpp |
87 | index 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); |
177 | diff --git a/debian/changelog b/debian/changelog |
178 | index 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 ] |
196 | diff --git a/debian/control b/debian/control |
197 | index 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, |
208 | diff --git a/launcher/DeviceLauncherSection.cpp b/launcher/DeviceLauncherSection.cpp |
209 | index 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)); |
230 | diff --git a/launcher/FileManagerLauncherIcon.cpp b/launcher/FileManagerLauncherIcon.cpp |
231 | index 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 |
252 | diff --git a/launcher/QuicklistView.cpp b/launcher/QuicklistView.cpp |
253 | index 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, |
289 | diff --git a/launcher/StandaloneLauncher.cpp b/launcher/StandaloneLauncher.cpp |
290 | index 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 | |
310 | diff --git a/launcher/Tooltip.cpp b/launcher/Tooltip.cpp |
311 | index 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, |
339 | diff --git a/launcher/TrashLauncherIcon.cpp b/launcher/TrashLauncherIcon.cpp |
340 | index 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"); |
361 | diff --git a/resources/arrow_right.png b/resources/arrow_right.png |
362 | index 07556d7..3703bed 100644 |
363 | Binary files a/resources/arrow_right.png and b/resources/arrow_right.png differ |
364 | diff --git a/resources/dash_bottom_border_tile.png b/resources/dash_bottom_border_tile.png |
365 | index 7fdc159..4317893 100644 |
366 | Binary files a/resources/dash_bottom_border_tile.png and b/resources/dash_bottom_border_tile.png differ |
367 | diff --git a/resources/dash_bottom_left_corner.png b/resources/dash_bottom_left_corner.png |
368 | index dd31801..47c10bb 100644 |
369 | Binary files a/resources/dash_bottom_left_corner.png and b/resources/dash_bottom_left_corner.png differ |
370 | diff --git a/resources/dash_bottom_left_corner_mask.png b/resources/dash_bottom_left_corner_mask.png |
371 | index ed8b233..47c10bb 100644 |
372 | Binary files a/resources/dash_bottom_left_corner_mask.png and b/resources/dash_bottom_left_corner_mask.png differ |
373 | diff --git a/resources/dash_bottom_right_corner.png b/resources/dash_bottom_right_corner.png |
374 | index 1923a6a..3ab6638 100644 |
375 | Binary files a/resources/dash_bottom_right_corner.png and b/resources/dash_bottom_right_corner.png differ |
376 | diff --git a/resources/dash_left_tile.png b/resources/dash_left_tile.png |
377 | index 395784c..47c10bb 100644 |
378 | Binary files a/resources/dash_left_tile.png and b/resources/dash_left_tile.png differ |
379 | diff --git a/resources/dash_noise.png b/resources/dash_noise.png |
380 | index 1ae11be..f6ec0f3 100644 |
381 | Binary files a/resources/dash_noise.png and b/resources/dash_noise.png differ |
382 | diff --git a/resources/dash_right_border_tile.png b/resources/dash_right_border_tile.png |
383 | index 24ac7f9..57525fb 100644 |
384 | Binary files a/resources/dash_right_border_tile.png and b/resources/dash_right_border_tile.png differ |
385 | diff --git a/resources/dash_top_edge.png b/resources/dash_top_edge.png |
386 | index d024df6..47c10bb 100644 |
387 | Binary files a/resources/dash_top_edge.png and b/resources/dash_top_edge.png differ |
388 | diff --git a/resources/dash_top_right_corner.png b/resources/dash_top_right_corner.png |
389 | index 4af9f56..47c10bb 100644 |
390 | Binary files a/resources/dash_top_right_corner.png and b/resources/dash_top_right_corner.png differ |
391 | diff --git a/resources/dash_top_right_corner_mask.png b/resources/dash_top_right_corner_mask.png |
392 | index be81ecd..47c10bb 100644 |
393 | Binary files a/resources/dash_top_right_corner_mask.png and b/resources/dash_top_right_corner_mask.png differ |
394 | diff --git a/resources/dash_top_tile.png b/resources/dash_top_tile.png |
395 | index 854e300..47c10bb 100644 |
396 | Binary files a/resources/dash_top_tile.png and b/resources/dash_top_tile.png differ |
397 | diff --git a/resources/launcher_bfb.svg b/resources/launcher_bfb.svg |
398 | new file mode 100644 |
399 | index 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> |
416 | diff --git a/resources/launcher_pressure_effect.png b/resources/launcher_pressure_effect.png |
417 | index 7111517..824f7a5 100644 |
418 | Binary files a/resources/launcher_pressure_effect.png and b/resources/launcher_pressure_effect.png differ |
419 | diff --git a/resources/overlay_top_left_tile.png b/resources/overlay_top_left_tile.png |
420 | index 19157c2..35e5c30 100644 |
421 | Binary files a/resources/overlay_top_left_tile.png and b/resources/overlay_top_left_tile.png differ |
422 | diff --git a/resources/panel_shadow.png b/resources/panel_shadow.png |
423 | index a37c8fe..d76818a 100644 |
424 | Binary files a/resources/panel_shadow.png and b/resources/panel_shadow.png differ |
425 | diff --git a/resources/refine_gradient_panel.png b/resources/refine_gradient_panel.png |
426 | index fa23f12..0b58160 100644 |
427 | Binary files a/resources/refine_gradient_panel.png and b/resources/refine_gradient_panel.png differ |
428 | diff --git a/resources/round_outline_54x54.png b/resources/round_outline_54x54.png |
429 | index 93e8283..a605229 100644 |
430 | Binary files a/resources/round_outline_54x54.png and b/resources/round_outline_54x54.png differ |
431 | diff --git a/resources/squircle_base_54.png b/resources/squircle_base_54.png |
432 | index dacfb7d..35be241 100644 |
433 | Binary files a/resources/squircle_base_54.png and b/resources/squircle_base_54.png differ |
434 | diff --git a/resources/squircle_glow_62.png b/resources/squircle_glow_62.png |
435 | index 87411ed..653dfe9 100644 |
436 | Binary files a/resources/squircle_glow_62.png and b/resources/squircle_glow_62.png differ |
437 | diff --git a/resources/squircle_shadow_62.png b/resources/squircle_shadow_62.png |
438 | index 70713de..b30b646 100644 |
439 | Binary files a/resources/squircle_shadow_62.png and b/resources/squircle_shadow_62.png differ |
440 | diff --git a/resources/star_highlight.png b/resources/star_highlight.png |
441 | index 3319d15..ef189d6 100644 |
442 | Binary files a/resources/star_highlight.png and b/resources/star_highlight.png differ |
443 | diff --git a/resources/star_selected.png b/resources/star_selected.png |
444 | index 27be912..b335dca 100644 |
445 | Binary files a/resources/star_selected.png and b/resources/star_selected.png differ |
446 | diff --git a/tests/test_previews_application.cpp b/tests/test_previews_application.cpp |
447 | index 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 & special char"); |
452 | EXPECT_EQ(preview_view->subtitle_->GetText(), "Application Subtitle > special char"); |
453 | EXPECT_EQ(preview_view->description_->GetText(), "Application Desctiption < special char"); |
454 | - EXPECT_EQ(preview_view->license_->GetText(), "License & 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 & 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) |
462 | diff --git a/unity-shared/CMakeLists.txt b/unity-shared/CMakeLists.txt |
463 | index 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 |
482 | diff --git a/unity-shared/FileManager.cpp b/unity-shared/FileManager.cpp |
483 | new file mode 100644 |
484 | index 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 |
546 | diff --git a/unity-shared/FileManager.h b/unity-shared/FileManager.h |
547 | index 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 | |
559 | diff --git a/unity-shared/NemoFileManager.cpp b/unity-shared/NemoFileManager.cpp |
560 | new file mode 100644 |
561 | index 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 |
767 | diff --git a/unity-shared/NemoFileManager.h b/unity-shared/NemoFileManager.h |
768 | new file mode 100644 |
769 | index 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 |