Implemented the full OS X navigation support for Fl_Input minus scrolling. Improved navigation on other systems (word fwd, backwd).
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@6764 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
parent
32714c502c
commit
b214cef3a8
2
CHANGES
2
CHANGES
@ -1,10 +1,10 @@
|
||||
CHANGES IN FLTK 1.3.0
|
||||
|
||||
- Added improved OS X cursor control to Fl_Input (STR #2169)
|
||||
- Fix for multiple popups, when dragging and calling fl_alert()
|
||||
and friends from the callback (STR #2159)
|
||||
- Avoiding crashes for recursive common dialogs (this does not
|
||||
fix the issue at hand yet) (STR #1986, 2150)
|
||||
- Added OS X cursor control to Fl_Input (STR #2169)
|
||||
- Fixed control key keycodes with modifiers on OS X
|
||||
- Added menu shortcut alignment for OS X
|
||||
- Fixed bad system menu hadling in OS X (STR #2153)
|
||||
|
||||
140
src/Fl_Input.cxx
140
src/Fl_Input.cxx
@ -140,83 +140,157 @@ int Fl_Input::handle_key() {
|
||||
return 1;
|
||||
}
|
||||
|
||||
unsigned int mods = Fl::event_state() & (FL_META|FL_CTRL|FL_ALT);
|
||||
switch (Fl::event_key()) {
|
||||
case FL_Insert:
|
||||
if (Fl::event_state() & FL_CTRL) ascii = ctrl('C');
|
||||
else if (Fl::event_state() & FL_SHIFT) ascii = ctrl('V');
|
||||
break;
|
||||
case FL_Delete:
|
||||
case FL_Delete: // FIXME
|
||||
if (Fl::event_state() & FL_SHIFT) ascii = ctrl('X');
|
||||
else ascii = ctrl('D');
|
||||
break;
|
||||
case FL_Left:
|
||||
ascii = ctrl('B');
|
||||
#ifdef __APPLE__
|
||||
if (Fl::event_state() & (FL_META|FL_CTRL) ) ascii = ctrl('A');
|
||||
// FIXME backward one word is missing (Alt-Left)
|
||||
#endif // __APPLE__
|
||||
if (mods==0) { // char left
|
||||
ascii = ctrl('B');
|
||||
} else if (mods==FL_ALT) { // word left
|
||||
shift_position(word_start(position()));
|
||||
return 1;
|
||||
} else if (mods==FL_CTRL || mods==FL_META) { // start of line
|
||||
shift_position(line_start(position()));
|
||||
return 1;
|
||||
} else return 1;
|
||||
#else
|
||||
if (mods==0) { // char left
|
||||
ascii = ctrl('B');
|
||||
} else if (mods==FL_CTRL) { // word left
|
||||
shift_position(word_start(position()));
|
||||
return 1;
|
||||
} else return 1;
|
||||
#endif
|
||||
break;
|
||||
case FL_Right:
|
||||
ascii = ctrl('F');
|
||||
#ifdef __APPLE__
|
||||
if (Fl::event_state() & (FL_META|FL_CTRL) ) ascii = ctrl('E');
|
||||
// FIXME advance one word is missing (Alt-Right)
|
||||
if (mods==0) { // char right
|
||||
ascii = ctrl('F');
|
||||
} else if (mods==FL_ALT) { // word right
|
||||
shift_position(word_end(position()));
|
||||
return 1;
|
||||
} else if (mods==FL_CTRL || mods==FL_META) { // end of line
|
||||
shift_position(line_end(position()));
|
||||
return 1;
|
||||
} else return 1;
|
||||
#else
|
||||
if (mods==0) { // char right
|
||||
ascii = ctrl('F');
|
||||
} else if (mods==FL_CTRL) { // word right
|
||||
shift_position(word_end(position()));
|
||||
return 1;
|
||||
} else return 1;
|
||||
#endif // __APPLE__
|
||||
break;
|
||||
case FL_Page_Up:
|
||||
case FL_Page_Up: // FIXME
|
||||
fl_font(textfont(),textsize()); //ensure current font is set to ours
|
||||
repeat_num=h()/fl_height(); // number of lines to scroll
|
||||
if (!repeat_num) repeat_num=1;
|
||||
case FL_Up:
|
||||
ascii = ctrl('P');
|
||||
#ifdef __APPLE__
|
||||
if (Fl::event_state() & (FL_META) ) {
|
||||
shift_position(0);
|
||||
return 1;
|
||||
}
|
||||
if (Fl::event_state() & (FL_ALT) ) {
|
||||
if (mods==0) { // line up
|
||||
ascii = ctrl('P');
|
||||
} else if (mods==FL_CTRL) {
|
||||
return 1; // FIXME scroll text down one page
|
||||
// FIXME Fl_Inut_ does not support an independent scroll value
|
||||
// (heck, it doesn't even support a scrollbar - what do you expect ;-)
|
||||
} else if (mods==FL_ALT) { // line start and up
|
||||
if (line_start(position())==position() && position()>0)
|
||||
return shift_position(line_start(position()-1)) + NORMAL_INPUT_MOVE;
|
||||
else
|
||||
return shift_position(line_start(position())) + NORMAL_INPUT_MOVE;
|
||||
}
|
||||
#endif // __APPLE__
|
||||
} else if (mods==FL_META) { // start of document
|
||||
shift_position(0);
|
||||
return 1;
|
||||
} else return 1;
|
||||
#else
|
||||
if (mods==0) { // line up
|
||||
ascii = ctrl('P');
|
||||
} else if (mods==FL_CTRL) {
|
||||
return 1; // FIXME scroll text down one line
|
||||
} else return 1;
|
||||
#endif
|
||||
break;
|
||||
case FL_Page_Down:
|
||||
case FL_Page_Down: // FIXME
|
||||
fl_font(textfont(),textsize());
|
||||
repeat_num=h()/fl_height();
|
||||
if (!repeat_num) repeat_num=1;
|
||||
case FL_Down:
|
||||
ascii = ctrl('N');
|
||||
#ifdef __APPLE__
|
||||
if (Fl::event_state() & (FL_META) ) {
|
||||
shift_position(size());
|
||||
return 1;
|
||||
}
|
||||
if (Fl::event_state() & (FL_ALT) ) {
|
||||
if (mods==0) { // line down
|
||||
ascii = ctrl('N');
|
||||
} else if (mods==FL_CTRL) {
|
||||
return 1; // FIXME scroll text up one page
|
||||
} else if (mods==FL_ALT) { // line end and down
|
||||
if (line_end(position())==position() && position()<size())
|
||||
return shift_position(line_end(position()+1)) + NORMAL_INPUT_MOVE;
|
||||
else
|
||||
return shift_position(line_end(position())) + NORMAL_INPUT_MOVE;
|
||||
}
|
||||
#endif // __APPLE__
|
||||
} else if (mods==FL_META) { // end of document
|
||||
shift_position(size());
|
||||
return 1;
|
||||
} else return 1;
|
||||
#else
|
||||
if (mods==0) { // line down
|
||||
ascii = ctrl('N');
|
||||
} else if (mods==FL_CTRL) {
|
||||
return 1; // FIXME scroll text up one line
|
||||
} else return 1;
|
||||
#endif
|
||||
break;
|
||||
case FL_Home:
|
||||
if (Fl::event_state() & FL_CTRL) {
|
||||
#ifdef __APPLE__
|
||||
if (mods==0) {
|
||||
return 1; // FIXME scroll display to the top
|
||||
} else return 1;
|
||||
#else
|
||||
if (mods==0) {
|
||||
ascii = ctrl('A');
|
||||
} else if (mods==FL_CTRL) {
|
||||
shift_position(0);
|
||||
return 1;
|
||||
}
|
||||
ascii = ctrl('A');
|
||||
#endif
|
||||
break;
|
||||
case FL_End:
|
||||
if (Fl::event_state() & FL_CTRL) {
|
||||
#ifdef __APPLE__
|
||||
if (mods==0) {
|
||||
return 1; // FIXME scroll display to the bottom
|
||||
} else return 1;
|
||||
#else
|
||||
if (mods==0) {
|
||||
ascii = ctrl('E');
|
||||
} else if (mods==FL_CTRL) {
|
||||
shift_position(size());
|
||||
return 1;
|
||||
}
|
||||
ascii = ctrl('E'); break;
|
||||
|
||||
} else return 1;
|
||||
#endif
|
||||
break;
|
||||
case FL_BackSpace:
|
||||
ascii = ctrl('H'); break;
|
||||
#ifdef __APPLE__
|
||||
if (mods==0 || mods==FL_CTRL) { // delete previous char
|
||||
ascii = ctrl('H');
|
||||
} else if (mods==FL_ALT) { // delete previous word
|
||||
if (mark() != position()) return cut();
|
||||
cut(word_start(position()), position());
|
||||
return 1;
|
||||
} else if (mods==FL_META) { // delete to the beginning of the line
|
||||
if (mark() != position()) return cut();
|
||||
cut(line_start(position()), position());
|
||||
return 1;
|
||||
} else return 1;
|
||||
#else
|
||||
ascii = ctrl('H');
|
||||
#endif
|
||||
break;
|
||||
case FL_Enter:
|
||||
case FL_KP_Enter:
|
||||
if (when() & FL_WHEN_ENTER_KEY) {
|
||||
|
||||
@ -364,6 +364,7 @@ static int isword(char c) {
|
||||
int Fl_Input_::word_end(int i) const {
|
||||
if (input_type() == FL_SECRET_INPUT) return size();
|
||||
//while (i < size() && !isword(index(i))) i++;
|
||||
while (i < size() && !isword(index(i))) i++;
|
||||
while (i < size() && isword(index(i))) i++;
|
||||
return i;
|
||||
}
|
||||
@ -372,6 +373,7 @@ int Fl_Input_::word_start(int i) const {
|
||||
if (input_type() == FL_SECRET_INPUT) return 0;
|
||||
// if (i >= size() || !isword(index(i)))
|
||||
// while (i > 0 && !isword(index(i-1))) i--;
|
||||
while (i > 0 && !isword(index(i-1))) i--;
|
||||
while (i > 0 && isword(index(i-1))) i--;
|
||||
return i;
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user