2
0
Эх сурвалжийг харах

[X11] Add support for dead keys without active IME. Fix IME focus and cleanup.

bruvzg 2 жил өмнө
parent
commit
4c50ac3921
30 өөрчлөгдсөн 384 нэмэгдсэн , 64 устгасан
  1. 2 2
      drivers/alsa/asound-so_wrap.c
  2. 2 2
      drivers/alsa/asound-so_wrap.h
  3. 2 2
      drivers/pulseaudio/pulse-so_wrap.c
  4. 2 2
      drivers/pulseaudio/pulse-so_wrap.h
  5. 2 2
      platform/linuxbsd/dbus-so_wrap.c
  6. 2 2
      platform/linuxbsd/dbus-so_wrap.h
  7. 2 2
      platform/linuxbsd/fontconfig-so_wrap.c
  8. 2 2
      platform/linuxbsd/fontconfig-so_wrap.h
  9. 2 2
      platform/linuxbsd/libudev-so_wrap.c
  10. 2 2
      platform/linuxbsd/libudev-so_wrap.h
  11. 2 2
      platform/linuxbsd/speechd-so_wrap.c
  12. 2 2
      platform/linuxbsd/speechd-so_wrap.h
  13. 109 8
      platform/linuxbsd/x11/display_server_x11.cpp
  14. 5 0
      platform/linuxbsd/x11/display_server_x11.h
  15. 2 2
      platform/linuxbsd/x11/dynwrappers/xcursor-so_wrap.c
  16. 2 2
      platform/linuxbsd/x11/dynwrappers/xcursor-so_wrap.h
  17. 2 2
      platform/linuxbsd/x11/dynwrappers/xext-so_wrap.c
  18. 2 2
      platform/linuxbsd/x11/dynwrappers/xext-so_wrap.h
  19. 2 2
      platform/linuxbsd/x11/dynwrappers/xinerama-so_wrap.c
  20. 2 2
      platform/linuxbsd/x11/dynwrappers/xinerama-so_wrap.h
  21. 2 2
      platform/linuxbsd/x11/dynwrappers/xinput2-so_wrap.c
  22. 2 2
      platform/linuxbsd/x11/dynwrappers/xinput2-so_wrap.h
  23. 2 2
      platform/linuxbsd/x11/dynwrappers/xlib-so_wrap.c
  24. 2 2
      platform/linuxbsd/x11/dynwrappers/xlib-so_wrap.h
  25. 2 2
      platform/linuxbsd/x11/dynwrappers/xrandr-so_wrap.c
  26. 2 2
      platform/linuxbsd/x11/dynwrappers/xrandr-so_wrap.h
  27. 2 2
      platform/linuxbsd/x11/dynwrappers/xrender-so_wrap.c
  28. 2 2
      platform/linuxbsd/x11/dynwrappers/xrender-so_wrap.h
  29. 158 2
      platform/linuxbsd/xkbcommon-so_wrap.c
  30. 60 2
      platform/linuxbsd/xkbcommon-so_wrap.h

+ 2 - 2
drivers/alsa/asound-so_wrap.c

@@ -1,7 +1,7 @@
 // This file is generated. Do not edit!
 // see https://github.com/hpvb/dynload-wrapper for details
-// generated by ../dynload-wrapper/generate-wrapper.py 0.3 on 2023-01-12 10:26:13
-// flags: ../dynload-wrapper/generate-wrapper.py --include ./thirdparty/linuxbsd_headers/alsa/asoundlib.h --sys-include "thirdparty/linuxbsd_headers/alsa/asoundlib.h" --soname libasound.so.2 --init-name asound --omit-prefix snd_pcm_sw_params_set_tstamp_type --omit-prefix snd_pcm_status_get_audio_htstamp_report --omit-prefix snd_pcm_sw_params_get_tstamp_type --omit-prefix snd_pcm_status_set_audio_htstamp_config --output-header ./drivers/alsa/asound-so_wrap.h --output-implementation ./drivers/alsa/asound-so_wrap.c
+// generated by generate-wrapper.py 0.3 on 2023-01-12 10:26:13
+// flags: generate-wrapper.py --include ./thirdparty/linuxbsd_headers/alsa/asoundlib.h --sys-include "thirdparty/linuxbsd_headers/alsa/asoundlib.h" --soname libasound.so.2 --init-name asound --omit-prefix snd_pcm_sw_params_set_tstamp_type --omit-prefix snd_pcm_status_get_audio_htstamp_report --omit-prefix snd_pcm_sw_params_get_tstamp_type --omit-prefix snd_pcm_status_set_audio_htstamp_config --output-header ./drivers/alsa/asound-so_wrap.h --output-implementation ./drivers/alsa/asound-so_wrap.c
 //
 #include <stdint.h>
 

+ 2 - 2
drivers/alsa/asound-so_wrap.h

@@ -2,8 +2,8 @@
 #define DYLIBLOAD_WRAPPER_ASOUND
 // This file is generated. Do not edit!
 // see https://github.com/hpvb/dynload-wrapper for details
-// generated by ../dynload-wrapper/generate-wrapper.py 0.3 on 2023-01-12 10:26:13
-// flags: ../dynload-wrapper/generate-wrapper.py --include ./thirdparty/linuxbsd_headers/alsa/asoundlib.h --sys-include "thirdparty/linuxbsd_headers/alsa/asoundlib.h" --soname libasound.so.2 --init-name asound --omit-prefix snd_pcm_sw_params_set_tstamp_type --omit-prefix snd_pcm_status_get_audio_htstamp_report --omit-prefix snd_pcm_sw_params_get_tstamp_type --omit-prefix snd_pcm_status_set_audio_htstamp_config --output-header ./drivers/alsa/asound-so_wrap.h --output-implementation ./drivers/alsa/asound-so_wrap.c
+// generated by generate-wrapper.py 0.3 on 2023-01-12 10:26:13
+// flags: generate-wrapper.py --include ./thirdparty/linuxbsd_headers/alsa/asoundlib.h --sys-include "thirdparty/linuxbsd_headers/alsa/asoundlib.h" --soname libasound.so.2 --init-name asound --omit-prefix snd_pcm_sw_params_set_tstamp_type --omit-prefix snd_pcm_status_get_audio_htstamp_report --omit-prefix snd_pcm_sw_params_get_tstamp_type --omit-prefix snd_pcm_status_set_audio_htstamp_config --output-header ./drivers/alsa/asound-so_wrap.h --output-implementation ./drivers/alsa/asound-so_wrap.c
 //
 #include <stdint.h>
 

+ 2 - 2
drivers/pulseaudio/pulse-so_wrap.c

@@ -1,7 +1,7 @@
 // This file is generated. Do not edit!
 // see https://github.com/hpvb/dynload-wrapper for details
-// generated by ../dynload-wrapper/generate-wrapper.py 0.3 on 2023-01-12 10:26:29
-// flags: ../dynload-wrapper/generate-wrapper.py --include ./thirdparty/linuxbsd_headers/pulse/pulseaudio.h --sys-include "thirdparty/linuxbsd_headers/pulse/pulseaudio.h" --soname libpulse.so.0 --omit-prefix _pa_ --init-name pulse --output-header ./drivers/pulseaudio/pulse-so_wrap.h --output-implementation ./drivers/pulseaudio/pulse-so_wrap.c
+// generated by generate-wrapper.py 0.3 on 2023-01-12 10:26:29
+// flags: generate-wrapper.py --include ./thirdparty/linuxbsd_headers/pulse/pulseaudio.h --sys-include "thirdparty/linuxbsd_headers/pulse/pulseaudio.h" --soname libpulse.so.0 --omit-prefix _pa_ --init-name pulse --output-header ./drivers/pulseaudio/pulse-so_wrap.h --output-implementation ./drivers/pulseaudio/pulse-so_wrap.c
 //
 #include <stdint.h>
 

+ 2 - 2
drivers/pulseaudio/pulse-so_wrap.h

@@ -2,8 +2,8 @@
 #define DYLIBLOAD_WRAPPER_PULSE
 // This file is generated. Do not edit!
 // see https://github.com/hpvb/dynload-wrapper for details
-// generated by ../dynload-wrapper/generate-wrapper.py 0.3 on 2023-01-12 10:26:29
-// flags: ../dynload-wrapper/generate-wrapper.py --include ./thirdparty/linuxbsd_headers/pulse/pulseaudio.h --sys-include "thirdparty/linuxbsd_headers/pulse/pulseaudio.h" --soname libpulse.so.0 --omit-prefix _pa_ --init-name pulse --output-header ./drivers/pulseaudio/pulse-so_wrap.h --output-implementation ./drivers/pulseaudio/pulse-so_wrap.c
+// generated by generate-wrapper.py 0.3 on 2023-01-12 10:26:29
+// flags: generate-wrapper.py --include ./thirdparty/linuxbsd_headers/pulse/pulseaudio.h --sys-include "thirdparty/linuxbsd_headers/pulse/pulseaudio.h" --soname libpulse.so.0 --omit-prefix _pa_ --init-name pulse --output-header ./drivers/pulseaudio/pulse-so_wrap.h --output-implementation ./drivers/pulseaudio/pulse-so_wrap.c
 //
 #include <stdint.h>
 

+ 2 - 2
platform/linuxbsd/dbus-so_wrap.c

@@ -1,7 +1,7 @@
 // This file is generated. Do not edit!
 // see https://github.com/hpvb/dynload-wrapper for details
