diff --git a/frontend/src-tauri/src/platform/linux.rs b/frontend/src-tauri/src/platform/linux.rs index b5edc9d..2735ab8 100644 --- a/frontend/src-tauri/src/platform/linux.rs +++ b/frontend/src-tauri/src/platform/linux.rs @@ -1,20 +1,5 @@ // Linux platform implementation for cursor handling -use super::Result; +use super::stub_impl::create_platform_stubs; -// Initialize cursor handling -pub fn init() -> Result<()> { - println!("Linux cursor initialization not yet implemented"); - Ok(()) // Return OK for now to not block platform-agnostic code -} - -pub fn set_cursor(path: &str) -> Result<()> { - // Linux cursor implementation would go here - println!("Linux cursor setting not yet implemented for path: {}", path); - Ok(()) // Return OK for now to not block platform-agnostic code -} - -pub fn restore_default_cursor() -> Result<()> { - // Linux cursor restoration would go here - println!("Linux cursor restoration not yet implemented"); - Ok(()) // Return OK for now to not block platform-agnostic code -} +// Generate stub implementations for Linux +create_platform_stubs!("Linux"); diff --git a/frontend/src-tauri/src/platform/macos.rs b/frontend/src-tauri/src/platform/macos.rs index b0bdd8c..e36c9c2 100644 --- a/frontend/src-tauri/src/platform/macos.rs +++ b/frontend/src-tauri/src/platform/macos.rs @@ -1,20 +1,5 @@ // macOS platform implementation for cursor handling -use super::Result; +use super::stub_impl::create_platform_stubs; -// Initialize cursor handling -pub fn init() -> Result<()> { - println!("macOS cursor initialization not yet implemented"); - Ok(()) // Return OK for now to not block platform-agnostic code -} - -pub fn set_cursor(path: &str) -> Result<()> { - // macOS cursor implementation would go here - println!("macOS cursor setting not yet implemented for path: {}", path); - Ok(()) // Return OK for now to not block platform-agnostic code -} - -pub fn restore_default_cursor() -> Result<()> { - // macOS cursor restoration would go here - println!("macOS cursor restoration not yet implemented"); - Ok(()) // Return OK for now to not block platform-agnostic code -} +// Generate stub implementations for macOS +create_platform_stubs!("macOS"); diff --git a/frontend/src-tauri/src/platform/mod.rs b/frontend/src-tauri/src/platform/mod.rs index 91576d6..8cfbb57 100644 --- a/frontend/src-tauri/src/platform/mod.rs +++ b/frontend/src-tauri/src/platform/mod.rs @@ -3,6 +3,9 @@ // Common types for cursor handling pub mod types; +// Shared stub implementations for unimplemented platforms +mod stub_impl; + // Windows implementation #[cfg(target_os = "windows")] mod windows; diff --git a/frontend/src-tauri/src/platform/stub_impl.rs b/frontend/src-tauri/src/platform/stub_impl.rs new file mode 100644 index 0000000..681aff5 --- /dev/null +++ b/frontend/src-tauri/src/platform/stub_impl.rs @@ -0,0 +1,30 @@ +// Shared stub implementations for unimplemented platforms (macOS, Linux) + +/// Creates a stub implementation for a platform that doesn't have cursor support yet +macro_rules! create_platform_stubs { + ($platform_name:expr) => { + use super::Result; + use image::RgbaImage; + + // Initialize cursor handling + pub fn init() -> Result<()> { + println!("{} cursor initialization not yet implemented", $platform_name); + Ok(()) // Return OK for now to not block platform-agnostic code + } + + // Set cursor from image data + pub fn set_cursor(_image: &RgbaImage) -> Result<()> { + println!("{} cursor setting not yet implemented", $platform_name); + Ok(()) // Return OK for now to not block platform-agnostic code + } + + // Restore default cursor + pub fn restore_default_cursor() -> Result<()> { + println!("{} cursor restoration not yet implemented", $platform_name); + Ok(()) // Return OK for now to not block platform-agnostic code + } + }; +} + +// Export the macro for use by platform modules +pub(crate) use create_platform_stubs; diff --git a/frontend/src-tauri/src/platform/windows/cursor.rs b/frontend/src-tauri/src/platform/windows/cursor.rs index cab9d4e..ce0d983 100644 --- a/frontend/src-tauri/src/platform/windows/cursor.rs +++ b/frontend/src-tauri/src/platform/windows/cursor.rs @@ -347,17 +347,8 @@ pub fn cleanup() { } } - // Force Windows to reload default cursor settings - SystemParametersInfoW(SPI_SETCURSORS, 0, null_mut(), 0); - - // Also try the A version for maximum compatibility - super::state::reset_system_cursors(); - - // Reset to default arrow cursor - let arrow_cursor = LoadCursorW(null_mut(), MAKEINTRESOURCEW(IDC_ARROW as u16)); - if !arrow_cursor.is_null() { - SetCursor(arrow_cursor); - } + // Use the shared cursor restoration logic + restore_default_cursor_internal(); } } @@ -509,6 +500,37 @@ pub fn update_cursor_info(image: &RgbaImage) -> bool { } } +// Helper function to apply a cursor to a specific system cursor ID +unsafe fn apply_cursor_to_system_cursor(cursor: winapi::shared::windef::HCURSOR, cursor_id: DWORD, log_errors: bool) -> bool { + // Make a copy of the cursor + let cursor_copy = CopyIcon(cursor); + if cursor_copy.is_null() { + if log_errors { + let error = std::io::Error::last_os_error(); + eprintln!( + "Failed to copy cursor for ID: {} - Error: {}", + cursor_id, error + ); + } + return false; + } + + // Set the system cursor + if SetSystemCursor(cursor_copy, cursor_id) == 0 { + if log_errors { + let error = std::io::Error::last_os_error(); + eprintln!( + "Failed to set cursor for ID: {} - Error: {}", + cursor_id, error + ); + } + DestroyIcon(cursor_copy); // Clean up the copy if we failed to set it + return false; + } + + true +} + // Apply a cursor to all system cursors unsafe fn apply_cursor_to_all_system_cursors(cursor: winapi::shared::windef::HCURSOR) -> bool { let mut success = true; @@ -530,51 +552,21 @@ unsafe fn apply_cursor_to_all_system_cursors(cursor: winapi::shared::windef::HCU 32649, // IDC_HAND (links) ]; - // Apply to priority cursors first + // Apply to priority cursors first (with error logging) for &cursor_id in priority_cursors.iter() { - // Make a copy of the cursor - let cursor_copy = CopyIcon(cursor); - if cursor_copy.is_null() { - let error = std::io::Error::last_os_error(); - eprintln!( - "Failed to copy cursor for priority ID: {} - Error: {}", - cursor_id, error - ); - success = false; - continue; - } - - // Set the system cursor - if SetSystemCursor(cursor_copy, cursor_id) == 0 { - let error = std::io::Error::last_os_error(); - eprintln!( - "Failed to set cursor for priority ID: {} - Error: {}", - cursor_id, error - ); - DestroyIcon(cursor_copy); // Clean up the copy if we failed to set it + if !apply_cursor_to_system_cursor(cursor, cursor_id, true) { success = false; } } - // Now apply to the remaining cursors + // Now apply to the remaining cursors (without error logging to reduce spam) for &cursor_id in SYSTEM_CURSORS.iter() { // Skip the priority cursors we already processed if priority_cursors.contains(&cursor_id) { continue; } - // Make a copy of the cursor - let cursor_copy = CopyIcon(cursor); - if cursor_copy.is_null() { - // Don't log errors for non-priority cursors to reduce console spam - success = false; - continue; - } - - // Set the system cursor - if SetSystemCursor(cursor_copy, cursor_id) == 0 { - // Don't log errors for non-priority cursors to reduce console spam - DestroyIcon(cursor_copy); // Clean up the copy if we failed to set it + if !apply_cursor_to_system_cursor(cursor, cursor_id, false) { success = false; } } @@ -587,20 +579,25 @@ unsafe fn apply_cursor_to_all_system_cursors(cursor: winapi::shared::windef::HCU success } +// Helper function for common cursor restoration logic +unsafe fn restore_default_cursor_internal() { + // Force Windows to reload default cursor settings + SystemParametersInfoW(SPI_SETCURSORS, 0, null_mut(), 0); + + // Also try the A version for maximum compatibility + super::state::reset_system_cursors(); + + // Reset to default arrow cursor + let arrow_cursor = LoadCursorW(null_mut(), MAKEINTRESOURCEW(IDC_ARROW as u16)); + if !arrow_cursor.is_null() { + SetCursor(arrow_cursor); + } +} + // Restore the system cursor temporarily (without affecting cleanup state) pub fn restore_cursor_temporarily() { unsafe { - // Force Windows to reload default cursor settings - SystemParametersInfoW(SPI_SETCURSORS, 0, null_mut(), 0); - - // Also try the A version for maximum compatibility - super::state::reset_system_cursors(); - - // Reset to default arrow cursor - let arrow_cursor = LoadCursorW(null_mut(), MAKEINTRESOURCEW(IDC_ARROW as u16)); - if !arrow_cursor.is_null() { - SetCursor(arrow_cursor); - } + restore_default_cursor_internal(); } }