1 // Copyright 2013-2015, The Gtk-rs Project Developers.
2 // See the COPYRIGHT file at the top-level directory of this distribution.
3 // Licensed under the MIT license, see the LICENSE file or <http://opensource.org/licenses/MIT>
4 
5 use atom::Atom;
6 use gdk_sys;
7 use glib::object::IsA;
8 use glib::translate::*;
9 use std::ptr;
10 use Device;
11 use DragAction;
12 use DragContext;
13 use DragProtocol;
14 use Screen;
15 use Window;
16 
17 impl DragContext {
drag_get_selection(&self) -> Atom18     pub fn drag_get_selection(&self) -> Atom {
19         unsafe { from_glib_none(gdk_sys::gdk_drag_get_selection(self.to_glib_none().0) as *mut _) }
20     }
21 
drag_abort(&self, time_: u32)22     pub fn drag_abort(&self, time_: u32) {
23         unsafe { gdk_sys::gdk_drag_abort(self.to_glib_none().0, time_) }
24     }
25 
drop_reply(&self, accepted: bool, time_: u32)26     pub fn drop_reply(&self, accepted: bool, time_: u32) {
27         unsafe { gdk_sys::gdk_drop_reply(self.to_glib_none().0, accepted.to_glib(), time_) }
28     }
29 
drop(&self, time_: u32)30     pub fn drop(&self, time_: u32) {
31         unsafe { gdk_sys::gdk_drag_drop(self.to_glib_none().0, time_) }
32     }
33 
drag_find_window_for_screen( &self, drag_window: &Window, screen: &Screen, x_root: i32, y_root: i32, ) -> (Option<Window>, DragProtocol)34     pub fn drag_find_window_for_screen(
35         &self,
36         drag_window: &Window,
37         screen: &Screen,
38         x_root: i32,
39         y_root: i32,
40     ) -> (Option<Window>, DragProtocol) {
41         unsafe {
42             let mut dest_window = ptr::null_mut();
43             let mut protocol = gdk_sys::GDK_DRAG_PROTO_NONE;
44             gdk_sys::gdk_drag_find_window_for_screen(
45                 self.to_glib_none().0,
46                 drag_window.to_glib_none().0,
47                 screen.to_glib_none().0,
48                 x_root,
49                 y_root,
50                 &mut dest_window,
51                 &mut protocol,
52             );
53             (from_glib_full(dest_window), from_glib(protocol))
54         }
55     }
56 
drag_motion( &self, dest_window: &Window, protocol: DragProtocol, x_root: i32, y_root: i32, suggested_action: DragAction, possible_actions: DragAction, time_: u32, ) -> bool57     pub fn drag_motion(
58         &self,
59         dest_window: &Window,
60         protocol: DragProtocol,
61         x_root: i32,
62         y_root: i32,
63         suggested_action: DragAction,
64         possible_actions: DragAction,
65         time_: u32,
66     ) -> bool {
67         unsafe {
68             from_glib(gdk_sys::gdk_drag_motion(
69                 self.to_glib_none().0,
70                 dest_window.to_glib_none().0,
71                 protocol.to_glib(),
72                 x_root,
73                 y_root,
74                 suggested_action.to_glib(),
75                 possible_actions.to_glib(),
76                 time_,
77             ))
78         }
79     }
80 
drop_finish(&self, success: bool, time_: u32)81     pub fn drop_finish(&self, success: bool, time_: u32) {
82         unsafe { gdk_sys::gdk_drop_finish(self.to_glib_none().0, success.to_glib(), time_) }
83     }
84 
drag_status(&self, action: DragAction, time_: u32)85     pub fn drag_status(&self, action: DragAction, time_: u32) {
86         unsafe { gdk_sys::gdk_drag_status(self.to_glib_none().0, action.to_glib(), time_) }
87     }
88 
drag_drop_succeeded(&self) -> bool89     pub fn drag_drop_succeeded(&self) -> bool {
90         unsafe { from_glib(gdk_sys::gdk_drag_drop_succeeded(self.to_glib_none().0)) }
91     }
92 
drag_begin(window: &Window, targets: &[&Atom]) -> Option<DragContext>93     pub fn drag_begin(window: &Window, targets: &[&Atom]) -> Option<DragContext> {
94         skip_assert_initialized!();
95         unsafe {
96             from_glib_full(gdk_sys::gdk_drag_begin(
97                 window.to_glib_none().0,
98                 targets.to_glib_none().0,
99             ))
100         }
101     }
102 
drag_begin_for_device<P: IsA<Device>>( window: &Window, device: &P, targets: &[&Atom], ) -> Option<DragContext>103     pub fn drag_begin_for_device<P: IsA<Device>>(
104         window: &Window,
105         device: &P,
106         targets: &[&Atom],
107     ) -> Option<DragContext> {
108         skip_assert_initialized!();
109         unsafe {
110             from_glib_full(gdk_sys::gdk_drag_begin_for_device(
111                 window.to_glib_none().0,
112                 device.as_ref().to_glib_none().0,
113                 targets.to_glib_none().0,
114             ))
115         }
116     }
117 
118     #[cfg(any(feature = "v3_20", feature = "dox"))]
drag_begin_from_point<P: IsA<Device>>( window: &Window, device: &P, targets: &[&Atom], x_root: i32, y_root: i32, ) -> Option<DragContext>119     pub fn drag_begin_from_point<P: IsA<Device>>(
120         window: &Window,
121         device: &P,
122         targets: &[&Atom],
123         x_root: i32,
124         y_root: i32,
125     ) -> Option<DragContext> {
126         skip_assert_initialized!();
127         unsafe {
128             from_glib_full(gdk_sys::gdk_drag_begin_from_point(
129                 window.to_glib_none().0,
130                 device.as_ref().to_glib_none().0,
131                 targets.to_glib_none().0,
132                 x_root,
133                 y_root,
134             ))
135         }
136     }
137 
138     #[cfg(any(feature = "v3_20", feature = "dox"))]
drag_drop_done(&self, success: bool)139     pub fn drag_drop_done(&self, success: bool) {
140         skip_assert_initialized!();
141         unsafe {
142             gdk_sys::gdk_drag_drop_done(self.to_glib_none().0, success.to_glib());
143         }
144     }
145 }
146