summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManolo Gouy <Manolo>2011-01-09 16:07:13 +0000
committerManolo Gouy <Manolo>2011-01-09 16:07:13 +0000
commit2dadc8cb543a852726a1f7791b80b1e9e93b5eb6 (patch)
tree3d38d4f2987c198edeb0403b41f734158570e4ba
parent5f940c4e4b182f9f2185fdf09fa5be9ff4f75406 (diff)
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
-rw-r--r--FL/Fl_Text_Display.H5
-rw-r--r--src/Fl_cocoa.mm23
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<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;
}