repo: rxvt-unicode-sixel
action: commit
revision: 
path_from: 
revision_from: dbf367f343c7aabb4796ebabb2055bc627057e85:
path_to: 
revision_to: 
git.thebackupbox.net
rxvt-unicode-sixel
git clone git://git.thebackupbox.net/rxvt-unicode-sixel
commit dbf367f343c7aabb4796ebabb2055bc627057e85
Author: Marc Lehmann 
Date:   Wed Nov 26 10:42:34 2003 +0000

    *** empty log message ***

diff --git a/src/Makefile.in b/src/Makefile.in
index 6abc94b64a65c6300b9f77129fbe2cb999bc8750..
index ..3ed6022ad9cec41154e177a90c7557741f640108 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -1,4 +1,4 @@
-# $Id: Makefile.in,v 1.3 2003/11/25 11:52:42 pcg Exp $
+# $Id: Makefile.in,v 1.4 2003/11/26 10:42:34 pcg Exp $
 @MCOMMON@

 LINT = lint -DNARROWPROTO=1 $(XINC) -chapbxz
@@ -183,7 +183,6 @@ distcopy: .protos $(INTPROS)

 defaultfont.h: encoding.h rxvtvec.h
 rxvtlib.h: rxvtcolor.h defaultfont.h
-iom.o:              iom.C		iom.h
 rxvtdaemon.o:       rxvtdaemon.C	rxvtdaemon.h
 rxvtd.o:            rxvtd.C     $(DEPS) rxvtdaemon.h rxvtvec.h
 rxvtc.o:            rxvtc.C     $(DEPS) rxvtdaemon.h rxvtvec.h
@@ -210,6 +209,7 @@ xdefaults.o:        xdefaults.C $(DEPS) xdefaults.intpro	  version.h
 xpm.o:              xpm.C       $(DEPS) xpm.intpro
 encoding.o:         encoding.C	$(DEPS) encoding.h
 rxvtcolor.o:        rxvtcolor.C	$(DEPS)
+iom.o:              iom.C	$(DEPS)	iom.h

 command.lo:         command.C   $(DEPS) command.intpro	command.h version.h
 defaultfont.lo:     defaultfont.C $(DEPS) defaultfont.intpro defaultfont.h encoding.h
@@ -233,5 +233,6 @@ xdefaults.lo:       xdefaults.C $(DEPS) xdefaults.intpro	  version.h
 xpm.lo:             xpm.C       $(DEPS) xpm.intpro
 encoding.lo:        encoding.C	$(DEPS) encoding.h
 rxvtcolor.lo:       rxvtcolor.C	$(DEPS)
+iom.lo:             iom.C	$(DEPS)	iom.h


diff --git a/src/command.C b/src/command.C
index 89395f703ccc612b353610e0b8c46e1f25ecb7f1..
index ..43aed657c75e52a4e2898969354863ca5fb8f954 100644
--- a/src/command.C
+++ b/src/command.C
@@ -1,7 +1,7 @@
 /*--------------------------------*-C-*---------------------------------*
  * File:	command.c
  *----------------------------------------------------------------------*
- * $Id: command.C,v 1.7 2003/11/25 17:34:47 pcg Exp $
+ * $Id: command.C,v 1.8 2003/11/26 10:42:34 pcg Exp $
  *
  * All portions of code are copyright by their respective author/s.
  * Copyright (c) 1992      John Bovey, University of Kent at Canterbury 
@@ -709,7 +709,7 @@ rxvt_term::blink_cb (time_watcher &w)
   w.at += BLINK_INTERVAL;
   hidden_cursor = !hidden_cursor;
   want_refresh = 1;
-  flush();
+  flush ();
 }

 void
@@ -776,7 +776,7 @@ rxvt_term::next_char ()
 }

 bool
-rxvt_term::pty_fill (size_t count)
+rxvt_term::pty_fill ()
 {
   ssize_t n = cmdbuf_endp - cmdbuf_ptr;

@@ -784,7 +784,7 @@ rxvt_term::pty_fill (size_t count)
   cmdbuf_ptr = cmdbuf_base;
   cmdbuf_endp = cmdbuf_ptr + n;

-  n = read (cmd_fd, cmdbuf_endp, count);
+  n = read (cmd_fd, cmdbuf_endp, BUFSIZ - n);

   if (n > 0)
     {
@@ -794,15 +794,18 @@ rxvt_term::pty_fill (size_t count)
   else if (n < 0 && errno == EAGAIN)
     return false;

-  rxvt_clean_exit();
-  exit(EXIT_FAILURE);	/* bad order of events? */
+  rxvt_clean_exit ();
+  exit (EXIT_FAILURE);	/* bad order of events? */
 }

 void
 rxvt_term::pty_cb (io_watcher &w, short revents)
 {
-  while (pty_fill (BUFSIZ - (cmdbuf_endp - cmdbuf_ptr)))
+  // loop, but don't allow a single term to monopolize us
+  // the number of loops is fully arbitrary, and thus wrong
+  for (int i = 7; i-- && pty_fill (); )
     {
+      //TODO:
       /* once we know the shell is running, send the screen size.  Again! */
       //ch = rxvt_cmd_getc(aR);	/* wait for something */
       //rxvt_tt_winsize(cmd_fd, TermWin.ncol, TermWin.nrow, cmd_pid);
@@ -923,7 +926,9 @@ rxvt_term::flush ()
 #endif
     }

+  if (XPending (Xdisplay)) process_x_events ();
   XFlush (Xdisplay);
+  if (XPending (Xdisplay)) process_x_events ();
 }

 /* rxvt_cmd_getc() - Return next input character */
