Designing Unity: The Start Menu
Early on when we began to develop Unity for Workstation, we started to look at ways to give users access to the guest’s start menu. This seemed like an easy thing to solve at first. A month later we realized otherwise. We debated for some time and discussed the pros and cons of many approaches before settling on a design.
We had a number of technical and design restrictions we had to consider:
- The UI should be roughly the same across Windows and Linux hosts.
- Start menu contents must always be accessible regardless of the desktop environment on Linux.
- Need to cleanly support start menus from many VMs at once.
Our chosen design
The design we settled on was to have a separate utility window for representing the start menu. This window can auto-hide and dock to any corner of the screen, or remain free-floating, and provides buttons for each VM. The buttons are color-coded to match the Unity window’s border and badge color. When you first go into Unity, the window briefly shows, indicating where it’s docked.
There are many advantages to this design.
- You don’t have to re-learn how to use it between platforms or even desktop environments.
- It’s pretty easy to get to and yet stays out of your way when you don’t need it.
- All the start menus are easily accessible from one place.
- The start menu buttons are color-coded to match the Unity windows.
- Users can control whether the window is docked in a corner or free-floats on the desktop.
- We have a lot of flexibility for feature expansion down the road.
Why not integrate with the Start Menu?
Since the first Workstation 6.5 beta, I’ve been asked why we chose the design we have instead of integrating the start menu into the notification area or into the existing Applications/Start menus. The idea to do so seems kind of obvious at first, but there are many reason we didn’t go that route.
Let’s start with the host’s Applications/Start menus. This seems the most natural place to put applications, as the user is already used to going there. We began going down this route, until we realized the problems associated:
- On Linux, not everyone runs GNOME, KDE or another desktop environment with an applications menu supporting the .desktop spec correctly or at all. This means we’d be drastically limiting which desktop environments we could even represent applications in.
- In the case of GNOME, it would add more clicks to get access to any application (Applications ? Virtual Machines ? VM Name ? Applications). This becomes tedious, quickly. Also, from my tests, adding entries three levels deep doesn’t always appear to work reliably across desktops.
- In Windows, the situation is just as unclear. People tend to think that Windows only has one Start menu, but in reality, we’d have to support three (Classic, XP, and Vista). For quicker access, we’d need to add something to the root menu, and each of these start menus have slight differences in how we can do this. None of the solutions are even particularly good there, as entries may be hidden from the user to make room for other pinned applications.
- In summary, where you go to access the start menu contents will be different not just on each OS, but across desktop environments and even different modes of the same environment (on Windows).
What about the notification area/system tray?
Another possibility that has been brought up is to use the notification area and to tie the start menu to an icon there. While this would generally work, it wouldn’t work too well.
- On Linux, it’s frowned upon to put persistent entries in the notification area. A panel applet could work, but users would have to manually add it, and it would be GNOME or KDE-specific.
- There’s no guarantee there even is a notification area or even a panel in Linux desktops.
- On Windows, the icon may be automatically hidden in the system tray to make room for other icons.
- The icon is such a small area to click on, making it annoying to launch applications quickly.
- The icon is generally not too discoverable.
Tips and future improvements
While we’ll probably keep our current model, there are definitely improvements I’d personally like to make in some future release. One such possible example is to allow dragging an entry off onto the panel or desktop to create a shortcut/launcher. If you frequently access certain applications, you’d be able to put them wherever you want them for quick access. Clicking them while the VM is powered off would power the VM back on in the background and then run the application.
A lot of this exists already. While there is no automatic launcher creation, you can create your own that run:
vmware-unity-helper --run /path/to/vmx C:pathtoapplication parameters
This is not a supported feature at this time and may have bugs, but in the general case it should work just fine.