Browse Source

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

Fixes Bugzilla #3642.
Ryan C. Gordon 8 years ago
parent
commit
b135557df9
2 changed files with 24 additions and 9 deletions
  1. 10 7
      src/core/linux/SDL_fcitx.c
  2. 14 2
      src/core/linux/SDL_ime.c

+ 10 - 7
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

+ 14 - 2
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;
 }