if (c.Canvas(this, null) == null) { c.Canvas(this, "normal"); }
vWindow(String title, String mode, vDescriptor args[]) throws IOException {    int w = 480;	// default initial width (later reset depending on font)    int h = 156;	// default initial height    c = new wCanvas(this, title, w, h);    wnum = ++wcount;    a = c.getGraphics();    b = c.i.getGraphics();    gnum = ++gcount;    // set the usual defaults    clipping = false;    dx = 0;    dy = 0;    gamma = iConfig.Gamma;    fg = wColor.Black;    bg = wColor.White;    revatt = vSoff;    Font(vString.New(iConfig.FontName));    wAttrib alist[] = wAttrib.parseAtts(args, 2);  // verify parsing first    c.defer_image = true;			// set flag to defer image load    for (int i = 0; i < alist.length; i++) {	// apply attributes	wAttrib a = alist[i];	if (a.val != null) {	    if (a.set(this) == null) {		// if couldn't set attribute		this.close();		throw new IOException();	// indicate failure	    }	}    }    c.defconfig(this);		// set window size, if not set by attributes    c.tty.Row(this, "1");	// set text cursor position    c.tty.Col(this, "1");    // unless canvas attribute was specified, make visible now    if (c.Canvas(this, null) == null) {	c.Canvas(this, "normal");    }    // clear window and backing store, including out-of-bounds area, with new bg    EraseArea(0, 0, Integer.MAX_VALUE, Integer.MAX_VALUE);    // now (after initializing background) load deferred image    if (c.deferred_image != null) {    	CopyImage(c.deferred_image, -dx, -dy);	c.deferred_image.flush();	c.deferred_image = null;    }    c.defer_image = false;    this.flush();    setCurrent(this);		// remember as "current" window}