Wayland GNOME: Fix for ibus not working when using XWayland
See 8ce25208c3
I dont know what it is with GNOME. Every single release they break
backward compatibility somewhere, somehow. They must have special
talents.
Fixes #5967
This commit is contained in:
parent
78d0cc40a3
commit
a7cbe3776d
@ -46,6 +46,8 @@ Detailed list of changes
|
|||||||
- icat kitten: Fix a regression that broke display of animated GIFs over SSH
|
- icat kitten: Fix a regression that broke display of animated GIFs over SSH
|
||||||
(:iss:`5958`)
|
(:iss:`5958`)
|
||||||
|
|
||||||
|
- Wayland GNOME: Fix for ibus not working when using XWayland (:iss:`5967`)
|
||||||
|
|
||||||
0.27.0 [2023-01-31]
|
0.27.0 [2023-01-31]
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|||||||
30
glfw/ibus_glfw.c
vendored
30
glfw/ibus_glfw.c
vendored
@ -283,29 +283,35 @@ static const char*
|
|||||||
get_ibus_address_file_name(void) {
|
get_ibus_address_file_name(void) {
|
||||||
const char *addr;
|
const char *addr;
|
||||||
static char ans[PATH_MAX];
|
static char ans[PATH_MAX];
|
||||||
|
static char display[64] = {0};
|
||||||
addr = getenv("IBUS_ADDRESS");
|
addr = getenv("IBUS_ADDRESS");
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
if (addr && addr[0]) {
|
if (addr && addr[0]) {
|
||||||
memcpy(ans, addr, GLFW_MIN(strlen(addr), sizeof(ans)));
|
memcpy(ans, addr, GLFW_MIN(strlen(addr), sizeof(ans)));
|
||||||
return ans;
|
return ans;
|
||||||
}
|
}
|
||||||
|
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");
|
const char *de = getenv("DISPLAY");
|
||||||
if (!de || !de[0]) de = ":0.0";
|
if (!de || !de[0]) de = ":0.0";
|
||||||
char *display = _glfw_strdup(de);
|
strncpy(display, de, sizeof(display) - 1);
|
||||||
const char *host = display;
|
char *dnum = strrchr(display, ':');
|
||||||
char *disp_num = strrchr(display, ':');
|
if (!dnum) {
|
||||||
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");
|
_glfwInputError(GLFW_PLATFORM_ERROR, "Could not get IBUS address file name as DISPLAY env var has no colon");
|
||||||
free(display);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
*disp_num = 0;
|
char *screen_num = strrchr(display, '.');
|
||||||
disp_num++;
|
*dnum = 0;
|
||||||
|
dnum++;
|
||||||
if (screen_num) *screen_num = 0;
|
if (screen_num) *screen_num = 0;
|
||||||
if (!*host) host = "unix";
|
if (*display) host = display;
|
||||||
|
disp_num = dnum;
|
||||||
|
}
|
||||||
|
|
||||||
memset(ans, 0, sizeof(ans));
|
memset(ans, 0, sizeof(ans));
|
||||||
const char *conf_env = getenv("XDG_CONFIG_HOME");
|
const char *conf_env = getenv("XDG_CONFIG_HOME");
|
||||||
@ -315,7 +321,6 @@ get_ibus_address_file_name(void) {
|
|||||||
conf_env = getenv("HOME");
|
conf_env = getenv("HOME");
|
||||||
if (!conf_env || !conf_env[0]) {
|
if (!conf_env || !conf_env[0]) {
|
||||||
_glfwInputError(GLFW_PLATFORM_ERROR, "Could not get IBUS address file name as no HOME env var is set");
|
_glfwInputError(GLFW_PLATFORM_ERROR, "Could not get IBUS address file name as no HOME env var is set");
|
||||||
free(display);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
offset = snprintf(ans, sizeof(ans), "%s/.config", conf_env);
|
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();
|
char *key = dbus_get_local_machine_id();
|
||||||
snprintf(ans + offset, sizeof(ans) - offset, "/ibus/bus/%s-%s-%s", key, host, disp_num);
|
snprintf(ans + offset, sizeof(ans) - offset, "/ibus/bus/%s-%s-%s", key, host, disp_num);
|
||||||
dbus_free(key);
|
dbus_free(key);
|
||||||
free(display);
|
|
||||||
return ans;
|
return ans;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user