Definitions Arrow Down Arrow Up Arrow Right Arrow Left Double Arrow Left Double Arrow Right Minus Sign Plus Sign Iconify Maximize Close Back Arrow Forward Arrow Reload Cut Copy Paste Search Branch Folder Play Debug Debug Justify Left Justify Center Justify Right Justify Sides label label 3 2 1 Generic Item Generic Item Folder Folder Archive Network Folder Address Book Contact Calendar Event Template Bibliography Bibliography Citation Music Collection Playlist Music Music Album Photo Album Photo Spreadsheet Slideshow Mailbox Message Mailbox Notebook Computational Notebook Notebook Notebook Notebook Shell Terminal Feed Remote Desktop Calculator Database Query Outline Bookmark Bookmark Bookmark Documentation Web Browser Messaging Meeting Meeting Phone Call File Browser Ledger Transaction Microphone Binders Trash Desktop

This is all a work in progress. What I'm sharing here is like my private sketchbook. It's poorly organized, has gaps, has mistakes, and so forth.

These are just drawings for prototyping, not actual widgets. Some of them respond a little bit, as CSS allows, but there's no JavaScript making things dynamic. After the drawings, there is some description of the system I want to make. That description is what I really want to develop. The drawings a like doodles on a page while I think about what to write.

The style of these drawings is meant as a guide. It might be possible to do this without SVG, but I remember some details being hard or impossible to achieve with Gtk 2.x. The way scroll bars join with a text field was one impossibility. Part of the idea is to make it obvious when widgets are not active because they're in a background window or because they just can't be used in the current state. This should all work for various modes like light, dark, high contrast, and low contrast. It should be possible to change the basic colors per widget and with themes. I suspect this basic style can also be adapted to use gradients, blends, patterns, and more.

Update: It looks like Gtk4 may be able to achieve this look with CSS.

This style is heavy compared to most of today's GUIs. That's on purpose. If a window looks too "chrome-y" with this style, then there's probably a better design.

The art is primitive. That's because I can't draw. I also think icons should be iconic. The icons have been made in SVG to have decent 16x16 rasters that scale up to at least 48x48. I've no objection to people customizing their icons. In fact, I encourage it.

I make a distinction between icons and decals. An icon is a view of an item. It can be moved around from folder to folder. A decal is an iconic representation of an action that is attached to a control.

The decals are different sizes.

Almost everything here is greyscale. There are some other colors while I'm playing around with things. Red and blue rectangles are placeholders.

The default graphics will be greyscale. There are three reasons for this. First, the system should work in greyscale. Second, I've heard some artists prefer a greyscale GUI because a colorful one would affect their sense of color in their work. Third, leaving color to a customization provides an avenue for users to explore customizing the GUI; they can start small, by changing the accent color, which is used to mark selections.

I believe this default theme should also work as a high-contrast theme. There is also a dark mode theme.

The scroll bar buttons are only mouse controls, so they can be small and adjacent. The spinner buttons may be touch controls, so they are separated.

In the process of ensuring keyboard accessibility, I've come to realize that an early design decision needs to be revised. Alas, I cannot remember why I made the choice I did before, some I'm making note now I've why I'm going with the other option. There are at least two ways to indicate that a button has keyboard focus. One is to draw a line around the outside of the control. The other is to draw a dashed line inside the control but around the text, icon, or both that are inside the control. Having chosen the outside indicator, I had to sacrifice the joined together look for radio button groups. I also had to increase the whitespace around controls in toolbars. I was fine with these, though not having the joined together radio buttons bugged me.Now it seems I made the wrong choice, because I can't consistently indicate focus on notebook tabs. I'm not sure why, but I thought notebook tabs, like scrollbar buttons, didn't need keyboard focus. I had failed to consider that notebook tabs, in at least some forms, might have additional controls like a menu trigger or a close button. Like joined together radio buttons, there's no clear way to indicate which tab has keyboard focus with an outside indicator that doesn't look ugly. (I suppose I could make focus indicators more like OSD graphics, but I'm pretty sure that won't look right.) So, now I have to start revising various controls to have their focus indicators on the inside.

As far as I know, there's no problem with the current look of focus indicators for text areas. That is that their inset rectangled are replaced by solid rectangles when they have focus. The inner dashed line look wouldn't make sense for text areas.

