X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=bin%2Fsup;h=de0572cfda2cda7f83ebcc33597db5a2a72331ab;hb=0646c7e1688bf8755e5eb1a97dfa2d787acd1204;hp=7a51800a461c2c82a6a6f35e2b075451f05991bb;hpb=3dc202c1f8880357ce31bb65e4f52fe1110dad60;p=sup diff --git a/bin/sup b/bin/sup index 7a51800..de0572c 100755 --- a/bin/sup +++ b/bin/sup @@ -58,6 +58,7 @@ if $opts[:list_hooks] end Thread.abort_on_exception = true # make debugging possible +Thread.current.priority = 1 # keep ui responsive module Redwood @@ -131,36 +132,16 @@ end module_function :start_cursing, :stop_cursing Index.init -begin - Index.lock -rescue Index::LockError => e - require 'highline' - - h = HighLine.new - h.wrap_at = :auto - h.say Index.fancy_lock_error_message_for(e) - - case h.ask("Should I ask that process to kill itself? ") - when /^\s*y(es)?\s*$/i - h.say "Ok, suggesting seppuku..." - FileUtils.touch Redwood::SUICIDE_FN - sleep SuicideManager::DELAY * 2 - FileUtils.rm_f Redwood::SUICIDE_FN - h.say "Let's try that again." - retry - else - h.say < e - if e.is_a?(Interrupt) - raise if BufferManager.ask_yes_or_no("Die ungracefully now?") - bm.draw_screen - nil - end - end - next unless c + until Redwood::exceptions.nonempty? || $die + c = begin + Ncurses.nonblocking_getch + rescue Interrupt => e + raise if BufferManager.ask_yes_or_no "Die ungracefully now?" + BufferManager.draw_screen + nil + end + + if c.nil? + if BufferManager.sigwinch_happened? + debug "redrawing screen on sigwinch" + BufferManager.completely_redraw_screen + end + next + end + + if c == 410 + ## this is ncurses's way of telling us it's detected a refresh. + ## since we have our own sigwinch handler, we don't do anything. + next + end + bm.erase_flash - action = - begin - if bm.handle_input c - :nothing - else - bm.resolve_input_with_keymap c, global_keymap - end - rescue InputSequenceAborted + action = begin + if bm.handle_input c :nothing + else + bm.resolve_input_with_keymap c, global_keymap end + rescue InputSequenceAborted + :nothing + end case action when :quit_now break if bm.kill_all_buffers_safely @@ -315,13 +305,12 @@ begin bm.draw_screen end - bm.kill_all_buffers if SuicideManager.die? + bm.kill_all_buffers if $die rescue Exception => e Redwood::record_exception e, "main" ensure unless $opts[:no_threads] PollManager.stop if PollManager.instantiated? - SuicideManager.stop if PollManager.instantiated? Index.stop_lock_update_thread end @@ -333,7 +322,7 @@ ensure Redwood::Logger.add_sink $stderr, false debug "stopped cursing" - if SuicideManager.instantiated? && SuicideManager.die? + if $die info "I've been ordered to commit seppuku. I obey!" end