Anonymous avatar Anonymous committed de76034

cdrom module rewritten
all constructor-like functions use capitalized object name

Comments (0)

Files changed (28)

 #This is a list of changes in pygame's history.
 
+Nov 29, 2000
+	cdrom module rewrite finished [BREAK]
+	all constructors using capitalized function names [BREAK]
+		(Rect, pygame.Surface, pygame.font.Font, etc)
+
 Nov 28, 2000
 	Surface.convert() better handles surface flags
 	All color arguments (and returns) are RGBA format [BREAK]
 	Removed Surface.map_rgba and unmap_rgba [BREAK]
 	Added a default font, used by passing None as font file
-	pygame.font.font changed to pygame.font.new_font() [BREAK]
 
 pygame-03
 Nov 20, 2000
 </td></tr></table>
 <br>
 <h2 align=center>CD</h2>
-thin wrapper around the SDL CDROM api, likely to
-change
+The CD object represents a CDROM drive and allows you to
+access the CD inside that drive. All functions (except get_name())
+require the CD object to be initialized. This is done with the
+CD.init() function.
 
 <hr>
 
 ejects cdrom drive</td></tr>
 
 
-<tr><td><a href=#get_cur_frame>get_cur_frame</a></td><td> -
-query current frame</td></tr>
+<tr><td><a href=#get_busy>get_busy</a></td><td> -
+checks if the cd is currently playing</td></tr>
 
 
-<tr><td><a href=#get_cur_track>get_cur_track</a></td><td> -
-query current track</td></tr>
+<tr><td><a href=#get_current>get_current</a></td><td> -
+get current position of the cdrom</td></tr>
 
 
 <tr><td><a href=#get_empty>get_empty</a></td><td> -
-query status of drive</td></tr>
+checks for a cd in the drive</td></tr>
 
 
-<tr><td><a href=#get_status>get_status</a></td><td> -
-query drive status</td></tr>
+<tr><td><a href=#get_init>get_init</a></td><td> -
+check if cd is initialized</td></tr>
+
+
+<tr><td><a href=#get_name>get_name</a></td><td> -
+query name of cdrom drive</td></tr>
+
+
+<tr><td><a href=#get_paused>get_paused</a></td><td> -
+checks if the cd is currently paused</td></tr>
+
+
+<tr><td><a href=#get_track_audio>get_track_audio</a></td><td> -
+check if a track has audio data</td></tr>
+
+
+<tr><td><a href=#get_track_length>get_track_length</a></td><td> -
+check the length of an audio track</td></tr>
+
+
+<tr><td><a href=#get_track_start>get_track_start</a></td><td> -
+check the start of an audio track</td></tr>
+
+
+<tr><td><a href=#get_tracks>get_tracks</a></td><td> -
+get number of tracks on cd</td></tr>
+
+
+<tr><td><a href=#init>init</a></td><td> -
+initialize a cdrom device for use</td></tr>
 
 
 <tr><td><a href=#pause>pause</a></td><td> -
 play music from cdrom</td></tr>
 
 
-<tr><td><a href=#play_tracks>play_tracks</a></td><td> -
-play music from cdrom</td></tr>
+<tr><td><a href=#quit>quit</a></td><td> -
+uninitialize a cdrom device for use</td></tr>
 
 
 <tr><td><a href=#resume>resume</a></td><td> -
 
 <a name=eject><font size=+2><b>eject
 </b></font><br><font size=+1><tt>
-CD.eject() -> int
+CD.eject() -> None
 </tt></font><ul>
-Ejects the media from the CDROM drive.
+Ejects the media from the CDROM drive. If the drive is empty, this
+will open the CDROM drive.
 </ul><br>&nbsp;<br>
 
-<a name=get_cur_frame><font size=+2><b>get_cur_frame
+<a name=get_busy><font size=+2><b>get_busy
 </b></font><br><font size=+1><tt>
-CD.get_cur_frame() -> int
+CD.get_busy() -> bool
 </tt></font><ul>
-Get the current frame of a playing CD.
+Returns a true value if the cd drive is currently playing. If
+the drive is paused, this will return false.
 </ul><br>&nbsp;<br>
 
-<a name=get_cur_track><font size=+2><b>get_cur_track
+<a name=get_current><font size=+2><b>get_current
 </b></font><br><font size=+1><tt>
-CD.get_cur_track() -> int
+CD.get_current() -> track, seconds
 </tt></font><ul>
-Get the current track of a playing CD.
+Returns the current track on the cdrom and the number of
+seconds into that track.
 </ul><br>&nbsp;<br>
 
 <a name=get_empty><font size=+2><b>get_empty
 </b></font><br><font size=+1><tt>
 CD.get_empty() -> bool
 </tt></font><ul>
-Returns true when there is no disk in the CD
-drive.
+Returns a true value if the cd drive is empty.
 </ul><br>&nbsp;<br>
 
-<a name=get_status><font size=+2><b>get_status
+<a name=get_init><font size=+2><b>get_init
 </b></font><br><font size=+1><tt>
-CD.get_status() -> int
+CD.get_init() -> bool
 </tt></font><ul>
-Get the status of the CDROM drive.
+Returns a true value if the CD is initialized.
+</ul><br>&nbsp;<br>
+
+<a name=get_name><font size=+2><b>get_name
+</b></font><br><font size=+1><tt>
+CD.get_name(id) -> string
+</tt></font><ul>
+Returns the name of the CDROM device, given by the
+system. This function can be called before the drive
+is initialized.
+</ul><br>&nbsp;<br>
+
+<a name=get_paused><font size=+2><b>get_paused
+</b></font><br><font size=+1><tt>
+CD.get_paused() -> bool
+</tt></font><ul>
+Returns a true value if the cd drive is currently paused.
+</ul><br>&nbsp;<br>
+
+<a name=get_track_audio><font size=+2><b>get_track_audio
+</b></font><br><font size=+1><tt>
+CD.get_track_audio(track) -> bool
+</tt></font><ul>
+Returns true if the cdrom track contains audio data.
+</ul><br>&nbsp;<br>
+
+<a name=get_track_length><font size=+2><b>get_track_length
+</b></font><br><font size=+1><tt>
+CD.get_track_length(track) -> seconds
+</tt></font><ul>
+Returns the number of seconds in an audio track. If the
+track does not contain audio data, returns 0.0.
+</ul><br>&nbsp;<br>
+
+<a name=get_track_start><font size=+2><b>get_track_start
+</b></font><br><font size=+1><tt>
+CD.get_track_start(track) -> seconds
+</tt></font><ul>
+Returns the number of seconds an audio track starts
+on the cd.
+</ul><br>&nbsp;<br>
+
+<a name=get_tracks><font size=+2><b>get_tracks
+</b></font><br><font size=+1><tt>
+CD.get_tracks() -> numtracks
+</tt></font><ul>
+Returns the number of available tracks on the CD. Note that not
+all of these tracks contain audio data. Use CD.get_audio() to check
+the track type before playing.
+</ul><br>&nbsp;<br>
+
+<a name=init><font size=+2><b>init
+</b></font><br><font size=+1><tt>
+CD.init() -> None
+</tt></font><ul>
+In order to call most members in the CD object, the
+CD must be initialized. You can initialzie the CD object
+at anytime, and it is ok to initialize more than once.
 </ul><br>&nbsp;<br>
 
 <a name=pause><font size=+2><b>pause
 </b></font><br><font size=+1><tt>
-CD.pause() -> int
+CD.pause() -> None
 </tt></font><ul>
-Pauses the playing CD.
+Pauses the playing CD. If the CD is not playing, this will
+do nothing.
 </ul><br>&nbsp;<br>
 
 <a name=play><font size=+2><b>play
 </b></font><br><font size=+1><tt>
-CD.play(start_frame, nframes) -> int
+CD.play(track) -> None
 </tt></font><ul>
-Start playing from start_frame, for nframes. If
-nframes is 0, it will play until the end of the
-cdrom
+Play an audio track on a cdrom disk.
 </ul><br>&nbsp;<br>
 
-<a name=play_tracks><font size=+2><b>play_tracks
+<a name=quit><font size=+2><b>quit
 </b></font><br><font size=+1><tt>
-CD.play_tracks(start_track, start_frame, ntracks, nframes) -> int
+CD.quit() -> None
 </tt></font><ul>
-Start playing from start_track, for ntracks and
-nframes. If ntracks and nframes are 0, it will
-play until the end of the cdrom
+After you are completely finished with a cdrom device, you
+can use this <a href=pygame.html#quit>quit()</a> function to free access to the drive.
+This will be cleaned up automatically when the cdrom module is.
+uninitialized. It is safe to call this function on an uninitialized CD.
 </ul><br>&nbsp;<br>
 
 <a name=resume><font size=+2><b>resume
 </b></font><br><font size=+1><tt>
 CD.resume() -> int
 </tt></font><ul>
-Resumes playback of a paused CD.
+Resumes playback of a paused CD. If the CD has not been
+pause, this will do nothing.
 </ul><br>&nbsp;<br>
 
 <a name=stop><font size=+2><b>stop
 </b></font><br><font size=+1><tt>
 CD.stop() -> int
 </tt></font><ul>
-Stops the playing CD.
+Stops the playing CD. If the CD is not playing, this will
+do nothing.
 </ul><br>&nbsp;<br>
 
 

docs/ref/Channel.html

 control.
 <br>&nbsp;<br>
 Sound objects can be retrieved from the pygame.mixer module with
