From e979e4e9fcae7bc5ec49202b4046bea457e1883b Mon Sep 17 00:00:00 2001 From: Bonsix <[email protected]> Date: Thu, 24 Jul 2025 20:17:34 +0200 Subject: [PATCH 1/2] fix dropped files on Windows OS not resetting to default --- src/native/windows.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/native/windows.rs b/src/native/windows.rs index fa6fc80c..28bf447c 100644 --- a/src/native/windows.rs +++ b/src/native/windows.rs @@ -520,6 +520,7 @@ unsafe extern "system" fn win32_wndproc( let num_drops = DragQueryFileW(hdrop, u32::MAX, std::ptr::null_mut(), 0); let mut d = crate::native_display().lock().unwrap(); + d.dropped_files = Default::default(); for i in 0..num_drops { let path_ptr = path.as_mut_ptr() as *mut u16; let path_len = DragQueryFileW(hdrop, i, path_ptr, MAX_PATH as u32) as usize; From 58938e9040577fe2b7d00e0f58bc20209355c51b Mon Sep 17 00:00:00 2001 From: Bonsix <[email protected]> Date: Fri, 25 Jul 2025 17:46:33 +0200 Subject: [PATCH 2/2] refactor file dropping to use a single Vec instead of two --- src/lib.rs | 6 +++--- src/native.rs | 10 +++++----- src/native/linux_wayland.rs | 5 ++--- src/native/linux_x11.rs | 5 ++--- src/native/wasm.rs | 5 ++--- src/native/windows.rs | 8 +++++--- 6 files changed, 19 insertions(+), 20 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index db1b3a7e..a6c119f5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -298,15 +298,15 @@ pub mod window { } pub fn dropped_file_count() -> usize { let d = native_display().lock().unwrap(); - d.dropped_files.bytes.len() + d.dropped_files.len() } pub fn dropped_file_bytes(index: usize) -> Option> { let d = native_display().lock().unwrap(); - d.dropped_files.bytes.get(index).cloned() + d.dropped_files.get(index).map(|file| file.bytes.clone()) } pub fn dropped_file_path(index: usize) -> Option { let d = native_display().lock().unwrap(); - d.dropped_files.paths.get(index).cloned() + d.dropped_files.get(index).map(|file| file.path.clone()) } /// Show/hide onscreen keyboard. diff --git a/src/native.rs b/src/native.rs index 88640a55..0ed92ee1 100644 --- a/src/native.rs +++ b/src/native.rs @@ -2,11 +2,11 @@ use std::sync::mpsc; -#[derive(Default)] -pub(crate) struct DroppedFiles { - pub paths: Vec, - pub bytes: Vec>, +pub(crate) struct DroppedFile { + pub path: std::path::PathBuf, + pub bytes: Vec, } + pub(crate) struct NativeDisplayData { pub screen_width: i32, pub screen_height: i32, @@ -17,7 +17,7 @@ pub(crate) struct NativeDisplayData { pub quit_ordered: bool, pub native_requests: mpsc::Sender, pub clipboard: Box, - pub dropped_files: DroppedFiles, + pub dropped_files: Vec, pub blocking_event_loop: bool, #[cfg(target_vendor = "apple")] diff --git a/src/native/linux_wayland.rs b/src/native/linux_wayland.rs index 3b8ff0b4..1f2e380e 100644 --- a/src/native/linux_wayland.rs +++ b/src/native/linux_wayland.rs @@ -18,7 +18,7 @@ use libxkbcommon::*; use crate::{ event::{EventHandler, KeyCode, KeyMods, MouseButton}, - native::{egl, NativeDisplayData, Request}, + native::{egl, DroppedFile, NativeDisplayData, Request}, }; use core::time::Duration; @@ -1277,8 +1277,7 @@ where for filename in filenames.lines() { let path = std::path::PathBuf::from(filename); if let Ok(bytes) = std::fs::read(&path) { - d.dropped_files.paths.push(path); - d.dropped_files.bytes.push(bytes); + d.dropped_files.push(DroppedFile { path, bytes }); } } // drop d since files_dropped_event is likely to need access to it diff --git a/src/native/linux_x11.rs b/src/native/linux_x11.rs index 31c9605b..5d179734 100644 --- a/src/native/linux_x11.rs +++ b/src/native/linux_x11.rs @@ -11,7 +11,7 @@ mod xi_input; use crate::{ event::EventHandler, - native::{egl, gl, module, NativeDisplayData, Request}, + native::{egl, gl, module, DroppedFile, NativeDisplayData, Request}, CursorIcon, }; @@ -203,8 +203,7 @@ impl X11Display { for filename in filenames.lines() { let path = std::path::PathBuf::from(filename); if let Ok(bytes) = std::fs::read(&path) { - d.dropped_files.paths.push(path); - d.dropped_files.bytes.push(bytes); + d.dropped_files.push(DroppedFile { path, bytes }); } } // drop d since files_dropped_event is likely to need access to it diff --git a/src/native/wasm.rs b/src/native/wasm.rs index 6ac297e5..35fef1c0 100644 --- a/src/native/wasm.rs +++ b/src/native/wasm.rs @@ -12,7 +12,7 @@ use std::{ use crate::{ event::EventHandler, - native::{NativeDisplayData, Request}, + native::{DroppedFile, NativeDisplayData, Request}, }; // fn dropped_file_count(&mut self) -> usize { @@ -362,6 +362,5 @@ pub extern "C" fn on_file_dropped( let path = PathBuf::from(unsafe { String::from_raw_parts(path, path_len, path_len) }); let bytes = unsafe { Vec::from_raw_parts(bytes, bytes_len, bytes_len) }; - d.dropped_files.paths.push(path); - d.dropped_files.bytes.push(bytes); + d.dropped_files.push(DroppedFile { path, bytes }); } diff --git a/src/native/windows.rs b/src/native/windows.rs index 28bf447c..e6cf3bb3 100644 --- a/src/native/windows.rs +++ b/src/native/windows.rs @@ -3,7 +3,7 @@ use std::{ffi::OsString, os::windows::ffi::OsStringExt, path::PathBuf}; use crate::{ conf::{Conf, Icon}, event::{KeyMods, MouseButton}, - native::{NativeDisplayData, Request}, + native::{DroppedFile, NativeDisplayData, Request}, CursorIcon, EventHandler, }; @@ -531,8 +531,10 @@ unsafe extern "system" fn win32_wndproc( let path = path.assume_init(); PathBuf::from(OsString::from_wide(&path[0..path_len])) }; - d.dropped_files.bytes.push(std::fs::read(&path).unwrap()); - d.dropped_files.paths.push(path); + d.dropped_files.push(DroppedFile { + bytes: std::fs::read(&path).unwrap(), + path, + }); } } }