Visual Programming Interface Ideas - March 1988

Notes on visual programming interface design, written by Don Hopkins on March 10, 1988.

Use buttons, menus, etc to indicate nouns and to activate verbs.

When you indicate a noun, (send it an "indicate" message) it's pushed onto the noun stack.

When you activate a verb, (send it an "activate" message) it tries to collect its arguments, if any, from the stack.

If it can get all of its arguments, then it is enabled, (sent an "enable message") and can be applied to them.

Otherwise, it blocks until all the right arguments are there, possibly prompting for them to be pushed onto the stack or indicated somehow.

Instructions for Using Pie Menus - March 1988

How to Choose with Pie Menus
English 393, Technical Writing Assignment #1
Instructions for Performing a Process
Don Hopkins
March 10, 1988

Q: What is the process?
A: The process is selecting from pie menus.

Q: Whis is the audience?
A: The audience is users of the pie menu software for the NeWS window system.

Q: Where would the document be found?
A: It would be part of the documentation that goes along with the software.


Selecting commands from menus is an easy, straightforward way to operate a computer. You can use a pointing device called a "mouse" to indicate the selection you desire, from a list of choices show on the screen. Pie menus (Figure 1) differ from traditional "linear" menus (Figure 2) in the way that their choices are laid out, and the shape of their selection target areas on the screen.

These instructions will describe how to select a choice from a pie menu, cancel a menu without making a selection, and make selections quickly and efficiently.

Pie Menu Cookbook - October 1987

A Pie Menu Cookbook
Techniques for the Design of Circular Menus
By Don Hopkins, October, 1987


Pie menus are used for making selections from items displayed on the computer screen, by pointing and clicking at the desired one with a mouse. The regions of the menu are shaped like the slices of a pie, laid out in a circle around the menu center.

The click of a mouse button invokes a menu, which pops up on the screen positioned so that the cursor is centered in the small inactive region in the menu center. The active target regions are all adjacent to the cursor, but in different directions. Pie menus are fast, because it only takes a small amount of cursor movement to point at one of the regions, and they are accurate, because the wedge shaped regions all have large areas.

The circular layout of pie menus makes them very appropriate for certain tasks. Complementary items can be placed in opposite directions, and spatially oriented items can be put in their appropriate directions. Experienced users can select from familiar pie menus without looking at the menu, and can even mouse ahead into menus faster than the computer can update the screen. When the user selects by mousing ahead into a menu, suppressing the menu display can speed up interaction considerably.

The cursor distance from the menu center can be increased to get more angular precision, for accurate directional selection. It can also be used as an argument to the selection, as a continuous analog value, or a discrete sub-selection.

Users can benefit from commonly used pie menus if they are designed to be easy to learn and use. A window management pie menu with its spatially oriented items in appropriate directions is an example of such a menu. A font selection menu using direction to select font style, and distance to select point size, is an example of how the two-dimensional aspect of pie menus can be exploited.

A user should be able to discern the function of a pie menu by looking at it. A simple, intuitive, consistent look for visually representing the meaning and function of a pie menu can help to create an easy to use user interface. Pie menus can also be designed so that they have a good kinesthetic feel to them, they do not require a lot of wasted mouse movement, and the directions are easier to select, and well matched with the input device.

NeatWindow Pie Menu Window Manager for NeWS - May 1988

I released the source code for a NeWS window manager based on pie menus, called NeatWindow (source).

Date: Wed, 11 May 88 02:31:51 EDT
Subject: class NeatWindow From: Don Hopkins <>

Here is a window class with window managment menus designed to work well with pie menus. You should of course have loaded up before running this. Just psh it into your environment, and the DefaultWindow will be set up so that the next window you get will be a NeatWindow! Fire up a clock or something, pop up the frame menu, and play around! I am not including any instructions right now, because I would like to hear what you think of it after trying to figure out what the menus do on your own. (heh heh heh -- the code is free but you gotta be a guinea pig!) This is experimental, so I'll be coming out with a more refined version later. If you'd care to answer the following questions after playing around with the NeatWindow menus, I'd really appreciate it!

- Which functions were obvious by their direction, or their labeling?

- How would you change the labels to make their meanings clearer?

- Why do you think the selections are arranged the way they are?

- What mnemonic tricks can you think of to remember the selection directions?

- After using them for a while, which selections do you find yourself mousing into without looking at the menu?