-functions like pygame.mixer.get_channel() and
+functions like pygame.mixer.Channel() and
 pygame.mixer.find_channel(). Also, each time you call
 Sound.play() a Channel object will be returned, representing the
 channel that sound is playing on.

docs/ref/pygame.html

 <hr>
 
 <table>
+<tr><td><a href=#Rect>Rect</a></td><td> -
+create a new rectangle</td></tr>
+
+
+<tr><td><a href=#Surface>Surface</a></td><td> -
+Surface</td></tr>
+
+
 <tr><td><a href=#get_error>get_error</a></td><td> -
 get current error message</td></tr>
 
 autoinitialize all imported pygame modules</td></tr>
 
 
-<tr><td><a href=#new_rect>new_rect</a></td><td> -
-create a new rectangle</td></tr>
-
-
-<tr><td><a href=#new_surface>new_surface</a></td><td> -
-Surface</td></tr>
-
-
 <tr><td><a href=#quit>quit</a></td><td> -
 uninitialize all pygame modules</td></tr>
 
 
 <hr>
 
+<a name=Rect><font size=+2><b>Rect
+</b></font><br><font size=+1><tt>
+pygame.Rect(rectstyle) -> Rect
+</tt></font><ul>
+Creates a new rectangle object. The given
+rectstyle represents one of the various ways of
+representing rectangle data. This is usually a
+sequence of x and y position for the topleft
+corner, and the width and height.
+</ul><br>&nbsp;<br>
+
+<a name=Surface><font size=+2><b>Surface
+</b></font><br><font size=+1><tt>
+pygame.Surface(size, [flags, [depth|Surface, [masks]]]) ->
+</tt></font><ul>
+<br>&nbsp;<br>
+Creates a new surface object. Size is a 2-int-sequence containing
+width and height. Depth is the number of bits used per pixel. If
+omitted, depth will use the current display depth. Masks is a
+four item sequence containing the bitmask for r,g,b, and a. If
+omitted, masks will default to the usual values for the given
+bitdepth. Flags is a mix of the following flags: SWSURFACE,
+HWSURFACE, ASYNCBLIT, SRCCOLORKEY, or SRCALPHA. (flags = 0 is the
+same as SWSURFACE). depth and masks can be substituted for
+another surface object which will create the new surface with the
+same format as the given one. When using default masks, alpha
+will always be ignored. Note, if you pass SRCOLORKEY and/or
+SRCALPHA, the surface won't immediately have these features
+enabled. SDL will use these flags to help optimize the surface
+for use with the blitters. Also, for a plain software surface, 0
+can be used for the flag. A plain hardware surface can just use 1
+for the flag.
+</ul><br>&nbsp;<br>
+
 <a name=get_error><font size=+2><b>get_error
 </b></font><br><font size=+1><tt>
 pygame.get_error() -> errorstring
 since the.
 </ul><br>&nbsp;<br>
 
-<a name=new_rect><font size=+2><b>new_rect
-</b></font><br><font size=+1><tt>
-pygame.new_rect(rectstyle) -> Rect
-</tt></font><ul>
-Creates a new rectangle object. The given
-rectstyle represents one of the various ways of
-representing rectangle data. This is usually a
-sequence of x and y position for the topleft
-corner, and the width and height.
-</ul><br>&nbsp;<br>
-
-<a name=new_surface><font size=+2><b>new_surface
-</b></font><br><font size=+1><tt>
-pygame.new_surface(size, [flags, [depth|Surface, [masks]]]) ->
-</tt></font><ul>
-<br>&nbsp;<br>
-Creates a new surface object. Size is a 2-int-sequence containing
-width and height. Depth is the number of bits used per pixel. If
-omitted, depth will use the current display depth. Masks is a
-four item sequence containing the bitmask for r,g,b, and a. If
-omitted, masks will default to the usual values for the given
-bitdepth. Flags is a mix of the following flags: SWSURFACE,
-HWSURFACE, ASYNCBLIT, SRCCOLORKEY, or SRCALPHA. (flags = 0 is the
-same as SWSURFACE). depth and masks can be substituted for
-another surface object which will create the new surface with the
-same format as the given one. When using default masks, alpha
-will always be ignored. Note, if you pass SRCOLORKEY and/or
-SRCALPHA, the surface won't immediately have these features
-enabled. SDL will use these flags to help optimize the surface
-for use with the blitters. Also, for a plain software surface, 0
-can be used for the flag. A plain hardware surface can just use 1
-for the flag.
-</ul><br>&nbsp;<br>
-
 <a name=quit><font size=+2><b>quit
 </b></font><br><font size=+1><tt>
 pygame.quit() -> none

docs/ref/pygame_cdrom.html

 </td></tr></table>
 <br>
 <h2 align=center>pygame.cdrom</h2>
-thin wrapper around the SDL CDROM api, likely to
-change
+The cdrom module provides a few functions to initialize
+the CDROM subsystem and to manage the CD objects. The CD
+objects are created with the pygame.cdrom.CD() function.
+This function needs a cdrom device number to work on. All
+cdrom drives on the system are enumerated for use as a CD
+object. To access most of the CD functions, you'll need to
+Init() the CD object. (note that the cdrom module will already
+be initialized). When multiple CD objects are created for the
+same CDROM device, the state and values for those CD objects
+will be shared.
+<br>&nbsp;<br>
+You can call the CD.get_name() function withouth initializing
+the CD object. This function returns the system name given to
+that CDROM drive.
 
 <hr>
 
 <table>
-<tr><td><a href=#count>count</a></td><td> -
+<tr><td><a href=#CD>CD</a></td><td> -
+create new CD object</td></tr>
+
+
+<tr><td><a href=#get_count>get_count</a></td><td> -
 query number of cdroms on system</td></tr>
 
 
 initialize the cdrom subsystem</td></tr>
 
 
-<tr><td><a href=#name>name</a></td><td> -
-query name of cdrom drive</td></tr>
-
-
-<tr><td><a href=#open>open</a></td><td> -
-open cd device</td></tr>
-
-
 <tr><td><a href=#quit>quit</a></td><td> -
 uninitialize the cdrom subsystem</td></tr>
 
 
 <hr>
 
-<a name=count><font size=+2><b>count
+<a name=CD><font size=+2><b>CD
 </b></font><br><font size=+1><tt>
-pygame.cdrom.count() -> int
+pygame.cdrom.CD(id) -> CD
+</tt></font><ul>
+Creates a new CD object for the given CDROM id. The given id
+must be less than the value from <a href=#get_count>pygame.cdrom.get_count()</a>.
+</ul><br>&nbsp;<br>
+
+<a name=get_count><font size=+2><b>get_count
+</b></font><br><font size=+1><tt>
+pygame.cdrom.get_count() -> int
 </tt></font><ul>
 Returns the number of CDROM drives available on
-the system
+the system.
 </ul><br>&nbsp;<br>
 
 <a name=get_init><font size=+2><b>get_init
 Initialize the CDROM module manually
 </ul><br>&nbsp;<br>
 
-<a name=name><font size=+2><b>name
-</b></font><br><font size=+1><tt>
-pygame.cdrom.name(id) -> string
-</tt></font><ul>
-Returns the name of the CDROM device, given by the
-system.
-</ul><br>&nbsp;<br>
-
-<a name=open><font size=+2><b>open
-</b></font><br><font size=+1><tt>
-pygame.cdrom.open(id) -> CD
-</tt></font><ul>
-Creates a new CD object for the given CDROM id.
-</ul><br>&nbsp;<br>
-
 <a name=quit><font size=+2><b>quit
 </b></font><br><font size=+1><tt>
 pygame.cdrom.quit() -> None

docs/ref/pygame_display.html

 <hr>
 
 <table>
+<tr><td><a href=#Info>Info</a></td><td> -
+get display capabilities and settings</td></tr>
+
+
 <tr><td><a href=#flip>flip</a></td><td> -
 update the display</td></tr>
 
 get the current sdl video driver</td></tr>
 
 
-<tr><td><a href=#get_info>get_info</a></td><td> -
-get display capabilities and settings</td></tr>
-
-
 <tr><td><a href=#get_init>get_init</a></td><td> -
 get status of display module initialization</td></tr>
 
 
 <hr>
 
+<a name=Info><font size=+2><b>Info
+</b></font><br><font size=+1><tt>
+pygame.display.Info() -> VidInfo
+</tt></font><ul>
+Gets a vidinfo object that contains information about the
+capabilities and current state of the video driver. This can be
+called before the display mode is set, to determine the current
+video mode of a display.
+You can print the VidInfo object to see all its members and values.
+</ul><br>&nbsp;<br>
+
 <a name=flip><font size=+2><b>flip
 </b></font><br><font size=+1><tt>
 pygame.display.flip() -> None
 all the supported video drivers.
 </ul><br>&nbsp;<br>
 
-<a name=get_info><font size=+2><b>get_info
-</b></font><br><font size=+1><tt>
-pygame.display.get_info() -> VidInfo
-</tt></font><ul>
-Gets a vidinfo object that contains information about the
-capabilities and current state of the video driver. This can be
-called before the display mode is set, to determine the current
-video mode of a display.
-You can print the VidInfo object to see all its members and values.
-</ul><br>&nbsp;<br>
-
 <a name=get_init><font size=+2><b>get_init
 </b></font><br><font size=+1><tt>
 pygame.display.get_init() -> bool

docs/ref/pygame_event.html

 <hr>
 
 <table>
