From: <tr...@us...> - 2009-01-28 17:04:16
|
Revision: 11515 http://alleg.svn.sourceforge.net/alleg/?rev=11515&view=rev Author: trentg Date: 2009-01-28 17:04:10 +0000 (Wed, 28 Jan 2009) Log Message: ----------- Fixed typo bug in wmouse.c where y was not changed in al_set_mouse_xy. Support ALLEGRO_EVENT_MOUSE_ENTER/LEAVE_DISPLAY events in windows. Modified Paths: -------------- allegro/branches/4.9/src/win/wmouse.c allegro/branches/4.9/src/win/wnewwin.c Modified: allegro/branches/4.9/src/win/wmouse.c =================================================================== --- allegro/branches/4.9/src/win/wmouse.c 2009-01-28 13:30:23 UTC (rev 11514) +++ allegro/branches/4.9/src/win/wmouse.c 2009-01-28 17:04:10 UTC (rev 11515) @@ -925,7 +925,7 @@ int wx, wy; new_x = CLAMP(win_disp->mouse_range_x1, x, win_disp->mouse_range_x2); - new_y = CLAMP(win_disp->mouse_range_y1, y, win_disp->mouse_range_y1); + new_y = CLAMP(win_disp->mouse_range_y1, y, win_disp->mouse_range_y2); dx = new_x - the_mouse.state.x; dy = new_y - the_mouse.state.y; Modified: allegro/branches/4.9/src/win/wnewwin.c =================================================================== --- allegro/branches/4.9/src/win/wnewwin.c 2009-01-28 13:30:23 UTC (rev 11514) +++ allegro/branches/4.9/src/win/wnewwin.c 2009-01-28 17:04:10 UTC (rev 11515) @@ -34,7 +34,9 @@ static bool resize_postponed = false; +static HWND capture_window = 0; + UINT _al_win_msg_call_proc = 0; UINT _al_win_msg_suicide = 0; @@ -335,6 +337,56 @@ } switch (message) { + case WM_MOUSEMOVE: { + /* Track the mouse as it enters/exits windows */ + int mx = lParam & 0xFFFF; + int my = (lParam >> 16) & 0xFFFF; + if (!capture_window || capture_window != hWnd) { + capture_window = hWnd; + SetCapture(hWnd); + // emit event + if (al_is_mouse_installed()) { + ALLEGRO_MOUSE *mouse = al_get_mouse(); + if (mouse) { + es = (ALLEGRO_EVENT_SOURCE *)mouse; + if (_al_event_source_needs_to_generate_event(es)) { + _al_event_source_lock(es); + ALLEGRO_EVENT event; + event.type = ALLEGRO_EVENT_MOUSE_ENTER_DISPLAY; + event.mouse.x = mx; + event.mouse.y = my; + event.mouse.z = 0; + event.mouse.timestamp = al_current_time(); + _al_event_source_emit_event(es, &event); + _al_event_source_unlock(es); + } + } + } + } + else if (mx < 0 || my < 0 || mx >= d->w || my >= d->h) { + ReleaseCapture(); + capture_window = 0; + // emit event + if (al_is_mouse_installed()) { + ALLEGRO_MOUSE *mouse = al_get_mouse(); + if (mouse) { + es = (ALLEGRO_EVENT_SOURCE *)mouse; + if (_al_event_source_needs_to_generate_event(es)) { + _al_event_source_lock(es); + ALLEGRO_EVENT event; + event.type = ALLEGRO_EVENT_MOUSE_LEAVE_DISPLAY; + event.mouse.x = mx; + event.mouse.y = my; + event.mouse.z = 0; + event.mouse.timestamp = al_current_time(); + _al_event_source_emit_event(es, &event); + _al_event_source_unlock(es); + } + } + } + } + break; + } case WM_SYSCOMMAND: { if (_al_win_disable_screensaver && (wParam == SC_MONITORPOWER || wParam == SC_SCREENSAVE)) { @@ -416,6 +468,7 @@ _al_win_grab_input(win_display); if (d->vt->switch_in) d->vt->switch_in(d); + //SetCapture(hWnd); _al_event_source_lock(es); if (_al_event_source_needs_to_generate_event(es)) { ALLEGRO_EVENT event; @@ -431,6 +484,7 @@ if (d->flags & ALLEGRO_FULLSCREEN) { d->vt->switch_out(d); } + //ReleaseCapture(); _al_event_source_lock(es); if (_al_event_source_needs_to_generate_event(es)) { ALLEGRO_EVENT event; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |