fix few bugs

This commit is contained in:
pj committed 2026-09-02 19:12:19 +05:30
1 parent c1c6db1406
commit 1c709967f8
7 files changed
+61 -22

No files matched your search

+7 -2
View File
@@ -127,8 +127,13 @@ assume away.
## Platforms
macOS uses the overlay title bar with the header row padded for the traffic lights, as margin
does. Linux has no traffic lights, so that padding is conditional. Linux builds need
`libwebkit2gtk-4.1-dev` and ship as AppImage and deb.
does. The lights are moved down to the header's centre line (`trafficLightPosition` in
`tauri.conf.json`), because AppKit places them for a 32pt title bar and the header is 46px.
Closing the window on macOS hides it rather than quitting, the way WhatsApp and Slack do: the
process stays in the Dock with sync running, a Dock click brings the window back, and Cmd+Q
quits. Both halves live in `lib.rs`. Linux has no traffic lights, so that padding is
conditional, and closing the window there quits. Linux builds need `libwebkit2gtk-4.1-dev` and
ship as AppImage and deb.
## Order of work
-1
View File
@@ -7,7 +7,6 @@
"permissions": [
"core:window:allow-destroy",
"core:window:allow-start-dragging",
"core:window:allow-toggle-maximize",
"updater:default",
"process:allow-restart"
]
+40 -3
View File
@@ -219,6 +219,20 @@ fn watch_for_the_consent_tab_closing(window: &tauri::WebviewWindow) {
});
}
/// The other half of closing on macOS. The red button and Cmd+W hide the window rather than
/// destroy it (`on_window_event` in `run`), the way WhatsApp and Slack do: the app stays in the
/// Dock with sync still running, and Cmd+Q is what quits. AppKit does nothing of its own for a
/// Dock click when it can see no window, so bringing it back is on us. `unminimize` covers the
/// yellow button, which lands here for the same reason.
#[cfg(target_os = "macos")]
fn show_main_window(app: &tauri::AppHandle) {
if let Some(window) = app.get_webview_window("main") {
let _ = window.unminimize();
let _ = window.show();
let _ = window.set_focus();
}
}
#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
// generate_context! first, so the updater plugin registers only when the merged config
@@ -286,7 +300,17 @@ pub fn run() {
});
}
builder
#[cfg(target_os = "macos")]
{
builder = builder.on_window_event(|window, event| {
if let tauri::WindowEvent::CloseRequested { api, .. } = event {
api.prevent_close();
let _ = window.hide();
}
});
}
let app = builder
.invoke_handler(tauri::generate_handler![
google::accounts_list,
google::account_connect,
@@ -301,6 +325,19 @@ pub fn run() {
sync::sync_status,
sync::sync_flush
])
.run(context)
.expect("error while running Margin Calendar");
.build(context)
.expect("error while building Margin Calendar");
app.run(|app, event| {
#[cfg(target_os = "macos")]
if let tauri::RunEvent::Reopen {
has_visible_windows: false,
..
} = event
{
show_main_window(app);
}
#[cfg(not(target_os = "macos"))]
let _ = (app, event);
});
}
+2 -1
View File
@@ -17,7 +17,8 @@
"height": 900,
"minWidth": 880,
"minHeight": 560,
"titleBarStyle": "Overlay"
"titleBarStyle": "Overlay",
"trafficLightPosition": { "x": 9, "y": 25 }
}
],
"security": {
+5 -2
View File
@@ -27,7 +27,7 @@ import { useSync } from "./store/useSync";
import { notify } from "./store/useToast";
import { useCompact, usePhone, useTouch } from "./useMedia";
import { syncFlush } from "./api/sync";
import { isDesktop, isTauri, live, type AuthEvent, type SyncStatus } from "./ipc";
import { isDesktop, isMacDesktop, isTauri, live, type AuthEvent, type SyncStatus } from "./ipc";
/** Long enough for sync_flush's own 1s lock wait plus its 4s drain budget. */
const FLUSH_TIMEOUT_MS = 5500;
@@ -91,8 +91,11 @@ function App() {
// `isDesktop` genuinely means desktop here: there is no close to intercept on a phone, and the
// window commands live in a capability that platform does not get, so this would be a rejected
// IPC call rather than a no-op. The outbox still drains on the next launch either way.
//
// Not on macOS, where closing the window hides it (lib.rs) and the process, sync loop included,
// carries on behind it. A listener here would be the thing that destroyed the window instead.
useEffect(() => {
if (!isDesktop) return;
if (!isDesktop || isMacDesktop) return;
const win = getCurrentWindow();
const unlisten = win.onCloseRequested(async (event) => {
if (useSync.getState().pendingWrites === 0) return;
+3 -13
View File
@@ -1,8 +1,6 @@
// The only persistent chrome. It carries the date range, the view switcher and the current time
// range, and on macOS the traffic lights float over it, so it costs no extra height.
import { getCurrentWindow } from "@tauri-apps/api/window";
import type { MouseEvent as ReactMouseEvent } from "react";
import { Icon } from "./Icon";
import { useCalendarView, spanFor, type View } from "../store/useCalendarView";
import { useOverlays } from "../store/useOverlays";
@@ -10,7 +8,6 @@ import { useSync } from "../store/useSync";
import { useTheme } from "../store/useTheme";
import { addDays, formatRange } from "../time";
import { keyLabel, keysFor } from "../keys/bindings";
import { isDesktop } from "../ipc";
import type { CommandId } from "../keys/commands";
// Exported where the phone bar shows the same thing: two rows of chrome that disagreed about which
@@ -55,17 +52,10 @@ export function Header() {
const { from, to } = spanFor(view, anchor);
const step = moveDay;
// Double click to zoom, the way a native title bar does. Tauri's drag region only handles this
// when the header itself is the event target, and the layout children cover it end to end, so
// it is wired explicitly. A double click on a control is not a title bar gesture.
const onDoubleClick = (e: ReactMouseEvent<HTMLElement>) => {
if (!isDesktop) return;
if ((e.target as HTMLElement).closest("button, input, select, a")) return;
void getCurrentWindow().toggleMaximize();
};
// Dragging and double click to zoom both come from Tauri's drag region script, which skips
// buttons on its own. A second toggle from here would undo the first.
return (
<header className="titlebar" data-tauri-drag-region onDoubleClick={onDoubleClick}>
<header className="titlebar" data-tauri-drag-region>
<div className="lead" data-tauri-drag-region>
<button
className="icon-button"
+4
View File
@@ -112,6 +112,10 @@ select {
padding: var(--safe-top) 14px 0;
background: var(--shell);
border-bottom: 1px solid var(--line);
/* Tauri's drag region lets the second click of a double click through to the webview so it can
zoom on mouseup, and WebKit would otherwise read that click as "select the nearest word". */
-webkit-user-select: none;
user-select: none;
}
/* The macOS traffic lights float over this row, so it opens a lane for them and costs no extra