aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Cargo.toml3
-rw-r--r--src/api/win32/callback.rs22
-rw-r--r--src/api/win32/init.rs3
-rw-r--r--src/events.rs7
-rw-r--r--src/lib.rs2
5 files changed, 35 insertions, 2 deletions
diff --git a/Cargo.toml b/Cargo.toml
index 146cd46..14d7faa 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -39,6 +39,7 @@ core-graphics = "0"
[target.i686-pc-windows-gnu.dependencies]
winapi = "~0.1.18"
+shell32-sys = "0.1"
gdi32-sys = "0.1"
user32-sys = "~0.1.1"
kernel32-sys = "0.1"
@@ -46,6 +47,7 @@ dwmapi-sys = "0.1"
[target.x86_64-pc-windows-gnu.dependencies]
winapi = "~0.1.18"
+shell32-sys = "0.1"
gdi32-sys = "0.1"
user32-sys = "~0.1.1"
kernel32-sys = "0.1"
@@ -53,6 +55,7 @@ dwmapi-sys = "0.1"
[target.x86_64-pc-windows-msvc.dependencies]
winapi = "~0.1.18"
+shell32-sys = "0.1"
gdi32-sys = "0.1"
user32-sys = "~0.1.1"
kernel32-sys = "0.1"
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)
}
diff --git a/src/api/win32/init.rs b/src/api/win32/init.rs
index 7cb5433..cc6d2d2 100644
--- a/src/api/win32/init.rs
+++ b/src/api/win32/init.rs
@@ -133,7 +133,8 @@ unsafe fn init(title: Vec<u16>, builder: BuilderAttribs<'static>,
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,
style | winapi::WS_CLIPSIBLINGS | winapi::WS_CLIPCHILDREN,
x.unwrap_or(winapi::CW_USEDEFAULT), y.unwrap_or(winapi::CW_USEDEFAULT),
diff --git a/src/events.rs b/src/events.rs
index c175810..ef2c61d 100644
--- a/src/events.rs
+++ b/src/events.rs
@@ -1,4 +1,6 @@
-#[derive(Clone, Debug, Copy)]
+use std::path::PathBuf;
+
+#[derive(Clone, Debug)]
pub enum Event {
/// The size of the window has changed.
Resized(u32, u32),
@@ -9,6 +11,9 @@ pub enum Event {
/// The window has been closed.
Closed,
+ /// A file has been dropped into the window.
+ DroppedFile(PathBuf),
+
/// The window received a unicode character.
ReceivedCharacter(char),
diff --git a/src/lib.rs b/src/lib.rs
index 068b9b8..928966f 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -37,6 +37,8 @@ extern crate winapi;
#[cfg(target_os = "windows")]
extern crate kernel32;
#[cfg(target_os = "windows")]
+extern crate shell32;
+#[cfg(target_os = "windows")]
extern crate gdi32;
#[cfg(target_os = "windows")]
extern crate user32;