[macOS/Windows] Add Emoji & Symbols context menu item to LineEdit/TextEdit to show system character picker.

This commit is contained in:
Pāvels Nadtočajevs 2025-01-02 13:27:35 +02:00
parent 24d74510e5
commit b252867145
21 changed files with 167 additions and 4 deletions

View file

@ -1215,6 +1215,13 @@
[b]Note:[/b] This method is implemented on Android, iOS, macOS, Windows, and Linux (X11/Wayland).
</description>
</method>
<method name="show_emoji_and_symbol_picker" qualifiers="const">
<return type="void" />
<description>
Opens system emoji and symbol picker.
[b]Note:[/b] This method is implemented on macOS and Windows.
</description>
</method>
<method name="status_indicator_get_rect" qualifiers="const">
<return type="Rect2" />
<param index="0" name="id" type="int" />
@ -1941,6 +1948,9 @@
<constant name="FEATURE_NATIVE_DIALOG_FILE_MIME" value="30" enum="Feature">
Native file selection dialog supports MIME types as filters.
</constant>
<constant name="FEATURE_EMOJI_AND_SYMBOL_PICKER" value="31" enum="Feature">
Display server supports system emoji and symbol picker. [b]Windows, macOS[/b]
</constant>
<constant name="MOUSE_MODE_VISIBLE" value="0" enum="MouseMode">
Makes the mouse cursor visible if it is hidden.
</constant>

View file

@ -276,6 +276,9 @@
<member name="editable" type="bool" setter="set_editable" getter="is_editable" default="true" keywords="readonly, disabled, enabled">
If [code]false[/code], existing text cannot be modified and new text cannot be added.
</member>
<member name="emoji_menu_enabled" type="bool" setter="set_emoji_menu_enabled" getter="is_emoji_menu_enabled" default="true">
If [code]false[/code], "Emoji and Symbols" menu is enabled.
</member>
<member name="expand_to_text_length" type="bool" setter="set_expand_to_text_length_enabled" getter="is_expand_to_text_length_enabled" default="false">
If [code]true[/code], the [LineEdit] width will increase to stay longer than the [member text]. It will [b]not[/b] compress if the [member text] is shortened.
</member>
@ -478,7 +481,10 @@
<constant name="MENU_INSERT_SHY" value="29" enum="MenuItems">
Inserts soft hyphen (SHY) character.
</constant>
<constant name="MENU_MAX" value="30" enum="MenuItems">
<constant name="MENU_EMOJI_AND_SYMBOL" value="30" enum="MenuItems">
Opens system emoji and symbol picker.
</constant>
<constant name="MENU_MAX" value="31" enum="MenuItems">
Represents the size of the [enum MenuItems] enum.
</constant>
<constant name="KEYBOARD_TYPE_DEFAULT" value="0" enum="VirtualKeyboardType">

View file

@ -1299,6 +1299,9 @@
<member name="editable" type="bool" setter="set_editable" getter="is_editable" default="true" keywords="readonly, disabled, enabled">
If [code]false[/code], existing text cannot be modified and new text cannot be added.
</member>
<member name="emoji_menu_enabled" type="bool" setter="set_emoji_menu_enabled" getter="is_emoji_menu_enabled" default="true">
If [code]false[/code], "Emoji and Symbols" menu is enabled.
</member>
<member name="empty_selection_clipboard_enabled" type="bool" setter="set_empty_selection_clipboard_enabled" getter="is_empty_selection_clipboard_enabled" default="true">
If [code]true[/code], copying or cutting without a selection is performed on all lines with a caret. Otherwise, copy and cut require a selection.
</member>
@ -1519,7 +1522,10 @@
<constant name="MENU_INSERT_SHY" value="29" enum="MenuItems">
Inserts soft hyphen (SHY) character.
</constant>
<constant name="MENU_MAX" value="30" enum="MenuItems">
<constant name="MENU_EMOJI_AND_SYMBOL" value="30" enum="MenuItems">
Opens system emoji and symbol picker.
</constant>
<constant name="MENU_MAX" value="31" enum="MenuItems">
Represents the size of the [enum MenuItems] enum.
</constant>
<constant name="ACTION_NONE" value="0" enum="EditAction">

View file

