Browse Source

Terminal should now scroll to end (unless user is already scrolling window).

merge-requests/365/head
eidheim 10 years ago
parent
commit
39004e79c4
  1. 31
      src/terminal.cc

31
src/terminal.cc

@ -104,14 +104,6 @@ void Terminal::InProgress::cancel(const std::string& msg) {
} }
Terminal::Terminal() { Terminal::Terminal() {
set_editable(false);
signal_size_allocate().connect([this](Gtk::Allocation& allocation){
auto end=get_buffer()->create_mark(get_buffer()->end());
scroll_to(end);
get_buffer()->delete_mark(end);
});
bold_tag=get_buffer()->create_tag(); bold_tag=get_buffer()->create_tag();
bold_tag->property_weight()=PANGO_WEIGHT_BOLD; bold_tag->property_weight()=PANGO_WEIGHT_BOLD;
async_print_dispatcher.connect([this](){ async_print_dispatcher.connect([this](){
@ -274,6 +266,15 @@ int Terminal::print(const std::string &message, bool bold){
get_buffer()->insert_with_tag(get_buffer()->end(), message, bold_tag); get_buffer()->insert_with_tag(get_buffer()->end(), message, bold_tag);
else else
get_buffer()->insert(get_buffer()->end(), message); get_buffer()->insert(get_buffer()->end(), message);
auto iter=get_buffer()->get_insert()->get_iter();
if(iter.backward_char()) {
while(gtk_events_pending())
gtk_main_iteration();
scroll_to(iter);
while(gtk_events_pending())
gtk_main_iteration();
}
return get_buffer()->end().get_line(); return get_buffer()->end().get_line();
} }
@ -313,7 +314,11 @@ bool Terminal::on_key_press_event(GdkEventKey *event) {
if(unicode>=32 && unicode<=126) { if(unicode>=32 && unicode<=126) {
stdin_buffer+=chr; stdin_buffer+=chr;
get_buffer()->insert_at_cursor(stdin_buffer.substr(stdin_buffer.size()-1)); get_buffer()->insert_at_cursor(stdin_buffer.substr(stdin_buffer.size()-1));
while(gtk_events_pending())
gtk_main_iteration();
scroll_to(get_buffer()->get_insert()); scroll_to(get_buffer()->get_insert());
while(gtk_events_pending())
gtk_main_iteration();
} }
else if(event->keyval==GDK_KEY_BackSpace) { else if(event->keyval==GDK_KEY_BackSpace) {
if(stdin_buffer.size()>0 && get_buffer()->get_char_count()>0) { if(stdin_buffer.size()>0 && get_buffer()->get_char_count()>0) {
@ -321,15 +326,23 @@ bool Terminal::on_key_press_event(GdkEventKey *event) {
iter--; iter--;
stdin_buffer.pop_back(); stdin_buffer.pop_back();
get_buffer()->erase(iter, get_buffer()->end()); get_buffer()->erase(iter, get_buffer()->end());
while(gtk_events_pending())
gtk_main_iteration();
scroll_to(get_buffer()->get_insert()); scroll_to(get_buffer()->get_insert());
while(gtk_events_pending())
gtk_main_iteration();
} }
} }
else if(event->keyval==GDK_KEY_Return) { else if(event->keyval==GDK_KEY_Return) {
stdin_buffer+='\n'; stdin_buffer+='\n';
write(async_executes.back().second, stdin_buffer.c_str(), stdin_buffer.size()); write(async_executes.back().second, stdin_buffer.c_str(), stdin_buffer.size());
get_buffer()->insert_at_cursor(stdin_buffer.substr(stdin_buffer.size()-1)); get_buffer()->insert_at_cursor(stdin_buffer.substr(stdin_buffer.size()-1));
stdin_buffer.clear(); while(gtk_events_pending())
gtk_main_iteration();
scroll_to(get_buffer()->get_insert()); scroll_to(get_buffer()->get_insert());
while(gtk_events_pending())
gtk_main_iteration();
stdin_buffer.clear();
} }
} }
async_executes_mutex.unlock(); async_executes_mutex.unlock();

Loading…
Cancel
Save