Pie Menus for NeWS 1.1 - March 1988

I release the first version of pie menus for NeWS 1.1 on March 30, 1988. Here is the source code written in NeWS's dialect of PostScript with Owen Densmore's object oriented extensions, using the "Lite" user interface toolkit.

Date: Wed, 30 Mar 88 08:02:23 EST
From: Don Hopkins <>
Subject: Pie Menus for NeWS 1.1

Here's the latest, for NeWS 1.1! You can psh it into your NeWS server, or load it from your Note that because of a problem with /flipstyle, you should load after customizing the NeWS rootmenu and its submenus. This is because flipstyle changes the submenu objects under rootmenu, but not the variables in systemdict that refer to them. The function /setdefaultmenu, defined and invoked in, sends a /flipstyle to roomenu and redefines the rootmenu in systemdict. If you want to change the menus after running, one fix for this problem is to use /searchkey in your, after running, to redefine the variables in systemdict to refer to the new submenus. Then you can send /insertitem and /deleteitem messages to terminalmenu, etc. (Otherwise you'd be changing the old submenus, and see no effect on the pie submenus.)

Pie Menus for X10 "uwm" Window Manager - June 1986

My second implementation of pie menus (source code), written in June of 1986, was an extension to the X10 "uwm" window manager.

I refactored "uwm" and integrated it into Mitch Bradley's Sun Forth system, to implement a Forth programmable window manager with pie menus called "pietest" (source code). I reprogramming the window manager's main loop in Forth, to perform an empirical comparison of pie menus with linear menus.

Later, I wrote this generic pie menu layout and tracking code written in C is open source, and may be used as a basis to implement pie menus on other systems. It supports pie menus with any number of items. Each item can be of any positive angular width, as long as all the item widths add up to 360 degrees. Each item records the quadrant and slope of its leading edge. A leading edge is a ray going out from the menu center in the direction given by an item's (quadrant,slope) pair. The area of a pie menu item is the wedge between its leading edge, and the leading edge of the next menu item.

The generic pie menu tracking code is optimized to minimize floating point division and avoid calling atan2 during mouse tracking. But now most computers are much faster and have floating point hardware, so the optimizations are no longer necessary to keep up with the mouse (but they still might be useful on low end computers and small embedded devices).

Theta Menu Test for X10 - June 1986

My first implementation of pie menus was written in June of 1986: a simple proof of concept called "theta menus," written in C for X10 (the window system that preceded X11).

Make Personalized Halloween Tombstones for The Sims

You can to make your own free personalized Halloween Tombstone for The Sims! You can engrave your own personalized tombstones, download them, and email them to your friends! Please visiting the cemetery and pay respects to more than 1200 other peoples' and Sim's memories.

Dumbold Voting Machine for The Sims

The Dumbold Voting Machine for The Sims enables the simulated people in your virtual dollhouse to vote! It's an interactive "get out the vote" public service message, in the form of a free downloadable Sims object. This Sims object is an electronic voting machine that lets your Sims vote between four candidates: Kerry, Bush, Nader and Badnarik.

OpenLaszlo Makes Full Blown AJAX Apps on Flash

The fact that Flash is commonly used for ads, and that those ads annoy everyone and cause many people to hate Flash, doesn't detract from the high quality user interfaces that you can build with it, if you use it for good instead of evil.

Since usability guru Jakob Nielson wrote Flash: 99% Bad in 2000, a lot has changed about Flash. He worked with Macromedia to improve Flash's usability, and he sells a report with 117 design guidelines for Flash usability. So yes, it is possible to develop usable applications in Flash.

OpenLaszlo is an open source language and set of tools for developing full fledged rich web applications, which are compiled into SWF files that run on the Flash player. Laszlo/Flash is presently much more capable of implementing high quality cross platform user interfaces than dynamic AJAX/HTML/SVG currently is.

Laszlo is a high level XML and JavaScript based programming language. It's independent of Flash in the same way that GCC is independent of the Intel instruction set and Windows runtime, because they both compile a higher level language, and can target other runtimes and instruction sets.

Currently Flash is the most practical, so that's what Laszlo supports initially, but it can be retargeted to other runtimes like SVG, XUL, Java or Avalon, once they grow up and mature. But right now Flash is the best way to go, because of its overwhelming installed base and consistency across multiple platforms.

Syndicate content