+<tr><td><a href=#Event>Event</a></td><td> -
+create new event object</td></tr>
+
+
 <tr><td><a href=#event_name>event_name</a></td><td> -
 name for event type</td></tr>
 
 get all of an event type from the queue</td></tr>
 
 
-<tr><td><a href=#new_event>new_event</a></td><td> -
-create new event object</td></tr>
-
-
 <tr><td><a href=#peek>peek</a></td><td> -
 query if any of event types are waiting</td></tr>
 
 
 <hr>
 
+<a name=Event><font size=+2><b>Event
+</b></font><br><font size=+1><tt>
+pygame.event.Event(type, dict) -> Event
+</tt></font><ul>
+Creates a new event object. The type should be one
+of SDL's event numbers, or above USER_EVENT. The
+given dictionary contains a list of readonly
+attributes that will be members of the event
+object.
+</ul><br>&nbsp;<br>
+
 <a name=event_name><font size=+2><b>event_name
 </b></font><br><font size=+1><tt>
 pygame.event.event_name(event type) -> string
 would call, 'pygame.event.get([KEYDOWN,KEYUP])'.
 </ul><br>&nbsp;<br>
 
-<a name=new_event><font size=+2><b>new_event
-</b></font><br><font size=+1><tt>
-pygame.event.new_event(type, dict) -> Event
-</tt></font><ul>
-Creates a new event object. The type should be one
-of SDL's event numbers, or above USER_EVENT. The
-given dictionary contains a list of readonly
-attributes that will be members of the event
-object.
-</ul><br>&nbsp;<br>
-
 <a name=peek><font size=+2><b>peek
 </b></font><br><font size=+1><tt>
 pygame.event.peek([type]) -> bool

docs/ref/pygame_font.html

 <hr>
 
 <table>
+<tr><td><a href=#Font>Font</a></td><td> -
+create a new font object</td></tr>
+
+
 <tr><td><a href=#get_init>get_init</a></td><td> -
 get status of font module initialization</td></tr>
 
 initialize the display module</td></tr>
 
 
-<tr><td><a href=#new_font>new_font</a></td><td> -
-create a new font object</td></tr>
-
-
 <tr><td><a href=#quit>quit</a></td><td> -
 uninitialize the font module</td></tr>
 
 
 <hr>
 
+<a name=Font><font size=+2><b>Font
+</b></font><br><font size=+1><tt>
+pygame.font.Font(file, size) -> Font
+</tt></font><ul>
+This will create a new font object. The given file must be a
+filename to a TTF file. The font loader does not work with python
+file-like objects. The size represents the height of the font in
+pixels. The file argument can be 'None', which will use a plain
+default font.
+</ul><br>&nbsp;<br>
+
 <a name=get_init><font size=+2><b>get_init
 </b></font><br><font size=+1><tt>
 pygame.font.get_init() -> bool
 font is currently initialized.
 </ul><br>&nbsp;<br>
 
-<a name=new_font><font size=+2><b>new_font
-</b></font><br><font size=+1><tt>
-pygame.font.new_font(file, size) -> Font
-</tt></font><ul>
-This will create a new font object. The given file must be a
-filename to a TTF file. The font loader does not work with python
-file-like objects. The size represents the height of the font in
-pixels. The file argument can be 'None', which will use a plain
-default font.
-</ul><br>&nbsp;<br>
-
 <a name=quit><font size=+2><b>quit
 </b></font><br><font size=+1><tt>
 pygame.font.quit() -> none

docs/ref/pygame_image.html

 </td></tr></table>
 <br>
 <h2 align=center>pygame.image</h2>
-Contains routines to load and (someday) save surfaces. This
+Contains routines to load Surfaces from image files. This
 module must be manually imported, since it requires the use of
 the SDL_image library.
 

docs/ref/pygame_mixer.html

 play the sound. Each Sound object can be played multiple times
 simultaneously. If you desire more specific control over the
 Sound objects, you can access the Channel objects with functions
-like pygame.mixer.get_channel().
+like pygame.mixer.Channel().
 <br>&nbsp;<br>
 The mixer defaults to supporting 8 simultaneous soundfiles.
 You can change the number of available sound channels at any
 <hr>
 
 <table>
+<tr><td><a href=#Channel>Channel</a></td><td> -
+get channel object</td></tr>
+
+
+<tr><td><a href=#Sound>Sound</a></td><td> -
+load a new soundfile</td></tr>
+
+
 <tr><td><a href=#fadeout>fadeout</a></td><td> -
 fadeout all channels</td></tr>
 
 query busy channels</td></tr>
 
 
-<tr><td><a href=#get_channel>get_channel</a></td><td> -
-get channel object</td></tr>
-
-
 <tr><td><a href=#get_init>get_init</a></td><td> -
 query initialization for the mixer</td></tr>
 
 initialize mixer module</td></tr>
 
 
-<tr><td><a href=#load>load</a></td><td> -
-load a new soundfile</td></tr>
-
-
 <tr><td><a href=#pause>pause</a></td><td> -
 pause all channels</td></tr>
 
 
 <hr>
 
+<a name=Channel><font size=+2><b>Channel
+</b></font><br><font size=+1><tt>
+pygame.mixer.Channel(int) -> Channel
+</tt></font><ul>
+Get a channel object for the given channel. This number must be
+less that the current number of channels.
+</ul><br>&nbsp;<br>
+
+<a name=Sound><font size=+2><b>Sound
+</b></font><br><font size=+1><tt>
+pygame.mixer.Sound(file) -> Sound
+</tt></font><ul>
+Loads a new sound object from a WAV file. File can be a filename
+or a file-like object. The sound will be converted to match the
+current mode of the mixer.
+</ul><br>&nbsp;<br>
+
 <a name=fadeout><font size=+2><b>fadeout
 </b></font><br><font size=+1><tt>
 pygame.mixer.fadeout(millisec) -> None
 playing sound.
 </ul><br>&nbsp;<br>
 
-<a name=get_channel><font size=+2><b>get_channel
-</b></font><br><font size=+1><tt>
-pygame.mixer.get_channel(int) -> Channel
-</tt></font><ul>
-Get a channel object for the given channel. This number must be
-less that the current number of channels.
-</ul><br>&nbsp;<br>
-
 <a name=get_init><font size=+2><b>get_init
 </b></font><br><font size=+1><tt>
 pygame.mixer.get_init() -> bool
 this <a href=pygame.html#init>init()</a>.
 </ul><br>&nbsp;<br>
 
-<a name=load><font size=+2><b>load
-</b></font><br><font size=+1><tt>
-pygame.mixer.load(file) -> Sound
-</tt></font><ul>
-Loads a new sound object from a WAV file. File can be a filename
-or a file-like object. The sound will be converted to match the
-current mode of the mixer.
-</ul><br>&nbsp;<br>
-
 <a name=pause><font size=+2><b>pause
 </b></font><br><font size=+1><tt>
 pygame.mixer.pause() -> None

docs/ref/pygame_mouse.html

 visible state of the mouse cursor.
 <br>&nbsp;<br>
 Note that when the cursor is hidden and the application has
-grabbed the input. pyGame will force the mouse to stay in the
+grabbed the input. pygame will force the mouse to stay in the
 center of the screen. Since the mouse is hidden it won't matter
 that it's not moving, but it will keep the mouse from the edges
 of the screen so the relative mouse position will always be true.

examples/aliens.py

 ALIEN_RELOAD   = 12
 EXPLODE_TIME   = 40
 MAX_EXPLOSIONS = 4
-SCREENRECT     = new_rect(0, 0, 640, 480)
+SCREENRECT     = Rect(0, 0, 640, 480)
 ANIMCYCLE      = 18
 PLODECYCLE     = 7
 BULLET_OFFSET  = 11
     if not pygame.mixer: return dummysound()
     file = os.path.join('data', file)
     try:
-        sound = pygame.mixer.load(file)
+        sound = pygame.mixer.Sound(file)
         return sound
     except pygame.error:
         print 'Warning, unable to load,', file
     Snd.shot = load_sound('car_door.wav')
 
     # Create the background
-    background = new_surface(SCREENRECT.size)
+    background = pygame.Surface(SCREENRECT.size)
     for x in range(0, SCREENRECT.width, Img.background.get_width()):
         background.blit(Img.background, (x, 0))
     screen.blit(background, (0,0))
 
     #attempt to show game over (if font installed)
     if font:
-        f = font.new_font(None, 100) #None means default font
+        f = font.Font(None, 100) #None means default font
         f.set_italic(1)
         text = f.render('Game Over', 1, (200, 200, 200))
-        textrect = new_rect((0, 0), text.get_size())
+        textrect = Rect((0, 0), text.get_size())
         textrect.center = SCREENRECT.center
         screen.blit(text, textrect.topleft)
         pygame.display.flip()

examples/fonty.py

     screen.fill(wincolor)
 
     #load font, prepare values
-    font = pygame.font.new_font(None, 80)
+    font = pygame.font.Font(None, 80)
     text = 'Fonty'
     size = font.size(text)
 

examples/oldalien.py

 ALIEN_SPEED    = 6
 ALIEN_ODDS     = 45
 EXPLODE_TIME   = 6
-SCREENRECT     = new_rect(0, 0, 640, 480)
+SCREENRECT     = Rect(0, 0, 640, 480)
 
 
 #some globals for friendly access
     Img.explosion = load_image('explosion1.gif', 1)
 
     # Create the background
-    background = new_surface(SCREENRECT.size)
+    background = pygame.Surface(SCREENRECT.size)
     for x in range(0, SCREENRECT.width, Img.background.get_width()):
         background.blit(Img.background, (x, 0))
     screen.blit(background, (0,0))

