Proposal for a unified GUI to support Motif/Gtk/(Qt?)

"R. Bernstein" <[email protected]>
Newsgroups gmane.comp.debugging.ddd.general
Message-ID <[email protected]>
Sounds great -  sounds ambitious! Good luck!

Peter Wainwright writes:
 > Proposal for a unified GUI to support Motif/Gtk/(Qt?)
 > +++++++++++++++++++++++++++++++++++++++++++++++++++++
 > 
 > In order to support Gtk, without dropping the existing Motif interface
 > or forking the project, I have begun to experiment with a unified O-O
 > toolkit interface under the "gddd" branch.
 > 
 > The gddd branch now has preliminary support for three GUI interfaces:
 > 
 > (1) Motif(Xm) : The old procedural Motif interface.
 >     This is selected by ./configure without arguments.
 >     The macros IF_MOTIF and IF_XM are defined in config.h.
 > 
 > (2) Motif(Xmmm) : The new object-oriented Motif wrapper.
 >     This is selected by ./configure --with-xmmm.
 >     The macros IF_MOTIF and IF_XMMM are defined in config.h.
 > 
 > (3) Gtk(GtkX) : The object-oriented Gtk wrapper.
 >     This is selected by ./configure --with-gtk.
 >     None of the above macros is defined.
 > 
 > At the end of the rewrite, the following conditions should be true
 > - as far as possible :-)
 > 
 > (i) The old and new Motif interfaces will provide the same
 >     functionality.  Then the old interface (#ifdef IF_XM sections)
 >     can be dropped.  At present these sections are left as a fallback
 >     and to show the old code for comparison purposes.
 > 
 > (ii) The Xmmm and GtkX interfaces will be isomorphic.  Then a single
 >      macro in config.h will be used to switch between Motif and Gtk
 >      versions:
 >      #define GUI Xmmm     ... OR ...
 >      #define GUI GtkX
 > 
 > The unified interface will look very much like Gtkmm, the C++
 > object-oriented interface to Gtk, but with minimal modifications which
 > are required to support Motif (and possibly Qt in future).
 > 
 > In the meantime, the transition from Xm to Xmmm will be done
 > incrementally. Widget handles will be stored as instances of a new
 > template class Xmmm::WidgetPtr<Xmmm::CLASS>.  This has conversion
 > operators which allow it to be used wherever an Xmmm::CLASS* is
 > required OR an Xt Widget is required.  This type of widget handle is
 > automatically converted to the appropriate type whether it is used in
 > a new-style O-O method call or an old-style Xm... or Xt... call.
 > 
 > The GtkX namespace is a thin wrapper over Gtkmm, provided for
 > compatibility with Xmmm.  The main difference is that Gtkmm widgets
 > are created, and THEN added to the parent in a separate call.  This
 > cannot be done in the unified GUI, since Widgets cannot be reparented
 > in the Xt architecture.  Thus the parent widget must be passed to the
 > constructor.  Also, a Widget name is mandatory in order to allow the
 > Xt resource mechanism to work.  Constructors in GtkX/Xmmm therefore
 > follow this pattern:
 > 
 > GUI::CLASS::CLASS(GUI::Widget &parent, const char *name, ...);
 > 
 > 
 > As an example of how this might work (remember, IF_XM marks the old
 > interface for comparison purposes), here are some fragments from
 > SourceView.C:
 > 
 > 
 > #if !defined(IF_XM)
 > #include <GUI/WidgetPtr.h>
 > #include <GUI/RadioBox.h>
 > #include <GUI/SelectionDialog.h>
 > #include <GUI/RadioButton.h>
 > #endif
 > 
 > ...
 > 
 > #if defined(IF_XM)
 > Widget SourceView::register_dialog_w         = 0;
 > #else
 > GUI::WidgetPtr<GUI::SelectionDialog> SourceView::register_dialog_w = 0;
 > #endif
 > 
 > ...
 > 
 > #if defined(IF_XM)
 > Widget SourceView::int_registers_w           = 0;
 > Widget SourceView::all_registers_w           = 0;
 > #else
 > GUI::WidgetPtr<GUI::RadioButton> SourceView::int_registers_w = 0;
 > GUI::WidgetPtr<GUI::RadioButton> SourceView::all_registers_w = 0;
 > #endif
 > 
 > ...
 > 
 > #if defined(IF_XM)
 >     arg = 0;
 >     XtSetArg(args[arg], XmNautoUnmanage, False); arg++;
 >     register_dialog_w = 
 > 	verify(createTopLevelSelectionDialog(parent, "register_dialog", args,
 > arg));
 > #elif defined(IF_XMMM)
 >     register_dialog_w = 
 > 	new GUI::SelectionDialog(parent, "register_dialog");
 > #else // Gtk
 >     register_dialog_w = 
 > 	new GUI::SelectionDialog(*parent, "register_dialog");
 > #endif
 > 
 > ...
 > 
 > #if defined(IF_XM)
 >     arg = 0;
 >     Widget box = XmCreateRadioBox(register_dialog_w, XMST("box"), args,
 > arg);
 >     XtManageChild(box);
 > #else
 >     GUI::WidgetPtr<GUI::RadioBox> box = new
 > GUI::RadioBox(*register_dialog_w, "box", GUI::ORIENTATION_HORIZONTAL);
 >     box->show();
 > #endif
 > 
 > #if defined(IF_XM)
 >     arg = 0;
 >     XtSetArg(args[arg], XmNset, !all_registers); arg++;
 >     int_registers_w = 
 > 	XmCreateToggleButton(box, XMST("int_registers"), args, arg);
 >     XtManageChild(int_registers_w);
 > #else
 >     int_registers_w =
 > 	new GUI::RadioButton(*box, "int_registers");
 >     int_registers_w->set_active(!all_registers);
 >     int_registers_w->show();
 > #endif
 >     
 > 
 > #if defined(IF_XM)
 >     arg = 0;
 >     XtSetArg(args[arg], XmNset, all_registers); arg++;
 >     all_registers_w = 
 > 	XmCreateToggleButton(box, XMST("all_registers"), args, arg);
 >     XtManageChild(all_registers_w);
 > #else // NOT IF_XM
 >     all_registers_w =
 > 	new GUI::RadioButton(*box, "all_registers");
 >     all_registers_w->set_active(all_registers);
 >     all_registers_w->show();
 > #endif // IF_XM
 > 
 > #if defined(IF_XM)
 >     XtAddCallback(int_registers_w, XmNvalueChangedCallback,
 > sourceSetIntRegistersCB, XtPointer(0));
 >     XtAddCallback(all_registers_w, XmNvalueChangedCallback,
 > sourceSetAllRegistersCB, XtPointer(0));
 > #else
 > 
 > int_registers_w->signal_toggled().connect(sigc::bind(sigc::ptr_fun(sourceSetIntRegistersCB), int_registers_w));
 > 
 > all_registers_w->signal_toggled().connect(sigc::bind(sigc::ptr_fun(sourceSetAllRegistersCB), all_registers_w));
 > #endif
 > 
 > 
 > 
 > Peter Wainwright
 > 
 > _______________________________________________
 > Ddd mailing list
 > [email protected]
 > http://lists.gnu.org/mailman/listinfo/ddd
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.