jdp@uunet.uu.net (John D. Polstra) (06/02/89)
In article <8904261905.AA24155@trantor.harris-atd.com> chuck@trantor.harris-atd.com (Chuck Musciano) writes: >X-Sun-Spots-Digest: Volume 7, Issue 276, message 2 of 18 > > Suntools is not extensible . . . Ah, but it *is* extensible, and the technique Sun used to make it that way is pretty cute. Let's take as an example the following call, which creates a new button in a panel: button = panel_create_item(panel, PANEL_BUTTON, <attributes>, 0); If you look in <suntool/panel.h>, you'll find that PANEL_BUTTON just expands to the name of a function in the suntools library: extern Panel_item panel_button(); ... #define PANEL_BUTTON panel_button So, panel_create_item() is simply being handed a pointer to a function (panel_button) which is responsible for setting everything up. Panel_create_item() *calls* this function, which is expected to initialize some things and then return a pointer to a structure (called a Panel_item) that has a standardized layout (independent of the panel item type) at its beginning. The standardized part of the structure contains, among other things, pointers to functions for doing things such as interpreting attributes, repainting, destroying the item, etc. The remainder of the structure contains whatever additional information is necessary to maintain that particular type of panel item. Let's say I want to have a new type of panel item, a PANEL_VIBROROTOR. Here's what I have to do: 1. Add these lines to <suntool/panel.h> or some other convenient place: extern Panel_item panel_vibrorotor(); #define PANEL_VIBROROTOR panel_vibrorotor 2. Write the panel_vibrorotor() routine and its standardized support routines (interpret attributes, repaint, destroy, etc.). Panel_vibrorotor() should allocate a Panel_item structure, fill in all of the standardized fields, initialize the private fields, and return a pointer to the structure. Once this is done, I can say: vr = panel_create_item(panel, PANEL_VIBROROTOR, <attributes>, 0); and it ought to work just fine. Interestingly, the same technique is used for implementing the various subwindow types (PANEL, CANVAS, etc.). So you could also extend Sunview to include new kinds of subwindows. The catch is, of course, that Sun doesn't document the layout of the standardized portion of the Panel_item structure. You have to figure it out for yourself, using your favorite debugger. (Don't ask me for this information -- I pursued it only far enough to convince myself that it would be possible.) Also, there's no guarantee that Sun won't change everything in a future release. John Polstra jdp@polstra.uucp ...uunet!practic!polstra!jdp