Windicators

Designed by MarkShuttleworth, written up by MatthewPaulThomas and TedGould

Window indicators, or windicators, are menus that appear at the trailing end of a window’s title bar, or in the panel when the window is maximized. Application developers can use windicators for reflecting status, and allowing change of status, for the item or items presented in the window. The menus should be implemented using DbusMenu.

Separately, hint bars are a transitory alternative to status bars. With any interactive menus moved from a status bar to a windicator, a hint bar can replace a window’s status bar.

Reference: http://www.markshuttleworth.com/?p=333

Design

Any windicator should have a fallback, so that the program will work understandably in an environment (such as Kubuntu, for example) where windicators are not available.

some mockups:

https://wiki.ubuntu.com/Ayatana/Windicators/DanielsWindicators

Windicators

As with ApplicationIndicators, a windicator is a menu with a title.

The title may consist of an icon, or an icon plus brief text. In both cases the icon has an accessible label, which is exposed to accessibility aids but not shown otherwise. It may also have an accessible description.

Application developers should use a symbolic icon (from the -symbolic namespace) for a windicator title, to ensure it is visible regardless of the color of the title bar or panel.

Windicators have no mouseover event.

Hint bars

A hint bar, as popularized by Chromium, is a compact, transitory alternative to a status bar. It presents advisory text only when it is needed, and in a faster and less obnoxious way than a tooltip.

If the only interactive controls in an application’s status bar are menu buttons, converting these to windicators may let the application replace its status bar with a hint bar.

As in Chromium, when the pointer is over the area taken up by a hint bar, the hint bar should temporarily slide away into the bottom of the window, just as it does when it no longer has anything to display. It should return as soon as the pointer leaves the area.

Implementation

Constructing and changing a windicator

An AyatanaStatus object contains any number of windicators, and/or a stack of hint bar messages, for a given window:

  • AyatanaStatus * my_window_status = ayatana_status_new(window);

A windicator is constructed using an icon, an accessible label, and a GtkMenu:

  • AyatanaWindicator * my_windicator = windicator_new("title-icon-name-symbolic", "View mode: Icons", a_menu_i_constructed_earlier);

Once the windicator is constructed, it needs to be attached to the window’s AyatanaStatus object:

  • ayatana_status_append_windicator(my_window_status, my_windicator);

Finally, show the windicator:

  • ayatana_status_windicator_show(my_windicator);

To hide a windicator, call the opposite function:

  • ayatana_status_windicator_hide(my_windicator);

By default, a windicator has no text label. If a windicator needs a label, it can be set after the windicator is first constructed. The icon, accessible label, and description can similarly be changed:

  • windicator_set_label      (my_windicator, "120%");
    windicator_set_icon       (my_windicator, "some-other-icon-symbolic", "accessible label goes here");
    windicator_set_description(my_windicator, "Zoom level for the current window.");

Windicator fallback

Custom fallbacks can be implemented by subclassing the AyatanaStatus object and overriding the fallback() and unfallback() functions. There will also be a signal for state_changed which will notify listeners about a change the AyatanaStatus object's state.

If the application wishes it can query the status of how the status is currently being displayed.

AyatanaStatusState state = ayatana_status_get_state(status);

Then it gets one of:

  • FALLBACK displayed as defined by the fallback() function (by default, in a status bar at the bottom of the window)

  • TITLEBAR The windicators are in the title and the status items are overlaying the active window.

  • PANEL The windicators are in the panel and the status items are overlaying the active window.

Placing windicators

Unless the application developer specifies otherwise, windicators should be placed in the order they were requested, starting at the trailing end of the title bar (or, if the window is maximized in Unity, at the leading side of the application indicators).

There should be append, prepend, and reordering functions as in GList, for changing the order of windicators if you really want to do that.

Using a hint bar

A hint bar should work similarly to a GtkStatusBar, except that it does not need to be explicitly constructed and included in a window’s layout. Instead, it is part of the AyatanaStatus object.

To use a hint bar, an application developer should push and pop status messages:

  • ayatana_status_push_message(my_window_status, "Clicking will cause computer to explode");
    ayatana_status_pop_message(my_window_status, AYATANA_STATUS_MESSAGES_LAST);

There should be another constant for clearing all the messages off the stack:

  • ayatana_status_pop_message(my_window_status, AYATANA_STATUS_MESSAGES_ALL);

Applications that need more fine-grained control of their messages should track them with message IDs:

  • AyatanaStatusMessageID id1 = ayatana_status_push_message(status, "First Message");
    AyatanaStatusMessageID id2 = ayatana_status_push_message(status, "Second Message");
    ayatana_status_pop_message(status, id1); /* would leave id2 showing */

