History log of /haiku/src/kits/interface/Layout.cpp
Revision Date Author Comments
# ebea950b 18-Apr-2015 Michael Lotz <mmlr@mlotz.ch>

BLayout: Don't delete the layout of the view in RemoveView().

The layout item representing the layout of the view to be removed is
owned by the view and must not be deleted. The layout only owns the
item if a new layout item was created when adding the view, i.e. when
it did not have a layout.

Fixes the underlying issue that triggered #11976.


# e837ee8b 14-Apr-2015 Michael Lotz <mmlr@mlotz.ch>

BView: Fix destruction order of layout items.

Because of the virtual hooks a BLayout must never be destroyed while it
still has layout items. If these items are only removed from the layout
in its destructor, the subclass version of hooks like ItemRemoved() are
not called anymore. This lead to leaks because many BLayout subclasses
use the ItemRemoved() hook to clean up associated data (as is suggested
explicitly in the BLayout documentation).

In the same line of thought, a BLayoutItem must never be deleted when it
is still attached to a layout, as it similarly has virtual hooks like
DetachedFromLayout() that can not be called at this point anymore.

The destructors of BLayout and BLayoutItem now have debugger calls in
case these conditions are not met which should help to avoid
accidentally introducing such hard to debug issues.

To ensure the correct destruction order the sequence is now:

* Destroy the child views first. This cleans up their layout items while
the layout tree is still intact.
* Unset the view layout before removing layout items so it can properly
detach from the layout instead of just deleting it.


# caddc641 15-Nov-2012 Joseph R. Prostko <joe.prostko@gmail.com>

Changes to allow Haiku source to build with GCC 4.7
* GCC 4.7 is more picky than GCC 4.6, so have to make changes accordingly
* Changes include addressing issues with scoping, redeclaration, etc.
Thanks Rene and Ingo for your input on these changes


# 31f76857 09-May-2012 czeidler <haiku@clemens-zeidler.de>

The layout checks the target view now if the layout invalidation has been disabled in the view.


# 981c729b 28-Dec-2011 Alex Wilson <yourpalal2@gmail.com>

Fix potential uninitialized variable bug in BLayout::AllUnarchived().

BMessage::GetInfo() doesn't set the count output var in error cases.


# 9f029231 28-Dec-2011 Alex Wilson <yourpalal2@gmail.com>

Fix typo in BLayout::AllArchived().

BLayout::AllArchived() was forwarding to BArchivable, skipping BLayoutItem.


# f1e81e61 28-Dec-2011 Alex Wilson <yourpalal2@gmail.com>

Fix bug in BLayout::RemoveView().

Fix typo-induced bug causing (in many cases) the wrong item to be removed from the layout!
Also, improve performance from O(n * m) to O(n), although n and m will always be quite small in practice, we might as well.


# d56e7bd6 01-Dec-2011 Alex Wilson <yourpalal2@gmail.com>

Make archiving hooks protected in layout classes.

Furthermore,
* remove a stray blank line in Layout.cpp
* make BLayoutItem::SetLayout() private, as it should have been


# 53617d36 05-Nov-2011 Alex Wilson <yourpalal2@gmail.com>

Override a bunch of methods in layout related classes for FBC stability.

* Especially made sure to override archiving methods, since these are called rarely, so the cost is very minimal
* Otherwise, the closer a class is to a base class, the more likely I was to give it all the overrides.


# 8151838e 02-Nov-2011 Alex Wilson <yourpalal2@gmail.com>

Add FBC padding to all (I think..) of the visible Layout related classes.


# a851b3ad 31-Oct-2011 Alex Wilson <yourpalal2@gmail.com>

Add Perform() methods to all the layout-related classes that needed them.


# e7b0dc78 22-Oct-2011 Alex Wilson <yourpalal2@gmail.com>

Now that child classes aren't overriding the various InvalidateLayout() methods, we can take advantage of some guarantees to simplify/clean/optimize the layout invalidation propagation mechanisms!


# b38ea98f 16-Oct-2011 Alex Wilson <yourpalal2@gmail.com>

Devirtualize BLayout::InvalidateLayout(), add a protected hook BLayout::DoLayout(). This will allow for much better control over the propagation of layout invalidations, and therefore cleaner, more optimal code.


# f87e4c73 16-Oct-2011 Alex Wilson <yourpalal2@gmail.com>

Fix bug in Layout.cpp's ViewRemover struct. operator() didn't deal well with NULLs.


# 90e61567 12-Sep-2011 Alex Wilson <yourpalal2@gmail.com>

Fix a bug in BLayout::AddItem() where the right conditions + an error would have
caused the wrongful removal of a BView from its parent.


