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

Reply via email to