[comp.windows.news] nuke-interests trick, TextCanvas bug, SendContexts bug

don@BALLAST.CS.UMD.EDU (Don Hopkins) (05/11/88)

Here is a function I wrote to put in the /destroy method of a window
that won't go away when I zap it. I was using text items in the
window, and they were not revoking their keyboard interests. This was
leaving references to the canvas around, and it was not getting GC'ed.
This function walks a canvas tree and revokes any interests expressed
therein. My window's /destroy method calls it right before going
"/destroy super send". Now the window goes away when I zap it!!! How can
I get text items to clean up after themselves, or do I have to do it
by hand? They don't have a /destroy method! 

  /nuke-interests { % can => -
    begin
      Interests {revokeinterest} forall
      TopChild {
        dup null eq {pop exit} if
        dup nuke-interests
        /CanvasBelow get
      } loop
    end
  } def

The TextCanvas object that nterm uses seems to leave a couple of event
managers hanging around after it's destroyed. (nterm works OK, but I
was having problems using it for my own purposes.) I fixed this bug by
making the following change to TextCanvas's /KeyboardHandler method
(in /usr/NeWS/clientsrc/client/nterm/textcan.ps), so it remembers all
the interests to revoke when it's eventually sent a /destroy.

Old:
      % --- Handler for keyboard, InsertValue, and Deselect events
      /KeyboardInterest Can addkbdinterests def 
      Can addselectioninterests 
         % Get rid of LiteUI's mouse interests
         1 get revokeinterest
      Can addfunctionstringsinterest pop 

New:
      % --- Handler for keyboard, InsertValue, and Deselect events
      /KeyboardInterest [
        Can addkbdinterests aload pop
        Can addselectioninterests aload pop
        % Get rid of LiteUI's mouse interests
	revokeinterest
        Can addfunctionstringsinterest
      ] def

Other than that small problem, the TextCanvas that nterm is built on
is really nice, and fast too! I can't wait to see what it does when
it's past the prototype stage!

It's great that NeWS 1.1 now has "send" implemented as a C primitive,
as opposed to a PostScript function.  But there seems to be a bug, in
that a newly forked process inherits its parent's /SendContexts. (The
key in the process that returns a stack of objects to which there are
pending sends on the process's return stack) I think that a newly
forked process should start out with an empty /SendContexts stack,
since only its parent can ever return to complete the sends. The
current behavior could cause problems, since it leaves extra object
references floating around.

	-Don