summaryrefslogtreecommitdiff
diff options
authorMarco Trevisan (Treviño) <mail@3v1n0.net>2022-09-13 15:01:15 +0000
committerBileto Bot <ci-train-bot@canonical.com>2022-09-13 15:01:15 +0000
commit0b76574a3cd68b9d955badd03eb027bd630a4016 (patch)
tree2be27bd7a94505dc6b25f443ef0677fc9d8beb7e
parent5ecfd121cba34c11bdacc890637dd67a8e570262 (diff)
parent63d81dddb42e02aa886ac7cc3ca1078571336b95 (diff)
* Added transparent dash border
* Replaced launcher bfb with Ubuntu Unity logo * Removed broken app info and ratings from dash * Simplified app preview in dash * Fixed the 'Empty Trash' button in the launcher * Fixed the standalone testing Unity7 launcher
-rw-r--r--.gitignore16
-rw-r--r--AUTHORS2
-rw-r--r--CMakeLists.txt4
-rw-r--r--dash/DashView.cpp2
-rwxr-xr-xdash/PlacesGroup.cpp14
-rw-r--r--dash/previews/ApplicationPreview.cpp52
-rw-r--r--debian/changelog11
-rw-r--r--debian/control1
-rw-r--r--launcher/DeviceLauncherSection.cpp4
-rw-r--r--launcher/FileManagerLauncherIcon.cpp4
-rw-r--r--launcher/QuicklistView.cpp26
-rw-r--r--launcher/StandaloneLauncher.cpp3
-rw-r--r--launcher/Tooltip.cpp18
-rw-r--r--launcher/TrashLauncherIcon.cpp4
-rw-r--r--resources/arrow_right.pngbin318 -> 318 bytes
-rw-r--r--resources/dash_bottom_border_tile.pngbin211 -> 343 bytes
-rw-r--r--resources/dash_bottom_left_corner.pngbin707 -> 272 bytes
-rw-r--r--resources/dash_bottom_left_corner_mask.pngbin215 -> 272 bytes
-rw-r--r--resources/dash_bottom_right_corner.pngbin1103 -> 593 bytes
-rw-r--r--resources/dash_left_tile.pngbin233 -> 272 bytes
-rw-r--r--resources/dash_noise.pngbin23923 -> 23923 bytes
-rw-r--r--resources/dash_right_border_tile.pngbin193 -> 340 bytes
-rw-r--r--resources/dash_top_edge.pngbin287 -> 272 bytes
-rw-r--r--resources/dash_top_right_corner.pngbin735 -> 272 bytes
-rw-r--r--resources/dash_top_right_corner_mask.pngbin216 -> 272 bytes
-rw-r--r--resources/dash_top_tile.pngbin200 -> 272 bytes
-rw-r--r--resources/launcher_bfb.svg13
-rw-r--r--resources/launcher_pressure_effect.pngbin197 -> 197 bytes
-rw-r--r--resources/overlay_top_left_tile.pngbin468 -> 468 bytes
-rw-r--r--resources/panel_shadow.pngbin159 -> 159 bytes
-rw-r--r--resources/refine_gradient_panel.pngbin1691 -> 1691 bytes
-rw-r--r--resources/round_outline_54x54.pngbin1274 -> 1274 bytes
-rw-r--r--resources/squircle_base_54.pngbin1241 -> 1241 bytes
-rw-r--r--resources/squircle_glow_62.pngbin1565 -> 1565 bytes
-rw-r--r--resources/squircle_shadow_62.pngbin1006 -> 1006 bytes
-rw-r--r--resources/star_highlight.pngbin497 -> 497 bytes
-rw-r--r--resources/star_selected.pngbin706 -> 706 bytes
-rw-r--r--tests/test_previews_application.cpp4
-rw-r--r--unity-shared/CMakeLists.txt2
-rw-r--r--unity-shared/FileManager.cpp58
-rw-r--r--unity-shared/FileManager.h2
-rw-r--r--unity-shared/NemoFileManager.cpp202
-rw-r--r--unity-shared/NemoFileManager.h50
43 files changed, 370 insertions, 122 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 000000000..d58747cbb
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,16 @@
+build
+services/panel-marshal.c
+services/panel-marshal.h
+.AUTHORS.sed
+tests/autopilot/dist
+tests/autopilot/unity.egg-info
+*.log
+*.debhelper
+*.substvars
+*.swp
+debian/tmp
+debian/files
+obj-*/
+debian/libunity-core-*/
+debian/unity-*/
+debian/unity/
diff --git a/AUTHORS b/AUTHORS
index 007b35a35..f304a6334 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -1,3 +1,5 @@
+ Rudra Saraswat <rs2009@ubuntu.com>
+ Khurshid Alam <khurshid.alam@linuxmail.org>
3v1n0 <mail@3v1n0.net>
Adam Conrad <adconrad@0c3.net>
agateau <aurelien.gateau@canonical.com>
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 76ff07f9c..1d58a4619 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -10,8 +10,8 @@ include (GNUInstallDirs)
#
set (PROJECT_NAME "unity")
set (UNITY_MAJOR 7)
-set (UNITY_MINOR 5)
-set (UNITY_MICRO 1)
+set (UNITY_MINOR 6)
+set (UNITY_MICRO 0)
set (UNITY_VERSION "${UNITY_MAJOR}.${UNITY_MINOR}.${UNITY_MICRO}")
set (UNITY_API_VERSION "6.0")
set (UNITY_COMPONENTS_VERSION "6")
diff --git a/dash/DashView.cpp b/dash/DashView.cpp
index e7c516c30..dc4e1b2d8 100644
--- a/dash/DashView.cpp
+++ b/dash/DashView.cpp
@@ -1420,7 +1420,7 @@ bool DashView::DoFallbackActivation(std::string const& uri)
return application_starter_->Launch(appname, last_activated_timestamp_);
}
else
- return gtk_show_uri(NULL, uri.c_str(), last_activated_timestamp_, NULL);
+ return gtk_show_uri_on_window(NULL, uri.c_str(), last_activated_timestamp_, NULL);
return false;
}
diff --git a/dash/PlacesGroup.cpp b/dash/PlacesGroup.cpp
index 3eb5b9e02..7a1f8dbf0 100755
--- a/dash/PlacesGroup.cpp
+++ b/dash/PlacesGroup.cpp
@@ -491,20 +491,6 @@ void PlacesGroup::Draw(nux::GraphicsEngine& graphics_engine,
_focus_layer->Renderlayer(graphics_engine);
}
- if (_background_layer)
- {
- nux::Geometry bg_geo = base;
- int bg_width = _background_layer->GetDeviceTexture()->GetWidth();
- bg_geo.x = std::max(bg_geo.width - bg_width, 0);
-
- // to render into a space left over by the scrollview (1 has NOT to be scaled)
- bg_geo.width = std::min(bg_width, bg_geo.GetWidth()) + 1;
- bg_geo.height = _background_layer->GetDeviceTexture()->GetHeight();
-
- _background_layer->SetGeometry(bg_geo);
- _background_layer->Renderlayer(graphics_engine);
- }
-
graphics_engine.PopClippingRectangle();
}
diff --git a/dash/previews/ApplicationPreview.cpp b/dash/previews/ApplicationPreview.cpp
index 19d517250..49fb94b35 100644
--- a/dash/previews/ApplicationPreview.cpp
+++ b/dash/previews/ApplicationPreview.cpp
@@ -132,7 +132,7 @@ void ApplicationPreview::SetupViews()
image_data_layout_->SetSpaceBetweenChildren(style.GetPanelSplitWidth().CP(scale));
/////////////////////
- // Image
+ // Image (not used)
image_ = new CoverArt();
image_->scale = scale();
AddChild(image_.GetPointer());
@@ -161,19 +161,6 @@ void ApplicationPreview::SetupViews()
app_icon_->mouse_click.connect(on_mouse_down);
icon_layout_->AddView(app_icon_.GetPointer(), 0);
- if (app_preview_model->rating >= 0)
- {
- app_rating_ = new PreviewRatingsWidget();
- AddChild(app_rating_.GetPointer());
- app_rating_->scale = scale();
- app_rating_->SetMaximumHeight(style.GetRatingWidgetHeight().CP(scale));
- app_rating_->SetMinimumHeight(style.GetRatingWidgetHeight().CP(scale));
- app_rating_->SetRating(app_preview_model->rating);
- app_rating_->SetReviews(app_preview_model->num_ratings);
- app_rating_->request_close().connect([this]() { preview_container_->request_close.emit(); });
- icon_layout_->AddView(app_rating_.GetPointer(), 0);
- }
-
/////////////////////
/////////////////////
@@ -192,6 +179,7 @@ void ApplicationPreview::SetupViews()
title_->SetFont(style.title_font().c_str());
title_->mouse_click.connect(on_mouse_down);
title_subtitle_layout_->AddView(title_.GetPointer(), 1);
+ title_subtitle_layout_->SetPadding(34, 0, 0, 0);
if (!preview_model_->subtitle.Get().empty())
{
@@ -207,41 +195,6 @@ void ApplicationPreview::SetupViews()
app_updated_copywrite_layout_ = new nux::VLayout();
app_updated_copywrite_layout_->SetSpaceBetweenChildren(COPYRIGHT_SPACE_CHILDREN.CP(scale));
- if (!app_preview_model->license.Get().empty())
- {
- license_ = new StaticCairoText(app_preview_model->license, true, NUX_TRACKER_LOCATION);
- AddChild(license_.GetPointer());
- license_->SetFont(style.app_license_font().c_str());
- license_->SetLines(-1);
- license_->SetScale(scale);
- license_->mouse_click.connect(on_mouse_down);
- app_updated_copywrite_layout_->AddView(license_.GetPointer(), 1);
- }
-
- if (!app_preview_model->last_update.Get().empty())
- {
- std::stringstream last_update;
- last_update << _("Last Updated") << " " << app_preview_model->last_update.Get();
-
- last_update_ = new StaticCairoText(last_update.str(), true, NUX_TRACKER_LOCATION);
- AddChild(last_update_.GetPointer());
- last_update_->SetFont(style.app_last_update_font().c_str());
- last_update_->SetScale(scale);
- last_update_->mouse_click.connect(on_mouse_down);
- app_updated_copywrite_layout_->AddView(last_update_.GetPointer(), 1);
- }
-
- if (!app_preview_model->copyright.Get().empty())
- {
- copywrite_ = new StaticCairoText(app_preview_model->copyright, true, NUX_TRACKER_LOCATION);
- AddChild(copywrite_.GetPointer());
- copywrite_->SetFont(style.app_copywrite_font().c_str());
- copywrite_->SetLines(-1);
- copywrite_->SetScale(scale);
- copywrite_->mouse_click.connect(on_mouse_down);
- app_updated_copywrite_layout_->AddView(copywrite_.GetPointer(), 1);
- }
-
app_data_layout_->AddLayout(title_subtitle_layout_);
app_data_layout_->AddLayout(app_updated_copywrite_layout_);
@@ -297,7 +250,6 @@ void ApplicationPreview::SetupViews()
full_data_layout_->AddLayout(actions_layout_, 0);
/////////////////////
- image_data_layout_->AddView(image_.GetPointer(), 0);
image_data_layout_->AddLayout(full_data_layout_, 1);
mouse_click.connect(on_mouse_down);
diff --git a/debian/changelog b/debian/changelog
index 15b53581b..59a96ca7f 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,14 @@
+unity (7.6.0) UNRELEASED; urgency=medium
+
+ * Added transparent dash border
+ * Replaced launcher bfb with Ubuntu Unity logo
+ * Removed broken app info and ratings from dash
+ * Simplified app preview in dash
+ * Fixed the 'Empty Trash' button in the launcher
+ * Fixed the standalone testing Unity7 launcher
+
+ -- Rudra Saraswat <rs2009@ubuntu.com> Fri, 29 Apr 2022 15:28:29 +0530
+
unity (7.5.1+22.10.20220818-0ubuntu1) kinetic; urgency=medium
[ Alberts Muktupāvels ]
diff --git a/debian/control b/debian/control
index 59eabf999..c61edb5fe 100644
--- a/debian/control
+++ b/debian/control
@@ -90,7 +90,6 @@ Depends: ${shlibs:Depends},
unity-scope-home,
Recommends: unity-control-center,
${unity-default-masterscopes}
- nautilus (>> 3.37.1),
nemo,
gnome-disk-utility,
hud,
diff --git a/launcher/DeviceLauncherSection.cpp b/launcher/DeviceLauncherSection.cpp
index bfc922dd4..90b1203b9 100644
--- a/launcher/DeviceLauncherSection.cpp
+++ b/launcher/DeviceLauncherSection.cpp
@@ -22,7 +22,7 @@
#include "DevicesSettingsImp.h"
#include "VolumeImp.h"
#include "VolumeMonitorWrapper.h"
-#include "unity-shared/GnomeFileManager.h"
+#include "unity-shared/FileManager.h"
namespace unity
{
@@ -34,7 +34,7 @@ DeviceLauncherSection::DeviceLauncherSection(AbstractVolumeMonitorWrapper::Ptr c
DeviceNotificationDisplay::Ptr const& notify)
: monitor_(vm ? vm : std::make_shared<VolumeMonitorWrapper>())
, devices_settings_(ds ? ds : std::make_shared<DevicesSettingsImp>())
- , file_manager_(GnomeFileManager::Get())
+ , file_manager_(FileManager::GetDefault())
, device_notification_display_(notify ? notify : std::make_shared<DeviceNotificationDisplayImp>())
{
monitor_->volume_added.connect(sigc::mem_fun(this, &DeviceLauncherSection::OnVolumeAdded));
diff --git a/launcher/FileManagerLauncherIcon.cpp b/launcher/FileManagerLauncherIcon.cpp
index 0926997fe..019c5507e 100644
--- a/launcher/FileManagerLauncherIcon.cpp
+++ b/launcher/FileManagerLauncherIcon.cpp
@@ -23,7 +23,7 @@
#include <NuxCore/Logger.h>
#include <UnityCore/DesktopUtilities.h>
-#include "unity-shared/GnomeFileManager.h"
+#include "unity-shared/FileManager.h"
namespace unity
{
@@ -40,7 +40,7 @@ const std::string DEFAULT_ICON = "system-file-manager";
FileManagerLauncherIcon::FileManagerLauncherIcon(ApplicationPtr const& app, DeviceLauncherSection::Ptr const& dev, FileManager::Ptr const& fm)
: WindowedLauncherIcon(IconType::APPLICATION)
, ApplicationLauncherIcon(app)
- , StorageLauncherIcon(GetIconType(), fm ? fm : GnomeFileManager::Get())
+ , StorageLauncherIcon(GetIconType(), fm ? fm : FileManager::GetDefault())
, devices_(dev)
{
// We disconnect from ApplicationLauncherIcon app signals, as we manage them manually
diff --git a/launcher/QuicklistView.cpp b/launcher/QuicklistView.cpp
index 55251f98e..f9a83651e 100644
--- a/launcher/QuicklistView.cpp
+++ b/launcher/QuicklistView.cpp
@@ -886,32 +886,6 @@ void ql_tint_dot_hl(cairo_t* cr,
cairo_rectangle(dots_cr, 2.0f, 2.0f, 1.0f, 1.0f);
cairo_fill(dots_cr);
dots_pattern = cairo_pattern_create_for_surface(dots_surf.GetSurface());
-
- // fill path of normal context with dot-pattern
- cairo_set_operator(cr, CAIRO_OPERATOR_OVER);
- cairo_set_source(cr, dots_pattern);
- cairo_pattern_set_extend(dots_pattern, CAIRO_EXTEND_REPEAT);
- cairo_fill_preserve(cr);
- cairo_pattern_destroy(dots_pattern);
-
- // draw highlight
- cairo_set_operator(cr, CAIRO_OPERATOR_OVER);
- hl_pattern = cairo_pattern_create_radial(hl_x,
- hl_y,
- 0.0f,
- hl_x,
- hl_y,
- hl_size);
- cairo_pattern_add_color_stop_rgba(hl_pattern,
- 0.0f,
- hl_color.red,
- hl_color.green,
- hl_color.blue,
- hl_color.alpha);
- cairo_pattern_add_color_stop_rgba(hl_pattern, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f);
- cairo_set_source(cr, hl_pattern);
- cairo_fill(cr);
- cairo_pattern_destroy(hl_pattern);
}
void ql_setup(cairo_surface_t** surf,
diff --git a/launcher/StandaloneLauncher.cpp b/launcher/StandaloneLauncher.cpp
index 3c4493924..0af7d0c1b 100644
--- a/launcher/StandaloneLauncher.cpp
+++ b/launcher/StandaloneLauncher.cpp
@@ -30,6 +30,7 @@
#include "LauncherController.h"
#include "Launcher.h"
#include "unity-shared/IconRenderer.h"
+#include "unity-shared/InputMonitor.h"
#include "unity-shared/PanelStyle.h"
#include "unity-shared/UBusMessages.h"
#include "unity-shared/UnitySettings.h"
@@ -72,6 +73,8 @@ private:
void Init()
{
+ input::Monitor im_;
+
SetupBackground();
controller.reset(new launcher::Controller(std::make_shared<StandaloneDndManager>(), std::make_shared<ui::EdgeBarrierController>()));
diff --git a/launcher/Tooltip.cpp b/launcher/Tooltip.cpp
index 35e88a336..67898ee0c 100644
--- a/launcher/Tooltip.cpp
+++ b/launcher/Tooltip.cpp
@@ -275,24 +275,6 @@ void tint_dot_hl(cairo_t* cr,
tint_color.blue,
tint_color.alpha);
cairo_fill_preserve(cr);
-
- // draw glow
- hl_pattern = cairo_pattern_create_radial(hl_x,
- hl_y - hl_size / 1.4f,
- 0.0f,
- hl_x,
- hl_y - hl_size / 1.4f,
- hl_size);
- cairo_pattern_add_color_stop_rgba(hl_pattern,
- 0.0f,
- hl_color.red,
- hl_color.green,
- hl_color.blue,
- hl_color.alpha);
- cairo_pattern_add_color_stop_rgba(hl_pattern, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f);
- cairo_set_source(cr, hl_pattern);
- cairo_fill(cr);
- cairo_pattern_destroy(hl_pattern);
}
void _setup(cairo_surface_t** surf,
diff --git a/launcher/TrashLauncherIcon.cpp b/launcher/TrashLauncherIcon.cpp
index 9c6502ec9..15dc9a611 100644
--- a/launcher/TrashLauncherIcon.cpp
+++ b/launcher/TrashLauncherIcon.cpp
@@ -29,7 +29,7 @@
#include "QuicklistMenuItemLabel.h"
#include "unity-shared/DesktopApplicationManager.h"
-#include "unity-shared/GnomeFileManager.h"
+#include "unity-shared/FileManager.h"
namespace unity
{
@@ -45,7 +45,7 @@ namespace
TrashLauncherIcon::TrashLauncherIcon(FileManager::Ptr const& fm)
: WindowedLauncherIcon(IconType::TRASH)
- , StorageLauncherIcon(GetIconType(), fm ? fm : GnomeFileManager::Get())
+ , StorageLauncherIcon(GetIconType(), fm ? fm : FileManager::GetDefault())
, empty_(true)
{
tooltip_text = _("Trash");
diff --git a/resources/arrow_right.png b/resources/arrow_right.png
index 07556d7ef..3703bedc8 100644
--- a/resources/arrow_right.png
+++ b/resources/arrow_right.png
Binary files differ
diff --git a/resources/dash_bottom_border_tile.png b/resources/dash_bottom_border_tile.png
index 7fdc1593f..431789311 100644
--- a/resources/dash_bottom_border_tile.png
+++ b/resources/dash_bottom_border_tile.png
Binary files differ
diff --git a/resources/dash_bottom_left_corner.png b/resources/dash_bottom_left_corner.png
index dd3180155..47c10bb34 100644
--- a/resources/dash_bottom_left_corner.png
+++ b/resources/dash_bottom_left_corner.png
Binary files differ
diff --git a/resources/dash_bottom_left_corner_mask.png b/resources/dash_bottom_left_corner_mask.png
index ed8b233a4..47c10bb34 100644
--- a/resources/dash_bottom_left_corner_mask.png
+++ b/resources/dash_bottom_left_corner_mask.png
Binary files differ
diff --git a/resources/dash_bottom_right_corner.png b/resources/dash_bottom_right_corner.png
index 1923a6aa9..3ab6638ee 100644
--- a/resources/dash_bottom_right_corner.png
+++ b/resources/dash_bottom_right_corner.png
Binary files differ
diff --git a/resources/dash_left_tile.png b/resources/dash_left_tile.png
index 395784cee..47c10bb34 100644
--- a/resources/dash_left_tile.png
+++ b/resources/dash_left_tile.png
Binary files differ
diff --git a/resources/dash_noise.png b/resources/dash_noise.png
index 1ae11be41..f6ec0f39a 100644
--- a/resources/dash_noise.png
+++ b/resources/dash_noise.png
Binary files differ
diff --git a/resources/dash_right_border_tile.png b/resources/dash_right_border_tile.png
index 24ac7f921..57525fb87 100644
--- a/resources/dash_right_border_tile.png
+++ b/resources/dash_right_border_tile.png
Binary files differ
diff --git a/resources/dash_top_edge.png b/resources/dash_top_edge.png
index d024df6b4..47c10bb34 100644
--- a/resources/dash_top_edge.png
+++ b/resources/dash_top_edge.png
Binary files differ
diff --git a/resources/dash_top_right_corner.png b/resources/dash_top_right_corner.png
index 4af9f5615..47c10bb34 100644
--- a/resources/dash_top_right_corner.png
+++ b/resources/dash_top_right_corner.png
Binary files differ
diff --git a/resources/dash_top_right_corner_mask.png b/resources/dash_top_right_corner_mask.png
index be81ecd02..47c10bb34 100644
--- a/resources/dash_top_right_corner_mask.png
+++ b/resources/dash_top_right_corner_mask.png
Binary files differ
diff --git a/resources/dash_top_tile.png b/resources/dash_top_tile.png
index 854e3006f..47c10bb34 100644
--- a/resources/dash_top_tile.png
+++ b/resources/dash_top_tile.png
Binary files differ
diff --git a/resources/launcher_bfb.svg b/resources/launcher_bfb.svg
new file mode 100644
index 000000000..74e60e9c8
--- /dev/null
+++ b/resources/launcher_bfb.svg
@@ -0,0 +1,13 @@
+<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">
+ <defs>
+ <filter id="a" x="-.075" y="-.075" width="1.15" height="1.15" color-interpolation-filters="sRGB">
+ <feGaussianBlur stdDeviation="2.4999998"/>
+ </filter>
+ </defs>
+ <image width="136.53" height="136.53" preserveAspectRatio="none" xlink:href="data:image/png;base64,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 4K+6lV/77/8DTX3gKAGJXUUAAAAASUVORK5CYII= "/>
+ <g>
+ <ellipse cx="68.267" cy="68.267" rx="40" ry="40" fill="#9005d5"/>
+ <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"/>
+ <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"/>
+ </g>
+</svg>
diff --git a/resources/launcher_pressure_effect.png b/resources/launcher_pressure_effect.png
index 711151711..824f7a5d9 100644
--- a/resources/launcher_pressure_effect.png
+++ b/resources/launcher_pressure_effect.png
Binary files differ
diff --git a/resources/overlay_top_left_tile.png b/resources/overlay_top_left_tile.png
index 19157c277..35e5c301a 100644
--- a/resources/overlay_top_left_tile.png
+++ b/resources/overlay_top_left_tile.png
Binary files differ
diff --git a/resources/panel_shadow.png b/resources/panel_shadow.png
index a37c8fe87..d76818a65 100644
--- a/resources/panel_shadow.png
+++ b/resources/panel_shadow.png
Binary files differ
diff --git a/resources/refine_gradient_panel.png b/resources/refine_gradient_panel.png
index fa23f1228..0b58160ae 100644
--- a/resources/refine_gradient_panel.png
+++ b/resources/refine_gradient_panel.png
Binary files differ
diff --git a/resources/round_outline_54x54.png b/resources/round_outline_54x54.png
index 93e82838c..a605229c0 100644
--- a/resources/round_outline_54x54.png
+++ b/resources/round_outline_54x54.png
Binary files differ
diff --git a/resources/squircle_base_54.png b/resources/squircle_base_54.png
index dacfb7d2e..35be24128 100644
--- a/resources/squircle_base_54.png
+++ b/resources/squircle_base_54.png
Binary files differ
diff --git a/resources/squircle_glow_62.png b/resources/squircle_glow_62.png
index 87411ed95..653dfe92b 100644
--- a/resources/squircle_glow_62.png
+++ b/resources/squircle_glow_62.png
Binary files differ
diff --git a/resources/squircle_shadow_62.png b/resources/squircle_shadow_62.png
index 70713debf..b30b646b6 100644
--- a/resources/squircle_shadow_62.png
+++ b/resources/squircle_shadow_62.png
Binary files differ
diff --git a/resources/star_highlight.png b/resources/star_highlight.png
index 3319d1520..ef189d645 100644
--- a/resources/star_highlight.png
+++ b/resources/star_highlight.png
Binary files differ
diff --git a/resources/star_selected.png b/resources/star_selected.png
index 27be91284..b335dcac9 100644
--- a/resources/star_selected.png
+++ b/resources/star_selected.png
Binary files differ
diff --git a/tests/test_previews_application.cpp b/tests/test_previews_application.cpp
index 77ea7cc20..82afc2937 100644
--- a/tests/test_previews_application.cpp
+++ b/tests/test_previews_application.cpp
@@ -117,11 +117,7 @@ TEST_F(TestPreviewApplication, TestUIValues)
EXPECT_EQ(preview_view->title_->GetText(), "Application Title &amp; special char");
EXPECT_EQ(preview_view->subtitle_->GetText(), "Application Subtitle &gt; special char");
EXPECT_EQ(preview_view->description_->GetText(), "Application Desctiption &lt; special char");
- EXPECT_EQ(preview_view->license_->GetText(), "License &amp; special char");
- //EXPECT_EQ(preview_view->last_update_->GetText(), "Last Updated 11th Apr 2012"); // Not 100% sure this will work with translations.
- EXPECT_EQ(preview_view->copywrite_->GetText(), "Copywrite &amp; special char");
- EXPECT_EQ(preview_view->app_rating_->GetRating(), 0.8f);
EXPECT_EQ(preview_view->action_buttons_.size(), 2u);
if (preview_view->action_buttons_.size() >= 2)
diff --git a/unity-shared/CMakeLists.txt b/unity-shared/CMakeLists.txt
index b0ac7b12c..eddc80766 100644
--- a/unity-shared/CMakeLists.txt
+++ b/unity-shared/CMakeLists.txt
@@ -30,6 +30,7 @@ set (UNITY_SHARED_SOURCES
DesktopApplicationManager.cpp
EMConverter.cpp
ExpanderView.cpp
+ FileManager.cpp
GnomeFileManager.cpp
FontSettings.cpp
GraphicsUtils.cpp
@@ -45,6 +46,7 @@ set (UNITY_SHARED_SOURCES
LayoutSystem.cpp
LineSeparator.cpp
MenuManager.cpp
+ NemoFileManager.cpp
OverlayRenderer.cpp
OverlayScrollView.cpp
OverlayWindowButtons.cpp
diff --git a/unity-shared/FileManager.cpp b/unity-shared/FileManager.cpp
new file mode 100644
index 000000000..c48a466bb
--- /dev/null
+++ b/unity-shared/FileManager.cpp
@@ -0,0 +1,58 @@
+// -*- Mode: C++; indent-tabs-mode: nil; tab-width: 2 -*-
+/*
+ * Copyright (C) 2022 Canonical Ltd
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Authored by: Marco Trevisan <marco.trevisan@canonical.com>
+ */
+
+#include "FileManager.h"
+
+#include <UnityCore/GLibWrapper.h>
+
+#include "GnomeFileManager.h"
+#include "NemoFileManager.h"
+
+#include <gio/gdesktopappinfo.h>
+
+namespace unity
+{
+
+FileManager::Ptr FileManager::GetDefault()
+{
+ /* Some logic to choose the default */
+ static FileManager::Ptr fm;
+
+ if (!fm) {
+ glib::Object<GAppInfo> directory_app(g_app_info_get_default_for_type("inode/directory", TRUE));
+
+ if (directory_app)
+ {
+ auto app_id = glib::gchar_to_string(g_app_info_get_id (directory_app));
+
+ if (app_id == "org.gnome.Nautilus.desktop")
+ fm = GnomeFileManager::Get();
+ else if (app_id == "nemo.desktop")
+ fm = NemoFileManager::Get();
+ }
+ else
+ {
+ fm = NemoFileManager::Get();
+ }
+ }
+
+ return fm;
+}
+
+} // namespace unity
diff --git a/unity-shared/FileManager.h b/unity-shared/FileManager.h
index d3f7c46cc..bb636d411 100644
--- a/unity-shared/FileManager.h
+++ b/unity-shared/FileManager.h
@@ -38,6 +38,8 @@ class FileManager : public sigc::trackable
public:
typedef std::shared_ptr<FileManager> Ptr;
+ static Ptr GetDefault();
+
FileManager() = default;
virtual ~FileManager() = default;
diff --git a/unity-shared/NemoFileManager.cpp b/unity-shared/NemoFileManager.cpp
new file mode 100644
index 000000000..81432cf42
--- /dev/null
+++ b/unity-shared/NemoFileManager.cpp
@@ -0,0 +1,202 @@
+// -*- Mode: C++; indent-tabs-mode: nil; tab-width: 2 -*-
+/*
+ * Copyright (C) 2012-2022 Canonical Ltd
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Authored by: Marco Trevisan <marco.trevisan@canonical.com>
+ */
+
+#include "NemoFileManager.h"
+#include <NuxCore/Logger.h>
+
+#include <UnityCore/GLibDBusProxy.h>
+#include <UnityCore/GLibWrapper.h>
+#include <gio/gdesktopappinfo.h>
+#include <gdk/gdk.h>
+#include <gio/gio.h>
+
+namespace unity
+{
+
+namespace
+{
+DECLARE_LOGGER(logger, "unity.filemanager.nemo");
+
+const std::string TRASH_URI = "trash:///";
+const std::string FILE_SCHEMA = "file://";
+
+const std::string NEMO_DESKTOP_ID = "nemo.desktop";
+const std::string NEMO_NAME = "org.Nemo";
+const std::string NEMO_PATH = "/org/Nemo";
+}
+
+struct NemoFileManager::Impl
+{
+ Impl(NemoFileManager* parent)
+ : parent_(parent)
+ , app_info_(g_desktop_app_info_new(NEMO_DESKTOP_ID.c_str()))
+ {
+ }
+
+ glib::DBusProxy::Ptr NemoOperationsProxy() const
+ {
+ auto flags = static_cast<GDBusProxyFlags>(G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES|G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS);
+ return std::make_shared<glib::DBusProxy>(NEMO_NAME, NEMO_PATH,
+ "org.Nemo.FileOperations",
+ G_BUS_TYPE_SESSION, flags);
+ }
+
+ void Activate(uint64_t timestamp)
+ {
+ if (!app_info_)
+ return;
+
+ GdkDisplay* display = gdk_display_get_default();
+ glib::Object<GdkAppLaunchContext> context(gdk_display_get_app_launch_context(display));
+
+ if (timestamp > 0)
+ gdk_app_launch_context_set_timestamp(context, timestamp);
+
+ auto const& gcontext = glib::object_cast<GAppLaunchContext>(context);
+ auto proxy = std::make_shared<glib::DBusProxy>(NEMO_NAME, NEMO_PATH,
+ "org.freedesktop.Application");
+
+ glib::String context_string(g_app_launch_context_get_startup_notify_id(
+ gcontext, glib::object_cast<GAppInfo>(app_info_), nullptr));
+
+ if (context_string && g_utf8_validate(context_string, -1, nullptr))
+ {
+ GVariantBuilder builder;
+ g_variant_builder_init(&builder, G_VARIANT_TYPE("a{sv}"));
+ g_variant_builder_add(&builder, "{sv}", "desktop-startup-id", g_variant_new("s", context_string.Value()));
+ GVariant *param = g_variant_new("(@a{sv})", g_variant_builder_end(&builder));
+
+ // Passing the proxy to the lambda we ensure that it will be destroyed when needed
+ proxy->CallBegin("Activate", param, [proxy] (GVariant*, glib::Error const&) {});
+ }
+ }
+
+ glib::Object<GDesktopAppInfo> app_info_;
+ NemoFileManager* parent_;
+};
+
+
+FileManager::Ptr NemoFileManager::Get()
+{
+ static FileManager::Ptr instance(new NemoFileManager());
+ return instance;
+}
+
+NemoFileManager::NemoFileManager()
+ : impl_(new Impl(this))
+{}
+
+NemoFileManager::~NemoFileManager()
+{}
+
+void NemoFileManager::Open(std::string const& uri, uint64_t timestamp)
+{
+ if (uri.empty())
+ {
+ LOG_ERROR(logger) << "Impossible to open an empty location";
+ return;
+ }
+
+ glib::Error error;
+ GdkDisplay* display = gdk_display_get_default();
+ glib::Object<GdkAppLaunchContext> context(gdk_display_get_app_launch_context(display));
+
+ if (timestamp > 0)
+ gdk_app_launch_context_set_timestamp(context, timestamp);
+
+ auto const& gcontext = glib::object_cast<GAppLaunchContext>(context);
+ g_app_info_launch_default_for_uri(uri.c_str(), gcontext, &error);
+
+ if (error)
+ {
+ LOG_ERROR(logger) << "Impossible to open the location: " << error.Message();
+ }
+}
+
+void NemoFileManager::OpenTrash(uint64_t timestamp)
+{
+ Open(TRASH_URI, timestamp);
+}
+
+bool NemoFileManager::TrashFile(std::string const& uri)
+{
+ glib::Cancellable cancellable;
+ glib::Object<GFile> file(g_file_new_for_uri(uri.c_str()));
+ glib::Error error;
+
+ if (g_file_trash(file, cancellable, &error))
+ return true;
+
+ LOG_ERROR(logger) << "Impossible to trash file '" << uri << "': " << error;
+ return false;
+}
+
+void NemoFileManager::EmptyTrash(uint64_t timestamp, Window parent_xid)
+{
+ auto const& proxy = impl_->NemoOperationsProxy();
+
+ // Passing the proxy to the lambda we ensure that it will be destroyed when needed
+ impl_->Activate(timestamp);
+ proxy->CallBegin("EmptyTrash", nullptr, [proxy] (GVariant*, glib::Error const&) {});
+}
+
+void NemoFileManager::CopyFiles(std::set<std::string> const& uris, std::string const& dest, uint64_t timestamp, Window parent_xid)
+{
+ if (uris.empty() || dest.empty())
+ return;
+
+ bool found_valid = false;
+ GVariantBuilder b;
+ g_variant_builder_init(&b, G_VARIANT_TYPE("(ass)"));
+ g_variant_builder_open(&b, G_VARIANT_TYPE("as"));
+
+ for (auto const& uri : uris)
+ {
+ if (uri.find(FILE_SCHEMA) == 0)
+ {
+ found_valid = true;
+ g_variant_builder_add(&b, "s", uri.c_str());
+ }
+ }
+
+ g_variant_builder_close(&b);
+ g_variant_builder_add(&b, "s", dest.c_str());
+ glib::Variant parameters(g_variant_builder_end(&b));
+
+ if (found_valid)
+ {
+ // Passing the proxy to the lambda we ensure that it will be destroyed when needed
+ auto const& proxy = impl_->NemoOperationsProxy();
+ proxy->CallBegin("CopyURIs", parameters, [proxy] (GVariant*, glib::Error const&) {});
+ impl_->Activate(timestamp);
+ }
+}
+
+WindowList NemoFileManager::WindowsForLocation(std::string const& location) const
+{
+ std::vector<ApplicationWindowPtr> windows;
+ return windows;
+}
+
+std::string NemoFileManager::LocationForWindow(ApplicationWindowPtr const& win) const
+{
+ return std::string();
+}
+
+} // namespace unity
diff --git a/unity-shared/NemoFileManager.h b/unity-shared/NemoFileManager.h
new file mode 100644
index 000000000..aaa4e91d9
--- /dev/null
+++ b/unity-shared/NemoFileManager.h
@@ -0,0 +1,50 @@
+// -*- Mode: C++; indent-tabs-mode: nil; tab-width: 2 -*-
+/*
+ * Copyright (C) 2012-2022 Canonical Ltd
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Authored by: Marco Trevisan <marco.trevisan@canonical.com>
+ */
+
+#pragma once
+
+#include "FileManager.h"
+
+namespace unity
+{
+
+class NemoFileManager : public FileManager
+{
+public:
+ static FileManager::Ptr Get();
+ ~NemoFileManager();
+
+ void Open(std::string const& uri, uint64_t timestamp);
+ void OpenTrash(uint64_t timestamp);
+
+ void CopyFiles(std::set<std::string> const& uris, std::string const& dest, uint64_t timestamp, Window parent_xid);
+ bool TrashFile(std::string const& uri);
+ void EmptyTrash(uint64_t timestamp, Window parent_xid);
+
+ WindowList WindowsForLocation(std::string const& location) const;
+ std::string LocationForWindow(ApplicationWindowPtr const&) const;
+
+private:
+ NemoFileManager();
+
+ struct Impl;
+ std::unique_ptr<Impl> impl_;
+};
+
+} // namespace unity