Author: manolo
Date: 2013-02-09 06:16:47 -0800 (Sat, 09 Feb 2013)
New Revision: 9818
Log:
Mac OS text input: fixed processing of dead key followed by non-text key.
Modified:
branches/branch-3.0/include/fltk3/run.h
branches/branch-3.0/src/fltk3/Input.cxx
branches/branch-3.0/src/fltk3/Input_.cxx
branches/branch-3.0/src/fltk3/TextDisplay.cxx
branches/branch-3.0/src/fltk3/TextEditor.cxx
branches/branch-3.0/src/fltk3/cocoa.mm
branches/branch-3.0/src/fltk3/compose.cxx
Modified: branches/branch-3.0/include/fltk3/run.h
===================================================================
--- branches/branch-3.0/include/fltk3/run.h 2013-02-09 13:54:58 UTC (rev
9817)
+++ branches/branch-3.0/include/fltk3/run.h 2013-02-09 14:16:47 UTC (rev
9818)
@@ -150,10 +150,9 @@
extern fltk3::Widget* selection_owner_;
extern fltk3::Window* modal_;
extern fltk3::Window* grab_;
- extern int compose_state;
+ extern int compose_state; // used for dead keys (WIN32) or marked text
(MacOS)
void call_screen_init(); // recompute screen number and dimensions
#ifdef __APPLE__
- int marked_text_length(); // returns length of marked text
void reset_marked_text(); // resets marked text
void insertion_point_location(int x, int y, int height); // sets window
coordinates & height of insertion point
#endif
Modified: branches/branch-3.0/src/fltk3/Input.cxx
===================================================================
--- branches/branch-3.0/src/fltk3/Input.cxx 2013-02-09 13:54:58 UTC (rev
9817)
+++ branches/branch-3.0/src/fltk3/Input.cxx 2013-02-09 14:16:47 UTC (rev
9818)
@@ -378,8 +378,8 @@
fltk3::event_text(), fltk3::event_length());
}
#ifdef __APPLE__
- if (fltk3::marked_text_length()) {
- this->mark( this->position() - fltk3::marked_text_length() );
+ if (fltk3::compose_state) {
+ this->mark( this->position() - fltk3::compose_state );
}
#endif
return 1;
@@ -611,7 +611,7 @@
switch (event) {
#ifdef __APPLE__
case fltk3::UNFOCUS:
- if (fltk3::marked_text_length()) {
+ if (fltk3::compose_state) {
this->mark( this->position() );
fltk3::reset_marked_text();
}
@@ -848,7 +848,7 @@
int fltk3::SecretInput::handle(int event) {
int retval = fltk3::Input::handle(event);
#ifdef __APPLE__
- if (event == fltk3::KEYBOARD && fltk3::marked_text_length()) {
+ if (event == fltk3::KEYBOARD && fltk3::compose_state) {
this->mark( this->position() ); // don't underline marked text
}
#endif
Modified: branches/branch-3.0/src/fltk3/Input_.cxx
===================================================================
--- branches/branch-3.0/src/fltk3/Input_.cxx 2013-02-09 13:54:58 UTC (rev
9817)
+++ branches/branch-3.0/src/fltk3/Input_.cxx 2013-02-09 14:16:47 UTC (rev
9818)
@@ -351,8 +351,8 @@
int offset2;
if (pp <= e) x2 = xpos + (float)expandpos(p, pp, buf, &offset2);
else offset2 = (int)strlen(buf);
-#ifdef __APPLE__ // Mac OS: underline marked ( = selected +
fltk3::marked_text_length() != 0) text
- if (fltk3::marked_text_length()) {
+#ifdef __APPLE__ // Mac OS: underline marked ( = selected +
fltk3::compose_state != 0) text
+ if (fltk3::compose_state) {
fltk3::color(textcolor());
}
else
@@ -363,8 +363,8 @@
fltk3::color(fltk3::contrast(textcolor(), selection_color()));
}
fltk3::draw(buf+offset1, offset2-offset1, x1, (float)(Y+ypos+desc));
-#ifdef __APPLE__ // Mac OS: underline marked ( = selected +
fltk3::marked_text_length() != 0) text
- if (fltk3::marked_text_length()) {
+#ifdef __APPLE__ // Mac OS: underline marked ( = selected +
fltk3::compose_state != 0) text
+ if (fltk3::compose_state) {
fltk3::color( fltk3::color_average(textcolor(), color(), 0.6) );
float width = fltk3::width(buf+offset1, offset2-offset1);
fltk3::line(x1, Y+ypos+height-1, x1+width, Y+ypos+height-1);
@@ -386,7 +386,7 @@
// draw the cursor:
if (fltk3::focus() == this && (
#ifdef __APPLE__
- fltk3::marked_text_length() ||
+ fltk3::compose_state ||
#endif
selstart == selend) &&
position() >= p-value() && position() <= e-value()) {
Modified: branches/branch-3.0/src/fltk3/TextDisplay.cxx
===================================================================
--- branches/branch-3.0/src/fltk3/TextDisplay.cxx 2013-02-09 13:54:58 UTC
(rev 9817)
+++ branches/branch-3.0/src/fltk3/TextDisplay.cxx 2013-02-09 14:16:47 UTC
(rev 9818)
@@ -1952,7 +1952,7 @@
if (style & PRIMARY_MASK) {
if (fltk3::focus() == (fltk3::Widget*)this) {
#ifdef __APPLE__
- if (fltk3::marked_text_length()) background = color();// Mac OS:
underline marked text
+ if (fltk3::compose_state) background = color();// Mac OS: underline
marked text
else
#endif
background = selection_color();
@@ -1988,8 +1988,8 @@
fltk3::push_clip(X, Y, toX - X, mMaxsize);
#endif
fltk3::draw( string, nChars, X, Y + mMaxsize - fltk3::descent());
-#ifdef __APPLE__ // Mac OS: underline marked (= selected +
fltk3::marked_text_length() != 0) text
- if (fltk3::marked_text_length() && (style & PRIMARY_MASK)) {
+#ifdef __APPLE__ // Mac OS: underline marked (= selected +
fltk3::compose_state != 0) text
+ if (fltk3::compose_state && (style & PRIMARY_MASK)) {
fltk3::color( fltk3::color_average(foreground, background, 0.6) );
fltk3::line(X, Y + mMaxsize - 1, X + fltk3::width(string, nChars), Y +
mMaxsize - 1);
}
@@ -3487,7 +3487,7 @@
if (damage() & (fltk3::DAMAGE_ALL | fltk3::DAMAGE_SCROLL |
fltk3::DAMAGE_EXPOSE)
&& (
#ifdef __APPLE__
- fltk3::marked_text_length() ||
+ fltk3::compose_state ||
#endif
!has_selection || mCursorPos < start || mCursorPos > end) &&
mCursorOn && fltk3::focus() == (fltk3::Widget*)this ) {
Modified: branches/branch-3.0/src/fltk3/TextEditor.cxx
===================================================================
--- branches/branch-3.0/src/fltk3/TextEditor.cxx 2013-02-09 13:54:58 UTC
(rev 9817)
+++ branches/branch-3.0/src/fltk3/TextEditor.cxx 2013-02-09 14:16:47 UTC
(rev 9818)
@@ -538,9 +538,9 @@
else overstrike(fltk3::event_text());
}
#ifdef __APPLE__
- if (fltk3::marked_text_length()) {
+ if (fltk3::compose_state) {
int pos = this->insert_position();
- this->buffer()->select(pos - fltk3::marked_text_length(), pos);
+ this->buffer()->select(pos - fltk3::compose_state, pos);
}
#endif
show_insert_position();
@@ -581,7 +581,7 @@
case fltk3::UNFOCUS:
show_cursor(mCursorOn); // redraws the cursor
#ifdef __APPLE__
- if (buffer()->selected() && fltk3::marked_text_length()) {
+ if (buffer()->selected() && fltk3::compose_state) {
int pos = insert_position();
buffer()->select(pos, pos);
fltk3::reset_marked_text();
Modified: branches/branch-3.0/src/fltk3/cocoa.mm
===================================================================
--- branches/branch-3.0/src/fltk3/cocoa.mm 2013-02-09 13:54:58 UTC (rev
9817)
+++ branches/branch-3.0/src/fltk3/cocoa.mm 2013-02-09 14:16:47 UTC (rev
9818)
@@ -2015,8 +2015,10 @@
}
- (void)doCommandBySelector:(SEL)aSelector {
- //NSLog(@"doCommandBySelector:%s",sel_getName(aSelector));
- [FLView prepareEtext:[[NSApp currentEvent] characters]];
+ NSString *s = [[NSApp currentEvent] characters];
+ //NSLog(@"doCommandBySelector:%s text='%@'",sel_getName(aSelector), s);
+ s = [s substringFromIndex:[s length] - 1];
+ [FLView prepareEtext:s]; // use the last character of the event; necessary
for deadkey + Tab
fltk3::Window *target = [(FLWindow*)[self window] getFl_Window];
fltk3::handle(fltk3::KEYBOARD, target);
}
@@ -2032,8 +2034,8 @@
} else {
received = (NSString*)aString;
}
- /*NSLog(@"insertText=%@ l=%d Fl::marked_text_length()=%d range=%d,%d",
- received,strlen([received
UTF8String]),Fl::marked_text_length(),replacementRange.location,replacementRange.length);*/
+ /*NSLog(@"insertText=%@ l=%d Fl::compose_state=%d range=%d,%d",
+ received,strlen([received
UTF8String]),Fl::compose_state,replacementRange.location,replacementRange.length);*/
fl_lock_function();
fltk3::Window *target = [(FLWindow*)[self window] getFl_Window];
while (replacementRange.length--) { // delete replacementRange.length
characters before insertion point
@@ -2052,8 +2054,16 @@
// We can get called outside of key events (e.g., from the character
palette, from CJK text input).
// Transform character palette actions to fltk3::PASTE events.
Fl_X::next_marked_length = 0;
- int flevent = (in_key_event || fltk3::marked_text_length()) ?
fltk3::KEYBOARD : fltk3::PASTE;
- if (!in_key_event) fltk3::handle( flevent, target);
+ int flevent = (in_key_event || fltk3::compose_state) ? fltk3::KEYBOARD :
fltk3::PASTE;
+ // YES if key has text attached
+ BOOL has_text_key = fltk3::e_keysym <= '~' || fltk3::e_keysym ==
fltk3::IsoKey ||
+ (fltk3::e_keysym >= fltk3::KPKey && fltk3::e_keysym <= fltk3::KPLastKey &&
fltk3::e_keysym != fltk3::KPEnterKey);
+ // insertText sent during handleEvent of a key without text cannot be
processed in a single FL_KEYBOARD event.
+ // Occurs with deadkey followed by non-text key
+ if (!in_key_event || !has_text_key) {
+ fltk3::handle(flevent, target);
+ fltk3::e_length = 0;
+ }
else need_handle = YES;
selectedRange = NSMakeRange(100, 0); // 100 is an arbitrary value
// for some reason, with the palette, the window does not redraw until the
next mouse move or button push
@@ -2075,8 +2085,8 @@
received = (NSString*)aString;
}
fl_lock_function();
- /*NSLog(@"setMarkedText:%@ l=%d newSelection=%d,%d
Fl::marked_text_length()=%d replacement=%d,%d",
- received, strlen([received UTF8String]), newSelection.location,
newSelection.length, Fl::marked_text_length(),
+ /*NSLog(@"setMarkedText:%@ l=%d newSelection=%d,%d fltk3::compose_state=%d
replacement=%d,%d",
+ received, strlen([received UTF8String]), newSelection.location,
newSelection.length, fltk3::compose_state,
replacementRange.location, replacementRange.length);*/
fltk3::Window *target = [(FLWindow*)[self window] getFl_Window];
while (replacementRange.length--) { // delete replacementRange.length
characters before insertion point
@@ -2114,13 +2124,13 @@
}
- (NSRange)markedRange {
- //NSLog(@"markedRange=%d %d", fltk3::marked_text_length() > 0?0:NSNotFound,
fltk3::marked_text_length());
- return NSMakeRange(fltk3::marked_text_length() > 0?0:NSNotFound,
fltk3::marked_text_length());
+ //NSLog(@"markedRange=%d %d", fltk3::compose_state > 0?0:NSNotFound,
fltk3::compose_state);
+ return NSMakeRange(fltk3::compose_state > 0?0:NSNotFound,
fltk3::compose_state);
}
- (BOOL)hasMarkedText {
- //NSLog(@"hasMarkedText %s", fltk3::marked_text_length() > 0?"YES":"NO");
- return (fltk3::marked_text_length() > 0);
+ //NSLog(@"hasMarkedText %s", fltk3::compose_state > 0?"YES":"NO");
+ return (fltk3::compose_state > 0);
}
- (NSAttributedString *)attributedSubstringFromRange:(NSRange)aRange {
Modified: branches/branch-3.0/src/fltk3/compose.cxx
===================================================================
--- branches/branch-3.0/src/fltk3/compose.cxx 2013-02-09 13:54:58 UTC (rev
9817)
+++ branches/branch-3.0/src/fltk3/compose.cxx 2013-02-09 14:16:47 UTC (rev
9818)
@@ -57,8 +57,8 @@
temporary text replaced by other text during the input process. This occurs,
e.g., when using dead keys or when entering CJK characters.
Text editing widgets should preferentially signal
- marked text, usually underlining it. Widgets can call
- <tt>int fltk3::marked_text_length()</tt> <i>after</i> having called
fltk3::compose(int&)
+ marked text, usually underlining it. Widgets can use
+ <tt>int fltk3::compose_state</tt> <i>after</i> having called
fltk3::compose(int&)
to obtain the length in bytes of marked text that always finishes at the
current insertion point. It's the widget's task to underline marked text.
Widgets should also call <tt>void fltk3::reset_marked_text()</tt> when
processing fltk3::UNFOCUS
@@ -108,10 +108,6 @@
}
#ifdef __APPLE__
-int fltk3::marked_text_length() {
- return (fltk3::compose_state ? fltk3::compose_state :
Fl_X::next_marked_length);
-}
-
static int insertion_point_x = 0;
static int insertion_point_y = 0;
static int insertion_point_height = 0;
_______________________________________________
fltk-commit mailing list
[email protected]
http://lists.easysw.com/mailman/listinfo/fltk-commit