The control flow diverges somewhere after FlushUpdate... it seems to be this if.. in Text.c
3320 #ifndef OLDXAW 3321 if (XawTextSinkBeginPaint(ctx->text.sink) == False) 3322 #endif 3323 display_text = OldDisplayText; the condition differs because of: XawTextSinkBeginPaint in the working code, cclass->text_sink_class.extension->PreparePaint and DoPaint are NULL and display_text = OldDisplayText; the broken code has: (gdb) p cclass->text_sink_class.extension->BeginPaint $3 = (int (*)(Widget)) 0xb7dabe40 <BeginPaint> (gdb) p cclass->text_sink_class.extension->PreparePaint $4 = (void (*)(Widget, int, int, XawTextPosition, XawTextPosition,. int)) 0xb7d86770 <AsciiPreparePaint> (gdb) p cclass->text_sink_class.extension->DoPaint $5 = (void (*)(Widget)) 0xb7d84b90 <AsciiDoPaint> (gdb) p cclass->text_sink_class.extension->EndPaint $6 = (int (*)(Widget)) 0xb7dab920 <EndPaint> those get set in XawAsciiSinkClassPartInitialize in AsciiSink.c .extension gets set in: XawTextSinkClassPartInitialize in TextSink.c It's the TextSinkExtensionRec is /defined static/ in TextSink.c Therefore initializing a single non-intl textbox (by XawAsciiSinkClassPartInitialize) breaks all the intl boxes.