diff --git a/.gitignore b/.gitignore
index cb47fc7..2822adc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -23,6 +23,9 @@ linuxdeploy-plugin-*
*.swo
*~
+# Trash
+.trash/
+
# OS
.DS_Store
Thumbs.db
diff --git a/data/screenshots/01.png b/data/screenshots/01.png
new file mode 100644
index 0000000..0a0eb97
Binary files /dev/null and b/data/screenshots/01.png differ
diff --git a/data/screenshots/02.png b/data/screenshots/02.png
new file mode 100644
index 0000000..e26b8aa
Binary files /dev/null and b/data/screenshots/02.png differ
diff --git a/data/screenshots/03.png b/data/screenshots/03.png
new file mode 100644
index 0000000..4851fb3
Binary files /dev/null and b/data/screenshots/03.png differ
diff --git a/data/screenshots/04.png b/data/screenshots/04.png
new file mode 100644
index 0000000..b92279d
Binary files /dev/null and b/data/screenshots/04.png differ
diff --git a/data/screenshots/05.png b/data/screenshots/05.png
new file mode 100644
index 0000000..f5e3a0c
Binary files /dev/null and b/data/screenshots/05.png differ
diff --git a/data/screenshots/06.png b/data/screenshots/06.png
new file mode 100644
index 0000000..fd04463
Binary files /dev/null and b/data/screenshots/06.png differ
diff --git a/data/screenshots/07.png b/data/screenshots/07.png
new file mode 100644
index 0000000..a20e86b
Binary files /dev/null and b/data/screenshots/07.png differ
diff --git a/data/screenshots/08.png b/data/screenshots/08.png
new file mode 100644
index 0000000..be3e8fe
Binary files /dev/null and b/data/screenshots/08.png differ
diff --git a/data/screenshots/09.png b/data/screenshots/09.png
new file mode 100644
index 0000000..65de02e
Binary files /dev/null and b/data/screenshots/09.png differ
diff --git a/data/screenshots/10.png b/data/screenshots/10.png
new file mode 100644
index 0000000..4ee82d6
Binary files /dev/null and b/data/screenshots/10.png differ
diff --git a/data/screenshots/11.png b/data/screenshots/11.png
new file mode 100644
index 0000000..b524fef
Binary files /dev/null and b/data/screenshots/11.png differ
diff --git a/data/screenshots/12.png b/data/screenshots/12.png
new file mode 100644
index 0000000..6877f9c
Binary files /dev/null and b/data/screenshots/12.png differ
diff --git a/data/screenshots/13.png b/data/screenshots/13.png
new file mode 100644
index 0000000..0112d71
Binary files /dev/null and b/data/screenshots/13.png differ
diff --git a/data/screenshots/14.png b/data/screenshots/14.png
new file mode 100644
index 0000000..146571b
Binary files /dev/null and b/data/screenshots/14.png differ
diff --git a/data/screenshots/15.png b/data/screenshots/15.png
new file mode 100644
index 0000000..c74a499
Binary files /dev/null and b/data/screenshots/15.png differ
diff --git a/data/screenshots/16.png b/data/screenshots/16.png
new file mode 100644
index 0000000..8a8cd1b
Binary files /dev/null and b/data/screenshots/16.png differ
diff --git a/outlay-gtk/data/com.outlay.app.desktop b/outlay-gtk/data/com.outlay.app.desktop
new file mode 100644
index 0000000..9e0d8d8
--- /dev/null
+++ b/outlay-gtk/data/com.outlay.app.desktop
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Name=Outlay
+Comment=Personal income and expense tracker with budgets, charts, and multi-currency support
+Exec=outlay-gtk
+Icon=com.outlay.app
+Terminal=false
+Type=Application
+Categories=Office;Finance;GTK;
+Keywords=expense;budget;money;finance;income;tracker;currency;receipt;
+StartupNotify=true
+SingleMainWindow=true
diff --git a/outlay-gtk/data/com.outlay.app.gschema.xml b/outlay-gtk/data/com.outlay.app.gschema.xml
new file mode 100644
index 0000000..2c159ba
--- /dev/null
+++ b/outlay-gtk/data/com.outlay.app.gschema.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ 900
+ Window width
+ The width of the main application window.
+
+
+ 600
+ Window height
+ The height of the main application window.
+
+
+ false
+ Window maximized
+ Whether the main application window is maximized.
+
+
+
diff --git a/outlay-gtk/data/com.outlay.app.metainfo.xml b/outlay-gtk/data/com.outlay.app.metainfo.xml
new file mode 100644
index 0000000..b38e008
--- /dev/null
+++ b/outlay-gtk/data/com.outlay.app.metainfo.xml
@@ -0,0 +1,196 @@
+
+
+ com.outlay.app
+ CC0-1.0
+ CC0-1.0
+
+ Outlay
+ Personal income and expense tracker with budgets, charts, and multi-currency support
+
+
+
+ Outlay is a native GTK4/libadwaita personal finance application for
+ tracking income and expenses, managing budgets, and visualizing spending
+ patterns. It stores everything locally in SQLite with no cloud dependency.
+
+ Key features:
+
+ Log expenses and income with category tagging and notes
+ Multi-currency support with live exchange rate conversion
+ Category-based budgets with threshold alerts and sparkline trends
+ Recurring transactions with flexible scheduling (daily, weekly, monthly, yearly)
+ Subscription tracking with pause, resume, and cost overview
+ Interactive charts: donut breakdown, monthly bars, and smooth net trend lines
+ Calendar heatmap view of daily spending
+ Financial forecasting based on historical patterns
+ Savings goals with progress tracking
+ Credit card balance and payment tracking
+ Wishlist with priority ranking and affordability estimates
+ Spending anomaly detection and monthly insights
+ Natural language transaction input
+ Receipt OCR for automatic amount extraction
+ Export to CSV, JSON, PDF, OFX, and QIF formats
+ Import from CSV, JSON, OFX, QIF, and PDF bank statements
+ Automatic and manual backup with restore
+ System tray with quick-add actions
+ Bill reminders and budget threshold notifications
+ Achievement system for building financial habits
+ Split transactions across multiple categories
+ Transaction templates for frequent entries
+
+
+
+ com.outlay.app
+
+ com.outlay.app.desktop
+
+
+ Outlay Contributors
+
+
+ https://git.lashman.live/lashman/outlay
+ https://git.lashman.live/lashman/outlay/issues
+ https://git.lashman.live/lashman/outlay
+ https://ko-fi.com/lashman
+ https://git.lashman.live/lashman/outlay/issues
+ https://git.lashman.live/lashman/outlay
+
+ lashman@robotbrush.com
+
+
+
+ Log view with numpad calculator for quick expense entry
+ https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/01.png
+
+
+ Transaction history with search, category filters, and daily totals
+ https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/02.png
+
+
+ Charts with donut category breakdown and monthly income vs expenses
+ https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/03.png
+
+
+ Budget tracking with sparkline trends, spending pace, and insights
+ https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/04.png
+
+
+ Savings goals with progress bars and monthly contribution targets
+ https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/05.png
+
+
+ Cash flow forecast with projected monthly balances
+ https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/06.png
+
+
+ Recurring transactions with next due dates and amounts
+ https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/07.png
+
+
+ Subscription management with monthly and yearly cost overview
+ https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/08.png
+
+
+ Wishlist with wanted items, prices, and purchase tracking
+ https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/09.png
+
+
+ Credit card tracking with balances, utilization, and payment details
+ https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/10.png
+
+
+ Insights with streaks, achievements, and monthly spending recap
+ https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/11.png
+
+
+ Settings for currency, appearance, and budget notifications
+ https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/12.png
+
+
+ Category management, auto-categorization rules, and transaction templates
+ https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/13.png
+
+
+ Export and import in CSV, JSON, QIF, OFX, and PDF formats
+ https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/14.png
+
+
+ Backup and restore with automatic scheduled backups
+ https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/15.png
+
+
+ Quick Add popup for fast expense logging from the system tray
+ https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/16.png
+
+
+
+
+ #62a0ea
+ #1a5fb4
+
+
+
+ Office
+ Finance
+ GTK
+
+
+
+ Expense
+ Income
+ Budget
+ Finance
+ Money
+ Currency
+ Receipt
+ Tracker
+ Chart
+ Subscription
+
+
+
+ mild
+
+
+
+ 360
+
+
+
+ keyboard
+ pointing
+
+
+
+ first-run
+
+
+
+ outlay-gtk
+
+
+ com.outlay.app
+
+
+
+
+ Initial release of Outlay with core features:
+
+ Expense and income logging with multi-currency support
+ Category-based budgets with alerts and sparkline trends
+ Recurring transactions and subscription management
+ Interactive donut, bar, and net trend charts
+ Calendar heatmap, forecast, goals, and wishlist views
+ Credit card tracking with payment schedules
+ Natural language input and receipt OCR
+ Export to CSV, JSON, PDF, OFX, and QIF
+ Import from CSV, JSON, OFX, QIF, and PDF statements
+ Spending anomaly detection and monthly insights
+ System tray integration with quick-add actions
+ Automatic backup scheduling and restore
+ Achievement system for financial habit building
+
+
+
+
+
diff --git a/outlay-gtk/data/icons/app-icon-preview.html b/outlay-gtk/data/icons/app-icon-preview.html
deleted file mode 100644
index 3f96337..0000000
--- a/outlay-gtk/data/icons/app-icon-preview.html
+++ /dev/null
@@ -1,69 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/outlay-gtk/data/icons/com.outlay.Outlay-192.png b/outlay-gtk/data/icons/com.outlay.Outlay-192.png
deleted file mode 100644
index 10cbe7e..0000000
Binary files a/outlay-gtk/data/icons/com.outlay.Outlay-192.png and /dev/null differ
diff --git a/outlay-gtk/data/icons/com.outlay.Outlay-512-shadow.png b/outlay-gtk/data/icons/com.outlay.Outlay-512-shadow.png
deleted file mode 100644
index 4b0b117..0000000
Binary files a/outlay-gtk/data/icons/com.outlay.Outlay-512-shadow.png and /dev/null differ
diff --git a/outlay-gtk/data/icons/com.outlay.Outlay.ico b/outlay-gtk/data/icons/com.outlay.Outlay.ico
deleted file mode 100644
index 1ccbb9e..0000000
Binary files a/outlay-gtk/data/icons/com.outlay.Outlay.ico and /dev/null differ
diff --git a/outlay-gtk/data/icons/hicolor/128x128/apps/com.outlay.Outlay.png b/outlay-gtk/data/icons/hicolor/128x128/apps/com.outlay.Outlay.png
deleted file mode 100644
index fc9d765..0000000
Binary files a/outlay-gtk/data/icons/hicolor/128x128/apps/com.outlay.Outlay.png and /dev/null differ
diff --git a/outlay-gtk/data/icons/com.outlay.Outlay-128.png b/outlay-gtk/data/icons/hicolor/128x128/apps/com.outlay.app.png
similarity index 100%
rename from outlay-gtk/data/icons/com.outlay.Outlay-128.png
rename to outlay-gtk/data/icons/hicolor/128x128/apps/com.outlay.app.png
diff --git a/outlay-gtk/data/icons/hicolor/16x16/apps/com.outlay.Outlay.png b/outlay-gtk/data/icons/hicolor/16x16/apps/com.outlay.Outlay.png
deleted file mode 100644
index 42456e5..0000000
Binary files a/outlay-gtk/data/icons/hicolor/16x16/apps/com.outlay.Outlay.png and /dev/null differ
diff --git a/outlay-gtk/data/icons/com.outlay.Outlay-16.png b/outlay-gtk/data/icons/hicolor/16x16/apps/com.outlay.app.png
similarity index 100%
rename from outlay-gtk/data/icons/com.outlay.Outlay-16.png
rename to outlay-gtk/data/icons/hicolor/16x16/apps/com.outlay.app.png
diff --git a/outlay-gtk/data/icons/hicolor/24x24/apps/com.outlay.Outlay.png b/outlay-gtk/data/icons/hicolor/24x24/apps/com.outlay.Outlay.png
deleted file mode 100644
index 62e5fa9..0000000
Binary files a/outlay-gtk/data/icons/hicolor/24x24/apps/com.outlay.Outlay.png and /dev/null differ
diff --git a/outlay-gtk/data/icons/com.outlay.Outlay-24.png b/outlay-gtk/data/icons/hicolor/24x24/apps/com.outlay.app.png
similarity index 100%
rename from outlay-gtk/data/icons/com.outlay.Outlay-24.png
rename to outlay-gtk/data/icons/hicolor/24x24/apps/com.outlay.app.png
diff --git a/outlay-gtk/data/icons/hicolor/256x256/apps/com.outlay.Outlay.png b/outlay-gtk/data/icons/hicolor/256x256/apps/com.outlay.Outlay.png
deleted file mode 100644
index 4822331..0000000
Binary files a/outlay-gtk/data/icons/hicolor/256x256/apps/com.outlay.Outlay.png and /dev/null differ
diff --git a/outlay-gtk/data/icons/com.outlay.Outlay-256.png b/outlay-gtk/data/icons/hicolor/256x256/apps/com.outlay.app.png
similarity index 100%
rename from outlay-gtk/data/icons/com.outlay.Outlay-256.png
rename to outlay-gtk/data/icons/hicolor/256x256/apps/com.outlay.app.png
diff --git a/outlay-gtk/data/icons/hicolor/32x32/apps/com.outlay.Outlay.png b/outlay-gtk/data/icons/hicolor/32x32/apps/com.outlay.Outlay.png
deleted file mode 100644
index 0c493f7..0000000
Binary files a/outlay-gtk/data/icons/hicolor/32x32/apps/com.outlay.Outlay.png and /dev/null differ
diff --git a/outlay-gtk/data/icons/com.outlay.Outlay-32.png b/outlay-gtk/data/icons/hicolor/32x32/apps/com.outlay.app.png
similarity index 100%
rename from outlay-gtk/data/icons/com.outlay.Outlay-32.png
rename to outlay-gtk/data/icons/hicolor/32x32/apps/com.outlay.app.png
diff --git a/outlay-gtk/data/icons/hicolor/48x48/apps/com.outlay.Outlay.png b/outlay-gtk/data/icons/hicolor/48x48/apps/com.outlay.Outlay.png
deleted file mode 100644
index 01b598f..0000000
Binary files a/outlay-gtk/data/icons/hicolor/48x48/apps/com.outlay.Outlay.png and /dev/null differ
diff --git a/outlay-gtk/data/icons/com.outlay.Outlay-48.png b/outlay-gtk/data/icons/hicolor/48x48/apps/com.outlay.app.png
similarity index 100%
rename from outlay-gtk/data/icons/com.outlay.Outlay-48.png
rename to outlay-gtk/data/icons/hicolor/48x48/apps/com.outlay.app.png
diff --git a/outlay-gtk/data/icons/hicolor/512x512/apps/com.outlay.Outlay.png b/outlay-gtk/data/icons/hicolor/512x512/apps/com.outlay.Outlay.png
deleted file mode 100644
index 93acdba..0000000
Binary files a/outlay-gtk/data/icons/hicolor/512x512/apps/com.outlay.Outlay.png and /dev/null differ
diff --git a/outlay-gtk/data/icons/com.outlay.Outlay-512.png b/outlay-gtk/data/icons/hicolor/512x512/apps/com.outlay.app.png
similarity index 100%
rename from outlay-gtk/data/icons/com.outlay.Outlay-512.png
rename to outlay-gtk/data/icons/hicolor/512x512/apps/com.outlay.app.png
diff --git a/outlay-gtk/data/icons/hicolor/64x64/apps/com.outlay.Outlay.png b/outlay-gtk/data/icons/hicolor/64x64/apps/com.outlay.Outlay.png
deleted file mode 100644
index 742f82a..0000000
Binary files a/outlay-gtk/data/icons/hicolor/64x64/apps/com.outlay.Outlay.png and /dev/null differ
diff --git a/outlay-gtk/data/icons/com.outlay.Outlay-64.png b/outlay-gtk/data/icons/hicolor/64x64/apps/com.outlay.app.png
similarity index 100%
rename from outlay-gtk/data/icons/com.outlay.Outlay-64.png
rename to outlay-gtk/data/icons/hicolor/64x64/apps/com.outlay.app.png
diff --git a/outlay-gtk/data/icons/hicolor/96x96/apps/com.outlay.Outlay.png b/outlay-gtk/data/icons/hicolor/96x96/apps/com.outlay.Outlay.png
deleted file mode 100644
index c02d0b3..0000000
Binary files a/outlay-gtk/data/icons/hicolor/96x96/apps/com.outlay.Outlay.png and /dev/null differ
diff --git a/outlay-gtk/data/icons/com.outlay.Outlay-96.png b/outlay-gtk/data/icons/hicolor/96x96/apps/com.outlay.app.png
similarity index 100%
rename from outlay-gtk/data/icons/com.outlay.Outlay-96.png
rename to outlay-gtk/data/icons/hicolor/96x96/apps/com.outlay.app.png
diff --git a/outlay-gtk/data/icons/hicolor/scalable/apps/io.github.outlay.svg b/outlay-gtk/data/icons/hicolor/scalable/apps/io.github.outlay.svg
deleted file mode 100644
index 17953ba..0000000
--- a/outlay-gtk/data/icons/hicolor/scalable/apps/io.github.outlay.svg
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- $
-
-
-
diff --git a/outlay-gtk/data/icons/tray-icon-32x32.argb b/outlay-gtk/data/icons/tray-icon-32x32.argb
new file mode 100644
index 0000000..5624bc4
Binary files /dev/null and b/outlay-gtk/data/icons/tray-icon-32x32.argb differ
diff --git a/outlay-gtk/data/icons/tray-icon-48x48.argb b/outlay-gtk/data/icons/tray-icon-48x48.argb
new file mode 100644
index 0000000..9256e9c
Binary files /dev/null and b/outlay-gtk/data/icons/tray-icon-48x48.argb differ
diff --git a/outlay-gtk/data/icons/web/apple-touch-icon.png b/outlay-gtk/data/icons/web/apple-touch-icon.png
deleted file mode 100644
index 0c03847..0000000
Binary files a/outlay-gtk/data/icons/web/apple-touch-icon.png and /dev/null differ
diff --git a/outlay-gtk/data/icons/web/favicon-120x120.png b/outlay-gtk/data/icons/web/favicon-120x120.png
deleted file mode 100644
index 55b8c82..0000000
Binary files a/outlay-gtk/data/icons/web/favicon-120x120.png and /dev/null differ
diff --git a/outlay-gtk/data/icons/web/favicon-144x144.png b/outlay-gtk/data/icons/web/favicon-144x144.png
deleted file mode 100644
index 13f6183..0000000
Binary files a/outlay-gtk/data/icons/web/favicon-144x144.png and /dev/null differ
diff --git a/outlay-gtk/data/icons/web/favicon-152x152.png b/outlay-gtk/data/icons/web/favicon-152x152.png
deleted file mode 100644
index b89e5a7..0000000
Binary files a/outlay-gtk/data/icons/web/favicon-152x152.png and /dev/null differ
diff --git a/outlay-gtk/data/icons/web/favicon-16x16.png b/outlay-gtk/data/icons/web/favicon-16x16.png
deleted file mode 100644
index a3783d9..0000000
Binary files a/outlay-gtk/data/icons/web/favicon-16x16.png and /dev/null differ
diff --git a/outlay-gtk/data/icons/web/favicon-180x180.png b/outlay-gtk/data/icons/web/favicon-180x180.png
deleted file mode 100644
index 0c03847..0000000
Binary files a/outlay-gtk/data/icons/web/favicon-180x180.png and /dev/null differ
diff --git a/outlay-gtk/data/icons/web/favicon-192x192.png b/outlay-gtk/data/icons/web/favicon-192x192.png
deleted file mode 100644
index 787592a..0000000
Binary files a/outlay-gtk/data/icons/web/favicon-192x192.png and /dev/null differ
diff --git a/outlay-gtk/data/icons/web/favicon-32x32.png b/outlay-gtk/data/icons/web/favicon-32x32.png
deleted file mode 100644
index d02520d..0000000
Binary files a/outlay-gtk/data/icons/web/favicon-32x32.png and /dev/null differ
diff --git a/outlay-gtk/data/icons/web/favicon-48x48.png b/outlay-gtk/data/icons/web/favicon-48x48.png
deleted file mode 100644
index 7cc0db4..0000000
Binary files a/outlay-gtk/data/icons/web/favicon-48x48.png and /dev/null differ
diff --git a/outlay-gtk/data/icons/web/favicon-72x72.png b/outlay-gtk/data/icons/web/favicon-72x72.png
deleted file mode 100644
index 6743705..0000000
Binary files a/outlay-gtk/data/icons/web/favicon-72x72.png and /dev/null differ
diff --git a/outlay-gtk/data/icons/web/favicon-96x96.png b/outlay-gtk/data/icons/web/favicon-96x96.png
deleted file mode 100644
index 34aaa23..0000000
Binary files a/outlay-gtk/data/icons/web/favicon-96x96.png and /dev/null differ
diff --git a/outlay-gtk/data/io.github.outlay.desktop b/outlay-gtk/data/io.github.outlay.desktop
deleted file mode 100644
index d3332d1..0000000
--- a/outlay-gtk/data/io.github.outlay.desktop
+++ /dev/null
@@ -1,9 +0,0 @@
-[Desktop Entry]
-Name=Outlay
-Comment=Personal income and expense logger
-Exec=outlay-gtk
-Icon=io.github.outlay
-Terminal=false
-Type=Application
-Categories=Office;Finance;
-Keywords=expense;budget;money;finance;income;
diff --git a/outlay-gtk/data/io.github.outlay.gschema.xml b/outlay-gtk/data/io.github.outlay.gschema.xml
deleted file mode 100644
index 3de6dd9..0000000
--- a/outlay-gtk/data/io.github.outlay.gschema.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
- 900
-
-
- 600
-
-
- false
-
-
-
diff --git a/outlay-gtk/src/log_view.rs b/outlay-gtk/src/log_view.rs
index ee6ceb1..043c60a 100644
--- a/outlay-gtk/src/log_view.rs
+++ b/outlay-gtk/src/log_view.rs
@@ -1634,8 +1634,7 @@ impl LogView {
inner.append(&recent_group);
clamp.set_child(Some(&inner));
- toast_overlay.set_child(Some(&clamp));
- container.append(&toast_overlay);
+ container.append(&clamp);
LogView {
container,
diff --git a/outlay-gtk/src/main.rs b/outlay-gtk/src/main.rs
index afa0d41..154d4ff 100644
--- a/outlay-gtk/src/main.rs
+++ b/outlay-gtk/src/main.rs
@@ -28,7 +28,7 @@ use gtk::glib;
use outlay_core::db::Database;
use std::rc::Rc;
-const APP_ID: &str = "io.github.outlay";
+const APP_ID: &str = "com.outlay.app";
fn main() {
let app = Application::builder()
@@ -100,6 +100,25 @@ fn build_ui(app: &Application) {
load_css();
icon_theme::setup_themed_icons();
+ // Register app icon for the hicolor theme so it works for window + tray
+ {
+ let display = gtk::gdk::Display::default().expect("Could not get display");
+ let theme = gtk::IconTheme::for_display(&display);
+ let exe_path = std::env::current_exe().unwrap_or_default();
+ let exe_dir = exe_path.parent().unwrap_or(std::path::Path::new("."));
+ let candidates = [
+ exe_dir.join("../../outlay-gtk/data/icons"),
+ exe_dir.join("../share/icons"),
+ ];
+ for candidate in &candidates {
+ if candidate.exists() {
+ theme.add_search_path(candidate);
+ break;
+ }
+ }
+ }
+ gtk::Window::set_default_icon_name("com.outlay.app");
+
let data_dir = glib::user_data_dir().join("outlay");
std::fs::create_dir_all(&data_dir).expect("Failed to create data directory");
let db_path = data_dir.join("outlay.db");
diff --git a/outlay-gtk/src/tray.rs b/outlay-gtk/src/tray.rs
index 308db1b..368151a 100644
--- a/outlay-gtk/src/tray.rs
+++ b/outlay-gtk/src/tray.rs
@@ -1,6 +1,5 @@
use ksni::menu::StandardItem;
-use ksni::{Category, ToolTip, Tray, TrayMethods};
-use std::path::PathBuf;
+use ksni::{Category, Icon, ToolTip, Tray, TrayMethods};
use std::sync::mpsc;
pub enum TrayCommand {
@@ -11,9 +10,11 @@ pub enum TrayCommand {
Quit,
}
+static TRAY_ICON_32: &[u8] = include_bytes!("../data/icons/tray-icon-32x32.argb");
+static TRAY_ICON_48: &[u8] = include_bytes!("../data/icons/tray-icon-48x48.argb");
+
struct OutlayTray {
sender: mpsc::Sender,
- icon_theme_path: String,
}
impl Tray for OutlayTray {
@@ -26,11 +27,22 @@ impl Tray for OutlayTray {
}
fn icon_name(&self) -> String {
- "io.github.outlay".into()
+ String::new()
}
- fn icon_theme_path(&self) -> String {
- self.icon_theme_path.clone()
+ fn icon_pixmap(&self) -> Vec {
+ vec![
+ Icon {
+ width: 32,
+ height: 32,
+ data: TRAY_ICON_32.to_vec(),
+ },
+ Icon {
+ width: 48,
+ height: 48,
+ data: TRAY_ICON_48.to_vec(),
+ },
+ ]
}
fn category(&self) -> Category {
@@ -98,34 +110,8 @@ impl Tray for OutlayTray {
}
}
-fn find_icon_theme_path() -> String {
- let exe_path = std::env::current_exe().unwrap_or_default();
- let exe_dir = exe_path.parent().unwrap_or(std::path::Path::new("."));
-
- let candidates = [
- exe_dir.join("../../outlay-gtk/data/icons"),
- exe_dir.join("../share/icons"),
- PathBuf::from("/usr/share/icons"),
- ];
-
- for candidate in &candidates {
- if candidate.exists() {
- if let Ok(resolved) = candidate.canonicalize() {
- return resolved.to_string_lossy().into_owned();
- }
- }
- }
-
- String::new()
-}
-
pub fn spawn_tray(sender: mpsc::Sender) {
- let icon_theme_path = find_icon_theme_path();
-
- let tray = OutlayTray {
- sender,
- icon_theme_path,
- };
+ let tray = OutlayTray { sender };
std::thread::spawn(move || {
let rt = tokio::runtime::Builder::new_current_thread()
diff --git a/outlay-gtk/src/window.rs b/outlay-gtk/src/window.rs
index df988a0..89c4094 100644
--- a/outlay-gtk/src/window.rs
+++ b/outlay-gtk/src/window.rs
@@ -89,7 +89,8 @@ impl MainWindow {
.hscrollbar_policy(gtk::PolicyType::Never)
.child(&log_view.container)
.build();
- content_stack.add_named(&log_scroll, Some("log"));
+ log_view.toast_overlay.set_child(Some(&log_scroll));
+ content_stack.add_named(&log_view.toast_overlay, Some("log"));
// History view
let history_view = HistoryView::new(db.clone());
diff --git a/scripts/build-appimage.sh b/scripts/build-appimage.sh
index b304e91..13c742a 100755
--- a/scripts/build-appimage.sh
+++ b/scripts/build-appimage.sh
@@ -13,7 +13,6 @@ echo "==> Creating AppDir structure..."
rm -rf AppDir
mkdir -p AppDir/usr/bin
mkdir -p AppDir/usr/share/applications
-mkdir -p AppDir/usr/share/icons/hicolor/scalable/apps
mkdir -p AppDir/usr/share/glib-2.0/schemas
mkdir -p AppDir/usr/share/fonts/truetype/liberation
@@ -21,19 +20,29 @@ mkdir -p AppDir/usr/share/fonts/truetype/liberation
cp target/release/outlay-gtk AppDir/usr/bin/
# Copy desktop file
-cp outlay-gtk/data/io.github.outlay.desktop AppDir/
-cp outlay-gtk/data/io.github.outlay.desktop AppDir/usr/share/applications/
+cp outlay-gtk/data/com.outlay.app.desktop AppDir/
+cp outlay-gtk/data/com.outlay.app.desktop AppDir/usr/share/applications/
-# Copy app icon
-cp outlay-gtk/data/icons/hicolor/scalable/apps/io.github.outlay.svg AppDir/usr/share/icons/hicolor/scalable/apps/
+# Copy app icons (all hicolor sizes)
+for size_dir in outlay-gtk/data/icons/hicolor/*/apps; do
+ size=$(basename "$(dirname "$size_dir")")
+ mkdir -p "AppDir/usr/share/icons/hicolor/$size/apps"
+ cp "$size_dir"/com.outlay.app.* "AppDir/usr/share/icons/hicolor/$size/apps/" 2>/dev/null || true
+done
# Copy Tabler action icons
mkdir -p AppDir/usr/share/icons/hicolor/scalable/actions
cp outlay-gtk/data/icons/hicolor/scalable/actions/outlay-*.svg AppDir/usr/share/icons/hicolor/scalable/actions/
cp outlay-gtk/data/icons/hicolor/scalable/actions/tabler-*.svg AppDir/usr/share/icons/hicolor/scalable/actions/
+# Copy metainfo and screenshots
+mkdir -p AppDir/usr/share/metainfo
+cp outlay-gtk/data/com.outlay.app.metainfo.xml AppDir/usr/share/metainfo/
+mkdir -p AppDir/usr/share/screenshots
+cp data/screenshots/*.png AppDir/usr/share/screenshots/
+
# Copy GSettings schema
-cp outlay-gtk/data/io.github.outlay.gschema.xml AppDir/usr/share/glib-2.0/schemas/
+cp outlay-gtk/data/com.outlay.app.gschema.xml AppDir/usr/share/glib-2.0/schemas/
glib-compile-schemas AppDir/usr/share/glib-2.0/schemas/
# Bundle Liberation Sans fonts (needed for PDF report generation)
@@ -102,8 +111,8 @@ export DEPLOY_GTK_VERSION=4
--appdir AppDir \
--plugin gtk \
--output appimage \
- --desktop-file AppDir/io.github.outlay.desktop \
- --icon-file AppDir/usr/share/icons/hicolor/scalable/apps/io.github.outlay.svg
+ --desktop-file AppDir/com.outlay.app.desktop \
+ --icon-file AppDir/usr/share/icons/hicolor/256x256/apps/com.outlay.app.png
echo "==> Done! AppImage created."
ls -lh Outlay-*.AppImage 2>/dev/null || echo "Note: Output filename may vary."