Perhaps an unanticipated boon from this change is a better focus indicator in list widgets. Those look a lot like text areas and I hadn't gotten to the point of considering how focus would look within them. There a dashed line around the currently focused item makes sense to me.

I originally chose a range of greys by means I do not remember. That's the "Old" theme. Using Accessible Palette, I selected a new range of greys for the "Accessible" theme. I half-heartedly tried to make my own dark theme, which is called "Dark". Last theme here takes the "Accessible" theme and shifts everything to a darker shade. I doesn't really work.

Theme Colors
Old Accessible Dark Ugly



Basic Widgets
File Type Icons

Control Decals

This is a Message Alert. A message alert is transient for another window and blocks activity in that window. As such, it should almost never be seen.

Message Alert Just Some Information Breathe. It will be OK.

Avoid blocking user activity for information when possible. Use a placard instead.

Placard Demo Just the useful information.

This is a Confirmation Alert. A confirmation alert is transient for another window and blocks activity in that window. As such, it should almost never be seen.

Confirmation Alert Do you have sufficient certainty? Isn't this an annoying question?

Confirmation should be requested for actions that cannot be undone. It's better to provide a way to undo an action when possible.


This is an Open Dialog. The design of the system is such that these should only rarely be needed. It should be possible to open a file in a window by dragging its icon into the window.

Open Dialog

This is a Save As Dialog. These should be rare because items are named when they are created.

Save As Dialog

These are the different pages of a simple Item Property Panel.

File Settings Panel File Settings Panel File Settings Panel CRC-32 MD-5 SHA-1 SHA-256 SHA-512 File Settings Panel
File Settings Panel

This is a composed view for an item.

Basic View 2

This item has a toolbar.

Basic View with Toolbar

And this one has two.

Basic View with Toolbars

An empty folder view is simple.

Basic Folder Basic Folder 2

A project, which combines multiple items, might look like this. The field on the left shows a tree of items in the project, while the field on the right shows the selected item.

Basic Project

This is another project look, based on VS Code. The buttons on the left are radio buttons to open the various side panels. They used the joined together look seen in radio buttons on some toolbars. How to do focus indication is not clear.

The tabs are the heavy tabs that don't look like they can be moved around or closed.

Basic Project 2 Basic Project 2.2

This changes the tabs to be like those of a spreadsheet, to indicate they can be rearranged and more.

Basic Project 3 Basic Project 3.2

It's more conventional for tabs in an IDE to be at the top, so spreadsheet style at the top instead.

Basic Project 4 Basic Project 4.2

A spreadsheet might look like this.

Spreadsheet Spreadsheet 2
Tabbed Window Tabbed Window 2 Browser Window Control Console Control System some current status Detector Angle (2θ) 32° Sample Angle (θ) 16° Database Manager
SELECT * FROM [somedatabase]
WHERE [field] >= 12
ORDER BY columnname DESC
        
File Browser Playground
Window States
Sign On Screen

Hello, World!

Some HTML.

Alice Bob Carol
Desktop 0 ⚙   File   Edit   View   Help 12:00 PM Some Folder Address Book Calendar Template Templates
Desktop 1 ⚙   File   Edit   View   Help 12:00 PM Some Folder Address Book Calendar Template Templates
Desktop 2 ⚙   File   Edit   View   Help 12:00 PM Some Folder Some File Templates

Make Templates. Make Items. Make Views. Make Property Pages.

Don't make applications.

This shell is different from what you're used to. While many elements will be familiar, they may work differently from how they do on other systems. Most graphical shells on Linux can be called thin shells; they strongly resemble the underlying system. This shell is a thick shell. The default is to portray what a casual user expects, which may be different from the underlying system. This kind of abstraction is already familiar if you consider that a text shell in a terminal doesn't tell you anything about the semiconductors in the underlying hardware.

Parts of the Shell

The principle abstraction of this shell is the item. Items come in a variety of types and new types can be easily created. Items are parts of the user's model of the system.

Items

The shell provides a graphical user interface to a variety of items. Items are the objects of the graphical user interface. They may correspond to programmatic objects, but they may also be abstractions that unite various parts of the operating system. Every item has metadata. Item metadata includes the item's name, its icon, its media types, screen locations for its views, the files it represents, and more.