examples/sound.py

 
 #load the sound    
 file = os.path.join('data', 'secosmic_lo.wav')
-sound = mixer.load(file)
+sound = mixer.Sound(file)
 
 
 #start playing

examples/stars.py

 		move_stars(stars)
 		draw_stars(screen, stars, white)
 		pygame.display.update()
-
 		for e in pygame.event.get():
 			if e.type == QUIT or (e.type == KEYUP and e.key == K_ESCAPE):
 				done = 1
 				WINCENTER[:] = list(e.pos)
 
 
+
 # if python says run, then we should run
 if __name__ == '__main__':
 	main()
 ##    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 ##
 ##    Pete Shinners
-##    pete@shinnerso.org
+##    pete@shinners.org
 
 # main pygame source
 # lets get things coordinated
 ##    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 ##
 ##    Pete Shinners
-##    pete@shinnerso.org
+##    pete@shinners.org
 
 """Set of cursor resources available for use. These cursors come
 in a sequence of values that are needed as the arguments for
 ##    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 ##
 ##    Pete Shinners
-##    pete@shinnerso.org
+##    pete@shinners.org
 
 
 
 the local namespace for your module"""
 
 from constants import *
-from rect import new_rect
-from surface import new_surface
-from event import new_event
+from rect import Rect
 #define PYGAMEAPI_CDROM_INTERNAL
 #include "pygame.h"
 
+#define CDROM_MAXDRIVES 32
+static SDL_CD* cdrom_drivedata[CDROM_MAXDRIVES] = {NULL};
 
 
 
 staticforward PyTypeObject PyCD_Type;
-static PyObject* PyCD_New(SDL_CD* cdrom);
+static PyObject* PyCD_New(int id);
 #define PyCD_Check(x) ((x)->ob_type == &PyCD_Type)
 
 
 
 static void cdrom_autoquit()
 {
+	int loop;
+
+	for(loop = 0; loop < CDROM_MAXDRIVES; ++loop)
+	{
+		if(cdrom_drivedata[loop])
+		{
+			SDL_CDClose(cdrom_drivedata[loop]);
+			cdrom_drivedata[loop] = NULL;
+		}
+	}
+
 	if(SDL_WasInit(SDL_INIT_CDROM))
 		SDL_QuitSubSystem(SDL_INIT_CDROM);
 }
 
 static void cd_dealloc(PyObject* self)
 {
-	PyCDObject* cd_ref = (PyCDObject*)self;
-
-	if(SDL_WasInit(SDL_INIT_CDROM))
-		SDL_CDClose(cd_ref->cd);
 	PyMem_DEL(self);	
 }
 
 
 
-    /*DOC*/ static char doc_cdrom_open[] =
-    /*DOC*/    "pygame.cdrom.open(id) -> CD\n"
-    /*DOC*/    "open cd device\n"
+    /*DOC*/ static char doc_CD[] =
+    /*DOC*/    "pygame.cdrom.CD(id) -> CD\n"
+    /*DOC*/    "create new CD object\n"
     /*DOC*/    "\n"
-    /*DOC*/    "Creates a new CD object for the given CDROM id.\n"
+    /*DOC*/    "Creates a new CD object for the given CDROM id. The given id\n"
+    /*DOC*/    "must be less than the value from pygame.cdrom.get_count().\n"
     /*DOC*/ ;
 
-static PyObject* cdrom_open(PyObject* self, PyObject* args)
+static PyObject* CD(PyObject* self, PyObject* args)
 {
-	int id;
-	
+	int id;	
 	if(!PyArg_ParseTuple(args, "i", &id))
 		return NULL;
 
 	CDROM_INIT_CHECK();
 
-	return PyCD_New(SDL_CDOpen(id));
+	return PyCD_New(id);
 }
 
 
 
-    /*DOC*/ static char doc_cdrom_count[] =
-    /*DOC*/    "pygame.cdrom.count() -> int\n"
+    /*DOC*/ static char doc_get_count[] =
+    /*DOC*/    "pygame.cdrom.get_count() -> int\n"
     /*DOC*/    "query number of cdroms on system\n"
     /*DOC*/    "\n"
     /*DOC*/    "Returns the number of CDROM drives available on\n"
-    /*DOC*/    "the system\n"
+    /*DOC*/    "the system.\n"
     /*DOC*/ ;
 
