Merge pull request #28 from MirkoCovizzi/experiments
Add Timer and manage some Events
This commit is contained in:
commit
2d3bb0c817
|
@ -3,21 +3,40 @@ use std::sync::{Arc, Mutex};
|
||||||
use winapi::shared::minwindef::{LPARAM, LRESULT, UINT, WPARAM};
|
use winapi::shared::minwindef::{LPARAM, LRESULT, UINT, WPARAM};
|
||||||
|
|
||||||
use crate::Window;
|
use crate::Window;
|
||||||
use winapi::um::winuser::WM_MOUSEMOVE;
|
use winapi::um::winuser::{DefWindowProcA, WM_MOUSEMOVE, WM_TIMER};
|
||||||
|
|
||||||
|
const WIN_FRAME_TIMER: usize = 4242;
|
||||||
|
|
||||||
|
unsafe fn handle_timer(win: Arc<Mutex<Window>>, timer_id: usize) {
|
||||||
|
match timer_id {
|
||||||
|
WIN_FRAME_TIMER => {
|
||||||
|
win.lock().unwrap().draw_frame();
|
||||||
|
}
|
||||||
|
_ => (),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub(crate) unsafe fn handle_message(
|
pub(crate) unsafe fn handle_message(
|
||||||
win: Arc<Mutex<Window>>,
|
win: Arc<Mutex<Window>>,
|
||||||
msg: UINT,
|
message: UINT,
|
||||||
wparam: WPARAM,
|
wparam: WPARAM,
|
||||||
lparam: LPARAM,
|
lparam: LPARAM,
|
||||||
) -> LRESULT {
|
) -> LRESULT {
|
||||||
match msg {
|
let hwnd;
|
||||||
|
{
|
||||||
|
hwnd = win.lock().unwrap().hwnd;
|
||||||
|
}
|
||||||
|
match message {
|
||||||
WM_MOUSEMOVE => {
|
WM_MOUSEMOVE => {
|
||||||
let x = (lparam & 0xFFFF) as i32;
|
let x = (lparam & 0xFFFF) as i32;
|
||||||
let y = ((lparam >> 16) & 0xFFFF) as i32;
|
let y = ((lparam >> 16) & 0xFFFF) as i32;
|
||||||
win.lock().unwrap().handle_mouse_motion(x, y);
|
win.lock().unwrap().handle_mouse_motion(x, y);
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
_ => 0,
|
WM_TIMER => {
|
||||||
|
handle_timer(win, wparam);
|
||||||
|
0
|
||||||
|
}
|
||||||
|
_ => DefWindowProcA(hwnd, message, wparam, lparam),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,11 +15,11 @@ use self::winapi::um::wingdi::{
|
||||||
};
|
};
|
||||||
use self::winapi::um::winuser::{
|
use self::winapi::um::winuser::{
|
||||||
AdjustWindowRectEx, CreateWindowExA, DefWindowProcA, DestroyWindow, DispatchMessageA, GetDC,
|
AdjustWindowRectEx, CreateWindowExA, DefWindowProcA, DestroyWindow, DispatchMessageA, GetDC,
|
||||||
GetWindowLongPtrA, MessageBoxA, PeekMessageA, PostMessageA, RegisterClassA, ReleaseDC,
|
GetMessageA, GetWindowLongPtrA, MessageBoxA, PeekMessageA, PostMessageA, RegisterClassA,
|
||||||
SetWindowLongPtrA, TranslateMessage, UnregisterClassA, CS_OWNDC, GWLP_USERDATA, MB_ICONERROR,
|
ReleaseDC, SetTimer, SetWindowLongPtrA, TranslateMessage, UnregisterClassA, CS_OWNDC,
|
||||||
MB_OK, MB_TOPMOST, MSG, PM_REMOVE, WM_CREATE, WM_QUIT, WM_SHOWWINDOW, WNDCLASSA, WS_CAPTION,
|
GWLP_USERDATA, MB_ICONERROR, MB_OK, MB_TOPMOST, MSG, PM_REMOVE, WM_CREATE, WM_QUIT,
|
||||||
WS_CHILD, WS_CLIPSIBLINGS, WS_MAXIMIZEBOX, WS_MINIMIZEBOX, WS_POPUPWINDOW, WS_SIZEBOX,
|
WM_SHOWWINDOW, WM_TIMER, WNDCLASSA, WS_CAPTION, WS_CHILD, WS_CLIPSIBLINGS, WS_MAXIMIZEBOX,
|
||||||
WS_VISIBLE,
|
WS_MINIMIZEBOX, WS_POPUPWINDOW, WS_SIZEBOX, WS_VISIBLE,
|
||||||
};
|
};
|
||||||
|
|
||||||
use self::winapi::ctypes::c_void;
|
use self::winapi::ctypes::c_void;
|
||||||
|
@ -52,44 +52,29 @@ unsafe fn generate_guid() -> String {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_msg(_window: HWND) -> bool {
|
|
||||||
unsafe {
|
|
||||||
let mut msg: MSG = std::mem::zeroed();
|
|
||||||
loop {
|
|
||||||
if PeekMessageA(&mut msg, 0 as HWND, 0, 0, PM_REMOVE) == 0 {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if msg.message == WM_QUIT {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
TranslateMessage(&msg);
|
|
||||||
DispatchMessageA(&msg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
unsafe extern "system" fn wnd_proc(
|
unsafe extern "system" fn wnd_proc(
|
||||||
hwnd: HWND,
|
hwnd: HWND,
|
||||||
msg: UINT,
|
msg: UINT,
|
||||||
wparam: WPARAM,
|
wparam: WPARAM,
|
||||||
lparam: LPARAM,
|
lparam: LPARAM,
|
||||||
) -> LRESULT {
|
) -> LRESULT {
|
||||||
let win = GetWindowLongPtrA(hwnd, GWLP_USERDATA) as *const c_void;
|
let win_ptr = GetWindowLongPtrA(hwnd, GWLP_USERDATA) as *const c_void;
|
||||||
match msg {
|
match msg {
|
||||||
WM_CREATE => {
|
WM_CREATE => {
|
||||||
PostMessageA(hwnd, WM_SHOWWINDOW, 0, 0);
|
PostMessageA(hwnd, WM_SHOWWINDOW, 0, 0);
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
if !win.is_null() {
|
if !win_ptr.is_null() {
|
||||||
let win: &Arc<Mutex<Window>> = std::mem::transmute(win);
|
let win_ref: &Arc<Mutex<Window>> = std::mem::transmute(win_ptr);
|
||||||
let win = Arc::clone(win);
|
let win = Arc::clone(win_ref);
|
||||||
let ret = handle_message(win, msg, wparam, lparam);
|
let ret = handle_message(win, msg, wparam, lparam);
|
||||||
|
|
||||||
// todo: need_reconfigure thing?
|
// todo: need_reconfigure thing?
|
||||||
|
|
||||||
// return ret
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
return DefWindowProcA(hwnd, msg, wparam, lparam);
|
return DefWindowProcA(hwnd, msg, wparam, lparam);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -122,7 +107,7 @@ unsafe fn unregister_wnd_class(wnd_class: ATOM) {
|
||||||
unsafe fn init_gl_context() {}
|
unsafe fn init_gl_context() {}
|
||||||
|
|
||||||
pub struct Window {
|
pub struct Window {
|
||||||
hwnd: HWND,
|
pub(crate) hwnd: HWND,
|
||||||
hdc: HDC,
|
hdc: HDC,
|
||||||
gl_context: HGLRC,
|
gl_context: HGLRC,
|
||||||
window_class: ATOM,
|
window_class: ATOM,
|
||||||
|
@ -239,17 +224,18 @@ impl Window {
|
||||||
|
|
||||||
SetWindowLongPtrA(hwnd, GWLP_USERDATA, &Arc::clone(&win) as *const _ as _);
|
SetWindowLongPtrA(hwnd, GWLP_USERDATA, &Arc::clone(&win) as *const _ as _);
|
||||||
|
|
||||||
|
SetTimer(hwnd, 4242, 13, None);
|
||||||
|
|
||||||
// todo: decide what to do with the message pump
|
// todo: decide what to do with the message pump
|
||||||
if parent.is_null() {
|
if parent.is_null() {
|
||||||
|
let mut msg: MSG = std::mem::zeroed();
|
||||||
loop {
|
loop {
|
||||||
if !handle_msg(null_mut()) {
|
let status = GetMessageA(&mut msg, hwnd, 0, 0);
|
||||||
|
if status == -1 {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
TranslateMessage(&mut msg);
|
||||||
// todo: pass callback rendering function instead
|
handle_message(Arc::clone(&win), msg.message, msg.wParam, msg.lParam);
|
||||||
gl::ClearColor(0.3, 0.8, 0.3, 1.0);
|
|
||||||
gl::Clear(gl::COLOR_BUFFER_BIT);
|
|
||||||
SwapBuffers(hdc);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -268,6 +254,13 @@ impl Window {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) unsafe fn draw_frame(&self) {
|
||||||
|
// todo: pass callback rendering function instead
|
||||||
|
gl::ClearColor(0.3, 0.8, 0.3, 1.0);
|
||||||
|
gl::Clear(gl::COLOR_BUFFER_BIT);
|
||||||
|
SwapBuffers(self.hdc);
|
||||||
|
}
|
||||||
|
|
||||||
pub(crate) fn handle_mouse_motion(&self, x: i32, y: i32) {
|
pub(crate) fn handle_mouse_motion(&self, x: i32, y: i32) {
|
||||||
println!("{}, {}", x, y);
|
println!("{}, {}", x, y);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue