#!/bin/sh
psh << '--PSH_EOF--'
%
% This file is a product of Sun Microsystems, Inc. and is provided for
% unrestricted use provided that this legend is included on all tape
% media and as a part of the software program in whole or part.  Users
% may copy or modify this file without charge, but are not authorized to
% license or distribute it to anyone else except as part of a product
% or program developed by the user.
% 
% THIS FILE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
% WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
% PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
% 
% This file is provided with no support and without any obligation on the
% part of Sun Microsystems, Inc. to assist in its use, correction,
% modification or enhancement.
% 
% SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
% INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS FILE
% OR ANY PART THEREOF.
% 
% In no event will Sun Microsystems, Inc. be liable for any lost revenue
% or profits or other special, indirect and consequential damages, even
% if Sun has been advised of the possibility of such damages.
% 
% Sun Microsystems, Inc.
% 2550 Garcia Avenue
% Mountain View, California  94043
%
%
% @(#)pam 23.3 90/06/19
%
% Copyright (c) 1987 by Sun Microsystems, Inc.
%
% bug left mouse button on a stuck child of root to unstick
% the program is called pam because pam is a no-stick spray
%

/show_zap {	% event => -
    begin gsave
	fboverlay setcanvas
	erasepage
	XLocation YLocation moveto
	8 10 rlineto 1 -5 rlineto 8 10 rlineto
	stroke
    grestore end
} def

/prewalk {	% proc can => _
	2 copy exch exec
	/TopChild get		% proc child
	{
		dup null eq {pop pop exit} if
		2 copy prewalk
		/CanvasBelow get
	} loop
} def

/pam_it {	% event => -
    begin
	Interest revokeinterest
	gsave fboverlay setcanvas erasepage grestore
	XLocation YLocation canvasesunderpoint
	dup length 2 gt {
		dup length 3 sub get
		dup isobject? {
		    currentprocess /Stdout get
		    currentprocess /Stdout console put
		    [
			    { /destroy 3 index send } stopped
			    { ExecutiveErrorHandler } if
		    ]
		    dup length 0 ne {
			(\nStack after destroying object:\n\n)
			print
			{==} forall
			(\n) print
		    } {
			pop
		    } ifelse
		    currentprocess /Stdout 3 -1 roll put
		} if
		{ begin
			/Mapped false def
			/Retained false def
		end }
		exch prewalk
	} {
		pop
	} ifelse
    end
    (Unstuck!\n) print
    (Remember, you can't see it, but it's still there.\n) print
    quit
} def

createevent dup begin
	/Name 1 dict dup begin
	    /MouseDragged	{ show_zap }	def
	end def
	/IsPreChild true def
	/Canvas framebuffer def
	/Priority 1 def
	/Exclusivity true def
end expressinterest

createevent dup begin
	/Name /LeftMouseButton def
	/Action 1 dict dup begin
	    /DownTransition	{ pam_it }	def
	end def
	/IsPreChild true def
	/Canvas framebuffer def
	/Priority 1 def
	/Exclusivity true def
end expressinterest

(Click on the stuck window to spray some Pam (tm) on it...) print
{ awaitevent } loop


--PSH_EOF--
