Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ features = [
"Win32_UI_Accessibility",
"Win32_System_Registry",
"Win32_System_Threading",
"Win32_System_Time",
"Win32_Storage_FileSystem",
"Win32_Security",
"Win32_UI_Input_KeyboardAndMouse",
"Win32_UI_HiDpi",
Expand Down
9 changes: 9 additions & 0 deletions src/localization/dutch.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,5 +46,14 @@ pub(super) const STRINGS: Strings = Strings {
antigravity_token_expired_body: "Open Antigravity en meld je opnieuw aan. Ververs of herstart de app daarna.",
codex_window_title: "Codex-gebruiksmonitor",
antigravity_window_title: "Antigravity-gebruiksmonitor",
resets_at_label: "resets",
left_at_rate_label: "left at this rate",
alerts_menu: "Usage alerts",
alert_off: "Off",
alert_at_90: "At 90%",
alert_at_80_90: "At 80% & 90%",
alert_pace: "Pacing to run out",
alert_balloon_title: "Usage running low",
alert_balloon_body: "You're pacing to run out before your quota resets.",
second_suffix: "s",
};
9 changes: 9 additions & 0 deletions src/localization/english.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,5 +46,14 @@ pub(super) const STRINGS: Strings = Strings {
antigravity_token_expired_body: "Open Antigravity and sign in again. After that, refresh or restart this app.",
codex_window_title: "Codex Usage Monitor",
antigravity_window_title: "Antigravity Usage Monitor",
resets_at_label: "resets",
left_at_rate_label: "left at this rate",
alerts_menu: "Usage alerts",
alert_off: "Off",
alert_at_90: "At 90%",
alert_at_80_90: "At 80% & 90%",
alert_pace: "Pacing to run out",
alert_balloon_title: "Usage running low",
alert_balloon_body: "You're pacing to run out before your quota resets.",
second_suffix: "s",
};
9 changes: 9 additions & 0 deletions src/localization/french.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,5 +46,14 @@ pub(super) const STRINGS: Strings = Strings {
antigravity_token_expired_body: "Ouvrez Antigravity et reconnectez-vous. Ensuite, actualisez ou redemarrez cette application.",
codex_window_title: "Moniteur d'utilisation Codex",
antigravity_window_title: "Moniteur d'utilisation Antigravity",
resets_at_label: "resets",
left_at_rate_label: "left at this rate",
alerts_menu: "Usage alerts",
alert_off: "Off",
alert_at_90: "At 90%",
alert_at_80_90: "At 80% & 90%",
alert_pace: "Pacing to run out",
alert_balloon_title: "Usage running low",
alert_balloon_body: "You're pacing to run out before your quota resets.",
second_suffix: "s",
};
9 changes: 9 additions & 0 deletions src/localization/german.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,5 +46,14 @@ pub(super) const STRINGS: Strings = Strings {
antigravity_token_expired_body: "Offnen Sie Antigravity und melden Sie sich erneut an. Aktualisieren oder starten Sie diese App anschliessend neu.",
codex_window_title: "Codex-Nutzungsmonitor",
antigravity_window_title: "Antigravity-Nutzungsmonitor",
resets_at_label: "resets",
left_at_rate_label: "left at this rate",
alerts_menu: "Usage alerts",
alert_off: "Off",
alert_at_90: "At 90%",
alert_at_80_90: "At 80% & 90%",
alert_pace: "Pacing to run out",
alert_balloon_title: "Usage running low",
alert_balloon_body: "You're pacing to run out before your quota resets.",
second_suffix: "s",
};
9 changes: 9 additions & 0 deletions src/localization/japanese.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,5 +46,14 @@ pub(super) const STRINGS: Strings = Strings {
antigravity_token_expired_body: "Antigravity を開いて再度サインインしてください。その後、このアプリを更新するか再起動してください。",
codex_window_title: "Codex 使用量モニター",
antigravity_window_title: "Antigravity 使用量モニター",
resets_at_label: "resets",
left_at_rate_label: "left at this rate",
alerts_menu: "Usage alerts",
alert_off: "Off",
alert_at_90: "At 90%",
alert_at_80_90: "At 80% & 90%",
alert_pace: "Pacing to run out",
alert_balloon_title: "Usage running low",
alert_balloon_body: "You're pacing to run out before your quota resets.",
second_suffix: "秒",
};
9 changes: 9 additions & 0 deletions src/localization/korean.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,5 +46,14 @@ pub(super) const STRINGS: Strings = Strings {
antigravity_token_expired_body: "Antigravity를 열고 다시 로그인하세요. 그런 다음 이 앱을 새로 고치거나 다시 시작하세요.",
codex_window_title: "Codex 사용량 모니터",
antigravity_window_title: "Antigravity 사용량 모니터",
resets_at_label: "resets",
left_at_rate_label: "left at this rate",
alerts_menu: "Usage alerts",
alert_off: "Off",
alert_at_90: "At 90%",
alert_at_80_90: "At 80% & 90%",
alert_pace: "Pacing to run out",
alert_balloon_title: "Usage running low",
alert_balloon_body: "You're pacing to run out before your quota resets.",
second_suffix: "초",
};
9 changes: 9 additions & 0 deletions src/localization/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,15 @@ pub struct Strings {
pub antigravity_token_expired_body: &'static str,
pub codex_window_title: &'static str,
pub antigravity_window_title: &'static str,
pub resets_at_label: &'static str,
pub left_at_rate_label: &'static str,
pub alerts_menu: &'static str,
pub alert_off: &'static str,
pub alert_at_90: &'static str,
pub alert_at_80_90: &'static str,
pub alert_pace: &'static str,
pub alert_balloon_title: &'static str,
pub alert_balloon_body: &'static str,
}

pub fn resolve_language(language_override: Option<LanguageId>) -> LanguageId {
Expand Down
9 changes: 9 additions & 0 deletions src/localization/portuguese_brazil.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,4 +47,13 @@ pub(super) const STRINGS: Strings = Strings {
antigravity_token_expired_body: "Abra o Antigravity e entre novamente. Depois disso, atualize ou reinicie este aplicativo.",
codex_window_title: "Monitor de uso do Codex",
antigravity_window_title: "Monitor de uso do Antigravity",
resets_at_label: "resets",
left_at_rate_label: "left at this rate",
alerts_menu: "Usage alerts",
alert_off: "Off",
alert_at_90: "At 90%",
alert_at_80_90: "At 80% & 90%",
alert_pace: "Pacing to run out",
alert_balloon_title: "Usage running low",
alert_balloon_body: "You're pacing to run out before your quota resets.",
};
9 changes: 9 additions & 0 deletions src/localization/russian.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,4 +47,13 @@ pub(super) const STRINGS: Strings = Strings {
antigravity_token_expired_body: "Откройте Antigravity и войдите снова. После этого обновите или перезапустите приложение.",
codex_window_title: "Монитор использования Codex",
antigravity_window_title: "Монитор использования Antigravity",
resets_at_label: "resets",
left_at_rate_label: "left at this rate",
alerts_menu: "Usage alerts",
alert_off: "Off",
alert_at_90: "At 90%",
alert_at_80_90: "At 80% & 90%",
alert_pace: "Pacing to run out",
alert_balloon_title: "Usage running low",
alert_balloon_body: "You're pacing to run out before your quota resets.",
};
9 changes: 9 additions & 0 deletions src/localization/simplified_chinese.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,5 +46,14 @@ pub(super) const STRINGS: Strings = Strings {
antigravity_token_expired_body: "请打开 Antigravity 并重新登录。完成后,请刷新或重新启动此应用程序。",
codex_window_title: "Codex 使用量监控",
antigravity_window_title: "Antigravity 使用量监控",
resets_at_label: "resets",
left_at_rate_label: "left at this rate",
alerts_menu: "Usage alerts",
alert_off: "Off",
alert_at_90: "At 90%",
alert_at_80_90: "At 80% & 90%",
alert_pace: "Pacing to run out",
alert_balloon_title: "Usage running low",
alert_balloon_body: "You're pacing to run out before your quota resets.",
second_suffix: "秒",
};
9 changes: 9 additions & 0 deletions src/localization/spanish.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,5 +46,14 @@ pub(super) const STRINGS: Strings = Strings {
antigravity_token_expired_body: "Abre Antigravity e inicia sesion otra vez. Despues, actualiza o reinicia esta aplicacion.",
codex_window_title: "Monitor de uso de Codex",
antigravity_window_title: "Monitor de uso de Antigravity",
resets_at_label: "resets",
left_at_rate_label: "left at this rate",
alerts_menu: "Usage alerts",
alert_off: "Off",
alert_at_90: "At 90%",
alert_at_80_90: "At 80% & 90%",
alert_pace: "Pacing to run out",
alert_balloon_title: "Usage running low",
alert_balloon_body: "You're pacing to run out before your quota resets.",
second_suffix: "s",
};
9 changes: 9 additions & 0 deletions src/localization/traditional_chinese.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,5 +46,14 @@ pub(super) const STRINGS: Strings = Strings {
antigravity_token_expired_body: "請開啟 Antigravity 並重新登入。完成後,請重新整理或重新啟動此應用程式。",
codex_window_title: "Codex 使用量監控",
antigravity_window_title: "Antigravity 使用量監控",
resets_at_label: "resets",
left_at_rate_label: "left at this rate",
alerts_menu: "Usage alerts",
alert_off: "Off",
alert_at_90: "At 90%",
alert_at_80_90: "At 80% & 90%",
alert_pace: "Pacing to run out",
alert_balloon_title: "Usage running low",
alert_balloon_body: "You're pacing to run out before your quota resets.",
second_suffix: "秒",
};
1 change: 1 addition & 0 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ mod diagnose;
mod localization;
mod models;
mod native_interop;
mod pace;
mod poller;
mod theme;
mod tray_icon;
Expand Down
28 changes: 27 additions & 1 deletion src/native_interop.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
use windows::core::PCWSTR;
use windows::Win32::Foundation::{BOOL, HWND, LPARAM, RECT};
use windows::Win32::Foundation::{BOOL, FILETIME, HWND, LPARAM, RECT, SYSTEMTIME};
use windows::Win32::Storage::FileSystem::FileTimeToLocalFileTime;
use windows::Win32::System::Time::FileTimeToSystemTime;
use windows::Win32::UI::Accessibility::{SetWinEventHook, UnhookWinEvent, HWINEVENTHOOK};
use windows::Win32::UI::Shell::{SHAppBarMessage, ABM_GETTASKBARPOS, APPBARDATA};
use windows::Win32::UI::WindowsAndMessaging::*;
Expand All @@ -18,6 +20,7 @@ pub const TIMER_POLL: usize = 1;
pub const TIMER_COUNTDOWN: usize = 2;
pub const TIMER_RESET_POLL: usize = 3;
pub const TIMER_UPDATE_CHECK: usize = 4;
pub const TIMER_ALERT_FLASH: usize = 5;

// Custom messages
pub const WM_APP: u32 = 0x8000;
Expand Down Expand Up @@ -181,6 +184,29 @@ pub fn wide_str(s: &str) -> Vec<u16> {
s.encode_utf16().chain(std::iter::once(0)).collect()
}

/// Returns local (hour_24, minute, day_of_week) for a UTC SystemTime.
/// day_of_week: 0 = Sunday .. 6 = Saturday. None on conversion failure.
pub fn system_time_to_local_hms(t: std::time::SystemTime) -> Option<(u32, u32, u16)> {
let secs = t.duration_since(std::time::UNIX_EPOCH).ok()?.as_secs();
// Win32 FILETIME is 100ns ticks since 1601-01-01; offset to unix epoch = 11644473600 s.
let ticks: u64 = (secs + 11_644_473_600) * 10_000_000;
let ft = FILETIME {
dwLowDateTime: (ticks & 0xFFFF_FFFF) as u32,
dwHighDateTime: (ticks >> 32) as u32,
};
unsafe {
let mut local_ft = FILETIME::default();
if FileTimeToLocalFileTime(&ft, &mut local_ft).is_err() {
return None;
}
let mut st = SYSTEMTIME::default();
if FileTimeToSystemTime(&local_ft, &mut st).is_err() {
return None;
}
Some((st.wHour as u32, st.wMinute as u32, st.wDayOfWeek))
}
}

/// COLORREF wrapper (RGB packed into u32)
pub fn colorref(r: u8, g: u8, b: u8) -> u32 {
r as u32 | (g as u32) << 8 | (b as u32) << 16
Expand Down
Loading