Century Embedded Technologies Nano-X SDK and Developer's Guide | ||
---|---|---|
Prev | Appendix E. Forms Compatibility | Next |
These notes were written for porting programs written with the older IRISGL version of Forms. Most of these problems are the same ones encountered when going from old Forms to XForms:
The IRISGL library always forked when you created the first window, unless "foreground()" was called. FLTK acts like "foreground()" is called all the time. If you really want the fork behavior do "if (fork()) exit(0)" right at the start of your program.
If a Forms (not XForms) program if you wanted your own window for displaying things you would create a IRISGL window and draw in it, periodically calling Forms to check if the user hit buttons on the panels. If the user did things to the IRISGL window, you would find this out by having the value FL_EVENT returned from the call to Forms.
None of this works with FLTK. Nor will it compile, the necessary calls are not in the interface.
You have to make a subclass of Fl_Gl_Window and write a draw() method and handle() method. This may require anywhere from a trivial to a major rewrite.
If you draw into the overlay planes you will have to also write a draw_overlay() method and call redraw_overlay() on the OpenGL window.
One easy way to hack your program so it works is to make the draw() and handle() methods on your window set some static variables, storing what event happened. Then in the main loop of your program, call Fl::wait() and then check these variables, acting on them as though they are events read from fl_queue.
The file <FL/gl.h> defines replacements for a lot of IRISGL calls, translating them to OpenGL. There are much better translators available that you might want to investigate.
Programs that call fl_make_object or directly setting the handle routine will not compile. You have to rewrite them to use a subclass of Fl_Widget. It is important to note that the handle() method is not exactly the same as the handle() function of Forms. Where a Forms handle() returned non-zero, your handle() must call do_callback(). And your handle() must return non-zero if it "understood" the event.
An attempt has been made to emulate the "free" widget. This appears to work quite well. It may be quicker to modify your subclass into a "free" widget, since the "handle" functions match.
If your subclass draws into the overlay you are in trouble and will have to rewrite things a lot.
If you have written your own "free" widgets you will probably get a lot of errors about "getvaluator". You should substitute:
Forms | FLTK |
---|---|
MOUSE_X | Fl::event_x_root() |
MOUSE_Y | Fl::event_y_root() |
LEFTSHIFTKEY,RIGHTSHIFTKEY | Fl::event_shift() |
CAPSLOCKKEY | Fl::event_capslock() |
LEFTCTRLKEY,RIGHTCTRLKEY | Fl::event_ctrl() |
LEFTALTKEY,RIGHTALTKEY | Fl::event_alt() |
MOUSE1,RIGHTMOUSE | Fl::event_state() |
MOUSE2,MIDDLEMOUSE | Fl::event_state() |
MOUSE3,LEFTMOUSE | Fl::event_state() |
Anything else in getvaluator and you are on your own...
The "style" numbers have been changed because I wanted to insert bold-italic versions of the normal fonts. If you use Times, Courier, or Bookman to display any text you will get a different font out of FLTK. If you are really desperate to fix this use the following code:
fl_font_name(3,"*courier-medium-r-no*"); fl_font_name(4,"*courier-bold-r-no*"); fl_font_name(5,"*courier-medium-o-no*"); fl_font_name(6,"*times-medium-r-no*"); fl_font_name(7,"*times-bold-r-no*"); fl_font_name(8,"*times-medium-i-no*"); fl_font_name(9,"*bookman-light-r-no*"); fl_font_name(10,"*bookman-demi-r-no*"); fl_font_name(11,"*bookman-light-i-no*");