From 64ff1ca14f595d0eb7f6b1b47facf5f4147eae51 Mon Sep 17 00:00:00 2001 From: Pierre Ossman Date: Thu, 11 Sep 2014 10:48:29 +0200 Subject: [PATCH] Update FLTK patches based on feeback from upstream --- CMakeLists.txt | 2 +- contrib/fltk/12-fltk-1.3.2-xhandlers.patch | 82 ++++---- contrib/fltk/13-fltk-1.3.2-im.patch | 210 ++++++++++++++++----- vncviewer/Viewport.cxx | 30 +-- vncviewer/Viewport.h | 2 +- 5 files changed, 229 insertions(+), 97 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a3e0931a..5f4ccd48 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -301,7 +301,7 @@ if(FLTK_FOUND) check_cxx_source_compiles("#include \nint main(int c, char** v) { void (Fl_Window::*foo)(int,int,int,int) = &Fl_Window::fullscreen_screens; return 0; }" HAVE_FLTK_FULLSCREEN_SCREENS) # FLTK STR #xxxx - check_cxx_source_compiles("#include \nint main(int c, char** v) { Fl::add_xhandler(NULL, NULL); return 0; }" HAVE_FLTK_XHANDLERS) + check_cxx_source_compiles("#include \nint main(int c, char** v) { Fl::add_system_handler(NULL, NULL); return 0; }" HAVE_FLTK_XHANDLERS) # FLTK STR #xxxx check_cxx_source_compiles("#include \nint main(int c, char** v) { Fl::disable_im(); return 0; }" HAVE_FLTK_IM) diff --git a/contrib/fltk/12-fltk-1.3.2-xhandlers.patch b/contrib/fltk/12-fltk-1.3.2-xhandlers.patch index cf6cefbf..0ac3fe4b 100644 --- a/contrib/fltk/12-fltk-1.3.2-xhandlers.patch +++ b/contrib/fltk/12-fltk-1.3.2-xhandlers.patch @@ -5,8 +5,8 @@ diff -up fltk-1.3.2/FL/Fl.H.xhandlers fltk-1.3.2/FL/Fl.H /** Signature of add_handler functions passed as parameters */ typedef int (*Fl_Event_Handler)(int event); -+/** Signature of add_xhandler functions passed as parameters */ -+typedef bool (*Fl_XEvent_Handler)(void *event, void *data); ++/** Signature of add_system_handler functions passed as parameters */ ++typedef int (*Fl_System_Handler)(void *event, void *data); + /** Signature of set_abort functions passed as parameters */ typedef void (*Fl_Abort_Handler)(const char *format,...); @@ -15,8 +15,8 @@ diff -up fltk-1.3.2/FL/Fl.H.xhandlers fltk-1.3.2/FL/Fl.H static void focus(Fl_Widget*); static void add_handler(Fl_Event_Handler h); static void remove_handler(Fl_Event_Handler h); -+ static void add_xhandler(Fl_XEvent_Handler h, void *data); -+ static void remove_xhandler(Fl_XEvent_Handler h); ++ static void add_system_handler(Fl_System_Handler h, void *data); ++ static void remove_system_handler(Fl_System_Handler h); static void event_dispatch(Fl_Event_Dispatch d); static Fl_Event_Dispatch event_dispatch(); /** @} */ @@ -27,7 +27,7 @@ diff -up fltk-1.3.2/src/Fl_cocoa.mm.xhandlers fltk-1.3.2/src/Fl_cocoa.mm } @end -+extern bool fl_send_xhandlers(void *e); ++extern int fl_send_system_handlers(void *e); + static void clipboard_check(void); @@ -37,7 +37,7 @@ diff -up fltk-1.3.2/src/Fl_cocoa.mm.xhandlers fltk-1.3.2/src/Fl_cocoa.mm // update clipboard status clipboard_check(); + -+ if (fl_send_xhandlers(theEvent)) ++ if (fl_send_system_handlers(theEvent)) + return; + NSEventType type = [theEvent type]; @@ -46,7 +46,7 @@ diff -up fltk-1.3.2/src/Fl_cocoa.mm.xhandlers fltk-1.3.2/src/Fl_cocoa.mm diff -up fltk-1.3.2/src/Fl.cxx.xhandlers fltk-1.3.2/src/Fl.cxx --- fltk-1.3.2/src/Fl.cxx.xhandlers 2014-07-22 15:23:18.085334432 +0200 +++ fltk-1.3.2/src/Fl.cxx 2014-07-22 15:23:18.095334607 +0200 -@@ -891,6 +891,67 @@ static int send_handlers(int e) { +@@ -891,6 +891,83 @@ static int send_handlers(int e) { return 0; } @@ -55,59 +55,75 @@ diff -up fltk-1.3.2/src/Fl.cxx.xhandlers fltk-1.3.2/src/Fl.cxx +// System event handlers: + + -+struct xhandler_link { -+ Fl_XEvent_Handler handle; ++struct system_handler_link { ++ Fl_System_Handler handle; + void *data; -+ xhandler_link *next; ++ system_handler_link *next; +}; + + -+static xhandler_link *xhandlers = 0; ++static system_handler_link *sys_handlers = 0; + + +/** -+ Install a function to intercept system events. FLTK calls each of -+ these functions as soon as a new system event is received. The -+ processing will stop at the first function to return true. If all -+ functions return false then the event is passed on for normal -+ handling by FLTK. ++ \brief Install a function to intercept system events. + -+ \see Fl::remove_xhandler(Fl_XEvent_Handler) ++ FLTK calls each of these functions as soon as a new system event is ++ received. The processing will stop at the first function to return ++ non-zero. If all functions return zero then the event is passed on ++ for normal handling by FLTK. ++ ++ Each function will be called with a pointer to the system event as ++ the first argument and \p data as the second argument. The system ++ event pointer will always be void *, but will point to different ++ objects depending on the platform: ++ - X11: XEvent ++ - Windows: MSG ++ - OS X: NSEvent ++ ++ \param ha The event handler function to register ++ \param data User data to include on each call ++ ++ \see Fl::remove_system_handler(Fl_System_Handler) +*/ -+void Fl::add_xhandler(Fl_XEvent_Handler ha, void *data) { -+ xhandler_link *l = new xhandler_link; ++void Fl::add_system_handler(Fl_System_Handler ha, void *data) { ++ system_handler_link *l = new system_handler_link; + l->handle = ha; + l->data = data; -+ l->next = xhandlers; -+ xhandlers = l; ++ l->next = sys_handlers; ++ sys_handlers = l; +} + + +/** + Removes a previously added system event handler. ++ ++ \param ha The event handler function to remove ++ ++ \see Fl::add_system_handler(Fl_System_Handler) +*/ -+void Fl::remove_xhandler(Fl_XEvent_Handler ha) { -+ xhandler_link *l, *p; ++void Fl::remove_system_handler(Fl_System_Handler ha) { ++ system_handler_link *l, *p; + + // Search for the handler in the list... -+ for (l = xhandlers, p = 0; l && l->handle != ha; p = l, l = l->next); ++ for (l = sys_handlers, p = 0; l && l->handle != ha; p = l, l = l->next); + + if (l) { + // Found it, so remove it from the list... + if (p) p->next = l->next; -+ else xhandlers = l->next; ++ else sys_handlers = l->next; + + // And free the record... + delete l; + } +} + -+bool fl_send_xhandlers(void *e) { -+ for (const xhandler_link *hl = xhandlers; hl; hl = hl->next) { ++int fl_send_system_handlers(void *e) { ++ for (const system_handler_link *hl = sys_handlers; hl; hl = hl->next) { + if (hl->handle(e, hl->data)) -+ return true; ++ return 1; + } -+ return false; ++ return 0; +} + + @@ -121,7 +137,7 @@ diff -up fltk-1.3.2/src/Fl_win32.cxx.xhandlers fltk-1.3.2/src/Fl_win32.cxx return r; } -+extern bool fl_send_xhandlers(void *e); ++extern int fl_send_system_handlers(void *e); + IActiveIMMApp *fl_aimm = NULL; MSG fl_msg; @@ -150,7 +166,7 @@ diff -up fltk-1.3.2/src/Fl_win32.cxx.xhandlers fltk-1.3.2/src/Fl_win32.cxx - DispatchMessageW(&fl_msg); - have_message = PeekMessageW(&fl_msg, NULL, 0, 0, PM_REMOVE); + while ((have_message = PeekMessageW(&fl_msg, NULL, 0, 0, PM_REMOVE)) > 0) { -+ if (fl_send_xhandlers(&fl_msg)) ++ if (fl_send_system_handlers(&fl_msg)) + continue; + + // Let applications treat WM_QUIT identical to SIGTERM on *nix @@ -178,7 +194,7 @@ diff -up fltk-1.3.2/src/Fl_x.cxx.xhandlers fltk-1.3.2/src/Fl_x.cxx remove_fd(n, -1); } -+extern bool fl_send_xhandlers(void *e); ++extern int fl_send_system_handlers(void *e); + #if CONSOLIDATE_MOTION static Fl_Window* send_motion; @@ -187,7 +203,7 @@ diff -up fltk-1.3.2/src/Fl_x.cxx.xhandlers fltk-1.3.2/src/Fl_x.cxx while (XEventsQueued(fl_display,QueuedAfterReading)) { XEvent xevent; XNextEvent(fl_display, &xevent); -+ if (fl_send_xhandlers(&xevent)) ++ if (fl_send_system_handlers(&xevent)) + continue; fl_handle(xevent); } diff --git a/contrib/fltk/13-fltk-1.3.2-im.patch b/contrib/fltk/13-fltk-1.3.2-im.patch index fbdcd785..efacc42b 100644 --- a/contrib/fltk/13-fltk-1.3.2-im.patch +++ b/contrib/fltk/13-fltk-1.3.2-im.patch @@ -1,6 +1,6 @@ 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-07-25 14:28:52.771417210 +0200 -+++ fltk-1.3.2/FL/Fl.H 2014-07-25 14:28:52.774417261 +0200 +--- 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); @@ -20,8 +20,8 @@ diff -up fltk-1.3.2/FL/Fl.H.im fltk-1.3.2/FL/Fl.H 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-07-25 14:28:52.765417109 +0200 -+++ fltk-1.3.2/FL/win32.H 2014-07-25 14:28:52.774417261 +0200 +--- 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; } @@ -32,55 +32,171 @@ diff -up fltk-1.3.2/FL/win32.H.im fltk-1.3.2/FL/win32.H 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-07-25 14:37:30.656153283 +0200 -+++ fltk-1.3.2/src/Fl_cocoa.mm 2014-07-25 14:38:03.540708006 +0200 -@@ -53,6 +53,7 @@ extern "C" { - #include - - #import -+#import - - #ifndef NSINTEGER_DEFINED // appears with 10.5 in NSObjCRuntime.h - #if defined(__LP64__) && __LP64__ -@@ -1391,6 +1392,35 @@ void fl_close_display() { +--- 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() { } - -+// Undocumented voodoo. Taken from Mozilla. -+#define ENABLE_ROMAN_KYBDS_ONLY -23 ++// 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() { -+#if (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5) -+ TSMRemoveDocumentProperty(TSMGetActiveDocument(), -+ kTSMDocumentEnabledInputSourcesPropertyTag); -+#else -+ KeyScript(smKeyEnableKybds); -+#endif ++ fl_open_display(); ++ ++ im_enabled = 1; ++ ++ if (fl_mac_os_version >= 100500) ++ [NSApp updateWindows]; ++ else ++ im_update(); +} + +void Fl::disable_im() { -+ // 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... -+#if (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5) -+ CFArrayRef inputSources = TISCreateASCIICapableInputSourceList(); -+ TSMSetDocumentProperty(TSMGetActiveDocument(), -+ kTSMDocumentEnabledInputSourcesPropertyTag, -+ sizeof(CFArrayRef), &inputSources); -+ CFRelease(inputSources); -+#else -+ KeyScript(ENABLE_ROMAN_KYBDS_ONLY); -+#endif -+} ++ 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) { - static bool first = true; 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-07-25 14:28:52.772417227 +0200 -+++ fltk-1.3.2/src/Fl.cxx 2014-07-25 14:28:52.774417261 +0200 +--- 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; } @@ -129,7 +245,7 @@ diff -up fltk-1.3.2/src/Fl.cxx.im fltk-1.3.2/src/Fl.cxx 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-07-25 14:28:52.774417261 +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 @@ -157,8 +273,8 @@ diff -up fltk-1.3.2/src/Fl_Native_File_Chooser_WIN32.cxx.im fltk-1.3.2/src/Fl_Na 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-07-25 14:28:52.772417227 +0200 -+++ fltk-1.3.2/src/Fl_win32.cxx 2014-07-25 14:28:52.775417277 +0200 +--- 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 #include @@ -220,7 +336,7 @@ diff -up fltk-1.3.2/src/Fl_win32.cxx.im fltk-1.3.2/src/Fl_win32.cxx if (himc) { @@ -338,7 +335,6 @@ void* Fl::thread_message() { - extern bool fl_send_xhandlers(void *e); + extern int fl_send_system_handlers(void *e); -IActiveIMMApp *fl_aimm = NULL; MSG fl_msg; @@ -337,8 +453,8 @@ diff -up fltk-1.3.2/src/Fl_win32.cxx.im fltk-1.3.2/src/Fl_win32.cxx 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-07-25 14:28:52.773417244 +0200 -+++ fltk-1.3.2/src/Fl_x.cxx 2014-07-25 14:28:52.775417277 +0200 +--- 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; diff --git a/vncviewer/Viewport.cxx b/vncviewer/Viewport.cxx index 595a4aa8..32ed543c 100644 --- a/vncviewer/Viewport.cxx +++ b/vncviewer/Viewport.cxx @@ -112,7 +112,7 @@ Viewport::Viewport(int w, int h, const rfb::PixelFormat& serverPF, CConn* cc_) #ifdef HAVE_FLTK_XHANDLERS // We need to intercept keyboard events early - Fl::add_xhandler(handleXEvent, this); + Fl::add_system_handler(handleSystemEvent, this); #endif frameBuffer = createFramebuffer(w, h); @@ -148,7 +148,7 @@ Viewport::~Viewport() Fl::remove_timeout(handlePointerTimeout, this); #ifdef HAVE_FLTK_XHANDLERS - Fl::remove_xhandler(handleXEvent); + Fl::remove_system_handler(handleSystemEvent); #endif #ifdef HAVE_FLTK_CLIPBOARD @@ -647,7 +647,7 @@ void Viewport::handleKeyRelease(int keyCode) } -bool Viewport::handleXEvent(void *event, void *data) +int Viewport::handleSystemEvent(void *event, void *data) { Viewport *self = (Viewport *)data; Fl_Widget *focus; @@ -658,10 +658,10 @@ bool Viewport::handleXEvent(void *event, void *data) if (!focus) focus = Fl::focus(); if (!focus) - return false; + return 0; if (focus != self) - return false; + return 0; assert(event); @@ -686,7 +686,7 @@ bool Viewport::handleXEvent(void *event, void *data) if (keyCode == 0x00) { vlog.error(_("No scan code for %svirtual key 0x%02x"), isExtended?"extended ":"", (int)vKey); - return true; + return 1; } } @@ -697,12 +697,12 @@ bool Viewport::handleXEvent(void *event, void *data) if (keySym == NoSymbol) { vlog.error(_("No symbol for %svirtual key 0x%02x"), isExtended?"extended ":"", (int)vKey); - return true; + return 1; } self->handleKeyPress(keyCode, keySym); - return true; + return 1; } else if ((msg->message == WM_KEYUP) || (msg->message == WM_SYSKEYUP)) { UINT vKey; bool isExtended; @@ -719,7 +719,7 @@ bool Viewport::handleXEvent(void *event, void *data) self->handleKeyRelease(keyCode); - return true; + return 1; } #elif defined(__APPLE__) if (cocoa_is_keyboard_event(event)) { @@ -734,7 +734,7 @@ bool Viewport::handleXEvent(void *event, void *data) if (keySym == NoSymbol) { vlog.error(_("No symbol for key code 0x%02x (in the current state)"), (int)keyCode); - return true; + return 1; } self->handleKeyPress(keyCode, keySym); @@ -747,7 +747,7 @@ bool Viewport::handleXEvent(void *event, void *data) self->handleKeyRelease(keyCode); } - return true; + return 1; } #else XEvent *xevent = (XEvent*)event; @@ -760,7 +760,7 @@ bool Viewport::handleXEvent(void *event, void *data) if (keysym == NoSymbol) { vlog.error(_("No symbol for key code %d (in the current state)"), (int)xevent->xkey.keycode); - return true; + return 1; } switch (keysym) { @@ -783,14 +783,14 @@ bool Viewport::handleXEvent(void *event, void *data) } self->handleKeyPress(xevent->xkey.keycode, keysym); - return true; + return 1; } else if (xevent->type == KeyRelease) { self->handleKeyRelease(xevent->xkey.keycode); - return true; + return 1; } #endif - return false; + return 0; } diff --git a/vncviewer/Viewport.h b/vncviewer/Viewport.h index 30dacad4..8e60da65 100644 --- a/vncviewer/Viewport.h +++ b/vncviewer/Viewport.h @@ -73,7 +73,7 @@ private: void handleKeyPress(int keyCode, rdr::U32 keySym); void handleKeyRelease(int keyCode); - static bool handleXEvent(void *event, void *data); + static int handleSystemEvent(void *event, void *data); rdr::U32 translateKeyEvent(void); void handleFLTKKeyPress(void); -- 2.39.5