Browse Source

Fixed crash when trying to scroll in an already closed SelectionDialog

merge-requests/365/head
Ole Christian Eidheim 9 years ago
parent
commit
9a3da9043c
  1. 7
      src/selectiondialog.cc
  2. 2
      src/selectiondialog.h
  3. 4
      src/source.cc
  4. 4
      src/source_clang.cc
  5. 2
      src/source_spellcheck.cc

7
src/selectiondialog.cc

@ -90,7 +90,7 @@ SelectionDialogBase::SelectionDialogBase(Gtk::TextView& text_view, Glib::RefPtr<
} }
void SelectionDialogBase::cursor_changed() { void SelectionDialogBase::cursor_changed() {
if(!shown) if(!is_visible())
return; return;
auto it=list_view_text.get_selection()->get_selected(); auto it=list_view_text.get_selection()->get_selected();
std::string row; std::string row;
@ -112,7 +112,6 @@ void SelectionDialogBase::add_row(const std::string& row) {
} }
void SelectionDialogBase::show() { void SelectionDialogBase::show() {
shown=true;
window.show_all(); window.show_all();
text_view.grab_focus(); text_view.grab_focus();
@ -124,6 +123,7 @@ void SelectionDialogBase::show() {
else if(list_view_text.get_model()->children().begin()!=list_view_text.get_selection()->get_selected()) { else if(list_view_text.get_model()->children().begin()!=list_view_text.get_selection()->get_selected()) {
while(Gtk::Main::events_pending()) while(Gtk::Main::events_pending())
Gtk::Main::iteration(false); Gtk::Main::iteration(false);
if(is_visible())
list_view_text.scroll_to_row(list_view_text.get_model()->get_path(list_view_text.get_selection()->get_selected()), 0.5); list_view_text.scroll_to_row(list_view_text.get_model()->get_path(list_view_text.get_selection()->get_selected()), 0.5);
} }
} }
@ -138,9 +138,8 @@ void SelectionDialogBase::set_cursor_at_last_row() {
} }
void SelectionDialogBase::hide() { void SelectionDialogBase::hide() {
if(!shown) if(!is_visible())
return; return;
shown=false;
window.hide(); window.hide();
if(on_hide) if(on_hide)
on_hide(); on_hide();

2
src/selectiondialog.h

@ -37,13 +37,13 @@ public:
void set_cursor_at_last_row(); void set_cursor_at_last_row();
void show(); void show();
void hide(); void hide();
bool is_visible() {return window.is_visible();}
std::function<void()> on_hide; std::function<void()> on_hide;
std::function<void(const std::string& selected, bool hide_window)> on_select; std::function<void(const std::string& selected, bool hide_window)> on_select;
std::function<void(const std::string &selected)> on_changed; std::function<void(const std::string &selected)> on_changed;
Glib::RefPtr<Gtk::TextBuffer::Mark> start_mark; Glib::RefPtr<Gtk::TextBuffer::Mark> start_mark;
bool shown=false;
protected: protected:
void cursor_changed(); void cursor_changed();

4
src/source.cc

@ -1244,11 +1244,11 @@ std::string Source::View::get_token(Gtk::TextIter iter) {
} }
bool Source::View::on_key_press_event(GdkEventKey* key) { bool Source::View::on_key_press_event(GdkEventKey* key) {
if(selection_dialog && selection_dialog->shown) { if(selection_dialog && selection_dialog->is_visible()) {
if(selection_dialog->on_key_press(key)) if(selection_dialog->on_key_press(key))
return true; return true;
} }
if(autocomplete_dialog && autocomplete_dialog->shown) { if(autocomplete_dialog && autocomplete_dialog->is_visible()) {
if(autocomplete_dialog->on_key_press(key)) if(autocomplete_dialog->on_key_press(key))
return true; return true;
} }

4
src/source_clang.cc

@ -568,7 +568,7 @@ void Source::ClangViewParse::show_type_tooltips(const Gdk::Rectangle &rectangle)
Source::ClangViewAutocomplete::ClangViewAutocomplete(const boost::filesystem::path &file_path, Glib::RefPtr<Gsv::Language> language): Source::ClangViewAutocomplete::ClangViewAutocomplete(const boost::filesystem::path &file_path, Glib::RefPtr<Gsv::Language> language):
Source::ClangViewParse(file_path, language), autocomplete_state(AutocompleteState::IDLE) { Source::ClangViewParse(file_path, language), autocomplete_state(AutocompleteState::IDLE) {
get_buffer()->signal_changed().connect([this](){ get_buffer()->signal_changed().connect([this](){
if(autocomplete_dialog && autocomplete_dialog->shown) if(autocomplete_dialog && autocomplete_dialog->is_visible())
delayed_reparse_connection.disconnect(); delayed_reparse_connection.disconnect();
else { else {
if(!has_focus()) if(!has_focus())
@ -596,7 +596,7 @@ Source::ClangViewAutocomplete::ClangViewAutocomplete(const boost::filesystem::pa
}); });
signal_key_release_event().connect([this](GdkEventKey* key){ signal_key_release_event().connect([this](GdkEventKey* key){
if(autocomplete_dialog && autocomplete_dialog->shown) { if(autocomplete_dialog && autocomplete_dialog->is_visible()) {
if(autocomplete_dialog->on_key_release(key)) if(autocomplete_dialog->on_key_release(key))
return true; return true;
} }

2
src/source_spellcheck.cc

@ -27,7 +27,7 @@ Source::SpellCheckView::SpellCheckView() : Gsv::View() {
spellcheck_error_tag->property_underline()=Pango::Underline::UNDERLINE_ERROR; spellcheck_error_tag->property_underline()=Pango::Underline::UNDERLINE_ERROR;
signal_key_press_event().connect([this](GdkEventKey *event) { signal_key_press_event().connect([this](GdkEventKey *event) {
if(spellcheck_suggestions_dialog && spellcheck_suggestions_dialog->shown) { if(spellcheck_suggestions_dialog && spellcheck_suggestions_dialog->is_visible()) {
if(spellcheck_suggestions_dialog->on_key_press(event)) if(spellcheck_suggestions_dialog->on_key_press(event))
return true; return true;
} }

Loading…
Cancel
Save