From 1443a1bec591abb84a3078e16e77b49538d12988 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 14 Apr 2026 09:18:46 +0000 Subject: [PATCH 1/3] Initial plan From 02a5a804671900fed1506e549bad65763c06c09f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 14 Apr 2026 09:26:21 +0000 Subject: [PATCH 2/3] feat: add uacPrivileges administrator and remove redundant permission checks Agent-Logs-Url: https://github.com/jiuya/locksun/sessions/6cdd290e-cfef-413e-bcc3-524041e41a38 Co-authored-by: jiuya <6884687+jiuya@users.noreply.github.com> --- src-tauri/src/commands/mod.rs | 4 +--- src-tauri/src/lib.rs | 12 +----------- src-tauri/src/scheduler/mod.rs | 23 +---------------------- src-tauri/tauri.conf.json | 3 ++- 4 files changed, 5 insertions(+), 37 deletions(-) diff --git a/src-tauri/src/commands/mod.rs b/src-tauri/src/commands/mod.rs index 2159ba2..fd5d87e 100644 --- a/src-tauri/src/commands/mod.rs +++ b/src-tauri/src/commands/mod.rs @@ -8,15 +8,13 @@ use crate::{ }; use chrono::Local; use serde::{Deserialize, Serialize}; -use std::sync::{Arc, Mutex}; +use std::sync::Arc; use tauri::State; use tokio::sync::Notify; /// アプリ共有状態 pub struct AppState { pub update_notify: Arc, - /// 権限エラー通知済みフラグ(重複通知を防ぐ) - pub permission_notified: Mutex, } /// 設定を取得する diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 3feb605..7728b3c 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -10,7 +10,7 @@ pub mod renderer; pub mod scheduler; pub mod sun; -use std::sync::{Arc, Mutex}; +use std::sync::Arc; use tauri::{ menu::{Menu, MenuItem}, tray::{MouseButton, MouseButtonState, TrayIconBuilder, TrayIconEvent}, @@ -24,7 +24,6 @@ pub fn run() { tauri::Builder::default() .manage(commands::AppState { update_notify: Arc::new(tokio::sync::Notify::new()), - permission_notified: Mutex::new(false), }) .plugin(tauri_plugin_shell::init()) .plugin(tauri_plugin_autostart::init( @@ -87,15 +86,6 @@ pub fn run() { }) .build(app)?; - // 起動時権限チェック: 管理者権限がなければトレイツールチップに警告を設定する - #[cfg(target_os = "windows")] - if !lockscreen::check_permission() { - log::warn!("管理者権限なし: ロックスクリーンを変更できません"); - let _ = _tray.set_tooltip(Some("⚠️ Locksun: 管理者権限が必要です")); - let state = app.state::(); - *state.permission_notified.lock().unwrap() = true; - } - // スケジューラーをバックグラウンドで開始 let app_handle = app.handle().clone(); tauri::async_runtime::spawn(async move { diff --git a/src-tauri/src/scheduler/mod.rs b/src-tauri/src/scheduler/mod.rs index e7d3757..325123b 100644 --- a/src-tauri/src/scheduler/mod.rs +++ b/src-tauri/src/scheduler/mod.rs @@ -17,28 +17,7 @@ pub async fn start(app: AppHandle) { loop { if let Err(e) = run_once(&app).await { - // Windows のみ: 権限エラーを検知してトレイ通知する(1回のみ) - #[cfg(target_os = "windows")] - { - if !lockscreen::check_permission() { - log::warn!("権限エラーを検出: {e:#}"); - let state = app.state::(); - let mut notified = state.permission_notified.lock().unwrap(); - if !*notified { - *notified = true; - if let Some(tray) = app.tray_by_id("main") { - let _ = tray.set_tooltip(Some("⚠️ Locksun: 管理者権限が必要です")); - } - log::warn!("権限エラー: トレイ通知を更新しました"); - } - } else { - log::error!("更新サイクルエラー: {e:#}"); - } - } - #[cfg(not(target_os = "windows"))] - { - log::error!("更新サイクルエラー: {e:#}"); - } + log::error!("更新サイクルエラー: {e:#}"); } let interval = config::load() diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index cc2b6a7..bf3c24e 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -46,7 +46,8 @@ "windows": { "certificateThumbprint": null, "digestAlgorithm": "sha256", - "timestampUrl": "" + "timestampUrl": "", + "uacPrivileges": "administrator" } } } From 25260d012d26f6bdc2d843c6abeb2928b2b7d136 Mon Sep 17 00:00:00 2001 From: jiuya Date: Tue, 21 Apr 2026 21:09:05 +0900 Subject: [PATCH 3/3] =?UTF-8?q?feat:=20=E3=83=AA=E3=83=AA=E3=83=BC?= =?UTF-8?q?=E3=82=B9=E3=83=93=E3=83=AB=E3=83=89=E6=99=82=E3=81=AE=E3=81=BF?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E8=80=85=E6=A8=A9=E9=99=90=E3=83=9E=E3=83=8B?= =?UTF-8?q?=E3=83=95=E3=82=A7=E3=82=B9=E3=83=88=E3=82=92=E9=81=A9=E7=94=A8?= =?UTF-8?q?=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - build.rs: リリースビルドのみ requireAdministrator マニフェストを埋め込む デバッグビルドで適用すると cargo run が os error 740 で失敗するため - locksun.exe.manifest: requireAdministrator マニフェストファイルを追加 - tauri.conf.json: uacPrivileges: administrator を削除(build.rs で制御) - renderer/mod.rs: render_to_bytes() 関数を追加 - commands/mod.rs, scheduler/mod.rs: enhance_image の引数を所有権移転に変更 --- src-tauri/build.rs | 13 +++++++++++++ src-tauri/locksun.exe.manifest | 28 ++++++++++++++++++++++++++++ src-tauri/src/commands/mod.rs | 4 ++-- src-tauri/src/renderer/mod.rs | 10 ++++++++++ src-tauri/src/scheduler/mod.rs | 2 +- src-tauri/tauri.conf.json | 3 +-- 6 files changed, 55 insertions(+), 5 deletions(-) create mode 100644 src-tauri/locksun.exe.manifest diff --git a/src-tauri/build.rs b/src-tauri/build.rs index 158c051..36dd018 100644 --- a/src-tauri/build.rs +++ b/src-tauri/build.rs @@ -1,3 +1,16 @@ fn main() { + #[cfg(target_os = "windows")] + { + let profile = std::env::var("PROFILE").unwrap_or_default(); + let mut windows = tauri_build::WindowsAttributes::new(); + // リリースビルドのみ requireAdministrator マニフェストを適用する。 + // デバッグビルドで適用すると `cargo run` が os error 740 で失敗するため。 + if profile == "release" { + windows = windows.app_manifest(include_str!("locksun.exe.manifest")); + } + let attrs = tauri_build::Attributes::new().windows_attributes(windows); + tauri_build::try_build(attrs).expect("failed to run tauri-build"); + return; + } tauri_build::build(); } diff --git a/src-tauri/locksun.exe.manifest b/src-tauri/locksun.exe.manifest new file mode 100644 index 0000000..68c93ec --- /dev/null +++ b/src-tauri/locksun.exe.manifest @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/src-tauri/src/commands/mod.rs b/src-tauri/src/commands/mod.rs index fd5d87e..b012978 100644 --- a/src-tauri/src/commands/mod.rs +++ b/src-tauri/src/commands/mod.rs @@ -91,7 +91,7 @@ pub async fn preview_image_enhanced() -> Result { }; // Gemini AI 強化 - let enhanced = crate::gemini::enhance_image(&cfg.gemini, &pos, &png_bytes) + let enhanced = crate::gemini::enhance_image(&cfg.gemini, &pos, png_bytes) .await .map_err(|e| e.to_string())?; @@ -149,7 +149,7 @@ pub async fn preview_image_enhanced_with_config(cfg: config::AppConfig) -> Resul buf.into_inner() }; - let enhanced = crate::gemini::enhance_image(&cfg.gemini, &pos, &png_bytes) + let enhanced = crate::gemini::enhance_image(&cfg.gemini, &pos, png_bytes) .await .map_err(|e| e.to_string())?; diff --git a/src-tauri/src/renderer/mod.rs b/src-tauri/src/renderer/mod.rs index 07cc848..8bb4ec2 100644 --- a/src-tauri/src/renderer/mod.rs +++ b/src-tauri/src/renderer/mod.rs @@ -10,6 +10,8 @@ pub mod sky; use crate::config::ImageConfig; use crate::sun::SunPosition; use anyhow::Result; +use image::ImageFormat; +use std::io::Cursor; use std::path::Path; /// メインエントリー: 太陽位置から画像を生成してパスに保存 @@ -18,3 +20,11 @@ pub fn render_and_save(pos: &SunPosition, cfg: &ImageConfig, output: &Path) -> R img.save(output)?; Ok(()) } + +/// 太陽位置から画像を生成して PNG バイト列として返す +pub fn render_to_bytes(pos: &SunPosition, cfg: &ImageConfig) -> Result> { + let img = composer::compose(pos, cfg)?; + let mut buf = Cursor::new(Vec::new()); + img.write_to(&mut buf, ImageFormat::Png)?; + Ok(buf.into_inner()) +} diff --git a/src-tauri/src/scheduler/mod.rs b/src-tauri/src/scheduler/mod.rs index 325123b..7a5b16f 100644 --- a/src-tauri/src/scheduler/mod.rs +++ b/src-tauri/src/scheduler/mod.rs @@ -61,7 +61,7 @@ pub async fn run_once_with_config(app: &AppHandle, cfg: &config::AppConfig) -> a // Gemini AI 強化が有効な場合は画像を加工する(失敗時はベース画像にフォールバック) let final_bytes = if cfg.gemini.enabled && !cfg.gemini.api_key.is_empty() { - match gemini::enhance_image(&cfg.gemini, &pos, &base_png).await { + match gemini::enhance_image(&cfg.gemini, &pos, base_png.clone()).await { Ok(enhanced_bytes) => { log::info!("Gemini AI 強化済み画像を保存しました"); enhanced_bytes diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index bf3c24e..cc2b6a7 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -46,8 +46,7 @@ "windows": { "certificateThumbprint": null, "digestAlgorithm": "sha256", - "timestampUrl": "", - "uacPrivileges": "administrator" + "timestampUrl": "" } } }