# 4e0131f5 09-Sep-2011 Alex Wilson <yourpalal2@gmail.com>

Rename BLayout::DerivedLayoutItems() to DoLayout(), which is consistent with BView::DoLayout(). Also adjusted child classes and documentation.


# cc1ca167 09-Sep-2011 Alex Wilson <yourpalal2@gmail.com>

Fix a memory leak I introduced with my modification of BLayout::RemoveItem() and add comments so that it doesn't happen again. Also resolve some TODOs on the appropriate timing of calls to hook methods in BLayoutItem/BLayout.


# fa01d084 08-Sep-2011 Alex Wilson <yourpalal2@gmail.com>

User BView's layout item tracking functionality to simplify and optimize some methods in BLayout and BView.
Delete BLayout::RemoveViewRecursive() as it is no longer needed.
Add a few TODO's.


# 30b07d01 08-Sep-2011 Alex Wilson <yourpalal2@gmail.com>

Use the classes from AutoDeleter.h to improve BLayout::AddView() and to simplify the ViewRemover struct created for BLayout::AddItem().


# ea907ab5 08-Sep-2011 Alex Wilson <yourpalal2@gmail.com>

Use BView's ability to track what layout items reference it to simplify BLayout::IndexOfView(). This also changes the semantics slightly, but I think it is a logical change.


# bd97b9ad 07-Sep-2011 Alex Wilson <yourpalal2@gmail.com>

Add a BObjectList<BLayoutItem> to BView::fLayoutData that keeps track of any BLayoutItems that refer to this view that are part of a layout. BLayoutItem does the registering/deregistering of the items, and BView::Private proxies fLayoutData for us. Currently, this is not used anywhere, but there are many places where it will be used soon.


# edb4c824 06-Sep-2011 Alex Wilson <yourpalal2@gmail.com>

Add a method to BView::Private that calls BView::_RemoveSelf().
Add a struct to kits/interface/Layout.cpp that uses BView::Private to
provide RAII mechanics for the removal of views (calling
BView::Private::RemoveSelf()).
Use the new struct to simplify BLayout::AddItem().


# a9e89a73 19-Nov-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

Also made LayoutContext() const.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@39526 a95241bf-73f2-0310-859d-f6bbb57e9c96


# df730987 19-Nov-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

Made AncestorsVisible() const.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@39525 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 3ea301f3 22-Oct-2010 Alex Wilson <yourpalal2@gmail.com>

Update BLayout::IndexOfView() to return NULL for NULL input, and check for BViews that where added by BLayout, instead of by BViewLayoutItem.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@39043 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 1d6c7b6c 17-Aug-2010 Alex Wilson <yourpalal2@gmail.com>

Big change deriving BLayout from BLayoutItem, and allowing viewless BLayouts.
a few highlights:
* BLayout now derives publicly from BLayoutItem
* Added BAbstractLayout class, which our layouts now derive from
* updated layout builders to avoid creating views when they don't need to
* updated layout classes
* updated AboutSystem to fix a little regression
* more details on #6407
* please tell me about any regressions, I've tried to find them all, but some
may have slipped by.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@38207 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 6829d417 29-Jul-2010 Alex Wilson <yourpalal2@gmail.com>

Update BLayout::ItemAdded() and BLayout::ItemRemoved() to take an int32 index parameter, and ItemAdded() to return a bool indicating success or failure. Update BLayout::AddItem() to take the result of ItemAdded() into account. Also update BLayout::AllUnarchived() to take this into account. In either situation, if ItemAdded() returns false, the item does not get added to the layout. Removed various TODOs about code that could be removed once this change was made. In BSplitLayout, an item's LayoutData was lazy-initialized, but would always be created during ItemAdded(). Now we create the LayoutData explicitly, so that we can catch failed memory allocations. Closes #5524.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37817 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 4a254e4d 27-Jul-2010 Alex Wilson <yourpalal2@gmail.com>

Generally, clean up new archiving constant names & strings to be consistent in all classes. Modify archiving constants to be const char* const (thanks Ingo). Also modify archiving in many classes to use less fields by storing more data in arrays and structs. The common min, max, and preferred sizes, for example are always stored in an array now. In BTwoDimensionalLayout and BSplitLayout, the insets are archived in a BRect. Also fixed a typo in BGridLayout which caused column info to be incorrect during archival.



git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37777 a95241bf-73f2-0310-859d-f6bbb57e9c96


# b137ab3e 16-Jul-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

