summaryrefslogtreecommitdiffstats
path: root/platform/linuxbsd
diff options
context:
space:
mode:
Diffstat (limited to 'platform/linuxbsd')
-rw-r--r--platform/linuxbsd/SCsub1
-rw-r--r--platform/linuxbsd/export/export_plugin.cpp4
-rw-r--r--platform/linuxbsd/x11/SCsub1
-rw-r--r--platform/linuxbsd/x11/display_server_x11.cpp74
-rw-r--r--platform/linuxbsd/x11/display_server_x11.h3
-rw-r--r--platform/linuxbsd/x11/key_mapping_x11.cpp14
-rw-r--r--platform/linuxbsd/x11/key_mapping_x11.h13
-rw-r--r--platform/linuxbsd/xkbcommon-so_wrap.c (renamed from platform/linuxbsd/x11/dynwrappers/xkbcommon-so_wrap.c)0
-rw-r--r--platform/linuxbsd/xkbcommon-so_wrap.h (renamed from platform/linuxbsd/x11/dynwrappers/xkbcommon-so_wrap.h)0
9 files changed, 59 insertions, 51 deletions
diff --git a/platform/linuxbsd/SCsub b/platform/linuxbsd/SCsub
index fcd739cdc9..3c5dc78c60 100644
--- a/platform/linuxbsd/SCsub
+++ b/platform/linuxbsd/SCsub
@@ -11,6 +11,7 @@ common_linuxbsd = [
"joypad_linux.cpp",
"freedesktop_portal_desktop.cpp",
"freedesktop_screensaver.cpp",
+ "xkbcommon-so_wrap.c",
]
if env["x11"]:
diff --git a/platform/linuxbsd/export/export_plugin.cpp b/platform/linuxbsd/export/export_plugin.cpp
index c900cad007..2528bb2b99 100644
--- a/platform/linuxbsd/export/export_plugin.cpp
+++ b/platform/linuxbsd/export/export_plugin.cpp
@@ -378,8 +378,8 @@ Error EditorExportPlatformLinuxBSD::run(const Ref<EditorExportPreset> &p_preset,
if (port.is_empty()) {
port = "22";
}
- Vector<String> extra_args_ssh = p_preset->get("ssh_remote_deploy/extra_args_ssh").operator String().split(" ");
- Vector<String> extra_args_scp = p_preset->get("ssh_remote_deploy/extra_args_scp").operator String().split(" ");
+ Vector<String> extra_args_ssh = p_preset->get("ssh_remote_deploy/extra_args_ssh").operator String().split(" ", false);
+ Vector<String> extra_args_scp = p_preset->get("ssh_remote_deploy/extra_args_scp").operator String().split(" ", false);
const String basepath = dest.path_join("tmp_linuxbsd_export");
diff --git a/platform/linuxbsd/x11/SCsub b/platform/linuxbsd/x11/SCsub
index d869ce9ecc..8b2e2aabe4 100644
--- a/platform/linuxbsd/x11/SCsub
+++ b/platform/linuxbsd/x11/SCsub
@@ -9,7 +9,6 @@ source_files = [
"dynwrappers/xcursor-so_wrap.c",
"dynwrappers/xinerama-so_wrap.c",
"dynwrappers/xinput2-so_wrap.c",
- "dynwrappers/xkbcommon-so_wrap.c",
"dynwrappers/xrandr-so_wrap.c",
"dynwrappers/xrender-so_wrap.c",
"dynwrappers/xext-so_wrap.c",
diff --git a/platform/linuxbsd/x11/display_server_x11.cpp b/platform/linuxbsd/x11/display_server_x11.cpp
index 9971fe8c79..428cf3a145 100644
--- a/platform/linuxbsd/x11/display_server_x11.cpp
+++ b/platform/linuxbsd/x11/display_server_x11.cpp
@@ -1610,7 +1610,7 @@ void DisplayServerX11::window_set_transient(WindowID p_window, WindowID p_parent
// a subwindow and its parent are both destroyed.
if (!wd_window.no_focus && !wd_window.is_popup && wd_window.focused) {
if ((xwa.map_state == IsViewable) && !wd_parent.no_focus && !wd_window.is_popup) {
- XSetInputFocus(x11_display, wd_parent.x11_window, RevertToPointerRoot, CurrentTime);
+ XSetInputFocus(x11_display, wd_parent.x11_window, RevertToParent, CurrentTime);
}
}
} else {
@@ -2496,6 +2496,9 @@ void DisplayServerX11::window_set_ime_active(const bool p_active, WindowID p_win
return;
}
if (!wd.focused) {
+ wd.ime_active = false;
+ im_text = String();
+ im_selection = Vector2i();
return;
}
@@ -2524,7 +2527,6 @@ void DisplayServerX11::window_set_ime_active(const bool p_active, WindowID p_win
im_text = String();
im_selection = Vector2i();
}
- OS_Unix::get_singleton()->get_main_loop()->notification(MainLoop::NOTIFICATION_OS_IME_UPDATE);
}
void DisplayServerX11::window_set_ime_position(const Point2i &p_pos, WindowID p_window) {
@@ -2931,6 +2933,7 @@ void DisplayServerX11::_handle_key_event(WindowID p_window, XKeyEvent *p_event,
xkeyevent_no_mod.state &= ~ShiftMask;
xkeyevent_no_mod.state &= ~ControlMask;
XLookupString(xkeyevent, str, 255, &keysym_unicode, nullptr);
+ XLookupString(&xkeyevent_no_mod, nullptr, 0, &keysym_keycode, nullptr);
String keysym;
if (xkb_keysym_to_utf32 && xkb_keysym_to_upper) {
@@ -3316,42 +3319,43 @@ void DisplayServerX11::_xim_preedit_draw_callback(::XIM xim, ::XPointer client_d
WindowData &wd = ds->windows[window_id];
XIMText *xim_text = call_data->text;
- if (xim_text != nullptr) {
- String changed_text;
- if (xim_text->encoding_is_wchar) {
- changed_text = String(xim_text->string.wide_char);
- } else {
- changed_text.parse_utf8(xim_text->string.multi_byte);
- }
+ if (wd.ime_active) {
+ if (xim_text != nullptr) {
+ String changed_text;
+ if (xim_text->encoding_is_wchar) {
+ changed_text = String(xim_text->string.wide_char);
+ } else {
+ changed_text.parse_utf8(xim_text->string.multi_byte);
+ }
- if (call_data->chg_length < 0) {
- ds->im_text = ds->im_text.substr(0, call_data->chg_first) + changed_text;
- } else {
- ds->im_text = ds->im_text.substr(0, call_data->chg_first) + changed_text + ds->im_text.substr(call_data->chg_length);
- }
+ if (call_data->chg_length < 0) {
+ ds->im_text = ds->im_text.substr(0, call_data->chg_first) + changed_text;
+ } else {
+ ds->im_text = ds->im_text.substr(0, call_data->chg_first) + changed_text + ds->im_text.substr(call_data->chg_length);
+ }
- // Find the start and end of the selection.
- int start = 0, count = 0;
- for (int i = 0; i < xim_text->length; i++) {
- if (xim_text->feedback[i] & XIMReverse) {
- if (count == 0) {
- start = i;
- count = 1;
- } else {
- count++;
+ // Find the start and end of the selection.
+ int start = 0, count = 0;
+ for (int i = 0; i < xim_text->length; i++) {
+ if (xim_text->feedback[i] & XIMReverse) {
+ if (count == 0) {
+ start = i;
+ count = 1;
+ } else {
+ count++;
+ }
}
}
- }
- if (count > 0) {
- ds->im_selection = Point2i(start + call_data->chg_first, count);
+ if (count > 0) {
+ ds->im_selection = Point2i(start + call_data->chg_first, count);
+ } else {
+ ds->im_selection = Point2i(call_data->caret, 0);
+ }
} else {
- ds->im_selection = Point2i(call_data->caret, 0);
+ ds->im_text = String();
+ ds->im_selection = Point2i();
}
- } else {
- ds->im_text = String();
- ds->im_selection = Point2i();
- }
- if (wd.ime_active) {
+
OS_Unix::get_singleton()->get_main_loop()->notification(MainLoop::NOTIFICATION_OS_IME_UPDATE);
}
}
@@ -4856,7 +4860,11 @@ DisplayServerX11::WindowID DisplayServerX11::_create_window(WindowMode p_mode, V
{
wd.x11_window = XCreateWindow(x11_display, RootWindow(x11_display, visualInfo.screen), win_rect.position.x, win_rect.position.y, win_rect.size.width > 0 ? win_rect.size.width : 1, win_rect.size.height > 0 ? win_rect.size.height : 1, 0, visualInfo.depth, InputOutput, visualInfo.visual, valuemask, &windowAttributes);
- wd.x11_xim_window = XCreateWindow(x11_display, wd.x11_window, 0, 0, 1, 1, 0, visualInfo.depth, InputOutput, visualInfo.visual, valuemask, &windowAttributes);
+
+ XSetWindowAttributes window_attributes_ime = {};
+ window_attributes_ime.event_mask = KeyPressMask | KeyReleaseMask | StructureNotifyMask | ExposureMask;
+
+ wd.x11_xim_window = XCreateWindow(x11_display, wd.x11_window, 0, 0, 1, 1, 0, CopyFromParent, InputOnly, CopyFromParent, CWEventMask, &window_attributes_ime);
// Enable receiving notification when the window is initialized (MapNotify)
// so the focus can be set at the right time.
diff --git a/platform/linuxbsd/x11/display_server_x11.h b/platform/linuxbsd/x11/display_server_x11.h
index 290e3d6a5e..bfb97ae44c 100644
--- a/platform/linuxbsd/x11/display_server_x11.h
+++ b/platform/linuxbsd/x11/display_server_x11.h
@@ -75,10 +75,11 @@
#include "dynwrappers/xext-so_wrap.h"
#include "dynwrappers/xinerama-so_wrap.h"
#include "dynwrappers/xinput2-so_wrap.h"
-#include "dynwrappers/xkbcommon-so_wrap.h"
#include "dynwrappers/xrandr-so_wrap.h"
#include "dynwrappers/xrender-so_wrap.h"
+#include "../xkbcommon-so_wrap.h"
+
typedef struct _xrr_monitor_info {
Atom name;
Bool primary = false;
diff --git a/platform/linuxbsd/x11/key_mapping_x11.cpp b/platform/linuxbsd/x11/key_mapping_x11.cpp
index 506372292d..e5eba6ccad 100644
--- a/platform/linuxbsd/x11/key_mapping_x11.cpp
+++ b/platform/linuxbsd/x11/key_mapping_x11.cpp
@@ -30,20 +30,6 @@
#include "key_mapping_x11.h"
-#include "core/templates/hash_map.h"
-
-struct HashMapHasherKeys {
- static _FORCE_INLINE_ uint32_t hash(const Key p_key) { return hash_fmix32(static_cast<uint32_t>(p_key)); }
- static _FORCE_INLINE_ uint32_t hash(const char32_t p_uchar) { return hash_fmix32(p_uchar); }
- static _FORCE_INLINE_ uint32_t hash(const unsigned p_key) { return hash_fmix32(p_key); }
- static _FORCE_INLINE_ uint32_t hash(const KeySym p_key) { return hash_fmix32(p_key); }
-};
-
-HashMap<KeySym, Key, HashMapHasherKeys> xkeysym_map;
-HashMap<unsigned int, Key, HashMapHasherKeys> scancode_map;
-HashMap<Key, unsigned int, HashMapHasherKeys> scancode_map_inv;
-HashMap<KeySym, char32_t, HashMapHasherKeys> xkeysym_unicode_map;
-
void KeyMappingX11::initialize() {
// X11 Keysym to Godot Key map.
diff --git a/platform/linuxbsd/x11/key_mapping_x11.h b/platform/linuxbsd/x11/key_mapping_x11.h
index d4278a563c..48beefff4c 100644
--- a/platform/linuxbsd/x11/key_mapping_x11.h
+++ b/platform/linuxbsd/x11/key_mapping_x11.h
@@ -39,8 +39,21 @@
#include <X11/keysymdef.h>
#include "core/os/keyboard.h"
+#include "core/templates/hash_map.h"
class KeyMappingX11 {
+ struct HashMapHasherKeys {
+ static _FORCE_INLINE_ uint32_t hash(const Key p_key) { return hash_fmix32(static_cast<uint32_t>(p_key)); }
+ static _FORCE_INLINE_ uint32_t hash(const char32_t p_uchar) { return hash_fmix32(p_uchar); }
+ static _FORCE_INLINE_ uint32_t hash(const unsigned p_key) { return hash_fmix32(p_key); }
+ static _FORCE_INLINE_ uint32_t hash(const KeySym p_key) { return hash_fmix32(p_key); }
+ };
+
+ static inline HashMap<KeySym, Key, HashMapHasherKeys> xkeysym_map;
+ static inline HashMap<unsigned int, Key, HashMapHasherKeys> scancode_map;
+ static inline HashMap<Key, unsigned int, HashMapHasherKeys> scancode_map_inv;
+ static inline HashMap<KeySym, char32_t, HashMapHasherKeys> xkeysym_unicode_map;
+
KeyMappingX11() {}
public:
diff --git a/platform/linuxbsd/x11/dynwrappers/xkbcommon-so_wrap.c b/platform/linuxbsd/xkbcommon-so_wrap.c
index 601d4c5052..601d4c5052 100644
--- a/platform/linuxbsd/x11/dynwrappers/xkbcommon-so_wrap.c
+++ b/platform/linuxbsd/xkbcommon-so_wrap.c
diff --git a/platform/linuxbsd/x11/dynwrappers/xkbcommon-so_wrap.h b/platform/linuxbsd/xkbcommon-so_wrap.h
index f7e6f4c4cf..f7e6f4c4cf 100644
--- a/platform/linuxbsd/x11/dynwrappers/xkbcommon-so_wrap.h
+++ b/platform/linuxbsd/xkbcommon-so_wrap.h