Subject: [sup-devel] [PATCHv2] idle and unidle updates

From: Eric Sherman <[email-masked]>
Date: Thu, 14 Jan 2010 10:45:54 -0500

---
 bin/sup |   17 +++++++++++++++++
 1 files changed, 17 insertions(+), 0 deletions(-)

diff --git a/bin/sup b/bin/sup
index 19b2a87..0d90d00 100755
--- a/bin/sup
+++ b/bin/sup
@@ -260,6 +260,10 @@ begin
     SearchResultsMode.spawn_from_query $opts[:search]
   end
 
+  IDLE_THRESHOLD = 60
+  no_keystrokes_since = Time.now
+  idle = false
+
   until Redwood::exceptions.nonempty? || $die
     c = begin
       Ncurses.nonblocking_getch
@@ -274,9 +278,22 @@ begin
         debug "redrawing screen on sigwinch"
         BufferManager.completely_redraw_screen
       end
+
+      if !idle and Time.now.to_i - no_keystrokes_since.to_i >= IDLE_THRESHOLD
+        UpdateManager.relay self, :idle, Time.at(no_keystrokes_since)
+        idle = true
+      end
+
       next
     end
 
+    if idle
+      UpdateManager.relay self, :unidle, Time.at(no_keystrokes_since)
+      idle = false
+    end
+
+    no_keystrokes_since = Time.now
+
     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.
-- 
1.6.6

_______________________________________________
Sup-devel mailing list
[email-masked]
http://rubyforge.org/mailman/listinfo/sup-devel

---

From: Eric Sherman <[email-masked]>
Date: Fri, 22 Jan 2010 15:13:01 -0500

This is a problematic place for this logic to go, since it appears as if 
the idle update does not fire when shelled to the editor, and instead fires 
immediately upon returning.  Which ironically is exactly when you're 
becoming unidle.

I'm thinking of an IdleManager with a single public method #ping that can 
be called here where no_keystrokes_since is being updated.  It has a thread 
that does the threshold checking and relays the updates.  This way it's not 
in the main thread and doesn't block when shelled.

Thoughts?