diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 1a3d75a..3e6e48d 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -7,7 +7,18 @@ on: jobs: build: - runs-on: macos-latest + strategy: + fail-fast: false + matrix: + settings: + - host: macos-latest + name: macOS + targets: app,dmg + - host: windows-latest + name: Windows + targets: msi,nsis + name: Build for ${{ matrix.settings.name }} + runs-on: ${{ matrix.settings.host }} steps: - name: Checkout the code uses: actions/checkout@v3 @@ -49,17 +60,37 @@ jobs: - name: Build the app uses: tauri-apps/tauri-action@v0 + with: + args: --bundles ${{ matrix.settings.targets }} - name: 🚀 Upload macOS dmg + if: matrix.settings.host == 'macos-latest' uses: actions/upload-artifact@v3 with: name: Commit.dmg path: | target/release/bundle/dmg/Commit*.dmg - - name: 🚀 Upload macOS App + - name: 🚀 Upload macOS app + if: matrix.settings.host == 'macos-latest' uses: actions/upload-artifact@v3 with: name: Commit.app path: | target/release/bundle/macos/ + + - name: 🚀 Upload Windows NSIS + if: matrix.settings.host == 'windows-latest' + uses: actions/upload-artifact@v3 + with: + name: Commit.exe + path: | + target/release/bundle/nsis/Commit*.exe + + - name: 🚀 Upload Windows MSI + if: matrix.settings.host == 'windows-latest' + uses: actions/upload-artifact@v3 + with: + name: Commit.msi + path: | + target/release/bundle/msi/Commit*.msi diff --git a/frontend/src/components/ShortcutPicker.tsx b/frontend/src/components/ShortcutPicker.tsx index 3b00714..4a18178 100644 --- a/frontend/src/components/ShortcutPicker.tsx +++ b/frontend/src/components/ShortcutPicker.tsx @@ -28,10 +28,6 @@ const ShortcutPicker: FC = ({ value, onChange }) => { setShortcut(parseShortcut(value)) }, [value]) - // useEffect(() => { - // onChange(buildShortcut(shortcut)) - // }, [shortcut]) - const handleKeyDown = useCallback( (event: KeyboardEvent) => { event.preventDefault() @@ -75,10 +71,10 @@ const parseShortcut = (shortcut: string): ParsedShortcut => { return { isAlt: parts.includes('Alt'), - isCmd: parts.includes('Cmd'), isCtrl: parts.includes('Ctrl'), isShift: parts.includes('Shift'), natural: parts[parts.length - 1].toUpperCase(), + isCmd: parts.includes('CommandOrControl') || parts.includes('Cmd'), } } @@ -100,10 +96,10 @@ const displayShortcut = (shortcut: ParsedShortcut): string => { const buildShortcut = (shortcut: ParsedShortcut): string => { let parts = [] - if (shortcut.isCmd) parts.push('Cmd') if (shortcut.isAlt) parts.push('Alt') if (shortcut.isCtrl) parts.push('Ctrl') if (shortcut.isShift) parts.push('Shift') + if (shortcut.isCmd) parts.push('CommandOrControl') parts.push(shortcut.natural.toUpperCase()) diff --git a/src/main.rs b/src/main.rs index 6e6448b..cd3786f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,7 +3,11 @@ use anyhow::anyhow; use config::{Config, ConfigExt}; use std::error::Error; -use tauri::{generate_context, ActivationPolicy, Builder as Tauri}; +use tauri::{generate_context, Builder as Tauri}; + +#[cfg(target_os = "macos")] +use tauri::ActivationPolicy; + use tauri_autostart::ManagerExt; use tauri_plugin_autostart::{self as tauri_autostart}; @@ -33,6 +37,7 @@ fn main() { } fn setup_tauri(app: &mut tauri::App) -> Result<(), Box<(dyn Error + 'static)>> { + #[cfg(target_os = "macos")] app.set_activation_policy(ActivationPolicy::Accessory); window::main_window::create(&app.handle())?; diff --git a/src/shortcuts.rs b/src/shortcuts.rs index 84c54e4..ae867c0 100644 --- a/src/shortcuts.rs +++ b/src/shortcuts.rs @@ -2,7 +2,8 @@ use tauri::{AppHandle, GlobalShortcutManager, Manager, Window}; use crate::window; -pub const DEFAULT_SHORTCUT: &str = "Cmd+Alt+Shift+C"; +pub const DEFAULT_SHORTCUT: &str = "CommandOrControl+Alt+Shift+C"; +pub const SETTINGS_SHORTCUT: &str = "CommandOrControl+,"; pub fn update_default( app: &AppHandle, @@ -28,7 +29,7 @@ pub fn register_settings(app: &AppHandle) -> Result<(), anyhow::Error> { let mut shortcuts = app.global_shortcut_manager(); let settings_window = window::settings::get(app).unwrap(); - shortcuts.register("Cmd+,", move || { + shortcuts.register(SETTINGS_SHORTCUT, move || { settings_window.show().unwrap(); settings_window.set_focus().unwrap(); })?; @@ -39,7 +40,7 @@ pub fn register_settings(app: &AppHandle) -> Result<(), anyhow::Error> { pub fn unregister_settings(app: &AppHandle) -> Result<(), anyhow::Error> { let mut shortcuts = app.global_shortcut_manager(); - shortcuts.unregister("Cmd+,")?; + shortcuts.unregister(SETTINGS_SHORTCUT)?; Ok(()) } diff --git a/src/tray.rs b/src/tray.rs index 7e278d9..bade025 100644 --- a/src/tray.rs +++ b/src/tray.rs @@ -15,13 +15,13 @@ pub enum TrayMenu { pub fn build() -> SystemTray { let tray_menu = SystemTrayMenu::new() - .add_item(CustomMenuItem::new(TrayMenu::Settings, "Settings...").accelerator("Cmd+,")) + .add_item(CustomMenuItem::new(TrayMenu::Settings, "Settings...").accelerator("CommandOrControl+,")) .add_native_item(SystemTrayMenuItem::Separator); #[cfg(debug_assertions)] let tray_menu = tray_menu .add_item( - CustomMenuItem::new(TrayMenu::DevTools, "Open DevTools").accelerator("Cmd+Shift+I"), + CustomMenuItem::new(TrayMenu::DevTools, "Open DevTools").accelerator("CommandOrControl+Shift+I"), ) .add_native_item(SystemTrayMenuItem::Separator); diff --git a/src/window/main_window.rs b/src/window/main_window.rs index 9cc7042..7169334 100644 --- a/src/window/main_window.rs +++ b/src/window/main_window.rs @@ -37,7 +37,9 @@ pub fn hide(window: &Window) -> Result<(), tauri_plugin_spotlight::Error> { pub fn on_open(window: Window) { shortcuts::register_escape(window.clone()).unwrap(); - shortcuts::register_settings(&window.app_handle()).unwrap(); + shortcuts::register_settings(&window.app_handle()).unwrap_or_else(|_| { + eprintln!("Failed to register settings shortcut"); + }); tauri::async_runtime::spawn(async move { let app = window.app_handle(); diff --git a/src/window/mod.rs b/src/window/mod.rs index a25b567..0d66e3c 100644 --- a/src/window/mod.rs +++ b/src/window/mod.rs @@ -2,8 +2,13 @@ use tauri::{ plugin::TauriPlugin, AppHandle, GlobalWindowEvent, Manager, RunEvent, Window, WindowEvent, }; use tauri_plugin_spotlight::{PluginConfig, WindowConfig}; + +#[cfg(target_os = "macos")] use window_vibrancy::{apply_vibrancy, NSVisualEffectMaterial, NSVisualEffectState}; +#[cfg(target_os = "windows")] +use window_vibrancy::apply_mica; + use crate::shortcuts; pub const MAIN: &str = "main"; @@ -66,11 +71,18 @@ pub trait TransparentWindow { impl TransparentWindow for Window { fn make_transparent(&self) -> Result<(), window_vibrancy::Error> { - apply_vibrancy( - self, - NSVisualEffectMaterial::HudWindow, - Some(NSVisualEffectState::Active), - Some(10.0), - ) + { + #[cfg(target_os = "macos")] + apply_vibrancy( + self, + NSVisualEffectMaterial::HudWindow, + Some(NSVisualEffectState::Active), + Some(10.0), + ) + } + + // not working + #[cfg(target_os = "windows")] + apply_mica(self, Some(false)) } } diff --git a/src/window/settings.rs b/src/window/settings.rs index 5cb76d2..3ebc775 100644 --- a/src/window/settings.rs +++ b/src/window/settings.rs @@ -1,11 +1,14 @@ use anyhow::anyhow; -use tauri::{AppHandle, Manager, TitleBarStyle, Window, WindowBuilder, WindowUrl}; +use tauri::{AppHandle, Manager, Window, WindowBuilder, WindowUrl}; +#[cfg(target_os = "macos")] +use tauri::TitleBarStyle; use crate::window; use super::TransparentWindow; pub fn create(app: &AppHandle) -> anyhow::Result { + #[cfg(target_os = "macos")] let settings_window = WindowBuilder::new(app, window::SETTINGS, WindowUrl::App(Default::default())) .visible(false) @@ -17,6 +20,18 @@ pub fn create(app: &AppHandle) -> anyhow::Result { .initialization_script("window.__COMMIT__ = { page: 'settings' };") .build()?; + // not macos + #[cfg(not(target_os = "macos"))] + let settings_window = + WindowBuilder::new(app, window::SETTINGS, WindowUrl::App(Default::default())) + .visible(false) + .closable(true) + .transparent(true) + .always_on_top(true) + .title("Settings - Commit") + .initialization_script("window.__COMMIT__ = { page: 'settings' };") + .build()?; + settings_window.make_transparent().map_err(|_| { anyhow!("Unsupported platform! 'apply_vibrancy' is only supported on macOS") })?;