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,
+ });
}
}
}