Patch by Alex Wilson (minor changes by myself) related to the new archiving
features:
* Some cosmetic adjustments of the API, like using references instead of
pointers, argument order, method names, etc.
* Added convenience template methods for archiving and unarchiving to BArchiver
and BUnarchiver.
* BUnarchiver (respectively the private BUnarchiveManager) explicitly deals with
object ownership, now. This is necessary since an error while unarchiving
could leave an already unarchived object without owning object, which would
result in it being leaked. The BUnarchiver::{Get,Find}Object() methods do now
have an optional parameter to specify whether object ownership shall be
transferred.
* Fixed incorrect header guard in headers/private/binary_compatibility/Global.h.



git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37538 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 27d84b48 08-Jul-2010 Adrien Destugues <pulkomandy@pulkomandy.ath.cx>

Patch by Alex Wilson as part of GSoC 2010 : Archiving of Layouted BViews hierarchy.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37433 a95241bf-73f2-0310-859d-f6bbb57e9c96


# f374f0d9 18-Apr-2008 Axel Dörfler <axeld@pinc-software.de>

* A view can have more than just one LayoutItem, and therefore, we have to
remove them all in RemoveView().
* Also, previously, the wrong LayoutItem could be removed if there was any
view that had more than one item around.
* IOW using BView::RemoveSelf()/RemoveChild() yourself would have leaked
memory in the best case, and would otherwise crash your app if there was
any view with more than one LayoutItem.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25024 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 9ecf9d1c 26-Aug-2006 Ingo Weinhold <ingo_weinhold@gmx.de>

Merge from layout management branch.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@18649 a95241bf-73f2-0310-859d-f6bbb57e9c96


# ebea950b2df08711adaca9f2c0d282d48667e545 18-Apr-2015 Michael Lotz <mmlr@mlotz.ch>

BLayout: Don't delete the layout of the view in RemoveView().

The layout item representing the layout of the view to be removed is
owned by the view and must not be deleted. The layout only owns the
item if a new layout item was created when adding the view, i.e. when
it did not have a layout.

Fixes the underlying issue that triggered #11976.


# e837ee8bc6de62d1b98dfe2a3097f4f740dd98b4 14-Apr-2015 Michael Lotz <mmlr@mlotz.ch>

BView: Fix destruction order of layout items.

Because of the virtual hooks a BLayout must never be destroyed while it
still has layout items. If these items are only removed from the layout
in its destructor, the subclass version of hooks like ItemRemoved() are
not called anymore. This lead to leaks because many BLayout subclasses
use the ItemRemoved() hook to clean up associated data (as is suggested
explicitly in the BLayout documentation).

In the same line of thought, a BLayoutItem must never be deleted when it
is still attached to a layout, as it similarly has virtual hooks like
DetachedFromLayout() that can not be called at this point anymore.

The destructors of BLayout and BLayoutItem now have debugger calls in
case these conditions are not met which should help to avoid
accidentally introducing such hard to debug issues.

To ensure the correct destruction order the sequence is now:

* Destroy the child views first. This cleans up their layout items while
the layout tree is still intact.
* Unset the view layout before removing layout items so it can properly
detach from the layout instead of just deleting it.


# caddc641c1682911446623c09d95170423aaa0de 15-Nov-2012 Joseph R. Prostko <joe.prostko@gmail.com>

Changes to allow Haiku source to build with GCC 4.7
* GCC 4.7 is more picky than GCC 4.6, so have to make changes accordingly
* Changes include addressing issues with scoping, redeclaration, etc.
Thanks Rene and Ingo for your input on these changes


# 31f768577ea9a64f880fc9d769648337f01eede8 09-May-2012 czeidler <haiku@clemens-zeidler.de>

The layout checks the target view now if the layout invalidation has been disabled in the view.


# 981c729bdca928743f9bf6e7fc611563c312cbc3 28-Dec-2011 Alex Wilson <yourpalal2@gmail.com>

Fix potential uninitialized variable bug in BLayout::AllUnarchived().

BMessage::GetInfo() doesn't set the count output var in error cases.


# 9f0292314dc414b8f0294ddd7a87d0d69d9d5960 28-Dec-2011 Alex Wilson <yourpalal2@gmail.com>

Fix typo in BLayout::AllArchived().

BLayout::AllArchived() was forwarding to BArchivable, skipping BLayoutItem.


# f1e81e617247b1c827755a31627325c33052407e 28-Dec-2011 Alex Wilson <yourpalal2@gmail.com>

Fix bug in BLayout::RemoveView().

Fix typo-induced bug causing (in many cases) the wrong item to be removed from the layout!
Also, improve performance from O(n * m) to O(n), although n and m will always be quite small in practice, we might as well.


