diff --git a/Cargo.lock b/Cargo.lock index be584b0..b4c820e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1462,6 +1462,20 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "embed-resource" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4e24052d7be71f0efb50c201557f6fe7d237cfd5a64fd5bcd7fd8fe32dbbffa" +dependencies = [ + "cc", + "memchr", + "rustc_version", + "toml", + "vswhom", + "winreg", +] + [[package]] name = "endi" version = "1.1.0" @@ -1691,6 +1705,7 @@ dependencies = [ "egui_extras", "egui_file", "egui_logger", + "embed-resource", "env_logger", "futures", "generic-array", @@ -3772,6 +3787,15 @@ dependencies = [ "syn 2.0.79", ] +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + [[package]] name = "serde_yaml" version = "0.9.34+deprecated" @@ -4188,11 +4212,26 @@ dependencies = [ "tokio", ] +[[package]] +name = "toml" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + [[package]] name = "toml_datetime" version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] [[package]] name = "toml_edit" @@ -4201,6 +4240,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ "indexmap 2.6.0", + "serde", + "serde_spanned", "toml_datetime", "winnow", ] @@ -4578,6 +4619,26 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "vswhom" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" +dependencies = [ + "libc", + "vswhom-sys", +] + +[[package]] +name = "vswhom-sys" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3b17ae1f6c8a2b28506cd96d412eebf83b4a0ff2cbefeeb952f2f9dfa44ba18" +dependencies = [ + "cc", + "libc", +] + [[package]] name = "walkdir" version = "2.5.0" @@ -5330,6 +5391,16 @@ dependencies = [ "memchr", ] +[[package]] +name = "winreg" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + [[package]] name = "wintun-bindings" version = "0.6.4" diff --git a/Cargo.toml b/Cargo.toml index f849891..186fe49 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -57,6 +57,9 @@ dirs = "5.0.1" egui_logger = "0.6.1" tray-item = "0.10.0" +[target.'cfg(target_os="windows")'.build-dependencies] +embed-resource = "2.3" + [target.'cfg(target_os="android")'.dependencies] jni = "^0.20" robusta_jni = "0.2.2" diff --git a/build.rs b/build.rs new file mode 100644 index 0000000..1a6c28f --- /dev/null +++ b/build.rs @@ -0,0 +1,5 @@ +extern crate embed_resource; + +fn main() { + embed_resource::compile("tray.rc", embed_resource::NONE); +} \ No newline at end of file diff --git a/icons/off.ico b/icons/off.ico new file mode 100644 index 0000000..bfe6de4 Binary files /dev/null and b/icons/off.ico differ diff --git a/icons/on.ico b/icons/on.ico new file mode 100644 index 0000000..0dfc46a Binary files /dev/null and b/icons/on.ico differ diff --git a/src/gui.rs b/src/gui.rs index df557a2..d695959 100644 --- a/src/gui.rs +++ b/src/gui.rs @@ -4,13 +4,15 @@ use eframe::egui::{self, Context, Frame, Label, ScrollArea, Spacing, Vec2}; use egui_file::FileDialog; use std::{ ffi::OsStr, - path::{Path, PathBuf}, + path::{Path, PathBuf}, sync::mpsc::SyncSender, }; +use std::sync::mpsc; use egui_extras::{Column, TableBuilder}; use log::{info, error}; use crate::config::ClientConfiguration; use log::LevelFilter; use env_logger::Builder; +use tray_item::{IconSource, TrayItem}; mod toggle_switch; mod config; @@ -21,11 +23,42 @@ fn get_configs_dir() -> PathBuf { p } -fn main() -> eframe::Result { +enum Message { + Open, + Buzz +} + +fn main() { egui_logger::builder().max_level(LevelFilter::Error).init().unwrap(); + let mut tray = TrayItem::new( + "Frida VPN", + IconSource::Resource("tray-default"), + ) + .unwrap(); + + let (tx, rx) = mpsc::sync_channel(1); + + let tx_m = tx.clone(); + tray.add_menu_item("Open", move || { + tx_m.send(Message::Open).unwrap(); + }) + .unwrap(); + + loop { + match rx.recv() { + Ok(Message::Open) => { + main_gui(); + } + _ => {} + } + } +} + +fn main_gui() { let options = eframe::NativeOptions { viewport: egui::ViewportBuilder::default().with_inner_size([640.0, 480.0]), + run_and_return: false, ..Default::default() }; let cfgs = std::fs::read_dir(get_configs_dir()).unwrap(); @@ -33,13 +66,15 @@ fn main() -> eframe::Result { for path in cfgs { cv.push(path.unwrap().path()); } + eframe::run_native( "Frida", options, Box::new(|cc| { Ok(Box::new(App::new(cv))) }), - ) + ); + } #[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))] @@ -53,6 +88,7 @@ struct App { screen: AppScreens, configs: Configs, logs: Logs, + close: bool } impl App { @@ -60,13 +96,22 @@ impl App { Self { screen: AppScreens::Configs, configs: Configs::new(cfgs), - logs: Logs::default() + logs: Logs::default(), + close: false } } } impl eframe::App for App { fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { + + if self.close { + let ctx = ctx.clone(); + std::thread::spawn(move || { + ctx.send_viewport_cmd(egui::ViewportCommand::Close); + }); + } + egui::CentralPanel::default().show(ctx, |ui| { ui.horizontal(|ui| { ui.selectable_value(&mut self.screen, AppScreens::Configs, "Configs"); @@ -83,6 +128,10 @@ impl eframe::App for App { } }); } + + fn on_exit(&mut self, _gl: Option<&eframe::glow::Context>) { + self.close = true; + } } struct Logs { diff --git a/tray.rc b/tray.rc new file mode 100644 index 0000000..251473b --- /dev/null +++ b/tray.rc @@ -0,0 +1,3 @@ +cfg-active ICON "icons/on.ico" +cfg-inactive ICON "icons/off.ico" +tray-default ICON "icons/off.ico" \ No newline at end of file