diff --git a/.rustfmt.toml b/.rustfmt.toml index badd76d..e754330 100644 --- a/.rustfmt.toml +++ b/.rustfmt.toml @@ -1,3 +1,3 @@ -fn_args_layout = "Compressed" +fn_params_layout = "Compressed" use_small_heuristics = "Max" use_field_init_shorthand = true diff --git a/src/event.rs b/src/event.rs index 04d4908..64431a0 100644 --- a/src/event.rs +++ b/src/event.rs @@ -157,6 +157,6 @@ pub enum EventStatus { /// plugin window is in focus. Ignored, /// We are prepared to handle the data in the drag and dropping will - /// result in [DropEffect] + /// result in [DropEffect] AcceptDrop(DropEffect), } diff --git a/src/macos/mod.rs b/src/macos/mod.rs index 02a53c8..1164165 100644 --- a/src/macos/mod.rs +++ b/src/macos/mod.rs @@ -5,9 +5,8 @@ mod window; use cocoa::foundation::NSUInteger; pub use window::*; -const NSDragOperationNone: NSUInteger = 0; -const NSDragOperationCopy: NSUInteger = 1; -const NSDragOperationLink: NSUInteger = 2; -const NSDragOperationGeneric: NSUInteger = 4; -const NSDragOperationMove: NSUInteger = 16; - +const NSDragOperationNone: NSUInteger = 0; +const NSDragOperationCopy: NSUInteger = 1; +const NSDragOperationLink: NSUInteger = 2; +const NSDragOperationGeneric: NSUInteger = 4; +const NSDragOperationMove: NSUInteger = 16; diff --git a/src/macos/view.rs b/src/macos/view.rs index b0714da..80abdab 100644 --- a/src/macos/view.rs +++ b/src/macos/view.rs @@ -1,6 +1,6 @@ use std::ffi::c_void; -use cocoa::appkit::{NSEvent, NSView, NSWindow, NSFilenamesPboardType}; +use cocoa::appkit::{NSEvent, NSFilenamesPboardType, NSView, NSWindow}; use cocoa::base::{id, nil, BOOL, NO, YES}; use cocoa::foundation::{NSArray, NSPoint, NSRect, NSSize, NSUInteger}; @@ -15,13 +15,16 @@ use uuid::Uuid; use crate::MouseEvent::{ButtonPressed, ButtonReleased}; use crate::{ - Event, EventStatus, MouseButton, MouseEvent, Point, ScrollDelta, Size, WindowEvent, WindowInfo, - WindowOpenOptions, DropData, DropEffect, + DropData, DropEffect, Event, EventStatus, MouseButton, MouseEvent, Point, ScrollDelta, Size, + WindowEvent, WindowInfo, WindowOpenOptions, }; -use super::{NSDragOperationGeneric, NSDragOperationCopy, NSDragOperationMove, NSDragOperationLink, NSDragOperationNone}; -use super::keyboard::{make_modifiers, from_nsstring}; +use super::keyboard::{from_nsstring, make_modifiers}; use super::window::WindowState; +use super::{ + NSDragOperationCopy, NSDragOperationGeneric, NSDragOperationLink, NSDragOperationMove, + NSDragOperationNone, +}; /// Name of the field used to store the `WindowState` pointer. pub(super) const BASEVIEW_STATE_IVAR: &str = "baseview_state"; @@ -106,8 +109,11 @@ pub(super) unsafe fn create_view(window_options: &WindowOpenOptions) -> id { view.initWithFrame_(NSRect::new(NSPoint::new(0., 0.), NSSize::new(size.width, size.height))); - let _: id = msg_send![view, registerForDraggedTypes: NSArray::arrayWithObjects(nil, &[NSFilenamesPboardType])]; - + let _: id = msg_send![ + view, + registerForDraggedTypes: NSArray::arrayWithObjects(nil, &[NSFilenamesPboardType]) + ]; + view } @@ -173,10 +179,7 @@ unsafe fn create_view_class() -> &'static Class { sel!(draggingUpdated:), dragging_updated as extern "C" fn(&Object, Sel, id) -> NSUInteger, ); - class.add_method( - sel!(draggingExited:), - dragging_exited as extern "C" fn(&Object, Sel, id), - ); + class.add_method(sel!(draggingExited:), dragging_exited as extern "C" fn(&Object, Sel, id)); add_mouse_button_class_method!(class, mouseDown, ButtonPressed, MouseButton::Left); add_mouse_button_class_method!(class, mouseUp, ButtonReleased, MouseButton::Left); @@ -433,7 +436,7 @@ fn on_event(window_state: &mut WindowState, event: MouseEvent) -> NSUInteger { EventStatus::AcceptDrop(DropEffect::Link) => NSDragOperationLink, EventStatus::AcceptDrop(DropEffect::Scroll) => NSDragOperationGeneric, _ => NSDragOperationNone, - } + } } extern "C" fn dragging_entered(this: &Object, _sel: Sel, sender: id) -> NSUInteger { diff --git a/src/win/drop_target.rs b/src/win/drop_target.rs index bcfd036..2f3122a 100644 --- a/src/win/drop_target.rs +++ b/src/win/drop_target.rs @@ -2,31 +2,51 @@ use std::ffi::OsString; use std::mem::transmute; use std::os::windows::prelude::OsStringExt; use std::ptr::null_mut; -use std::rc::{Weak, Rc}; +use std::rc::{Rc, Weak}; -use winapi::Interface; -use winapi::shared::guiddef::{REFIID, IsEqualIID}; +use winapi::shared::guiddef::{IsEqualIID, REFIID}; use winapi::shared::minwindef::{DWORD, WPARAM}; use winapi::shared::ntdef::{HRESULT, ULONG}; use winapi::shared::windef::POINTL; -use winapi::shared::winerror::{S_OK, E_NOINTERFACE, E_UNEXPECTED}; +use winapi::shared::winerror::{E_NOINTERFACE, E_UNEXPECTED, S_OK}; use winapi::shared::wtypes::DVASPECT_CONTENT; -use winapi::um::objidl::{IDataObject, FORMATETC, TYMED_HGLOBAL, STGMEDIUM}; -use winapi::um::oleidl::{IDropTarget, IDropTargetVtbl, DROPEFFECT_COPY, DROPEFFECT_MOVE, DROPEFFECT_LINK, DROPEFFECT_SCROLL, DROPEFFECT_NONE}; +use winapi::um::objidl::{IDataObject, FORMATETC, STGMEDIUM, TYMED_HGLOBAL}; +use winapi::um::oleidl::{ + IDropTarget, IDropTargetVtbl, DROPEFFECT_COPY, DROPEFFECT_LINK, DROPEFFECT_MOVE, + DROPEFFECT_NONE, DROPEFFECT_SCROLL, +}; use winapi::um::shellapi::DragQueryFileW; -use winapi::um::unknwnbase::{IUnknownVtbl, IUnknown}; +use winapi::um::unknwnbase::{IUnknown, IUnknownVtbl}; use winapi::um::winuser::CF_HDROP; +use winapi::Interface; -use crate::{Point, DropData, MouseEvent, Event, EventStatus, DropEffect, PhyPoint}; +use crate::{DropData, DropEffect, Event, EventStatus, MouseEvent, PhyPoint, Point}; use super::WindowState; // These function pointers have to be stored in a (const) variable before they can be transmuted // Transmuting is needed because winapi has a bug where the pt parameter has an incorrect // type `*const POINTL` -const DRAG_ENTER_PTR: unsafe extern "system" fn(this: *mut IDropTarget, pDataObj: *const IDataObject, grfKeyState: DWORD, pt: POINTL, pdwEffect: *mut DWORD) -> HRESULT = DropTarget::drag_enter; -const DRAG_OVER_PTR: unsafe extern "system" fn(this: *mut IDropTarget, grfKeyState: DWORD, pt: POINTL, pdwEffect: *mut DWORD) -> HRESULT = DropTarget::drag_over; -const DROP_PTR: unsafe extern "system" fn(this: *mut IDropTarget, pDataObj: *const IDataObject, grfKeyState: DWORD, pt: POINTL, pdwEffect: *mut DWORD) -> HRESULT = DropTarget::drop; +const DRAG_ENTER_PTR: unsafe extern "system" fn( + this: *mut IDropTarget, + pDataObj: *const IDataObject, + grfKeyState: DWORD, + pt: POINTL, + pdwEffect: *mut DWORD, +) -> HRESULT = DropTarget::drag_enter; +const DRAG_OVER_PTR: unsafe extern "system" fn( + this: *mut IDropTarget, + grfKeyState: DWORD, + pt: POINTL, + pdwEffect: *mut DWORD, +) -> HRESULT = DropTarget::drag_over; +const DROP_PTR: unsafe extern "system" fn( + this: *mut IDropTarget, + pDataObj: *const IDataObject, + grfKeyState: DWORD, + pt: POINTL, + pdwEffect: *mut DWORD, +) -> HRESULT = DropTarget::drop; const DROP_TARGET_VTBL: IDropTargetVtbl = IDropTargetVtbl { parent: IUnknownVtbl { QueryInterface: DropTarget::query_interface, @@ -71,9 +91,10 @@ impl DropTarget { unsafe { let mut window = window_state.create_window(); let mut window = crate::Window::new(&mut window); - + let event = Event::Mouse(event); - let event_status = window_state.handler_mut().as_mut().unwrap().on_event(&mut window, event); + let event_status = + window_state.handler_mut().as_mut().unwrap().on_event(&mut window, event); if let Some(pdwEffect) = pdwEffect { match event_status { @@ -82,8 +103,8 @@ impl DropTarget { EventStatus::AcceptDrop(DropEffect::Link) => *pdwEffect = DROPEFFECT_LINK, EventStatus::AcceptDrop(DropEffect::Scroll) => *pdwEffect = DROPEFFECT_SCROLL, _ => *pdwEffect = DROPEFFECT_NONE, - } - } + } + } } } @@ -105,11 +126,7 @@ impl DropTarget { tymed: TYMED_HGLOBAL, }; - let mut medium = STGMEDIUM { - tymed: 0, - u: null_mut(), - pUnkForRelease: null_mut(), - }; + let mut medium = STGMEDIUM { tymed: 0, u: null_mut(), pUnkForRelease: null_mut() }; unsafe { let hresult = data_object.GetData(&format, &mut medium); @@ -119,13 +136,13 @@ impl DropTarget { } let hdrop = transmute((*medium.u).hGlobal()); - + let item_count = DragQueryFileW(hdrop, 0xFFFFFFFF, null_mut(), 0); if item_count == 0 { self.drop_data = DropData::None; return; } - + let mut paths = Vec::with_capacity(item_count as usize); for i in 0..item_count { @@ -133,7 +150,12 @@ impl DropTarget { let buffer_size = characters as usize + 1; let mut buffer = Vec::::with_capacity(buffer_size); - DragQueryFileW(hdrop, i, transmute(buffer.spare_capacity_mut().as_mut_ptr()), buffer_size as u32); + DragQueryFileW( + hdrop, + i, + transmute(buffer.spare_capacity_mut().as_mut_ptr()), + buffer_size as u32, + ); buffer.set_len(buffer_size); paths.push(OsString::from_wide(&buffer[..characters as usize]).into()) @@ -144,20 +166,17 @@ impl DropTarget { } unsafe extern "system" fn query_interface( - this: *mut IUnknown, - riid: REFIID, - ppvObject: *mut *mut winapi::ctypes::c_void, - ) -> HRESULT - { - if IsEqualIID(&*riid, &IUnknown::uuidof()) || IsEqualIID(&*riid, &IDropTarget::uuidof()){ + this: *mut IUnknown, riid: REFIID, ppvObject: *mut *mut winapi::ctypes::c_void, + ) -> HRESULT { + if IsEqualIID(&*riid, &IUnknown::uuidof()) || IsEqualIID(&*riid, &IDropTarget::uuidof()) { Self::add_ref(this); *ppvObject = this as *mut winapi::ctypes::c_void; return S_OK; } - + return E_NOINTERFACE; } - + unsafe extern "system" fn add_ref(this: *mut IUnknown) -> ULONG { let arc = Rc::from_raw(this); let result = Rc::strong_count(&arc) + 1; @@ -167,7 +186,7 @@ impl DropTarget { result as ULONG } - + unsafe extern "system" fn release(this: *mut IUnknown) -> ULONG { let arc = Rc::from_raw(this); let result = Rc::strong_count(&arc) - 1; @@ -177,21 +196,18 @@ impl DropTarget { result as ULONG } - + unsafe extern "system" fn drag_enter( - this: *mut IDropTarget, - pDataObj: *const IDataObject, - grfKeyState: DWORD, - pt: POINTL, + this: *mut IDropTarget, pDataObj: *const IDataObject, grfKeyState: DWORD, pt: POINTL, pdwEffect: *mut DWORD, - ) -> HRESULT - { + ) -> HRESULT { let drop_target = &mut *(this as *mut DropTarget); let Some(window_state) = drop_target.window_state.upgrade() else { return E_UNEXPECTED; }; - let modifiers = window_state.keyboard_state().get_modifiers_from_mouse_wparam(grfKeyState as WPARAM); + let modifiers = + window_state.keyboard_state().get_modifiers_from_mouse_wparam(grfKeyState as WPARAM); drop_target.parse_coordinates(pt); drop_target.parse_drop_data(&*pDataObj); @@ -205,20 +221,17 @@ impl DropTarget { drop_target.on_event(Some(pdwEffect), event); S_OK } - + unsafe extern "system" fn drag_over( - this: *mut IDropTarget, - grfKeyState: DWORD, - pt: POINTL, - pdwEffect: *mut DWORD, - ) -> HRESULT - { + this: *mut IDropTarget, grfKeyState: DWORD, pt: POINTL, pdwEffect: *mut DWORD, + ) -> HRESULT { let drop_target = &mut *(this as *mut DropTarget); let Some(window_state) = drop_target.window_state.upgrade() else { return E_UNEXPECTED; }; - let modifiers = window_state.keyboard_state().get_modifiers_from_mouse_wparam(grfKeyState as WPARAM); + let modifiers = + window_state.keyboard_state().get_modifiers_from_mouse_wparam(grfKeyState as WPARAM); drop_target.parse_coordinates(pt); @@ -231,27 +244,24 @@ impl DropTarget { drop_target.on_event(Some(pdwEffect), event); S_OK } - + unsafe extern "system" fn drag_leave(this: *mut IDropTarget) -> HRESULT { let drop_target = &mut *(this as *mut DropTarget); drop_target.on_event(None, MouseEvent::DragLeft); S_OK } - + unsafe extern "system" fn drop( - this: *mut IDropTarget, - pDataObj: *const IDataObject, - grfKeyState: DWORD, - pt: POINTL, + this: *mut IDropTarget, pDataObj: *const IDataObject, grfKeyState: DWORD, pt: POINTL, pdwEffect: *mut DWORD, - ) -> HRESULT - { + ) -> HRESULT { let drop_target = &mut *(this as *mut DropTarget); let Some(window_state) = drop_target.window_state.upgrade() else { return E_UNEXPECTED; }; - let modifiers = window_state.keyboard_state().get_modifiers_from_mouse_wparam(grfKeyState as WPARAM); + let modifiers = + window_state.keyboard_state().get_modifiers_from_mouse_wparam(grfKeyState as WPARAM); drop_target.parse_coordinates(pt); drop_target.parse_drop_data(&*pDataObj); diff --git a/src/win/window.rs b/src/win/window.rs index 76c2df6..9378a75 100644 --- a/src/win/window.rs +++ b/src/win/window.rs @@ -2,7 +2,7 @@ use winapi::shared::guiddef::GUID; use winapi::shared::minwindef::{ATOM, FALSE, LPARAM, LRESULT, UINT, WPARAM}; use winapi::shared::windef::{HWND, RECT}; use winapi::um::combaseapi::CoCreateGuid; -use winapi::um::ole2::{RegisterDragDrop, OleInitialize, RevokeDragDrop}; +use winapi::um::ole2::{OleInitialize, RegisterDragDrop, RevokeDragDrop}; use winapi::um::oleidl::LPDROPTARGET; use winapi::um::winuser::{ AdjustWindowRectEx, CreateWindowExW, DefWindowProcW, DestroyWindow, DispatchMessageW, @@ -18,7 +18,7 @@ use winapi::um::winuser::{ XBUTTON1, XBUTTON2, }; -use std::cell::{Cell, RefCell, Ref, RefMut}; +use std::cell::{Cell, Ref, RefCell, RefMut}; use std::collections::VecDeque; use std::ffi::{c_void, OsStr}; use std::marker::PhantomData;