-static PyObject* cdrom_count(PyObject* self, PyObject* args)
+static PyObject* get_count(PyObject* self, PyObject* args)
 {
 	if(!PyArg_ParseTuple(args, ""))
 		return NULL;
 
 
 
-    /*DOC*/ static char doc_cdrom_name[] =
-    /*DOC*/    "pygame.cdrom.name(id) -> string\n"
-    /*DOC*/    "query name of cdrom drive\n"
+
+    /*DOC*/ static char doc_cd_init[] =
+    /*DOC*/    "CD.init() -> None\n"
+    /*DOC*/    "initialize a cdrom device for use\n"
     /*DOC*/    "\n"
-    /*DOC*/    "Returns the name of the CDROM device, given by the\n"
-    /*DOC*/    "system.\n"
+    /*DOC*/    "In order to call most members in the CD object, the\n"
+    /*DOC*/    "CD must be initialized. You can initialzie the CD object\n"
+    /*DOC*/    "at anytime, and it is ok to initialize more than once.\n"
     /*DOC*/ ;
 
-static PyObject* cdrom_name(PyObject* self, PyObject* args)
+static PyObject* cd_init(PyObject* self, PyObject* args)
 {
-	int drive;
-	
-	if(!PyArg_ParseTuple(args, "i", &drive))
+	int cd_id = PyCD_AsID(self);
+
+	if(!PyArg_ParseTuple(args, ""))
 		return NULL;
 
 	CDROM_INIT_CHECK();
 
-	return PyString_FromString(SDL_CDName(drive));
+	if(!cdrom_drivedata[cd_id])
+	{
+		cdrom_drivedata[cd_id] = SDL_CDOpen(cd_id);
+		if(!cdrom_drivedata[cd_id])
+			return RAISE(PyExc_SDLError, SDL_GetError());
+	}
+	RETURN_NONE
 }
 
 
+    /*DOC*/ static char doc_cd_quit[] =
+    /*DOC*/    "CD.quit() -> None\n"
+    /*DOC*/    "uninitialize a cdrom device for use\n"
+    /*DOC*/    "\n"
+    /*DOC*/    "After you are completely finished with a cdrom device, you\n"
+    /*DOC*/    "can use this quit() function to free access to the drive.\n"
+    /*DOC*/    "This will be cleaned up automatically when the cdrom module is.\n"
+    /*DOC*/    "uninitialized. It is safe to call this function on an uninitialized CD.\n"
+    /*DOC*/ ;
 
-    /*DOC*/ static char doc_cd_play_tracks[] =
-    /*DOC*/    "CD.play_tracks(start_track, start_frame, ntracks, nframes) -> int\n"
+static PyObject* cd_quit(PyObject* self, PyObject* args)
+{
+	int cd_id = PyCD_AsID(self);
+
+	if(!PyArg_ParseTuple(args, ""))
+		return NULL;
+
+	CDROM_INIT_CHECK();
+
+	if(cdrom_drivedata[cd_id])
+	{
+		SDL_CDClose(cdrom_drivedata[cd_id]);
+		cdrom_drivedata[cd_id] = NULL;
+	}
+	RETURN_NONE
+}
+
+
+
+    /*DOC*/ static char doc_cd_get_init[] =
+    /*DOC*/    "CD.get_init() -> bool\n"
+    /*DOC*/    "check if cd is initialized\n"
+    /*DOC*/    "\n"
+    /*DOC*/    "Returns a true value if the CD is initialized.\n"
+    /*DOC*/ ;
+
+static PyObject* cd_get_init(PyObject* self, PyObject* args)
+{
+	int cd_id = PyCD_AsID(self);
+
+	if(!PyArg_ParseTuple(args, ""))
+		return NULL;
+
+	return PyInt_FromLong(cdrom_drivedata[cd_id] != NULL);
+}
+
+
+
+
+    /*DOC*/ static char doc_cd_play[] =
+    /*DOC*/    "CD.play(track) -> None\n"
     /*DOC*/    "play music from cdrom\n"
     /*DOC*/    "\n"
-    /*DOC*/    "Start playing from start_track, for ntracks and\n"
-    /*DOC*/    "nframes. If ntracks and nframes are 0, it will\n"
-    /*DOC*/    "play until the end of the cdrom\n"
-    /*DOC*/ ;
-
-static PyObject* cd_play_tracks(PyObject* self, PyObject* args)
-{
-	int start_track, start_frame, ntracks, nframes;
-	PyCDObject* cd_ref = (PyCDObject*)self;
-
-	if(!PyArg_ParseTuple(args, "iiii", &start_track, &start_frame, &ntracks,
-		&nframes	))
-		return NULL;
-		
-	SDL_CDStatus(cd_ref->cd);
-		
-	return PyInt_FromLong(
-		SDL_CDPlayTracks(cd_ref->cd, start_track, start_frame, ntracks, nframes));
-}
-
-
-
-    /*DOC*/ static char doc_cd_play[] =
-    /*DOC*/    "CD.play(start_frame, nframes) -> int\n"
-    /*DOC*/    "play music from cdrom\n"
-    /*DOC*/    "\n"
-    /*DOC*/    "Start playing from start_frame, for nframes. If\n"
-    /*DOC*/    "nframes is 0, it will play until the end of the\n"
-    /*DOC*/    "cdrom\n"
+    /*DOC*/    "Play an audio track on a cdrom disk.\n"
     /*DOC*/ ;
 
 static PyObject* cd_play(PyObject* self, PyObject* args)
 {
-	int start_frame, nframes;
-	PyCDObject* cd_ref = (PyCDObject*)self;
+	int cd_id = PyCD_AsID(self);
+	SDL_CD* cdrom = cdrom_drivedata[cd_id];
+	int result, track, offset, length;
 	
-	if(!PyArg_ParseTuple(args, "ii", &start_frame, &nframes))
+	if(!PyArg_ParseTuple(args, "i", &track))
 		return NULL;
 
-	SDL_CDStatus(cd_ref->cd);
+	CDROM_INIT_CHECK();
+	if(!cdrom)
+		return RAISE(PyExc_SDLError, "CD drive not initialized");
+	SDL_CDStatus(cdrom);
+	if(track < 0 || track >= cdrom->numtracks)
+		return RAISE(PyExc_IndexError, "Invalid track number");
+	if(cdrom->track[track].type != SDL_AUDIO_TRACK)
+		return RAISE(PyExc_SDLError, "CD track type is not audio");
 
-	return PyInt_FromLong(SDL_CDPlay(cd_ref->cd, start_frame, nframes));
+	offset = cdrom->track[track].offset;
+	length = cdrom->track[track].length;
+
+	result = SDL_CDPlay(cdrom, offset, length);
+	if(result == -1)
+		return RAISE(PyExc_SDLError, SDL_GetError());
+
+	RETURN_NONE
 }
 
 
 
     /*DOC*/ static char doc_cd_pause[] =
-    /*DOC*/    "CD.pause() -> int\n"
+    /*DOC*/    "CD.pause() -> None\n"
     /*DOC*/    "pause playing cdrom\n"
     /*DOC*/    "\n"
-    /*DOC*/    "Pauses the playing CD.\n"
+    /*DOC*/    "Pauses the playing CD. If the CD is not playing, this will\n"
+    /*DOC*/    "do nothing.\n"
     /*DOC*/ ;
 
 static PyObject* cd_pause(PyObject* self, PyObject* args)
 {
-	PyCDObject* cd_ref = (PyCDObject*)self;
+	int cd_id = PyCD_AsID(self);
+	SDL_CD* cdrom = cdrom_drivedata[cd_id];
+	int result;
 
 	if(!PyArg_ParseTuple(args, ""))
 		return NULL;
 
-	if(SDL_CDStatus(cd_ref->cd) != CD_PLAYING)
-		return PyInt_FromLong(-1);
+	CDROM_INIT_CHECK();
+	if(!cdrom)
+		return RAISE(PyExc_SDLError, "CD drive not initialized");
 
-	return PyInt_FromLong(SDL_CDPause(cd_ref->cd));
+	result = SDL_CDPause(cdrom);
+	if(result == -1)
+		return RAISE(PyExc_SDLError, SDL_GetError());
+
+	RETURN_NONE
 }
 
 
     /*DOC*/    "CD.resume() -> int\n"
     /*DOC*/    "resume paused cdrom\n"
     /*DOC*/    "\n"
-    /*DOC*/    "Resumes playback of a paused CD.\n"
+    /*DOC*/    "Resumes playback of a paused CD. If the CD has not been\n"
+    /*DOC*/    "pause, this will do nothing.\n"
     /*DOC*/ ;
 
 static PyObject* cd_resume(PyObject* self, PyObject* args)
 {
-	PyCDObject* cd_ref = (PyCDObject*)self;
+	int cd_id = PyCD_AsID(self);
+	SDL_CD* cdrom = cdrom_drivedata[cd_id];
+	int result;
 
 	if(!PyArg_ParseTuple(args, ""))
 		return NULL;
 
-	if(SDL_CDStatus(cd_ref->cd) != CD_PAUSED)
-		return PyInt_FromLong(-1);
+	CDROM_INIT_CHECK();
+	if(!cdrom)
+		return RAISE(PyExc_SDLError, "CD drive not initialized");
 
-	return PyInt_FromLong(SDL_CDResume(cd_ref->cd));
+	result = SDL_CDResume(cdrom);
+	if(result == -1)
+		return RAISE(PyExc_SDLError, SDL_GetError());
+
+	RETURN_NONE
 }
 
 
     /*DOC*/    "CD.stop() -> int\n"
     /*DOC*/    "stops playing cdrom\n"
     /*DOC*/    "\n"
-    /*DOC*/    "Stops the playing CD.\n"
+    /*DOC*/    "Stops the playing CD. If the CD is not playing, this will\n"
+    /*DOC*/    "do nothing.\n"
     /*DOC*/ ;
 
 static PyObject* cd_stop(PyObject* self, PyObject* args)
 {
-	PyCDObject* cd_ref = (PyCDObject*)self;
+	int cd_id = PyCD_AsID(self);
+	SDL_CD* cdrom = cdrom_drivedata[cd_id];
+	int result;
 
 	if(!PyArg_ParseTuple(args, ""))
 		return NULL;
 
-	if(SDL_CDStatus(cd_ref->cd) < CD_PLAYING)
-		return PyInt_FromLong(-1);
+	CDROM_INIT_CHECK();
+	if(!cdrom)
+		return RAISE(PyExc_SDLError, "CD drive not initialized");
 
-	return PyInt_FromLong(SDL_CDStop(cd_ref->cd));
+	result = SDL_CDStop(cdrom);
+	if(result == -1)
+		return RAISE(PyExc_SDLError, SDL_GetError());
+
+	RETURN_NONE
 }
 
 
 
     /*DOC*/ static char doc_cd_eject[] =
-    /*DOC*/    "CD.eject() -> int\n"
+    /*DOC*/    "CD.eject() -> None\n"
     /*DOC*/    "ejects cdrom drive\n"
     /*DOC*/    "\n"
-    /*DOC*/    "Ejects the media from the CDROM drive.\n"
+    /*DOC*/    "Ejects the media from the CDROM drive. If the drive is empty, this\n"
+    /*DOC*/    "will open the CDROM drive.\n"
     /*DOC*/ ;
 
 static PyObject* cd_eject(PyObject* self, PyObject* args)
 {
-	PyCDObject* cd_ref = (PyCDObject*)self;
+	int cd_id = PyCD_AsID(self);
+	SDL_CD* cdrom = cdrom_drivedata[cd_id];
+	int result;
 
 	if(!PyArg_ParseTuple(args, ""))
 		return NULL;
 
-	if(SDL_CDStatus(cd_ref->cd) <= 0 )
-		return PyInt_FromLong(-1);
+	CDROM_INIT_CHECK();
+	if(!cdrom)
+		return RAISE(PyExc_SDLError, "CD drive not initialized");
 
-	return PyInt_FromLong(SDL_CDEject(cd_ref->cd));
+	result = SDL_CDEject(cdrom);
+	if(result == -1)
+		return RAISE(PyExc_SDLError, SDL_GetError());
+
+	RETURN_NONE
 }
 
 
-
-    /*DOC*/ static char doc_cd_status[] =
-    /*DOC*/    "CD.get_status() -> int\n"
-    /*DOC*/    "query drive status\n"
+    /*DOC*/ static char doc_cd_get_empty[] =
+    /*DOC*/    "CD.get_empty() -> bool\n"
+    /*DOC*/    "checks for a cd in the drive\n"
     /*DOC*/    "\n"
-    /*DOC*/    "Get the status of the CDROM drive.\n"
+    /*DOC*/    "Returns a true value if the cd drive is empty.\n"
     /*DOC*/ ;
 
-static PyObject* cd_status(PyObject* self, PyObject* args)
+static PyObject* cd_get_empty(PyObject* self, PyObject* args)
 {
-	PyCDObject* cd_ref = (PyCDObject*)self;
+	int cd_id = PyCD_AsID(self);
+	SDL_CD* cdrom = cdrom_drivedata[cd_id];
+	int status;
 
 	if(!PyArg_ParseTuple(args, ""))
 		return NULL;
 
-	return PyInt_FromLong(SDL_CDStatus(cd_ref->cd));
+	CDROM_INIT_CHECK();
+	if(!cdrom)
+		return RAISE(PyExc_SDLError, "CD drive not initialized");
+
+	status = SDL_CDStatus(cdrom);
+	return PyInt_FromLong(status == CD_TRAYEMPTY);
 }
 
 
-
-    /*DOC*/ static char doc_cd_cur_track[] =
-    /*DOC*/    "CD.get_cur_track() -> int\n"
-    /*DOC*/    "query current track\n"
+    /*DOC*/ static char doc_cd_get_busy[] =
+    /*DOC*/    "CD.get_busy() -> bool\n"
+    /*DOC*/    "checks if the cd is currently playing\n"
     /*DOC*/    "\n"
-    /*DOC*/    "Get the current track of a playing CD.\n"
+    /*DOC*/    "Returns a true value if the cd drive is currently playing. If\n"
+    /*DOC*/    "the drive is paused, this will return false.\n"
     /*DOC*/ ;
 
-static PyObject* cd_cur_track(PyObject* self, PyObject* args)
+static PyObject* cd_get_busy(PyObject* self, PyObject* args)
 {
-	PyCDObject* cd_ref = (PyCDObject*)self;
-	SDL_CD* s_cd_ref = cd_ref->cd;
+	int cd_id = PyCD_AsID(self);
+	SDL_CD* cdrom = cdrom_drivedata[cd_id];
+	int status;
 
 	if(!PyArg_ParseTuple(args, ""))
 		return NULL;
 
-	if(SDL_CDStatus(s_cd_ref) <= 1)
-		return PyInt_FromLong(-1);
+	CDROM_INIT_CHECK();
+	if(!cdrom)
+		return RAISE(PyExc_SDLError, "CD drive not initialized");
 
-	return PyInt_FromLong(s_cd_ref->cur_track);
+	status = SDL_CDStatus(cdrom);
+	return PyInt_FromLong(status == CD_PLAYING);
 }
 
 
-
-    /*DOC*/ static char doc_cd_cur_frame[] =
-    /*DOC*/    "CD.get_cur_frame() -> int\n"
-    /*DOC*/    "query current frame\n"
+    /*DOC*/ static char doc_cd_get_paused[] =
+    /*DOC*/    "CD.get_paused() -> bool\n"
+    /*DOC*/    "checks if the cd is currently paused\n"
     /*DOC*/    "\n"
-    /*DOC*/    "Get the current frame of a playing CD.\n"
+    /*DOC*/    "Returns a true value if the cd drive is currently paused.\n"
     /*DOC*/ ;
 
-static PyObject* cd_cur_frame(PyObject* self, PyObject* args)
+static PyObject* cd_get_paused(PyObject* self, PyObject* args)
 {
-	PyCDObject* cd_ref = (PyCDObject*)self;
-	SDL_CD* s_cd_ref = cd_ref->cd;
+	int cd_id = PyCD_AsID(self);
+	SDL_CD* cdrom = cdrom_drivedata[cd_id];
+	int status;
 
 	if(!PyArg_ParseTuple(args, ""))
 		return NULL;
 
-	if(SDL_CDStatus(s_cd_ref) <= 1)
-		return PyInt_FromLong(-1);
+	CDROM_INIT_CHECK();
+	if(!cdrom)
+		return RAISE(PyExc_SDLError, "CD drive not initialized");
 
-	return PyInt_FromLong(s_cd_ref->cur_frame);
+	status = SDL_CDStatus(cdrom);
+	return PyInt_FromLong(status == CD_PAUSED);
 }
 
 
-
-    /*DOC*/ static char doc_cd_get_empty[] =
-    /*DOC*/    "CD.get_empty() -> bool\n"
-    /*DOC*/    "query status of drive\n"
+    /*DOC*/ static char doc_cd_get_current[] =
+    /*DOC*/    "CD.get_current() -> track, seconds\n"
+    /*DOC*/    "get current position of the cdrom\n"
     /*DOC*/    "\n"
-    /*DOC*/    "Returns true when there is no disk in the CD\n"
-    /*DOC*/    "drive.\n"
+    /*DOC*/    "Returns the current track on the cdrom and the number of\n"
+    /*DOC*/    "seconds into that track.\n"
     /*DOC*/ ;
 
-static PyObject* cd_get_empty(PyObject* self, PyObject* args)
+static PyObject* cd_get_current(PyObject* self, PyObject* args)
 {
-	PyCDObject* cd_ref = (PyCDObject*)self;
+	int cd_id = PyCD_AsID(self);
+	SDL_CD* cdrom = cdrom_drivedata[cd_id];
+	int track;
+	float seconds;
 
 	if(!PyArg_ParseTuple(args, ""))
 		return NULL;
 
-	return PyInt_FromLong(CD_INDRIVE(SDL_CDStatus(cd_ref->cd)));
+	CDROM_INIT_CHECK();
+	if(!cdrom)
+		return RAISE(PyExc_SDLError, "CD drive not initialized");
+
+	SDL_CDStatus(cdrom);
+	track = cdrom->cur_track;
+	seconds = cdrom->cur_frame / (float)CD_FPS;
+
+	return Py_BuildValue("(if)", track, seconds);
 }
 
 
+    /*DOC*/ static char doc_cd_get_tracks[] =
+    /*DOC*/    "CD.get_tracks() -> numtracks\n"
+    /*DOC*/    "get number of tracks on cd\n"
+    /*DOC*/    "\n"
+    /*DOC*/    "Returns the number of available tracks on the CD. Note that not\n"
+    /*DOC*/    "all of these tracks contain audio data. Use CD.get_audio() to check\n"
+    /*DOC*/    "the track type before playing.\n"
+    /*DOC*/ ;
 
+static PyObject* cd_get_tracks(PyObject* self, PyObject* args)
+{
+	int cd_id = PyCD_AsID(self);
+	SDL_CD* cdrom = cdrom_drivedata[cd_id];
 
+	if(!PyArg_ParseTuple(args, ""))
+		return NULL;
 
-static int cd_seq_len(PyObject* self)
-{
-	PyCDObject* cd_ref = (PyCDObject*)self;
+	CDROM_INIT_CHECK();
+	if(!cdrom)
+		return RAISE(PyExc_SDLError, "CD drive not initialized");
 
-	if(!SDL_WasInit(SDL_INIT_CDROM))
-	{
-		RAISE(PyExc_RuntimeError, "SDL has shut down.");
-		return -1;
-	}
-	
-	if(!CD_INDRIVE(SDL_CDStatus(cd_ref->cd)))
-	{
-		RAISE(PyExc_RuntimeError, "No CD present");
-		return -1;
-	}
-
-	return cd_ref->cd->numtracks;
+	return PyInt_FromLong(cdrom->numtracks);
 }
 
 
+    /*DOC*/ static char doc_cd_get_name[] =
+    /*DOC*/    "CD.get_name(id) -> string\n"
+    /*DOC*/    "query name of cdrom drive\n"
+    /*DOC*/    "\n"
+    /*DOC*/    "Returns the name of the CDROM device, given by the\n"
+    /*DOC*/    "system. This function can be called before the drive\n"
+    /*DOC*/    "is initialized.\n"
+    /*DOC*/ ;
 
-static PyObject* cd_seq_get(PyObject* self, int index)
+static PyObject* cd_get_name(PyObject* self, PyObject* args)
 {
-	PyCDObject* cd_ref = (PyCDObject*)self;
-	SDL_CD* s_cd_ref = cd_ref->cd;
-	SDL_CDtrack* s_track_ref;
+	int cd_id = PyCD_AsID(self);
+	
+	if(!PyArg_ParseTuple(args, ""))
+		return NULL;
 
-	if(!SDL_WasInit(SDL_INIT_CDROM))
-		return RAISE(PyExc_RuntimeError, "SDL has shut down.");
+	CDROM_INIT_CHECK();
 
-	if(!CD_INDRIVE(SDL_CDStatus(s_cd_ref)) || index >= s_cd_ref->numtracks
-		|| index < 0)
-	{
-		return PyInt_FromLong(-1);
-	}
-
-	s_track_ref = &s_cd_ref->track[index];
-																			 
-	return Py_BuildValue("(iii)", s_track_ref->type, s_track_ref->length,
-		s_track_ref->offset);	
+	return PyString_FromString(SDL_CDName(cd_id));
 }
 
 
+    /*DOC*/ static char doc_cd_get_track_audio[] =
+    /*DOC*/    "CD.get_track_audio(track) -> bool\n"
+    /*DOC*/    "check if a track has audio data\n"
+    /*DOC*/    "\n"
+    /*DOC*/    "Returns true if the cdrom track contains audio data.\n"
+    /*DOC*/ ;
 
-static PyObject* cd_seq_get_slice(PyObject* self, int start, int end)
+static PyObject* cd_get_track_audio(PyObject* self, PyObject* args)
 {
-	PyCDObject* cd_ref = (PyCDObject*)self;
-	SDL_CD* s_cd_ref = cd_ref->cd;
-	PyObject* track_tuple;
-	int count;
-	int i;
-
-	if(!SDL_WasInit(SDL_INIT_CDROM))
-		return RAISE(PyExc_RuntimeError, "SDL has shut down.");
+	int cd_id = PyCD_AsID(self);
+	SDL_CD* cdrom = cdrom_drivedata[cd_id];
+	int track;
 	
-	i = min(start,end);
-	end = max(start,end);
-	start = i;
-
-	if(start < 0)
-		return RAISE(PyExc_IndexError, "Index out of range.");
-	
-	if(CD_INDRIVE(SDL_CDStatus(s_cd_ref)) <= 0)
-		return RAISE(PyExc_RuntimeError, "CD unavailable");
-
-	/* If end is greater than the real number of tracks, trunctate it.
-	 * This is done because of how Python handles slicing
-	*/
-	end = min(end, s_cd_ref->numtracks);
-	count = end - start;
-
-	track_tuple = PyTuple_New(count);
-	if(!track_tuple)
+	if(!PyArg_ParseTuple(args, "i", &track))
 		return NULL;
 
-	for(i = 0;i < count;i++)
-	{
-		PyObject* elem_tuple;
-		SDL_CDtrack* s_track_ref = &s_cd_ref->track[i + start];
+	CDROM_INIT_CHECK();
+	if(!cdrom)
+		return RAISE(PyExc_SDLError, "CD drive not initialized");
+	SDL_CDStatus(cdrom);
+	if(track < 0 || track >= cdrom->numtracks)
+		return RAISE(PyExc_IndexError, "Invalid track number");
 
-		elem_tuple = Py_BuildValue("(iii)",
-			s_track_ref->type, s_track_ref->length, s_track_ref->offset);
-		if(!elem_tuple)
-		{
-			Py_DECREF(track_tuple);
-			return NULL;
-		}
+	return PyInt_FromLong(cdrom->track[track].type == SDL_AUDIO_TRACK);
+}
 
-		PyTuple_SET_ITEM(track_tuple, i, elem_tuple);
-	}
-	return track_tuple; 	
+
+    /*DOC*/ static char doc_cd_get_track_length[] =
+    /*DOC*/    "CD.get_track_length(track) -> seconds\n"
+    /*DOC*/    "check the length of an audio track\n"
+    /*DOC*/    "\n"
+    /*DOC*/    "Returns the number of seconds in an audio track. If the\n"
+    /*DOC*/    "track does not contain audio data, returns 0.0.\n"
+    /*DOC*/ ;
+
+static PyObject* cd_get_track_length(PyObject* self, PyObject* args)
+{
+	int cd_id = PyCD_AsID(self);
+	SDL_CD* cdrom = cdrom_drivedata[cd_id];
+	int track;
+	
+	if(!PyArg_ParseTuple(args, "i", &track))
+		return NULL;
+
+	CDROM_INIT_CHECK();
+	if(!cdrom)
+		return RAISE(PyExc_SDLError, "CD drive not initialized");
+	SDL_CDStatus(cdrom);
+	if(track < 0 || track >= cdrom->numtracks)
+		return RAISE(PyExc_IndexError, "Invalid track number");
+	if(cdrom->track[track].type != SDL_AUDIO_TRACK)
+		return PyFloat_FromDouble(0.0);
+
+	return PyFloat_FromDouble(cdrom->track[track].length / (double)CD_FPS);
+}
+
+    /*DOC*/ static char doc_cd_get_track_start[] =
+    /*DOC*/    "CD.get_track_start(track) -> seconds\n"
+    /*DOC*/    "check the start of an audio track\n"
+    /*DOC*/    "\n"
+    /*DOC*/    "Returns the number of seconds an audio track starts\n"
+    /*DOC*/    "on the cd.\n"
+    /*DOC*/ ;
+
+static PyObject* cd_get_track_start(PyObject* self, PyObject* args)
+{
+	int cd_id = PyCD_AsID(self);
+	SDL_CD* cdrom = cdrom_drivedata[cd_id];
+	int track;
+	
+	if(!PyArg_ParseTuple(args, "i", &track))
+		return NULL;
+
+	CDROM_INIT_CHECK();
+	if(!cdrom)
+		return RAISE(PyExc_SDLError, "CD drive not initialized");
+	SDL_CDStatus(cdrom);
+	if(track < 0 || track >= cdrom->numtracks)
+		return RAISE(PyExc_IndexError, "Invalid track number");
+
+	return PyFloat_FromDouble(cdrom->track[track].offset / (double)CD_FPS);
 }
 
 
 
 static PyMethodDef cd_builtins[] =
 {
-	{ "play_tracks", cd_play_tracks, 1, doc_cd_play_tracks },
+	{ "init", cd_init, 1, doc_cd_init },
+	{ "quit", cd_quit, 1, doc_cd_quit },
+	{ "get_init", cd_get_init, 1, doc_cd_get_init },
+
 	{ "play", cd_play, 1, doc_cd_play },
 	{ "pause", cd_pause, 1, doc_cd_pause },
 	{ "resume", cd_resume, 1, doc_cd_resume },
 	{ "stop", cd_stop, 1, doc_cd_stop },
 	{ "eject", cd_eject, 1, doc_cd_eject },
-	{ "get_status", cd_status, 1, doc_cd_status },
-	{ "get_track", cd_cur_track, 1, doc_cd_cur_track },
-	{ "get_frame", cd_cur_frame, 1, doc_cd_cur_frame },
+
 	{ "get_empty", cd_get_empty, 1, doc_cd_get_empty },
+	{ "get_busy", cd_get_busy, 1, doc_cd_get_busy },
+	{ "get_paused", cd_get_paused, 1, doc_cd_get_paused },
+	{ "get_current", cd_get_current, 1, doc_cd_get_current },
+	{ "get_tracks", cd_get_tracks, 1, doc_cd_get_tracks },
+	{ "get_name", cd_get_name, 1, doc_cd_get_name },
+
+	{ "get_track_audio", cd_get_track_audio, 1, doc_cd_get_track_audio },
+	{ "get_track_length", cd_get_track_length, 1, doc_cd_get_track_length },
+	{ "get_track_start", cd_get_track_start, 1, doc_cd_get_track_start },
+
 	{ NULL, NULL }
 };
 
 static PyObject* cd_getattr(PyObject* self, char* attrname)
 {
-	if(SDL_WasInit(SDL_INIT_CDROM))
-		return Py_FindMethod(cd_builtins, self, attrname);
-
-	return RAISE(PyExc_NameError, attrname);
+	return Py_FindMethod(cd_builtins, self, attrname);
 }
 
 
-
-static PySequenceMethods cd_as_sequence = 
-{
-	cd_seq_len,
-	0,
-	0,
-	cd_seq_get,
-	cd_seq_get_slice,
-	0,
-	0
-};
-
-
     /*DOC*/ static char doc_CD_MODULE[] =
-    /*DOC*/    "thin wrapper around the SDL CDROM api, likely to\n"
-    /*DOC*/    "change\n"
+    /*DOC*/    "The CD object represents a CDROM drive and allows you to\n"
+    /*DOC*/    "access the CD inside that drive. All functions (except get_name())\n"
+    /*DOC*/    "require the CD object to be initialized. This is done with the\n"
+    /*DOC*/    "CD.init() function.\n"
     /*DOC*/ ;
 
 
 	0,
 	0,
 	0,
-	&cd_as_sequence,
+	NULL,
 	0
 };
 
 
 
-static PyObject* PyCD_New(SDL_CD* cdrom)
+static PyObject* PyCD_New(int id)
 {
 	PyCDObject* cd;
 
-	if(!cdrom)
-		return RAISE(PyExc_SDLError, SDL_GetError());
+	if(id < 0 || id >= CDROM_MAXDRIVES || id >= SDL_CDNumDrives())
+		return RAISE(PyExc_SDLError, "Invalid cdrom device number");
 	
 	cd = PyObject_NEW(PyCDObject, &PyCD_Type);
 	if(!cd) return NULL;
 
-	cd->cd = cdrom;
+	cd->id = id;
 
 	return (PyObject*)cd;
 }
 	{ "init", cdrom_init, 1, doc_cdrom_init },
 	{ "quit", cdrom_quit, 1, doc_cdrom_quit },
 	{ "get_init", get_init, 1, doc_get_init },
-	{ "get_count", cdrom_count, 1, doc_cdrom_count },
-	{ "get_name", cdrom_name, 1, doc_cdrom_name },
-	{ "open", cdrom_open, 1, doc_cdrom_open },
+	{ "get_count", get_count, 1, doc_get_count },
+	{ "CD", CD, 1, doc_CD },
 	{ NULL, NULL }
 };
 
 
 
     /*DOC*/ static char doc_pygame_cdrom_MODULE[] =
