diff options
Diffstat (limited to 'src/drivers')
| -rw-r--r-- | src/drivers/Darwin/Fl_Darwin_System_Driver.H | 1 | ||||
| -rw-r--r-- | src/drivers/Darwin/Fl_Darwin_System_Driver.cxx | 44 | ||||
| -rw-r--r-- | src/drivers/Posix/Fl_Posix_System_Driver.H | 2 | ||||
| -rw-r--r-- | src/drivers/Posix/Fl_Posix_System_Driver.cxx | 20 | ||||
| -rw-r--r-- | src/drivers/WinAPI/Fl_WinAPI_System_Driver.H | 1 | ||||
| -rw-r--r-- | src/drivers/WinAPI/Fl_WinAPI_System_Driver.cxx | 16 |
6 files changed, 84 insertions, 0 deletions
diff --git a/src/drivers/Darwin/Fl_Darwin_System_Driver.H b/src/drivers/Darwin/Fl_Darwin_System_Driver.H index a95bac019..61a7c961e 100644 --- a/src/drivers/Darwin/Fl_Darwin_System_Driver.H +++ b/src/drivers/Darwin/Fl_Darwin_System_Driver.H @@ -43,6 +43,7 @@ class Fl_Darwin_System_Driver : public Fl_System_Driver public: virtual int single_arg(const char *arg); virtual int arg_and_value(const char *name, const char *value); + virtual int compose(int &del); }; #endif // FL_DARWIN_SYSTEM_DRIVER_H diff --git a/src/drivers/Darwin/Fl_Darwin_System_Driver.cxx b/src/drivers/Darwin/Fl_Darwin_System_Driver.cxx index bbab50be9..590e23d0b 100644 --- a/src/drivers/Darwin/Fl_Darwin_System_Driver.cxx +++ b/src/drivers/Darwin/Fl_Darwin_System_Driver.cxx @@ -19,8 +19,12 @@ #include "../../config_lib.h" #include "Fl_Darwin_System_Driver.H" +#include <FL/Fl.H> +#include <FL/x.H> #include <string.h> +int Fl_X::next_marked_length = 0; + //const char* fl_local_alt = "\xe2\x8c\xa5\\"; // U+2325 (option key) const char* fl_local_alt = "⌥\\"; // U+2325 (option key) //const char* fl_local_ctrl = "\xe2\x8c\x83\\"; // U+2303 (up arrowhead) @@ -45,6 +49,46 @@ int Fl_Darwin_System_Driver::arg_and_value(const char *name, const char *value) return strcmp(name, "NSDocumentRevisionsDebugMode") == 0; } +static int insertion_point_x = 0; +static int insertion_point_y = 0; +static int insertion_point_height = 0; +static bool insertion_point_location_is_valid = false; + +void Fl::reset_marked_text() { + Fl::compose_state = 0; + Fl_X::next_marked_length = 0; + insertion_point_location_is_valid = false; +} + +int Fl_X::insertion_point_location(int *px, int *py, int *pheight) +// return true if the current coordinates of the insertion point are available +{ + if ( ! insertion_point_location_is_valid ) return false; + *px = insertion_point_x; + *py = insertion_point_y; + *pheight = insertion_point_height; + return true; +} + +void Fl::insertion_point_location(int x, int y, int height) { + insertion_point_location_is_valid = true; + insertion_point_x = x; + insertion_point_y = y; + insertion_point_height = height; +} + +int Fl_Darwin_System_Driver::compose(int &del) { + int condition; + int has_text_key = Fl::compose_state || Fl::e_keysym <= '~' || Fl::e_keysym == FL_Iso_Key || + (Fl::e_keysym >= FL_KP && Fl::e_keysym <= FL_KP_Last && Fl::e_keysym != FL_KP_Enter); + condition = Fl::e_state&(FL_META | FL_CTRL) || + (Fl::e_keysym >= FL_Shift_L && Fl::e_keysym <= FL_Alt_R) || // called from flagsChanged + !has_text_key ; + if (condition) { del = 0; return 0;} // this stuff is to be treated as a function key + del = Fl::compose_state; + Fl::compose_state = Fl_X::next_marked_length; + return 1; +} // // End of "$Id$". diff --git a/src/drivers/Posix/Fl_Posix_System_Driver.H b/src/drivers/Posix/Fl_Posix_System_Driver.H index c18e3be0e..56a6675d3 100644 --- a/src/drivers/Posix/Fl_Posix_System_Driver.H +++ b/src/drivers/Posix/Fl_Posix_System_Driver.H @@ -43,6 +43,8 @@ class Fl_Posix_System_Driver : public Fl_System_Driver public: virtual void display_arg(const char *arg); virtual int XParseGeometry(const char*, int*, int*, unsigned int*, unsigned int*); + virtual int compose(int &del); + virtual void compose_reset(); }; #endif // FL_POSIX_SYSTEM_DRIVER_H diff --git a/src/drivers/Posix/Fl_Posix_System_Driver.cxx b/src/drivers/Posix/Fl_Posix_System_Driver.cxx index 16c71f56e..9cdf8c2dd 100644 --- a/src/drivers/Posix/Fl_Posix_System_Driver.cxx +++ b/src/drivers/Posix/Fl_Posix_System_Driver.cxx @@ -20,6 +20,8 @@ #include "Fl_Posix_System_Driver.H" #include <FL/Fl.H> +extern XIC fl_xim_ic; // in Fl_x.cxx + // Pointers you can use to change FLTK to a foreign language. // Note: Similar pointers are defined in FL/fl_ask.H and src/fl_ask.cxx @@ -42,6 +44,24 @@ int Fl_Posix_System_Driver::XParseGeometry(const char* string, int* x, int* y, return ::XParseGeometry(string, x, y, width, height); } +int Fl_Posix_System_Driver::compose(int& del) { + int condition; + unsigned char ascii = (unsigned char)Fl::e_text[0]; + condition = (Fl::e_state & (FL_ALT | FL_META | FL_CTRL)) && !(ascii & 128) ; + if (condition) { del = 0; return 0;} // this stuff is to be treated as a function key + del = Fl::compose_state; + Fl::compose_state = 0; + // Only insert non-control characters: + if ( (!Fl::compose_state) && ! (ascii & ~31 && ascii!=127)) { return 0; } + return 1; +} + +void Fl_Posix_System_Driver::compose_reset() +{ + Fl::compose_state = 0; + if (fl_xim_ic) XmbResetIC(fl_xim_ic); +} + // // End of "$Id$". // diff --git a/src/drivers/WinAPI/Fl_WinAPI_System_Driver.H b/src/drivers/WinAPI/Fl_WinAPI_System_Driver.H index c937c97da..049c516d4 100644 --- a/src/drivers/WinAPI/Fl_WinAPI_System_Driver.H +++ b/src/drivers/WinAPI/Fl_WinAPI_System_Driver.H @@ -45,6 +45,7 @@ public: virtual void warning(const char *format, va_list args); virtual void error(const char *format, va_list args); virtual void fatal(const char *format, va_list args); + virtual int compose(int &del); }; #endif // FL_WINAPI_SYSTEM_DRIVER_H diff --git a/src/drivers/WinAPI/Fl_WinAPI_System_Driver.cxx b/src/drivers/WinAPI/Fl_WinAPI_System_Driver.cxx index 8ea6113a0..b05796eb5 100644 --- a/src/drivers/WinAPI/Fl_WinAPI_System_Driver.cxx +++ b/src/drivers/WinAPI/Fl_WinAPI_System_Driver.cxx @@ -19,6 +19,7 @@ #include "../../config_lib.h" #include "Fl_WinAPI_System_Driver.H" +#include <FL/Fl.H> #include <stdio.h> #include <windows.h> @@ -51,6 +52,21 @@ void Fl_WinAPI_System_Driver::fatal(const char *format, va_list args) { ::exit(1); } +int Fl_WinAPI_System_Driver::compose(int &del) { + unsigned char ascii = (unsigned char)Fl::e_text[0]; + int condition = (Fl::e_state & (FL_ALT | FL_META)) && !(ascii & 128) ; + if (condition) { // this stuff is to be treated as a function key + del = 0; + return 0; + } + del = Fl::compose_state; + Fl::compose_state = 0; + // Only insert non-control characters: + if ( (!Fl::compose_state) && ! (ascii & ~31 && ascii!=127)) { + return 0; + } + return 1; +} // // End of "$Id$". |
