You >will >need >to >edit >your >main >code > considerably >to >get >it >to >link > with >the >output > from >FLUID. > If >you >are >not >interested >in >this > you >may > have >more >immediate >luck >with >the > forms >compatibility >header, > <FL/forms.H>>. >
You >will >also >have >to >compile >your >Forms >or > XForms >program >using >a > C++ >compiler. > The >FLTK > library >does >not >provide >C >bindings >or >header > files. >
Although >FLTK >was >designed >to >be >compatable > with >the >GL >Forms > library >(version >0.3 >or >so), > XForms >has >bloated >severely >and >it's > interface >is > X-specific. > Therefore, >XForms >compatibility >is >no > longer > a >goal >of >FLTK. > Compatibility >was >limited > to >things >that >were >free, >or > that >would >add > code >that >would >not >be >linked >in >if >the > feature >is > unused, >or >that >was >not >X-specific. >
To >use >any >new >features >of >FLTK, >you >should > rewrite >your >code >to >not > use >the >inline > functions >and >instead >use >"pure" >FLTK. > This >will > make > it >a >lot >cleaner >and >make >it >easier >to > figure >out >how >to >call >the >FLTK > functions. > Unfortunately >this >conversion >is >harder >than > expected >and > even >Digital >Domain's >inhouse >code > still >uses >forms.H> a >lot. >
Many >parts >of >XForms >use >X-specific >structures > like >XEvent> in >their >interface. > I >did > not >emulate >these! > Unfortunately >these > features > (such >as >the >"canvas" >widget) >are >needed >by > most >large > programs. > You >will >need >to >rewrite > these >to >use >FLTK >subclasses. >
Fl_Free> widgets > emulate > the >old> Forms >"free" >widget. > It > may >be >useful >for >porting > programs >that >change > the >handle()> function >on >widgets, >but >you > will >still >need >to >rewrite >things. >
Fl_Timer> widgets > are > provided >to >emulate >the >XForms >timer. > These > work, >but >are >quite > inefficient >and >inaccurate > compared >to >using > Fl::add_timeout()>. >
All >instance >variables >are >hidden.> If >you > directly >refer >to > the >x, >y, >w, >h, >label, >or > other >fields >of >your >Forms >widgets >you >will > have >to >add >empty >parenthesis >after >each > reference. > The >easiest >way >to > do >this >is >to > globally >replace >"->x" >with >"->x()", >etc. > Replace > "boxtype" >with >"box()". >
const >char >*> arguments >to >most >FLTK > methods >are >simply > stored, >while >Forms >would > strdup()> the >passed >string. > This >is > most > noticable >with >the >label >of >widgets. > Your >program > must >always > pass >static >data >such >as >a >string > constant >or >malloc'd >buffer >to > label()>. > If >you >are >using >labels >to >display >program > output >you > may >want >to >try >the > Fl_Output> widget. >
The >default >fonts >and >sizes >are >matched >to > the >older >GL >version >of > Forms, >so >all >labels > will >draw >somewhat >larger >than >an >XForms >program > does. >
fdesign >outputs >a >setting >of >a >"fdui" >instance > variable >to >the >main > window. > I >did >not > emulate >this >because >I >wanted >all >instance > variables > to >be >hidden. > You >can >store >the > same >information >in >the >user_data()> field >of > a >window. > To >do >this, > search >through >the > fdesign >output >for > all >occurances >of >"->fdui" >and > edit >to >use >"->user_data()" >instead. > This >will > require >casts >and >is >not >trivial. >
The >prototype >for >the >functions >passed >to > fl_add_timeout()> and >fl_set_idle_callback()> callback >are >different. >
All >the >following >XForms >calls >are >missing:>
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. >
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. >
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()> |
>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*"); >