From 1f0999e6a0470826ea5bbde2ba5e17758ef7751a Mon Sep 17 00:00:00 2001 From: Tomaka17 Date: Sun, 27 Jul 2014 22:46:30 +0200 Subject: Implement get_position for win32 and fix interface --- src/events.rs | 2 +- src/lib.rs | 2 +- src/win32/ffi.rs | 14 ++++++++++++++ src/win32/mod.rs | 18 ++++++++++++++---- src/x11/mod.rs | 2 +- 5 files changed, 31 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/events.rs b/src/events.rs index 332867a..3e2143a 100644 --- a/src/events.rs +++ b/src/events.rs @@ -8,7 +8,7 @@ pub enum Event { SizeChanged(uint, uint), /// The position of the window has changed. - Moved(uint, uint), + Moved(int, int), /// The window has been closed. Closed, diff --git a/src/lib.rs b/src/lib.rs index 77a9b7c..b18b5fe 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -52,7 +52,7 @@ impl Window { } #[inline] - pub fn get_position(&self) -> (uint, uint) { + pub fn get_position(&self) -> (int, int) { self.window.get_position() } diff --git a/src/win32/ffi.rs b/src/win32/ffi.rs index 857b838..268edbc 100644 --- a/src/win32/ffi.rs +++ b/src/win32/ffi.rs @@ -552,6 +552,17 @@ pub struct DEVMODE { pub dmPanningHeight: DWORD, } +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms632611(v=vs.85).aspx +#[repr(C)] +pub struct WINDOWPLACEMENT { + pub length: UINT, + pub flags: UINT, + pub showCmd: UINT, + pub ptMinPosition: POINT, + pub ptMaxPosition: POINT, + pub rcNormalPosition: RECT, +} + pub type LPMSG = *mut MSG; #[link(name = "advapi32")] @@ -621,6 +632,9 @@ extern "system" { // http://msdn.microsoft.com/en-us/library/windows/desktop/ms683212(v=vs.85).aspx pub fn GetProcAddress(hModule: HMODULE, lpProcName: LPCSTR) -> *const libc::c_void; + // http://msdn.microsoft.com/en-us/library/windows/desktop/ms633518(v=vs.85).aspx + pub fn GetWindowPlacement(hWnd: HWND, lpwndpl: *mut WINDOWPLACEMENT) -> BOOL; + // http://msdn.microsoft.com/en-us/library/windows/desktop/ms633519(v=vs.85).aspx pub fn GetWindowRect(hWnd: HWND, lpRect: *mut RECT) -> BOOL; diff --git a/src/win32/mod.rs b/src/win32/mod.rs index 8f3ae91..74b046b 100644 --- a/src/win32/mod.rs +++ b/src/win32/mod.rs @@ -207,8 +207,18 @@ impl Window { } } - pub fn get_position(&self) -> (uint, uint) { - unimplemented!() + pub fn get_position(&self) -> (int, int) { + use std::{mem, os}; + + let mut placement: ffi::WINDOWPLACEMENT = unsafe { mem::zeroed() }; + placement.length = mem::size_of::() as ffi::UINT; + + if unsafe { ffi::GetWindowPlacement(self.window, &mut placement) } == 0 { + fail!("GetWindowPlacement failed: {}", os::error_string(os::errno() as uint)); + } + + let ref rect = placement.rcNormalPosition; + (rect.left as int, rect.top as int) } pub fn set_position(&self, x: uint, y: uint) { @@ -363,8 +373,8 @@ extern "stdcall" fn callback(window: ffi::HWND, msg: ffi::UINT, ffi::WM_MOVE => { use events::Moved; - let x = ffi::LOWORD(lparam as ffi::DWORD) as uint; - let y = ffi::HIWORD(lparam as ffi::DWORD) as uint; + let x = ffi::LOWORD(lparam as ffi::DWORD) as i16 as int; + let y = ffi::HIWORD(lparam as ffi::DWORD) as i16 as int; send_event(window, Moved(x, y)); 0 }, diff --git a/src/x11/mod.rs b/src/x11/mod.rs index a592bce..1c91e2d 100644 --- a/src/x11/mod.rs +++ b/src/x11/mod.rs @@ -117,7 +117,7 @@ impl Window { } } - pub fn get_position(&self) -> (uint, uint) { + pub fn get_position(&self) -> (int, int) { unimplemented!() } -- cgit v1.2.3