From 52da55009cc3ca09979ad5885686d05426e7b7e3 Mon Sep 17 00:00:00 2001 From: alterdekim Date: Thu, 24 Oct 2024 15:58:15 +0300 Subject: [PATCH] Adding tray icon modified: Cargo.lock modified: Cargo.toml new file: build.rs new file: icons/off.ico new file: icons/on.ico modified: src/gui.rs new file: tray.rc --- Cargo.lock | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 3 +++ build.rs | 5 ++++ icons/off.ico | Bin 0 -> 6336 bytes icons/on.ico | Bin 0 -> 6501 bytes src/gui.rs | 57 +++++++++++++++++++++++++++++++++++++--- tray.rc | 3 +++ 7 files changed, 135 insertions(+), 4 deletions(-) create mode 100644 build.rs create mode 100644 icons/off.ico create mode 100644 icons/on.ico create mode 100644 tray.rc 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 0000000000000000000000000000000000000000..bfe6de40a20528655a6eab977c902adf726497ae GIT binary patch literal 6336 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 literal 0 HcmV?d00001 diff --git a/icons/on.ico b/icons/on.ico new file mode 100644 index 0000000000000000000000000000000000000000..0dfc46a147f4d82b4a16a38517093565e9c40746 GIT binary patch literal 6501 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 literal 0 HcmV?d00001 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