@ -715,6 +715,7 @@ void EditorSpinSlider::_ensure_input_popup() {
add_child(value_input_popup);
value_input = memnew(LineEdit);
value_input->set_emoji_menu_enabled(false);
value_input->set_focus_mode(FOCUS_CLICK);
value_input_popup->add_child(value_input);
value_input->set_anchors_and_offsets_preset(PRESET_FULL_RECT);

View file

@ -1738,6 +1738,9 @@ void ScriptTextEditor::_edit_option(int p_op) {
_lookup_symbol(text, tx->get_caret_line(0), tx->get_caret_column(0));
}
} break;
case EDIT_EMOJI_AND_SYMBOL: {
code_editor->get_text_editor()->show_emoji_and_symbol_picker();
} break;
default: {
if (p_op >= EditorContextMenuPlugin::BASE_ID) {
EditorContextMenuPluginManager::get_singleton()->activate_custom_option(EditorContextMenuPlugin::CONTEXT_SLOT_SCRIPT_EDITOR_CODE, p_op, tx);
@ -2294,6 +2297,10 @@ void ScriptTextEditor::_prepare_edit_menu() {
void ScriptTextEditor::_make_context_menu(bool p_selection, bool p_color, bool p_foldable, bool p_open_docs, bool p_goto_definition, Vector2 p_pos) {
context_menu->clear();
if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_EMOJI_AND_SYMBOL_PICKER)) {
context_menu->add_item(TTR("Emoji & Symbols"), EDIT_EMOJI_AND_SYMBOL);
context_menu->add_separator();
}
context_menu->add_shortcut(ED_GET_SHORTCUT("ui_undo"), EDIT_UNDO);
context_menu->add_shortcut(ED_GET_SHORTCUT("ui_redo"), EDIT_REDO);

View file

@ -157,6 +157,7 @@ class ScriptTextEditor : public ScriptEditorBase {
DEBUG_GOTO_PREV_BREAKPOINT,
HELP_CONTEXTUAL,
LOOKUP_SYMBOL,
EDIT_EMOJI_AND_SYMBOL,
};
void _enable_code_editor();

View file

@ -481,6 +481,9 @@ void TextEditor::_edit_option(int p_op) {
case BOOKMARK_REMOVE_ALL: {
code_editor->remove_all_bookmarks();
} break;
case EDIT_EMOJI_AND_SYMBOL: {
code_editor->get_text_editor()->show_emoji_and_symbol_picker();
} break;
}
}
@ -560,6 +563,10 @@ void TextEditor::_prepare_edit_menu() {
void TextEditor::_make_context_menu(bool p_selection, bool p_can_fold, bool p_is_folded, Vector2 p_position) {
context_menu->clear();
if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_EMOJI_AND_SYMBOL_PICKER)) {
context_menu->add_item(TTR("Emoji & Symbols"), EDIT_EMOJI_AND_SYMBOL);
context_menu->add_separator();
}
if (p_selection) {
context_menu->add_shortcut(ED_GET_SHORTCUT("ui_cut"), EDIT_CUT);
context_menu->add_shortcut(ED_GET_SHORTCUT("ui_copy"), EDIT_COPY);

View file

@ -91,6 +91,7 @@ private:
BOOKMARK_GOTO_NEXT,
BOOKMARK_GOTO_PREV,
BOOKMARK_REMOVE_ALL,
EDIT_EMOJI_AND_SYMBOL,
};
protected:

View file

@ -729,6 +729,9 @@ void TextShaderEditor::_menu_option(int p_option) {
case HELP_DOCS: {
OS::get_singleton()->shell_open(vformat("%s/tutorials/shaders/shader_reference/index.html", VERSION_DOCS_URL));
} break;
case EDIT_EMOJI_AND_SYMBOL: {
code_editor->get_text_editor()->show_emoji_and_symbol_picker();
} break;
}
if (p_option != SEARCH_FIND && p_option != SEARCH_REPLACE && p_option != SEARCH_GOTO_LINE) {
callable_mp((Control *)code_editor->get_text_editor(), &Control::grab_focus).call_deferred();
@ -1087,6 +1090,10 @@ void TextShaderEditor::_bookmark_item_pressed(int p_idx) {
void TextShaderEditor::_make_context_menu(bool p_selection, Vector2 p_position) {
context_menu->clear();
if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_EMOJI_AND_SYMBOL_PICKER)) {
context_menu->add_item(TTR("Emoji & Symbols"), EDIT_EMOJI_AND_SYMBOL);
context_menu->add_separator();
}
if (p_selection) {
context_menu->add_shortcut(ED_GET_SHORTCUT("ui_cut"), EDIT_CUT);
context_menu->add_shortcut(ED_GET_SHORTCUT("ui_copy"), EDIT_COPY);

View file

@ -134,6 +134,7 @@ class TextShaderEditor : public ShaderEditor {
BOOKMARK_GOTO_PREV,
BOOKMARK_REMOVE_ALL,
HELP_DOCS,
EDIT_EMOJI_AND_SYMBOL,
};
MenuButton *edit_menu = nullptr;

View file

@ -432,6 +432,7 @@ public:
virtual String keyboard_get_layout_name(int p_index) const override;
virtual Key keyboard_get_keycode_from_physical(Key p_keycode) const override;
virtual Key keyboard_get_label_from_physical(Key p_keycode) const override;
virtual void show_emoji_and_symbol_picker() const override;
virtual void process_events() override;
virtual void force_process_and_drop_events() override;

View file

@ -789,6 +789,7 @@ bool DisplayServerMacOS::has_feature(Feature p_feature) const {
case FEATURE_NATIVE_HELP:
case FEATURE_WINDOW_DRAG:
case FEATURE_SCREEN_EXCLUDE_FROM_CAPTURE:
case FEATURE_EMOJI_AND_SYMBOL_PICKER:
return true;
default: {
}
@ -3134,6 +3135,10 @@ Key DisplayServerMacOS::keyboard_get_label_from_physical(Key p_keycode) const {
return (Key)(KeyMappingMacOS::remap_key(macos_keycode, 0, true) | modifiers);
}
void DisplayServerMacOS::show_emoji_and_symbol_picker() const {
[[NSApplication sharedApplication] orderFrontCharacterPalette:nil];
}
void DisplayServerMacOS::process_events() {
ERR_FAIL_COND(!Thread::is_main_thread());

View file

@ -140,6 +140,8 @@ bool DisplayServerWindows::has_feature(Feature p_feature) const {
case FEATURE_WINDOW_EMBEDDING:
case FEATURE_SCREEN_EXCLUDE_FROM_CAPTURE:
return true;
case FEATURE_EMOJI_AND_SYMBOL_PICKER:
return (os_ver.dwBuildNumber >= 17134); // Windows 10 Redstone 4 (1803)+ only.
default:
return false;
}
@ -3433,6 +3435,27 @@ Key DisplayServerWindows::keyboard_get_label_from_physical(Key p_keycode) const
return p_keycode;
}
void DisplayServerWindows::show_emoji_and_symbol_picker() const {
// Send Win + Period shortcut, there's no non-WinRT public API.
INPUT input[4] = {};
input[0].type = INPUT_KEYBOARD; // Win down.
input[0].ki.wVk = VK_LWIN;
input[1].type = INPUT_KEYBOARD; // Period down.
input[1].ki.wVk = VK_OEM_PERIOD;
input[2].type = INPUT_KEYBOARD; // Win up.
input[2].ki.wVk = VK_LWIN;
input[2].ki.dwFlags = KEYEVENTF_KEYUP;
input[3].type = INPUT_KEYBOARD; // Period up.
input[3].ki.wVk = VK_OEM_PERIOD;
input[3].ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(4, input, sizeof(INPUT));
}
String DisplayServerWindows::_get_keyboard_layout_display_name(const String &p_klid) const {
String ret;
HKEY key;

View file

@ -842,6 +842,7 @@ public:
virtual String keyboard_get_layout_name(int p_index) const override;
virtual Key keyboard_get_keycode_from_physical(Key p_keycode) const override;
virtual Key keyboard_get_label_from_physical(Key p_keycode) const override;
virtual void show_emoji_and_symbol_picker() const override;
virtual int tablet_get_driver_count() const override;
virtual String tablet_get_driver_name(int p_driver) const override;

View file

@ -2369,7 +2369,10 @@ void LineEdit::menu_option(int p_option) {
if (editable) {
insert_text_at_caret(String::chr(0x00AD));
}
}
} break;
case MENU_EMOJI_AND_SYMBOL: {
show_emoji_and_symbol_picker();
} break;
}
}
@ -2381,6 +2384,22 @@ bool LineEdit::is_context_menu_enabled() {
return context_menu_enabled;
}
void LineEdit::show_emoji_and_symbol_picker() {
_update_ime_window_position();
DisplayServer::get_singleton()->show_emoji_and_symbol_picker();
}
void LineEdit::set_emoji_menu_enabled(bool p_enabled) {
if (emoji_menu_enabled != p_enabled) {
emoji_menu_enabled = p_enabled;
_update_context_menu();
}
}
bool LineEdit::is_emoji_menu_enabled() const {
return emoji_menu_enabled;
}
bool LineEdit::is_menu_visible() const {
return menu && menu->is_visible();
}
@ -2709,6 +2728,11 @@ void LineEdit::_generate_context_menu() {
menu_ctl->add_item(ETR("Word Joiner (WJ)"), MENU_INSERT_WJ);
menu_ctl->add_item(ETR("Soft Hyphen (SHY)"), MENU_INSERT_SHY);
if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_EMOJI_AND_SYMBOL_PICKER)) {
menu->add_item(ETR("Emoji & Symbols"), MENU_EMOJI_AND_SYMBOL);
menu->add_separator();
}
menu->add_item(ETR("Cut"), MENU_CUT);
menu->add_item(ETR("Copy"), MENU_COPY);
menu->add_item(ETR("Paste"), MENU_PASTE);
@ -2764,6 +2788,9 @@ void LineEdit::_update_context_menu() {
m_menu->set_item_checked(idx, m_checked); \
}
if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_EMOJI_AND_SYMBOL_PICKER)) {
MENU_ITEM_DISABLED(menu, MENU_EMOJI_AND_SYMBOL, !editable || !emoji_menu_enabled)
}
MENU_ITEM_ACTION_DISABLED(menu, MENU_CUT, "ui_cut", !editable)
MENU_ITEM_ACTION(menu, MENU_COPY, "ui_copy")
MENU_ITEM_ACTION_DISABLED(menu, MENU_PASTE, "ui_paste", !editable)
@ -2859,6 +2886,8 @@ void LineEdit::_bind_methods() {
ClassDB::bind_method(D_METHOD("is_menu_visible"), &LineEdit::is_menu_visible);
ClassDB::bind_method(D_METHOD("set_context_menu_enabled", "enable"), &LineEdit::set_context_menu_enabled);
ClassDB::bind_method(D_METHOD("is_context_menu_enabled"), &LineEdit::is_context_menu_enabled);
ClassDB::bind_method(D_METHOD("set_emoji_menu_enabled", "enable"), &LineEdit::set_emoji_menu_enabled);
ClassDB::bind_method(D_METHOD("is_emoji_menu_enabled"), &LineEdit::is_emoji_menu_enabled);
ClassDB::bind_method(D_METHOD("set_virtual_keyboard_enabled", "enable"), &LineEdit::set_virtual_keyboard_enabled);
ClassDB::bind_method(D_METHOD("is_virtual_keyboard_enabled"), &LineEdit::is_virtual_keyboard_enabled);
ClassDB::bind_method(D_METHOD("set_virtual_keyboard_type", "type"), &LineEdit::set_virtual_keyboard_type);
@ -2917,6 +2946,7 @@ void LineEdit::_bind_methods() {
BIND_ENUM_CONSTANT(MENU_INSERT_ZWNJ);
BIND_ENUM_CONSTANT(MENU_INSERT_WJ);
BIND_ENUM_CONSTANT(MENU_INSERT_SHY);
BIND_ENUM_CONSTANT(MENU_EMOJI_AND_SYMBOL);
BIND_ENUM_CONSTANT(MENU_MAX);
BIND_ENUM_CONSTANT(KEYBOARD_TYPE_DEFAULT);
@ -2936,6 +2966,7 @@ void LineEdit::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "keep_editing_on_text_submit"), "set_keep_editing_on_text_submit", "is_editing_kept_on_text_submit");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "expand_to_text_length"), "set_expand_to_text_length_enabled", "is_expand_to_text_length_enabled");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "context_menu_enabled"), "set_context_menu_enabled", "is_context_menu_enabled");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "emoji_menu_enabled"), "set_emoji_menu_enabled", "is_emoji_menu_enabled");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "virtual_keyboard_enabled"), "set_virtual_keyboard_enabled", "is_virtual_keyboard_enabled");
ADD_PROPERTY(PropertyInfo(Variant::INT, "virtual_keyboard_type", PROPERTY_HINT_ENUM, "Default,Multiline,Number,Decimal,Phone,Email,Password,URL"), "set_virtual_keyboard_type", "get_virtual_keyboard_type");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "clear_button_enabled"), "set_clear_button_enabled", "is_clear_button_enabled");

