Пример #1
0
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);
    }
}
Пример #2
0
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;
}