summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMatthias Melcher <fltk@matthiasm.com>2008-09-11 11:14:06 +0000
committerMatthias Melcher <fltk@matthiasm.com>2008-09-11 11:14:06 +0000
commit483dab9e922a88b7ba591926b976c69e5fc06c18 (patch)
tree24127984798ae85b59138be4b6e83cea36282383 /src
parentcf61ea83a4ad460d4a5014219e6d5c39ee37e571 (diff)
Remove compile-time dependency on Imm32.dll on Win32. I have no MSWindows machine here, so this code is likely to contain one or more typos... . When working, this will take the burdon of linking to imm32 away, so that existing makefiles will need no changes.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@6217 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src')
-rw-r--r--src/Fl_win32.cxx39
1 files changed, 35 insertions, 4 deletions
diff --git a/src/Fl_win32.cxx b/src/Fl_win32.cxx
index 8c6021d70..4a9176b3a 100644
--- a/src/Fl_win32.cxx
+++ b/src/Fl_win32.cxx
@@ -107,6 +107,36 @@ static HMODULE get_wsock_mod() {
return s_wsock_mod;
}
+/*
+ * Dynamic linking of imm32.dll
+ * This library is only needed for a hand full (four ATM) functions relating to
+ * international text rendering and locales. Dynamically loading reduces initial
+ * size and link dependencies.
+ */
+static HMODULE s_imm_module = 0;
+typedef HIMC (WINAPI* flTypeImmGetContext)(HWND);
+static flTypeImmGetContext flImmGetContext = 0;
+typedef BOOL (WINAPI* flTypeImmSetCompositionWindow)(HIMC, LPCOMPOSITIONFORM);
+static flTypeImmSetCompositionWindow flImmSetCompositionWindow = 0;
+typedef BOOL (WINAPI* flTypeImmReleaseContext)(HWND, HIMC);
+static flTypeImmReleaseContext flImmReleaseContext = 0;
+typedef BOOL (WINAPI* flTypeImmIsIME)(HKL);
+static flTypeImmIsIME flImmIsIME = 0;
+
+static HMODULE get_imm_module() {
+ if (!s_imm_module) {
+ s_imm_module = LoadLibrary("IMM32.DLL");
+ if (!s_imm_module)
+ Fl::fatal("FLTK Lib Error: IMM32.DLL file not found!\n\n"
+ "Please check your input method manager library accessibility.");
+ flImmGetContext = (flTypeImmGetContext)GetProcAddress(s_imm_module, "ImmGetContext");
+ flImmSetCompositionWindow = (flTypeImmSetCompositionWindow)GetProcAddress(s_imm_module, "ImmSetCompositionWindow");
+ flImmReleaseContext = (flTypeImmReleaseContext)GetProcAddress(s_imm_module, "ImmReleaseContext");
+ flImmIsIME = (flTypeImmIsIME)GetProcAddress(s_imm_module, "ImmIsIME");
+ }
+ return s_imm_module;
+}
+
//
// USE_TRACK_MOUSE - define it if you have TrackMouseEvent()...
//
@@ -191,7 +221,8 @@ void fl_reset_spot()
void fl_set_spot(int font, int size, int x, int y, int w, int h)
{
- HIMC himc = ImmGetContext(fl_msg.hwnd);
+ get_imm_module();
+ HIMC himc = flImmGetContext(fl_msg.hwnd);
if (himc) {
Fl_Window* w = fl_find(fl_msg.hwnd);
@@ -202,9 +233,9 @@ void fl_set_spot(int font, int size, int x, int y, int w, int h)
cfs.ptCurrentPos.x = x;
cfs.ptCurrentPos.y = y - w->labelsize();
MapWindowPoints(fl_msg.hwnd, fl_xid(w), &cfs.ptCurrentPos, 1);
- ImmSetCompositionWindow(himc, &cfs);
+ flImmSetCompositionWindow(himc, &cfs);
- ImmReleaseContext(fl_msg.hwnd, himc);
+ flImmReleaseContext(fl_msg.hwnd, himc);
}
}
@@ -558,7 +589,7 @@ void fl_get_codepage()
fl_codepage = ccp;
if (fl_aimm) {
fl_aimm->GetCodePageA(GetKeyboardLayout(0), &fl_codepage);
- } else if (ImmIsIME(hkl)) {
+ } else if (get_imm_module() && flImmIsIME(hkl)) {
fl_is_ime = 1;
}
}