Menus

This file originally described how the menus should become implemented.
Now that they are implemented, the description is also in the source:
server/menu.h. The current menu contents can be found in server/menus.c.
Reading these files it becomes easy to understand the menus.

I (Joris) have given the file you are reading a new purpose:
client-supplied menus.


INTERNAL SERVER DATA

In the server dir there is a file named client_menus.h from 3 april 2000
which describes the data structures that we should probably need.

typedef struct client_menu {
	char id[];
	LL *items;
} client_menu;

(LL is a list)

typedef struct client_menu_item {
	char id[];
	int type;						  // Title, function, submenu, slider, checkbox, etc...
	int value;						  // Holds stuff like "true", 43, etc...
	char text[];					  // Text to display here...
	char child[];					  // For the "submenu" type
} client_menu;



DEFINING BY CLIENTS

To define a menuitem using the widget language the following functions have
been defined in the file client_functions.c:
(In my opinion the menu_add functions can be left away, because a submenu
is an item as well.)

menu_add_item
menu_del_item
menu_set_item

The functions are not implemented yet, but looking at what we need, the
parameters could look like this:

menu_add_item itemname itemstring itemtype [-m menu] -v initvalue
menu_del_item itemname
menu_set_item itemname [-v value] [-s itemstring]

You should not need to define the first menu of a client. The name of the
client is known and will be used to give the menu a name. The first level
menu will simply be created automatically when a client defines an item in
it's menu.
(Or is there any reason why the client should create its own menu ? A client
should not be able to create two main menus anyway)

The following item types exist:
title		A title to be used on the top of the menu.
menu		A submenu. Refer to this new menu using the -m option.
action		An action. The client is notified that the user wants the
		action to be executed.
checkbox	A checkbox. The client is notified whenever the state is
		changed.
slider		A checkbox. The client is notified whenever the slider is
		moved.

Note that I have changed the 'function' menu type to 'action' here. The name
'function' was only appropriate internally, because a function was called.
For clients we only know an action will be performed.



RETURNED DATA

The server should inform the client on events. It should be able to return 
strings like:

action itemname
checkbox itemname newvalue
slider itemname newvalue


EXAMPLE SESSION

We have an M3 player here.

menu_add_item action play "Play"
menu_add_item action stop "Stop"
menu_add_item menu tracks "Select Track"
menu_add_item action track1 "1: Leg"
menu_add_item action track2 "2: Palomine"
menu_add_item action track3 "3: Kid's allright"
menu_add_item action track4 "4: brain-Tag"
menu_add_item menu CDs "Select CD"
menu_add_item action cd1 "1: Bettie Serveert - Palomine"
menu_add_item action cd2 "2: Rammstein - Herzeleid"
menu_add_item slider volume "Volume"

When you should switch CD using the second submenu, the client will be
informed with:

action cd2

Then the client knows the user has selected the second CD, and the items of
the Track menu should be changed according to the contents of the CD:

menu_set_item track1 -s "1: Wollt ihr das bett in flammen sehen"
menu_set_item track2 -s "2: Der meister"
menu_set_item track3 -s "3: Weisses fleish"

When the user changes the volume slider, the client will be informed with:

slider volume 40

When it is set at 40%.



--
Complete rewrite, Joris Robijn, 20011015

