diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 095b5f8a1..106975349 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -17,14 +17,14 @@ flatpak:master: script: # This should be removed once the base image works with git submodules - dnf install -y git - - flatpak-builder --stop-at=nautilus app build-aux/flatpak/org.gnome.Nautilus.json - - flatpak-builder --run app build-aux/flatpak/org.gnome.Nautilus.json meson --prefix=/app --libdir=/app/lib _build - - flatpak-builder --run app build-aux/flatpak/org.gnome.Nautilus.json ninja -C _build install - - flatpak-builder --finish-only --repo=repo app build-aux/flatpak/org.gnome.Nautilus.json + - flatpak-builder --stop-at=nautilus app build-aux/flatpak/org.gnome.NautilusDevel.json + - flatpak-builder --run app build-aux/flatpak/org.gnome.NautilusDevel.json meson --prefix=/app --libdir=/app/lib -Dprofile=development _build + - flatpak-builder --run app build-aux/flatpak/org.gnome.NautilusDevel.json ninja -C _build install + - flatpak-builder --finish-only --repo=repo app build-aux/flatpak/org.gnome.NautilusDevel.json # Make a Flatpak Nautilus bundle for people to test - - flatpak build-bundle repo nautilus-dev.flatpak org.gnome.Nautilus + - flatpak build-bundle repo nautilus-dev.flatpak org.gnome.NautilusDevel # Run automatic tests inside the Flatpak env - - flatpak-builder --run app build-aux/flatpak/org.gnome.Nautilus.json ninja -C _build test + - flatpak-builder --run app build-aux/flatpak/org.gnome.NautilusDevel.json ninja -C _build test artifacts: paths: - nautilus-dev.flatpak diff --git a/build-aux/flatpak/org.gnome.Nautilus.json b/build-aux/flatpak/org.gnome.NautilusDevel.json similarity index 96% rename from build-aux/flatpak/org.gnome.Nautilus.json rename to build-aux/flatpak/org.gnome.NautilusDevel.json index 8f186773e..a53f619e6 100644 --- a/build-aux/flatpak/org.gnome.Nautilus.json +++ b/build-aux/flatpak/org.gnome.NautilusDevel.json @@ -1,5 +1,5 @@ { - "app-id": "org.gnome.Nautilus", + "app-id": "org.gnome.NautilusDevel", "runtime": "org.gnome.Platform", "runtime-version": "3.28", "sdk": "org.gnome.Sdk", @@ -82,7 +82,8 @@ "builddir": true, "name": "nautilus", "config-opts": [ - "--libdir=/app/lib" + "--libdir=/app/lib", + "-Dprofile=development" ], "sources": [ { diff --git a/data/meson.build b/data/meson.build index 11192d5f7..ab9b853a9 100644 --- a/data/meson.build +++ b/data/meson.build @@ -1,7 +1,36 @@ -install_subdir( - join_paths('icons', 'hicolor'), - install_dir: join_paths(datadir, 'icons') +########## EVIL EVIL EVIL +# See https://github.com/mesonbuild/meson/issues/1487 +# and https://github.com/mesonbuild/meson/pull/3223 +# +# This is primarily for the “build profiles” feature, +# to be able to have icons even if we change the application ID. +# +# https://gitlab.gnome.org/GNOME/nautilus/merge_requests/144 +########## +foreach icon_size: ['16x16', '22x22', '24x24', '32x32', '48x48', '512x512'] + configure_file( + command: [ + 'cp', '@INPUT@', '@OUTPUT@' + ], + input: files( + join_paths('icons', 'hicolor', icon_size, 'apps', 'org.gnome.Nautilus.png') + ), + install_dir: join_paths(datadir, 'icons', 'hicolor', icon_size, 'apps'), + output: '@0@.png'.format(application_id) + ) +endforeach + +configure_file( + command: [ + 'cp', '@INPUT@', '@OUTPUT@' + ], + input: files( + join_paths('icons', 'hicolor', 'symbolic', 'apps', 'org.gnome.Nautilus-symbolic.svg') + ), + install_dir: join_paths(datadir, 'icons', 'hicolor', 'symbolic', 'apps'), + output: '@0@-symbolic.svg'.format(application_id) ) +########## po_dir = join_paths(meson.source_root(), 'po') @@ -14,10 +43,18 @@ line_up_parameters = executable( ] ) +desktop_conf = configuration_data() + +desktop_conf.set('icon', application_id) + desktop = i18n.merge_file( 'desktop', - input: 'org.gnome.Nautilus.desktop.in', - output: 'org.gnome.Nautilus.desktop', + input: configure_file( + input: files('org.gnome.Nautilus.desktop.in.in'), + output: 'org.gnome.Nautilus.desktop.in', + configuration: desktop_conf + ), + output: '@0@.desktop'.format(application_id), install: true, install_dir: desktopdir, po_dir: po_dir, @@ -34,21 +71,30 @@ desktop_autorun_software = i18n.merge_file( type: 'desktop' ) +appdata_conf = configuration_data() + +appdata_conf.set('appid', application_id) + appdata = i18n.merge_file( 'appdata', - input: 'org.gnome.Nautilus.appdata.xml.in', - output: 'org.gnome.Nautilus.appdata.xml', + input: configure_file( + input: files('org.gnome.Nautilus.appdata.xml.in.in'), + output: 'org.gnome.Nautilus.appdata.xml.in', + configuration: appdata_conf + ), + output: '@0@.appdata.xml'.format(application_id), install: true, install_dir: join_paths(datadir, 'metainfo'), po_dir: po_dir ) service_conf = configuration_data() +service_conf.set('appid', application_id) service_conf.set('bindir', join_paths(prefix, bindir)) configure_file( input: 'org.gnome.Nautilus.service.in', - output: 'org.gnome.Nautilus.service', + output: '@0@.service'.format(application_id), configuration: service_conf, install_dir: servicedir ) @@ -60,9 +106,16 @@ configure_file( install_dir: servicedir ) -install_data( - 'org.gnome.Nautilus.search-provider.ini', - install_dir: join_paths(datadir, 'gnome-shell', 'search-providers') +search_provider_conf = configuration_data() + +search_provider_conf.set('appid', application_id) +search_provider_conf.set('profile', profile) + +configure_file( + configuration: search_provider_conf, + input: files('org.gnome.Nautilus.search-provider.ini.in'), + install_dir: join_paths(datadir, 'gnome-shell', 'search-providers'), + output: '@0@.search-provider.ini'.format(application_id) ) install_data( diff --git a/data/org.gnome.Nautilus.appdata.xml.in b/data/org.gnome.Nautilus.appdata.xml.in.in similarity index 97% rename from data/org.gnome.Nautilus.appdata.xml.in rename to data/org.gnome.Nautilus.appdata.xml.in.in index 9ec61d52a..30648b3e6 100644 --- a/data/org.gnome.Nautilus.appdata.xml.in +++ b/data/org.gnome.Nautilus.appdata.xml.in.in @@ -1,6 +1,6 @@ - org.gnome.Nautilus.desktop + @appid@.desktop CC0-1.0 GPL-2.0+ Nautilus diff --git a/data/org.gnome.Nautilus.desktop.in b/data/org.gnome.Nautilus.desktop.in.in similarity index 97% rename from data/org.gnome.Nautilus.desktop.in rename to data/org.gnome.Nautilus.desktop.in.in index b7be676f7..32bcab5c5 100644 --- a/data/org.gnome.Nautilus.desktop.in +++ b/data/org.gnome.Nautilus.desktop.in.in @@ -5,7 +5,7 @@ Comment=Access and organize files Keywords=folder;manager;explore;disk;filesystem; Exec=nautilus --new-window %U # Translators: Do NOT translate or transliterate this text (this is an icon file name)! -Icon=org.gnome.Nautilus +Icon=@icon@ Terminal=false Type=Application DBusActivatable=true diff --git a/data/org.gnome.Nautilus.search-provider.ini b/data/org.gnome.Nautilus.search-provider.ini deleted file mode 100644 index 20b6d1240..000000000 --- a/data/org.gnome.Nautilus.search-provider.ini +++ /dev/null @@ -1,5 +0,0 @@ -[Shell Search Provider] -DesktopId=org.gnome.Nautilus.desktop -BusName=org.gnome.Nautilus -ObjectPath=/org/gnome/Nautilus/SearchProvider -Version=2 diff --git a/data/org.gnome.Nautilus.search-provider.ini.in b/data/org.gnome.Nautilus.search-provider.ini.in new file mode 100644 index 000000000..0ef7f7910 --- /dev/null +++ b/data/org.gnome.Nautilus.search-provider.ini.in @@ -0,0 +1,5 @@ +[Shell Search Provider] +DesktopId=@appid@.desktop +BusName=@appid@ +ObjectPath=/org/gnome/Nautilus@profile@/SearchProvider +Version=2 diff --git a/data/org.gnome.Nautilus.service.in b/data/org.gnome.Nautilus.service.in index 48fe6fce2..55505ef73 100644 --- a/data/org.gnome.Nautilus.service.in +++ b/data/org.gnome.Nautilus.service.in @@ -1,3 +1,3 @@ [D-BUS Service] -Name=org.gnome.Nautilus +Name=@appid@ Exec=@bindir@/nautilus --gapplication-service diff --git a/eel/meson.build b/eel/meson.build index 70419c670..2f577a981 100644 --- a/eel/meson.build +++ b/eel/meson.build @@ -27,6 +27,7 @@ libeel_2_sources = [ ] libeel_2_deps = [ + config_h, gail, glib, gtk, diff --git a/libnautilus-extension/meson.build b/libnautilus-extension/meson.build index 113c779ad..d62b05c62 100644 --- a/libnautilus-extension/meson.build +++ b/libnautilus-extension/meson.build @@ -54,6 +54,7 @@ libnautilus_extension_sources = [ ] libnautilus_extension_deps = [ + config_h, glib, gtk ] diff --git a/meson.build b/meson.build index d505f66ce..8f39e36d7 100644 --- a/meson.build +++ b/meson.build @@ -92,12 +92,31 @@ xml = dependency('libxml-2.0', version: '>= 2.7.8') # Configuration conf = configuration_data() -conf.set_quoted('VERSION', meson.project_version()) +if get_option('profile') == 'development' + version = '@0@-@VCS_TAG@'.format(meson.project_version()) + conf.set_quoted('NAME_SUFFIX', ' (Development Snapshot)') + profile = 'Devel' +else + if get_option('profile') == 'stable-flatpak' + version = '@0@-flatpak'.format(meson.project_version()) + profile = 'Stable' + else + version = meson.project_version() + profile = '' + endif + conf.set_quoted('NAME_SUFFIX', '') +endif + +application_id = 'org.gnome.Nautilus@0@'.format(profile) + +conf.set_quoted('VERSION', version) conf.set_quoted('PACKAGE_VERSION', meson.project_version()) conf.set_quoted('GETTEXT_PACKAGE', 'nautilus') conf.set_quoted('LOCALEDIR', join_paths(prefix, get_option('localedir'))) conf.set_quoted('NAUTILUS_DATADIR', join_paths(datadir, 'nautilus')) conf.set_quoted('NAUTILUS_EXTENSIONDIR', join_paths(prefix, extensiondir)) +conf.set_quoted('APPLICATION_ID', application_id) +conf.set_quoted('PROFILE', profile) if get_option('packagekit') conf.set10('ENABLE_PACKAGEKIT', true) @@ -109,7 +128,25 @@ if get_option('selinux') conf.set10('HAVE_SELINUX', true) endif -configure_file(output: 'config.h', configuration: conf) +if get_option('profile') == 'development' + config_h = declare_dependency( + sources: vcs_tag( + command: ['git', 'rev-parse', '--short', 'HEAD'], + fallback: 'devel', + input: configure_file( + output: 'config.h.in', + configuration: conf + ), + output: 'config.h' + ) + ) +else + configure_file( + output: 'config.h', + configuration: conf + ) + config_h = dependency('', required: false) +endif # nautilus_include_dirs = include_directories( diff --git a/meson_options.txt b/meson_options.txt index 7b6cc6946..9d514eb76 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -4,3 +4,13 @@ option('extensions', type: 'boolean', value: true) option('packagekit', type: 'boolean', value: true) option('selinux', type: 'boolean', value: false) option('tests', type: 'combo', choices: ['none', 'headless', 'all'], value: 'headless') +option( + 'profile', + type: 'combo', + choices: [ + 'default', + 'stable-flatpak', + 'development' + ], + value: 'default' +) diff --git a/src/meson.build b/src/meson.build index 8601de459..0979128c8 100644 --- a/src/meson.build +++ b/src/meson.build @@ -266,6 +266,7 @@ libnautilus_sources = [ ] nautilus_deps = [ + config_h, eel_2, gio_unix, gmodule, @@ -323,6 +324,9 @@ executable( 'nautilus-autorun-software', nautilus_autorun_software_sources, include_directories: nautilus_include_dirs, - dependencies: gtk, + dependencies: [ + config_h, + gtk + ], install: true ) diff --git a/src/nautilus-application.c b/src/nautilus-application.c index 241c809dc..202ba1322 100644 --- a/src/nautilus-application.c +++ b/src/nautilus-application.c @@ -245,6 +245,7 @@ nautilus_application_create_window (NautilusApplication *self, g_autoptr (GVariant) default_size = NULL; gint default_width = 0; gint default_height = 0; + const gchar *application_id; g_return_val_if_fail (NAUTILUS_IS_APPLICATION (self), NULL); nautilus_profile_start (NULL); @@ -270,6 +271,16 @@ nautilus_application_create_window (NautilusApplication *self, MAX (NAUTILUS_WINDOW_MIN_WIDTH, default_width), MAX (NAUTILUS_WINDOW_MIN_HEIGHT, default_height)); + application_id = g_application_get_application_id (G_APPLICATION (self)); + if (g_strcmp0 (application_id, "org.gnome.NautilusDevel") == 0) + { + GtkStyleContext *style_context; + + style_context = gtk_widget_get_style_context (GTK_WIDGET (window)); + + gtk_style_context_add_class (style_context, "devel"); + } + DEBUG ("Creating a new navigation window"); nautilus_profile_end (NULL); @@ -1253,7 +1264,7 @@ nautilus_application_startup_common (NautilusApplication *self) */ G_APPLICATION_CLASS (nautilus_application_parent_class)->startup (G_APPLICATION (self)); - gtk_window_set_default_icon_name ("org.gnome.Nautilus"); + gtk_window_set_default_icon_name (APPLICATION_ID); setup_theme_extensions (); @@ -1535,7 +1546,7 @@ NautilusApplication * nautilus_application_new (void) { return g_object_new (NAUTILUS_TYPE_APPLICATION, - "application-id", "org.gnome.Nautilus", + "application-id", APPLICATION_ID, "flags", G_APPLICATION_HANDLES_COMMAND_LINE | G_APPLICATION_HANDLES_OPEN, "inactivity-timeout", 12000, NULL); diff --git a/src/nautilus-dbus-manager.c b/src/nautilus-dbus-manager.c index ae09247e7..3611a2358 100644 --- a/src/nautilus-dbus-manager.c +++ b/src/nautilus-dbus-manager.c @@ -171,7 +171,7 @@ nautilus_dbus_manager_register (NautilusDBusManager *self, GError **error) { return g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (self->file_operations), - connection, "/org/gnome/Nautilus", error); + connection, "/org/gnome/Nautilus" PROFILE, error); } void diff --git a/src/nautilus-file-utilities.h b/src/nautilus-file-utilities.h index a5a523830..4b2124b3b 100644 --- a/src/nautilus-file-utilities.h +++ b/src/nautilus-file-utilities.h @@ -26,7 +26,9 @@ #include #include -#define NAUTILUS_DESKTOP_ID "org.gnome.Nautilus.desktop" +#include + +#define NAUTILUS_DESKTOP_ID APPLICATION_ID ".desktop" /* These functions all return something something that needs to be * freed with g_free, is not NULL, and is guaranteed to exist. diff --git a/src/nautilus-preferences-window.c b/src/nautilus-preferences-window.c index 7a1c05219..48861cfb4 100644 --- a/src/nautilus-preferences-window.c +++ b/src/nautilus-preferences-window.c @@ -508,7 +508,7 @@ static void nautilus_preferences_window_setup(GtkBuilder *builder, window = GTK_WIDGET (gtk_builder_get_object (builder, "preferences_window")); preferences_window = window; - gtk_window_set_icon_name (GTK_WINDOW (preferences_window), "org.gnome.Nautilus"); + gtk_window_set_icon_name (GTK_WINDOW (preferences_window), APPLICATION_ID); g_object_add_weak_pointer (G_OBJECT (window), (gpointer *) &preferences_window); diff --git a/src/nautilus-shell-search-provider.c b/src/nautilus-shell-search-provider.c index cdadc08d3..56e26e431 100644 --- a/src/nautilus-shell-search-provider.c +++ b/src/nautilus-shell-search-provider.c @@ -779,7 +779,7 @@ nautilus_shell_search_provider_register (NautilusShellSearchProvider *self, { return g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (self->skeleton), connection, - "/org/gnome/Nautilus/SearchProvider", error); + "/org/gnome/Nautilus" PROFILE "/SearchProvider", error); } void diff --git a/src/nautilus-window.c b/src/nautilus-window.c index 862695bac..dee129eb3 100644 --- a/src/nautilus-window.c +++ b/src/nautilus-window.c @@ -2987,6 +2987,7 @@ NautilusWindow * nautilus_window_new (GdkScreen *screen) { return g_object_new (NAUTILUS_TYPE_WINDOW, + "icon-name", APPLICATION_ID, "screen", screen, NULL); } @@ -3071,9 +3072,16 @@ nautilus_window_show_about_dialog (NautilusWindow *window) "Sun Microsystems", NULL }; + g_autofree gchar *program_name = NULL; + + /* “Files” is the generic application name and the suffix is + * an arbitrary and deliberately unlocalized string only shown + * in development builds. + */ + program_name = g_strconcat (_("Files"), NAME_SUFFIX, NULL); gtk_show_about_dialog (window ? GTK_WINDOW (window) : NULL, - "program-name", _("Files"), + "program-name", program_name, "version", VERSION, "comments", _("Access and organize your files."), "copyright", "Copyright © 1999–2018 The Files Authors", @@ -3086,7 +3094,7 @@ nautilus_window_show_about_dialog (NautilusWindow *window) * box to give credit to the translator(s). */ "translator-credits", _("translator-credits"), - "logo-icon-name", "org.gnome.Nautilus", + "logo-icon-name", APPLICATION_ID, NULL); } diff --git a/src/resources/css/Adwaita.css b/src/resources/css/Adwaita.css index 098d0914a..59ab22b02 100644 --- a/src/resources/css/Adwaita.css +++ b/src/resources/css/Adwaita.css @@ -4,6 +4,121 @@ background: @theme_base_color; } +.nautilus-window.devel headerbar { + background: #cbd2d9 -gtk-icontheme("system-run-symbolic") 70% 0/64px 64px no-repeat, linear-gradient(to top, #a5b1bd, #c5cdd5 2px, #cbd2d9 3px); + box-shadow: inset 0 1px #f1f3f5; + border-color: #909fae; + color: rgba(46, 52, 54, 0.2); +} +.nautilus-window.devel headerbar > * { + color: #2e3436; +} +.nautilus-window.devel headerbar > *:backdrop { + color: #8b8e8f; +} +.nautilus-window.devel headerbar:backdrop { + background-image: -gtk-icontheme("system-run-symbolic"), image(#cbd2d9); + box-shadow: inset 0 1px #f1f3f5; + color: rgba(139, 142, 143, 0.1); +} +.nautilus-window.devel headerbar button { + color: #2e3436; + outline-color: rgba(46, 52, 54, 0.3); + border-color: #909fae; + border-bottom-color: #738698; + background-image: linear-gradient(to bottom, #cbd2d9, #bfc8d0 60%, #aeb9c3); + text-shadow: 0 1px rgba(255, 255, 255, 0.76923); + -gtk-icon-shadow: 0 1px rgba(255, 255, 255, 0.76923); + box-shadow: inset 0 1px rgba(255, 255, 255, 0.6); +} +.nautilus-window.devel headerbar button.flat, +.nautilus-window.devel headerbar button.titlebutton { + border-color: transparent; + background-color: transparent; + background-image: none; + box-shadow: inset 0 1px rgba(255, 255, 255, 0); + text-shadow: none; + -gtk-icon-shadow: none; +} +.nautilus-window.devel headerbar button.titlebutton { + text-shadow: 0 1px rgba(255, 255, 255, 0.76923); + -gtk-icon-shadow: 0 1px rgba(255, 255, 255, 0.76923); +} +.nautilus-window.devel headerbar button:hover { + color: #2e3436; + outline-color: rgba(46, 52, 54, 0.3); + border-color: #909fae; + border-bottom-color: #738698; + text-shadow: 0 1px rgba(255, 255, 255, 0.76923); + -gtk-icon-shadow: 0 1px rgba(255, 255, 255, 0.76923); + box-shadow: inset 0 1px rgba(255, 255, 255, 0.6); + background-image: linear-gradient(to bottom, #dde1e6, #cbd2d9 60%, #bfc8d0); +} +.nautilus-window.devel headerbar button:active, +.nautilus-window.devel headerbar button:checked { + color: #2e3436; + outline-color: rgba(46, 52, 54, 0.3); + border-color: #909fae; + background-image: image(#b9c3cc); + box-shadow: inset 0 1px rgba(255, 255, 255, 0); + text-shadow: none; + -gtk-icon-shadow: none; +} +.nautilus-window.devel headerbar button:disabled { + border-color: #909fae; + background-image: image(#d3d9df); + text-shadow: none; + -gtk-icon-shadow: none; + box-shadow: inset 0 1px rgba(255, 255, 255, 0); +} +.nautilus-window.devel headerbar button:disabled label, +.nautilus-window.devel headerbar button:disabled { + color: #8b8e8f; +} +.nautilus-window.devel headerbar button:backdrop { + border-color: #cbd2d9; + background-image: image(#cbd2d9); + text-shadow: none; + -gtk-icon-shadow: none; + box-shadow: inset 0 1px rgba(255, 255, 255, 0); + border-color: #909fae; +} +.nautilus-window.devel headerbar button:backdrop label, +.nautilus-window.devel headerbar button:backdrop { + color: #8b8e8f; +} +.nautilus-window.devel headerbar button:backdrop:active { + border-color: #bbc5ce; + background-image: image(#bbc5ce); + box-shadow: inset 0 1px rgba(255, 255, 255, 0); + border-color: #909fae; +} +.nautilus-window.devel headerbar button:backdrop:active label, +.nautilus-window.devel headerbar button:backdrop:active { + color: #8b8e8f; +} +.nautilus-window.devel headerbar button:backdrop:disabled { + border-color: #d3d9df; + background-image: image(#d3d9df); + text-shadow: none; + -gtk-icon-shadow: none; + box-shadow: inset 0 1px rgba(255, 255, 255, 0); + border-color: #909fae; +} +.nautilus-window.devel headerbar button:backdrop:disabled label, +.nautilus-window.devel headerbar button:backdrop:disabled { + color: #999fa4; +} +.nautilus-window.devel headerbar button.flat:backdrop, +.nautilus-window.devel headerbar button.titlebutton:backdrop { + border-color: transparent; + background-color: transparent; + background-image: none; + box-shadow: inset 0 1px rgba(255, 255, 255, 0); + text-shadow: none; + -gtk-icon-shadow: none; +} + .nautilus-canvas-item { border-radius: 5px; } diff --git a/src/resources/ui/nautilus-window.ui b/src/resources/ui/nautilus-window.ui index ba988b325..52efc2ecc 100644 --- a/src/resources/ui/nautilus-window.ui +++ b/src/resources/ui/nautilus-window.ui @@ -3,7 +3,6 @@