I am trying out different ways to make wily time aware, so I can invoke an autosave function periodically, and I discovered a bug in 9libs' etimer functions. When an etimer is started, an X time out is issued and its id is saved. When the etimer is stopped, the X time out with this id is canceled. The callback gottimeout in 9libs gets the X time out, puts an etimer event on the queue, and issues a new X time out (X time outs are one time triggers). However, gottimeout does not save the new X time out id. So, if I stop the etimer after a while, the wrong X time out is canceled, and gottimeout will still get the last time out. Since the etimer is now off, it will just be ignored. UNLESS I have rushed to started a new etimer. Then the last time out from the old etimer will be accepted and keep repeating, at its old pace. Autosaves every SCROLLTIME milliseconds is a bit too often. The X time out id:s get reused by X. There is usually just two of them in use. In that case every second issued X time out have the originally saved id, so by 50% chance the X time out will get canceled. Therefore the bug seems to happen randomly. I don't think this bug can happen to wily as it is, and if it did, it would probably manifest itself as scrolling with double speed when holding button in scrollbar or selecting text. The bugfix is simple: make gottimeout update the id. There's a patch at end of this e-mail. I also made it drop unexpected id:s, just in case. -- Tommy Pettersson <ptp@xxxxxxxxxxxxxx> diff -rN -u diff-old/9libs-1.0/libXg/xtbinit.c diff-new/9libs-1.0/libXg/xtbinit.c --- diff-old/9libs-1.0/libXg/xtbinit.c Thu Oct 14 20:38:17 2004 +++ diff-new/9libs-1.0/libXg/xtbinit.c Thu Oct 14 20:38:02 2004 @@ -332,7 +332,7 @@ static void gottimeout(XtPointer cldata, XtIntervalId *id) { - if(!einitcalled || Stimer == -1) + if(!einitcalled || Stimer == -1 || esrc[Stimer].id != *(XtInputId*) id) return; /* * Don't queue up timeouts, because there's @@ -341,7 +341,7 @@ */ esrc[Stimer].head = (Ebuf *)1; esrc[Stimer].count = 1; - XtAppAddTimeOut(app, (long)cldata, gottimeout, cldata); + esrc[Stimer].id = (XtInputId) XtAppAddTimeOut(app, (long)cldata, gottimeout, cldata); } static int