-    /*DOC*/    "thin wrapper around the SDL CDROM api, likely to\n"
-    /*DOC*/    "change\n"
+    /*DOC*/    "The cdrom module provides a few functions to initialize\n"
+    /*DOC*/    "the CDROM subsystem and to manage the CD objects. The CD\n"
+    /*DOC*/    "objects are created with the pygame.cdrom.CD() function.\n"
+    /*DOC*/    "This function needs a cdrom device number to work on. All\n"
+    /*DOC*/    "cdrom drives on the system are enumerated for use as a CD\n"
+    /*DOC*/    "object. To access most of the CD functions, you'll need to\n"
+    /*DOC*/    "Init() the CD object. (note that the cdrom module will already\n"
+    /*DOC*/    "be initialized). When multiple CD objects are created for the\n"
+    /*DOC*/    "same CDROM device, the state and values for those CD objects\n"
+    /*DOC*/    "will be shared.\n"
+    /*DOC*/    "\n"
+    /*DOC*/    "You can call the CD.get_name() function withouth initializing\n"
+    /*DOC*/    "the CD object. This function returns the system name given to\n"
+    /*DOC*/    "that CDROM drive.\n"
     /*DOC*/ ;
 
 
 staticforward PyTypeObject PyVidInfo_Type;
 static PyObject* PyVidInfo_New(const SDL_VideoInfo* info);
 
