Skip to content
Permalink
Browse files

linux: Don't crash if fcitx support is requested but unavailable.

Fixes Bugzilla #3642.
  • Loading branch information
icculus committed May 29, 2017
1 parent 29a047d commit b135557df98d477d87f6e4d9bef88d5855327f94
Showing with 24 additions and 9 deletions.
  1. +10 −7 src/core/linux/SDL_fcitx.c
  2. +14 −2 src/core/linux/SDL_ime.c
@@ -188,17 +188,19 @@ 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();
pid_t pid = getpid();
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
@@ -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;
}

0 comments on commit b135557

Please sign in to comment.