George Peter Staplin: The code that follows creates an Xt button and a Tk button, in the same application.Alas, as time goes on some code doesn't age as well. A better solution is mentioned in the Tk Usage FAQ here:
http://tcl.sourceforge.net/faqs/tk/#wm/Tk-Xt
#include <stdio.h> #include <stdlib.h> #include <X11/Intrinsic.h> #include <X11/StringDefs.h> #include <X11/Xaw/Command.h> #include <tcl.h> #include <tk.h> Tcl_Interp *interp; void Action (Widget w, XtPointer client_data, XtPointer call_data) { fprintf (stderr, "You pressed me.\n"); exit (0); } int main (int argc, char *argvg) { XtAppContext appContext; Widget win, button; XEvent event; int i = 1; char sAppInitg = "pack [button .b -text \"Hello\"]"; win = XtVaAppInitialize( &appContext, "TclTkXt", NULL, 0, &argc, argv, NULL, NULL); button = XtVaCreateManagedWidget ( "XtButton", commandWidgetClass, win, NULL); interp = Tcl_CreateInterp (); Tcl_FindExecutable (argv[0]); /* Does Tcl_FindExecutable behave better *before* Tcl_CreateInterp()? */ if (Tcl_Init (interp) != TCL_OK) { fprintf (stderr, "Tcl_Init error"); exit (1); } if (Tk_Init (interp) != TCL_OK) { fprintf (stderr, "Tk_Init error"); exit (1); } XtAddCallback (button, XtNcallback, Action, 0); XtRealizeWidget (win); if (Tcl_Eval (interp, sAppInit) != TCL_OK) { fprintf (stderr, "Tcl_Eval error %s", Tcl_GetStringResult (interp)); } for (;;) { if (XtAppPending (appContext) > 0) { XtAppNextEvent (appContext, &event); XtDispatchEvent (&event); nt); } else { Tcl_DoOneEvent (TCL_DONT_WAIT); usleep (200); } } return (0); }
Here's a package that contains a Makefile and the code above: http://www.xmission.com/~georgeps/TclTkXt.tgz You may need to change the Makefile string -ltcl83 to -ltcl8.3 and Linux users need to add -ldl.Have fun!
During summer 2002, GPS mentioned http://www.xmission.com/~georgeps/TclTk_With_GTK-8.tgz and http://www.xmission.com/~georgeps/TclTk_With_Xt-7.tgz as two examples of mixing Tcl/Tk and GTk and Xt.
"Event-oriented programming" has background information.