Initial commit
This commit is contained in:
582
contrib/fltk/13-fltk-1.3.2-im.patch
Normal file
582
contrib/fltk/13-fltk-1.3.2-im.patch
Normal file
@@ -0,0 +1,582 @@
|
||||
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
|
||||
Reference in New Issue
Block a user