From don Sat Jan 13 05:57:40 1990 Date: Sat, 13 Jan 90 05:57:40 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: event-driven applications From: frisbee!jcb@sun.com (Jim Becker) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) Please excuse that I didn't trim the comments that have been made; I don't want to compromise the content of your comments by clipping anything. I did rewrap and shrink to fit. ~~ Date: Wed, 10 Jan 90 10:29:56 -0500 From: rws@expo.lcs.mit.edu (Bob Scheifler) [ Jim Becker writes ] I take this to be roughly an argument that a multi-threaded OS is needed to support separate thread event dispatch using the Xt or other similiar toolkit model. It's possible to use application-level threads and get somewhere. The main problem with such an approach is system calls blocking all threads; you have to understand application specifics to know how bad of a problem this is (but it's definitely a problem for some applications). This sounds like additions of complexity that the average programmer really doesn't want to get involved with. I assume that there is some agreement with the premise that we don't want to add more and more complexity to solve basic problems. What current OSes support this? Mach, Sprite, Symbolics, TI Explorer, Cedar, V(?), probably others. It seems like there is a relative abundance of application-level threads packages for C, although few of them are widely/easily available I guess. Processes are now fairly common in product Lisp systems. Several people have put threads into C++. Gee, I haven't used any of these. I have programmed on many common machines that are out there (Sun, Dec, DG families) and none of these operating systems have been in commercial use. Since one of the goals of the X Window System is to be widely transportable it seems that to provide functionality that requires off-beat operating system features would be shooting yourself in the foot. The work that yourself and others have done for the X Window System is outstanding, and a breath of relief for programmers of the world. I had been learning a new windowing system about every year and a half prior to X, and am very happy with the progress that has been made, and the acceptance of, your efforts. It would be unfortunate if these efforts were tainted by a dependence upon functionality that is not available to most users of computers. Is this something that users can rely on anytime in the future? If OSF has its way, Mach may be widespread eventually. :-) There is a POSIX committee working hard on a standard Threads definition, indications are that they are making considerable progress. This is not something that people can depend upon at this writting. As you state further on, people want something now. I don't think that there is any reason to bank of OSF/2, which is slated for 1992 (I believe). Although they may have a wonderful product in that time frame, one should not depend on future advances in technology for current needs. In the same mode of thought, I take exception with those assuming that there will be ever faster workstations and memory sizes for new applications. It seems to be a typical Americanism to assume that everyone will go out and buy faster and better hardware every two years. If we assume that people will be willing to upgrade machines continually, and build software that demands it, then we are little different from those that sell junk bonds based on continual growth of the economy and corporate strength. In an economic downturn companies will not want to buy new computers. Depending on a solution that relies on advances and monetary commitments of the future can be dangerous. Proposed solutions should work given today's technology, if they are to be today's solutions. Clearly the model is designed for simple applications, not those that have vastly complex interfaces. I've seen a number of X products that are quite sophisticated. (I don't know about "vastly complex", we don't encourage those. :-) I have to disagree in regard to `vastly complex' products. Fortune 1000 companies that are trading PCs for Workstations are doing it because their needs are becoming more and more complex. If the solutions that the Workstation market provides don't afford `infinite' complexity of software then there will be a brick wall somewhere on the path to their needs that can't be gotten around. My feeling is that there are some obvious limits imposed by the current toolkit approaches. My fear is that there will be pressure from the large companies to stamp out Xt as the final solution without waiting until people understand and appreciate the various factors involved. The model breaks with more complex interfaces and applications that do real work rather than heavy UI and light functionality. The model breaks when there is significant "computation" in parallel with user interaction, if that computation cannot easily be decomposed into Xt's notion of "work procs". I agree completely. But, as I have argued in the (distant) past, user interaction in sophisticated applications will very likely require interaction with the "back end" data of the application, and can't always be "downloaded" into a window server and run autonomously; multiple threads will be needed in the client as well. I remember Mark Callow of SGI at a SIGGRAPH panel a couple years ago admitting this turned out to be essentially the case for several applications they had been building. Hence we and others are in agreement that there are limits to the model. The solution that you outline also sounds somewhat hairy. I believe there are simpler ways to skin the cat, although they haven't appeared yet. There were lots of changes to autos before they came to commonality, but no one at Mercedes, Ford and GM tried to get everyone to agree that all cars of the future would have wooden spoked wheels. It is *not* good that Xt isn't adequate for all applications, simply because it is being asserted as a _standard_ on which all toolkits are to be based. You have the emphasis in the wrong place. It is *a* standard; the X Consortium does not view it as the only possible standard. I strongly disagree that one should build the universal toolkit (whatever that is) or be damned; I'd much rather take the 80% rule (and be damned :-). One of the common citations is that Macs/PCs have a wealth of useful applications, yet they are based on essentially the same model. However I was under the impression that it was moving toward status of an `exclusive' standard. I am not in the meetings where it is decided, but the third hand info that floats by seemed to have the Xt toolkit being put onto the exclusive standards list. I am a wholehearted advocate of the 80% rule. Getting my feet wet doing Configuration Management systems showed me that you can't please all of the people all of the time. Everyone has a different need, and software can answer all those needs given time. As long as those defining the standards appreciate this, and don't lock out future thought and progress, we are safe. By locking all users into a deficient standard prior to the marketplace understanding the variables in the game, one has effectivily crippled further progress in this area. When I count the number of new toolkits *still* being designed in the X environment (whether Xt based or not), I find it hard to agree that progress is being crippled. On the other hand, I've talked to a fair number of real end-users (e.g. people from federal agencies), and their almost universal cry is "give us something yesterday, I don't care what it is, I trust you that it's good enough for what I need to build right now". Standardization is an attempt to satisfy those kinds of needs, hopefully without stiffling innovation. It's a tricky road to walk. You have a wider view of what is going on than most all of us; perhaps my words are somewhat poisoned by the lack of this broad view from my chair. I believe the fact that there are so many efforts other than Xt is testimony to support my view that Xt isn't the end of the story. Although the big companies may agree on it, there are plenty of small shops that need different approaches which don't fit the Xt model. I understand that the GUI wars are raging, and those that are suffering are the programmers and end users. Getting into a market too early can be unhealthy. It is good that there are the current tools for people to use for application development. As long as the current tools aren't deemed the endall solution for the 90's we are ok. The UI models that have been on the backburner because of need to service current models will be done, albeit by others. As long as the door is open there is hope! I have yet to meet someone that could understand programming Xt in a single sitting; and there are pretty amazed reactions when people get into understanding it. Anecdotal evidence is hard to compare. I have an undergraduate (a freshman as I recall) with no prior experience in windowing or graphics, just a little bit of C programming. We gave him the task of rewriting bitmap(1) to be a toolkit client, using the Athena Widgets. He read the documentation, asked very few questions, and poof, he's got a reasonably good application up and running (certainly much better than the current bitmap), including having written his own widget. You are correct. You are also dealing with people that are in the top engineering school in the country, good people. There are plenty of people programming that aren't at this level, say 95%. They need something that is easy to understand and use. Ever try to teach your parents how to program a VCR? Those here that have attempted to use it have been pretty smart, and it was no cakewalk to understand it for them. I agree it is difficult. I think a large part of it may be the documentation (e.g. separating out cleanly what widget users need vs. what widget writers need). I hope the Asente/Swick book nearing completion will help. And widget set documentation is getting better, as people learn how to present the information better. But IBM software can also be well documented, and most people prefer Macs. The beauty of the Mac is that they took all the complexity and packaged it for the user into something understandable. The manual to use the Mac is mighty thin, and comprehensive. Speaking of which, is there any weight given in the standards process to complexity of use/comprehension, performance and commercial viability? It is easy for a bunch of technical people to get together and create something wonderfully geeky that wouldn't run on anything short of a Cray. My involvement with the X C++ Consortium meeting at Stanford seemed to be absent from these real issues. The eventual hope is that there would be commercial viability in the effort, but it was not a premise going into the adventure. Do the Japanese do it this way? Their hit ratio is nine successful products out of ten. Good homework on the marketplace. But making this a standard that all have to understand and suffer with simply limits the commercial viablity of Unix/X in the face of OS/2 and PM. Gee, I've read the PM documentation, and I can't say it's any better. I have heard the same. But in the minds of CEOs there is a large rift in the Unix community, when a consistent story may be the best thing that Mr. Gates has going for him. (I realize that I'm also arguing for an inconsistent story by standing in the face of everyone on the Xt bandwagon. ). If we want X to win then why is the door shut to creativity beyond the Xt class based model? Who in the world ever said it was shut? There is a wealth of creativity going on. Look around; attend the X Conference. :-) But, there's no consensus on any of it yet, that would enable standardization. What is going on in New Orleans this week? Thought there was expectation of closure. I'm not really sure what your complaint is. You seem to want the world's best toolkit, which doesn't exist and probably won't in our lifetime, yet complain that people have agreed to a common definition of something that does in fact enable a reasonable range of applications to be built. With the current rate of change the world's best toolkit may be announced at the X Conference... :-) I think that it is good there is some agreement on Xt, my complain is that it seems like GM, Ford and Chrysler are going to lock out anyone else from making progress. The potential legal straightjacket that awaits anyone making a new user interface is bad enough, knowing that all the cards have been played before anyone knows the rules of the game is disheartening. From what I have heard about the choice of Xt over others there seems little reason for others to play the game at all. Since there are multiple ways to skin this cat, and you state that Xt isn't the final solution, why is it a standard? Because multiple vendors rely on the Xt foundation, and desire to have a common, vendor-neutral definition and evolution of that layer. If the same were true of some other interface, the X Consortium would consider standardization of it. I agree that this is important. I guess that I am just a yapping dog in a field of elephants. One of these days someone will squash me. But I love and cherish the freedom of speach whilst I have the breath to produce it. Hope that you understand my basic frustration now. In a past life I did multi-media, and the constraints of current methods in user interface would cripple my ability to present information to the user in many unique and interesting ways. There are others with like needs and desires, lets not close the door if someone comes up with a non-Xt solution that solves the problem. I asking too much? -Jim Becker -- Jim Becker / jcb%frisbee@sun.com / Sun Microsystems ...these are my opinions, and even my id disagrees.. From don Sat Jan 13 05:59:22 1990 Date: Sat, 13 Jan 90 05:59:22 -0500 To: NeWS-makers@brillig.umd.edu Subject: New X Window Books From: vsi1!zorch!ditka!qiclab!jamesd@ames.arc.nasa.gov (James Deibele) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) The following new books might be of interest to X users: (even though Release 4 is now available) _X Window System Technical Reference_ by Steven Mikes. This is distinguished by being almost totally devoid of text --- it's 786 pages of charts, figures, and code fragments. It's a "quick reference" :-) to X programming, with functions shown with descriptions, category, and return type; structures; symbols; fonts; bitmaps, and more. The last two chapters are "mini- references" for Motif and OPEN LOOK, showing the resource name, widget, class, and type. (Addison-Wesley, 0-201-52370-1, 1990, $34.95) _OPEN LOOK: Graphical User Interface Functional Specifications_ by Sun Microsystems. The first volume of the OPEN LOOK technical reference series, this book presents the philosophy behind the OPEN LOOK interface, discussion of the design elements, description of the required elements (menus, user-settable options, etc.), instructions for using the user interface, and guidelines for writing applications using the interface. (Addison-Wesley, 0-201-52365-5, 1990, $34.95) _OPEN LOOK: Graphical User Interface Application Style Guidelines_ by Sun Microsystems. The second volume of the OPEN LOOK technical reference series, this is the definitive guide for developers creating applications. Containing a checklist for developers, concise information about using OPEN LOOK objects, guidelines for developing color applications, (Addison- Wesley, 0-201-52364-7, 1990, $24.95) O'Reilly & Associates says that they hope to be shipping Volume 7 of the X series by February 1, to be devoted to Xt (the description I got over the phone was kind of garbled, but they're sending out a flyer on it). They think that they may have the fabled volumes 4 and 5 (X toolkit intrinsics) in March. What's volume 6? I don't know either. Prentice-Hall is supposed to be shipping Doug Young's new book, _Introduction to the X Window System: Programming and Applications with Xt, OSF/Motif, next week. (P-H, 0-13-497074-8, 1990, $32.80). They've also announced the OSF/Motif series (_Style Guide_, _Programmer's Guide_, Programmer's Reference_, and _User's Guide_) all selling for $41.00 each. Publication date not firmed up, although they told me that it should be firmed up "any day". -- James Deibele ...!tektronix!nosun!techbook!jamesd BBS: (503) 760-1473 TECHBooks: The Computer Book Specialists --- Voice: (503) 646-8257 12600 SW 1st Beaverton, OR 97005 --- Book reviewers wanted for computer science & electronics - contact us for more information. From don Sat Jan 13 05:59:42 1990 Date: Sat, 13 Jan 90 05:59:42 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: (none) From: zaphod.mps.ohio-state.edu!uwm.edu!rpi!crdgw1!montnaro@tut.cis.ohio-state.edu (Skip Montanaro) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) I wasn't able to get X11ONLY mode working properly with X11/NeWS using the technique you described. I finally had a slight flash of insight one day (a rare occurrence :-) and decided to use the "standard" startup files from the MIT distribution, ~/.xinitrc, ~/.xserverrc, and /usr/bin/X11startx. All I did was make .xserverrc be #!/bin/sh #Xsun :0 # MIT R3 X11ONLY=1 $OPENWINHOME/bin/xnews # OpenWindows The nice thing about this is you are guaranteed that you will wait long enough for the server to really get going before trying to start any clients (xinit, spun off by startx, gives you that as part of its startup service, I believe). I am almost certain the 10 second sleep in the original message is not long enough. (There's no way the server will be ready to accept connections when the original author executed twm.) Place all your client apps in .xinitrc: #!/bin/sh xterm -C -geometry 80x40+5-5& emacs -geometry 80x69-5-5 & gwm -q Start all of them in the background except the window manager (which is then started last...) -- Skip (montanaro@crdgw1.ge.com) From don Sat Jan 13 05:59:49 1990 Date: Sat, 13 Jan 90 05:59:49 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: openwin-init From: Rafael Bracho Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) There is an error in the documentation of OpenWindows 1.0. The file should be ~/.openwin-init, not ~/openwin-init. -Rafael From don Sat Jan 13 06:00:02 1990 Date: Sat, 13 Jan 90 06:00:02 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: Window systems should not be substitutes for decent environments From: mstar!mstar.morningstar.com!bob@tut.cis.ohio-state.edu (Bob Sutterfield) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) In article <14286@jumbo.dec.com> msm@src.dec.COM (Mark S. Manasse) writes: In article <13337@granite.BBN.COM>, mlandau@bbn.com (Matt Landau) writes: [T]he X11 protocol simply does not allow me, as an application writer, to decide what parts of my application belong close to the user (in the server, where they can provide fast feedback, etc.) and what parts belong in the client... You, as an application writer, are free to decide what part of your application belongs close to the user. You, as an application writer, can then write two programs, communicating by whatever means you choose, one of which is generally intended to execute on the same machine as your X server, bringing it about as close as is interesting. Here we see two different ideas of "close". NeWS programmers consider "running on the same machine" not to be necessarily close enough, and consider "running in the server itself" to be interesting enough to make a difference. Proximity, in this case, can be considered in terms of address space and scheduler slots in the server host's native OS, rather than geographically or net-topologically. A PostScript lightweight process is subject to the NeWS server's scheduler and uses the server's internal inter(lightweight)process communications facilities. Everyone agrees, in this day and age, that (at least part of) a window client must be able to run in a different address space than its window server, and must be able to communicate via the inter-process communication facilities provided by the underlying OS. And so long as there's (in UNIX terms) a process division, the two might just as well be running on entirely different hosts. That's the foundation of a network-distributed window system. A difference between the X and NeWS philosophies lies in whether that separate address space is a requirement or an option. From don Sat Jan 13 10:26:23 1990 Date: Sat, 13 Jan 90 10:26:23 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: event-driven applications From: rws@expo.lcs.mit.edu (Bob Scheifler) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) [Jim Becker's message showed up on xpert first, here's what I sent there.] It's a little strange that this conversation has been moved from news-makers to xpert. (I prefer to be "one of the flamers" there, rather than an apparent "authority figure" here. :-) Since one of the goals of the X Window System is to be widely transportable it seems that to provide functionality that requires off-beat operating system features would be shooting yourself in the foot. My comments should be taken as forward-looking, not present-day exclusionary. I come from a distributed systems background. I'm not particulary interested in solving problems for X in isolation when they apply equally to a much broader set of interfaces and applications. Multi-threading is just a case in point; I'd rather not solve the "X problem" with multi-threading in the server just because it's easier to do it there, when I see multi-threading in a much more general context coming down the pike. It would be unfortunate if these efforts were tainted by a dependence upon functionality that is not available to most users of computers. I'm not really sure where you read this bias in my statements. I'm certainly not advocating throwing out current mechanisms and requiring multi-threading in the operating system in order to write Hello World. I am saying that for those applications requiring the functionality, design should be done in the context of what we know (or at least hope) is "just around the corner" for the system layers beneath us. I have to disagree in regard to `vastly complex' products. I think you've read too much into what was intended as a joke. The solution that you outline also sounds somewhat hairy. I believe there are simpler ways to skin the cat, although they haven't appeared yet. I'm all for simpler solutions; I'd be glad to hear about them. However I was under the impression that it was moving toward status of an `exclusive' standard. I am not in the meetings where it is decided, but the third hand info that floats by seemed to have the Xt toolkit being put onto the exclusive standards list. Third hand info is often confused. A great deal of debate has gone on over NIST's proposed FIPS on X (government standardization), and over the IEEE P1201 work at the toolkit level (formal standardization). Those are both distinct from the standardization process in the X Consortium. The X Consortium is not a ruling body for the government, IEEE, or ANSI, and other politics come to bear in those domains. However, I am not aware of any exclusionary wording in the current draft NIST and IEEE documents. I believe the fact that there are so many efforts other than Xt is testimony to support my view that Xt isn't the end of the story. I have never said Xt is the end of the story; I'm not sure anyone ever has. Ever try to teach your parents how to program a VCR? Heck, I can't even program my VCR. The beauty of the Mac is that they took all the complexity and packaged it for the user into something understandable. The manual to use the Mac is mighty thin, and comprehensive. You have suddenly jumped from *writing* applications to *using* them. A manual to *use* a well-designed X application set can be just as thin and comprehensive. I would not call Mac programming documentation "thin". (That doesn't mean I think a programming interface should be complex.) Speaking of which, is there any weight given in the standards process to complexity of use/comprehension, performance and commercial viability? Of course. The companies involved in a standardization process are seldom in it just for a good time. My involvement with the X C++ Consortium meeting at Stanford seemed to be absent from these real issues. This was also the kickoff meeting to C++ work, where it's very useful to "blue sky" to get the feel for things. You don't know where good limits make sense until you understand the space. It's rather simplistic to draw too many conclusions from a single meeting like this. What is going on in New Orleans this week? Thought there was expectation of closure. I'm way too busy to attend the P1201 meeting this week. (So why am I writing this message?) If you know anything about the way formal standards bodies work, and the short period of time that P1201 has existed, you can answer this question yourself. From don Sun Jan 14 05:56:43 1990 Date: Sun, 14 Jan 90 05:56:43 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: Common toolkit From: Peter W. Brewer Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) >No, the Mac is a sort of starting point for me. As you know, I much prefer >Intuition. Intuition runs on a machine that's even cheaper than the Mac. > Peter da Silva. +1 713 274 5180. Amiga is the cheapest of all and it starts and ends with color! {Add sound to the IFF format and its pretty complete protocol.} Multitasking the whole schmeel now why would anyone want system 3 xenix or the Dumb Operating System DOS? -- The other Peter Peter Brewer |||| ||||| ||||||||| |||||| //|||||\ |||||| lerici@super.org || ||__ || || || || || THE Supercomputing || || ||^^^^^^\\ || || || Research Center ~~~ |||||||| ||||| || || ||||| \\|||||/ |||||| From don Sun Jan 14 05:56:54 1990 Date: Sun, 14 Jan 90 05:56:54 -0500 To: NeWS-makers@brillig.umd.edu Subject: postscript-mode for gnuemacs From: att!cbnewsc!bwong@ucbvax.Berkeley.EDU (bruce.f.wong) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) Does anyone have a postscript-mode for gnuemacs that has enough interesting goodies to be worth posting ? If so please post a copy. Thanks. -- Bruce F. Wong ATT Bell Laboratories att!iexist!bwong 200 Park Plaza, Rm 1B-232 708-713-5111 Naperville, Ill 60566-7050 From don Sun Jan 14 05:59:38 1990 Date: Sun, 14 Jan 90 05:59:38 -0500 To: NeWS-makers@brillig.umd.edu Subject: response to Kris Graham From: njin!jvnca!njitgw!mars.njit.edu!frank5@rutgers.edu (Frank D. Greco CIS Adj. Prof.) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) >From: graham@fuel.dec.com (kris graham) > > >In article <13324@granite.BBN.COM>, mlandau@bbn.com (Matt Landau) writes: > > >> Now ask yourself what might happen if Sun were to donate the source to >> X11/NeWS to the MIT X Consortium, just for the sake of promoting it as a >> (...stuff deleted...) >> So ask yourself what might happen if X11R5 (or X12 or something) were >> based on the merged NeWS/X server... Then ask yourself how we might make >> this happen... > >I have heard a lot about the so-called "Technical Superiority" of NeWS. >Anybody care to educate us non-believers of this claim. I have never >thought of Postscript as a friendly language to program in.....or love a >windowing system that makes the implementation of a print screen facility >more tedious than necessary ; > Kris, before you condemn something, at least try programming in NeWS.... Typically all the "non-believers" all have been "non-tryers". Your own company is promoting PostScript very strongly (you guys *do* have a contract with Adobe for Display PostScript), so I wouldn't put it down so much. Besides, most good programmers pick up PostScript fairly quickly. There is this myth that it is complicated because it is not infix notation. Alright, so use CPS (or something similar). Someone out there even has a C to PS application (actually its probably more of a postfix to infix translator), so you can still pgm in your beloved C. Why is a print screen facility tedious under NeWS? I don't understand. We have *simple* routines that perform screen dumps. I'll show you a one-liner in NeWS if you want. Besides "friendly" is subjective... >BTW: On a more cynical note, we all know the outcome of the "SPARC > versus XXX" 'technical superiority" battle ;-) > Yes, we do know that. I wonder what will happen to XXX now that SPARC has won? |:-> >One of my co-workers, Larry Timmins, has been involved in multiple ports >of applications originally done with Sun's toolkits. On average, for every six >months (calendar time) that the customer/software house put into the project, >only one month was needed with DECwindows' XUI toolkit. Using the Intrinsics >-based toolkit reduces the network requests and ultimately has proven itself >over and over. Contrary to your opinion, I have had many of my colleagues in the financial community have told me that the DECwindows XUI/UIL "toolkit" is awkward to use. Applications don't take a month to produce. What were the facts in these applications Kris? You're beginning to sound like a marketeer! I guess if a DEC employee says that its a 6 to 1 win for XUI, then DEC *must* be right. ;-> Application programmers have steep curves when learning XUI and UIL (more on the XUI side though). People that have been using the XView toolkit, while not perfect, have been able to create real applications in weeks. Sun's GUIDE lets me produce a prototype of the user interface of a real application in one day. Just how have the intrinsics-based toolkits proven themselves? Using the intrinsics to create widgets is akin to writing Unix device drivers. It's overly complex. The concept of having a higher layer above Xlib is obviously useful, but why are the intrinsics *so* darn complicated? Surprisingly many of the stalwart X programmers that I know agree that NeWS is more elegant. We all agree that NeWS needs more performance. Most of them (and I) agree that X is more prevalent (esp. in the NYC area) and that while NeWS is fun, we have to prostitute ourselves and are forced to program in X if we want to work. However, lately I have seen more than a slight inclination in some of the large financial institutions of NYC to at least seriously consider NeWS, at least in an XView CANVAS object. >Regarding the donation of X11/NeWS, fine -- put it in the >contrib like others have. >However, when OSF went with the XUI toolkit, it was a fully tested production >-quality toolkit at over 300 sites. What is needed is solid incremental >contributions and not yet another toolkit, approach, etc. > Fully-tested? By whom? Facts Kris, facts. Besides, what does "fully-tested" mean anyway? Maybe you *are* a marketeer Kris! Why are only "solid incremental contributions" needed? There is a rumor going around that innovation sometimes solves problems too! ;-> What the heck is wrong with another approach to solving a problem?! If there was only one way of solving a problem, we'd all be still punching cards or hacking away on some archaic OS like VMS. >Christopher Graham >Digital Equipment Corp >Ultrix Resource Center >New York City Frank G. From don Sun Jan 14 21:04:43 1990 Date: Sun, 14 Jan 90 21:04:43 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: New X Window Books From: turnpike!argv@sun.com (Dan Heller) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) In article <3691@qiclab.UUCP> jamesd@qiclab.UUCP (James Deibele) writes: > The following new books might be of interest to X users: > (even though Release 4 is now available) > O'Reilly & Associates says that they hope to be shipping Volume 7 of the X > series by February 1, to be devoted to Xt (the description I got over the > phone was kind of garbled, but they're sending out a flyer on it). They think > that they may have the fabled volumes 4 and 5 (X toolkit intrinsics) in March. Voume 7 of the O'Reilly book series is the XView programming manual and is written by yours truly :-). Altho this is XView-specific, it is *not* Sun-specific and is directed towards the X community at large. Not only does it address programming in XView, it discusses "X" programming. That is, it touches upon some issues relative to more efficient programming using Xlib routines for graphics (remember, XView just implements a user interface -- it doesn't write your application). Disclaimer -- I do not work for Sun Microsystems. I wrote the book as an independent contractor. My comments and opinions are really my own. dan From don Sun Jan 14 21:17:18 1990 Date: Sun, 14 Jan 90 21:17:18 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: X-extensions on X terminals? From: unsvax!jimi!herbert!doug@uunet.uu.net (Doug Phillipson 5-0134) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) In article <4819@emory.mathcs.emory.edu> km@mathcs.emory.edu (Ken Mandelberg) writes: >What is the expectation on how X terminals will fair amoung >vendors that use extensions to the X protocol. For example, >DEC seems to be featuring Display Postscript as an extension. >Will DEC applications that need this require the capability >in the server, or will it fall back to a host based process >to translate the extension for basic X servers (say for an >X terminal). You mean to tell me that after all the wars over X and NeWS DEC will include what should have (and could have if politics were not involved) been included as a standard feature. Looks like SUN really won anyway but all the competing parties are to embarrassed to admit it. Douglas Phillipson (EG&G) From don Sun Jan 14 23:53:32 1990 Date: Sun, 14 Jan 90 23:53:32 -0500 To: NeWS-makers@brillig.umd.edu Subject: Gnu Emacs on NeWS From: att!cbnewsh!ko@ucbvax.Berkeley.EDU (kostas.n.oikonomou) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) Does Gnu Emacs (18.54 or later) work under NeWS 1.1 on a Sun? Any information will be appreciated. Thanks. Kostas Oikonomou From don Tue Jan 16 05:14:35 1990 Date: Tue, 16 Jan 90 05:14:35 -0500 To: NeWS-makers@brillig.umd.edu Subject: Porting PNeWS to X11/NEWS (OpenWindows) From: itcdev!paul@uunet.uu.net (Paul Demers) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) Does anyone have any comments on porting PNeWS applications to OpenWindows? I am especially interested in any problems encountered. (I know about the obvious problem of live video windows.) Please mail any responses - news expires daily at my site. Thank you, Paul Demers Interactive Television Company paul@itcdev.uu.net (...!uunet!itcdev!paul = We poll UUNet central.) From don Tue Jan 16 05:15:10 1990 Date: Tue, 16 Jan 90 05:15:10 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: Gnu Emacs on NeWS, postscript-mode for gnuemacs From: mstar!mstar.morningstar.com!bob@tut.cis.ohio-state.edu (Bob Sutterfield) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) In article <7356@cbnewsh.ATT.COM> ko@cbnewsh.ATT.COM (kostas.n.oikonomou) writes: Does Gnu Emacs (18.54 or later) work under NeWS 1.1 on a Sun? Get Chris Maio's complete GNU Emacs NeWS compatibility package from columbia.edu:/pub/ps-emacs.tar.Z or osu-cis!gnu/emacs/ps-emacs.tar.Z. In article <12819@cbnewsc.ATT.COM> bwong@cbnewsc.ATT.COM (bruce.f.wong) writes: Does anyone have a postscript-mode for gnuemacs that has enough interesting goodies to be worth posting ? Included is a nice PostScript mode, with "send region to NeWS interpreter" sorts of functions. Not as full-gonzo featureful as Unipress' Emacs NeWS interface, but quite usable and useful. If so please post a copy. Thanks. It's too big to post politely, but you can get it yourself. From don Tue Jan 16 05:15:20 1990 Date: Tue, 16 Jan 90 05:15:20 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: Gnu Emacs on NeWS, postscript-mode for gnuemacs From: mstar!mstar.morningstar.com!bob@tut.cis.ohio-state.edu (Bob Sutterfield) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) In article <7356@cbnewsh.ATT.COM> ko@cbnewsh.ATT.COM (kostas.n.oikonomou) writes: Does Gnu Emacs (18.54 or later) work under NeWS 1.1 on a Sun? Get Chris Maio's complete GNU Emacs NeWS compatibility package from columbia.edu:/pub/ps-emacs.tar.Z or osu-cis!gnu/emacs/ps-emacs.tar.Z. In article <12819@cbnewsc.ATT.COM> bwong@cbnewsc.ATT.COM (bruce.f.wong) writes: Does anyone have a postscript-mode for gnuemacs that has enough interesting goodies to be worth posting ? Included is a nice PostScript mode, with "send region to NeWS interpreter" sorts of functions. Not as full-gonzo featureful as Unipress' Emacs NeWS interface, but quite usable and useful. If so please post a copy. Thanks. It's too big to post politely, but you can get it yourself. From don Tue Jan 16 05:15:36 1990 Date: Tue, 16 Jan 90 05:15:36 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: PaintRoot From: "Michael_Powers.Roch803"@Xerox.COM Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) Russ The following added to your startup.ps should allow you to define the PaintRoot from NeWS. Openwin by default paints the root via X (a change which was made to allow xsetroot and other X root painters to work correctly). UserProfile /UsePaintRoot? true ?put Then redefine PaintRoot to your hearts content! Mike Xerox Corp. From don Tue Jan 16 09:07:54 1990 Date: Tue, 16 Jan 90 09:07:54 -0500 To: NeWS-makers@brillig.umd.edu Subject: PaintRoot From: russ@dash.mitre.org (Russell Leighton) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) Thanks, this works! From don Wed Jan 17 10:05:15 1990 Date: Wed, 17 Jan 90 10:05:15 -0500 To: NeWS-makers@brillig.umd.edu Subject: Beginning user questions From: snorkelwacker!usc!wuarchive!cec2!news@bloom-beacon.mit.edu (Mark E Hunter) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) Several questions in regards to NeWS: NeWS supports a user stratup file called user.ps This file resides in the user's home directory and consists of NeWS commands to be executed upon startup 1) I cannot get the root account to execute its user.ps It is a valid script and has been tested using other accounts and by executing it manualy using the psh command. 2) I have a number of scripts that will execute when psh'ed, but will not run as user.ps. These scripts contain one or more windows to create upon NeWS startup. Some of these scripts ran a one time but a minor edit (changing the order of the windows being created or adding a comment) resulted in their not working. Some scripts execute only some of the commands contained. They do not seem to start at either end of the script and break. They select random statements to execute. Others run one session but not another. This seemingly random behavior was explained by Sun as timing problems. Their explanation was that the user.ps was running before NeWS was fully operational. They did not have a way to get these scripts to execute properly. 3) I have need to start NeWS and then run a NeWS script automatically. I have a csh script which starts NeWS and runs the NeWS script but because of the timing problem above, sometimes the NeWS script is executed before NeWS is fully functional. Does anyone know of a way to check to see if NeWS is up ? Does anyone know of a way to get the script to wait for NeWS to be up before continuing ? Thanks, Mark E. Hunter meh@wucs1.wustl.edu From don Wed Jan 17 10:06:16 1990 Date: Wed, 17 Jan 90 10:06:16 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: Beginning user questions From: crdgw1!montnaro@uunet.uu.net (Skip Montanaro) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) In article <1990Jan16.171713.15038@cec1.wustl.edu> meh@wucs1.wustl.edu (Mark E Hunter) writes: 2) I have a number of scripts that will execute when psh'ed, but will not run as user.ps. These scripts contain one or more windows to create upon NeWS startup. Some of these scripts ran a one time but a minor edit (changing the order of the windows being created or adding a comment) resulted in their not working. Some scripts execute only some of the commands contained. They do not seem to start at either end of the script and break. They select random statements to execute. Others run one session but not another. This seemingly random behavior was explained by Sun as timing problems. Their explanation was that the user.ps was running before NeWS was fully operational. They did not have a way to get these scripts to execute properly. The issue of startup files in NeWS 1.1 is one that bit me long ago. I suspect it's bitten others as well, so I'll post the workaround I received from comp.windows.news. I'm surprised that Sun couldn't give a more complete workaround/fix for the problem. The problem is that $NEWSHOME/lib/NeWS/init.ps loads ~/user.ps before it spins off the NeWS lightweight process that listens for client connections. It's a race to see if the listener process can get started before applications start requesting connections. The fix is to split user.ps into two parts, say user.ps and desktop.ps. In user.ps is code you want loaded into the server at startup time. Desktop.ps should contain client program invocations. Modify init.ps so that desktop.ps is executed after the server process is started: (user.ps) LoadFile pop DebuggingServer? { systemdict /dbgstart known not {(NeWS/debug.ps) LoadFile pop} if } if (NeWS/AdobeMap.ps) LoadFile pop StandardEncoding magic:AdobeSequence { dup 256 lt { exch put //StandardEncoding } { pop pop } ifelse } forall pop % start server verbose? { (Starting server\n) print } if server % Give the user the chance to start programs after the server is listening % for connection requests. This idea is not original from me. I got it from % comp.windows.news. % - Skip Montanaro, 11/23/88 (desktop.ps) LoadFile pop Note that this is not a problem in X/NeWS (aka OpenWindows, aka NeWS 2.0). ~/.openwin-init is executed after the server starts. -- Skip (montanaro@crdgw1.ge.com) From don Wed Jan 17 10:06:26 1990 Date: Wed, 17 Jan 90 10:06:26 -0500 To: NeWS-makers@brillig.umd.edu Subject: OSF/Motif vs. NeWS vs. SUN/Open Windows vs. ? From: sumax!ole!bryan@beaver.cs.washington.edu (Bryan Paulson) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) I am interested in the pros and cons for OSF/Motif, NeWS, Sun/Open Windows, and any other GUI toolkits people have had experience developing applications with. I am looking for the following impressions: o Versatility - Can a scale valuator have a color spectrum displayed along side of the slider? If not, what range of data can the scale contain? How versatile are other control objects(ie. buttons, integer entry fields, etc.)? What can be done if a toolkit does not have a control you desire or the control is not robust enough to handle a needed feature? o Platform Independence - Do these toolkits port easily to different platforms(ie. Apollo, Sun, Silicon Graphics, etc.)? o Learning Curve - How easy is it to learn if you have experience with another GUI toolkit or have written one yourself? Is the documentation good? Is customer service good? o GUI builders - What tools are built on top of these toolkits to allow an application builder an interactive tool to design and test a GUI? How versatile are these tools? I will gladly compile and post any information I receive. Thank you for your help. -- Bryan O. Paulson (UUCP: ...!uw-beaver!sumax!ole!bryan) Seattle Silicon Corporation 3075 112th Ave NE Bellevue, WA 98004 (206)-828-4422 From don Wed Jan 17 10:07:56 1990 Date: Wed, 17 Jan 90 10:07:56 -0500 To: NeWS-makers@brillig.umd.edu Subject: NeWS terminals?? From: cs.utexas.edu!jarvis.csri.toronto.edu!me!ecf!apollo@tut.cis.ohio-state.edu (Vince Pugliese) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) while there seems to be a whole slew of X terminals, some of my buddies who are running NeWS are curious to know if there are similar beasts which for NeWS implementations? thanks in advance vince apollo@ecf.toronto.edu From don Wed Jan 17 10:08:58 1990 Date: Wed, 17 Jan 90 10:08:58 -0500 To: NeWS-makers@brillig.umd.edu Subject: canvasesunderpath operator in NeWS 2.0 From: att!cbnewsc!bwong@ucbvax.Berkeley.EDU (bruce.f.wong) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) Does this operator work ? I keep getting back null arrays. -- Bruce F. Wong ATT Bell Laboratories att!iexist!bwong 200 Park Plaza, Rm 1B-232 708-713-5111 Naperville, Ill 60566-7050 From don Wed Jan 17 10:19:07 1990 Date: Wed, 17 Jan 90 10:19:07 -0500 To: NeWS-makers@brillig.umd.edu Subject: Spider solitaire for X11/NeWS (part 1 of 2) From: colossal!woods@sun.com (Don Woods) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) Here is the source for a NeWS implementation of Spider, a fairly complex solitaire card game. See the front of the file for info on running it. (It requires OPEN WINDOWS 1.0 or later, i.e., X11/NeWS instead of NeWS 1.1.) The source is split into two postings; this is the first. The documentation will be in a third posting. (It consists mainly of increasingly complex sample positions to give you a feel for the game.) I don't always have time to follow this newsgroup, so if you have questions or comments please send mail to woods@sun.com. -------------------- cut here ---------------------------------- % Copyright (c) 1989, Donald R. Woods and Sun Microsystems, Inc. % % Permission to use, copy, modify, distribute, and sell this software and its % documentation for any purpose is hereby granted without fee, provided that % the above copyright notice appear in all copies and that both that copyright % notice and this permission notice appear in supporting documentation, and % that the names of Donald Woods and Sun Microsystems not be used in % advertising or publicity pertaining to distribution of the software without % specific, written prior permission. Donald Woods and Sun Microsystems make % no representations about the suitability of this software for any purpose. % It is provided "as is" without express or implied warranty. % % THE ABOVE-NAMED DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, % INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT % SHALL DONALD WOODS OR SUN MICROSYSTEMS BE LIABLE FOR ANY SPECIAL, INDIRECT OR % CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, % DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER % TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE % OF THIS SOFTWARE. % % History: Spider is a solitaire card game that can be found in various books % of same; the rules are presumed to be in the public domain. The author's % first computer implementation was on the Stanford Artificial Intelligence Lab % system (SAIL). It was later ported to the Xerox Development Environment. % The card images are loosely based on scanned-in images but were largely % redrawn by the author with help from Larry Rosenberg. % % This program is written entirely in NeWS and runs on OPEN WINDOWS 1.0. % It could be made to run much faster if parts of it were written in C, using % NeWS mainly for its display and input capabilities, but that is left as an % exercise for the reader. Spider may also run with little or no modification % on subsequent releases of OPEN WINDOWS, but no guarantee is made on this % point (nor any other; see above!). To run Spider, feed this file to 'psh'. % % Author: Don Woods % woods@sun.com % % Sun Microsystems, Inc. % 2550 Garcia Avenue % Mountain View, CA 94043 % % CardUtils is a mix-in class, never intended to be instantiated. Mostly it % defines colors and names. % /CardUtils nullarray nullarray classbegin /grey {dup dup rgbcolor} def /BLACK 0 grey def /WHITE 1 grey def /HALF .5 grey def framebuffer /Color get { /RED .8 0 0 rgbcolor def /SUN 140 10 210 RGBcolor def % for face-down cards; should replace with corporate color /BACK .9 grey def /FELT .2 .8 .6 rgbcolor def /EDGE .7 grey def /BLANK {FELT colorhsb exch 2 div exch hsbcolor} def /PANEL BLANK def } { /RED .8 0 0 rgbcolor def /SUN HALF def /BACK WHITE def /FELT HALF def /EDGE HALF def /BLANK .6 grey def /PANEL WHITE def } ifelse /Suits [ /Spade /Heart /Diamond /Club ] def /Ranks [ /King /Queen /Jack /Ten /Nine /Eight /Seven /Six /Five /Four /Three /Deuce /Ace ] def % Dict that maps a rank into the next higher rank. % /Above dictbegin null Ranks { % r+1 r dup 3 -1 roll def % r } forall pop dictend def % Default for classes that don't actually care about specific mouse loc. % /CardAtPoint { % event => card pop null } def % Method by which children can send an event to the SpiderCanvas. % /SendParent { % /meth => - Parent dup null ne { % /meth parent createevent begin /Canvas exch def /Action exch def /Name /CallMethod def /TimeStamp lasteventtime def currentdict end sendevent } { pop pop } ifelse } def % Utilities for accessing optional instance variable: index in parent. /ParentIndex null def % promoted /setindex { % any => - /ParentIndex exch promote } def /getindex { % - => any ParentIndex } def % Dict for translating Ranks and Suits into compact strings. /Compact dictbegin /King (K) def /Nine (9) def /Six (6) def /Three (3) def /Queen (Q) def /Eight (8) def /Five (5) def /Deuce (2) def /Jack (J) def /Seven (7) def /Four (4) def /Ace (A) def /Ten (10) def /Spade (s ) def /Heart (h ) def /Hyphen (-) def /Diamond (d ) def /Club (c ) def dictend def % Convert /suit and /rank into a short string. % /CompactText { % suit rank => (Rs ) Compact exch get exch Compact exch get append } def /CardWidth 79 def /CardHeight 123 def classend def /CardImage [Object CardUtils] [ /Canvas % parent canvas on which we paint /X /Y % lower left corner where we paint /Suit % name of suit class var (/Club, /Diamond, ...) /SuitDict % dict obtained by looking up /Suit /Rank % name of rank (/Ace, /Deuce, /Three, ...) /RankProc % proc obtained by looking up /Rank /Type % method name: /FaceUp, /FaceDown, /Joker, etc. /AllVisible? % false if lower 2/3 or so is covered up ] classbegin % Class variables: /Depth 0 def % promoted: extra card edges parent should show % Methods: /newinit { % suit rank type => -- /newinit super send /setcard self send /AllVisible? true def } def /destroy { % - => - /Canvas null def } def /setdepth { % n => -- dup 0 ne {/Depth exch promote} {pop /Depth unpromote} ifelse } def /setcard { % suit rank type => -- /Type exch def /Rank 1 index def /RankProc exch dup type /nametype eq {load} if def /Suit 1 index def /SuitDict exch dup type /nametype eq {load} if def } def /setall { % suit rank type depth => -- /setdepth self send /setcard self send } def % Erase old stack lines if about to make it shorter. % Assumes current canvas is correct. % /shorter? { % depth => -- Depth lt {/FillColor Canvas send dup Stack} if } def /getcard { % -- => suit rank type Suit Rank Type } def /getall { % -- => suit rank type depth Suit Rank Type Depth } def /insertname { % (before...) (...after) => (before...Suit Rank...after) Rank dup length string cvs exch append Suit dup length string cvs ( ) append exch append append } def % If argument is true, make the card be faceup; else make it facedown. % Return true if state of card was changed. % /expose { % expose? => changed? /FaceUp /FaceDown ifelse % want dup Type ne /Type 3 -1 roll def } def /setvisible { % bool => - /AllVisible? exch def } def /paint { % -- => -- Canvas null ne { gsave Canvas setcanvas /PaintCard self send grestore } if } def % Given an array of instances (on the current canvas), paint them all. % Avoids overhead of individual sends. Also avoids painting any cards % outside the clip (includes 5-pixel slop to account for card borders). % /paintarray { % [cards] => -- clipcanvaspath pathbbox exch pop 5 add 3 1 roll exch pop 5 sub CardHeight sub % [cards] ymax ymin 3 -1 roll { begin % put instance on dict stack as if sending to it 2 copy Y le exch Y ge and {PaintCard pause} if end } forall pop pop } def % Paint card, assuming currentcanvas is correct. % /PaintCard { % -- => -- X Y moveto Type self send Depth 0 ne {PaintStack} if } def /PaintStack { % -- => -- .4 grey .9 grey Stack } def /FaceUp { % -- => -- EDGE nullproc WHITE /Border self send SuitDict dup /color get setcolor % suit dup RankProc exec % suit rankbits [ 9 14 4 -1 roll ] % suit rankpip 4 CardHeight 20 sub 3 copy pip did % suit /small get dup 0 get % smallpip w -2 idiv 8 add CardHeight 35 sub 3 copy pip did } def % Lazy evaluation of cached image for facedown card. % /FaceDownImage { % - => canvas gsave CardWidth CardHeight monochromecanvas 1 8 ifelse [] null buildimage dup setcanvas BACK setcolor clippath fill SUN setcolor CardWidth CardHeight true [] {} imagemask grestore /FaceDownImage 1 index store } def /FaceDown { % -- => -- /path self send gsave clip % seems to be necessary even though this is the same % path as the boundary of the FaceDownImage canvas X Y translate CardWidth CardHeight scale FaceDownImage imagecanvas grestore 2 setlinewidth HALF setcolor stroke } def /Joker { % -- => -- EDGE nullproc WHITE /Border self send [35 88 {<0000e00000 0001e00000 0001c00000 0001ef0000 0003f18000 0033f3c000 007ffc4000 00d7fcc000 01838cc000 03bf060000 03c56f0000 03840b0000 03821a0000 0181460000 00813a0000 0181820000 0183c70000 0007ffc000 001ffff800 003ffffc00 007ffffe00 03fbffef80 0373ffe1c0 0079efd0e0 00d1c7f040 00f0c3e840 01b081a560 01d000c7a0 0130018620 0110798d20 0211831820 03200d3060 0420f3e180 0450044300 0490046e00 048e063000 049fdd1000 089ffcf000 0d9ffe2000 1f1fffc000 3f3fff8000 3fbfff8000 3fbfffc000 1fbfffc000 17bfffe000 237fffe000 227ffff000 2a5fbff800 2ecf9fc800 2acf8f8000 3e0f890000 180f998000 080f998000 080f820000 080f820000 080f820000 0a0fc20000 0f27c20000 2dc7c40000 3a87c40000 2f87c40000 3f07c40000 7a03ca0000 8903ca0000 0b83d20000 0c81c20000 0f81ca0000 0f01c20000 0601c20000 0001c20000 0001c20000 0001c40000 0001c40000 0001c40000 0001cc0000 0000cc0000 0006cc0000 0007ce0000 0001fc0000 00037c0000 0006f80000 000cfc0000 0019fc0000 03633e0000 03fe1e0000 00000f0000 000007d800 000001f800>}] centerpip [4 38 {<10 10 10 10 90 60 00 00 60 90 90 90 90 60 00 00 90 a0 c0 c0 a0 90 00 00 f0 80 e0 80 80 f0 00 00 e0 90 90 e0 90 90>}] 4 CardHeight 44 sub 3 copy pip did } def /Blank { % -- => -- EDGE nullproc BLANK /Border self send } def /Border { % edgecolor proc fillcolor => -- gsave /path self send setcolor fill /path self send exec setcolor 2 setlinewidth stroke grestore } def /path { % -- => -- 5 X Y CardWidth CardHeight rrectpath } def /size { % -- => w h CardWidth CardHeight } def /location { % -- => x y X Y } def /relocate { % x y canvas => -- /Canvas exch def /Y exch def /X exch def } def /Stack { % darkcolor lightcolor => -- % assumes parent is current canvas gsave X 0.7 sub Y 0.7 add moveto % dark light Depth dup -2 mul dup neg 0 6 -1 roll % ... depth dx dy width dark Depth currentpoint 2.5 10 -1 roll % ... depth dx dy width light 2 { setcolor setlinewidth translate { 2 -2 translate 3 0 moveto CardWidth 5 sub 5 5 270 0 arc CardWidth CardHeight 3 sub lineto stroke } repeat } repeat grestore } def % Utilities: /pip { % [w h bitsproc] dx dy => --; shows pip at currentpoint gsave rmoveto aload pop true exch % w h true bits [ 4 index 0 0 6 index dup neg 0 3 -1 roll ] % w h true bits [matrix] exch currentpoint translate 5 -2 roll 2 copy 7 2 roll scale imagemask grestore } def /did { % same as pip but upside down AllVisible? { gsave exch CardWidth exch sub exch CardHeight exch sub rmoveto aload pop true exch [ 4 index neg 0 0 6 index dup 0 exch ] exch currentpoint translate 5 -2 roll 2 copy 7 2 roll scale imagemask grestore } { pop pop pop } ifelse } def /qiq { % same as pip but reflected across vertical axis gsave exch CardWidth exch sub exch rmoveto aload pop true exch [ 4 index neg 0 0 6 index dup neg 0 3 -1 roll ] exch currentpoint translate 5 -2 roll 2 copy 7 2 roll scale imagemask grestore } def /bib { % same as pip but reflected across horizontal axis AllVisible? { gsave CardHeight exch sub rmoveto aload pop true exch [ 4 index 0 0 6 index dup 0 exch ] exch currentpoint translate 5 -2 roll 2 copy 7 2 roll scale imagemask grestore } { pop pop pop } ifelse } def /centerpip { % pip => -- AllVisible? { dup aload pop pop % pip w h CardHeight sub -2 idiv exch CardWidth sub -2 idiv exch pip } { pop } ifelse } def /twopips { % pip => -- dup aload pop pop CardHeight 1.6 mul sub -2 div round exch CardWidth sub -2 idiv exch 3 copy pip did } def /fourpips { % pip => -- dup aload pop pop % pip w h CardHeight 1.6 mul sub -2 div round exch CardWidth .6 mul sub -2 div round exch 3 copy pip 3 copy did 3 copy qiq bib } def /sixpips { % pip => -- dup fourpips AllVisible? { dup aload pop pop % pip w h CardHeight sub -2 idiv exch CardWidth .6 mul sub -2 div round exch 3 copy pip qiq } { pop } ifelse } def /eightpips { % pip => -- dup fourpips AllVisible? { dup aload pop pop % pip w h CardHeight 1.2 mul sub -2 div round exch CardWidth .6 mul sub -2 div round exch 3 copy pip 3 copy did 3 copy qiq bib } { pop } ifelse } def /facecard { % bits => -- [ 47 46 4 -1 roll ] CardWidth 47 sub 2 idiv CardHeight 2 idiv 3 copy pip did gsave CardWidth 48 sub 2 idiv CardHeight 91 sub 2 idiv rmoveto 48 92 rect % BLACK setcolor 0 setlinewidth stroke grestore } def % Image definitions: /Club dictbegin /color BLACK def /small [9 11 {<1c00 3e00 3e00 1c00 6b00 ff80 ff80 ff80 6b00 0800 1c00>}] def /normal [15 16 {<0380 07c0 0fe0 0fe0 0fe0 07c0 3bb8 7ffc fffe fffe fffe 7d7c 3938 0380 0380 07c0>}] def /big normal def /jack {<06d556d6c000 036b6aad8700 01b556db0f80 81db6ab61fc0 c16f7eec1fc0 627000181fc0 b2bffff00f80 d9bffff07770 ed2002b0fff8 062002a9fffc ff38faa9fffc 202502a9fffc 2078f2a8fff8 203262a87270 203a72a80200 202402a80700 202702ae0700 202202ba0f80 202042ea0000 201782aa0000 f01306ac0000 48180e3e0000 e4ec3bff8000 2797e07be000 e738f9eb7800 2f985f975e02 f73b46235786 2b98606b7eec 3d3879c36f78 3eab7fd77ea8 37585f835748 2bb847ab5698 3df362037f88 36f0bb5f6f08 2f50dc0b7e68 3db6aaf35e08 2de0d82b6418 3da1b5cb85a8 39ad50a62828 3b41b7298858 3b4352903658 335abcacd0b8 3683524160b8 3686abb6ad78 36b55d4d6178 3d06b6dac178>} def /queen {<033749400000 07f794c00700 87f522400f80 c36549401fc0 406f94c01fc0 666df3c01fc0 2feb04400f80 2feaf7c07770 26ce6740fff8 20da75e1fffc 2dda0251fffc 7fd21649fffc 5f9e0ce4fff8 4fb404f27270 f3b404b90200 1b24209c8700 0f7e3dce4700 076f0de64f80 0e4f83f72000 0edac23b2000 1cf0fe8f2000 1d942a272000 393f00bb2080 3321edc3c140 77f13e46c360 645bb6ec6490 ccceebb8f36c ddfc5d1fd954 97dfebf58ca4 36aaf72f9fa8 6f779c35985c 7aaa883b9fa2 dddd47358fcc aaaac71fc6f2 77775ad6ed74 aaaadddc7a9a dddddad4f5ec aaaac21cda16 777747180dca afeaa0180e26 f81de1181794 c003a3999bd6 80c0e55995d4 d8c0aee80aea 780c54540734 b00c793c601a>} def /king {<000d04104160 01c7041041c0 03e3db6db780 07f184104300 07f0fffffe00 07f06aaaac00 03e035555800 1ddc3ffff000 3ffe3ffff000 7fff20055010 7fff3c755038 7fff2e65507c 3ffe3e7d505c 1c9c24055054 00802405505c 01c027855054 01c02205505c 03e02d855c54 0000e205745c 0001271dd454 000160e55c5c 000707357854 001f8f844c5c 007ff9ffd654 01fffc44475c 07fffd111fd4 1ffbfe447ddc 7ffd7f11f3d4 ffefafc7c65c fe6cd7ff8cd4 7c6c6f7c1e5c 7def570038d6 7bc7ab1c73de 7f39f71c79d6 7efeeb6b63de 7dd77577cfd6 7bbbab6bc7de ff55d508efd6 deeeeb1ccfde be54d7e19fd6 3f93b9319fde 1fff6109dff0 3fe66d6d9f1e 7feb4c65bf70 f3f341059f7e 1bf77bbddfb0>} def dictend def /Diamond dictbegin /color RED def /small [7 12 {<10 10 38 38 7c fe 7c 38 38 10 10 00>}] def /normal [13 19 {<0200 0200 0700 0700 0f80 1fc0 1fc0 3fe0 7ff0 fff8 7ff0 3fe0 1fc0 1fc0 0f80 0700 0700 0200 0200>}] def /big normal def /jack {<0073b76e7000 0039b76ce100 001c3061c100 800fffff8380 c00fffff0380 e00d400307c0 601542030fe0 a0157c3f0fe0 601541431ff0 a0557e5f3ff8 60d55c5d7ffc a19544453ff8 629540451ff0 a51540250fe0 791540e50fe0 e215400507c0 447544050380 089543ebc382 b0f5c1892106 e0866014a10e a1783822300c 23260fe3ec08 6699c01ccb0a ef663fe33bce 73b1c01c7bba 35dc3fe1fdb8 e8ebc01f7ddc 2d777ff76eee ea3bdddd6e7c 2d5d77776f38 e896dddd6f9a 2d5b77776bce f237bddd6fea 355bd77768f8 b8976ddd6ffc f55b7777681e aa37dbdd6ffc 3d5bdd776808 689736dd6ffa f55eeb77681e 6e3ed5bd6fea 3559bad76a38 acb7456d6fec f7779ab76dde adcedb5b7aec 34bd628d7a58>} def /queen {<208f92800000 13ed29800100 109e44c00100 111a82a00380 17fd01900380 1137eed007c0 127a11e80fe0 1fe9f7e40fe0 12f0cef21ff0 24d8ebfa3ff8 3fe808f97ffc 25b804fd3ff8 43e835be9ff0 ff70095e4fe0 039001bf4fe0 02d8f95f47c0 071c33afa380 05460357a390 0f1307af9138 0bc584d7d154 1ff9793bd0ee 15ff45ffc854 3bbffffbe818 2f57ffd5e834 7feefeeff854 57f5555fdcaa faffbbfebf4a bf5ffff5fac4 fbabffab757a 73f5555fe9ac f64fabffeb46 e54ffe7ceaaa ec4ff260ed10 cff4f27676aa da8c3b367c44 92aad931faaa b98ad97f5510 3d721fd572aa 749df55fae44 7aa357f031aa f6abf80f5510 faa307f951aa f69d7c028ec4 fab941fab92a d6c55f5ac572 acd55bb5566a>} def /king {<003444444580 011aaaaaab00 010c44444710 038711111220 0383aaaaae60 07c1911114a2 0fe0fff84ca6 0fe07fffa924 1ff0403fc956 3ff84f0ffa6e 7ffc508bfbb8 3ff85e0afbb8 1ff04d0aaa6e 0fe09e0aad56 0fe080055524 07c1440554a6 0381b202aaa6 03808c3aaa64 01004066aa26 010070daaa16 300060aaab04 6b0282a55506 5505555ffffe 6abaaafc6312 56fd5556b5a6 2b5effe318ce 1d2c7ffffffe 39a47bc000fe 4db235ffff82 ccf33b8c63da 671bbfdad7ea 6c7bbeb19d72 31e9b9bfaefa 27b49d35555e 4f141b6ad3be 9ab499d7f356 3474deace5ee 6ab5f554a4d4 d17adaac2e7a aafa55555554 44fa1ffb552e abda555fd394 179adffb594a a9dbf6ca594c 54fad938bce6 e47abffabc4e>} def dictend def /Heart dictbegin /color RED def /small [9 11 {<6300 f780 ff80 ff80 7f00 7f00 3e00 1c00 1c00 0800 0800>}] def /normal [15 17 {<3838 7c7c fefe fefe fffe fffe 7ffc 7ffc 3ff8 1ff0 0fe0 0fe0 07c0 0380 0380 0100 0100>}] def /big normal def /jack {<065326530000 032b56a60000 8193264ce0e0 c0cb5699f1f0 e8630633fbf8 ec3ffff3fbf8 ea1ffff3fff8 e90aa013fff8 ec8aa7a1fff0 fc8aa321fff0 568aa520ffe0 558aa3907fc0 569540103f80 fc954c083f80 e91548d81f00 ea6a87200e00 ec9a80200e90 e96a81e004f0 e15ae0702460 e0e5581090b0 e37fae286fd0 effffffc1160 fce000032180 1cf122898240 e778fffe6570 7bfc01003958 6dce7ffe7ee8 9bcf2244cf50 b7779189cee0 6e3fca53bb60 dc9ce997fef8 b93cf5ae6b5e 7277742e76d6 e4effa5deb56 c9f59a5fdeda 93ab9db9bb4c 275fedb9d6d6 4ef8fe77eb5a 9f64667ffeec 3acfe6663b76 f59076664dba 6fbffe6fe6dc b75ffefff36e 5b5224489bb4 b751292915ea 5b56f29ed5b4>} def /queen {<002aa0040000 003573047070 006ab388f8f8 00755b89fdfc 0068a809fdfc 00705cc9fffc 00ae7ce9fffc 00a20ee4fff8 00be7604fff8 00ae33347ff0 017e79ba3fe0 016201ba1fc0 016100c11fc0 017140ec8f80 02f181ff8700 02f081b00700 02f023fc0200 02e9c35e0210 05c8c7ff006c 05dc86afc054 05f40ffff0ba 05ea1ab3fc54 0bb5f573f86c 0bbaaadff012 0b4f578ff07e 0a89fcdfacec 1471246d0f04 193e278d2bd4 1267f81ce66e 2447c0185e4a 244fe6daba54 4ccbf57fe64a 948af2b5dc46 049cb937a4ce 2a9779735c9e 1a9bdc7354bc 489d9c6eacfa 399ddee6b4f4 2916eed6acea 213ee6fd54d4 71269fed6ca8 a936e7ad54d0 252eb99abca4 1125ee7af4c8 933d3b9ecc88 7a3bcee7b8bc>} def /king {<001000000100 000db6db6e00 0006aaaaaa00 0003145144c0 000108208520 1c1c88208f40 3e3e7ffff97c 7f7f55555356 7f7f3ffff454 7fff20055354 7fff58f55154 3ffe65055f6a 3ffe7cf2aa40 1ffc5c32a9a2 0ff87c72ac7e 07f045015440 07f0460154fe 03e04202aa80 01c0c002abfe 01c34d84ab3c 0084c20b2a78 0089470a54f2 000f2015f9e4 001ad55593cc 0062aaae5796 03f4d056ff34 1e6a671f6658 75af3df6afd2 a99bcfc7b8e6 525ab01ab63e a52fafebe18e 4d9ababae262 924dabaf651c e9aafabea8b2 5cb76fede522 2e4d210caa6a 9f34aaaab54a 4ff5e54f69da 2e9a228ae99a 8d5cf10a67ba 1cb80a9d6922 ad58f91ba34e 4e380a99423c 1d58f81546f0 af74091e4fc6 71e7f39fcf1c>} def dictend def /Spade dictbegin /color BLACK def /small [9 12 {<0800 0800 1c00 1c00 3e00 7f00 ff80 ff80 ff80 6b00 0800 1c00>}] def /normal [15 19 {<0100 0100 0380 0380 07c0 0fe0 0fe0 1ff0 3ff8 7ffc 7ffc fffe fffe fffe fffe 7d7c 3938 0380 07c0>}] def /big [39 52 {<0000100000 0000100000 0000100000 0000380000 0000380000 0000380000 00007c0000 00007c0000 0000fe0000 0000fe0000 0001ff0000 0003ff8000 0003ff8000 0007ffc000 000fffe000 000fffe000 001ffff000 003ffff800 007ffffc00 00fffffe00 01ffffff00 03ffffff80 07ffffffc0 0fffffffe0 1ffffffff0 1ffffffff0 3ffffffff8 3ffffffff8 7ffffffffc 7ffffffffc 7ffffffffc fffffffffe fffffffffe fffffffffe fffffffffe fffffffffe 7ffffffffc 7ffffffffc 3fff7dfff8 3ffe38fff8 1ffc387ff0 0ff8383fe0 03e0380f80 0000380000 00007c0000 00007c0000 0000fe0000 0000fe0000 0001ff0000 0003ff8000 0007ffc000 000fffe000>}] def /jack {<1d5d77570200 0eaeebae0700 275d775c0700 53aeebb80f80 71fffff00f80 70fffff01fc0 508015503fe0 508f15507ff0 7090d550fff8 709e1550fff8 508d1551fffc 709e1551fffc 51001551fffc a9c01551fffc 50991550faf8 708495507270 50fb15500700 707015500f80 704017700000 50403ddc0000 5060d7740000 703ffddc0000 79c0001f8000 8db6db60e000 7e40002e9800 9bffffeeb700 732ddde4e680 aa9f7760cce0 4c0ddfee9990 9c7ffdeeb33c b2641524e666 67524e608cfc cd8f35aebbc8 198d8e2eed34 f74bdb249184 056f2020e4cc 3e7c9fff91b4 64725aab4484 49c9755711cc d325dbba44b4 e69317751984 0e4c5aac4d4e fd311559393c 1ca45ff4258c 325b9930ea5c 39f296d29f38>} def /queen {<00692d080000 007298100000 00644dd00000 20a82cd00400 20b01d500400 50ae3e100e00 50a246f00e00 50be7e701f00 88ba33b01f00 515e3b083f80 715201f87fc0 215183b8ffe0 215103f9fff0 315005c3fff8 6159c683fff8 32b98b83fff8 62b40cc3fff8 32b41543fff8 62aa2221f5f0 32f5d550e4e0 67c888880e00 37d555741f00 666222640000 3e7555820000 683889290000 3d1556318020 6cd224514070 3ecd780140a8 6f27e286e1dc 3f85430df6a8 67892d3bbe72 33c9206f3ba4 69f110b66d9c 3cf1134cd6fe 66739dbda3d4 333ffb7da50c 61b396e5aa8c 38b119c5adb2 6cd11794d4c8 3459273668ac 62fd2e73306a 31c57c010ce8 61fffffffe0c 35a222222108 65fffffffffc 31d555555718>} def /king {<000508208240 00439c71c680 0041befbef00 00e0befbe600 00e048208400 01f03ffffc00 01f03ffffc00 03f82a800404 07fc2a9e7c0e 0ffe2aa0841a 1fff2a9df430 1fff2ab96420 3fffaa9df424 3fffaa808424 3fffaa808428 3fffaa818428 1f5f2aad6c28 0e4e2ab83c24 00e02a86c424 01f02a810424 00006a838724 0000aac006a8 0000aab55aa8 0001d5cba528 0007fffffe2c 003d000023ac 00cdffffe2ac 03e0aaaaf566 1ce6ffffb566 6e7680008566 c7328c1d4aa2 e3b85c216aa2 f1cb4fe16aa2 394b47f214a2 1eb95bf29562 8d44422ad562 cee4244ad566 e9f5a0022966 7d7dbffd2ae6 3a3cbffdaafe 3e1e3555aa88 fa3e15547afe 177adaaa4650 fdf2dc6b457e 16e25eeb7ad0 fd421390857e>} def dictend def /Ace { % suit => rankbits /big get centerpip {<1c00 1c00 1c00 3600 3600 3600 3600 6300 7f00 7f00 6300 c180 c180 c180>} } def /Deuce { /normal get twopips {<3e00 7f00 e380 c180 0180 0380 0700 0e00 1c00 3800 7000 e180 ff80 ff80>} } def /Three { /normal get dup twopips centerpip {} } def /Four { /normal get fourpips {<0700 0f00 0f00 1b00 1b00 3300 3300 6300 6300 ff80 ff80 0300 0780 0780>} } def /Five { /normal get dup fourpips centerpip {} } def /Six { /normal get sixpips {<3e00 7f00 e380 c100 c000 de00 ff00 e380 c180 c180 c180 e380 7f00 3e00>} } def /Seven { /normal get dup sixpips dup aload pop pop CardHeight 1.3 mul sub -2 div round exch CardWidth sub -2 idiv exch pip {} } def /Eight { /normal get dup sixpips dup aload pop pop CardHeight 1.3 mul sub -2 div round exch CardWidth sub -2 idiv exch 3 copy pip did {<3e00 7f00 e380 c180 e380 7f00 3e00 7f00 e380 c180 c180 e380 7f00 3e00>} } def /Nine { /normal get dup eightpips centerpip {<3e00 7f00 e380 c180 c180 c180 e380 7f80 3d80 0180 4180 e380 7f00 3e00>} } def /Ten { /normal get dup eightpips dup aload pop pop CardHeight 1.4 mul sub -2 div round exch CardWidth sub -2 idiv exch 3 copy pip did {} } def /Jack { /jack get facecard {<0780 0780 0300 0300 0300 0300 0300 0300 0300 c300 c300 e700 7e00 3c00>} } def /Queen { /queen get facecard {<1c00 3e00 7700 6300 6300 6300 6300 6300 fb00 ff00 6f00 7700 3f80 1d00>} } def /King { /king get facecard {} } def % Debugging aid (used by trace.ps) % /printstring { % -- => string /printstring super send self isinstance? { (%(% % %@%,%)) [3 -1 roll Suit Rank Type X Y] sprintf } if } def classend def % CardImage /CardColumn [ClassCanvas CardUtils] dictbegin /Crunched? false def % cards are closer than dY apart? /Cards [] def % CardImage instances (top to bottom) dictend classbegin /dY 29 def % desired delta-Y when overlapping cards /destroy { % - => - /Cards nullarray def } def /minsize { CardWidth 2 add CardHeight dY 10 mul add } def /spread { % - => dy /size self send exch pop CardHeight sub Cards length 1 sub 1 max div dY min } def /validate { /spread self send /Crunched? 1 index dY ne def /size self send exch CardWidth sub 2 div cvi exch CardHeight sub Cards { % spread x y card 2 index 2 index round self /relocate 5 -1 roll send % spread x y 2 index sub } forall pop pop pop /validate super send } def /reshape { /invalidate self send /reshape super send } def /PaintCanvas { % -- => -- Cards /paintarray CardImage send } def % Append cards to the bottom of the column. Each cardspec is either a % CardImage or an array of args to be used in creating a new CardImage. % /appendcards { % [cardspecs] => -- TopCard dup null ne {false /setvisible 3 -1 roll send} {pop} ifelse [ exch { dup isarray? { aload pop /new CardImage send false /setvisible 2 index send } if } forall ] /Cards Cards 2 index append def TopCard dup null ne {true /setvisible 3 -1 roll send} {pop} ifelse /validate self send gsave Canvas setcanvas Crunched? { pop FillColor FillCanvas PaintCanvas } { /paintarray CardImage send } ifelse grestore } def % Remove a card and all subsequent cards. Turn exposed card (if any) % face up. Return array of cards removed, and bool true if new card % was exposed. % /removecards { % firstcard => [cards] exposed? Cards exch arrayindex { % index Cards 1 index Cards length 1 index sub getinterval % index [cards] /Cards Cards 0 5 -1 roll getinterval def dup { 0 0 null /relocate 5 -1 roll send } forall gsave Canvas setcanvas Crunched? { % [cards] /validate self send TopCard dup null ne { true /setvisible 2 index send true /expose 3 -1 roll send } { pop false } ifelse FillColor FillCanvas % [cards] exp? PaintCanvas } { % [cards] TopCard dup null ne { % [cards] newtop true /setvisible 2 index send true /expose 2 index send % [cards] newtop exp? /location 2 index send % [] top exp? x y 5 add exch CardWidth add 2 add exch % [] top exp? x y 4 index dup length 1 sub get % [] top e? x y oldtp /location exch send exch 2 sub exch % [] t e? x y x2 y2 points2rect rectpath FillColor setcolor fill /PaintCard 3 -1 roll send % [cards] exposed? } { pop false FillColor FillCanvas } ifelse } ifelse grestore } { nullarray false } ifelse } def % Turn the top card face down again. % /unexpose { % -- => -- TopCard false /expose 2 index send pop gsave Canvas setcanvas /PaintCard exch send grestore } def % Remove all cards, but don't paint. % /reset { % -- => -- Cards {/destroy exch send} forall /Cards nullarray def /invalidate self send } def % Return the highest (kingmost) sequential card. Top card is assumed to % be faceup. % /natural { % - => card TopCard dup null ne { /getcard 1 index send pop % top suit rank Cards length 2 sub -1 0 { % nat suit rank n Cards exch get % nat suit rank card /getcard 1 index send % nat s r card s' r' t' /FaceUp eq Above 6 -1 roll get 2 index eq and % nat s card s' r' bool 5 -1 roll 3 index eq and { % nat card s' r' 4 -1 roll pop } { 3 -1 roll pop exit } ifelse } for pop pop % nat } if } def % Report how many times the specified card occurs, face-up only, in this % column. The suit can be /Unused to find "free" cards of given rank. % /locatecard { % suit rank => #found 0 1 Cards { % s r #f card# card /getcard exch send % s r #f c# su rk type /FaceUp ne exch 5 index ne or { % either not faceup or wrong rank pop % s r #f c# } { % s r #f c# su 4 index eq { exch 1 add exch } { 3 index /Unused eq { dup Cards length ge { exch 1 add exch } { Cards 1 index get /Rank exch send Above exch get 3 index ne { exch 1 add exch } if } ifelse } if } ifelse } ifelse % s r #f c# 1 add } forall pop 3 1 roll pop pop } def % Break cards into chunks that are in suit-and-sequence, and invoke % callbacks for each facedown card and for each sequential chunk. % Used by /textcontents and /evaluate. A single client-defined value % is expected to be on the stack, and is provided to the callbacks: % clientval /facedownproc => clientval' % clientval n suit rank /sequenceproc => clientval' % /Sequences { % facedownproc sequenceproc clientval => clientval' 0 null null Cards { % fdp sqp val n pvsuit pvrank cd /getcard exch send /FaceUp ne { % fdp sqp val n pvs pvr suit rnk pop pop pop pop pop % fdp sqp val 2 index exec 0 null null % fdp sqp val' n pvsuit pvrank } { % fdp sqp val n pvs pvr suit rnk Above 1 index get 3 index eq 2 index 5 index eq and { % fdp sqp val n pvs pvr suit rnk 5 2 roll pop pop 1 add 3 1 roll % fdp sqp val n+1 suit rank } { 6 2 roll % fdp sqp suit rnk val n pvs pvr 6 index exec % fdp sqp suit rank val' 1 4 2 roll % fdp sqp val' n suit rank } ifelse } ifelse } forall % fdp sqp val n suit rank 5 -1 roll exec % fdp val' exch pop } def % Return a string describing the cards in the column. % /textcontents { % - => string {(? ) append} {AppendSequence} nullstring /Sequences self send dup length 0 eq {pop (Empty column. )} if } def % Append a string that describes n sequential cards ending in the % specified suit and rank. % /AppendSequence { % str n suit rank => str' 3 -1 roll dup { 0 {pop pop pop} 1 {pop CompactText append} /Default { % str suit rank n 2 copy 1 sub {Above exch get} repeat /Hyphen exch CompactText 4 1 roll pop % str (top-) suit rank CompactText append append } } case } def % Compute an evaluation function; see SpiderCanvas' /ComputeScore. % /evaluate { % - => int {dup 0 eq {15 sub} if 10 sub} % lose points for cards still facedown {pop pop 1 sub 0 max 2 mul add} % 2 pt per all but first card in seq 0 /Sequences self send } def /CardAtPoint { % event => card gsave Canvas setcanvas /YLocation get grestore /size self send exch pop exch sub % distanceFromTop Crunched? {/spread self send} {dY} ifelse div cvi dup Cards length ge {pop TopCard} {Cards exch get} ifelse } def /TopCard { % - => card Cards length 0 ne {Cards dup length 1 sub get} {null} ifelse } def /NextCard { % card => card' Cards exch arrayindex not {Cards length} if 1 add dup Cards length ge {pop null} {Cards exch get} ifelse } def classend def /StacksBag [ClassCanvas CardUtils] [/InitDepth /InitType /Cards] classbegin /Gap 10 def % border and inter-stack gap /newinit { % depth #cards cardtype => -- /newinit super send /InitType exch def [ exch {null null InitType /new CardImage send} repeat ] /Cards exch def /InitDepth exch def Cards { InitDepth /setdepth 3 -1 roll send } forall } def /destroy { % - => - /Cards nullarray def } def /minsize { CardWidth Gap add Cards length mul Gap add CardHeight Gap 2 mul add 2 {InitDepth 2 mul add exch} repeat } def /validate { Gap % x /size self send exch pop CardHeight sub Gap sub % x y Cards { % x y card 2 index 2 index self /relocate 5 -1 roll send % x y exch CardWidth add Gap add exch } forall pop pop } def /reshape { /invalidate self send /reshape super send } def /reset { Cards { null null InitType InitDepth /setall 6 -1 roll send } forall } def /setdepth { % depth n => - Cards exch get gsave Canvas setcanvas 2 copy /shorter? exch send 2 copy /setdepth exch send exch 0 ne {/PaintStack exch send} {pop} ifelse grestore } def /setall { % suit rank type depth n => - Cards exch get gsave Canvas setcanvas 2 copy /shorter? exch send dup 6 1 roll /setall exch send /PaintCard exch send grestore } def /replace { % suit rank type depth => n 0 Cards { % ... n card /Type exch send InitType eq { dup 6 1 roll /setall self send exit } if 1 add } forall } def % Find LAST card that is NOT of InitType, and reset it. % Return a /getall of the old value. % /restore { % -- => oldsuit oldrank oldtype olddepth Cards length 1 sub -1 0 { Cards 1 index get /getall exch send % n suit rank type depth 1 index InitType eq { pop pop pop pop pop } { null null InitType InitDepth 9 -1 roll /setall self send exit } ifelse } for } def /PaintCanvas { Cards /paintarray CardImage send } def classend def /ControlPanel [FlexBag CardUtils] nullarray classbegin % Make control panel opaque so deactivating the text item's caret % doesn't invalidate the SaveBehind when a notice is over the tableau. % (Stupid server bug.) % /Transparent false def /Mapped true def /FillColor PANEL def /newinit { /newinit super send /sw {/se Previous POSITION 10 0 XYADD} /setlayoutspec self send /NewGame [ /w {/w self POSITION 10 0 XYADD} (New Game) /NewGame MakeProc ClassButton ] /addclient self send /BackUp [ (Back Up) [ (One Move) null /BackUp MakeProc (Start Over) null /StartOver MakeProc (Replay) null /Replay MakeProc ] null OpenLookButtonStack ] /addclient self send /Score [ (Score) /Score MakeProc ClassButton ] /addclient self send /Expand [ (Expand) /Expand MakeProc ClassButton ] /addclient self send /Locate [ (Locate) /Locate MakeProc ClassButton ] /addclient self send /File [ (File) [ (Save in File) null /SaveFile MakeProc (Resume from File) null /Resume MakeProc (Resume from Selection) null /ReadSel MakeProc ] null OpenLookButtonStack ] /addclient self send (Name:) /new OpenLookLabelGraphic send /Label [/w {/e Previous POSITION 10 0 XYADD} 5 -1 roll] /addclient self send /Name [ /sw {/se Previous POSITION pop 5 add /se /File POSITION exch pop} nullnotify ClassTextControl ] /addclient self send 10 10 /setpadding self send } def /Layout { /Layout super send /bbox /Name /sendclient self send exch pop % x y h /size self send pop % x y h W 10 sub 3 index sub 1 max exch % x y w' h % "1 max" is because w<0 screws up /size on next /Layout /reshape /Name /sendclient self send } def /MakeProc { % /meth => proc [exch /SendParent] {pop} exch append self soften buildsend } def /reset nullproc def % needed for parent's /reset classend def /SpiderCongrats [ClassCanvas CardUtils] nullarray classbegin /Transparent false def % also causes it to be initially unmapped /TextFamily /Palatino-BoldItalic def /TextSize 48 def /TextColor RED def FontDirectory TextFamily known not { /TextFamily /Times-Italic def } if /String (Congratulations!!) def /Pad 20 def /minsize { % - => w h gsave TextFont setfont String stringwidth pop Pad add TextFont fontheight Pad add grestore } def /PaintCanvas { % - => - BLACK BorderStroke WHITE /StrokeAndFillCanvas self send Pad 2 div dup moveto 0 TextFont fontdescent rmoveto TextFont setfont TextColor setcolor String show } def /reset nullproc def % needed for parent's /reset classend def -- -- Don Woods. [*** Generic Disclaimer ***] -- ...!sun!woods -or- Woods@Sun.com From don Wed Jan 17 10:29:39 1990 Date: Wed, 17 Jan 90 10:29:39 -0500 To: NeWS-makers@brillig.umd.edu Subject: Spider solitaire for X11/NeWS (part 2 of 2) From: colossal!woods@sun.com (Don Woods) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) Here's the second part of the source for Spider. See my previous posting for more info (and disclaimer / copyright notice). -------------------- cut here ---------------------------------- /SpiderCanvas [FlexBag CardUtils] [ /Deck % undealt cards /DeckCache % copy of deck for replay/restart /MoveCache % record of moves for replay /DownChild % child where mouse button went down /DownCard % CardImage over which button went down /DownTime % eventtime when button went down /LOCK % monitor to avoid damage-vs-update races /DealTimerEvent % event to trigger deal after single click plus timeout /PrevHash % value used for hashing output files /CharIndex % value used for hashing output files ] classbegin % Class Variables: /FillColor FELT def % overrides inherited method /ErrorAction /Both def % /Both, /Beep, /Flash, or other(none) /FlashDelay .03 def % delay to ensure flash gets to paint /ReplayDelay .02 def % delay between moves during replay /DoubleClick .25 def % timeout for double-click for dealing /SingleClick .25 def % timeout for single-click on a column /MovesIncomplete? false def % promoted true if partial file loaded /ColumnNames dictbegin 0 Ranks {1 index def 1 add} forall pop dictend def % Make canvas opaque so updating the frame title bar to reflect loss of % focus when a Notice pops up, doesn't invalidate the Notice's SaveBehind. % (Stupid server bug.) % /Transparent false def /Mapped true def % Methods: /newinit { /newinit super send /DeckCache 0 1 51 {} for 52 copy 104 array astore def /Deck 104 array def % force initial shuffle /LOCK createmonitor def % create client canvases; first, the control panel /Panel [ /nw {/nw self POSITION} ControlPanel ] /addclient self send % then the "hand" /Hand [ /nw {/sw /Panel POSITION} 4 1 /FaceDown StacksBag ] /addclient self send % the eight spots for completed suits /Removed [ /ne {/ne self POSITION /Panel HEIGHT sub} 0 8 /Blank StacksBag ] /addclient self send % the ten tableau columns; use Ranks[Queen..Three] (1-10) to name them /nw { /ne Previous POSITION self WIDTH Previous WIDTH 10 mul sub 18 sub 9 div cvi 0 max 0 XYADD } /setlayoutspec self send Ranks 1 get [ /nw {/sw /Hand POSITION 10 -5 XYADD} CardColumn ] /addclient self send Ranks 2 9 getinterval { [CardColumn] /addclient self send } forall % the big "congratulations" panel (usually unmapped) /Congrats [ /c {/c self POSITION} SpiderCongrats ] /addclient self send % store indices in children for fast lookup [/Panel /Hand /Removed /Congrats Ranks 1 10 getinterval {} forall] { /setindex 1 index /sendclient self send } forall % fork transaction handler so we don't have to tie up our main % event loop doing moves (which leads to dropped mouse-up events) /TransactionProcess [ /CallMethod dup null self MakeInterest ] /new ClassEventMgr send def (Spider Updates) /setname TransactionProcess send /clearsendcontext TransactionProcess send } def /activate { /activate super send (Spider Input) /setname EventMgr send (Click on deck to begin game. ) LeftFooter } def /destroy { /destroy super send TransactionProcess null ne { /destroy TransactionProcess send /TransactionProcess null def } if } def /minsize { % width: room for 10 columns plus 2 margins and minimal gaps % (4 between columns, 10 on either side = 4*9+2*10 = 56) % also room for the 2 StacksBags with some gap (25) between them % height: room for a modest column plus hand plus panel plus gaps % (5 between cols and hand, 4 below cols = 9) /minsize CardColumn send 9 add exch 10 mul 56 add % h1 w1 /minsize /Hand /sendclient self send /minsize /Removed /sendclient self send pop % h1 w1 w2 h2 w3 exch 4 1 roll add 25 add max % h1 h2 w 3 1 roll add % w h /minsize /Panel /sendclient self send exch pop add } def /Layout { /Layout super send /bbox /Panel /sendclient self send exch pop /size self send pop exch /reshape /Panel /sendclient self send 1 1 10 { GetColumn /bbox 1 index send 3 -1 roll add % col x w h+y BorderStroke 2 add dup 4 1 roll sub % col x y' w h' 1 max % h<0 does bad things later since /size yields abs(h) /reshape 6 -1 roll send } for } def % Override: Ensure we don't muck up the clipping during an update % just because the main eventmgr saw a damage event. % /HandleFix { LOCK {/HandleFix super send} monitor } def /shuffle { % - => - (Shuffling...) nullstring /setfooter Parent send % workaround for "constant" NeWS random number sequence: % use day of year (1-366) to skip some initial random numbers; % use seconds to decide how many times to repeat the shuffle % use minutes to skip some random numbers between repetitions % this yields 366*60*60 = 1.3M decks using about 10K calls to random (%pipe date "+{%M %S %j}") (r) file token {exec} {0 0 0} ifelse {random pop} repeat 0 1 51 {} for 52 copy % mins secs c1 c2 c3 .. c104 105 -1 roll 2 add { pause pause pause % e.g., to let initial window finish painting 104 -1 2 {dup random mul cvi roll} for 104 index {random pop} repeat } repeat 104 array astore % mins [deck] /Deck 1 index def /DeckCache exch def % mins pop /MoveCache growabledict def /MovesIncomplete? unpromote } def /reset { % - => - {/reset exch send} /foreachclient self send /paint self send nullstring nullstring /setfooter Parent send } def /deal { % - => - /busy? Parent send not dup {true /setbusy Parent send} if Deck 0 get null eq {/shuffle self send} if (Dealing...) nullstring /setfooter Parent send NoDealYet? not {0 0 0 true /record self send} if 1 1 10 { Deck length 50 gt { dup 3 mod 1 eq {6} {5} ifelse } { 1 } ifelse % !busy? col #cards Deck 0 2 index getinterval arrayreverse % for compat with old saved files /FaceDown IntsToCards dup dup length 1 sub get 2 /FaceUp put % !busy? col #cds [cds] /appendcards Ranks 5 -1 roll get /sendclient self send Deck exch 1 index length 1 index sub getinterval /Deck exch def } for /Remaining self send % !busy? {false /setbusy Parent send} if } def % Update thickness of deck and righthand footer text. % /Remaining { Deck length { 10 {2 0 /setdepth /Hand /sendclient self send false (1)} 0 { null null /Blank 0 0 /setall /Hand /sendclient self send true (No) } /Default {true Deck length 10 idiv 1 string cvs} } case % bool (n) ( deal) append exch {(s) append} if ( remaining.) append nullstring exch /setfooter Parent send } def % Add a move to the MoveCache. The arguments are the numbers of the % source and destination columns (1-10), number of cards moved, and a % bool that is true if the move revealed a previously facedown card. % Removing a completed suit is recorded as a move to column 0; dealing % more cards is recorded as a move from column 0. (The #cards and % exposed? arguments are irrelevant for these cases, as is the destcol % for dealing cards.) % /record { % fromcol destcol #cards exposed? => -- 1 0 ifelse 14 mul add 11 mul add 11 mul add MoveCache dup length 3 -1 roll put } def /unencode { % move => from dest #cards exposed? dup 11 mod exch 11 idiv dup 11 mod exch 11 idiv dup 14 mod exch 14 ge } def /undo { % -- => -- MoveCache dup length 1 sub 2 copy get 3 1 roll undef /unencode self send % from dest #cards exp? dup (Hmmph. ) nullstring ifelse LeftFooter % from dest #cards exp? 3 index 0 eq { pop pop pop pop /undo-deal self send } { 2 index 0 eq { 4 1 roll pop pop /undo-suit self send } { /undo-normal self send } ifelse } ifelse } def /undo-deal { % -- => -- 1 1 10 { GetColumn /TopCard 1 index send % col card /removecards 3 -1 roll send pop % [card] {/destroy exch send} forall } for DeckCache dup length Deck length sub 10 sub Deck length 10 add getinterval /Deck exch def /reset /Hand /sendclient self send /paint /Hand /sendclient self send Remaining } def /undo-suit { % exposed? fromcol => -- GetColumn exch {/unexpose 1 index send} if % col /restore /Removed /sendclient self send pop pop pop % col suit [ exch Ranks { % col [ ... suit rank /FaceUp 3 array astore dup 0 get % col [ ... [spec] suit } forall pop ] % col [cardspecs] /appendcards 3 -1 roll send } def /undo-normal { % from dest #cards exposed? => -- 4 2 roll GetColumn exch GetColumn % #cards exp? destcol fromcol 3 -1 roll {/unexpose 1 index send} if % #cards destcol fromcol /Cards 2 index send % #cards dcol fcol destcards dup length 5 -1 roll sub get % dcol fcol card /removecards 4 -1 roll send pop % fcol [cards] /appendcards 3 -1 roll send } def /replay { % - => - true /setbusy Parent send MoveCache /StartOverOK self send dup 0 1 2 index length 1 sub { % dict dict n ReplayDelay sleep get /unencode self send pop % dict from dest #cards 2 index 0 eq { pop pop pop /deal self send % dict } { 1 index 0 eq { pop pop GetColumn % dict fromcol /DownChild 1 index def /Cards exch send dup length 13 sub get /RemoveSuit? self send pop % dict } { exch GetColumn 3 -1 roll GetColumn % dict #cds dcol fcol /Cards 1 index send dup length 5 -1 roll sub get % dict dcol fcol card /MoveAndRecord self send % dict } ifelse } ifelse dup % dict dict } for pop pop false /setbusy Parent send } def /PointButton { UserProfile /ViewPoint get } def /AdjustButton { UserProfile /ViewAdjust get } def /MakeInterests { % - => interests /MakeInterests super send self soften dictbegin /DownTransition /StartMove BuildCanvasSend def dictend [PointButton AdjustButton] /new ClassNotifyInterest send % Nint null 2 copy % Nint any Nint can dictbegin /UpTransition /EndMove self soften buildsend def dictend null /new ClassDependentInterest send % Nint Dint /Synchronous true put % Nint } def /childindex { % child|null => any|null dup null eq {pop /Self} {/getindex exch send} ifelse } def /StartMove { % event => -- % ignore second mouse button going down while first is still down dup /Interest get /Triggered? 1 index send not { % event Nint null /finddependent 2 index send pop % event Nint Dint % watch for same button going up that went down /Name 3 index /Name get put % event Nint /NotifyIn 1 index send % event /DownChild /ChildUnderPoint self send def % event /DownTime lasteventtime def % event DownChild null ne { /CardAtPoint DownChild send } { pop null } ifelse /DownCard exch def } { pop pop } ifelse } def /EndMove { % event => -- dup /Name get PointButton eq % event point? /ChildUnderPoint self send % event point? upchild DownChild /childindex self send { /Self /Panel /Congrats {null} /Hand {/MousedHand} /Removed {/MousedTop} /Default {/MousedTableau} } case % ev pt? upchild /meth dup null ne { createevent begin /Action exch def 2 array astore /ClientData exch def /Name /CallMethod def /Canvas self def /TimeStamp lasteventtime def currentdict end sendevent } { pop pop pop } ifelse % event dup /Interest get /NotifyOut exch send } def % Put up a confirmation notice. The second button is always Cancel, and % does nothing except put a given string in the left footer. The first % button is always the default, and just sends an event (so that the % notice will go away before we start any painting). % /Confirm { % [(message)] (yes) /eventname (cancelled) => -- [4 -2 roll [exch /SendEvent] self soften buildsend (\r)] exch [(Cancel) [4 -1 roll /LeftFooter] self soften buildsend (\177)] 2 array astore % [(msg)] [buttonspecs] 2 array astore framebuffer /new NoticeFrame send null blockinputqueue { newprocessgroup 0 /setdefault 2 index send /place 1 index send /activate 1 index send /map 1 index send unblockinputqueue } fork pop pop } def /SendEvent { % /action => -- createevent begin /Action exch def /Name /CallMethod def /Canvas self def /TimeStamp lasteventtime def currentdict end sendevent } def % Method that gets called when /SendEvent or /SendParent sends a % /CallMethod event. It invokes the method given by the Action of the % event. If /ClientData in the event is arraytype, it is aloaded onto % the stack as arguments to the method. After the method returns, the % congrats canvas is mapped or unmapped as necessary. % /CallMethod { % event => -- dup /ClientData get dup type /arraytype eq { aload length 1 add -1 roll } { pop } ifelse % /method /Action get LOCK {self send} monitor /Mapped /Congrats /sendclient self send dup SuperWin? ne { % mapped? /unmap /map ifelse /Congrats /sendclient self send } { pop } ifelse } def % Moused down over hand. Use notice to confirm dealing new round; % there must be cards left to deal, and all spaces must be filled. % Doesn't matter which button was used or where it was released. % /MousedHand { % point? upchild => -- pop pop DealTimerEvent dup null ne { recallevent /DealTimerEvent null def /DoDeal self send } { pop createevent dup begin /Action /DoDeal def /Name /CallMethod def /Canvas self def /TimeStamp currenttime DoubleClick 65.536 div add def end dup sendevent /DealTimerEvent exch def } ifelse } def % Respond to either a double-click or single-click-plus-timeout. % /DoDeal { % - => - DealTimerEvent dup null ne { dup recallevent /DealTimerEvent null def } if % event|null NoDealYet? { /deal self send nullstring } { Deck length 0 gt { true 1 1 10 { Ranks exch get /Cards exch /sendclient self send length 0 ne and } for % event|null filled? { % event|null dup null eq { /deal self send } { [(Please confirm dealing more cards.)] (Deal) /deal nullstring Confirm } ifelse % event|null nullstring } { (Can't deal until all spaces are filled.) } ifelse } { (No cards left to deal.) } ifelse } ifelse % event|null str|null LeftFooter pop } def % Moused down on completed-suit region. Report suits that have all 13 % cards showing. Doesn't matter where mouse went up, nor which button. % /MousedTop { % point? upchild => -- pop pop dictbegin Suits {growabledict def} forall dictend % tempdict 1 1 10 { % dict n Ranks exch get /Cards exch /sendclient self send { % dict card /getcard exch send /FaceUp eq { % dict suit rank 3 copy pop get % d s r subdict exch dup put pop % dict } { pop pop } ifelse } forall } for % dict [ exch Suits { % [...dict suit 2 copy get length 13 eq { % [...dict suit exch } { pop } ifelse } forall pop ] % [readysuits] (Sufficient cards visible to form complete set of ) nullstring 3 -1 roll { % str pfx suit dup length string cvs append append (s, ) } forall % str pfx nullstring eq { pop (No suit has all 13 cards showing. ) } { (s. ) append } ifelse LeftFooter } def % Moused down in tableau. Interpretation depends on where mouse went up, % and which button was used. % /MousedTableau { % point? upchild => -- exch /CardToMove self send dup null eq {exch} if 1 index /childindex self send { % up nat /Self /Panel /Hand /Congrats {pop pop (\r)} % force flash /Removed {exch pop /RemoveSuit? self send} /Default {/ColToCol self send} } case % str LeftFooter } def % Method provided for testing; no UI hooked up to it in released version. % /Cheat { % point? upchild => -- DownCard null ne { dup /childindex self send { /Self /Panel /Hand /Removed /Congrats {pop (\r)} /Default { DownChild DownCard /MoveAndRecord self send (That's intended strictly for testing, you know. ) } } case LeftFooter } { pop } ifelse % point? pop } def /MoveAndRecord { % destcol sourcecol card => -- /removecards 2 index send % dest source [cards] exposed? 3 -1 roll ColNum 3 index ColNum % des [cd] ex? src# des# 3 index length 4 -1 roll % des [cd] src# des# #cd ex? /record self send % dest [cards] /appendcards 3 -1 roll send } def /CardToMove { % point? => card /natural DownChild send exch not 1 index null ne and { % nat /Y 1 index send /Y DownCard send gt { pop DownCard } if } if } def /RemoveSuit? { % card => str /Rank 1 index send /King eq /Canvas 2 index send /TopCard exch send /Rank exch send /Ace eq and { /Suit 1 index send exch % suit king /removecards DownChild send % suit [cards] exposed? DownChild ColNum 0 13 4 -1 roll /record self send {/destroy exch send} forall % suit /Ace /FaceUp 2 /replace /Removed /sendclient self send 7 eq {null (CONGRATULATIONS!!) /setfooter Parent send} if nullstring } { pop (Can only remove complete suit in sequence at bottom of column.) } ifelse } def /ColToCol { % destcol card => str 1 index DownChild eq { exch pop DownTime SingleClick 65.536 div add lasteventtime ge { /ObviousMove self send } { pop (Click faster if you want to make the \252obvious\272 move. ) } ifelse } { /TopCard 2 index send dup null ne { /Rank exch send % dest card destrank exch { dup null eq {exit} if Above /Rank 2 index send get % dest rank card rank' 2 index eq {exit} if /NextCard DownChild send } loop % dest rank card exch pop } { pop } ifelse % destcol card dup null ne { DownChild exch /MoveAndRecord self send nullstring } { pop /TopCard exch send (No legal move from column ) DownChild ColNum 2 string cvs append ( onto the ) append (.) /insertname 4 -1 roll send } ifelse } ifelse } def /ObviousMove { % card => str dup /RemoveSuit? self send dup nullstring eq { exch pop } { pop /getcard 1 index send pop Above exch get 999 10 -1 1 { % card suit r+1 best n /TopCard Ranks 2 index get /sendclient self send % card s r+1 best n top dup null eq { pop 200 add min } { /getcard exch send pop 4 index eq { % card s r+1 best n s' 4 index eq {0} {100} ifelse add min } { pop pop } ifelse } ifelse } for % card s r+1 best 3 1 roll pop pop dup 999 eq { pop (I can't figure out where to move the ) (.) /insertname 4 -1 roll send } { 100 mod GetColumn DownChild 3 -1 roll /MoveAndRecord self send nullstring } ifelse } ifelse } def % Determine which of our children, if any, was under the mouse for the % most recent event. % /ChildUnderPoint { % - => child|null null null canvasesunderpoint { % prev cv dup self eq {pop exit} {exch pop} ifelse } forall dup framebuffer eq {pop null} if } def % Register an invalid request. % /Flash { % - => - ErrorAction { /Both {beep true} /Beep {beep false} /Flash {true} /Default {false} } case { gsave 5 setrasteropcode 0 FlashDelay 65.536 div 2 { framebuffer setcanvas clippath fill /canvas self send setcanvas clippath fill dup 0 ne {sleep} {pop} ifelse } repeat grestore } if } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Methods for control panel buttons. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /NewGame { % - => - NoDealYet? { /deal self send } { [(Do you really want to discard) (this game and start a new one?)] (Yes) /NewGameOK nullstring Confirm } ifelse } def /NewGameOK { % - => - /reset self send /Deck 104 array def /deal self send } def /StartOver { % - => - BadDeck? { (Sorry, original deck is not available.) LeftFooter } { NoDealYet? NoMovesYet? or { (You have to start before you can start over!) LeftFooter } { [(Do you really want to discard this) (position and back up to the beginning?)] (Yes) /StartOverOK nullstring Confirm } ifelse } ifelse } def /StartOverOK { % - => - /reset self send /Deck DeckCache def /MoveCache growabledict def /MovesIncomplete? unpromote /deal self send } def /BackUp { % - => - MoveCache length 0 eq { (No moves available to back up over.) LeftFooter } { MoveCache dup length 1 sub get 11 11 14 mul mul lt { /undo self send } { (Cheater alert!) LeftFooter [(CHEAT!! You've seen more cards now!) (Confirm backing up over that move!)] (Yes, dammit) /undo (That's more like it! ) Confirm } ifelse } ifelse } def /Replay { % - => - BadDeck? { (Sorry, original deck is not available.) } { NoDealYet? NoMovesYet? or MoveCache length 0 eq or { (No moves available to replay.) } { MovesIncomplete? { (Move record is incomplete; you could Start Over but you can't Replay.) } { [(This could take a while. Are you sure) (you want to replay all the moves?)] (Yes) /replay (Replay cancelled. ) Confirm nullstring } ifelse } ifelse } ifelse LeftFooter } def /Score { % - => - NoDealYet? { (Can't compute score until you start a game!) } { (Current position scores % out of 1000. ) [ComputeScore] sprintf } ifelse LeftFooter } def /Expand { % - => - (Click over the column whose contents you want to see. ) LeftFooter Cursor /xcurs /xcurs_m /setcursor self send { self createoverlay setcanvas createevent dup begin /Canvas currentcanvas def /Action /DownTransition def /Exclusivity true def end dup expressinterest awaitevent exch revokeinterest begin [XLocation YLocation] end } fork waitprocess % oldcurs [x y] Canvas /Cursor 4 -1 roll put ChildUnderPoint dup /childindex self send { /Self /Panel /Hand /Removed /Congrats {pop (That wasn't over a column!)} /Default {/textcontents exch send} } case LeftFooter } def /Locate { % - => - /value /Name /sendclient /Panel /sendclient self send /Unused null 3 -1 roll { % suit rank char dup 8#140 ge {8#40 xor} if % make it uppercase cvis (KQJT98765432ASHDC...0) exch search { % s r post char pre 3 1 roll pop pop length 17 mod % s r index dup 13 lt { Ranks exch get exch % suit newrank oldrank } { 13 sub Suits exch get exch 3 -1 roll % newsuit rank oldsuit } ifelse } if % suit rank junk % junk item might be string (K...C) if search failed pop } forall dup null eq { pop pop (Rank: KQJT98765432A (or 10); suit: SHDC. Omit suit to find unused card of named rank.) } { % suit rank [ 3 1 roll 1 1 10 { % [ ... suit rank n 3 copy /locatecard Ranks 3 -1 roll get /sendclient self send dup 0 ne { 2 array astore 3 1 roll % [ ... [n #found] suit rank } { pop pop } ifelse } for % [ [n #] [n #] ... suit rank counttomark 1 add 2 roll ] % s r [ [n #] [n #] ... ] dup length { 0 { pop (not visible) } 1 { 0 get aload pop dup { % s r col# #found 1 {pop (once)} 2 {pop (twice)} /Default {1 string cvs ( times) append} } case % s r col# (#times) exch 2 array astore (occurs % in column %) exch sprintf } /Default { dup length (occurs in columns) 3 -1 roll { % s r #left (str) [col# #found] aload pop dup { 1 {pop nullstring} 2 {pop ( (twice))} /Default {[exch] ( (% times)) exch sprintf} } case % s r #left (str) col# (#times) 4 -1 roll 1 sub dup 5 1 roll { 0 {nullstring} 1 {( and)} /Default {(,)} } case % s r #left (str) c# (#t) (sfx) 4 array astore (% %%%) exch sprintf % s r #left (str') } forall exch pop } } case % suit rank (where found) 3 array astore (% % %. ) exch sprintf } ifelse LeftFooter } def /SaveFile { % - => - NoDealYet? { (There's no game to save yet.) LeftFooter } { /value /Name /sendclient /Panel /sendclient self send {(r) file} stopped { pop pop /SaveFileOK self send } { closefile [(That file already exists. Replace it?)] (Yes) /SaveFileOK (Position NOT saved. ) Confirm nullstring LeftFooter } ifelse } ifelse } def /SaveFileOK { % - => - /value /Name /sendclient /Panel /sendclient self send {(w) file} stopped { pop pop (Unable to open output file.) } { true /setbusy Parent send (Writing file... ) LeftFooter dup WritePosition dup WriteMoves dup WriteTableau closefile (Position saved. ) false /setbusy Parent send } ifelse LeftFooter } def /Resume { % - => - NoDealYet? { /ResumeOK self send } { [(Do you really want to discard this) (game to read the filed position?)] (Yes) /ResumeOK nullstring Confirm } ifelse } def /ResumeOK { % - => - /value /Name /sendclient /Panel /sendclient self send {(r) file} stopped { pop pop (Unable to open input file.) } { () { % file string 1 index 500 string readstring % file string string' more? 3 1 roll append exch % file mergedstring more? not {exit} if } loop % file contents exch closefile /restorefromstring self send } ifelse LeftFooter } def /ReadSel { % - => - NoDealYet? { /ReadSelOK self send } { [(Do you really want to discard this) (game to set up the selected position?)] (Yes) /ReadSelOK nullstring Confirm } ifelse } def /ReadSelOK { % - => - (First select the text that encodes the position.) /PrimarySelection getselection dup null ne { /ContentsAscii /query 3 -1 roll send { exch pop /restorefromstring self send } if } { pop } ifelse LeftFooter } def /restorefromstring { % gamestring => footerstring true /setbusy Parent send (Restoring position...) nullstring /setfooter Parent send /MovesIncomplete? unpromote /MARK [ null null null 6 -1 roll { (.\n) search {exch pop} {nullstring exch} ifelse % rest posn RemoveNewlines ReadPosition % rest (.\n) search {3 1 roll pop pop} if % moves RemoveNewlines ReadMoves } stopped { /reset self send /DeckCache 0 1 51 {} for 52 copy 104 array astore def /Deck 104 array def {cleartomark /MARK eq {exit} if} loop (Invalid format in saved position.) } { cleartomark pop NoMovesYet? not MoveCache length 0 eq and /MovesIncomplete? exch ?promote (Position restored. ) } ifelse false /setbusy Parent send } def %%%%%%%%%%%%%%%% % File I/O % %%%%%%%%%%%%%%%% % File format: This is a bit obscure, since it was copied verbatim from % an earlier implementation of the program (so that the sample positions % in the documentation will still work) and thus is optimised for being % written in Mesa. Such is life... % % The first line has the original deck and current position, ending with a % period. In the original deck, the undealt cards come first, then a slash, % then the rest of the cards. (The deck is NOT simply reversed; the first % undealt card will be the next card dealt, not the last, and likewise the % first card after the slash was the first card dealt.) After the deck is a % space, then the ten tableau columns, separated by spaces. Each tableau % column has its cards from bottom (highest on the screen) to top. If any are % facedown, there's a slash after the last facedown card; else the slash is % omitted. % % In the above, each card is encoded as an int from 4-55 = (rank+1)*4+suit, % then xored with the previous card, and also xored with a value based on % the number of cards output so far. The resulting value from 0-63 is then % converted to a char from (0) to (o). % % The second line is optional and contains the moves, first to last, again % ending with a period. Each move is encoded as two chars in base 64 using % (0) to (o) as "digits". % % Next comes a blank line, followed by a human-readable form of the current % tableau. This part is ignored when reading the file. % Given a card encoded as 4*rank + suit, hash it. The hash is a simple % xor with the previous encoded card (stored in /PrevHash) and a char % index (stored in /CharIndex); the idea is not so much to make the file % hard to decipher, as to make it unlikely anyone will accidentally learn % anything from a casual glance. This routine also increments /CharIndex; % the caller is responsible for updating /PrevHash since we can't tell % whether it's the incoming or returned value that should be stored there. % /HashCard { % int => int /CharIndex CharIndex 5 add def PrevHash xor CharIndex dup 4 mod exch 4 mul add xor 8#77 and } def /ReadSequence { % string => [ints] [ exch { (0) 0 get sub HashCard /PrevHash 1 index def dup 4 idiv 13 exch sub exch 4 mod 3 exch sub 13 mul add 52 mod } forall ] } def /WriteSequence { % file [ints] => - [ exch { dup 13 idiv 3 exch sub exch 13 mod 13 exch sub 4 mul add dup HashCard /PrevHash 3 -1 roll def (0) 0 get add } forall ] cvas writestring } def % Remove newline chars, since some tools (notably xterm) include bogus % newlines if a long selection is wrapped onto multiple display lines. % /RemoveNewlines { % string => string { (\n) search not {exit} if exch pop exch append } loop } def /ReadPosition { % string => - % Assume any bad format will result in an error, caught via "stopped". NoDealYet? not {/reset self send} if /PrevHash 0 def /CharIndex 0 def ( ) search pop exch pop % rest deck (/) search pop exch pop % rest dealt hand dup length 3 1 roll % rest #hand dealt hand ReadSequence arrayreverse exch ReadSequence arrayreverse exch append % rest #hand [deck] /DeckCache exch def /Deck DeckCache dup length 3 index sub 4 -1 roll getinterval def 1 1 10 { % rest col# exch ( ) search {exch pop} {nullstring exch} ifelse % col# rest pile (/) search {exch pop} {nullstring} ifelse % col# rest up down ReadSequence /FaceDown IntsToCards exch ReadSequence /FaceUp IntsToCards append % col# rest [cardspecs] dup length 0 ne { /appendcards Ranks 5 -1 roll get /sendclient self send % rest } { pop exch pop % rest } ifelse } for ReadSequence /FaceUp IntsToCards { aload pop 2 /replace /Removed /sendclient self send pop } forall Remaining } def /IntsToCards { % [ints] type => [[suit rank type] ...] [ 3 1 roll exch { % [ ... type int Suits 1 index 13 idiv get % [ ... type int suit Ranks 3 -1 roll 13 mod get % [ ... type suit rank 2 index 3 array astore % [ ... type [card] exch } forall pop ] } def /CardsToInts { % [cards] /type => [othertypeints] [giventypeints] exch [ 3 1 roll { /getcard exch send % [ ... stoptype suit rank type 3 index eq { counttomark 1 add 2 roll % suit rank [ ... stoptype pop ] [ null 5 -2 roll % [...] [ newstoptype suit rank } if Ranks exch arrayindex not {0} if exch Suits exch arrayindex not {0} if 13 mul add exch % [ ... int stoptype } forall null ne {] [} if ] } def /ReadMoves { % string => - /MoveCache growabledict def true exch { % true char | tophalf false char (0) 0 get sub exch { 64 mul false } { add MoveCache dup length 3 -1 roll put true } ifelse } forall not {pop} if } def /WritePosition { % file => - /PrevHash 0 def /CharIndex 0 def dup Deck arrayreverse WriteSequence dup (/) writestring dup DeckCache 0 DeckCache length Deck length sub getinterval arrayreverse WriteSequence 1 1 10 { % file col# 1 index ( ) writestring Ranks exch get /Cards exch /sendclient self send /FaceUp CardsToInts % file [downints] [upints] exch dup length 0 ne { % file [upints] [downints] 2 index exch WriteSequence 1 index (/) writestring } { pop } ifelse % file [upints] 1 index exch WriteSequence % file } for /Cards /Removed /sendclient self send % file [removed] /Blank CardsToInts % file [removed] [blanks] pop dup length 0 ne { 1 index dup ( ) writestring % file [removed] file exch WriteSequence % file } { pop } ifelse (.\n) writestring } def /WriteMoves { % file => - 2 string MoveCache 2 copy % file str dict str dict 0 1 2 index length 1 sub { % file str dict str dict n get 2 copy % file str dic str move str move 64 idiv (0) 0 get add 0 exch put % file str dict str move 64 mod (0) 0 get add 1 exch put % file str dict 3 copy pop writestring 2 copy } for pop pop pop pop (.\n) writestring } def /WriteTableau { % file => - true 1 1 10 {GetColumnCards} for { % file topline? [cards1] [cards2] ... [cards10] (\n) 10 { % file top? [c] .. [c] line 11 -1 roll dup length 0 eq { % ... line [] exch 11 index {((sp)) append} if } { % ... line [cards] dup dup length 1 sub 1 exch getinterval 3 1 roll 0 get % ... [rest] line topcard /getcard exch send % ... line suit rank type /FaceDown eq { pop pop ( --) append } { CompactText dup length 3 eq {( ) exch append} if 0 3 getinterval append } ifelse } ifelse (\t) append } repeat % file top? [c1] .. [c10] line { % strip trailing tabs dup dup length 1 sub get (\t) 0 get ne {exit} if dup length 1 sub 0 exch getinterval } loop dup length 1 eq {exit} if 12 index exch writestring 11 -1 roll pop false 11 1 roll } loop % file top? [] .. [] (\n) 12 1 roll 11 {pop} repeat % file (\n) writestring } def %%%%%%%%%%%%%%%%%%%%%% % Utilities % %%%%%%%%%%%%%%%%%%%%%% % Test whether we have a valid deck to allow starting over. % /BadDeck? { % - => bool 52 {0} repeat 52 array astore dup % [tallies] [tallies] DeckCache {2 copy get 1 add put dup} forall pop % [tallies] false exch {2 ne or} forall } def % Test whether a game has already started. (If so, must confirm % [New Game] and [Resume]. If not, cannot [Save].) % /NoDealYet? { % - => bool Deck length 100 gt } def % Test whether the current position is the start of a game. % If so, cannot [Start Over], [Replay], or [Back Up]. Could % do this by testing /MoveCache, but prefer a test that will be % correct even for a restored position without /MoveCache. % /NoMovesYet? { % - => bool Deck length 50 eq dup { % bool 1 1 10 { dup GetColumnCards exch 3 mod 1 eq {6} {5} ifelse % bool [cards] initleng 1 index length ne {pop pop false exit} if % bool [cards] dup length 2 sub 2 getinterval { % bool card /Type exch send } forall % bool /type1 /type2 /FaceUp eq exch /FaceDown eq and and } for } if } def % Set the message in the left footer, and flash if it's an error message. % An error message is defined as a string that is not empty and does not % end with a space. % /LeftFooter { % string => - dup /footer Parent send pop ne { dup null /setfooter Parent send } if dup length 0 ne { dup length 1 sub get ( ) 0 get ne { /Flash self send } if } { pop } ifelse } def % Given a child that is presumed to be a tableau column, return the % index of that column as an integer from 1 to 10. % /ColNum { % child => int /getindex exch send ColumnNames exch get } def % Given a number from 1 to 10, obtain the corresponding CardColumn. % /GetColumn { % int => child Ranks exch get /getbyname self send pop } def % Given a number from 1 to 10, obtain the cards in that column. % /GetColumnCards { % int => [cards] /Cards Ranks 3 -1 roll get /sendclient self send } def % Check whether the big "congratulations" canvas should be mapped. % /SuperWin? { % - => bool 0 Deck length 0 eq { % n (# completed suits) 1 1 10 { % n col# GetColumnCards dup CompletedSuit? { pop 1 add } { length 0 ne {exit} if } ifelse } for } if % n 8 eq } def % See if an array of cards is King..Ace of a single suit. % /CompletedSuit? { % [cards] => bool dup length 13 ne { pop false } { dup 0 get /getcard exch send % [cds] suit rank type /FaceUp ne exch Ranks 0 get ne or { pop pop false } { % [cds] suit 0 3 -1 roll { % suit j card /getcard exch send pop % suit j suit' rank' Ranks 3 index get ne exch % suit j bool suit' 3 index ne or {exit} if 1 add % suit j+1 } forall % suit #seq exch pop 13 eq } ifelse } ifelse } def % Compute a somewhat arbitrary evaluation function for the position: % 2 point per card sitting atop next higher card in same suit % 10 per card turned face up % 15 extra for each column where all cards have been revealed % 50 per completed suit removed (note this costs 12*2 for cards in seq) % If all columns are either empty or contain completed suits, then those % suits also count 50 (including the 24 for the 12 cards that are atop % higher cards), plus an extra 2 for each suit after the first three. % Thus the only way to get 1000 points is to win with all eight suits % still in the tableau. % /ComputeScore { % - => int 44 10 mul 10 15 mul add % (score if cards NOT turned faceup) /Cards /Removed /sendclient self send { % score card /getcard exch send 3 1 roll pop pop % score type /FaceUp eq {50 add} if } forall % score 0 exch 1 1 10 { % #suits score col# GetColumn /evaluate 1 index send % #suits score col val /Cards 3 -1 roll send % #suits score val [cds] dup CompletedSuit? { pop 3 -1 roll 1 add 3 1 roll } { length 0 ne {3 -1 roll 99 sub 3 1 roll} if } ifelse % #suits score val add } for % #suits score exch 0 max dup 3 gt {28 mul 6 sub} {26 mul} ifelse add cvi } def classend def /SpiderFrame [/defaultclass ClassBaseFrame send] [] classbegin /FillColor 1 1 1 rgbcolor def % in case UserProfile overrides % default color in ClassFrame % Workaround for roundoff bogosity. % /BorderBottom {/BorderBottom super send round cvi} def % Install code copied from post-FCS tNt fork. % OpenLookFrame /FooterFraction known not { /FooterLayout { % - => - /Left /getbyname self send { BorderEdge 2 mul 1 add SelStroke FooterPad add Width FooterFraction mul 2 index sub 1 sub /preferredsize 4 index send exch pop /reshape 6 -1 roll send } if /Right /getbyname self send { Width dup FooterFraction mul SelStroke FooterPad add 3 -1 roll 1 FooterFraction sub mul BorderEdge 2 mul 1 add sub /preferredsize 4 index send exch pop /reshape 6 -1 roll send } if } /installmethod OpenLookFrame send OpenLookFrame /FooterFraction .5 put } if % Now override the fraction for this subclass. % /FooterFraction .8 def /newinit { /newinit super send (Spider) dup /setlabel self send /seticonlabel self send } def classend def /f SpiderCanvas [] framebuffer /new SpiderFrame send def 100 100 /minsize f send /reshape f send /activate f send /map f send newprocessgroup currentfile closefile -- -- Don Woods. [*** Generic Disclaimer ***] -- ...!sun!woods -or- Woods@Sun.com From don Wed Jan 17 10:40:02 1990 Date: Wed, 17 Jan 90 10:40:02 -0500 To: NeWS-makers@brillig.umd.edu Subject: Spider solitaire rules/documentation From: colossal!woods@sun.com (Don Woods) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) Here's documentation for the Spider game whose source I just mailed. It includes the rules of the game and lots of sample positions that you can play out using the program. -------------------- cut here ---------------------------------- [Copyright (c) 1989, Donald R. Woods and Sun Microsystems, Inc.] I. I N T R O D U C T I O N SPIDER is a particularly challenging double-deck solitaire. Unlike most solitaires, it provides extraordinary opportunities for the skillful player to overcome bad luck in the deal by means of careful analysis and complex manipulations. The SPIDER program does not actually play the game for you, but rather takes the place of the cards (by displaying the tableau on the screen) and keeping a record of the game so that you can follow out long lines of play without losing track of where you started from. (Besides, it's a neat display hack.) Section II of this documentation describes the rules of the game; section III describes the use of the program; section IV gives some "Spider problems" to provide a feel for the complexity that can arise (the problems are based on positions that arose in actual play). II. R U L E S F O R S P I D E R THE INITIAL TABLEAU. Shuffle together two decks of cards (104 cards in all) and deal ten cards face down in a row. Deal three more rows face down on the first. Next deal one card face down on each of four piles (traditionally the leftmost four, but it doesn't matter; for aesthetic reasons some people prefer the first, fourth, seventh, and tenth piles), for a total of 44 face-down cards. Finally, deal one card face up on each pile. These 54 cards constitute the initial tableau. NOTE: In the description below, the card at the "bottom" of a pile is taken to be the last one dealt or played onto that pile, as opposed to the card that is underneath all the others in the pile. Thus the "bottom" card is the one displayed bottommost on the screen by the Spider program. BUILDING. All building is done in the tableau, there being no separate foundations. On the bottom card of a pile may be placed any card of next-lower rank, regardless of suit. (Cards rank King (highest), Queen, Jack, 10, 9, . . . , 3, 2, Ace.) The bottom card of a pile is always available to be moved, as is any sequence of cards at the bottom of a pile that are consecutive and ascending in rank and of the same suit. For example, suppose the 6, 5, and 4 of hearts are together at the bottom of a pile, with the 4 bottommost. They may be moved as a unit, or the 4 can be moved by itself, or the 5 and 4 can be moved without moving the 6. If the 6, 5, and 4 were moved onto a 7 of hearts at the bottom of some other pile, the four cards could then be moved as a unit onto any 8; if the 7 were not a heart, however, then once the hearts were placed upon it it would not be available to be moved until the hearts had been moved from it (to another 7 or into a space; see below). When all face-up cards have been removed from a pile, the bottom face-down card is turned up and becomes available for play. SPACES. When all cards have been moved away from some pile, the resulting empty pile is called a "space" or "hole". Any card or sequence of cards available for moving may be moved into a space. A King, or sequence headed by a King, can be moved ONLY into a space, and once moved there can never be moved out (except into another space, which doesn't accomplish anything) unless it is being removed entirely as described below. THE HAND. The 50 cards not dealt initially form the "hand". Whenever you wish (typically, whenever you get stuck), you may deal a new row of ten cards from the hand face-up upon the piles. NOTE: You are not allowed to do this if you have any spaces. You must first fill them in. Notice that these additional deals tend to introduce discontinuities in the piles; that is, you can get cards covering others that are not next-higher in rank. If you get stuck after having dealt the last of the five additional deals, you have lost. OBJECT OF PLAY. When you have assembled a complete suit of thirteen cards, in sequence from King down to Ace, at the bottom of a pile, you may remove the thirteen cards from the tableau entirely. Cards so removed are never brought back into play; thus it is not always desirable to remove a suit when you have the opportunity (though it usually is), since it may pay to keep it around to aid in manipulating the other cards of that suit (recall that there are 26 cards in each suit). The game is won if you manage to remove all eight suits. If you find that a game is going so well that you're sure you're going to win, you can spice things up by trying to finish with as many completed suits as possible still in the tableau. Hardest of all is to finish the game with each of the eight suits brought together in sequence from King down to Ace, with all of the cards still in the tableau. Note that, once you start striving toward such a goal, you may make such a mess of the position that you won't be able to win at all! SCORING. Spider is a difficult game to master, and some players like to be able to evaluate their progress by scoring unsuccessful games. No rules for scoring are in the literature, but the program implements the following rather arbitrary formula: 10 points for each initially face down card that gets turned over; 15 additional points for each column where all the face down cards have been turned over (even if you don't manage to get a space); 2 points for each card that is sitting atop the next higher card of the same suit; 50 points for each completed suit removed from the tableau (in which case you do not also score for the 12 cards sitting atop next higher cards). This yields a maximum score of 990. If you win the game with 4 or more completed suits still in the tableau, add 2 points for each suit after the first three. Thus winning with all eight suits still in the tableau yields a score of 1000. III. T H E S P I D E R P R O G R A M The stack of cards in the upper left of the Spider window represents the undealt cards (initially the full deck; later the "Hand"). The eight faint spots to the right mark where the eight suits will go as you remove them from the tableau. The rest of the window is initially empty until you start a game. One class variable you might want to override via UserProfile is /ErrorAction in class SpiderCanvas, which can be one of /Flash, /Beep, /Both, or null. To start a game, press the [New Game] button or click either the "point" or "adjust" mouse button over the undealt cards. Playing the game is handled entirely within the main window; the control panel provides a few ancillary functions, described later. First, the main window: If you press the "point" mouse button anywhere within or below a column of cards, it says you want to move as many cards as possible from that column. If you then move the mouse to another column and let up on the button, the program moves as many cards as it can from the first column to the second. (If there is no such legal move, the program says so.) Note that, unless the destination column is empty (i.e., a "space"), there is at most one choice for the number of cards to move. If you instead use the "adjust" mouse button to select within a column, it says you want to move the card you're pointing at plus any cards covering it. If these cards cannot be moved as a unit (i.e., they are not a sequence within a suit), the program instead moves the maximum set of cards you can move, just as for the "point" button. Again, if you move the mouse to another column and release the button, the program moves as many of the selected cards as possible to the destination. The only time you need to use this method (instead of using "point") is if you're moving cards into a space AND you wish to move fewer than the maximum permitted. If you click either button over a single column, the program tries to move the specified cards to "the obvious place" by trying the following choices, in order: (1) remove them if they form a completed suit, else (2) move them onto a card of the same suit, else (3) move them onto a card of a different suit, else (4) move them into a space. If it can't do any of these, it complains. (The timeout that distinguishes a "click" from pressing a button and then changing your mind about the move, is given in seconds in the SpiderCanvas class variable /SingleClick.) You can also remove a completed suit by selecting all 13 cards (using either button), moving the mouse into the region of faded spots above the tableau, and releasing the button. To deal a new round, click either "point" or "adjust" on the facedown stack in the upper left. The window footer shows you how many more deals remain. (The facedown stack also gets shorter when there are fewer than two deals remaining.) Remember that all spaces must be filled before you can deal a new round. The program requests confirmation to protect you against deals caused by stray clicks; you can bypass the confirmation notice by double- clicking on the stack. (The timeout between the clicks is given in seconds in the SpiderCanvas class variable /DoubleClick.) If you click with either mouse button in the faded region where the removed suits go, the program will tell you which suits (if any) have enough cards face-up to form a complete sequence of thirteen. The window also has a control panel for performing some less frequent operations: [New Game] throws away the current game and deals a new one, after first confirming that this is what you really want to do. [Back Up] is a stack; the default is [One Move], which undoes your last move. Performing this multiple times will undo multiple moves. If you attempt to back up over turning up a card or dealing a new round (i.e., over a move that gained you information), you will be asked to confirm doing so. [Back Up: Start Over] restores the initial tableau for the current game, after confirming that you want to discard whatever position you've reached. [Back Up: Replay] restores the initial tableau for the current game, then replays all of your moves up to the current position, taking about 1 1/2 seconds per move. Since this can take rather a while (a completed game typically involves about 200-300 moves) it first asks for confirmation. [Score] reports the score for the current position, using the formula given in the previous section. [Expand] asks you to select a column in the tableau. The contents of that column are displayed in the footer in text form. This is useful if the cards have gotten too scrunched together for you to read them. In the text form, sequences of consecutive cards in a single suit are clearly identified. [Locate] tries to find a specified card or cards among the face-up cards in the tableau. First specify the name of the card to look for by putting the rank and suit in the Name item. (The ranks are A, 2, 3, ..., 10, J, Q, or K; you can also use T for 10. Suits are C, D, H, and S. Lower-case is permitted.) If you omit the suit, [Locate] will look for all cards of the specific rank that are not already covered by a card of the next lower rank. (Such cards are called "unused", "free", or "available".) For example, if you want to move a 9 out of some pile, you need either a space or a free 10 onto which to move it, so you could use [Locate] to find all free 10s. [File] is a stack; the default is [Save in File], which writes a file containing the current state of the game, including the original deck and all the moves made so far. The name of the file is taken from the Name item. The file also includes a human-readable text representation of the current tableau, similar to those that appear in the examples below. [File: Resume from File] reads a file created by the [File: Save in File] command. The name of the file is taken from the Name item. It can also read various partial files; in particular, if all but the first line of the file has been deleted, it will restore the most recent position and, if possible, the original deck (in case you want to Start Over), but it will not be able to Back Up over the moves. [File: Resume from Selection] restores a position represented by the current text selection. This is useful for loading positions from section IV, below. IV. E X A M P L E S A N D C O N U N D R U M S In all the examples below, the tableau will be given here in the text as best as can be done within the limits of the character set. For those who want to see the positions more graphically via the program, each example also starts with a line of apparent garbage that, if selected, can be read using the [File: Resume from Selection] command to display the position. (The line is quite long and may wrap around onto more than one line when you display it; you have to select it all to restore the position.) Some of these examples are extremely complex. Novice players may wish to step through just the first example, to get an idea of how to play, and save the other examples for later. The final example is a deck that is especially easy to win with (unless you're trying to win with all eight suits still in the tableau), so you might try that one to boost your confidence if you're having a lot of trouble getting anywhere. =========================================================================== J6m\ZM^3>gU82j]`LGMFl8o0WeDimHa;d^1QcHGKQdQAZ6l;oK/QmbbBhNhiMiWe=FOHD >Kg74/^ YoT[/6 HCcF/P \MNXm/Q EK25/k 9^0M/c KF0@W/N \JHY/: 9GLR/L \W8hH/2. Here, to start you off, is an example of the beginning of a game. We'll step through it and look at the rationale behind the recommended moves. Here's the initial tableau: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 10d As -- 3h 9s -- Jh Qh -- 6d 4s 3c 7c The two primary rules of thumb to bear in mind throughout the game, and particularly at the start, are (1) try to get a space, and (2) keep your options open. The first rule should be fairly clear; the second leads to a few common strategic decisions. First, given the choice, make a "natural" move instead of an "unnatural" one, where a natural move is one that brings together two cards of the same suit. This keeps our options open by allowing us to move the newly combined cards as a unit should we turn up an appropriate card. Second, given the choice, move a card (or pile) that has more than one place it can go. This keeps our options open by allowing us to move it to the other place if for some reason we want to dig into the pile sitting in the first location. Third, work from the top down. Thus we move a 9 onto a 10 before moving an 8 onto the 9 (unless the latter move is natural while the former is not), since once we move an unnatural 8 onto the 9 we won't be able to move the 9. Now, with these ideas in mind, let's look at the play of the above tableau. Our highest-ranking move is Jack onto Queen, and it's also our only natural move, so it wins for sure. We move the Jh from column 8 to column 9, and in this particular game we chance to turn up a 6s in column 8. Now we have no natural moves. We could try for the space by moving the 6s to column 10, but that move isn't going to go away, so instead we go from the top down by moving the 10d from 2 to 9. This time we turn up a 4c. No hesitation about this one! We move the 3c from 7 to 2. (Note that we still have the 4s onto which we can, eventually, move the 3h, so we're not giving up our option of digging into pile 5. But even if we didn't have the other 4, making the natural move would be the better play.) In column 7 the card turned up is a 2c, which we promptly move to column 2, turning up a 10h. The tableau is now: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4c -- -- -- -- 10h 6s -- -- -- 3c As -- 3h 9s Qh -- 6d 2c 4s Jh 7c 10d Having once again run out of natural moves, we revert to working from the top down, and move the 9s from 6 to 9. This also follows the rule of moving a pile that has more than one place to go; if we find ourselves interested in digging through column 9 we can move the 9s to column 7 instead. But for now, since column 7 looks like a more likely place to dig, we'll bury column 9 a bit more. In column 6 we turn up a Kc. Since we have no place to move the 10d from column 9, we are unable to get pile 9 moved onto the newly revealed King. Them's the breaks. Continuing from the top down, we decide it's time to move a 6 onto the 7c. Which 6 should we move? Neither is natural, but the one in column 8 looks like a better one to move since we're only 3 cards away from getting a space in that column. So we move the 6s from 8 to 10 and turn up a 6c. We're getting low on things to do now; we can move the 3h or the As. Going by the top-down rule, we move the 3h from 5 to 4, turning up a 2h, which we move onto the 3h (now in column 4). This time we turn up a 9d: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 9d -- -- 6c -- -- -- 4c -- -- Kc 10h -- -- -- 3c As -- Qh -- 6d 2c 4s Jh 7c 3h 10d 6s 2h 9s We could now move the 9d from 5 to 7, but instead we choose to move the As from column 3, since there are two places to put it. Column 4 is already unnatural, so we'll move it there. The card turned up is the other As. We could move this Ace onto the other deuce, but this would lose us our option of moving the first Ace there should we want to dig into column 4, so we'll let the top-down rule take precedence and move the 9d. But let's not be hasty! Instead of moving the 9d from 5 to 7, we'll move the 9s from 9 to 7 and then move the 9d from 5 to 9; this puts the 9d with a 10d, which it can't hurt to do. This time we turn up a Qh. Since we're so close to a space now, we keep going by moving the Qh from 5 to 6, turning up a 10d: -- -- -- -- 10d -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 6c -- -- -- 4c As -- Kc 10h -- -- -- 3c -- Qh 9s Qh -- 6d 2c 4s Jh 7c 3h 10d 6s 2h 9d As Only one move left to try: we move the As from 3 to 2, turning up a 7h. Once again, we shuffle things around a bit so keep as many piles natural as possible; we move the 6s from 10 to 3 and the 6c from 8 to 10, turning up a 5d. We move the 5d from 8 to 1 (natural) and turn up a 3s: -- -- -- -- 10d -- -- 3s -- -- -- -- -- -- -- -- -- -- -- -- 7h -- -- -- -- -- -- 4c 6s -- Kc 10h -- -- -- 3c -- Qh 9s Qh -- 6d 2c 4s Jh 7c 5d As 3h 10d 6c 2h 9d As We have no more moves (aside from useless maneuvers such as moving the 9d from 9 to 5), so it's now time to deal a new round. We never did get a space, but we got two piles down to a single card each, so we are quite likely to get a space soon after the new deal. This game is going somewhat better than average and will very likely be won with proper play. If you actually do get a space in the first round, you're doing particularly well. =========================================================================== 1;]mcD96:2o6j1J7Fj>N/\j?Pe:O`5J_0EZo@Uj?Pe:O`5J_0EZo@Uj?Pe:O`5J_0EZo@Uj?Pe:O`5J_0EZo@Uj?Pe:O`5J_0EZo@Uj?P O DLV/7V[ N=^cfil 8_/R<3d9NC4I^SDY?F\bfKl16[ k;]>Hhn ak\k/Z\2O[<@FkLPWZ[;>CdINS 9A C L75/1;\aFJo. Now, for your first "Spider problem", here is a relatively simple position. In the tableau shown below, what should you do? First off, what are your options? On what should you base your choice? (After the tableau is the "solution", so don't read further until you're ready!) 10h (sp) -- Ad -- Qc -- 3s Qh -- -- 7d -- Jh -- 2s -- -- 6d Kh 10d -- -- 8s 5d Qc 6c -- 7d 7s Qs Jc 4c Qd 6d 6s Js 10c 3d Jd 5d 10d 9c 2d 10h 4d 8c Js 3d 7c 10s 2c 6c 9s As 5c 8h 4c 7h 3c 6h 2c 5h Ac 4s Qd 3h 10c 10s 9c 8c 8s 7h 7s 6h 6s 5h 5s 4h 4s 3h 3s 2h 2s Ah Solution: First, the options. There's no way to get through column 5 or 7 to turn up a new card. (This should be pretty obvious; we'll save detailed analyses of this sort of thing for cases where it's not as clear.) Nor does it do us any good to dig into column 4 or 6. We don't have any complete suits showing, so there's no way we can try to put one together. That leaves three fairly simple options: (1) we could move the 8-6s from column 3 into the space, turning up a new card, (2) we could dig through column 10 (moving the Ace onto a deuce, the 2c into the space, 5-3d onto the 6s in column 3, 2c out of the space and back onto the 5-3d, and finally the 7-6d into the space) and turn up a new card there, or (3) we could fill in the space and deal a new round. It's usually a good idea to turn up more cards when possible rather than bury everything under a new deal, so we'll discount the third option. That leaves us with the choice of which column to dig through, 3 or 10. The two are equally close to becoming new spaces (three face-down cards each), so that's not a consideration here. Let's consider what the face-down card might be that will be revealed. If it's a Jack, 4, or King, we can get back the space (which we'll have lost in the process of getting to the new card). If it's a 9 or 8, we MIGHT get the space back right away; it depends on whether we moved the 8 (from column 3) or the 7 (from column 10) into the space. Looking at the tableau, we see there are five 8's visible, but only three 9's. Thus it's more likely we'll turn up a 9, so we should go for column 3. (Sorry for all this gory detail, but this is after all intended as an introductory example.) So it looks like the best thing to do is move the 8-6s from column 3 into the space. But wait! Suppose the card turned up isn't a Jack, 4, King, or 9, and furthermore isn't an Ace or 5 (which we would be able to move elsewhere immediately)? Is there anything we can do ahead of time to hedge our bets? Yes! We can move the spade Ace from column 10 to column 5, then use the space to swap the deuces in columns 6 and 10 (move one deuce into the space, move the other deuce to the other column, and move the first deuce out of the space). Now column 10 contains just the 7 through deuce of diamonds, and if we chance to turn up an 8 in column 3 we can move the 7-2d onto it. Note that we have to do this BEFORE we move the 8-6s into the space, since we need the space to swap the deuces. In fact, in the game where this particular tableau arose, the card turned up in column 3 was the diamond 8. The preparations made in column 10 eventually produced not one but TWO spaces! (Play it out using the program and see for yourself.) =========================================================================== ?jT\Ne61gU/3`5J_0EZo@Uj?Pe:O`5J_0EZo@Uj?Pe:O`5J_0EZo@Uj?Pe:O`5J_0EZo@Uj?Pe:O`5J_0EZo@Uj?Pe:O`5J_0EZo@Uj?P LF^Q/lLQ7[]`8Qe^_ B\^CO9M@4I] Q=Lh/C;aS2o D0/b6;[MEXM. Turn up another face-down card WITHOUT dealing more cards or "using up" the space. (You may, of course, use the space, so long as you are sure you can get it back no matter what the card turned up turns out to be.) Note that there are enough clubs and hearts showing to form complete sets of those suits. Here's the tableau (again, the solution follows the tableau): -- -- (sp) -- Qh -- -- -- -- -- -- -- Ks Jh -- Jc -- -- -- -- -- 2s 7h -- 8h -- -- Kh -- -- As As 7h Kc -- Qc Jc Kd 9h 9h Qc Kc Jh 10h 9d 8d 8s Jd 7s Js 9c 8d 7c 5s 6s 3d 8s 7d 6c 4h Qh 2c 7d 3h 5c 3c Js Ad 6h 2h 4h 2c 8c 8h 5d Ah 3s Ac 3d 2d 2s 10s 2d 5c 9s Ah 6d 8c 9s 5h 7s 10c 6s 5s 4c Solution: First, we ascertain that we can't get a second space. The only place where we might be able to do so is column 5, and to move the Q-Jh we need to find a King that doesn't already have a Queen on it. (We'll call this a "free King", for short.) There are three free Kings, but the one in column 9 is useless since we need another free King to get to it, and those in columns 2 and 4 are inaccessible since there are no free 3's. Hence, whatever we do, we have to do it using only the one space. Next, can we remove a complete set of clubs or hearts? Well, hearts are out, because the only Kh showing is in column 10, and the only 10h is in column 1, and getting to each of them requires that we move a 3 onto a free 4. Since there's only one free 4 (in column 8), we lose. How about clubs? They don't work out, either, but the proof is trickier. The only 9c is in column 1 and getting to it will require our sole free 4. Thus we can't use the Qc in column 10, and must instead use the Qc from column 8. To reach it we need a free 6; we have exactly one free 6, namely in column 9. We CAN get to this 6, without losing the space, by a fairly convoluted sequence of moves. You may want to figure out how it can be done before reading on. . . . Ready? Okay, proceed as follows: 7h from 5 to 10, 10c from 1 to 5, 8c from 9 to 1, Js from 9 to 3 (into the space), 10c from 5 to 3, Jh from 5 to 9, 10c from 3 to 9, Js from 3 to 5, 10c from 9 to 5, Q-Jh from 9 to 3, 7-6s from 9 to 4, and finally Q-Jh from 3 to 9, getting the space back. Having determined that we can, if desired, obtain a free 6, let's get back to the question of the clubs. The only 7c is in column 6, and getting to it requires a free 6. But we need the free 6 to get to the Qc as well. So we again lose. We are thus reduced to uncovering a card without removing any suits and without getting any more spaces. Which column is it to be? It obviously can't be a column containing a King, since (given that we can't remove any completed suits) the only place a King can go is into the space. And it can't be column 1 or 7, since that would require a free Queen, and there isn't any. So it must be column 6. We can get through that column by first digging through to the free 6 as described earlier, and then playing: 5h from 6 to 4, 6d from 6 to 10, 5c from 6 to 10, 3-2s from 6 to 3, 4h from 6 to 4, 3-2s from 3 to 4, 7-5c from 6 to 1. The tableau now looks like this: -- -- (sp) -- Qh -- -- -- -- -- -- -- Ks Js -- Jc -- -- -- -- -- 2s 10c -- 8h -- -- Kh -- -- As As 7h Kc -- Qc Jc Kd 9h 9h Qc Kc Jh 10h 9d 8d 8s Jd Qh Js 9c 8d 7s 5s Jh 3d 8s 7d 6s 4h 2c 7d 3h 5h 3c Ad 6h 2h 4h 2c 8h 5d Ah 3s Ac 7h 3d 2d 2s 10s 6d 2d 9s 5c Ah 8c 9s 7s 8c 6s 7c 5s 6c 4c 5c Once again, it's time to make contingency plans. If we just move the 9h-8s onto the 10c and the As onto the 2s, we could be in trouble if we turn up a King. The lone space won't be sufficient for us to be able to move the stuff out of column 5 onto the King. So we undo some of what we did in the course of getting the free 6: Jh from 9 to 3, 10c from 5 to 3, Js from 5 to 9, 10c from 3 to 9, Jh from 3 to 5. While we're at it, it can't hurt to move the 4c from 8 to 1, and in a moment we'll match the 8s with a 9s, too. We now proceed: 8s from 6 to 3, 9h from 6 to 9, 8-5c from 1 to 9, 8s from 3 to 1, and finally As from 6 to 4. (Once again, preparation pays off; in the game where this took place, the card turned up was indeed a King.) =========================================================================== ?jT\Ne61gU/3`5J_0EZo@Uj?Pe:O`5J_0EZo@Uj?Pe:O`5J_0EZo@Uj?Pe:O`5J_0EZo@Uj?Pe:O`5J_0EZo@Uj?Pe:O`5J_0EZo@Uj?P LF^Q/lLR4Y^cDjm3 XCkS/QENCCAV`O 3 ]:na6K<1F[LAV =Dil1W9>CgJN b P 4:[/eQW8\afKl16 @J/8\QA7o279 C. Again, complete sets of clubs and hearts are available. Without dealing any more cards or turning up any face-down cards, remove a set of clubs AND a set of hearts (not necessarily in that order). Can you remove them in the other order? -- -- 8c Ks Kh 5c Kc -- (sp) -- -- -- Qh Qh -- -- -- -- Jc Jh -- Kh -- -- 10c 10c Kc Qc Jc Kd 9c 9h Qc Jh 10h 9d 8c 8d Jd Js 9s 8d 7c 7d 10h 3d 8s 7d 6c 6d 9h 2c 7s 3h 5c 5d 8h Ad 6s 2h 4c 4h 7h 8h 5s Ah 3c 3d 6h 7h 4s 2d 2c 2d 5h 3c Ah Ac 4h 2s 3h As Solution: The clubs look like the better bet, since the Jack through Ace are already assembled and there's a King-Queen in column 8. Let's see what can be done. Since there are no free 9's or 6's, we have to remove the first completed suit without the benefit of any additional spaces. Since we are also short on free 4's, this means we can't use the Qc in column 10. That seems okay; the one in column 8 looks easier to get to anyhow. All we have to do is move the Jd somewhere (along with the 10-3h). There are no free Queens, so the Jack will have to move into the space (or some other Jack must move into the space to free up a Queen). But we can't move the Jd anywhere while the hearts are there, and the only free Jack is in column 10 where we can't get at it. We could move the 10-3h into the space, but then what do we do with the Jack? Looks like the clubs aren't going to work after all. Let's try the hearts. It looks like we'll have the same problem, since we have to move the 10c from column 5 somewhere else to clear off the K-Jh. The only place we can move the 10c is the space, and to do that we have to do something about the 9h attached to the 10c. Since we don't have any free 10's, what can we do? The idea is to use the space to swap things around such that the sequences of a single suit are where we need them most. We do it as follows: First we get the 4h out of the way by moving 3-2d from 5 to 9, 4h from 5 to 6, and 3-2d from 9 to 6. Then we move 8-5d from 5 to 9, 8-3h from 8 to 5, 8-5d from 9 to 8, 9-3h from 5 to 9, 9-Ac from 4 to 5, 9-3h from 9 to 4, 8-5d from 8 to 9, 8-3h from 4 to 8, 8-5d from 9 to 4 (we certainly have made a mess of all those nice clubs in column 4, haven't we?), 10-Ac from 5 to 9, 10-3h from 8 to 5, 10-Ac from 9 to 8. Now we can move the Ah from 2 to 6, 2d from 2 to 9, and 2-Ah from 2 to 5 to complete the hearts. The 2d comes out of the space and back to column 2, and removing the hearts gives us a second space. With two spaces we have no trouble straightening the clubs back out and completing a set. Note that, rather than removing the completed set of clubs from column 8, we should pile a Q-Ac into column 7 and remove the suit from there. We can always move the Kc from column 8 into the newly created space in column 7 if we wish, but by getting the space we keep our options open. Note also that, had there been a 10d around, we might have been able to pull the same trick with the Jd in column 8 as we did with the 10c in column 5; since there wasn't, though, we had to go after the hearts first. =========================================================================== C576XV@Ra`MgY>9XFSnF/^j?Pe:O`5J_0EZo@Uj?Pe:O`5J_0EZo@Uj?Pe:O`5J_0EZo@Uj?Pe:O`5J_0EZo@Uj?Pe:O`5J_0EZo@Uj?P 3>0f9NC7I^ H=Zn HUUgKl1YC4I^SDYR PFeM2 B1D[ C:^>LPV;] MAK\1F[lAVk\QBCTSZ`23d9N@7I^SGYN 1Ti>Sd9Mc4IZ NM ZnhZM =1f9NFCfhOcV;\] UH8. 3^SD>\QBCTSZ`23d9N@7I^SGYN 1Ti>Sd9Mc4IZ NM ZnhZM =1f9NFCfhOcV;\] UH8. Can a set of spades be removed WITHOUT first getting a space or dealing any more cards? If so, how? If not, prove it! Would it make any difference if the Js in column 7 were swapped with the Jd in column 9? (The second "garbage" line above is for this modified tableau.) Finally, given that it can be done, remove a set of hearts (as usual, without dealing any more cards). What is the minimum number of other suits that must be removed in order to do so? Does the order of the two face-down cards matter? Kd Jc 9h 9c Qh 9d Qc Ks -- Qs Qd 10c 10s 8c Jc Qh Kc Js -- Kc Jd 9c 5s 10h Jh Qs 2d Jd 3c 10d 8c 7d 9h Ad Js Ac 7d 9d 7c Kd 8h 10d 7h 6h 8d 6c 6s 9s 5c 7h 5c 5s 8s 4h 6d 4s 4s 7s 3h 5d 3s 3s 6s 2d 4d 2s 2c Qd Ah 3d As 6h 4c 2h As 5d 3c Ah 4d 2c 8h 9s Ac 7c Solution: This is a complicated one, so take a deep breath! (If you didn't find it complicated, then perhaps you weren't thorough in your analysis. Unless you (a) decided the spades could not be removed without getting a space, (b) realised that swapping the Jacks affects this, and (c) considered the 9d in column 1 at some point in your proof, your analysis is incomplete.) First let's consider the problem of putting together a set of spades. We begin by finding all the pieces. The only Ks is in column 8; the only Qs we can possibly get to without a space is in column 7. (Actually, we shouldn't be too hasty; if we could remove a set of clubs without getting a space, we could reach the Qs in column 10. But in moving the Qs we'd create a space, whether we needed it or not; and besides, the only Qc is in column 7 with the other Kc in the way.) In digging to the Ks and Qs we'll reach both Jacks, so they shouldn't be a problem. The 10s is in column 3, and the remaining spades are at various depths in columns 2, 5, and 7. Can we pull all these cards together? To get to the Ks we need a free 8, a free 3, and a free Queen (even though we may end up using the Js from column 8, we need some place to put it in order to get to the King). The 8 in column 4 is inaccessible unless we can remove a set of diamonds, which in turn is impossible without a space since the 7d in column 4 is inaccessible and likewise for the 7d in column 9 due to the absence of free 5's. But we have a free 8 in column 1 and another in column 5 (if we can reach it), so there's no problem with that. We also have exactly one free 3, and one free Queen. So far so good. Can we reach the Qs in column 7? That requires a free King, which is no problem. It also requires someplace to move the 9-6s and the 10d. This should pose no problem either. Note that, though we need a free 10 and a free Jack for this, we don't "use up" those free cards by moving the 9-6s and 10d, since we uncover another 10 and Jack to become new free cards. However, notice that we're eventually going to have to reach the 5s in column 5, and this will use up the free 10. So we have to dig through column 7 before that. In fact, we have to move the 10d out of column 7 before moving the 9s out of column 5, because once we move the latter we'll have 9's on all the 10's, and the 10d won't be movable. Or will it? If we could put a 9d onto the 10d (freeing up a different 10), we could move the 9s onto the newly freed 10 and still be able to move the 10d. Let's assume for the moment that this is impossible (we'll prove it later, but don't want to digress too far here). To repeat, then, we need to move the 10d out of column 7 before moving the 9s out of column 5. Where does the 10d go? The free Jack in column 9 is inaccessible without a free 5, and the other free Jacks (in columns 6 and 8) each require a free deuce (even though the Jack in column 8 doesn't require us to use up the deuce permanently). The only free deuce is in column 5, and we can't get to it without moving the 9s. So we're stuck! Now let's follow out that digression and make sure we can't get a 9d onto the 10d. We certainly can't use the 9d in column 6, since that would create a space, which is verboten. In order to reach the 9d in column 1, we'd have to move the 8h. If we put it onto the 9s in column 5, we would then be unable to move that 9s later on (we have only one free 9 available; as we'll see later, we can't get to the one in column 3 without moving the 9s from column 5). If we moved the 8-6s from column 7 onto the 9s in column 5, and then moved the 8h onto the newly freed 9s, we wouldn't be able to move THAT 9s later, so we either wouldn't be able to reach the Qs (if we had left the 9s in column 7 when we put the 8h on it) or else we'd be unable to reach the 10s (if we had moved the 9s there first). So, although we might be able to get the 9d from column 1 onto the 10d in column 7, by the time we did so we'd have made a hopeless mess out of the spades. The conclusion from all this is that it's impossible to remove a set of spades without first getting a space. Now, what if the Jacks were swapped as described? In that case, we wouldn't need a free Jack on which to park the 10d; we could move the J-10d as a unit. So the plan is to move the Qd out of column 7, followed by the 9-6s and J-10d. Then we can use up the free 10 by moving the 9s out of column 5 and finish bringing together the spades. The complete sequence is: Qd from 7 to 4, 9-6s from 7 to 3, J-10d from 7 to 4, 9s from 5 to 4, 5-4d from 5 to 3, 7h from 8 to 1, 6h from 5 to 1, 5-4d from 3 to 1, 2c from 5 to 10, 5-3s from 5 to 3, Ac from 8 to 10, and now we have to be careful not to move the 2d from column 8 onto the spades in column 3, so instead we move 3s from 3 to 1, 2d from 8 to 1, Js from 8 to 7, Q-Js from 7 to 8, 10-4s from 3 to 8, As from 2 to 1, and 3-As from 2 to 8. Voila! That was for warm-up; what about removing the set of hearts? The first step is easy: we look around to see where all the hearts are and find that the King and 5 are missing. Hence these must be the two face-down cards. It remains to be seen whether their order is significant. In the course of discussing the spades, we observed that we cannot remove a set of diamonds or clubs without first getting a space, and we also proved the same thing for the spades. Since we can't get past the 4c in column 9 without a space, it looks like our first order of business is getting one. Columns 1, 4, 7, 8, 9, and 10 are out, for obvious reasons. Column 3 looks like the best bet, but in order to move the 10s we need a free Jack, and that in turn requires a free deuce, and THAT requires that we move the 9s from column 5 onto the 10s. Thus, by the time we manage to move the 10s, we'll no longer have a free 10 on which to put the 9h to get the space. Column 6 is similarly hopeless; in order to move the Ad we need to use up the free 10. Column 2 is out of the question since there's no place to put the 4-As. That leaves column 5. To get through column 5 we need to use up a 10, two 7's, and a King, and we also need temporary use of a 6, 3, Jack, and Queen. Getting the Jack will be no trouble once we've gotten to the 2c, and getting the 6 just needs another free King, which we can get from either column 8 or column 10. Let's use the one in column 10; the only thing we have to watch out for is that if we wait too long to uncover that King (in particular, if we wait until we need it to put the Qh on to clear the space), we may find the 3c is immovable due to our having moved stuff onto it in the meanwhile. So we have to move the 3c onto the 4d at some early opportunity. Here we go: 9s from 5 to 3, Qd from 7 to 4, 5-4d from 5 to 7, 6h from 5 to 8, 2c from 5 to 10, 6-3s from 5 to 9, 3-2c from 10 to 7, Ad from 6 to 7, 10-8h from 5 to 6, Jc from 5 to 4, and finally Qh from 5 to 10. The tableau now looks like this: Kd Jc 9h 9c (sp) 9d Qc Ks -- Qs Qd 10c 10s 8c Qh Kc Js -- Kc Jd 9c 9s 5s Jh Qs 2d Jd Qh 10d 8c 7d 10h Js Ac 7d 9d 7c Kd 9h 10d 7h 6h 8d 6c Qd 8h 9s 6h 5c 7h 5c Jc 8s 4h 6d 4s 7s 3h 5d 3s 6s 2d 4d 2s 5d Ah 3d As 4d 4c 2h As 3c 3c Ah 2c 2c 8h Ad Ac 7c 6s 5s 4s 3s Where do we go from here? Well, we're trying to minimise the number of suits (other than hearts) removed, so let's see if we can get the hearts out right away. We would need to dig through column 9; to do that we would have to move the 4-Ac into the space (or onto a free 5; we'll come back to this), after which we would have no place to move the 4-3h. If we could get a free 5 without using up the space, we might fare better, but the only free 5 is in column 4, and to get to it we must put the Kd into the space (remember we're assuming we're not going to remove any other suits) and we have no free 10 with which to restore the space via column 4. Nor can we get any more spaces; all columns contain Kings or 9's or Aces, and there are no free 10's or deuces, so digging through any pile would cost us the space, and would get us at most one space in return. Thus we conclude that we must remove another suit before the hearts. Which suit is it to be? It can't be clubs. To reach the 10c (in column 2) we must move the first As into the space, since there are no free deuces anywhere. Having done so, we have no place to move the 4-As. (We have already noted that getting to the free 5 costs us the space.) On the other hand, we CAN remove either diamonds or spades. (If you thought you HAD to remove the diamonds, you might want to take a moment to study the above tableau and figure out how to remove the spades instead.) Let's look at the diamonds first. Most of them are already in column 1; all we need to dredge up are the 7, 2, and Ace. We'll ignore the diamonds in column 9 (we know we can't reach the 7d there, and the 2d is less accessible than that in column 8), and proceed thusly: 7-6h from 8 to 6, Ac from 8 to 5, Ad from 7 to 8, Ac from 5 to 7, 8h from 1 to 3, 2-Ah from 1 to 9, 2-Ad from 8 to 1, Jc from 4 to 10, K-Qd from 4 to 5, 6-Ad from 1 to 4, 7h from 1 to 3, and 7-Ad from 4 to 1. Removing the diamonds from column 1 would give us this position: (sp) Jc 9h 9c Kd 9d Qc Ks -- Qs 10c 10s 8c Qd Qh Kc Js -- Kc 9c 9s 5s Jh Qs Jd Qh 8c 8h 10h Js 7d Jc 7c 7h 9h 10d 6h 6c 8h 9s 5c 5c 7h 8s 4h 4s 6h 7s 3h 3s 6s 2d 2s 5d Ah As 4d 4c As 3c 3c 2c 2c Ac Ac 7c 6s 5s 4s 3s 2h Ah Now, before we pursue this any further, let's go back and see how we can remove the spades instead. If we try to do so in the straightforward manner, we run into trouble. Presumably we would uncover the Ks in column 8 by moving the 7-6h onto an 8 and the 2d-Ac onto a 3 (probably swapping the Ac/Ad as we did in the previous paragraph). We would then move the Js out of column 8 and bring in a pile of spades from columns 7 (Q-J, 8-6), 3 (10-9), and 9 (5-3), piling them all onto the King. But then we'd be unable to get to the 2s in column 2. (Once we moved the first As into the space, we'd be unable to swap the 2-As with the 2-Ad (or whatever) blocking off the 3s in column 8.) The way out of this bind is to wait until the last minute to move anything onto the 3s, such that when we do it's the 2-As, and thus we won't need the space afterward. Here's how we can do it: 7-6h from 8 to 6, Ac from 8 to 5, Ad from 7 to 8, Ac from 5 to 7, 3-Ac from 7 to 5, 5-4d from 7 to 6, 3-Ac from 5 to 6, 8-6s from 7 to 3, 9s from 7 to 5, 10d from 7 to 4, 9s from 5 to 4, 10-6s from 3 to 7, 5-3s from 9 to 7. Now we're ready to go: As from 2 to 5, 2-As from 2 to 7, 2-Ad from 8 to 2, Js from 8 to 10, and Q-As from 7 to 8. Removing the suit gives this tableau: Kd Jc 9h 9c As 9d Qc (sp) -- Qs Qd 10c 8c Qh Kc -- Kc Jd 9c 5s Jh Jd Qh 10d 8c 7d 10h 7d Js 9d 7c Kd 9h 6h 8d 6c Qd 8h 5c 7h 5c Jc 7h 4h 6d 4s 10d 6h 3h 5d 3s 9s 5d 2d 4d 2d 4d Ah 3d Ad 3c 4c 2h 2c 3c Ah Ac 2c 8h Ac 7c 6s Now, which of these two positions (resulting from removing either diamonds or spades) is better with regard to our ultimate goal -- the hearts? Well, in the tableau immediately above (with the spades removed), we still can't get through column 9 (same reasoning as before), nor can we get any more spaces (column 2 is the only chance, but we can't get through it). And since we can't get through column 2, we can't remove a set of clubs yet, so all we can do is remove a set of diamonds. If that's the case, we might as well have removed the diamonds first and then seen whether we could do without removing the spades! So we'll use the earlier tableau and proceed from there. Now we can dig through column 9 and turn up a new card, but we'll lose the space in the process, because we've got only one free 8 left. Furthermore, to get to that free 8 we must use up our only free 6, so no matter which heart gets turned up we won't be able to move it, nor can it possibly get us the space back. Furthermore, we still can't get any additional spaces (short of removing more suits) due to the lack of free 10's and deuces. Thus we can't get out a set of hearts yet, but we're getting closer! What next? We can now remove either spades or clubs. Either way we end up getting a new space. Removing the clubs has the advantage that it digs all the way to the 4-Ac in column 9, so let's try that approach. We'll start by dredging out the Qc: 3-Ac from 7 to 1, 5-4d from 7 to 6, 3-Ac from 1 to 6, 9-6s from 7 to 1, 10d from 7 to 10, 9-6s from 1 to 10, Js from 8 to 5, Q-Js from 7 to 8, Kc from 7 to 1, Qc from 7 to 1. Now we finish the job: As from 2 to 7, 4-As from 2 to 4, J-5c from 2 to 1, 2-Ah from 9 to 2, 6-3s from 9 to 3, 2-Ah from 2 to 3, 5-As from 4 to 10, 7c from 9 to 4, 4-Ac from 9 to 1. Removing the clubs from column 1 yields: (sp) (sp) 9h 9c Kd 9d As Ks -- Qs 10s 8c Qd Qh Qs -- Kc 9s 7c Js Jh Js Jd Qh 8h 10h 7d Jc 7h 9h 6h 10d 6s 8h 5c 9s 5s 7h 4h 8s 4s 6h 3h 7s 3s 5d 2d 6s 2h 4d Ah 5s Ah 3c 4s 2c 3s Ac 2s As Surely two spaces will suffice! Except that now we've used up the last of the free 8's, so both the 7d and the Jd will cost us spaces (we can move the Jd onto the Qs in column 10, but that too costs us a space). If the 5h turns up, we'll be stuck, but what if we get the Kh? Then, with a bit of judicious planning, we can move the Qs out of column 10 onto the Kh. (The planning involves putting a Js on the Qs so the Jd can go elsewhere.) But the lone space won't be enough to get the Kh off of column 9, once the Q-Js are placed with it. So we must plan even further and leave a Q-Jh to be picked up by the Kh. This is our only hope of getting the hearts out (without removing the spades), so let's see how it works out: 9-As from 10 to 1, 10d from 10 to 5, 9-As from 1 to 5, 3-Ac from 6 to 1, 5-4d from 6 to 2, 10-6h from 6 to 8, 3-Ac from 1 to 2, Jc from 10 to 1, Jh from 6 to 10, Jc from 1 to 6. Now we've got the Jh with the Qh that we can move. (We can't move the Qh in column 6 since that would cost us a space.) Continuing: 5-As from 5 to 8, 3-Ac from 2 to 1, 5-4d from 2 to 5, 3-Ac from 1 to 5, Ah from 9 to 1, 2d from 9 to 2, 2-Ah from 3 to 9, 2d from 2 to 3, Ah from 1 to 3, 4-Ah from 9 to 1, 5c from 9 to 2, 6h from 9 to 4, 5c from 2 to 4, 4-Ah from 1 to 4, Q-Jh from 10 to 1, Kc from 10 to 2, Qs from 10 to 2, 7d from 9 to 10, Jd from 9 to 2, and we assume the Kh is turned up. We move Q-Jh from 1 to 9 and reach the following position: (sp) Kc 9h 9c Kd 9d As Ks -- 7d Qs 10s 8c Qd Qh Qs Kh Jd 9s 7c Js Jc Js Qh 8h 6h 10d 10h Jh 7h 5c 9s 9h 6s 4h 8s 8h 5s 3h 7s 7h 4s 2h 6s 6h 3s Ah 5d 5s 2d 4d 4s Ah 3c 3s 2c 2s Ac As Unfortunately, despite our best preparations, we will be unable to combine the hearts once we move the K-Jh into the space and turn up the 5h. We could go back and try removing the spades instead of the clubs earlier, but it wouldn't help. We must remove both the spades AND the clubs (and the diamonds) before removing the hearts. We can't get the spades together starting with the above tableau -- we can't get through column 3 with only one space. So we'll back up to the previous tableau and proceed thusly: 2-Ah from 3 to 1, 6-3s from 3 to 4, 8-7h from 3 to 2, 10-9s from 3 to 8, 8-7h from 2 to 3, Ah from 9 to 2, 2d from 9 to 4, Ah from 2 to 4, 2-Ah from 1 to 9, 8-As from 10 to 8, and remove the spades. We now have this: (sp) (sp) 9h 9c Kd 9d As (sp) -- Qs 8h 8c Qd Qh -- Kc 7h 7c Js Jh Jd Qh 6s 10h 7d Jc 5s 9h 6h 10d 4s 8h 5c 9s 3s 7h 4h 2d 6h 3h Ah 5d 2h 4d Ah 3c 2c Ac With THREE spaces we should have no trouble! Then again, considering how careful we had to be to even come close using two spaces, perhaps we should be cautious! If we just start dumping things into spaces we may find we don't have enough spaces to move things around once we know what we want moved. So we'll start by gathering what hearts we have: 3-Ac from 6 to 1, 5-4d from 6 to 2, 6h from 6 to 3, 5-4d from 2 to 3, 3-Ac from 1 to 3, 4-Ah from 9 to 1, 5c from 9 to 2, 6h from 9 to 6, 5c from 2 to 6, 4-Ah from 1 to 6. Now, if we stuff the 7d and Jd from column 9 into a pair of spaces, and the 5h turns up, we can move 4-Ah from 6 to 9, 5c from 6 to 8, 5-Ah from 9 to 6, and Q-Ah from 6 onto the newly revealed Kh. But if the Kh is the first card turned up, we'll be in rough shape. So let's prepare for that contingency just as we did in our earlier attempt. We move 9s from 10 to 1, 10d from 10 to 5, 9s from 1 to 5, 4-Ah from 6 to 1, 5c from 6 to 2, J-6h from 6 to 8, Jc from 10 to 6, J-6h from 8 to 10, 10-6h from 10 to 6, 5c from 2 to 6, 4-Ah from 1 to 6, Q-Jh from 10 to 8, Kc from 10 to 1, Qs from 10 to 1, 7d from 9 to 10, and here we are: Kc (sp) 9h 9c Kd 9d As Qh -- 7d Qs 8h 8c Qd Qh Jh -- 7h 7c Js Jc Jd 6h 6s 10d 10h 5d 5s 9s 9h 4d 4s 8h 3c 3s 7h 2c 2d 6h Ac Ah 5c 4h 3h 2h Ah No matter which heart is revealed when we move the Jd from 9 to 1, we will be able to finish combining the hearts. =========================================================================== Ae[bFBe`0XjJA71dJjS2;b0Q9[YT01:>4HQoE;]7OIIXJIB432/DZcKfD>>CSO_H>Zgi[ed:5NPgamO?=mKT\gBR^c=Gd@O^@TM>]QdcD :gKni/^ f15K/8 LRb;/e 8f=HX/D UPH2/> J?B>/H Pa?n0/o ggKE/R oQfL/j ?`9Al/^. In case you're wondering what it takes to finish a game with all eight completed suits still sitting in the tableau, here's a deck (again, encountered in actual play) that makes it possible. The "solution" is left as an exercise. This deck can also be useful as a confidence boost for novices who are having trouble winning at all, since it is relatively easy to win from this position if you are willing to remove suits as you complete them. -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 9s Kd -- 4s 8h -- Qd 7s -- 10d Jd Qh 9d -- -- Don Woods. [*** Generic Disclaimer ***] -- ...!sun!woods -or- Woods@Sun.com From don Thu Jan 18 22:46:15 1990 Date: Thu, 18 Jan 90 22:46:15 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: Record and Playback of events From: testmax!evans@decvax.dec.com (Marc Evans Ultrix Q/A) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) There is an X server extension that HP created called XTM. Implement this in your server, and use the associated client, and you will have a basic/simple record and playback tool. Also, if you attended the X Technicle conference, you will have heard about a couple of different projects (two at DEC and one at Sequent) that are trying to address this issue of testing within an X environment. The results of these projects are likely to become avaiable sometime in the future. - Marc (Just another Xtrap/Xigor hacker) ========================================================================== Marc Evans - WB1GRH - evans@decvax.DEC.COM | Synergytics (603)893-8481 Unix/X-window Software Contractor | 3 Koper Ln, Pelham, NH 03076 ========================================================================== From don Thu Jan 18 22:46:24 1990 Date: Thu, 18 Jan 90 22:46:24 -0500 To: NeWS-makers@brillig.umd.edu Subject: where is Hypernews? From: cs.utexas.edu!execu!sequoia!meritaus!dan@tut.cis.ohio-state.edu (Dan Haug) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) I haven't been watching this group regularly... A message posted around 10/6/89 suggested that Hypernews would be available in a couple of months from then. Has it been released? Or what is its status? Will it run on NeWS 1.1? or NeWS 2.0? thanks for any info, -- dan haug ==================================================================== Phonenet: (512)338-2450 Internet: execu!sequoia!meritaus!dan@cs.utexas.edu UUCP: {uunet, cs.utexas.edu!execu, texbell}!sequoia!meritaus!dan From don Fri Jan 19 02:11:21 1990 Date: Fri, 19 Jan 90 02:11:21 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: Record and Playback of events From: usinset!craig@uunet.uu.net (Craig Hubley) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) HP's NewWave has capabilities of this nature, since it essentially parses the users' actions into a stream of events - these can be recorded and played back. Last I heard, HP was moving NewWave, and its Object Management Facility to Unix - since they are in OSF it is reasonable to assume this will run on X in conjunction with OSF/Motif. There are lots of other things that NewWave does, which is IMHO one big reason Apple sued HP - they were stalling for time until their own system 7.0 could come out with similar capabilities. However, it appears HP's approach will be proposed to OSF sometime soon, and Apple will get left out in the cold - they are not trying to standardize application control abstraction across any systems other than Macs. Craig Hubley From don Fri Jan 19 02:11:48 1990 Date: Fri, 19 Jan 90 02:11:48 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: where is Hypernews? From: hoptoad!hugh (Hugh Daniel) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) I am testing GoodNeWS 1.3 beta and HyperNeWS 1.3 beta right now on NeWS 2.0 (X/NeWS FCS). I dont know when Turing plans on posting to the net, but real soon is a good guess. GoodNeWS 1.2 (runs on NeWS 1.1) is on tumtum.umd.edu for ftp'ing. One interesting thing about the new version of GoodNeWS/HyperNeWS is that it runs under NeWS 1.1 and NeWS 2.0. These folks are going to some real work to provide a toolkit that runs on all NeWS`s! GoodNeWS under NeWS 2.0 probvides as a submenu OpenLook, there are no problems running NDE/tNt or LiteWindows applacations at the same time. ||ugh Daniel hugh@toad.com Grasshopper Group, +1 415/668-5998 hugh@xanadu.com 210 Clayton St. San Francisco CA94117 From don Sat Jan 20 12:28:19 1990 Date: Sat, 20 Jan 90 12:28:19 -0500 To: NeWS-makers@brillig.umd.edu Subject: GoodNeWS on SPARC From: sun-barr!ccut!piyopiyo!ott@apple.com (max) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) I tried to install GoodNeWS V1.2 on a sparc-station and ran into a few problems. Like, I can't open a shell window and a few other funny little things. If anyone has a working version on a sparc, could you please contact me? We are running NeWS V1.1. Further, somewhere in all those files I found a reference to a more precise description of GN, but could not find it. Does anyone knows? Thanks a lot -max ------------------------------------------------------------------------------ Max Ott e-mail: Hatori Laboratory ott%piyopiyo.hatori.t.u-tokyo.ac.jp Dept. of E.E.; U of Tokyo I am not a tourist, I live here, but +(81)-(03) 812 2111 Ext. 6761 would not mind being one. From don Mon Jan 22 14:42:07 1990 Date: Mon, 22 Jan 90 14:42:07 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: Display PostScript (was X-extensions on X terminals?) From: Peter W. Brewer Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) > it's just an interpreter for the PostScript >NeWS is a programming language, window system, threads package, >operating system >Chris Kent Western Software Laboratory Digital Equipment Corporation > kent@decwrl.dec.com decwrl!kent As mentioned before in the NeWS-makers group the server-client paradigm used by NeWS is a truly well contrived object oriented interprocess/interprocessor communications package.. (-: shades of Apollo's Aegis and the Mailbox server ..\ or is that a bad word now.. :-) which in my opinion is FINALLY FINALLY a real response by SUN to loyal users who picked Sun over Apollo to achieve Unix yet lost alot in the bargain.. the display manager to start with. It should NOT BE lost even though it can be less than robust (to be kind) at times and other problems which we won't go into and start a tribal war.. There however alot of GOOD IDEAS which could be lost again either by a prolonged X versus NeWS war.. Sun making a good imitation of Apollo and keeping everything proprietary and just plain stubborness.. etc. An Open Richard Stallman style X-NeWS integration would be nice.. not just a Sun Xnews.. but I guess I'm just a romantic... Peter From don Tue Jan 23 03:28:24 1990 Date: Tue, 23 Jan 90 03:28:24 -0500 To: NeWS-makers@brillig.umd.edu Subject: CHI '90 HOUSING INFORMATION AND RESERVATION FORM From: bnrgate!bnr-fos!bmers58!bmers11.uucp!armstron@uunet.uu.net (Steve Armstrong) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) <<<< RECOMMENDATION: Don't read this document, >>>> <<<< print it out using non-proportional font. >>>> CHI '90 HOUSING INFORMATION AND RESERVATION FORM (Email Advance Program and Registration Forms may be obtained by sending a request to: meads.chi@xerox.com) HOUSING FORM Reservations must be made using the CHI '90 Housing Form below (or one from the hard copy Advance Program). Please do not alter this form. Telephone reservations will not be accepted. No reservations can be made directly through the hotels. The reduced conference rates are available only through the Housing Bureau. The local room tax is 14.1%. Reservations must be received by the Housing Bureau no later than March 1, 1990. Requests will be processed on a first-come, first- served basis and will be forwarded to the hotel of your choice as room availability permits. Please supply all information requested on the Housing Form. Any information that is missing will cause a delay in the processing of your reservation request. Do not send a room deposit with the Housing Form. If you wish to guarantee your room for late arrival, you can either include your credit card number on the Housing Form or send your deposit directly to the hotel after you have received confirmation from the hotel. Any changes to your housing request must be made to the Housing Bureau in writing. All the conference hotels are within 2 blocks of the Convention Center with the exception of the Westin which is 5 blocks away. THE SEATTLE SHERATON HOTEL & TOWERS (Main Conference Hotel) Single or Double $92 Extra person $20 THE SEATTLE HILTON HOTEL Single $77 Double $87 THE HOLIDAY INN CROWNE PLAZA Single or Double $87 THE WEST COAST ROOSEVELT HOTEL Single or Double $64 Deluxe Single or Double $74 THE WESTIN HOTEL SEATTLE Single or Double $95 ============< CUT HERE - Start of Housing Form >=============== CHI '90 HOUSING APPLICATION FORM -------------------------------- Complete this form and return to: DEADLINE FOR RESERVATIONS: HOUSING BUREAU *** March 1, 1990 *** 520 pike Street, Suite 1300 Reservations serviced on a Seattle, Washington 98101 First Come - First Served Basis CONFIRMATION INSTRUCTIONS: Please print or type all information, abbreviating if necessary. If more than one room is required, please use a separate form for each room. SEND CONFIRMATION TO: _________________________________________________________________ First Name Middle Initial Last Name _________________________________________________________________ Affiliation _________________________________________________________________ Street Address or P.O. Box Number _________________________________________________________________ City State Zip or Postal Code _________________________________________________________________ Country Area Code + Daytime Phone Number ARRIVAL: DEPARTURE: AM AM Date:____________ Time______ PM Date:____________ Time______ PM TYPE OF ACCOMMODATIONS: (Please Check Required Room Type) ___ SINGLE ___ DOUBLE ___ DOUBLE/DOUBLE (1 person-1 bed) (2 ppl-1 bed) (2 ppl-2 beds) ___ TRIPLE ___ QUAD ___ SUITE (Circle size) (3 ppl-2 Dbl beds) (4 ppl-2 Dbl beds) (1 or 2 bedroom) HOTEL PREFERENCE: Preferences assigned in ordered received. If requested rate is not available, the next available rate will be assigned. 1st: __________________________ 2nd: __________________________ 3rd: __________________________ 4th: __________________________ Preferred Rate $ __________ Special Needs: ______________________ CREDIT CARD ROOM RESERVATION GUARANTEE: (optional) This information must be completed in order to hold your room for late arrival. Name as it appears on card________________________________________ Card Type_____________ Card No.___________________ Exp. Date______ Authorized Signature X____________________________________________ ROOMMATES: (Name All Occupants With Address) Name:___________________ Address:_________________________________ Name:___________________ Address:_________________________________ Name:___________________ Address:_________________________________ Name:___________________ Address:_________________________________ -----< End of Housing Form >--------------- From don Tue Jan 23 03:28:34 1990 Date: Tue, 23 Jan 90 03:28:34 -0500 To: NeWS-makers@brillig.umd.edu Subject: CHI'90 REGISTRATION FORM From: bnrgate!bnr-fos!bmers58!bmers11.uucp!armstron@uunet.uu.net (Steve Armstrong) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) <<<< RECOMMENDATION: Don't read this document, >>>> <<<< print it out using non-proportional font. >>>> CHI'90 REGISTRATION FORM ------------------------ Registration may be completed in advance by mailing the registration form and fee so that the are postmarked by March 16, 1990. Reduced rates will be applied for registration form and fee postmarked on or before February 23, 1990. Registration forms will be processed only if accompanied by full payment. Registration forms and payments submitted separately will be returned. Registration forms sent by FAX must be paid for by credit card. Email Advance Program and Housing Forms may be obtained by sending a request to: meads.chi@xerox.com * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * NO PHONE OR EMAIL REGISTRATIONS WILL BE ACCEPTED! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Registration is also available at the door. PAYMENTS: -------- Payments may be made by travelers checks, personal or company checks, money orders, or credit cards. Payments from foreign banks must be made in U.S. dollars by either International Money Order or by drafts drawn against an account at a U.S. bank. Please make checks payable to: CHI'90 Purchase orders and government vouchers will not be accepted. REFUNDS/TRANSFERS: ----------------- Refund requests must be made in writing and postmarked before March 16, 1990. Regrettably, processing cost requires a 10% cancellation fee. Registrations can be transferred by giving your substitute the conference registration confirmation receipt. RETURN REGISTRATION FORM AND FEE TO: ----------------------------------- R. K. Yamauchi CHI'90 Registration P.O. Box 808, L-307 Livermore, CA 94550 Street Address: Bldg 218, Room 110, L-307 7000 East Avenue Telephone: (415) 422-4178 FAX: (415) 423-4021 ===========< CUT HERE - Start of Registration Form >============== CHI'90 REGISTRATION FORM ------------------------ Mailing Address (check one): __ Business __ School __ Home ________________________________________________________________ First Name Middle Initial Last Name ________________________________________________________________ Name as you want it to appear on your badge (if different) ________________________________________________________________ Department ________________________________________________________________ Company or School Affiliation ________________________________________________________________ Street Address ________________________________________________________________ City State/Province Postal Code Country ________________________________________________________________ Telephone Number (Please include country, area and city codes) ________________________________________________________________ FAX (optional) NOTE: The conference attendee list may be made available to outside organizations. Check here if you DO NOT want your name to appear on this list. _______ ================================================================= Society membership: Members of any of the following cooperating societies qualify for membership rates. Please check all of which you are a member: __ ACM __ IEEE-CS/CDE __ Euro. Assoc. Cog. Erg. __ SIGCHI __ IEEE-CS/OS __ Div. 21 of APA __ SIGGRAPH __ IEEE-CS/SE __ Cog. Sci. Soc. __ SIGOIS __ HFS __ BCS-HCI __ SIGCAPH __ NGI __ Soft. Psy. Soc. Registration category: Check one __ Member of cooperating society Society & ID#: ____________________________________________ __ Non-member __ Full time student School & ID#: _____________________________________________ (A current student ID must be presented at registration) ================================================================= Tutorial Selections: Check first choice selections Tutorial Units Tutorial Units no. no. __ 1 Sunday all day 2 __ 19 Monday all day 2 __ 2 Sunday all day 2 __ 20 Monday all day 2 __ 3 Sunday all day 2 __ 21 Monday all day 2 __ 4 Sunday all day 2 __ 22 Monday all day 2 __ 5 Sunday all day 2 __ 23 Monday all day 2 __ 6 Sunday all day 2 __ 24 Monday all day 2 __ 7 Sunday all day 2 __ 25 Monday all day 2 __ 8 Sunday all day 2 __ 26 Monday morning 1 __ 9 Sunday morning 1 __ 27 Monday morning 1 __ 10 Sunday morning 1 __ 28 Monday morning 1 __ 11 Sunday morning 1 __ 29 Monday morning 1 __ 12 Sunday morning 1 __ 30 Monday morning 1 __ 13 Sunday morning 1 __ 31 Monday morning 1 __ 14 Sunday afternoon 1 __ 32 Monday afternoon 1 __ 15 Sunday afternoon 1 __ 33 Monday afternoon 1 __ 16 Sunday afternoon 1 __ 34 Monday afternoon 1 __ 17 Sunday afternoon 1 __ 35 Monday afternoon 1 __ 18 Sunday afternoon 1 __ 36 Monday afternoon 1 __ 37 Monday afternoon 1 ---------------------------- ----------------------------- Total Sunday units _____ Total Monday units _____ (Maximum of 2 units) (Maximum of 2 units) Total tutorial units ____ Sunday plus Monday (Maximum of 4 units) If, by some chance, a tutorial selection is not available, an alternate will be assigned only if you provide a prioritized list of alternates below: _________________________________________________________________ ================================================================= Conference and |Postmarked on or| Postmarked | tutorial fees: |before Feb. 23 | after Feb. 23 | ----------------------------|-------+--------|--------+-------| |Student | Member| Non- | Member | Non- | | | | member | | member| -------------------|--------|-------|--------|--------|-------| Conf Reg Only | $75 | $245 | $295 | $340 | $390 | -------------------|--------|-------|--------|--------|-------| Conf +1 Tut'l Unit | 140 | 370 | 450 | 520 | 600 | Conf +2 Tut'l Units| 205 | 495 | 605 | 700 | 810 | Conf +3 Tut'l Units| 270 | 620 | 760 | 880 | 1020 | Conf +4 Tut'l Units| 335 | 745 | 915 | 1060 | 1230 | -------------------|--------|-------|--------|--------|-------| 1 Tut'l Unit Only | 65 | 165 | 195 | 220 | 250 | 2 Tut'l Unit Only | 130 | 330 | 390 | 440 | 500 | 3 Tut'l Unit Only | 195 | 495 | 585 | 660 | 750 | 4 Tut'l Unit Only | 260 | 660 | 780 | 880 | 1000 | --------------------------------------------------------------- Conference and tutorial fees: $________ Local Showcase/Industry Tour: $________ (@$75 per person X ____ person(s)) Set of all the CHI '90 tutorial notes: $________ ( @ $495 per set -- must be accompanied by ) ( conference registration. The set of tutorial) ( notes must be picked up at the conference. ) ( For your convenience, a shipping service will) ( be available. ) Total fees $_______ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Regretfully, we cannot process any form without accompanying * * payment. PURCHASE ORDERS and GOVERNMENT VOUCHERS cannot be * * accepted. * * * * Registration forms sent by e-mail CANNOT be accepted! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Please make check payable to: CHI '90 Payment by credit cards will be accepted: __ VISA __ MasterCard __ American Express _________________________________________________________________ Credit Card Number Expiration Date _________________________________________________________________ Signature Date _________________________________________________________________ Please print the name on the credit card, if it is different from the attendee's name. _________________________________________________________________ If the credit card is a company card, please print the billing address -----< End of Registration Form >--------------- From don Tue Jan 23 03:28:42 1990 Date: Tue, 23 Jan 90 03:28:42 -0500 To: NeWS-makers@brillig.umd.edu Subject: CHI '90 Advance Program From: bnrgate!bnr-fos!bmers58!bmers11.uucp!armstron@uunet.uu.net (Steve Armstrong) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) <<<< This is a long document -- you may wish to print it out >>>> "EMPOWERING PEOPLE" The 7th Annual Conference on Human Factors in Computing Systems 1990 April 1-5 CHI'90 will provide an environment where Computer-Human Interaction comes alive, where understanding and ideas are developed, where new styles, techniques and applications are explored. CHI'90 will be more than a conference, it will be an event. In addition to an excellent and international tutorial and technical program, we will be presenting "EMPOWERED", a set of live interactive performances, and making the latest in interaction available for hands- on exploration in "THE INTERACTIVE EXPERIENCE". CHI '90 will not only be a technically excellent event, it will be FUN and an experience to remember. The CHI '90 Conference will be held at the Washington State Convention and Trade Center in Seattle, Washington with additional events being held next door in the Seattle Sheraton. TUTORIALS: Sunday & Monday, April 1-2 CHI'90 begins with two full days of tutorials by leading CHI researchers and practitioners on user interface design and principle, innovative user interfaces and techniques, user interface programming environments and toolkits, and special topics. For an email description of the workshops, write MEADS.CHI@XEROX.COM. TECHNICAL PROGRAM Monday, April 2, 1990 ===================== 6:00 PM: Opening Ceremonies Keynote Address Dr. Michael Dertouzos Director of the MIT Laboratory for Computer Science Massachusetts Institute of Technology 7:30 PM: Reception and Invited Posters Tuesday, April 3, 1990 ====================== 8:30 AM - Midnight: THE INTERACTIVE EXPERIENCE (Sheraton Hotel) Get in direct contact with CHI. Get your hands on it and become part of it with self-exploring exhibits such as artificial realities, guided design aids, hypermedia, multimedia, and some media you won't understand until you try it, but that's the point. A part of CHI '90 you experience. 8:30 AM: -------- *** Eyes , Voice, and Touch *** Chair: Chris Schmandt, Massachusetts Institute of Technology "A Gaze-Responsive Self-Disclosing Display" India Starker, Cognition Corporation Richard A. Bolt, MIT Media Laboratory "What You Look At Is What You Get: Eye Movement-Based Interaction Techniques" Robert J.K. Jacob, Naval Research Laboratory "Measuring the True Cost of Command Selection: Techniques and Results" Richard F. Dillon, Jeff D. Edey, Jo W. Tombaugh Carleton University, Canada *** Constraint Based UI Tools *** Chair: Dan R. Olsen Jr., Brigham Young University "Automatic, Look-and-Feel Independent Dialog Creation for Graphical User Interfaces" Brad Vander Zanden, Brad A. Myers Carnegie Mellon University "Surface Interaction: A Paradigm and Model for Separating Applications and Interfaces" Roger Took, University of York "Using Constraints to Achieve Stability in Automatic Graph Layout Algorithms" Karl-Friedrich Bohringer, Cornell University Frances Newbery Paulisch, University of Karlsruhe *** A Snapshot of Natural Language Interfaces *** Organizer: Hans Brunner, US WEST Advanced Technologies Critical Reviewers: Mike Williams, IntelliCorp, Inc. Kent Wittenberg, MCC Human Interface Laboratory Representative Users: Sandy Dahlgren, Transamerica Insurance Company Yukiko Sekine, Martin Marietta Laboratories Phil Washko, U S WEST Communications A balanced overview of today's commercially available natural language technologies will be discussed with an emphasis on usability issues. How useful are today's systems? 10:30 AM: --------- *** UIMS Techniques *** Chair: Andy Rubel, Rubel Software "Propositional Production Systems for Dialog Description" Dan R. Olsen Jr., Brigham Young University "Adaptive Semantic Snapping - A Technique for Semantic Feedback at the Lexical Level" Scott E. Hudson, University of Arizona "Help by Guided Tasks - Utilizing UIMS Knowledge" Robin Tuck, Dan R. Olsen Jr., Brigham Young University LAB REVIEWS University of Illinois, Departments of Psychology and Aviation Science Presenter: Arthur F. Kramer Nippon Telegraph & Telephone Corporation, Human Interface Laboratory Presenter: Takaya Endo AT&T Bell Laboratories, User Interface and Quality Planning Department Presenter: Bruce H. Fetz University of York, Departments of Psychology and Computer Science Presenter: Michael Harrison *** How Can We Make Groupware Practical? *** Organizer: Bob Ensor, AT&T Bell Laboratories Panelists: Terry Crowley, BBN Systems and Technologies Bob Kraut, Bell Communications Research Gail Rein, MCC Lee Sproull, Carnegie Mellon University Why is it that computer-based aids for collaborative work have failed to be widely used so far, and what can we do to make support accessible and useful to many people? 1:30 PM: -------- *** UI Models: Extensions & Applications of GOMS *** Chair: Wayne Gray, NYNEX Corporation "Using a Knowledge Analysis to Predict Conceptual Errors in Text-Editor Usage" Richard M. Young, Joyce Whittington MRC Applied Psychology Unit, United Kingdom "Designing Minimal Documentation Using a GOMS Model: A Usability Evaluation of an Engineering Approach" Richard Gong, Jay Elkerton, University of Michigan "Extensions of GOMS Analyses to Expert Performance Requiring Perception of Dynamic Visual and Auditory Information" Bonnie E. John, Carnegie Mellon University *** Multi-Media *** Chair: Fran Frome, AT&T "The Design Space of Input Devices" Stuart K. Card, Jock D. Mackinlay, George G. Robertson Xerox Palo Alto Research Center "Stereophonic and Surface Sound Generation for Exploratory Data Analysis" Stuart Smith, Georges G. Grinstein, University of Lowell R. Daniel Bergeron, University of New Hampshire "Issues in Multimedia Interface Design: Media Integration and Interface Agents" Brenda Laurel, Interactivist Tim Oren, Apple Computer, Inc. Abbe Don, Interactive Media Designer *** Participatory Design *** Organizer: Jeff Johnson, Hewlett-Packard Laboratories Panelists: Pelle Ehn, Aarhus University, Denmark Bonnie Nardi, Hewlett-Packard Laboratories Lucy Suchman, Xerox PARC Kari Thoresen, Norwegian Computing Center Panelists will discuss user participation in the design of custom applications for specific organizational settings, and then will consider the question: How might users' experience be relevant to the design of "horizontal" applications or computer-based appliances? 3:30 PM: -------- *** Application Areas *** Chair: S. Joy Mountford, Apple Computer, Inc. "Usable OCR: What are the Minimum Performance Requirements?" William H. Cushman, Purnendu S. Ojha, Cathleen M. Daniels Eastman Kodak Company "Spreadsheet-based Interactive Graphics: From Prototype to Tool" Nicholas Wilde, Clayton Lewis, University of Colorado "The Business Instrument Panel: A New Paradigm for Interfacing with Financial Data" C. Torben Thomsen, California State University (Fresno) "Tools for Interacting with the Creative Process of Composition" T. Schiphorst, T. Calvert, C. Lee, C. Welman, S. Gaudet Simon Fraser University, Canada *** End User Modifiable Environment *** Chair: Clayton Lewis, University of Colorado "User-Tailorable Systems: Pressing the Issues with Buttons" Allan MacLean, Kathy Carter, Lennart Lovstrand, Tom Moran Rank Xerox EuroPARC "End-User Modifiability in Design Environments" Gerhard Fischer, Andreas Girgensohn University of Colorado "Data Characterization for Intelligent Graphics Presentation" Steven F. Roth, Joe Mattis, Carnegie Mellon University "IShell: A Visual UNIX Shell" Kjell Borg, University of Umea, Sweden *** Real-time Decision Making *** Organizer: Steven M. Jacobs, TRW Defense Systems Panelists: Randy Boys, Texas Instruments, Inc. William Hefley, Carnegie Mellon University Christine Mitchell, Georgia Institute of Technology How do we give the users in real-time applications sufficient and timely information needed to make critical decisions without overload or distraction? Examples will be drawn from the USS Vincennes incident of 1988, aircraft pilot assistance, and human interaction with supervisory control systems. 7:00 & 9:00 PM -------------- EMPOWERED, the interactive performance! (Sheraton Hotel) Humans and computers take to the stage in the most demanding CHI forum ever - performing live with interactive instruments and systems! No bugs, out-takes or edits - the ultimate demonstration of man-machine trust as the show must go on! Motion-to-music, software soloists, video virtuality, hacking harmonies, augmented action, and more... Wednesday, April 4, 1990 ====================== 8:30 AM - Midnight: THE INTERACTIVE EXPERIENCE (Sheraton Hotel) 8:30 AM: -------- *** Fitts Session *** Chair: Bruce Tognazzini, Apple Computer, Inc. "Powermice and User Performance" Herbert D. Jellinek, Stuart K. Card Xerox Palo Alto Research Center "A Comparison of Selection Time from Walking and Bar Menus" Neff Walker, University of Michigan John B. Smelcer, American University "How Does Fitts' Law Fit Pointing And Dragging?" Douglas J. Gillan, Kritina Holden, Susan Adam, Marianne Rudisill, Laura Magee, Lockheed ESC *** Methodology *** Chair: Michael Atwood, NYNEX "Testing a Walkthrough Methodology for Theory-Based Design of Walk-Up-and-Use Interfaces" Clayton Lewis, Peter Polson, Cathleen Wharton, John Rieman, University of Colorado "Updating an Older Interface" Marcy Telles, Wordstar, International "Heuristic Evaluation of User Interfaces" Jakob Nielsen, Technical University of Denmark Rolf Molich, Baltica A/S, Denmark *** Practical Interfaces to Complex Worlds *** Organizer: Robert Spence, Imperial College, England Panelists: Mark Apperley, Massey University, New Zealand Maddy Brouwer-Janse, Philips, Netherlands Ernest Edmonds, Loughborough University, England David Kasik, Electronic Data Systems, Bellevue, Washington Paul Rankin, Philips Research Laboratories, England How do we design interfaces to systems for the support of expert users in demanding applications which are continually being improved? Designers must balance system power against training requirements, manage the evolution of metaphors, and discover effective prototyping and evaluation techniques. 10:00 AM: Interactive Posters (and Brunch) 11:30 AM: -------- *** Evolution and Practice in User Interface Engineering *** Chair: Michael Muller, Bellcore Discussant: Karen Holtzblatt, Digital Equipment Corporation "The Computer Reaches Out: The Historical Continuity of Interface Design" Jonathan Grudin, Aarhus University, Denmark "Developmental Scenario Analysis of Smalltalk Programming" Robert L. Campbell, IBM T.J. Watson Research Center "Why Good Engineers (Sometimes) Create Bad Interfaces" Donald R. Gentner, Apple Computer, Inc. Jonathan Grudin, MCC Human Interface Program LAB REVIEWS Virginia Polytechnic Institute and State University, Department of Industrial Engineering and Operations Research Presenter: Robert C. Williges Bell Communications Research, Applied Research Division Presenter: Thomas K. Landauer CHI Systems, Inc. Presenter: Wayne Zachary The Fraunhofer-Gesellschaft, West Germany Presenter: Jurgen Ziegler *** Designing for International Use *** Organizer: Jakob Nielsen, Technical University of Denmark Panelists: Elisa M. del Galdo, Digital Equipment Corporation, England Robert C. Sprung, Harvard Translations Piyawadee "Noi" Sukaviriya, The George Washington University Gaining an interface effective for international use requires attention to many issues so that usability is not "lost in translation." Wednesday Afternoon: UNSTRUCTURED TIME Thursday, April 5, 1990 ====================== 8:30 AM - 3:00 PM: THE INTERACTIVE EXPERIENCE (Sheraton Hotel) 8:30 AM: -------- *** CSCW - Computer Support For Real Time Collaborative Work *** Chair: Ellen Francik, Wang Laboratories, Inc. "User Interface Requirements For Face To Face Groupware" David Halonen, Robert Kass, Marjorie Horton, Mary Elwart-Keys, Paul Scott, EDS Center for Machine Intelligence "Collaboration Awareness in Support of Collaboration Transparency: Requirements for the Next Generation of Shared Window Systems" J. Chris Lauwers, Keith A. Lantz, Olivetti Research Center "VideoDraw: A Video Interface for Collaborative Drawing Activity" John C. Tang, Scott L. Minneman, Xerox Palo Alto Research Center *** Transcending Perspectives *** Chair: Pelle Ehn, Aarhus University, Denmark "Infinite Detail and Emulation in an Ontologically Minimized HCI" John M. Carroll, IBM T.J. Watson Research Center "Contextual Design: An Emergent View of System Design" Dennis Wixon, Karen Holtzblatt, Steve Knox, Digital Equipment Corporation "Using Critics to Empower Users" Gerhard Fischer, Andreas C. Lemke, Thomas Mastaglio, University of Colorado Anders Morch, NYNEX Artificial Intelligence Laboratory *** Collaboration for Technology Transfer *** Organizer: Keith Butler, Boeing Advanced Technology Center Panelists: David Kieras, University of Michigan John Thomas, NYNEX Chuck Price, Boeing Computer Services Thomas Allen, MIT Sloan School Moving across many stages to maturity is an arduous passage for fledgling technologies. How can we help the transfer of good new ideas and technology? Panelists will explore the collaborative process needed to improve technology transfer. 10:30 AM -------- *** The Organizational Context of Design *** Chair: Danielle Fafchamps, Hewlett-Packard Laboratories "Reflections on Participatory Design: Lessons from the Trillium Experience" Jeanette L. Blomberg, Xerox Palo Alto Research Center Austin Henderson, Fitch Richardson Smith "The Organizational Implementation of an Electronic Meeting System: An Analysis of the Innovation Process" Joey F. George, Joseph S. Valacich, J. F. Nunamaker, Jr. University of Arizona "Design of a Loading Plan Format for an Expert Cargo Loading System" Ron Lemaster, IBM/Boulder Ulla Merz, University of Colorado LAB REVIEWS MRC Applied Psychology Unit, Cambridge, England Presenter: Phil Barnard Boeing, Advanced Technology Center Presenter: Steve Poltrock US WEST, Advanced Technologies, User Interface Laboratory Presenter: Catherine Marshall University of Oregon, Department of Computer and Information Science Presenter: Sarah Douglas *** Evaluating Hypermedia Systems *** Organizer: Gary Perlman, Ohio State University Panelists: Dennis Egan, Bellcore Kate Ehrlich, Sun Microsystems, Inc. Gary Marchionini, University of Maryland Jakob Nielsen, Technical University of Denmark Ben Shneiderman, University of Maryland How can hypermedia technologies embedded in complex systems be evaluated? What user performance measures are most useful? What kind of guidance can be given to users and to designers? 1:30 PM ------- *** UI Models *** Chair: James H. Alexander, U S WEST Advanced Technologies "Models of the Human-Computer Interface" Douglas J. Gillan, Sarah D. Breedin, Rice University "Semantic Analysis During Exploratory Learning" Andrew Howes, Stephen J. Payne, University of Lancaster, United Kingdom "Empowering the Student: Prospects for an Unintelligent Tutoring System" Mitchell J. Nathan, University of Colorado *** Aids to Understanding Programs *** Chair: Raymonde Guindon, Stanford University " TRACK- A Trace Construction Kit" Heinz-Dieter Bocker, Jurgen Herczeg, University of Stuttgart, Federal Republic of Germany "Smalltalk Scaffolding: A Case Study of Minimalist Instruction" Mary Beth Rosson, John M. Carroll, Rachel Bellamy, IBM T.J. Watson Research Center "A View Matcher for Learning Smalltalk" John M. Carroll, IBM T.J. Watson Research Center Janice A. Singer, Learning Research and Development Center Rachel K.E. Bellamy, Cambridge University/ MRC APU, Sherman R. Alpert, IBM T.J. Watson Research Center *** Designers: Meet Your Users *** Organizer: S. Joy Mountford, Apple Computer, Inc. Panelists: Penny Bauersfeld, Apple Computer, Inc. Kate Gomoll, Apple Computer, Inc. Laurie Vertelney, Apple Computer, Inc. Users to be announced at the panel. The designers will illustrate a user interface design process through story boards, prototyping, and video-based user testing. Iteration of the interface design will be based on feedback solicited directly from a range of real users. This panel will reveal a gap between what designers are skilled in doing and what real users need to do their tasks. 3:30 PM ------- Closing Address: Dr. Terry Winograd, Stanford University CONFERENCE RECEPTION: The CHI '90 Conference Reception will be on Wednesday evening, April 4, 1990 at the Museum of Flight. LABORATORY REVIEWS The function of these reviews is to draw attention to significant concentrations of CHI research. A senior member of the laboratory will present the review, which will include a sketch of the full range of projects and activities. Special opportunities for collaborative projects and for visiting appointments for students and scientists will be described. FORMAL VIDEO REVIEW Technical videotape presentations will be shown continuously at CHI '90 in a designated Video Theater area and on special TV channels in the hotel rooms of participating CHI '90 conference hotels. The videos will present important innovations in computer-human interface from academic, industrial, and governmental groups. INFORMAL VIDEO PRESENTATIONS You are invited to bring videotapes to the conference to be shown to other attendees. An "Informal Video Room" will be available where you can either leave your tapes for others to see at their leisure, or where you can schedule a showing during the conference. Tapes must be in VHS, NTSC format, and clearly marked on the spine with your name and the tape title. Please drop off and pick up your tape in the Informal Video Room. There will be some security, but we cannot be responsible for lost or stolen tapes. EXHIBITS The latest products and services from commercial firms and publishers will be displayed and demonstrated in the Exhibits area which is adjacent to the technical sessions. LOCAL SHOWCASE TOUR On Friday, April 6, attendees are offered a tour of local labs and companies with significant activities in CHI. The tour buses will leave the Sheraton at 9:00 a.m. to visit Seattle area labs, stop for lunch, and return by 5:00 p.m. Hosts include: Boeing Advanced Technology Bolt, Beranek & Newman Graphics Human Interface Technology Lab, University of Washington Each site visit will include an overview of the charter and history of the lab, its staff and their computing environment, and an overview of the site tour. The cost of the tour is $75, and includes lunch and all transportation. Attendance is very limited. If you wish to take the tour, send in your registration form early. DEMONSTRATIONS Live demonstrations of experimental user interfaces will be presented. These will expose CHI '90 attendees to the latest developments in experimental user interface research. An informal demonstration area will also be available for one-to-one and small group demonstrations of systems that developers personally bring to the conference. FUN RUN For those who want to join a select band of colleagues for a brisk wake up, we will hold the CHI '90 Fun Run at 7:15 Wednesday morning. ------------------------------------------------------------- SPECIAL INFORMATION ------------------------------------------------------------- STUDENT VOLUNTEERS We offer reduced registration fees for registered full-time students, as well as complimentary registrations for students willing to volunteer their assistance for the day-to-day operations of the conference. Low-cost housing ($21.50 per night, which includes $5 of food vouchers) at the University of Washington will be available for over a hundred out of town student volunteers. Please contact: Larry T. Kuhn, Humboldt State University, Arcata, CA. 95521, (Kuhn.chi@xerox.com) or Patrick Lynch, 574 Lander Hall, University of Washington, Seattle, WA 98105, (plynch.chi@ xerox.com) CONFERENCE REGISTRATION and HOTEL RESERVATION information and forms will be posted in separate email messages. These messages may also be requested from: meads.chi@xerox.com Hard copies of the CHI '90 Advance Programs may be obtained by sending a request to: Toni MacHaffie CHI '90 Executive Administrator machaffie.chi@xerox.com. Email Registration and Housing Forms may be obtained by sending a request to: meads.chi@xerox.com From don Tue Jan 23 19:46:39 1990 Date: Tue, 23 Jan 90 19:46:39 -0500 To: NeWS-makers@brillig.umd.edu Subject: PopupItem Class From: zawada@athens.ees.anl.gov (Dave Zawada) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) Here is a new PopupItem class that will run under NeWS 1.1 and X/NeWS. Enjoy, Dave Zawada and Dave Mak =======Cut Here======== %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % BtolPopup.ps v1.0 % % Date: January 17, 1990 % Authors: % % David G. Zawada % EAIS-VIS % Argonne National Laboratory % zawada@athens.ees.anl.gov % % David C. Mak % EAIS-VIS % Argonne National Laboratory % mak@athens.ees.anl.gov % % PopupItem.ps is the class definition for a new type % of cycle item. Given a list of items, a PopupItem % allows for the selection of one of the items in the % list through a popup menu that it displays when it % is clicked on. The function of a PopupItem is best % described by an example, so here's one... % % /win framebuffer /new DefaultWindow send def % { % 20 dup 500 350 reshape % % /items % [ % [ % (Popup Items) (by) (Dave Zawada) % (and) (Dave Mak) (Argonne National Laboratory) % ] % {} ClientCanvas 0 0 /new BtolPopup send % { % /ItemLabelFont /Times-Roman findfont 32 scalefont def % /ItemFont /Helvetica findfont 32 scalefont def % 20 270 move % move to specific location; let PopupItem handle scaling % 0 sethue % } 1 index send % % [ (Option1) (Option2) (Option3) (Option4) (Option5) ] % {} ClientCanvas 0 0 /new BtolPopup send % { % /ItemLabelFont /Times-Roman findfont 18 scalefont def % /ItemFont /Times-Roman findfont 14 scalefont def % 20 190 150 0 reshape % scale and move yourself if desired % 0.3 sethue % } 1 index send % % [ % (Btol version 1.3) (coming) (SOON!!!) % (watch news-makers) % ] {} ClientCanvas 0 0 /new BtolPopup send % 20 150 /move 3 index send % true /setcycleon 2 index send % ] def % % /PaintClient { 0.7 0.7 0.7 rgbcolor fillcanvas items paintitems } def % % items forkitems pop % totop % map % } win send % END OF EXAMPLE % % By the way, a new version of our BTOL toolkit is in the works and % will include Popup items, DualScrollBars, FieldItems, as well as % terminal emulators, and a drawing package. Look for it soon on % news-makers!!! % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% systemdict begin currentdict /Item known not { version (1.1) eq %For X/NeWS compatibility { ($NEWSHOME/lib/NeWS/liteitem.ps) run } { ($OPENWINHOME/etc/NeWS/liteitem.ps) run } ifelse } if /BtolPopup Item dictbegin /Hue 0 def % The default color scheme /ShadowColor 0.1 0.1 0.1 rgbcolor def /HiLiteColor 0.9 0.9 0.9 rgbcolor def /FaceColor 0.7 0.7 0.7 rgbcolor def /ItemX 0 def % Location of the item /ItemY 0 def /PopCan null def % Pop down menu's canvas /PopCanHeight 0 def /PopCanWidth 0 def /ItemLabelFont /Helvetica-Bold findfont 14 scalefont def /EntryHeight 0 def %need because Label and List may use different fonts /EntryWidth 0 def %need because Label and List may use different fonts /EntryList [] def % List of items to be displayed by Popup /EntryGap 5 def /NumEntries 0 def /CycleOn? false def % If true, clicking and releasing on the % item will cause cycling through the list % See the example program above dictend classbegin /new % [] notify parent w h => instance { /new super send begin /NotifyUser exch def /EntryList exch def /NumEntries EntryList length def /ItemValue 0 def /ItemFont /Helvetica findfont 14 scalefont def /ItemFillColor FaceColor def /ItemFrame 2 def /PopCan ItemParent newcanvas dup begin /Transparent false def /SaveBehind true def end def currentdict end } def /setcycleon % boolean => - { /CycleOn? exch def } def /move % x y - => - { /ItemY exch def /ItemX exch def ItemX ItemY /move super send } def /reshape % x y w h => - { /ItemHeight exch def /ItemWidth exch def /ItemY exch def /ItemX exch def EntryList { ItemFont ThingSize /EntryHeight exch EntryHeight max def /EntryWidth exch ItemFrame 2 mul add EntryWidth max def } forall EntryList { ItemLabelFont ThingSize /ItemHeight exch ItemHeight max def /ItemWidth exch ItemFrame 2 mul add ItemWidth max def } forall /EntryHeight EntryHeight ItemFrame 2 mul add def /EntryWidth EntryWidth ItemFrame 2 mul add ItemWidth max def /PopCanHeight EntryHeight EntryGap add EntryList length mul EntryGap add def /PopCanWidth EntryWidth EntryGap 2 mul add ItemFrame dup add add def /ItemHeight ItemHeight EntryHeight ItemFrame dup add add max def /ItemWidth ItemWidth PopCanWidth max def /PopCanWidth ItemWidth def gsave % reshape the Pop down menu ItemParent setcanvas 0 0 PopCanWidth PopCanHeight rectpath PopCan reshapecanvas PopCan setcanvas ItemX ItemY PopCanHeight sub movecanvas grestore ItemX ItemY ItemWidth ItemHeight /reshape super send % reshape the item } def /resetcolors % => - { /ShadowColor .1 .1 .1 rgbcolor store /HiLiteColor .9 .9 .9 rgbcolor store /FaceColor .7 .7 .7 rgbcolor store /ItemFillColor .5 .5 .5 rgbcolor store } def /sethue % hue => - { /Hue exch def /ShadowColor Hue 1 0.45 hsbcolor def /HiLiteColor Hue 0.3 1 hsbcolor def /FaceColor Hue 0.4 .9 hsbcolor def /ItemFillColor Hue 1 0.7 hsbcolor def } def /incvalue % - => - { /ItemValue ItemValue 1 add NumEntries mod def paint } def /ClientEnter { } def /ClientExit { } def /ClientUp % - => - { gsave PopCan setcanvas CurrentEvent begin YLocation cvi XLocation cvi end 1 index gsave clippath pathbbox points2rect rectpath pointinpath grestore { YtoValue /ItemValue exch def paint } { pop gsave ItemCanvas setcanvas currentcursorlocation clippath pathbbox points2rect rectpath pointinpath CycleOn? and { incvalue } if grestore } ifelse grestore PopCan /Mapped false put } def /ClientDown % - => - { PopCan canvastotop PopCan /Mapped true put PaintPopCan /ItemPaintedValue null def } def /ClientDrag % - => - { gsave PopCan setcanvas CurrentEvent begin YLocation cvi XLocation cvi end 1 index gsave clippath pathbbox points2rect rectpath pointinpath grestore { YtoValue dup ItemPaintedValue ne { ItemPaintedValue null ne { ItemPaintedValue DeHiLiteItem } if dup HiLiteItem /ItemPaintedValue exch def } if } { pop ItemPaintedValue null ne { ItemPaintedValue DeHiLiteItem } if /ItemPaintedValue null def } ifelse grestore } def /PaintItem % - => - Paint the item { FaceColor setcolor newpath 0 0 ItemWidth ItemHeight rectpath fill HiLiteColor setcolor newpath 0 0 moveto ItemFrame dup rlineto 0 ItemHeight ItemFrame 2 mul sub rlineto ItemWidth ItemFrame 2 mul sub 0 rlineto ItemFrame dup rlineto ItemWidth neg 0 rlineto fill ShadowColor setcolor newpath 0 0 moveto ItemFrame dup rlineto ItemWidth ItemFrame 2 mul sub 0 rlineto 0 ItemHeight ItemFrame 2 mul sub rlineto ItemFrame dup rlineto 0 ItemHeight neg rlineto fill ShadowColor ItemLabelFont setfont setcolor EntryList ItemValue get 100 string cvs ItemWidth ItemFrame dup add sub 2 div currentfont fontdescent ItemFrame 4 mul max moveto cshow } def /PaintPopCan % - => - Paint the Pop down menu { PopCan setcanvas FaceColor fillcanvas ShadowColor strokecanvas HiLiteColor setcolor 0 0 moveto 0 PopCanHeight rlineto PopCanWidth 0 rlineto stroke ShadowColor setcolor ItemFont setfont 0 1 NumEntries 1 sub { dup EntryList exch get EntryGap ItemFrame add 3 -1 roll 1 add dup EntryGap mul exch EntryHeight mul add PopCanHeight exch sub currentfont fontdescent ItemFrame 2 mul max add moveto show } for } def /DeHiLiteItem % value => - { gsave FaceColor setcolor EntryGap % x 1 index 1 add dup EntryGap mul exch EntryHeight mul add PopCanHeight exch sub % y translate 0 EntryGap -2 div EntryWidth EntryHeight EntryGap 2 div add rectpath gsave stroke grestore fill ShadowColor setcolor ItemFont setfont ItemFrame currentfont fontdescent ItemFrame 2 mul max moveto EntryList exch get show grestore } def /HiLiteItem % value => - { gsave EntryGap % x 1 index 1 add dup EntryGap mul exch EntryHeight mul add PopCanHeight exch sub % y translate FaceColor setcolor 0 EntryGap -2 div EntryWidth EntryHeight EntryGap 2 div add rectpath fill ShadowColor setcolor 0 EntryGap -2 div moveto 0 EntryHeight EntryGap 2 div add rlineto EntryWidth 0 rlineto stroke HiLiteColor setcolor 0 EntryGap -2 div moveto EntryWidth 0 rlineto 0 EntryHeight EntryGap 2 div add rlineto stroke ShadowColor setcolor 1 -1 translate ItemFont setfont ItemFrame currentfont fontdescent ItemFrame 2 mul max moveto EntryList exch get show grestore } def %%%%%%%%%%%%%%%%%%%%% % Geometric Utilities %%%%%%%%%%%%%%%%%%%%% /YtoValue % y => value { EntryHeight EntryGap add idiv NumEntries 1 sub exch sub 0 max } def classend def end From don Tue Jan 23 19:47:52 1990 Date: Tue, 23 Jan 90 19:47:52 -0500 To: NeWS-makers@brillig.umd.edu Subject: DualScrollItem class From: zawada@athens.ees.anl.gov (Dave Zawada) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) Here is a new scrollbar class that has bi-directional scroll buttons at both ends of the scrollbar. Continuous scrolling is also a feature. Enjoy, Dave Zawada and Dave Mak =====Cut Here===== %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % DualScrollBar.ps v1.0 % % Date: January 17, 1990 % Authors: % David G. Zawada % EAIS-VIS % Argonne National Laboratory % zawada@athens.ees.anl.gov % % David C. Mak % EAIS-VIS % Argonne National Laboratory % mak@athens.ees.anl.gov % % DualScrollBar.ps is the definition for a new subclass of % the SimpleScrollbar item. New features include % % --> Dual Scrolling is available, meaning that Up and Down % scrolling are both possible from either end of % the ScrollBar. % % --> Continuous Scrolling is possible by keeping any MouseButton % depressed within one of the ScrollButtons. % % --> Colorization is available via the /sethue method. % % --> Adjustable Thumb sizes are available via the /setrange % and /reshape methods. Through the use of these % methods, the size of the Thumb can reflect % what fraction of the scrolling list is currently % visible to the user. For examples of this % concept, look at applications which use scrollbars % and run under the SunView or NeXT environments. % % --> Scrollbar width can be adjustable. The smallest % width that aesthetically pleasing is 18. % % A simple example: % % systemdict /DualScrollBar known not % { (/DualScrollBar.ps) append run } if %Adjust path as necessary % % /win framebuffer /new DefaultWindow send def % { % 100 dup 400 dup reshape % % /items % [ % [ 1 0 0.1 0.5 0.1] 0 {} ClientCanvas % /new DualScrollBar send % dup /BarVertical? true put % { % 0.1 sethue % 10 20 dup 300 reshape % } 1 index send % % [ 1 0 0.1 0.5 0.5] 0 {} ClientCanvas % /new DualScrollBar send % dup /BarVertical? false put % { % 0.7 sethue % 60 20 300 34 reshape % } 1 index send % ] def % % items forkitems pop % % /PaintClient { items paintitems } def % % totop % map % } win send % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% systemdict begin currentdict /SimpleScrollbar known not { version (1.1) eq %For X/NeWS compatibility { ($NEWSHOME/lib/NeWS/liteitem.ps) run } { ($OPENWINHOME/etc/NeWS/liteitem.ps) run } ifelse } if /DualScrollBar SimpleScrollbar dictbegin /Hue 0 def /ShadowColor .1 .1 .1 rgbcolor def /HiLiteColor .9 .9 .9 rgbcolor def /FaceColor .7 .7 .7 rgbcolor def /ScrollWidth 16 def /ScrollMonitor null def /ScrollProcess null def /ScrollDelay 1 60 div 20 div def % 1/10 second /LastX null def /LastY null def dictend classbegin /new { /new super send begin /ScrollMonitor createmonitor def /ItemFillColor .5 .5 .5 rgbcolor def currentdict end } def /setrange % [ min max dLine dPg PercentView ] => - { /setrange super send ItemHeight null ne { /BoxSize ItemHeight ScrollWidth 4 mul sub BarViewPercent mul ScrollWidth max def SetScale } if } def /reshape % x y w h => - { /reshape super send /ScrollWidth ItemWidth ItemFrame 2 mul sub def BarViewPercent null ne { /BoxSize ItemHeight ScrollWidth 4 mul sub BarViewPercent mul ScrollWidth max def } { /BoxSize ScrollWidth def } ifelse SetScale } def /resetcolors % => - { /ShadowColor .1 .1 .1 rgbcolor store /HiLiteColor .9 .9 .9 rgbcolor store /FaceColor .7 .7 .7 rgbcolor store /ItemFillColor .5 .5 .5 rgbcolor store } def /sethue % hue => - { /Hue exch def /ShadowColor Hue 1 0.45 hsbcolor def /HiLiteColor Hue 0.3 1 hsbcolor def /FaceColor Hue 0.4 .9 hsbcolor def /ItemFillColor Hue 1 0.7 hsbcolor def } def /EventInItem? % - => bool Determine if user clicked in scrollbar { ScrollMotion { /ScrollAbsolute { false } /ScrollPageForward % top { LastX dup 0 ge exch ScrollWidth le LastY ItemValue ValueToY ScrollWidth 2 mul add ge LastY ItemHeight ScrollWidth 2 mul sub le and and and } /ScrollPageBackward % bottom { LastX dup 0 ge exch ScrollWidth le LastY ScrollWidth 2 mul ge LastY ItemValue ValueToY le and and and } /ScrollLineForward % top { LastX 0 ge LastX ScrollWidth le LastY ItemHeight ScrollWidth sub ge LastY ItemHeight le and LastY ScrollWidth ge LastY ScrollWidth 2 mul le and or and and } /ScrollLineBackward % bottom { LastX 0 ge LastX ScrollWidth le LastY 0 ge LastY ScrollWidth le and LastY ItemHeight ScrollWidth sub le LastY ItemHeight ScrollWidth 2 mul sub ge and or and and } } case } def /ClientDown % - => - { CurrentEvent begin XLocation YLocation end /LastY exch def /LastX exch def SetScrollMotion DoScroll ScrollMonitor { ScrollProcess null ne { ScrollProcess killprocess } if /ScrollProcess { InteractiveScroll } fork def } monitor } def /InteractiveScroll { { ScrollDelay sleep ScrollMonitor { EventInItem? { DoScroll } if } monitor } loop } def /ClientUp % - => - { ScrollMonitor { ScrollProcess null ne { ScrollProcess killprocess } if /ScrollProcess null def } monitor PaintButtons ItemValue ItemInitialValue ne { NotifyUser } if } def /BoxPath % value => - (Make a box path for the given value) { ValueToY BoxSize 2 div sub ItemFrame exch ScrollWidth BoxSize rectpath } def /PaintBar { ItemFillColor fillcanvas } def /PaintBox { gsave BarVertical? { PaintVBox } { PaintHBox } ifelse ItemValue ItemInitialValue ne { NotifyUser } if /ItemPaintedValue ItemValue def grestore } def /PaintVBox { 10 dict begin newpath ItemValue BoxPath gsave FaceColor setcolor fill grestore pathbbox points2rect /myBoxHeight exch def /myBoxWidth exch def gsave translate % paint the hilite HiLiteColor setcolor newpath 0 0 moveto ItemFrame 2 mul dup rlineto 0 myBoxHeight ItemFrame 4 mul sub rlineto myBoxWidth ItemFrame 4 mul sub 0 rlineto ItemFrame 2 mul dup rlineto myBoxWidth neg 0 rlineto closepath fill % paint the shadow ShadowColor setcolor newpath 0 0 moveto ItemFrame 2 mul dup rlineto myBoxWidth ItemFrame 4 mul sub 0 rlineto 0 myBoxHeight ItemFrame 4 mul sub rlineto ItemFrame 2 mul dup rlineto 0 myBoxHeight neg rlineto closepath fill % paint the dimple newpath HiLiteColor setcolor myBoxWidth 2 div 1 sub myBoxHeight 2 div 4 0 360 arc stroke newpath ShadowColor setcolor myBoxWidth 2 div 1 sub myBoxHeight 2 div 4 35 205 arc stroke grestore end } def /PaintHBox { 10 dict begin newpath ItemValue BoxPath gsave FaceColor setcolor fill grestore pathbbox points2rect /myBoxHeight exch def /myBoxWidth exch def gsave translate % paint the hilite HiLiteColor setcolor newpath 0 myBoxHeight moveto ItemFrame 2 mul dup neg rlineto 0 myBoxHeight ItemFrame 4 mul sub neg rlineto myBoxWidth ItemFrame 4 mul sub 0 rlineto ItemFrame 2 mul dup neg rlineto myBoxWidth neg 0 rlineto fill % paint the shadow ShadowColor setcolor newpath 0 myBoxHeight moveto ItemFrame 2 mul dup neg rlineto myBoxWidth ItemFrame 4 mul sub 0 rlineto 0 myBoxHeight ItemFrame 4 mul sub neg rlineto ItemFrame 2 mul dup neg rlineto 0 myBoxHeight rlineto fill % paint the dimple newpath HiLiteColor setcolor myBoxWidth 2 div 1 sub myBoxHeight 2 div 4 0 360 arc stroke newpath ShadowColor setcolor myBoxWidth 2 div 1 sub myBoxHeight 2 div 4 125 295 arc stroke grestore end } def /PaintArrow % { gsave ScrollWidth dup 2 mul scale % draw the up arrow BarVertical? { ShadowColor setcolor 0.125 0.5625 moveto 0.500 0.9375 lineto stroke HiLiteColor setcolor 0.500 0.9375 moveto 0.875 0.5625 lineto 0.125 0.5625 lineto stroke } { ShadowColor setcolor 0.875 0.5625 moveto 0.125 0.5625 lineto 0.500 0.9375 lineto stroke HiLiteColor setcolor 0.500 0.9375 moveto 0.875 0.5625 lineto stroke } ifelse % draw the down arrow BarVertical? { ShadowColor setcolor 0.875 0.4375 moveto 0.125 0.4375 lineto 0.500 0.0625 lineto stroke HiLiteColor setcolor 0.875 0.4375 moveto 0.500 0.0625 lineto stroke } { HiLiteColor setcolor 0.125 0.4375 moveto 0.875 0.4375 lineto 0.500 0.0625 lineto stroke ShadowColor setcolor 0.125 0.4375 moveto 0.500 0.0625 lineto stroke } ifelse grestore } def /PaintShadow % ShadowColor { setcolor BarVertical? { 0 0 moveto ItemFrame 2 mul dup rlineto ScrollWidth ItemFrame 4 mul sub 0 rlineto 0 ScrollWidth 2 mul ItemFrame 4 mul sub rlineto ItemFrame 2 mul dup rlineto 0 ScrollWidth 2 mul neg rlineto } { 0 ScrollWidth 2 mul moveto ItemFrame 2 mul dup neg rlineto ScrollWidth ItemFrame 4 mul sub 0 rlineto 0 ScrollWidth 2 mul ItemFrame 4 mul sub neg rlineto ItemFrame 2 mul dup neg rlineto 0 ScrollWidth 2 mul rlineto } ifelse fill } def /PaintHiLite % HiLiteColor { setcolor BarVertical? { 0 0 moveto 0 ScrollWidth 2 mul rlineto ScrollWidth 0 rlineto ItemFrame 2 mul neg dup rlineto ScrollWidth ItemFrame 4 mul sub neg 0 rlineto 0 ScrollWidth 2 mul ItemFrame 4 mul sub neg rlineto } { 0 ScrollWidth 2 mul moveto ItemFrame 2 mul dup neg rlineto 0 ScrollWidth 2 mul ItemFrame 4 mul sub neg rlineto ScrollWidth ItemFrame 4 mul sub 0 rlineto ItemFrame 2 mul dup neg rlineto ScrollWidth neg 0 rlineto } ifelse fill } def /PaintFace % FaceColor { setcolor ItemFrame dup ScrollWidth ItemFrame 2 mul sub ScrollWidth 2 mul ItemFrame 2 mul sub rectpath fill } def /PaintButtons % { gsave ItemFrame dup translate ShadowColor PaintShadow HiLiteColor PaintHiLite FaceColor PaintFace PaintArrow grestore gsave ItemFrame ItemHeight ScrollWidth 2 mul sub ItemFrame sub translate ShadowColor PaintShadow HiLiteColor PaintHiLite FaceColor PaintFace PaintArrow grestore } def /HiLiteUpArrow % - => - { gsave HiLiteColor setcolor ScrollWidth dup 2 mul scale 0.125 0.5625 moveto 0.500 0.9375 lineto 0.875 0.5625 lineto fill grestore } def /HiLiteDownArrow % - => - { gsave HiLiteColor setcolor ScrollWidth dup 2 mul scale 0.875 0.4375 moveto 0.125 0.4375 lineto 0.500 0.0625 lineto fill grestore } def /HiLiteArrows % bool => - { { /HiLiteDownArrow cvx } { /HiLiteUpArrow cvx } ifelse gsave ItemFrame dup translate dup exec PaintArrow grestore gsave ItemFrame ItemHeight ScrollWidth 2 mul sub ItemFrame sub translate exec PaintArrow grestore } def /SetScrollMotion % - => - (set ScrollMotion from event location) { CurrentEvent /YLocation get %Where did the click occur? dup ScrollWidth 2 mul le { % In Bottom Arrow dup ScrollWidth le { /ScrollMotion /ScrollLineBackward def true HiLiteArrows } { /ScrollMotion /ScrollLineForward def false HiLiteArrows } ifelse } { dup ItemHeight ScrollWidth 2 mul sub ge { % In Top or Right Arrow dup ItemHeight ScrollWidth sub le { /ScrollMotion /ScrollLineBackward def true HiLiteArrows } { /ScrollMotion /ScrollLineForward def false HiLiteArrows } ifelse } { ItemPaintedValue BoxPath pathbbox exch pop 3 -1 roll pop 2 index le { % Above Thumb pop pop /ScrollMotion /ScrollPageForward def } { le { % Below Thumb /ScrollMotion /ScrollPageBackward def } { % In Thumb /ScrollMotion /ScrollAbsolute def } ifelse } ifelse } ifelse } ifelse pop } def % Geometry utilities: /SetScale % - => - (set BarScale from size) { /BarScale ItemHeight BoxSize sub ItemFrame 2 mul sub ScrollWidth 4 mul sub BarMax BarMin sub div def } def /ValueToY % value -> y { BarMin sub BarScale mul ScrollWidth 2 mul add BoxSize 2 div add 1 add } def /YToValue % y -> value { ScrollWidth 2 mul sub BoxSize 2 div sub BarScale div BarMin add CheckValueBounds } def classend def end From don Tue Jan 23 20:47:12 1990 Date: Tue, 23 Jan 90 20:47:12 -0500 To: NeWS-makers@brillig.umd.edu Subject: RFI From: don (Don Hopkins) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) Run this version of PSPyro with an AM radio next to the CPU!! The sound effects are *excellent*! The best station I have found for a color Sun 4/110 is AM 607 to 609 or so, with the radio on the right side of the CPU box (which is under the monitor). I'd love to hear what radio station other machines come in well on, and what other NeWS programs make their own good AM radio sound effects! How about stripping off their RFI shielding to increase the sound effect intensity? c(-; (This version of PSPyro is the latest reworked version with ||ugh Daniel's colorized hacks added, set for an outrageous number of explosions!) -Don #! /usr/NeWS/bin/psh % % Date: Tue, 27 Jun 89 12:29:26 EDT % From: alexis%yummy@gateway.mitre.org % To: NeWS-makers@brillig.umd.edu % Subject: Another rework of the psPyro % % Yet another remake/tweek of the psPyro program, making it more % worthy of a workstation (read as "it sucks us cpu cycles"). This % version has lots of colors, more interesting explosions, more than % one firecracker in the air at once (I have it set to 3, but it's % just a variable), and general tweeking (they fly faster, explode % slower, etc). This just assumes you're running on a color machine. % % alexis wieland % alexis%yummy@gateway.mitre.org % % --------------------------- cut here ---------------------- % % psPyro, a user extensible fireworks display screen saver. % % % Physical screen dimensions ------------------------------------------ % /screen_width 0 def /screen_height 0 def % % Heuristics for firework creation and display (user configurable) ---- % /unusable_screen_width 0.1 def % set to percent of physical screen width /unusable_screen_height 0.1 def % set to percent of physical screen height /minimum_trail_height 0.75 def % set to percent of physical screen height /minimum_explosion_angle 100 def /maximum_explosion_angle 150 def /minimum_#_explosions 10 def /maximum_#_explosions 20 def /trail_length 5 def % the length of the firework trail /n-in-air-at-once 7 def % number of fireworks at any time /multiple_explosion_radius 200 def % radius of multiple explosions from original %% For Color systems use this /setacolor { % num -> - { 0 { 0 setgray } 1 { random random random setrgbcolor } 2 { 1 .1 0 setrgbcolor } % Red Rocket trail 3 { .86 .86 0 setrgbcolor } % Yellow ground flash /Default { random random random setrgbcolor } } case } def %% For Technicolor displays that dont fade from memory! %% Note: It would help to clear the display now and then. %% Just uncomment the next three lines. /setacolor { % num -> - pop random random random setrgbcolor } def %% For Black & White (Monocrome machines) uncomment the next 7 lines %/setacolor { % num -> - % { % 0 { 0 setgray } % 1 2 3 { 1 setgray } % /Default { random setgray } % } case %} def /colortable [ 1 1 1 rgbcolor 1 0 0 rgbcolor 0 1 0 rgbcolor 0 0 1 rgbcolor 1 1 0 rgbcolor 0 1 1 rgbcolor 1 .5 0 rgbcolor 1 0 .5 rgbcolor .8 .5 .2 rgbcolor .92 .68 .92 rgbcolor .86 .44 .86 rgbcolor ] def % randomly set color /randcolor { colortable random colortable length 1 sub mul floor get setcolor } def % % Firework explosion definitions % % array to keep the names of the different explosions in /explosion_kinds [ /dots_explosion /circle_explosion /star_explosion /colored_circle_explosion ] def % % Dots explosion. /draw_one_quarter { 30 0 moveto 2 -2 rlineto 2 2 rlineto -2 2 rlineto closepath fill 20 10 3 3 rectpath fill 10 20 3 3 rectpath fill } def /dots_explosion { % x y => - gsave translate 360 random mul rotate 8 random mul cvi 2 add .5 random add dup scale gsave 5 { randcolor dup { draw_one_quarter 360 1 index div rotate } repeat 1.3 1.3 scale big_delay } repeat grestore gsave 5 { 0 setacolor dup { draw_one_quarter 360 1 index div rotate } repeat 1.3 1.3 scale big_delay } repeat pop grestore grestore } def % dots_explosion % % Circle explosion. % /draw_circle { % - => - 0 0 10 0 360 arc stroke } def /circle_explosion { % x y => - gsave translate .5 random add dup scale gsave 6 { 1.4 dup scale randcolor big_delay draw_circle } repeat grestore gsave 6 { 1.4 dup scale 0 setacolor big_delay draw_circle } repeat grestore grestore } def % % Star explosion. % /draw_star { % n-lines => n-lines gsave dup { -30 0 moveto 60 0 rlineto stroke 360 1 index div rotate } repeat grestore } def /star_explosion { % x y => - gsave translate .5 random add dup scale 360 random mul rotate 10 random mul 4 add gsave 4 { 1.4 dup scale randcolor big_delay draw_star } repeat grestore gsave 4 { 1.4 dup scale 0 setacolor big_delay draw_star } repeat grestore pop grestore } def % % Colored circle explosion. % /draw_dot { % - => - 0 0 10 0 360 arc fill } def /colored_circle_explosion { % x y => - gsave translate .5 random add dup scale gsave 10 { 1.2 dup scale randcolor big_delay draw_dot } repeat 0 setacolor big_delay big_delay draw_dot grestore grestore } def % % Support utilities --------------------------------------------------- % % % Delay loops. % /big_delay { 1 2048 div sleep } def % % Draw one instance of a firework trail from: % angle to angle % theta theta + trail_length - 1 % /draw_trail { % theta => - /theta exch def % erase the first degree from the previous trail 0 setacolor 0 0 1 theta 1 sub theta newpath arc stroke 1 setacolor theta 1 theta trail_length add 1 sub { 0 0 1 4 -1 roll dup 1 add newpath arc stroke } for } def % % Animate the entire firework trail up until the explosion. % /animate_trail { % - => - % draw the first trail instance 1 setacolor 0 1 trail_length 1 sub { 0 0 1 4 -1 roll dup 1 add newpath arc stroke } for % draw the rest of the trail 1 1 explosion_angle { draw_trail pause } for % remove the last trail instance 0 setacolor explosion_angle 1 explosion_angle trail_length add 1 sub { 0 0 1 4 -1 roll dup 1 add newpath arc stroke } for } def % % Determine the characterictics of the next firework. % /determine_firework_characteristics { % - => - % randomly pick the starting position to fire the firework from /trail_start_x screen_width random mul store % % pick the direction of the firework trail % % if the picked starting position is too close to a screen % edge, force the direction to be towards the opposite screen % side, otherwise randomly pick the direction % trail_start_x unusable_screen_width le { /trail_going_left? false store } { trail_start_x screen_width unusable_screen_width sub ge { /trail_going_left? true store } { % randomly pick the direction /trail_going_left? random round 0 eq store } ifelse } ifelse % randomly pick the width of the firework trail trail_going_left? { /trail_width trail_start_x random mul store } { /trail_width screen_width trail_start_x sub random mul store } ifelse % randomly pick the height of the firework trail /trail_height screen_height random mul store trail_height minimum_trail_height le { /trail_height minimum_trail_height store } if % randomly pick the ending angle of the firework explosion /explosion_angle maximum_explosion_angle minimum_explosion_angle sub random mul minimum_explosion_angle add round store } def % % Animate a firework explosion. % /animate_explosion { % explosion_x explosion_y #explosions => - /#explosions exch store /explosion_y exch store /explosion_x exch store % randomly pick which explosion to use /which_explosion explosion_kinds explosion_kinds length random mul floor get def % explode the first of the explosions explosion_x explosion_y which_explosion cvx exec % explode the remaining number of explosions (possible none), % randomly picking each location based upon the initial explosion % location #explosions 1 sub { % randomly pick another explosion location 360 random mul dup cos multiple_explosion_radius mul explosion_x add exch sin multiple_explosion_radius mul explosion_y add which_explosion cvx exec } repeat } def /do-it { gsave /trail_width 0 def /trail_height 0 def /trail_start_x 0 def /trail_going_left? true def /explosion_angle 0 def /#explosions null store /explosion_y null store /explosion_x null store /which_explosion null store initmatrix sky setcanvas % create a new firework determine_firework_characteristics % translate to the center of the firework trail arc trail_start_x unusable_screen_width add trail_width 2 div trail_going_left? { sub } { add } ifelse 0 translate trail_going_left? not { -1 1 scale } if % create the firing of the firework randcolor trail_width 2 div 0 20 0 180 arc fill 3 { big_delay } repeat 0 setacolor trail_width 2 div 0 20 0 180 arc fill % create the firework trail trail_width 2 div trail_height scale animate_trail % calculate the location of the firework explosion initmatrix trail_start_x unusable_screen_width add trail_width 2 div trail_going_left? { sub } { add } ifelse explosion_angle trail_length add cos trail_width 2 div mul trail_going_left? { add } { sub } ifelse explosion_angle trail_length add sin trail_height mul % calculate the number of explosions for the firework maximum_#_explosions random mul round minimum_#_explosions max % create the explosion! animate_explosion grestore } def % % Continually make fireworks. % /make_fireworks { % - => - { n-in-air-at-once { { 32 dict begin { do-it } loop end } fork } repeat } fork } def % % Main ---------------------------------------------------------- % % get the dimensions of the physical screen clippath pathbbox /screen_height exch def /screen_width exch def clear % calculate the actual values of the firework creation and display heuristics /unusable_screen_width screen_width unusable_screen_width mul def /unusable_screen_height screen_height unusable_screen_height mul def /minimum_trail_height screen_height minimum_trail_height mul def % calculate the usable screen area /screen_height screen_height unusable_screen_height sub def /screen_width screen_width unusable_screen_width dup add sub def % create the black sky clippath pathbbox rectpath /sky framebuffer newcanvas def sky reshapecanvas sky /Mapped true put sky setcanvas 0 fillcanvas % remove the cursor /nouse /nouse_m sky setstandardcursor % start the fireworks display make_fireworks % wait for a mouse movement or click to end the fireworks display createevent dup begin /Name [ /LeftMouseButton /MiddleMouseButton /RightMouseButton /MouseDragged ] def /Canvas sky def end expressinterest awaitevent currentprocess killprocessgroup From don Sat Jan 27 21:46:39 1990 Date: Sat, 27 Jan 90 21:46:39 -0500 To: NeWS-makers@brillig.umd.edu Subject: SUN 3/60C GX performance From: George Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) does a GX upgrade to a SUN 3/60C alter any performance of either NeWS1.1 or X11/NeWS. i've been told that it will effect OpenWindows in general. is this correct? any one any experience on this matter. perhaps it may be better to upgrade the 3/60 to a sparc (SS1) instead? -GeO George Travan University of Adelaide Box 498 G.P.O Adelaide,AUSTRALIA e_mail: george@frodo.ua.oz.au From don Sat Jan 27 21:46:48 1990 Date: Sat, 27 Jan 90 21:46:48 -0500 To: NeWS-makers@brillig.umd.edu Subject: slight pspyro enhancement From: crdgw1!montnaro@uunet.uu.net (Skip Montanaro) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) It seems to me that if pspyro is supposed to be a screen saver, it ought to blank the screen occasionally. Here's a simpleminded little addition to pspyro to blank the screen occasionally. Doubtless there are more elegant ways to do it that don't cut off fireworks in midstream and that leave the screen totally blank for a period of time... *** pspyro.ps~ Wed Jan 24 00:16:09 1990 --- pspyro.ps Thu Jan 25 10:21:02 1990 *************** *** 28,31 **** --- 28,37 ---- % + % sleep time between screen clears (in minutes) + % + + /sleep-time 1 def + + % % Heuristics for firework creation and display (user configurable) ---- % *************** *** 41,45 **** /trail_length 5 def % the length of the firework trail ! /n-in-air-at-once 7 def % number of fireworks at any time /multiple_explosion_radius 200 def % radius of multiple explosions from original --- 47,51 ---- /trail_length 5 def % the length of the firework trail ! /n-in-air-at-once 4 def % number of fireworks at any time /multiple_explosion_radius 200 def % radius of multiple explosions from original *************** *** 445,448 **** --- 451,465 ---- } repeat } fork + + { + + { + sleep-time sleep + sky setcanvas + 0 fillcanvas + } loop + + } fork + } def -- Skip (montanaro@crdgw1.ge.com) From don Sat Jan 27 21:47:36 1990 Date: Sat, 27 Jan 90 21:47:36 -0500 To: NeWS-makers@brillig.umd.edu Subject: NeWSbin support - what is it? From: Steve Platt Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) Ever since we got NeWS 1.1 (for sun3) we have had "NeWSbin" on our software support contract - being assured that this meant we'd get NeWS 2.0 as soon as it comes out. SUN seems now to have shifted attention to OPenWindOWs (or is it openlook or sunview2 or xview or whatever). Worse still, they say we must buy OpenWindows to get a copy of NeWS for our new sun4/60s; which is of course probably X11/NeWS, or whatever. No-one in SUN UK seems to understand exactly what our software upgrade service is ever going to provide us with - can anyone clarify what SUN is/will-be doing with NeWS? Has anyone got anything out of a NeWSbin contract? From don Sat Jan 27 21:48:02 1990 Date: Sat, 27 Jan 90 21:48:02 -0500 To: NeWS-makers@brillig.umd.edu Subject: Please help me convert file.ps to file.epsf From: mojo!news@mimsy.umd.edu (Russ Byrne) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) I'm using a Silicon Graphics IRIS 4D running IRIX 3.2. This is a NeWS machine, and there are tools for dumping the current graphics screen to a PostScript file (/usr/people/4Dgifts/iristools/imgtools/snapshot, and .../tops). I'm going to include these as figures in a large document that I'm creating with TEXTURES (TeX + picTURES) on the Mac. Although TEXTURES can handle raw PostScript files, it's exciting to see where the figure will end up. Encapsulated PostScript Files are much better behaved. I've got TeX code that will search the .epsf file for the %%BoundingBox comment, and set aside an appropriate amount of space. (This is from a NeXT machine, and is available to the requestor.) My question is: How do I create an Encapsulated PostScript File from a raw one? (The file uses the image operator.) I really only need the BoundingBox info. At my disposal are the Silicon Graphics gl, or Graphics Library, the PostScript Shell, which is connected to a NeWS server, and of course, C and csh. Any help would be most appreciated. If I get anything working, I'll post the solution. Thanks, < rb -- Russ Byrne, ST Systems Corp. | Garry Shandling: Voice: (301) 286-4461 [NASA/GSFC] | "I'm too shy to express my BIND: byrne@ra.src.umd.edu | sexual needs except over the UUCP: {uunet,seismo}!ra.src.umd.edu!byrne | phone to people I don't know." From don Sun Jan 28 13:10:30 1990 Date: Sun, 28 Jan 90 13:10:30 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: NeWSbin support - what is it? From: Kemp@DOCKMASTER.ARPA Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) > can anyone clarify what SUN is/will-be doing with NeWS? At the OpenWindows Open House / BOF session at Uniforum, the question was raised, but not answered by Sun. The closest I heard to an answer from Warren Teitelman (sp?) was that Sun had put a great deal of effort into the X side of X11/NeWS. (The implication being that the NeWS half was not getting much attention). He began his talk with a joke about being involved vs. committed to Open Windows: "When you have ham and eggs for breakfast, the chicken is involved, but the pig is committed". With respect to NeWS, it sounds like Sun is more in the position of the chicken. Dave Kemp From don Mon Jan 29 11:41:56 1990 Date: Mon, 29 Jan 90 11:41:56 -0500 To: NeWS-makers@brillig.umd.edu Subject: Op Stack & Dict Tracker From: swrinde!cs.utexas.edu!sun-barr!newstop!dreams!rbogen@ucsd.edu (Richard Bogen) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) Enclosed is a new improved version of Tracker which visually displays the contents of the operand stack and/or current dictionary. Whereas the previous version updated the display once/second, this version only updates when the return key is struck. It also no longer frames the object with a rectangle, nor centers it...... HAVE FUN.... %The following procedures display the contents of the operand stack or %user dictionary for some interactive psh process. This file should %be loaded into a psh and then the routines invoked with two parameters, %the x & y location of the top left of a bounding rectangle for the %display of the items. The contents of the display are updated every %second. For example, 800 600 trackstack => process(..) object % % Author: Richard A. Bogen - Sun Microsystems, Inc. - 1990 % /trackstack {% x y => process. Displays contents of parent's operand stack. 2 copy 5 add moveto (OPERAND STACK) show {/OperandStack get} {100 string cvs} showobj} def /trackdict {% x y => process. Display contents of parent's userdict. 2 copy 5 add moveto (CURRENT DICTIONARY) show {/DictionaryStack get dup length 1 sub get} {exch 100 string cvs ( : ) append exch 100 string cvs append} showobj} def /showobj {% common routine for Operand Stack or Dictionary display 10 dict begin /makestring exch def %converts item to a sting /getobj exch def %obtains object to be displayed %First compute dimensions of items to be displayed /y0 exch def /x exch def %assumes (M) is the widest character in current font (M) stringbbox 30 mul /wide exch def 2 add /high exch def %allow 2 units between each line pop pop /parent currentprocess def %Now fork off a process to do the displaying { createevent dup begin /Action /UpTransition def /Name 28505 def end expressinterest {awaitevent pop parent /State get /zombie eq {currentcolor fillcanvas exit} if wide parent getobj length high mul dup neg y0 add /y exch def x y moveto rect 0 setgray %display in black extenddamage % causes repaint parent getobj { x y moveto makestring show /y y high add def } forall } loop } fork end} def From don Tue Jan 30 00:11:27 1990 Date: Tue, 30 Jan 90 00:11:27 -0500 To: NeWS-makers@brillig.umd.edu Subject: Trouble starting OpenWindows From: dennis!dennis@boulder.colorado.edu Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) From: dennis@dennis.colorado.edu () Subject: Trouble starting up OpenWindows Expires: Sender: Followup-To: Organization: University of Colorado, Boulder Keywords: I seem to be having trouble getting OpenWindows to start up. As near as I can tell, I am running a completely vanilla version on a Sun 3/60 under OS 4.0.1. The problem is illustrated at the end of the following transcript. For some reason, SubClassResponsibility is getting executed. I expect that the problem has an obvious solution, but I cannot see it. -Dennis Heimbigner (dennis@boulder.colorado.edu) Script started on Mon Jan 29 12:28:12 1990 dennis.2[1]: doxv setenv OPENWINHOME /eprince/scratch1/jones/ow setenv LD_LIBRARY_PATH /eprince/scratch1/jones/ow/lib:/usr/lib set path= ( /eprince/scratch1/jones/ow/{bin,bin/xview,demo} . /piper/staff/dennis/bin/sun3 /piper/staff/dennis/bin/scripts /usr/ucb /bin /usr/bin /usr/new /usr/local/bin /usr/hosts /usr/new/mh /cs/tools/VADS5.5/bin /moet/staff1/arcadia/exodus/bin /cs/tools/IDE/bin/sun3 /cs/tools/X/X11R4/sun3/bin ) setenv FRAMEBUFFER /dev/bwtwo1 setenv NEWSONLY 1 setenv NOSXSEL 1 setenv NOPSWM 1 printenv HOME=/piper/staff/dennis SHELL=/bin/csh TERM=sun USER=dennis PATH=/eprince/scratch1/jones/ow/bin:/eprince/scratch1/jones/ow/bin/xview:/eprince/scratch1/jones/ow/demo:.:/piper/staff/dennis/bin/sun3:/piper/staff/dennis/bin/scripts:/usr/ucb:/bin:/usr/bin:/usr/new:/usr/local/bin:/usr/hosts:/usr/new/mh:/cs/tools/VADS5.5/bin:/moet/staff1/arcadia/exodus/bin:/cs/tools/IDE/bin/sun3:/cs/tools/X/X11R4/sun3/bin LOGNAME=dennis PWD=/piper/staff/dennis HOMEHOST=dennis HOSTNAME=dennis MACHINETYPE=sun3 MANUFACTURER=sun TERMCAP=Mu|sun:li#34:co#80:cl=^L:cm=\E[%i%d;%dH:nd=\E[C:up=\E[A:am:bs:mi:ms:pt:ce=\E[K:cd=\E[J:so=\E[7m:se=\E[m:kd=\E[B:kl=\E[D:ku=\E[A:kr=\E[C:kh=\E[H:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:al=\E[L:dl=\E[M:im=:ei=:ic=\E[@:dc=\E[P:AL=\E[%dL:DL=\E[%dM: term=sun EXINIT=set shell=/bin/csh redraw sm ToolInfo=/anchor/tools/IDE/ToolInfo EDITOR=emacs PRINTER=srl XVERSION=X11R4 XDIRECTORY=/cs/tools/X/X11R4 XBINARIES=/cs/tools/X/X11R4/sun3/bin XFONTDIR=/cs/tools/X/X11R4/sun3/lib/X11/fonts EPATH=:/piper/staff/dennis/lib/emacslib:/usr/new/lib/emacs/lisp FRAMEBUFFER=/dev/bwtwo1 WINDOW_PARENT=/dev/win0 DEFAULT_FONT=/usr/lib/fonts/fixedwidthfonts/serif.r.16 WMGR_ENV_PLACEHOLDER=/dev/win1 WINDOW_ME=/dev/win16 WINDOW_GFX=/dev/win16 SHELLDEPTH=3 OPENWINHOME=/eprince/scratch1/jones/ow LD_LIBRARY_PATH=/eprince/scratch1/jones/ow/lib:/usr/lib NEWSONLY=1 NOSXSEL=1 NOPSWM=1 /eprince/scratch1/jones/ow/bin/xnews [1] 3278 sleep 20 adjacentscreens /dev/cgfour0 -l /dev/bwtwo1 echo go go wait Process: 0x1651bc (Unnamed process) Error: undefined Stack: /InstallUI /ClassOLUI vm('Shared VM') true false (NeWS/NDE/OLUI.ps) marker Executing: NotDefined At: {*NotDefined} In: {*SubClassResponsibility} In: {... 'def' FunctionKeys KeyCode self 'put' *ClientSubclassingAllowed} In: {*newinit self} In: {newobject packedarray{2} 'exch' *`send'} In: {/new dictionary[24/5000] *`supersend'} In: {... 'if' 'dup' 'null' 'ne' packedarray{3} *'if'} In: {/AgainKey /ViewAgain /new ClassOLFunctionKey *`send' 'def' /deactivate packedarray{7} /installmethod AgainKey `send' /CopyKey ...} In: Reading file('NeWS/NDE/OLUI.ps',R) ^Cdennis.2[2]: script done on Mon Jan 29 12:29:24 1990 From don Tue Jan 30 00:11:42 1990 Date: Tue, 30 Jan 90 00:11:42 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: Please help me convert file.ps to file.epsf From: sgi!shinobu!odin!ramoth.esd.sgi.com!msc@ucbvax.Berkeley.EDU (Mark Callow) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) In article <1990Jan26.013652.2884@eng.umd.edu>, byrne@ra.src.umd.edu (Russ Byrne) writes: > Encapsulated PostScript Files are much better behaved. I've got TeX > code that will search the .epsf file for the %%BoundingBox comment, and > set aside an appropriate amount of space. (This is from a NeXT machine, > and is available to the requestor.) > > My question is: How do I create an Encapsulated PostScript File from a > raw one? > EPSF files consist simply of a special header and some special comments of which %%BoundingBox is the most important. You can modify tops (the source is in 4Dgifts) to add the appropriate lines to its output. I don't know how to determine what the bounding box should be from the data given to the image operator. -- From the TARDIS of Mark Callow msc@ramoth.sgi.com, ...{ames,decwrl}!sgi!msc "There is much virtue in a window. It is to a human being as a frame is to a painting, as a proscenium to a play. It strongly defines its content." From don Tue Jan 30 00:12:24 1990 Date: Tue, 30 Jan 90 00:12:24 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: NeWSbin support - what is it? From: rogern@Sun.COM (Roger Nolan) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) It sounds like there has been a misunderstanding here. The Uniforum BOF did focus on X, and rightly so, because OpenWindows 1.0 is primarily an X development environment. If Warren's comments seemed focused on X, it was for this reason. OpenWindows 1.0 features the XView (X Windows) toolkit and the X11/NeWS window server. X Windows is the only networked windows development environment (toolkit & server) that Sun is offering at the present time. This does not imply a lack of commitment to NeWS. It is just that at this time Sun is only shipping an "experimental" NeWS toolkit. More work is being done in this area and you should expect to see future products from Sun based on the NeWS technology. There were some statements made about the future on NeWS at the end of the BOF. You may have left by then. Hope this helps. Roger Nolan Sun Microsystems Windows Product Marketing From NeWS-makers-request@cs.UMD.EDU Sun Jan 28 12:47:00 1990 Date: Sun, 28 Jan 90 13:10:30 -0500 Subject: Re: NeWSbin support - what is it? From: Kemp@DOCKMASTER.ARPA Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) > can anyone clarify what SUN is/will-be doing with NeWS? At the OpenWindows Open House / BOF session at Uniforum, the question was raised, but not answered by Sun. The closest I heard to an answer from Warren Teitelman (sp?) was that Sun had put a great deal of effort into the X side of X11/NeWS. (The implication being that the NeWS half was not getting much attention). He began his talk with a joke about being involved vs. committed to Open Windows: "When you have ham and eggs for breakfast, the chicken is involved, but the pig is committed". With respect to NeWS, it sounds like Sun is more in the position of the chicken. Dave Kemp From don Wed Jan 31 11:48:37 1990 Date: Wed, 31 Jan 90 11:48:37 -0500 To: NeWS-makers@brillig.umd.edu Subject: Using Sun's news archive server From: wuarchive!usc!zaphod.mps.ohio-state.edu!uakari.primate.wisc.edu!caesar.cs.montana.edu!milton!oregon!cs.uoregon.edu!news@decwrl.dec.com (B. Robert Helm) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) We have been unable to retrieve Sun files from the NeWS archive server at sun.com. Our mail reaches the archive (news-archive@sun.com), and we get replies and acknowledgements back. We have also received several index files we have requested. What we can't get are the actual source program files the server purports to contain. Following sun's instructions, I have sent messages requesting files by placing lines like the following in the subject header and body of the message: send Toolkit codebook.ps send Toolkit pswin The directory names come from the archive index. The file names stem from the index of the individual directory. I have also tried the following variations: send Toolkit/codebook.ps send toolkit codebook.ps The server seems to know which files I'm talking about. Its acknowledgements consistently report the same file sizes for transfer. The files which arrive, however, are invariably empty or skeletal .shar files. In absence of documentation for the NeWS 2.0 tNt toolkit, this service is essential to development at our site. Has anybody else had this problem with the news-archive mail server, and found a fix? Rob Helm (bhelm@cs.uoregon.edu) The opinions in this post are solely those of the author. From don Wed Jan 31 11:49:59 1990 Date: Wed, 31 Jan 90 11:49:59 -0500 To: NeWS-makers@brillig.umd.edu Subject: Abstracting the Windowing System Interface From: voder!pyramid!leadsv!esl!esl.ESL.COM!bruce@ucbvax.Berkeley.EDU (Bruce McKenzie) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) I am part of a project that is defining an application/MMI architecture for some projects at our company. In order to provide a migration path for the graphics back-end of the system (i.e. graphics hardware and X server), we have decided to generate and use a "Windowing System Interface Layer" so that the graphics front-end may be ported by changing one layer and not requiring a complete rewrite of the MMI and application code. We have a decent base of software that uses X, so one proposal is to write skins around the X calls, and make any future windowing system look like X. This will allow quick porting of existing code. I realize that the next question will provoke a flame-fest about "NIH" and the design goals of X, but I've got manager-types who don't want to be "locked in" to any given standard. Question: Does anyone know of, or have references to, a study about the generation of this type of interface layer? Question: Does the X paradigm lock us out of any current or planned windowing systems (e.g. DPS)? Incidentally, most of this software is in or will be in Ada. We are currently using an X-to-Ada binding. Thank you for your time. -------------------------------------------------------------------- No, your car has too many wheels! Bruce McKenzie (Trihawk owner) "Here I am, brain the size of a planet...." -- Marvin ------------------------------------------------------------------- From don Wed Jan 31 11:51:06 1990 Date: Wed, 31 Jan 90 11:51:06 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: CHI '90 Advance Program From: microsoft!bruceb@uunet.uu.net (Bruce BURGER) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) > TUTORIALS: Sunday & Monday, April 1-2 > environments and toolkits, and special topics. For an email > description of the workshops, write MEADS.CHI@XEROX.COM. Can someone post the tutorial schedule to this group? I'm sure lots of people would be interested. Thanks. From don Fri Feb 2 03:02:57 1990 Date: Fri, 2 Feb 90 03:02:57 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: Life for old SUN3/50s as X-terminals? From: pdn!dinsdale!reggie@uunet.uu.net (George W. Leach) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) In article <10923@etana.tut.fi> pl@etana.tut.fi (Lehtinen Pertti) writes: >From article <7731@cbnewsh.ATT.COM>, by rac1@cbnewsh.ATT.COM (robert.a.clark): >> Has anyone tried converting a SUN3/50 from a UNIX workstation into a >> X-terminal? I think that it is feasible, but would take some work. We > We have thought that also, but lack of information about > innards of workstation causes some problems. At the Summer USENIX Conference in Baltimore this past June, John Gilmore of the Grasshopper Group indicated that they were working on a minimal kernal for the Sun 3/50 in order for it to be used as a NeWS server/terminal. This was at the NeWS (or was it X11/NeWS?) BOF. I forget the details. If they were going to support the X11/NeWS mergered server, then this will help you. > Also nobody around here seems to be interested to finance > such projects. Sun was funding the work by Grasshopper. Perhaps John or one of the other Grasshopper Group folks would like to comment upon this? George W. Leach AT&T Paradyne (uunet|att)!pdn!reggie Mail stop LG-133 Phone: 1-813-530-2376 P.O. Box 2826 FAX: 1-813-530-8224 Largo, FL 34649-2826 USA From don Fri Feb 2 03:03:18 1990 Date: Fri, 2 Feb 90 03:03:18 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: Using Sun's news archive server From: corvair!bradam@sun.com (Brad Martinson) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) In article <1990Jan30.172950.23634@cs.uoregon.edu> bhelm@cs.uoregon.edu (B. Robert Helm) writes: >We have been unable to retrieve Sun files from the NeWS archive server at >sun.com. Our mail reaches the archive (news-archive@sun.com), and we >get replies and acknowledgements back. We have also received several >index files we have requested. What we can't get are the actual source >program files the server purports to contain. > The Tookit subdirectory of the NeWS Archive is all better now. It seems someone (okay, it was me) forgot to set the permissions of the files to allow group and others to access them... I've tested it and the files all come back as they should. Sorry for the grief that any of you went through trying to get the stuff. > >Rob Helm (bhelm@cs.uoregon.edu) > >The opinions in this post are solely those of the author. ======================================================================== Brad Martinson Sun Microsystems bmartinson@sun.com #include ======================================================================== From don Fri Feb 2 17:54:26 1990 Date: Fri, 2 Feb 90 17:54:26 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: CHI '90 Advance Program From: bnrgate!bnr-fos!bmers58!bmers11!armstron@uunet.uu.net (Steve Armstrong) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) In article <10410@microsoft.UUCP> bruceb@microsoft.UUCP (Bruce BURGER) writes: >> TUTORIALS: Sunday & Monday, April 1-2 >> environments and toolkits, and special topics. For an email >> description of the workshops, write MEADS.CHI@XEROX.COM. > >Can someone post the tutorial schedule to this group? I'm sure lots of >people would be interested. Thanks. I think this was originally posted sometime in November of last year, but here it is again for those who are interested. CHI'90 TUTORIALS PROGRAM CHI '90 (the seventh annual Conference on Human Factors and Computing Systems) will be held in Seattle, Washington, from April 1st to 5th, 1990. The theme of CHI '90 is Empowering People: facilitating their work and communications, improving their effectiveness and productivity. The conference will have technical papers, panel sessions, tutorials, interactive posters, interactive performances, workshops, videos, laboratory reviews, formal and hands-on demonstrations, and exhibits. A key feature of the annual CHI conference is the tutorials program, which has been expanded for the 1990 conference in response to requests from applications developers. "The CHI '90 tutorials program includes a new set of tutorials designed specifically for developers working on direct manipulation and the new windowing systems," says Dr. Wendy Kellogg, Tutorials Program Chair for CHI '90. "Successful application of these technologies requires an understanding of human factors issues underlying user interactions." A brief description of each tutorial is included below. To receive an advance program, which provides full details on each tutorial and conference registration, please contact the conference executive administrator, Toni MacHaffie, by: EMAIL: machaffie.chi@xerox.com MAIL: CHI '90, P.O. Box 5847, Beaverton, OR 97006-5847 PHONE: (503) 591-1981 FAX: (503) 642-3934 Advance programs will be mailed on January 1st, 1990 ----------------------------------------------------------------------- Tutorial #1 (Full day, Sunday, April 1, 1990) User-Computer Interface Design John L. Sibert and James D. Foley The George Washington University This course presents a top-down design methodology for user-computer interfaces, including requirements definition, conceptual design, functional design, and dialogue design. The emphasis is on graphically- oriented dialogue styles: matters such as screen layout, use of icons, and graphical interaction devices, techniques, and feedback are discussed. ------------------------------------------------------------------------ Tutorial #2 (Full day, Sunday, April 1, 1990) Advanced Methods for User Interface Design: Applications, Tools, and Survival Techniques Tyler Blake Intuitive Software and Interactive Systems, Inc. and California State University, Northridge This course investigates state-of-the-art techniques for producing quality user interface designs in each of three major areas: conceptual design, technical implmentation and organization support. A series of methodologies for increasing the precision, productivity, creativity, and practicality of the user interface design process is examined. ---------------------------------------------------------------------- Tutorial #3 (Full day, Sunday, April 1, 1990) Graphical Invention for User Interfaces Bill Verplank ID TWO Product Design Consultants Introduces new strategies for graphical invention with principles, processes, examples and short exercises. Topics addressed include visual brainstorming, idea sketching, conceptual models and mental maps (imageability), graphic facilitation, and uses of metaphor in interface design. ------------------------------------------------------------------------ Tutorial #4 (Full day, Sunday, April 1, 1990) The Use of Non-Speech Audio at the Interface Bill Buxton, University of Toronto Bill Gaver, Rank Xerox Cambridge EuroPARC Sara Bly, Xerox PARC Human-computer interaction can be significantly enhanced through better use of the audio channel. The focus of this course is on an especially neglected aspect of sound: the use of non-speech audio to communicate information from the computer to the user. The course will provide the historical, theoretical, and practical background that will enable participants to "tool up" to undertake such work. ------------------------------------------------------------------------- Tutorial #5 (Full day, Sunday, April 1, 1990) Concepts of Object Oriented Programming Dave N. Smith, IBM Watson Research Center This course introduces object-oriented programming to those familiar with procedural languages, starting with the simplest possible objects and adding concepts one by one, illustrating each step with examples from one object-oriented language (Smalltalk). Content covers what an object is, sending messages to objects, methods, introduction to Smalltalk, kinds of message sends, classes, instances, class methods, hierarchy of classes, self and super, and abstract classes. ------------------------------------------------------------------------- Tutorial #6 (Full day, Sunday, April 1, 1990) Direct Manipulation Design Studio Eliot Tarlin, Digital Equipment Corporation The most complex design problem within a direct manipulation style interface is consistently the dialog box. This course provides an in-depth review of a case study of converting a command line interface to a direct manipulation interface, and engages students in collaborative design exercises and a studio critique to reveal and address issues and tradeoffs confronted within dialog box design. ------------------------------------------------------------------------- Tutorial #8 (Full day, Sunday, April 1, 1990) Designing Phone-Based Interfaces Richard Halstead-Nussloch, IBM Corporation Michael DiAngelo, IBM Corporation James Kondziela, NYNEX, Inc. Phones are potentially convenient workstations to a wide range of computer services, but turning this potential into a reality represents a challenging opportunity for user interface designers. This course will cover PBI technology, identify opportunities for applying PBIs, choosing appropriate PBI dialogue flow, and elements of PBI design. In a design studio portion of the course, participants will design and critique a PBI. ------------------------------------------------------------------------ Tutorial #9 (Half day, Sunday Morning, April 1, 1990) Introduction to Hypertext and Hypermedia Jakob Nielsen, Technical University of Denmark This introductory course defines and surveys existing hypertext and hypermedia systems. User interface issues, problems in navigating large information spaces, and empirical tests of the usability of hypermedia systems and documents are discussed. ------------------------------------------------------------------------- Tutorial #10 (Half day, Sunday Morning, April 1, 1990) Designing Minimalist instruction for practical computer skill John M. Carroll and Mary Beth Rosson IBM Watson Research Center Designers of instruction for practical skills must address the paradox of sensemaking: people need to make sense of a situation in order to learn from it, but at the same time need to learn about new situations before they can make sense of them. This course describes the Minimalist instructional model, developed to address the paradox of sensemaking and the failures of traditional approaches to user training. Design objectives for writing Minimalist instruction and a review of several examples will be given. ------------------------------------------------------------------------ Tutorial #11 (Half day, Sunday Morning, April 1, 1990) Applications Programming with the X Toolkit Douglas Young, Hewlett-Packard Laboratories This course introduces the X toolkit, a standard high-level toolkit for writing applications with the X windows system. Content includes the architecture of the Xt intrinsics, how to structure and write X-based applications, and examples of creating user interfaces with user interface components known as widgets. ------------------------------------------------------------------------- Tutorial #12 (Half day, Sunday Morning, April 1, 1990) Questionnaire Design Studio Marilyn Mantei, University of Toronto Questionnaires do not automatically obtain the data its distributors expect to get. This course details how to develop valid and reliable questionnaires for user evaluation studies, user acceptance studies, and assessments of work practices and user attitudes. Content includes avoiding common biases built into questions, judging the trustworthiness of data from other questionnaires, and practice generating questions. ---------------------------------------------------------------------- Tutorial #13 (Half day, Sunday Morning, April 1, 1990) Copyright Protection for Software and User Interfaces Pamela Samuelson, Emory University Intellectual property issues have become important for software developers with the increase in decided and pending cases. In this tutorial, copyright issues affecting user interface design and other aspects of software will be addressed. Content includes reviews of copyright law, its specific application to software, decided cases, and issues and arguments of pending cases. --------------------------------------------------------------------- Tutorial #14 (Half day, Sunday Afternoon, April 1, 1990) Patent and Unfair Competition Protection for Software and User Interfaces Pamela Samuelson, Emory University This tutorial focuses on patent law developments affecting user interface design and software in general, and introduces concepts of unfair competition law as it might affect software developers. Content includes an overview of the patent system, a review of recent software user interface patents, discussions of the patentability of software innovations, design patent law, and the law of unfair competition, trademark, and trade dress protection. -------------------------------------------------------------------- Tutorial #15 (Half day, Sunday Afternoon, April 1, 1990) Software Design as Commuication Design Paul Heckel, QuickView Systems Heckel presents a unique perspective of software design as a communications craft. The course details the implications of viewing software as a communication medium like writing, film, or theatre, emphasizing ways of thinking and communication techniques that transcend specific media. Over thirty communication techniques are described, each with examples in software. -------------------------------------------------------------------- Tutorial #16 (Half day, Sunday Afternoon, April 1, 1990 OSF/Motif: Features and Functionality Ellis Cohen, Open Software Foundation This course describes OSF/Motif, including the Motif toolkit, user interface language, window manager, and style guide. A knowledge of X11 and the Xt intrinsics is helpful, but not necessary or required. ------------------------------------------------------------------------- Tutorial #17 (Half day, Sunday Afternoon, April 1, 1990) Desktop Computer Animation Patricia Harrison and Daniel Sadowski Harrison Sadowski and Associates Creating rich, animated visuals is no longer limited to those with access to high-end workstations. This course explains animation techniques and surveys currently available desktop animation products. Extensive examples are shown, and the complete process of developing an animation sequence will be demonstrated. ------------------------------------------------------------------------- Tutorial #18 (Half day, Sunday Afternoon, April 1, 1990) Turning Text into Hypertext Robert J. Glushko, Search Technology, Inc. An intermediate course which introduces methods for analyzing and converting existing documents into hypertext documents. User interface and implementation implications of hypertext components are reviewed and a case study illustrating design issues is discussed. Participants will analyze several real documents for their "hypertextability" in order to recognize what makes documents easy or challenging candidates for hypertext. ------------------------------------------------------------------------- Tutorial #19 (Full day, Monday, April 2, 1990) Managing the Design of the User Interface: A Practical Course for Software Managers and Developers Deborah J. Mayhew, Deborah J. Mayhew and Associates Organized around a traditional project life cycle, this course presents practical methods and techniques for managing the design of high-quality user interfaces through the application of human factors. Methods and techniques presented include interface design and evaluation techniques as well as organizational and managerial strategies. --------------------------------------------------------------------- Tutorial #20 (Full day, Monday, April 2, 1990) Graphical Human-computer Interface Design for Window Management Systems Aaron Marcus, Aaron Marcus and Associates This course introduces terminology, principles, guidelines, and heuristics for successfully using graphics in human-computer interfaces. Topics covered include the design of icons, control panels, dialog boxes, and navigational devices, that are not sufficiently prescribed by window management systems. The course addresses perceptual, cognitive, and communication issues. ----------------------------------------------------------------------- Tutorial #21 (Full day, Monday, April 2, 1990) Usability Engineering: Using Contextual Inquiry John Bennett, IBM Almaden Research Center Karen Holtzblatt, Digital Equipment Corporation Sandra Jones, Digital Equipment Corporation Dennis Wixon, Digital Equipment Corporation A practical introduction to the use of contextual inquiry as a step toward achieving computer system usability. The focus is on how to do contextual inquiry as a way to understand user requirements and to set user-related design objectives. ----------------------------------------------------------------------- Tutorial #22 (Full day, Monday, April 2, 1990) Issues in the Design and Application of Hypermedia Systems Frank G. Halasz, Xerox PARC Jeff Conklin, MCC An advanced tutorial for those intending to design or implement hypermedia systems. The course will review several existing hypermedia systems, focusing on critical issues for creating state-of-the-art systems. The application of hypermedia technology to the management of semi-structured information and outstanding research issues will be discussed. ------------------------------------------------------------------------- Tutorial #23 (Full day, Monday, April 2, 1990) Introduction to Visual Programming Environments Ephraim P. Glinert, Rensselaer Polytechnic Institute Marc H. Brown, DEC Systems Research Center Brad A. Myers, Carnegie Mellon University Visual programming refers to the use of graphics to define or help define programs; program visualization is the use of graphics to make programs and their executions understandable. This course defines and classifies visual environments, surveys visual representations for programs and visual programming systems, and outlines the concepts underlying the design and implementation of visual systems. Successes of the visual approach, unresolved issues, and future applications are discussed. ------------------------------------------------------------------------- Tutorial #24 (Full day, Monday, April 2, 1990) New Interaction Media Robert J.K. Jacob, Naval Research Laboratory Walter Bender, MIT Media Laboratory Jim Davis, MIT Media Laboratory Scott S. Fisher, NASA Ames Research Center This course describes some techniques for human-computer interaction that will become available in the near future, specifically, speech, new display technology, stereoscopic graphics, spatial input, and eye-tracking. For each, the underlying theories of operation of the devices will be explored, and examples of current research and "products" detailed. The course will discuss the merits, limitations, and range of suitable applications for these media, and offer practical advice toward using these technologies at the interface. ------------------------------------------------------------------------- Tutorial #25 (Full day, Monday, April 2, 1990) Designing User Interfaces for Children Allison Druin, Tell Tale Technologies Kate Withey, Willow Design Creating innovative and successful user interfaces for children holds special challenges, but understanding and meeting these challenges is relevant to all user interface design. The first part of this course describes existing and emerging interfaces for children, and prototyping techniques for such interfaces. In the second part, schoolchildren will join participants in design teams to prototype and critique an interface. ------------------------------------------------------------------------ Tutorial #26 (Half day, Monday Morning, April 2, 1990) The Pragmatics of Haptic Input Bill Buxton, University of Toronto This course examines some of the bases upon which the designer can make appropriate decisions in matching input technologies and techniques to applications and users. Input devices are discussed in terms of properties that augment their ability to support certain transactions but inhibit their ability to support others. Content includes methods for making comparative evaluations, a taxonomy of input devices and tasks, and a discussion of how phrasing techniques can be used to support the attainment of skilled performance. ------------------------------------------------------------------------- Tutorial #27 (Half day, Monday Morning, April 2, 1990) Video Ultrasimulation: Creating the Experience of Skilled Performance David Hon, IXION Hon designs and builds computer-based training systems utilizing a range of novel forms of user input and video output, with the goal of creating a context where learners can experience the feel of skilled performance, which he calls "ultrasimulation." The course will differentiate and show examples of different types and uses of video simulation, and discuss interface design issues and aspects of the design process which are critical for the success of these highly interactive systems. ----------------------------------------------------------------------- Tutorial #28 (Half day, Monday Morning, April 2, 1990) The Development of Seductive Interfaces Timothy C. Skelly and David D. Thiel Incredible Technologies Designing interfaces that can draw users in and motivate them to further learning and use has long been a goal and challenge faced by video games designers. This course explores the properties and mechanisms of successful self-teaching interfaces drawing on examples of video and computer games, and discusses effective composition of interfaces combining graphics, sound, and user input. ------------------------------------------------------------------------ Tutorial #29 (Half day, Monday Morning, April 2, 1990) The OPEN LOOK Graphical User Interface: Design, Philosophy, and Use Lin Brown and Scott Ritchie Sun Microsystems This course will familiarize attendees with the OPEN LOOK graphical user interface, and the design concepts and philosopies on which it is based. Interactive demonstrations of several applications and techniques for designing applications user interfaces in the OPEN LOOK environment will be presented. ------------------------------------------------------------------------- Tutorial #30 (Half day, Monday Morning, April 2, 1990) A Practical Introduction to Experimental Design for CHI Research Richard Dillon and Jo Tombaugh Carleton University This course introduces the use of experimental and quasi-experimental designs in applied research. Participants will learn how to critically evaluate the appropriateness and usefulness of formal experiments reported in the literature, and how to design experiments that will have impact in HCI research. ------------------------------------------------------------------------- Tutorial #31 (Half day, Monday Morning, April 2, 1990) MacApp*TM*: An Object-Oriented User Interface Toolkit Kurt J. Schmucker, Apple Computer, Inc. User interface toolkits, constructed with the techniques of object-oriented programming, are one means of reducing the cost of producing applications with sophisticated, iconic user interfaces. This course presents a detailed examination of these toolkits, their structure, and their use, with all examples in MacApp in both Object Pascal and C++. Several small applications designed with MacApp will be demonstrated and decomposed to show their implementation. ------------------------------------------------------------------------- Tutorial #32 (Half day, Monday Afternoon, April 2, 1990) AI and Education Elliot Soloway, University of Michigan This course discusses four types of AI systems for improving teaching (the intelligent lab workbench, articulate expert, expert diagnostician, and intelligent tutor). Several large teaching systems will be described as case studies in how to design, build, and test an AI-based training system. ------------------------------------------------------------------------- Tutorial #33 (Half day, Monday Afternoon, April 2, 1990) Storyboards and Sketch Prototypes for Rapid Interface Visualization Gayle Curtis, Rehabilitation R&D Center Laurie Vertelney, Apple Computer, Inc. The inventive leap to effective new user interfaces often requires visualization of applications and user scenarios long before the final technology is available. This course describes how storyboards and sketch prototypes can be powerful tools for exploring alternative design ideas and having early feedback on their usability. --------------------------------------------------------------------- Tutorial #34 (Half day, Monday Afternoon, April 2, 1990) Computer Supported Cooperative Work and Groupware Jonathan Grudin, MCC/Aarhus University Steven E. Poltrock, Boeing Advanced Technology Center This course introduces attendees to the opportunities and challenges posed by computer supported cooperative work (CSCW) and groupware, providing the background needed to evaluate existing groupware and design more effective applications. The focus will be on functionality and user interface requirements rather than underlying architectural support issues. ------------------------------------------------------------------------- Tutorial #35 (Half day, Monday Afternoon, April 2, 1990) Interface Builder and Object-Oriented Design on the NeXT Computer Michael K. Mahoney, California State University, Long Beach This course provides an overview of the process of developing a NeXT application, showing how the NeXT Interface Builder enables graphical definition of user interfaces in an object-oriented language. User interfaces to several small applications will be built and tested, and other useful tools for application program development will be demonstrated. ------------------------------------------------------------------------- Tutorial #36 (Half day, Monday Afternoon, April 2, 1990) Human-Computer Interaction Standards: Developments and Prospects John Karat, IBM Watson Research Center International user interface standards may well be a reality within the next two years. This course will provide attendees with an understanding of standardization efforts by describing current standards committee activities and their potential impact on current systems. Ways in which attendees can participate in and influence current standardization efforts will be discussed. --------------------------------------------------------------------- Tutorial #37 (Half day, Monday Afternoon, April 2, 1990) The Psychology of Software Development Bill Curtis, MCC This course covers results of recent research on the psychological aspects of programming and their implications for software development technology and environments. Content includes cognitive models of programming knowledge that underlie individual differences in programming, and team and organizational issues in software development environments. ------------------------------------------------------------------------- From don Fri Feb 2 17:54:52 1990 Date: Fri, 2 Feb 90 17:54:52 -0500 To: NeWS-makers@brillig.umd.edu Subject: Can I get a NeWS Job to be Displayed (identically) on Five Suns? From: lll-crg.llnl.gov!brand@lll-winken.llnl.gov (Russell Brand) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) I am going to be giving a demo of a large archaic lisp program that does graphics output in NeWS. Is there an easy way to me to have it displayed on another 4 displays as a slave? Thanks wuthel (lll-crg!brand brand@lll-crg.llnl.gov) From don Fri Feb 2 17:55:22 1990 Date: Fri, 2 Feb 90 17:55:22 -0500 To: NeWS-makers@brillig.umd.edu Subject: getbbox operator From: dennis!dennis@boulder.colorado.edu Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) The Openwindows code is using a new, apparently undocumented operator called getbbox. It signature seems to be this: canvas bool => x y w h where at least the w and h depend on the current scale. Can anyone enlighten me as to the semantics of getbbox? -Dennis Heimbigner (dennis@boulder.colorado.edu) From don Sun Feb 4 12:36:52 1990 Date: Sun, 4 Feb 90 12:36:52 -0500 To: NeWS-makers@brillig.umd.edu Subject: NeWS for the amiga From: wuarchive!cs.utexas.edu!jarvis.csri.toronto.edu!utgpu!utzoo!censor!geac!jtsv16!maurie@decwrl.dec.com (Maurie Danko) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) Can anyone tell me how to get a copy of NeWS (windowing system) for the Amiga? Then please do. ___________________________________________________________________________ Maurie Danko JTS Computer Systems Ltd .| Toronto, Canada 1 (416) 665-8910 | Remember: email: maurie@jtsv16.jts.com | If 2 people agree on everything OR {suncan|geac|uunet}!jtsv16!maurie | Then 1 of them is REDUNDANT. From don Wed Feb 7 01:12:50 1990 Date: Wed, 7 Feb 90 01:12:50 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: getbbox operator From: Rafael Bracho Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) The (undocumented) getbbox operator has the following syntax: object bool GETBBOX => x y x' y' where 'object' may be a string or a canvas. It will return the bounding box of the object in one of two forms: If 'bool' is true, the result is a "rect" (i.e., x' and y' are width and height, respectively), else, the result is a "bbox" (i.e., x' and y' are the corners of the upper-right corner, like in the 'pathbbox' operator). -Rafael From don Wed Feb 7 01:13:03 1990 Date: Wed, 7 Feb 90 01:13:03 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: getbbox operator From: wind!naughton@sun.com (Patrick Naughton) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) >>> The Openwindows code is using a new, apparently undocumented >>> operator called getbbox. >>> It signature seems to be this: >>> canvas bool => x y w h >>> where at least the w and h depend on the current scale. >>> Can anyone enlighten me as to the semantics of getbbox? >>> -Dennis Heimbigner >>> (dennis@boulder.colorado.edu) I'm not sure why it wasn't documented, but here's what it does: canvas|string true => llx lly urx ury canvas|string false => llx lly w h These return the bounding box of the canvas or string in the current ctm. The 'false' case simply does the subtraction of the lower-left from the upper-right and returns the width and height, suitable for passing to 'rectpath'. PS> /cv framebuffer newcanvas def PS> 0 0 100 200 rectpath cv reshapecanvas PS> 300 400 cv movecanvas PS> cv false getbbox pstack clear 300.0 400.0 100.0 200.0 PS> cv setcanvas PS> cv false getbbox pstack clear 0.0 0.0 100.0 200.0 PS> (Hello) false getbbox pstack clear 0.0 0.0 34.0 9.0 -Patrick ______________________________________________________________________ Patrick J. Naughton ARPA: naughton@sun.com Window Systems Group UUCP: ...!sun!naughton Sun Microsystems, Inc. AT&T: (415) 336 - 1080 From don Wed Feb 7 01:13:18 1990 Date: Wed, 7 Feb 90 01:13:18 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: NeWS for the amiga From: mailrus!jarvis.csri.toronto.edu!utgpu!watserv1!watdragon!bmacintyre@tut.cis.ohio-state.edu (Blair MacIntyre) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) maurie@jtsv16.UUCP (Maurie Danko) writes: >Can anyone tell me how to get a copy of NeWS (windowing system) for the Amiga? >Then please do. Well, my suggestion would be to phone Sun and ask if anyone has ported it to the Amiga. If not, buy a source licence and port it ... we'd all be very happy! :-) :-) -- -- Blair MacIntyre, Professional Leech on Society ( aka CS Graduate Student ) -- bmacintyre@{watcgl, watdragon, violet}.{waterloo.edu, UWaterloo.ca} -- Date, verb: prearranged socializing with intent. From don Fri Feb 9 05:22:59 1990 Date: Fri, 9 Feb 90 05:22:59 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: NeWS for the amiga From: phil%scripps.edu@scripps.edu (Phil Cohen) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) A company named Ameristar has ported NeWS to the Amiga. I saw it at SIGGRAPH two years ago. The performance was quite disapointing and they would not sell me a copy. A bunch of SUN people were in the booth and were quite happy about the port to such a cost effective platform. They were in a corner of the Commodore booth, so if you want more information, perhaps Commodore can put you in touch with Ameristar. Phil Cohen Research Institute of Scripps Clinic From don Fri Feb 9 05:23:14 1990 Date: Fri, 9 Feb 90 05:23:14 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: NeWS for the amiga From: root@sbcs.sunysb.edu (Systems Staff) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) In article <1290@jtsv16.UUCP> maurie@jtsv16.UUCP (Maurie Danko) writes: >Can anyone tell me how to get a copy of NeWS (windowing system) for the Amiga? >Then please do. >___________________________________________________________________________ >Maurie Danko JTS Computer Systems Ltd .| Ameristar Technology did a port of one of the early (pre-1.0) versions of the NeWS windowing system. The system was never released as a product. People wanting a network windowing system on the Amiga should check out the X11 offering by GfxBase. Rick Spanbauer Ameristar Technology From don Fri Feb 9 05:23:34 1990 Date: Fri, 9 Feb 90 05:23:34 -0500 To: NeWS-makers@brillig.umd.edu Subject: Retained canvases From: mcsun!sunic!nuug!ifi!m2cs.uu.no!tomas@uunet.uu.net (Tomas Felner) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) NeWS gurus, your attention please: I have a problem with retained canvases under NeWS 1.1. Consider the following scenario: I have a window (LiteWindow) and want to create a button inside that window. The canvas for the button is a direct subcanvas of the window's ClientCanvas. When I move around the window with the button, the button flickers like crazy. Very annoying!! The flickering only occurs when the client canvas (i.e. the parent canvas to the button) is retained. If I make it non-retained, the flickering does not occur. According to the NeWS manual, a retained canvas keeps an offscreen copy of the canvas and uses that copy to repair damage instead of producing damage events. After some investigation I came to the following conclusion: If I move around the retained canvas (the window), it seems that the offscreen copy is constantly (for each movecanvas operation) restored on the canvas, thereby deleting the button. This causes a damage for the button which in turn is also repaired. As a result of this behaviour I get the flickering. If the window is non-retained, moving it around does not cause any damage and thus no restoring or repairing. That's why there's no flickering. I would expect the retained canvas to behave like the non-retained canvas, since I don't see any reason to repair it all the time. My questions are now: Is my conclusion correct, and if not, how does it work instead? If it is correct, why is the retained canvas constantly repaired from the offscreen copy, even if it is not necessary, thereby causing this flickering? And why is this not the case with the non-retained canvas? And finally: How can I make a canvas retained AND avoid the flickering, i.e. avoid the repairing of the canvas with the offscreen copy ???? Some of you might wonder why I don't just make the window non-retained. Well, I want my button to be movable. If I move around the button I would get a lot of /Damage events for the underlying window and handling them is slooow. Setting /SaveBehind to true for the button doesn't help very much either. Furthermore, the window could have bigger damage than just the button area, and fixing that would be even slower. Therefore the window must be retained. While playing around with this stuff I encountered two more strange things: - There's an undocumented operator, 'setretainthreshold'. What is the exact syntax/semantics for it and how does it effect the behaviour of retained canvases? - I wasn't able to set a canvas back to non-retained once it was set to retained. Why is this so? Am I doing something wrong? Does it depend on other things like the canvas being transparent or unmapped or so? I hope, someone can solve the problems, or at least shed some light on them. -- Tomas Felner Modula-2 CASE Systems AS | Internet: tomas@m2cs.uu.no Maridalsveien 139 | Phone: +47 2 379784 N-0461 Oslo 4, Norway | FAX: +47 2 356448 From don Sun Feb 11 02:57:37 1990 Date: Sun, 11 Feb 90 02:57:37 -0500 To: NeWS-makers@brillig.umd.edu Subject: X11/NeWS Tab Frames From: don (Don Hopkins) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) This is an implementation of tab frames, on top of the Open Look frame class in tNt (the NeWS toolkit, aka NDE). It runs under Open Windows 1.0 (aka X11/NeWS). Instead of having the title at the top of the window, tab frames have the title in a tab stuck to the window edge, that you can drag around to any of the four edges by pressing the Adjust (middle) button down over the title (when the cursor is a + sign) and dragging it to where you want. Notice that the tab sticks to the end of an edge until you actually go around the corner. (This is so it's easy to move it to the end of an edge.) Double clicking the Point (left) button on the border or tab "zooms" the window as usual, except that the window is reshaped so it's on the left edge of the screen, full height, with its tab along its right edge, just below the previous tab. It is convenient to zoom a bunch of windows and have them all overlapping, but with all of their tabs visible (showing their titles). You can click the Point (left) button on the tab to bring the window to the top. It could be smarter about the layout, but this is just a start. Also I have added resize controls to the window edges to complement the Open Look resize corners. These are useful when you want to change the window height without changing the width, or vice verse. (You'll want to do that a lot with tab frames, like when you want to make a zoomed window shorter.) Least importantly, I added a fake 3-D look (wooo golly gee) to the tabs. When a tab frame has the input focus, its tab appears to pop out (with beveled edges around the window title). Personally I don't think 3-D window frames are particularly useful (unless they *really* *are* 3-D, and fly out at you like the SGI button demo). It would be poor form to make the window borders thicker and slow down the drawing for no other reason than fake 3-D. In this implementation, only the tab of the window which has the input focus (where keyboard input is directed) is displayed in fake 3-D. This is less distracting than having *all* the tabs in fake 3-D, and makes it painfully obvious *which* tab frame has the keyboard focus. I would appreciate feedback: what kind of automatic window and tab layout policy would be most convenient, least obnoxious? I am thinking of implementing snap dragging, to help line up windows and tabs, but for now the Open Look screen edge snapping works pretty well. One of these days I will incorporate pie menus into the tab frame window manager (ala quickwin.ps). Summer before last, I implemented tab frames under NeWS 1.1 for UniPress Emacs V2.20, and found them very convenient for editing lots of files at once (UniPress Emacs supports multiple windows, which can get very confusing without the help of the tabs). The idea is totally unoriginal, as useful for window managment as it is for address books, so feel free to implement it for other window systems without fear of being sued. My code is freely redistributable. For a demo, put the enclosed code in the file NeWS/tabframe.ps, and type: % psh NeWS/tabframe.ps % psh /demo TabBaseFrame send /demo TabCommandFrame send If you are pleased, and want to install tab frames as your default frame class (so you get them around all your X windows (if you run pswm) as well as your NeWS windows), put the following into your .startup.ps file: UserProfile /OpenLookFrame { ClassFrame /DefaultClass { TabFrame } put } put [ /TabFrame (NeWS/tabframe.ps) ] DefineAutoLoads There are still a few rough edges (of course the most obvious rough edge is considered a feature), but I plan on developing this further, so please tell me about any problems you have, and send me suggestions for enhancements, top of the head comments, incoherent raving brainstorms, etc. -Don Here is the enclosed code (NeWS/tabframe.ps): %! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % tNt Tab Frames, release 1.0 % Copyright (C) 1990 % By Don Hopkins, University of Maryland Human Computer Interaction Lab % Started, May 13 1989. % Reimplemented mostly from scratch for X11/NeWS FCS. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Copyright (C) 1990 by Don Hopkins. All rights reserved. % This program is provided for unrestricted use, provided that this % copyright message is preserved. There is no warranty, and no author % or distributer accepts responsibility for any damage caused by this % program. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % To get TabFrame as the default frame class automatically upon startup, put % the following into your .startup.ps file: % % UserProfile /OpenLookFrame { % ClassFrame /DefaultClass { TabFrame } put % } put % % [ % /TabFrame (NeWS/tabframe.ps) % ] DefineAutoLoads % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% systemdict begin %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % TabFrame % /TabFrame OpenLookFrame dictbegin /TabEdge /Top def /TabPosition 0 def dictend classbegin /ThreeDee? true def % /ThreeDee? framebuffer /Color get def /Contrast .1 def /Bright .75 dup dup rgbcolor def /Dim .25 dup dup rgbcolor def /LabelMinWidth 8 def /SelStroke 2 def /UnSelStroke 1 def /ZoomX 0 def /ZoomY 0 def /ZoomWidth 512 def framebuffer true getbbox /ZoomHeight exch def pop pop pop /ZoomTabEdge /Right def /ZoomTabPos 1 def /ZoomTabPosition { ZoomTabPos TabHeight ZoomHeight div sub dup 0 lt { pop 1 } if /ZoomTabPos 1 index store } def /LabelCreate { % - => - /Label [ { /TabNotify parent send pop } OpenLookTabFrameLabel ] /addclient self send } def /ReshapeCreate { % - => - /Reshape [{/ReshapeNotify /parent self send send} OpenLookTabFrameCorners] /addclient self send } def /ReshapeNotify { % object => - gsave pop % Parent setcanvas currentcursorlocation /stretchany self send grestore } def /stretchany { % event|x y => - dup type /eventtype eq { begin XLocation YLocation end } if 20 dict begin /y exch def /x exch def bbox unfittab 2 copy /h exch def /w exch def rect2points /y1 exch def /x1 exch def /y0 exch def /x0 exch def x x0 w .3 mul add le /Left { x x0 w .7 mul add ge /Right /Middle ifelse } ifelse % xpart y y0 h .3 mul add le /Bottom { y y0 h .7 mul add ge /Top /Middle ifelse } ifelse % xpart ypart dup /Bottom eq { /y0 y1 /y1 y0 def def } if 1 index /Left eq { /x0 x1 /x1 x0 def def } if (%%) sprintf cvn x1 y1 x1 x sub y1 y sub % edge x1 y1 x1-x y1-y [x0 y0] cvx % edge x1 y1 x1-x y1-y X0Y0proc end 5 index { /MiddleRight /MiddleLeft { {begin XLocation DeltaX add Y1 end} } /TopMiddle /BottomMiddle /MiddleMiddle { {begin X1 YLocation DeltaY add end} } /Default { {begin XLocation DeltaX add YLocation DeltaY add end} } } case [/xhair /xhair_m Parent] { InitOverlay InstallXYProcs /DeltaY exch def /DeltaX exch def /Y1 exch def /X1 exch def /Edge exch def /Moved? false def }{ Changed? {erasepage BBox fittab /path self send stroke} if /Moved? true def }{ erasepage null SetGlobalCursor Moved? { x0 x min y0 y min x0 x sub abs y0 y sub abs invalidatetab % /TabWidth unpromote /HeaderWidth unpromote fittab rect2points true } false ifelse } /UpTransition getfromuser { /anchorbox self send /reshape self send } if } def /TabNotify { % canvas => - pop DragTab } def /DragTab { % - => - gsave Parent setcanvas 10 dict begin bbox unfittab rect2points /top exch def /right exch def /bottom exch def /left exch def parent setcanvas null null [/xhair /xhair_m Parent] { InitOverlay InstallXYProcs } { Changed? { TabEdge { /Left { x left gt { y top gt { /Top setedge } { y bottom lt { /Bottom setedge } { x right gt { /Right setedge } if } ifelse } ifelse } if } /Right { x right lt { y top gt { /Top setedge } { y bottom lt { /Bottom setedge } { x left lt { /Left setedge } if } ifelse } ifelse } if } /Top { y top lt { x left lt { /Left setedge } { x right gt { /Right setedge } { y bottom lt { /Bottom setedge } if } ifelse } ifelse } if } /Bottom { y bottom gt { x left lt { /Left setedge } { x right gt { /Right setedge } { y top gt { /Top setedge } if } ifelse } ifelse } if } } case TabEdge { /Left /Right { y bottom sub TabHeight .5 mul sub top bottom sub TabHeight sub 1 max div 0 max 1 min } /Top /Bottom { x left sub TabWidth .5 mul sub right left sub TabWidth sub 1 max div 0 max 1 min } } case setposition erasepage left bottom right 2 index sub top 2 index sub % x y w h fittab /path self send stroke } if } {erasepage null SetGlobalCursor Changed?} [/UpTransition /DownTransition] getfromuser { left bottom right 2 index sub top 2 index sub % x y w h ?validate % XXX fittab minsize % x y w h mw mh 3 -1 roll max % x y w mw H 3 1 roll max % x y H W exch % x y W H /reshape self send } { % do something appropriate } ifelse end % tempdict grestore } def /invalidatetab { /TabWidth unpromote /TabHeight unpromote /TabX unpromote /TabY unpromote /HeaderWidth unpromote /HeaderHeight unpromote } def /setedge { % /Left|/Right|/Top|/Bottom => - /TabEdge exch store invalidatetab invalidate } def /resetedge { % edge => - bbox unfittab 5 -1 roll setedge ?validate % XXX? fittab reshape } def /setposition { % 0..1 => - /TabPosition exch store invalidatetab invalidate } def /BorderLeft { % - => l BorderEdge TabEdge /Left eq { TabWidth add } if } def /BorderRight { % - => r BorderEdge TabEdge /Right eq { TabWidth add } if } def /BorderBottom { % - => b /BorderBottom super send TabEdge /Bottom eq { TabHeight add } if } def /BorderTop { % - => t BorderEdge TabEdge /Top eq { TabHeight add } if } def /TabSize { % - => w h BorderEdge dup add % ThreeDee? { SelStroke add } if dup HeaderWidth add exch HeaderHeight add } def /CalcTabXY { % width height => x y TabEdge { /Left { % width height exch pop 0 exch % 0 height TabHeight sub TabPosition mul round % 0 y } /Right { % width height exch TabWidth sub % height x exch TabHeight sub TabPosition mul round % x y } /Top { % width height exch TabWidth sub TabPosition mul round % height x exch TabHeight sub % x y } /Bottom { % width height pop TabWidth sub TabPosition mul round % x 0 % x 0 } } case } def /validate { invalidatetab /BorderLeft unpromote /BorderLeft /BorderLeft self send promote /BorderRight unpromote /BorderRight /BorderRight self send promote /validate super send } def /TabX { TabXY /TabY exch promote /TabX exch promote TabX } def /TabY { TabXY /TabY exch promote /TabX exch promote TabY } def /TabXY { % - => x y Width Height CalcTabXY } def /TabWidth { TabSize /TabHeight exch promote /TabWidth exch promote TabWidth } def /TabHeight { TabSize /TabHeight exch promote /TabWidth exch promote TabHeight } def /HeaderWidth { HeaderSize /HeaderHeight exch promote /HeaderWidth exch promote HeaderWidth } def /HeaderHeight { HeaderSize /HeaderHeight exch promote /HeaderWidth exch promote HeaderHeight } def /HeaderSize { % - => w h 0 0 % W H /Label /getbyname self send { /preferredsize exch send % W H w h 3 -1 roll max % W w H 3 1 roll add % H W LabelMinWidth max HeaderPadding add exch % W H } if /Pin /getbyname self send { /minsize exch send % W H w h 3 -1 roll max % W w H 3 1 roll add % H W HeaderPadding add exch % W H } if /Close /getbyname self send { /minsize exch send % W H w h 3 -1 roll max % W w H 3 1 roll add % H W HeaderPadding add exch % W H } if 2 { exch dup 0 ne { HeaderPadding dup add add } if } repeat } def % erase the current frame header. Used when changing busy state. % /EraseHeader { % - => - FillColor setcolor TabX BorderEdge add TabY BorderEdge add HeaderWidth HeaderHeight rectpath fill } def % Paint the frames current focus state. % /PaintHeader { % busy? focus? => - % Only paint the header if we have one of these ornaments. % Label Close or Pin or { exch { pop BusyColor setcolor TabX BorderEdge add TabY BorderEdge add HeaderWidth HeaderHeight rectpath fill } { % {TextColor} {FillColor} ifelse % setcolor % ClickToType { % TabX BorderEdge add TabY BorderEdge add % HeaderWidth HeaderHeight % rectpath fill % }{ % Draw the two lines for follow-mouse focus. % Having a different highlight depending on what % focus mode got us here sounds like donkey-doo but % it's in the spec so we implement it. % ThreeDee? { gsave 10 dict begin /focus? 1 index def { framebuffer /Color get { FillColor colorhsb 3 copy % h s b h s b Contrast sub 0 max hsbcolor % h s b dim 4 1 roll % dim r g b Contrast add 1 min hsbcolor % dim bright } { Dim Bright } ifelse } { FillColor dup % dim bright } ifelse /l BorderEdge SelStroke sub def TabX BorderEdge add TabY BorderEdge add moveto l neg dup rlineto 0 HeaderHeight l dup add add rlineto HeaderWidth l dup add add 0 rlineto l neg dup rlineto HeaderWidth neg 0 rlineto 0 HeaderHeight neg rlineto closepath setcolor fill TabX BorderEdge add .75 add TabY BorderEdge add .75 sub moveto l neg dup rlineto HeaderWidth l dup add add 0 rlineto 0 HeaderHeight l dup add add rlineto l neg dup rlineto 0 HeaderHeight neg rlineto HeaderWidth neg 0 rlineto closepath setcolor fill TabX BorderEdge add TabY BorderEdge add .25 add 2 copy % x y x y HeaderWidth .5 sub HeaderHeight .5 sub % x y x y w h rectpath % x y 2 copy moveto l neg dup rlineto 2 copy HeaderHeight add .5 sub moveto l dup neg exch rlineto exch HeaderWidth add .5 sub exch 2 copy moveto l dup neg rlineto HeaderHeight add .5 sub moveto l dup rlineto focus? {TextColor} {FillColor} ifelse setcolor stroke end grestore } { {TextColor} {FillColor} ifelse setcolor currentlinewidth 2 setlinewidth TabX BorderEdge add TabY BorderEdge add HeaderWidth HeaderHeight rectpath stroke setlinewidth } ifelse % } ifelse } ifelse } { pop pop } ifelse } def % Overide: Take the label, the footer and the resize corners % into account. % /MinSize { % - => minwidth minheight % Because of the unique factorization of client layout % from client creation we must make sure the frame has % been correctly layed out here in order to get the % right minsize. % /?validate self send /Client getbyname { /minsize exch send } { 0 0 } ifelse fitclient TabEdge dup /Left eq exch /Right eq or { TabHeight max } { exch TabWidth max exch } ifelse } def % Overide: Take the label, the footer and the resize corners % into account. % /PreferredSize { % - => preferredwidth preferredheight % Because of the unique factorization of client layout % from client creation we must make sure the frame has % been correctly layed out here in order to get the % right preferredsize. % /?validate self send /PreferredSize OpenLookFrame /SuperSend load exec % XXX } def /SuperSend /supersend load def % Layout /FooterLayout { % - => - /Left /getbyname self send { BorderEdge 2 mul 1 add dup TabEdge /Left eq { TabWidth add } if exch SelStroke FooterPad add TabEdge /Bottom eq { TabHeight add } if Width TabEdge dup /Right eq exch /Left eq or { TabWidth sub } if .5 mul 3 -1 roll sub 1 sub /preferredsize 4 index send exch pop /reshape 6 -1 roll send } if /Right /getbyname self send { Width TabEdge dup /Right eq exch /Left eq or { TabWidth sub } if .5 mul dup TabEdge /Left eq { TabWidth add } if exch SelStroke FooterPad add TabEdge /Bottom eq { TabHeight add } if exch BorderEdge 2 mul 1 add sub /preferredsize 4 index send exch pop /reshape 6 -1 roll send } if } def /ReshapeLayout { % - => - /Reshape /getbyname self send { bbox unfittab /reshape 6 -1 roll send } if } def /CloseLayout { % - => - /Close /getbyname self send { % close TabX BorderEdge add HeaderPadding add % close x /minsize 2 index send % close x w h HeaderHeight 1 index sub % close x w h hh-h .5 mul .5 add truncate % close x w h _(hh-h)/2+.5_ TabY BorderEdge add add % close x w h y 3 1 roll % close x y w h /reshape 6 -1 roll send % } if } def /PinLayout { % - => - /Pin /getbyname self send { TabX BorderEdge add HeaderPadding add % pin x /Close getbyname self send { /minsize exch send pop add HeaderPadding add } if /minsize 2 index send % pin x w h HeaderHeight 1 index sub % pin x w h hh-h .5 mul % pin x w h (hh-h)/2 TabY BorderEdge add add % pin x w h y 3 1 roll % pin x y w h /reshape 6 -1 roll send % } if } def /LabelLayout { % - => - /Label /getbyname self send { TabX BorderEdge add HeaderPadding add % x /Pin /getbyname self send { /bbox exch send rect2points pop 3 1 roll pop pop HeaderPadding add max } if /Close /getbyname self send { /bbox exch send rect2points pop 3 1 roll pop pop HeaderPadding add max } if /preferredsize 2 index send % x w h exch 8 max exch HeaderHeight 1 index sub .5 mul % x w h y TabY BorderEdge add add % x w h y 3 1 roll % x y w h /reshape 6 -1 roll send } if } def /setlabel { % graphic|thing|null => - /Label /getbyname self send { invalidate /setlabel exch send } {pop} ifelse } def % This is the next available position to place a window at. % It is where the upper left corner of the window should go. /NextPosition null store /WindowYIncrement -37 store /WindowXIncrement 0 store /WindowRows 0 store /setgravity { % /Left|/Right|/Top|/Bottom => - /Gravity exch store /NextPosition null store /WindowRows 0 store Gravity { /UpperLeft { /InitialDefaultPosition { % w h => x y pop pop /bbox /parent self send send exch pop add } def /WindowYIncrement -37 store /WindowXIncrement 0 store } /UpperRight { /InitialDefaultPosition { % w h => x y pop /bbox /parent self send send 3 -1 roll add 3 1 roll add 3 -1 roll sub exch } store /WindowYIncrement -37 store /WindowXIncrement 0 store } /LowerLeft { /InitialDefaultPosition { % w h => x y exch pop /location /parent self send send 3 -1 roll add } store /WindowYIncrement 37 store /WindowXIncrement 0 store } /LowerRight { /InitialDefaultPosition { % w h => x y /bbox /parent self send send pop 3 -1 roll add 4 -1 roll sub exch 3 -1 roll add } store /WindowYIncrement 37 store /WindowXIncrement 0 store } /Default {} } case } def /UpperLeft setgravity /path { % x y w h => - 10 dict begin /mat matrix currentmatrix def /h exch def /w exch def translate TabEdge { /Left { TabWidth 0 moveto 0 h TabHeight sub TabPosition mul round rlineto TabWidth neg 0 rlineto 0 TabHeight rlineto TabWidth 0 rlineto TabWidth h lineto w h lineto w 0 lineto closepath } /Right { h TabHeight sub TabPosition mul round 0 0 moveto 0 h rlineto w TabWidth sub 0 rlineto 0 1 index TabHeight add h sub rlineto TabWidth 0 rlineto 0 TabHeight neg rlineto TabWidth neg 0 rlineto 0 exch neg rlineto closepath } /Top { 0 0 moveto 0 h TabHeight sub rlineto w TabWidth sub TabPosition mul round 0 rlineto 0 TabHeight rlineto TabWidth 0 rlineto 0 TabHeight neg rlineto w h TabHeight sub lineto w 0 lineto closepath } /Bottom { 0 TabHeight moveto 0 h TabHeight sub rlineto w 0 rlineto 0 h TabHeight sub neg rlineto w TabWidth sub TabPosition mul round TabWidth add TabHeight lineto 0 TabHeight neg rlineto TabWidth neg 0 rlineto 0 TabHeight rlineto closepath } } case mat setmatrix end % tempdict } def % given tabbed frame bbox, returns bbox of frame w/out tab /unfittab { % x y w h => x' y' w' h' TabEdge { /Left { 4 -1 roll TabWidth add 4 1 roll exch TabWidth sub exch } /Right { exch TabWidth sub exch } /Top { TabHeight sub } /Bottom { 3 -1 roll TabHeight add 3 1 roll TabHeight sub } } case } def % given untabbed frame bbox, returns bbox of frame with tab /fittab { % x' y' w' h' => x y w h TabEdge { /Left { 4 -1 roll TabWidth sub 4 1 roll exch TabWidth add exch } /Right { exch TabWidth add exch } /Top { TabHeight add } /Bottom { 3 -1 roll TabHeight sub 3 1 roll TabHeight add } } case } def % Return the corner farthest from the given x y. % Coordinates are in the parents space. % /farthestcorner { % x y => x' y' /bbox self send 4 copy rect2points 10 4 roll unfittab rect2points % x y x0 y0 x1 y1 X0 Y0 X1 Y1 3 index 6 index sub abs 2 index 7 index sub abs gt {9} {7} ifelse index 3 index 6 index sub abs 2 index 7 index sub abs gt {9} {7} ifelse index mark 13 3 roll cleartomark % x y X0 Y0 X1 Y1 x' y' => x' y' } def /StrokeCanvas { % color inset => - % REMIND: Should this use thick lines? exch setcolor gsave dup add setlinewidth /bbox self send /path self send stroke grestore } def % Grow to full (screen) size (true) or revert to normal size (false). % /zoom { % bool => - dup /zoomed? self send eq {pop} { gsave % bool framebuffer setcanvas % bool { /UnZoomedSize [ /bbox self send unfittab TabEdge TabPosition ] promote ZoomTabPosition setposition ZoomTabEdge setedge ZoomX ZoomY ZoomWidth ZoomHeight ?validate % XXX? fittab }{ UnZoomedSize aload pop setposition setedge ?validate % XXX? fittab /UnZoomedSize /unpromote self send } ifelse /reshape self send grestore } ifelse /mapped? self send not {true /open self send} if } def % make a default base frame with footer & grow control; then call vanilla % initialization procs for labels, footer, reshape etc. /demo { % - => window 10 dict begin % make a base frame and initialize it: [ FlexBag ] [/Footer true] framebuffer /newdefault ClassName load send /frame exch def /bag /client frame send def [ (Top) null { /Top /resetedge /parent target send send } (Bottom) null { /Bottom /resetedge /parent target send send } (Left) null { /Left /resetedge /parent target send send } (Right) null { /Right /resetedge /parent target send send } ] framebuffer /new OpenLookMenu send /setmenu bag send /Right /setedge frame send random /setposition frame send null random random 4 div random 4 div .75 add hsbcolor null /setcolors frame send null random random random 4 div .75 add hsbcolor null /setcolors bag send (Tab Frame) /setlabel frame send (Take a look) (and feel free!) /setfooter frame send 200 100 200 500 /reshape frame send /activate frame send /map frame send frame end } def classend def /TabBaseFrame [OpenLookBaseFrame TabFrame] [] classbegin classend def /TabPropertyFrame [OpenLookPropertyFrame TabFrame] [] classbegin classend def /TabCommandFrame [OpenLookCommandFrame TabFrame] [] classbegin classend def /TabHelpFrame [OpenLookHelpFrame TabFrame] [] classbegin classend def { /BaseFrameClass { TabBaseFrame } def /PropertyFrameClass { TabPropertyFrame } def /CommandFrameClass { TabCommandFrame } def /HelpFrameClass { TabHelpFrame } def } ClassFrame send { /DefaultClass { TabBaseFrame } def } ClassBaseFrame send { /DefaultClass { TabPropertyFrame } def } ClassPropertyFrame send { /DefaultClass { TabCommandFrame } def } ClassCommandFrame send { /DefaultClass { TabHelpFrame } def } ClassHelpFrame send %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % OpenLookTabFrameCorners % /OpenLookTabFrameCorners OpenLookFrameCorners [] classbegin /Edges { % x y w h delta => - 20 dict begin /d exch def /h exch def /w exch def /y exch def /x exch def /-d d neg def /D d 2 mul def /-D D neg def /X x w add def /Y y h add def x y h .5 mul add [ 0 d d -D -d ] polyrectpath X y h .5 mul add [ 0 -d -d D d ] polyrectpath x w .5 mul add y [ d d -D -d ] polyrectpath x w .5 mul add Y [ d -d -D d ] polyrectpath end } def % Override % % Hack: the path should be made from Corners; however, because % in 1.1 a fat line cannot intercept the clip, we use a fudge: % we make the path slightly larger than desired. % /path { % x y w h => - Delta 2 add 5 copy Corners Edges } def /PaintCanvas { % - => - % Fat line problem: we can't do the obvious: % FillColor setcolor clippath fill % 1 setlinequality 2 setlinewidth % StrokeColor setcolor clippath stroke .5 .5 Width 1 sub Height 1 sub Delta 5 copy Corners Edges FillColor setcolor gsave fill grestore StrokeColor setcolor stroke } def classend def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % OpenLookTabFrameLabel % /OpenLookTabFrameLabel [ClassControl OpenLookFrameLabel] [] classbegin /EventHandler { % event => - % callnotify puts self on stack and calls NotifyUser /callnotify self send } def /EventsConsumed /MatchedEvents def /ControlButton AdjustButton def % Which mouse button to use classend def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% end % systemdict From don Sun Feb 11 17:12:08 1990 Date: Sun, 11 Feb 90 17:12:08 -0500 To: NeWS-makers@brillig.umd.edu Subject: IBM announces NextStep on AIX, PS/2, RIOS, etc. From: hoptoad!gnu (John Gilmore) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) Well, IBM has thrown its predictable monkey wrench into the X & Motif machinery. Did those OSF folks really believe IBM was coming in to promote open systems? No, they wanted to *appear* to be switching, so that both that appearance and their later "turnaround" would sow their traditional Fear, Uncertainty and Doubt. Note that IBM is rumored to have licensed Display PostScript from Adobe for running NextStep. Let's see if it turns any heads. Not that the NeWS camp is poised to take advantage of good news if it showed up... Check comp.sys.next, which is full of press releases, rumor, and talk about this. John -- John Gilmore {sun,pacbell,uunet,pyramid}!hoptoad!gnu gnu@toad.com Just say *yes* to drugs. If someone offers you a drug war, just say no. From don Sun Feb 11 17:16:43 1990 Date: Sun, 11 Feb 90 17:16:43 -0500 To: NeWS-makers@brillig.umd.edu Subject: cyber under NeWS1.1 - crash city From: sun-barr!ccut!piyopiyo!ott@apple.com (max) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) I am trying to install cyber under NeWS1.1 on a SPARC. It comes up, but leaves pr_open: open failed for /dev/cgfour0_ovl in the console. Nevertheless the program seems to work, I can execute the example of fig.1, but if I try to execute [5 {random} repeat] NeWS just crashes. The last time I got down to the boot prompt (or whatever you call it). It took me a while to figure out what /dev/cg.. means. We only have cgfour0 cgsix0 cgtwo0 overlay.ps says something about a patch to V1.1, I just don't have the source. Can anyone point out to me what I can do??? Thanks -max p.s. whenever I start NeWS, I immediately get the message !IS_VALID_FBTYPE 12 !IS_VALID_FBTYPE 12 in the login shell. ------------------------------------------------------------------------------ Max Ott e-mail: Hatori Laboratory ott%piyopiyo.hatori.t.u-tokyo.ac.jp Dept. of E.E.; U of Tokyo I am not a tourist, I live here, but +(81)-(03) 812 2111 Ext. 6761 would not mind being one. From don Mon Feb 12 19:08:25 1990 Date: Mon, 12 Feb 90 19:08:25 -0500 To: NeWS-makers@brillig.umd.edu Subject: RE: IBM and NextStep From: "Grootwassink, David" Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) > Note that IBM is rumored to have licensed Display PostScript from > Adobe for running NextStep. The cover story of the 9 OCT 89 issue of FORTUNE magazine is about IBM acquiring the rights to NextStep. - Dave ------------------------------------------------------------------------------- Lt. Dave Grootwassink USAF Tactical Air Warfare Center INTERNET: GROOTWASS@TAWC1.EGLIN.AF.MIL (129.61.5.1) PHONE: (904)882-4100 AUTOVON 872-4100 (904)882-4600 872-4600 ------------------------------------------------------------------------------- From don Mon Feb 12 19:08:30 1990 Date: Mon, 12 Feb 90 19:08:30 -0500 To: NeWS-makers@brillig.umd.edu Subject: Console Messages in News From: zaphod.mps.ohio-state.edu!wuarchive!cec2!news@tut.cis.ohio-state.edu (Mark E Hunter) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) Hi, Every once in a while when running NeWS, I get console messages like "su:hunter /dev/ttyxx" and "RPC:timeout ". I understand why these messages occur, what I want to know is how to get them to go to a window not to the background screen. I have a "console" window but it does not get them. When I redisplay all, the messages are not erased. This is very annoying. Any suggestions/explainations? Mark E. Hunter meh@wucs1.wustl.edu From don Thu Feb 15 23:05:53 1990 Date: Thu, 15 Feb 90 23:05:53 -0500 To: NeWS-makers@brillig.umd.edu Subject: audible bell From: cs.umn.edu!nis!ntmtka!mike@ub.d.umn.edu (Mike Tietel) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) I may need a way to generate an audible bell from NeWS 1.1 on a 4/60 and 4/370 running 4.0.3. Unfortunately, the manual has offered little help on this and any code I have access to uses only visual bells - usually with a comment like: % no audible bells yet. Any help is greatly appreciated... mjt -- Mike Tietel Northern Telecom, Inc. (612) 932-8017 9701 Data Park, H-200 mike@ntmtka.mn.org Minnetonka, MN 55343 {rosevax,bungia}!ntmtka!mike From don Thu Feb 15 23:06:00 1990 Date: Thu, 15 Feb 90 23:06:00 -0500 To: NeWS-makers@brillig.umd.edu Subject: archived news postings From: att!cbnewsm!roy@ucbvax.Berkeley.EDU (roy.mathew) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) dear users, Can anyone tell me of a way (anonymous ftp, perhaps!) and how to get to archived news postings for this newsgroup. Thanx Roy Mathew. (mail to att!alux2!roy@streisand or roy@m21ux.att.com) From don Thu Feb 15 23:07:15 1990 Date: Thu, 15 Feb 90 23:07:15 -0500 To: NeWS-makers@brillig.umd.edu Subject: THanks for the help with messages popping into console background From: mailrus!cs.utexas.edu!wuarchive!cec2!news@tut.cis.ohio-state.edu (Mark E Hunter) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) Hi, Well, I figured out why the consule messages were getting sent to the background rather than my console window. I was invoking 3 psterms with -C. The last one was a temporary terminal which spawned another process, hung around awhile, and died. It appears NeWS decided that the last terminal was really the console and when it terminated, reverted back to the main console. I picked one of the other windows and made it the only one invoked -C and it works right now. No, the hardware was not a 110. This is a sun3/260. However, thanks also for the notes about the 110 problem as we have them also. Special thanks to Robert A. Zeh, Paul O'neill, and Lennart Lovstrand for their e-mail. Thank you very much, Mark E. Hunter meh@wucs1.wustl.edu From don Thu Feb 15 23:07:36 1990 Date: Thu, 15 Feb 90 23:07:36 -0500 To: NeWS-makers@brillig.umd.edu Subject: Graphics Editor for NeWS From: mcsun!ukc!icdoc!citycs!ba124@uunet.uu.net (K.A.Streater) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) I urgently need a simple editor for News that can create circles, lines, boxes, text and fill them to create a hierarchy of postscript definitions which can then be output in postscript so that they can be manipulated by another News process. I am running a Sun system with SUNOS4.0.2 on it, and have recently installed X11/NeWS i.e. I am running News 2.0. The most important feature is that it MUST be able to handle colour, i.e. the objects can all have colour information attached to them and output in postscript. I have spoken to Sun who suggested that I ask on the net as no one knows of anything suitable. If you have any info or have such a program could you please mail me at ba124@uk.ac.city.cs (JANET) - other addresses below,, but a phone call on +44 1 253 4399 x 4343 would be very helpful indeed. Thanks, Kevin Streater K.A.Streater, BITNET: ba124%uk.ac.city.cs@uk.ac JANET: ba124@uk.ac.city.cs UUCP: ba124@citycs.UUCP or ..!mcvax!ukc!citycs!ba124 ARPA: ba124@cs.city.ac.uk -- K.A.Streater, BITNET: ba124%uk.ac.city.cs@uk.ac JANET: ba124@uk.ac.city.cs UUCP: ba124@citycs.UUCP or ..!mcvax!ukc!citycs!ba124 ARPA: ba124@cs.city.ac.uk "There was a point to this story, but it has temporarily escaped the Chronicler's mind.", Hitch-Hiker's Guide Part IV. From don Thu Feb 15 23:13:16 1990 Date: Thu, 15 Feb 90 23:13:16 -0500 To: NeWS-makers@brillig.umd.edu Subject: color maps in NeWS 2.0 (OpenWindows 1.0) From: alan@elroy.jpl.nasa.gov (Alan S. Mazer) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) I have asked a similar question in different forums, so if you use X and think you've seen this question before you probably have. We're considering using NeWS 2.0 under OpenWindows 1.0 for imaging. Because of the way Sun has implemented OpenWindows, the StaticColor visual is the default, and if we specify our own colors in the PseudoColor visual, then when the cursor moves out of the display window the colors change as one colormap is uninstalled and the other installed. This, at least, is the way things work with X. Are things any different under NeWS? If so, please send mail and let me know. It doesn't seem from the documentation that they are but if there is some clever things one can do in NeWS to define a different color map and keep it when the cursor leaves the window, we'd like to know. -- Alan # "But seriously, what could go wrong?" ..!cit-vax!elroy!alan alan@elroy.jpl.nasa.gov From don Thu Feb 15 23:13:37 1990 Date: Thu, 15 Feb 90 23:13:37 -0500 To: NeWS-makers@brillig.umd.edu Subject: NeWS for the Amiga From: rochester!uhura.cc.rochester.edu!ur-valhalla!deke@louie.udel.edu (Dikran Kassabian) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) First, an apology in advance. I know that this discussion just happened. I saw it and ignored it. Now, all of a sudden, I care about it. Sorry about that. One of our faculty members, who is very much involved in using and enhancing the NeWS environment, has an Amiga at home. He'd like to run NeWS there. Does an out-of-the-box port exist? Can you provide me with references and phone numbers? How much physical memory is required? What else do I need to know? Any assistance appreciated. Please respond via email. Thanks, ^Deke Kassabian, deke@ee.rochester.edu or ur-valhalla!deke Univ of Rochester, Dept of EE, Rochester, NY 14627 (+1 716-275-3106) From don Thu Feb 15 23:13:46 1990 Date: Thu, 15 Feb 90 23:13:46 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: IBM announces NextStep on AIX, PS/2, RIOS, etc. From: news@psuvax1.cs.psu.edu (Daniel Ehrlich) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) In article <10143@hoptoad.uucp> gnu@hoptoad.uucp (John Gilmore) writes: John> Well, IBM has thrown its predictable monkey wrench into the X & Motif John> machinery. Did those OSF folks really believe IBM was coming in to John> promote open systems? No, they wanted to *appear* to be switching, so John> that both that appearance and their later "turnaround" would sow John> their traditional Fear, Uncertainty and Doubt. John> Note that IBM is rumored to have licensed Display PostScript from John> Adobe for running NextStep. John> Let's see if it turns any heads. Not that the NeWS camp is poised to John> take advantage of good news if it showed up... John> Check comp.sys.next, which is full of press releases, rumor, and talk John> about this. IBM had an RT running NeXTStep at the Baltimore USENIX last summer. It was very slow and crashed a lot. They did not have anything running NeXTStep at the UNIFORUM in Washington, and then they make this announcement. One might conclude that some divisions in IBM do not talk to each other. :-) -- Dan Ehrlich Voice: +1 814 863 1142 FAX: +1 814 865 3176 From don Fri Feb 16 00:09:20 1990 Date: Fri, 16 Feb 90 00:09:20 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: IBM announces NextStep on AIX, PS/2, RIOS, etc. From: wsl.dec.com!kent@decwrl.dec.com (Christopher A. Kent) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) The fact is that IBM has licensed Display PostScript -- that's no rumor. It also remains to be seen exactly how they built NextStep into their boxes. There are at least two ways of running Display PostScript on a machine -- on bare framebuffer iron, or as an extension to X. Either way that they've done it, there will be some incompatibilities. They've publicly said that IBM NextStep programs will require source code changes to run on NeXT, and vice versa. It'll be interesting. It certainly throws some new stuff into the fray. Whether it's real or a red herring remains to be seen. Chris Kent Western Software Laboratory Digital Equipment Corporation kent@decwrl.dec.com decwrl!kent (415) 853-6639 From don Fri Feb 16 00:09:22 1990 Date: Fri, 16 Feb 90 00:09:22 -0500 To: NeWS-makers@brillig.umd.edu Subject: Emacs NeWS support From: aramis.rutgers.edu!geneva.rutgers.edu!hedrick@rutgers.edu (Charles Hedrick) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) We have code to support NeWS in Gnu Emacs. It goes back to NeWS 1.0 or maybe 1.1. We're now experimenting with XNeWS 1.0, which I believe is called NeWS 2.0. It looks like the Gnu Emacs support needs to be updated. It basically works. But it insists on refreshing the window when I do just about anything. Does anybody have revised support for Gnu Emacs that is known to work with XNeWS 1.0? From don Fri Feb 16 00:09:50 1990 Date: Fri, 16 Feb 90 00:09:50 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: IBM announces NextStep on AIX, PS/2, RIOS, etc. From: snorkelwacker!spdcc!dyer@think.com (Steve Dyer) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) In article ehrlich@cs.psu.edu (Daniel Ehrlich) writes: >IBM had an RT running NeXTStep at the Baltimore USENIX last summer. It was >very slow and crashed a lot. They did not have anything running NeXTStep at >the UNIFORUM in Washington, and then they make this announcement. One might >conclude that some divisions in IBM do not talk to each other. :-) IBM certainly did have NeXTStep running at UNIForum. If you walked too fast thru their booth you'd have missed it, because it had a smallish sign which advertised it as something like "Advanced User Interface Foobar" and didn't use the word NeXTStep at all. This was a few weeks before the announcement, you see. -- Steve Dyer dyer@ursa-major.spdcc.com aka {ima,harvard,rayssd,linus,m2c}!spdcc!dyer dyer@arktouros.mit.edu, dyer@hstbme.mit.edu From don Fri Feb 16 00:12:22 1990 Date: Fri, 16 Feb 90 00:12:22 -0500 To: NeWS-makers@brillig.umd.edu Subject: how are other sites using XNeWS? From: aramis.rutgers.edu!geneva.rutgers.edu!hedrick@rutgers.edu (Charles Hedrick) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) I'm curious how other sites are using (or planning to use) XNeWS. At the moment our users are split between SunView 1 and MIT's X (with twm). I think the majority are still using SunView. By the summer we'd like to move everybody to a system that can run X. Our applications are increasingly X-based. Originally I had hoped the XNeWS would be in good enough shape that we could move our user community to it. For those still on 4MB systems, I had hoped to have them use MIT's X with olwm, so that they'd have the same user interface as XNeWS. This plan no longer looks either desirable or feasible. XNeWS doesn't appear to be in good enough shape to give to large numbers of end users. Aside from bugs (like when you iconify a window, it vanishes, and various glitches in focus management), the software simply isn't polished enough for "real" users. If you compare the facilities of twm with XNeWS (the ability to define special function keys, tailor the form of the windows, the way icons are handled, etc.), you see the difference between a production quality system and a rough draft. Of course you can fix the NeWS side yourself in Postscript, but as far as I can tell, there's no way to tailor pswm. (It seems that if you're going to release a window manager that can't be tailored, the least you could do is include the source.) Since most of our real applications use X, missing functionality on the X side is a serious problem for us. At a bare minimum, we'd like the X side to implement the basic L keys, as the NeWS side does. People migrating from SunView 1 are not going to accept a system where you have to go to the title bar and click in order to bring a window to the top. The XView shelltool seems both slow and primitive compared to xterm. Furthermore, an essential part of the original plan was the use of olwm to make MIT's X look compatible with XNeWS. Olwm is still at the "rough draft" stage, and I don't sense much commitment to it from Sun. Currently I'm planning to reverse my original plan. Rather than having XNeWS as the basic system and using olwm to let MIT X look compatible, I'm planning to make MIT X with twm the basic system, and expect people to run XNeWS in a mode that is reasonably compatible. That is, I'm planning to suggest that people who use XNeWS plan to use primarily the X side, with the MIT tools (e.g. xterm and twm) instead of the Sun tools (e.g. shelltool and pswm). With a small amount of tinkering, you can get twm to have its mouse and L key responses sufficiently similar to XNeWS that it isn't too bad to have windows managed by NeWS and twm on the same screen. The question we're still discussing is whether XNeWS provides enough functionality in addition to MIT's X to make it worth using at all. I think it does. We have some users who have been using NeWS 1.1 to do Postscript previewing. It looks like XNeWS is if anything better than NeWS 1.1 in this area. Also, users with graphics accelerators get much better performance from XNeWS than MIT's X. (This is supposedly fixed in X11R4, but that is still too buggy for widespread use.) I have to say that as a NeWS proponent, I feel Sun isn't giving me much help. NeWS has been around an awfully long time to still be at the rough draft stage. Meanwhile, X has turned into quite a nice system. I suspect that it's going to be another year before XNeWS is really ready for widespread use, and by then all of our users will have migrated to pure X. I find it hard to believe that we're the only site in this situation. I'm worried that NeWS has missed its launch window. (I also have this feeling that after all the dust settles in the shootout between the highly-publicized user interface standards, the real winner is going to turn out to be the X stuff produced by the hacker community. I find myself increasingly pleased with twm.) From don Fri Feb 16 00:12:30 1990 Date: Fri, 16 Feb 90 00:12:30 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: how are other sites using XNeWS? From: crdgw1!montnaro@uunet.uu.net (Skip Montanaro) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) Charles Hedrick writes concerning XNeWS problems. I have a couple of comments on the XNeWS situation. The olwm/pswm interface appears (unfortunately) to be stable as far as Sun is concerned. During XNeWS beta testing I complained about the lack of function key support, but was told it was an OpenLook design issue. (NeWS1.1 supported function keys, and you could do it in PostScript if you like.) Sun likes to tout how OpenLook is standard, and was designed by human factors types. As far as I'm concerned, nobody has had enough experience with good user interfaces to sit down and write a (horribly large, hard-to-read) spec from which a window manager with a "good" look-and-feel will be created. I'm convinced you still have to experiment with most user interfaces to get them right. As a simple example, consider Don Hopkins' recent tabframes posting. An extra goody added in tabframes is the edge-stretch thingies in the window borders. You can now stretch one edge easily, without inadvertently stretching the other edge connected to your corner-stretch thingie. Why did the OpenLook designers never think of this? SunView had that basic capability, albeit without visible window gadgetry. It wasn't like the idea was completely unheard of. I agree that running the XNeWS server with an alternate window manager is a viable option. Before I got my SPARCStation I used XNeWS in X11ONLY mode with gwm, which was the only ICCCM-compliant window manager I had available to me at the time. If you choose to use twm with XNeWS, I recommend you at least try the X11R4 version. Cmdtool/shelltool both stink under XNeWS. Use the version of xterm that Sun placed in the demo subdirectory of $OPENWINHOME. (The MIT version, as of X11R3, didn't work properly with XNeWS.) There's no particular benefit to Sun's terminal emulators unless you're a textedit freak. Xterm is faster, has scrollbars, and VT100 and Tek 4010 emulation (for those rare occasions that it's needed). Sun has steadfastly maintained that the current XNeWS release is a "developers" release. Those people here who use it find it relatively stable at this point. On a SPARCStation with enough memory (16MBytes+) and a GX frame buffer it's really very pleasant to use, except for the OpenLook warts on pswm. Whether or not you want to release it to garden-variety users is another question, however. The server itself appears to be fine at this point. XNeWS does give you SunView executable compatibility, which I use frequently. While your SunView users may balk at the the user interface, they will be able to run old SunView programs in "compatibility mode". It's not perfect, but it works. (If you run in X11ONLY mode - which saves a lot of memory - you must manually set the WINDOW_PARENT and WMGR_ENV_PLACEHOLDER environment variables, typically to /dev/win0 and /dev/win1, respectively.) -- Skip (montanaro@crdgw1.ge.com) From don Fri Feb 16 00:35:45 1990 Date: Fri, 16 Feb 90 00:35:45 -0500 To: NeWS-makers@brillig.umd.edu Subject: archived news postings From: don (Don Hopkins) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) Date: 12 Feb 90 19:38:34 GMT From: att!cbnewsm!roy@ucbvax.Berkeley.EDU (roy.mathew) dear users, Can anyone tell me of a way (anonymous ftp, perhaps!) and how to get to archived news postings for this newsgroup. Thanx Roy Mathew. (mail to att!alux2!roy@streisand or roy@m21ux.att.com) They're availaible via anonymous ftp from brillig.umd.edu, in the directory "news-makers/*". -Don From don Fri Feb 16 21:11:41 1990 Date: Fri, 16 Feb 90 21:11:41 -0500 To: NeWS-makers@brillig.umd.edu Subject: User support for NeWS/Openwindows From: korp@tripoli.ees.anl.gov Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) At some point in time about a year ago a group called Open Vistas was formed to promote NeWS and help developers develop applications under NeWWS.S. After three conversations with the people in charge of Open Vistas I still have not received any information about the group etc... Is this group gone? If they still exist they need some help. I am willing to sponsor the creation of a new group or the rebirth of Open Vistas. NeWS has for too long been ignored, and will fade away into oblivion if nothing is done to promote it. We can't leave it up to Sun. Other workstation manufacturers need to be convinced that porting the merged server to their platform is a good thing to do. I welcome all replys and comments and will keep the net posted as to the progress of the above work. Peter A. Korp Argonne National Laboratory Argonne, Il 60439 (708)972-3109 korp@athens.ees.anl.gov From don Fri Feb 16 21:12:22 1990 Date: Fri, 16 Feb 90 21:12:22 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: IBM announces NextStep on AIX, PS/2, RIOS, etc. From: adobe!caro@decwrl.dec.com (Perry A. Caro) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) The other shoe has dropped. The big introduction of the new RISC System/6000 family included announcement of AIX Windows (X11R3) with OSF/Motif and Adobe's Display PostScript system extension to X Windows AS WELL AS AIX NextStep. Monkey wrench into X & Motif? Backing away from open systems? Hardly. It sounds to me like IBM will provide both environments and will let their customers decide. Note that NextStep is not built on X, or vice versa. They are provided as two separate software configurations. Note also that AIX and DPS are the common denominators. Perry ----------- UUCP: ...!{decwrl|sun}!adobe!caro These are my opinions only, Internet: caro@adobe.com and should not be construed as those of adobe!caro@decwrl.dec.com any other person or organization. From don Sat Feb 17 16:21:31 1990 Date: Sat, 17 Feb 90 16:21:31 -0500 To: NeWS-makers@brillig.umd.edu Subject: imagecanvas problem? From: korp@tripoli.ees.anl.gov Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) We have a program that works fine in NeWS 1.1 but barfs in OpenWindows. The problem is as follows: We create an offscreen "buffer" canvas. We proceed to draw to this canvas and then use imagecanvas to copy the contents of the buffer to an onscreen ClientCanvas. In OpenWindows this simply does not work. Imagecanvas works when used with a canvas generated with readcanvas, but breaks with any other canvas. In dumping the canvas created by readcanvas the field orphaned is true. There seems no way for me to create an orphaned canvas though. Am I missing something? A while back we posted a message about fill and stroke being broken in OpenWindows. The replys I received could not duplicate the problem. We have pinpointed the problem, fill and stroke do not implicitly do a newpath as they should. Thanks to all who sent messages. Peter Argonne National Laboratory From don Sun Feb 18 04:30:58 1990 Date: Sun, 18 Feb 90 04:30:58 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: Look and Feel? Or just Look? From: sun-barr!ccut!kogwy!wnoc-tyo-news!sragwa!sravd.sra.JUNET@apple.com (Erik M. van der Poel) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) In article <5348@crdgw1.crd.ge.com> Bruce Barnett writes: > I have seen a lot of people on the net "judge" Motif vs. Open Look > mostly on the overall look of a UI, or else they select it because it > is what their vendor has supplied. > > ... > > How convenient is the scrollbar? Good question. How many times have you had to check, very carefully, a large number of lines of text, one by one? In such a situation: A. You want to scroll exactly one line at a time. B. If you accidentally go too far, you want to scroll back one line. C. Or you may want to scroll exactly one page at a time. Now let's see how well some scrollbars meet these requirements. I obviously don't know about all existing scrollbars, but here are some. I expect that the NeWS people and others will follow up about scrollbars that I do not mention. X11R4 Athena scrollbar A. This scrollbar returns the position of the mouse relative to the end of the scrollbar when pointer button 1 or 3 is pressed. Xterm, for example, uses this distance to determine how much to scroll. So it is very difficult to find out where to position the mouse to scroll exactly one line. Of course, it is up to the application to decide what to do with the value returned by the scrollbar, but in any case, the appearance of the scrollbar does not make it immediately obvious to the user what needs to be done to scroll exactly one line. B. This scrollbar makes it easy to scroll up or down using pointer button 1 or 3. C. It is difficult to scroll exactly one page (see above). Motif & HP(Xw) scrollbars A. The arrows at the ends of the scrollbar make it easy to scroll exactly one line. B. Since the arrows are at the ends of the scrollbar, the user must move the mouse all the way to the other end to scroll in the other direction. C. It is impossible to scroll exactly one page. Open Look scrollbar A. The arrows in the elevator make it easy to scroll exactly one line. B. Though the arrows are close together, the user must still move the mouse to scroll in the other direction. C. It is easy to scroll exactly one page, once the user finds out that clicking beneath the elevator can be used for this purpose. X10R4 xterm scrollbar (a classic) A. The up-and-down arrow button makes it easy to scroll exactly one line. B. Since the up arrow and down arrow are in one area, it is easy to scroll in either direction using mouse buttons 1 and 3. C. It is easy to scroll exactly one page, once the user finds out that the shift key is held down for this purpose. I could go on and on about the user interface, and also about the programmer's interface, but I think I'll stop here. Just one last thing: I have hacked the Xw scrollbar to produce one that meets all of my 3 requirements. I could send copies to anyone who is interested. Erik M. van der Poel erik@sra.co.jp (Japan) SRA, 1-1-1 Hirakawa-cho, Chiyoda-ku erik%sra.co.jp@uunet.uu.net (USA) Tokyo 102 Japan. TEL +81-3-234-2692 erik%sra.co.jp@mcvax.uucp (Europe) From don Sun Feb 18 16:02:37 1990 Date: Sun, 18 Feb 90 16:02:37 -0500 To: NeWS-makers@brillig.umd.edu Subject: Desktop Publishing Programs with OSF/Motif From: island!dave@uunet.uu.net (David Newman) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) longs.LANCE.ColoState.Edu!robert writes: > >In article <6478@ogicse.ogc.edu> goward@ogicse.ogc.edu (Philip Goward) writes: >> >> >> Hi! >> >> I'm looking for MacPaint and MacWrite style software for >> X or NeWS (preferably in the public domain). Anyone know >> any location I can obtain these from? >> >> Also if anyone out there has a version of troff that runs >> under X or NeWS and the sources for it are available.... > >I don't know of a word processing appliction for X (if someone does please >post the source as I am looking for the same thing) The other applications >are available at: > > expo.lcs.mit.edu 18.30.0.212 > >Or just about any other comp.sources.x archive site. Hope this helps. > >Robert Thompson >Center for Computer Assisted Engineering >Colorado State University > [caution: Press Release Ahead :-] In response to the inquiry about paint and desktop publishing software for X, Island Graphics Corporation, the company that along with Sun Microsystems created SunWrite, SunPaint, and SunDraw, has announced a new suite of office publishing applications that run with OSF/Motif. Here are excerpts from a February 9, 1990 posting in comp.newprod: ISLAND GRAPHICS INTRODUCES THE ISLAND OFFICE SERIES(tm) UNDER OSF/MOTIF(tm) AT UNIFORUM IslandWrite(tm), IslandPaint(tm) & IslandDraw(tm) Shown on HP's Apollo Personal Workstations and on HP 9000 Series 300 Workstations WASHINGTON, D.C. January 23, 1990 -- Island Graphics Corporation introduced its newest office publishing applica- tions, IslandWrite, IslandPaint, and IslandDraw under the X Window System-based OSF/Motif graphical user interface, at UniForum today. The products, the first in the Island Office Series, were shown on HP's Apollo personal worksta- tions and HP 9000 Series 300 workstations in Island's booth, and in the Hewlett-Packard Company booth. The Island Office Series is intended to serve office publishing needs ranging from writing memos and letters to creating illustrated reports and newsletters. IslandWrite is a word processing and desktop publishing package that accepts graphics from IslandDraw, an object-oriented illus- tration package, and IslandPaint, a raster graphics editor. Each program provides PostScript(R) output to laser printers and imagesetters. The Island Office Series will be distributed by the Apollo Direct Channel beginning April 1, 1990, for the Apollo personal workstations, and July 1, 1990, for the HP Series 300 workstations. Apollo Direct is an after-market sales channel that enables Apollo users to select from a wide variety of products that add functionality to their installed equipment. IslandWrite is priced at $595, while IslandPaint and IslandDraw can be purchased together for $495. The U.S. toll-free number for Apollo Direct is 1- 800-225-5290. The Island Office Series runs on the entire Apollo personal workstation family, ranging from the Series 2500 to the Series 4500. It also runs on the HP 9000 Series 300. Island Graphics Corporation, headquartered in San Rafael, California, is the leading developer of UNIX desktop publishing and prepress software. Island Graphics has created a wide range of products for publishing and prepress system vendors in the United States, Europe, and Japan, including Sun Microsystems, Nixdorf, Dainippon Screen Manufacturing Company, AT&T Information Systems, AGFA Compu- graphic, ArborText and H. Berthold Fototype. -30- UNIX is a trademark of AT&T. OSF/Motif is a trademark of the Open Software Foundation, Inc. PostScript is a registered trademark of Adobe Systems, Inc. Contact: David Newman Lynn Wehner Marketing Manager Public Relations Island Graphics Hewlett-Packard Company 415/491-1000 508/256-6600 x 7717 dave@island.uu.net From don Sun Feb 18 16:02:57 1990 Date: Sun, 18 Feb 90 16:02:57 -0500 To: NeWS-makers@brillig.umd.edu Subject: Handling PostScript Errors From: Anthony Worrall Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) I am in the process of linking a high level language (pop11) to NeWS. Abitrary PostScript code can be sent from the client to the server. The problem is that what is the best way to catch any errors in the postscipt code down loaded. I can think of two posible ways of doing this. 1. Down load the code in the context of a stopped opperator and return to the client the error condition. 2. Put error handlers in errordict that do not call stop and modify handleerror to report the error to the client. Which method have other people used? Are there any other ways of catching errors? Example code would be most welcome. Anthony.Worrall@Reading.ac.uk From don Sun Feb 18 16:03:12 1990 Date: Sun, 18 Feb 90 16:03:12 -0500 To: NeWS-makers@brillig.umd.edu Subject: bindkey From: Anthony Worrall Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) In the NeWS 2.0 Programmers Guide it gives an example of the use of bindkey /FunctionF8 { dup begin /Name /InsertValue def /Action (!make) def end redistributeevent } bindkey I have been unable to get this to work from pshor ~/.user.ps. I am missing something? Anthony.Worrall@Reading.ac.uk From don Mon Feb 19 03:30:53 1990 Date: Mon, 19 Feb 90 03:30:53 -0500 To: NeWS-makers@brillig.umd.edu Subject: NeXT Newsletter info needed From: well!glang@apple.com (Gary T. Lang) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) For a newsletter we're putting together dedicated to news about the NeXT machine, please send me via email or bix mail a list (and if you have the time description) of any NeXT program that is shipping or in development that you are aware of. Please include price and availability particulars if possible. We believe that the NeXT machine is already the #3 platform for GUI applications; after only 1 year and 4 months, there are more applications shipping for it than for OS/2, OpenLook and Motif combined. For this and other reasons, we believe the mainstream trade press to be ignoring some simple facts about the current state of the software industry 1) A new generation of software cannot be developed until the tools are firmly in place for next generation development. The current interest in C++ on the Mac and IBM platforms is a good start but there are totally inadequate and nonstandard debugging and Interface Builder-like tools on those platforms - usually developed by vendors other than the hardware vendors or the compiler vendors, leading to incompatibilities between the C++ implementations and the Interface Builders. Look at the Mac - Prototyper, the closest development tool on the Mac to IB does not generate C++ or objectove enhancements to Think C. On the PC side, Case:PM or Case:Windows do not really do much to aid Glockenspiel C++ development. On the NeXT, it's all part of the system. Until this new generation of applications are developed, the current slump will continue to dog the industry. 2) Despite the best efforts of Microsoft and IBM, OS/2 has not taken hold for development of this new generation of software. We don't believe that it ever will at this point because at this stage of its implementation it provides no end-user solution that isn't already more than adqeuately addressed by Unix and its variants, which includes Mach. We want to ask the question: is it wise to spend so much time and energy solving problems that were solved years ago when our industry is losing momentum with potential customers? No it isn't wise at all. Closed systems like OS/2 have never provided lasting solutions to the techical problems that deal with issues that need addressing by the much needed renaissance in software we desire to see. There is increasing evidence that even IBM is starting to understand this. The address for the applications you know about is: 3700730@mcimail.com or glang on BIX or glang@well.uucp Thanks for whatever information you can send us. And of course comments are welcome, particularly over email. From don Tue Feb 20 00:18:24 1990 Date: Tue, 20 Feb 90 00:18:24 -0500 To: NeWS-makers@brillig.umd.edu Subject: Window attachment without mouse From: cs.utexas.edu!jarvis.csri.toronto.edu!utgpu!utzoo!martin@tut.cis.ohio-state.edu (Martin Hofmann) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) I hope somebody out there can help me with this problem. I am sure that this must be a relatively common problem. I have a program that uses two windows, one for text and one for graphics, and I need to switch back and forth between the two continuously. Is there any way to attach to a window without using the mouse to move the cursor. That is I require the program to control attachment to the window. The program is running on an Iris 4D60/GT using the NeWS window system. Thanks in advance. -- The world is sacred. You cannot improve it. | Martin Hofmann, U of Toronto If you try to change it, you will ruin it. | martin@zoo.toronto.edu If you try to hold it, you will lose it. | uunet!attcan!utzoo!martin Lao Tsu, "Tao Te Ching" | From don Tue Feb 20 00:19:07 1990 Date: Tue, 20 Feb 90 00:19:07 -0500 To: NeWS-makers@brillig.umd.edu Subject: Are there any public domain interfaces anywhere? From: dewey.soe.berkeley.edu!thom@ucbvax.Berkeley.EDU (Thom Gillespie) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) Hi, Are there any public domain interfaces anywhere? I'm not thinking of the code so much as the art of the interface. I ask this question because I wondered what would happen to Apple's interface claims if Xerox made the original design of the Star public domain. I realize that Xerox isn't going to do something like this but it seems like the world could use a good standard. I have this insane vision of the next generation trying to patent the sounds of words like : file, open, close, etc., so that everyone has to talk to their computers differently. I personally like the IBM Paradox3 Lotus like double menu line as very simple... but that doesn't help much does it? Again, this isn't a coding problem, it is a artistic/design problem complicated by money and lawyers. The prompt for this thought was Paul Heckel's book, "Friendly Software Design.' He discussed the change from engineering control of the movies to artistic control of the director and suggested a similar change may occur with software. --Thom Gillespie From don Tue Feb 20 00:20:04 1990 Date: Tue, 20 Feb 90 00:20:04 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: Emacs NeWS support From: mcsun!sunic!dkuug!iesd!iesd.auc.dk!fischer@uunet.uu.net (Lars P. Fischer) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) In article hedrick@geneva.rutgers.edu (Charles Hedrick) writes: >Does anybody have revised support >for Gnu Emacs that is known to work with XNeWS 1.0? As the name says, XNeWS, or X11/NeWS, or OpenWindows, is *both* X and NeWS. The X version of GNU Emacs runs fine under OpenWindows. Making emacs support a proprietary window system that already supports emacs seems a little pointless. /Lars -- Lars Fischer, fischer@iesd.auc.dk | If you want PL/I, you know where to CS Dept., Univ. of Aalborg, DENMARK. | find it. -- D. M. Ritchie From don Thu Feb 22 18:22:41 1990 Date: Thu, 22 Feb 90 18:22:41 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: imagecanvas problem? From: Rafael Bracho Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) We use imagecanvas in the way you described and, indeed, we had to change our code from NeWS 1.1 to NeWS 2.0. Enclosed you'll find a relevant point of a message I sent to news-makers a few months ago, in October. It should be noted that if you have GX boards, it is more efficient to draw directly on the screen than to draw in the off-screen buffer and do imagecanvas. -Rafael >>Date: Thu, 19 Oct 89 00:31:04 -0400 >Subject: Re: NeWS => X11/NeWS >From: Rafael Bracho > > >6. Imagecanvas is much more consistent to the PostScript image >operator. Under NeWS 1.1, to "imagecanvas" a regular canvas -- i.e., >obtained via newcanvas -- the receiving canvas had to be scaled by the >size of the source canvas; even though the source canvas' coordinate >system was not the unit square. Doing this in X11/NeWS results in >double scaling so you'll probably won't get anything on the screen -- >the server refuses to "imagecanvas" anything that results in more than >32767 pixels in either dimension. Either make the source canvas be >mapped to the unit square, or the receiving canvas have pixel units. > From don Thu Feb 22 18:22:56 1990 Date: Thu, 22 Feb 90 18:22:56 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: Emacs NeWS support From: ficc!peter@uunet.uu.net (Peter da Silva) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) In article fischer@iesd.auc.dk (Lars P. Fischer) writes: > The X version of GNU Emacs runs fine under OpenWindows. Making > emacs support a proprietary window system that already supports emacs > seems a little pointless. Let's put it this way: why do you use Emacs rather than some other editor? The bottom line for a lot of people is the programmability, no? So it stands to reason that people who like the programmability of Emacs are likely to want to have access to the programmability of NeWS while they're in Emacs. -- _--_|\ Peter da Silva. +1 713 274 5180. . / \ \_.--._/ Xenix Support -- it's not just a job, it's an adventure! v "Have you hugged your wolf today?" `-_-' From don Thu Feb 22 18:23:14 1990 Date: Thu, 22 Feb 90 18:23:14 -0500 To: NeWS-makers@brillig.umd.edu Subject: Window attachment without mouse From: cs.utexas.edu!jarvis.csri.toronto.edu!utgpu!utzoo!martin@tut.cis.ohio-state.edu (Martin Hofmann) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) I hope somebody out there can help me with this problem. I am sure that this must be a relatively common problem. I have a program that uses two windows, one for text and one for graphics, and I need to switch back and forth between the two continuously. Is there any way to attach to a window without using the mouse to move the cursor. That is I require the program to control attachment to the window. The program is running on a Silicon Graphics IRIS 4D60 using the NeWS window system. Thanks in advance. (I apologize if this is a second posting, but I don't think the first one made it) -- The world is sacred. You cannot improve it. | Martin Hofmann, U of Toronto If you try to change it, you will ruin it. | martin@zoo.toronto.edu If you try to hold it, you will lose it. | uunet!attcan!utzoo!martin Lao Tsu, "Tao Te Ching" | From don Thu Feb 22 18:23:55 1990 Date: Thu, 22 Feb 90 18:23:55 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: Emacs NeWS support From: eru!luth!sunic!tut!ks@bloom-beacon.mit.edu (Syst{ Kari) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) In article <4GW1PU7xds13@ficc.uu.net> peter@ficc.uu.net (Peter da Silva) writes: > The bottom line for a lot of people is the programmability, no? So it stands > to reason that people who like the programmability of Emacs are likely to > want to have access to the programmability of NeWS while they're in Emacs. Yes that is the point. For example I programed a font-change to functionkeys F3 and F4 so that F3 uses a character set with letters needed in Finnish language. When I write english or programs I use US-ASCII character set by pressing the button F4. I beleave this is not so easy in xemacs :-) BTW. NeWS-emacs has (had in our case) two bugs. 1) it performs unnecessary window updates 2) the emacs-window is partly overlapped with other windows some function- keys are duplicated in input. This happens because of missing 'pause' in screen update code. -- This article represents my personal views. "X is the Fortran of windowing systems." Kari Systa, Tampere Univ. Technology, Box 527, 33101 Tampere, Finland work: +358 31 162585 fax: +358 31 162913 home: +358 31 177412 From don Fri Feb 23 03:30:56 1990 Date: Fri, 23 Feb 90 03:30:56 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: how are other sites using XNeWS? From: hoptoad!gnu (John Gilmore) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) Anyone who would read comp.windows.news [or get news-makers] is a friend, and friends of NeWS may as well know the truth. Grasshopper Group is not using xnews for much of anything. In fact we see NeWS as a lose at this point. Technically the idea was great. Politically and organizationally Sun dropped the ball so many times that even if they fixed all the problems tomorrow, nobody would (or should) believe them. Both inside and outside Sun, the NeWS team is disintegrating. David LaVallee is working at NeXT (where they seem to care about PostScript based windowing). Robin Schaufler is leaving Friday for a job at SGI. Don Hopkins is finally going to graduate and wants to do some real work that will get used -- that is, not using Sun's bastard stepchild. Josh Siegel is learning about X and going back to school. Grasshopper has released our office space and Hugh Daniel, Keith Henson and I are working on other things. We are thinking of holding a wake for NeWS in our ex-offices a few days before we have to be out. X might be rasterop on wheels, but at least it has wheels. -- John Gilmore {sun,pacbell,uunet,pyramid}!hoptoad!gnu gnu@toad.com Just say *yes* to drugs. If someone offers you a drug war, just say no. From don Fri Feb 23 16:25:06 1990 Date: Fri, 23 Feb 90 16:25:06 -0500 To: NeWS-makers@brillig.umd.edu Subject: tcsh and NeWS1.1 on SUN3/60C From: George Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) i've been using tcsh on my sun3/60 with NeWS1.1. there must be an explanation for this source of frustration. i would like to cycle through the command history list via R8 and R14. presently this doesnt work within NeWS1.1 using grasshoppers psterm. it works within Suntools and XR4 though. i have to type ^p instead on R8 for example. what have i missed here, why doesnt this work, although other function keys L1-L10 seem to be OK and mimic suntools bindings? George Travan "rebel without a clue" PHONE : +61 8 2885968 University of Adelaide Telex : UNIVAD AA89141 G.P.O Box 498 Adelaide FAX : +61 8 244 0464 S.AUSTRALIA 5001 e_mail: george@frodo.ua.oz.au From don Tue Feb 27 03:20:18 1990 Date: Tue, 27 Feb 90 03:20:18 -0500 To: NeWS-makers@brillig.umd.edu Subject: SimpleTnt.shar from the sun NeWS archive From: don (Don Hopkins) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) Here is a goodie from Sun's NeWS archive server, that demonstrates some neat stuff about the NeWS toolkit (in X11/NeWS). To get other stuff from the server, you can send mail to news-archive@sun.com, with the subject line "help", and it will send you instructions on using it. If you also give it the line "send index" it will send you an index. -Don #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create: # SimpleTNT # This archive created: Tue Nov 14 15:28:16 1989 export PATH; PATH=/bin:/usr/bin:$PATH if test ! -d 'SimpleTNT' then mkdir 'SimpleTNT' fi cd 'SimpleTNT' if test -f 'Frame' then echo shar: "will not over-write existing file 'Frame'" else cat << \SHAR_EOF > 'Frame' % % Simple Frame % null nullarray framebuffer /newdefault ClassBaseFrame send (OPENLOOK Frame) /setlabel 2 index send (Status:) (totally awesome) /setfooter 3 index send 100 100 200 200 /reshape 5 index send /activate 1 index send /map 1 index send /f exch def newprocessgroup currentfile closefile SHAR_EOF fi if test -f 'Hello' then echo shar: "will not over-write existing file 'Hello'" else cat << \SHAR_EOF > 'Hello' % % Simple HelloWorld % /SimpleCanvas ClassCanvas dictbegin /Message (Howdy) def dictend classbegin /newinit { /newinit super send /Times-Bold 30 null /settextparams self send 200 200 /lockminsize self send } def /PaintCanvas { 1 fillcanvas /size self send 2 div exch 2 div exch moveto /textfont self send setfont 0 setgray Message cshow } def classend def SimpleCanvas nullarray framebuffer /new OpenLookBaseFrame send (OPENLOOK Frame) /setlabel 2 index send (Status:) (totally awesome) /setfooter 3 index send /place 1 index send /activate 1 index send /map 1 index send /f exch def newprocessgroup currentfile closefile SHAR_EOF fi if test -f 'HelloMenu' then echo shar: "will not over-write existing file 'HelloMenu'" else cat << \SHAR_EOF > 'HelloMenu' /SCanvas ClassCanvas dictbegin /Message (Your Momma) def dictend classbegin /newinit { /newinit super send /Times-Bold 30 null /settextparams self send [ (Your Momma) (Your Daddy) (Your Sister) ] null { /valuething 1 index send /setmessage /sendtarget 4 -1 roll send } framebuffer /new OpenLookMenu send true /setpinnable 2 index send (Message) /setlabel 2 index send /setmenu self send } def /PaintCanvas { 1 fillcanvas /size self send 2 div exch 2 div exch moveto /textfont self send setfont 0 setgray Message cshow } def /setmessage { /Message exch def /paint self send } def classend def SCanvas [] framebuffer /new OpenLookBaseFrame send (OPENLOOK Frame) /setlabel 2 index send (Status:) (Amazing) /setfooter 3 index send 100 100 200 200 /reshape 5 index send /activate 1 index send /map 1 index send /SimpleHello exch def newprocessgroup currentfile closefile SHAR_EOF fi if test -f 'HelloMenuPullRight' then echo shar: "will not over-write existing file 'HelloMenuPullRight'" else cat << \SHAR_EOF > 'HelloMenuPullRight' % % Menu with 2 pull-right menus on it % % Syntax is: % [ (string) menu null (string2) menu2 null ... ] % /SimpleCanvas ClassCanvas dictbegin /Message (Your Momma) def dictend classbegin /newinit { /newinit super send /Times-Bold 30 null /settextparams self send [ (New Message) [ (Your Momma) (Your Daddy) (Your Sister) ] null { /setmessage /sendtarget 2 index send } framebuffer /new OpenLookMenu send null % (string) submenu null (New Font) [ (Times-Roman) (Times-Italic) (Times-Bold) ] null { /setfontname /sendtarget 2 index send } framebuffer /new OpenLookMenu send null ] framebuffer /new OpenLookMenu send true /setpinnable 2 index send (Message) /setlabel 2 index send /setmenu self send } def /PaintCanvas { 1 fillcanvas /size self send 2 div exch 2 div exch moveto /textfont self send setfont 0 setgray Message cshow } def /setmessage { % menu => - /valuething exch send % menu => string /Message exch def /paint self send } def /setfontname { % menu => - /valuething 1 index send cvn % menu => fontname null null /settextparams self send /paint self send } def classend def SimpleCanvas nullarray framebuffer /new OpenLookBaseFrame send (HelloMenu with a PullRight) /setlabel 2 index send (Status:) (totally awesome) /setfooter 3 index send 100 100 400 200 /reshape 5 index send /activate 1 index send /map 1 index send /f exch def newprocessgroup currentfile closefile SHAR_EOF fi if test -f 'Mousehits' then echo shar: "will not over-write existing file 'Mousehits'" else cat << \SHAR_EOF > 'Mousehits' % % Mouse Events Example % /EventCanvas ClassCanvas dictbegin /Message (Waiting for Mouse Hit) def dictend classbegin /newinit { /newinit super send /Times-Bold 30 null /settextparams self send } def /PaintCanvas { 1 fillcanvas Width 2 div Height 2 div moveto TextFont setfont 0 setgray Message cshow } def /setmessage { % event => - /Name get 20 string cvs /Message exch def (Status:) Message /parent self send /setfooter exch send /paint self send } def /MakeInterests { [/LeftMouseButton /MiddleMouseButton /RightMouseButton] /setmessage /DownTransition Canvas /MakeInterest self send } def classend def EventCanvas nullarray framebuffer /newdefault ClassBaseFrame send (Mousehits!) /setlabel 2 index send (Status:) (totally awesome) /setfooter 3 index send 100 100 400 200 /reshape 5 index send /activate 1 index send /map 1 index send /f exch def newprocessgroup currentfile closefile SHAR_EOF fi if test -f 'SimpleDraw' then echo shar: "will not over-write existing file 'SimpleDraw'" else cat << \SHAR_EOF > 'SimpleDraw' /DrawCanvas ClassCanvas dictbegin /DrawMode (Point) def /StoreCanvas null def dictend classbegin /newinit { /newinit super send /BuildStore self send 500 500 /lockminsize self send [ (Point) (Line) (Box) (Circle) ] null { /valuething 1 index send /setdrawmode /sendtarget 4 -1 roll send } framebuffer /new OpenLookMenu send true /setpinnable 2 index send /setmenu self send } def /destroy { /StoreCanvas null def /destroy super send } def /PaintCanvas { StoreCanvas imagecanvas } def /BuildStore { gsave framebuffer setcanvas /StoreCanvas framebuffer newcanvas def StoreCanvas /Transparent false put StoreCanvas /Retained true put 0 0 500 500 rectpath StoreCanvas reshapecanvas StoreCanvas setcanvas 1 fillcanvas grestore } def /UpDateFooter { % string => - (Mode:) exch /setfooter /parent self send send } def /setdrawmode { % string => - dup /UpDateFooter self send /DrawMode exch def } def /StartAction { % event => - pop { DrawMode (Point) ne { /canvas self send InitOverlay }{ /canvas self send setcanvas } ifelse } { % forked process handling drags DrawMode (Point) ne { erasepage } if x y x0 y0 /DrawThing self send DrawMode (Point) eq { gsave StoreCanvas setcanvas x y x0 y0 /DrawThing self send grestore x y SetX0Y0 } if } { DrawMode (Point) ne { /canvas self send setcanvas } if x y x0 y0 /DrawThing self send gsave StoreCanvas setcanvas x y x0 y0 /DrawThing self send grestore } /UpTransition getfromuser } def /DrawThing { % x y x0 y0 => - DrawMode { (Point) (Line) { moveto lineto } (Box) { points2rect rectpath } (Circle) { points2rect ovalpath } } case stroke } def /MakeInterests { /MakeInterests super send /LeftMouseButton /StartAction /DownTransition Canvas /MakeInterest self send } def classend def DrawCanvas [/Reshape false] framebuffer /newdefault ClassBaseFrame send (Draw) /setlabel 2 index send (Mode:) (Point) /setfooter 3 index send 100 100 /minsize 3 index send /reshape 5 index send /activate 1 index send /map 1 index send /f exch def newprocessgroup currentfile closefile SHAR_EOF fi if test -f 'README' then echo shar: "will not over-write existing file 'README'" else cat << \SHAR_EOF > 'README' Last tested 6/27/89 beta2 + beta TNT This directory holds a group of simple applications using TNT. The purpose is to illustrate some basic usage for ISV's. BagDoodles - Directory of simple bag examples for interactive use Buttons - More subclasses of ClassBag, multiple clients Circle - Drag out a circle Frame - Just a frame FrameQuit - Overrides quit on menu FrameIcon - Overrides close/open FunnyEZ - a canvas with a disjoint path Hello - Simple ClassCanvas subclass HelloMenu - Use of CanvasMenu, /sendtarget HelloMenuPullRight - Pullrights with class OpenLookMenu MatchExplorer - low level canvas used to look at event matching KBez - Simple grabbing of keyboard keys MatchExplorer - Low level event distribution exploration sample Meta - Metakeys on the keyboard Meter - Dave Gedye's memory meter Mousehits - Catching mouse buttons, overriding MakeInterests OneButton - Using a flexbag and a control Panepain - Use of a OpenLookPane, getting the scrollbar values Panepain2 - Use of a OpenLookPane, override scrollbar default notify behavior PsAngles - "PostScript" in various angles Resize - A twobag in a frame, some Layout fun SimpleAppBag - using a bag for a panel/canvas application SimpleDraw - Simple use of getfromuser in a draw program flippers.ps - capturing shift keys pswin - simple PS previewer scoutclock - digital clock scouticoneditor - simple bitmap editor SHAR_EOF fi if test -f 'Buttons' then echo shar: "will not over-write existing file 'Buttons'" else cat << \SHAR_EOF > 'Buttons' % % Example of Bags and Buttons % /SimpleCanvas ClassCanvas dictbegin /Message (Hello Programmers) def /Position (Middle) def dictend classbegin /newinit { /newinit super send /Times-Bold 20 null /settextparams self send null 1 1 1 rgbcolor null /setcolors self send 400 300 /lockminsize self send [ (Your Momma) (Your Daddy) (Your Sister) ] null { /valuething 1 index send /setmessage /sendtarget 4 -1 roll send } framebuffer /new OpenLookMenu send true /setpinnable 2 index send (Message) /setlabel 2 index send /setmenu self send } def /setmessage { /Message exch def /paint self send } def /setposition { /Position exch def /paint self send } def /PaintCanvas { /PaintCanvas super send Position { (Left) { /size self send 2 div 10 exch moveto pop } (Middle) { /size self send 2 div exch 2 div exch moveto } (Right) { /size self send 2 div exch 40 sub exch moveto } (Sideways) { /size self send 2 div exch 2 div exch moveto 90 rotate } } case /textfont self send setfont Message cshow } def classend def /SimpleFlexBag FlexBag dictbegin /ButtonLine 350 def dictend classbegin /newinit { /newinit super send null 1 1 1 rgbcolor null /setcolors self send 400 400 /lockminsize self send /can [/sw { 0 0 } SimpleCanvas] /addclient self send /l [ /c { self WIDTH .2 mul ButtonLine } (Left) { (Left) /setposition /sendtarget 4 -1 roll send } OpenLookButton ] /addclient self send /can /getbyname self send pop /settarget /l /getbyname self send pop send /m [ /c { self WIDTH .4 mul ButtonLine } (Middle) { (Middle) /setposition /sendtarget 4 -1 roll send } OpenLookButton ] /addclient self send /can /getbyname self send pop /settarget /m /getbyname self send pop send /r [ /c { self WIDTH .6 mul ButtonLine } (Right) { (Right) /setposition /sendtarget 4 -1 roll send } OpenLookButton ] /addclient self send /can /getbyname self send pop /settarget /r /getbyname self send pop send /s [ /c { self WIDTH .8 mul ButtonLine } (Sideways) { (Sideways) /setposition /sendtarget 4 -1 roll send } OpenLookButton ] /addclient self send /can /getbyname self send pop /settarget /s /getbyname self send pop send } def classend def SimpleFlexBag nullarray framebuffer /newdefault ClassBaseFrame send (Bags and Buttons) /setlabel 2 index send (Status:) (totally awesome) /setfooter 3 index send 100 100 /minsize 3 index send /reshape 5 index send /activate 1 index send /map exch send newprocessgroup currentfile closefile SHAR_EOF fi if test -f 'Panepain' then echo shar: "will not over-write existing file 'Panepain'" else cat << \SHAR_EOF > 'Panepain' /InfoCanvas ClassCanvas dictbegin /HSValue 0 def /VSValue 0 def dictend classbegin /newinit { /newinit super send /Times-Bold 20 null /settextparams self send } def /PaintCanvas { 1 fillcanvas 0 setgray TextFont setfont 50 100 moveto (HSValue - ) show 50 50 moveto (VSValue - ) show /update self send } def /update { gsave self setcanvas 150 50 100 100 rectpath 1 setgray fill 0 setgray TextFont setfont 150 100 moveto (%) [HSValue] sprintf show 150 50 moveto (%) [VSValue] sprintf show grestore } def /setHSvalue { /HSValue exch def /update self send } def /setVSvalue { /VSValue exch def /update self send } def classend def /SimplePane OpenLookPane [] classbegin /CreateHSbarNotify { % - => proc { /value exch send /setHSvalue /parent self send /client exch send send } } def /CreateVSbarNotify { % - => proc { /value exch send /setVSvalue /parent self send /client exch send send } } def classend def [[InfoCanvas] SimplePane ] nullarray framebuffer /newdefault ClassBaseFrame send (Scroll Me) /setlabel 2 index send 100 100 300 300 /reshape 5 index send /activate 1 index send /map 1 index send /f exch def newprocessgroup currentfile closefile SHAR_EOF fi if test -f 'KBez' then echo shar: "will not over-write existing file 'KBez'" else cat << \SHAR_EOF > 'KBez' /KeyCanvas ClassCanvas dictbegin /CurrentKey (?) def dictend classbegin /newinit { /newinit super send /Times-Bold 30 null /settextparams self send } def /PaintCanvas { /PaintCanvas super send /size self send 2 div exch 2 div exch moveto /textfont self send setfont 0 setgray CurrentKey show } def /setcurrentkey { /CurrentKey exch def /paint self send } def /HandleKey { % event => - /Name get cvis /setcurrentkey self send } def /MakeInterests { /HandleKey Canvas soften buildsend Canvas /defaultkeys ClassKeysInterest send } def classend def KeyCanvas nullarray framebuffer /newdefault ClassBaseFrame send (OPENLOOK Frame) /setlabel 2 index send (Status:) (totally awesome) /setfooter 3 index send 100 100 200 200 /reshape 5 index send /activate 1 index send /map 1 index send /f exch def newprocessgroup currentfile closefile SHAR_EOF fi if test -f 'MatchExplorer' then echo shar: "will not over-write existing file 'MatchExplorer'" else cat << \SHAR_EOF > 'MatchExplorer' % % For some experiments with event matching % To use: % % % psh MatchExplorer (or load the file to an interactive session) % % RightMouseButton terminates % utilities /buildcanvas { % parent size => canvas dup createcanvas dup begin /Transparent false def /Retained false def /EventsConsumed /MatchedEvents def end } def /addinterest { % Exclusive? PreChild? cv action name => - createevent begin /Name exch def /Action exch def /Canvas exch def /IsPreChild exch def /Exclusivity exch def currentdict end expressinterest } def /leftdict dictbegin /LeftMouseButton { dup begin (n - % c - % pc - % ex - %\n) [ Name Interest /Canvas get Interest /IsPreChild get Interest /Exclusivity get ] printf end pop % redistributeevent % if exclusive might want to turn this on } def dictend def /enddict dictbegin /RightMouseButton { pop currentprocess killprocess } def dictend def % build canvases /c1 framebuffer 200 buildcanvas def /c2 c1 100 buildcanvas def c1 /Mapped true put gsave c1 setcanvas 1 fillcanvas grestore c2 /Mapped true put gsave c2 setcanvas .8 fillcanvas grestore % terminate interest true true c1 null enddict addinterest % pre and post child fun %true true c1 /DownTransition leftdict addinterest false false c1 /DownTransition leftdict addinterest false true c1 /DownTransition leftdict addinterest false false c2 /DownTransition leftdict addinterest false true c2 /DownTransition leftdict addinterest % handle events { awaitevent } loop SHAR_EOF fi if test -f 'OneButton' then echo shar: "will not over-write existing file 'OneButton'" else cat << \SHAR_EOF > 'OneButton' % % FlexBags for more complex layout needs % /ButtonBag FlexBag [] classbegin /newinit { /newinit super send /b1 [/c {/c self POSITION} (Button1) nullnotify OpenLookButton] /addclient self send } def classend def ButtonBag nullarray framebuffer /newdefault ClassBaseFrame send (ONE Button) /setlabel 2 index send 100 100 200 200 /reshape 5 index send /activate 1 index send /map 1 index send /f exch def newprocessgroup currentfile closefile SHAR_EOF fi if test -f 'Panepain2' then echo shar: "will not over-write existing file 'Panepain2'" else cat << \SHAR_EOF > 'Panepain2' /InfoCanvas ClassCanvas dictbegin /HSValue 0 def /VSValue 0 def dictend classbegin /newinit { /newinit super send /Times-Bold 20 null /settextparams self send } def /PaintCanvas { 1 fillcanvas 0 setgray TextFont setfont 50 100 moveto (HSValue - ) show 50 50 moveto (VSValue - ) show /update self send } def /update { gsave self setcanvas 150 50 100 100 rectpath 1 setgray fill 0 setgray TextFont setfont 150 100 moveto (%) [HSValue] sprintf show 150 50 moveto (%) [VSValue] sprintf show grestore } def /setHSvalue { /HSValue exch def /update self send } def /setVSvalue { /VSValue exch def /update self send } def classend def /SimplePane OpenLookPane [] classbegin /newinit { % - => - /newinit super send /HSbar /getbyname self send { /CallNotify? { % event => bool /Name get /MouseDragged eq { false }{ true } ifelse } /installmethod 4 -1 roll send } if /VSbar /getbyname self send { /CallNotify? { % event => bool /Name get /MouseDragged eq { false }{ true } ifelse } /installmethod 4 -1 roll send } if } def /CreateHSbarNotify { % - => proc { /value exch send /setHSvalue /parent self send /client exch send send } } def /CreateVSbarNotify { % - => proc { /value exch send /setVSvalue /parent self send /client exch send send } } def classend def [[InfoCanvas] SimplePane ] nullarray framebuffer /newdefault ClassBaseFrame send (Scroll Me) /setlabel 2 index send 100 100 300 300 /reshape 5 index send /activate 1 index send /map 1 index send /f exch def newprocessgroup currentfile closefile SHAR_EOF fi if test -f 'Meta' then echo shar: "will not over-write existing file 'Meta'" else cat << \SHAR_EOF > 'Meta' /KeyCanvas ClassCanvas dictbegin /CurrentKey (?) def dictend classbegin /newinit { /newinit super send /Times-Bold 30 null /settextparams self send } def /PaintCanvas { /PaintCanvas super send /size self send 2 div exch 2 div exch moveto /textfont self send setfont 0 setgray CurrentKey cshow } def /setcurrentkey { /CurrentKey exch def /paint self send } def /HandleKey { % event => - /Name get dup 128 gt { 128 sub cvis (-M) append }{ cvis } ifelse /setcurrentkey self send } def /MakeInterests { /HandleKey Canvas soften buildsend Canvas /metakeys ClassKeysInterest send } def classend def KeyCanvas nullarray framebuffer /newdefault ClassBaseFrame send (OPENLOOK Frame) /setlabel 2 index send (Status:) (totally awesome) /setfooter 3 index send 100 100 200 200 /reshape 5 index send /activate 1 index send /map exch send %newprocessgroup %currentfile closefile SHAR_EOF fi if test -f 'AnotherMenu' then echo shar: "will not over-write existing file 'AnotherMenu'" else cat << \SHAR_EOF > 'AnotherMenu' % % A menu with multiple callbacks % /SCanvas ClassCanvas dictbegin /Message (Your Momma) def /Grey 0 def dictend classbegin /newinit { /newinit super send /Times-Bold 30 null /settextparams self send [ (Your Momma) null { (your Mother) /setmessage /sendtarget 4 -1 roll send } (Your Daddy) null { (your Father) /setmessage /sendtarget 4 -1 roll send } (Grey) null { .8 /setcolor /sendtarget 4 -1 roll send } (Black) null { 0 /setcolor /sendtarget 4 -1 roll send } ] framebuffer /new OpenLookMenu send true /setpinnable 2 index send (Message) /setlabel 2 index send /setmenu self send } def /PaintCanvas { 1 fillcanvas /size self send 2 div exch 2 div exch moveto /textfont self send setfont Grey setgray Message cshow } def /setmessage { /Message exch def /paint self send } def /setcolor { /Grey exch def /paint self send } def classend def SCanvas [] framebuffer /new OpenLookBaseFrame send (OPENLOOK Frame) /setlabel 2 index send (Status:) (Amazing) /setfooter 3 index send 100 100 200 200 /reshape 5 index send /activate 1 index send /map 1 index send /SimpleHello exch def newprocessgroup currentfile closefile SHAR_EOF fi if test -f 'Circle' then echo shar: "will not over-write existing file 'Circle'" else cat << \SHAR_EOF > 'Circle' % % Circle Rubberband % /DrawCanvas ClassCanvas [] classbegin /DoCircle { % event => - pop { Canvas InitOverlay } { % forked process handling drags erasepage x y x0 y0 points2rect ovalpath stroke } { Canvas setcanvas x y x0 y0 points2rect ovalpath stroke } /UpTransition getfromuser } def /MakeInterests { /MakeInterests super send /LeftMouseButton /DoCircle /DownTransition Canvas /MakeInterest self send } def classend def DrawCanvas [/Reshape false] framebuffer /newdefault ClassBaseFrame send (Circle) /setlabel 2 index send 100 100 300 300 /reshape 5 index send /activate 1 index send /map 1 index send /f exch def newprocessgroup currentfile closefile SHAR_EOF fi if test -f 'Resize' then echo shar: "will not over-write existing file 'Resize'" else cat << \SHAR_EOF > 'Resize' % % Resize test % /RCanvas ClassCanvas [] classbegin /newinit { /newinit super send null 100 200 100 rgbcolor null /setcolors self send } def /reshape { /reshape super send (Canvas - % % Parent - % %\n) [/size self send /size /parent self send send] printf } def classend def /ButtonBag FlexBag [] classbegin /newinit { /newinit super send /b [/c { self WIDTH .5 mul self HEIGHT .5 mul } (Button) nullnotify OpenLookButton] /addclient self send } def classend def /TwoBag ClassBag [] classbegin /PanelPixels 30 def /newinit { /newinit super send /topclient ButtonBag /addclient self send /bottomclient RCanvas /addclient self send 40 200 /lockminsize self send } def /PaintCanvas { FillColor /FillCanvas self send } def /Layout { /bottomclient /getbyname self send { BagBegin 0 0 /size self send PanelPixels sub /reshape 6 -1 roll send BagEnd } if /topclient /getbyname self send { BagBegin 0 /size self send % 0 bw bh PanelPixels sub exch PanelPixels % 0 bh' bw /reshape 6 -1 roll send BagEnd } if } def classend def TwoBag nullarray framebuffer /newdefault ClassBaseFrame send (Automatic Resize) /setlabel 2 index send 100 100 300 300 /reshape 5 index send /activate 1 index send /map 1 index send /f exch def SHAR_EOF fi if test -f 'FrameOpen' then echo shar: "will not over-write existing file 'FrameOpen'" else cat << \SHAR_EOF > 'FrameOpen' % % Simple Frame % /F OpenLookBaseFrame [] classbegin % % Override to catch transition to or from icon % /open { % bool => - dup {(icon -> frame\n)} {(frame -> icon\n)} ifelse console exch [] fprintf /open super send } def classend def null nullarray framebuffer /new F send (OPENLOOK Frame) /setlabel 2 index send (Status:) (totally awesome) /setfooter 3 index send 100 100 200 200 /reshape 5 index send /activate 1 index send /map 1 index send /f exch def newprocessgroup currentfile closefile SHAR_EOF fi if test -f 'OldButtons' then echo shar: "will not over-write existing file 'OldButtons'" else cat << \SHAR_EOF > 'OldButtons' % % Example of Bags and Buttons % /SimpleCanvas ClassCanvas dictbegin /Message (Hello Programmers) def /Position (Middle) def dictend classbegin /newinit { /newinit super send /Times-Bold 20 null /settextparams self send [ (Your Momma) (Your Daddy) (Your Sister) ] null /setmessage self soften buildsend framebuffer /new OpenLookMenu send true /setpinnable 2 index send (Message) /setlabel 2 index send /setmenu self send } def /setmessage { /valuething exch send /Message exch def /paint self send } def /setposition { /Position exch def /paint self send } def /PaintCanvas { /PaintCanvas super send Position { (Left) { /size self send 2 div 10 exch moveto pop } (Middle) { /size self send 2 div exch 2 div exch moveto } (Right) { /size self send 2 div exch 40 sub exch moveto } (Sideways) { /size self send 2 div exch 2 div exch moveto 90 rotate } } case TextFont setfont Message cshow } def classend def /ButtonBag ClassBag [] classbegin /ButtonWidth 70 def /ButtonHeight 25 def /ButtonGap 30 def /newinit { /left (Left) /doupdate self soften buildsend self soften /new OpenLookButton send /addclient self soften send /middle (Middle) /doupdate self soften buildsend self soften /new OpenLookButton send /addclient self soften send /right (Right) /doupdate self soften buildsend self soften /new OpenLookButton send /addclient self soften send /sideways (Sideways) /doupdate self soften buildsend self soften /new OpenLookButton send /addclient self soften send } def /PaintCanvas { FillColor /FillCanvas self send } def /doupdate { % button => - /graphic exch send /thing exch send dup (Status:) exch /setfooter /Parent /Parent self send send send cvn /setposition /bottomclient /getbyname /Parent self send send pop send } def /Layout { BagBegin 2 dict begin /xposition /size self send pop % w /clientcount self send dup % w n n ButtonWidth mul exch % w bw*n n 1 sub ButtonGap mul % w bw*n bg*n-1 add sub 2 div floor def /yposition /size self send exch pop 2 div 10 sub floor def /clientlist self send { xposition yposition ButtonWidth ButtonHeight /reshape 6 -1 roll send /xposition xposition ButtonWidth ButtonGap add add def } forall end BagEnd } def classend def /TwoBag ClassBag [] classbegin /PanelPercentage .20 def /newinit { /newinit super send /topclient exch /addclient self send /bottomclient exch /addclient self send } def /PaintCanvas { FillColor /FillCanvas self send } def /Layout { /bottomclient /getbyname self send { BagBegin 0 0 /size self send 1 PanelPercentage sub mul floor /reshape 6 -1 roll send BagEnd } if /topclient /getbyname self send { BagBegin /size self send 2 dict begin /bh exch def /bw exch def 0 bh 1 PanelPercentage sub mul floor bw bh PanelPercentage mul floor /reshape 6 -1 roll send end BagEnd } if } def classend def /f [[SimpleCanvas] [ButtonBag] TwoBag] nullarray framebuffer /newdefault ClassBaseFrame send def /reshapefromuser f send /activate f send /map f send (Bags and Buttons with TNT) /setlabel f send (Status:) (Waiting for Request) /setfooter f send SHAR_EOF fi if test -f 'HelpProblem' then echo shar: "will not over-write existing file 'HelpProblem'" else cat << \SHAR_EOF > 'HelpProblem' % % Color Buttons! % /ButtonBag FlexBag [] classbegin /HelpProc { % object -> - /popuphelp self /parentdescendant ClassFrame send pop send } def % The help label and text comes from this dictionary. % /helpdict dictbegin /Label (tNtmacs (user interface for GNU Emacs)) def /Text [ (The tntmacs user interface for GNU Emacs consists of to major parts:) (Info--- the GNU emacs manual browser) ] def dictend def /newinit { /newinit super send /b2 [ /w {20 20} %{/e /b1 POSITION 20 20 XYADD} (Button2) [ (Help) null {pop f /HelpProc f send } (One) null { pop } ] framebuffer /new OpenLookMenu send null OpenLookButtonStack ] /addclient self send % set the fill color for the button %null ColorDict /Green get null /setcolors % /b1 /getbyname self send pop send %null ColorDict /Wheat get null /setcolors % /b2 /getbyname self send pop send } def classend def ButtonBag nullarray framebuffer /newdefault ClassBaseFrame send (ONE Button) /setlabel 2 index send 100 100 200 200 /reshape 5 index send /activate 1 index send /map 1 index send /f exch def newprocessgroup currentfile closefile SHAR_EOF fi if test -f 'FrameQuit' then echo shar: "will not over-write existing file 'FrameQuit'" else cat << \SHAR_EOF > 'FrameQuit' % % Simple Frame % /F OpenLookBaseFrame [] classbegin % % Override to catch quit from either Window or Icon % /destroyfromuser { console (destroy\n) [] fprintf /destroyfromuser super send } def classend def null nullarray framebuffer /new F send (OPENLOOK Frame) /setlabel 2 index send (Status:) (totally awesome) /setfooter 3 index send 100 100 200 200 /reshape 5 index send /activate 1 index send /map exch send newprocessgroup currentfile closefile SHAR_EOF fi if test -f 'PsAngles' then echo shar: "will not over-write existing file 'PsAngles'" else cat << \SHAR_EOF > 'PsAngles' % % PostScript % /SimpleCanvas ClassCanvas dictbegin /Message (PostScript) def dictend classbegin /newinit { /newinit super send /Times-Bold 30 null /settextparams self send 500 500 /lockminsize self send } def /PaintCanvas { 1 fillcanvas 5 5 moveto /textfont self send setfont 0 setgray Message show gsave 100 100 moveto 3 3 scale .8 setgray 30 rotate Message show grestore gsave 10 400 moveto -20 rotate 2 2 scale .6 setgray Message show grestore } def classend def SimpleCanvas nullarray framebuffer /newdefault ClassBaseFrame send (Art Frame) /setlabel 2 index send /place 1 index send /activate 1 index send /map 1 index send /f exch def newprocessgroup currentfile closefile SHAR_EOF fi if test ! -d 'BagDoodles' then mkdir 'BagDoodles' fi cd 'BagDoodles' if test -f 'bag1' then echo shar: "will not over-write existing file 'bag1'" else cat << \SHAR_EOF > 'bag1' % % Subclassing ClassBag % /SimpleCanvas ClassCanvas [] classbegin /PaintCanvas { .5 fillcanvas } def /minsize { 20 20 } def classend def /SimpleBag ClassBag [] classbegin /newinit { /newinit super send % Build two clients for this bag, Instance is created % by the /Instantiate method /c1 [SimpleCanvas] /addclient self send /c2 [SimpleCanvas] /addclient self send } def /Layout { % Set currentcanvas to Bag BagBegin /c1 /getbyname self send { 20 20 /minsize 3 index send /reshape 6 -1 roll send } if /c2 /getbyname self send { 100 20 /minsize 3 index send /reshape 6 -1 roll send } if BagEnd } def /MinSize { % This would be a calculation based on the size % and the position of the clients 200 50 } def classend def [SimpleBag] nullarray framebuffer /newdefault ClassBaseFrame send 10 400 /minsize 3 index send /reshape 5 index send /activate 1 index send /map exch send SHAR_EOF fi if test -f 'bag2' then echo shar: "will not over-write existing file 'bag2'" else cat << \SHAR_EOF > 'bag2' % % Subclassing ClassBag % /SimpleCanvas ClassCanvas [] classbegin /PaintCanvas { .5 fillcanvas } def /minsize { 20 20 } def classend def /SimpleBag ClassBag [] classbegin /newinit { /newinit super send % Build two clients for this bag, Instance is created % by the /Instantiate method /c1 [SimpleCanvas] /addclient self send /c2 [SimpleCanvas] /addclient self send } def /NewClient { % Loaded by Instantiate /newdefault self send 0 0 /minsize 3 index send /reshape 5 index send } def /Layout { % Set currentcanvas to Bag BagBegin /c1 /getbyname self send { 20 20 /move 3 index send } if /c2 /getbyname self send { 100 20 /move 3 index send } if BagEnd } def /MinSize { % This would be a calculation based on the size % and the position of the clients 200 50 } def classend def [SimpleBag] nullarray framebuffer /newdefault ClassBaseFrame send 10 400 /minsize 3 index send /reshape 5 index send /activate 1 index send /map exch send SHAR_EOF fi if test -f 'bag3' then echo shar: "will not over-write existing file 'bag3'" else cat << \SHAR_EOF > 'bag3' % % Subclassing ClassBag % /SimpleCanvas ClassCanvas [] classbegin /PaintCanvas { .5 fillcanvas } def classend def /SimpleBag ClassBag [] classbegin /newinit { /newinit super send % Build two clients for this bag, Instance is created % by the /Instantiate method % Baggage is [x y w h] /c1 [10 10 30 30 SimpleCanvas] /addclient self send /c2 [100 10 10 10 SimpleCanvas] /addclient self send } def /Layout { % Set currentcanvas to Bag BagBegin /clientlist self send { dup /baggage self send aload pop /reshape 6 -1 roll send } forall BagEnd } def /MinSize { % This would be a calculation based on the size % and the position of the clients 200 50 } def classend def [SimpleBag] nullarray framebuffer /newdefault ClassBaseFrame send 10 400 /minsize 3 index send /reshape 5 index send /activate 1 index send /map exch send SHAR_EOF fi if test -f 'bag4' then echo shar: "will not over-write existing file 'bag4'" else cat << \SHAR_EOF > 'bag4' % % Subclass of AbsoluteBag % /SimpleBag AbsoluteBag [] classbegin /newinit { /newinit super send false /settopdown self send % Build two clients for this bag, Instance is created % by the /Instantiate method. Notice the Graphic instance % is used, rather then the class. % Baggage is [x y] /b [10 10 (Button) nullproc OpenLookButton] /addclient self send /g [10 60 (Label) /new OpenLookLabelGraphic send] /addclient self send } def classend def [SimpleBag] nullarray framebuffer /newdefault ClassBaseFrame send 10 400 /minsize 3 index send /reshape 5 index send /activate 1 index send /map exch send SHAR_EOF fi if test -f 'bag5' then echo shar: "will not over-write existing file 'bag5'" else cat << \SHAR_EOF > 'bag5' % % Instance of AbsoluteBag % /B framebuffer /new AbsoluteBag send def false /settopdown B send /b [10 10 (Button) nullproc OpenLookButton] /addclient B send /g [10 60 (Label) /new OpenLookLabelGraphic send] /addclient B send [B] nullarray framebuffer /newdefault ClassBaseFrame send 10 400 /minsize 3 index send /reshape 5 index send /activate 1 index send /map exch send SHAR_EOF fi if test -f 'bag6' then echo shar: "will not over-write existing file 'bag6'" else cat << \SHAR_EOF > 'bag6' % % Subclass of RowColumnBag % /SimpleBag RowColumnBag [] classbegin /newinit { /newinit super send /b1 [(Button1) nullnotify OpenLookButton] /addclient self send /b2 [(Button2) nullnotify OpenLookButton] /addclient self send /b3 [(Button3) nullnotify OpenLookButton] /addclient self send /b4 [(Button4) nullnotify OpenLookButton] /addclient self send /b5 [(Button5) nullnotify OpenLookButton] /addclient self send /b6 [(Button6) nullnotify OpenLookButton] /addclient self send } def /LayoutRows 2 def /LayoutCols 3 def /RowMajor? false def /CellHorzGap 15 def /CellVertGap 15 def /Border 20 def classend def [SimpleBag] nullarray framebuffer /newdefault ClassBaseFrame send 10 400 /minsize 3 index send /reshape 5 index send /activate 1 index send /map exch send SHAR_EOF fi if test -f 'bag7' then echo shar: "will not over-write existing file 'bag7'" else cat << \SHAR_EOF > 'bag7' % % SubClass of FlexBag % /SimpleBag FlexBag [] classbegin /newinit { /newinit super send % The baggage for a flex bag is "corner literal" "proc" % The proc should return the x y coords. % There are a bunch of utilites which can be used in the "proc" /b1 [/sw { 20 20 } (Button1) nullnotify OpenLookButton] /addclient self send /b2 [/w { /e /b1 POSITION 20 20 XYADD } (Button2) nullnotify OpenLookButton] /addclient self send /b3 [/c { /c self WIDTH .75 mul self HEIGHT .5 mul } (Button3) nullnotify OpenLookButton] /addclient self send } def /MinSize { 300 300 } def classend def [SimpleBag] nullarray framebuffer /newdefault ClassBaseFrame send 10 400 /minsize 3 index send /reshape 5 index send /activate 1 index send /map exch send SHAR_EOF fi if test -f 'bag8' then echo shar: "will not over-write existing file 'bag8'" else cat << \SHAR_EOF > 'bag8' % % Bags in Bags ... % % Instance method /simplecanvas framebuffer /new ClassCanvas send def { .5 fillcanvas } /setpaintproc simplecanvas send % instances need to be reshaped before adding them % to a 0 0 200 50 /reshape simplecanvas send /buttonbag framebuffer /new FlexBag send def /b1 [/c {/c self WIDTH .25 mul self HEIGHT .5 mul } (Button1) nullnotify OpenLookButton] /addclient buttonbag send /b2 [/c {/c self WIDTH .75 mul self HEIGHT .5 mul } (Button2) nullnotify OpenLookButton] /addclient buttonbag send 200 50 /lockminsize buttonbag send 0 0 200 50 /reshape buttonbag send /windowbag framebuffer /new RowColumnBag send def true 2 1 /setlayoutstyle windowbag send /c1 simplecanvas /addclient windowbag send /c2 buttonbag /addclient windowbag send [windowbag] nullarray framebuffer /newdefault ClassBaseFrame send 10 400 /minsize 3 index send /reshape 5 index send /activate 1 index send /map 1 index send /f exch def SHAR_EOF fi if test -f 'bag9' then echo shar: "will not over-write existing file 'bag9'" else cat << \SHAR_EOF > 'bag9' % % Bags in Bags ... % % Subclass Method /SimpleCanvas ClassCanvas [] classbegin /PaintCanvas { .5 fillcanvas } def classend def /ButtonBag FlexBag [] classbegin /newinit { /b1 [/c {/c self WIDTH .25 mul self HEIGHT .5 mul } (Button1) nullnotify OpenLookButton] /addclient self send /b2 [/c {/c self WIDTH .75 mul self HEIGHT .5 mul } (Button2) nullnotify OpenLookButton] /addclient self send 200 50 /lockminsize self send } def classend def /WindowBag RowColumnBag [] classbegin /newinit { true 2 1 /setlayoutstyle self send /c1 [ButtonBag] /addclient self send /c2 [SimpleCanvas] /addclient self send } def classend def [WindowBag] nullarray framebuffer /newdefault ClassBaseFrame send 10 400 /minsize 3 index send /reshape 5 index send /activate 1 index send /map 1 index send /f exch def SHAR_EOF fi if test -f 'tntbagdoodles' then echo shar: "will not over-write existing file 'tntbagdoodles'" else cat << \SHAR_EOF > 'tntbagdoodles' % % Bag Doodles % % Subclassing Examples % % Do it all yourself style % /ButtonBag1 ClassBag [] classbegin /newinit { /newinit super send % Build two clients for this bag, Instance is created % by the /Instantiate method /b1 [(Button1) nullnotify OpenLookButton] /addclient self send /b2 [(Button2) nullnotify OpenLookButton] /addclient self send } def /Layout { BagBegin /b1 /getbyname self send { 20 20 /minsize 3 index send /reshape 6 -1 roll send } if /b2 /getbyname self send { 100 20 /minsize 3 index send /reshape 6 -1 roll send } if BagEnd } def /MinSize { % This would probably be some calculation based on % the size of the clients 200 50 } def classend def % % AbsoluteBags handle simple layout % /ButtonBag2 AbsoluteBag [] classbegin /newinit { /newinit super send % Coordinates measured from bottom up false /settopdown self send % The coordinates become the "baggage" for each client /b1 [20 20 (Button1) nullnotify OpenLookButton] /addclient self send /b2 [100 20 (Button2) nullnotify OpenLookButton] /addclient self send } def /MinSize { % This would probably be some calculation based on % the size of the clients 200 50 } def classend def % % RowColumnBags for common layout algorithms % /ButtonBag3 RowColumnBag [] classbegin /newinit { /newinit super send /b1 [(Button1) nullnotify OpenLookButton] /addclient self send /b2 [(Button2) nullnotify OpenLookButton] /addclient self send /b3 [(Button3) nullnotify OpenLookButton] /addclient self send /b4 [(Button4) nullnotify OpenLookButton] /addclient self send /b5 [(Button5) nullnotify OpenLookButton] /addclient self send /b6 [(Button6) nullnotify OpenLookButton] /addclient self send } def /LayoutRows 2 def /LayoutCols 3 def /RowMajor? false def /CellHorzGap 15 def /CellVertGap 15 def /Border 20 def classend def % % FlexBags for more complex layout needs % /ButtonBag4 FlexBag [] classbegin /newinit { /newinit super send % The baggage for a flex bag is "corner literal" "proc" % The proc should return the x y coords. % There are a bunch of utilites which can be used in the "proc" /b1 [/sw { 20 20 } (Button1) nullnotify OpenLookButton] /addclient self send /b2 [/w { /e /b1 POSITION 20 20 XYADD } (Button2) nullnotify OpenLookButton] /addclient self send /b3 [/c { /c self WIDTH .75 mul self HEIGHT .5 mul } (Button3) nullnotify OpenLookButton] /addclient self send } def /MinSize { 300 300 } def classend def % % No Subclassing % % AbsoluteBag % /buildabuttonbag1 { /AButtonBag1 framebuffer /new AbsoluteBag send def /b1 [20 20 (Button1) nullnotify OpenLookButton] /addclient AButtonBag1 send /b2 [100 20 (Button2) nullnotify OpenLookButton] /addclient AButtonBag1 send false /settopdown AButtonBag1 send 200 50 /lockminsize AButtonBag1 send AButtonBag1 } def % % RowColumnBag % /buildabuttonbag2 { /AButtonBag2 framebuffer /new RowColumnBag send def /b1 [(Button1) nullnotify OpenLookButton] /addclient AButtonBag2 send /b2 [(Button2) nullnotify OpenLookButton] /addclient AButtonBag2 send /b3 [(Button3) nullnotify OpenLookButton] /addclient AButtonBag2 send /b4 [(Button4) nullnotify OpenLookButton] /addclient AButtonBag2 send /b5 [(Button5) nullnotify OpenLookButton] /addclient AButtonBag2 send /b6 [(Button6) nullnotify OpenLookButton] /addclient AButtonBag2 send false 3 2 /setlayoutstyle AButtonBag2 send AButtonBag2 } def /bagfun { % class|Instance => - dup /class? exch send { dup /superclasses exch send dup length 1 sub get /classname exch send (Subclass of %) exch 1 array astore sprintf }{ dup /class exch send /classname exch send (Instance of %) exch 1 array astore sprintf } ifelse /s exch def nullarray framebuffer /newdefault ClassBaseFrame send s /setlabel 2 index send 10 400 /minsize 3 index send /reshape 5 index send /activate 1 index send /map 1 index send /client exch send /B exch def } def % %citation 14: psh %executive %Welcome to X11/NeWS Version 2.0 %PS> (TnTtalks/tntbagdoodles) LoadFile == %true %PS> ButtonBag1 bagfun %PS> B == %canvas(0x44a680,200x50,transparent,parent) %PS> /paint B send %PS> /clientlist B send == %[canvas(0x44a750,63x21,transparent) canvas(0x44a8f0,72x21,transparent)] %PS> /b1 /getbyname B send stack %canvas(0x44a750,63x21,transparent) true %PS> clear %PS> gsave B setcanvas 20 30 /move /b1 /sendclient B send /paint B send grestore % % %PS> ButtonBag2 bagfun %PS> /b1 /getbyname B send pop %PS> /Baggage get == %[20 20] % %PS> ButtonBag3 bagfun %PS> false 3 2 /setlayoutstyle B send %PS> 10 400 /minsize /parent B send send /reshape /parent B send send %PS> %PS> ButtonBag4 bagfun %PS> /b4 [/s {/n /b2 POSITION 0 50 XYADD} %PS> (Button4) nullnotify OpenLookButton] /addclient B send %PS> /paint B send %PS> /b4 /getbyname B send pop %PS> /Baggage get == %[/s {/n /b2 POSITION 0 50 XYADD}] %PS> buildabuttonbag1 bagfun %PS> buildabuttonbag2 bagfun SHAR_EOF fi if test -f 'bag8fix' then echo shar: "will not over-write existing file 'bag8fix'" else cat << \SHAR_EOF > 'bag8fix' % % Bags in Bags ... % % Instance method /simplecanvas framebuffer /new ClassCanvas send def { .5 fillcanvas } /setpaintproc simplecanvas send % instances need to be reshaped before adding them % to a bag with the standard NewClient 0 0 200 50 /reshape simplecanvas send /buttonbag framebuffer /new FlexBag send def /b1 [/c {/c self WIDTH .25 mul self HEIGHT .5 mul } (Button1) nullnotify OpenLookButton] /addclient buttonbag send /b2 [/c {/c self WIDTH .75 mul self HEIGHT .5 mul } (Button2) nullnotify OpenLookButton] /addclient buttonbag send 200 50 /lockminsize buttonbag send % instances need to be reshaped before adding them % to a bag with the standard NewClient 0 0 200 50 /reshape buttonbag send /windowbag framebuffer /new RowColumnBag send def true 2 1 /setlayoutstyle windowbag send /c1 simplecanvas /addclient windowbag send /c2 buttonbag /addclient windowbag send [windowbag] nullarray framebuffer /newdefault ClassBaseFrame send 10 400 /minsize 3 index send /reshape 5 index send /activate 1 index send /map 1 index send /f exch def SHAR_EOF fi cd .. if test -f 'pswin' then echo shar: "will not over-write existing file 'pswin'" else cat << \SHAR_EOF > 'pswin' #! /bin/sh USAGE="Usage: pswin PS-file" if [ ${#} -ne 1 ]; then echo ${USAGE}; exit 1 fi psh < 'scoutclock' %! %%Creator: David A. LaVallee %%Owner: Sun Microsystems, Inc. copyright 1989 %%+ %%+ Inspired by the Brent K. Thaeler, Josh Seigel Digital Clock %%+ /TimeOfDay ClassCanvas [/Sec /Min /Hour /Date /Day /Month /Year] classbegin /newinit { /newinit super send gettime gettick } def /TextFont /GillSans-Bold findfont 32 scalefont def /PaintCanvas { FillColor fillcanvas TextColor setcolor TextFont setfont 10 70 moveto Hour (:) Min 2 {append} repeat show 10 40 moveto DAYS Day get ( ) Date dup (th ) exch dup length 1 sub get cvis { (1) {pop (st )} (2) {pop (nd )} (3) {pop (rd )} } case 3 {append} repeat show 10 10 moveto MONTHS Month get ( ) Year 2 {append} repeat show } def /gettime { [ (%socketc13) (r) file dup 60 string readstring pop exch closefile ( ) search pop /Day exch def pop ( ) search pop /Month exch def pop ( ) search pop /Date exch def pop (:) search pop /Hour exch def pop (:) search pop /Min exch def pop ( ) search pop /Sec exch def pop (\n) search pop /Year exch def pop cleartomark } def /gettick { Canvas createevent dup begin /Name /TimeOfDay def /Canvas 3 -1 roll def /TimeStamp currenttime 1 add def end sendevent } def /DAYS 7 dict dup begin /Mon (Monday) def /Tue (Tuesday) def /Wed (Wednesday) def /Thu (Thursday) def /Fri (Friday) def /Sat (Saturday) def /Sun (Sunday) def end def /MONTHS 12 dict dup begin /Jan (January) def /Feb (February) def /Mar (March) def /Apr (April) def /May (May) def /Jun (June) def /Jul (July) def /Aug (August) def /Sep (September) def /Oct (October) def /Nov (November) def /Dec (December) def end def /UpdateTimeOfDay { gettime gettick Canvas setcanvas 0 0 size rectpath extenddamage } def /MakeInterests { /MakeInterests super send /TimeOfDay /UpdateTimeOfDay null Canvas MakeInterest } def classend def /win [TimeOfDay] [/Reshape false /Footer false] framebuffer /newdefault ClassBaseFrame send def 0 0 280 130 /reshape win send /activate win send /place win send /map win send SHAR_EOF fi if test -f '..NewDocument' then echo shar: "will not over-write existing file '..NewDocument'" else cat << \SHAR_EOF > '..NewDocument' SHAR_EOF fi if test -f '..#HelloMenuPullRight#' then echo shar: "will not over-write existing file '..#HelloMenuPullRight#'" else cat << \SHAR_EOF > '..#HelloMenuPullRight#' /SimpleCanvas ClassCanvas dictbegin /Message (Your Momma) def dictend classbegin /newinit { /newinit super send /Times-Bold 30 null /settextparams self send [ (New Message) [ (Your Momma) (Your Daddy) (Your Sister) ] null { /valuething 1 index send /setmessage /sendtarget 4 -1 roll send } framebuffer /new OpenLookMenu send null (New Font) [ (Times-Roman) (Times-Italic) (Times-Bold) ] null { /valuething 1 index send cvn /setfontname /sendtarget 4 -1 roll send } framebuffer /new OpenLookMenu send null ] framebuffer /new OpenLookMenu send true /setpinnable 2 index send (Message) /setlabel 2 index send /setmenu self send } def /PaintCanvas { 1 fillcanvas /size self send 2 div exch 2 div exch moveto /textfont self send setfont 0 setgray Message cshow } def /setmessage { % string => - /Message exch def /paint self send } def /setfontname { % fontname => - null null /settextparams self send /paint self send } def classend def SimpleCanvas nullarray framebuffer /new OpenLookBaseFrame send (HelloMenu with a PullRight) /setlabel 2 index send (Status:) (totally awesome) /setfooter 3 index send 100 100 400 200 /reshape 5 index send /activate 1 index send /map 1 index send /f exch def newprocessgroup currentfile closefile SHAR_EOF fi if test -f 'flippers.ps' then echo shar: "will not over-write existing file 'flippers.ps'" else cat << \SHAR_EOF > 'flippers.ps' % flippers.ps: creates a canvas that (when it has the focus) flips flippers % based on the state of the shift keys. /FlipperCanvas ClassCanvas dictbegin /Left false def /Right false def dictend classbegin % Give this canvas a 0-1 0-1 coordinate system. /Transform { % x y w h => x' y' w' h 4 2 roll % w h x y translate % w h scale % - 0 0 1 1 } def /PaintCanvas { FillColor /FillCanvas self send .2 .5 moveto .25 Left .1 -.1 ifelse rlineto .8 .5 moveto -.25 Right .1 -.1 ifelse rlineto .025 setlinewidth StrokeColor setcolor stroke } def /KeyMap dictbegin /LeftShift /keyforsymbol ClassKeyboard send /Left def /RightShift /keyforsymbol ClassKeyboard send /Right def dictend def /MakeInterests { /MakeInterests super send self soften /new ClassFocusSelfInterest send % Nint dup [true /KeyEvent] self soften buildsend [false /KeyEvent] self soften buildsend [KeyMap] nulldict /new ClassKeysInterest send % Nint Nint Kint dup /Exclusivity false put /addsuite exch send % Nint } def /KeyEvent { % event bool => - exch /Name get exch def /paint self send } def classend def /fc FlipperCanvas nullarray framebuffer /newdefault ClassBaseFrame send def (Flippers) /setlabel fc send /activate fc send /reshapefromuser fc send /map fc send SHAR_EOF fi if test -f 'FunnyCanvas' then echo shar: "will not over-write existing file 'FunnyCanvas'" else cat << \SHAR_EOF > 'FunnyCanvas' % % FunnyCanvas % /FunnyCanvas ClassCanvas [] classbegin /path { pop pop pop pop 0 0 moveto 100 100 rect 150 150 moveto 200 200 rect } def /newinit { /newinit super send false /settransparent self send } def /PaintCanvas { .8 fillcanvas } def classend def /c framebuffer /new FunnyCanvas send def 0 0 400 400 /reshape c send /activate c send /map c send % %FunnyCanvas nullarray framebuffer /newdefault ClassBaseFrame send %(Funny Frame) /setlabel 2 index send %/place 1 index send %/activate 1 index send %/map 1 index send %/f exch def % %newprocessgroup %currentfile closefile SHAR_EOF fi if test -f 'SimpleAppBag' then echo shar: "will not over-write existing file 'SimpleAppBag'" else cat << \SHAR_EOF > 'SimpleAppBag' % The following example code shows how an application programmer % might typically subclass ClassBag, and use the result as the client % of an OpenLook frame (or any bag for that matter). % The task of a SimpleAppBag is to provide the layout policy for a basic % OpenLook application. The inside of the window in such an application % is occupied by two areas -- a control area of fixed height, and a % stretchable canvas that is the main focus of interraction. A % SimpleAppBag manages these two canvases. % The control area sits above the stretchable canvas, and both must % adjust their widths to fill the frame interior when the user reshapes % the frame. /SimpleAppBag ClassBag [] classbegin % This bag always has exactly two clients. It expects them % to be presented as arguments to /new, and hence consumes them % during /newinit. This bag takes the responsibility of giving % names to clients: /Fixed for the upper area, and /Floating % for the lower stretchable region. No baggage is required for % clients of a SimpleAppBag. % /newinit { % fixed-client floating-client -> - /Floating exch /addclient self send /Fixed exch /addclient self send { % We set the height of the /Fixed client once to its % ideal size, and never alter in again. Arguably, we % shouldn't mess with it at all and just trust the % application to hand in a canvas with the desired height. % This approach fails though when the application passes in a % class rather than an instance. % % The "0 0" and width arguments to /reshape are just % placeholders -- they are overridden in % /Layout. % 0 0 /minsize self send /reshape self send } /Fixed /sendclient self send } def % Here's where we decide how small we allow the user to make % this bag and its clients. Since we aren't overriding % /preferredsize as well, its /preferrsedsize will default to % its /minsize. In the calculation below, we say that the min width % is the maximum of the min widths for each of the clients, and the % min height is the sum of the min heights of the clients. This is % the obvious choice given the layout of the bag. % % Subtle point: we override /MinSize rather than /minsize % just in case one of our clients is a graphic rather than a % canvas as expected. When graphics calculate their minimum size % they make use of the current canvas. Overriding /MinSize allows % us to assume that the bag *is* the current canvas. % /MinSize { % - -> w h /minsize /Fixed /sendclient self send % w1 h1 /minsize /Floating /sendclient self send % w1 h1 w2 h2 3 -1 roll add 3 1 roll max exch % max(w1,w2) h1+h2 } def % This procedure is called automatically just before painting % the bag *if* something has changed in the bag's geometry since % the last time it was called. See `Layout and Invalidation' % % Here we reshape the two clients to fill the space available % in the bag (as returned by /size self send). The /Fixed client % may be stretched horizontally, but its height will not change. % The floating client will be streched in both dimensions to % take up the rest of the space. % /Layout { % - -> - /size /Fixed /sendclient self send exch pop % h-Fi /size self send % h-Fi w h 2 index sub % h-Fi w h' 0 1 index 3 index 6 -1 roll % w h' 0 w h-Fi /reshape /Fixed /sendclient self send % w h' 0 0 4 2 roll /reshape /Floating /sendclient self send } def % This type of bag doesn't want to stroke its border or fill itself % so we give it a null paint proc. % /PaintCanvas nullproc def classend def % % Below we show how a SimpleAppBag might be used in an application. % We make the /Fixed client a FlexBag with a couple of controls in it, % and the /Floating client a brightly colored canvas. /ColorCanvas ClassCanvas [] classbegin /setrgb { % rvalue gvalue bvalue -> - /FillColor 4 1 roll rgbcolor def /paint self send } def /minsize { % - -> minw minh 50 50 } def classend def /ControlArea FlexBag [] classbegin /PaddingWidth 10 def % Leave some space around controls /PaddingHeight 10 def % Ditto /PaintCanvas nullproc def % No paint is fine here % Set every client to its preferred size, when it is added % to the bag. This obviates the need for tedious reshaping % code outside the bag. % /RegisterClient { % name client -> - 0 0 /preferredsize 3 index send /reshape 5 index send /RegisterClient super send } def classend def % Make the stretchable color canvas /cc framebuffer /new ColorCanvas send def % Make three buttons to put in the flexbag /bb (Black) {0 0 0 /setrgb /sendtarget 6 -1 roll send} framebuffer /new OpenLookButton send def 0 0 /preferredsize bb send /reshape bb send /wb (White) {1 1 1 /setrgb /sendtarget 6 -1 roll send} framebuffer /new OpenLookButton send def 0 0 /preferredsize wb send /reshape wb send /rb (Random) {random random random /setrgb /sendtarget 6 -1 roll send} framebuffer /new OpenLookButton send def 0 0 /preferredsize rb send /reshape rb send % Make the color canvas the target of all buttons. cc /settarget bb send cc /settarget wb send cc /settarget rb send % Make the flexbag and add the buttons to it. /fb framebuffer /new ControlArea send def null [/nw {/nw self POSITION 10 -10 XYADD} bb] /addclient fb send null [/nw {/sw Previous POSITION 10 sub} wb] /addclient fb send null [/ne {/ne self POSITION 10 10 XYSUB} rb] /addclient fb send % Create a frame containing a SimpleAppBag which in turn contains % the flexbag and the color canvas. /win [fb cc SimpleAppBag] [/Footer false] framebuffer /new OpenLookBaseFrame send def (Bag Subclassing) /setlabel win send /place win send /activate win send /map win send newprocessgroup currentfile closefile SHAR_EOF fi if test -f 'scouticoneditor' then echo shar: "will not over-write existing file 'scouticoneditor'" else cat << \SHAR_EOF > 'scouticoneditor' %! %%tnt1.0 %%Creator: David A. LaVallee scout@sun.com %%Owner: Sun Microsystems, Inc. copyright 1989 %%+ %%BeginningOf: IconEditor %%+ Icon editor 16 32 64 square bit editor. /SmallIcon ClassCanvas [ /bitsize /iconsize /bitmap /clear? /pointlist /Complete /minx /miny /maxx /maxy ] classbegin /newinit { /newinit super send /bitmap exch def /pointlist [] def /clear? false def /Complete {stroke} def } def /PaintCanvas { 0 setgray bitmap imagecanvas } def /setibsize { /bitsize exch def /iconsize exch def } def /pointfeedback { % x y => x y } def /addpaintpoint { % x y => - pointlist length 0 eq { 0 index dup /miny exch def /maxy exch def 1 index dup /minx exch def /maxx exch def } { dup miny min /miny exch def dup maxy max /maxy exch def 1 index minx min /minx exch def 1 index maxx max /maxx exch def } ifelse pointfeedback [3 1 roll] [exch] pointlist exch append /pointlist exch def } def /adddamagepath { % x y w h => - canvas setcanvas rectpath extenddamage } def /paintpointlist { bitmap setcanvas /style parent send /EraseIt eq {1} {0} ifelse setgray pointlist {aload pop 1 add moveto 0 0 rlineto stroke} forall /pointlist [] def minx miny maxx 1 add maxy 1 add points2rect /adddamagepath parent send } def /paintlinelist { bitmap setcanvas /style parent send /EraseIt eq {1} {0} ifelse setgray pointlist 0 get aload pop 1 add moveto pointlist {aload pop 1 add lineto} forall /style parent send /FillIt eq {closepath fill} {stroke} ifelse /pointlist [] def minx miny maxx 1 add maxy 1 add points2rect /adddamagepath parent send } def /paintline { bitmap setcanvas /style parent send { /StrokeIt {0} /FillIt {0} /EraseIt {1} /default {0} } case setgray 4 copy 4 2 roll 1 add moveto 1 add lineto stroke points2rect 1 add exch 1 add exch /adddamagepath parent send } def /paintrect { bitmap setcanvas 4 copy /style parent send { /StrokeIt {/Complete {eofill} def 0} /FillIt {/Complete {fill} def 0} /EraseIt {/Complete {fill} def 1} /default {/Complete {eofill} def 0} } case setgray 1 5 1 roll points2rect 1 add exch 1 add exch rectframe Complete points2rect 1 add exch 1 add exch /adddamagepath parent send } def /HandleDrag { canvas setcanvas begin XLocation YLocation end addpaintpoint } def /HandlePoint { canvas setcanvas begin XLocation YLocation end /clear? false def addpaintpoint [ /MouseDragged /HandleDrag null canvas MakeInterest null { pop currentprocess killprocess } /UpTransition null MakeInterest ] forkeventmgr pop } def /HandleUp { paintpointlist } def /HandleAdjust { canvas setcanvas begin XLocation YLocation end /clear? true def addpaintpoint } def /MakeInterests { /MakeInterests super send PointButton /HandlePoint /DownTransition Canvas MakeInterest PointButton /HandleUp /UpTransition Canvas MakeInterest AdjustButton /HandlePoint /DownTransition Canvas MakeInterest AdjustButton /HandleUp /UpTransition Canvas MakeInterest } def classend def /BigIcon SmallIcon [/strokelength /x0 /y0 /x1 /y1] classbegin /HandleDrag { /mode parent send { (Point) { canvas setcanvas gsave bitsize 1 add dup scale begin XLocation truncate cvi YLocation truncate cvi end addpaintpoint grestore } (Polyline) { canvas setcanvas gsave bitsize 1 add dup scale begin XLocation truncate cvi YLocation truncate cvi end addpaintpoint grestore } (Line) { erasepage begin XLocation truncate cvi YLocation truncate cvi end /y1 exch def /x1 exch def x0 .5 add y0 .5 add moveto x1 .5 add y1 .5 add lineto stroke } (Rect) { erasepage begin XLocation truncate cvi YLocation truncate cvi end /y1 exch def /x1 exch def x0 .5 add y0 .5 add x1 .5 add y1 .5 add points2rect rectpath stroke } } case } def /HandlePoint { /mode parent send { (Point) { canvas setcanvas gsave bitsize 1 add dup scale begin XLocation truncate cvi YLocation truncate cvi end /clear? false def addpaintpoint grestore } (Polyline) { canvas setcanvas gsave bitsize 1 add dup scale begin XLocation truncate cvi YLocation truncate cvi end /clear? false def addpaintpoint grestore } (Line) { canvas createoverlay setcanvas bitsize 1 add dup scale begin XLocation truncate cvi YLocation truncate cvi end /y0 exch def /x0 exch def /y1 y0 def /x1 x0 def } (Rect) { canvas createoverlay setcanvas bitsize 1 add dup scale begin XLocation truncate cvi YLocation truncate cvi end /y0 exch def /x0 exch def /y1 y0 def /x1 x0 def } } case [ /MouseDragged /HandleDrag null canvas MakeInterest null { pop currentprocess killprocess } /UpTransition null MakeInterest ] forkeventmgr pop } def /HandleAdjust { /mode parent send { (Point) { canvas setcanvas gsave bitsize 1 add dup scale begin XLocation truncate cvi YLocation truncate cvi end /clear? true def addpaintpoint grestore } } case } def /HandleUp { pop /mode parent send { (Point) { paintpointlist } (Polyline) { paintlinelist } def (Line) { erasepage canvas setcanvas x0 y0 x1 y1 paintline } (Rect) { erasepage canvas setcanvas x0 y0 x1 y1 paintrect } } case } def /pointfeedback { % x y => x y canvas setcanvas gsave 0 1 translate bitsize 1 add dup scale 2 copy moveto .5 setgray 1 1 rlineto -1 0 rmoveto 1 -1 rlineto stroke /mode parent send /Polyline eq pointlist length 0 gt and { 2 copy .5 add exch .5 add exch moveto pointlist dup length 1 sub get aload pop .5 add exch .5 add exch lineto stroke } if grestore } def /PaintCanvas { gsave 1 fillcanvas gsave 0 setgray bitsize 1 add dup scale bitmap imagecanvas grestore .65 setgray 0 bitsize 1 add iconsize bitsize 1 add mul 1 add dup /strokelength exch def { 0 2 copy moveto 0 strokelength rlineto exch 1 add moveto strokelength 0 rlineto } for stroke grestore } def /adddamagepath { % x y w h => - canvas setcanvas bitsize 1 add dup scale rectpath extenddamage } def classend def /IconEditor ClassBag [/iconsize /bitsize /bitmap /mode /style] classbegin /newinit { /newinit super send /iconsize 64 def /bitmap iconsize dup 1 [1 0 0 -1 0 iconsize] {} buildimage def /mode /Point def /style /StrokeIt def /bitsize 6 def /smallicon [bitmap SmallIcon] addclient /bigicon [bitmap BigIcon] addclient 0 0 iconsize dup /reshape /smallicon sendclient 0 0 iconsize bitsize 1 add mul 1 add dup /reshape /bigicon sendclient iconsize bitsize 2 copy /setibsize /smallicon sendclient /setibsize /bigicon sendclient } def /adddamagepath { % x y w h => - /adddamagepath /bigicon sendclient /paint /smallicon sendclient } def /Layout { 10 10 /move /smallicon sendclient 20 iconsize add 10 /move /bigicon sendclient } def /PaintCanvas { .9 fillcanvas 0 setgray } def /minsize { 30 iconsize add iconsize bitsize 1 add mul 1 add dup 3 1 roll add exch 20 add } def /initiatesize { pop % *** } def /changetool { { (Point) { /mode /Point def } (Polyline) {/mode /Polyline def} (Line) { /mode /Line def } (Rect) { /mode /Rect def } (Clear) { gsave bitmap setcanvas 1 fillcanvas grestore paint } } case } def /ToolMenu [ (Point) (Polyline) (Line) (Rect) (Clear) ] null { /valuething 1 index send /changetool /sendtarget 4 -1 roll send } framebuffer /newdefault ClassMenu send def /changestyle { { (Stroke) {/StrokeIt} (Fill) {/FillIt} (Erase) {/EraseIt} } case /style exch def } def /StyleMenu [ (Stroke) (Fill) (Erase) ] null { /valuething 1 index send /changestyle /sendtarget 4 -1 roll send } framebuffer /newdefault ClassMenu send def /changesize { { (16 x 16) {16} (32 x 32) {32} (64 x 64) {64} } case initiatesize } def /SizeMenu [ (16 x 16) (32 x 32) (64 x 64) ] null { /valuething 1 index send /changesize /sendtarget 4 -1 roll send } framebuffer /newdefault ClassMenu send def /fileoperation { { (Write) { bitmap setcanvas (/tmp/screen) writecanvas } /default { } } case } def /FileMenu [ (Write) ] null { /valuething 1 index send /fileoperation /sendtarget 4 -1 roll send } framebuffer /newdefault ClassMenu send def /CanvasMenu [ (Tool) ToolMenu null (Style) StyleMenu null (Size) SizeMenu null (File) FileMenu null ] framebuffer /newdefault ClassMenu send def classend def %%EndOf: IconEditor /win [IconEditor] [] framebuffer /newdefault ClassBaseFrame send def { gsave -1 dup translate .5 setgray clippath fill 0 setgray /bitmap /client win send send imagecanvas grestore } /seticon win send (Icon Editor) /setlabel win send /activate win send 0 0 /minsize /client win send send /fitclient win send /reshape win send /place win send /map win send SHAR_EOF fi if test -f 'Meter' then echo shar: "will not over-write existing file 'Meter'" else cat << \SHAR_EOF > 'Meter' % A MeterCanvas monitors some system parameter and displays its % result digitally in real time. By default the current memory being % used by X/NeWS (the 2nd number returned by vmstatus) is shown. % To change the parameter, hand in a non null executable to /new, % or override /Probe. % % By default the probe is executed every 3 seconds. For simple % probes this has a negligable performance impact. % % Invoke help on this canvas to see what SELECT and ADJUST do. % (In brief, they show absolute and relative sizes respectively.) % /MeterCanvas ClassCanvas dictbegin /ReferenceValue 0 def % Measurement subtracted from this. /LastString nullstring def % Last string kept for un-painting /DangerZone false def dictend classbegin /Probe {vmstatus pop exch pop} def /Timeout 3 60 div def /TextFamily /ZapfChancery-MediumItalic def /TextSize 64 def % Initialize this canvas. % If a procedure is handed in, make it the Probe. % Probe procedures should return exactly one number. % /newinit { % probe-proc|null -> - /newinit super send dup null ne {/Probe exch def} {pop} ifelse } def % Show the exact value of the probe immediately. % Stay in absolute (non-relative) mode thereafter. % /absolute { % event|null -> - pop /ReferenceValue 0 def /update self send } def % Enter relative mode. % All probe values hereafter will be considered relative to % a probe reference value taken *now*. % % Subtle Point: We *really* want the reference value to be % measured next time the timeout happens. That way any space % effects of future timeouts will be cancelled. The DangerZone % variable is used to alert us that this is the case the next % time the timeout comes. % **Erroneous readings will occur if the probed parameter % changes in a non-Heisenburgian way between now and the next % timeout.** We need to find a better way to get the same effect. % Sending an immediate timeout would almost solve this problem. % /relative { % event|null -> - pop /ReferenceValue Probe def /update self send /DangerZone true def } def % A timeout event has come in. % Update the display. See above for DangerZone business. % /timeout { % event|null -> - pop DangerZone { /ReferenceValue Probe def /DangerZone false def } if /update self send } def % If anything has changed, erase the last string (by repainting % it in background color), then paint the new string. % /update { % - -> - Probe ReferenceValue sub 10 string cvs dup LastString ne { % string gsave Canvas setcanvas /textfont self send setfont /FillColor self send setcolor LastString /PaintString self send dup /LastString exch def 1 setgray /PaintString self send % - grestore } {pop} ifelse } def % Show this string in the center of the canvas. % /PaintString { % string -> - /size self send 2 div exch 2 div exch TextSize 4 div sub moveto cshow } def % Repaint the entire canvas. Seeting /Laststring to nullstring % forces update to do its job. % /PaintCanvas { % - -> - FillColor /FillCanvas self send /LastString nullstring def /update self send } def % Interests are expressed for SELECT, ADJUST and timeout events. % /MakeInterests { % - -> interests /MakeInterests super send PointButton /absolute /DownTransition self MakeInterest AdjustButton /relative /DownTransition self MakeInterest Canvas soften /timeout self soften buildsend /new TimerInterest send Timeout Timeout true /settimeouts 4 index send } def % These numbers look good for the default Probe and the default % TextSize. Change them if you subclass. % /preferredsize { 260 60 } def % Show help on this canvas. % /HelpProc { % object -> - /popuphelp self /parentdescendant ClassFrame send pop send } def % The help label and text comes from this dictionary. % /helpdict dictbegin /Label (X11/NeWS Memory Meter) def /Text [ (The number show is the current amount of memory used by the) (X11/NeWS server. It is the 2nd number returned by the) (`vmstatus' operator.) () (In general, a MeterCanvas shows some system parameter as it) (varies in real time. By default the measurement is take) (every 3 seconds.) () (Pressing SELECT takes an absolute measurement immediately.) (Pressing ADJUST puts the meter in relative mode --) (a measurement is taken immediately and remembered.) (Subsequent measurements are subtracted from this number) (before being displayed.) ] def dictend def classend def % A Frame that has no footer or reshape corners, has different selection % feedback, *and* has a crazy jagged path. % Don't ask me what this has to do with meters. % /YeOldFrame OpenLookBaseFrame [] classbegin /Footer false def /Close false def /Reshape false def /FillColor ColorDict /lightgray get def /TextColor ColorDict /white get def /Wiggle 6 def % max amplitute of vibration /Travel 7 def % wavelength of vibration % Here's the randomly jagged path. % Unfortunately it gives a slightly different path each % time its called! % /path { % x y w h -> 10 dict begin /H exch def /W exch def /Y exch def /X exch def X Y moveto X Travel add Travel X W add { % across bottom Y random Wiggle mul add lineto } for Y Travel add Travel Y H add { % up right X W add random Wiggle mul sub exch lineto } for X W add Travel sub Travel neg X { % across top Y H add random Wiggle mul add lineto } for Y H add Travel sub Travel neg Y { % down left X random Wiggle mul add exch lineto } for closepath end } def % Stroking the border of the canvas doesn't work well with % crazy paths like this, so we never call /StrokeCanvas % /PaintCanvas { % - -> - FillColor /FillCanvas self send } def % Since we don't stroke the border, have to work out some other % way to reflect the fact that this frame is selected. % We do it by darkening the fill color. % /reflectselected { % bool -> - /FillColor ColorDict 3 -1 roll /gray /lightgray ifelse get def /paint self send } def classend def /f [null MeterCanvas] [] framebuffer /new YeOldFrame send def (X11/NeWS Memory Usage (Kb)) /setlabel f send /activate f send /place f send /map f send newprocessgroup currentfile closefile SHAR_EOF fi if test -f 'FunnyEZ' then echo shar: "will not over-write existing file 'FunnyEZ'" else cat << \SHAR_EOF > 'FunnyEZ' % % Funny low level % /fixup { pop damagepath % set path to damaged area, clear record gsave % show the damaged area .8 setgray fill .01 sleep grestore 1 fillcanvas } def % Build path for canvas % 0 0 200 200 rectpath 0 0 moveto 100 100 rect 150 150 moveto 200 200 rect % Build canvas /can framebuffer newcanvas dup begin /Transparent false def /Retained false def end def can reshapecanvas can setcanvas 0 0 movecanvas % Event handling /ehandler { createevent dup begin /Name dictbegin /Damaged {fixup} def /RightMouseButton {currentprocess killprocessgroup} def dictend def /Canvas can def end expressinterest { awaitevent } loop } fork def pause can /Mapped true put SHAR_EOF chmod +x 'FunnyEZ' fi if test -f 'ColorButton' then echo shar: "will not over-write existing file 'ColorButton'" else cat << \SHAR_EOF > 'ColorButton' % % Color Buttons! % /ButtonBag FlexBag [] classbegin /newinit { /newinit super send % set the fill color for the bag null ColorDict /Blue get null /setcolors self send %/b1 [/w {10 10} (Button1) nullnotify OpenLookButton] %/addclient self send /b2 [ /w {20 20} %{/e /b1 POSITION 20 20 XYADD} (Button2) [ (One) (Two) (Three) ] null { pop } framebuffer /new OpenLookMenu send null OpenLookButtonStack ] /addclient self send % set the fill color for the button %null ColorDict /Green get null /setcolors % /b1 /getbyname self send pop send %null ColorDict /Wheat get null /setcolors % /b2 /getbyname self send pop send } def classend def ButtonBag nullarray framebuffer /newdefault ClassBaseFrame send (ONE Button) /setlabel 2 index send 100 100 200 200 /reshape 5 index send /activate 1 index send /map 1 index send /f exch def newprocessgroup currentfile closefile SHAR_EOF fi cd .. exit 0 # End of shell archive From don Tue Feb 27 20:24:33 1990 Date: Tue, 27 Feb 90 20:24:33 -0500 To: NeWS-makers@brillig.umd.edu Subject: Docs for tNt, & what is Sun doing? From: David Lau-Kee Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) (a) Has anyone managed to get hold of any tNt documentation? I mailed a sun address a few months ago which purported to be offering docs, got a reply, and I am still waiting. All I have is the codebook and SimpletNt stuff which came off an archive server somewhere. Is that it? Has anyone got the codebook stuff to work under 2.0? What is it supposed to do? Looks like it might be self documenting... shame it bombs before it tells me anything. (b) Does any of the above matter? Recent moves inside Sun suggest that the %%% REMINDS %%% inside NeWS/OL*.ps might just sum up the future of NeWS, just a memory of some unfinished business. Since the person who put them there may be one of those who have moved from Sun I guess "easy migration between platforms" rings true at last. Come on Sun, SORT IT OUT!!! We're getting seriously pissed off at your reluctance to show any commitment to NeWS. Issue a statement detailing your plans for NeWS (no "we're committed to providing standards" bullshit please, you either will or won't continue development and support of NeWS; if you will, then what are your plans? How many people are you going to have working on it? Are they going to be software engineers or distribution secretaries? You had some good people working on NeWS... have they all left in disgust?). If you don't want to support it then that's just fine... give it to the OSF and let someone else make a swan from your albatross. If you won't develop / support, and you refuse to let others do it, then you'll lose customers because I, for one, would rather buy an abacus than deal with anyone that pathetic. [This is not necessarily the view of my employer] ------------- David Lau-Kee Canon Research Centre Europe, 17/20 Frederick Sanger Rd, Surrey Research Park, Guildford, Surrey, GU25YD, UK. NRS: laukee@uk.co.canon, INET: laukee%canon@nsfnet-relay.ac.uk UUCP: laukee@canon.uucp, PATH: ..!mcsun!ukc!uos-ee!canon!laukee Tel: +44 (0) 483 574325 Fax: +44 (0) 483 574360 h From don Tue Feb 27 20:26:52 1990 Date: Tue, 27 Feb 90 20:26:52 -0500 To: NeWS-makers@brillig.umd.edu Subject: Docs for tNt, & what is Sun doing? From: don (Don Hopkins) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) Date: Tue, 27 Feb 90 11:10:38 GMT From: David Lau-Kee [...] Come on Sun, SORT IT OUT!!! We're getting seriously pissed off at your reluctance to show any commitment to NeWS. [...] Here here! -Don From don Tue Feb 27 23:14:44 1990 Date: Tue, 27 Feb 90 23:14:44 -0500 To: NeWS-makers@brillig.umd.edu Subject: What is Sun doing? From: russ@dash.mitre.org (Russell Leighton) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) Date: Tue, 27 Feb 90 11:10:38 GMT From: David Lau-Kee [...] Come on Sun, SORT IT OUT!!! We're getting seriously pissed off at your reluctance to show any commitment to NeWS. [...] Yeh! Since it looks like Sun is abandoning NeWS (wimps!) a suggestion: Sun, why don't you license Display PostScript and NeXTStep? I know NeXT is your arch rival but at least we developers can have our PostScript, you can adhere to "Standards", and most importantly we won't need to deal with X11 ugliness. Russ. ARPA: russ@dash.mitre.org Russell Leighton MITRE Signal Processing Lab 7525 Colshire Dr. McLean, Va. 22102 USA From don Wed Feb 28 12:47:24 1990 Date: Wed, 28 Feb 90 12:47:24 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: Docs for tNt From: David Burgess Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) Re: Message from David Lau-Kee >> Has anyone managed to get hold of any tNt documentation? I also emailed a request, but resubmitted after a wait of a month or so, and got the reply: >>>From: "Robert M. Weisblatt" >>>Message-Id: <9002232241.AA02694@zeus1.sun.com> >>>To: dhb >>>Subject: TNT Reference Manual >>>Status: RO >>> >>>Sorry for the delay we've recently moved buildings and I'm afraid >>>some work got lost in the shuffle. I'm working now to catch up. >>> >>>Re: Is there anything more I have to do to receive the tNt documentation? >>>NO. Manual is on its way. I just want to compare tNt with XView, so I can make some decisions! David Burgess +++++ Astronomy Unit: Queen Mary College, London: +44-1-975-5460 +++++ dhb%uk.ac.qmw.maths@nsf.ac.uk ps: Is there a NeWS2.0 dvi previewer out there? Or a pageview which properly understands the output from dvi2ps? (I know about xdvi and I'm waiting for the announced version of GoodNews to come out.) From don Wed Feb 28 12:47:59 1990 Date: Wed, 28 Feb 90 12:47:59 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: What is Sun doing? From: Peter W. Brewer Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) They are probably too busy worrying about what IBM/NeXT is doing with their new inexpensive workstation. It didn't take IBM long to produce the hdwr.. I guess NeXT is better as a software shop. -Peter Peter Brewer |||| ||||| ||||||||| |||||| //|||||\ |||||| lerici@super.org || ||__ || || || || || THE Supercomputing || || ||^^^^^^\\ || || || Research Center ~~~ |||||||| ||||| || || ||||| \\|||||/ |||||| From don Wed Feb 28 12:48:47 1990 Date: Wed, 28 Feb 90 12:48:47 -0500 To: NeWS-makers@brillig.umd.edu Subject: What is SUN doing? From: korp@atlantis.ees.anl.gov (Peter Korp) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) It is quite sad that Sun has brought itself to this position. Since my last message which asked about NeWS support from third parties I have recieved just two replys. In that time we have seen messages from the grasshopper group and other developers who are giving up hope. I am not just pissed at Sun, but also at the groups that allows Sun to get away all these years with their crap. Being fairly new to NeWS I was impressed with how easy it was to prototype applications and how much more professional they appeared than with other window systems. Now though it is time to move on. Sponsors don't want to be locked into Sun, and NeWS has done just that to us. Sun, if you are really out there, do what is suggested, put OpenWindows into the public domain, or just drop NeWS and license NeXTStep. There is no doubt that this is a "standard" and I won't have to deal with the X nasties! Code is fairly simple to port to NeXTStep if written properly, so why not really become a standards company again??? Peter A. Korp Argonne National Laboratory None of these opinions are my employers or anyone elses. From don Thu Mar 1 02:41:17 1990 Date: Thu, 1 Mar 90 02:41:17 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: What is Sun doing? From: mcsun!sunic!tut!ks@uunet.uu.net (Syst{ Kari) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) In article <9002280156.AA29633@dash.mitre.org> russ@dash.mitre.org (Russell Leighton) writes: Since it looks like Sun is abandoning NeWS (wimps!) Really ???? a suggestion: Sun, why don't you license Display PostScript and NeXTStep? I know NeXT is your arch rival but at least I'm not planning to license it, but what are the technical differences between Display Ps + NextStep and NeWS ? Does anybody know any good references ? -- This article represents my personal views. "X is the Fortran of windowing systems." Kari Systa, Tampere Univ. Technology, Box 527, 33101 Tampere, Finland work: +358 31 162585 fax: +358 31 162913 home: +358 31 177412 From don Thu Mar 1 02:41:35 1990 Date: Thu, 1 Mar 90 02:41:35 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: What is SUN doing? From: phil@scripps.edu (Phil Cohen) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) I hear that OpenWindows is to be distributed as part of System 5 Release 4. Everyone that gets S5R4 will get the source. Sun will retain DeskSet and DevGuide as their added value, so if you want all the cool drag and drop applications you will need to buy Sun. Is there hope for other vendors to include OpenWindows with their S5R4 ports? As far as I am concerned, OpenWindows should be a line item for all future equipment purchases that come out of this operation. Am I dreaming? Phil Cohen Research Institute of Scripps Clinic From don Thu Mar 1 20:52:55 1990 Date: Thu, 1 Mar 90 20:52:55 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: Docs for tNt, & what is Sun doing? From: intercon!news@uunet.uu.net (Amanda Walker) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) [Disclaimer: this article purely my personal opinion, and has nothing to do with InterCon Systems Corporation, even if they do happen to agree :-). It contains blunt statements--engineers may wish to preview before showing it to lawyers or marketing managers...] Sun seems to be shooting itself in the posterior with NeWS. When NeWS 1.0 came out, it was head and shoulders above X10R4 in speed and usefulness, but they didn't push it. It was hard enough to buy even if you *did* want it. It seems from the outside as though there has been an explicit decision within Sun to "target" NeWS solely as an academic and OEM product. This is STUPID. Not "unfocused marketwise," or other doublsespeak, just STUPID. Who are the most visible proponents of NeWS? Don Hopkins and SGI. Sun is starting to be seen as an obstacle to the success of their own product! This is no recipe for success. Sun isn't too bad at setting standards when they decide to, but it still takes backing from within the organization. If Sun marketing says, "we'll push X instead of NeWS because we think more people will want it" and then says "why should we push NeWS? X is selling so much better", it sure looks like a self-fulfilling prophecy at best, and bad internal politics at worst. My opinion of Sun engineering is pretty much as high as ever, but my opinion of Sun marketing has plummeted to the point that I won't consider buying Sun hardware anymore, and I don't seem to be alone in this attitude, from some of what I heard at Usenix. Maybe Sun should just put NeWS into the public domain and let people who actually care about it take over. Disgusted, -- Amanda Walker InterCon Systems Corporation "Many of the truths we cling to depend greatly upon our own point of view." --Obi-Wan Kenobi in "Return of the Jedi" From don Thu Mar 1 20:53:09 1990 Date: Thu, 1 Mar 90 20:53:09 -0500 To: NeWS-makers@brillig.umd.edu Subject: What is Sun doing? From: spectral!sjs@bellcore.com (Stan Switzer) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) laukee@canon.UUCP (David Lau-Kee) writes: > Come on Sun, SORT IT OUT!!! We're getting > seriously pissed off at your reluctance to show any commitment to NeWS. Yes, please. For heaven's sake, put us out of your misery. Either: 1) Show a strong commitment to NeWS with: a) Razzle-dazzle NeWS-only value-added products b) Fast, robust servers c) XNeWS as the defalut window system d) A more liberal licensing policy or a free "sample" implementation. Or 2) Give up on NeWS entirely. Maybe IBM can score points with Fear, Uncertainty, and Doubt. You'll only succeed in driving your customers away. Stan Switzer sjs@bellcore.com From don Thu Mar 1 20:53:20 1990 Date: Thu, 1 Mar 90 20:53:20 -0500 To: NeWS-makers@brillig.umd.edu Subject: NeWS Obituary: Where is SUN? From: umich!terminator!rioja.ifs.umich.edu!ric@CS.YALE.EDU (Richard Campbell) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) Ever since John Gilmore's: > We are thinking of holding a wake for NeWS in our > ex-offices a few days before we have to be out. there was has been a deafening silence on the net from SUN Microsystems. I'd think that after a bunch of articles in comp.windows.news complaining about SUN's lack of political support for NeWS that the least SUN would do is post an official rebuttal. I'm sure that stockholders in SUN would be shocked to hear that their company is refusing to stomp out rumors of the demise of product that has received such a heavy investment and advertising campaign. Unless it's true.... Maybe SunExpert or Unix Today can shed some light on this. Richard Campbell IFS Project University of Michigan From don Thu Mar 1 20:56:27 1990 Date: Thu, 1 Mar 90 20:56:27 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: Docs for tNt, & what is Sun doing? From: haven!ncifcrf!toms@ames.arc.nasa.gov (Tom Schneider) Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) In article <9002271110.AA01403@aida.canon.co.uk> laukee@canon.UUCP (David Lau-Kee) writes: >Come on Sun, SORT IT OUT!!! We're getting >seriously pissed off at your reluctance to show any commitment to NeWS. I agree completely! For a product that (in my opinion) is technically superior to `the other windowing system', why do I still have to run sunview tools on top of the news window to be able to have a stable working area with characters I can read with killing my eyes? Why aren't new products appearing? There was an article in (the 1990 January issue?) of Scientific American about technical races. It seems that when two nearly equivalent products appear, one of them can take over because of random market forces. So VHS beat out Beta video. The point is that one product can win even if it is technically superior because it got the grab on the market first. Well NeWS is technically superior, but Sun is being so stupid that they are letting the window slip by---if it's not to late already! (Does anybody have a copy of the article handy to give us the exact reference? - it should be "required" reading for everybody at Sun!) I think that NeWS is superior for a simple reason: it is based on PostScript. This means---for the first time!!!---what I produce on the screen appears on the printer the same way. And it appears on a Linatronics the same way but at wonderfully high resolution (I recently finished some figures at 2540 dots per inch!). X types complain that it's slow. Well, that argument was used for many years for using Assembly or (ugh) machine language. As soon as machines got more memory and faster, programs got larger and those arguments finally died. When the machines are so fast you can't see the difference, the programmability of NeWS will outshine X. So it seems to me that NeWS will win in the end - why wait 5 to 10 years when we can have a great system NOW? So let's hear it Sun! What's the reason for your slowness? Tom Schneider National Cancer Institute Laboratory of Mathematical Biology Frederick, Maryland 21701-1013 toms@ncifcrf.gov From don Thu Mar 1 20:56:32 1990 Date: Thu, 1 Mar 90 20:56:32 -0500 To: NeWS-makers@brillig.umd.edu Subject: Re: What is SUN doing? From: korp@tripoli.ees.anl.gov Sender: NeWS-makers-request@brillig.umd.edu (Don Hopkins) Yes OpenWindows is going to be the core window technology in System 5.4, but you only get source if you buy source to 5.4. Other companies are simply ignoring the fact that OW exists in 5.4 and are only offering X11 on their machines. OW will reach the performance of most X11R4 servers quite soon, so performance should not be the issue. It all seems political. Do you think DEC, IBM, HP or others will ever offer OW even if they adopt 5.4? They only way to make this happen is if enough customers ask for it! I know of one major 88000 based workstation vendor that is claiming 5.4 compatibility without OW support. The only reason they don't have OW is because no one is asking for it! Some people inside that organizaion are trying to make OW a reality but get shot down by higher management because $80,000 is too much to port the OW server to their machine. OW needs more vocal support for it to succeed. Peter A. Korp Argonne National Laboratory All opinions are my own and not representative of my employer!