From b135557df98d477d87f6e4d9bef88d5855327f94 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Mon, 29 May 2017 02:48:51 -0400 Subject: [PATCH] linux: Don't crash if fcitx support is requested but unavailable. Fixes Bugzilla #3642. --- src/core/linux/SDL_fcitx.c | 17 ++++++++++------- src/core/linux/SDL_ime.c | 16 ++++++++++++++-- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/core/linux/SDL_fcitx.c b/src/core/linux/SDL_fcitx.c index 4cf1631f1..aac098ca9 100644 --- a/src/core/linux/SDL_fcitx.c +++ b/src/core/linux/SDL_fcitx.c @@ -188,7 +188,7 @@ Fcitx_SetCapabilities(void *data, SDL_DBus_CallVoidMethod(client->servicename, client->icname, FCITX_IC_DBUS_INTERFACE, "SetCapacity", DBUS_TYPE_UINT32, &caps, DBUS_TYPE_INVALID); } -static void +static SDL_bool FcitxClientCreateIC(FcitxClient *client) { char *appname = GetAppName(); @@ -196,9 +196,11 @@ FcitxClientCreateIC(FcitxClient *client) int id = -1; Uint32 enable, arg1, arg2, arg3, arg4; - SDL_DBus_CallMethod(client->servicename, FCITX_IM_DBUS_PATH, FCITX_IM_DBUS_INTERFACE, "CreateICv3", - DBUS_TYPE_STRING, &appname, DBUS_TYPE_INT32, &pid, DBUS_TYPE_INVALID, - DBUS_TYPE_INT32, &id, DBUS_TYPE_BOOLEAN, &enable, DBUS_TYPE_UINT32, &arg1, DBUS_TYPE_UINT32, &arg2, DBUS_TYPE_UINT32, &arg3, DBUS_TYPE_UINT32, &arg4, DBUS_TYPE_INVALID); + if (!SDL_DBus_CallMethod(client->servicename, FCITX_IM_DBUS_PATH, FCITX_IM_DBUS_INTERFACE, "CreateICv3", + DBUS_TYPE_STRING, &appname, DBUS_TYPE_INT32, &pid, DBUS_TYPE_INVALID, + DBUS_TYPE_INT32, &id, DBUS_TYPE_BOOLEAN, &enable, DBUS_TYPE_UINT32, &arg1, DBUS_TYPE_UINT32, &arg2, DBUS_TYPE_UINT32, &arg3, DBUS_TYPE_UINT32, &arg4, DBUS_TYPE_INVALID)) { + id = -1; /* just in case. */ + } SDL_free(appname); @@ -218,7 +220,10 @@ FcitxClientCreateIC(FcitxClient *client) dbus->connection_flush(dbus->session_conn); SDL_AddHintCallback(SDL_HINT_IME_INTERNAL_EDITING, &Fcitx_SetCapabilities, client); + return SDL_TRUE; } + + return SDL_FALSE; } static Uint32 @@ -252,9 +257,7 @@ SDL_Fcitx_Init() "%s-%d", FCITX_DBUS_SERVICE, GetDisplayNumber()); - FcitxClientCreateIC(&fcitx_client); - - return SDL_TRUE; + return FcitxClientCreateIC(&fcitx_client); } void diff --git a/src/core/linux/SDL_ime.c b/src/core/linux/SDL_ime.c index 73c876883..eb9cb5734 100644 --- a/src/core/linux/SDL_ime.c +++ b/src/core/linux/SDL_ime.c @@ -87,8 +87,20 @@ SDL_IME_Init(void) { InitIME(); - if (SDL_IME_Init_Real) - return SDL_IME_Init_Real(); + if (SDL_IME_Init_Real) { + if (SDL_IME_Init_Real()) { + return SDL_TRUE; + } + + /* uhoh, the IME implementation's init failed! Disable IME support. */ + SDL_IME_Init_Real = NULL; + SDL_IME_Quit_Real = NULL; + SDL_IME_SetFocus_Real = NULL; + SDL_IME_Reset_Real = NULL; + SDL_IME_ProcessKeyEvent_Real = NULL; + SDL_IME_UpdateTextRect_Real = NULL; + SDL_IME_PumpEvents_Real = NULL; + } return SDL_FALSE; }