Merge pull request #511 from thelink2012/drop-win32

[0.3] DroppedFile event for Win32
This commit is contained in:
tomaka 2015-07-09 11:06:38 +02:00
commit bb96e8a58a
5 changed files with 35 additions and 2 deletions

View file

@ -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"

View file

@ -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)
} }

View file

@ -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),

View file

@ -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),

View file

@ -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;