diff --git a/apps/yaak-proxy/components/ExchangesTable.tsx b/apps/yaak-proxy/components/ExchangesTable.tsx
index d24b3a83..2124f8d8 100644
--- a/apps/yaak-proxy/components/ExchangesTable.tsx
+++ b/apps/yaak-proxy/components/ExchangesTable.tsx
@@ -22,30 +22,34 @@ export function ExchangesTable({ exchanges, style, className }: Props) {
}
return (
-
+
Yaak Proxy
-
- {isRunning ? 'Running on :9090' : 'Stopped'}
-
{isRunning ? (
-
+ <>
+
Running :9090
+
+ >
) : (
)}
diff --git a/apps/yaak-proxy/font-size.ts b/apps/yaak-proxy/font-size.ts
new file mode 100644
index 00000000..5272e52a
--- /dev/null
+++ b/apps/yaak-proxy/font-size.ts
@@ -0,0 +1,2 @@
+// Hardcode font size for now. In the future, this could be configurable.
+document.documentElement.style.fontSize = '15px';
diff --git a/apps/yaak-proxy/index.html b/apps/yaak-proxy/index.html
index c94dd2ab..60d85901 100644
--- a/apps/yaak-proxy/index.html
+++ b/apps/yaak-proxy/index.html
@@ -21,6 +21,7 @@
+
diff --git a/crates-tauri/yaak-app-proxy/src/lib.rs b/crates-tauri/yaak-app-proxy/src/lib.rs
index 0055681e..6cd23350 100644
--- a/crates-tauri/yaak-app-proxy/src/lib.rs
+++ b/crates-tauri/yaak-app-proxy/src/lib.rs
@@ -1,9 +1,53 @@
-use log::error;
-use tauri::{Emitter, Manager, RunEvent, State};
+use log::{error, info, warn};
+use tauri::{Emitter, Manager, RunEvent, State, WebviewWindow};
+use tauri::Runtime;
use yaak_proxy_lib::ProxyCtx;
use yaak_rpc::{RpcEventEmitter, RpcRouter};
use yaak_window::window::CreateWindowConfig;
+mod window_menu;
+
+fn setup_window_menu
(win: &WebviewWindow) {
+ #[allow(unused_variables)]
+ let menu = match window_menu::app_menu(win.app_handle()) {
+ Ok(m) => m,
+ Err(e) => {
+ warn!("Failed to create menu: {e:?}");
+ return;
+ }
+ };
+
+ // This causes the window to not be clickable (in AppImage), so disable on Linux
+ #[cfg(not(target_os = "linux"))]
+ win.app_handle().set_menu(menu).expect("Failed to set app menu");
+
+ let webview_window = win.clone();
+ win.on_menu_event(move |w, event| {
+ if !w.is_focused().unwrap() {
+ return;
+ }
+
+ let event_id = event.id().0.as_str();
+ match event_id {
+ "hacked_quit" => {
+ w.webview_windows().iter().for_each(|(_, w)| {
+ info!("Closing window {}", w.label());
+ let _ = w.close();
+ });
+ }
+ "dev.refresh" => webview_window.eval("location.reload()").unwrap(),
+ "dev.toggle_devtools" => {
+ if webview_window.is_devtools_open() {
+ webview_window.close_devtools();
+ } else {
+ webview_window.open_devtools();
+ }
+ }
+ _ => {}
+ }
+ });
+}
+
#[tauri::command]
fn rpc(
router: State<'_, RpcRouter>,
@@ -52,8 +96,9 @@ pub fn run() {
hide_titlebar: true,
..Default::default()
};
- if let Err(e) = yaak_window::window::create_window(app_handle, config) {
- error!("Failed to create proxy window: {e:?}");
+ match yaak_window::window::create_window(app_handle, config) {
+ Ok(win) => setup_window_menu(&win),
+ Err(e) => error!("Failed to create proxy window: {e:?}"),
}
}
});
diff --git a/crates-tauri/yaak-app-proxy/src/window_menu.rs b/crates-tauri/yaak-app-proxy/src/window_menu.rs
new file mode 100644
index 00000000..b71433af
--- /dev/null
+++ b/crates-tauri/yaak-app-proxy/src/window_menu.rs
@@ -0,0 +1,138 @@
+pub use tauri::AppHandle;
+use tauri::Runtime;
+use tauri::menu::{
+ AboutMetadata, HELP_SUBMENU_ID, Menu, MenuItemBuilder, PredefinedMenuItem, Submenu,
+ WINDOW_SUBMENU_ID,
+};
+
+pub fn app_menu(app_handle: &AppHandle) -> tauri::Result