If you were to leave sup running for a long time, this patch would enable you to get a glance summary of new mail activity since sup was last touched, by letting the poll update message accumulate its tally while idle.
On keystrokes, BufferManager sends an :unidle update if the last keystroke occurred more than :idle_threshold seconds ago. PollManager listens for :unidle updates to clear PollTally. It is also cleared on each poll unless idle. * :idle_threshold defaults to 60 seconds if not defined in config.yaml * presently no :idle update is sent when becoming idle * but we can check for idleness with BufferManager.idle? * after-poll behavior is unaffected --- lib/sup.rb | 3 ++- lib/sup/buffer.rb | 5 +++++ lib/sup/poll.rb | 24 ++++++++++++++++++++++-- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/lib/sup.rb b/lib/sup.rb index 840b3fc..a6de0ab 100644 --- a/lib/sup.rb +++ b/lib/sup.rb @@ -229,7 +229,8 @@ else :confirm_top_posting => true, :discard_snippets_from_encrypted_messages => false, :default_attachment_save_dir => "", - :sent_source => "sup://sent" + :sent_source => "sup://sent", + :idle_threshold => 60 } begin FileUtils.mkdir_p Redwood::BASE_DIR diff --git a/lib/sup/buffer.rb b/lib/sup/buffer.rb index c826ab9..8bf666b 100644 --- a/lib/sup/buffer.rb +++ b/lib/sup/buffer.rb @@ -212,6 +212,7 @@ EOS @in_x = ENV["TERM"] =~ /(xterm|rxvt|screen)/ @sigwinch_happened = false @sigwinch_mutex = Mutex.new + @idle_since = Time.now end def sigwinch_happened!; @sigwinch_mutex.synchronize { @sigwinch_happened = true } end @@ -269,6 +270,8 @@ EOS @focus_buf.mode.cancel_search! @focus_buf.mark_dirty end + UpdateManager.relay self, :unidle, Time.at(@idle_since) if idle? + @idle_since = Time.now @focus_buf.mode.handle_input c end end @@ -761,6 +764,8 @@ EOS @shelled = false end + def idle?; Time.now.to_i - @idle_since.to_i >= ($config[:idle_threshold] || 60); end + private def default_status_bar buf diff --git a/lib/sup/poll.rb b/lib/sup/poll.rb index 4f30505..48228ca 100644 --- a/lib/sup/poll.rb +++ b/lib/sup/poll.rb @@ -37,6 +37,8 @@ EOS @polling = false @poll_sources = nil @mode = nil + PollTally.init + UpdateManager.register self end def poll_with_sources @@ -45,8 +47,10 @@ EOS BufferManager.flash "Polling for new messages..." num, numi, from_and_subj, from_and_subj_inbox, loaded_labels = @mode.poll - if num > 0 - BufferManager.flash "Loaded #{num.pluralize 'new message'}, #{numi} to inbox. Labels: #{loaded_labels.map{|l| l.to_s}.join(', ')}" + PollTally.clear unless BufferManager.idle? + PollTally.add :num => num, :num_inbox => numi, :loaded_labels => loaded_labels + if PollTally.num > 0 + BufferManager.flash "Loaded #{PollTally.num.pluralize 'new message'}, #{PollTally.num_inbox} to inbox. Labels: #{PollTally.loaded_labels.map{|l| l.to_s}.join(', ')}" else BufferManager.flash "No new messages." end @@ -183,6 +187,22 @@ EOS Index.add_message m UpdateManager.relay self, :added, m end + + def handle_unidle_update sender, idle_since; PollTally.clear; end +end + +class PollTally + include Singleton + attr_reader :num, :num_inbox, :loaded_labels + + def initialize; @num = 0; @num_inbox = 0; @loaded_labels = Set.new; end + def clear; @num = 0; @num_inbox = 0; @loaded_labels.clear; end + + def add opts={} + @num += opts[:num]||0 + @num_inbox += opts[:num_inbox]||0 + @loaded_labels = Set.new(opts[:loaded_labels] || []) + @loaded_labels + end end end -- 1.6.5.7 _______________________________________________ Sup-devel mailing list Sup-devel@rubyforge.org http://rubyforge.org/mailman/listinfo/sup-devel