Skip to content

Commit 3c80c14

Browse files
committed
Merge pull request godotengine#101924 from adamscott/game-editor-non-cached-mouse-mode
Delegate handling `mouse_mode` to the `DisplayServer`
2 parents ab67fd7 + 47f553a commit 3c80c14

19 files changed

+394
-77
lines changed

core/input/input.cpp

Lines changed: 18 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,10 @@ Input *Input::singleton = nullptr;
7777

7878
void (*Input::set_mouse_mode_func)(Input::MouseMode) = nullptr;
7979
Input::MouseMode (*Input::get_mouse_mode_func)() = nullptr;
80+
void (*Input::set_mouse_mode_override_func)(Input::MouseMode) = nullptr;
81+
Input::MouseMode (*Input::get_mouse_mode_override_func)() = nullptr;
82+
void (*Input::set_mouse_mode_override_enabled_func)(bool) = nullptr;
83+
bool (*Input::is_mouse_mode_override_enabled_func)() = nullptr;
8084
void (*Input::warp_mouse_func)(const Vector2 &p_position) = nullptr;
8185
Input::CursorShape (*Input::get_current_cursor_shape_func)() = nullptr;
8286
void (*Input::set_custom_mouse_cursor_func)(const Ref<Resource> &, Input::CursorShape, const Vector2 &) = nullptr;
@@ -86,51 +90,29 @@ Input *Input::get_singleton() {
8690
}
8791

8892
void Input::set_mouse_mode(MouseMode p_mode) {
89-
ERR_FAIL_INDEX((int)p_mode, 5);
90-
91-
if (p_mode == mouse_mode) {
92-
return;
93-
}
94-
95-
// Allow to be set even if overridden, to see if the platform allows the mode.
93+
ERR_FAIL_INDEX(p_mode, MouseMode::MOUSE_MODE_MAX);
9694
set_mouse_mode_func(p_mode);
97-
mouse_mode = get_mouse_mode_func();
98-
99-
if (mouse_mode_override_enabled) {
100-
set_mouse_mode_func(mouse_mode_override);
101-
}
10295
}
10396

10497
Input::MouseMode Input::get_mouse_mode() const {
105-
return mouse_mode;
98+
return get_mouse_mode_func();
10699
}
107100

