Author: manolo
Date: 2011-01-09 08:07:13 -0800 (Sun, 09 Jan 2011)
New Revision: 8228
Log:
First step to support CJK input under Mac OS: implementation of the function 
firstRectForCharacterRange of the NSTextInput protocol.

Modified:
   branches/branch-1.3/FL/Fl_Text_Display.H
   branches/branch-1.3/src/Fl_cocoa.mm

Modified: branches/branch-1.3/FL/Fl_Text_Display.H
===================================================================
--- branches/branch-1.3/FL/Fl_Text_Display.H    2011-01-09 14:38:38 UTC (rev 
8227)
+++ branches/branch-1.3/FL/Fl_Text_Display.H    2011-01-09 16:07:13 UTC (rev 
8228)
@@ -142,7 +142,8 @@
    \return insert position index into text buffer 
    */
   int insert_position() const { return mCursorPos; }
-  
+  int position_to_xy(int pos, int* x, int* y) const;
+
   int in_selection(int x, int y) const;
   void show_insert_position();
   
@@ -364,8 +365,6 @@
   
   void xy_to_rowcol(int x, int y, int* row, int* column,
                     int PosType = CHARACTER_POS) const;
-  
-  int position_to_xy(int pos, int* x, int* y) const;
   void maintain_absolute_top_line_number(int state);
   int get_absolute_top_line_number() const;
   void absolute_top_line_number(int oldFirstChar);

Modified: branches/branch-1.3/src/Fl_cocoa.mm
===================================================================
--- branches/branch-1.3/src/Fl_cocoa.mm 2011-01-09 14:38:38 UTC (rev 8227)
+++ branches/branch-1.3/src/Fl_cocoa.mm 2011-01-09 16:07:13 UTC (rev 8228)
@@ -1818,13 +1818,26 @@
 }
 
 - (NSRect)firstRectForCharacterRange:(NSRange)aRange {
-  NSRect glyphRect, frame;
+  NSRect glyphRect;
+  Fl_Widget *focus = Fl::focus();
+  Fl_Window *wfocus = focus->window();
+  while (wfocus->window()) wfocus = wfocus->window();
+  glyphRect.size.width = 0;
   
-  frame = [self frame];
-  glyphRect.origin.x = frame.size.width;
-  glyphRect.origin.y = 0;
-  glyphRect.size.width = glyphRect.size.height = 0;
+  if (dynamic_cast<Fl_Text_Display*>(focus) != NULL) {
+    int x, y;
+    Fl_Text_Display *current = (Fl_Text_Display*)focus;
+    current->position_to_xy( current->insert_position(), &x, &y );
+    glyphRect.origin.x = (CGFloat)x;
+    glyphRect.origin.y = (CGFloat)y + current->textsize();
+    glyphRect.size.height = current->textsize();
+  } else {
+    glyphRect.origin.x = (CGFloat)Fl::event_x();
+    glyphRect.origin.y = (CGFloat)Fl::event_y() + 12;
+    glyphRect.size.height = 12;
+  }
   // Convert the rect to screen coordinates
+  glyphRect.origin.y = wfocus->h() - glyphRect.origin.y;
   glyphRect.origin = [[self window] convertBaseToScreen:glyphRect.origin];
   return glyphRect;
 }

_______________________________________________
fltk-commit mailing list
[email protected]
http://lists.easysw.com/mailman/listinfo/fltk-commit

Reply via email to