Skip to content

Commit

Permalink
* Windows: Fixed an issue where if the mouse cursor left the window r…
Browse files Browse the repository at this point in the history
…egion, and a button state was toggled (released/pressed), it wouldnt register and screwed up the state
  • Loading branch information
harrand committed Jan 19, 2023
1 parent fd0a314 commit 18c209d
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 0 deletions.
32 changes: 32 additions & 0 deletions src/tz/wsi/impl/windows/window.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ namespace tz::wsi::impl
tz::report("Setting up window for modern opengl.");
this->impl_init_opengl();
}
this->impl_register_mouseleave();
if(!(info.window_flags & window_flag::invisible))
{
ShowWindow(this->hwnd, SW_SHOW);
Expand Down Expand Up @@ -302,6 +303,37 @@ namespace tz::wsi::impl
return this->key_state;
}

//--------------------------------------------------------------------------------------------------

void window_winapi::impl_register_mouseleave()
{
TRACKMOUSEEVENT tme
{
.cbSize = sizeof(TRACKMOUSEEVENT),
.dwFlags = TME_LEAVE,
.hwndTrack = this->hwnd,
.dwHoverTime = HOVER_DEFAULT
};
TrackMouseEvent(&tme);
}

//--------------------------------------------------------------------------------------------------

void window_winapi::impl_notify_mouse_enter_window()
{
this->mouse_in_window = true;
this->impl_register_mouseleave();
}

void window_winapi::impl_notify_mouse_leave_window()
{
this->mouse_in_window = false;
for(std::size_t i = 0; i < static_cast<std::size_t>(mouse_button::_count); i++)
{
this->mouse_state.button_state[i] = mouse_button_state::noclicked;
}
}

//--------------------------------------------------------------------------------------------------

mouse_state& window_winapi::impl_mutable_mouse_state()
Expand Down
4 changes: 4 additions & 0 deletions src/tz/wsi/impl/windows/window.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,9 @@ namespace tz::wsi::impl
void impl_init_opengl();
bool impl_is_opengl() const;
void impl_request_close();
void impl_register_mouseleave();
void impl_notify_mouse_enter_window();
void impl_notify_mouse_leave_window();
keyboard_state& impl_mutable_keyboard_state();
mouse_state& impl_mutable_mouse_state();

Expand All @@ -50,6 +53,7 @@ namespace tz::wsi::impl
bool close_requested = false;
keyboard_state key_state = {};
mouse_state mouse_state = {};
bool mouse_in_window = false;
void* userdata = nullptr;
};
static_assert(tz::wsi::window_api<window_winapi>);
Expand Down
10 changes: 10 additions & 0 deletions src/tz/wsi/impl/windows/wsi_windows.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,16 @@ namespace tz::wsi::impl
{
auto& state = get_window()->impl_mutable_mouse_state();
state.mouse_position = {static_cast<unsigned int>(LOWORD(lparam)), static_cast<unsigned int>(HIWORD(lparam))};
auto& wnd = *get_window();
if(!wnd.mouse_in_window)
{
wnd.impl_notify_mouse_enter_window();
}
}
break;
case WM_MOUSELEAVE:
{
get_window()->impl_notify_mouse_leave_window();
}
break;
case WM_LBUTTONDBLCLK:
Expand Down

0 comments on commit 18c209d

Please sign in to comment.