diff options
| -rw-r--r-- | FL/Fl.H | 12 | ||||
| -rw-r--r-- | src/Fl.cxx | 10 | ||||
| -rw-r--r-- | src/fl_font_mac.cxx | 2 |
3 files changed, 22 insertions, 2 deletions
@@ -104,6 +104,9 @@ typedef void (*Fl_Atclose_Handler)(Fl_Window *window, void *data); /** signature of args functions passed as parameters */ typedef int (*Fl_Args_Handler)(int argc, char **argv, int &i); +/** signature of event_dispatch functions passed as parameters */ +typedef int (*Fl_Event_Dispatch)(int event, Fl_Window *w); + /** @} */ /* group callback_functions */ @@ -129,6 +132,7 @@ public: // should be private! static int e_keysym; static char* e_text; static int e_length; + static Fl_Event_Dispatch e_dispatch; static Fl_Widget* belowmouse_; static Fl_Widget* pushed_; static Fl_Widget* focus_; @@ -696,6 +700,14 @@ public: static void focus(Fl_Widget*); static void add_handler(Fl_Event_Handler h); static void remove_handler(Fl_Event_Handler h); + /** Set a new event dispatch function. + The event dispatch function is called after native events are converted to + FLTK events, but before they are handled by FLTK. If the dispatch function + returns a value other than 0, FLTK will not handle the event any further. + \param d new dispatch function, can be NULL */ + static void event_dispatch(Fl_Event_Dispatch d) { e_dispatch = d; } + /** Return the current event dispatch function. */ + static Fl_Event_Dispatch event_dispatch() { return e_dispatch; } /** @} */ /** \defgroup fl_clipboard Selection & Clipboard functions diff --git a/src/Fl.cxx b/src/Fl.cxx index 00ecaf788..06a819cea 100644 --- a/src/Fl.cxx +++ b/src/Fl.cxx @@ -89,6 +89,8 @@ int Fl::damage_, char *Fl::e_text = (char *)""; int Fl::e_length; +Fl_Event_Dispatch Fl::e_dispatch = 0; + unsigned char Fl::options_[] = { 0, 0 }; unsigned char Fl::options_read_ = 0; @@ -727,7 +729,7 @@ static handler_link *handlers = 0; them returns non zero then the event is ignored. Events that cause this to be called are: - - FL_SHORTCUT events that are not recognized by any widget. + - FL_SHORTCUT events that are not recognized by any widget. This lets you provide global shortcut keys. - System events that FLTK does not recognize. See fl_xevent. - \e Some other events when the widget FLTK selected returns @@ -978,6 +980,12 @@ int Fl::handle(int e, Fl_Window* window) widget uses the event. */ { + if (e_dispatch) { + int ret = e_dispatch(e, window); + if (ret) + return ret; + } + e_number = e; if (fl_local_grab) return fl_local_grab(e); diff --git a/src/fl_font_mac.cxx b/src/fl_font_mac.cxx index 222cc6a98..6002bc10a 100644 --- a/src/fl_font_mac.cxx +++ b/src/fl_font_mac.cxx @@ -312,7 +312,7 @@ if (fl_mac_os_version >= 0x1050) { i++; // because a pair of UniChar's represent a single character continue; } - unsigned int r = uni >> 7; // index of the character block containing uni + unsigned int r = uni >> 9; // index of the character block containing uni if (!fl_fontsize->width[r]) { // this character block has not been hit yet //fprintf(stderr,"r=%d size=%d name=%s\n",r,fl_fontsize->size, fl_fontsize->q_name); // allocate memory to hold width of each character in the block |