108-
void Input::set_mouse_mode_override_enabled(bool p_enabled) {
109-
if (p_enabled == mouse_mode_override_enabled) {
110-
return;
111-
}
112-
113-
mouse_mode_override_enabled = p_enabled;
114-
115-
if (p_enabled) {
116-
set_mouse_mode_func(mouse_mode_override);
117-
mouse_mode_override = get_mouse_mode_func();
118-
} else {
119-
set_mouse_mode_func(mouse_mode);
120-
}
101+
void Input::set_mouse_mode_override(MouseMode p_mode) {
102+
ERR_FAIL_INDEX(p_mode, MouseMode::MOUSE_MODE_MAX);
103+
set_mouse_mode_override_func(p_mode);
121104
}
122105

123-
void Input::set_mouse_mode_override(MouseMode p_mode) {
124-
ERR_FAIL_INDEX((int)p_mode, 5);
106+
Input::MouseMode Input::get_mouse_mode_override() const {
107+
return get_mouse_mode_override_func();
108+
}
125109

126-
if (p_mode == mouse_mode_override) {
127-
return;
128-
}
110+
void Input::set_mouse_mode_override_enabled(bool p_override_enabled) {
111+
set_mouse_mode_override_enabled_func(p_override_enabled);
112+
}
129113

130-
if (mouse_mode_override_enabled) {
131-
set_mouse_mode_func(p_mode);
132-
mouse_mode_override = get_mouse_mode_func();
133-
}
114+
bool Input::is_mouse_mode_override_enabled() {
115+
return is_mouse_mode_override_enabled_func();
134116
}
135117

136118
void Input::_bind_methods() {
@@ -199,6 +181,7 @@ void Input::_bind_methods() {
199181
BIND_ENUM_CONSTANT(MOUSE_MODE_CAPTURED);
200182
BIND_ENUM_CONSTANT(MOUSE_MODE_CONFINED);
201183
BIND_ENUM_CONSTANT(MOUSE_MODE_CONFINED_HIDDEN);
184+
BIND_ENUM_CONSTANT(MOUSE_MODE_MAX);
202185

203186
BIND_ENUM_CONSTANT(CURSOR_ARROW);
204187
BIND_ENUM_CONSTANT(CURSOR_IBEAM);

core/input/input.h

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,14 @@ class Input : public Object {
4747
static constexpr uint64_t MAX_EVENT = 32;
4848

4949
public:
50+
// Keep synced with "DisplayServer::MouseMode" enum.
5051
enum MouseMode {
5152
MOUSE_MODE_VISIBLE,
5253
MOUSE_MODE_HIDDEN,
5354
MOUSE_MODE_CAPTURED,
5455
MOUSE_MODE_CONFINED,
5556
MOUSE_MODE_CONFINED_HIDDEN,
57+
MOUSE_MODE_MAX,
5658
};
5759

5860
#undef CursorShape
@@ -105,10 +107,6 @@ class Input : public Object {
105107
bool legacy_just_pressed_behavior = false;
106108
bool disable_input = false;
107109

108-
MouseMode mouse_mode = MOUSE_MODE_VISIBLE;
109-
bool mouse_mode_override_enabled = false;
110-
MouseMode mouse_mode_override = MOUSE_MODE_VISIBLE;
111-
112110
struct ActionState {
113111
uint64_t pressed_physics_frame = UINT64_MAX;
114112
uint64_t pressed_process_frame = UINT64_MAX;
@@ -268,6 +266,10 @@ class Input : public Object {
268266

269267
static void (*set_mouse_mode_func)(MouseMode);
270268
static MouseMode (*get_mouse_mode_func)();
269+
static void (*set_mouse_mode_override_func)(MouseMode);
270+
static MouseMode (*get_mouse_mode_override_func)();
271+
static void (*set_mouse_mode_override_enabled_func)(bool);
272+
static bool (*is_mouse_mode_override_enabled_func)();
271273
static void (*warp_mouse_func)(const Vector2 &p_position);
272274

273275
static CursorShape (*get_current_cursor_shape_func)();
@@ -286,8 +288,10 @@ class Input : public Object {
286288
public:
287289
void set_mouse_mode(MouseMode p_mode);
288290
MouseMode get_mouse_mode() const;
289-
void set_mouse_mode_override_enabled(bool p_enabled);
290291
void set_mouse_mode_override(MouseMode p_mode);
292+
MouseMode get_mouse_mode_override() const;
293+
void set_mouse_mode_override_enabled(bool p_override_enabled);
294+
bool is_mouse_mode_override_enabled();
291295

292296
#ifdef TOOLS_ENABLED
293297
void get_argument_options(const StringName &p_function, int p_idx, List<String> *r_options) const override;

doc/classes/DisplayServer.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1968,6 +1968,9 @@
19681968
<constant name="MOUSE_MODE_CONFINED_HIDDEN" value="4" enum="MouseMode">
19691969
Confines the mouse cursor to the game window, and make it hidden.
19701970
</constant>
1971+
<constant name="MOUSE_MODE_MAX" value="5" enum="MouseMode">
1972+
Max value of the [enum MouseMode].
1973+
</constant>
19711974
<constant name="SCREEN_WITH_MOUSE_FOCUS" value="-4">
19721975
Represents the screen containing the mouse pointer.
19731976
[b]Note:[/b] On Linux (Wayland), this constant always represents the screen at index [code]0[/code].

doc/classes/Input.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -464,6 +464,9 @@
464464
<constant name="MOUSE_MODE_CONFINED_HIDDEN" value="4" enum="MouseMode">
465465
Confines the mouse cursor to the game window, and make it hidden.
466466
</constant>
467+
<constant name="MOUSE_MODE_MAX" value="5" enum="MouseMode">
468+
Max value of the [enum MouseMode].
469+
</constant>
467470
<constant name="CURSOR_ARROW" value="0" enum="CursorShape">
468471
Arrow cursor. Standard, default pointing cursor.
469472
</constant>

platform/android/display_server_android.cpp

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -771,33 +771,68 @@ void DisplayServerAndroid::process_gyroscope(const Vector3 &p_gyroscope) {
771771
Input::get_singleton()->set_gyroscope(p_gyroscope);
772772
}
773773

774-
void DisplayServerAndroid::mouse_set_mode(MouseMode p_mode) {
774+
void DisplayServerAndroid::_mouse_update_mode() {
775+
MouseMode wanted_mouse_mode = mouse_mode_override_enabled
776+
? mouse_mode_override
777+
: mouse_mode_base;
778+
775779
if (!OS_Android::get_singleton()->get_godot_java()->get_godot_view()->can_update_pointer_icon() || !OS_Android::get_singleton()->get_godot_java()->get_godot_view()->can_capture_pointer()) {
776780
return;
777781
}
778-
if (mouse_mode == p_mode) {
782+
if (mouse_mode == wanted_mouse_mode) {
779783
return;
780784
}
781785

782-
if (p_mode == MouseMode::MOUSE_MODE_HIDDEN) {
786+
if (wanted_mouse_mode == MouseMode::MOUSE_MODE_HIDDEN) {
783787
OS_Android::get_singleton()->get_godot_java()->get_godot_view()->set_pointer_icon(CURSOR_TYPE_NULL);
784788
} else {
785789
cursor_set_shape(cursor_shape);
786790
}
787791

788-
if (p_mode == MouseMode::MOUSE_MODE_CAPTURED) {
792+
if (wanted_mouse_mode == MouseMode::MOUSE_MODE_CAPTURED) {
789793
OS_Android::get_singleton()->get_godot_java()->get_godot_view()->request_pointer_capture();
790794
} else {
791795
OS_Android::get_singleton()->get_godot_java()->get_godot_view()->release_pointer_capture();
792796
}
793797

794-
mouse_mode = p_mode;
798+
mouse_mode = wanted_mouse_mode;
799+
}
800+
801+
void DisplayServerAndroid::mouse_set_mode(MouseMode p_mode) {
802+
ERR_FAIL_INDEX(p_mode, MouseMode::MOUSE_MODE_MAX);
803+
if (p_mode == mouse_mode_base) {
804+
return;
805+
}
806+
mouse_mode_base = p_mode;
807+
_mouse_update_mode();
795808
}
796809

797810
DisplayServer::MouseMode DisplayServerAndroid::mouse_get_mode() const {
798811
return mouse_mode;
799812
}
800813

814+
void DisplayServerAndroid::mouse_set_mode_override(MouseMode p_mode) {
815+
ERR_FAIL_INDEX(p_mode, MouseMode::MOUSE_MODE_MAX);
816+
if (p_mode == mouse_mode_override) {
817+
return;
818+
}
819+
mouse_mode_override = p_mode;
820+
_mouse_update_mode();
821+
}
822+
823+
DisplayServer::MouseMode DisplayServerAndroid::mouse_get_mode_override() const {
824+
return mouse_mode_override;
825+
}
826+
827+
void DisplayServerAndroid::mouse_set_mode_override_enabled(bool p_override_enabled) {
828+
mouse_mode_override_enabled = p_override_enabled;
829+
_mouse_update_mode();
830+
}
831+
832+
bool DisplayServerAndroid::mouse_is_mode_override_enabled() const {
833+
return mouse_mode_override_enabled;
834+
}
835+
801836
Point2i DisplayServerAndroid::mouse_get_position() const {
802837
return Input::get_singleton()->get_mouse_position();
803838
}

platform/android/display_server_android.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,10 @@ class DisplayServerAndroid : public DisplayServer {
6666
};
6767
const int CURSOR_TYPE_NULL = 0;
6868
MouseMode mouse_mode = MouseMode::MOUSE_MODE_VISIBLE;
69+
MouseMode mouse_mode_base = MouseMode::MOUSE_MODE_VISIBLE;
70+
MouseMode mouse_mode_override = MouseMode::MOUSE_MODE_VISIBLE;
71+
bool mouse_mode_override_enabled = false;
72+
void _mouse_update_mode();
6973

7074
bool keep_screen_on;
7175
bool swap_buffers_flag;
@@ -228,6 +232,10 @@ class DisplayServerAndroid : public DisplayServer {
228232

229233
virtual void mouse_set_mode(MouseMode p_mode) override;
230234
virtual MouseMode mouse_get_mode() const override;
235+
virtual void mouse_set_mode_override(MouseMode p_mode) override;
236+
virtual MouseMode mouse_get_mode_override() const override;
237+
virtual void mouse_set_mode_override_enabled(bool p_override_enabled) override;
238+
virtual bool mouse_is_mode_override_enabled() const override;
231239

232240
static DisplayServer *create_func(const String &p_rendering_driver, WindowMode p_mode, DisplayServer::VSyncMode p_vsync_mode, uint32_t p_flags, const Vector2i *p_position, const Vector2i &p_resolution, int p_screen, Context p_context, int64_t p_parent_window, Error &r_error);
233241
static Vector<String> get_rendering_drivers_func();

platform/linuxbsd/wayland/display_server_wayland.cpp

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -325,20 +325,24 @@ void DisplayServerWayland::beep() const {
325325
wayland_thread.beep();
326326
}
327327

328-
void DisplayServerWayland::mouse_set_mode(MouseMode p_mode) {
329-
if (p_mode == mouse_mode) {
328+
void DisplayServerWayland::_mouse_update_mode() {
329+
MouseMode wanted_mouse_mode = mouse_mode_override_enabled
330+
? mouse_mode_override
331+
: mouse_mode_base;
332+
333+
if (wanted_mouse_mode == mouse_mode) {
330334
return;
331335
}
332336

333337
MutexLock mutex_lock(wayland_thread.mutex);
334338

335-
bool show_cursor = (p_mode == MOUSE_MODE_VISIBLE || p_mode == MOUSE_MODE_CONFINED);
339+
bool show_cursor = (wanted_mouse_mode == MOUSE_MODE_VISIBLE || wanted_mouse_mode == MOUSE_MODE_CONFINED);
336340

337341
wayland_thread.cursor_set_visible(show_cursor);
338342

339343
WaylandThread::PointerConstraint constraint = WaylandThread::PointerConstraint::NONE;
340344

341-
switch (p_mode) {
345+
switch (wanted_mouse_mode) {
342346
case DisplayServer::MOUSE_MODE_CAPTURED: {
343347
constraint = WaylandThread::PointerConstraint::LOCKED;
344348
} break;
@@ -354,13 +358,47 @@ void DisplayServerWayland::mouse_set_mode(MouseMode p_mode) {
354358

355359
wayland_thread.pointer_set_constraint(constraint);
356360

357-
mouse_mode = p_mode;
361+
mouse_mode = wanted_mouse_mode;
362+
}
363+
364+
void DisplayServerWayland::mouse_set_mode(MouseMode p_mode) {
365+
ERR_FAIL_INDEX(p_mode, MouseMode::MOUSE_MODE_MAX);
366+
if (p_mode == mouse_mode_base) {
367+
return;
368+
}
369+
mouse_mode_base = p_mode;
370+
_mouse_update_mode();
358371
}
359372

360373
DisplayServerWayland::MouseMode DisplayServerWayland::mouse_get_mode() const {
361374
return mouse_mode;
362375
}
363376

377+
void DisplayServerWayland::mouse_set_mode_override(MouseMode p_mode) {
378+
ERR_FAIL_INDEX(p_mode, MouseMode::MOUSE_MODE_MAX);
379+
if (p_mode == mouse_mode_override) {
380+
return;
381+
}
382+
mouse_mode_override = p_mode;
383+
_mouse_update_mode();
384+
}
385+
386+
DisplayServerWayland::MouseMode DisplayServerWayland::mouse_get_mode_override() const {
387+
return mouse_mode_override;
388+
}
389+
390+
void DisplayServerWayland::mouse_set_mode_override_enabled(bool p_override_enabled) {
391+
if (p_override_enabled == mouse_mode_override_enabled) {
392+
return;
393+
}
394+
mouse_mode_override_enabled = p_override_enabled;
395+
_mouse_update_mode();
396+
}
397+
398+
bool DisplayServerWayland::mouse_is_mode_override_enabled() const {
399+
return mouse_mode_override_enabled;
400+
}
401+
364402
// NOTE: This is hacked together (and not guaranteed to work in the first place)
365403
// as for some reason the there's no proper way to ask the compositor to warp
366404
// the pointer, although, at the time of writing, there's a proposal for a

platform/linuxbsd/wayland/display_server_wayland.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,10 @@ class DisplayServerWayland : public DisplayServer {
113113

114114
CursorShape cursor_shape = CURSOR_ARROW;
115115
DisplayServer::MouseMode mouse_mode = DisplayServer::MOUSE_MODE_VISIBLE;
116+
DisplayServer::MouseMode mouse_mode_base = MOUSE_MODE_VISIBLE;
117+
DisplayServer::MouseMode mouse_mode_override = MOUSE_MODE_VISIBLE;
118+
bool mouse_mode_override_enabled = false;
119+
void _mouse_update_mode();
116120

117121
HashMap<CursorShape, CustomCursor> custom_cursors;
118122

@@ -191,6 +195,10 @@ class DisplayServerWayland : public DisplayServer {
191195

192196
virtual void mouse_set_mode(MouseMode p_mode) override;
193197
virtual MouseMode mouse_get_mode() const override;
198+
virtual void mouse_set_mode_override(MouseMode p_mode) override;
199+
virtual MouseMode mouse_get_mode_override() const override;
200+
virtual void mouse_set_mode_override_enabled(bool p_override_enabled) override;
201+
virtual bool mouse_is_mode_override_enabled() const override;
194202

195203
virtual void warp_mouse(const Point2i &p_to) override;
196204
virtual Point2i mouse_get_position() const override;

0 commit comments

Comments
 (0)