From f478610b85dc93a30588c80150816d11258df872 Mon Sep 17 00:00:00 2001 From: Irfan Maulana Date: Fri, 17 Jan 2025 15:45:39 +0700 Subject: [PATCH] FIX: Crash in v1.1.0 (#35) --- bun.lockb | Bin 94537 -> 94959 bytes package.json | 3 +- src-tauri/Cargo.lock | 312 ++++++++++++++++++++++- src-tauri/Cargo.toml | 18 +- src-tauri/capabilities/default.json | 3 +- src-tauri/src/app_command.rs | 16 +- src-tauri/src/app_menu.rs | 50 ++-- src-tauri/src/app_win_manager.rs | 7 +- src-tauri/src/constant.rs | 2 +- src-tauri/src/image_compressor/jpeg.rs | 11 +- src-tauri/src/image_compressor/mod.rs | 5 +- src-tauri/src/image_compressor/png.rs | 3 +- src-tauri/src/image_compressor/shared.rs | 1 - src-tauri/src/main.rs | 30 ++- src-tauri/src/screenshot.rs | 6 +- src-tauri/tauri.conf.json | 2 +- src/main/EmptyState.tsx | 2 +- 17 files changed, 410 insertions(+), 61 deletions(-) diff --git a/bun.lockb b/bun.lockb index ff6d35d6b40bd2a71a6b49d88ad8685b441b2a0a..763f9993197d308a178fd63349aa5d9ff9a6c149 100755 GIT binary patch delta 16087 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 Htnc+7q00w@ delta 15717 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 J9wwHh{2v-3nHT^7 diff --git a/package.json b/package.json index 4e670aa..776a339 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "xhotit", "private": true, - "version": "1.1.0", + "version": "1.1.1", "type": "module", "scripts": { "dev": "vite", @@ -16,6 +16,7 @@ "@tauri-apps/api": "~2.2.0", "@tauri-apps/plugin-dialog": "~2.2.0", "@tauri-apps/plugin-fs": "~2.2.0", + "@tauri-apps/plugin-log": "~2.2.0", "@tauri-apps/plugin-opener": "~2.2.4", "@tauri-apps/plugin-upload": "~2.2.1", "@tauri-apps/plugin-window-state": "~2.2.0", diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 868dc74..4e0d112 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -31,6 +31,17 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom 0.2.15", + "once_cell", + "version_check", +] + [[package]] name = "aho-corasick" version = "1.1.3" @@ -61,6 +72,23 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" +[[package]] +name = "android_log-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ecc8056bf6ab9892dcd53216c83d1597487d7dacac16c8df6b877d127df9937" + +[[package]] +name = "android_logger" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b07e8e73d720a1f2e4b6014766e6039fd2e96a4fa44e2a78d0e1fa2ff49826" +dependencies = [ + "android_log-sys", + "env_filter", + "log", +] + [[package]] name = "android_system_properties" version = "0.1.5" @@ -86,6 +114,12 @@ dependencies = [ "objc", ] +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + [[package]] name = "ashpd" version = "0.10.2" @@ -356,6 +390,18 @@ dependencies = [ "serde", ] +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + [[package]] name = "block" version = "0.1.6" @@ -393,6 +439,29 @@ dependencies = [ "piper", ] +[[package]] +name = "borsh" +version = "1.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb65153674e51d3a42c8f27b05b9508cea85edfaade8aa46bc8fc18cecdfef3" +dependencies = [ + "borsh-derive", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "1.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a396e17ad94059c650db3d253bb6e25927f1eb462eede7e7a153bb6e75dce0a7" +dependencies = [ + "once_cell", + "proc-macro-crate 3.2.0", + "proc-macro2", + "quote", + "syn 2.0.95", +] + [[package]] name = "brotli" version = "7.0.0" @@ -420,6 +489,39 @@ version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +[[package]] +name = "byte-unit" +version = "5.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cd29c3c585209b0cbc7309bfe3ed7efd8c84c21b7af29c8bfae908f8777174" +dependencies = [ + "rust_decimal", + "serde", + "utf8-width", +] + +[[package]] +name = "bytecheck" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "bytemuck" version = "1.21.0" @@ -1139,6 +1241,16 @@ dependencies = [ "syn 2.0.95", ] +[[package]] +name = "env_filter" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" +dependencies = [ + "log", + "regex", +] + [[package]] name = "equivalent" version = "1.0.1" @@ -1216,6 +1328,15 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "fern" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4316185f709b23713e41e3195f90edef7fb00c3ed4adc79769cf09cc762a3b29" +dependencies = [ + "log", +] + [[package]] name = "field-offset" version = "0.3.6" @@ -1309,6 +1430,12 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "futf" version = "0.1.5" @@ -1740,6 +1867,9 @@ name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash", +] [[package]] name = "hashbrown" @@ -2434,9 +2564,12 @@ dependencies = [ [[package]] name = "log" -version = "0.4.22" +version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" +dependencies = [ + "value-bag", +] [[package]] name = "mac" @@ -2684,6 +2817,15 @@ dependencies = [ "syn 2.0.95", ] +[[package]] +name = "num_threads" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" +dependencies = [ + "libc", +] + [[package]] name = "objc" version = "0.2.7" @@ -3329,6 +3471,26 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "qoi" version = "0.4.1" @@ -3389,6 +3551,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + [[package]] name = "rand" version = "0.7.3" @@ -3567,6 +3735,15 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +[[package]] +name = "rend" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +dependencies = [ + "bytecheck", +] + [[package]] name = "reqwest" version = "0.12.12" @@ -3639,6 +3816,51 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "rkyv" +version = "0.7.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9008cd6385b9e161d8229e1f6549dd23c3d022f132a2ea37ac3a10ac4935779b" +dependencies = [ + "bitvec", + "bytecheck", + "bytes", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "rust_decimal" +version = "1.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b082d80e3e3cc52b2ed634388d436fe1f4de6af5786cc2de9ba9737527bdf555" +dependencies = [ + "arrayvec", + "borsh", + "bytes", + "num-traits", + "rand 0.8.5", + "rkyv", + "serde", + "serde_json", +] + [[package]] name = "rustc-demangle" version = "0.1.24" @@ -3746,6 +3968,12 @@ dependencies = [ "xcb", ] +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + [[package]] name = "selectors" version = "0.22.0" @@ -3955,6 +4183,12 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + [[package]] name = "siphasher" version = "0.3.11" @@ -4208,6 +4442,12 @@ dependencies = [ "syn 2.0.95", ] +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "target-lexicon" version = "0.12.16" @@ -4216,9 +4456,9 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tauri" -version = "2.2.1" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2133243fd7dc4932bac10ad18d45043e5cdb69e1bbd1df6f57336ad2c372cca" +checksum = "2979ec5ec5a9310b15d1548db3b8de98d8f75abf2b5b00fec9cd5c0553ecc09c" dependencies = [ "anyhow", "bytes", @@ -4387,6 +4627,28 @@ dependencies = [ "uuid", ] +[[package]] +name = "tauri-plugin-log" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eddd784c138c08a43954bc3e735402e6b2b2ee8d8c254a7391f4e77c01273dd5" +dependencies = [ + "android_logger", + "byte-unit", + "cocoa", + "fern", + "log", + "objc", + "serde", + "serde_json", + "serde_repr", + "swift-rs", + "tauri", + "tauri-plugin", + "thiserror 2.0.9", + "time", +] + [[package]] name = "tauri-plugin-opener" version = "2.2.4" @@ -4625,7 +4887,9 @@ checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" dependencies = [ "deranged", "itoa 1.0.14", + "libc", "num-conv", + "num_threads", "powerfmt", "serde", "time-core", @@ -4658,6 +4922,21 @@ dependencies = [ "zerovec", ] +[[package]] +name = "tinyvec" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + [[package]] name = "tokio" version = "1.42.0" @@ -4955,6 +5234,12 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" +[[package]] +name = "utf8-width" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86bd8d4e895da8537e5315b8254664e6b769c4ff3db18321b297a1e7004392e3" + [[package]] name = "utf8_iter" version = "1.0.4" @@ -4977,6 +5262,12 @@ dependencies = [ "serde", ] +[[package]] +name = "value-bag" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ef4c4aa54d5d05a279399bfa921ec387b7aba77caf7a682ae8d86785b8fdad2" + [[package]] name = "version-compare" version = "0.2.0" @@ -5925,6 +6216,15 @@ dependencies = [ "x11-dl", ] +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + [[package]] name = "x11" version = "2.21.0" @@ -5987,7 +6287,7 @@ dependencies = [ [[package]] name = "xhotit" -version = "1.1.0" +version = "1.1.1" dependencies = [ "active-win-pos-rs", "base64 0.22.1", @@ -6000,6 +6300,7 @@ dependencies = [ "jpeg-decoder", "libc", "lodepng", + "log", "mozjpeg-sys", "png", "screenshots", @@ -6009,6 +6310,7 @@ dependencies = [ "tauri-build", "tauri-plugin-dialog", "tauri-plugin-fs", + "tauri-plugin-log", "tauri-plugin-opener", "tauri-plugin-upload", "tauri-plugin-window-state", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 1dcbee5..4d06a8f 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "xhotit" -version = "1.1.0" +version = "1.1.1" description = "Xhot It - Screen Capture" authors = ["Irfan Maulana"] edition = "2021" @@ -18,7 +18,7 @@ edition = "2021" tauri-build = { version = "2.0.5", features = [] } [dependencies] -tauri = { version = "2.2.1", features = [ +tauri = { version = "2.2.2", features = [ "macos-private-api", "protocol-asset", "tray-icon", @@ -31,6 +31,7 @@ tauri-plugin-window-state = "2.2.0" tauri-plugin-fs = "2.2.0" tauri-plugin-upload = "2.2.1" tauri-plugin-dialog = "2.2.0" +tauri-plugin-log = "2.2.0" serde = { version = "1.0.217", features = ["derive"] } serde_json = "1.0.135" @@ -43,7 +44,7 @@ fs_extra = "1.3.0" directories = "6.0.0" chrono = "0.4.39" active-win-pos-rs = "0.9" -image = { version = "0.25", default-features = false, features = [ +image = { version = "0.25.5", default-features = false, features = [ "jpeg", "ico", "png", @@ -55,11 +56,12 @@ image = { version = "0.25", default-features = false, features = [ "hdr", "dds", ] } -png = "0.17" -jpeg-decoder = "0.3" -mozjpeg-sys = { version = "2.2", default-features = false } -libc = "0.2" -lodepng = { version = "3.10", default-features = false } +png = "0.17.16" +jpeg-decoder = "0.3.1" +mozjpeg-sys = { version = "2.2.2", default-features = false } +libc = "0.2.169" +lodepng = { version = "3.10.7", default-features = false } +log = "0.4.25" # [target."cfg(not(target_os = \"windows\"))".dependencies] fix-path-env = { git = "https://github.com/tauri-apps/fix-path-env-rs" } diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json index 9dd2a9d..f4790e7 100644 --- a/src-tauri/capabilities/default.json +++ b/src-tauri/capabilities/default.json @@ -25,6 +25,7 @@ "dialog:allow-confirm", "dialog:allow-message", "dialog:allow-open", - "dialog:allow-save" + "dialog:allow-save", + "log:allow-log" ] } diff --git a/src-tauri/src/app_command.rs b/src-tauri/src/app_command.rs index 09b121b..345e6e8 100644 --- a/src-tauri/src/app_command.rs +++ b/src-tauri/src/app_command.rs @@ -2,9 +2,13 @@ use std::{path::PathBuf, process::Command as ProcessCommand}; use tauri::{command, AppHandle, Emitter, Manager}; use crate::{ - app_directory::{get_app_directory, list_images_in_directory_sorted}, app_win_manager::{reopen_main_window, toggle_compress_window, toggle_overlay_window}, constant::{APP_DOWNLOAD_DIR, ON_SCREENSHOT_EVENT}, image_compressor::{jpeg::process_jpeg, png::process_png, shared::ImageParams}, screenshot::{ + app_directory::{get_app_directory, list_images_in_directory_sorted}, + app_win_manager::{reopen_main_window, toggle_compress_window, toggle_overlay_window}, + constant::{APP_DOWNLOAD_DIR, ON_SCREENSHOT_EVENT}, + image_compressor::{jpeg::process_jpeg, png::process_png, shared::ImageParams}, + screenshot::{ capture_monitor, capture_screen, capture_window, get_screenshot_path, SelectionCoords, - } + }, }; /** @@ -119,7 +123,13 @@ pub fn open_compress(app_handle: AppHandle) { #[command] pub fn exec_compress(app_handle: AppHandle, image: ImageParams) { if image.name.to_lowercase().contains(".png") { - process_png(app_handle, &image.src, image.quality, image.overwrite, image.filter) + process_png( + app_handle, + &image.src, + image.quality, + image.overwrite, + image.filter, + ) } else if image.name.to_lowercase().contains(".jpg") || image.name.to_lowercase().contains(".jpeg") { diff --git a/src-tauri/src/app_menu.rs b/src-tauri/src/app_menu.rs index 699fc3b..2cd1a9d 100644 --- a/src-tauri/src/app_menu.rs +++ b/src-tauri/src/app_menu.rs @@ -1,14 +1,11 @@ use tauri::{ image::Image, menu::{IconMenuItem, MenuBuilder, MenuItem}, - App, Manager, Theme, Wry, + App, Wry, }; -use crate::constant::WINDOW_MAIN_ID; - pub fn get_menu_builder(app: &mut App) -> MenuBuilder<'_, Wry, App> { let capture_area_icon = Image::from_path("./icons/menu/viewfinder-circle.png"); - let capture_area_icon_light = Image::from_path("./icons/menu/viewfinder-circle-light.png"); let capture_area_i = IconMenuItem::with_id( app, @@ -21,7 +18,6 @@ pub fn get_menu_builder(app: &mut App) -> MenuBuilder<'_, Wry, App> { .unwrap(); let capture_active_icon = Image::from_path("./icons/menu/camera.png"); - let capture_active_icon_light = Image::from_path("./icons/menu/camera-light.png"); let capture_active_i = IconMenuItem::with_id( app, "capture_active", @@ -33,7 +29,6 @@ pub fn get_menu_builder(app: &mut App) -> MenuBuilder<'_, Wry, App> { .unwrap(); let capture_screen_icon = Image::from_path("./icons/menu/computer-desktop.png"); - let capture_screen_icon_light = Image::from_path("./icons/menu/computer-desktop-light.png"); let capture_screen_i = IconMenuItem::with_id( app, "capture_screen", @@ -45,7 +40,6 @@ pub fn get_menu_builder(app: &mut App) -> MenuBuilder<'_, Wry, App> { .unwrap(); let compress_icon = Image::from_path("./icons/menu/bolt.png"); - let compress_icon_light = Image::from_path("./icons/menu/bolt-light.png"); let compress_i = IconMenuItem::with_id( app, "compress_image", @@ -66,19 +60,6 @@ pub fn get_menu_builder(app: &mut App) -> MenuBuilder<'_, Wry, App> { let quit_i = MenuItem::with_id(app, "quit", "Quit", true, Some("CmdOrCtrl+Q")).unwrap(); - let win = app.get_webview_window(WINDOW_MAIN_ID); - if let Some(win) = win { - let t = win.theme().ok().unwrap(); - - // Set different icon for light theme - if t == Theme::Light { - capture_area_i.set_icon(Some(capture_area_icon_light.unwrap())).unwrap(); - capture_active_i.set_icon(Some(capture_active_icon_light.unwrap())).unwrap(); - capture_screen_i.set_icon(Some(capture_screen_icon_light.unwrap())).unwrap(); - compress_i.set_icon(Some(compress_icon_light.unwrap())).unwrap(); - } - } - return MenuBuilder::new(app) .items(&[ &capture_area_i, @@ -89,3 +70,32 @@ pub fn get_menu_builder(app: &mut App) -> MenuBuilder<'_, Wry, App> { .separator() .items(&[&reopen_i, &report_bug_i, &donate_i, &quit_i]); } + +// pub fn switch_menu_icon(app: App) { +// let win = app.get_webview_window(WINDOW_MAIN_ID); +// if let Some(win) = win { +// let t = win.theme().ok().unwrap(); + +// // Set different icon for light theme +// if t == Theme::Light { +// let capture_area_icon_light = +// Image::from_path("./icons/menu/viewfinder-circle-light.png"); +// let capture_active_icon_light = Image::from_path("./icons/menu/camera-light.png"); +// let compress_icon_light = Image::from_path("./icons/menu/bolt-light.png"); +// let capture_screen_icon_light = +// Image::from_path("./icons/menu/computer-desktop-light.png"); +// capture_area_i +// .set_icon(Some(capture_area_icon_light.unwrap())) +// .unwrap(); +// capture_active_i +// .set_icon(Some(capture_active_icon_light.unwrap())) +// .unwrap(); +// capture_screen_i +// .set_icon(Some(capture_screen_icon_light.unwrap())) +// .unwrap(); +// compress_i +// .set_icon(Some(compress_icon_light.unwrap())) +// .unwrap(); +// } +// } +// } diff --git a/src-tauri/src/app_win_manager.rs b/src-tauri/src/app_win_manager.rs index b73dce2..3eeba4a 100644 --- a/src-tauri/src/app_win_manager.rs +++ b/src-tauri/src/app_win_manager.rs @@ -76,7 +76,12 @@ pub fn create_compress_window(app: &AppHandle) { WebviewUrl::App(web_view_url.into()), ); - let win = win_builder.resizable(true).title("Xhot It - Compress Image").center().min_inner_size(600.0, 400.0).build().unwrap(); + let win = win_builder + .resizable(true) + .title("Xhot It - Compress Image") + .center() + .build() + .unwrap(); win.show().unwrap(); diff --git a/src-tauri/src/constant.rs b/src-tauri/src/constant.rs index ff900bc..75336d9 100644 --- a/src-tauri/src/constant.rs +++ b/src-tauri/src/constant.rs @@ -10,4 +10,4 @@ pub const APP_DOWNLOAD_DIR: &str = "xhotit-screenshots"; // Window IDs pub const WINDOW_MAIN_ID: &str = "main"; pub const WINDOW_OVERLAY_ID: &str = "overlay"; -pub const WINDOW_COMPRESS_ID: &str = "compress"; \ No newline at end of file +pub const WINDOW_COMPRESS_ID: &str = "compress"; diff --git a/src-tauri/src/image_compressor/jpeg.rs b/src-tauri/src/image_compressor/jpeg.rs index 29c9b18..feebfbe 100644 --- a/src-tauri/src/image_compressor/jpeg.rs +++ b/src-tauri/src/image_compressor/jpeg.rs @@ -192,7 +192,6 @@ unsafe fn encode_jpeg(buffer: &[u8], width: u32, height: u32, quality: i32, dest // (width, height) // } - pub fn get_dest_path_jpg(path_str: &str, overwrite: bool) -> String { if !path_str.contains(".min") && !overwrite { return replace_jpg_ext(path_str); @@ -203,12 +202,12 @@ pub fn get_dest_path_jpg(path_str: &str, overwrite: bool) -> String { fn replace_jpg_ext(path_str: &str) -> String { let res = &path_str - .replace(".jpg", ".min.jpg") - .replace(".JPG", ".min.jpg") - .replace(".jpeg", ".min.jpeg") - .replace(".JPEG", ".min.jpeg"); + .replace(".jpg", ".min.jpg") + .replace(".JPG", ".min.jpg") + .replace(".jpeg", ".min.jpeg") + .replace(".JPEG", ".min.jpeg"); let str = String::from(res); return str; -} \ No newline at end of file +} diff --git a/src-tauri/src/image_compressor/mod.rs b/src-tauri/src/image_compressor/mod.rs index 4acb7e5..80b43ef 100644 --- a/src-tauri/src/image_compressor/mod.rs +++ b/src-tauri/src/image_compressor/mod.rs @@ -1,4 +1,3 @@ - -pub mod shared; pub mod jpeg; -pub mod png; \ No newline at end of file +pub mod png; +pub mod shared; diff --git a/src-tauri/src/image_compressor/png.rs b/src-tauri/src/image_compressor/png.rs index 48ca0a9..6a86217 100644 --- a/src-tauri/src/image_compressor/png.rs +++ b/src-tauri/src/image_compressor/png.rs @@ -81,7 +81,6 @@ pub fn process_png(app_handle: AppHandle, path_str: &str, q: i32, overwrite: boo } } - pub fn get_dest_path_png(path_str: &str, overwrite: bool) -> String { if !path_str.contains(".min") && !overwrite { return replace_png_ext(path_str); @@ -98,4 +97,4 @@ fn replace_png_ext(path_str: &str) -> String { let str = String::from(res); return str; -} \ No newline at end of file +} diff --git a/src-tauri/src/image_compressor/shared.rs b/src-tauri/src/image_compressor/shared.rs index 4fcdccf..21737d8 100644 --- a/src-tauri/src/image_compressor/shared.rs +++ b/src-tauri/src/image_compressor/shared.rs @@ -38,4 +38,3 @@ pub struct DecoderParam { pub overwrite: bool, pub filter: String, } - diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index d7511de..67a3caa 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -3,8 +3,8 @@ mod app_command; mod app_directory; -mod app_win_manager; mod app_menu; +mod app_win_manager; mod constant; mod image_compressor; mod screenshot; @@ -19,10 +19,22 @@ use app_win_manager::{reopen_main_window, toggle_compress_window, toggle_overlay use screenshot::{capture_monitor, capture_window}; use fix_path_env::fix; +use std::backtrace; +use std::io::Write; use tauri::tray::TrayIconBuilder; use tauri_plugin_opener::OpenerExt; fn main() { + std::panic::set_hook(Box::new(|info| { + let backtrace = backtrace::Backtrace::force_capture(); + println!("panic occurred: {:?}", info); + + let _ = std::fs::File::create("xhotit_panic.log") + .and_then(|mut f| f.write_all(format!("{:?}\n{:#?}", info, backtrace).as_bytes())); + + std::process::exit(1); + })); + // Based on issue: https://github.com/tauri-apps/tauri/issues/7063 // https://github.com/tauri-apps/fix-path-env-rs // #[cfg(not(target_os="windows"))] @@ -31,6 +43,18 @@ fn main() { } tauri::Builder::default() + .plugin( + tauri_plugin_log::Builder::new() + .level(log::LevelFilter::Warn) + .target(tauri_plugin_log::Target::new( + tauri_plugin_log::TargetKind::LogDir { + file_name: Some("logs".to_string()), + }, + )) + .timezone_strategy(tauri_plugin_log::TimezoneStrategy::UseLocal) + .rotation_strategy(tauri_plugin_log::RotationStrategy::KeepAll) + .build(), + ) .plugin(tauri_plugin_opener::init()) .plugin(tauri_plugin_dialog::init()) .plugin(tauri_plugin_upload::init()) @@ -42,7 +66,7 @@ fn main() { let mb = get_menu_builder(app).build()?; - let _tray = TrayIconBuilder::new() + let _tray = TrayIconBuilder::with_id("xhotit-tray") .icon(app.default_window_icon().unwrap().clone()) .menu(&mb) .on_menu_event(|app, event| match event.id.as_ref() { @@ -93,5 +117,5 @@ fn main() { exec_compress, ]) .run(tauri::generate_context!()) - .expect("ERROR: error while running tauri application"); + .expect("ERROR: error while running Xhot It"); } diff --git a/src-tauri/src/screenshot.rs b/src-tauri/src/screenshot.rs index 778280c..538818f 100644 --- a/src-tauri/src/screenshot.rs +++ b/src-tauri/src/screenshot.rs @@ -7,10 +7,10 @@ use tauri::{AppHandle, Emitter}; use crate::{ app_directory::get_app_directory, + app_win_manager::open_main_window, constant::{ APP_DOWNLOAD_DIR, ON_CAPTURE_MONITOR_EVENT, ON_GET_ACTIVE_WINDOW_EVENT, ON_SCREENSHOT_EVENT, }, - app_win_manager::open_main_window, }; // TODO: Migrate to XCap: https://github.com/nashaofu/xcap @@ -120,9 +120,7 @@ pub fn capture_monitor(app_handle: &AppHandle) { let screenshot_path = get_screenshot_path(&app_handle); let screen = Screen::from_point(0, 0).unwrap(); - let image = screen - .capture() - .unwrap(); + let image = screen.capture().unwrap(); image.save(&screenshot_path).unwrap(); diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 926d177..59eae04 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "Xhot It", - "version": "1.1.0", + "version": "1.1.1", "identifier": "com.xhotit.app", "build": { "beforeDevCommand": "bun run dev", diff --git a/src/main/EmptyState.tsx b/src/main/EmptyState.tsx index 9050afb..4865bd3 100644 --- a/src/main/EmptyState.tsx +++ b/src/main/EmptyState.tsx @@ -107,7 +107,7 @@ export function EmptyState({

Version:{' '} - {'1.1.0'} + {'1.1.1'}

);