@@ -944,7 +949,7 @@ rxvt_cmd_getc(pR)
       // incomplete sequences should occur rarely, still, a better solution
       // would be preferred. either setjmp/longjmp or better design.
       fcntl (R->cmd_fd, F_SETFL, 0);
-      R->pty_fill (1);
+      R->pty_fill ();
       fcntl (R->cmd_fd, F_SETFL, O_NONBLOCK);
     }

@@ -1291,17 +1296,18 @@ rxvt_process_x_event(pR_ XEvent *ev)
      * which ought to make things real slow!
      */
     case VisibilityNotify:
-	switch (ev->xvisibility.state) {
-	case VisibilityUnobscured:
-	    R->refresh_type = FAST_REFRESH;
-	    break;
-	case VisibilityPartiallyObscured:
-	    R->refresh_type = SLOW_REFRESH;
-	    break;
-	default:
-	    R->refresh_type = NO_REFRESH;
-	    break;
-	}
+	switch (ev->xvisibility.state)
+          {
+            case VisibilityUnobscured:
+              R->refresh_type = FAST_REFRESH;
+              break;
+            case VisibilityPartiallyObscured:
+              R->refresh_type = SLOW_REFRESH;
+              break;
+            default:
+              R->refresh_type = NO_REFRESH;
+              break;
+          }
 	break;

     case FocusIn:
diff --git a/src/init.C b/src/init.C
index 45442de9a51d6b870e5fcc05ec049ffe6072a44e..
index ..60db91aa44ac8e47531d3ce93227c4011835b81b 100644
--- a/src/init.C
+++ b/src/init.C
@@ -1,7 +1,7 @@
 /*--------------------------------*-C-*---------------------------------*
  * File:        init.c
  *----------------------------------------------------------------------*
- * $Id: init.C,v 1.6 2003/11/25 17:11:33 pcg Exp $
+ * $Id: init.C,v 1.7 2003/11/26 10:42:34 pcg Exp $
  *
  * All portions of code are copyright by their respective author/s.
  * Copyright (c) 1992      John Bovey, University of Kent at Canterbury 
@@ -475,6 +475,7 @@ rxvt_init_secondary(pR)
         close(i);
     }
     dup2(STDERR_FILENO, STDOUT_FILENO);
+#if 0 // schmorp sayz closing filies is murder
     for (i = STDERR_FILENO + 1; i < R->num_fds; i++) {
 #ifdef __sgi                    /* Alex Coventry says we need 4 & 7 too */
         if (i == 4 || i == 7)
@@ -482,6 +483,7 @@ rxvt_init_secondary(pR)
 #endif
         close(i);
     }
+#endif
 }

 /*----------------------------------------------------------------------*/
diff --git a/src/iom.C b/src/iom.C
index 7f0939505e3caf38826c9bfb4ccda65da6670d39..
index ..3b2e86af5a0d1d6da8069ad4690b98def19604fd 100644
--- a/src/iom.C
+++ b/src/iom.C
@@ -30,6 +30,39 @@ tstamp NOW;
 bool iom_valid;
 io_manager iom;

+template
+void io_manager::reg (watcher *w, simplevec &queue)
+{
+  if (find (queue.begin (), queue.end (), w) == queue.end ())
+    queue.push_back (w);
+}
+
+template
+void io_manager::unreg (watcher *w, simplevec &queue)
+{
+  queue.erase (find (queue.begin (), queue.end (), w));
+}
+
+#if IOM_IO
+io_watcher::~io_watcher ()
+{
+  if (iom_valid)
+    iom.unreg (this);
+}
+
+void io_manager::reg (io_watcher *w)
+{
+  reg (w, iow);
+}
+
+void io_manager::unreg (io_watcher *w)
+{
+  unreg (w, iow);
+}
+
+#endif
+
+#if IOM_TIME
 void time_watcher::trigger ()
 {
   call (*this);
@@ -45,34 +78,36 @@ time_watcher::~time_watcher ()
   at = TSTAMP_CANCEL;
 }