-// generated by ../dynload-wrapper/generate-wrapper.py 0.3 on 2023-01-12 10:26:35
-// flags: ../dynload-wrapper/generate-wrapper.py --include ./thirdparty/linuxbsd_headers/dbus/dbus.h --sys-include "thirdparty/linuxbsd_headers/dbus/dbus.h" --soname libdbus-1.so.3 --init-name dbus --output-header ./platform/linuxbsd/dbus-so_wrap.h --output-implementation ./platform/linuxbsd/dbus-so_wrap.c
+// generated by generate-wrapper.py 0.3 on 2023-01-12 10:26:35
+// flags: generate-wrapper.py --include ./thirdparty/linuxbsd_headers/dbus/dbus.h --sys-include "thirdparty/linuxbsd_headers/dbus/dbus.h" --soname libdbus-1.so.3 --init-name dbus --output-header ./platform/linuxbsd/dbus-so_wrap.h --output-implementation ./platform/linuxbsd/dbus-so_wrap.c
 //
 #include <stdint.h>
 

+ 2 - 2
platform/linuxbsd/dbus-so_wrap.h

@@ -2,8 +2,8 @@
 #define DYLIBLOAD_WRAPPER_DBUS
 // This file is generated. Do not edit!
 // see https://github.com/hpvb/dynload-wrapper for details
-// generated by ../dynload-wrapper/generate-wrapper.py 0.3 on 2023-01-12 10:26:35
-// flags: ../dynload-wrapper/generate-wrapper.py --include ./thirdparty/linuxbsd_headers/dbus/dbus.h --sys-include "thirdparty/linuxbsd_headers/dbus/dbus.h" --soname libdbus-1.so.3 --init-name dbus --output-header ./platform/linuxbsd/dbus-so_wrap.h --output-implementation ./platform/linuxbsd/dbus-so_wrap.c
+// generated by generate-wrapper.py 0.3 on 2023-01-12 10:26:35
+// flags: generate-wrapper.py --include ./thirdparty/linuxbsd_headers/dbus/dbus.h --sys-include "thirdparty/linuxbsd_headers/dbus/dbus.h" --soname libdbus-1.so.3 --init-name dbus --output-header ./platform/linuxbsd/dbus-so_wrap.h --output-implementation ./platform/linuxbsd/dbus-so_wrap.c
 //
 #include <stdint.h>
 

+ 2 - 2
platform/linuxbsd/fontconfig-so_wrap.c

@@ -1,7 +1,7 @@
 // This file is generated. Do not edit!
 // see https://github.com/hpvb/dynload-wrapper for details
-// generated by ../dynload-wrapper/generate-wrapper.py 0.3 on 2023-01-12 10:15:54
-// flags: ../dynload-wrapper/generate-wrapper.py --include ./thirdparty/linuxbsd_headers/fontconfig/fontconfig.h --sys-include "thirdparty/linuxbsd_headers/fontconfig/fontconfig.h" --soname libfontconfig.so.1 --init-name fontconfig --omit-prefix FcCharSetFirst --omit-prefix FcCharSetNext --output-header ./platform/linuxbsd/fontconfig-so_wrap.h --output-implementation ./platform/linuxbsd/fontconfig-so_wrap.c
+// generated by generate-wrapper.py 0.3 on 2023-01-12 10:15:54
+// flags: generate-wrapper.py --include ./thirdparty/linuxbsd_headers/fontconfig/fontconfig.h --sys-include "thirdparty/linuxbsd_headers/fontconfig/fontconfig.h" --soname libfontconfig.so.1 --init-name fontconfig --omit-prefix FcCharSetFirst --omit-prefix FcCharSetNext --output-header ./platform/linuxbsd/fontconfig-so_wrap.h --output-implementation ./platform/linuxbsd/fontconfig-so_wrap.c
 //
 #include <stdint.h>
 

+ 2 - 2
platform/linuxbsd/fontconfig-so_wrap.h

@@ -2,8 +2,8 @@
 #define DYLIBLOAD_WRAPPER_FONTCONFIG
 // This file is generated. Do not edit!
 // see https://github.com/hpvb/dynload-wrapper for details
-// generated by ../dynload-wrapper/generate-wrapper.py 0.3 on 2023-01-12 10:15:54
-// flags: ../dynload-wrapper/generate-wrapper.py --include ./thirdparty/linuxbsd_headers/fontconfig/fontconfig.h --sys-include "thirdparty/linuxbsd_headers/fontconfig/fontconfig.h" --soname libfontconfig.so.1 --init-name fontconfig --omit-prefix FcCharSetFirst --omit-prefix FcCharSetNext --output-header ./platform/linuxbsd/fontconfig-so_wrap.h --output-implementation ./platform/linuxbsd/fontconfig-so_wrap.c
+// generated by generate-wrapper.py 0.3 on 2023-01-12 10:15:54
+// flags: generate-wrapper.py --include ./thirdparty/linuxbsd_headers/fontconfig/fontconfig.h --sys-include "thirdparty/linuxbsd_headers/fontconfig/fontconfig.h" --soname libfontconfig.so.1 --init-name fontconfig --omit-prefix FcCharSetFirst --omit-prefix FcCharSetNext --output-header ./platform/linuxbsd/fontconfig-so_wrap.h --output-implementation ./platform/linuxbsd/fontconfig-so_wrap.c
 //
 #include <stdint.h>
 

+ 2 - 2
platform/linuxbsd/libudev-so_wrap.c

@@ -1,7 +1,7 @@
 // This file is generated. Do not edit!
 // see https://github.com/hpvb/dynload-wrapper for details
-// generated by ../dynload-wrapper/generate-wrapper.py 0.3 on 2023-01-12 10:23:01
-// flags: ../dynload-wrapper/generate-wrapper.py --include ./thirdparty/linuxbsd_headers/udev/libudev.h --sys-include "thirdparty/linuxbsd_headers/udev/libudev.h" --soname libudev.so.1 --init-name libudev --omit-prefix gnu_ --output-header ./platform/linuxbsd/libudev-so_wrap.h --output-implementation ./platform/linuxbsd/libudev-so_wrap.c
+// generated by generate-wrapper.py 0.3 on 2023-01-12 10:23:01
+// flags: generate-wrapper.py --include ./thirdparty/linuxbsd_headers/udev/libudev.h --sys-include "thirdparty/linuxbsd_headers/udev/libudev.h" --soname libudev.so.1 --init-name libudev --omit-prefix gnu_ --output-header ./platform/linuxbsd/libudev-so_wrap.h --output-implementation ./platform/linuxbsd/libudev-so_wrap.c
 //
 #include <stdint.h>
 

+ 2 - 2
platform/linuxbsd/libudev-so_wrap.h

@@ -2,8 +2,8 @@
 #define DYLIBLOAD_WRAPPER_LIBUDEV
 // This file is generated. Do not edit!
 // see https://github.com/hpvb/dynload-wrapper for details
-// generated by ../dynload-wrapper/generate-wrapper.py 0.3 on 2023-01-12 10:23:01
-// flags: ../dynload-wrapper/generate-wrapper.py --include ./thirdparty/linuxbsd_headers/udev/libudev.h --sys-include "thirdparty/linuxbsd_headers/udev/libudev.h" --soname libudev.so.1 --init-name libudev --omit-prefix gnu_ --output-header ./platform/linuxbsd/libudev-so_wrap.h --output-implementation ./platform/linuxbsd/libudev-so_wrap.c
+// generated by generate-wrapper.py 0.3 on 2023-01-12 10:23:01
+// flags: generate-wrapper.py --include ./thirdparty/linuxbsd_headers/udev/libudev.h --sys-include "thirdparty/linuxbsd_headers/udev/libudev.h" --soname libudev.so.1 --init-name libudev --omit-prefix gnu_ --output-header ./platform/linuxbsd/libudev-so_wrap.h --output-implementation ./platform/linuxbsd/libudev-so_wrap.c
 //
 #include <stdint.h>
 

+ 2 - 2
platform/linuxbsd/speechd-so_wrap.c

@@ -1,7 +1,7 @@
 // This file is generated. Do not edit!
 // see https://github.com/hpvb/dynload-wrapper for details
-// generated by ../dynload-wrapper/generate-wrapper.py 0.3 on 2023-01-12 10:07:46
-// flags: ../dynload-wrapper/generate-wrapper.py --include ./thirdparty/linuxbsd_headers/speechd/libspeechd.h --sys-include "thirdparty/linuxbsd_headers/speechd/libspeechd.h" --soname libspeechd.so.2 --init-name speechd --omit-prefix spd_get_client_list --output-header ./platform/linuxbsd/speechd-so_wrap.h --output-implementation ./platform/linuxbsd/speechd-so_wrap.c
+// generated by generate-wrapper.py 0.3 on 2023-01-12 10:07:46
+// flags: generate-wrapper.py --include ./thirdparty/linuxbsd_headers/speechd/libspeechd.h --sys-include "thirdparty/linuxbsd_headers/speechd/libspeechd.h" --soname libspeechd.so.2 --init-name speechd --omit-prefix spd_get_client_list --output-header ./platform/linuxbsd/speechd-so_wrap.h --output-implementation ./platform/linuxbsd/speechd-so_wrap.c
 //
 #include <stdint.h>
 

+ 2 - 2
platform/linuxbsd/speechd-so_wrap.h

@@ -2,8 +2,8 @@
 #define DYLIBLOAD_WRAPPER_SPEECHD
 // This file is generated. Do not edit!
 // see https://github.com/hpvb/dynload-wrapper for details
