mirror of
https://github.com/italicsjenga/winit-sonoma-fix.git
synced 2024-12-24 22:31:30 +11:00
Merge pull request #511 from thelink2012/drop-win32
[0.3] DroppedFile event for Win32
This commit is contained in:
commit
bb96e8a58a
|
@ -51,6 +51,7 @@ core-graphics = "0"
|
||||||
|
|
||||||
[target.i686-pc-windows-gnu.dependencies]
|
[target.i686-pc-windows-gnu.dependencies]
|
||||||
winapi = "~0.1.18"
|
winapi = "~0.1.18"
|
||||||
|
shell32-sys = "0.1"
|
||||||
gdi32-sys = "0.1"
|
gdi32-sys = "0.1"
|
||||||
user32-sys = "~0.1.1"
|
user32-sys = "~0.1.1"
|
||||||
kernel32-sys = "0.1"
|
kernel32-sys = "0.1"
|
||||||
|
@ -58,6 +59,7 @@ dwmapi-sys = "0.1"
|
||||||
|
|
||||||
[target.x86_64-pc-windows-gnu.dependencies]
|
[target.x86_64-pc-windows-gnu.dependencies]
|
||||||
winapi = "~0.1.18"
|
winapi = "~0.1.18"
|
||||||
|
shell32-sys = "0.1"
|
||||||
gdi32-sys = "0.1"
|
gdi32-sys = "0.1"
|
||||||
user32-sys = "~0.1.1"
|
user32-sys = "~0.1.1"
|
||||||
kernel32-sys = "0.1"
|
kernel32-sys = "0.1"
|
||||||
|
@ -65,6 +67,7 @@ dwmapi-sys = "0.1"
|
||||||
|
|
||||||
[target.x86_64-pc-windows-msvc.dependencies]
|
[target.x86_64-pc-windows-msvc.dependencies]
|
||||||
winapi = "~0.1.18"
|
winapi = "~0.1.18"
|
||||||
|
shell32-sys = "0.1"
|
||||||
gdi32-sys = "0.1"
|
gdi32-sys = "0.1"
|
||||||
user32-sys = "~0.1.1"
|
user32-sys = "~0.1.1"
|
||||||
kernel32-sys = "0.1"
|
kernel32-sys = "0.1"
|
||||||
|
|
|
@ -3,12 +3,15 @@ use std::ptr;
|
||||||
use std::cell::RefCell;
|
use std::cell::RefCell;
|
||||||
use std::sync::mpsc::Sender;
|
use std::sync::mpsc::Sender;
|
||||||
use std::sync::{Arc, Mutex};
|
use std::sync::{Arc, Mutex};
|
||||||
|
use std::ffi::OsString;
|
||||||
|
use std::os::windows::ffi::OsStringExt;
|
||||||
|
|
||||||
use CursorState;
|
use CursorState;
|
||||||
use Event;
|
use Event;
|
||||||
use super::event;
|
use super::event;
|
||||||
|
|
||||||
use user32;
|
use user32;
|
||||||
|
use shell32;
|
||||||
use winapi;
|
use winapi;
|
||||||
|
|
||||||
/// There's no parameters passed to the callback function, so it needs to get
|
/// There's no parameters passed to the callback function, so it needs to get
|
||||||
|
@ -249,6 +252,25 @@ pub unsafe extern "system" fn callback(window: winapi::HWND, msg: winapi::UINT,
|
||||||
0
|
0
|
||||||
},
|
},
|
||||||
|
|
||||||
|
winapi::WM_DROPFILES => {
|
||||||
|
use events::Event::DroppedFile;
|
||||||
|
|
||||||
|
let hdrop = wparam as winapi::HDROP;
|
||||||
|
let mut pathbuf: [u16; winapi::MAX_PATH] = unsafe { mem::uninitialized() };
|
||||||
|
let num_drops = shell32::DragQueryFileW(hdrop, 0xFFFFFFFF, ptr::null_mut(), 0);
|
||||||
|
|
||||||
|
for i in 0..num_drops {
|
||||||
|
let nch = shell32::DragQueryFileW(hdrop, i, pathbuf.as_mut_ptr(),
|
||||||
|
winapi::MAX_PATH as u32) as usize;
|
||||||
|
if nch > 0 {
|
||||||
|
send_event(window, DroppedFile(OsString::from_wide(&pathbuf[0..nch]).into()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
shell32::DragFinish(hdrop);
|
||||||
|
0
|
||||||
|
},
|
||||||
|
|
||||||
_ => {
|
_ => {
|
||||||
user32::DefWindowProcW(window, msg, wparam, lparam)
|
user32::DefWindowProcW(window, msg, wparam, lparam)
|
||||||
}
|
}
|
||||||
|
|
|
@ -133,7 +133,8 @@ unsafe fn init(title: Vec<u16>, builder: BuilderAttribs<'static>,
|
||||||
style | winapi::WS_VISIBLE
|
style | winapi::WS_VISIBLE
|
||||||
};
|
};
|
||||||
|
|
||||||
let handle = user32::CreateWindowExW(ex_style, class_name.as_ptr(),
|
let handle = user32::CreateWindowExW(ex_style | winapi::WS_EX_ACCEPTFILES,
|
||||||
|
class_name.as_ptr(),
|
||||||
title.as_ptr() as winapi::LPCWSTR,
|
title.as_ptr() as winapi::LPCWSTR,
|
||||||
style | winapi::WS_CLIPSIBLINGS | winapi::WS_CLIPCHILDREN,
|
style | winapi::WS_CLIPSIBLINGS | winapi::WS_CLIPCHILDREN,
|
||||||
x.unwrap_or(winapi::CW_USEDEFAULT), y.unwrap_or(winapi::CW_USEDEFAULT),
|
x.unwrap_or(winapi::CW_USEDEFAULT), y.unwrap_or(winapi::CW_USEDEFAULT),
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
#[derive(Clone, Debug, Copy)]
|
use std::path::PathBuf;
|
||||||
|
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
pub enum Event {
|
pub enum Event {
|
||||||
/// The size of the window has changed.
|
/// The size of the window has changed.
|
||||||
Resized(u32, u32),
|
Resized(u32, u32),
|
||||||
|
@ -9,6 +11,9 @@ pub enum Event {
|
||||||
/// The window has been closed.
|
/// The window has been closed.
|
||||||
Closed,
|
Closed,
|
||||||
|
|
||||||
|
/// A file has been dropped into the window.
|
||||||
|
DroppedFile(PathBuf),
|
||||||
|
|
||||||
/// The window received a unicode character.
|
/// The window received a unicode character.
|
||||||
ReceivedCharacter(char),
|
ReceivedCharacter(char),
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,8 @@ extern crate winapi;
|
||||||
#[cfg(target_os = "windows")]
|
#[cfg(target_os = "windows")]
|
||||||
extern crate kernel32;
|
extern crate kernel32;
|
||||||
#[cfg(target_os = "windows")]
|
#[cfg(target_os = "windows")]
|
||||||
|
extern crate shell32;
|
||||||
|
#[cfg(target_os = "windows")]
|
||||||
extern crate gdi32;
|
extern crate gdi32;
|
||||||
#[cfg(target_os = "windows")]
|
#[cfg(target_os = "windows")]
|
||||||
extern crate user32;
|
extern crate user32;
|
||||||
|
|
Loading…
Reference in a new issue