diff options
Diffstat (limited to 'contrib/fltk/13-fltk-1.3.2-im.patch')
-rw-r--r-- | contrib/fltk/13-fltk-1.3.2-im.patch | 582 |
1 files changed, 0 insertions, 582 deletions
diff --git a/contrib/fltk/13-fltk-1.3.2-im.patch b/contrib/fltk/13-fltk-1.3.2-im.patch deleted file mode 100644 index efacc42b..00000000 --- a/contrib/fltk/13-fltk-1.3.2-im.patch +++ /dev/null @@ -1,582 +0,0 @@ -diff -up fltk-1.3.2/FL/Fl.H.im fltk-1.3.2/FL/Fl.H ---- fltk-1.3.2/FL/Fl.H.im 2014-09-10 14:40:05.193265424 +0200 -+++ fltk-1.3.2/FL/Fl.H 2014-09-10 14:40:05.196265471 +0200 -@@ -699,6 +699,17 @@ public: - static int event_inside(const Fl_Widget*); - static int test_shortcut(Fl_Shortcut); - -+ /** -+ Enables the system input methods facilities. This is the default. -+ \see disable_im() -+ */ -+ static void enable_im(); -+ /** -+ Disables the system input methods facilities. -+ \see enable_im() -+ */ -+ static void disable_im(); -+ - // event destinations: - static int handle(int, Fl_Window*); - static int handle_(int, Fl_Window*); -diff -up fltk-1.3.2/FL/win32.H.im fltk-1.3.2/FL/win32.H ---- fltk-1.3.2/FL/win32.H.im 2014-09-10 14:40:05.186265315 +0200 -+++ fltk-1.3.2/FL/win32.H 2014-09-10 14:40:05.196265471 +0200 -@@ -102,6 +102,8 @@ extern FL_EXPORT void fl_save_dc( HWND w - - inline Window fl_xid(const Fl_Window* w) { Fl_X *temp = Fl_X::i(w); return temp ? temp->xid : 0; } - -+extern FL_EXPORT void fl_open_display(); -+ - #else - FL_EXPORT Window fl_xid_(const Fl_Window* w); - #define fl_xid(w) fl_xid_(w) -diff -up fltk-1.3.2/src/Fl_cocoa.mm.im fltk-1.3.2/src/Fl_cocoa.mm ---- fltk-1.3.2/src/Fl_cocoa.mm.im 2014-09-10 14:40:05.193265424 +0200 -+++ fltk-1.3.2/src/Fl_cocoa.mm 2014-09-10 14:43:41.103642243 +0200 -@@ -88,6 +88,7 @@ static void createAppleMenu(void); - static Fl_Region MacRegionMinusRect(Fl_Region r, int x,int y,int w,int h); - static void cocoaMouseHandler(NSEvent *theEvent); - static int calc_mac_os_version(); -+static void im_update(void); - - static Fl_Quartz_Graphics_Driver fl_quartz_driver; - static Fl_Display_Device fl_quartz_display(&fl_quartz_driver); -@@ -108,6 +109,30 @@ int fl_mac_os_version = calc_mac_os_vers - static int got_events = 0; - static Fl_Window* resize_from_system; - static int main_screen_height; // height of menubar-containing screen used to convert between Cocoa and FLTK global screen coordinates -+static int im_enabled = -1; -+ -+// Carbon functions and definitions -+ -+typedef void *TSMDocumentID; -+ -+extern "C" enum { -+ kTSMDocumentEnabledInputSourcesPropertyTag = 'enis' // from Carbon/TextServices.h -+}; -+ -+// Undocumented voodoo. Taken from Mozilla. -+static const int smEnableRomanKybdsOnly = -23; -+ -+typedef TSMDocumentID (*TSMGetActiveDocument_type)(void); -+static TSMGetActiveDocument_type TSMGetActiveDocument; -+typedef OSStatus (*TSMSetDocumentProperty_type)(TSMDocumentID, OSType, UInt32, void*); -+static TSMSetDocumentProperty_type TSMSetDocumentProperty; -+typedef OSStatus (*TSMRemoveDocumentProperty_type)(TSMDocumentID, OSType); -+static TSMRemoveDocumentProperty_type TSMRemoveDocumentProperty; -+typedef CFArrayRef (*TISCreateASCIICapableInputSourceList_type)(void); -+static TISCreateASCIICapableInputSourceList_type TISCreateASCIICapableInputSourceList; -+ -+typedef void (*KeyScript_type)(short); -+static KeyScript_type KeyScript; - - #if CONSOLIDATE_MOTION - static Fl_Window* send_motion; -@@ -978,6 +1003,7 @@ void fl_open_callback(void (*cb)(const c - #endif - { - BOOL seen_open_file; -+ TSMDocumentID currentDoc; - } - - (void)windowDidMove:(NSNotification *)notif; - - (void)windowDidResize:(NSNotification *)notif; -@@ -991,6 +1017,7 @@ void fl_open_callback(void (*cb)(const c - - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication*)sender; - - (void)applicationDidBecomeActive:(NSNotification *)notify; - - (void)applicationDidChangeScreenParameters:(NSNotification *)aNotification; -+- (void)applicationDidUpdate:(NSNotification *)aNotification; - - (void)applicationWillResignActive:(NSNotification *)notify; - - (void)applicationWillHide:(NSNotification *)notify; - - (void)applicationWillUnhide:(NSNotification *)notify; -@@ -1175,6 +1202,23 @@ void fl_open_callback(void (*cb)(const c - } - Fl::handle(FL_SCREEN_CONFIGURATION_CHANGED, NULL); - } -+- (void)applicationDidUpdate:(NSNotification *)aNotification -+{ -+ if ((fl_mac_os_version >= 100500) && (im_enabled != -1) && -+ (TSMGetActiveDocument != NULL)) { -+ TSMDocumentID newDoc; -+ // It is extremely unclear when Cocoa decides to create/update -+ // the input context, but debugging reveals that it is done -+ // by NSApplication:updateWindows. So check if the input context -+ // has shifted after each such run so that we can update our -+ // input methods status. -+ newDoc = TSMGetActiveDocument(); -+ if (newDoc != currentDoc) { -+ im_update(); -+ currentDoc = newDoc; -+ } -+ } -+} - - (void)applicationWillResignActive:(NSNotification *)notify - { - fl_lock_function(); -@@ -1322,6 +1365,13 @@ void fl_open_display() { - static char beenHereDoneThat = 0; - if ( !beenHereDoneThat ) { - beenHereDoneThat = 1; -+ -+ TSMGetActiveDocument = (TSMGetActiveDocument_type)Fl_X::get_carbon_function("TSMGetActiveDocument"); -+ TSMSetDocumentProperty = (TSMSetDocumentProperty_type)Fl_X::get_carbon_function("TSMSetDocumentProperty"); -+ TSMRemoveDocumentProperty = (TSMRemoveDocumentProperty_type)Fl_X::get_carbon_function("TSMRemoveDocumentProperty"); -+ TISCreateASCIICapableInputSourceList = (TISCreateASCIICapableInputSourceList_type)Fl_X::get_carbon_function("TISCreateASCIICapableInputSourceList"); -+ -+ KeyScript = (KeyScript_type)Fl_X::get_carbon_function("KeyScript"); - - BOOL need_new_nsapp = (NSApp == nil); - if (need_new_nsapp) [NSApplication sharedApplication]; -@@ -1390,6 +1440,66 @@ void fl_open_display() { - void fl_close_display() { - } - -+// Force a "Roman" or "ASCII" keyboard, which both the Mozilla and -+// Safari people seem to think implies turning off advanced IME stuff -+// (see nsTSMManager::SyncKeyScript in Mozilla and enableSecureTextInput -+// in Safari/Webcore). Should be good enough for us then... -+ -+static void im_update(void) { -+ if (fl_mac_os_version >= 100500) { -+ TSMDocumentID doc; -+ -+ if ((TSMGetActiveDocument == NULL) || -+ (TSMSetDocumentProperty == NULL) || -+ (TSMRemoveDocumentProperty == NULL) || -+ (TISCreateASCIICapableInputSourceList == NULL)) -+ return; -+ -+ doc = TSMGetActiveDocument(); -+ -+ if (im_enabled) -+ TSMRemoveDocumentProperty(doc, kTSMDocumentEnabledInputSourcesPropertyTag); -+ else { -+ CFArrayRef inputSources; -+ -+ inputSources = TISCreateASCIICapableInputSourceList(); -+ TSMSetDocumentProperty(doc, kTSMDocumentEnabledInputSourcesPropertyTag, -+ sizeof(CFArrayRef), &inputSources); -+ CFRelease(inputSources); -+ } -+ } else { -+ if (KeyScript == NULL) -+ return; -+ -+ if (im_enabled) -+ KeyScript(smKeyEnableKybds); -+ else -+ KeyScript(smEnableRomanKybdsOnly); -+ } -+} -+ -+void Fl::enable_im() { -+ fl_open_display(); -+ -+ im_enabled = 1; -+ -+ if (fl_mac_os_version >= 100500) -+ [NSApp updateWindows]; -+ else -+ im_update(); -+} -+ -+void Fl::disable_im() { -+ fl_open_display(); -+ -+ im_enabled = 0; -+ -+ if (fl_mac_os_version >= 100500) -+ [NSApp updateWindows]; -+ else -+ im_update(); -+} -+ - - // Gets the border sizes and the titlebar size - static void get_window_frame_sizes(int &bx, int &by, int &bt) { -diff -up fltk-1.3.2/src/Fl.cxx.im fltk-1.3.2/src/Fl.cxx ---- fltk-1.3.2/src/Fl.cxx.im 2014-09-10 14:40:05.194265440 +0200 -+++ fltk-1.3.2/src/Fl.cxx 2014-09-10 14:40:05.197265486 +0200 -@@ -593,45 +593,6 @@ int Fl::run() { - return 0; - } - --#ifdef WIN32 -- --// Function to initialize COM/OLE for usage. This must be done only once. --// We define a flag to register whether we called it: --static char oleInitialized = 0; -- --// This calls the Windows function OleInitialize() exactly once. --void fl_OleInitialize() { -- if (!oleInitialized) { -- OleInitialize(0L); -- oleInitialized = 1; -- } --} -- --// This calls the Windows function OleUninitialize() only, if --// OleInitialize has been called before. --void fl_OleUninitialize() { -- if (oleInitialized) { -- OleUninitialize(); -- oleInitialized = 0; -- } --} -- --class Fl_Win32_At_Exit { --public: -- Fl_Win32_At_Exit() { } -- ~Fl_Win32_At_Exit() { -- fl_free_fonts(); // do some WIN32 cleanup -- fl_cleanup_pens(); -- fl_OleUninitialize(); -- fl_brush_action(1); -- fl_cleanup_dc_list(); -- } --}; --static Fl_Win32_At_Exit win32_at_exit; --#endif -- -- -- - /** - Waits until "something happens" and then returns. Call this - repeatedly to "run" your program. You can also check what happened -diff -up fltk-1.3.2/src/Fl_Native_File_Chooser_WIN32.cxx.im fltk-1.3.2/src/Fl_Native_File_Chooser_WIN32.cxx ---- fltk-1.3.2/src/Fl_Native_File_Chooser_WIN32.cxx.im 2012-06-26 09:03:46.000000000 +0200 -+++ fltk-1.3.2/src/Fl_Native_File_Chooser_WIN32.cxx 2014-09-10 14:40:05.197265486 +0200 -@@ -34,6 +34,7 @@ LPCWSTR utf8towchar(const char *in); //M - char *wchartoutf8(LPCWSTR in); //MG - - #include <FL/Fl_Native_File_Chooser.H> -+#include <FL/x.H> - - #define LCURLY_CHR '{' - #define RCURLY_CHR '}' -@@ -41,8 +42,6 @@ char *wchartoutf8(LPCWSTR in); //MG - #define RBRACKET_CHR ']' - #define MAXFILTERS 80 - --void fl_OleInitialize(); // in Fl.cxx (Windows only) -- - // STATIC: PRINT WINDOWS 'DOUBLE NULL' STRING (DEBUG) - #ifdef DEBUG - static void dnullprint(char *wp) { -@@ -471,7 +470,7 @@ int CALLBACK Fl_Native_File_Chooser::Dir - // SHOW DIRECTORY BROWSER - int Fl_Native_File_Chooser::showdir() { - // initialize OLE only once -- fl_OleInitialize(); // init needed by BIF_USENEWUI -+ fl_open_display(); // init needed by BIF_USENEWUI - ClearBINF(); - clear_pathnames(); - // PARENT WINDOW -diff -up fltk-1.3.2/src/Fl_win32.cxx.im fltk-1.3.2/src/Fl_win32.cxx ---- fltk-1.3.2/src/Fl_win32.cxx.im 2014-09-10 14:40:05.194265440 +0200 -+++ fltk-1.3.2/src/Fl_win32.cxx 2014-09-10 14:40:05.197265486 +0200 -@@ -60,8 +60,6 @@ - #include <ole2.h> - #include <shellapi.h> - --#include "aimm.h" -- - // - // USE_ASYNC_SELECT - define it if you have WSAAsyncSelect()... - // USE_ASYNC_SELECT is OBSOLETED in 1.3 for the following reasons: -@@ -121,27 +119,24 @@ static HMODULE get_wsock_mod() { - * size and link dependencies. - */ - static HMODULE s_imm_module = 0; -+typedef BOOL (WINAPI* flTypeImmAssociateContextEx)(HWND, HIMC, DWORD); -+static flTypeImmAssociateContextEx flImmAssociateContextEx = 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; -+static void get_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."); -+ flImmAssociateContextEx = (flTypeImmAssociateContextEx)GetProcAddress(s_imm_module, "ImmAssociateContextEx"); -+ flImmGetContext = (flTypeImmGetContext)GetProcAddress(s_imm_module, "ImmGetContext"); -+ flImmSetCompositionWindow = (flTypeImmSetCompositionWindow)GetProcAddress(s_imm_module, "ImmSetCompositionWindow"); -+ flImmReleaseContext = (flTypeImmReleaseContext)GetProcAddress(s_imm_module, "ImmReleaseContext"); - } - - // USE_TRACK_MOUSE - define NO_TRACK_MOUSE if you don't have -@@ -259,7 +254,9 @@ void fl_set_spot(int font, int size, int - Fl_Window* tw = win; - while (tw->parent()) tw = tw->window(); // find top level window - -- get_imm_module(); -+ if (!tw->shown()) -+ return; -+ - HIMC himc = flImmGetContext(fl_xid(tw)); - - if (himc) { -@@ -338,7 +335,6 @@ void* Fl::thread_message() { - - extern int fl_send_system_handlers(void *e); - --IActiveIMMApp *fl_aimm = NULL; - MSG fl_msg; - - // This is never called with time_to_wait < 0.0. -@@ -441,6 +437,58 @@ int fl_ready() { - return get_wsock_mod() ? s_wsock_select(0,&fdt[0],&fdt[1],&fdt[2],&t) : 0; - } - -+void fl_open_display() { -+ static char beenHereDoneThat = 0; -+ -+ if (beenHereDoneThat) -+ return; -+ -+ beenHereDoneThat = 1; -+ -+ OleInitialize(0L); -+ -+ get_imm_module(); -+} -+ -+class Fl_Win32_At_Exit { -+public: -+ Fl_Win32_At_Exit() { } -+ ~Fl_Win32_At_Exit() { -+ fl_free_fonts(); // do some WIN32 cleanup -+ fl_cleanup_pens(); -+ OleUninitialize(); -+ fl_brush_action(1); -+ fl_cleanup_dc_list(); -+ } -+}; -+static Fl_Win32_At_Exit win32_at_exit; -+ -+static char im_enabled = 1; -+ -+void Fl::enable_im() { -+ fl_open_display(); -+ -+ Fl_X* i = Fl_X::first; -+ while (i) { -+ flImmAssociateContextEx(i->xid, 0, IACE_DEFAULT); -+ i = i->next; -+ } -+ -+ im_enabled = 1; -+} -+ -+void Fl::disable_im() { -+ fl_open_display(); -+ -+ Fl_X* i = Fl_X::first; -+ while (i) { -+ flImmAssociateContextEx(i->xid, 0, 0); -+ i = i->next; -+ } -+ -+ im_enabled = 0; -+} -+ - //////////////////////////////////////////////////////////////// - - int Fl::x() -@@ -683,7 +731,6 @@ void fl_clipboard_notify_untarget(HWND w - } - - //////////////////////////////////////////////////////////////// --char fl_is_ime = 0; - void fl_get_codepage() - { - HKL hkl = GetKeyboardLayout(0); -@@ -691,14 +738,8 @@ void fl_get_codepage() - - GetLocaleInfo (LOWORD(hkl), LOCALE_IDEFAULTANSICODEPAGE, ld, 6); - DWORD ccp = atol(ld); -- fl_is_ime = 0; - - fl_codepage = ccp; -- if (fl_aimm) { -- fl_aimm->GetCodePageA(GetKeyboardLayout(0), &fl_codepage); -- } else if (get_imm_module() && flImmIsIME(hkl)) { -- fl_is_ime = 1; -- } - } - - HWND fl_capture; -@@ -1564,6 +1605,8 @@ int fl_disable_transient_for; // secret - Fl_X* Fl_X::make(Fl_Window* w) { - Fl_Group::current(0); // get rid of very common user bug: forgot end() - -+ fl_open_display(); -+ - // if the window is a subwindow and our parent is not mapped yet, we - // mark this window visible, so that mapping the parent at a later - // point in time will call this function again to finally map the subwindow. -@@ -1767,16 +1810,10 @@ Fl_X* Fl_X::make(Fl_Window* w) { - (Fl::grab() || (styleEx & WS_EX_TOOLWINDOW)) ? SW_SHOWNOACTIVATE : SW_SHOWNORMAL); - - // Register all windows for potential drag'n'drop operations -- fl_OleInitialize(); - RegisterDragDrop(x->xid, flIDropTarget); - -- if (!fl_aimm) { -- CoCreateInstance(CLSID_CActiveIMM, NULL, CLSCTX_INPROC_SERVER, -- IID_IActiveIMMApp, (void**) &fl_aimm); -- if (fl_aimm) { -- fl_aimm->Activate(TRUE); -- } -- } -+ if (!im_enabled) -+ flImmAssociateContextEx(x->xid, 0, 0); - - return x; - } -diff -up fltk-1.3.2/src/Fl_x.cxx.im fltk-1.3.2/src/Fl_x.cxx ---- fltk-1.3.2/src/Fl_x.cxx.im 2014-09-10 14:40:05.194265440 +0200 -+++ fltk-1.3.2/src/Fl_x.cxx 2014-09-10 14:40:05.198265502 +0200 -@@ -313,6 +313,7 @@ XVisualInfo *fl_visual; - Colormap fl_colormap; - XIM fl_xim_im = 0; - XIC fl_xim_ic = 0; -+Window fl_xim_win = 0; - char fl_is_over_the_spot = 0; - static XRectangle status_area; - -@@ -603,6 +604,55 @@ void fl_init_xim() { - if(xim_styles) XFree(xim_styles); - } - -+void fl_xim_deactivate(void); -+ -+void fl_xim_activate(Window xid) { -+ if (!fl_xim_im) -+ return; -+ -+ // If the focused window has changed, then use the brute force method -+ // of completely recreating the input context. -+ if (fl_xim_win != xid) { -+ fl_xim_deactivate(); -+ -+ fl_new_ic(); -+ fl_xim_win = xid; -+ -+ XSetICValues(fl_xim_ic, -+ XNFocusWindow, fl_xim_win, -+ XNClientWindow, fl_xim_win, -+ NULL); -+ } -+ -+ fl_set_spot(spotf, spots, spot.x, spot.y, spot.width, spot.height); -+} -+ -+void fl_xim_deactivate(void) { -+ if (!fl_xim_ic) -+ return; -+ -+ XDestroyIC(fl_xim_ic); -+ fl_xim_ic = NULL; -+ -+ fl_xim_win = 0; -+} -+ -+void Fl::enable_im() { -+ Fl_Window *win; -+ -+ win = Fl::first_window(); -+ if (win && win->shown()) { -+ fl_xim_activate(fl_xid(win)); -+ XSetICFocus(fl_xim_ic); -+ } else { -+ fl_new_ic(); -+ } -+} -+ -+void Fl::disable_im() { -+ fl_xim_deactivate(); -+} -+ - void fl_open_display() { - if (fl_display) return; - -@@ -1053,10 +1103,9 @@ int fl_handle(const XEvent& thisevent) - XEvent xevent = thisevent; - fl_xevent = &thisevent; - Window xid = xevent.xany.window; -- static Window xim_win = 0; - - if (fl_xim_ic && xevent.type == DestroyNotify && -- xid != xim_win && !fl_find(xid)) -+ xid != fl_xim_win && !fl_find(xid)) - { - XIM xim_im; - xim_im = XOpenIM(fl_display, NULL, NULL, NULL); -@@ -1072,46 +1121,9 @@ int fl_handle(const XEvent& thisevent) - } - - if (fl_xim_ic && (xevent.type == FocusIn)) -- { --#define POOR_XIM --#ifdef POOR_XIM -- if (xim_win != xid) -- { -- xim_win = xid; -- XDestroyIC(fl_xim_ic); -- fl_xim_ic = NULL; -- fl_new_ic(); -- XSetICValues(fl_xim_ic, -- XNFocusWindow, xevent.xclient.window, -- XNClientWindow, xid, -- NULL); -- } -- fl_set_spot(spotf, spots, spot.x, spot.y, spot.width, spot.height); --#else -- if (Fl::first_window() && Fl::first_window()->modal()) { -- Window x = fl_xid(Fl::first_window()); -- if (x != xim_win) { -- xim_win = x; -- XSetICValues(fl_xim_ic, -- XNFocusWindow, xim_win, -- XNClientWindow, xim_win, -- NULL); -- fl_set_spot(spotf, spots, spot.x, spot.y, spot.width, spot.height); -- } -- } else if (xim_win != xid && xid) { -- xim_win = xid; -- XSetICValues(fl_xim_ic, -- XNFocusWindow, xevent.xclient.window, -- XNClientWindow, xid, -- //XNFocusWindow, xim_win, -- //XNClientWindow, xim_win, -- NULL); -- fl_set_spot(spotf, spots, spot.x, spot.y, spot.width, spot.height); -- } --#endif -- } -+ fl_xim_activate(xid); - -- if ( XFilterEvent((XEvent *)&xevent, 0) ) -+ if (fl_xim_ic && XFilterEvent((XEvent *)&xevent, 0)) - return(1); - - #if USE_XRANDR |