-// generated by ../dynload-wrapper/generate-wrapper.py 0.3 on 2023-01-12 10:07:46
-// flags: ../dynload-wrapper/generate-wrapper.py --include ./thirdparty/linuxbsd_headers/speechd/libspeechd.h --sys-include "thirdparty/linuxbsd_headers/speechd/libspeechd.h" --soname libspeechd.so.2 --init-name speechd --omit-prefix spd_get_client_list --output-header ./platform/linuxbsd/speechd-so_wrap.h --output-implementation ./platform/linuxbsd/speechd-so_wrap.c
+// generated by generate-wrapper.py 0.3 on 2023-01-12 10:07:46
+// flags: generate-wrapper.py --include ./thirdparty/linuxbsd_headers/speechd/libspeechd.h --sys-include "thirdparty/linuxbsd_headers/speechd/libspeechd.h" --soname libspeechd.so.2 --init-name speechd --omit-prefix spd_get_client_list --output-header ./platform/linuxbsd/speechd-so_wrap.h --output-implementation ./platform/linuxbsd/speechd-so_wrap.c
 //
 #include <stdint.h>
 

+ 109 - 8
platform/linuxbsd/x11/display_server_x11.cpp

@@ -1324,14 +1324,20 @@ void DisplayServerX11::delete_sub_window(WindowID p_id) {
 	}
 #endif
 
-	XDestroyWindow(x11_display, wd.x11_xim_window);
-
-	XUnmapWindow(x11_display, wd.x11_window);
-	XDestroyWindow(x11_display, wd.x11_window);
 	if (wd.xic) {
 		XDestroyIC(wd.xic);
 		wd.xic = nullptr;
 	}
+	XDestroyWindow(x11_display, wd.x11_xim_window);
+	if (xkb_loaded) {
+		if (wd.xkb_state) {
+			xkb_compose_state_unref(wd.xkb_state);
+			wd.xkb_state = nullptr;
+		}
+	}
+
+	XUnmapWindow(x11_display, wd.x11_window);
+	XDestroyWindow(x11_display, wd.x11_window);
 
 	windows.erase(p_id);
 }
