فهرست منبع

Wayland: Disable the compose key on old xkbcommon

Emmanuel Gil Peyrot 7 سال پیش
والد
کامیت
d18431338a
4فایلهای تغییر یافته به همراه43 افزوده شده و 7 حذف شده
  1. 3 0
      CMakeLists.txt
  2. 3 0
      src/glfw_config.h.in
  3. 18 0
      src/wl_init.c
  4. 19 7
      src/wl_platform.h

+ 3 - 0
CMakeLists.txt

@@ -287,6 +287,9 @@ if (_GLFW_WAYLAND)
 
 
     find_package(XKBCommon REQUIRED)
     find_package(XKBCommon REQUIRED)
     list(APPEND glfw_INCLUDE_DIRS "${XKBCOMMON_INCLUDE_DIRS}")
     list(APPEND glfw_INCLUDE_DIRS "${XKBCOMMON_INCLUDE_DIRS}")
+
+    include(CheckIncludeFiles)
+    check_include_files(xkbcommon/xkbcommon-compose.h HAVE_XKBCOMMON_COMPOSE_H)
 endif()
 endif()
 
 
 #--------------------------------------------------------------------
 #--------------------------------------------------------------------

+ 3 - 0
src/glfw_config.h.in

@@ -55,3 +55,6 @@
 // Define this to 1 to force use of high-performance GPU on hybrid systems
 // Define this to 1 to force use of high-performance GPU on hybrid systems
 #cmakedefine _GLFW_USE_HYBRID_HPG
 #cmakedefine _GLFW_USE_HYBRID_HPG
 
 
+// Define this to 1 if xkbcommon supports the compose key
+#cmakedefine HAVE_XKBCOMMON_COMPOSE_H
+

+ 18 - 0
src/wl_init.c

@@ -176,8 +176,12 @@ static void keyboardHandleKeymap(void* data,
 {
 {
     struct xkb_keymap* keymap;
     struct xkb_keymap* keymap;
     struct xkb_state* state;
     struct xkb_state* state;
+
+#ifdef HAVE_XKBCOMMON_COMPOSE_H
     struct xkb_compose_table* composeTable;
     struct xkb_compose_table* composeTable;
     struct xkb_compose_state* composeState;
     struct xkb_compose_state* composeState;
+#endif
+
     char* mapStr;
     char* mapStr;
     const char* locale;
     const char* locale;
 
 
@@ -225,6 +229,7 @@ static void keyboardHandleKeymap(void* data,
     if (!locale)
     if (!locale)
         locale = "C";
         locale = "C";
 
 
+#ifdef HAVE_XKBCOMMON_COMPOSE_H
     composeTable =
     composeTable =
         xkb_compose_table_new_from_locale(_glfw.wl.xkb.context, locale,
         xkb_compose_table_new_from_locale(_glfw.wl.xkb.context, locale,
                                           XKB_COMPOSE_COMPILE_NO_FLAGS);
                                           XKB_COMPOSE_COMPILE_NO_FLAGS);
@@ -244,6 +249,7 @@ static void keyboardHandleKeymap(void* data,
         _glfwInputError(GLFW_PLATFORM_ERROR,
         _glfwInputError(GLFW_PLATFORM_ERROR,
                         "Wayland: Failed to create XKB compose table");
                         "Wayland: Failed to create XKB compose table");
     }
     }
+#endif
 
 
     xkb_keymap_unref(_glfw.wl.xkb.keymap);
     xkb_keymap_unref(_glfw.wl.xkb.keymap);
     xkb_state_unref(_glfw.wl.xkb.state);
     xkb_state_unref(_glfw.wl.xkb.state);
@@ -294,6 +300,7 @@ static int toGLFWKeyCode(uint32_t key)
     return GLFW_KEY_UNKNOWN;
     return GLFW_KEY_UNKNOWN;
 }
 }
 
 
+#ifdef HAVE_XKBCOMMON_COMPOSE_H
 static xkb_keysym_t composeSymbol(xkb_keysym_t sym)
 static xkb_keysym_t composeSymbol(xkb_keysym_t sym)
 {
 {
     if (sym == XKB_KEY_NoSymbol || !_glfw.wl.xkb.composeState)
     if (sym == XKB_KEY_NoSymbol || !_glfw.wl.xkb.composeState)
@@ -313,6 +320,7 @@ static xkb_keysym_t composeSymbol(xkb_keysym_t sym)
             return sym;
             return sym;
     }
     }
 }
 }