# d56e7bd64d975565dbdd2c38230b6f14eb3e5906 01-Dec-2011 Alex Wilson <yourpalal2@gmail.com>

Make archiving hooks protected in layout classes.

Furthermore,
* remove a stray blank line in Layout.cpp
* make BLayoutItem::SetLayout() private, as it should have been


# 53617d366d1729716cc1e2764feb4a734b65b9f0 05-Nov-2011 Alex Wilson <yourpalal2@gmail.com>

Override a bunch of methods in layout related classes for FBC stability.

* Especially made sure to override archiving methods, since these are called rarely, so the cost is very minimal
* Otherwise, the closer a class is to a base class, the more likely I was to give it all the overrides.


# 8151838e3892d0a18d89d73e2cc37e1f5d01264d 02-Nov-2011 Alex Wilson <yourpalal2@gmail.com>

Add FBC padding to all (I think..) of the visible Layout related classes.


# a851b3ad543ebaebc18589b959c01ccaaf35202f 31-Oct-2011 Alex Wilson <yourpalal2@gmail.com>

Add Perform() methods to all the layout-related classes that needed them.


# e7b0dc78f7695340de8d5fd6ab4d0798809e0f0b 22-Oct-2011 Alex Wilson <yourpalal2@gmail.com>

Now that child classes aren't overriding the various InvalidateLayout() methods, we can take advantage of some guarantees to simplify/clean/optimize the layout invalidation propagation mechanisms!


# b38ea98f527e2d4a610e9891a10d19ddc9bc00c1 16-Oct-2011 Alex Wilson <yourpalal2@gmail.com>

Devirtualize BLayout::InvalidateLayout(), add a protected hook BLayout::DoLayout(). This will allow for much better control over the propagation of layout invalidations, and therefore cleaner, more optimal code.


# f87e4c7302448a36ffd29dc4c3163f1fdc3c3fe6 16-Oct-2011 Alex Wilson <yourpalal2@gmail.com>

Fix bug in Layout.cpp's ViewRemover struct. operator() didn't deal well with NULLs.


# 90e615679c88f6d306a4aef56eaa44f7e871b7aa 12-Sep-2011 Alex Wilson <yourpalal2@gmail.com>

Fix a bug in BLayout::AddItem() where the right conditions + an error would have
caused the wrongful removal of a BView from its parent.


# 4e0131f51ba30445ab5b48d57ad45564cf6617d1 09-Sep-2011 Alex Wilson <yourpalal2@gmail.com>

Rename BLayout::DerivedLayoutItems() to DoLayout(), which is consistent with BView::DoLayout(). Also adjusted child classes and documentation.


# cc1ca167a4393a08afafab8ab4cca4194cbee56f 09-Sep-2011 Alex Wilson <yourpalal2@gmail.com>

Fix a memory leak I introduced with my modification of BLayout::RemoveItem() and add comments so that it doesn't happen again. Also resolve some TODOs on the appropriate timing of calls to hook methods in BLayoutItem/BLayout.


# fa01d084960d9ee5acf5786c5f15c6e956026be8 08-Sep-2011 Alex Wilson <yourpalal2@gmail.com>

User BView's layout item tracking functionality to simplify and optimize some methods in BLayout and BView.
Delete BLayout::RemoveViewRecursive() as it is no longer needed.
Add a few TODO's.


# 30b07d019d9584e3722bf253aa2ca14e397d6849 08-Sep-2011 Alex Wilson <yourpalal2@gmail.com>

Use the classes from AutoDeleter.h to improve BLayout::AddView() and to simplify the ViewRemover struct created for BLayout::AddItem().


# ea907ab5876ff85dce82b76c12cca8ebcdfa624e 08-Sep-2011 Alex Wilson <yourpalal2@gmail.com>

Use BView's ability to track what layout items reference it to simplify BLayout::IndexOfView(). This also changes the semantics slightly, but I think it is a logical change.


# bd97b9adba41005ca6dafaf0c32f63422ec351b6 07-Sep-2011 Alex Wilson <yourpalal2@gmail.com>

Add a BObjectList<BLayoutItem> to BView::fLayoutData that keeps track of any BLayoutItems that refer to this view that are part of a layout. BLayoutItem does the registering/deregistering of the items, and BView::Private proxies fLayoutData for us. Currently, this is not used anywhere, but there are many places where it will be used soon.


# edb4c8244cfe8ed3801ef4854d45c03324c96510 06-Sep-2011 Alex Wilson <yourpalal2@gmail.com>

Add a method to BView::Private that calls BView::_RemoveSelf().
Add a struct to kits/interface/Layout.cpp that uses BView::Private to
provide RAII mechanics for the removal of views (calling
BView::Private::RemoveSelf()).
Use the new struct to simplify BLayout::AddItem().


