Browse Source

Fixed control-left/right on MacOS

pipelines/235045657
eidheim 6 years ago
parent
commit
739a4081b2
  1. 68
      src/source.cpp
  2. 140
      src/source_base.cpp
  3. 7
      src/source_base.hpp

68
src/source.cpp

@ -2032,72 +2032,6 @@ bool Source::View::on_key_press_event(GdkEventKey *key) {
}
}
//Move cursor one paragraph down
if((key->keyval == GDK_KEY_Down || key->keyval == GDK_KEY_KP_Down) && (key->state & GDK_CONTROL_MASK) > 0) {
auto selection_start_iter = get_buffer()->get_selection_bound()->get_iter();
auto iter = get_buffer()->get_iter_at_line(get_buffer()->get_insert()->get_iter().get_line());
bool empty_line = false;
bool text_found = false;
for(;;) {
if(!iter)
break;
if(iter.starts_line())
empty_line = true;
if(empty_line && !iter.ends_line() && *iter != ' ' && *iter != '\t')
empty_line = false;
if(!text_found && !iter.ends_line() && *iter != ' ' && *iter != '\t')
text_found = true;
if(empty_line && text_found && iter.ends_line())
break;
iter.forward_char();
}
iter = get_buffer()->get_iter_at_line(iter.get_line());
if((key->state & GDK_SHIFT_MASK) > 0)
get_buffer()->select_range(iter, selection_start_iter);
else
get_buffer()->place_cursor(iter);
scroll_to(get_buffer()->get_insert());
return true;
}
//Move cursor one paragraph up
else if((key->keyval == GDK_KEY_Up || key->keyval == GDK_KEY_KP_Up) && (key->state & GDK_CONTROL_MASK) > 0) {
auto selection_start_iter = get_buffer()->get_selection_bound()->get_iter();
auto iter = get_buffer()->get_iter_at_line(get_buffer()->get_insert()->get_iter().get_line());
iter.backward_char();
bool empty_line = false;
bool text_found = false;
bool move_to_start = false;
for(;;) {
if(!iter)
break;
if(iter.ends_line())
empty_line = true;
if(empty_line && !iter.ends_line() && *iter != ' ' && *iter != '\t')
empty_line = false;
if(!text_found && !iter.ends_line() && *iter != ' ' && *iter != '\t')
text_found = true;
if(empty_line && text_found && iter.starts_line())
break;
if(iter.is_start()) {
move_to_start = true;
break;
}
iter.backward_char();
}
if(empty_line && !move_to_start) {
iter = get_iter_at_line_end(iter.get_line());
iter.forward_char();
if(!iter.starts_line()) // For CR+LF
iter.forward_char();
}
if((key->state & GDK_SHIFT_MASK) > 0)
get_buffer()->select_range(iter, selection_start_iter);
else
get_buffer()->place_cursor(iter);
scroll_to(get_buffer()->get_insert());
return true;
}
get_buffer()->begin_user_action();
// Shift+enter: go to end of line and enter
@ -2128,7 +2062,7 @@ bool Source::View::on_key_press_event(GdkEventKey *key) {
}
else {
get_buffer()->end_user_action();
return Gsv::View::on_key_press_event(key);
return BaseView::on_key_press_event(key);
}
}

140
src/source_base.cpp