View file

@ -69,6 +69,7 @@ public:
MENU_INSERT_ZWNJ,
MENU_INSERT_WJ,
MENU_INSERT_SHY,
MENU_EMOJI_AND_SYMBOL,
MENU_MAX
};
@ -112,6 +113,7 @@ private:
bool drag_and_drop_selection_enabled = true;
bool context_menu_enabled = true;
bool emoji_menu_enabled = true;
PopupMenu *menu = nullptr;
PopupMenu *menu_dir = nullptr;
PopupMenu *menu_ctl = nullptr;
@ -289,6 +291,11 @@ public:
PopupMenu *get_menu() const;
bool is_menu_visible() const;
void show_emoji_and_symbol_picker();
void set_emoji_menu_enabled(bool p_enabled);
bool is_emoji_menu_enabled() const;
void select(int p_from = 0, int p_to = -1);
void select_all();
void selection_delete();

View file

@ -622,6 +622,7 @@ void SpinBox::_bind_methods() {
SpinBox::SpinBox() {
line_edit = memnew(LineEdit);
line_edit->set_emoji_menu_enabled(false);
add_child(line_edit, false, INTERNAL_MODE_FRONT);
line_edit->set_theme_type_variation("SpinBoxInnerLineEdit");

View file

@ -3357,6 +3357,22 @@ bool TextEdit::is_context_menu_enabled() const {
return context_menu_enabled;
}
void TextEdit::show_emoji_and_symbol_picker() {
_update_ime_window_position();
DisplayServer::get_singleton()->show_emoji_and_symbol_picker();
}
void TextEdit::set_emoji_menu_enabled(bool p_enabled) {
if (emoji_menu_enabled != p_enabled) {
emoji_menu_enabled = p_enabled;
_update_context_menu();
}
}
bool TextEdit::is_emoji_menu_enabled() const {
return emoji_menu_enabled;
}
void TextEdit::set_shortcut_keys_enabled(bool p_enabled) {
shortcut_keys_enabled = p_enabled;
}
@ -4031,7 +4047,10 @@ void TextEdit::menu_option(int p_option) {
if (editable) {
insert_text_at_caret(String::chr(0x00AD));
}
}
} break;
case MENU_EMOJI_AND_SYMBOL: {
show_emoji_and_symbol_picker();
} break;
}
}
@ -6583,6 +6602,9 @@ void TextEdit::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_context_menu_enabled", "enabled"), &TextEdit::set_context_menu_enabled);
ClassDB::bind_method(D_METHOD("is_context_menu_enabled"), &TextEdit::is_context_menu_enabled);
ClassDB::bind_method(D_METHOD("set_emoji_menu_enabled", "enable"), &TextEdit::set_emoji_menu_enabled);
ClassDB::bind_method(D_METHOD("is_emoji_menu_enabled"), &TextEdit::is_emoji_menu_enabled);
ClassDB::bind_method(D_METHOD("set_shortcut_keys_enabled", "enabled"), &TextEdit::set_shortcut_keys_enabled);
ClassDB::bind_method(D_METHOD("is_shortcut_keys_enabled"), &TextEdit::is_shortcut_keys_enabled);
@ -6674,6 +6696,7 @@ void TextEdit::_bind_methods() {
BIND_ENUM_CONSTANT(MENU_INSERT_ZWNJ);
BIND_ENUM_CONSTANT(MENU_INSERT_WJ);
BIND_ENUM_CONSTANT(MENU_INSERT_SHY);
BIND_ENUM_CONSTANT(MENU_EMOJI_AND_SYMBOL);
BIND_ENUM_CONSTANT(MENU_MAX);
/* Versioning */
@ -6982,6 +7005,7 @@ void TextEdit::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "editable"), "set_editable", "is_editable");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "context_menu_enabled"), "set_context_menu_enabled", "is_context_menu_enabled");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "emoji_menu_enabled"), "set_emoji_menu_enabled", "is_emoji_menu_enabled");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "shortcut_keys_enabled"), "set_shortcut_keys_enabled", "is_shortcut_keys_enabled");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "selecting_enabled"), "set_selecting_enabled", "is_selecting_enabled");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "deselect_on_focus_loss_enabled"), "set_deselect_on_focus_loss_enabled", "is_deselect_on_focus_loss_enabled");
@ -7433,6 +7457,11 @@ void TextEdit::_generate_context_menu() {
menu_ctl->add_item(ETR("Word Joiner (WJ)"), MENU_INSERT_WJ);
menu_ctl->add_item(ETR("Soft Hyphen (SHY)"), MENU_INSERT_SHY);
if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_EMOJI_AND_SYMBOL_PICKER)) {
menu->add_item(ETR("Emoji & Symbols"), MENU_EMOJI_AND_SYMBOL);
menu->add_separator();
}
menu->add_item(ETR("Cut"), MENU_CUT);
menu->add_item(ETR("Copy"), MENU_COPY);
menu->add_item(ETR("Paste"), MENU_PASTE);
@ -7485,6 +7514,9 @@ void TextEdit::_update_context_menu() {
m_menu->set_item_checked(idx, m_checked); \
}
if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_EMOJI_AND_SYMBOL_PICKER)) {
MENU_ITEM_DISABLED(menu, MENU_EMOJI_AND_SYMBOL, !editable || !emoji_menu_enabled)
}
MENU_ITEM_ACTION_DISABLED(menu, MENU_CUT, "ui_cut", !editable)
MENU_ITEM_ACTION(menu, MENU_COPY, "ui_copy")
MENU_ITEM_ACTION_DISABLED(menu, MENU_PASTE, "ui_paste", !editable)