Some items are containers of other items. More on those later.

Items are distinct from other objects because they are part of the user's model of the system.

An item is an abstract concept. The shell represents items graphically in views, which allow items to be manipulated and changed.

Views

Each of the various graphical representations of an item is a view. The item icon is the simplest view. The item property panel is another. Every item has these two views. Most items have more views. Some items may have surprising views. For example, an OpenDocument file has its default view in an office program, but it also has a folder view because its contents are a zipped archive of other files.

Do not be confused by the term "View". As used here, a view is an interface to an object and facilitates changing the object in various ways. In terms of the model-view-controller paradigm, this shell's view is both a view and a controller.

On other systems, a view might be considered the main interface of an application.

A few of the shell graphics are not views of items, but are overlays on the screen.

Overlays

Overlays can be regarded as peripheral devices that extend onto the screen. The most obvious of these is the menu bar, which is usually present at the top of the screen. The menu bar also contains some system status indicators. Notifications will also appear in overlays.

Services

Services are common procedural elements that are available to all views. The dictionary service, for example, is available to provide spelling corrections, definitions, et al. Does this belong here?

Items

For every kind of item on the system, there is also a template.

Templates

Templates are a special kind of item. When you drag and drop from a template icon, you get a new item of a kind specified by the template. For example, there is a folder template. Dragging and dropping from this template creates a new folder. There's a template for almost every kind of item you can create. One exception is a template itself; there's no template template. Templates can be created from existing items by dragging their icons into the template folder.

Templates can have content. If you create a template from a word processor document, then new items made from that template will have the same content as the document did when the template was created. This is an easy way to make form letters, for example. If a folder with content is turned into a template, all of the folder's contents will be reproduced by dragging from that template.

Perhaps the default templates should be listed.

Some items contain other items. The most basic container is a folder.

Folders

Folders are items that contain other items, much like a directory contains files. Simple folders are just graphical representations of directories. More complicated types of folders exist.

Workspaces

A workspace is a special kind of folder. A simple workspace may represent a filesystem directory, but it also has information about the state of items inside it. The views of items in a workspace folder are connected to the folder view of the workspace. If the folder view closes, the item views close too. When the folder view is opened, the previously open items in the workspace reopen. It's a simple form of session management.

Desktops

Desktops are special workspaces. When a desktop is opened, its folder view becomes the background of the shell. Signing on to the system is really just opening your primary desktop, and signing out is closing it. Because the desktop is a workspace, any items that were open when it was last closed will be opened again when it's reopened.

Views

Every item has at least two views: its icon and its property panel.

Icons

Every item has an icon view. It is, as the name implies, an icon. The icon view may have indicators of the item's status, such as hatch marks indicating another item view is open, or badges denoting some status.

Don't confuse an icon with a decal or a badge. An icon represents an item and can be moved around. A decal takes the place of or augments some text on a control, like a button. Decals are stuck to their controls. A badge indicates some status information about an item and is usually found stuck to the item's icon.

Property Panels

Every item has a property panel which allows viewing and editing some of the item's metadata. Panels are divided into pages. The "General" page applies to all items as it shows the item icon and name. Additional pages depend on the type of item being viewed.

When an item as additional views, one of them is designated the main view.

Overlays

The Sign-On Screen

The sign-on screen shows icon views of the users' primary desktops. And some other stuff.

The Menu Bar

The shell has one menu bar at the top of the screen. The menu bar changes according to which view is active. Users should be able to do their work without using the menu bar, but it's there for less frequent commands. It also provides a space for some system status information.

If every view had its own menu bar, it would seem that menus are really important. They would take up a lot of screen real estate.

The menu bar is at the top of the screen where it can be easily reached and easily seen, but stays out of the way.

Zoom Out

The zoom out overlay brings all open views onto the screen.

Notifications

Some notifications may briefly appear in small overlays.

Status Center

The status center shows a log of recent notifications, as well as a calendar and some other controls.

Services

Clipboard History

Dictionary

Calculator

Macro Recorder

The icon view of the primary desktop is on the sign-on screen.

The first thing you see on the screen after signing on, aside from the menu bar overlay, is the main view of the primary desktop. It's a folder that forms the background of the screen. The starting desktop contains a few items: a trash can, something something, and a templates folder.

