From 2dadc8cb543a852726a1f7791b80b1e9e93b5eb6 Mon Sep 17 00:00:00 2001 From: Manolo Gouy Date: Sun, 9 Jan 2011 16:07:13 +0000 Subject: [PATCH] First step to support CJK input under Mac OS: implementation of the function firstRectForCharacterRange of the NSTextInput protocol. git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@8228 ea41ed52-d2ee-0310-a9c1-e6b18d33e121 --- FL/Fl_Text_Display.H | 5 ++--- src/Fl_cocoa.mm | 23 ++++++++++++++++++----- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/FL/Fl_Text_Display.H b/FL/Fl_Text_Display.H index e9af94df8..8d7a8d367 100644 --- a/FL/Fl_Text_Display.H +++ b/FL/Fl_Text_Display.H @@ -142,7 +142,8 @@ public: \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 @@ protected: 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); diff --git a/src/Fl_cocoa.mm b/src/Fl_cocoa.mm index 2f7a60844..0536f90af 100644 --- a/src/Fl_cocoa.mm +++ b/src/Fl_cocoa.mm @@ -1818,13 +1818,26 @@ static void q_set_window_title(NSWindow *nsw, const char * name ) { } - (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(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; }