-io_watcher::~io_watcher ()
+void io_manager::reg (time_watcher *w)
 {
-  if (iom_valid)
-    iom.unreg (this);
+  reg (w, tw);
 }

-void io_manager::reg (io_watcher *w)
+void io_manager::unreg (time_watcher *w)
 {
-  if (find (iow.begin (), iow.end (), w) == iow.end ())
-    iow.push_back (w);
+  unreg (w, tw);
 }
+#endif

-void io_manager::unreg (io_watcher *w)
+#if IOM_CHECK
+check_watcher::~check_watcher ()
 {
-  iow.erase (find (iow.begin (), iow.end (), w));
+  if (iom_valid)
+    iom.unreg (this);
 }

-void io_manager::reg (time_watcher *w)
+void io_manager::reg (check_watcher *w)
 {
-  if (find (tw.begin (), tw.end (), w) == tw.end ())
-    tw.push_back (w);
+  reg (w, cw);
 }

-void io_manager::unreg (time_watcher *w)
+void io_manager::unreg (check_watcher *w)
 {
-  tw.erase (find (tw.begin (), tw.end (), w));
+  unreg (w, cw);
 }
+#endif

+#if IOM_TIME
 inline void set_now (void)
 {
   struct timeval tv;
@@ -80,21 +115,30 @@ inline void set_now (void)
   gettimeofday (&tv, 0);

   NOW = (tstamp)tv.tv_sec + (tstamp)tv.tv_usec / 1000000;
+#endif
 }

 void io_manager::loop ()
 {
+#if IOM_TIME
   set_now ();
+#endif

   for (;;)
     {
+#if IOM_CHECK
+      for (int i = 0; i < cw.size (); ++i)
+        cw[i]->call (*cw[i]);
+#endif
+
+#if IOM_TIME
       time_watcher *w;

       for (;;)
         {
           w = tw[0];

-          for (time_watcher **i = tw.begin (); i != tw.end (); ++i)
+          for (time_watcher **i = tw.begin (); i < tw.end (); ++i)
             if ((*i)->at < w->at)
               w = *i;

@@ -108,11 +152,13 @@ void io_manager::loop ()
             unreg (w);
         }

-      struct timeval to;
       double diff = w->at - NOW;
+      struct timeval to;
       to.tv_sec  = (int)diff;
       to.tv_usec = (int)((diff - to.tv_sec) * 1000000);
+#endif

+#if IOM_IO
       fd_set rfd, wfd;

       FD_ZERO (&rfd);
@@ -128,22 +174,31 @@ void io_manager::loop ()
           if ((*w)->fd > fds) fds = (*w)->fd;
         }

+# if IOM_TIME
       fds = select (fds + 1, &rfd, &wfd, 0, &to);
-
       set_now ();
+# else
+      fds = select (fds + 1, &rfd, &wfd, 0, 0);
+# endif

       if (fds > 0)
-        for (io_watcher **w = iow.begin (); w < iow.end (); ++w)
+        for (int i = 0; i < iow.size (); ++i)
           {
-            short revents = (*w)->events;
+            io_watcher *w = iow[i];

-            if (!FD_ISSET ((*w)->fd, &rfd)) revents &= ~EVENT_READ;
-            if (!FD_ISSET ((*w)->fd, &wfd)) revents &= ~EVENT_WRITE;
+            short revents = w->events;
+
+            if (!FD_ISSET (w->fd, &rfd)) revents &= ~EVENT_READ;
+            if (!FD_ISSET (w->fd, &wfd)) revents &= ~EVENT_WRITE;

             if (revents)
-              (*w)->call (**w, revents);
+              w->call (*w, revents);
           }
     }
+#elif IOM_TIME
+      select (0, 0, 0, 0, &to);
+      set_now ();
+#endif
 }

 void io_manager::idle_cb (time_watcher &w)
@@ -157,8 +212,10 @@ io_manager::io_manager ()

   iom_valid = true;

+#if IOM_TIME
   idle = new time_watcher (this, &io_manager::idle_cb);
   idle->start (0);
+#endif
 }

 io_manager::~io_manager ()
diff --git a/src/iom.h b/src/iom.h
index ce41c2f6ab74ed75940a0d57d9c786ae8c17bb62..
index ..ec381a80a57038e4a4224fc395212a59865c547e 100644
--- a/src/iom.h
+++ b/src/iom.h
@@ -25,24 +25,53 @@
 #include "rxvtvec.h"
 #include "callback.h"

