From 739a4081b26483274b8b2f432d541fad932718a4 Mon Sep 17 00:00:00 2001 From: eidheim Date: Thu, 18 Jun 2020 12:03:09 +0200 Subject: [PATCH] Fixed control-left/right on MacOS --- src/source.cpp | 68 +-------------------- src/source_base.cpp | 140 +++++++++++++++++++++++++++++++++----------- src/source_base.hpp | 7 ++- 3 files changed, 112 insertions(+), 103 deletions(-) diff --git a/src/source.cpp b/src/source.cpp index 4b3b726..f9560da 100644 --- a/src/source.cpp +++ b/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); } } diff --git a/src/source_base.cpp b/src/source_base.cpp index c8853d3..f97818c 100644 --- a/src/source_base.cpp +++ b/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; diff --git a/src/source_base.hpp b/src/source_base.hpp index 0702445..214297a 100644 --- a/src/source_base.hpp +++ b/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 mark; int offset; }; std::vector extra_cursors; + struct ExtraSnippetCursor { Glib::RefPtr mark; boost::optional initial_forward_erase_size; }; - bool on_key_press_event_extra_cursors(GdkEventKey *key); - std::vector extra_snippet_cursors; + void setup_extra_cursor_signals(); bool extra_cursors_signals_set = false;