diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f511ee5..a707387 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -10,9 +10,10 @@ flatpak: image: "registry.gitlab.gnome.org/gnome/gnome-runtime-images/rust_bundle:master" stage: "test" variables: - MANIFEST_PATH: "org.gnome.Podcasts.json" + MANIFEST_PATH: "org.gnome.PodcastsDevel.json" FLATPAK_MODULE: "gnome-podcasts" - DBUS_ID: "org.gnome.Podcasts" + CONFIGURE_ARGS: "-Dprofile=development" + DBUS_ID: "org.gnome.PodcastsDevel" script: - flatpak-builder --stop-at=${FLATPAK_MODULE} app ${MANIFEST_PATH} @@ -21,13 +22,16 @@ flatpak: - flatpak-builder --run app ${MANIFEST_PATH} glib-compile-resources --sourcedir=podcasts-gtk/resources/ podcasts-gtk/resources/resources.xml # Build the flatpak repo - - flatpak-builder --run app ${MANIFEST_PATH} meson --prefix=/app _build + - flatpak-builder --run app ${MANIFEST_PATH} meson --prefix=/app ${CONFIGURE_ARGS} _build - flatpak-builder --run app ${MANIFEST_PATH} ninja -C _build install # Run the tests - | xvfb-run -a -s "-screen 0 1024x768x24" \ flatpak-builder --run \ + --env=APP_ID="org.gnome.PodcastsDevel" \ + --env=LOCALEDIR="./podcasts-gtk/po" \ + --env=VERSION="0.0.0" \ --env=RUSTFLAGS="--cfg rayon_unstable" \ --env=CARGO_HOME="target/cargo-home" \ --env=CARGO_TARGET_DIR="target_test/" \ diff --git a/meson.build b/meson.build index 8c26be1..f621f63 100644 --- a/meson.build +++ b/meson.build @@ -7,6 +7,25 @@ project( license: 'GPLv3', ) +if get_option('profile') == 'development' + profile = 'Devel' + vcs_tag = run_command('git', 'rev-parse', '--short', 'HEAD').stdout().strip() + if vcs_tag == '' + version_suffix = '-devel' + else + version_suffix = '-@0@'.format (vcs_tag) + endif +else + profile = '' + version_suffix = '' +endif + +application_id = 'org.gnome.Podcasts@0@'.format(profile) +i18n = import('i18n') + +subdir('podcasts-gtk/po') +podir = join_paths (meson.source_root (), 'podcasts-gtk', 'po') + podcasts_version = meson.project_version() version_array = podcasts_version.split('.') podcasts_major_version = version_array[0].to_int() @@ -18,15 +37,12 @@ podcasts_bindir = join_paths(podcasts_prefix, get_option('bindir')) podcasts_localedir = join_paths(podcasts_prefix, get_option('localedir')) podcasts_conf = configuration_data() -podcasts_conf.set('BINDIR', podcasts_bindir) +podcasts_conf.set('appid', application_id) +podcasts_conf.set('bindir', podcasts_bindir) datadir = get_option('datadir') -icondir = join_paths(datadir, 'icons') subdir('podcasts-gtk/resources') -i18n = import('i18n') -subdir('podcasts-gtk/po') - cargo = find_program('cargo', required: false) gresource = find_program('glib-compile-resources', required: false) cargo_vendor = find_program('cargo-vendor', required: false) @@ -37,7 +53,14 @@ cargo_release = custom_target('cargo-build', output: ['gnome-podcasts'], install: true, install_dir: podcasts_bindir, - command: [cargo_script, '@CURRENT_SOURCE_DIR@', '@OUTPUT@', podcasts_localedir]) + command: [cargo_script, + '@CURRENT_SOURCE_DIR@', + '@OUTPUT@', + podcasts_localedir, + application_id, + podcasts_version + version_suffix, + profile + ]) run_target('release', command: ['scripts/release.sh', meson.project_name() + '-' + podcasts_version diff --git a/meson_options.txt b/meson_options.txt new file mode 100644 index 0000000..4c5cc39 --- /dev/null +++ b/meson_options.txt @@ -0,0 +1,9 @@ +option ( + 'profile', + type: 'combo', + choices: [ + 'default', + 'development' + ], + value: 'default' +) diff --git a/org.gnome.Podcasts.json b/org.gnome.PodcastsDevel.json similarity index 91% rename from org.gnome.Podcasts.json rename to org.gnome.PodcastsDevel.json index a7f0f32..a155dc1 100644 --- a/org.gnome.Podcasts.json +++ b/org.gnome.PodcastsDevel.json @@ -1,5 +1,5 @@ { - "app-id" : "org.gnome.Podcasts", + "app-id" : "org.gnome.PodcastsDevel", "runtime" : "org.gnome.Platform", "runtime-version" : "master", "sdk" : "org.gnome.Sdk", @@ -30,8 +30,7 @@ ], "env" : { "CARGO_HOME" : "/run/build/Podcasts/cargo", - "RUST_BACKTRACE" : "1", - "DEBUG" : "true" + "RUST_BACKTRACE" : "1" } }, "modules" : [ @@ -48,6 +47,7 @@ { "name" : "gnome-podcasts", "buildsystem" : "meson", + "config-opts" : [ "-Dprofile=development" ], "sources" : [ { "type" : "git", diff --git a/podcasts-gtk/build.rs b/podcasts-gtk/build.rs index ab9e977..c8279e6 100644 --- a/podcasts-gtk/build.rs +++ b/podcasts-gtk/build.rs @@ -1,7 +1,3 @@ -use std::env; -use std::fs::File; -use std::io::Write; -use std::path::Path; use std::process::Command; fn main() { @@ -9,25 +5,10 @@ fn main() { println!("cargo:rerun-if-changed=resources"); println!("cargo:rerun-if-changed=resources/*"); - Command::new("glib-compile-resources") + let out = Command::new("glib-compile-resources") .args(&["--generate", "resources.xml"]) .current_dir("resources") .status() - .unwrap(); - - // Generating build globals - let default_locales = "./podcasts-gtk/po".to_string(); - let out_dir = env::var("OUT_DIR").unwrap(); - let localedir = env::var("PODCASTS_LOCALEDIR").unwrap_or(default_locales); - let dest_path = Path::new(&out_dir).join("build_globals.rs"); - let mut f = File::create(&dest_path).unwrap(); - - let globals = format!( - " -pub(crate) static LOCALEDIR: &'static str = \"{}\"; -", - localedir - ); - - f.write_all(&globals.into_bytes()[..]).unwrap(); + .expect("failed to generate resources"); + assert!(out.success()); } diff --git a/podcasts-gtk/resources/gtk/empty_view.ui b/podcasts-gtk/resources/gtk/empty_view.ui index d12ad8e..a999f16 100644 --- a/podcasts-gtk/resources/gtk/empty_view.ui +++ b/podcasts-gtk/resources/gtk/empty_view.ui @@ -81,13 +81,12 @@ Tobias Bernard vertical 12 - + True False center center 256 - org.gnome.Podcasts-symbolic diff --git a/podcasts-gtk/resources/gtk/style.css b/podcasts-gtk/resources/gtk/style.css index 3af698c..2635c1c 100644 --- a/podcasts-gtk/resources/gtk/style.css +++ b/podcasts-gtk/resources/gtk/style.css @@ -17,4 +17,16 @@ list, border { .player-show-label { font-size: smaller; +} + +.devel headerbar { + background: transparent -gtk-icontheme("system-run-symbolic") 80% 0/128px 128px no-repeat, + linear-gradient(to left, + mix(@theme_selected_bg_color, @theme_bg_color, 0.5) 8%, + @theme_bg_color 25%); + color: alpha(@theme_fg_color, 0.1); +} + +.devel headerbar label { + color: @theme_fg_color; } \ No newline at end of file diff --git a/podcasts-gtk/resources/icons/meson.build b/podcasts-gtk/resources/icons/meson.build index 59c9673..8555a1c 100644 --- a/podcasts-gtk/resources/icons/meson.build +++ b/podcasts-gtk/resources/icons/meson.build @@ -1 +1,15 @@ -install_subdir('hicolor', install_dir: icondir) \ No newline at end of file +scalable_dir = join_paths('hicolor', 'scalable', 'apps') + +install_data( + join_paths(scalable_dir, 'org.gnome.Podcasts.svg'), + install_dir: join_paths(datadir, 'icons', scalable_dir), + rename: '@0@.svg'.format(application_id) +) + +symbolic_dir = join_paths('hicolor', 'symbolic', 'apps') + +install_data( + join_paths(symbolic_dir, 'org.gnome.Podcasts-symbolic.svg'), + install_dir: join_paths(datadir, 'icons', symbolic_dir), + rename: '@0@-symbolic.svg'.format(application_id) +) \ No newline at end of file diff --git a/podcasts-gtk/resources/meson.build b/podcasts-gtk/resources/meson.build index db70267..4078de7 100644 --- a/podcasts-gtk/resources/meson.build +++ b/podcasts-gtk/resources/meson.build @@ -1,13 +1,41 @@ subdir('icons') -install_data('org.gnome.Podcasts.desktop', install_dir : datadir + '/applications') -install_data('org.gnome.Podcasts.appdata.xml', install_dir : datadir + '/appdata') +desktop_conf = configuration_data() +desktop_conf.set('icon', application_id) +i18n.merge_file ('desktop-file', + type: 'desktop', + input: configure_file( + input: files('org.gnome.Podcasts.desktop.in.in'), + output: 'org.gnome.Podcasts.desktop.in', + configuration: desktop_conf + ), + output: '@0@.desktop'.format(application_id), + po_dir: podir, + install: true, + install_dir: join_paths (datadir, 'applications') +) + +appdata_conf = configuration_data() +appdata_conf.set('appid', application_id) +i18n.merge_file ('appdata-file', + input: configure_file( + input: files('org.gnome.Podcasts.appdata.xml.in.in'), + output: 'org.gnome.Podcasts.appdata.xml.in', + configuration: appdata_conf + ), + output: '@0@.appdata.xml'.format(application_id), + po_dir: podir, + install: true, + install_dir: join_paths (datadir, 'metainfo') +) + install_data('org.gnome.Podcasts.gschema.xml', install_dir: join_paths(datadir, 'glib-2.0', 'schemas')) - -configure_file(input: 'org.gnome.Podcasts.service.in', - output: 'org.gnome.Podcasts.service', - configuration: podcasts_conf, - install_dir: join_paths([datadir,'dbus-1/services'])) +configure_file( + input: 'org.gnome.Podcasts.service.in', + output: '@0@.service'.format(application_id), + configuration: podcasts_conf, + install_dir: join_paths(datadir,'dbus-1', 'services') +) meson.add_install_script('../../scripts/compile-gschema.py') diff --git a/podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml b/podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in similarity index 97% rename from podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml rename to podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in index 00b62e0..ffd0892 100644 --- a/podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml +++ b/podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml.in.in @@ -1,6 +1,6 @@ - org.gnome.Podcasts + @appid@ Podcasts GPL-3.0 CC0-1.0 diff --git a/podcasts-gtk/resources/org.gnome.Podcasts.desktop b/podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in similarity index 95% rename from podcasts-gtk/resources/org.gnome.Podcasts.desktop rename to podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in index a0ecd30..a6f62a4 100644 --- a/podcasts-gtk/resources/org.gnome.Podcasts.desktop +++ b/podcasts-gtk/resources/org.gnome.Podcasts.desktop.in.in @@ -2,7 +2,7 @@ Name=Podcasts Comment=Listen to your favorite podcasts, right from your desktop. # Translators: Do NOT translate or transliterate this text (this is an icon file name)! -Icon=org.gnome.Podcasts +Icon=@icon@ Exec=gnome-podcasts Terminal=false Type=Application diff --git a/podcasts-gtk/resources/org.gnome.Podcasts.service.in b/podcasts-gtk/resources/org.gnome.Podcasts.service.in index a9a24cb..54b367b 100644 --- a/podcasts-gtk/resources/org.gnome.Podcasts.service.in +++ b/podcasts-gtk/resources/org.gnome.Podcasts.service.in @@ -1,3 +1,3 @@ [D-BUS Service] -Name=org.gnome.Podcasts -Exec=@BINDIR@/gnome-podcasts --gapplication-service \ No newline at end of file +Name=@appid@ +Exec=@bindir@/gnome-podcasts --gapplication-service \ No newline at end of file diff --git a/podcasts-gtk/src/app.rs b/podcasts-gtk/src/app.rs index 8a15784..bde3b79 100644 --- a/podcasts-gtk/src/app.rs +++ b/podcasts-gtk/src/app.rs @@ -28,9 +28,8 @@ use std::sync::Arc; use i18n::i18n; -pub(crate) const APP_ID: &str = "org.gnome.Podcasts"; - -include!(concat!(env!("OUT_DIR"), "/build_globals.rs")); +pub(crate) const APP_ID: &str = env!("APP_ID"); +pub(crate) const VERSION: &str = env!("VERSION"); /// Creates an action named `name` in the action map `T with the handler `F` fn action(thing: &T, name: &str, action: F) @@ -84,12 +83,15 @@ pub(crate) struct App { impl App { pub(crate) fn new(application: >k::Application) -> Rc { - let settings = gio::Settings::new(APP_ID); + let settings = gio::Settings::new("org.gnome.Podcasts"); let (sender, receiver) = unbounded(); let window = gtk::ApplicationWindow::new(application); window.set_title(&i18n("Podcasts")); + if APP_ID.ends_with("Devel") { + window.get_style_context().map(|c| c.add_class("devel")); + } let weak_s = settings.downgrade(); let weak_app = application.downgrade(); @@ -377,11 +379,12 @@ impl App { pub(crate) fn run() { // Set up the textdomain for gettext setlocale(LocaleCategory::LcAll, ""); - bindtextdomain("gnome-podcasts", LOCALEDIR); + bindtextdomain("gnome-podcasts", env!("LOCALEDIR")); textdomain("gnome-podcasts"); let application = gtk::Application::new(APP_ID, gio::ApplicationFlags::empty()) .expect("Application initialization failed..."); + application.set_resource_base_path("/org/gnome/Podcasts"); let weak_app = application.downgrade(); application.connect_startup(move |_| { diff --git a/podcasts-gtk/src/widgets/aboutdialog.rs b/podcasts-gtk/src/widgets/aboutdialog.rs index 40b8086..9c54bcd 100644 --- a/podcasts-gtk/src/widgets/aboutdialog.rs +++ b/podcasts-gtk/src/widgets/aboutdialog.rs @@ -1,4 +1,4 @@ -use app::APP_ID; +use app::{APP_ID, VERSION}; use gtk; use gtk::prelude::*; @@ -27,9 +27,7 @@ pub(crate) fn about_dialog(window: >k::ApplicationWindow) { dialog.set_copyright("© 2017, 2018 Jordan Petridis"); dialog.set_license_type(gtk::License::Gpl30); dialog.set_modal(true); - // TODO: make it show it fetches the commit hash from which it was built - // and the version number is kept in sync automatically - dialog.set_version("0.4.4"); + dialog.set_version(VERSION); dialog.set_program_name(&i18n("Podcasts")); dialog.set_website("https://wiki.gnome.org/Apps/Podcasts"); dialog.set_website_label(i18n("Learn more about GNOME Podcasts").as_str()); diff --git a/podcasts-gtk/src/widgets/empty.rs b/podcasts-gtk/src/widgets/empty.rs index 64ed885..58326a7 100644 --- a/podcasts-gtk/src/widgets/empty.rs +++ b/podcasts-gtk/src/widgets/empty.rs @@ -1,4 +1,5 @@ -use gtk; +use app::APP_ID; +use gtk::{self, prelude::*}; use std::ops::Deref; #[derive(Clone, Debug)] @@ -15,6 +16,8 @@ impl Default for EmptyView { fn default() -> Self { let builder = gtk::Builder::new_from_resource("/org/gnome/Podcasts/gtk/empty_view.ui"); let view: gtk::Box = builder.get_object("empty_view").unwrap(); + let image: gtk::Image = builder.get_object("image").unwrap(); + image.set_from_icon_name(format!("{}-symbolic", APP_ID).as_str(), 256); EmptyView(view) } } diff --git a/scripts/cargo.sh b/scripts/cargo.sh index 510fed3..14cebbc 100755 --- a/scripts/cargo.sh +++ b/scripts/cargo.sh @@ -2,9 +2,12 @@ export CARGO_HOME=$1/target/cargo-home export RUSTFLAGS="--cfg rayon_unstable" -export PODCASTS_LOCALEDIR="$3" +export LOCALEDIR="$3" +export APP_ID="$4" +export VERSION="$5" +export PROFILE="$6" -if [[ $DEBUG = true ]] +if [[ "$PROFILE" == "Devel" ]] then echo "DEBUG MODE" cargo build -p podcasts-gtk && cp $1/target/debug/podcasts-gtk $2 diff --git a/scripts/test.sh b/scripts/test.sh index c3a8bb2..6372647 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -1,10 +1,10 @@ #! /usr/bin/sh -export MANIFEST_PATH="org.gnome.Podcasts.json" +export MANIFEST_PATH="org.gnome.PodcastsDevel.json" export RUNTIME_REPO="https://sdk.gnome.org/gnome-nightly.flatpakrepo" export FLATPAK_MODULE="gnome-podcasts" export CONFIGURE_ARGS="" -export DBUS_ID="org.gnome.Podcasts" +export DBUS_ID="org.gnome.PodcastsDevel" export BUNDLE="org.gnome.Podcasts.Devel.flatpak" flatpak-builder --stop-at=${FLATPAK_MODULE} --keep-build-dirs --force-clean app ${MANIFEST_PATH} @@ -23,6 +23,9 @@ flatpak-builder --run \ # Run the tests xvfb-run -a -s "-screen 0 1024x768x24" \ flatpak-builder --run \ + --env=APP_ID="org.gnome.PodcastsDevel" \ + --env=LOCALEDIR="./podcasts-gtk/po" \ + --env=VERSION="0.0.0" \ --env=RUSTFLAGS="--cfg rayon_unstable" \ --env=CARGO_HOME="target/cargo-home" \ --env=CARGO_TARGET_DIR="target_test/" \