mirror of
https://github.com/kasmtech/KasmVNC.git
synced 2024-11-26 01:53:11 +01:00
583 lines
18 KiB
Diff
583 lines
18 KiB
Diff
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
|