diff --git a/src-tauri/src/cmd/screenshot.rs b/src-tauri/src/cmd/screenshot.rs index 117261f..e485120 100644 --- a/src-tauri/src/cmd/screenshot.rs +++ b/src-tauri/src/cmd/screenshot.rs @@ -1,149 +1,19 @@ -use std::{ - path::PathBuf, - process::Command, - thread, - time::{Duration, Instant}, -}; - -use chrono::Local; -use tauri::{Manager, Runtime}; -use tauri_plugin_store::StoreExt; +use crate::platform; #[tauri::command] -pub async fn capture_screen( - app_handle: tauri::AppHandle, - path: String, -) -> Result { - let start = Instant::now(); - - let images_dir = get_images_dir(app_handle, path)?; - - println!("images_dir: {:?}", images_dir); - std::fs::create_dir_all(&images_dir).map_err(|e| e.to_string())?; - - let filename = format!("screenshot_{}.png", Local::now().format("%Y%m%d_%H%M%S")); - let output_path = images_dir.join(&filename); - - Command::new("screencapture") - .arg("-x") - .arg(output_path.to_str().unwrap()) - .output() - .map_err(|e| e.to_string())?; - - println!("capture_screen 运行耗时: {:?}", start.elapsed()); - Ok(filename) +pub async fn capture_screen(app_handle: tauri::AppHandle, path: String) -> Result { + let filename = platform::capture_screen(&app_handle, path).await?; + Ok(filename) } #[tauri::command] -pub async fn capture_select( - app_handle: tauri::AppHandle, - path: String, -) -> Result { - let start = Instant::now(); - - let images_dir = get_images_dir(app_handle, path)?; - - let filename = format!("screenshot_{}.png", Local::now().format("%Y%m%d_%H%M%S")); - let output_path = images_dir.join(&filename); - - Command::new("screencapture") - .arg("-i") - .arg("-x") - .arg(output_path.to_str().unwrap()) - .output() - .map_err(|e| e.to_string())?; - - println!("capture_select 运行耗时: {:?}", start.elapsed()); - Ok(filename) +pub async fn capture_select(app_handle: tauri::AppHandle, path: String) -> Result { + let filename = platform::capture_select(&app_handle, path).await?; + Ok(filename) } #[tauri::command] -pub async fn capture_window( - app_handle: tauri::AppHandle, - path: String, -) -> Result { - let start = Instant::now(); - - let images_dir = get_images_dir(app_handle, path)?; - - let filename = format!("screenshot_{}.png", Local::now().format("%Y%m%d_%H%M%S")); - let output_path = images_dir.join(&filename); - - Command::new("osascript") - .args([ - "-e", - "tell application \"System Events\" to key code 48 using {command down}", - ]) // Cmd+Tab - .output() - .map_err(|e| e.to_string())?; - - thread::sleep(Duration::from_secs(1)); - - let output = Command::new("screencapture") - .args([ - "-iw", // 交互式窗口选择 - "-t", - "png", // 明确指定 PNG 格式 - "-C", // 捕获鼠标光标 - "-o", // 不包含窗口阴影 - "-T", - "0", // 没有延迟 - output_path.to_str().unwrap(), - ]) - .output() - .map_err(|e| e.to_string())?; - - if !output.status.success() { - println!("screencapture -wx 失败: {:?}", output.status); - } - - println!("capture_window 运行耗时: {:?}", start.elapsed()); - - Ok(filename) -} - -pub fn get_images_dir( - app_handle: tauri::AppHandle, - path: String, -) -> Result { - let store = app_handle - .get_store("settings.json") - .ok_or_else(|| "Could not get settings store".to_string())?; - - let screenshot_path = store - .get("screenshot_path") - .ok_or_else(|| "Screenshot path not found in settings".to_string())?; - println!("screenshot_path: {:?}", screenshot_path); - - // get value from Option - let screenshot_path = screenshot_path - .as_object() - .and_then(|obj| obj.get("value")) - .and_then(|value| value.as_str()) - .unwrap(); - - // 获取 AppLocalData 路径 - // 如果 screenshot_path 为空,则使用 app_local_data - let app_local_data = if screenshot_path.is_empty() { - app_handle.path().app_local_data_dir().unwrap() - } else { - PathBuf::from(screenshot_path) - }; - println!("app_local_data: {:?}", app_local_data); - - // 创建 images 文件夹 - // path 如果为空,则使用 app_local_data - let images_dir = if path.is_empty() { - app_local_data - } else { - app_local_data.join(path) - }; - - println!("images_dir: {:?}", images_dir); - std::fs::create_dir_all(&images_dir).map_err(|e| e.to_string())?; - - // let filename = format!("screenshot_{}.png", Local::now().format("%Y%m%d_%H%M%S")); - // let output_path = images_dir.join(&filename); - - Ok(images_dir) +pub async fn capture_window(app_handle: tauri::AppHandle, path: String) -> Result { + let filename = platform::capture_window(&app_handle, path).await?; + Ok(filename) } diff --git a/src-tauri/src/cmd/window.rs b/src-tauri/src/cmd/window.rs index 0453e24..8d4c565 100644 --- a/src-tauri/src/cmd/window.rs +++ b/src-tauri/src/cmd/window.rs @@ -1,4 +1,4 @@ -use tauri::{AppHandle, Manager}; +use tauri::AppHandle; use crate::window; @@ -10,6 +10,7 @@ pub fn show_preview_window(app: AppHandle, path: String) -> Result Result<(), String> { + println!("hide_preview_window"); window::hide_preview_window(&app); Ok(()) } diff --git a/src-tauri/src/cmd/xcreenshot.rs b/src-tauri/src/cmd/xcreenshot.rs index 341b71c..5f927f4 100644 --- a/src-tauri/src/cmd/xcreenshot.rs +++ b/src-tauri/src/cmd/xcreenshot.rs @@ -2,16 +2,13 @@ use std::path::PathBuf; use chrono::Local; use std::time::Instant; -use tauri::{Manager, Runtime}; -use tauri_plugin_store::StoreExt; use xcap::{Monitor, Window}; +use crate::common::get_images_dir; + #[tauri::command] -pub async fn xcap_window( - app_handle: tauri::AppHandle, - path: String, -) -> Result { - let images_dir = get_images_dir(app_handle, path).unwrap(); +pub async fn xcap_window(app_handle: tauri::AppHandle, path: String) -> Result { + let images_dir = get_images_dir(&app_handle, path).unwrap(); let filename = window_capture(images_dir)?; @@ -19,11 +16,8 @@ pub async fn xcap_window( } #[tauri::command] -pub async fn xcap_monitor( - app_handle: tauri::AppHandle, - path: String, -) -> Result { - let images_dir = get_images_dir(app_handle, path).unwrap(); +pub async fn xcap_monitor(app_handle: tauri::AppHandle, path: String) -> Result { + let images_dir = get_images_dir(&app_handle, path).unwrap(); let filename = monitor_capture(images_dir)?; @@ -104,49 +98,3 @@ fn monitor_capture(path: PathBuf) -> Result { Ok(filename) } - -pub fn get_images_dir( - app_handle: tauri::AppHandle, - path: String, -) -> Result { - let store = app_handle - .get_store("settings.json") - .ok_or_else(|| "Could not get settings store".to_string())?; - - let screenshot_path = store - .get("screenshot_path") - .ok_or_else(|| "Screenshot path not found in settings".to_string())?; - println!("screenshot_path: {:?}", screenshot_path); - - // get value from Option - let screenshot_path = screenshot_path - .as_object() - .and_then(|obj| obj.get("value")) - .and_then(|value| value.as_str()) - .unwrap(); - - // 获取 AppLocalData 路径 - // 如果 screenshot_path 为空,则使用 app_local_data - let app_local_data = if screenshot_path.is_empty() { - app_handle.path().app_local_data_dir().unwrap() - } else { - PathBuf::from(screenshot_path) - }; - println!("app_local_data: {:?}", app_local_data); - - // 创建 images 文件夹 - // path 如果为空,则使用 app_local_data - let images_dir = if path.is_empty() { - app_local_data - } else { - app_local_data.join(path) - }; - - println!("images_dir: {:?}", images_dir); - std::fs::create_dir_all(&images_dir).map_err(|e| e.to_string())?; - - // let filename = format!("screenshot_{}.png", Local::now().format("%Y%m%d_%H%M%S")); - // let output_path = images_dir.join(&filename); - - Ok(images_dir) -} diff --git a/src-tauri/src/common.rs b/src-tauri/src/common.rs new file mode 100644 index 0000000..92cbb1d --- /dev/null +++ b/src-tauri/src/common.rs @@ -0,0 +1,47 @@ +use std::path::PathBuf; + +use tauri::Manager; +use tauri_plugin_store::StoreExt; + +pub fn get_images_dir(app_handle: &tauri::AppHandle, path: String) -> Result { + let store = app_handle + .get_store("settings.json") + .ok_or_else(|| "Could not get settings store".to_string())?; + + let screenshot_path = store + .get("screenshot_path") + .ok_or_else(|| "Screenshot path not found in settings".to_string())?; + println!("screenshot_path: {:?}", screenshot_path); + + // get value from Option + let screenshot_path = screenshot_path + .as_object() + .and_then(|obj| obj.get("value")) + .and_then(|value| value.as_str()) + .unwrap(); + + // 获取 AppLocalData 路径 + // 如果 screenshot_path 为空,则使用 app_local_data + let app_local_data = if screenshot_path.is_empty() { + app_handle.path().app_local_data_dir().unwrap() + } else { + PathBuf::from(screenshot_path) + }; + println!("app_local_data: {:?}", app_local_data); + + // 创建 images 文件夹 + // path 如果为空,则使用 app_local_data + let images_dir = if path.is_empty() { + app_local_data + } else { + app_local_data.join(path) + }; + + println!("images_dir: {:?}", images_dir); + std::fs::create_dir_all(&images_dir).map_err(|e| e.to_string())?; + + // let filename = format!("screenshot_{}.png", Local::now().format("%Y%m%d_%H%M%S")); + // let output_path = images_dir.join(&filename); + + Ok(images_dir) +} diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 69b9fda..9e3c5ca 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -3,6 +3,7 @@ use tauri::Manager; use tauri_plugin_store::StoreExt; mod cmd; +mod common; mod constants; mod menu; mod platform; diff --git a/src-tauri/src/menu.rs b/src-tauri/src/menu.rs index 2f4e656..402a0f1 100644 --- a/src-tauri/src/menu.rs +++ b/src-tauri/src/menu.rs @@ -7,7 +7,7 @@ use tauri::{ AppHandle, Manager, }; -use crate::window; +use crate::{platform, window}; #[derive(Debug, Display, EnumString)] #[allow(non_camel_case_types, clippy::upper_case_acronyms)] @@ -162,22 +162,38 @@ fn handle_tray_menu_events(app: &AppHandle, event: MenuEvent) { match menu_id { MenuID::CAPTURE_SCREEN => { println!("Capture Screen"); + let _ = tauri::async_runtime::block_on(platform::capture_screen( + &app, + "images".to_string(), + )); + window::hide_main_window(app); + window::show_preview_window(app); } MenuID::CAPTURE_SELECT => { println!("Capture Select"); + let _ = tauri::async_runtime::block_on(platform::capture_select( + &app, + "images".to_string(), + )); window::hide_main_window(app); window::show_preview_window(app); } MenuID::CAPTURE_WINDOW => { println!("Capture Window"); + let _ = tauri::async_runtime::block_on(platform::capture_window( + &app, + "images".to_string(), + )); + window::hide_main_window(app); + window::show_preview_window(app); } MenuID::SHOW_MAIN_WINDOW => { println!("Show Home"); - window::show_main_window(app); + window::show_main_window(&app); } MenuID::SHOW_SETTING_WINDOW => { println!("Setting Manager"); - window::show_setting_window(app); + window::show_setting_window(&app); } MenuID::EXIT => { println!("Exit"); diff --git a/src-tauri/src/platform/linux.rs b/src-tauri/src/platform/linux/linux.rs similarity index 100% rename from src-tauri/src/platform/linux.rs rename to src-tauri/src/platform/linux/linux.rs diff --git a/src-tauri/src/platform/linux/mod.rs b/src-tauri/src/platform/linux/mod.rs new file mode 100644 index 0000000..5d04731 --- /dev/null +++ b/src-tauri/src/platform/linux/mod.rs @@ -0,0 +1,3 @@ +mod linux; + +pub use linux::*; diff --git a/src-tauri/src/platform/mac/mod.rs b/src-tauri/src/platform/mac/mod.rs new file mode 100644 index 0000000..4a8f2e8 --- /dev/null +++ b/src-tauri/src/platform/mac/mod.rs @@ -0,0 +1,5 @@ +mod screenshot; +mod window; + +pub use screenshot::*; +pub use window::*; diff --git a/src-tauri/src/platform/mac/screenshot.rs b/src-tauri/src/platform/mac/screenshot.rs new file mode 100644 index 0000000..2dfd0c9 --- /dev/null +++ b/src-tauri/src/platform/mac/screenshot.rs @@ -0,0 +1,90 @@ +use std::{ + process::Command, + thread, + time::{Duration, Instant}, +}; + +use chrono::Local; + +use crate::common::get_images_dir; + +pub async fn capture_screen(app_handle: &tauri::AppHandle, path: String) -> Result { + let start = Instant::now(); + + let images_dir = get_images_dir(&app_handle, path)?; + + println!("images_dir: {:?}", images_dir); + std::fs::create_dir_all(&images_dir).map_err(|e| e.to_string())?; + + let filename = format!("screenshot_{}.png", Local::now().format("%Y%m%d_%H%M%S")); + let output_path = images_dir.join(&filename); + + Command::new("screencapture") + .arg("-x") + .arg(output_path.to_str().unwrap()) + .output() + .map_err(|e| e.to_string())?; + + println!("capture_screen 运行耗时: {:?}", start.elapsed()); + Ok(filename) +} + +pub async fn capture_select(app_handle: &tauri::AppHandle, path: String) -> Result { + let start = Instant::now(); + + let images_dir = get_images_dir(&app_handle, path)?; + + let filename = format!("screenshot_{}.png", Local::now().format("%Y%m%d_%H%M%S")); + let output_path = images_dir.join(&filename); + + Command::new("screencapture") + .arg("-i") + .arg("-x") + .arg(output_path.to_str().unwrap()) + .output() + .map_err(|e| e.to_string())?; + + println!("capture_select 运行耗时: {:?}", start.elapsed()); + Ok(filename) +} + +pub async fn capture_window(app_handle: &tauri::AppHandle, path: String) -> Result { + let start = Instant::now(); + + let images_dir = get_images_dir(&app_handle, path)?; + + let filename = format!("screenshot_{}.png", Local::now().format("%Y%m%d_%H%M%S")); + let output_path = images_dir.join(&filename); + + Command::new("osascript") + .args([ + "-e", + "tell application \"System Events\" to key code 48 using {command down}", + ]) // Cmd+Tab + .output() + .map_err(|e| e.to_string())?; + + thread::sleep(Duration::from_secs(1)); + + let output = Command::new("screencapture") + .args([ + "-iw", // 交互式窗口选择 + "-t", + "png", // 明确指定 PNG 格式 + "-C", // 捕获鼠标光标 + "-o", // 不包含窗口阴影 + "-T", + "0", // 没有延迟 + output_path.to_str().unwrap(), + ]) + .output() + .map_err(|e| e.to_string())?; + + if !output.status.success() { + println!("screencapture -wx 失败: {:?}", output.status); + } + + println!("capture_window 运行耗时: {:?}", start.elapsed()); + + Ok(filename) +} diff --git a/src-tauri/src/platform/mac.rs b/src-tauri/src/platform/mac/window.rs similarity index 100% rename from src-tauri/src/platform/mac.rs rename to src-tauri/src/platform/mac/window.rs diff --git a/src-tauri/src/platform/window/mod.rs b/src-tauri/src/platform/window/mod.rs new file mode 100644 index 0000000..dfee58e --- /dev/null +++ b/src-tauri/src/platform/window/mod.rs @@ -0,0 +1,3 @@ +mod window; + +pub use window::*; diff --git a/src-tauri/src/platform/window.rs b/src-tauri/src/platform/window/window.rs similarity index 100% rename from src-tauri/src/platform/window.rs rename to src-tauri/src/platform/window/window.rs diff --git a/src-tauri/src/window.rs b/src-tauri/src/window.rs index 9058846..12db397 100644 --- a/src-tauri/src/window.rs +++ b/src-tauri/src/window.rs @@ -186,9 +186,8 @@ pub fn show_preview_window(app: &AppHandle) { pub fn hide_preview_window(app: &AppHandle) { if let Some(preview_window) = app.get_webview_window(PREVIEW_WINDOW) { if preview_window.is_visible().unwrap_or_default() { - return; + platform::hide_preview_window(&preview_window); } - platform::hide_preview_window(&preview_window); } } @@ -201,7 +200,6 @@ pub fn hide_main_window(app: &AppHandle) { if let Some(main_window) = app.get_webview_window(MAIN_WINDOW) { if main_window.is_visible().unwrap_or_default() { platform::hide_main_window(&main_window); - return; } } } @@ -215,7 +213,6 @@ pub fn hide_setting_window(app: &AppHandle) { if let Some(setting_window) = app.get_webview_window(SETTING_WINDOW) { if setting_window.is_visible().unwrap_or_default() { platform::hide_setting_window(&setting_window); - return; } } } diff --git a/src/pages/preview/App.vue b/src/pages/preview/App.vue index e2c7c4b..70332a7 100644 --- a/src/pages/preview/App.vue +++ b/src/pages/preview/App.vue @@ -1,5 +1,6 @@