Items, Views, Overlays, Services, Icons, Property Panels, Folders, Workspaces, Desktops, Templates: Those are the basis of the entire system.

Permanence

Items have permanence, and so do their views. Icons on the desktop don't move around or disappear unless the user moves or removes them. Where a property panel first opens is arbitrary, but when it opens a subsequent time, it appears where it was when it was closed the previous time. All the views of an item reappear where they disappeared.

Views appear from somewhere and disappear to somewhere. Icons, which have fixed places in their folders, are an exception to this. If the item's icon view is on the screen, the other views of an item appear from it and disappear to it. If the item's icon view is not on the screen, then the other views of the item appear from and disappear to the nearest containing folder's icon view. How does that work?

How can there be permanence on impermanent displays? Perhaps with more metadata.

Workspaces go a step further. They keep track of their open items so they can reopen them when they are reopened.

Differences from Other GUIs

Some differences from other graphical user interfaces, especially those on Linux, should already be apparent.

There are three applications on Linux that are reimagined in this shell: the window manager, the file manager, and the session manager.

The Window Manager

The window manager does very little in the normal order of things.

  • It keeps overlays, including the menu bar, on top.
  • It keeps desktops on the bottom.
  • It provides switching between desktops and keyboard-based switching between windows.
  • It does not draw window frames, but it may provide effects like shadows.
  • It does not reparent windows.
  • It may provide a virtual desktop which is larger than the screen.
  • It provides the zoom out overlay.
  • In the event of a window being closed, it ensures the right window has keyboard focus.
  • It may restrict the movement and placement of windows, but it mostly respects what clients give it. (The constraints on movements should suffice to constrain placement, because windows will only ask to be placed where they were before.)

Mouse-based focus is managed by the windows themselves using the globally active input model of the ICCCM. Window stacking order has some contraints, to keep overlays and desktops right, but clients are expected to raise their windows appropriately. This means that if a client receives input focus on a window, it should raise that window and any of its transients to the top of the stack, calling XRaiseWindow. If the focused window is a transient for another client window, i.e. a dialog for a parent window, then both windows should be raised and stacked transient over parent.

The ICCCM states that,

In general, the object of the X Version 11 design is that clients should, as far as possible, do exactly what they would do in the absence of a window manager, except for the following:
  • Hinting to the window manager about the resources they would like to obtain
  • Cooperating with the window manager by accepting the resources they are allocated even if they are not those requested
  • Being prepared for resource allocations to change at any time

Despite this, it has often been assumed that focus and stacking should be left entirely to the window manager. The same has been assumed for what are often called "decorations", though the ICCCM does later state that window managers should display window titles. Those "decorations" are, in fact, controls, and clients can be expected to provide such controls themselves.

The File Manager

The file manager is mostly replaced by folders. Browsing the file system, as with most modern file managers, is relegated to a utility which most users won't need. The user model of items and folders is preferred by the GUI over the programmer's model of files and directories.

Users are free to arrange for a file browser to be the default view for any folder.

The system as a whole is an item manager. Items may be files, and they may also be database objects. For example, an address book can be a directory full of vCards or a database of contacts.

The Session Manager

The session manager is replaced by workspace folders. The principle user session is tied to the user's primary desktop, which is a workspace folder. Subsessions are created when other workspace folders, including other desktops, are opened.

In reality, every folder is a session manager. The difference for workspace folders is group control.

Notes on Folders

Folders should tend to be shallow. They're for the user's work, not for viewing the entirety of a unix filesystem. Some of the natural depth should be swept into projects which open into project views instead of folder views.

Folders should tend to be small. Folders containing lots of similar items should probably have another view which manages the size of folder.

When folders get large or deep, there may be a need for a new kind of view.

A deep folder suggests a need for project management. For example, source code should by default open in an IDE.

A large folder suggests a need for catalogue management. For example, the special containers described elsewhere.

Developers should look for opportunities to manage folder depth and size. Users should complain when things get out of hand. A dialog between users and developers should help the system grow.

Folders provide screen positions for both icons and views to opening views. These positions are shared with the window manager which may then animate the transition from an icon to another view. If the folder for an item is closed when the non-icon view is still visible, then the animation closing the open view will show it going to the containing folder's icon. If that icon is not visible, it will go to the next containing folder's icon, and so forth down to an icon on the desktop. (How?)

