static void CallClassPartInit(WidgetClass ancestor, WidgetClass wc) { if (ancestor->core_class.superclass != NULL) { CallClassPartInit(ancestor->core_class.superclass, wc); } if (ancestor->core_class.class_part_initialize != NULL) { (*(ancestor->core_class.class_part_initialize)) (wc); } }
void XtInitializeWidgetClass(WidgetClass wc) { XtEnum inited; LOCK_PROCESS; if (wc->core_class.class_inited) { UNLOCK_PROCESS; return; } inited = 0x01; { WidgetClass pc; #define LeaveIfClass(c, d) if (pc == c) { inited = d; break; } for (pc = wc; pc; pc = pc->core_class.superclass) { LeaveIfClass(rectObjClass, 0x01 | RectObjClassFlag); LeaveIfClass(coreWidgetClass, 0x01 | RectObjClassFlag | WidgetClassFlag); LeaveIfClass(compositeWidgetClass, 0x01 | RectObjClassFlag | WidgetClassFlag | CompositeClassFlag); LeaveIfClass(constraintWidgetClass, 0x01 | RectObjClassFlag | WidgetClassFlag | CompositeClassFlag | ConstraintClassFlag); LeaveIfClass(shellWidgetClass, 0x01 | RectObjClassFlag | WidgetClassFlag | CompositeClassFlag | ShellClassFlag); LeaveIfClass(wmShellWidgetClass, 0x01 | RectObjClassFlag | WidgetClassFlag | CompositeClassFlag | ShellClassFlag | WMShellClassFlag); LeaveIfClass(topLevelShellWidgetClass, 0x01 | RectObjClassFlag | WidgetClassFlag | CompositeClassFlag | ShellClassFlag | WMShellClassFlag | TopLevelClassFlag); } #undef LeaveIfClass } if (wc->core_class.version != XtVersion && wc->core_class.version != XtVersionDontCheck) { String param[3]; String mismatch = "Widget class %s version mismatch (recompilation needed):\n widget %d vs. intrinsics %d."; String recompile = "Widget class %s must be re-compiled."; Cardinal num_params; param[0] = wc->core_class.class_name; param[1] = (String) wc->core_class.version; param[2] = (String) XtVersion; if (wc->core_class.version == (11 * 1000 + 5) || /* MIT X11R5 */ wc->core_class.version == (11 * 1000 + 4)) { /* MIT X11R4 */ if ((inited & WMShellClassFlag) && (sizeof(Boolean) != sizeof(char) || sizeof(Atom) != sizeof(Widget) || sizeof(Atom) != sizeof(String))) { num_params=3; XtWarningMsg("versionMismatch","widget",XtCXtToolkitError, mismatch, param, &num_params); num_params=1; XtErrorMsg("R4orR5versionMismatch","widget",XtCXtToolkitError, recompile, param, &num_params); } } else if (wc->core_class.version == (11 * 1000 + 3)) { /* MIT X11R3 */ if (inited & ShellClassFlag) { num_params=1; XtWarningMsg("r3versionMismatch","widget",XtCXtToolkitError, "Shell Widget class %s binary compiled for R3", param,&num_params); XtErrorMsg("R3versionMismatch","widget",XtCXtToolkitError, recompile, param, &num_params); } } else { num_params=3; XtWarningMsg("versionMismatch","widget",XtCXtToolkitError, mismatch, param, &num_params); if (wc->core_class.version == (2 * 1000 + 2)) /* MIT X11R2 */ { num_params=1; XtErrorMsg("r2versionMismatch","widget",XtCXtToolkitError, recompile, param, &num_params); } } } if ((wc->core_class.superclass != NULL) && (!(wc->core_class.superclass->core_class.class_inited))) XtInitializeWidgetClass(wc->core_class.superclass); if (wc->core_class.class_initialize != NULL) (*(wc->core_class.class_initialize))(); CallClassPartInit(wc, wc); wc->core_class.class_inited = inited; UNLOCK_PROCESS; }