diff --git a/src/thbrk/Makefile.am b/src/thbrk/Makefile.am index b528c34..476fbf1 100644 --- a/src/thbrk/Makefile.am +++ b/src/thbrk/Makefile.am @@ -19,5 +19,5 @@ libthbrk_la_SOURCES = \ brk-maximal.h \ $(NULL) -libthbrk_la_LIBADD = $(DATRIE_LIBS) +libthbrk_la_LIBADD = -lshlwapi $(DATRIE_LIBS) diff --git a/src/thbrk/brk-common.c b/src/thbrk/brk-common.c index fedb1bf..4f80bca 100644 --- a/src/thbrk/brk-common.c +++ b/src/thbrk/brk-common.c @@ -35,6 +35,49 @@ #define DICT_NAME "thbrk" +#ifdef _WIN32 +#define WIN32_LEAN_AND_MEAN +#include +#include +static HMODULE libthai_dll; + +BOOL WINAPI +DllMain (HINSTANCE hinstDLL, + DWORD fdwReason, + LPVOID lpvReserved) +{ + switch (fdwReason) { + case DLL_PROCESS_ATTACH: + libthai_dll = (HMODULE) hinstDLL; + break; + } + + return TRUE; +} + +static BOOL _getWinDictPath(wchar_t *out, int size) { + /* returns TRUE on success, FALSE on error */ + + BOOL status; + if (GetModuleFileNameW (libthai_dll, out, MAX_PATH) == 0) + return FALSE; + PathRemoveFileSpecW (out); + /* Assume the DLL is in /bin */ + PathRemoveFileSpecW (out); + status = PathAppendW (out, L"share"); + if (status != TRUE) + return FALSE; + status = PathAppendW (out, L"libthai"); + if (status != TRUE) + return FALSE; + status = PathAppendW (out, L"thbrk.tri"); + if (status != TRUE) + return FALSE; + + return TRUE; +} +#endif + static char * full_path (const char *path, const char *name, const char *ext) { @@ -58,10 +101,25 @@ brk_load_default_dict () free (path); } +#ifdef _WIN32 + if (!dict_trie) { + wchar_t dict_path[MAX_PATH]; + FILE *trie_file; + + if (_getWinDictPath (dict_path, MAX_PATH) == TRUE) { + trie_file = _wfopen (dict_path, L"rb"); + if (trie_file != NULL) { + dict_trie = trie_fread (trie_file); + fclose (trie_file); + } + } + } +#else /* Then, fall back to default DICT_DIR macro */ if (!dict_trie) { dict_trie = trie_new_from_file (DICT_DIR "/" DICT_NAME ".tri"); } +#endif return dict_trie; }