As usual, you can find the project page here
. And you can find the BlackHole homepage l here
.
I have to warn you, the BlackHole homepage has not been updated in
about 6 months, so the information
about the project is pretty much out of date.
Links to other parts of this page:
And this table shows the current status of many objects in the toolkit:Object | Status |
bObject | Pefrectly usable |
bApplication | Usable, pretty much complete |
bWidget | Complete, Usable |
bWindow | Complete for the most part. Usable |
bPushButton | Pretty much complete. Usable |
bCheckButton | Complete, Usable |
bRadioButton/bRadioGroup | Complete, Usable |
bContainer | Complete, Usable |
bGroupBox | Complete, Usable |
bFrame | Complete, Usable |
bEdit/derivatives | Incomplete, segfaults, UNUSABLE! |
bMenu/bSelector | Incomplete, segfaults, UNUSABLE |
bMenuBar | Doesn't segfault anymore, somewhat usable |
bMenuItem/bSelectorItem | Uncertain, segfaults when adding children to the selector |
bListBox, bComboBox | Untested |
bScrollBar | Almost Usable |
bProgressBar | Usable as far as I can tell |
bScrollView | Untested |
bPixmap | Incomplete |
bList | Complete, usable |
Anything else I missed | Untested |
The main function in the toolkit is the overloaded drawButton() function,
which can, or should,
draw any size/shaped button-style object in the style of Motif.
The plain rectangular one works
perfectly
The steps in the creation are as follows:
Step 1. Create the Application Object.
THIS MUST BE THE FIRST OBJECT CREATED IN THE PROGRAM!!!
I did this because the entire program is in a tree, with the Application
object as the root of the tree.
Step 2. Create the windows.
Usually, you would subclass off of bWindow or bMainWindow in order to use
custom signals and slots
Here's an example of a bWindow subclass:
class
foo : public bWindow
{
public:
foo( int x, int y, int w, int h );
~foo();
SIGNAL_DEF(mySignal )
void a_slot();
TYPE(foo);
protected:
bPushButton *quitButton;
}
foo::foo(
int x, int y, int w, int h ) : bWindow( x, y, w, h )
{
quitButton = new bPushButton( "Quit", 0, 0, 50, 30, this );
connect( quitButton, SIGNAL(clicked), bApp, (bMember)&bApplication::quit
);
connect( this, SIGNAL( mySignal ), this, (bMember)&foo::a_slot );
quitButton->show();
}
int
main()
{
bApplication a;
foo b( 0, 0, 300, 200);
b.show();
return a.run();
}
As
you can see, ANY function can be a slot, as long as you can match the arguments.
Right now, you can have
at MOST 1 argument in a signal, using SIGNAL_DEFA(signame, datatype).
This gets by the moc that Qt uses, although it may be just a little messier.
One important thing, if you want your fancy new widget to be known, use
the TYPE macro. This isn't necessary,
and should not be used unless you are going to make a brand new widget
that doesn't use conventional styles.
Oh,
and every widget, windows included, needs to be passed a geometry, but
windows don't get passed a parent.
For a list of member functions, check the header files, they have the class
prototypes, and the function names are pretty
self-explanatory.
Step 3. Create an instance, and run the app, using app.run() or app->run(), depending on how you created the app.
Step 4. Debug, debug, debug. Since right now BTK is pre-beta,
not everything is tested, and I know for a fact that it segfaults
when you quit the app successfully.
And if you want to know sizes, the toolkit takes about 5 minutes to
compile on my intel Celeron 500MHz, with 256 MB RAM running KDE,
and only about 3-4 minutes running IceWM. The TK compiles into
865k with debuggin symbols, and stripped is about 474k. So, it is
a pretty small kit.
Have fun coding, and please report ALL bugs/patches/wishes to me at jhibbits@hotmail.com