+#endif
 
 
 static void inputChar(_GLFWwindow* window, uint32_t key)
 static void inputChar(_GLFWwindow* window, uint32_t key)
 {
 {
@@ -326,7 +334,11 @@ static void inputChar(_GLFWwindow* window, uint32_t key)
 
 
     if (numSyms == 1)
     if (numSyms == 1)
     {
     {
+#ifdef HAVE_XKBCOMMON_COMPOSE_H
         sym = composeSymbol(syms[0]);
         sym = composeSymbol(syms[0]);
+#else
+        sym = syms[0];
+#endif
         cp = _glfwKeySym2Unicode(sym);
         cp = _glfwKeySym2Unicode(sym);
         if (cp != -1)
         if (cp != -1)
         {
         {
@@ -672,6 +684,8 @@ int _glfwPlatformInit(void)
         dlsym(_glfw.wl.xkb.handle, "xkb_state_update_mask");
         dlsym(_glfw.wl.xkb.handle, "xkb_state_update_mask");
     _glfw.wl.xkb.state_serialize_mods = (PFN_xkb_state_serialize_mods)
     _glfw.wl.xkb.state_serialize_mods = (PFN_xkb_state_serialize_mods)
         dlsym(_glfw.wl.xkb.handle, "xkb_state_serialize_mods");
         dlsym(_glfw.wl.xkb.handle, "xkb_state_serialize_mods");
+
+#ifdef HAVE_XKBCOMMON_COMPOSE_H
     _glfw.wl.xkb.compose_table_new_from_locale = (PFN_xkb_compose_table_new_from_locale)
     _glfw.wl.xkb.compose_table_new_from_locale = (PFN_xkb_compose_table_new_from_locale)
         dlsym(_glfw.wl.xkb.handle, "xkb_compose_table_new_from_locale");
         dlsym(_glfw.wl.xkb.handle, "xkb_compose_table_new_from_locale");
     _glfw.wl.xkb.compose_table_unref = (PFN_xkb_compose_table_unref)
     _glfw.wl.xkb.compose_table_unref = (PFN_xkb_compose_table_unref)
@@ -686,6 +700,7 @@ int _glfwPlatformInit(void)
         dlsym(_glfw.wl.xkb.handle, "xkb_compose_state_get_status");
         dlsym(_glfw.wl.xkb.handle, "xkb_compose_state_get_status");
     _glfw.wl.xkb.compose_state_get_one_sym = (PFN_xkb_compose_state_get_one_sym)
     _glfw.wl.xkb.compose_state_get_one_sym = (PFN_xkb_compose_state_get_one_sym)
         dlsym(_glfw.wl.xkb.handle, "xkb_compose_state_get_one_sym");
         dlsym(_glfw.wl.xkb.handle, "xkb_compose_state_get_one_sym");
+#endif
 
 
     _glfw.wl.display = wl_display_connect(NULL);
     _glfw.wl.display = wl_display_connect(NULL);
     if (!_glfw.wl.display)
     if (!_glfw.wl.display)
@@ -740,7 +755,10 @@ void _glfwPlatformTerminate(void)
     _glfwTerminateEGL();
     _glfwTerminateEGL();
     _glfwTerminateJoysticksLinux();
     _glfwTerminateJoysticksLinux();
 
 
+#ifdef HAVE_XKBCOMMON_COMPOSE_H
     xkb_compose_state_unref(_glfw.wl.xkb.composeState);
     xkb_compose_state_unref(_glfw.wl.xkb.composeState);
+#endif
+
     xkb_keymap_unref(_glfw.wl.xkb.keymap);
     xkb_keymap_unref(_glfw.wl.xkb.keymap);
     xkb_state_unref(_glfw.wl.xkb.state);
     xkb_state_unref(_glfw.wl.xkb.state);
     xkb_context_unref(_glfw.wl.xkb.context);
     xkb_context_unref(_glfw.wl.xkb.context);

+ 19 - 7
src/wl_platform.h

@@ -26,7 +26,9 @@
 
 
 #include <wayland-client.h>
 #include <wayland-client.h>
 #include <xkbcommon/xkbcommon.h>
 #include <xkbcommon/xkbcommon.h>
+#ifdef HAVE_XKBCOMMON_COMPOSE_H
 #include <xkbcommon/xkbcommon-compose.h>
 #include <xkbcommon/xkbcommon-compose.h>
+#endif
 #include <dlfcn.h>
 #include <dlfcn.h>
 
 
 typedef VkFlags VkWaylandSurfaceCreateFlagsKHR;
 typedef VkFlags VkWaylandSurfaceCreateFlagsKHR;
@@ -78,13 +80,6 @@ typedef void (* PFN_xkb_state_unref)(struct xkb_state*);
 typedef int (* PFN_xkb_state_key_get_syms)(struct xkb_state*, xkb_keycode_t, const xkb_keysym_t**);
 typedef int (* PFN_xkb_state_key_get_syms)(struct xkb_state*, xkb_keycode_t, const xkb_keysym_t**);
 typedef enum xkb_state_component (* PFN_xkb_state_update_mask)(struct xkb_state*, xkb_mod_mask_t, xkb_mod_mask_t, xkb_mod_mask_t, xkb_layout_index_t, xkb_layout_index_t, xkb_layout_index_t);
 typedef enum xkb_state_component (* PFN_xkb_state_update_mask)(struct xkb_state*, xkb_mod_mask_t, xkb_mod_mask_t, xkb_mod_mask_t, xkb_layout_index_t, xkb_layout_index_t, xkb_layout_index_t);
 typedef xkb_mod_mask_t (* PFN_xkb_state_serialize_mods)(struct xkb_state*, enum xkb_state_component);
 typedef xkb_mod_mask_t (* PFN_xkb_state_serialize_mods)(struct xkb_state*, enum xkb_state_component);
-typedef struct xkb_compose_table* (* PFN_xkb_compose_table_new_from_locale)(struct xkb_context*, const char*, enum xkb_compose_compile_flags);
-typedef void (* PFN_xkb_compose_table_unref)(struct xkb_compose_table*);
-typedef struct xkb_compose_state* (* PFN_xkb_compose_state_new)(struct xkb_compose_table*, enum xkb_compose_state_flags);
-typedef void (* PFN_xkb_compose_state_unref)(struct xkb_compose_state*);
-typedef enum xkb_compose_feed_result (* PFN_xkb_compose_state_feed)(struct xkb_compose_state*, xkb_keysym_t);
-typedef enum xkb_compose_status (* PFN_xkb_compose_state_get_status)(struct xkb_compose_state*);
-typedef xkb_keysym_t (* PFN_xkb_compose_state_get_one_sym)(struct xkb_compose_state*);
 #define xkb_context_new _glfw.wl.xkb.context_new
 #define xkb_context_new _glfw.wl.xkb.context_new
 #define xkb_context_unref _glfw.wl.xkb.context_unref
 #define xkb_context_unref _glfw.wl.xkb.context_unref
 #define xkb_keymap_new_from_string _glfw.wl.xkb.keymap_new_from_string
 #define xkb_keymap_new_from_string _glfw.wl.xkb.keymap_new_from_string
@@ -95,6 +90,15 @@ typedef xkb_keysym_t (* PFN_xkb_compose_state_get_one_sym)(struct xkb_compose_st
 #define xkb_state_key_get_syms _glfw.wl.xkb.state_key_get_syms
 #define xkb_state_key_get_syms _glfw.wl.xkb.state_key_get_syms
 #define xkb_state_update_mask _glfw.wl.xkb.state_update_mask
 #define xkb_state_update_mask _glfw.wl.xkb.state_update_mask
 #define xkb_state_serialize_mods _glfw.wl.xkb.state_serialize_mods
 #define xkb_state_serialize_mods _glfw.wl.xkb.state_serialize_mods
+
+#ifdef HAVE_XKBCOMMON_COMPOSE_H
+typedef struct xkb_compose_table* (* PFN_xkb_compose_table_new_from_locale)(struct xkb_context*, const char*, enum xkb_compose_compile_flags);
+typedef void (* PFN_xkb_compose_table_unref)(struct xkb_compose_table*);
+typedef struct xkb_compose_state* (* PFN_xkb_compose_state_new)(struct xkb_compose_table*, enum xkb_compose_state_flags);
+typedef void (* PFN_xkb_compose_state_unref)(struct xkb_compose_state*);
+typedef enum xkb_compose_feed_result (* PFN_xkb_compose_state_feed)(struct xkb_compose_state*, xkb_keysym_t);
+typedef enum xkb_compose_status (* PFN_xkb_compose_state_get_status)(struct xkb_compose_state*);
+typedef xkb_keysym_t (* PFN_xkb_compose_state_get_one_sym)(struct xkb_compose_state*);
 #define xkb_compose_table_new_from_locale _glfw.wl.xkb.compose_table_new_from_locale
 #define xkb_compose_table_new_from_locale _glfw.wl.xkb.compose_table_new_from_locale
 #define xkb_compose_table_unref _glfw.wl.xkb.compose_table_unref
 #define xkb_compose_table_unref _glfw.wl.xkb.compose_table_unref
 #define xkb_compose_state_new _glfw.wl.xkb.compose_state_new
 #define xkb_compose_state_new _glfw.wl.xkb.compose_state_new
@@ -102,6 +106,7 @@ typedef xkb_keysym_t (* PFN_xkb_compose_state_get_one_sym)(struct xkb_compose_st
 #define xkb_compose_state_feed _glfw.wl.xkb.compose_state_feed
 #define xkb_compose_state_feed _glfw.wl.xkb.compose_state_feed
 #define xkb_compose_state_get_status _glfw.wl.xkb.compose_state_get_status
 #define xkb_compose_state_get_status _glfw.wl.xkb.compose_state_get_status
 #define xkb_compose_state_get_one_sym _glfw.wl.xkb.compose_state_get_one_sym
 #define xkb_compose_state_get_one_sym _glfw.wl.xkb.compose_state_get_one_sym
+#endif
 
 
 
 
 // Wayland-specific per-window data
 // Wayland-specific per-window data
@@ -164,7 +169,11 @@ typedef struct _GLFWlibraryWayland
         struct xkb_context*     context;
         struct xkb_context*     context;
         struct xkb_keymap*      keymap;
         struct xkb_keymap*      keymap;
         struct xkb_state*       state;
         struct xkb_state*       state;
+
+#ifdef HAVE_XKBCOMMON_COMPOSE_H
         struct xkb_compose_state* composeState;
         struct xkb_compose_state* composeState;
+#endif
+
         xkb_mod_mask_t          controlMask;
         xkb_mod_mask_t          controlMask;
         xkb_mod_mask_t          altMask;
         xkb_mod_mask_t          altMask;
         xkb_mod_mask_t          shiftMask;
         xkb_mod_mask_t          shiftMask;
@@ -181,6 +190,8 @@ typedef struct _GLFWlibraryWayland
         PFN_xkb_state_key_get_syms state_key_get_syms;
         PFN_xkb_state_key_get_syms state_key_get_syms;
         PFN_xkb_state_update_mask state_update_mask;
         PFN_xkb_state_update_mask state_update_mask;
         PFN_xkb_state_serialize_mods state_serialize_mods;
         PFN_xkb_state_serialize_mods state_serialize_mods;
+
+#ifdef HAVE_XKBCOMMON_COMPOSE_H
         PFN_xkb_compose_table_new_from_locale compose_table_new_from_locale;
         PFN_xkb_compose_table_new_from_locale compose_table_new_from_locale;
         PFN_xkb_compose_table_unref compose_table_unref;
         PFN_xkb_compose_table_unref compose_table_unref;
         PFN_xkb_compose_state_new compose_state_new;
         PFN_xkb_compose_state_new compose_state_new;
@@ -188,6 +199,7 @@ typedef struct _GLFWlibraryWayland
         PFN_xkb_compose_state_feed compose_state_feed;
         PFN_xkb_compose_state_feed compose_state_feed;
         PFN_xkb_compose_state_get_status compose_state_get_status;
         PFN_xkb_compose_state_get_status compose_state_get_status;
         PFN_xkb_compose_state_get_one_sym compose_state_get_one_sym;
         PFN_xkb_compose_state_get_one_sym compose_state_get_one_sym;
+#endif
     } xkb;
     } xkb;
 
 
     _GLFWwindow*                pointerFocus;
     _GLFWwindow*                pointerFocus;