Add MOUSE_MODE_CONFINED_HIDDEN
Co-authored-by: Hugo Locurcio <hugo.locurcio@hugo.pro>
This commit is contained in:
parent
f288a79482
commit
98aa3b669e
|
@ -85,7 +85,7 @@ Input *Input::get_singleton() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Input::set_mouse_mode(MouseMode p_mode) {
|
void Input::set_mouse_mode(MouseMode p_mode) {
|
||||||
ERR_FAIL_INDEX((int)p_mode, 4);
|
ERR_FAIL_INDEX((int)p_mode, 5);
|
||||||
set_mouse_mode_func(p_mode);
|
set_mouse_mode_func(p_mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -138,6 +138,7 @@ void Input::_bind_methods() {
|
||||||
BIND_ENUM_CONSTANT(MOUSE_MODE_HIDDEN);
|
BIND_ENUM_CONSTANT(MOUSE_MODE_HIDDEN);
|
||||||
BIND_ENUM_CONSTANT(MOUSE_MODE_CAPTURED);
|
BIND_ENUM_CONSTANT(MOUSE_MODE_CAPTURED);
|
||||||
BIND_ENUM_CONSTANT(MOUSE_MODE_CONFINED);
|
BIND_ENUM_CONSTANT(MOUSE_MODE_CONFINED);
|
||||||
|
BIND_ENUM_CONSTANT(MOUSE_MODE_CONFINED_HIDDEN);
|
||||||
|
|
||||||
BIND_ENUM_CONSTANT(CURSOR_ARROW);
|
BIND_ENUM_CONSTANT(CURSOR_ARROW);
|
||||||
BIND_ENUM_CONSTANT(CURSOR_IBEAM);
|
BIND_ENUM_CONSTANT(CURSOR_IBEAM);
|
||||||
|
|
|
@ -46,7 +46,8 @@ public:
|
||||||
MOUSE_MODE_VISIBLE,
|
MOUSE_MODE_VISIBLE,
|
||||||
MOUSE_MODE_HIDDEN,
|
MOUSE_MODE_HIDDEN,
|
||||||
MOUSE_MODE_CAPTURED,
|
MOUSE_MODE_CAPTURED,
|
||||||
MOUSE_MODE_CONFINED
|
MOUSE_MODE_CONFINED,
|
||||||
|
MOUSE_MODE_CONFINED_HIDDEN,
|
||||||
};
|
};
|
||||||
|
|
||||||
#undef CursorShape
|
#undef CursorShape
|
||||||
|
|
|
@ -1044,12 +1044,20 @@
|
||||||
<constant name="FEATURE_SWAP_BUFFERS" value="17" enum="Feature">
|
<constant name="FEATURE_SWAP_BUFFERS" value="17" enum="Feature">
|
||||||
</constant>
|
</constant>
|
||||||
<constant name="MOUSE_MODE_VISIBLE" value="0" enum="MouseMode">
|
<constant name="MOUSE_MODE_VISIBLE" value="0" enum="MouseMode">
|
||||||
|
Makes the mouse cursor visible if it is hidden.
|
||||||
</constant>
|
</constant>
|
||||||
<constant name="MOUSE_MODE_HIDDEN" value="1" enum="MouseMode">
|
<constant name="MOUSE_MODE_HIDDEN" value="1" enum="MouseMode">
|
||||||
|
Makes the mouse cursor hidden if it is visible.
|
||||||
</constant>
|
</constant>
|
||||||
<constant name="MOUSE_MODE_CAPTURED" value="2" enum="MouseMode">
|
<constant name="MOUSE_MODE_CAPTURED" value="2" enum="MouseMode">
|
||||||
|
Captures the mouse. The mouse will be hidden and its position locked at the center of the screen.
|
||||||
|
[b]Note:[/b] If you want to process the mouse's movement in this mode, you need to use [member InputEventMouseMotion.relative].
|
||||||
</constant>
|
</constant>
|
||||||
<constant name="MOUSE_MODE_CONFINED" value="3" enum="MouseMode">
|
<constant name="MOUSE_MODE_CONFINED" value="3" enum="MouseMode">
|
||||||
|
Confines the mouse cursor to the game window, and make it visible.
|
||||||
|
</constant>
|
||||||
|
<constant name="MOUSE_MODE_CONFINED_HIDDEN" value="4" enum="MouseMode">
|
||||||
|
Confines the mouse cursor to the game window, and make it hidden.
|
||||||
</constant>
|
</constant>
|
||||||
<constant name="SCREEN_OF_MAIN_WINDOW" value="-1">
|
<constant name="SCREEN_OF_MAIN_WINDOW" value="-1">
|
||||||
</constant>
|
</constant>
|
||||||
|
|
|
@ -449,7 +449,10 @@
|
||||||
[b]Note:[/b] If you want to process the mouse's movement in this mode, you need to use [member InputEventMouseMotion.relative].
|
[b]Note:[/b] If you want to process the mouse's movement in this mode, you need to use [member InputEventMouseMotion.relative].
|
||||||
</constant>
|
</constant>
|
||||||
<constant name="MOUSE_MODE_CONFINED" value="3" enum="MouseMode">
|
<constant name="MOUSE_MODE_CONFINED" value="3" enum="MouseMode">
|
||||||
Makes the mouse cursor visible but confines it to the game window.
|
Confines the mouse cursor to the game window, and make it visible.
|
||||||
|
</constant>
|
||||||
|
<constant name="MOUSE_MODE_CONFINED_HIDDEN" value="4" enum="MouseMode">
|
||||||
|
Confines the mouse cursor to the game window, and make it hidden.
|
||||||
</constant>
|
</constant>
|
||||||
<constant name="CURSOR_ARROW" value="0" enum="CursorShape">
|
<constant name="CURSOR_ARROW" value="0" enum="CursorShape">
|
||||||
Arrow cursor. Standard, default pointing cursor.
|
Arrow cursor. Standard, default pointing cursor.
|
||||||
|
|
|
@ -407,9 +407,10 @@ void DisplayServerJavaScript::cursor_set_custom_image(const RES &p_cursor, Curso
|
||||||
|
|
||||||
// Mouse mode
|
// Mouse mode
|
||||||
void DisplayServerJavaScript::mouse_set_mode(MouseMode p_mode) {
|
void DisplayServerJavaScript::mouse_set_mode(MouseMode p_mode) {
|
||||||
ERR_FAIL_COND_MSG(p_mode == MOUSE_MODE_CONFINED, "MOUSE_MODE_CONFINED is not supported for the HTML5 platform.");
|
ERR_FAIL_COND_MSG(p_mode == MOUSE_MODE_CONFINED || p_mode == MOUSE_MODE_CONFINED_HIDDEN, "MOUSE_MODE_CONFINED is not supported for the HTML5 platform.");
|
||||||
if (p_mode == mouse_get_mode())
|
if (p_mode == mouse_get_mode()) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (p_mode == MOUSE_MODE_VISIBLE) {
|
if (p_mode == MOUSE_MODE_VISIBLE) {
|
||||||
godot_js_display_cursor_set_visible(1);
|
godot_js_display_cursor_set_visible(1);
|
||||||
|
|
|
@ -360,7 +360,7 @@ void DisplayServerX11::mouse_set_mode(MouseMode p_mode) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mouse_mode == MOUSE_MODE_CAPTURED || mouse_mode == MOUSE_MODE_CONFINED) {
|
if (mouse_mode == MOUSE_MODE_CAPTURED || mouse_mode == MOUSE_MODE_CONFINED || mouse_mode == MOUSE_MODE_CONFINED_HIDDEN) {
|
||||||
XUngrabPointer(x11_display, CurrentTime);
|
XUngrabPointer(x11_display, CurrentTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -376,7 +376,7 @@ void DisplayServerX11::mouse_set_mode(MouseMode p_mode) {
|
||||||
}
|
}
|
||||||
mouse_mode = p_mode;
|
mouse_mode = p_mode;
|
||||||
|
|
||||||
if (mouse_mode == MOUSE_MODE_CAPTURED || mouse_mode == MOUSE_MODE_CONFINED) {
|
if (mouse_mode == MOUSE_MODE_CAPTURED || mouse_mode == MOUSE_MODE_CONFINED || mouse_mode == MOUSE_MODE_CONFINED_HIDDEN) {
|
||||||
//flush pending motion events
|
//flush pending motion events
|
||||||
_flush_mouse_motion();
|
_flush_mouse_motion();
|
||||||
WindowData &main_window = windows[MAIN_WINDOW_ID];
|
WindowData &main_window = windows[MAIN_WINDOW_ID];
|
||||||
|
@ -2766,7 +2766,7 @@ void DisplayServerX11::process_events() {
|
||||||
do_mouse_warp = false;
|
do_mouse_warp = false;
|
||||||
|
|
||||||
// Is the current mouse mode one where it needs to be grabbed.
|
// Is the current mouse mode one where it needs to be grabbed.
|
||||||
bool mouse_mode_grab = mouse_mode == MOUSE_MODE_CAPTURED || mouse_mode == MOUSE_MODE_CONFINED;
|
bool mouse_mode_grab = mouse_mode == MOUSE_MODE_CAPTURED || mouse_mode == MOUSE_MODE_CONFINED || mouse_mode == MOUSE_MODE_CONFINED_HIDDEN;
|
||||||
|
|
||||||
xi.pressure = 0;
|
xi.pressure = 0;
|
||||||
xi.tilt = Vector2();
|
xi.tilt = Vector2();
|
||||||
|
@ -3030,7 +3030,7 @@ void DisplayServerX11::process_events() {
|
||||||
for (Map<WindowID, WindowData>::Element *E = windows.front(); E; E = E->next()) {
|
for (Map<WindowID, WindowData>::Element *E = windows.front(); E; E = E->next()) {
|
||||||
if (mouse_mode == MOUSE_MODE_CONFINED) {
|
if (mouse_mode == MOUSE_MODE_CONFINED) {
|
||||||
XUndefineCursor(x11_display, E->get().x11_window);
|
XUndefineCursor(x11_display, E->get().x11_window);
|
||||||
} else if (mouse_mode == MOUSE_MODE_CAPTURED) { // or re-hide it in captured mode
|
} else if (mouse_mode == MOUSE_MODE_CAPTURED || mouse_mode == MOUSE_MODE_CONFINED_HIDDEN) { // Or re-hide it.
|
||||||
XDefineCursor(x11_display, E->get().x11_window, null_cursor);
|
XDefineCursor(x11_display, E->get().x11_window, null_cursor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -884,7 +884,7 @@ static void _mouseDownEvent(DisplayServer::WindowID window_id, NSEvent *event, i
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (DS_OSX->mouse_mode == DisplayServer::MOUSE_MODE_CONFINED) {
|
if (DS_OSX->mouse_mode == DisplayServer::MOUSE_MODE_CONFINED || DS_OSX->mouse_mode == DisplayServer::MOUSE_MODE_CONFINED_HIDDEN) {
|
||||||
// Discard late events
|
// Discard late events
|
||||||
if (([event timestamp]) < DS_OSX->last_warp) {
|
if (([event timestamp]) < DS_OSX->last_warp) {
|
||||||
return;
|
return;
|
||||||
|
@ -2106,7 +2106,12 @@ void DisplayServerOSX::mouse_set_mode(MouseMode p_mode) {
|
||||||
} else if (p_mode == MOUSE_MODE_CONFINED) {
|
} else if (p_mode == MOUSE_MODE_CONFINED) {
|
||||||
CGDisplayShowCursor(kCGDirectMainDisplay);
|
CGDisplayShowCursor(kCGDirectMainDisplay);
|
||||||
CGAssociateMouseAndMouseCursorPosition(false);
|
CGAssociateMouseAndMouseCursorPosition(false);
|
||||||
} else {
|
} else if (p_mode == MOUSE_MODE_CONFINED_HIDDEN) {
|
||||||
|
if (mouse_mode == MOUSE_MODE_VISIBLE || mouse_mode == MOUSE_MODE_CONFINED) {
|
||||||
|
CGDisplayHideCursor(kCGDirectMainDisplay);
|
||||||
|
}
|
||||||
|
CGAssociateMouseAndMouseCursorPosition(false);
|
||||||
|
} else { // MOUSE_MODE_VISIBLE
|
||||||
CGDisplayShowCursor(kCGDirectMainDisplay);
|
CGDisplayShowCursor(kCGDirectMainDisplay);
|
||||||
CGAssociateMouseAndMouseCursorPosition(true);
|
CGAssociateMouseAndMouseCursorPosition(true);
|
||||||
}
|
}
|
||||||
|
@ -2143,7 +2148,7 @@ void DisplayServerOSX::mouse_warp_to_position(const Point2i &p_to) {
|
||||||
CGEventSourceSetLocalEventsSuppressionInterval(lEventRef, 0.0);
|
CGEventSourceSetLocalEventsSuppressionInterval(lEventRef, 0.0);
|
||||||
CGAssociateMouseAndMouseCursorPosition(false);
|
CGAssociateMouseAndMouseCursorPosition(false);
|
||||||
CGWarpMouseCursorPosition(lMouseWarpPos);
|
CGWarpMouseCursorPosition(lMouseWarpPos);
|
||||||
if (mouse_mode != MOUSE_MODE_CONFINED) {
|
if (mouse_mode != MOUSE_MODE_CONFINED && mouse_mode != MOUSE_MODE_CONFINED_HIDDEN) {
|
||||||
CGAssociateMouseAndMouseCursorPosition(true);
|
CGAssociateMouseAndMouseCursorPosition(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -333,8 +333,9 @@ void App::OnPointerMoved(Windows::UI::Core::CoreWindow ^ sender, Windows::UI::Co
|
||||||
os->input_event(screen_drag);
|
os->input_event(screen_drag);
|
||||||
} else {
|
} else {
|
||||||
// In case the mouse grabbed, MouseMoved will handle this
|
// In case the mouse grabbed, MouseMoved will handle this
|
||||||
if (os->get_mouse_mode() == OS::MouseMode::MOUSE_MODE_CAPTURED)
|
if (os->get_mouse_mode() == OS::MouseMode::MOUSE_MODE_CAPTURED) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Ref<InputEventMouseMotion> mouse_motion;
|
Ref<InputEventMouseMotion> mouse_motion;
|
||||||
mouse_motion.instance();
|
mouse_motion.instance();
|
||||||
|
@ -351,8 +352,9 @@ void App::OnPointerMoved(Windows::UI::Core::CoreWindow ^ sender, Windows::UI::Co
|
||||||
|
|
||||||
void App::OnMouseMoved(MouseDevice ^ mouse_device, MouseEventArgs ^ args) {
|
void App::OnMouseMoved(MouseDevice ^ mouse_device, MouseEventArgs ^ args) {
|
||||||
// In case the mouse isn't grabbed, PointerMoved will handle this
|
// In case the mouse isn't grabbed, PointerMoved will handle this
|
||||||
if (os->get_mouse_mode() != OS::MouseMode::MOUSE_MODE_CAPTURED)
|
if (os->get_mouse_mode() != OS::MouseMode::MOUSE_MODE_CAPTURED) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Windows::Foundation::Point pos;
|
Windows::Foundation::Point pos;
|
||||||
pos.X = last_mouse_pos.X + args->MouseDelta.X;
|
pos.X = last_mouse_pos.X + args->MouseDelta.X;
|
||||||
|
|
|
@ -400,14 +400,12 @@ void OS_UWP::ManagedType::on_gyroscope_reading_changed(Gyrometer ^ sender, Gyrom
|
||||||
void OS_UWP::set_mouse_mode(MouseMode p_mode) {
|
void OS_UWP::set_mouse_mode(MouseMode p_mode) {
|
||||||
if (p_mode == MouseMode::MOUSE_MODE_CAPTURED) {
|
if (p_mode == MouseMode::MOUSE_MODE_CAPTURED) {
|
||||||
CoreWindow::GetForCurrentThread()->SetPointerCapture();
|
CoreWindow::GetForCurrentThread()->SetPointerCapture();
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
CoreWindow::GetForCurrentThread()->ReleasePointerCapture();
|
CoreWindow::GetForCurrentThread()->ReleasePointerCapture();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p_mode == MouseMode::MOUSE_MODE_CAPTURED || p_mode == MouseMode::MOUSE_MODE_HIDDEN) {
|
if (p_mode == MouseMode::MOUSE_MODE_HIDDEN || p_mode == MouseMode::MOUSE_MODE_CAPTURED || p_mode == MouseMode::MOUSE_MODE_CONFINED_HIDDEN) {
|
||||||
CoreWindow::GetForCurrentThread()->PointerCursor = nullptr;
|
CoreWindow::GetForCurrentThread()->PointerCursor = nullptr;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
CoreWindow::GetForCurrentThread()->PointerCursor = ref new CoreCursor(CoreCursorType::Arrow, 0);
|
CoreWindow::GetForCurrentThread()->PointerCursor = ref new CoreCursor(CoreCursorType::Arrow, 0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -84,7 +84,8 @@ void DisplayServerWindows::alert(const String &p_alert, const String &p_title) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void DisplayServerWindows::_set_mouse_mode_impl(MouseMode p_mode) {
|
void DisplayServerWindows::_set_mouse_mode_impl(MouseMode p_mode) {
|
||||||
if (p_mode == MOUSE_MODE_CAPTURED || p_mode == MOUSE_MODE_CONFINED) {
|
if (p_mode == MOUSE_MODE_CAPTURED || p_mode == MOUSE_MODE_CONFINED || p_mode == MOUSE_MODE_CONFINED_HIDDEN) {
|
||||||
|
// Mouse is grabbed (captured or confined).
|
||||||
WindowData &wd = windows[MAIN_WINDOW_ID];
|
WindowData &wd = windows[MAIN_WINDOW_ID];
|
||||||
|
|
||||||
RECT clipRect;
|
RECT clipRect;
|
||||||
|
@ -100,11 +101,12 @@ void DisplayServerWindows::_set_mouse_mode_impl(MouseMode p_mode) {
|
||||||
SetCapture(wd.hWnd);
|
SetCapture(wd.hWnd);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
// Mouse is free to move around (not captured or confined).
|
||||||
ReleaseCapture();
|
ReleaseCapture();
|
||||||
ClipCursor(nullptr);
|
ClipCursor(nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p_mode == MOUSE_MODE_CAPTURED || p_mode == MOUSE_MODE_HIDDEN) {
|
if (p_mode == MOUSE_MODE_HIDDEN || p_mode == MOUSE_MODE_CAPTURED || p_mode == MOUSE_MODE_CONFINED_HIDDEN) {
|
||||||
if (hCursor == nullptr) {
|
if (hCursor == nullptr) {
|
||||||
hCursor = SetCursor(nullptr);
|
hCursor = SetCursor(nullptr);
|
||||||
} else {
|
} else {
|
||||||
|
@ -715,7 +717,7 @@ void DisplayServerWindows::window_set_position(const Point2i &p_position, Window
|
||||||
MoveWindow(wd.hWnd, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, TRUE);
|
MoveWindow(wd.hWnd, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, TRUE);
|
||||||
#endif
|
#endif
|
||||||
// Don't let the mouse leave the window when moved
|
// Don't let the mouse leave the window when moved
|
||||||
if (mouse_mode == MOUSE_MODE_CONFINED) {
|
if (mouse_mode == MOUSE_MODE_CONFINED || mouse_mode == MOUSE_MODE_CONFINED_HIDDEN) {
|
||||||
RECT rect;
|
RECT rect;
|
||||||
GetClientRect(wd.hWnd, &rect);
|
GetClientRect(wd.hWnd, &rect);
|
||||||
ClientToScreen(wd.hWnd, (POINT *)&rect.left);
|
ClientToScreen(wd.hWnd, (POINT *)&rect.left);
|
||||||
|
@ -841,7 +843,7 @@ void DisplayServerWindows::window_set_size(const Size2i p_size, WindowID p_windo
|
||||||
MoveWindow(wd.hWnd, rect.left, rect.top, w, h, TRUE);
|
MoveWindow(wd.hWnd, rect.left, rect.top, w, h, TRUE);
|
||||||
|
|
||||||
// Don't let the mouse leave the window when resizing to a smaller resolution
|
// Don't let the mouse leave the window when resizing to a smaller resolution
|
||||||
if (mouse_mode == MOUSE_MODE_CONFINED) {
|
if (mouse_mode == MOUSE_MODE_CONFINED || mouse_mode == MOUSE_MODE_CONFINED_HIDDEN) {
|
||||||
RECT crect;
|
RECT crect;
|
||||||
GetClientRect(wd.hWnd, &crect);
|
GetClientRect(wd.hWnd, &crect);
|
||||||
ClientToScreen(wd.hWnd, (POINT *)&crect.left);
|
ClientToScreen(wd.hWnd, (POINT *)&crect.left);
|
||||||
|
@ -2189,8 +2191,9 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
||||||
}
|
}
|
||||||
|
|
||||||
// Don't calculate relative mouse movement if we don't have focus in CAPTURED mode.
|
// Don't calculate relative mouse movement if we don't have focus in CAPTURED mode.
|
||||||
if (!windows[window_id].window_has_focus && mouse_mode == MOUSE_MODE_CAPTURED)
|
if (!windows[window_id].window_has_focus && mouse_mode == MOUSE_MODE_CAPTURED) {
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
Ref<InputEventMouseMotion> mm;
|
Ref<InputEventMouseMotion> mm;
|
||||||
mm.instance();
|
mm.instance();
|
||||||
|
@ -2294,8 +2297,9 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
||||||
}
|
}
|
||||||
|
|
||||||
// Don't calculate relative mouse movement if we don't have focus in CAPTURED mode.
|
// Don't calculate relative mouse movement if we don't have focus in CAPTURED mode.
|
||||||
if (!windows[window_id].window_has_focus && mouse_mode == MOUSE_MODE_CAPTURED)
|
if (!windows[window_id].window_has_focus && mouse_mode == MOUSE_MODE_CAPTURED) {
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
Ref<InputEventMouseMotion> mm;
|
Ref<InputEventMouseMotion> mm;
|
||||||
mm.instance();
|
mm.instance();
|
||||||
|
@ -2427,20 +2431,23 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
||||||
case WM_MOUSEWHEEL: {
|
case WM_MOUSEWHEEL: {
|
||||||
mb->set_pressed(true);
|
mb->set_pressed(true);
|
||||||
int motion = (short)HIWORD(wParam);
|
int motion = (short)HIWORD(wParam);
|
||||||
if (!motion)
|
if (!motion) {
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (motion > 0)
|
if (motion > 0) {
|
||||||
mb->set_button_index(MOUSE_BUTTON_WHEEL_UP);
|
mb->set_button_index(MOUSE_BUTTON_WHEEL_UP);
|
||||||
else
|
} else {
|
||||||
mb->set_button_index(MOUSE_BUTTON_WHEEL_DOWN);
|
mb->set_button_index(MOUSE_BUTTON_WHEEL_DOWN);
|
||||||
|
}
|
||||||
|
|
||||||
} break;
|
} break;
|
||||||
case WM_MOUSEHWHEEL: {
|
case WM_MOUSEHWHEEL: {
|
||||||
mb->set_pressed(true);
|
mb->set_pressed(true);
|
||||||
int motion = (short)HIWORD(wParam);
|
int motion = (short)HIWORD(wParam);
|
||||||
if (!motion)
|
if (!motion) {
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (motion < 0) {
|
if (motion < 0) {
|
||||||
mb->set_button_index(MOUSE_BUTTON_WHEEL_LEFT);
|
mb->set_button_index(MOUSE_BUTTON_WHEEL_LEFT);
|
||||||
|
@ -2452,24 +2459,27 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
||||||
} break;
|
} break;
|
||||||
case WM_XBUTTONDOWN: {
|
case WM_XBUTTONDOWN: {
|
||||||
mb->set_pressed(true);
|
mb->set_pressed(true);
|
||||||
if (HIWORD(wParam) == XBUTTON1)
|
if (HIWORD(wParam) == XBUTTON1) {
|
||||||
mb->set_button_index(MOUSE_BUTTON_XBUTTON1);
|
mb->set_button_index(MOUSE_BUTTON_XBUTTON1);
|
||||||
else
|
} else {
|
||||||
mb->set_button_index(MOUSE_BUTTON_XBUTTON2);
|
mb->set_button_index(MOUSE_BUTTON_XBUTTON2);
|
||||||
|
}
|
||||||
} break;
|
} break;
|
||||||
case WM_XBUTTONUP: {
|
case WM_XBUTTONUP: {
|
||||||
mb->set_pressed(false);
|
mb->set_pressed(false);
|
||||||
if (HIWORD(wParam) == XBUTTON1)
|
if (HIWORD(wParam) == XBUTTON1) {
|
||||||
mb->set_button_index(MOUSE_BUTTON_XBUTTON1);
|
mb->set_button_index(MOUSE_BUTTON_XBUTTON1);
|
||||||
else
|
} else {
|
||||||
mb->set_button_index(MOUSE_BUTTON_XBUTTON2);
|
mb->set_button_index(MOUSE_BUTTON_XBUTTON2);
|
||||||
|
}
|
||||||
} break;
|
} break;
|
||||||
case WM_XBUTTONDBLCLK: {
|
case WM_XBUTTONDBLCLK: {
|
||||||
mb->set_pressed(true);
|
mb->set_pressed(true);
|
||||||
if (HIWORD(wParam) == XBUTTON1)
|
if (HIWORD(wParam) == XBUTTON1) {
|
||||||
mb->set_button_index(MOUSE_BUTTON_XBUTTON1);
|
mb->set_button_index(MOUSE_BUTTON_XBUTTON1);
|
||||||
else
|
} else {
|
||||||
mb->set_button_index(MOUSE_BUTTON_XBUTTON2);
|
mb->set_button_index(MOUSE_BUTTON_XBUTTON2);
|
||||||
|
}
|
||||||
mb->set_double_click(true);
|
mb->set_double_click(true);
|
||||||
} break;
|
} break;
|
||||||
default: {
|
default: {
|
||||||
|
@ -2481,10 +2491,11 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
||||||
mb->set_shift_pressed((wParam & MK_SHIFT) != 0);
|
mb->set_shift_pressed((wParam & MK_SHIFT) != 0);
|
||||||
mb->set_alt_pressed(alt_mem);
|
mb->set_alt_pressed(alt_mem);
|
||||||
//mb->is_alt_pressed()=(wParam&MK_MENU)!=0;
|
//mb->is_alt_pressed()=(wParam&MK_MENU)!=0;
|
||||||
if (mb->is_pressed())
|
if (mb->is_pressed()) {
|
||||||
last_button_state |= (1 << (mb->get_button_index() - 1));
|
last_button_state |= (1 << (mb->get_button_index() - 1));
|
||||||
else
|
} else {
|
||||||
last_button_state &= ~(1 << (mb->get_button_index() - 1));
|
last_button_state &= ~(1 << (mb->get_button_index() - 1));
|
||||||
|
}
|
||||||
mb->set_button_mask(last_button_state);
|
mb->set_button_mask(last_button_state);
|
||||||
|
|
||||||
mb->set_position(Vector2(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)));
|
mb->set_position(Vector2(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)));
|
||||||
|
@ -2726,7 +2737,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
||||||
} break;
|
} break;
|
||||||
case WM_SETCURSOR: {
|
case WM_SETCURSOR: {
|
||||||
if (LOWORD(lParam) == HTCLIENT) {
|
if (LOWORD(lParam) == HTCLIENT) {
|
||||||
if (windows[window_id].window_has_focus && (mouse_mode == MOUSE_MODE_HIDDEN || mouse_mode == MOUSE_MODE_CAPTURED)) {
|
if (windows[window_id].window_has_focus && (mouse_mode == MOUSE_MODE_HIDDEN || mouse_mode == MOUSE_MODE_CAPTURED || mouse_mode == MOUSE_MODE_CONFINED_HIDDEN)) {
|
||||||
//Hide the cursor
|
//Hide the cursor
|
||||||
if (hCursor == nullptr) {
|
if (hCursor == nullptr) {
|
||||||
hCursor = SetCursor(nullptr);
|
hCursor = SetCursor(nullptr);
|
||||||
|
|
|
@ -509,6 +509,7 @@ void DisplayServer::_bind_methods() {
|
||||||
BIND_ENUM_CONSTANT(MOUSE_MODE_HIDDEN);
|
BIND_ENUM_CONSTANT(MOUSE_MODE_HIDDEN);
|
||||||
BIND_ENUM_CONSTANT(MOUSE_MODE_CAPTURED);
|
BIND_ENUM_CONSTANT(MOUSE_MODE_CAPTURED);
|
||||||
BIND_ENUM_CONSTANT(MOUSE_MODE_CONFINED);
|
BIND_ENUM_CONSTANT(MOUSE_MODE_CONFINED);
|
||||||
|
BIND_ENUM_CONSTANT(MOUSE_MODE_CONFINED_HIDDEN);
|
||||||
|
|
||||||
BIND_CONSTANT(SCREEN_OF_MAIN_WINDOW);
|
BIND_CONSTANT(SCREEN_OF_MAIN_WINDOW);
|
||||||
BIND_CONSTANT(MAIN_WINDOW_ID);
|
BIND_CONSTANT(MAIN_WINDOW_ID);
|
||||||
|
|
|
@ -142,7 +142,8 @@ public:
|
||||||
MOUSE_MODE_VISIBLE,
|
MOUSE_MODE_VISIBLE,
|
||||||
MOUSE_MODE_HIDDEN,
|
MOUSE_MODE_HIDDEN,
|
||||||
MOUSE_MODE_CAPTURED,
|
MOUSE_MODE_CAPTURED,
|
||||||
MOUSE_MODE_CONFINED
|
MOUSE_MODE_CONFINED,
|
||||||
|
MOUSE_MODE_CONFINED_HIDDEN,
|
||||||
};
|
};
|
||||||
|
|
||||||
virtual void mouse_set_mode(MouseMode p_mode);
|
virtual void mouse_set_mode(MouseMode p_mode);
|
||||||
|
|
Loading…
Reference in New Issue