aboutsummaryrefslogtreecommitdiffstats
path: root/src/api/win32/callback.rs
diff options
context:
space:
mode:
authorDenilson M. Amorim <dma_2012@hotmail.com>2015-06-23 19:05:37 -0300
committerDenilson M. Amorim <dma_2012@hotmail.com>2015-06-23 19:05:37 -0300
commit826931e2c2e61ec7815d25ec33618bfe4aacff0d (patch)
treed9158fe0734426e0c1c4d2072628ee7bff5bbe0b /src/api/win32/callback.rs
parent1aedc828c55e94d6f301a100f958ffa1106a0a25 (diff)
downloadglutin-826931e2c2e61ec7815d25ec33618bfe4aacff0d.tar.gz
glutin-826931e2c2e61ec7815d25ec33618bfe4aacff0d.zip
DroppedFile event for Win32
Diffstat (limited to 'src/api/win32/callback.rs')
-rw-r--r--src/api/win32/callback.rs22
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)
}