Or to add to a notification stack of temporary statuses that should be shown to the user for a short time à la Notify OSD:

  • ayatana_status_queue_message(status, "Download Complete", DEFAULT_TIMEOUT);

There will also be signal handlers to show when a message is displayed and hidden for those applications that wish to track their messages closely, whether they are timed or permanent.

  • void message_appear (AyatanaStatus * status, AyatanaMessageID id, gpointer user_data) {
            g_debug("Showing status");
            return;
    }
    
    g_signal_connect(G_OBJECT(status), "message-shown", G_CALLBACK(message_appear), NULL);

Other signals:

  • "message-removed" The message is no longer expected to be displayed
  • "message-hidden" The message can not currently be seen by the user as it is behind another message.

Proof-of-concept implementations

We should alter five applications to use windicators, to test the mechanism and to provide examples of how they can be used. One of these applications (Gimp) can, as a result, also switch from using a status bar to using a hint bar.

Evolution

evolution.jpg

The Evolution windicator provides examples of (a) radio items with icons and (b) custom fallback.

When windicators are available:

  • There should be a windicator for changing the view mode of the window. It should be a replica of the “View” > “Window” submenu, except that it should always show the icon for each application, and also show a radio mark for the selected application.

  • The application switcher inside the Evolution window should not be present, and neither should the “View” > “Switcher Appearance” submenu.

When windicators are not available, the in-window application switcher and the “View” > “Switcher Appearance” submenu should be present.

F-Spot

f-spot.jpg

The F-Spot windicator provides an example of boolean items with icons.

When windicators are available, there should be a windicator for tagging the selected photos. The menu should consist of a boolean item for each tag. If all selected photos have a tag, the tag item should have a checked checkmark (✓); if only some of them do, the tag item should have an indeterminate checkmark (–).

When windicators are not available, this menu should not be shown anywhere else. (Ideally it would be prepended to the “Tags” menu, but other items in that same menu assume you are using the “Tags” sidebar rather than tagging with a menu.)

Firefox

firefox.jpg

The Firefox windicator provides an example of a windicator that appears and disappears.

Whenever Firefox regards the current page as having a secure connection, and windicators are available, there should be a security windicator instead of the padlock in Firefox’s status bar.

The windicator should have a padlock as its title, with the accessible label “Secure connection”. Activating the menu’s only item, “Security Info”, should open the “Page Info” window to its “Security” tab.

When windicators are not available, the padlock button should be shown in its traditional position in the status bar, or wherever it moves to upstream if Firefox 4 drops the status bar.

Gimp

gimp.jpg

The Gimp windicators provide examples of (a) multiple windicators for the same window, (b) text in windicator titles, (c) custom alignment of item text, (d) a text field in a windicator menu, and (e) a hint bar.

When windicators are available, there should be two windicators for any Gimp document window: one for ruler units, and one for zoom level. These should replace the radio menu and combo box that are present in the status bar when windicators are not available.

The units windicator should list, as radio items, the available units for the ruler.

The zoom level windicator should list as radio items, from lowest to highest, the canned zoom levels for the image. If the current zoom level is not one of the canned ones, it should be included as an extra item in its appropriate numeric position.

The last item in the menu should be a text field for entering a custom zoom level. When the menu is opened with a pointing device, this field should always be empty and focused. (At this point, pressing the Down key immediately should, as usual, highlight the first item in the menu, and thereby unfocus the text field.)

All items in the menu should be aligned such that the “%” symbols line up with each other exactly.

Mumble

mumble.jpg

The Mumble windicator provides an example of a windicator in a mini title bar.

When windicators are not available, there should be no change to Mumble’s interface.

When windicators are available ...

Future work

Define windicators for Chromium (Incognito mode?) and Thunderbird.

Unresolved issues

  • define window management interaction
    • windicators on alt-tab window previews
    • windicators on expose presentation of windows

From review by John Lea:

  • There’s no description of the problem that windicators would solve.
  • There’s no evaluation of alternative solutions to the problem.
  • Should have brief user stories describing how people might realistically use them.
  • Need guidelines to distinguish when people should use windicators vs. toolbars, menus, floating toolboxes, and tabs.
  • There’s no evaluation of alternative solutions to each of the windicator uses proposed here. In particular:
    • Why should the Evolution switching be implemented using a windicator rather than tabs or a toolbar?
    • What are the pros and cons of the F-Spot windicator vs. left pane or toolbar?
    • Why should those particular Gimp functions be windicators? Are there other functions that should?
    • Should every application with zoom present it as a windicator? Why or why not?

Ayatana/Windicators (last edited 2011-08-21 17:11:22 by mpt)