[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Proposal for a unified GUI to support Motif/Gtk/(Qt?)
From: |
R. Bernstein |
Subject: |
Proposal for a unified GUI to support Motif/Gtk/(Qt?) |
Date: |
Sun, 28 Jan 2007 17:14:21 -0500 |
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
> address@hidden
> http://lists.gnu.org/mailman/listinfo/ddd