diff options
author | tomaka <pierre.krieger1708@gmail.com> | 2015-07-09 11:06:38 +0200 |
---|---|---|
committer | tomaka <pierre.krieger1708@gmail.com> | 2015-07-09 11:06:38 +0200 |
commit | bb96e8a58a476f17e3a5351e546de1f2398027b9 (patch) | |
tree | 187cf2a937a370327597a23e5e1adb9097d118d6 /src/api/win32/callback.rs | |
parent | 6b5d0e6e2831f2461fab9fc40e43b7c64591449b (diff) | |
parent | 826931e2c2e61ec7815d25ec33618bfe4aacff0d (diff) | |
download | glutin-bb96e8a58a476f17e3a5351e546de1f2398027b9.tar.gz glutin-bb96e8a58a476f17e3a5351e546de1f2398027b9.zip |
Merge pull request #511 from thelink2012/drop-win32
[0.3] DroppedFile event for Win32
Diffstat (limited to 'src/api/win32/callback.rs')
-rw-r--r-- | src/api/win32/callback.rs | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/src/api/win32/callback.rs b/src/api/win32/callback.rs index 6ac56f3..25beb7b 100644 --- a/src/api/win32/callback.rs +++ b/src/api/win32/callback.rs @@ -3,12 +3,15 @@ use std::ptr; use std::cell::RefCell; use std::sync::mpsc::Sender; use std::sync::{Arc, Mutex}; +use std::ffi::OsString; +use std::os::windows::ffi::OsStringExt; use CursorState; use Event; use super::event; use user32; +use shell32; use winapi; /// 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 }, + 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) } |