Adding tray icon
Some checks failed
gitea/Frida/pipeline/head There was a failure building this commit
Some checks failed
gitea/Frida/pipeline/head There was a failure building this commit
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
This commit is contained in:
parent
c6ced0b92e
commit
52da55009c
71
Cargo.lock
generated
71
Cargo.lock
generated
@ -1462,6 +1462,20 @@ dependencies = [
|
|||||||
"bytemuck",
|
"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]]
|
[[package]]
|
||||||
name = "endi"
|
name = "endi"
|
||||||
version = "1.1.0"
|
version = "1.1.0"
|
||||||
@ -1691,6 +1705,7 @@ dependencies = [
|
|||||||
"egui_extras",
|
"egui_extras",
|
||||||
"egui_file",
|
"egui_file",
|
||||||
"egui_logger",
|
"egui_logger",
|
||||||
|
"embed-resource",
|
||||||
"env_logger",
|
"env_logger",
|
||||||
"futures",
|
"futures",
|
||||||
"generic-array",
|
"generic-array",
|
||||||
@ -3772,6 +3787,15 @@ dependencies = [
|
|||||||
"syn 2.0.79",
|
"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]]
|
[[package]]
|
||||||
name = "serde_yaml"
|
name = "serde_yaml"
|
||||||
version = "0.9.34+deprecated"
|
version = "0.9.34+deprecated"
|
||||||
@ -4188,11 +4212,26 @@ dependencies = [
|
|||||||
"tokio",
|
"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]]
|
[[package]]
|
||||||
name = "toml_datetime"
|
name = "toml_datetime"
|
||||||
version = "0.6.8"
|
version = "0.6.8"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41"
|
checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41"
|
||||||
|
dependencies = [
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "toml_edit"
|
name = "toml_edit"
|
||||||
@ -4201,6 +4240,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5"
|
checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"indexmap 2.6.0",
|
"indexmap 2.6.0",
|
||||||
|
"serde",
|
||||||
|
"serde_spanned",
|
||||||
"toml_datetime",
|
"toml_datetime",
|
||||||
"winnow",
|
"winnow",
|
||||||
]
|
]
|
||||||
@ -4578,6 +4619,26 @@ version = "0.9.5"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
|
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]]
|
[[package]]
|
||||||
name = "walkdir"
|
name = "walkdir"
|
||||||
version = "2.5.0"
|
version = "2.5.0"
|
||||||
@ -5330,6 +5391,16 @@ dependencies = [
|
|||||||
"memchr",
|
"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]]
|
[[package]]
|
||||||
name = "wintun-bindings"
|
name = "wintun-bindings"
|
||||||
version = "0.6.4"
|
version = "0.6.4"
|
||||||
|
@ -57,6 +57,9 @@ dirs = "5.0.1"
|
|||||||
egui_logger = "0.6.1"
|
egui_logger = "0.6.1"
|
||||||
tray-item = "0.10.0"
|
tray-item = "0.10.0"
|
||||||
|
|
||||||
|
[target.'cfg(target_os="windows")'.build-dependencies]
|
||||||
|
embed-resource = "2.3"
|
||||||
|
|
||||||
[target.'cfg(target_os="android")'.dependencies]
|
[target.'cfg(target_os="android")'.dependencies]
|
||||||
jni = "^0.20"
|
jni = "^0.20"
|
||||||
robusta_jni = "0.2.2"
|
robusta_jni = "0.2.2"
|
||||||
|
5
build.rs
Normal file
5
build.rs
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
extern crate embed_resource;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
embed_resource::compile("tray.rc", embed_resource::NONE);
|
||||||
|
}
|
BIN
icons/off.ico
Normal file
BIN
icons/off.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 6.2 KiB |
BIN
icons/on.ico
Normal file
BIN
icons/on.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 6.3 KiB |
57
src/gui.rs
57
src/gui.rs
@ -4,13 +4,15 @@ use eframe::egui::{self, Context, Frame, Label, ScrollArea, Spacing, Vec2};
|
|||||||
use egui_file::FileDialog;
|
use egui_file::FileDialog;
|
||||||
use std::{
|
use std::{
|
||||||
ffi::OsStr,
|
ffi::OsStr,
|
||||||
path::{Path, PathBuf},
|
path::{Path, PathBuf}, sync::mpsc::SyncSender,
|
||||||
};
|
};
|
||||||
|
use std::sync::mpsc;
|
||||||
use egui_extras::{Column, TableBuilder};
|
use egui_extras::{Column, TableBuilder};
|
||||||
use log::{info, error};
|
use log::{info, error};
|
||||||
use crate::config::ClientConfiguration;
|
use crate::config::ClientConfiguration;
|
||||||
use log::LevelFilter;
|
use log::LevelFilter;
|
||||||
use env_logger::Builder;
|
use env_logger::Builder;
|
||||||
|
use tray_item::{IconSource, TrayItem};
|
||||||
|
|
||||||
mod toggle_switch;
|
mod toggle_switch;
|
||||||
mod config;
|
mod config;
|
||||||
@ -21,11 +23,42 @@ fn get_configs_dir() -> PathBuf {
|
|||||||
p
|
p
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() -> eframe::Result {
|
enum Message {
|
||||||
|
Open,
|
||||||
|
Buzz
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
egui_logger::builder().max_level(LevelFilter::Error).init().unwrap();
|
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 {
|
let options = eframe::NativeOptions {
|
||||||
viewport: egui::ViewportBuilder::default().with_inner_size([640.0, 480.0]),
|
viewport: egui::ViewportBuilder::default().with_inner_size([640.0, 480.0]),
|
||||||
|
run_and_return: false,
|
||||||
..Default::default()
|
..Default::default()
|
||||||
};
|
};
|
||||||
let cfgs = std::fs::read_dir(get_configs_dir()).unwrap();
|
let cfgs = std::fs::read_dir(get_configs_dir()).unwrap();
|
||||||
@ -33,13 +66,15 @@ fn main() -> eframe::Result {
|
|||||||
for path in cfgs {
|
for path in cfgs {
|
||||||
cv.push(path.unwrap().path());
|
cv.push(path.unwrap().path());
|
||||||
}
|
}
|
||||||
|
|
||||||
eframe::run_native(
|
eframe::run_native(
|
||||||
"Frida",
|
"Frida",
|
||||||
options,
|
options,
|
||||||
Box::new(|cc| {
|
Box::new(|cc| {
|
||||||
Ok(Box::new(App::new(cv)))
|
Ok(Box::new(App::new(cv)))
|
||||||
}),
|
}),
|
||||||
)
|
);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
|
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
|
||||||
@ -53,6 +88,7 @@ struct App {
|
|||||||
screen: AppScreens,
|
screen: AppScreens,
|
||||||
configs: Configs,
|
configs: Configs,
|
||||||
logs: Logs,
|
logs: Logs,
|
||||||
|
close: bool
|
||||||
}
|
}
|
||||||
|
|
||||||
impl App {
|
impl App {
|
||||||
@ -60,13 +96,22 @@ impl App {
|
|||||||
Self {
|
Self {
|
||||||
screen: AppScreens::Configs,
|
screen: AppScreens::Configs,
|
||||||
configs: Configs::new(cfgs),
|
configs: Configs::new(cfgs),
|
||||||
logs: Logs::default()
|
logs: Logs::default(),
|
||||||
|
close: false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl eframe::App for App {
|
impl eframe::App for App {
|
||||||
fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
|
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| {
|
egui::CentralPanel::default().show(ctx, |ui| {
|
||||||
ui.horizontal(|ui| {
|
ui.horizontal(|ui| {
|
||||||
ui.selectable_value(&mut self.screen, AppScreens::Configs, "Configs");
|
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 {
|
struct Logs {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user