A workspace item combines file and session management functions. As a file manager, it displays icons for its contents. As a session manager, it keeps track of other views of its contents. This is to change. Every folder will be a session manager.

Expectations of Views

Views are responsible for communicating with the window manager and their session manager. To present a window, a view must communicate to the window manager the position information it receives when opened. This information includes icon positions in container windows between the view and the desktop. The view will also receive a timestamp corresponding to the event which opened the view and must use this timestamp to set focus when its window is mapped. Focus is not guaranteed! If another view has received focus in between the opening event and the mapping of the window, then it will not receive focus. If and when the window does receive focus, it should ask to be raised.

Default stacking position, controlled by the window manager, should be above the container window communicated in the startup info.

A view must communicate updates to its window position to the session manager. (The session manager will set metadata accordingly, probably by communicating with the file manager.)

Should there be a FILE_MANAGER? Is the session manager enough?

If a view contains items which may be opened in other windows, it should act as a folder or workspace. Which?

A view may use alerts, dialogs, palettes, panels, or other transient windows. They should be marked as such for the window manager.

Palettes should hide on focus loss, but alerts and dialogs should not. What about other panels?

Folder views must provide to . . .

Is the property panel another process? Maybe. It should be treated like any other view. How do all the views synchronize?

For moving to Wayland, I'll probably need a trace protocol to make the connections between desktops and views.

IDK what people are doing for session management these days.

If a view contains items, it should accept template drops to create new items.

Some Implementation Thoughts

One View, One Process?

I suspect each view will be its own process.

Folders

I'll probably implement folders in a small app called folder. The app will do a bit of desktop integration and then use a library called libfolder which provides most of the code for the field of icons view. I imagine there will be one folder process for each folder view. Workspaces and desktops will do much the same using libfolder, but they need more code to do session management. The main argument to folder is a URL for something which can be viewed as a folder. If the URL is for anything other than a simple directory, it will probably be handled by another program instead. A program called archive, for example, might handle gzipped directories. This program will also use libfolder, so the archive will act like a folder.

OS/2 had the System Object Model which allowed for extensibility like with archive and folder. I don't know that anything that complicated is really necessary. There might be a better way now with something like DBus or flatpak portals.

With each folder being a separate process, inter-process communication is obviously going to be very important.

Property Panels

The trickiest thing may be the property panels. Every view of an item may need to add or add to a property panel page.

Again, I expect the panel to be another program, properties. It will have to load modules for non-standard pages.

Context menus

Closely related to panel extensibility is context menu extensibility. (Do we View as . . . or Open as . . .?) It may be useful to add menu items in addition to those on the View as . . . submenu.