@ -925,6 +925,112 @@ std::string Source::BaseView::get_selected_text() {
return get_buffer()->get_text(start, end);
}
bool Source::BaseView::on_key_press_event(GdkEventKey *key) {
//Move cursor one paragraph down
if((key->keyval == GDK_KEY_Down || key->keyval == GDK_KEY_KP_Down) && (key->state & GDK_CONTROL_MASK) > 0) {
auto selection_start_iter = get_buffer()->get_selection_bound()->get_iter();
auto iter = get_buffer()->get_iter_at_line(get_buffer()->get_insert()->get_iter().get_line());
bool empty_line = false;
bool text_found = false;
for(;;) {
if(!iter)
break;
if(iter.starts_line())
empty_line = true;
if(empty_line && !iter.ends_line() && *iter != ' ' && *iter != '\t')
empty_line = false;
if(!text_found && !iter.ends_line() && *iter != ' ' && *iter != '\t')
text_found = true;
if(empty_line && text_found && iter.ends_line())
break;
iter.forward_char();
}
iter = get_buffer()->get_iter_at_line(iter.get_line());
if((key->state & GDK_SHIFT_MASK) > 0)
get_buffer()->select_range(iter, selection_start_iter);
else
get_buffer()->place_cursor(iter);
scroll_to(get_buffer()->get_insert());
return true;
}
//Move cursor one paragraph up
else if((key->keyval == GDK_KEY_Up || key->keyval == GDK_KEY_KP_Up) && (key->state & GDK_CONTROL_MASK) > 0) {
auto selection_start_iter = get_buffer()->get_selection_bound()->get_iter();
auto iter = get_buffer()->get_iter_at_line(get_buffer()->get_insert()->get_iter().get_line());
iter.backward_char();
bool empty_line = false;
bool text_found = false;
bool move_to_start = false;
for(;;) {
if(!iter)
break;
if(iter.ends_line())
empty_line = true;
if(empty_line && !iter.ends_line() && *iter != ' ' && *iter != '\t')
empty_line = false;
if(!text_found && !iter.ends_line() && *iter != ' ' && *iter != '\t')
text_found = true;
if(empty_line && text_found && iter.starts_line())
break;
if(iter.is_start()) {
move_to_start = true;
break;
}
iter.backward_char();
}
if(empty_line && !move_to_start) {
iter = get_iter_at_line_end(iter.get_line());
iter.forward_char();
if(!iter.starts_line()) // For CR+LF
iter.forward_char();
}
if((key->state & GDK_SHIFT_MASK) > 0)
get_buffer()->select_range(iter, selection_start_iter);
else
get_buffer()->place_cursor(iter);
scroll_to(get_buffer()->get_insert());
return true;
}
// Move cursors left one word
if((key->keyval == GDK_KEY_Left || key->keyval == GDK_KEY_KP_Left) && (key->state & GDK_CONTROL_MASK) > 0) {
enable_multiple_cursors = false;
for(auto &extra_cursor : extra_cursors) {
auto iter = extra_cursor.mark->get_iter();
iter.backward_word_start();
extra_cursor.offset = iter.get_line_offset();
get_buffer()->move_mark(extra_cursor.mark, iter);
}
auto insert = get_buffer()->get_insert();
auto iter = insert->get_iter();
iter.backward_word_start();
get_buffer()->move_mark(insert, iter);
if((key->state & GDK_SHIFT_MASK) == 0)
get_buffer()->move_mark_by_name("selection_bound", iter);
enable_multiple_cursors = true;
return true;
}
// Move cursors right one word
if((key->keyval == GDK_KEY_Right || key->keyval == GDK_KEY_KP_Right) && (key->state & GDK_CONTROL_MASK) > 0) {
enable_multiple_cursors = false;
for(auto &extra_cursor : extra_cursors) {
auto iter = extra_cursor.mark->get_iter();
iter.forward_visible_word_end();
extra_cursor.offset = iter.get_line_offset();
get_buffer()->move_mark(extra_cursor.mark, iter);
}
auto insert = get_buffer()->get_insert();
auto iter = insert->get_iter();
iter.forward_visible_word_end();
get_buffer()->move_mark(insert, iter);
if((key->state & GDK_SHIFT_MASK) == 0)
get_buffer()->move_mark_by_name("selection_bound", iter);
enable_multiple_cursors = true;
return true;
}
return Gsv::View::on_key_press_event(key);
}
bool Source::BaseView::on_key_press_event_extra_cursors(GdkEventKey *key) {
setup_extra_cursor_signals();
@ -1026,40 +1132,6 @@ bool Source::BaseView::on_key_press_event_extra_cursors(GdkEventKey *key) {
return true;
}
// Move cursors left/right
if((key->keyval == GDK_KEY_Left || key->keyval == GDK_KEY_KP_Left) && (key->state & GDK_CONTROL_MASK) > 0) {
enable_multiple_cursors = false;
for(auto &extra_cursor : extra_cursors) {
auto iter = extra_cursor.mark->get_iter();
iter.backward_word_start();
extra_cursor.offset = iter.get_line_offset();
get_buffer()->move_mark(extra_cursor.mark, iter);
}
auto insert = get_buffer()->get_insert();
auto iter = insert->get_iter();
iter.backward_word_start();
get_buffer()->move_mark(insert, iter);
if((key->state & GDK_SHIFT_MASK) == 0)
get_buffer()->move_mark_by_name("selection_bound", iter);
return true;
}
if((key->keyval == GDK_KEY_Right || key->keyval == GDK_KEY_KP_Right) && (key->state & GDK_CONTROL_MASK) > 0) {
enable_multiple_cursors = false;
for(auto &extra_cursor : extra_cursors) {
auto iter = extra_cursor.mark->get_iter();
iter.forward_visible_word_end();
extra_cursor.offset = iter.get_line_offset();
get_buffer()->move_mark(extra_cursor.mark, iter);
}
auto insert = get_buffer()->get_insert();
auto iter = insert->get_iter();
iter.forward_visible_word_end();
get_buffer()->move_mark(insert, iter);
if((key->state & GDK_SHIFT_MASK) == 0)
get_buffer()->move_mark_by_name("selection_bound", iter);
return true;
}
// Move cursors up/down
if((key->keyval == GDK_KEY_Up || key->keyval == GDK_KEY_KP_Up)) {
enable_multiple_cursors = false;

7
src/source_base.hpp

@ -142,18 +142,21 @@ namespace Source {
bool enable_multiple_cursors = false;
bool on_key_press_event(GdkEventKey *key) override;
bool on_key_press_event_extra_cursors(GdkEventKey *key);
struct ExtraCursor {
Glib::RefPtr<Gtk::TextBuffer::Mark> mark;
int offset;
};
std::vector<ExtraCursor> extra_cursors;
struct ExtraSnippetCursor {
Glib::RefPtr<Gtk::TextBuffer::Mark> mark;
boost::optional<int> initial_forward_erase_size;
};
bool on_key_press_event_extra_cursors(GdkEventKey *key);
std::vector<ExtraSnippetCursor> extra_snippet_cursors;
void setup_extra_cursor_signals();
bool extra_cursors_signals_set = false;

Loading…
Cancel
Save