# a9e89a7325821b05f895de0c6265bf8b48791fba 19-Nov-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

Also made LayoutContext() const.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@39526 a95241bf-73f2-0310-859d-f6bbb57e9c96


# df7309870f10bc3f710f0de8078986064359b785 19-Nov-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

Made AncestorsVisible() const.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@39525 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 3ea301f30e612e8c8b85387e5a1e3d1bef54c894 22-Oct-2010 Alex Wilson <yourpalal2@gmail.com>

Update BLayout::IndexOfView() to return NULL for NULL input, and check for BViews that where added by BLayout, instead of by BViewLayoutItem.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@39043 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 1d6c7b6cb6f46c2672074ff137a18833d4dd3041 17-Aug-2010 Alex Wilson <yourpalal2@gmail.com>

Big change deriving BLayout from BLayoutItem, and allowing viewless BLayouts.
a few highlights:
* BLayout now derives publicly from BLayoutItem
* Added BAbstractLayout class, which our layouts now derive from
* updated layout builders to avoid creating views when they don't need to
* updated layout classes
* updated AboutSystem to fix a little regression
* more details on #6407
* please tell me about any regressions, I've tried to find them all, but some
may have slipped by.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@38207 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 6829d4174ba57d752c8d470a55789112db477daf 29-Jul-2010 Alex Wilson <yourpalal2@gmail.com>

Update BLayout::ItemAdded() and BLayout::ItemRemoved() to take an int32 index parameter, and ItemAdded() to return a bool indicating success or failure. Update BLayout::AddItem() to take the result of ItemAdded() into account. Also update BLayout::AllUnarchived() to take this into account. In either situation, if ItemAdded() returns false, the item does not get added to the layout. Removed various TODOs about code that could be removed once this change was made. In BSplitLayout, an item's LayoutData was lazy-initialized, but would always be created during ItemAdded(). Now we create the LayoutData explicitly, so that we can catch failed memory allocations. Closes #5524.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37817 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 4a254e4ddbb0aaeb909ecd68a8442c4302618050 27-Jul-2010 Alex Wilson <yourpalal2@gmail.com>

Generally, clean up new archiving constant names & strings to be consistent in all classes. Modify archiving constants to be const char* const (thanks Ingo). Also modify archiving in many classes to use less fields by storing more data in arrays and structs. The common min, max, and preferred sizes, for example are always stored in an array now. In BTwoDimensionalLayout and BSplitLayout, the insets are archived in a BRect. Also fixed a typo in BGridLayout which caused column info to be incorrect during archival.



git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37777 a95241bf-73f2-0310-859d-f6bbb57e9c96


# b137ab3eb34e8c43c76dab64c09d2718569cf1d5 16-Jul-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

Patch by Alex Wilson (minor changes by myself) related to the new archiving
features:
* Some cosmetic adjustments of the API, like using references instead of
pointers, argument order, method names, etc.
* Added convenience template methods for archiving and unarchiving to BArchiver
and BUnarchiver.
* BUnarchiver (respectively the private BUnarchiveManager) explicitly deals with
object ownership, now. This is necessary since an error while unarchiving
could leave an already unarchived object without owning object, which would
result in it being leaked. The BUnarchiver::{Get,Find}Object() methods do now
have an optional parameter to specify whether object ownership shall be
transferred.
* Fixed incorrect header guard in headers/private/binary_compatibility/Global.h.



git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37538 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 27d84b482cddb07e4dee8ee345d3b9a61000d2ec 08-Jul-2010 Adrien Destugues <pulkomandy@pulkomandy.ath.cx>

Patch by Alex Wilson as part of GSoC 2010 : Archiving of Layouted BViews hierarchy.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37433 a95241bf-73f2-0310-859d-f6bbb57e9c96


# f374f0d9f1d089742bdb69f97bb9de4555247167 18-Apr-2008 Axel Dörfler <axeld@pinc-software.de>

* A view can have more than just one LayoutItem, and therefore, we have to
remove them all in RemoveView().
* Also, previously, the wrong LayoutItem could be removed if there was any
view that had more than one item around.
* IOW using BView::RemoveSelf()/RemoveChild() yourself would have leaked
memory in the best case, and would otherwise crash your app if there was
any view with more than one LayoutItem.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25024 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 9ecf9d1c1d4888d341a6eac72112c72d1ae3a4cb 26-Aug-2006 Ingo Weinhold <ingo_weinhold@gmx.de>

Merge from layout management branch.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@18649 a95241bf-73f2-0310-859d-f6bbb57e9c96