aboutsummaryrefslogtreecommitdiff
path: root/src/platform
diff options
context:
space:
mode:
Diffstat (limited to 'src/platform')
-rw-r--r--src/platform/fallback.rs2
-rw-r--r--src/platform/mod.rs8
-rw-r--r--src/platform/windows.rs33
3 files changed, 41 insertions, 2 deletions
diff --git a/src/platform/fallback.rs b/src/platform/fallback.rs
index 64e5467b..7e14dcd8 100644
--- a/src/platform/fallback.rs
+++ b/src/platform/fallback.rs
@@ -220,8 +220,6 @@ pub fn open_url(_url: &str) -> std::io::Result<Option<std::process::Child>> {
}
/// Unsupported platform stub.
-// Windows does not wire clipboard-image bridging into semantic input yet.
-#[cfg_attr(windows, allow(dead_code))]
pub fn read_clipboard_image() -> Option<ClipboardImage> {
None
}
diff --git a/src/platform/mod.rs b/src/platform/mod.rs
index 6323212a..fc80bc64 100644
--- a/src/platform/mod.rs
+++ b/src/platform/mod.rs
@@ -201,6 +201,14 @@ mod unix_common;
#[cfg(unix)]
pub(crate) use unix_common::{begin_cli_output, end_cli_output};
+#[cfg(not(windows))]
+pub(crate) fn replace_file(
+ source: &std::path::Path,
+ destination: &std::path::Path,
+) -> std::io::Result<()> {
+ std::fs::rename(source, destination)
+}
+
#[cfg(not(unix))]
pub(crate) fn begin_cli_output() {}
diff --git a/src/platform/windows.rs b/src/platform/windows.rs
index 413119ed..e63b8920 100644
--- a/src/platform/windows.rs
+++ b/src/platform/windows.rs
@@ -15,6 +15,39 @@ use std::{
mod clipboard_image;
+pub(crate) fn replace_file(
+ source: &std::path::Path,
+ destination: &std::path::Path,
+) -> std::io::Result<()> {
+ use std::os::windows::ffi::OsStrExt;
+ use windows_sys::Win32::Storage::FileSystem::{
+ MoveFileExW, MOVEFILE_REPLACE_EXISTING, MOVEFILE_WRITE_THROUGH,
+ };
+
+ let source = source
+ .as_os_str()
+ .encode_wide()
+ .chain(std::iter::once(0))
+ .collect::<Vec<_>>();
+ let destination = destination
+ .as_os_str()
+ .encode_wide()
+ .chain(std::iter::once(0))
+ .collect::<Vec<_>>();
+ let moved = unsafe {
+ MoveFileExW(
+ source.as_ptr(),
+ destination.as_ptr(),
+ MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH,
+ )
+ };
+ if moved == 0 {
+ Err(std::io::Error::last_os_error())
+ } else {
+ Ok(())
+ }
+}
+
pub(crate) fn set_default_plugin_pane_pwd(
_env: &mut Vec<(String, String)>,
_cwd: &std::path::Path,