@@ -1610,7 +1616,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, RevertToParent, CurrentTime);
+				XSetInputFocus(x11_display, wd_parent.x11_window, RevertToPointerRoot, CurrentTime);
 			}
 		}
 	} else {
@@ -2515,7 +2521,7 @@ void DisplayServerX11::window_set_ime_active(const bool p_active, WindowID p_win
 		XSync(x11_display, False);
 		XGetWindowAttributes(x11_display, wd.x11_xim_window, &xwa);
 		if (xwa.map_state == IsViewable) {
-			XSetInputFocus(x11_display, wd.x11_xim_window, RevertToPointerRoot, CurrentTime);
+			XSetInputFocus(x11_display, wd.x11_xim_window, RevertToParent, CurrentTime);
 		}
 		XSetICFocus(wd.xic);
 	} else {
@@ -2936,7 +2942,7 @@ void DisplayServerX11::_handle_key_event(WindowID p_window, XKeyEvent *p_event,
 	XLookupString(&xkeyevent_no_mod, nullptr, 0, &keysym_keycode, nullptr);
 
 	String keysym;
-	if (xkb_keysym_to_utf32 && xkb_keysym_to_upper) {
+	if (xkb_loaded) {
 		KeySym keysym_unicode_nm = 0; // keysym used to find unicode
 		XLookupString(&xkeyevent_no_mod, nullptr, 0, &keysym_unicode_nm, nullptr);
 		keysym = String::chr(xkb_keysym_to_utf32(xkb_keysym_to_upper(keysym_unicode_nm)));
@@ -3029,6 +3035,64 @@ void DisplayServerX11::_handle_key_event(WindowID p_window, XKeyEvent *p_event,
 			}
 		} while (status == XBufferOverflow);
 #endif
+	} else if (xkeyevent->type == KeyPress && wd.xkb_state && xkb_loaded) {
+		xkb_compose_feed_result res = xkb_compose_state_feed(wd.xkb_state, keysym_unicode);
+		if (res == XKB_COMPOSE_FEED_ACCEPTED) {
+			if (xkb_compose_state_get_status(wd.xkb_state) == XKB_COMPOSE_COMPOSED) {
+				bool keypress = xkeyevent->type == KeyPress;
+				Key keycode = KeyMappingX11::get_keycode(keysym_keycode);
+				Key physical_keycode = KeyMappingX11::get_scancode(xkeyevent->keycode);
+
+				if (keycode >= Key::A + 32 && keycode <= Key::Z + 32) {
+					keycode -= 'a' - 'A';
+				}
+
+				char str_xkb[256] = {};
+				int str_xkb_size = xkb_compose_state_get_utf8(wd.xkb_state, str_xkb, 255);
+
+				String tmp;
+				tmp.parse_utf8(str_xkb, str_xkb_size);
+				for (int i = 0; i < tmp.length(); i++) {
+					Ref<InputEventKey> k;
+					k.instantiate();
+					if (physical_keycode == Key::NONE && keycode == Key::NONE && tmp[i] == 0) {
+						continue;
+					}
+
+					if (keycode == Key::NONE) {
+						keycode = (Key)physical_keycode;
+					}
+
+					_get_key_modifier_state(xkeyevent->state, k);
+
+					k->set_window_id(p_window);
+					k->set_pressed(keypress);
+
+					k->set_keycode(keycode);
+					k->set_physical_keycode(physical_keycode);
+					if (!keysym.is_empty()) {
+						k->set_key_label(fix_key_label(keysym[0], keycode));
+					} else {
+						k->set_key_label(keycode);
+					}
+					if (keypress) {
+						k->set_unicode(fix_unicode(tmp[i]));
+					}
+
+					k->set_echo(false);
+
+					if (k->get_keycode() == Key::BACKTAB) {
+						//make it consistent across platforms.
+						k->set_keycode(Key::TAB);
+						k->set_physical_keycode(Key::TAB);
+						k->set_shift_pressed(true);
+					}
+
+					Input::get_singleton()->parse_input_event(k);
+				}
+				return;
+			}
+		}
 	}
 
 	/* Phase 2, obtain a Godot keycode from the keysym */
@@ -4866,6 +4930,10 @@ DisplayServerX11::WindowID DisplayServerX11::_create_window(WindowMode p_mode, V
 
 		wd.x11_xim_window = XCreateWindow(x11_display, wd.x11_window, 0, 0, 1, 1, 0, CopyFromParent, InputOnly, CopyFromParent, CWEventMask, &window_attributes_ime);
 
+		if (dead_tbl && xkb_loaded) {
+			wd.xkb_state = xkb_compose_state_new(dead_tbl, XKB_COMPOSE_STATE_NO_FLAGS);
+		}
+
 		// Enable receiving notification when the window is initialized (MapNotify)
 		// so the focus can be set at the right time.
 		if (!wd.no_focus && !wd.is_popup) {
@@ -5145,7 +5213,7 @@ DisplayServerX11::DisplayServerX11(const String &p_rendering_driver, WindowMode
 		ERR_FAIL_MSG("Can't load XCursor dynamically.");
 	}
 
-	initialize_xkbcommon(dylibloader_verbose); // Optional, used for key_label.
+	xkb_loaded = (initialize_xkbcommon(dylibloader_verbose) == 0);
 
 	if (initialize_xext(dylibloader_verbose) != 0) {
 		r_error = ERR_UNAVAILABLE;
@@ -5172,6 +5240,23 @@ DisplayServerX11::DisplayServerX11(const String &p_rendering_driver, WindowMode
 		ERR_FAIL_MSG("Can't load Xinput2 dynamically.");
 	}
 
+	if (xkb_loaded) {
+		xkb_ctx = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
+		if (xkb_ctx) {
+			const char *locale = getenv("LC_ALL");
+			if (!locale || !*locale) {
+				locale = getenv("LC_CTYPE");
+			}
+			if (!locale || !*locale) {
+				locale = getenv("LANG");
+			}
+			if (!locale || !*locale) {
+				locale = "C";
+			}
+			dead_tbl = xkb_compose_table_new_from_locale(xkb_ctx, locale, XKB_COMPOSE_COMPILE_NO_FLAGS);
+		}
+	}
+
 	Input::get_singleton()->set_event_dispatch_function(_dispatch_input_events);
 
 	r_error = OK;
@@ -5612,10 +5697,26 @@ DisplayServerX11::~DisplayServerX11() {
 			XDestroyIC(wd.xic);
 			wd.xic = nullptr;
 		}
+		XDestroyWindow(x11_display, wd.x11_xim_window);
+		if (xkb_loaded) {
+			if (wd.xkb_state) {
+				xkb_compose_state_unref(wd.xkb_state);
+				wd.xkb_state = nullptr;
+			}
+		}
 		XUnmapWindow(x11_display, wd.x11_window);
 		XDestroyWindow(x11_display, wd.x11_window);
 	}
 
+	if (xkb_loaded) {
+		if (dead_tbl) {
+			xkb_compose_table_unref(dead_tbl);
+		}
+		if (xkb_ctx) {
+			xkb_context_unref(xkb_ctx);
+		}
+	}
+
 	//destroy drivers
 #if defined(VULKAN_ENABLED)
 	if (rendering_device_vulkan) {

+ 5 - 0
platform/linuxbsd/x11/display_server_x11.h

@@ -142,6 +142,7 @@ class DisplayServerX11 : public DisplayServer {
 		bool ime_active = false;
 		bool ime_in_progress = false;
 		bool ime_suppress_next_keyup = false;
+		xkb_compose_state *xkb_state = nullptr;
 
 		Size2i min_size;
 		Size2i max_size;
@@ -185,6 +186,10 @@ class DisplayServerX11 : public DisplayServer {
 	Point2i im_selection;
 	String im_text;
 
+	bool xkb_loaded = false;
+	xkb_context *xkb_ctx = nullptr;
+	xkb_compose_table *dead_tbl = nullptr;
+
 	HashMap<WindowID, WindowData> windows;
 
 	unsigned int last_mouse_monitor_mask = 0;

+ 2 - 2
platform/linuxbsd/x11/dynwrappers/xcursor-so_wrap.c

@@ -1,7 +1,7 @@
 // This file is generated. Do not edit!
 // see https://github.com/hpvb/dynload-wrapper for details
-// generated by ../dynload-wrapper/generate-wrapper.py 0.3 on 2023-01-23 15:09:53
-// flags: ../dynload-wrapper/generate-wrapper.py --include ./thirdparty/linuxbsd_headers/X11/Xcursor/Xcursor.h --sys-include "thirdparty/linuxbsd_headers/X11/Xcursor/Xcursor.h" --soname libXcursor.so.1 --init-name xcursor --output-header ./platform/linuxbsd/x11/dynwrappers/xcursor-so_wrap.h --output-implementation ./platform/linuxbsd/x11/dynwrappers/xcursor-so_wrap.c
+// generated by generate-wrapper.py 0.3 on 2023-01-23 15:09:53
+// flags: generate-wrapper.py --include ./thirdparty/linuxbsd_headers/X11/Xcursor/Xcursor.h --sys-include "thirdparty/linuxbsd_headers/X11/Xcursor/Xcursor.h" --soname libXcursor.so.1 --init-name xcursor --output-header ./platform/linuxbsd/x11/dynwrappers/xcursor-so_wrap.h --output-implementation ./platform/linuxbsd/x11/dynwrappers/xcursor-so_wrap.c
 //
 // NOTE: Generated from Xcursor 1.2.0.
 // This has been handpatched to workaround some issues with the generator that

+ 2 - 2
platform/linuxbsd/x11/dynwrappers/xcursor-so_wrap.h

@@ -2,8 +2,8 @@
 #define DYLIBLOAD_WRAPPER_XCURSOR
 // This file is generated. Do not edit!
 // see https://github.com/hpvb/dynload-wrapper for details
-// generated by ../dynload-wrapper/generate-wrapper.py 0.3 on 2023-01-23 15:09:53
-// flags: ../dynload-wrapper/generate-wrapper.py --include ./thirdparty/linuxbsd_headers/X11/Xcursor/Xcursor.h --sys-include "thirdparty/linuxbsd_headers/X11/Xcursor/Xcursor.h" --soname libXcursor.so.1 --init-name xcursor --output-header ./platform/linuxbsd/x11/dynwrappers/xcursor-so_wrap.h --output-implementation ./platform/linuxbsd/x11/dynwrappers/xcursor-so_wrap.c
+// generated by generate-wrapper.py 0.3 on 2023-01-23 15:09:53
+// flags: generate-wrapper.py --include ./thirdparty/linuxbsd_headers/X11/Xcursor/Xcursor.h --sys-include "thirdparty/linuxbsd_headers/X11/Xcursor/Xcursor.h" --soname libXcursor.so.1 --init-name xcursor --output-header ./platform/linuxbsd/x11/dynwrappers/xcursor-so_wrap.h --output-implementation ./platform/linuxbsd/x11/dynwrappers/xcursor-so_wrap.c
 //
 // NOTE: Generated from Xcursor 1.2.0.
 // This has been handpatched to workaround some issues with the generator that

+ 2 - 2
platform/linuxbsd/x11/dynwrappers/xext-so_wrap.c

@@ -1,7 +1,7 @@
 // This file is generated. Do not edit!
 // see https://github.com/hpvb/dynload-wrapper for details
-// generated by ../dynload-wrapper/generate-wrapper.py 0.3 on 2023-01-23 15:11:29
-// flags: ../dynload-wrapper/generate-wrapper.py --sys-include "thirdparty/linuxbsd_headers/X11/extensions/Xext.h" --include ./thirdparty/linuxbsd_headers/X11/extensions/shape.h --sys-include "thirdparty/linuxbsd_headers/X11/extensions/shape.h" --soname libXext.so.6 --init-name xext --output-header ./platform/linuxbsd/x11/dynwrappers/xext-so_wrap.h --output-implementation ./platform/linuxbsd/x11/dynwrappers/xext-so_wrap.c
+// generated by generate-wrapper.py 0.3 on 2023-01-23 15:11:29
+// flags: generate-wrapper.py --sys-include "thirdparty/linuxbsd_headers/X11/extensions/Xext.h" --include ./thirdparty/linuxbsd_headers/X11/extensions/shape.h --sys-include "thirdparty/linuxbsd_headers/X11/extensions/shape.h" --soname libXext.so.6 --init-name xext --output-header ./platform/linuxbsd/x11/dynwrappers/xext-so_wrap.h --output-implementation ./platform/linuxbsd/x11/dynwrappers/xext-so_wrap.c
 //
 // NOTE: Generated from Xext 1.3.5.
 // This has been handpatched to workaround some issues with the generator that

+ 2 - 2
platform/linuxbsd/x11/dynwrappers/xext-so_wrap.h

@@ -2,8 +2,8 @@
 #define DYLIBLOAD_WRAPPER_XEXT
 // This file is generated. Do not edit!
 // see https://github.com/hpvb/dynload-wrapper for details
-// generated by ../dynload-wrapper/generate-wrapper.py 0.3 on 2023-01-23 15:11:29
-// flags: ../dynload-wrapper/generate-wrapper.py --sys-include "thirdparty/linuxbsd_headers/X11/extensions/Xext.h" --include ./thirdparty/linuxbsd_headers/X11/extensions/shape.h --sys-include "thirdparty/linuxbsd_headers/X11/extensions/shape.h" --soname libXext.so.6 --init-name xext --output-header ./platform/linuxbsd/x11/dynwrappers/xext-so_wrap.h --output-implementation ./platform/linuxbsd/x11/dynwrappers/xext-so_wrap.c
+// generated by generate-wrapper.py 0.3 on 2023-01-23 15:11:29
+// flags: generate-wrapper.py --sys-include "thirdparty/linuxbsd_headers/X11/extensions/Xext.h" --include ./thirdparty/linuxbsd_headers/X11/extensions/shape.h --sys-include "thirdparty/linuxbsd_headers/X11/extensions/shape.h" --soname libXext.so.6 --init-name xext --output-header ./platform/linuxbsd/x11/dynwrappers/xext-so_wrap.h --output-implementation ./platform/linuxbsd/x11/dynwrappers/xext-so_wrap.c
 //
 // NOTE: Generated from Xext 1.3.5.
 // This has been handpatched to workaround some issues with the generator that

+ 2 - 2
platform/linuxbsd/x11/dynwrappers/xinerama-so_wrap.c

@@ -1,7 +1,7 @@
 // This file is generated. Do not edit!
 // see https://github.com/hpvb/dynload-wrapper for details
-// generated by ../dynload-wrapper/generate-wrapper.py 0.3 on 2023-01-23 15:11:35
-// flags: ../dynload-wrapper/generate-wrapper.py --include ./thirdparty/linuxbsd_headers/X11/extensions/Xinerama.h --sys-include "thirdparty/linuxbsd_headers/X11/extensions/Xinerama.h" --soname libXinerama.so.1 --init-name xinerama --output-header ./platform/linuxbsd/x11/dynwrappers/xinerama-so_wrap.h --output-implementation ./platform/linuxbsd/x11/dynwrappers/xinerama-so_wrap.c
+// generated by generate-wrapper.py 0.3 on 2023-01-23 15:11:35
+// flags: generate-wrapper.py --include ./thirdparty/linuxbsd_headers/X11/extensions/Xinerama.h --sys-include "thirdparty/linuxbsd_headers/X11/extensions/Xinerama.h" --soname libXinerama.so.1 --init-name xinerama --output-header ./platform/linuxbsd/x11/dynwrappers/xinerama-so_wrap.h --output-implementation ./platform/linuxbsd/x11/dynwrappers/xinerama-so_wrap.c
 //
 // NOTE: Generated from Xinerama 1.1.4.
 // This has been handpatched to workaround some issues with the generator that

+ 2 - 2
platform/linuxbsd/x11/dynwrappers/xinerama-so_wrap.h

@@ -2,8 +2,8 @@
 #define DYLIBLOAD_WRAPPER_XINERAMA
 // This file is generated. Do not edit!
 // see https://github.com/hpvb/dynload-wrapper for details
-// generated by ../dynload-wrapper/generate-wrapper.py 0.3 on 2023-01-23 15:11:35
-// flags: ../dynload-wrapper/generate-wrapper.py --include ./thirdparty/linuxbsd_headers/X11/extensions/Xinerama.h --sys-include "thirdparty/linuxbsd_headers/X11/extensions/Xinerama.h" --soname libXinerama.so.1 --init-name xinerama --output-header ./platform/linuxbsd/x11/dynwrappers/xinerama-so_wrap.h --output-implementation ./platform/linuxbsd/x11/dynwrappers/xinerama-so_wrap.c
+// generated by generate-wrapper.py 0.3 on 2023-01-23 15:11:35
+// flags: generate-wrapper.py --include ./thirdparty/linuxbsd_headers/X11/extensions/Xinerama.h --sys-include "thirdparty/linuxbsd_headers/X11/extensions/Xinerama.h" --soname libXinerama.so.1 --init-name xinerama --output-header ./platform/linuxbsd/x11/dynwrappers/xinerama-so_wrap.h --output-implementation ./platform/linuxbsd/x11/dynwrappers/xinerama-so_wrap.c
 //
 // NOTE: Generated from Xinerama 1.1.4.
 // This has been handpatched to workaround some issues with the generator that

+ 2 - 2
platform/linuxbsd/x11/dynwrappers/xinput2-so_wrap.c

@@ -1,7 +1,7 @@
 // This file is generated. Do not edit!
 // see https://github.com/hpvb/dynload-wrapper for details
-// generated by ../dynload-wrapper/generate-wrapper.py 0.3 on 2023-01-23 15:12:16
-// flags: ../dynload-wrapper/generate-wrapper.py --include ./thirdparty/linuxbsd_headers/X11/extensions/XInput2.h --sys-include "thirdparty/linuxbsd_headers/X11/extensions/XInput2.h" --soname libXi.so.6 --init-name xinput2 --output-header ./platform/linuxbsd/x11/dynwrappers/xinput2-so_wrap.h --output-implementation ./platform/linuxbsd/x11/dynwrappers/xinput2-so_wrap.c
+// generated by generate-wrapper.py 0.3 on 2023-01-23 15:12:16
+// flags: generate-wrapper.py --include ./thirdparty/linuxbsd_headers/X11/extensions/XInput2.h --sys-include "thirdparty/linuxbsd_headers/X11/extensions/XInput2.h" --soname libXi.so.6 --init-name xinput2 --output-header ./platform/linuxbsd/x11/dynwrappers/xinput2-so_wrap.h --output-implementation ./platform/linuxbsd/x11/dynwrappers/xinput2-so_wrap.c
 //
 // NOTE: Generated from Xi 1.7.10.
 // This has been handpatched to workaround some issues with the generator that

+ 2 - 2
platform/linuxbsd/x11/dynwrappers/xinput2-so_wrap.h

@@ -2,8 +2,8 @@
 #define DYLIBLOAD_WRAPPER_XINPUT2
 // This file is generated. Do not edit!
 // see https://github.com/hpvb/dynload-wrapper for details
-// generated by ../dynload-wrapper/generate-wrapper.py 0.3 on 2023-01-23 15:12:16
-// flags: ../dynload-wrapper/generate-wrapper.py --include ./thirdparty/linuxbsd_headers/X11/extensions/XInput2.h --sys-include "thirdparty/linuxbsd_headers/X11/extensions/XInput2.h" --soname libXi.so.6 --init-name xinput2 --output-header ./platform/linuxbsd/x11/dynwrappers/xinput2-so_wrap.h --output-implementation ./platform/linuxbsd/x11/dynwrappers/xinput2-so_wrap.c
+// generated by generate-wrapper.py 0.3 on 2023-01-23 15:12:16
+// flags: generate-wrapper.py --include ./thirdparty/linuxbsd_headers/X11/extensions/XInput2.h --sys-include "thirdparty/linuxbsd_headers/X11/extensions/XInput2.h" --soname libXi.so.6 --init-name xinput2 --output-header ./platform/linuxbsd/x11/dynwrappers/xinput2-so_wrap.h --output-implementation ./platform/linuxbsd/x11/dynwrappers/xinput2-so_wrap.c
 //
 // NOTE: Generated from Xi 1.7.10.
 // This has been handpatched to workaround some issues with the generator that

+ 2 - 2
platform/linuxbsd/x11/dynwrappers/xlib-so_wrap.c

@@ -1,7 +1,7 @@
 // This file is generated. Do not edit!
 // see https://github.com/hpvb/dynload-wrapper for details
-// generated by ../dynload-wrapper/generate-wrapper.py 0.3 on 2023-01-23 15:13:26
-// flags: ../dynload-wrapper/generate-wrapper.py --include ./thirdparty/linuxbsd_headers/X11/Xlib.h --include ./thirdparty/linuxbsd_headers/X11/Xutil.h --include ./thirdparty/linuxbsd_headers/X11/XKBlib.h --sys-include "thirdparty/linuxbsd_headers/X11/Xlib.h" --sys-include "thirdparty/linuxbsd_headers/X11/Xutil.h" --sys-include "thirdparty/linuxbsd_headers/X11/XKBlib.h" --soname libX11.so.6 --init-name xlib --omit-prefix XkbGetDeviceIndicatorState --omit-prefix XkbAddSymInterpret --output-header ./platform/linuxbsd/x11/dynwrappers/xlib-so_wrap.h --output-implementation ./platform/linuxbsd/x11/dynwrappers/xlib-so_wrap.c~
+// generated by generate-wrapper.py 0.3 on 2023-01-23 15:13:26
+// flags: generate-wrapper.py --include ./thirdparty/linuxbsd_headers/X11/Xlib.h --include ./thirdparty/linuxbsd_headers/X11/Xutil.h --include ./thirdparty/linuxbsd_headers/X11/XKBlib.h --sys-include "thirdparty/linuxbsd_headers/X11/Xlib.h" --sys-include "thirdparty/linuxbsd_headers/X11/Xutil.h" --sys-include "thirdparty/linuxbsd_headers/X11/XKBlib.h" --soname libX11.so.6 --init-name xlib --omit-prefix XkbGetDeviceIndicatorState --omit-prefix XkbAddSymInterpret --output-header ./platform/linuxbsd/x11/dynwrappers/xlib-so_wrap.h --output-implementation ./platform/linuxbsd/x11/dynwrappers/xlib-so_wrap.c~
 //
 // NOTE: Generated from Xlib 1.6.9.
 // This has been handpatched to workaround some issues with the generator that

+ 2 - 2
platform/linuxbsd/x11/dynwrappers/xlib-so_wrap.h

@@ -2,8 +2,8 @@
 #define DYLIBLOAD_WRAPPER_XLIB
 // This file is generated. Do not edit!
 // see https://github.com/hpvb/dynload-wrapper for details
-// generated by ../dynload-wrapper/generate-wrapper.py 0.3 on 2023-01-23 15:13:26
-// flags: ../dynload-wrapper/generate-wrapper.py --include ./thirdparty/linuxbsd_headers/X11/Xlib.h --include ./thirdparty/linuxbsd_headers/X11/Xutil.h --include ./thirdparty/linuxbsd_headers/X11/XKBlib.h --sys-include "thirdparty/linuxbsd_headers/X11/Xlib.h" --sys-include "thirdparty/linuxbsd_headers/X11/Xutil.h" --sys-include "thirdparty/linuxbsd_headers/X11/XKBlib.h" --soname libX11.so.6 --init-name xlib --omit-prefix XkbGetDeviceIndicatorState --omit-prefix XkbAddSymInterpret --output-header ./platform/linuxbsd/x11/dynwrappers/xlib-so_wrap.h --output-implementation ./platform/linuxbsd/x11/dynwrappers/xlib-so_wrap.c~
+// generated by generate-wrapper.py 0.3 on 2023-01-23 15:13:26
+// flags: generate-wrapper.py --include ./thirdparty/linuxbsd_headers/X11/Xlib.h --include ./thirdparty/linuxbsd_headers/X11/Xutil.h --include ./thirdparty/linuxbsd_headers/X11/XKBlib.h --sys-include "thirdparty/linuxbsd_headers/X11/Xlib.h" --sys-include "thirdparty/linuxbsd_headers/X11/Xutil.h" --sys-include "thirdparty/linuxbsd_headers/X11/XKBlib.h" --soname libX11.so.6 --init-name xlib --omit-prefix XkbGetDeviceIndicatorState --omit-prefix XkbAddSymInterpret --output-header ./platform/linuxbsd/x11/dynwrappers/xlib-so_wrap.h --output-implementation ./platform/linuxbsd/x11/dynwrappers/xlib-so_wrap.c~
 //
 // NOTE: Generated from Xlib 1.6.9.
 // This has been handpatched to workaround some issues with the generator that

+ 2 - 2
platform/linuxbsd/x11/dynwrappers/xrandr-so_wrap.c

@@ -1,7 +1,7 @@
 // This file is generated. Do not edit!
 // see https://github.com/hpvb/dynload-wrapper for details
-// generated by ../dynload-wrapper/generate-wrapper.py 0.3 on 2023-01-23 15:13:54
-// flags: ../dynload-wrapper/generate-wrapper.py --include ./thirdparty/linuxbsd_headers/X11/extensions/Xrandr.h --sys-include "thirdparty/linuxbsd_headers/X11/extensions/Xrandr.h" --soname libXrandr.so.2 --init-name xrandr --output-header ./platform/linuxbsd/x11/dynwrappers/xrandr-so_wrap.h --output-implementation ./platform/linuxbsd/x11/dynwrappers/xrandr-so_wrap.c
+// generated by generate-wrapper.py 0.3 on 2023-01-23 15:13:54
+// flags: generate-wrapper.py --include ./thirdparty/linuxbsd_headers/X11/extensions/Xrandr.h --sys-include "thirdparty/linuxbsd_headers/X11/extensions/Xrandr.h" --soname libXrandr.so.2 --init-name xrandr --output-header ./platform/linuxbsd/x11/dynwrappers/xrandr-so_wrap.h --output-implementation ./platform/linuxbsd/x11/dynwrappers/xrandr-so_wrap.c
 //
 // NOTE: Generated from Xrandr 1.5.2.
 // This has been handpatched to workaround some issues with the generator that

+ 2 - 2
platform/linuxbsd/x11/dynwrappers/xrandr-so_wrap.h

@@ -2,8 +2,8 @@
 #define DYLIBLOAD_WRAPPER_XRANDR
 // This file is generated. Do not edit!
 // see https://github.com/hpvb/dynload-wrapper for details
-// generated by ../dynload-wrapper/generate-wrapper.py 0.3 on 2023-01-23 15:13:54
-// flags: ../dynload-wrapper/generate-wrapper.py --include ./thirdparty/linuxbsd_headers/X11/extensions/Xrandr.h --sys-include "thirdparty/linuxbsd_headers/X11/extensions/Xrandr.h" --soname libXrandr.so.2 --init-name xrandr --output-header ./platform/linuxbsd/x11/dynwrappers/xrandr-so_wrap.h --output-implementation ./platform/linuxbsd/x11/dynwrappers/xrandr-so_wrap.c
+// generated by generate-wrapper.py 0.3 on 2023-01-23 15:13:54
+// flags: generate-wrapper.py --include ./thirdparty/linuxbsd_headers/X11/extensions/Xrandr.h --sys-include "thirdparty/linuxbsd_headers/X11/extensions/Xrandr.h" --soname libXrandr.so.2 --init-name xrandr --output-header ./platform/linuxbsd/x11/dynwrappers/xrandr-so_wrap.h --output-implementation ./platform/linuxbsd/x11/dynwrappers/xrandr-so_wrap.c
 //
 // NOTE: Generated from Xrandr 1.5.2.
 // This has been handpatched to workaround some issues with the generator that

+ 2 - 2
platform/linuxbsd/x11/dynwrappers/xrender-so_wrap.c

@@ -1,7 +1,7 @@
 // This file is generated. Do not edit!
 // see https://github.com/hpvb/dynload-wrapper for details
-// generated by ../dynload-wrapper/generate-wrapper.py 0.3 on 2023-01-23 15:14:14
-// flags: ../dynload-wrapper/generate-wrapper.py --include ./thirdparty/linuxbsd_headers/X11/extensions/Xrender.h --sys-include "thirdparty/linuxbsd_headers/X11/extensions/Xrender.h" --soname libXrender.so.1 --init-name xrender --output-header ./platform/linuxbsd/x11/dynwrappers/xrender-so_wrap.h --output-implementation ./platform/linuxbsd/x11/dynwrappers/xrender-so_wrap.c~
+// generated by generate-wrapper.py 0.3 on 2023-01-23 15:14:14
+// flags: generate-wrapper.py --include ./thirdparty/linuxbsd_headers/X11/extensions/Xrender.h --sys-include "thirdparty/linuxbsd_headers/X11/extensions/Xrender.h" --soname libXrender.so.1 --init-name xrender --output-header ./platform/linuxbsd/x11/dynwrappers/xrender-so_wrap.h --output-implementation ./platform/linuxbsd/x11/dynwrappers/xrender-so_wrap.c~
 //
 // NOTE: Generated from Xrender 0.9.10.
 // This has been handpatched to workaround some issues with the generator that

+ 2 - 2
platform/linuxbsd/x11/dynwrappers/xrender-so_wrap.h

@@ -2,8 +2,8 @@
 #define DYLIBLOAD_WRAPPER_XRENDER
 // This file is generated. Do not edit!
 // see https://github.com/hpvb/dynload-wrapper for details
-// generated by ../dynload-wrapper/generate-wrapper.py 0.3 on 2023-01-23 15:14:14
-// flags: ../dynload-wrapper/generate-wrapper.py --include ./thirdparty/linuxbsd_headers/X11/extensions/Xrender.h --sys-include "thirdparty/linuxbsd_headers/X11/extensions/Xrender.h" --soname libXrender.so.1 --init-name xrender --output-header ./platform/linuxbsd/x11/dynwrappers/xrender-so_wrap.h --output-implementation ./platform/linuxbsd/x11/dynwrappers/xrender-so_wrap.c~
+// generated by generate-wrapper.py 0.3 on 2023-01-23 15:14:14
+// flags: generate-wrapper.py --include ./thirdparty/linuxbsd_headers/X11/extensions/Xrender.h --sys-include "thirdparty/linuxbsd_headers/X11/extensions/Xrender.h" --soname libXrender.so.1 --init-name xrender --output-header ./platform/linuxbsd/x11/dynwrappers/xrender-so_wrap.h --output-implementation ./platform/linuxbsd/x11/dynwrappers/xrender-so_wrap.c~
 //
 // NOTE: Generated from Xrender 0.9.10.
 // This has been handpatched to workaround some issues with the generator that

+ 158 - 2
platform/linuxbsd/xkbcommon-so_wrap.c

@@ -1,7 +1,7 @@
 // This file is generated. Do not edit!
 // see https://github.com/hpvb/dynload-wrapper for details
-// generated by ../dynload-wrapper/generate-wrapper.py 0.3 on 2023-01-23 15:14:21
-// flags: ../dynload-wrapper/generate-wrapper.py --include ./thirdparty/linuxbsd_headers/xkbcommon/xkbcommon.h --sys-include "./thirdparty/linuxbsd_headers/xkbcommon/xkbcommon.h" --soname libxkbcommon.so.0 --init-name xkbcommon --output-header ./platform/linuxbsd/x11/dynwrappers/xkbcommon-so_wrap.h --output-implementation ./platform/linuxbsd/x11/dynwrappers/xkbcommon-so_wrap.c
+// generated by generate-wrapper.py 0.3 on 2023-01-30 10:40:26
+// flags: generate-wrapper.py --include ./thirdparty/linuxbsd_headers/xkbcommon/xkbcommon.h --include ./thirdparty/linuxbsd_headers/xkbcommon/xkbcommon-compose.h --include ./thirdparty/linuxbsd_headers/xkbcommon/xkbcommon-keysyms.h --sys-include "./thirdparty/linuxbsd_headers/xkbcommon/xkbcommon.h" --sys-include "./thirdparty/linuxbsd_headers/xkbcommon/xkbcommon-compose.h" --sys-include "./thirdparty/linuxbsd_headers/xkbcommon/xkbcommon-keysyms.h" --soname libxkbcommon.so.0 --init-name xkbcommon --output-header ./platform/linuxbsd/xkbcommon-so_wrap.h --output-implementation ./platform/linuxbsd/xkbcommon-so_wrap.c
 //
 #include <stdint.h>
 
@@ -81,7 +81,23 @@
 #define xkb_state_layout_index_is_active xkb_state_layout_index_is_active_dylibloader_orig_xkbcommon
 #define xkb_state_led_name_is_active xkb_state_led_name_is_active_dylibloader_orig_xkbcommon
 #define xkb_state_led_index_is_active xkb_state_led_index_is_active_dylibloader_orig_xkbcommon
+#define xkb_compose_table_new_from_locale xkb_compose_table_new_from_locale_dylibloader_orig_xkbcommon
+#define xkb_compose_table_new_from_file xkb_compose_table_new_from_file_dylibloader_orig_xkbcommon
+#define xkb_compose_table_new_from_buffer xkb_compose_table_new_from_buffer_dylibloader_orig_xkbcommon
+#define xkb_compose_table_ref xkb_compose_table_ref_dylibloader_orig_xkbcommon
+#define xkb_compose_table_unref xkb_compose_table_unref_dylibloader_orig_xkbcommon
+#define xkb_compose_state_new xkb_compose_state_new_dylibloader_orig_xkbcommon
+#define xkb_compose_state_ref xkb_compose_state_ref_dylibloader_orig_xkbcommon
+#define xkb_compose_state_unref xkb_compose_state_unref_dylibloader_orig_xkbcommon
+#define xkb_compose_state_get_compose_table xkb_compose_state_get_compose_table_dylibloader_orig_xkbcommon
+#define xkb_compose_state_feed xkb_compose_state_feed_dylibloader_orig_xkbcommon
+#define xkb_compose_state_reset xkb_compose_state_reset_dylibloader_orig_xkbcommon
+#define xkb_compose_state_get_status xkb_compose_state_get_status_dylibloader_orig_xkbcommon
+#define xkb_compose_state_get_utf8 xkb_compose_state_get_utf8_dylibloader_orig_xkbcommon
+#define xkb_compose_state_get_one_sym xkb_compose_state_get_one_sym_dylibloader_orig_xkbcommon
 #include "./thirdparty/linuxbsd_headers/xkbcommon/xkbcommon.h"
+#include "./thirdparty/linuxbsd_headers/xkbcommon/xkbcommon-compose.h"
+#include "./thirdparty/linuxbsd_headers/xkbcommon/xkbcommon-keysyms.h"
 #undef xkb_keysym_get_name
 #undef xkb_keysym_from_name
 #undef xkb_keysym_to_utf8
@@ -158,6 +174,20 @@
 #undef xkb_state_layout_index_is_active
 #undef xkb_state_led_name_is_active
 #undef xkb_state_led_index_is_active
+#undef xkb_compose_table_new_from_locale
+#undef xkb_compose_table_new_from_file
+#undef xkb_compose_table_new_from_buffer
+#undef xkb_compose_table_ref
+#undef xkb_compose_table_unref
+#undef xkb_compose_state_new
+#undef xkb_compose_state_ref
+#undef xkb_compose_state_unref
+#undef xkb_compose_state_get_compose_table
+#undef xkb_compose_state_feed
+#undef xkb_compose_state_reset
+#undef xkb_compose_state_get_status
+#undef xkb_compose_state_get_utf8
+#undef xkb_compose_state_get_one_sym
 #include <dlfcn.h>
 #include <stdio.h>
 int (*xkb_keysym_get_name_dylibloader_wrapper_xkbcommon)( xkb_keysym_t, char*, size_t);
@@ -236,6 +266,20 @@ int (*xkb_state_layout_name_is_active_dylibloader_wrapper_xkbcommon)(struct xkb_
 int (*xkb_state_layout_index_is_active_dylibloader_wrapper_xkbcommon)(struct xkb_state*, xkb_layout_index_t,enum xkb_state_component);
 int (*xkb_state_led_name_is_active_dylibloader_wrapper_xkbcommon)(struct xkb_state*,const char*);
 int (*xkb_state_led_index_is_active_dylibloader_wrapper_xkbcommon)(struct xkb_state*, xkb_led_index_t);
+struct xkb_compose_table* (*xkb_compose_table_new_from_locale_dylibloader_wrapper_xkbcommon)(struct xkb_context*,const char*,enum xkb_compose_compile_flags);
+struct xkb_compose_table* (*xkb_compose_table_new_from_file_dylibloader_wrapper_xkbcommon)(struct xkb_context*, FILE*,const char*,enum xkb_compose_format,enum xkb_compose_compile_flags);
+struct xkb_compose_table* (*xkb_compose_table_new_from_buffer_dylibloader_wrapper_xkbcommon)(struct xkb_context*,const char*, size_t,const char*,enum xkb_compose_format,enum xkb_compose_compile_flags);
+struct xkb_compose_table* (*xkb_compose_table_ref_dylibloader_wrapper_xkbcommon)(struct xkb_compose_table*);
+void (*xkb_compose_table_unref_dylibloader_wrapper_xkbcommon)(struct xkb_compose_table*);
+struct xkb_compose_state* (*xkb_compose_state_new_dylibloader_wrapper_xkbcommon)(struct xkb_compose_table*,enum xkb_compose_state_flags);
+struct xkb_compose_state* (*xkb_compose_state_ref_dylibloader_wrapper_xkbcommon)(struct xkb_compose_state*);
+void (*xkb_compose_state_unref_dylibloader_wrapper_xkbcommon)(struct xkb_compose_state*);
+struct xkb_compose_table* (*xkb_compose_state_get_compose_table_dylibloader_wrapper_xkbcommon)(struct xkb_compose_state*);
+enum xkb_compose_feed_result (*xkb_compose_state_feed_dylibloader_wrapper_xkbcommon)(struct xkb_compose_state*, xkb_keysym_t);
+void (*xkb_compose_state_reset_dylibloader_wrapper_xkbcommon)(struct xkb_compose_state*);
+enum xkb_compose_status (*xkb_compose_state_get_status_dylibloader_wrapper_xkbcommon)(struct xkb_compose_state*);
+int (*xkb_compose_state_get_utf8_dylibloader_wrapper_xkbcommon)(struct xkb_compose_state*, char*, size_t);
+xkb_keysym_t (*xkb_compose_state_get_one_sym_dylibloader_wrapper_xkbcommon)(struct xkb_compose_state*);
 int initialize_xkbcommon(int verbose) {
   void *handle;
   char *error;
@@ -855,5 +899,117 @@ int initialize_xkbcommon(int verbose) {
       fprintf(stderr, "%s\n", error);
     }
   }
+// xkb_compose_table_new_from_locale
+  *(void **) (&xkb_compose_table_new_from_locale_dylibloader_wrapper_xkbcommon) = dlsym(handle, "xkb_compose_table_new_from_locale");
+  if (verbose) {
+    error = dlerror();
+    if (error != NULL) {
+      fprintf(stderr, "%s\n", error);
+    }
+  }
+// xkb_compose_table_new_from_file
+  *(void **) (&xkb_compose_table_new_from_file_dylibloader_wrapper_xkbcommon) = dlsym(handle, "xkb_compose_table_new_from_file");
+  if (verbose) {
+    error = dlerror();
+    if (error != NULL) {
+      fprintf(stderr, "%s\n", error);
+    }
+  }
+// xkb_compose_table_new_from_buffer
+  *(void **) (&xkb_compose_table_new_from_buffer_dylibloader_wrapper_xkbcommon) = dlsym(handle, "xkb_compose_table_new_from_buffer");
+  if (verbose) {
+    error = dlerror();
+    if (error != NULL) {
+      fprintf(stderr, "%s\n", error);
+    }
+  }
+// xkb_compose_table_ref
+  *(void **) (&xkb_compose_table_ref_dylibloader_wrapper_xkbcommon) = dlsym(handle, "xkb_compose_table_ref");
+  if (verbose) {
+    error = dlerror();
+    if (error != NULL) {
+      fprintf(stderr, "%s\n", error);
+    }
+  }
+// xkb_compose_table_unref
+  *(void **) (&xkb_compose_table_unref_dylibloader_wrapper_xkbcommon) = dlsym(handle, "xkb_compose_table_unref");
+  if (verbose) {
+    error = dlerror();
+    if (error != NULL) {
+      fprintf(stderr, "%s\n", error);
+    }
+  }
+// xkb_compose_state_new
+  *(void **) (&xkb_compose_state_new_dylibloader_wrapper_xkbcommon) = dlsym(handle, "xkb_compose_state_new");
+  if (verbose) {
+    error = dlerror();
+    if (error != NULL) {
+      fprintf(stderr, "%s\n", error);
+    }
+  }
+// xkb_compose_state_ref
+  *(void **) (&xkb_compose_state_ref_dylibloader_wrapper_xkbcommon) = dlsym(handle, "xkb_compose_state_ref");
+  if (verbose) {
+    error = dlerror();
+    if (error != NULL) {
+      fprintf(stderr, "%s\n", error);
+    }
+  }
+// xkb_compose_state_unref
+  *(void **) (&xkb_compose_state_unref_dylibloader_wrapper_xkbcommon) = dlsym(handle, "xkb_compose_state_unref");
+  if (verbose) {
+    error = dlerror();
+    if (error != NULL) {
+      fprintf(stderr, "%s\n", error);
+    }
+  }
+// xkb_compose_state_get_compose_table
+  *(void **) (&xkb_compose_state_get_compose_table_dylibloader_wrapper_xkbcommon) = dlsym(handle, "xkb_compose_state_get_compose_table");
+  if (verbose) {
+    error = dlerror();
+    if (error != NULL) {
+      fprintf(stderr, "%s\n", error);
+    }
+  }
+// xkb_compose_state_feed
+  *(void **) (&xkb_compose_state_feed_dylibloader_wrapper_xkbcommon) = dlsym(handle, "xkb_compose_state_feed");
+  if (verbose) {
+    error = dlerror();
+    if (error != NULL) {
+      fprintf(stderr, "%s\n", error);
+    }
+  }
+// xkb_compose_state_reset
+  *(void **) (&xkb_compose_state_reset_dylibloader_wrapper_xkbcommon) = dlsym(handle, "xkb_compose_state_reset");
+  if (verbose) {
+    error = dlerror();
+    if (error != NULL) {
+      fprintf(stderr, "%s\n", error);
+    }
+  }
+// xkb_compose_state_get_status
+  *(void **) (&xkb_compose_state_get_status_dylibloader_wrapper_xkbcommon) = dlsym(handle, "xkb_compose_state_get_status");
+  if (verbose) {
+    error = dlerror();
+    if (error != NULL) {
+      fprintf(stderr, "%s\n", error);
+    }
+  }
+// xkb_compose_state_get_utf8
+  *(void **) (&xkb_compose_state_get_utf8_dylibloader_wrapper_xkbcommon) = dlsym(handle, "xkb_compose_state_get_utf8");
+  if (verbose) {
+    error = dlerror();
+    if (error != NULL) {
+      fprintf(stderr, "%s\n", error);
+    }
+  }
+// xkb_compose_state_get_one_sym
+  *(void **) (&xkb_compose_state_get_one_sym_dylibloader_wrapper_xkbcommon) = dlsym(handle, "xkb_compose_state_get_one_sym");
+  if (verbose) {
+    error = dlerror();
+    if (error != NULL) {
+      fprintf(stderr, "%s\n", error);
+    }
+  }
 return 0;
 }

+ 60 - 2
platform/linuxbsd/xkbcommon-so_wrap.h

@@ -2,8 +2,8 @@
 #define DYLIBLOAD_WRAPPER_XKBCOMMON
 // This file is generated. Do not edit!
 // see https://github.com/hpvb/dynload-wrapper for details
-// generated by ../dynload-wrapper/generate-wrapper.py 0.3 on 2023-01-23 15:14:21
-// flags: ../dynload-wrapper/generate-wrapper.py --include ./thirdparty/linuxbsd_headers/xkbcommon/xkbcommon.h --sys-include "./thirdparty/linuxbsd_headers/xkbcommon/xkbcommon.h" --soname libxkbcommon.so.0 --init-name xkbcommon --output-header ./platform/linuxbsd/x11/dynwrappers/xkbcommon-so_wrap.h --output-implementation ./platform/linuxbsd/x11/dynwrappers/xkbcommon-so_wrap.c
+// generated by generate-wrapper.py 0.3 on 2023-01-30 10:40:26
+// flags: generate-wrapper.py --include ./thirdparty/linuxbsd_headers/xkbcommon/xkbcommon.h --include ./thirdparty/linuxbsd_headers/xkbcommon/xkbcommon-compose.h --include ./thirdparty/linuxbsd_headers/xkbcommon/xkbcommon-keysyms.h --sys-include "./thirdparty/linuxbsd_headers/xkbcommon/xkbcommon.h" --sys-include "./thirdparty/linuxbsd_headers/xkbcommon/xkbcommon-compose.h" --sys-include "./thirdparty/linuxbsd_headers/xkbcommon/xkbcommon-keysyms.h" --soname libxkbcommon.so.0 --init-name xkbcommon --output-header ./platform/linuxbsd/xkbcommon-so_wrap.h --output-implementation ./platform/linuxbsd/xkbcommon-so_wrap.c
 //
 #include <stdint.h>
 
@@ -83,7 +83,23 @@
 #define xkb_state_layout_index_is_active xkb_state_layout_index_is_active_dylibloader_orig_xkbcommon
 #define xkb_state_led_name_is_active xkb_state_led_name_is_active_dylibloader_orig_xkbcommon
 #define xkb_state_led_index_is_active xkb_state_led_index_is_active_dylibloader_orig_xkbcommon
+#define xkb_compose_table_new_from_locale xkb_compose_table_new_from_locale_dylibloader_orig_xkbcommon
+#define xkb_compose_table_new_from_file xkb_compose_table_new_from_file_dylibloader_orig_xkbcommon
+#define xkb_compose_table_new_from_buffer xkb_compose_table_new_from_buffer_dylibloader_orig_xkbcommon
+#define xkb_compose_table_ref xkb_compose_table_ref_dylibloader_orig_xkbcommon
+#define xkb_compose_table_unref xkb_compose_table_unref_dylibloader_orig_xkbcommon
+#define xkb_compose_state_new xkb_compose_state_new_dylibloader_orig_xkbcommon
+#define xkb_compose_state_ref xkb_compose_state_ref_dylibloader_orig_xkbcommon
+#define xkb_compose_state_unref xkb_compose_state_unref_dylibloader_orig_xkbcommon
+#define xkb_compose_state_get_compose_table xkb_compose_state_get_compose_table_dylibloader_orig_xkbcommon
+#define xkb_compose_state_feed xkb_compose_state_feed_dylibloader_orig_xkbcommon
+#define xkb_compose_state_reset xkb_compose_state_reset_dylibloader_orig_xkbcommon
+#define xkb_compose_state_get_status xkb_compose_state_get_status_dylibloader_orig_xkbcommon
+#define xkb_compose_state_get_utf8 xkb_compose_state_get_utf8_dylibloader_orig_xkbcommon
+#define xkb_compose_state_get_one_sym xkb_compose_state_get_one_sym_dylibloader_orig_xkbcommon
 #include "./thirdparty/linuxbsd_headers/xkbcommon/xkbcommon.h"
+#include "./thirdparty/linuxbsd_headers/xkbcommon/xkbcommon-compose.h"
+#include "./thirdparty/linuxbsd_headers/xkbcommon/xkbcommon-keysyms.h"
 #undef xkb_keysym_get_name
 #undef xkb_keysym_from_name
 #undef xkb_keysym_to_utf8
@@ -160,6 +176,20 @@
 #undef xkb_state_layout_index_is_active
 #undef xkb_state_led_name_is_active
 #undef xkb_state_led_index_is_active
+#undef xkb_compose_table_new_from_locale
+#undef xkb_compose_table_new_from_file
+#undef xkb_compose_table_new_from_buffer
+#undef xkb_compose_table_ref
+#undef xkb_compose_table_unref
+#undef xkb_compose_state_new
+#undef xkb_compose_state_ref
+#undef xkb_compose_state_unref
+#undef xkb_compose_state_get_compose_table
+#undef xkb_compose_state_feed
+#undef xkb_compose_state_reset
+#undef xkb_compose_state_get_status
+#undef xkb_compose_state_get_utf8
+#undef xkb_compose_state_get_one_sym
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -239,6 +269,20 @@ extern "C" {
 #define xkb_state_layout_index_is_active xkb_state_layout_index_is_active_dylibloader_wrapper_xkbcommon
 #define xkb_state_led_name_is_active xkb_state_led_name_is_active_dylibloader_wrapper_xkbcommon
 #define xkb_state_led_index_is_active xkb_state_led_index_is_active_dylibloader_wrapper_xkbcommon
+#define xkb_compose_table_new_from_locale xkb_compose_table_new_from_locale_dylibloader_wrapper_xkbcommon
+#define xkb_compose_table_new_from_file xkb_compose_table_new_from_file_dylibloader_wrapper_xkbcommon
+#define xkb_compose_table_new_from_buffer xkb_compose_table_new_from_buffer_dylibloader_wrapper_xkbcommon
+#define xkb_compose_table_ref xkb_compose_table_ref_dylibloader_wrapper_xkbcommon
+#define xkb_compose_table_unref xkb_compose_table_unref_dylibloader_wrapper_xkbcommon
+#define xkb_compose_state_new xkb_compose_state_new_dylibloader_wrapper_xkbcommon
+#define xkb_compose_state_ref xkb_compose_state_ref_dylibloader_wrapper_xkbcommon
+#define xkb_compose_state_unref xkb_compose_state_unref_dylibloader_wrapper_xkbcommon
+#define xkb_compose_state_get_compose_table xkb_compose_state_get_compose_table_dylibloader_wrapper_xkbcommon
+#define xkb_compose_state_feed xkb_compose_state_feed_dylibloader_wrapper_xkbcommon
+#define xkb_compose_state_reset xkb_compose_state_reset_dylibloader_wrapper_xkbcommon
+#define xkb_compose_state_get_status xkb_compose_state_get_status_dylibloader_wrapper_xkbcommon
+#define xkb_compose_state_get_utf8 xkb_compose_state_get_utf8_dylibloader_wrapper_xkbcommon
+#define xkb_compose_state_get_one_sym xkb_compose_state_get_one_sym_dylibloader_wrapper_xkbcommon
 extern int (*xkb_keysym_get_name_dylibloader_wrapper_xkbcommon)( xkb_keysym_t, char*, size_t);
 extern xkb_keysym_t (*xkb_keysym_from_name_dylibloader_wrapper_xkbcommon)(const char*,enum xkb_keysym_flags);
 extern int (*xkb_keysym_to_utf8_dylibloader_wrapper_xkbcommon)( xkb_keysym_t, char*, size_t);
@@ -315,6 +359,20 @@ extern int (*xkb_state_layout_name_is_active_dylibloader_wrapper_xkbcommon)(stru
 extern int (*xkb_state_layout_index_is_active_dylibloader_wrapper_xkbcommon)(struct xkb_state*, xkb_layout_index_t,enum xkb_state_component);
 extern int (*xkb_state_led_name_is_active_dylibloader_wrapper_xkbcommon)(struct xkb_state*,const char*);
 extern int (*xkb_state_led_index_is_active_dylibloader_wrapper_xkbcommon)(struct xkb_state*, xkb_led_index_t);
+extern struct xkb_compose_table* (*xkb_compose_table_new_from_locale_dylibloader_wrapper_xkbcommon)(struct xkb_context*,const char*,enum xkb_compose_compile_flags);
+extern struct xkb_compose_table* (*xkb_compose_table_new_from_file_dylibloader_wrapper_xkbcommon)(struct xkb_context*, FILE*,const char*,enum xkb_compose_format,enum xkb_compose_compile_flags);
+extern struct xkb_compose_table* (*xkb_compose_table_new_from_buffer_dylibloader_wrapper_xkbcommon)(struct xkb_context*,const char*, size_t,const char*,enum xkb_compose_format,enum xkb_compose_compile_flags);
+extern struct xkb_compose_table* (*xkb_compose_table_ref_dylibloader_wrapper_xkbcommon)(struct xkb_compose_table*);
+extern void (*xkb_compose_table_unref_dylibloader_wrapper_xkbcommon)(struct xkb_compose_table*);
+extern struct xkb_compose_state* (*xkb_compose_state_new_dylibloader_wrapper_xkbcommon)(struct xkb_compose_table*,enum xkb_compose_state_flags);
+extern struct xkb_compose_state* (*xkb_compose_state_ref_dylibloader_wrapper_xkbcommon)(struct xkb_compose_state*);
+extern void (*xkb_compose_state_unref_dylibloader_wrapper_xkbcommon)(struct xkb_compose_state*);
+extern struct xkb_compose_table* (*xkb_compose_state_get_compose_table_dylibloader_wrapper_xkbcommon)(struct xkb_compose_state*);
+extern enum xkb_compose_feed_result (*xkb_compose_state_feed_dylibloader_wrapper_xkbcommon)(struct xkb_compose_state*, xkb_keysym_t);
+extern void (*xkb_compose_state_reset_dylibloader_wrapper_xkbcommon)(struct xkb_compose_state*);
+extern enum xkb_compose_status (*xkb_compose_state_get_status_dylibloader_wrapper_xkbcommon)(struct xkb_compose_state*);
+extern int (*xkb_compose_state_get_utf8_dylibloader_wrapper_xkbcommon)(struct xkb_compose_state*, char*, size_t);
+extern xkb_keysym_t (*xkb_compose_state_get_one_sym_dylibloader_wrapper_xkbcommon)(struct xkb_compose_state*);
 int initialize_xkbcommon(int verbose);
 #ifdef __cplusplus
 }