1/*!
2	\mainpage Welcome to the Haiku Book
3
4	Below you will find documentation on the Application Programming
5	Interface (API) of the Haiku operating system. This API describes
6	the internals of the operating system allowing developers to write
7	native C++ applications and device drivers. See the
8	<a href="http://api.haiku-os.org">online version</a> for the most
9	updated version of this document. If you would like to help contribute
10	contact the <a href="http://www.freelists.org/list/haiku-doc">documentation
11	mailing list</a>. For guidelines on how to help document the API see
12	the \link apidoc Documenting the API\endlink page. A list of
13	contributors can be found \ref credits page. Documenting the API is
14	an ongoing process so contributions are greatly appreciated.
15
16	The Haiku API is based on the BeOS R5 API but changes and additions have
17	been included where appropriate. Important compatibility differences are
18	detailed on the \ref compatibility page. New classes and methods
19	and incompatible API changes to the BeOS R5 API are noted in the
20	appropriate sections.
21	
22	A complete reference to the BeOS R5 API is available on the web in
23	<a href="http://haiku-os.org/legacy-docs/bebook/">The Be Book</a>.
24	The Be Book is used with permission from
25	<a href="http://www.access-company.com/">Access Co.</a>, the current
26	owners of Be's intellectual property.
27
28	\section kits Kits and Servers
29
30	The API is split into several kits and servers each detailing a different
31	aspect of the operating system.
32		- The \ref app is the starting point for developing applications
33			and includes classes for messaging and for interacting with
34			the rest of the system.
35		- The \ref game provides classes for producing game sounds and
36			working with full screen apps.
37		- The \ref interface is used to create responsive and attractive
38			graphical user interfaces building on the messaging facilities
39			provided by the Application Kit.
40			- The \link layout_intro Layout API \endlink is a new addition
41				to the Interface Kit in Haiku which provides resources to
42				layout your application flexibly and easily.
43		- The \ref locale includes classes to localize your application to
44			different languages, timezones, number formatting conventions and
45			much more.
46		- The \ref media provides a unified and consistent interface for media
47			streams and applications to intercommunicate.
48		- The \ref midi2 describes an interface to generating, processing,
49			and playing music in MIDI format. For reference documentation on the
50			\ref midi1 is also included.
51		- The \ref storage is a collection of classes that deal with storing and
52			retrieving information from disk.
53		- The \ref support contains support classes to use in your application
54			including resources for thread safety, IO, and serialization.
55		- The \ref translation provides a framework for converting data streams
56			between media formats.
57
58	\section special_topics Special Topics
59
60	- \ref drivers
61	- \ref keyboard
62*/
63
64///// Define main kits /////
65
66/*!
67	\defgroup app Application Kit
68	\brief The Application Kit is the starting point for writing native Haiku
69		GUI applications.
70
71	The application kit is exactly what its name suggests &mdash; it is the
72	basis of Haiku applications. You should first read through this document
73	and the references here before moving on to the other parts of the API.
74
75	The Application Kit classes can be divided into two groups: the messaging
76	classes and the system interaction classes. The larger of the two groups is
77	the messaging classes. Since the Haiku API relies on pervasive
78	multithreading messaging is an essential topic for any application. Have a
79	look at the \link app_messaging Introduction to Messaging \endlink for more
80	information.
81
82	The following messaging classes which allow you to easily and securely
83	communicate between threads.
84		- BHandler
85		- BInvoker
86		- BLooper
87		- BMessage
88		- BMessageFilter
89		- BMessageQueue
90		- BMessageRunner
91		- BMessenger
92 
93	The second group is the system interaction classes. These classes
94	provide hooks for your application to interact with the rest of the system.
95	The most important class in this group is BApplication. Below is a list of
96	all system interaction classes:
97		- BApplication
98		- BClipboard
99		- BCursor
100		- BPropertyInfo
101		- BRoster
102
103
104	\defgroup game Game Kit
105	\brief The Game Kit provides classes for producing game sounds and
106		working with full screen apps.
107
108
109	\defgroup interface Interface Kit
110	\brief API for displaying a graphical user interface.
111
112	The Interface Kit holds all the classes you'll need to develop a GUI.
113	Building on the messaging facilities provided by the Application Kit,
114	the Interface Kit can be used to create a responsive and attractive
115	graphical user interface.
116
117 	The most important class in the Interface Kit is the BView class, which
118	handles drawing and user interaction. Pointer and keyboard events are
119	processed in this class.
120
121	Another important class is the BWindow class, which holds BViews and makes
122	them visible to the user. The BWindow class also handles BView focusing
123	and BMessage dispatching, among other things.
124
125	A new addition Haiku has added over the BeOS API is the Layout API, which
126	is based around the BLayoutItem and BLayout classes. These classes will
127	take care of making sure all your GUI widgets end up where you want them,
128	with enough space to be useful. You can start learning the Layout API
129	by reading the \link layout_intro introduction \endlink.
130
131
132	\defgroup locale Locale Kit
133	\brief Collection of classes for localizing applications.
134
135	The Locale Kit provides a set of tools for internationalizing,
136	localizing and translating your software. This includes not only
137	replacing string with their translations at runtime, but also more
138	complex tasks such as formatting numbers, dates, and times in a way
139	that match the locale preferences of the user.
140
141	The main way to access locale data is through the be_locale_roster.
142	This is a global instance of the BLocaleRoster class, storing the data
143	for localizing an application according to the user's preferred settings.
144	The locale roster also acts as a factory to instantiate most of the other
145	classes. However, there are some cases where you will need to instantiate
146	another class by yourself, to use it with custom settings. For example, you
147	may need to format a date with a fixed format in english for including in an
148	e-mail header, as it is the only format accepted there.
149
150	Unlike the other kits in Haiku, the Locale kit does not live in libbe.
151	When building a localized application, you have to link it to
152	liblocale.so. If you want to use the catalog macros, you also have to
153	link each of your images (that is, applications, libraries and add-ons)
154	to liblocalestub.a.
155
156	\defgroup media Media Kit
157	\brief Collection of classes that deal with audio and video.
158
159
160	\defgroup midi1 The old MIDI Kit (libmidi.so)
161	\brief The old MIDI kit.
162
163
164	\defgroup midi2 MIDI 2 Kit
165	\brief The Midi Kit is the API that implements support for generating,
166		processing, and playing music in MIDI format.
167
168	<A HREF="http://www.midi.org/">MIDI</A>, which  stands for 'Musical
169	Instrument Digital Interface', is a well-established  standard for
170	representing and communicating musical data. This document serves as
171	an overview. If you would like to see all the components, please look
172	at \link midi2 the list with classes \endlink.
173
174	\section midi2twokits A Tale of Two MIDI Kits
175
176	BeOS comes with two different, but compatible Midi Kits. This
177	documentation focuses on the "new" Midi Kit, or midi2 as we like to
178	call it, that was  introduced with BeOS R5. The old kit, which we'll
179	refer to as midi1, is more complete than the new kit, but less powerful.
180
181	Both kits let you create so-called MIDI endpoints, but the endpoints
182	from midi1 cannot be shared between different applications. The midi2
183	kit solves that  problem, but unlike midi1 it does not include a General
184	MIDI softsynth, nor does it have a facility for reading and playing
185	Standard MIDI Files. Don't worry: both kits are compatible and you can
186	mix-and-match them in your applications.
187
188	The main differences between the two kits:
189		- Instead of one BMidi object that both produces and consumes events,
190			we have BMidiProducer and BMidiConsumer.
191		- Applications are capable of sharing MIDI producers and consumers
192			with other applications via the centralized Midi Roster.
193		- Physical MIDI ports are now sharable without apps "stealing" events
194			from each other.
195		- Applications can now send/receive raw MIDI byte streams (useful if
196			an application has its own MIDI parser/engine).
197		- Channels are numbered 0&ndash;15, not 1&ndash;16
198		- Timing is now specified in microseconds rather than milliseconds.
199
200	\section midi2concepts Midi Kit Concepts
201
202	A brief overview of the elements that comprise the Midi Kit:
203		- \b Endpoints. This is what the Midi Kit is all about: sending MIDI
204			messages between endpoints. An endpoint is like a MIDI In or MIDI
205			Out socket on your equipment; it either receives information or it
206			sends information. Endpoints that send MIDI events are called
207			\b producers; the endpoints that receive those events are called
208			\b consumers. An endpoint that is created by your own application
209			is called \b local; endpoints from other applications are
210			\b remote. You can access remote endpoints using \b proxies.
211		- \b Filters. A filter is an object that has a consumer and a producer
212			endpoint. It reads incoming events from its consumer, performs some
213			operation, and tells its producer to send out the results. In its
214			current form, the Midi  Kit doesn't provide any special facilities
215			for writing filters.
216		- \b Midi \b Roster. The roster is the list of all published producers
217			and consumers. By publishing an endpoint, you allow other
218			applications to talk to it. You are not required to publish your
219			endpoints, in which case only your own application can use them.
220		- \b Midi \b Server. The Midi Server does the behind-the-scenes work.
221			It manages the roster, it connects endpoints, it makes sure that
222			endpoints can communicate, and so on. The Midi Server is started
223			automatically when BeOS boots, and you never have to deal with it
224			directly. Just remember that it runs the show.
225		- \b libmidi. The BMidi* classes live inside two shared libraries:
226			libmidi.so and libmidi2.so. If you write an application that uses
227			old Midi Kit, you must link it to libmidi.so. Applications that use
228			the new Midi Kit must link to libmidi2.so. If you want to
229			mix-and-match both kits, you should also link to both libraries.
230
231	Here is a pretty picture:
232
233	\image html midi2concepts.png
234
235	\section midi2mediakit Midi Kit != Media Kit
236
237	Be chose not to integrate the Midi Kit into the Media Kit as another media
238	type, mainly because MIDI doesn't require any of the format negotiation that
239	other media types need. Although the two kits look similar -- both have a
240	"roster" for finding or registering "consumers" and "producers" -- there are
241	some very important differences.
242
243	The first and most important point to note is that BMidiConsumer and
244	BMidiProducer in the Midi Kit are \b NOT directly analogous to
245	BBufferConsumer and  BBufferProducer in the Media Kit! In the Media Kit,
246	consumers and producers are the data consuming and producing properties
247	of a media node. A filter in the Media Kit, therefore, inherits from both
248	BBufferConsumer and BBufferProducer, and implements their virtual member
249	functions to do its work.
250
251	In the Midi Kit, consumers and producers act as endpoints of MIDI data
252	connections, much as media_source and media_destination do in the Media Kit.
253	Thus, a MIDI filter does not derive from BMidiConsumer and BMidiProducer;
254	instead, it contains BMidiConsumer and BMidiProducer objects for each of its
255	distinct endpoints that connect to other MIDI objects. The Midi Kit does not
256	allow the use of multiple virtual inheritance, so you can't create an object
257	that's both a BMidiConsumer and a BMidiProducer.
258
259	This also contrasts with the old Midi Kit's conception of a BMidi object,
260	which stood for an object that both received and sent MIDI data. In the new
261	Midi Kit, the endpoints of MIDI connections are all that matters. What lies
262	between the endpoints, i.e. how a MIDI filter is actually structured, is
263	entirely at your discretion.
264
265	Also, rather than use token structs like media_node to make connections
266	via the MediaRoster, the new kit makes the connections directly via the
267	BMidiProducer object.
268
269	\section midi2remotelocal Remote vs. Local Objects
270
271	The Midi Kit makes a distinction between remote and local MIDI objects.
272	You can  only create local MIDI endpoints, which derive from either
273	BMidiLocalConsumer or BMidiLocalProducer. Remote endpoints are endpoints
274	that live in other applications, and you access them through BMidiRoster.
275
276	BMidiRoster only gives you access to BMidiEndpoints, BMidiConsumers, and
277	BMidiProducers. When you want to talk to remote MIDI objects, you do so
278	through the proxy objects that BMidiRoster provides. Unlike
279	BMidiLocalConsumer and BMidiLocalProducer, these classes do not provide a
280	lot of functions. That is intentional. In order to hide the details of
281	communication with MIDI endpoints in other applications, the Midi Kit must
282	hide the details of how a particular endpoint is implemented.
283
284	So what can you do with remote objects? Only what BMidiConsumer,
285	BMidiProducer, and BMidiEndpoint will let you do. You can connect
286	objects, get the properties of these objects -- and that's about it.
287
288	\section midi2lifespan Creating and Destroying Objects
289
290	The constructors and destructors of most midi2 classes are private,
291	which means that you cannot directly create them using the C++
292	<CODE>new</CODE> operator, on the  stack, or as globals. Nor can you
293	<CODE>delete</CODE> them. Instead, these objects are obtained through
294	BMidiRoster. The only two exceptions to this rule are BMidiLocalConsumer
295	and BMidiLocalProducer. These two objects may be directly created and
296	subclassed by developers.
297
298	\section midi2refcount Reference Counting
299
300	Each MIDI endpoint has a reference count associated with it, so that
301	the Midi Roster can do proper bookkeeping. When you construct a
302	BMidiLocalProducer or  BMidiLocalConsumer endpoint, it starts with a
303	reference count of 1. In addition, BMidiRoster increments the reference
304	count of any object it hands to you as a result of
305	\link BMidiRoster::NextEndpoint() NextEndpoint() \endlink or
306	\link BMidiRoster::FindEndpoint() FindEndpoint() \endlink.
307	Once the count hits  0, the endpoint will be deleted.
308
309	This means that, to delete an endpoint, you don't call the
310	<CODE>delete</CODE>  operator directly; instead, you call
311	\link BMidiEndpoint::Release() Release() \endlink.
312	To balance this call, there's also an
313	\link BMidiEndpoint::Acquire() Acquire() \endlink, in case you have two
314	disparate parts of your application working with the endpoint, and you
315	don't want to have to keep track of who needs to Release() the endpoint.
316
317	When you're done with any endpoint object, you must Release() it.
318	This is true  for both local and remote objects. Repeat after me:
319	Release() when you're done.
320
321	\section midi2events MIDI Events
322
323	To make some actual music, you need to
324	\link BMidiProducer::Connect() Connect() \endlink your consumers to
325	your producers. Then you tell the producer to "spray" MIDI events to all
326	the connected consumers. The consumers are notified of these incoming
327	events through a set of hook functions.
328
329	The Midi Kit already provides a set of commonly used spray functions,
330	such as  \link BMidiLocalProducer::SprayNoteOn() SprayNoteOn() \endlink,
331	\link BMidiLocalProducer::SprayControlChange() SprayControlChange()
332	\endlink, and so on. These correspond one-to-one with the message types
333	from the MIDI spec. You don't need to be a MIDI expert to use the kit, but
334	of course some knowledge of the protocol helps. If you are really hardcore,
335	you can also use the
336	\link BMidiLocalProducer::SprayData() SprayData() \endlink to send raw MIDI
337	events to the consumers.
338
339	At the consumer side, a dedicated thread invokes a hook function for every
340	incoming MIDI event. For every spray function, there is a corresponding hook
341	function, e.g. \link BMidiLocalConsumer::NoteOn() NoteOn() \endlink and
342	\link  BMidiLocalConsumer::ControlChange() ControlChange() \endlink.
343	The hardcore MIDI fanatics among you will be pleased to know that you can
344	also tap into the \link BMidiLocalConsumer::Data() Data() \endlink hook and
345	get your hands dirty with the raw MIDI data.
346
347	\section midi2time Time
348
349	The spray and hook functions accept a bigtime_t parameter named "time". This
350	indicates when the MIDI event should be performed. The time is given in
351	microseconds since the computer booted. To get the current tick measurement,
352	you call the system_time() function from the Kernel Kit.
353
354	If you override a hook function in one of your consumer objects, it should
355	look  at the time argument, wait until the designated time, and then perform
356	its action. The preferred method is to use the Kernel Kit's
357	<CODE>snooze_until()</CODE> function, which sends the consumer thread to
358	sleep  until the requested time has come. (Or, if the time has already
359	passed, returns immediately.)
360
361	Like this:
362
363	\code
364void MyConsumer::NoteOn(
365    uchar channel, uchar note, uchar velocity, bigtime_t time)
366{
367    snooze_until(time, B_SYSTEM_TIMEBASE);
368    ...do your thing...
369}
370	\endcode
371
372	If you want your producers to run in real time, i.e. they produce MIDI data
373	that needs to be performed immediately, you should pass time 0 to the spray
374	functions (which also happens to be the default value). Since time 0 has
375	already passed, <CODE>snooze_until()</CODE> returns immediately, and the
376	consumer will process the events as soon as they are received.
377
378	To schedule MIDI events for a performance time that lies somewhere in the
379	future, the producer must take into account the consumer's latency.
380	Producers  should attempt to get notes to the consumer by or before
381	<I>(scheduled_performance_time - latency)</I>. The time argument is still
382	the scheduled performance time, so if your consumer has latency, it should
383	snooze like this before it starts to perform the events:
384
385	\code
386snooze_until(time - Latency(), B_SYSTEM_TIMEBASE);
387	\endcode
388
389	Note that a typical producer sends out its events as soon as it can;
390	unlike a consumer, it does not have to snooze.
391
392	\section midi2ports Other Timing Issues
393
394	Each consumer object uses a Kernel Kit port to receive MIDI events from
395	connected producers. The queue for this port is only 1 message deep.
396	This means that if the consumer thread is asleep in a
397	<CODE>snooze_until()</CODE>, it will not read its port. Consequently,
398	any producer that tries to write a new event to this port will block until
399	the consumer thread is ready to receive a new message. This is intentional,
400	because it prevents producers from generating and queueing up thousands of
401	events.
402
403	This mechanism, while simple, puts on the producer the responsibility
404	for sorting the events in time. Suppose your producer sends three Note
405	On events, the first on t + 0, the second on t + 4, and the third on t + 2.
406	This last event won't be received until after t + 4, so it will be two ticks
407	too late. If this sort of thing can happen with your producer, you should
408	somehow sort the events before you spray them. Of course, if you have two or
409	more producers connected to the same consumer, it is nearly impossible to
410	sort this all out (pardon the pun). So it is not wise to send the same kinds
411	of events from more than one producer to one consumer at the same time.
412
413	The article Introduction to MIDI, Part 2 in <A
414	HREF="http://open-beos.sourceforge.net/nsl.php?mode=display&id=36">OpenBeOS
415	Newsletter 36</A> describes this problem in more detail, and provides a
416	solution. Go read it now!
417
418	\section midi2filters Writing a Filter
419
420	A typical filter contains a consumer and a producer endpoint. It receives
421	events from the consumer, processes them, and sends them out again using the
422	producer. The consumer endpoint is a subclass of BMidiLocalConsumer, whereas
423	the producer is simply a BMidiLocalProducer, not a subclass. This is a
424	common  configuration, because consumers work by overriding the event hooks
425	to do work  when MIDI data arrives. Producers work by sending an event when
426	you call their  member functions. You should hardly ever need to derive from
427	BMidiLocalProducer (unless you need to know when the producer gets connected
428	or disconnected, perhaps), but you'll always have to override one or more of
429	BMidiLocalConsumer's member functions to do something useful with incoming
430	data.
431
432	Filters should ignore the time argument from the spray and hook functions,
433	and  simply pass it on unchanged. Objects that only filter data should
434	process the  event as quickly as possible and be done with it. Do not
435	<CODE>snooze_until()</CODE> in the consumer endpoint of a filter!	
436
437	\section midi2apidiffs API Differences
438
439	As far as the end user is concerned, the Haiku Midi Kit is mostly the same
440	as the BeOS R5 kits, although there are a few small differences in the API
441	(mostly bug fixes):
442		- BMidiEndpoint::IsPersistent() always returns false.
443		- The B_MIDI_CHANGE_LATENCY notification is now properly sent. The Be
444			kit  incorrectly set be:op to B_MIDI_CHANGED_NAME, even though the
445			rest of the  message was properly structured.
446		- If creating a local endpoint fails, you can still Release() the object
447		  without crashing into the debugger.
448
449	\section midi2seealso See also
450
451	More about the Midi Kit:
452		- \ref Midi2Defs.h
453		- Be Newsletter Volume 3, Issue 47 - Motor Mix sample code
454		- Be Newsletter Volume 4, Issue 3 - Overview of the new kit
455		- <A HREF="http://haiku-os.org/documents/dev/introduction_to_midi_part_1">Newsletter
456		  33</A>, Introduction to MIDI, Part 1
457		- <A HREF="http://haiku-os.org/documents/dev/introduction_to_midi_part_2">Newsletter
458		  36</A>, Introduction to MIDI, Part 2
459		- Sample code and other goodies at the
460		  <A HREF="http://haiku-os.org/about/teams/midi_kit">Haiku Midi Kit team page</A>
461
462	Information about MIDI in general:
463		- <A HREF="http://www.midi.org">MIDI Manufacturers Association</A>
464		- <A HREF="http://www.borg.com/~jglatt/tutr/miditutr.htm">MIDI Tutorials</A>
465		- <A HREF="http://www.borg.com/~jglatt/tech/midispec.htm">MIDI Specification</A>
466		- <A HREF="http://www.borg.com/~jglatt/tech/midifile.htm">Standard MIDI File Format</A>
467		- <A HREF="http://www.io.com/~jimm/midi_ref.html">Jim Menard's MIDI Reference</A>
468
469
470	\defgroup libmidi2 (libmidi2.so)
471
472
473	\defgroup storage Storage Kit
474	\brief Collection of classes that deal with storing and retrieving
475		information from disk.
476
477
478	\defgroup support Support Kit
479	\brief Collection of utility classes that are used throughout the API.
480
481	The Support Kit provides a handy set of classes that you can use in your
482	applications. These classes provide:
483		- \b Thread \b Safety. Haiku can execute multiple threads of an
484			application in parallel, letting certain parts of an application
485			continue when one part is stalled, as well as letting an application
486			process multiple pieces of data at the same time on multicore or
487			multiprocessor systems. However, there are times when multiple
488			threads desire to work on the same piece of data at the same time,
489			potentially causing a conflict where variables or pointers are
490			changed by one thread causing another to execute incorrectly. To
491			prevent this, Haiku implements a \"locking\" mechanism, allowing one
492			thread to \"lock out\" other threads from executing code that might
493			modify the same data.
494		  - \b Archiving \b and \b IO. These classes allow a programmer to
495			convert objects into a form that can more easily be transferred to
496			other applications or stored to disk, as well as performing basic
497			input and output operations.
498		  - \b Memory \b Allocation. This class allows a programmer to hand off
499			some of the duties of memory accounting and management.
500		  - \b Common \b Datatypes. To avoid unnecessary duplication of code
501			and to make life easier for programmers, Haiku includes classes that
502			handle management of ordered lists and strings.
503
504	There are also a number of utility functions to time actions, play system
505	alert sounds, compare strings, and atomically manipulate integers. Have a
506	look at the overview, or go straight to the complete
507	\link support list of components \endlink of this kit.
508
509	\section Overview
510		- Thread Safety:
511			- BLocker provides a semaphore-like locking mechanism allowing for
512				recursive locks.
513			- BAutolock provides a simple method of automatically removing a
514				lock when a function ends.
515			- \ref TLS.h "Thread Local Storage" allows a global variable\'s
516				content to be sensitive to thread context.
517		- Archiving and IO:
518			- BArchivable provides an interface for \"archiving\" objects so
519				that they may be sent to other applications where an identical
520				copy will be recreated.
521			- BArchiver simplifies archiving of BArchivable hierarchies.
522			- BUnarchiver simplifies unarchiving hierarchies that have been
523				archived using BArchiver.
524			- BFlattenable provides an interface for \"flattening\" objects so
525				that they may be easily stored to disk.
526		- BDataIO provides an interface for generalized read/write streams.
527			- BPositionIO extends BDataIO to allow seeking within the data.
528			- BBufferIO creates a buffer and attaches it to a BPositionIO
529				stream, allowing for reduced load on the underlying stream.
530			- BMemoryIO allows operation on an already-existing buffer.
531			- BMallocIO creates and allows operation on a buffer.
532		- Memory Allocation:
533			- BBlockCache allows an application to allocate a \"pool\" of
534				memory blocks that the application can fetch and dispose of as
535				it pleases, letting the application make only a few large memory
536				allocations, instead of many small expensive allocations.
537		- Common Datatypes:
538			- BList allows simple ordered lists and provides common access,
539				modification, and comparison functions.
540			- BString allows strings and provides common access, modification,
541				and comparison functions.
542		- BStopWatch allows an application to measure the time an action takes.
543			- \ref support_globals "Global functions"
544			- \ref TypeConstants.h "Common types and constants"
545			- Error codes for all kits
546
547
548	\defgroup translation Translation Kit
549	\brief Provides a framework for converting data streams between media
550		formats.
551
552
553	\defgroup libbe (libbe.so)
554
555
556	\defgroup libroot (libroot.so)
557*/
558
559///// Subgroups /////
560
561/*!
562	\defgroup support_globals Global functions in the support kit
563	\ingroup support
564
565	\defgroup layout Layout classes in the Interface Kit
566	\ingroup interface
567*/
568
569
570///// Special Topics /////
571
572\defgroup drivers Device Drivers
573\defgroup keyboard Keyboard