-typedef double tstamp;
+#define IOM_IO 1
+#define IOM_TIME 1
+#undef IOM_CHECK

-extern tstamp NOW;
+#if IOM_IO
+  typedef double tstamp;
+  extern tstamp NOW;

-struct io_watcher;
-struct time_watcher;
+  struct io_watcher;
+#endif
+#if IOM_TIME
+  struct time_watcher;
+#endif
+#if IOM_CHECK
+  struct check_watcher;
+#endif

 class io_manager {
-  simplevec iow;
-  simplevec tw; // actually a heap
+#if IOM_IO
+  simplevec    iow;
+#endif
+#if IOM_CHECK
+  simplevec cw;
+#endif
+#if IOM_TIME
+  simplevec  tw;

   void idle_cb (time_watcher &w); time_watcher *idle;
+#endif
+
+  template
+  void reg (watcher *w, simplevec &queue);
+
+  template
+  void unreg (watcher *w, simplevec &queue);
+
 public:
   // register a watcher
-  void reg (io_watcher *w);
-  void unreg (io_watcher *w);
-  void reg (time_watcher *w);
-  void unreg (time_watcher *w);
+#if IOM_IO
+  void reg (io_watcher   *w);  void unreg (io_watcher   *w);
+#endif
+#if IOM_TIME
+  void reg (time_watcher *w);  void unreg (time_watcher *w);
+#endif
+#if IOM_CHECK
+  void reg (check_watcher *w); void unreg (check_watcher *w);
+#endif

   void loop ();

@@ -52,6 +81,7 @@ public:

 extern io_manager iom; // a singleton, together with it's construction/destruction problems.

+#if IOM_IO
 enum { EVENT_READ = 1, EVENT_WRITE = 2 };

 struct io_watcher : callback2 {
@@ -71,8 +101,10 @@ struct io_watcher : callback2 {
   void start (int fd_, short events_) { set (fd_, events_); iom.reg (this); }
   void stop () { iom.unreg (this); }
 };
+#endif

-#define TSTAMP_CANCEL -1.
+#if IOM_TIME
+enum { TSTAMP_CANCEL = -1 };

 struct time_watcher : callback1 {
   tstamp at;
@@ -98,6 +130,22 @@ struct time_watcher : callback1 {
       at = when;
     }
 };
+#endif
+
+#if IOM_CHECK
+// run before checking for new events
+struct check_watcher : callback1 {
+  template
+  check_watcher (O1 *object, void (O2::*method)(check_watcher &))
+    : callback1(object,method)
+    { }
+
+  ~check_watcher ();
+
+  void start () { iom.reg (this); }
+  void stop () { iom.unreg (this); }
+};
+#endif

 #endif

diff --git a/src/main.C b/src/main.C
index 498e92e435c17b6f003b2c8a4729b665c9ccdddb..
index ..3814702a073579451bcb687c0567938e5ca22758 100644
--- a/src/main.C
+++ b/src/main.C
@@ -1,7 +1,7 @@
 /*--------------------------------*-C-*---------------------------------*
  * File:        main.c
  *----------------------------------------------------------------------*
- * $Id: main.C,v 1.6 2003/11/25 17:11:33 pcg Exp $
+ * $Id: main.C,v 1.7 2003/11/26 10:42:34 pcg Exp $
  *
  * All portions of code are copyright by their respective author/s.
  * Copyright (c) 1992      John Bovey, University of Kent at Canterbury 
@@ -164,6 +164,8 @@ rxvt_term::init (int argc, const char *const *argv)
   x_ev.start (Xfd, EVENT_READ);
   pty_ev.start (cmd_fd, EVENT_READ);

+  flush ();
+
   return true;
 }

diff --git a/src/rxvt.h b/src/rxvt.h
index 447bb9d7c026e4ba22f9f156942a516958a85b52..
index ..121dfb54fa55cc735499557fbade7d2da1ef3cbe 100644
--- a/src/rxvt.h
+++ b/src/rxvt.h
@@ -1,5 +1,5 @@
 /*
- * $Id: rxvt.h,v 1.6 2003/11/25 17:11:33 pcg Exp $
+ * $Id: rxvt.h,v 1.7 2003/11/26 10:42:34 pcg Exp $
  */

 #ifndef _RXVT_H_                /* include once only */
@@ -1138,7 +1138,7 @@ struct rxvt_term : rxvt_vars {

   uint32_t next_char ();

-  bool pty_fill (size_t count);
+  bool pty_fill ();
   void process_x_events ();

   void *operator new (size_t s);

-----END OF PAGE-----