This document lists major (or at least interesting) changes and bug fixes for BeOS Release 3.0/3.1.
Items that are new in 3.1 are tagged
with "New in 3.1".
For information on
updating your app so it runs in the Release 3 world, see
Development Layout.
-
HFS+ (Mac OS Extended format) disks aren't supported (you can't mount them). No harm will come to any HFS+ disks connected to your computer.
-
The HFS file system no longer lets you create files with colons in their names from Terminal.
-
When a Maxtor IDE drive, model 85250D6, is connected as a slave with
either an IBM Model DCAA 34330 or an IBM Model DAQA 33240 as the master,
the Maxtor drive may not be recognized. If you run into this bug,
launch DriveSetup and rescan the IDE bus; this usually works.
-
The third button on a serial mouse doesn't work. This has been true for a long time.
-
New in 3.1 DOS FAT files systems are supported in read-only mode.
-
New in 3.1 Extended partitions are supported.
-
New in 3.1 Disks bigger than 8Gig are supported.
-
UMAX C500 PowerPC systems are supported.
-
New in 3.1 Support for PowerPC 603ev processor systems (such as PowerComputing's PowerBase) has been improved (no more random crashes).
-
New in 3.1 Virtual memory now works correctly on PowerPC systems with 512Mb of RAM.
Tracker windows now let you choose which application you want to use when opening a selected file. The "File" menu includes an "Open With" item, as does the context sensitive menu that you get when you mouse-and-hold on a file. The list of candidate applications is based on the file's type: All applications that recognize the type are listed in the "Open With" choices.
The Open With... panel sorts the candidate apps according to their "relation" to the file you're trying to open. There are four relationships:
- The app is the declared "Preferred App" for that file.
- The app can handle the file's full type (e.g. "text/plain")
- The app can handle the file's supertype ("text/...")
- The app can handle any file type (".../...")
You can see this phenomenon by opening an Open With... panel, or by popping open the context menu for a file.
The Tracker now remembers the correspondence between windows and workspaces such that when you reboot your machine, your restored windows are placed in the correct workspaces.
When you open a folder (window) that's already open in some other workspace, the folder window is brought to the workspace that you're in (and removed from its present workspace). Previously, opening an open folder would switch you to the workspace of the open window.
The "More Options" checkbox in the Find panel lets you name your query (the name appears as the title of the query result window), and lets you optionally search through the Trash. Also, you can start a query "by Name", or "by Attribute" and then switch to "by Formula" without losing information.
Busy Tracker windows now display an animated
"sideways barber pole" in the lower left corner. If the barber pole is spinning, the Tracker window is
thinking.
The Tracker's notion of the current selection has improved.
For example, if you send the current selection to the Trash, the next entry in the window is selected.
This is particularly convenient when you're reading (and trashing) your mail.
Starting in PR2, you could dismiss a parent folder window
by option-clicking a subfolder. Now, the option dismissal trick has been extended to
keyboard navigation
(option+command+down-arrow, for example), and can be used to dismiss a child
(option+command+up-arrow).
You can even launch an app and dismiss a Tracker window at the same time
(option+double-click the app).
You can now drag a text selection from a document and drop
it on the desktop; a file is automatically created to contain the "clipped" text. If you then drag the
clipped text file and drop it on an open document, the text is automatically pasted at the insertion point.
Dragging a file icon over an app icon (as if to drop) asks the
app if it can handle the file's type. If it can't, the app isn't highlighted and so won't be launched if
the icon is dropped. To override this behavior, control+drag the icon.
Tracker now supports a scripting suite that lets applications have
tighter integration with Tracker windows. See the documentation in the "Playing with Tracker" chapter of
the Be Book.
Tracker is smarter about messages that include commands to copy files; the files are copied
into the proper destination, rather than in place in the source directory.
- The clock is now right-justified.
- Replicants in the Deskbar are now centered vertically.
- MIME strings are now case-insensitive.
- FileTypes allows icon editing. Double-click in the icon well
in the upper right corner of the FileTypes window to get to the icon editor.
- FileTypes sorts its file type list alphabetically.
- FileTypes now only shows the "desirable" types in its top list view.
In particular, it filters out file types that were generated to simulate Mac types, and
ignores application signatures. If you want to see all file types in the database,
toggle the Settings/Show internal types menu item.
- Attachments with attributes are handled properly when sending between byte-reversed machines.
- After queueing a message when the mail daemon isn't running, the BeMail message window closes
as it's supposed to.
- "Pending" mail that's been moved to the Trash is no longer
picked up and sent by the mail daemon.
- The MIME app signature of the E-mail preference app was changed to "x-vnd.Be-mprf"
- The Installer lets you run DriveSetup to perform partitioning.
- You can install onto disks with names that have unusual characters.
- Just before and just after installation, InstallerInitScript and
InstallerFinishScript are run (both are in /boot/beos/system/boot on the CD).
You can't alter their contents; but if you're curious, you can mount the CD and look at the
scripts before installing.
- Any files that the Installer intends to clobber (other than system files)
are moved into a directory named /Your_Old_Be_Files_Are_Here. New in 3.1 If
the directory already exists (from a previous install), the Installer appends a timestamp to the
new directory name.
- New in 3.1 During a clean install, non-Be/Metrowerks apps that live in /boot/apps or /boot/preferences are
moved into the ...Old_Be_Files... directory. The apps that were provided by Be and Metrowerks
are clobbered without being backed up.
- New in 3.1 During a clean install, configuration files from /boot/home/config/... are moved into ...Old_Be_Files...
- WARNING: Files that are moved into ...Old_Be_Files... are
placed directly in the directory. The directory paths to the files aren't retained.
- Frames are supported.
- NetPositive no longer tries to load folders.
- NetPositive remembers the scrolling location when you move back or forward.
- New in 3.1 Bookmark files can be double-clicked to open.
- New in 3.1 Better line-wrapping and handling of text submissions.
- New in 3.1 MIME type identification of zip, gzip, and tar files is now accurate.
- New in 3.1 No more crashing when downloading a text file, or opening a folder that has a
special character in its name.
- simple-midi has been renamed SimpleMidi.
- PoorMan has a much more appealing UI, including a menu bar that
contains all configuration and control options, and a resizable window. Also,
you can now log errors into a file and/or a scrollable view.
- Case-sensitive searches in StyledEdit now work.
- New DiskProbe application lets you view and edit blocks on disk devices and files.
- New ShowImage application uses the Translation Kit for displaying pictures.
- New in 3.1 New Serial preference is introduced. Its primary feature is that it lets you add ISA Plug and Play cards. You'll find it in the
/optional/experimental/Serial Pref directory on the BeOS 3.1 sCD.
- New in 3.1 NEC IDE CD-ROM drives (such as model CDR-1900A) are supported.
- Other drives that were previously unsupported may now work.
- New in 3.1 The floppy driver now supports arbitrary byte positions and counts.
- New in 3.1 The Matrox driver (with 4+Mb) supports 800x600 and 1024x768 in 8-bit depth.
- New in 3.1 A new "safe boot" SuperVGA graphics driver for Intel is a least
common denominator driver that runs a 640x480 grayscale screen. To get to a menu that let's you
load this driver,
hold down the spacebar during boot. You should only need this driver if you're using an
unsupported graphics card.
- New in 3.1 The 2Mb, unsocketed Diamond Stealth 3D driver has been fixed.
- New in 3.1 The Imagine 128 and
Revolution 3D cards, both from Number 9, are supported by an experimental driver. Look in /optional/experimental/drivers/app_server.
- The MIDI ports /dev/midi1 and /dev/midi2 have been moved to
/dev/midi/midi1 and /dev/midi/midi2.
- New in 3.1 ISA Plug and Play modems are marginally supported. Use the new Serial preference app to add a PnP modem.
- New in 3.1 Dakota motherboards are supported.
- Other multi-processor boards may also be supported coincidentally.
- New in 3.1 A bug that caused the system to see only the first 16Mb of RAM has been fixed.
- New in 3.1 An experimental dhcp driver is provided in the /optional/experimental/dhcp directory.
- New in 3.1 An experimental ec9xx driver for 3Com 3c905B cards is provided in the /optional/experimental/ec9xx directory.
- New in 3.1 write() to a parallel port returns the correct number of bytes written.
- New in 3.1 The parallel port can be opened more than once (per boot).
- New in 3.1 The PostScript driver, inadvertently excluded from 3.0, reappears in 3.1.
- New in 3.1 An experimental Epson printer driver is provided in /optional/experimental/drivers/print_server
- The PPC BeOS supports up to Version 3 of the MESH SCSI controller.
- An experimental version of the Bus Logic BT948 SCSI controller is available in /optional/experimental/drivers/kernel/cam.
- New in 3.1 The SoundBlaster AWE64 output has been boosted.
- New in 3.1 The OPTi931 (OPTi, Inc.) and YMF715 (Yamaha) sound chips are supported.
The app server offers "focus follows mouse." Use the Mouse preference to turn it on.
In the graphics science world, there is an endian situation
you should be aware of when handling offscreen bitmaps. With this release, the official
offscreen 32-bit bitmap byte sex is little endian. To wit:
Little endian bitmaps have always been the norm, so this isn't news. However,
the way you might be accessing your bitmap data may be nonportable
Do you use a uint32 pointer to look at your buffer? If your code looks
something like the following, it's going to break in the little-endian world:
int32 i;
uint32 color;
uint32 *buffer;
color = 'BGRA';
buffer = (uint32*)my_bitmap->Bits();
for (i=0; i<10000; i++)
*buffer++ = color;
|
To get it to work on any platform, rewrite your code as shown below:
union {
uint8 bytes[4];
uint32 word;
} color;
color.bytes[0] = 'B';
color.bytes[1] = 'G';
color.bytes[2] = 'R';
color.bytes[3] = 'A';
buffer = (uint32*)my_bitmap->Bits();
for (i=0; i<10000; i++)
*buffer++ = color.word;
|
There are new color_space values in
interface/GraphicsDefs.h, and the old names are in a more concise format. An excerpt from
the list:
B_RGB32 /* was B_RGB_32_BIT */
B_RGB32_BIG /* was B_BIG_RGB_32_BIT */
B_GRAY8 /* was B_GRAYSCALE_8_BIT */
B_YUV422 /* new */
|
The old constants are still supported, but their use is discouraged.
- The app server now supports 15- and 16-bit color.
- 1152x900 is now a supported screen resolution.
- Support for more than 4Mb of VRAM is now provided.
- The color map has been revised to improve inverted colors.
- The default value of the alpha component of a color is now 255.
- Cursor tracking when passing between views has been improved.
- Attempts to draw gigantic round rectangles, ellipses, and arcs are ignored.
- New in 3.1 Double-click the app icon of a running app: The app's windows are brought to the front.
The system uses a new heuristic for selecting an
appropriate size for the swap file. The following table demonstrates how this works:
RAM Size (Mb) |
Swap File Size |
16 - 31 |
3.0 x RAM size |
32 - 63 |
2.5 x RAM size |
64 - 127 |
2.0 x RAM size |
128 - 511 |
1.5 x RAM size |
512 - 4095 |
1.25 x RAM size |
4096+ |
RAM size |
The swap file's size is also limited by how much free disk space is available on your boot
volume--for example, if you have 64Mb of memory, the swap file size is computed to be 128Mb.
If you only have 100Mb of free space on your boot volume, the swap file will be set to 84Mb instead. BeOS won't use your last 16Mb of free space for the swap file.
In other words, the maximum size of the swap file is the minimum size computed
using the table above plus the amount of free disk space, minus 16Mb.
It's possible for the system to decide not to create a swap file at all.
This can happen if you have more memory than free disk space.
The VirtualMemory preferences app presents two modes for selecting the size of the swap file.
- Clicking the "Defaults" button
puts the system into automatic mode, where the computation
is done using the table and formula above.
- You can override the automatic computation by adjust the swap file size slider.
If the VirtualMemory app is in auto mode and you install more memory in your
computer, the swap file will automatically be resized using the heuristic described here.
If the system decided not to create a swap file because your RAM exceeds your free
disk space, VirtualMemory displays an alert that says:
"The swap file could not be created. For the system to create a minimum swap file size of
128Mb you will need 144Mb of free disk space."
- Flattened BMessages are now endian-savvy for all data types defined
in be/support/TypeConstants.h except for the following:
B_RAW_TYPE
B_OBJECT_TYPE
B_ANY_TYPE
|
BMessage doesn't know how to swap these three types, nor any custom types that you define.
But for everything else, simply flatten a BMessage, send it to a byte-reversed machine,
unflatten, and you're back in business.
- There's a new version of BMessage::GetInfo() that provides fixed size info:
status_t GetInfo(const char *name,
type_code *type,
bool *is_fixed_size) const;
|
The is_fixed_size value was set in the AddData() call that
added the data to the message.
- The BPropertyInfo class has been added to the Kit. This class makes it easier
to create and maintain lists of the commands supported by a property, and can be used by an
application to describe its scripting interface to people that call GetSupportedSuites()
as well as to aid in responding to a ResolveSpecifier() request.
- New in 3.1
BPropertyInfo::FindMatch() returns legitimate data in its data argument.
- New in 3.1 New BPropertyInfo::PropertyInfo() function
returns the property_info list associated with the object:
const property_info *BPropertyInfo::PropertyInfo(void) const
|
- New in 3.1 get_system_info() is available for use by device drivers.
- New in 3.1 New remove_debugger_command() function (declared in be/drivers/KernelExport.h):
int remove_debugger_command(char *name, int (*func)(int argc, char **argv))
|
Removes the debugger command that has the given name and function handler
(the name and handler are assigned in add_debugger_command()).
Note that both the name and the handler must match.
The function returns 1 if successful and 0 if not.
- A new set of functions (be/device/KernelExport.h) provides a cleaner API for reading
and writing i/o space--and they work on all platforms:
uint8 read_io_8(int mapped_io_addr);
void write_io_8(int mapped_io_addr, uint8 value);
uint16 read_io_16(int mapped_io_addr);
void write_io_16(int mapped_io_addr, uint16 value);
uint32 read_io_32(int mapped_io_addr);
void write_io_32(int mapped_io_addr, uint32 value);
|
- New interrupt handler installation functions:
long install_io_interrupt_handler(long interrupt_number,
interrupt_handler handler,
void *data,
ulong flags);
long remove_io_interrupt_handler(long interrupt_number,
interrupt_handler handler);
|
Intel: Interrupt handler chaining is supported on Intel processors. When you call
install_io_interrupt_handler(), you add the handler to a "handler chain" for that interrupt. When an interrupt occurs, the interrupt is passed down the appropriate chain until a handler returns
true; if your handler doesn't want to handle the interrupt,
it must return false.
PPC:
Interrupt chaining isn't supported on PPC. You should only install one handler per interrupt (at a time). If you want to install a different handler, you must first remove the current handler.
All Processors: You no longer need to explicitly enable and disable the handling of a given interrupt.
The first handler installation automatically enables the interrupt that it handles,
and the last one removed disables it.
- OBSOLETE: The new interrupt handler functions (above) usurp
the old set/enable/disable functions:
/* OBSOLETE */
set_isa_interrupt_handler()
enable_isa_interrupt_handler()
disable_isa_interrupt_handler()
set_io_interrupt_handler()
enable_io_interrupt_handler()
disable_io_interrupt_handler()
|
- The get_nth_isa_info() and get_nth_pci_info() functions
now correctly return B_ERROR for negative indices.
-
The new GetDeviceName() and CountDevices() functions,
implemented by BJoystick, BSerialPort, and BMidiPort,
lets you query
the system for device names, freeing you from the evils of hard-coded strings:
int32 class::CountDevices(void);
status_t class::GetDeviceName(int32 n,
char *name,
size_t bufSize = B_OS_NAME_LENGTH);
|
- CountDevices() returns the number of ports (the type of port is defined by the
class).
- GetDeviceName() returns, in name, the name of the n'th port.
The bufSize argument is the length of the name buffer that you're passing in; it needn't be
longer than B_OS_NAME_LENGTH. The function returns B_OK if a port was
found, and B_BAD_VALUE if there is no port at that index.
-
The new BDirectWindow class provides enhanced direct access to the
frame buffer in both full-screen and "window" modes.
- New in 3.1
BDirectWindow recognizes big-endian buffers.
- New in 3.1
The Virge driver supports BDirectWindow access.
- Some switching-out-of-full-screen-mode bugs were fixed. In particular, the color map is now properly
restored and Deskbar is no longer perverted.
- New BSlider, BTabView, and BTab classes. See the The Be Book for details.
- New in 3.1
The BTab class is properly exported.
- BControl. The "Enabled" property is now a standard for BControl objects.
You can use the property to get or set the control's enabled state.
- BWindow. New "MenuBar" property for BWindows passes
the command to the window's key menu bar.
- BMenus and BMenuItems. The "Menu" and "MenuItem" properties
allow submenu and menu item creation/deletion, and the "Enabled", "Label", and "Mark" properties
allow the named states to be set and retrieved.
- The synchronous version of the BAlert::Go() function now
preoperly returns B_ERROR if the BAlert is sent a B_QUIT_REQUESTED
message while it's on-screen.
- BBitmap functions properly fail if the BBitmap object is invalid.
- BListView has some new functions that let you manipulate items in the list:
bool SwapItems(int32 a, int32 b);
bool MoveItem(int32 from, int32 to);
bool ReplaceItem(int32 index, BListItem * item);
|
- BOutlineListView has some new sorting and invocation functions:
void FullListSortItems(int (*compareFunc)(const BListItem *,
const BListItem *));
void SortItemsUnder(BListItem *start, bool oneLevelOnly,
int (*compareFunc)(const BListItem *, const BListItem *));
int32 CountItemsUnder(BListItem *start, bool oneLevelOnly) const;
BListItem *EachItemUnder(BListItem *start, bool oneLevelOnly,
BListItem *(*eachFunc)(BListItem *, void *), void *);
BListItem *ItemUnderAt(BListItem *underItem, bool oneLevelOnly,
int32 index) const;
|
- The BPicture picture format has changed but is currently private. In the meantime, don't
use these BPicture functions:
/* Don't use these */
BPicture(const void *data, int32 size);
void *Data()
int32 DataSize()
status_t Play(...)
|
- BTextView defines an "undo" mechanism. See the BTextView class documentation.
- New in 3.1 BTextView no longer deadlocks when pasting unrecognized characters.
- BWindow defines some new window types constants:
B_UNTYPED_WINDOW
B_FLOATING_WINDOW
|
- BWindow also defines new "look" and "feel" characteristics. The window_look constants
describe the graphic part of a window:
enum window_look {
B_BORDERED_WINDOW_LOOK,
B_TITLED_WINDOW_LOOK,
B_DOCUMENT_WINDOW_LOOK,
B_MODAL_WINDOW_LOOK,
B_FLOATING_WINDOW_LOOK
};
|
Note that, for example, the B_MODAL_WINDOW_LOOK doesn't make the window modal,
it simply makes the window "look" modal (it will lack a title tab).
- The way a window behaves is
controlled by its feel, as set through a window_feel constant:
enum window_feel {
B_NORMAL_WINDOW_FEEL,
B_MODAL_SUBSET_WINDOW_FEEL,
B_MODAL_APP_WINDOW_FEEL,
B_MODAL_ALL_WINDOW_FEEL,
B_FLOATING_SUBSET_WINDOW_FEEL,
B_FLOATING_APP_WINDOW_FEEL,
B_FLOATING_ALL_WINDOW_FEEL
};
|
- Normal feel. The window will behave like a normal window (non-floating, non-modal)
regardless of how it looks.
- Subset feel. The window will [be modal/float over] all other windows in that
window's subset (see below).
- App feel. The window will [modal/float] among all other windows in the app.
- All feel. The window will [modal/float] among all other windows on the screen.
- BWindow defines new "subset" functions:
status_t BWindow::AddToSubset(BWindow *subwindow);
status_t BWindow::RemoveFromSubset(BWindow *subwindow);
|
The functions let you add the subwindow to this window's subset.
The subset is only meaningful if this window has a "subset feel," as described above.
- OBSOLETE:
The old window flag B_WILL_FLOAT has been removed. You now create floating
windows through the look and feel constants.
- New BWindow constructor flags:
B_AVOID_FRONT
B_AVOID_FOCUS
B_NO_WORKSPACE_ACTIVATION
|
The first two are reasonably obvious: When made active, the window doesn't come to front,
or doesn't take focus. B_NO_WORKSPACE_ACTIVATION means that when
the window is activated, the desktop won't switch to the window's workspace.
This is useful in the case when you want to create windows
that are spread over many workspaces, but you don't want the desktop to switch as each
window is created.
- The new SendBehind() function tells a window to hide behind some other window:
- The new Sync() function blocks until pending window operations are complete.
This function can really bog down responsiveness, so use it sparingly.
- The new LastMouseMovedView() function returns the BView that most recently
received a MouseMoved() in that window.
- The new Get/SetWindowAlignment() functions let you declare how you
want your window's content area to be aligned with regard to the screen or the frame buffer.
See the BWindow documentation for details.
- The ScreenChanged() function has been fixed to return the correct color space mode.
- New in 3.1 spawn_thread() always returns the correct value.
- The new symbol type B_SYMBOL_TYPE_ANY has been added (in be/kernel/image.h).
The obsolete types B_SYMBOL_TYPE_CODE,
B_SYMBOL_TYPE_TOC,
and B_SYMBOL_TYPE_GLUE have been removed.
- New disable_debugger() function tells the kernel to send a signal for
all exceptions, even those that normally tickle the debugger.
If a "debugger disabled" app doesn't have a handler installed for a received signal,
the team simply goes away, it doesn't pop into the debugger.
- New snooze_until() function lets a thread sleep until an absolute time measured
in a given timebase. Currently, there's only one timebase, B_SYSTEM_TIMEBASE.
- New set_signal_stack() function lets a thread set the location and size of the
stack used by its signal handlers.
- New B_LOMEM locking constant for areas that need to be locked,
contiguous, and that fit within the first 16Mb of physical memory ("lomem" is pronounced "brain dead").
You pass the constant as the fifth argument to create_area().
- New in 3.1 The debugger can be activated more than once (more than one thread can call
debugger()), and you can continue past an assertion.
-
The BMidiPort class recognizes F5 ("Output Cable Protocol") messages; the message is represented by
the new B_CABLE_MESSAGE constant (be/midi/MidiDefs.h). This message
lets you talk to a MIDI cable multiplexer.
Midi is now marked as single-launch, since it's not multiply-launchable. Also, it no longer crashes if you do a Close All from the Deskbar.
- New in 3.1 The MIDI drivers /dev/midi1 and /dev/midi2 have been moved to /dev/midi/midi1
and /dev/midi/midi2.
- New BMidiPort::GetDeviceName() and BMidiPort::CountDevices() functions; see
The Device Kit for details.
- The General MIDI synthesizer handles sustain pedal messages properly.
- New in 3.1 Dithering works.
- The C++ Standard Template Library is now available in libmslcpp_2_2.a.
- New in 3.1
The nothrow_t type and nothrow
global have been added (in cpp/new.h).
-
New BMimeType::Contains():
bool BMimeType::Contains(const BMimeType *other) const |
Compares the calling BMimeType (this) to the argument MIME string and
returns true if...
- the MIME type of this exactly matches other or...
- this is a supertype, and it's the supertype of other.
- New static BMimeType::GetWildcardApps() function:
static status_t BMimeType::GetWildcardApps(BMessage *signatures)
|
Finds the applications that support all file types, and returns their signatures in the
argument's "applications" field.
- Improved BMimeType::GetSupportingApps() returns more information,
allowing the caller to determine which apps support a specific MIME type,
and which apps claim to support all subtypes of a given supertype.
- New BAppFileInfo::Supports() function:
bool BAppFileInfo::Supports(BMimeType *mime) const
|
Rreturns true if the app knows how to handle the argument type, as
set through SetSupportedTypes().
- New BAppFileInfo::SetInfoLocation() function:
void BAppFileInfo::SetInfoLocation(info_location loc) |
Lets you specify where the object will read and write its app info.
The info_location enum defines three locations:
enum info_location {
B_USE_ATTRIBUTES,
B_USE_RESOURCES,
B_USE_BOTH_LOCATIONS
};
|
- The BFilePanel B_SAVE_REQUESTED message is properly constructed when the user double-clicks on a
file in a Save panel (previously, it forgot to add the "name" and "directory" fields)
- The Node Monitor now sends a message ("opcode" == B_ATTR_CHANGED)
when an attribute is removed from a monitored file.
- New BNode:Sync() function immediately performs any pending
disk transactions for the file: