| 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 <windows.h> |
| +#include <shlwapi.h> |
| +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; |
| } |