Skip to content
Merged
5 changes: 5 additions & 0 deletions LOCAL.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,11 @@ pnpm start:mocked
pnpm build:desktop
```

### 4b. Building locally without updater signing
```
pnpm build:desktop:unsigned
```

### 5. Building the canary version locally
```
pnpm build:canary
Expand Down
3 changes: 2 additions & 1 deletion apps/api/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@
"check:format": "prettier --check \"**/*.{ts,js,md}\"",
"clean": "rm -rf dist .turbo node_modules",
"format": "prettier --write .",
"start": "wrangler dev --remote --port 8787"
"start": "wrangler dev --local --port 8787",
"start:remote": "wrangler dev --remote --port 8787"
},
"devDependencies": {
"@cloudflare/workers-types": "^4.20250129.0",
Expand Down
3 changes: 2 additions & 1 deletion apps/bot/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@
"clean": "rm -rf dist .turbo node_modules",
"register": "node --import tsx/esm ./src/register.ts",
"format": "prettier --write .",
"start": "wrangler dev --remote --port 8787"
"start": "wrangler dev --local --port 8788",
"start:remote": "wrangler dev --remote --port 8787"
},
"devDependencies": {
"@cloudflare/workers-types": "^4.20250129.0",
Expand Down
1 change: 1 addition & 0 deletions apps/desktop/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
"dev": "vite",
"build": "tsc && vite build",
"build:canary": "tauri build --config \"src-tauri/tauri.conf.canary.json\"",
"build:desktop:unsigned": "tauri build --config \"src-tauri/tauri.conf.unsigned.json\"",
"generate:commit-hash": "node scripts/generate-commit-hash.js",
"lint": "eslint",
"clean": "rm -rf dist .turbo node_modules src-tauri/target",
Expand Down
6,365 changes: 3,429 additions & 2,936 deletions apps/desktop/src-tauri/gen/schemas/windows-schema.json

Large diffs are not rendered by default.

125 changes: 118 additions & 7 deletions apps/desktop/src-tauri/src/commands.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use std::{

use tauri::{image::Image, menu::Menu, AppHandle, Emitter, Manager, State, WebviewWindow, Wry};

use crate::{constants::*, Pinned, TrayMenu};
use crate::{constants::*, HideTaskbarWhenPinned, Pinned, TrayMenu};

#[tauri::command]
pub fn open_settings(window: WebviewWindow, update: bool) {
Expand Down Expand Up @@ -43,16 +43,56 @@ pub fn open_devtools(window: WebviewWindow) {
}

#[tauri::command]
pub fn toggle_pin(window: WebviewWindow, pin: State<Pinned>, menu: State<TrayMenu>) {
pub fn open_overlay_devtools(window: WebviewWindow) {
let app = window.app_handle();
if let Some(main_window) = app.get_webview_window(MAIN_WINDOW_NAME) {
main_window.open_devtools();
}
}

#[tauri::command]
pub fn simulate_error_screen(window: WebviewWindow) {
let app = window.app_handle();

if let Some(main_window) = app.get_webview_window(MAIN_WINDOW_NAME) {
let _ = main_window.eval("window.location.hash = '#/error';");
let _ = main_window.show();
let _ = main_window.set_focus();
}

if let Some(settings_window) = app.get_webview_window(SETTINGS_WINDOW_NAME) {
let _ = settings_window.hide();
}
}

#[tauri::command]
pub fn toggle_pin(
window: WebviewWindow,
pin: State<Pinned>,
menu: State<TrayMenu>,
hide_taskbar: State<HideTaskbarWhenPinned>,
) {
let app = window.app_handle();
let value = !get_pin(app.state::<Pinned>());

_set_pin(value, &window, pin, menu);
// Always target the main overlay window so pinning from other windows
// (e.g., settings) does not affect those windows.
if let Some(main_win) = app.get_webview_window(MAIN_WINDOW_NAME) {
_set_pin(value, &main_win, pin, menu, hide_taskbar);
}
}

#[tauri::command]
pub fn set_pin(window: WebviewWindow, pin: State<Pinned>, menu: State<TrayMenu>, value: bool) {
_set_pin(value, &window, pin, menu);
pub fn set_pin(
window: WebviewWindow,
pin: State<Pinned>,
menu: State<TrayMenu>,
hide_taskbar: State<HideTaskbarWhenPinned>,
value: bool,
) {
if let Some(main_win) = window.app_handle().get_webview_window(MAIN_WINDOW_NAME) {
_set_pin(value, &main_win, pin, menu, hide_taskbar);
}
}

impl Deref for Pinned {
Expand All @@ -71,13 +111,59 @@ impl Deref for TrayMenu {
}
}

fn _set_pin(value: bool, window: &WebviewWindow, pinned: State<Pinned>, menu: State<TrayMenu>) {
impl Deref for HideTaskbarWhenPinned {
type Target = AtomicBool;

fn deref(&self) -> &Self::Target {
&self.0
}
}

fn apply_taskbar_visibility(app: &AppHandle, pinned: bool, hide_taskbar_when_pinned: bool) {
let skip_taskbar = pinned && hide_taskbar_when_pinned;

if let Some(main_window) = app.get_webview_window(MAIN_WINDOW_NAME) {
#[cfg(target_os = "windows")]
main_window.set_skip_taskbar(skip_taskbar).ok();
}

#[cfg(target_os = "macos")]
{
use tauri::ActivationPolicy;
app
.set_activation_policy(if skip_taskbar {
ActivationPolicy::Accessory
} else {
ActivationPolicy::Regular
})
.ok();
}
}

fn _set_pin(
value: bool,
window: &WebviewWindow,
pinned: State<Pinned>,
menu: State<TrayMenu>,
hide_taskbar: State<HideTaskbarWhenPinned>,
) {
// @d0nutptr cooked here
pinned.store(value, std::sync::atomic::Ordering::Relaxed);

// let the client know
// emit to the main window and also broadcast to all webviews so other
// windows (like settings) can react to the change.
window.emit(TRAY_TOGGLE_PIN, value).unwrap();

// Broadcast the pin change to all webviews so other
// windows (like settings) can react to the change.
let app_handle = window.app_handle();
if let Some(main_win) = app_handle.get_webview_window(MAIN_WINDOW_NAME) {
let _ = main_win.emit(TRAY_TOGGLE_PIN, value);
}
if let Some(settings_win) = app_handle.get_webview_window(SETTINGS_WINDOW_NAME) {
let _ = settings_win.emit(TRAY_TOGGLE_PIN, value);
}

// invert the label for the tray
if let Some(toggle_pin_menu_item) = menu.lock().ok().and_then(|m| m.get(TRAY_TOGGLE_PIN)) {
let enable_or_disable = if value { "Unpin" } else { "Pin" };
Expand Down Expand Up @@ -105,6 +191,12 @@ fn _set_pin(value: bool, window: &WebviewWindow, pinned: State<Pinned>, menu: St

window.set_ignore_cursor_events(value);

apply_taskbar_visibility(
&window.app_handle(),
value,
hide_taskbar.load(std::sync::atomic::Ordering::Relaxed),
);

// update the tray icon
update_tray_icon(window.app_handle(), value);
}
Expand All @@ -122,3 +214,22 @@ pub fn update_tray_icon(app: &AppHandle, pinned: bool) {
}
}
}

#[tauri::command]
pub fn set_hide_taskbar_when_pinned(
window: WebviewWindow,
hide_taskbar_when_pinned: bool,
pinned: State<Pinned>,
hide_taskbar: State<HideTaskbarWhenPinned>,
) {
hide_taskbar.store(
hide_taskbar_when_pinned,
std::sync::atomic::Ordering::Relaxed,
);

apply_taskbar_visibility(
&window.app_handle(),
pinned.load(std::sync::atomic::Ordering::Relaxed),
hide_taskbar_when_pinned,
);
}
2 changes: 1 addition & 1 deletion apps/desktop/src-tauri/src/constants.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,4 @@ pub static OVERLAYED_NORMAL_LEVEL: i32 = 8;
/// HACK: this allows constraint of the size of the settings window
/// because the save sate plugin will not allow use to filter windows out
pub const SETTINGS_WINDOW_WIDTH: i32 = 600;
pub const SETTINGS_WINDOW_HEIGHT: i32 = 400;
pub const SETTINGS_WINDOW_HEIGHT: i32 = 480;
55 changes: 40 additions & 15 deletions apps/desktop/src-tauri/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ use tauri::WebviewWindow;

pub struct Pinned(AtomicBool);

pub struct HideTaskbarWhenPinned(AtomicBool);

pub struct TrayMenu(Mutex<Menu<Wry>>);

#[cfg(target_os = "macos")]
Expand Down Expand Up @@ -99,10 +101,14 @@ fn main() {
.plugin(tauri_plugin_shell::init())
.plugin(tauri_plugin_os::init())
.plugin(tauri_plugin_http::init())
.plugin(log_plugin_builder.build())
.plugin(tauri_plugin_single_instance::init(|app, argv, cwd| {
.plugin(log_plugin_builder.build());

#[cfg(not(debug_assertions))]
{
app = app.plugin(tauri_plugin_single_instance::init(|app, argv, cwd| {
println!("{}, {argv:?}, {cwd}", app.package_info().name);
}));
}

#[cfg(target_os = "macos")]
{
Expand All @@ -111,6 +117,7 @@ fn main() {

app = app
.manage(Pinned(AtomicBool::new(false)))
.manage(HideTaskbarWhenPinned(AtomicBool::new(false)))
.setup(move |app| {
debug!("starting app...");
let window = app.get_webview_window(MAIN_WINDOW_NAME).unwrap();
Expand Down Expand Up @@ -160,30 +167,48 @@ fn main() {
get_pin,
set_pin,
open_devtools,
open_overlay_devtools,
simulate_error_screen,
close_settings,
open_settings,
set_hide_taskbar_when_pinned,
]);

app
.build(tauri::generate_context!())
.expect("An error occured while running the app!")
.run(|app, event| {
use tauri::WindowEvent as WEvent;

if let tauri::RunEvent::WindowEvent {
event: tauri::WindowEvent::CloseRequested { api, .. },
label,
..
event: we, label, ..
} = event
{
if label == SETTINGS_WINDOW_NAME {
let win = app.get_webview_window(label.as_str()).unwrap();
win.hide().unwrap();
}

if label == MAIN_WINDOW_NAME {
app.save_window_state(StateFlags::POSITION | StateFlags::SIZE);
std::process::exit(0);
} else {
api.prevent_close();
match we {
WEvent::CloseRequested { api, .. } => {
if label == SETTINGS_WINDOW_NAME {
let win = app.get_webview_window(label.as_str()).unwrap();
win.hide().unwrap();
}

if label == MAIN_WINDOW_NAME {
// Save state on close
app.save_window_state(StateFlags::POSITION | StateFlags::SIZE);
std::process::exit(0);
} else {
api.prevent_close();
}
}

WEvent::Resized(_) | WEvent::Moved(_) => {
if label == MAIN_WINDOW_NAME {
// Also save state whenever the main window is moved or resized so
// we persist the latest bounds even if the process is terminated
app.save_window_state(StateFlags::POSITION | StateFlags::SIZE);
}
}

_ => {}
}
}
});
Expand Down
13 changes: 9 additions & 4 deletions apps/desktop/src-tauri/src/tray.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@ use anyhow::Result;
use tauri_plugin_window_state::{AppHandleExt, StateFlags};

use crate::{
commands, toggle_pin, Pinned, TrayMenu, MAIN_WINDOW_NAME, OVERLAYED, SETTINGS_WINDOW_NAME,
TRAY_OPEN_DEVTOOLS_MAIN, TRAY_OPEN_DEVTOOLS_SETTINGS, TRAY_QUIT, TRAY_RELOAD, TRAY_SETTINGS,
TRAY_SHOW_APP, TRAY_TOGGLE_PIN,
commands, toggle_pin, HideTaskbarWhenPinned, Pinned, TrayMenu, MAIN_WINDOW_NAME, OVERLAYED,
SETTINGS_WINDOW_NAME, TRAY_OPEN_DEVTOOLS_MAIN, TRAY_OPEN_DEVTOOLS_SETTINGS, TRAY_QUIT,
TRAY_RELOAD, TRAY_SETTINGS, TRAY_SHOW_APP, TRAY_TOGGLE_PIN,
};

pub struct Tray;
Expand Down Expand Up @@ -52,7 +52,12 @@ impl Tray {
TRAY_TOGGLE_PIN => {
let window = app.get_webview_window(MAIN_WINDOW_NAME).unwrap();

toggle_pin(window, app.state::<Pinned>(), app.state::<TrayMenu>())
toggle_pin(
window,
app.state::<Pinned>(),
app.state::<TrayMenu>(),
app.state::<HideTaskbarWhenPinned>(),
)
}
TRAY_SHOW_APP => {
let window = app.get_webview_window(MAIN_WINDOW_NAME).unwrap();
Expand Down
2 changes: 1 addition & 1 deletion apps/desktop/src-tauri/tauri.conf.json
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@
"url": "#settings",
"title": "Overlayed - Settings",
"width": 600,
"height": 400
"height": 480
}
],
"withGlobalTauri": true,
Expand Down
5 changes: 5 additions & 0 deletions apps/desktop/src-tauri/tauri.conf.unsigned.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"bundle": {
"createUpdaterArtifacts": false
}
}
Loading
Loading