diff --git a/c/xt/widget.c b/c/xt/widget.c new file mode 100644 index 0000000..afad24c --- /dev/null +++ b/c/xt/widget.c @@ -0,0 +1,322 @@ +/* #include "scxt.h" */ +/* #include "scheme48.h" */ +/* #include "xlib.h" */ + +/* extern void XtManageChildren(), XtUnmanageChildren(); */ + +/* static Object P_Destroy_Widget(); */ + + + +/* static Object P_Create_Shell (argc, argv) Object *argv; { */ +/* register char *sn = 0, *sc = 0; */ +/* ArgList a; */ +/* Object name, class, w, d, ret; */ +/* Alloca_Begin; */ + +/* name = argv[0], class = argv[1], w = argv[2], d = argv[3]; */ +/* if (!EQ(name, False)) */ +/* sn = Get_Strsym (name); */ +/* if (!EQ(class, False)) */ +/* sc = Get_Strsym (class); */ +/* Check_Type (w, T_Class); */ +/* Check_Type (d, T_Display); */ +/* Encode_Arglist (argc-4, argv+4, a, (Widget)0, CLASS(w)->wclass); */ +/* ret = Make_Widget (XtAppCreateShell (sn, sc, CLASS(w)->wclass, */ +/* DISPLAY(d)->dpy, a, (Cardinal)(argc-4)/2)); */ +/* Alloca_End; */ +/* return ret; */ +/* } */ + + +/* implementation of resources lacks... */ +s48_value scxt_Create_Shell(s48_value app_name, s48_value app_class, + s48_value Xwidget_parent, s48_value Xdisplay, + s48_value arg_list) { + ArgList a; + /* ... */ +} + + +/* implementation of resources lacks... */ +s48_value scxt_Create_Widget(s48_value w_name, s48_value w_class, + s48_value parent, s48_value args, + s48_value num_args, s48_value flag){ + ArgList a_list; + Widget res; + /* ... decode the arg-list!!! */ + + /* ... */ + if (s48_extract_boolean(flag)){ + res = XtCreateManagedWidget(s48_extract_string(w_name), + SCTX_EXTRACT_WIDGET_CLASS(w_class), + SCTX_EXTRACT_WIDGET(parent), a_list, + (Cardinal)s48_extract_integer(num_args)); + }else{ + res = XtCreateWidget(s48_extract_string(w_name), + SCXT_EXTRACT_WIDGET_CLASS(w_class), + SCXT_EXTRACT_WIDGET(parent), a_list, + (Cardinal)s48_extract_integer(num_args)); + } + /* add the callback */ + XtAddCallback(res, XtNdestroyCallback, Destroy_Callback,(XtPointer)0); + return SCXT_ENTER_WIDGET(res); +} + + +s48_value scxt_Realize_Widget (s48_value w){ + XtRealizeWidget(SCXT_EXTRACT_WIDGET(w)); + return S48_UNSPECIFIC; +} + + +s48_value scxt_Unrealize_Widget (s48_value w) { + XtUnrealizeWidget(SCXT_EXTRACT_WIDGET(w)); + return S48_UNSPECIFIC; +} + + +s48_value scxt_Widget_Realized_P (s48_value w) { + int is_real = XtIsRealized(SCXT_EXTRACT_WIDGET(w)); + return S48_ENTER_BOOLEAN(is_real); +} + + +s48_value scxt_Widget_Display (s48_value w) { + return SCX_ENTER_DISPLAY(XtDisplayOfObject(SCTX_EXTRACT_WIDGET(w))); +} + + +/* Returns the parent's widget ID */ +s48_value scxt_Widget_Parent (s48_value w) { + return SCXT_ENTER_WIDGET(XtParent(SCTX_EXTRACT_WIDGET(w))); +} + + + +s48_value scxt_Widget_Name (s48_value w) { + return s48_enter_string(XtName(SCTX_EXRACT_WIDGET(w))); +} + + +/* Returns the window associated with the widget */ +s48_value scxt_Widget_To_Window (s48_value w) { + return SCX_ENTER_WINDOW(XtWindow(SCTX_EXTRACT_WIDGET(w))); +} + + + +s48_value sxct_Widget_Composite_P (s48_value) { + return s48_ENTER_BOOLEAN(XtIsComposite(SCXT_EXTRACT_WIDGET(w))); +} + + + +s48_value scxt_Manage_Children (s48_value w_list, s48_value len) { + Widget* buf_list; + int i; + int length = (int)s48_extract_integet(len); + for (i = 0, i < length, i++) { + buf_list[i] = S48_CAR(w_list); + w_list = S48_CDR(w_list); + } + XtManageChildren(buf_list, length); + return S48_UNSPECIFIC; +} + + + +s48_value scxt_Unmanage_Children (s48_value w_list, s48_value len) { + Widget* buf_list; + int length = (int)s48_extract_integer(len); + int i; + for (i = 0, i < length, i++) { + buf_list[i] = S48_CAR(w_list); + w_list = S48_CDR(w_list); + } + XtUnmanageChildren(buf_list, length); + return S48_UNSPECIFIC; +} + + +s48_value scxt_Widget_Managed_P (s48_value w) { + return S48_ENTER_BOOLEAN(XtIsManaged(SCXT_EXTRACT_WIDGET(w))); +} + + + +s48_value scxt_Widget_Class (s48_value w) { + return SCXT_ENTER_WIDGET_CLASS(XtClass(SCXT_EXTRACT_WIDGET(w))); +} + + + +s48_value scxt_Widget_Superclass (s48_value w) { + if (XtClass(SCXT_EXTRACT_WIDGET(w)) == widgetClass) + return S48_ENTER_BOOLEAN(0); + return SCXT_ENTER_WIDGET_CLASS(XtSuperclass(SCXT_EXTRACT_WIDGET(w))); +} + + + +s48_value scxt_Widget_Subclass_P (s48_value w, s48_value w_class) { + return S48_ENTER_BOOLEAN(XtIsSubclass(SCXT_EXTRACT_WIDGET(w), + SCXT_EXTRACT_WIDGET_CLASS(w_class))); +} + + +s48_value scxt_Set_Mapped_When_Managed (s48_value w, s48_value bool) { + XtSetMappedWhenManaged (SCXT_EXTRACT_WIDGET(w), S48_EXTRACT_BOOLEAN(bool)); + return S48_UNSPECIFIC; +} + + +s48_value scxt_Map_Widget (s48_value w) { + XtMapWidget(SCXT_EXTRACT_WIDGET(w)); + return S48_UNSPECIFIC; +} + + +s48_value scxt_Unmap_Widget (s48_value w) { + XtUnmapWidget (SCXT_EXTRACT_WIDGET(w)); + return S48_UNSPECIFIC; +} + + +/* static Object P_Set_Values (argc, argv) Object *argv; { */ +/* ArgList a; */ +/* Widget w; */ +/* register i, n = (argc-1)/2; */ +/* Alloca_Begin; */ + +/* Check_Widget (argv[0]); */ +/* w = WIDGET(argv[0])->widget; */ +/* Encode_Arglist (argc-1, argv+1, a, w, XtClass (w)); */ +/* XtSetValues (w, a, (Cardinal)n); */ +/* for (i = 0; i < n; i++) */ +/* if (streq (a[i].name, XtNdestroyCallback)) */ +/* Fiddle_Destroy_Callback (w); */ +/* Alloca_End; */ +/* return Void; */ +/* } */ + +/* resources aren't ready... */ +s48_value scxt_Set_Values(s48_value w, s48_value arg_list, s48_value n_args) { + ArgList a_list; + /* ... */ + return S48_UNSPECIFIC; +} + + + +/* resources aren't ready... */ +s48_value scxt_Get_Values(s48_value w, s48_value arg_list, s48_value n_args) { + /* ... */ +} + + + +s48_value scxt_Widget_Context(s48_value w) { + return SCXT_ENTER_CONTEXT(XtWidgetToApplicationContext(SCXT_EXTRACT_WIDGET(w))); +} + + + +s48_value scxt_Set_Sensitive(s48_value w, s48_value flag) { + XtSetSensitive(SCXT_EXTRACT_WIDGET(w), SCXT_EXTRACT_BOOLEAN(flag)); + return S48_UNSPECIFIC; +} + + + +s48_value scxt_Sensitive_P(s48_value w) { + return S48_ENTER_BOOLEAN(XtIsSensitive(SCXT_EXTRACT_WIDGET(w))); +} + + + +s48_value scxt_Window_To_Widget(s48_value Xwindow, s48_value Xdisplay) { + return SCXT_ENTER_WIDGET(XtWindowToWidget(SCX_EXTRACT_DISPLAY(Xdisplay), + SCX_EXTRACT_WINDOW(Xwindow))); +} + + + +s48_value scxt_Name_To_Widget(s48_value root_w, s48_value name) { + return SCXT_ENTER_WIDGET(XtNameToWindow (SCXT_EXTRACT_WIDGET(root_w), + s48_extract_string(name))); +} + + +s48_value scxt_Widget_Translate_Coordinates(s48_value w, s48_value x, + s48_value y) { + Position root_x, root_y; + XtTranslateCoords(SCXT_EXTRACT_WIDGET(w), (int)s48_extract_integer(x), + (int)s48_extract_integer(y), &root_x, &root_y); + return s48_cons(s48_enter_integer((int)root_x), + s48_enter_integer((int)root_y)); +} + + + +/* /* The GC-visit function for widgets. Visit the children of composite */ +/* * widgets and all the parents of a widget. */ +/* * Based on code contributed by Ken Fox . */ +/* */ */ + +/* #include */ +/* #include */ +/* #include */ +/* #undef XtIsComposite */ + +/* static Widget_Visit (root, func) Object *root; int (*func)(); { */ +/* Object obj; */ +/* Widget w = WIDGET(*root)->widget; */ + +/* if (WIDGET(*root)->free == 0 && XtIsComposite (w)) { */ +/* int i; */ +/* CompositeRec *comp = (CompositeRec *)w; */ + +/* for (i = 0; i < comp->composite.num_children; i++) { */ +/* obj = Find_Object (T_Widget, (GENERIC)0, Match_Xt_Obj, */ +/* comp->composite.children[i]); */ +/* if (TYPE(obj) == T_Widget) */ +/* func (&obj); */ +/* } */ +/* while (w = XtParent (w)) { */ +/* obj = Find_Object (T_Widget, (GENERIC)0, Match_Xt_Obj, w); */ +/* if (TYPE(obj) == T_Widget) */ +/* func (&obj); */ +/* } */ +/* } */ +/* } */ + +void scxt_init_widgets(void) { + S48_EXPORT_FUNCTION(scxt_Destroy_Widget); + S48_EXPORT_FUNCTION(scxt_Create_Shell); + S48_EXPORT_FUNCTION(scxt_Create_Widget); + S48_EXPORT_FUNCTION(scxt_Realize_Widget); + S48_EXPORT_FUNCTION(scxt_Unrealize_Widget); + S48_EXPORT_FUNCTION(scxt_Widget_Realized_P); + S48_EXPORT_FUNCTION(scxt_Widget_Display); + S48_EXPORT_FUNCTION(scxt_Widget_Parent); + S48_EXPORT_FUNCTION(scxt_Widget_Name); + S48_EXPORT_FUNCTION(scxt_Widget_To_Window); + S48_EXPORT_FUNCTION(scxt_Widget_Composite_P); + S48_EXPORT_FUNCTION(scxt_Manage_Children); + S48_EXPORT_FUNCTION(scxt_Unmanage_Children); + S48_EXPORT_FUNCTION(scxt_Widget_Managed_P); + S48_EXPORT_FUNCTION(scxt_Widget_Class); + S48_EXPORT_FUNCTION(scxt_Widget_Subclass_P); + S48_EXPORT_FUNCTION(scxt_Set_Mapped_When_Managed); + S48_EXPORT_FUNCTION(scxt_Map_Widget); + S48_EXPORT_FUNCTION(scxt_Unmap_Widget); + S48_EXPORT_FUNCTION(scxt_Set_Values); + S48_EXPORT_FUNCTION(scxt_Get_Values); + S48_EXPORT_FUNCTION(scxt_Widget_Context); + S48_EXPORT_FUNCTION(scxt_Set_Sensitive); + S48_EXPORT_FUNCTION(scxt_Widget_Sensitive_P); + S48_EXPORT_FUNCTION(scxt_Window_To_Widget); + S48_EXPORT_FUNCTION(scxt_Name_To_Widget); + S48_EXPORT_FUNCTION(scxt_Widget_Translate_Coordinates); +}