Does dbusmenu (whatever it's called) actually work for our menu bar?

Positioning Views

Positioning views on X is easy, but Wayland doesn't allow client-dictated absolute positioning. There might be a way to have window manager/compositor-dictated positioning that preserves view positions. The views would have to advertise themselves as displaying a URI as a particular type of view. The wm/compositor would use that information to retrieve item metadata from somewhere and store it to somewhere.

My original thought was that position metadata would be stored either in special files or in extended attributes (EA). Clients would look up their own info and request their positions. It might be possible to have the wm/compositor maintain, or at least use, some database of URI, view type, and view position data. For local views, this can still be done in special files or EAs.

Not having the position data in EAs seems a good way to lose it, in the event that a file is moved. There would have to be some system level control of files that updates the position database.

Another problem with the window manager looking up position data is that it will be complicated for remote clients.

Special Programs

A few programs are themselves items.

Calculator

The calculator is a simple calculator.

Terminal

The terminal program is a general purpose view of character data. It is available as an execution parameter for shells, scripts, etc. All of the text shell templates produce files which will open in a terminal.

Web Browser

What can be said about this? It's essential, but its contents aren't really part of the shell. Bookmarks, on the other hand, can be filed away; they can be items.

Help Browser

The help browser is available from the menu bar.

File Browser

The file browser is what's usually called the file manager in other shells. It exists for GUI access to parts of the system which are not represented in the shell.

Special Containers

A few containers are special in that they tend to be large and unique. They may also be used by many programs.

Address Book

The address book is a container for contacts, and contacts may be used in many different ways. An item's metadata may indicate a contact as the author or sender of the item. Contacts should be available for email and also for event planning.

Every contact should appear in the main address book. The contact template should make sure this happens. What if a type of contact is created? How does the template for the new type ensure the behavior of adding to the main address book?

Bibliography

The bibliography is a container for references which may be used for citations. References include not only citation information, but also user's notes and possibly copies of the referenced material.

Calendar

The calendar is a container for events, and events happen all the time. something something integrated activity journal

As with the address book, all events should appear on the main calendar. Same problems here.

Feeds

Mail Boxes

The mail boxes are containers for messages. ???

Music Library

Photo Gallery

Containers and Items

Folders, Workspaces, Desktops

Archives

An archive is a kind of folder.

Connections

There's a remote desktop application, but you never run the application. Instead, you double-click the icon representing an RDP connection. To create a new RDP connection, you drag an icon off the RDP connection template and drop it somewhere. By default, this opens the property panel for the connection. From then on, you just double-click the icon to open the connection. You can shift-double-click to open the property panel again. or you can configure it in the connection's window, using the menu bar.

Terminals and Shells

Address Books and Contacts (vCards)

Calenders and Events

Bibliographies and References (Citations)

Feeds

Binders and Formatted Text

Presentations and Slides

Spreadsheets

Albums and Photographs

Slideshows and Photographs

Albums and Music

Playlists and Music

Stations and Music

Notebooks and Notes

Notebooks and Computations

Outlines

Bookmarks

Documentation

Ledgers and Transactions

Programs

Projects and Solutions

The default view of a project or a solution is an IDE.

Portfolios

Libraries and their contents

Raster and Vector Images

Database Queries

Other Media Types

But I'm a developer!

If you use an IDE, not much changes. An IDE is a view of an item called a project. Your project is likely to be a bunch of files in a directory. That's fine. The shell will recognize the directory as a project and, by default, open it in your IDE. If you need to manipulate the contents of the directory outside of the IDE, you can view the project as a folder. Of course, you can always use a text shell in a terminal too.

If you don't use an IDE, the shell can be like an IDE for you. Again, you are working with a bunch of files in a directory, so you can view that as a folder. More importantly, you can set that folder as a workspace. When you open the workspace, your previously opened views will open again. With not much work, you can make sure that all the tools you use are ready for you.

What about git?

It should be possible to make a view for a git repository that recognizes its complexity. Since a repository usually contains a project, an IDE may be the view of choice for working with that repository.

However git is integrated with the shell, it is likely that "git repository" will be a new kind of item. A project is a git repository is a folder is an item.

The problem with git for the shell is that file metadata may be easily lost, no matter how it's stored. I have no solution for that at this time. It will likely require a special file in the directory containing metadata for a particular version.

I need a terminal.

There are templates for text shells and they use the terminal program to show the text shells. Once you've created a text shell item, by dragging and dropping from the template, you can configure it to your liking through the property panel. You can change the terminal program used as well as the text shell used in the terminal program. You can set environment variable, initialization files, etc. You can even run non-shell programs in the terminal.

But I like applications!

In that case, I strongly recommend you use a Mac. It provides the best application-oriented experience by far.

Common Scenarios

Signing On

The sign-on screen presents desktop folder icons for users. Double-clicking one opens a password dialog. An animation shows the password dialog emerging from the icon. If the entered password is incorrect, the dialog shakes(?) and the user can try again. If it is correct, an animation returns the dialog to the icon, then an animation from the icon takes over the whole screen, showing the user's primary desktop.

What else is on the sign-on screen? Accessibility features? Menu bar? Clock?

Signing Off

The system menu, in the top left corner, presents the command to sign off.

There should not be any need for any sort of dialog in response to this command. The state of everything at sign off should be restored at sign on.

Finding an Item

Use the search item on the menu bar. Open both the item and it's parent folder?

Starting Something New

How many steps does it take to start something new, once you are signed on? One thing needs to be visible: a folder. The desktop folder will do. Exposing part of the desktop may add a step.

If a folder is visible, a new item can be created by right-clicking the folder, selecting New from the pop-up menu, and selecting a type from the list of types in the New submenu. The new item will be created in the folder and its name will have keyboard focus. The name can be changed by typing and accepted by either pressing Enter or clicking anywhere else on the screen. This way of creating a new item is familar from Microsoft Windows.

If a template is visible, a new item can be created by dragging from the template to the desired destination. Again, the new item will be created with its name having keyboard focus.

The File→New menu item should only be used by programs that contain multiple items to add an item among the others. A simple text editor should not have a File→New menu item. (Or should it? Just to copy everyone else?)

Creating a Project in an IDE or Similar Environment

Open the Templates folder on the desktop. Drag from the project's template type to any folder to create a new project in that folder. Double-click the new project's icon to open the IDE.

Creating a Project as a Workspace

Open the Templates folder on the deskstop. Drag from the workspace folder template to any folder to create a workspace folder. Double-click the folder's icon to open the workspace folder. Use other templates to add files to the project.

An existing folder can be turned into a project by checking the Workspace option in the folder's property panel.

Resuming Work on a Project

To resume work on a project, the project's icon must be found. It may be on the desktop, in a folder on the desktop, or in a folder in a folder on the desktop. If the project is buried deeper than that, the reason should be explored.

Once the icon is found, the user double-clicks on the icon.

If the project has been developed in an IDE, that IDE should be seen to emerge from the project icon. If the project has been developed as a workspace, then the workspace folder should be seen to emerge from the project icon and any previously visible items in the folder should emerge from their icons.

Saving Something

This doesn't happen. All work is saved as it is done.

Really?

That's the plan.

Moving or Copying an Item

Most items can be moved or copied by simple drag and drop. In keeping with the convention on other systems (Check them.) Move is the default when the source and target are on the same physical device and Copy is the default when they are not. Pressing Shift will change a Copy to Move. (and a move to a copy?). Pressing Alt will create a link.

Templates are the exception. The default when dragging from a template is to create a new copy of the template contents. Something has to be done to allow moving templates and creating copies of templates.

Dragging an item from a background window does not bring the window to the foreground.

Moving of Copying Multiple Items

If a group of items is already selected, it can be moved by simple drag and drop. As long as the selection is not entirely templates, any selected templates will be moved or copied as the other items are. A selection of only templates follows the rules for moving or copying a single template.

Dragging a selection from a background window does not bring the window to the foreground.

Renaming an Item

Clicking the name of a selected item put it into an edit mode. There must be enough time between a selection click and a name click to distinguish it from a double-click.

Keyboards, Mice, Pads, Touchscreens, Pens, etc.

Almost everything should be doable with a keyboard and a single-button mouse. A long first button press can be interpreted as a second button press.

Holding down a key should present alternative characters, rather than repeating the key.

Accessibility

I hope that the system will be accessible by default. That is to say that I hope the design decisions I'm making will have immediate benefits for accessibility. I believe the light and dark control styles I have chosen also suffice as high-contrast styles. I have not chosen a widget toolkit, but I will be chosing one, or creating one, to work with assistive technologies. I'm barely approaching writing code, so I'm far from any sort of release. This system must be accessible from day zero. I expect to solicit accessibility input as soon as I'm satisfied that my design documents make a modicum of sense.


Everything is an item.

There's a text editor, but you never run the editor. Instead, you double-click the icon representing a text file. To create a new text file, you drag an icon off the text file template and drop it somewhere. By default, this opens the property panel for the text file. From then on, you just double-click the icon to open the text file. You can shift-double-click to open the property panel again. or you can configure it in the text file's window, using the menu bar.

The desktop is the starting point. It contains a few items. An important one is the Templates folder. It contains templates, and only templates. Anything dropped into the templates folder is received as a template. (The original remains.) What is a template? It's a design for a new object. One of the templates is a folder template. To create a new folder, click and drag from the template as if you were doing a regular drag and drop. Immediately, the dragged icon looks like a regular folder, not like the template icon from which the drag was begun. When the icon is finally dropped somewhere outside the template folder, a new folder will be created in that place. Its name, "Folder", will immediately be selected and receive focus so the new folder can be named. Everything new has at least a default name.

There's a template for every kind of object you can create. Everything is an object, but every object starts out as a template. Applications developers might better be called template makers. Because anyone can make a template, anyone can be an application developer. While the program that shows a file might be called "LibreOffice Writer", what the user experiences is a template for an ODT file. If the user already has an ODT file and drops it into the templates folder, then a new template will be created. While the basic ODT template is a blank document, the user-created ODT template will have whatever content the user's file had.

If the user drops a folder into the templates folder, then the new template will be for a folder matching the properties and contents of the folder that was dropped. If the user regular works with a certain kind of project, they might make a template folder filled with the things they need for a new project.

Templates are not confined to the templates folder. By holding Shift while dragging from a template icon, a copy of the template itself can be made. Frequently used templates can thus be available from wherever they are frequently used. A visual art project folder might have a copy of an image template, so it can be quickly accessed to create a new image.

Folders and their contents do not exactly match the filesystem contents, and looking at a directory isn't necessarily looking at a folder. A music collection might be an example of the latter. While the collection may exist as a directory of OGG files in the file system, that directory can be opened in at least two ways: as a regular folder, to work with files as files, and as a music player, for listening to music. On the other hand, a folder might not represent a directory at all. It could, for example, be a view of some sort of database (table?). The Templates folder on the desktop is such a folder. It is a combination of system templates, which may come from a database, and user-generated templates, which may be stored as files in a hidden directory.

The file manager, if that's what you want to call it, is responsible for making all of this work.

To avoid confusion, maybe it's better to call the things on the system "items" instead of "objects". Everything is an item. A folder is a kind of item that contains other items. A workspace folder is a kind of folder that remembers some of the status of its items. The desktop is a workspace folder that is always open behind all the windows and overlays on the screen. Signing in to the system is the same as opening your main desktop folder.

A template is a special kind of item. It's an item that represents a type of item. (Is there a template template?)

What are normally thought of as applications are combinations of templates and views. Views are what put windows on the screen. Every item has at least one view: the property view.

Every item has some sort of metadata. Metadata is stored in different ways. It may be in a file representing an item, in the filesystem extended attributes for that file, in a hidden file in the directory containing the file. All of this metadata is put together in the property view of the item.

Part of the metadata is about the views of an item. There's a datum that what the default view for the item is. Another datum is the last view of the item. For every datum about the views of the item, there is a datum about the location on the screen where the view was last seen. When the user opens an item, this position information is passed on the program responsible for the view of the item so that it can tell the compositor or window manager where the view should be shown. Also passed along, for the use of the view and the compositor, is the screen location of the item's icon and the timestamp of the event responsible for opening the view. This allows animation of the opening view to spring from the icon and, if the timestamps are right, the new window will be activated.

The property view is a window with some pages. The pages may be accessed from fixed tabs when few or from a list when many. Changes made in the view are automatic; there's no OK button.

Every item created for the system should be a kind of some existing item. A number of primitive items will be provided. Every item has at least a name and an icon, so those properties will appear in every item's General property page. When extending (wc?) an item, a page should be created for new properties. (Changes to system items may change existing pages.) If nothing else, the new page should provide a key-value tree for the new properties. (Maybe there should be a utility for seeing all metadata that way.) Not all properties need to be exposed in the user interface.

It is likely that many items will extend the Folder item. The OpenDocument format, for example, consists of a zip archive, which can be viewed as a folder.

Actually, objects may be the wrong idea. Interfaces may be more appropriate.

The OpenDocument format need not be written as an extension of the Folder item, but the system may nonetheless detect that the file is a zip archive and thus provide the View As Folder option.

The user interface is pulling together multiple sources of information to provide a simple interface of items. The basic metadata for a Folder may pull in information from the folder's contents, the parent folder's contents, the user's dot files, system files, and user and system databases. This may be very complicated, but it's all hidden from the casual user.

Some programs may just be programs. A simple calculator is one example. A terminal is another example, but it has an interesting twist. A terminal window always (?) runs some program, typically a shell. The terminal program file will be accessible through a file browser or command line, but the utility item should be a shell. The item may have a Program property page which identifies both the actual terminal program (e.g. "/usr/bin/xterm -hold -e") and the shell to be run. A calculator may be more than simple. Perhaps there's a calculator that keeps a record. It should provide a template for a record of calculations.

One thing to move away from is "saving" data. The user's work should always be preserved. In other words, auto-save should be the rule, not the exception. There is, however, still a use for those reflexive Mod-s keystrokes. Stamping. While the item in front of the user will be preserved in the place from whence it came, it may be useful to make copies at different stages of development. In other words, a time-stamped, possibly read-only by default, copy.