[comp.windows.news] Need a quick hack...

bzs@world.std.com (Barry Shein) (11/19/89)

I'm writing an article (for Sun/Expert) on X11 & NeWS. I've written a
simple program showing how input and output works under X11 and need
an equivalent in NeWS. I'd prefer if someone who considers themselves
a NeWS hacker (er, aficionado) would write it (I will give you credit,
unless you don't want it, some people are wanted by the FBI I guess.)

The program I need is very simple:

create a window, put "Hello World" into it (reasonably centered), on
mouse-down (any button, or a particular button, doesn't matter) the
text changes to "Goodbye World" (clear and redraw text is fine), when
the button is released the program exits.

It shouldn't use any toolkits or tools, just straight, hand-coded
NeWS/Postscript.

Short and exemplary is much better than, oh, dealing with detail
issues of color screens (you can assume mono if it makes it simpler)
or whatever. Its only purpose is to say "here's what a very simple
program that actually does some input/output looks like in each
system".

Thanks.

-- 
        -Barry Shein

Software Tool & Die, Purveyors to the Trade         | bzs@world.std.com
1330 Beacon St, Brookline, MA 02146, (617) 739-0202 | {xylogics,uunet}world!bzs

deven@rpi.edu (Deven T. Corzine) (11/27/89)

On 18 Nov 89 22:31:14 GMT, bzs@world.std.com (Barry Shein) said:

bzs> The program I need is very simple:

Simple enough.

bzs> create a window, put "Hello World" into it (reasonably centered),
bzs> on mouse-down (any button, or a particular button, doesn't
bzs> matter) the text changes to "Goodbye World" (clear and redraw
bzs> text is fine), when the button is released the program exits.

The following NeWS PostScript program will do exactly that, using the
left mouse button for activation.

bzs> It shouldn't use any toolkits or tools, just straight, hand-coded
bzs> NeWS/Postscript.

That's what this is, based on popmsg in init.ps, modified and
simplified, and I also commented it.

bzs> Short and exemplary is much better than, oh, dealing with detail
bzs> issues of color screens (you can assume mono if it makes it
bzs> simpler) or whatever. Its only purpose is to say "here's what a
bzs> very simple program that actually does some input/output looks
bzs> like in each system".

In this case, color's only a couple more lines.  (but I can't test it)

bzs> Thanks.

Welcome.

Run through psh to execute:  (remove through this line, and remove the
.signature.)

{                               % start procedure block for process
                                % fork (execution does not yet begin)
   20 dict begin                % create new dictionary for local use
   newprocessgroup              % start new process group
   /hello (Hello, world!) def   % define "Hello, world!" string
   /goodbye (Goodbye, world!)   % "Goodbye, world!" string
   def                          % define
   framebuffer setcanvas        % set current canvas to full screen
   clippath pathbbox            % returns screen position and size
   2 div /y exch def            % use half screen-height as y position
   2 div /x exch def            % use half screen-width as x position
   pop pop                      % toss screen "position"
   /Times-Roman findfont        % find Times-Roman font
   24 scalefont                 % scale to 24 points
   setfont                      % set as current font
   0 setgray                    % set current color to black
   /width                       % going to define variable "width"
   /hellowidth                  % going to define variable "hellowidth"
   hello stringwidth pop        % get width of "hello" string
                                % (stringwidth returns y "width" also
                                % -- y offset after showing string;
                                % that is, zero.)
   def                          % define hellowidth
   /goodbyewidth                % going to define variable "goodbyewidth"
   goodbye stringwidth pop      % get width of "goodbye" string also
   def                          % define goodbyewidth
   hellowidth goodbyewidth      % retrieve both values
   max def                      % define "width" to be the max of them
   /height 30 def               % height of text is 30 (24 points plus
                                % some whitespace)
   /y y height 2 div add        % adjust y by height of text
   25 sub def                   % and space for border
   /xcenter x def               % save original (center) value of x
   /x x width 2 div sub def     % adjust x by width of hello text
   /x0 x 10 sub def             % find x coordinate of upper-left-hand
                                % corner of enclosing rectangle
   /y0 y 25 add def             % find y coordinate of upper-left-hand
                                % corner of enclosing rectangle
   /x1 x0 width add 20 add def  % x coordinate of lower-right-hand
                                % corner of enclosing rectangle
   /y1 y0 height 5 add sub def  % y coordinate of lower-right-hand
                                % corner of enclosing rectangle
   x0 y0 10 sub moveto          % move to upper-left-hand corner
   x0 y1 x1 y1 10 arcto         % draw left edge and lower-left corner
   x1 y1 x1 y0 10 arcto         % draw lower edge and lower-right
                                % corner
   x1 y0 x0 y0 10 arcto         % draw right edge and upper-right
                                % corner
   x0 y0 x0 y1 10 arcto         % draw top edge and upper-left corner
   closepath                    % close off the path
   /canvas                      % going to define variable "canvas"
   framebuffer newcanvas def    % create a new canvas as child of
                                % framebuffer (root canvas) and define
   canvas reshapecanvas         % define the shape of the canvas
   canvas setcanvas             % set current canvas
   canvas /SaveBehind true put  % save screen behind the canvas
   canvas /Mapped true put      % make canvas visible
   clippath 0 setgray fill      % fill canvas with black
   /x0 x0 2 add def             % adjust coordinates of corners
   /y0 y0 2 sub def
   /x1 x1 2 sub def
   /y1 y1 2 add def
   x0 y0 10 sub moveto          % redraw (create new path) rounded
   x0 y1 x1 y1 10 arcto         % rectangle (slightly smaller)
   x1 y1 x1 y0 10 arcto
   x1 y0 x0 y0 10 arcto
   x0 y0 x0 y1 10 arcto
   clear                        % dump anything left on stack
   gsave                        % save graphics state
   1 setgray fill               % fill canvas (within clipping path)
                                % with white
   ColorDisplay?                % true if display is color
   { 1 .5 .5 sethsbcolor }      % if so, set color
   { 0 setgray } ifelse         % otherwise, set black
   xcenter hellowidth 2 div sub % get x coordinate of text starting
                                % position
   y moveto                     % push y and move to starting position
   hello show                   % show hello string
   damagepath newpath           % clear damagepath
   createevent begin            % create a new input event and push
                                % onto dictionary stack
      /Canvas currentcanvas def % define canvas for input event
      /Name /LeftMouseButton    % Want to watch for left mouse button
      def                       % define
   currentdict                  % put current dictionary (the newly
                                % created input event) on stack
   end                          % pop dictionary stack
   expressinterest              % express interest in that event type
   awaitevent                   % wait for such an event
   grestore                     % restore saved graphics state
   1 setgray fill               % clear the "window"
   ColorDisplay?                % true if display is color
   { 1 .5 .5 sethsbcolor }      % if so, set color
   { 0 setgray } ifelse         % otherwise, set black
   xcenter goodbyewidth 2 div   % get x coordinate of text starting
   sub                          % position
   y moveto                     % push y and move to text starting
                                % position
   goodbye show                 % show goodbye text
   awaitevent                   % wait for another left mouse button
                                % event
   canvas /Mapped false put     % unmap canvas (makes the "window"
                                % disappear)
   end                          % pop dictionary stack
}                               % end definition of procedure block
fork                            % start just-defined procedure as a
                                % seperate process in NeWS server
pause                           % explicitly give other NeWS processes
                                % a chance to run

Deven
-- 
Deven T. Corzine        Internet:  deven@rpi.edu, shadow@pawl.rpi.edu
Snail:  2151 12th St. Apt. 4, Troy, NY 12180   Phone:  (518) 274-0327
Bitnet:  deven@rpitsmts, userfxb6@rpitsmts     UUCP:  uunet!rpi!deven
Simple things should be simple and complex things should be possible.