-
+#if 0
 /*quick internal test to see if gamma is supported*/
 static int check_hasgamma()
 {
 */
 	return result;
 }
-
+#endif
 
 
 
 
 
 
-    /*DOC*/ static char doc_get_info[] =
-    /*DOC*/    "pygame.display.get_info() -> VidInfo\n"
+    /*DOC*/ static char doc_Info[] =
+    /*DOC*/    "pygame.display.Info() -> VidInfo\n"
     /*DOC*/    "get display capabilities and settings\n"
     /*DOC*/    "\n"
     /*DOC*/    "Gets a vidinfo object that contains information about the\n"
     /*DOC*/    "You can print the VidInfo object to see all its members and values.\n"
     /*DOC*/ ;
 
-static PyObject* get_info(PyObject* self, PyObject* arg)
+static PyObject* Info(PyObject* self, PyObject* arg)
 {
 	const SDL_VideoInfo* info;
 
 	{ "get_init", get_init, 1, doc_get_init },
 	{ "get_active", get_active, 1, doc_get_active },
 
-/*	{ "set_driver", set_driver, 1, doc_set_driver },
-*/	{ "get_driver", get_driver, 1, doc_get_driver },
-	{ "get_info", get_info, 1, doc_get_info },
+/*	{ "set_driver", set_driver, 1, doc_set_driver },*/
+	{ "get_driver", get_driver, 1, doc_get_driver },
+	{ "Info", Info, 1, doc_Info },
 	{ "get_surface", get_surface, 1, doc_get_surface },
 
 	{ "set_mode", set_mode, 1, doc_set_mode },
 /* event module functions */
 
 
-    /*DOC*/ static char doc_new_event[] =
-    /*DOC*/    "pygame.event.new_event(type, dict) -> Event\n"
+    /*DOC*/ static char doc_Event[] =
+    /*DOC*/    "pygame.event.Event(type, dict) -> Event\n"
     /*DOC*/    "create new event object\n"
     /*DOC*/    "\n"
     /*DOC*/    "Creates a new event object. The type should be one\n"
     /*DOC*/    "object.\n"
     /*DOC*/ ;
 
-static PyObject* new_event(PyObject* self, PyObject* arg)
+static PyObject* Event(PyObject* self, PyObject* arg)
 {
 	PyObject* dict;
 	int type;
 
 static PyMethodDef event_builtins[] =
 {
-	{ "new_event", new_event, 1, doc_new_event },
+	{ "Event", Event, 1, doc_Event },
 	{ "event_name", event_name, 1, doc_event_name },
 
 	{ "set_grab", set_grab, 1, doc_set_grab },
 
 /*font module methods*/
 
-    /*DOC*/ static char doc_font_font[] =
-    /*DOC*/    "pygame.font.new_font(file, size) -> Font\n"
+    /*DOC*/ static char doc_Font[] =
+    /*DOC*/    "pygame.font.Font(file, size) -> Font\n"
     /*DOC*/    "create a new font object\n"
     /*DOC*/    "\n"
     /*DOC*/    "This will create a new font object. The given file must be a\n"
     /*DOC*/    "default font.\n"
     /*DOC*/ ;
 
-static PyObject* font_font(PyObject* self, PyObject* args)
+static PyObject* Font(PyObject* self, PyObject* args)
 {
 	PyObject* fileobj;
 	char* filename;
 	{ "quit", font_quit, 1, doc_quit },
 	{ "get_init", get_init, 1, doc_get_init },
 
-	{ "new_font", font_font, 1, doc_font_font },
+	{ "Font", Font, 1, doc_Font },
 
 	{ NULL, NULL }
 };
 
 
     /*DOC*/ static char doc_pygame_image_MODULE[] =
-    /*DOC*/    "Contains routines to load and (someday) save surfaces. This\n"
+    /*DOC*/    "Contains routines to load Surfaces from image files. This\n"
     /*DOC*/    "module must be manually imported, since it requires the use of\n"
     /*DOC*/    "the SDL_image library.\n"
     /*DOC*/ ;
     /*DOC*/    "control.\n"
     /*DOC*/    "\n"
     /*DOC*/    "Sound objects can be retrieved from the pygame.mixer module with\n"
-    /*DOC*/    "functions like pygame.mixer.get_channel() and\n"
+    /*DOC*/    "functions like pygame.mixer.Channel() and\n"
     /*DOC*/    "pygame.mixer.find_channel(). Also, each time you call\n"
     /*DOC*/    "Sound.play() a Channel object will be returned, representing the\n"
     /*DOC*/    "channel that sound is playing on.\n"
 }
 
 
-    /*DOC*/ static char doc_get_channel[] =
-    /*DOC*/    "pygame.mixer.get_channel(int) -> Channel\n"
+    /*DOC*/ static char doc_Channel[] =
+    /*DOC*/    "pygame.mixer.Channel(int) -> Channel\n"
     /*DOC*/    "get channel object\n"
     /*DOC*/    "\n"
     /*DOC*/    "Get a channel object for the given channel. This number must be\n"
     /*DOC*/    "less that the current number of channels.\n"
     /*DOC*/ ;
 
-static PyObject* get_channel(PyObject* self, PyObject* args)
+static PyObject* Channel(PyObject* self, PyObject* args)
 {
 	int chan;
 	if(!PyArg_ParseTuple(args, "i", &chan))
 
 
 
-    /*DOC*/ static char doc_load[] =
-    /*DOC*/    "pygame.mixer.load(file) -> Sound\n"
+    /*DOC*/ static char doc_Sound[] =
+    /*DOC*/    "pygame.mixer.Sound(file) -> Sound\n"
     /*DOC*/    "load a new soundfile\n"
     /*DOC*/    "\n"
     /*DOC*/    "Loads a new sound object from a WAV file. File can be a filename\n"
     /*DOC*/    "current mode of the mixer.\n"
     /*DOC*/ ;
 
-static PyObject* load(PyObject* self, PyObject* arg)
+static PyObject* Sound(PyObject* self, PyObject* arg)
 {
 	PyObject* file;
 	char* name = NULL;
 	{ "set_reserved", set_reserved, 1, doc_set_reserved },
 
 	{ "get_busy", get_busy, 1, doc_get_busy },
-	{ "get_channel", get_channel, 1, doc_get_channel },
+	{ "Channel", Channel, 1, doc_Channel },
 	{ "find_channel", find_channel, 1, doc_find_channel },
 	{ "fadeout", fadeout, 1, doc_fadeout },
 	{ "stop", stop, 1, doc_stop },
 	{ "unpause", unpause, 1, doc_unpause },
 /*	{ "lookup_frequency", lookup_frequency, 1, doc_lookup_frequency },*/
 
-	{ "load", load, 1, doc_load },
+	{ "Sound", Sound, 1, doc_Sound },
 
 	{ NULL, NULL }
 };
     /*DOC*/    "play the sound. Each Sound object can be played multiple times\n"
     /*DOC*/    "simultaneously. If you desire more specific control over the\n"
     /*DOC*/    "Sound objects, you can access the Channel objects with functions\n"
-    /*DOC*/    "like pygame.mixer.get_channel().\n"
+    /*DOC*/    "like pygame.mixer.Channel().\n"
     /*DOC*/    "\n"
     /*DOC*/    "The mixer defaults to supporting 8 simultaneous soundfiles.\n"
     /*DOC*/    "You can change the number of available sound channels at any\n"
 #define PYGAMEAPI_CDROM_NUMSLOTS 2
 typedef struct {
 	PyObject_HEAD
-	SDL_CD* cd;
+	int id;
 } PyCDObject;
-#define PyCD_AsCD(x) (((PyCDObject*)x)->cd)
+#define PyCD_AsID(x) (((PyCDObject*)x)->id)
 #ifndef PYGAMEAPI_CDROM_INTERNAL
 #define PyCD_Check(x) ((x)->ob_type == (PyTypeObject*)PyGAME_C_API[PYGAMEAPI_CDROM_FIRSTSLOT + 0])
 #define PyCD_Type (*(PyTypeObject*)PyGAME_C_API[PYGAMEAPI_CDROM_FIRSTSLOT + 0])
-#define PyCD_New (*(PyObject*(*)(SDL_CD*))PyGAME_C_API[PYGAMEAPI_CDROM_FIRSTSLOT + 1])
+#define PyCD_New (*(PyObject*(*)(int))PyGAME_C_API[PYGAMEAPI_CDROM_FIRSTSLOT + 1])
 #define import_pygame_cd() { \
 	PyObject *module = PyImport_ImportModule("pygame.cdrom"); \
 	if (module != NULL) { \
 
 /*module globals*/
 
-    /*DOC*/ static char doc_new_rect[] =
-    /*DOC*/    "pygame.new_rect(rectstyle) -> Rect\n"
+    /*DOC*/ static char doc_Rect[] =
+    /*DOC*/    "pygame.Rect(rectstyle) -> Rect\n"
     /*DOC*/    "create a new rectangle\n"
     /*DOC*/    "\n"
     /*DOC*/    "Creates a new rectangle object. The given\n"
     /*DOC*/    "corner, and the width and height.\n"
     /*DOC*/ ;
 
-static PyObject* new_rect(PyObject* self, PyObject* args)
+static PyObject* Rect(PyObject* self, PyObject* args)
 {
 	GAME_Rect *argrect, temp;
 	if(!(argrect = GameRect_FromObject(args, &temp)))
 
 static PyMethodDef rect__builtins__[] =
 {
-	{ "new_rect", new_rect, 1, doc_new_rect }, 
+	{ "Rect", Rect, 1, doc_Rect }, 
 	{NULL, NULL}
 };
 
 
 /* surface module functions */
 
-    /*DOC*/ static char doc_new_surface[] =
-    /*DOC*/    "pygame.new_surface(size, [flags, [depth|Surface, [masks]]]) ->\n"
+    /*DOC*/ static char doc_Surface[] =
+    /*DOC*/    "pygame.Surface(size, [flags, [depth|Surface, [masks]]]) ->\n"
     /*DOC*/    "Surface\n"
     /*DOC*/    "create a new Surface\n"
     /*DOC*/    "\n"
     /*DOC*/    "for the flag.\n"
     /*DOC*/ ;
 
-static PyObject* new_surface(PyObject* self, PyObject* arg)
+static PyObject* Surface(PyObject* self, PyObject* arg)
 {
 	Uint32 flags = 0;
 	int width, height;
 
 static PyMethodDef surface_builtins[] =
 {
-	{ "new_surface", new_surface, 1, doc_new_surface },
+	{ "Surface", Surface, 1, doc_Surface },
 	{ NULL, NULL }
 };
 
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.