Fix cursor blinking in integrated GPUs
Optimization for Input::set_custom_mouse_cursor when used inside _process function. (Avoids cursor blinking in low end devices)
This commit is contained in:
parent
5e495750a3
commit
a9a0d0fb15
@ -448,6 +448,18 @@ void OS_JavaScript::set_cursor_shape(CursorShape p_shape) {
|
|||||||
void OS_JavaScript::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, const Vector2 &p_hotspot) {
|
void OS_JavaScript::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, const Vector2 &p_hotspot) {
|
||||||
|
|
||||||
if (p_cursor.is_valid()) {
|
if (p_cursor.is_valid()) {
|
||||||
|
|
||||||
|
Map<CursorShape, Vector<Variant> >::Element *cursor_c = cursors_cache.find(p_shape);
|
||||||
|
|
||||||
|
if (cursor_c) {
|
||||||
|
if (cursor_c->get()[0] == p_cursor && cursor_c->get()[1] == p_hotspot) {
|
||||||
|
set_cursor_shape(p_shape);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
cursors_cache.erase(p_shape);
|
||||||
|
}
|
||||||
|
|
||||||
Ref<Texture> texture = p_cursor;
|
Ref<Texture> texture = p_cursor;
|
||||||
Ref<AtlasTexture> atlas_texture = p_cursor;
|
Ref<AtlasTexture> atlas_texture = p_cursor;
|
||||||
Ref<Image> image;
|
Ref<Image> image;
|
||||||
@ -551,6 +563,11 @@ void OS_JavaScript::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_s
|
|||||||
|
|
||||||
cursors[p_shape] = url;
|
cursors[p_shape] = url;
|
||||||
|
|
||||||
|
Vector<Variant> params;
|
||||||
|
params.push_back(p_cursor);
|
||||||
|
params.push_back(p_hotspot);
|
||||||
|
cursors_cache.insert(p_shape, params);
|
||||||
|
|
||||||
} else if (cursors[p_shape] != "") {
|
} else if (cursors[p_shape] != "") {
|
||||||
/* clang-format off */
|
/* clang-format off */
|
||||||
EM_ASM({
|
EM_ASM({
|
||||||
|
@ -52,6 +52,7 @@ class OS_JavaScript : public OS_Unix {
|
|||||||
Ref<InputEventKey> deferred_key_event;
|
Ref<InputEventKey> deferred_key_event;
|
||||||
CursorShape cursor_shape;
|
CursorShape cursor_shape;
|
||||||
String cursors[CURSOR_MAX];
|
String cursors[CURSOR_MAX];
|
||||||
|
Map<CursorShape, Vector<Variant> > cursors_cache;
|
||||||
Point2 touches[32];
|
Point2 touches[32];
|
||||||
|
|
||||||
Point2i last_click_pos;
|
Point2i last_click_pos;
|
||||||
|
@ -119,6 +119,7 @@ public:
|
|||||||
|
|
||||||
CursorShape cursor_shape;
|
CursorShape cursor_shape;
|
||||||
NSCursor *cursors[CURSOR_MAX];
|
NSCursor *cursors[CURSOR_MAX];
|
||||||
|
Map<CursorShape, Vector<Variant> > cursors_cache;
|
||||||
MouseMode mouse_mode;
|
MouseMode mouse_mode;
|
||||||
|
|
||||||
String title;
|
String title;
|
||||||
|
@ -1770,7 +1770,20 @@ OS::CursorShape OS_OSX::get_cursor_shape() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void OS_OSX::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, const Vector2 &p_hotspot) {
|
void OS_OSX::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, const Vector2 &p_hotspot) {
|
||||||
|
|
||||||
if (p_cursor.is_valid()) {
|
if (p_cursor.is_valid()) {
|
||||||
|
|
||||||
|
Map<CursorShape, Vector<Variant> >::Element *cursor_c = cursors_cache.find(p_shape);
|
||||||
|
|
||||||
|
if (cursor_c) {
|
||||||
|
if (cursor_c->get()[0] == p_cursor && cursor_c->get()[1] == p_hotspot) {
|
||||||
|
set_cursor_shape(p_shape);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
cursors_cache.erase(p_shape);
|
||||||
|
}
|
||||||
|
|
||||||
Ref<Texture> texture = p_cursor;
|
Ref<Texture> texture = p_cursor;
|
||||||
Ref<AtlasTexture> atlas_texture = p_cursor;
|
Ref<AtlasTexture> atlas_texture = p_cursor;
|
||||||
Ref<Image> image;
|
Ref<Image> image;
|
||||||
@ -1855,6 +1868,11 @@ void OS_OSX::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, c
|
|||||||
[cursors[p_shape] release];
|
[cursors[p_shape] release];
|
||||||
cursors[p_shape] = cursor;
|
cursors[p_shape] = cursor;
|
||||||
|
|
||||||
|
Vector<Variant> params;
|
||||||
|
params.push_back(p_cursor);
|
||||||
|
params.push_back(p_hotspot);
|
||||||
|
cursors_cache.insert(p_shape, params);
|
||||||
|
|
||||||
if (p_shape == cursor_shape) {
|
if (p_shape == cursor_shape) {
|
||||||
if (mouse_mode == MOUSE_MODE_VISIBLE || mouse_mode == MOUSE_MODE_CONFINED) {
|
if (mouse_mode == MOUSE_MODE_VISIBLE || mouse_mode == MOUSE_MODE_CONFINED) {
|
||||||
[cursor set];
|
[cursor set];
|
||||||
|
@ -2367,7 +2367,20 @@ OS::CursorShape OS_Windows::get_cursor_shape() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void OS_Windows::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, const Vector2 &p_hotspot) {
|
void OS_Windows::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, const Vector2 &p_hotspot) {
|
||||||
|
|
||||||
if (p_cursor.is_valid()) {
|
if (p_cursor.is_valid()) {
|
||||||
|
|
||||||
|
Map<CursorShape, Vector<Variant> >::Element *cursor_c = cursors_cache.find(p_shape);
|
||||||
|
|
||||||
|
if (cursor_c) {
|
||||||
|
if (cursor_c->get()[0] == p_cursor && cursor_c->get()[1] == p_hotspot) {
|
||||||
|
set_cursor_shape(p_shape);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
cursors_cache.erase(p_shape);
|
||||||
|
}
|
||||||
|
|
||||||
Ref<Texture> texture = p_cursor;
|
Ref<Texture> texture = p_cursor;
|
||||||
Ref<AtlasTexture> atlas_texture = p_cursor;
|
Ref<AtlasTexture> atlas_texture = p_cursor;
|
||||||
Ref<Image> image;
|
Ref<Image> image;
|
||||||
@ -2450,6 +2463,11 @@ void OS_Windows::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shap
|
|||||||
|
|
||||||
cursors[p_shape] = CreateIconIndirect(&iconinfo);
|
cursors[p_shape] = CreateIconIndirect(&iconinfo);
|
||||||
|
|
||||||
|
Vector<Variant> params;
|
||||||
|
params.push_back(p_cursor);
|
||||||
|
params.push_back(p_hotspot);
|
||||||
|
cursors_cache.insert(p_shape, params);
|
||||||
|
|
||||||
if (p_shape == cursor_shape) {
|
if (p_shape == cursor_shape) {
|
||||||
if (mouse_mode == MOUSE_MODE_VISIBLE || mouse_mode == MOUSE_MODE_CONFINED) {
|
if (mouse_mode == MOUSE_MODE_VISIBLE || mouse_mode == MOUSE_MODE_CONFINED) {
|
||||||
SetCursor(cursors[p_shape]);
|
SetCursor(cursors[p_shape]);
|
||||||
|
@ -155,6 +155,7 @@ class OS_Windows : public OS {
|
|||||||
|
|
||||||
HCURSOR cursors[CURSOR_MAX] = { NULL };
|
HCURSOR cursors[CURSOR_MAX] = { NULL };
|
||||||
CursorShape cursor_shape;
|
CursorShape cursor_shape;
|
||||||
|
Map<CursorShape, Vector<Variant> > cursors_cache;
|
||||||
|
|
||||||
InputDefault *input;
|
InputDefault *input;
|
||||||
JoypadWindows *joypad;
|
JoypadWindows *joypad;
|
||||||
|
@ -2878,7 +2878,20 @@ OS::CursorShape OS_X11::get_cursor_shape() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void OS_X11::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, const Vector2 &p_hotspot) {
|
void OS_X11::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, const Vector2 &p_hotspot) {
|
||||||
|
|
||||||
if (p_cursor.is_valid()) {
|
if (p_cursor.is_valid()) {
|
||||||
|
|
||||||
|
Map<CursorShape, Vector<Variant> >::Element *cursor_c = cursors_cache.find(p_shape);
|
||||||
|
|
||||||
|
if (cursor_c) {
|
||||||
|
if (cursor_c->get()[0] == p_cursor && cursor_c->get()[1] == p_hotspot) {
|
||||||
|
set_cursor_shape(p_shape);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
cursors_cache.erase(p_shape);
|
||||||
|
}
|
||||||
|
|
||||||
Ref<Texture> texture = p_cursor;
|
Ref<Texture> texture = p_cursor;
|
||||||
Ref<AtlasTexture> atlas_texture = p_cursor;
|
Ref<AtlasTexture> atlas_texture = p_cursor;
|
||||||
Ref<Image> image;
|
Ref<Image> image;
|
||||||
@ -2947,6 +2960,11 @@ void OS_X11::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, c
|
|||||||
// Save it for a further usage
|
// Save it for a further usage
|
||||||
cursors[p_shape] = XcursorImageLoadCursor(x11_display, cursor_image);
|
cursors[p_shape] = XcursorImageLoadCursor(x11_display, cursor_image);
|
||||||
|
|
||||||
|
Vector<Variant> params;
|
||||||
|
params.push_back(p_cursor);
|
||||||
|
params.push_back(p_hotspot);
|
||||||
|
cursors_cache.insert(p_shape, params);
|
||||||
|
|
||||||
if (p_shape == current_cursor) {
|
if (p_shape == current_cursor) {
|
||||||
if (mouse_mode == MOUSE_MODE_VISIBLE || mouse_mode == MOUSE_MODE_CONFINED) {
|
if (mouse_mode == MOUSE_MODE_VISIBLE || mouse_mode == MOUSE_MODE_CONFINED) {
|
||||||
XDefineCursor(x11_display, x11_window, cursors[p_shape]);
|
XDefineCursor(x11_display, x11_window, cursors[p_shape]);
|
||||||
|
@ -170,6 +170,7 @@ class OS_X11 : public OS_Unix {
|
|||||||
Cursor cursors[CURSOR_MAX];
|
Cursor cursors[CURSOR_MAX];
|
||||||
Cursor null_cursor;
|
Cursor null_cursor;
|
||||||
CursorShape current_cursor;
|
CursorShape current_cursor;
|
||||||
|
Map<CursorShape, Vector<Variant> > cursors_cache;
|
||||||
|
|
||||||
InputDefault *input;
|
InputDefault *input;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user