View file

@ -110,6 +110,7 @@ public:
MENU_INSERT_ZWNJ,
MENU_INSERT_WJ,
MENU_INSERT_SHY,
MENU_EMOJI_AND_SYMBOL,
MENU_MAX
};
@ -316,6 +317,7 @@ private:
// User control.
bool overtype_mode = false;
bool context_menu_enabled = true;
bool emoji_menu_enabled = true;
bool shortcut_keys_enabled = true;
bool virtual_keyboard_enabled = true;
bool middle_mouse_paste_enabled = true;
@ -762,6 +764,11 @@ public:
void set_context_menu_enabled(bool p_enabled);
bool is_context_menu_enabled() const;
void show_emoji_and_symbol_picker();
void set_emoji_menu_enabled(bool p_enabled);
bool is_emoji_menu_enabled() const;
void set_shortcut_keys_enabled(bool p_enabled);
bool is_shortcut_keys_enabled() const;

View file

@ -723,6 +723,9 @@ Key DisplayServer::keyboard_get_label_from_physical(Key p_keycode) const {
ERR_FAIL_V_MSG(p_keycode, "Not supported by this display server.");
}
void DisplayServer::show_emoji_and_symbol_picker() const {
}
void DisplayServer::force_process_and_drop_events() {
}
@ -1029,6 +1032,8 @@ void DisplayServer::_bind_methods() {
ClassDB::bind_method(D_METHOD("keyboard_get_keycode_from_physical", "keycode"), &DisplayServer::keyboard_get_keycode_from_physical);
ClassDB::bind_method(D_METHOD("keyboard_get_label_from_physical", "keycode"), &DisplayServer::keyboard_get_label_from_physical);
ClassDB::bind_method(D_METHOD("show_emoji_and_symbol_picker"), &DisplayServer::show_emoji_and_symbol_picker);
ClassDB::bind_method(D_METHOD("process_events"), &DisplayServer::process_events);
ClassDB::bind_method(D_METHOD("force_process_and_drop_events"), &DisplayServer::force_process_and_drop_events);
@ -1086,6 +1091,7 @@ void DisplayServer::_bind_methods() {
BIND_ENUM_CONSTANT(FEATURE_SCREEN_EXCLUDE_FROM_CAPTURE);
BIND_ENUM_CONSTANT(FEATURE_WINDOW_EMBEDDING);
BIND_ENUM_CONSTANT(FEATURE_NATIVE_DIALOG_FILE_MIME);
BIND_ENUM_CONSTANT(FEATURE_EMOJI_AND_SYMBOL_PICKER);
BIND_ENUM_CONSTANT(MOUSE_MODE_VISIBLE);
BIND_ENUM_CONSTANT(MOUSE_MODE_HIDDEN);

View file

@ -157,6 +157,7 @@ public:
FEATURE_SCREEN_EXCLUDE_FROM_CAPTURE,
FEATURE_WINDOW_EMBEDDING,
FEATURE_NATIVE_DIALOG_FILE_MIME,
FEATURE_EMOJI_AND_SYMBOL_PICKER,
};
virtual bool has_feature(Feature p_feature) const = 0;
@ -593,6 +594,7 @@ public:
virtual String keyboard_get_layout_name(int p_index) const;
virtual Key keyboard_get_keycode_from_physical(Key p_keycode) const;
virtual Key keyboard_get_label_from_physical(Key p_keycode) const;
virtual void show_emoji_and_symbol_picker() const;
virtual int tablet_get_driver_count() const { return 1; }
virtual String tablet_get_driver_name(int p_driver) const { return "default"; }