From ca44833486dda61e1f26887d75ef6740f768faef Mon Sep 17 00:00:00 2001 From: Hunter Wittenborn Date: Sat, 7 Oct 2023 20:10:08 -0500 Subject: [PATCH] Migrate Tray implementation to `ksni` crate (#152) This change has several benefits, including: - Removal of the separate tray application - Removal of reliance on GTK3 - Everything being in one crate, in turn simplifying the codebase Closes #84 and #128. --- BUILDING.md | 2 +- CHANGELOG.md | 10 + Cargo.lock | 779 +++--------------- Cargo.toml | 27 +- .../com.hunterwittenborn.Celeste.metainfo.xml | 29 + celeste/build.rs => build.rs | 2 +- celeste-tray/Cargo.toml | 13 - celeste-tray/src/main.rs | 128 --- celeste/Cargo.toml | 42 - justfile | 8 +- libceleste/Cargo.toml | 13 - makedeb/PKGBUILD | 2 +- po/com.hunterwittenborn.Celeste.pot | 178 ++-- {celeste/src => src}/about.rs | 0 {celeste/src => src}/entities/mod.rs | 0 {celeste/src => src}/entities/remotes.rs | 0 {celeste/src => src}/entities/sync_dirs.rs | 3 +- {celeste/src => src}/entities/sync_items.rs | 0 {celeste/src => src}/gtk_util.rs | 4 +- .../src => src}/html/auth-template.go.html | 0 .../src => src}/html/google-drive.tera.html | 0 {celeste/src => src}/images/google-drive.png | Bin {celeste/src => src}/images/google-signin.png | Bin {celeste/src => src}/launch.rs | 211 ++--- {celeste/src => src}/login/dropbox.rs | 0 {celeste/src => src}/login/gdrive.rs | 9 +- {celeste/src => src}/login/login_util.rs | 0 {celeste/src => src}/login/mod.rs | 11 +- {celeste/src => src}/login/nextcloud.rs | 0 {celeste/src => src}/login/owncloud.rs | 0 {celeste/src => src}/login/pcloud.rs | 0 {celeste/src => src}/login/proton_drive.rs | 0 {celeste/src => src}/login/webdav.rs | 0 {celeste/src => src}/main.rs | 11 +- .../m20220101_000001_create_table.rs | 0 ...07_204909_sync_dirs_remove_slash_suffix.rs | 0 .../m20230220_215840_remote_sync_items_fix.rs | 0 {celeste/src => src}/migrations/mod.rs | 0 {celeste/src => src}/mpsc.rs | 0 {celeste/src => src}/rclone.rs | 20 +- {celeste/src => src}/style.scss | 0 {libceleste/src => src}/traits.rs | 0 src/tray.rs | 72 ++ libceleste/src/lib.rs => src/util.rs | 6 +- 44 files changed, 421 insertions(+), 1159 deletions(-) rename celeste/build.rs => build.rs (90%) delete mode 100644 celeste-tray/Cargo.toml delete mode 100644 celeste-tray/src/main.rs delete mode 100644 celeste/Cargo.toml delete mode 100644 libceleste/Cargo.toml rename {celeste/src => src}/about.rs (100%) rename {celeste/src => src}/entities/mod.rs (100%) rename {celeste/src => src}/entities/remotes.rs (100%) rename {celeste/src => src}/entities/sync_dirs.rs (97%) rename {celeste/src => src}/entities/sync_items.rs (100%) rename {celeste/src => src}/gtk_util.rs (97%) rename {celeste/src => src}/html/auth-template.go.html (100%) rename {celeste/src => src}/html/google-drive.tera.html (100%) rename {celeste/src => src}/images/google-drive.png (100%) rename {celeste/src => src}/images/google-signin.png (100%) rename {celeste/src => src}/launch.rs (94%) rename {celeste/src => src}/login/dropbox.rs (100%) rename {celeste/src => src}/login/gdrive.rs (97%) rename {celeste/src => src}/login/login_util.rs (100%) rename {celeste/src => src}/login/mod.rs (98%) rename {celeste/src => src}/login/nextcloud.rs (100%) rename {celeste/src => src}/login/owncloud.rs (100%) rename {celeste/src => src}/login/pcloud.rs (100%) rename {celeste/src => src}/login/proton_drive.rs (100%) rename {celeste/src => src}/login/webdav.rs (100%) rename {celeste/src => src}/main.rs (96%) rename {celeste/src => src}/migrations/m20220101_000001_create_table.rs (100%) rename {celeste/src => src}/migrations/m20230207_204909_sync_dirs_remove_slash_suffix.rs (100%) rename {celeste/src => src}/migrations/m20230220_215840_remote_sync_items_fix.rs (100%) rename {celeste/src => src}/migrations/mod.rs (100%) rename {celeste/src => src}/mpsc.rs (100%) rename {celeste/src => src}/rclone.rs (94%) rename {celeste/src => src}/style.scss (100%) rename {libceleste/src => src}/traits.rs (100%) create mode 100644 src/tray.rs rename libceleste/src/lib.rs => src/util.rs (97%) diff --git a/BUILDING.md b/BUILDING.md index 6dcd9a3..4e2a0c5 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -9,7 +9,7 @@ Celeste needs some packages installed in order to build: - [rustup](https://rustup.rs/) - [Go](https://go.dev/) - [just](https://github.com/casey/just) -- Headers for GTK3, GTK4, Libadwaita, and Libappindicator (The best way I've found to find the needed packages is to try building as described below, and then looking at the output to see what the missing header files are. You can then install the needed packages via your package manager. This process is kind of tedious, but I don't know any other methods at the moment). +- Headers for GTK4 and Libadwaita (The best way I've found to find the needed packages is to try building as described below, and then looking at the output to see what the missing header files are. You can then install the needed packages via your package manager. This process is kind of tedious, but I don't know any other methods at the moment). ## Building To build the project, run the following from the root of the repository: diff --git a/CHANGELOG.md b/CHANGELOG.md index d82b702..77282bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.7.0] - 2023-10-07 +### Changed +- Remove reliance on GTK3 and libappindicator. +- Make tray functionality part of main application, instead of being a separate app. +- Combine all application functionality into a singular crate. + +### Fixed +- Fixed incorrect number of errors being reported in tray. +- Fixed bug where tray icons would never change. + ## [0.6.0] - 2023-10-05 ### Added - Added Proton Drive support. diff --git a/Cargo.lock b/Cargo.lock index ecafc13..3849988 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -151,16 +151,6 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" -[[package]] -name = "async-broadcast" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c48ccdbf6ca6b121e0f586cbc0e73ae440e56c67c30fa0873b4e110d9c26d2b" -dependencies = [ - "event-listener", - "futures-core", -] - [[package]] name = "async-channel" version = "1.9.0" @@ -186,18 +176,6 @@ dependencies = [ "slab", ] -[[package]] -name = "async-fs" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "279cf904654eeebfa37ac9bb1598880884924aab82e290aa65c9e77a0e142e06" -dependencies = [ - "async-lock", - "autocfg", - "blocking", - "futures-lite", -] - [[package]] name = "async-global-executor" version = "2.3.1" @@ -260,17 +238,6 @@ dependencies = [ "windows-sys", ] -[[package]] -name = "async-recursion" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e97ce7de6cf12de5d7226c73f5ba9811622f4db3a5b91b55c53e987e5f91cba" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.28", -] - [[package]] name = "async-std" version = "1.12.0" @@ -337,30 +304,6 @@ dependencies = [ "syn 2.0.28", ] -[[package]] -name = "atk" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c3d816ce6f0e2909a96830d6911c2aff044370b1ef92d7f267b43bae5addedd" -dependencies = [ - "atk-sys", - "bitflags 1.3.2", - "glib 0.15.12", - "libc", -] - -[[package]] -name = "atk-sys" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58aeb089fb698e06db8089971c7ee317ab9644bade33383f63631437b03aafb6" -dependencies = [ - "glib-sys 0.15.10", - "gobject-sys 0.15.10", - "libc", - "system-deps", -] - [[package]] name = "atoi" version = "1.0.0" @@ -623,19 +566,6 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" -[[package]] -name = "cairo-rs" -version = "0.15.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c76ee391b03d35510d9fa917357c7f1855bd9a6659c95a1b392e33f49b3369bc" -dependencies = [ - "bitflags 1.3.2", - "cairo-sys-rs 0.15.1", - "glib 0.15.12", - "libc", - "thiserror", -] - [[package]] name = "cairo-rs" version = "0.16.7" @@ -643,31 +573,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3125b15ec28b84c238f6f476c6034016a5f6cc0221cb514ca46c532139fc97d" dependencies = [ "bitflags 1.3.2", - "cairo-sys-rs 0.16.3", - "glib 0.16.9", + "cairo-sys-rs", + "glib", "libc", "once_cell", "thiserror", ] -[[package]] -name = "cairo-sys-rs" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c55d429bef56ac9172d25fecb85dc8068307d17acd74b377866b7a1ef25d3c8" -dependencies = [ - "glib-sys 0.15.10", - "libc", - "system-deps", -] - [[package]] name = "cairo-sys-rs" version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c48f4af05fabdcfa9658178e1326efa061853f040ce7d72e33af6885196f421" dependencies = [ - "glib-sys 0.16.3", + "glib-sys", "libc", "system-deps", ] @@ -683,26 +602,24 @@ dependencies = [ [[package]] name = "celeste" -version = "0.6.0" +version = "0.7.0" dependencies = [ "base64 0.20.0", "blocking", "clap 4.3.21", - "dirs", - "exitcode", "file-lock", "futures", + "glib", "glob", "grass", "hw-msg", "indexmap 1.9.3", + "ksni", "lazy_static", "libadwaita", - "libceleste", "librclone", "nipper", "nix", - "quit", "rand 0.8.5", "regex", "rocket", @@ -717,21 +634,6 @@ dependencies = [ "toml_edit 0.14.4", "tr", "url", - "users", - "zbus", -] - -[[package]] -name = "celeste-tray" -version = "0.6.0" -dependencies = [ - "gtk", - "hw-msg", - "lazy_static", - "libappindicator", - "libceleste", - "tr", - "zbus", ] [[package]] @@ -1046,23 +948,43 @@ dependencies = [ ] [[package]] -name = "deranged" -version = "0.3.7" +name = "dbus" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7684a49fb1af197853ef7b2ee694bc1f5b4179556f1e5710e1760c5db6f5e929" +checksum = "1bb21987b9fb1613058ba3843121dd18b163b254d8a6e797e144cbac14d96d1b" dependencies = [ - "serde", + "libc", + "libdbus-sys", + "winapi", ] [[package]] -name = "derivative" -version = "2.2.0" +name = "dbus-codegen" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +checksum = "a49da9fdfbe872d4841d56605dc42efa5e6ca3291299b87f44e1cde91a28617c" dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", + "clap 2.34.0", + "dbus", + "xml-rs", +] + +[[package]] +name = "dbus-tree" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f456e698ae8e54575e19ddb1f9b7bce2298568524f215496b248eb9498b4f508" +dependencies = [ + "dbus", +] + +[[package]] +name = "deranged" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7684a49fb1af197853ef7b2ee694bc1f5b4179556f1e5710e1760c5db6f5e929" +dependencies = [ + "serde", ] [[package]] @@ -1127,26 +1049,6 @@ dependencies = [ "crypto-common", ] -[[package]] -name = "dirs" -version = "4.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-sys" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - [[package]] name = "dotenvy" version = "0.15.7" @@ -1183,27 +1085,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "enumflags2" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c041f5090df68b32bcd905365fd51769c8b9d553fe87fde0b683534f10c01bd2" -dependencies = [ - "enumflags2_derive", - "serde", -] - -[[package]] -name = "enumflags2_derive" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e9a1f9f7d83e59740248a6e14ecf93929ade55027844dfcea78beafccc15745" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.28", -] - [[package]] name = "equivalent" version = "1.0.1" @@ -1237,12 +1118,6 @@ version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" -[[package]] -name = "exitcode" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de853764b47027c2e862a995c34978ffa63c1501f2e15f987ba11bd4f9bba193" - [[package]] name = "fastrand" version = "1.9.0" @@ -1470,35 +1345,6 @@ dependencies = [ "byteorder", ] -[[package]] -name = "gdk" -version = "0.15.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6e05c1f572ab0e1f15be94217f0dc29088c248b14f792a5ff0af0d84bcda9e8" -dependencies = [ - "bitflags 1.3.2", - "cairo-rs 0.15.12", - "gdk-pixbuf 0.15.11", - "gdk-sys", - "gio 0.15.12", - "glib 0.15.12", - "libc", - "pango 0.15.10", -] - -[[package]] -name = "gdk-pixbuf" -version = "0.15.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad38dd9cc8b099cceecdf41375bb6d481b1b5a7cd5cd603e10a69a9383f8619a" -dependencies = [ - "bitflags 1.3.2", - "gdk-pixbuf-sys 0.15.10", - "gio 0.15.12", - "glib 0.15.12", - "libc", -] - [[package]] name = "gdk-pixbuf" version = "0.16.7" @@ -1506,23 +1352,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3578c60dee9d029ad86593ed88cb40f35c1b83360e12498d055022385dd9a05" dependencies = [ "bitflags 1.3.2", - "gdk-pixbuf-sys 0.16.3", - "gio 0.16.7", - "glib 0.16.9", - "libc", -] - -[[package]] -name = "gdk-pixbuf-sys" -version = "0.15.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "140b2f5378256527150350a8346dbdb08fadc13453a7a2d73aecd5fab3c402a7" -dependencies = [ - "gio-sys 0.15.10", - "glib-sys 0.15.10", - "gobject-sys 0.15.10", + "gdk-pixbuf-sys", + "gio", + "glib", "libc", - "system-deps", ] [[package]] @@ -1531,30 +1364,13 @@ version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3092cf797a5f1210479ea38070d9ae8a5b8e9f8f1be9f32f4643c529c7d70016" dependencies = [ - "gio-sys 0.16.3", - "glib-sys 0.16.3", - "gobject-sys 0.16.3", + "gio-sys", + "glib-sys", + "gobject-sys", "libc", "system-deps", ] -[[package]] -name = "gdk-sys" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32e7a08c1e8f06f4177fb7e51a777b8c1689f743a7bc11ea91d44d2226073a88" -dependencies = [ - "cairo-sys-rs 0.15.1", - "gdk-pixbuf-sys 0.15.10", - "gio-sys 0.15.10", - "glib-sys 0.15.10", - "gobject-sys 0.15.10", - "libc", - "pango-sys 0.15.10", - "pkg-config", - "system-deps", -] - [[package]] name = "gdk4" version = "0.5.5" @@ -1562,13 +1378,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb2181330ebf9d091f8ea7fed6877f7adc92114128592e1fdaeb1da28e0d01e9" dependencies = [ "bitflags 1.3.2", - "cairo-rs 0.16.7", - "gdk-pixbuf 0.16.7", + "cairo-rs", + "gdk-pixbuf", "gdk4-sys", - "gio 0.16.7", - "glib 0.16.9", + "gio", + "glib", "libc", - "pango 0.16.5", + "pango", ] [[package]] @@ -1577,13 +1393,13 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de55cb49432901fe2b3534177fa06844665b9b0911d85d8601a8d8b88b7791db" dependencies = [ - "cairo-sys-rs 0.16.3", - "gdk-pixbuf-sys 0.16.3", - "gio-sys 0.16.3", - "glib-sys 0.16.3", - "gobject-sys 0.16.3", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", "libc", - "pango-sys 0.16.3", + "pango-sys", "pkg-config", "system-deps", ] @@ -1659,23 +1475,6 @@ version = "0.27.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" -[[package]] -name = "gio" -version = "0.15.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68fdbc90312d462781a395f7a16d96a2b379bb6ef8cd6310a2df272771c4283b" -dependencies = [ - "bitflags 1.3.2", - "futures-channel", - "futures-core", - "futures-io", - "gio-sys 0.15.10", - "glib 0.15.12", - "libc", - "once_cell", - "thiserror", -] - [[package]] name = "gio" version = "0.16.7" @@ -1687,8 +1486,8 @@ dependencies = [ "futures-core", "futures-io", "futures-util", - "gio-sys 0.16.3", - "glib 0.16.9", + "gio-sys", + "glib", "libc", "once_cell", "pin-project-lite", @@ -1696,52 +1495,19 @@ dependencies = [ "thiserror", ] -[[package]] -name = "gio-sys" -version = "0.15.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32157a475271e2c4a023382e9cab31c4584ee30a97da41d3c4e9fdd605abcf8d" -dependencies = [ - "glib-sys 0.15.10", - "gobject-sys 0.15.10", - "libc", - "system-deps", - "winapi", -] - [[package]] name = "gio-sys" version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e9b693b8e39d042a95547fc258a7b07349b1f0b48f4b2fa3108ba3c51c0b5229" dependencies = [ - "glib-sys 0.16.3", - "gobject-sys 0.16.3", + "glib-sys", + "gobject-sys", "libc", "system-deps", "winapi", ] -[[package]] -name = "glib" -version = "0.15.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edb0306fbad0ab5428b0ca674a23893db909a98582969c9b537be4ced78c505d" -dependencies = [ - "bitflags 1.3.2", - "futures-channel", - "futures-core", - "futures-executor", - "futures-task", - "glib-macros 0.15.13", - "glib-sys 0.15.10", - "gobject-sys 0.15.10", - "libc", - "once_cell", - "smallvec", - "thiserror", -] - [[package]] name = "glib" version = "0.16.9" @@ -1754,31 +1520,16 @@ dependencies = [ "futures-executor", "futures-task", "futures-util", - "gio-sys 0.16.3", - "glib-macros 0.16.8", - "glib-sys 0.16.3", - "gobject-sys 0.16.3", + "gio-sys", + "glib-macros", + "glib-sys", + "gobject-sys", "libc", "once_cell", "smallvec", "thiserror", ] -[[package]] -name = "glib-macros" -version = "0.15.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10c6ae9f6fa26f4fb2ac16b528d138d971ead56141de489f8111e259b9df3c4a" -dependencies = [ - "anyhow", - "heck 0.4.1", - "proc-macro-crate 1.3.1", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "glib-macros" version = "0.16.8" @@ -1794,16 +1545,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "glib-sys" -version = "0.15.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef4b192f8e65e9cf76cbf4ea71fa8e3be4a0e18ffe3d68b8da6836974cc5bad4" -dependencies = [ - "libc", - "system-deps", -] - [[package]] name = "glib-sys" version = "0.16.3" @@ -1856,24 +1597,13 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "gobject-sys" -version = "0.15.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d57ce44246becd17153bd035ab4d32cfee096a657fc01f2231c9278378d1e0a" -dependencies = [ - "glib-sys 0.15.10", - "libc", - "system-deps", -] - [[package]] name = "gobject-sys" version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3520bb9c07ae2a12c7f2fbb24d4efc11231c8146a86956413fb1a79bb760a0f1" dependencies = [ - "glib-sys 0.16.3", + "glib-sys", "libc", "system-deps", ] @@ -1884,7 +1614,7 @@ version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95ecb4d347e6d09820df3bdfd89a74a8eec07753a06bb92a3aac3ad31d04447b" dependencies = [ - "glib 0.16.9", + "glib", "graphene-sys", "libc", ] @@ -1895,7 +1625,7 @@ version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9aa82337d3972b4eafdea71e607c23f47be6f27f749aab613f1ad8ddbe6dcd6" dependencies = [ - "glib-sys 0.16.3", + "glib-sys", "libc", "pkg-config", "system-deps", @@ -1927,13 +1657,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "591239f5c52ca803b222124ac9c47f230cd180cee9b114c4d672e4a94b74f491" dependencies = [ "bitflags 1.3.2", - "cairo-rs 0.16.7", + "cairo-rs", "gdk4", - "glib 0.16.9", + "glib", "graphene-rs", "gsk4-sys", "libc", - "pango 0.16.5", + "pango", ] [[package]] @@ -1942,71 +1672,16 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "195a63f0be42529f98c3eb3bae0decfd0428ba2cc683b3e20ced88f340904ec5" dependencies = [ - "cairo-sys-rs 0.16.3", + "cairo-sys-rs", "gdk4-sys", - "glib-sys 0.16.3", - "gobject-sys 0.16.3", + "glib-sys", + "gobject-sys", "graphene-sys", "libc", - "pango-sys 0.16.3", + "pango-sys", "system-deps", ] -[[package]] -name = "gtk" -version = "0.15.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92e3004a2d5d6d8b5057d2b57b3712c9529b62e82c77f25c1fecde1fd5c23bd0" -dependencies = [ - "atk", - "bitflags 1.3.2", - "cairo-rs 0.15.12", - "field-offset", - "futures-channel", - "gdk", - "gdk-pixbuf 0.15.11", - "gio 0.15.12", - "glib 0.15.12", - "gtk-sys", - "gtk3-macros", - "libc", - "once_cell", - "pango 0.15.10", - "pkg-config", -] - -[[package]] -name = "gtk-sys" -version = "0.15.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5bc2f0587cba247f60246a0ca11fe25fb733eabc3de12d1965fc07efab87c84" -dependencies = [ - "atk-sys", - "cairo-sys-rs 0.15.1", - "gdk-pixbuf-sys 0.15.10", - "gdk-sys", - "gio-sys 0.15.10", - "glib-sys 0.15.10", - "gobject-sys 0.15.10", - "libc", - "pango-sys 0.15.10", - "system-deps", -] - -[[package]] -name = "gtk3-macros" -version = "0.15.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "684c0456c086e8e7e9af73ec5b84e35938df394712054550e81558d21c44ab0d" -dependencies = [ - "anyhow", - "proc-macro-crate 1.3.1", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "gtk4" version = "0.5.5" @@ -2014,20 +1689,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd89dba65def483a233dc4fdd3f3dab01576e3d83f80f6c9303ebe421661855e" dependencies = [ "bitflags 1.3.2", - "cairo-rs 0.16.7", + "cairo-rs", "field-offset", "futures-channel", - "gdk-pixbuf 0.16.7", + "gdk-pixbuf", "gdk4", - "gio 0.16.7", - "glib 0.16.9", + "gio", + "glib", "graphene-rs", "gsk4", "gtk4-macros", "gtk4-sys", "libc", "once_cell", - "pango 0.16.5", + "pango", ] [[package]] @@ -2050,16 +1725,16 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e370564e3fdacff7cffc99f7366b6a4689feb44e819d3ccee598a9a215b71605" dependencies = [ - "cairo-sys-rs 0.16.3", - "gdk-pixbuf-sys 0.16.3", + "cairo-sys-rs", + "gdk-pixbuf-sys", "gdk4-sys", - "gio-sys 0.16.3", - "glib-sys 0.16.3", - "gobject-sys 0.16.3", + "gio-sys", + "glib-sys", + "gobject-sys", "graphene-sys", "gsk4-sys", "libc", - "pango-sys 0.16.3", + "pango-sys", "system-deps", ] @@ -2395,6 +2070,18 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "ksni" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b31b9cf486bcd22bcd09900b44538cf87b00f526fcd087d671a632dc0d271d0c" +dependencies = [ + "dbus", + "dbus-codegen", + "dbus-tree", + "thiserror", +] + [[package]] name = "kv-log-macro" version = "1.0.7" @@ -2433,15 +2120,15 @@ checksum = "9dfa0722d4f1724f661cbf668c273c5926296ca411ed3814e206f8fd082b6c48" dependencies = [ "bitflags 1.3.2", "futures-channel", - "gdk-pixbuf 0.16.7", + "gdk-pixbuf", "gdk4", - "gio 0.16.7", - "glib 0.16.9", + "gio", + "glib", "gtk4", "libadwaita-sys", "libc", "once_cell", - "pango 0.16.5", + "pango", ] [[package]] @@ -2451,39 +2138,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de902982372b454a0081d7fd9dd567b37b73ae29c8f6da1820374d345fd95d5b" dependencies = [ "gdk4-sys", - "gio-sys 0.16.3", - "glib-sys 0.16.3", - "gobject-sys 0.16.3", + "gio-sys", + "glib-sys", + "gobject-sys", "gtk4-sys", "libc", - "pango-sys 0.16.3", + "pango-sys", "system-deps", ] -[[package]] -name = "libappindicator" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2d3cb96d092b4824cb306c9e544c856a4cb6210c1081945187f7f1924b47e8" -dependencies = [ - "glib 0.15.12", - "gtk", - "gtk-sys", - "libappindicator-sys", - "log", -] - -[[package]] -name = "libappindicator-sys" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1b3b6681973cea8cc3bce7391e6d7d5502720b80a581c9a95c9cbaf592826aa" -dependencies = [ - "gtk-sys", - "libloading", - "once_cell", -] - [[package]] name = "libc" version = "0.2.147" @@ -2491,13 +2154,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] -name = "libceleste" -version = "0.6.0" +name = "libdbus-sys" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06085512b750d640299b79be4bad3d2fa90a9c00b1fd9e1b46364f66f0485c72" dependencies = [ - "blocking", - "futures", - "glib 0.16.9", - "tr", + "pkg-config", ] [[package]] @@ -2879,16 +2541,6 @@ version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" -[[package]] -name = "ordered-stream" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" -dependencies = [ - "futures-core", - "pin-project-lite", -] - [[package]] name = "os_str_bytes" version = "6.5.1" @@ -2924,19 +2576,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" -[[package]] -name = "pango" -version = "0.15.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e4045548659aee5313bde6c582b0d83a627b7904dd20dc2d9ef0895d414e4f" -dependencies = [ - "bitflags 1.3.2", - "glib 0.15.12", - "libc", - "once_cell", - "pango-sys 0.15.10", -] - [[package]] name = "pango" version = "0.16.5" @@ -2944,23 +2583,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdff66b271861037b89d028656184059e03b0b6ccb36003820be19f7200b1e94" dependencies = [ "bitflags 1.3.2", - "gio 0.16.7", - "glib 0.16.9", + "gio", + "glib", "libc", "once_cell", - "pango-sys 0.16.3", -] - -[[package]] -name = "pango-sys" -version = "0.15.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2a00081cde4661982ed91d80ef437c20eacaf6aa1a5962c0279ae194662c3aa" -dependencies = [ - "glib-sys 0.15.10", - "gobject-sys 0.15.10", - "libc", - "system-deps", + "pango-sys", ] [[package]] @@ -2969,8 +2596,8 @@ version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e134909a9a293e04d2cc31928aa95679c5e4df954d0b85483159bd20d8f047f" dependencies = [ - "glib-sys 0.16.3", - "gobject-sys 0.16.3", + "glib-sys", + "gobject-sys", "libc", "system-deps", ] @@ -3427,21 +3054,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "quit" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5084cf776cb910f510c5aa4732a06933edb85f6f5785b6d12af90f364800211" -dependencies = [ - "quit_macros", -] - -[[package]] -name = "quit_macros" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef1cf4f32c7fe348eefee85d0941afc70da334fc046a3592cc5356bf60624242" - [[package]] name = "quote" version = "1.0.32" @@ -3556,17 +3168,6 @@ dependencies = [ "bitflags 1.3.2", ] -[[package]] -name = "redox_users" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" -dependencies = [ - "getrandom 0.2.10", - "redox_syscall 0.2.16", - "thiserror", -] - [[package]] name = "ref-cast" version = "1.0.19" @@ -4116,17 +3717,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_repr" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8725e1dfadb3a50f7e5ce0b1a540466f6ed3fe7a0fca2ac2b8b831d31316bd00" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.28", -] - [[package]] name = "serde_spanned" version = "0.6.3" @@ -4146,17 +3736,6 @@ dependencies = [ "stable_deref_trait", ] -[[package]] -name = "sha1" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - [[package]] name = "sha2" version = "0.10.7" @@ -4871,16 +4450,6 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" -[[package]] -name = "uds_windows" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce65604324d3cce9b966701489fbd0cf318cb1f7bd9dd07ac9a4ee6fb791930d" -dependencies = [ - "tempfile", - "winapi", -] - [[package]] name = "uncased" version = "0.9.9" @@ -5003,16 +4572,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "users" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24cc0f6d6f267b73e5a2cadf007ba8f9bc39c6a6f9666f8cf25ea809a153b032" -dependencies = [ - "libc", - "log", -] - [[package]] name = "utf-8" version = "0.7.6" @@ -5339,14 +4898,10 @@ dependencies = [ ] [[package]] -name = "xdg-home" -version = "1.0.0" +name = "xml-rs" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2769203cd13a0c6015d515be729c526d041e9cf2c0cc478d57faee85f40c6dcd" -dependencies = [ - "nix", - "winapi", -] +checksum = "0fcb9cbac069e033553e8bb871be2fbdffcab578eb25bd0f7c508cedc6dcd75a" [[package]] name = "yansi" @@ -5359,107 +4914,3 @@ name = "yansi" version = "1.0.0-rc" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ee746ad3851dd3bc40e4a028ab3b00b99278d929e48957bcb2d111874a7e43e" - -[[package]] -name = "zbus" -version = "3.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31de390a2d872e4cd04edd71b425e29853f786dc99317ed72d73d6fcf5ebb948" -dependencies = [ - "async-broadcast", - "async-executor", - "async-fs", - "async-io", - "async-lock", - "async-process", - "async-recursion", - "async-task", - "async-trait", - "blocking", - "byteorder", - "derivative", - "enumflags2", - "event-listener", - "futures-core", - "futures-sink", - "futures-util", - "hex", - "nix", - "once_cell", - "ordered-stream", - "rand 0.8.5", - "serde", - "serde_repr", - "sha1", - "static_assertions", - "tracing", - "uds_windows", - "winapi", - "xdg-home", - "zbus_macros", - "zbus_names", - "zvariant", -] - -[[package]] -name = "zbus_macros" -version = "3.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d1794a946878c0e807f55a397187c11fc7a038ba5d868e7db4f3bd7760bc9d" -dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro2", - "quote", - "regex", - "syn 1.0.109", - "zvariant_utils", -] - -[[package]] -name = "zbus_names" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb80bb776dbda6e23d705cf0123c3b95df99c4ebeaec6c2599d4a5419902b4a9" -dependencies = [ - "serde", - "static_assertions", - "zvariant", -] - -[[package]] -name = "zvariant" -version = "3.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44b291bee0d960c53170780af148dca5fa260a63cdd24f1962fa82e03e53338c" -dependencies = [ - "byteorder", - "enumflags2", - "libc", - "serde", - "static_assertions", - "zvariant_derive", -] - -[[package]] -name = "zvariant_derive" -version = "3.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "934d7a7dfc310d6ee06c87ffe88ef4eca7d3e37bb251dece2ef93da8f17d8ecd" -dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro2", - "quote", - "syn 1.0.109", - "zvariant_utils", -] - -[[package]] -name = "zvariant_utils" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7234f0d811589db492d16893e3f21e8e2fd282e6d01b0cddee310322062cc200" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] diff --git a/Cargo.toml b/Cargo.toml index 2041dad..d867663 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,30 +1,23 @@ -[workspace] -members = ["celeste", "celeste-tray", "libceleste"] - -[workspace.dependencies] -celeste-tray.path = "celeste-tray" -libceleste.path = "libceleste" +[package] +name = "celeste" +version = "0.7.0" +edition = "2021" +[dependencies] adw = { package = "libadwaita", version = "0.2.1", features = ["v1_2"] } base64 = "0.20.0" blocking = "1.3.0" clap = { version = "4.0.12", features = ["derive", "env"] } -dirs = "4.0.0" -exitcode = "1.1.2" file-lock = "2.1.6" +futures = "0.3.25" glib = "0.16.7" glob = "0.3.0" -grass = "0.11.2" -gtk3 = { package = "gtk", version = "0.15" } hw-msg = "0.3.1" indexmap = "1.9.2" -futures = "0.3.25" +ksni = "0.2.1" lazy_static = "1.4.0" -libappindicator = "0.7.1" librclone = { version = "0.6.0" } -nipper = "0.1.9" nix = "0.26.2" -quit = "1.1.4" rand = "0.8.5" regex = "1.6.0" rocket = "0.5.0-rc.2" @@ -39,5 +32,7 @@ tokio = { version = "1.21.2", features = ["macros", "rt-multi-thread", "sync"] } toml_edit = { version = "0.14.4", features = ["serde"] } tr = "0.1.6" url = "2.3.1" -users = "0.11.0" -zbus = "3.8.0" + +[build-dependencies] +grass = "0.11.2" +nipper = "0.1.9" \ No newline at end of file diff --git a/assets/com.hunterwittenborn.Celeste.metainfo.xml b/assets/com.hunterwittenborn.Celeste.metainfo.xml index e7404ee..23daf5e 100644 --- a/assets/com.hunterwittenborn.Celeste.metainfo.xml +++ b/assets/com.hunterwittenborn.Celeste.metainfo.xml @@ -41,6 +41,35 @@ + + +

+ Changes in this release: +

+
    +
  • + Remove reliance on GTK3 and libappindicator. +
  • +
  • + Make tray functionality part of main application, instead of being a separate app. +
  • +
  • + Combine all application functionality into a singular crate. +
  • +
+

+ Fixes in this release: +

+
    +
  • + Fixed incorrect number of errors being reported in tray. +
  • +
  • + Fixed bug where tray icons would never change. +
  • +
+
+

diff --git a/celeste/build.rs b/build.rs similarity index 90% rename from celeste/build.rs rename to build.rs index 0b82b07..f7030c4 100644 --- a/celeste/build.rs +++ b/build.rs @@ -1,7 +1,7 @@ use nipper::Document; use std::{env, fs, path::Path}; -static METAINFO: &str = include_str!("../assets/com.hunterwittenborn.Celeste.metainfo.xml"); +static METAINFO: &str = include_str!("assets/com.hunterwittenborn.Celeste.metainfo.xml"); fn main() { let out_dir = env::var("OUT_DIR").unwrap(); diff --git a/celeste-tray/Cargo.toml b/celeste-tray/Cargo.toml deleted file mode 100644 index 856556b..0000000 --- a/celeste-tray/Cargo.toml +++ /dev/null @@ -1,13 +0,0 @@ -[package] -name = "celeste-tray" -version = "0.6.0" -edition = "2021" - -[dependencies] -gtk3.workspace = true -hw-msg.workspace = true -lazy_static.workspace = true -libappindicator.workspace = true -libceleste.workspace = true -tr.workspace = true -zbus.workspace = true diff --git a/celeste-tray/src/main.rs b/celeste-tray/src/main.rs deleted file mode 100644 index 9e9ee18..0000000 --- a/celeste-tray/src/main.rs +++ /dev/null @@ -1,128 +0,0 @@ -use gtk3::{glib, prelude::*, Menu, MenuItem}; -use libappindicator::{AppIndicator, AppIndicatorStatus}; -use std::sync::Mutex; -use zbus::blocking::Connection; - -lazy_static::lazy_static! { - static ref CLOSE_REQUEST: Mutex = Mutex::new(false); - static ref SYNC_ICON_REQUEST: Mutex = Mutex::new(false); - static ref WARNING_ICON_REQUEST: Mutex = Mutex::new(false); - static ref DONE_ICON_REQUEST: Mutex = Mutex::new(false); - static ref CURRENT_STATUS: Mutex = Mutex::new(String::new()); -} - -struct TrayIcon; - -#[zbus::dbus_interface(name = "com.hunterwittenborn.Celeste.Tray")] -impl TrayIcon { - async fn close(&self) { - *(*CLOSE_REQUEST).lock().unwrap() = true; - } - - async fn update_status(&self, status: &str) { - *(*CURRENT_STATUS).lock().unwrap() = status.to_string(); - } - - async fn set_syncing_icon(&self) { - *(*SYNC_ICON_REQUEST).lock().unwrap() = true; - } - - async fn set_warning_icon(&self) { - *(*WARNING_ICON_REQUEST).lock().unwrap() = true; - } - - async fn set_done_icon(&self) { - *(*DONE_ICON_REQUEST).lock().unwrap() = true; - } -} - -fn main() { - gtk3::init().unwrap(); - - // The indicator. - let mut indicator = AppIndicator::new( - "Celeste", - "com.hunterwittenborn.Celeste.CelesteTrayLoading-symbolic", - ); - indicator.set_status(AppIndicatorStatus::Active); - - let mut menu = Menu::new(); - let menu_sync_status = MenuItem::builder() - .label(&tr::tr!("Awaiting sync checks...")) - .sensitive(false) - .build(); - let menu_open = MenuItem::builder().label(&tr::tr!("Open")).build(); - let menu_quit = MenuItem::builder().label(&tr::tr!("Quit")).build(); - menu.append(&menu_sync_status); - menu.append(&menu_open); - menu.append(&menu_quit); - indicator.set_menu(&mut menu); - - // Our DBus connection to receive messages from the main application. - let connection = Connection::session().unwrap(); - connection - .object_server() - .at(libceleste::DBUS_TRAY_OBJECT, TrayIcon) - .unwrap(); - connection.request_name(libceleste::TRAY_ID).unwrap(); - - // Helper function to call a Celeste-side DBus function. - let call_fn = glib::clone!(@strong connection => move |func: &str| { - connection.call_method( - Some(libceleste::DBUS_APP_ID), - libceleste::DBUS_APP_OBJECT, - Some(libceleste::DBUS_APP_ID), - func, - &() - ) - }); - - // Button connections. - menu_open.connect_activate(glib::clone!(@strong call_fn => move |_| { - call_fn("Open").unwrap(); - })); - menu_quit.connect_activate(|_| { - *(*CLOSE_REQUEST).lock().unwrap() = true; - }); - - // Start up the application. - menu.show_all(); - - loop { - #[allow(clippy::if_same_then_else)] - gtk3::main_iteration_do(false); - - let status = (*(*CURRENT_STATUS).lock().unwrap()).clone(); - indicator.set_title(&status); - menu_sync_status.set_label(&status); - - if *(*SYNC_ICON_REQUEST).lock().unwrap() { - indicator.set_icon("com.hunterwittenborn.Celeste.CelesteTraySyncing-symbolic"); - } else if *(*DONE_ICON_REQUEST).lock().unwrap() { - indicator.set_icon("com.hunterwittenborn.Celeste.CelesteTrayDone-symbolic"); - } else if *(*WARNING_ICON_REQUEST).lock().unwrap() { - indicator.set_icon("com.hunterwittenborn.Celeste.CelesteTrayWarning-symbolic"); - } - - *(*SYNC_ICON_REQUEST).lock().unwrap() = false; - *(*WARNING_ICON_REQUEST).lock().unwrap() = false; - *(*DONE_ICON_REQUEST).lock().unwrap() = false; - - if *(*CLOSE_REQUEST).lock().unwrap() { - // Set up the quit label. - menu_quit.set_sensitive(false); - menu_quit.set_label(&tr::tr!("Quitting...")); - - // Notify the tray icon to close. - // I'm not sure when this can fail, so output an error if one is received. - if let Err(err) = call_fn("Close") { - hw_msg::warningln!( - "Got error while sending close request to main application: '{err}'." - ); - }; - - // And then quit the application. - break; - } - } -} diff --git a/celeste/Cargo.toml b/celeste/Cargo.toml deleted file mode 100644 index 7d288ab..0000000 --- a/celeste/Cargo.toml +++ /dev/null @@ -1,42 +0,0 @@ -[package] -name = "celeste" -version = "0.6.0" -edition = "2021" - -[dependencies] -adw.workspace = true -base64.workspace = true -blocking.workspace = true -clap.workspace = true -dirs.workspace = true -exitcode.workspace = true -file-lock.workspace = true -glob.workspace = true -hw-msg.workspace = true -indexmap.workspace = true -futures.workspace = true -lazy_static.workspace = true -libceleste.workspace = true -librclone.workspace = true -nix.workspace = true -quit.workspace = true -rand.workspace = true -regex.workspace = true -rocket.workspace = true -sea-orm.workspace = true -sea-orm-migration.workspace = true -serde.workspace = true -serde_json.workspace = true -tempfile.workspace = true -time.workspace = true -tera.workspace = true -tokio.workspace = true -toml_edit.workspace = true -tr.workspace = true -url.workspace = true -users.workspace = true -zbus.workspace = true - -[build-dependencies] -grass.workspace = true -nipper.workspace = true \ No newline at end of file diff --git a/justfile b/justfile index 89ccdd0..5e747ff 100644 --- a/justfile +++ b/justfile @@ -1,8 +1,7 @@ set positional-arguments build: - cargo build --release --bin celeste-tray - cargo build --release --bin celeste + cargo build --release install: install -Dm 755 target/release/celeste "{{ env_var('DESTDIR') }}/usr/bin/celeste" @@ -15,7 +14,6 @@ install: install -Dm 644 assets/com.hunterwittenborn.Celeste.metainfo.xml "{{ env_var('DESTDIR') }}/usr/share/metainfo/com.hunterwittenborn.Celeste.metainfo.xml" clippy: - cargo build --bin celeste-tray cargo clippy -- -D warnings get-version: @@ -27,7 +25,7 @@ update-versions: #!/usr/bin/env bash set -euo pipefail version="$(just get-version)" - sed -i "s|version = .*|version = \"${version}\"|" celeste/Cargo.toml celeste-tray/Cargo.toml libceleste/Cargo.toml + sed -i "s|^version = .*|version = \"${version}\"|" Cargo.toml date="$(cat CHANGELOG.md | grep "^## \[${version}\]" | grep -o '[^ ]*$')" notes="$(parse-changelog CHANGELOG.md "${version}")" @@ -107,7 +105,7 @@ update-metainfo: open(metainfo_path, "w").write(output) update-translations: - xtr celeste/src/main.rs celeste-tray/src/main.rs libceleste/src/lib.rs --copyright-holder 'Hunter Wittenborn ' -o /dev/stdout --package-name 'Celeste' --package-version "$(just get-version)" > po/com.hunterwittenborn.Celeste.pot + xtr src/main.rs --copyright-holder 'Hunter Wittenborn ' -o /dev/stdout --package-name 'Celeste' --package-version "$(just get-version)" > po/com.hunterwittenborn.Celeste.pot # Create the Snap using an already build copy of Celeste. This currently requires you to be running on Ubuntu 22.10 or newer. create-host-snap: diff --git a/libceleste/Cargo.toml b/libceleste/Cargo.toml deleted file mode 100644 index 3f8fdea..0000000 --- a/libceleste/Cargo.toml +++ /dev/null @@ -1,13 +0,0 @@ -[package] -name = "libceleste" -version = "0.6.0" -edition = "2021" - -[lib] -name = "libceleste" - -[dependencies] -blocking.workspace = true -futures.workspace = true -glib.workspace = true -tr.workspace = true diff --git a/makedeb/PKGBUILD b/makedeb/PKGBUILD index bbcdd60..46786c2 100644 --- a/makedeb/PKGBUILD +++ b/makedeb/PKGBUILD @@ -1,6 +1,6 @@ # Maintainer: Hunter Wittenborn pkgname=celeste -pkgver=0.6.0 +pkgver=0.7.0 pkgrel=1 pkgdesc='Sync your cloud files' arch=('any') diff --git a/po/com.hunterwittenborn.Celeste.pot b/po/com.hunterwittenborn.Celeste.pot index e02d832..4348efd 100644 --- a/po/com.hunterwittenborn.Celeste.pot +++ b/po/com.hunterwittenborn.Celeste.pot @@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: Celeste 0.5.8\n" +"Project-Id-Version: Celeste 0.7.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-10-05 21:34+0000\n" +"POT-Creation-Date: 2023-10-08 00:55+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,321 +17,321 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: celeste/src/about.rs:20 +#: src/about.rs:20 msgid "App icons by" msgstr "" -#: celeste/src/gtk_util.rs:20 celeste/src/gtk_util.rs:43 celeste/src/launch.rs:678 celeste/src/launch.rs:840 +#: src/gtk_util.rs:20 src/gtk_util.rs:43 src/launch.rs:614 src/launch.rs:776 msgid "Ok" msgstr "" -#: celeste/src/launch.rs:102 +#: src/launch.rs:99 msgid "Both '{}' and '{}' are more recent than at last sync." msgstr "" -#: celeste/src/launch.rs:214 +#: src/launch.rs:158 msgid "Unable to create Celeste's config directory [{}]." msgstr "" -#: celeste/src/launch.rs:226 +#: src/launch.rs:170 msgid "Unable to create Celeste's database file [{}]." msgstr "" -#: celeste/src/launch.rs:236 +#: src/launch.rs:180 msgid "Unable to connect to database [{}]." msgstr "" -#: celeste/src/launch.rs:244 +#: src/launch.rs:188 msgid "Unable to run database migrations [{}]" msgstr "" -#: celeste/src/launch.rs:351 +#: src/launch.rs:288 msgid "Awaiting sync check..." msgstr "" -#: celeste/src/launch.rs:387 +#: src/launch.rs:324 msgid "Sync Errors" msgstr "" -#: celeste/src/launch.rs:402 +#: src/launch.rs:339 msgid "File/Folder Exclusions" msgstr "" -#: celeste/src/launch.rs:521 +#: src/launch.rs:458 msgid "Stop syncing this directory" msgstr "" -#: celeste/src/launch.rs:538 +#: src/launch.rs:475 msgid "Are you sure you want to stop syncing '{}' to '{}'?" msgstr "" -#: celeste/src/launch.rs:547 +#: src/launch.rs:484 msgid "This directory is currently being processed to no longer be synced." msgstr "" -#: celeste/src/launch.rs:638 +#: src/launch.rs:574 msgid "Directories" msgstr "" #. Get the local folder to sync with. -#: celeste/src/launch.rs:661 +#: src/launch.rs:597 msgid "Local folder:" msgstr "" -#: celeste/src/launch.rs:677 celeste/src/launch.rs:839 celeste/src/login/gdrive.rs:207 +#: src/launch.rs:613 src/launch.rs:775 src/login/gdrive.rs:208 msgid "Cancel" msgstr "" #. Get the remote folder to sync with, and add it. #. The entry completion code is largely inspired by https://github.com/gtk-rs/gtk4-rs/blob/master/examples/entry_completion/main.rs. I honestly have no clue what half the code for that is doing, I just know the current code is working well enough, and it can be fixed later if it breaks. -#: celeste/src/launch.rs:697 +#: src/launch.rs:633 msgid "Remote folder:" msgstr "" -#: celeste/src/launch.rs:884 +#: src/launch.rs:820 msgid "The specified remote directory doesn't exist" msgstr "" -#: celeste/src/launch.rs:892 +#: src/launch.rs:828 msgid "Failed to check if the specified remote directory exists" msgstr "" -#: celeste/src/launch.rs:903 +#: src/launch.rs:839 msgid "The specified directory pair is already being synced" msgstr "" -#: celeste/src/launch.rs:906 +#: src/launch.rs:842 msgid "The specified local directory doesn't exist" msgstr "" -#: celeste/src/launch.rs:909 +#: src/launch.rs:845 msgid "The specified local path isn't a directory" msgstr "" -#: celeste/src/launch.rs:912 +#: src/launch.rs:848 msgid "The specified local directory needs to be an absolute path" msgstr "" -#: celeste/src/launch.rs:940 +#: src/launch.rs:876 msgid "Are you sure you want to delete this remote?" msgstr "" -#: celeste/src/launch.rs:941 +#: src/launch.rs:877 msgid "All the directories associated with this remote will also stop syncing." msgstr "" -#: celeste/src/launch.rs:1167 celeste-tray/src/main.rs:51 -msgid "Awaiting sync checks..." -msgstr "" - #. Notify the tray app that we're syncing this remote now. -#: celeste/src/launch.rs:1263 +#: src/launch.rs:1160 msgid "Syncing '{}'..." msgstr "" -#: celeste/src/launch.rs:1298 +#: src/launch.rs:1194 msgid "Checking for changes..." msgstr "" #. Add an error for reporting in the UI. -#: celeste/src/launch.rs:1305 +#: src/launch.rs:1201 msgid "Please resolve the reported syncing issues." msgstr "" -#: celeste/src/launch.rs:1332 +#: src/launch.rs:1228 msgid "{} errors found. " msgstr "" -#: celeste/src/launch.rs:1346 +#: src/launch.rs:1242 msgid "Would you like to dismiss this error?" msgstr "" -#: celeste/src/launch.rs:1373 +#: src/launch.rs:1269 msgid "Failed to sync '{}' to '{}' on remote." msgstr "" -#: celeste/src/launch.rs:1381 +#: src/launch.rs:1277 msgid "Failed to sync '{}' on remote to '{}'." msgstr "" -#: celeste/src/launch.rs:1406 +#: src/launch.rs:1302 msgid "Unable to fetch data for '{}' from the remote." msgstr "" -#: celeste/src/launch.rs:1415 celeste/src/launch.rs:1420 celeste/src/launch.rs:1428 +#: src/launch.rs:1311 src/launch.rs:1316 src/launch.rs:1324 msgid "File Update" msgstr "" -#: celeste/src/launch.rs:1415 +#: src/launch.rs:1311 msgid "Neither the local item or remote item exists anymore. This error will now be removed." msgstr "" -#: celeste/src/launch.rs:1420 +#: src/launch.rs:1316 msgid "Only the local item exists now, so it will be synced to the remote." msgstr "" -#: celeste/src/launch.rs:1428 +#: src/launch.rs:1324 msgid "Only the remote item exists now, so it will be synced to the local machine." msgstr "" -#: celeste/src/launch.rs:1438 +#: src/launch.rs:1334 msgid "Both the local item '{}' and remote item '{}' have been updated since the last sync." msgstr "" -#: celeste/src/launch.rs:1440 +#: src/launch.rs:1336 msgid "Which item would you like to keep?" msgstr "" -#: celeste/src/launch.rs:1442 +#: src/launch.rs:1338 msgid "Local" msgstr "" -#: celeste/src/launch.rs:1443 +#: src/launch.rs:1339 msgid "Remote" msgstr "" -#: celeste/src/launch.rs:1492 +#: src/launch.rs:1388 msgid "1 error found." msgstr "" -#: celeste/src/launch.rs:1494 +#: src/launch.rs:1390 msgid "{} errors found." msgstr "" -#: celeste/src/launch.rs:1626 +#: src/launch.rs:1522 msgid "Checking '{}' for changes..." msgstr "" -#: celeste/src/launch.rs:2042 +#: src/launch.rs:1938 msgid "Checking '{}' on remote for changes..." msgstr "" -#: celeste/src/launch.rs:2433 +#: src/launch.rs:2329 msgid "Directory has finished sync checks." msgstr "" -#: celeste/src/launch.rs:2454 +#: src/launch.rs:2350 msgid "Finished sync checks with {} errors." msgstr "" -#: celeste/src/login/gdrive.rs:204 +#: src/launch.rs:2355 +msgid "Finished sync checks." +msgstr "" + +#: src/login/gdrive.rs:205 msgid "Authenticating to {}..." msgstr "" -#: celeste/src/login/gdrive.rs:205 +#: src/login/gdrive.rs:206 msgid "Follow the link that opened in your browser, and come back once you've finished." msgstr "" -#: celeste/src/login/gdrive.rs:232 +#: src/login/gdrive.rs:233 msgid "There was an issue while running the webserver for authentication" msgstr "" -#: celeste/src/login/gdrive.rs:241 +#: src/login/gdrive.rs:242 msgid "There was an issue authenticating to {}" msgstr "" -#: celeste/src/login/login_util.rs:15 +#: src/login/login_util.rs:15 msgid "Server Name" msgstr "" -#: celeste/src/login/login_util.rs:27 +#: src/login/login_util.rs:27 msgid "Server name already exists." msgstr "" -#: celeste/src/login/login_util.rs:29 +#: src/login/login_util.rs:29 msgid "Invalid server name. Server names must:\n" "- Only contain numbers, letters, '_', '-', '.', and spaces\n" "- Not start with '-' or a space\n" "- Not end with a space" msgstr "" -#: celeste/src/login/login_util.rs:43 +#: src/login/login_util.rs:43 msgid "Server URL" msgstr "" -#: celeste/src/login/login_util.rs:49 +#: src/login/login_util.rs:49 msgid "Invalid server URL ({})." msgstr "" -#: celeste/src/login/login_util.rs:58 +#: src/login/login_util.rs:58 msgid "Invalid server URL (no domain specified)." msgstr "" -#: celeste/src/login/login_util.rs:62 +#: src/login/login_util.rs:62 msgid "Invalid server URL (password was specified)." msgstr "" -#: celeste/src/login/login_util.rs:66 +#: src/login/login_util.rs:66 msgid "Invalid server URL(unknown server scheme {})." msgstr "" -#: celeste/src/login/login_util.rs:78 +#: src/login/login_util.rs:78 msgid "Don't specify '{}' as part of the URL." msgstr "" -#: celeste/src/login/login_util.rs:91 +#: src/login/login_util.rs:91 msgid "Username" msgstr "" -#: celeste/src/login/login_util.rs:97 +#: src/login/login_util.rs:97 msgid "Password" msgstr "" -#: celeste/src/login/login_util.rs:104 +#: src/login/login_util.rs:104 msgid "2FA Code" msgstr "" -#: celeste/src/login/login_util.rs:113 +#: src/login/login_util.rs:113 msgid "The provided 2FA code is invalid (should only contain digits)." msgstr "" -#: celeste/src/login/login_util.rs:118 +#: src/login/login_util.rs:118 msgid "The provided 2FA code is invalid (should be 6 digits long)." msgstr "" -#: celeste/src/login/login_util.rs:142 +#: src/login/login_util.rs:142 msgid "Log in" msgstr "" -#: celeste/src/login/mod.rs:76 +#: src/login/mod.rs:77 msgid "Unable to connect to the server. Check your internet connection and try again." msgstr "" -#: celeste/src/login/mod.rs:79 +#: src/login/mod.rs:80 msgid "A 2FA code is required to log in to this account. Provide one and try again." msgstr "" -#: celeste/src/login/mod.rs:82 +#: src/login/mod.rs:83 msgid "Unable to authenticate to the server. Check your login credentials and try again." msgstr "" -#: celeste/src/login/mod.rs:86 +#: src/login/mod.rs:87 msgid "Unable to log in" msgstr "" #. The dropdown for selecting the server type. -#: celeste/src/login/mod.rs:123 +#: src/login/mod.rs:124 msgid "Server Type" msgstr "" -#: celeste/src/main.rs:187 -msgid "Unknown Error" +#: src/tray.rs:13 +msgid "Awaiting sync checks..." msgstr "" -#: celeste/src/main.rs:194 -msgid "An unknown error has occurred while running. This is an internal issue with Celeste and should be reported.\n" -"\n" -"The following backtrace may help with debugging the issue - note that it may contain information such as login tokens/keys, so avoid posting the information publicly:" +#: src/tray.rs:57 +msgid "Open" msgstr "" -#: celeste-tray/src/main.rs:54 -msgid "Open" +#: src/tray.rs:64 +msgid "Close" msgstr "" -#: celeste-tray/src/main.rs:55 -msgid "Quit" +#: src/main.rs:188 +msgid "Unknown Error" msgstr "" -#: celeste-tray/src/main.rs:114 -msgid "Quitting..." +#: src/main.rs:195 +msgid "An unknown error has occurred while running. This is an internal issue with Celeste and should be reported.\n" +"\n" +"The following backtrace may help with debugging the issue - note that it may contain information such as login tokens/keys, so avoid posting the information publicly:" msgstr "" diff --git a/celeste/src/about.rs b/src/about.rs similarity index 100% rename from celeste/src/about.rs rename to src/about.rs diff --git a/celeste/src/entities/mod.rs b/src/entities/mod.rs similarity index 100% rename from celeste/src/entities/mod.rs rename to src/entities/mod.rs diff --git a/celeste/src/entities/remotes.rs b/src/entities/remotes.rs similarity index 100% rename from celeste/src/entities/remotes.rs rename to src/entities/remotes.rs diff --git a/celeste/src/entities/sync_dirs.rs b/src/entities/sync_dirs.rs similarity index 97% rename from celeste/src/entities/sync_dirs.rs rename to src/entities/sync_dirs.rs index bb7ab9c..7683fbe 100644 --- a/celeste/src/entities/sync_dirs.rs +++ b/src/entities/sync_dirs.rs @@ -1,4 +1,5 @@ //! `SeaORM` Entity. Generated by sea-orm-codegen 0.10.3 +use crate::util; use sea_orm::entity::prelude::*; use serde::{Deserialize, Serialize}; @@ -20,7 +21,7 @@ impl Model { // See if this item still exists in the database (i.e. the struct was created // and the item was later deleted). pub fn exists(&self, db: &DatabaseConnection) -> bool { - libceleste::await_future( + util::await_future( Entity::find() .filter(Column::LocalPath.eq(self.local_path.clone())) .filter(Column::RemotePath.eq(self.remote_path.clone())) diff --git a/celeste/src/entities/sync_items.rs b/src/entities/sync_items.rs similarity index 100% rename from celeste/src/entities/sync_items.rs rename to src/entities/sync_items.rs diff --git a/celeste/src/gtk_util.rs b/src/gtk_util.rs similarity index 97% rename from celeste/src/gtk_util.rs rename to src/gtk_util.rs index 4fb89d9..e13e206 100644 --- a/celeste/src/gtk_util.rs +++ b/src/gtk_util.rs @@ -1,4 +1,4 @@ -use crate::mpsc; +use crate::{mpsc, util}; use adw::{ glib, gtk::{Orientation, ScrolledWindow, Separator, TextBuffer, TextView}, @@ -35,7 +35,7 @@ pub fn show_error(primary_text: &str, secondary_text: Option<&str>) { pub fn show_codeblock_error(primary_text: &str, code: &str) { let (sender, mut receiver) = mpsc::channel::<()>(); let dialog = MessageDialog::builder() - .title(&libceleste::get_title!("{title}")) + .title(&util::get_title!("{title}")) .heading(primary_text) .extra_child(&codeblock(code)) .resizable(true) diff --git a/celeste/src/html/auth-template.go.html b/src/html/auth-template.go.html similarity index 100% rename from celeste/src/html/auth-template.go.html rename to src/html/auth-template.go.html diff --git a/celeste/src/html/google-drive.tera.html b/src/html/google-drive.tera.html similarity index 100% rename from celeste/src/html/google-drive.tera.html rename to src/html/google-drive.tera.html diff --git a/celeste/src/images/google-drive.png b/src/images/google-drive.png similarity index 100% rename from celeste/src/images/google-drive.png rename to src/images/google-drive.png diff --git a/celeste/src/images/google-signin.png b/src/images/google-signin.png similarity index 100% rename from celeste/src/images/google-signin.png rename to src/images/google-signin.png diff --git a/celeste/src/launch.rs b/src/launch.rs similarity index 94% rename from celeste/src/launch.rs rename to src/launch.rs index df85344..beb8f88 100644 --- a/celeste/src/launch.rs +++ b/src/launch.rs @@ -7,6 +7,8 @@ use crate::{ login::{self}, migrations::{Migrator, MigratorTrait}, rclone::{self, RcloneListFilter}, + traits::prelude::*, + util, }; use adw::{ glib, @@ -23,10 +25,7 @@ use adw::{ }; use file_lock::{FileLock, FileOptions}; use indexmap::IndexMap; -use libceleste::traits::prelude::*; use sea_orm::{entity::prelude::*, ActiveValue, Database, DatabaseConnection}; -use tempfile::NamedTempFile; -use zbus::blocking::Connection; use std::{ boxed, @@ -34,9 +33,7 @@ use std::{ collections::HashMap, fs::{self, OpenOptions}, io::Write, - os::unix::fs::PermissionsExt, path::{Path, PathBuf}, - process::{Child, Command}, rc::Rc, sync::{Arc, Mutex}, thread, @@ -129,8 +126,6 @@ struct SyncDir { /// The label for reporting the current sync status (things like 'Awaiting /// sync check...'). status_text: Label, - /// The error label in the UI. - error_label: Label, /// The error list in the UI. error_list: ListBox, /// The list of error items, as generated by 'SyncError::generate_ui' above. @@ -141,60 +136,9 @@ struct SyncDir { lazy_static::lazy_static! { // A [`Mutex`] to keep track of any recorded close requests. - static ref CLOSE_REQUEST: Arc> = Arc::new(Mutex::new(false)); + pub static ref CLOSE_REQUEST: Arc> = Arc::new(Mutex::new(false)); // A [`Mutex`] to keep track of open requests from the tray icon. - static ref OPEN_REQUEST: Arc> = Arc::new(Mutex::new(false)); -} - -// The DBus application so we can receive close requests from the tray icon. -struct ZbusApp; - -// For some reason this has to be in a separate module or we get some compiler -// errors :P. -mod zbus_app { - #[zbus::dbus_interface(name = "com.hunterwittenborn.Celeste.App")] - impl super::ZbusApp { - async fn close(&self) { - *(*super::CLOSE_REQUEST).lock().unwrap() = true; - } - - async fn open(&self) { - *(*super::OPEN_REQUEST).lock().unwrap() = true; - } - } -} - -/// Start the tray binary. -/// We put this in a struct so we can manually kill the subprocess on [`Drop`], -/// such as in the case of a panic. -struct TrayApp(Child); - -impl TrayApp { - fn start() -> Self { - hw_msg::infoln!("Starting up tray binary..."); - - let named_temp_file = NamedTempFile::new().unwrap(); - let temp_file = named_temp_file.path().to_owned(); - let mut file = named_temp_file.persist(&temp_file).unwrap(); - let mut perms = file.metadata().unwrap().permissions(); - perms.set_mode(0o755); - file.set_permissions(perms).unwrap(); - - #[cfg(debug_assertions)] - let tray_file = include_bytes!("../../target/debug/celeste-tray"); - #[cfg(not(debug_assertions))] - let tray_file = include_bytes!("../../target/release/celeste-tray"); - - file.write_all(tray_file).unwrap(); - drop(file); - Self(Command::new(&temp_file).spawn().unwrap()) - } -} - -impl Drop for TrayApp { - fn drop(&mut self) { - self.0.kill().unwrap_or(()) - } + pub static ref OPEN_REQUEST: Arc> = Arc::new(Mutex::new(false)); } /// Get an icon for use as the status icon for directory syncs. @@ -208,7 +152,7 @@ fn get_image(icon_name: &str) -> Image { pub fn launch(app: &Application, background: bool) { // Create the configuration directory if it doesn't exist. - let config_path = libceleste::get_config_dir(); + let config_path = util::get_config_dir(); if !config_path.exists() && let Err(err) = fs::create_dir_all(&config_path) { gtk_util::show_error( &tr::tr!("Unable to create Celeste's config directory [{}].", err), @@ -231,7 +175,7 @@ pub fn launch(app: &Application, background: bool) { }; // Connect to the database. - let db = libceleste::await_future(Database::connect(format!("sqlite://{}", db_path.display()))); + let db = util::await_future(Database::connect(format!("sqlite://{}", db_path.display()))); if let Err(err) = &db { gtk_util::show_error(&tr::tr!("Unable to connect to database [{}].", err), None); return; @@ -239,7 +183,7 @@ pub fn launch(app: &Application, background: bool) { let db = db.unwrap(); // Run migrations. - if let Err(err) = libceleste::await_future(Migrator::up(&db, None)) { + if let Err(err) = util::await_future(Migrator::up(&db, None)) { gtk_util::show_error( &tr::tr!("Unable to run database migrations [{}]", err), None, @@ -247,28 +191,21 @@ pub fn launch(app: &Application, background: bool) { return; } - // Set up our DBus connection. - let dbus = Connection::session().unwrap(); - dbus.object_server() - .at(libceleste::DBUS_APP_OBJECT, ZbusApp) - .unwrap(); - dbus.request_name(libceleste::DBUS_APP_ID).unwrap(); - // Get our remotes. - let mut remotes = libceleste::await_future(RemotesEntity::find().all(&db)).unwrap(); + let mut remotes = util::await_future(RemotesEntity::find().all(&db)).unwrap(); if remotes.is_empty() { if login::login(app, &db).is_none() { return; } - remotes = libceleste::await_future(RemotesEntity::find().all(&db)).unwrap(); + remotes = util::await_future(RemotesEntity::find().all(&db)).unwrap(); } // Create the main UI. let window = ApplicationWindow::builder() .application(app) - .title(&libceleste::get_title!("Servers")) + .title(&util::get_title!("Servers")) .build(); window.add_css_class("celeste-global-padding"); let stack_sidebar = StackSidebar::builder() @@ -321,7 +258,7 @@ pub fn launch(app: &Application, background: bool) { remote_path: String, | { let server_name_owned = server_name.to_string(); - let formatted_local_path = libceleste::fmt_home(&local_path); + let formatted_local_path = util::fmt_home(&local_path); let formatted_remote_path = format!("/{remote_path}"); // The sync status row. @@ -612,7 +549,6 @@ pub fn launch(app: &Application, background: bool) { status_icon: status_container, error_status_text: error_status, status_text: status, - error_label: more_info_errors_label, error_list: more_info_errors_list, error_items: HashMap::new(), update_error_ui: boxed::Box::new(update_error_list) @@ -624,7 +560,7 @@ pub fn launch(app: &Application, background: bool) { }); // Create the remote in the database if it doesn't current exist. - let db_remote = libceleste::await_future( + let db_remote = util::await_future( RemotesEntity::find() .filter(RemotesColumn::Name.eq(remote_name.clone())) .one(&db), @@ -651,7 +587,7 @@ pub fn launch(app: &Application, background: bool) { new_folder_button.connect_clicked(glib::clone!(@weak window, @weak sections, @weak page, @strong remote_name, @strong sync_dirs, @strong db, @strong directory_map, @strong db_remote, @strong add_dir => @default-panic, move |_| { window.set_sensitive(false); let folder_window = ApplicationWindow::builder() - .title(&libceleste::get_title!("Remote Folder Picker")) + .title(&util::get_title!("Remote Folder Picker")) .build(); folder_window.add_css_class("celeste-global-padding"); let folder_sections = Box::builder().orientation(Orientation::Vertical).build(); @@ -669,7 +605,7 @@ pub fn launch(app: &Application, background: bool) { let filter = FileFilter::new(); filter.add_mime_type("inode/directory"); let dialog = FileChooserDialog::builder() - .title(&libceleste::get_title!("Local Folder Picker")) + .title(&util::get_title!("Local Folder Picker")) .select_multiple(false) .create_folders(true) .filter(&filter) @@ -875,8 +811,8 @@ pub fn launch(app: &Application, background: bool) { // The local path needs to start with a slash, but not end with one. The remote // needs to not start or end with a slash. - let local_text = "/".to_string() + &libceleste::strip_slashes(local_entry.text().as_str()); - let remote_text = libceleste::strip_slashes(remote_entry.text().as_str()); + let local_text = "/".to_string() + &util::strip_slashes(local_entry.text().as_str()); + let remote_text = util::strip_slashes(remote_entry.text().as_str()); let local_path = Path::new(&local_text); match rclone::sync::stat(&remote_name, &remote_text) { Ok(path) => { @@ -895,7 +831,7 @@ pub fn launch(app: &Application, background: bool) { } }; - let sync_dir = libceleste::await_future( + let sync_dir = util::await_future( SyncDirsEntity::find().filter(SyncDirsColumn::LocalPath.eq(local_text.clone())).filter(SyncDirsColumn::RemotePath.eq(remote_text.clone())).one(&db) ).unwrap(); @@ -912,7 +848,7 @@ pub fn launch(app: &Application, background: bool) { gtk_util::show_error(&tr::tr!("The specified local directory needs to be an absolute path"), None); folder_window.set_sensitive(true); } else { - libceleste::await_future( + util::await_future( SyncDirsActiveModel { remote_id: ActiveValue::Set(db_remote.id), local_path: ActiveValue::Set(local_text.clone()), @@ -965,7 +901,7 @@ pub fn launch(app: &Application, background: bool) { // The directory listing. { // Get the currently present directories. - let dirs = libceleste::await_future( + let dirs = util::await_future( SyncDirsEntity::find() .filter(SyncDirsColumn::RemoteId.eq(db_remote.id)) .all(&db), @@ -1060,11 +996,11 @@ pub fn launch(app: &Application, background: bool) { .css_classes(vec!["stack".to_string()]) .build(); let stack_window_title = WindowTitle::new( - &libceleste::get_title!("{}", stack.visible_child_name().unwrap()), + &util::get_title!("{}", stack.visible_child_name().unwrap()), "", ); stack.connect_visible_child_notify(glib::clone!(@weak sections, @weak stack_box, @weak stack_window_title => move |stack| { - stack_window_title.set_title(&libceleste::get_title!("{}", stack.visible_child_name().unwrap())); + stack_window_title.set_title(&util::get_title!("{}", stack.visible_child_name().unwrap())); sections.set_visible_child(&stack_box); })); let stack_header = HeaderBar::builder() @@ -1121,40 +1057,17 @@ pub fn launch(app: &Application, background: bool) { window.show(); } - let tray_app = TrayApp::start(); + let service = ksni::TrayService::new(crate::tray::Tray::new()); + let handle = service.handle(); + service.spawn(); - let send_dbus_msg_checked = |msg: &str| { - dbus.call_method( - Some(libceleste::TRAY_ID), - libceleste::DBUS_TRAY_OBJECT, - Some(libceleste::TRAY_ID), - "UpdateStatus", - &(msg), - ) - }; - let send_dbus_msg = |msg: &str| { - if let Err(err) = send_dbus_msg_checked(msg) { - hw_msg::warningln!("Got error while sending message to tray icon: '{err}'."); - } - }; - let send_dbus_fn = |func: &str| { - if let Err(err) = dbus.call_method( - Some(libceleste::TRAY_ID), - libceleste::DBUS_TRAY_OBJECT, - Some(libceleste::TRAY_ID), - func, - &(), - ) { - hw_msg::warningln!("Got error while sending message to tray icon: '{err}'."); - } - }; let sync_errors_count = glib::clone!(@strong directory_map => move || { let dmap = directory_map.get_ref(); let mut error_count = 0; for remote_dirs in dmap.values() { for dir in remote_dirs.values() { - if !dir.error_label.text().is_empty() { + if !dir.error_status_text.text().is_empty() { error_count += 1; } } @@ -1163,24 +1076,9 @@ pub fn launch(app: &Application, background: bool) { error_count }); - // Wait until we can successfully send a message to the tray icon. - while send_dbus_msg_checked(&tr::tr!("Awaiting sync checks...")).is_err() {} - 'main: loop { - // If the user requested to quit the application, then close the tray icon and - // break the loop. + // Break the loop if the user requested to quit the application. if *(*CLOSE_REQUEST).lock().unwrap() { - // I'm not sure when this can fail, so output an error if one is received. - if let Err(err) = dbus.call_method( - Some(libceleste::TRAY_ID), - libceleste::DBUS_TRAY_OBJECT, - Some(libceleste::TRAY_ID), - "Close", - &(), - ) { - hw_msg::warningln!("Got error while sending close request to tray icon: '{err}'."); - } - break 'main; } @@ -1193,7 +1091,7 @@ pub fn launch(app: &Application, background: bool) { }); // Continue with syncing. - let remotes = libceleste::await_future(RemotesEntity::find().all(&db)).unwrap(); + let remotes = util::await_future(RemotesEntity::find().all(&db)).unwrap(); // If no remotes are present we need to close the window and ask the user to log // in again. @@ -1210,10 +1108,9 @@ pub fn launch(app: &Application, background: bool) { } } - libceleste::run_in_background(|| thread::sleep(Duration::from_millis(500))); - + util::run_in_background(|| thread::sleep(Duration::from_millis(500))); if sync_errors_count() == 0 { - send_dbus_fn("SetSyncingIcon"); + handle.update(|tray| tray.set_syncing()); } for remote in remotes { @@ -1229,7 +1126,7 @@ pub fn launch(app: &Application, background: bool) { stack.remove(&child); // Delete all related database entries. - libceleste::await_future(async { + util::await_future(async { let db_remote = RemotesEntity::find() .filter(RemotesColumn::Name.eq(remote_name.clone())) .one(&db) @@ -1260,10 +1157,9 @@ pub fn launch(app: &Application, background: bool) { } // Notify the tray app that we're syncing this remote now. - let status_string = tr::tr!("Syncing '{}'...", remote.name); - send_dbus_msg(&status_string); + handle.update(|tray| tray.set_msg(tr::tr!("Syncing '{}'...", remote.name))); - let sync_dirs = libceleste::await_future( + let sync_dirs = util::await_future( SyncDirsEntity::find() .filter(SyncDirsColumn::RemoteId.eq(remote.id)) .all(&db), @@ -1304,7 +1200,7 @@ pub fn launch(app: &Application, background: bool) { // Add an error for reporting in the UI. let please_resolve_msg_tr = tr::tr!("Please resolve the reported syncing issues."); let please_resolve_msg = " ".to_owned() + &please_resolve_msg_tr; - let add_error = glib::clone!(@strong db, @strong directory_map, @strong remote, @strong sync_dir, @strong sync_errors_count, @strong please_resolve_msg => move |error: SyncError| { + let add_error = glib::clone!(@strong db, @strong directory_map, @strong remote, @strong sync_dir, @strong sync_errors_count, @strong please_resolve_msg, @strong handle => move |error: SyncError| { let path_pair = (sync_dir.local_path.clone(), sync_dir.remote_path.clone()); let ui_item = error.generate_ui(); let ui_item_listbox = ListBoxRow::builder().child(&ui_item).build(); @@ -1366,7 +1262,7 @@ pub fn launch(app: &Application, background: bool) { dialog.show(); }, SyncError::BothMoreCurrent(local_item, remote_item) => { - let local_item_formatted = libceleste::fmt_home(local_item); + let local_item_formatted = util::fmt_home(local_item); let local_path = Path::new(&local_item); let sync_local_to_remote = glib::clone!(@strong remote, @strong local_item_formatted, @strong local_item, @strong remote_item => move || { if let Err(err) = rclone::sync::copy_to_remote(&local_item, &remote.name, &remote_item) { @@ -1388,7 +1284,7 @@ pub fn launch(app: &Application, background: bool) { let update_db_item = glib::clone!(@strong db, @strong remote, @strong local_item, @strong remote_item => move || { let local_timestamp = Path::new(&local_item).metadata().unwrap().modified().unwrap().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_secs(); let remote_timestamp = rclone::sync::stat(&remote.name, &remote_item).unwrap().unwrap().mod_time.unix_timestamp(); - let mut active_model: SyncItemsActiveModel = libceleste::await_future(SyncItemsEntity::find() + let mut active_model: SyncItemsActiveModel = util::await_future(SyncItemsEntity::find() .filter(SyncItemsColumn::LocalPath.eq(local_item.clone())) .filter(SyncItemsColumn::RemotePath.eq(remote_item.clone())) .one(&db) @@ -1397,7 +1293,7 @@ pub fn launch(app: &Application, background: bool) { .into(); active_model.last_local_timestamp = ActiveValue::set(local_timestamp.try_into().unwrap()); active_model.last_remote_timestamp = ActiveValue::Set(remote_timestamp.try_into().unwrap()); - libceleste::await_future(active_model.update(&db)).unwrap(); + util::await_future(active_model.update(&db)).unwrap(); }); let rclone_remote_item = match rclone::sync::stat(&remote.name, remote_item) { Ok(item) => item, @@ -1474,7 +1370,7 @@ pub fn launch(app: &Application, background: bool) { // If we have zero errors now, remove the warning icon. if sync_errors_count() == 0 { - send_dbus_fn("SetSyncingIcon"); + handle.update(|tray| tray.set_syncing()); } // Report the brief on the number of errors. @@ -1501,7 +1397,7 @@ pub fn launch(app: &Application, background: bool) { (item.update_error_ui)(); // Set the tray icon to show the warning icon. - send_dbus_fn("SetWarningIcon"); + handle.update(|tray| tray.set_warning()); }); // A vector of local/remote sync item pairs to make sure we don't sync anything @@ -1530,7 +1426,7 @@ pub fn launch(app: &Application, background: bool) { dmap.get_mut(&queue_item.0).unwrap().remove(&dir_pair).unwrap(); // Remove the item from the database. - libceleste::await_future(async { + util::await_future(async { let sync_dir = SyncDirsEntity::find() .filter(SyncDirsColumn::LocalPath.eq(queue_item.1.clone())) .filter(SyncDirsColumn::RemotePath.eq(queue_item.2.clone())) @@ -1557,7 +1453,7 @@ pub fn launch(app: &Application, background: bool) { stack.remove(&child); // Delete all related database entries. - libceleste::await_future(async { + util::await_future(async { let db_remote = RemotesEntity::find() .filter(RemotesColumn::Name.eq(remote_name.clone())) .one(&db) @@ -1623,7 +1519,7 @@ pub fn launch(app: &Application, background: bool) { let dir_pair = (sync_dir.local_path.clone(), sync_dir.remote_path.clone()); let item = ptr.get(&remote.name).unwrap().get(&dir_pair).unwrap(); let status_string = - tr::tr!("Checking '{}' for changes...", libceleste::fmt_home(dir)); + tr::tr!("Checking '{}' for changes...", util::fmt_home(dir)); item.status_text.set_label(&status_string); }; update_ui_progress(&dir_string); @@ -1745,7 +1641,7 @@ pub fn launch(app: &Application, background: bool) { let remote_utc_timestamp = remote_item .as_ref() .map(|item| item.mod_time.unix_timestamp()); - let db_item = libceleste::await_future( + let db_item = util::await_future( SyncItemsEntity::find() .filter(SyncItemsColumn::LocalPath.eq(local_path.clone())) .filter(SyncItemsColumn::RemotePath.eq(remote_path.clone())) @@ -1846,7 +1742,7 @@ pub fn launch(app: &Application, background: bool) { }; // Delete this item from the database. let delete_db_entry = || { - libceleste::await_future(async { + util::await_future(async { SyncItemsEntity::find() .filter(SyncItemsColumn::SyncDirId.eq(sync_dir.id)) .filter(SyncItemsColumn::LocalPath.eq(local_path.clone())) @@ -1871,7 +1767,7 @@ pub fn launch(app: &Application, background: bool) { ActiveValue::Set(local_timestamp); active_model.last_remote_timestamp = ActiveValue::Set(remote_timestamp); - libceleste::await_future(active_model.update(db)).unwrap(); + util::await_future(active_model.update(db)).unwrap(); }; // Both items are more current than at the last transaction - we need to @@ -1960,7 +1856,7 @@ pub fn launch(app: &Application, background: bool) { }; // Record the current transaction's timestamps in the database. - libceleste::await_future( + util::await_future( SyncItemsActiveModel { sync_dir_id: ActiveValue::Set(sync_dir.id), local_path: ActiveValue::Set(local_path.clone()), @@ -2111,7 +2007,7 @@ pub fn launch(app: &Application, background: bool) { }) }; let local_timestamp = get_local_file_timestamp(); - let db_item = libceleste::await_future( + let db_item = util::await_future( SyncItemsEntity::find() .filter(SyncItemsColumn::LocalPath.eq(local_path_string.clone())) .filter(SyncItemsColumn::RemotePath.eq(remote_path_string.clone())) @@ -2256,7 +2152,7 @@ pub fn launch(app: &Application, background: bool) { }; // Delete this item from the database. let delete_db_entry = || { - libceleste::await_future(async { + util::await_future(async { SyncItemsEntity::find() .filter(SyncItemsColumn::SyncDirId.eq(sync_dir.id)) .filter( @@ -2284,7 +2180,7 @@ pub fn launch(app: &Application, background: bool) { ActiveValue::Set(local_timestamp); active_model.last_remote_timestamp = ActiveValue::Set(remote_timestamp); - libceleste::await_future(active_model.update(db)).unwrap(); + util::await_future(active_model.update(db)).unwrap(); }; // Both items are more recent. @@ -2367,7 +2263,7 @@ pub fn launch(app: &Application, background: bool) { }; // Record the current transaction's timestamps in the database. - libceleste::await_future( + util::await_future( SyncItemsActiveModel { sync_dir_id: ActiveValue::Set(sync_dir.id), local_path: ActiveValue::Set(local_path_string.clone()), @@ -2453,16 +2349,17 @@ pub fn launch(app: &Application, background: bool) { } else { tr::tr!("Finished sync checks with {} errors.", error_count) }; - send_dbus_msg(&error_msg); + handle.update(|tray| tray.set_msg(error_msg)); } else { - send_dbus_msg("Finished sync checks."); - send_dbus_fn("SetDoneIcon"); + handle.update(|tray| { + tray.set_msg(tr::tr!("Finished sync checks.")); + tray.set_done(); + }); } } // We broke out of the loop because of a close request, so stop the tray app, // and then close and destroy the window. - drop(tray_app); window.close(); window.destroy(); } diff --git a/celeste/src/login/dropbox.rs b/src/login/dropbox.rs similarity index 100% rename from celeste/src/login/dropbox.rs rename to src/login/dropbox.rs diff --git a/celeste/src/login/gdrive.rs b/src/login/gdrive.rs similarity index 97% rename from celeste/src/login/gdrive.rs rename to src/login/gdrive.rs index 3bd3ba2..bf9ef21 100644 --- a/celeste/src/login/gdrive.rs +++ b/src/login/gdrive.rs @@ -4,9 +4,10 @@ use crate::{ gtk_util, login::{dropbox, login_util, pcloud}, mpsc::Sender, + traits::prelude::*, + util, }; use adw::{glib, gtk::Button, prelude::*, ApplicationWindow, EntryRow, MessageDialog}; -use libceleste::traits::prelude::*; use nix::{ sys::signal::{self, Signal}, unistd::Pid, @@ -181,7 +182,7 @@ impl GDriveConfig { break } - libceleste::run_in_background(|| thread::sleep(Duration::from_millis(500))); + util::run_in_background(|| thread::sleep(Duration::from_millis(500))); } hw_msg::warningln!("STATE URL: {}", STATE_URL.lock().unwrap()); @@ -218,7 +219,7 @@ impl GDriveConfig { // Run until the process exits or the user clicks 'Cancel'. loop { // Sleep a little so the UI has a chance to process. - libceleste::run_in_background(|| thread::sleep(Duration::from_millis(500))); + util::run_in_background(|| thread::sleep(Duration::from_millis(500))); // Check if the user clicked cancel. if *kill_request.get_ref() { @@ -228,7 +229,7 @@ impl GDriveConfig { break; // Otherwise if the temporary webserver has died off, report it. } else if handle.is_finished() { - let error_string = libceleste::await_future(handle).unwrap().unwrap_err().to_string(); + let error_string = util::await_future(handle).unwrap().unwrap_err().to_string(); gtk_util::show_codeblock_error(&tr::tr!("There was an issue while running the webserver for authentication"), &error_string); window.set_sensitive(true); break; diff --git a/celeste/src/login/login_util.rs b/src/login/login_util.rs similarity index 100% rename from celeste/src/login/login_util.rs rename to src/login/login_util.rs diff --git a/celeste/src/login/mod.rs b/src/login/mod.rs similarity index 98% rename from celeste/src/login/mod.rs rename to src/login/mod.rs index fce778b..3ff954e 100644 --- a/celeste/src/login/mod.rs +++ b/src/login/mod.rs @@ -4,8 +4,9 @@ use crate::{ gtk_util, mpsc::{self, Sender}, rclone, + traits::prelude::*, + util, }; -use libceleste::traits::prelude::*; mod dropbox; mod gdrive; pub mod login_util; @@ -101,7 +102,7 @@ pub fn login(app: &Application, db: &DatabaseConnection) -> Option // The window. let window = ApplicationWindow::builder() .application(app) - .title(&libceleste::get_title!("Log in")) + .title(&util::get_title!("Log in")) .width_request(400) .build(); window.add_css_class("celeste-global-padding"); @@ -314,21 +315,21 @@ pub fn login(app: &Application, db: &DatabaseConnection) -> Option }), }; - libceleste::run_in_background(move || { + util::run_in_background(move || { librclone::rpc("config/create", config_query.to_string()).unwrap() }); // If we can't connect to the server, assume invalid credentials were given, // remote the config, and try asking for input again. if !can_login(app, &config_name) { - libceleste::run_in_background(move || { + util::run_in_background(move || { librclone::rpc("config/delete", json!({ "name": config_name }).to_string()).unwrap() }); window.set_sensitive(true); // We've passed validation otherwise, so add the remote to the db, close // the window and return the config. } else { - let model = libceleste::await_future( + let model = util::await_future( RemotesActiveModel { name: ActiveValue::Set(config_name), ..Default::default() diff --git a/celeste/src/login/nextcloud.rs b/src/login/nextcloud.rs similarity index 100% rename from celeste/src/login/nextcloud.rs rename to src/login/nextcloud.rs diff --git a/celeste/src/login/owncloud.rs b/src/login/owncloud.rs similarity index 100% rename from celeste/src/login/owncloud.rs rename to src/login/owncloud.rs diff --git a/celeste/src/login/pcloud.rs b/src/login/pcloud.rs similarity index 100% rename from celeste/src/login/pcloud.rs rename to src/login/pcloud.rs diff --git a/celeste/src/login/proton_drive.rs b/src/login/proton_drive.rs similarity index 100% rename from celeste/src/login/proton_drive.rs rename to src/login/proton_drive.rs diff --git a/celeste/src/login/webdav.rs b/src/login/webdav.rs similarity index 100% rename from celeste/src/login/webdav.rs rename to src/login/webdav.rs diff --git a/celeste/src/main.rs b/src/main.rs similarity index 96% rename from celeste/src/main.rs rename to src/main.rs index 80eab6e..127f649 100644 --- a/celeste/src/main.rs +++ b/src/main.rs @@ -13,6 +13,9 @@ pub mod login; pub mod migrations; pub mod mpsc; pub mod rclone; +pub mod traits; +pub mod tray; +pub mod util; use adw::{ gtk::{self, gdk::Display, Align, Box, CssProvider, Label, Orientation, StyleContext}, @@ -53,7 +56,7 @@ fn main() { gtk::init().unwrap(); // Configure Rclone. - let mut config = libceleste::get_config_dir(); + let mut config = util::get_config_dir(); config.push("rclone.conf"); librclone::initialize(); librclone::rpc("config/setpath", json!({ "path": config }).to_string()).unwrap(); @@ -69,9 +72,7 @@ fn main() { ); // Get the application. - let app = Application::builder() - .application_id(libceleste::APP_ID) - .build(); + let app = Application::builder().application_id(util::APP_ID).build(); // Due to GTK working in Rust via Rust's FFI, panics don't appear to be able to // be captured (this hasn't been confirmed behavior, it's just what I've @@ -176,7 +177,7 @@ fn main() { app.connect_activate(move |app| { let window = ApplicationWindow::builder() .application(app) - .title(&libceleste::get_title!("Unknown Error")) + .title(&util::get_title!("Unknown Error")) .build(); window.add_css_class("celeste-global-padding"); let sections = Box::builder() diff --git a/celeste/src/migrations/m20220101_000001_create_table.rs b/src/migrations/m20220101_000001_create_table.rs similarity index 100% rename from celeste/src/migrations/m20220101_000001_create_table.rs rename to src/migrations/m20220101_000001_create_table.rs diff --git a/celeste/src/migrations/m20230207_204909_sync_dirs_remove_slash_suffix.rs b/src/migrations/m20230207_204909_sync_dirs_remove_slash_suffix.rs similarity index 100% rename from celeste/src/migrations/m20230207_204909_sync_dirs_remove_slash_suffix.rs rename to src/migrations/m20230207_204909_sync_dirs_remove_slash_suffix.rs diff --git a/celeste/src/migrations/m20230220_215840_remote_sync_items_fix.rs b/src/migrations/m20230220_215840_remote_sync_items_fix.rs similarity index 100% rename from celeste/src/migrations/m20230220_215840_remote_sync_items_fix.rs rename to src/migrations/m20230220_215840_remote_sync_items_fix.rs diff --git a/celeste/src/migrations/mod.rs b/src/migrations/mod.rs similarity index 100% rename from celeste/src/migrations/mod.rs rename to src/migrations/mod.rs diff --git a/celeste/src/mpsc.rs b/src/mpsc.rs similarity index 100% rename from celeste/src/mpsc.rs rename to src/mpsc.rs diff --git a/celeste/src/rclone.rs b/src/rclone.rs similarity index 94% rename from celeste/src/rclone.rs rename to src/rclone.rs index 6c4d431..c16365a 100644 --- a/celeste/src/rclone.rs +++ b/src/rclone.rs @@ -1,4 +1,5 @@ //! Structs and functions for use with Rclone RPC calls. +use crate::util; use adw::glib; use serde::Deserialize; use serde_json::json; @@ -9,7 +10,7 @@ use time::OffsetDateTime; pub fn get_remote(remote: T) -> Option { let remote = remote.to_string(); - let config_str = libceleste::run_in_background( + let config_str = util::run_in_background( glib::clone!(@strong remote => move || librclone::rpc("config/get", json!({ "name": remote }).to_string()).unwrap()), @@ -58,7 +59,7 @@ pub fn get_remote(remote: T) -> Option { /// Get all the remotes from the config file. pub fn get_remotes() -> Vec { - let configs_str = libceleste::run_in_background(move || { + let configs_str = util::run_in_background(move || { librclone::rpc("config/listremotes", json!({}).to_string()) .unwrap_or_else(|_| unreachable!()) }); @@ -224,10 +225,11 @@ pub enum RcloneListFilter { /// Functions for syncing to a remote. /// All functions in this module automatically run under -/// [`libceleste::run_in_background`], so they don't need to be wrapped around +/// [`util::run_in_background`], so they don't need to be wrapped around /// such to be ran during UI execution. pub mod sync { use super::{RcloneError, RcloneList, RcloneListFilter, RcloneRemoteItem, RcloneStat}; + use crate::util; use serde_json::json; /// Get a remote name. @@ -242,7 +244,7 @@ pub mod sync { fn run(method: T, input: T) -> Result { let method = method.to_string(); let input = input.to_string(); - libceleste::run_in_background(|| librclone::rpc(method, input)) + util::run_in_background(|| librclone::rpc(method, input)) } /// Common function for some of the below command. @@ -251,7 +253,7 @@ pub mod sync { command, &json!({ "fs": get_remote_name(remote_name), - "remote": libceleste::strip_slashes(path), + "remote": util::strip_slashes(path), }) .to_string(), ); @@ -278,7 +280,7 @@ pub mod sync { "operations/stat", &json!({ "fs": get_remote_name(remote_name), - "remote": libceleste::strip_slashes(path) + "remote": util::strip_slashes(path) }) .to_string(), ); @@ -306,7 +308,7 @@ pub mod sync { "operations/list", &json!({ "fs": get_remote_name(remote_name), - "remote": libceleste::strip_slashes(path), + "remote": util::strip_slashes(path), "opt": opts }) .to_string(), @@ -343,9 +345,9 @@ pub mod sync { "operations/copyfile", &json!({ "srcFs": src_fs, - "srcRemote": libceleste::strip_slashes(src_remote), + "srcRemote": util::strip_slashes(src_remote), "dstFs": dst_fs, - "dstRemote": libceleste::strip_slashes(dst_remote) + "dstRemote": util::strip_slashes(dst_remote) }) .to_string(), ); diff --git a/celeste/src/style.scss b/src/style.scss similarity index 100% rename from celeste/src/style.scss rename to src/style.scss diff --git a/libceleste/src/traits.rs b/src/traits.rs similarity index 100% rename from libceleste/src/traits.rs rename to src/traits.rs diff --git a/src/tray.rs b/src/tray.rs new file mode 100644 index 0000000..778c92b --- /dev/null +++ b/src/tray.rs @@ -0,0 +1,72 @@ +use crate::{launch, util}; +use ksni::{menu::StandardItem, MenuItem, Tray as KsniTray}; + +pub struct Tray { + status: String, + pub icon: String, +} + +impl Tray { + #[allow(clippy::new_without_default)] + pub fn new() -> Self { + Self { + status: tr::tr!("Awaiting sync checks..."), + icon: "com.hunterwittenborn.Celeste.CelesteTrayLoading-symbolic".to_owned(), + } + } + + pub fn set_msg(&mut self, msg: T) { + self.status = msg.to_string(); + } + + pub fn set_syncing(&mut self) { + self.icon = "com.hunterwittenborn.Celeste.CelesteTraySyncing-symbolic".to_owned(); + } + + pub fn set_warning(&mut self) { + self.icon = "com.hunterwittenborn.Celeste.CelesteTrayWarning-symbolic".to_owned(); + } + + pub fn set_done(&mut self) { + self.icon = "com.hunterwittenborn.Celeste.CelesteTrayDone-symbolic".to_owned(); + } +} + +impl KsniTray for Tray { + fn icon_name(&self) -> String { + self.icon.clone() + } + + fn title(&self) -> String { + "Celeste".to_owned() + } + + fn id(&self) -> String { + util::APP_ID.to_owned() + } + + fn menu(&self) -> Vec> { + println!("MENU!! -> {}", self.icon); + vec![ + MenuItem::Standard(StandardItem { + label: self.status.clone(), + enabled: false, + ..Default::default() + }), + MenuItem::Standard(StandardItem { + label: tr::tr!("Open"), + activate: Box::new(|_| { + *(*launch::OPEN_REQUEST).lock().unwrap() = true; + }), + ..Default::default() + }), + MenuItem::Standard(StandardItem { + label: tr::tr!("Close"), + activate: Box::new(|_| { + *(*launch::CLOSE_REQUEST).lock().unwrap() = true; + }), + ..Default::default() + }), + ] + } +} diff --git a/libceleste/src/lib.rs b/src/util.rs similarity index 97% rename from libceleste/src/lib.rs rename to src/util.rs index 29af416..bde4707 100644 --- a/libceleste/src/lib.rs +++ b/src/util.rs @@ -1,7 +1,5 @@ -pub mod traits; - +use adw::glib::{self, MainContext}; use futures::future::Future; -use glib::{self, MainContext}; use std::path::PathBuf; /// The ID of the app. @@ -70,3 +68,5 @@ macro_rules! get_title { tr::tr!($($arg)*) + " - Celeste" } } + +pub use crate::get_title;