X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=bin%2Fsup;h=5049879cd16432661bb46fb8176b008f89c1eab2;hb=d4c1bd840f55a07fd5aeb4d08a1f43c3f7c1850e;hp=1ca98194b2a48d29bd7f0d84463db9d97ca960a0;hpb=ac2d27b230c0afc36eafddec1c387a6ab68a837d;p=sup diff --git a/bin/sup b/bin/sup index 1ca9819..5049879 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 @@ -78,6 +79,8 @@ global_keymap = Keymap.new do |k| k.add :compose, "Compose new message", 'm', 'c' k.add :nothing, "Do nothing", :ctrl_g k.add :recall_draft, "Edit most recent draft message", 'R' + k.add :show_inbox, "Show the Inbox buffer", 'I' + k.add :show_console, "Show the Console buffer", '~' end ## the following magic enables wide characters when used with a ruby @@ -130,36 +133,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 = @@ -305,6 +298,11 @@ begin b, new = BufferManager.spawn_unless_exists("All drafts") { LabelSearchResultsMode.new [:draft] } b.mode.load_threads :num => b.content_height if new end + when :show_inbox + BufferManager.raise_to_front ibuf + when :show_console + b, new = bm.spawn_unless_exists("Console", :system => true) { ConsoleMode.new } + b.mode.run when :nothing, InputSequenceAborted when :redraw bm.completely_redraw_screen @@ -315,13 +313,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 +330,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