summaryrefslogtreecommitdiff
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
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
-rw-r--r--src/Fl_win32.cxx39
-rw-r--r--test/dnd-test.cxx75
2 files changed, 35 insertions, 79 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;
}
}
diff --git a/test/dnd-test.cxx b/test/dnd-test.cxx
deleted file mode 100644
index f19873300..000000000
--- a/test/dnd-test.cxx
+++ /dev/null
@@ -1,75 +0,0 @@
-/* Drag and Drop test demo. */
-#include <stdio.h>
-#include <FL/Fl.H>
-#include <FL/Fl_Window.H>
-#include <FL/Fl_Box.H>
-
-static Fl_Window *win_a;
-static Fl_Window *win_b;
-
-class Sender : public Fl_Box {
-public:
- Sender(int x,int y,int w,int h) : Fl_Box(x,y,w,h) { }
-
- int handle(int event) {
- int ret = Fl_Box::handle(event);
- switch ( event ) {
- case FL_PUSH:
- Fl::copy("message",7,0);
- Fl::dnd();
- return(1);
- }
- return(ret);
- }
-};
-
-class Receiver : public Fl_Box {
-public:
- Receiver(int x,int y,int w,int h) : Fl_Box(x,y,w,h) { }
-
- int handle(int event) {
- int ret = Fl_Box::handle(event);
- switch ( event ) {
- case FL_DND_ENTER:
- case FL_DND_DRAG:
- case FL_DND_RELEASE:
- return(1);
- case FL_PASTE:
- label(Fl::event_text());
- fprintf(stderr, "PASTE: %s\n", Fl::event_text());
- fflush(stderr);
- return(1);
- }
- return(ret);
- }
-};
-//
-// Demonstrate DND (drag+drop) from red sender to green receiver
-//
-
-static Sender *Tx;
-static Receiver *Rx;
-
-int main(int argc, char **argv) {
- win_a = new Fl_Window(40, 40, 200,100);
- win_a->begin();
- Tx = new Sender(5,5,90,90);
- Tx->box(FL_UP_BOX);
- Tx->label("Drag from here");
- Tx->align(FL_ALIGN_WRAP);
- Tx->color(FL_RED);
- win_a->end();
- win_a->show(argc, argv);
-
- win_b = new Fl_Window (350, 40, 200,100,"Receiver");
- win_b->begin();
- Rx = new Receiver(105,5,90,90);
- Rx->box(FL_FLAT_BOX);
- Rx->label("to here");
- Rx->color(FL_GREEN);
- win_b->end();
- win_b->show();
-
- return Fl::run();
-}
-/* End of File */