[comp.windows.news] overlay canvas refcnt problem, also a few questions

earley@modular.com (Joe Earley) (05/17/91)

I'm running TNT-FCS on OpenWindows 2.0 on SunOS 4.1.1.  Do the following to
see my problem:

1) Start OpenWindows
2) Start the program
3) Select the XHair button and the Hairy option
4) Press the left button in the center canvas and move the x-hair around
5) Release the left button
6) Note the refcnt results in the console window
7) From the window menu select Quit
8) pam the window to get rid of it
9) Repeat steps 2 through 7 and the window will disappear

The refcnt for the first run of the program returns 2 0.  The refcnt
for all subsequent runs will return 1 0.  If the 

%framebuffer createoverlay pop

line is uncommented the refcnt will always be 1 0.  Why does the first
overlay canvas get created with 2 hard links to it?  Where is the
second link?

Also, I'ld like to install my own cross-hair cursor in the cursorfont
dictionary.  After reading the manual I still don't know how to go
about doing it.  I'ld settle for just making my own cursor on the
overlay canvas if I could get the default pointer cursor to
temporarily go away.  Could anyone enlighten me on this?

Last item: is there a way to get the error messages to always print on
the console window?  Doing a

currentprocess /Stderr (/dev/console) (w) file put

didn't get me anywhere.  In my cps application the NeWS errors are
always sent up the socket which kills my window.  This forces me to do
round-about debugging to find out what the error messages were.

If any of the answers to the above are obvious please feel free to
flame me for burdening the net with stupid questions, but how about an
answer anyway?

Here is the program:
------------------------------------------------------------------------------
#! /bin/sh

psh <<"End_Of_PS"

% Uncomment next line and everything works
%framebuffer createoverlay pop

/ClassCenterCanvas ClassCanvas []
classbegin

    /Paint {
	0 setgray fill
    } def

    /TrackStart {  % event => [tracking actions] true
        pop
	gsave				% grestored in /TrackStop
	self createoverlay setcanvas
	debugdict begin
	    console (refcnt = % %\n) [ currentcanvas refcnt ] fprintf
	end
        [ /TrackStop /TrackMotion ] true
    } def

    /TrackMotion {  % event => -
        begin
            XLocation YLocation
        end                             % XLocation YLocation

        /location self send             % XLocation YLocation x y
        exch 4 1 roll sub               % x XLocation (YLocation-y)
        3 1 roll exch sub               % (YLocation-y) (XLocation-x) [=] y1 x1

	erasepage
	
	% Draw a cross-hair
	%
	dup 25 sub		% y1 x1 x1-25
	2 index moveto		% y1 x1
	dup 5 sub		% y1 x1 x1-20
	2 index lineto		% y1 x1
	dup 5 add		% y1 x1 x1+5
	2 index moveto		% y1 x1
	dup 25 add		% y1 x1 x1+25
	2 index lineto		% y1 x1
	dup 2 index 25 sub	% y1 x1 x1 y1-25
	moveto			% y1 x1
	dup 2 index 5 sub	% y1 x1 x1 y1-20
	lineto			% y1 x1
	dup 2 index 5 add	% y1 x1 x1 y1+5
	moveto			% y1 x1
	exch 25 add		% x1 y1+25
	lineto

	1 setgray
        stroke
    } def

    /TrackStop {  % event => -
	pop
	erasepage
	grestore			% for the gsave in /TrackStart
	false /settrackable self send
    } def

    /XHairHandler {  % itemindex menu => -
	pop pop
        true /settrackable self send
    } def
classend def


/MyBaseWindowClass ClassBaseWindow []
classbegin
    /NewInit {
	/NewInit super send
	dictbegin
	    % Drawing Canvas
	    %
	    /DrawingCanvas  framebuffer /new ClassCenterCanvas send def
	    /Center DrawingCanvas /addclient self send

	    % Button Panel
	    %
	    /ButtonPanel /Calculated framebuffer /new ClassPanel send def

	    % Create the XHair button and menu
	    %
	    /XHairMenu /Grid framebuffer /new ClassMenu send def
	    [
		[ (Hairy) /XHairHandler  ]
	    ] /setitemlist XHairMenu send
	    DrawingCanvas /settarget XHairMenu send
	    
	    /XHairButton /Grid framebuffer /new ClassMenuButtons send def
	    [
		[ (XHair) XHairMenu ]
	    ] /setitemlist XHairButton send
	    
	    /XHairButton XHairButton [/West { /West PARENT POSITION }]
                /addclient ButtonPanel send
	    
	    /North ButtonPanel /addclient self send
	dictend pop
    } def
classend def

/win null framebuffer /new MyBaseWindowClass send def
0 0 300 300 /reshape win send
/new ClassEventMgr send /activate win send
/map win send

newprocessgroup
currentfile closefile

End_Of_PS
------------------------------------------------------------------------------

Thanks.

Joe Earley, Modular Mining Systems
USENET:     {cmcl2,noao,uunet}!arizona!modular!earley
INTERNET:   modular!earley@cs.arizona.edu