From a7cbe3776d88adab5707e018fe5ee33373e8bd8d Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 2 Feb 2023 10:21:37 +0530 Subject: [PATCH] Wayland GNOME: Fix for ibus not working when using XWayland See https://github.com/ibus/ibus/commit/8ce25208c3f4adfd290a032c6aa739d2b7580eb1 I dont know what it is with GNOME. Every single release they break backward compatibility somewhere, somehow. They must have special talents. Fixes #5967 --- docs/changelog.rst | 2 ++ glfw/ibus_glfw.c | 40 ++++++++++++++++++++++------------------ 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index cd8dcec8b..dadb2fefc 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -46,6 +46,8 @@ Detailed list of changes - icat kitten: Fix a regression that broke display of animated GIFs over SSH (:iss:`5958`) +- Wayland GNOME: Fix for ibus not working when using XWayland (:iss:`5967`) + 0.27.0 [2023-01-31] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/glfw/ibus_glfw.c b/glfw/ibus_glfw.c index 9342508db..f4c77bdd6 100644 --- a/glfw/ibus_glfw.c +++ b/glfw/ibus_glfw.c @@ -283,29 +283,35 @@ static const char* get_ibus_address_file_name(void) { const char *addr; static char ans[PATH_MAX]; + static char display[64] = {0}; addr = getenv("IBUS_ADDRESS"); int offset = 0; if (addr && addr[0]) { memcpy(ans, addr, GLFW_MIN(strlen(addr), sizeof(ans))); return ans; } - - const char *de = getenv("DISPLAY"); - if (!de || !de[0]) de = ":0.0"; - char *display = _glfw_strdup(de); - const char *host = display; - char *disp_num = strrchr(display, ':'); - char *screen_num = strrchr(display, '.'); - - if (!disp_num) { - _glfwInputError(GLFW_PLATFORM_ERROR, "Could not get IBUS address file name as DISPLAY env var has no colon"); - free(display); - return NULL; + const char* disp_num = NULL; + const char *host = "unix"; + // See https://github.com/ibus/ibus/commit/8ce25208c3f4adfd290a032c6aa739d2b7580eb1 for why we need this dance. + const char *de = getenv("WAYLAND_DISPLAY"); + if (de) { + disp_num = de; + } else { + const char *de = getenv("DISPLAY"); + if (!de || !de[0]) de = ":0.0"; + strncpy(display, de, sizeof(display) - 1); + char *dnum = strrchr(display, ':'); + if (!dnum) { + _glfwInputError(GLFW_PLATFORM_ERROR, "Could not get IBUS address file name as DISPLAY env var has no colon"); + return NULL; + } + char *screen_num = strrchr(display, '.'); + *dnum = 0; + dnum++; + if (screen_num) *screen_num = 0; + if (*display) host = display; + disp_num = dnum; } - *disp_num = 0; - disp_num++; - if (screen_num) *screen_num = 0; - if (!*host) host = "unix"; memset(ans, 0, sizeof(ans)); const char *conf_env = getenv("XDG_CONFIG_HOME"); @@ -315,7 +321,6 @@ get_ibus_address_file_name(void) { conf_env = getenv("HOME"); if (!conf_env || !conf_env[0]) { _glfwInputError(GLFW_PLATFORM_ERROR, "Could not get IBUS address file name as no HOME env var is set"); - free(display); return NULL; } offset = snprintf(ans, sizeof(ans), "%s/.config", conf_env); @@ -323,7 +328,6 @@ get_ibus_address_file_name(void) { char *key = dbus_get_local_machine_id(); snprintf(ans + offset, sizeof(ans) - offset, "/ibus/bus/%s-%s-%s", key, host, disp_num); dbus_free(key); - free(display); return ans; }