removed Monitor->dc, unnecessary c2737b7b
Anselm R Garbe · 2008-02-18 17:08 1 file(s) · +124 −123
dwm.c +124 −123
117 117
} Regs;
118 118
119 119
typedef struct {
120 -
	int screen;
120 +
	int monitor;
121 121
	Window barwin;
122 122
	int sx, sy, sw, sh, wax, way, wah, waw;
123 -
	DC dc;
124 123
	Bool *seltags;
125 124
	Bool *prevtags;
126 125
	Layout *layout;
156 155
void focusnext(const char *arg);
157 156
void focusprev(const char *arg);
158 157
Client *getclient(Window w);
159 -
unsigned long getcolor(const char *colstr, int screen);
158 +
unsigned long getcolor(const char *colstr);
160 159
long getstate(Window w);
161 160
Bool gettextprop(Window w, Atom atom, char *text, unsigned int size);
162 161
void grabbuttons(Client *c, Bool focused);
163 162
void grabkeys(void);
164 163
unsigned int idxoftag(const char *tag);
165 -
void initfont(Monitor*, const char *fontstr);
164 +
void initfont(const char *fontstr);
166 165
Bool isoccupied(unsigned int monitor, unsigned int t);
167 166
Bool isprotodel(Client *c);
168 167
Bool isurgent(unsigned int monitor, unsigned int t);
188 187
void setup(void);
189 188
void spawn(const char *arg);
190 189
void tag(const char *arg);
191 -
unsigned int textnw(Monitor*, const char *text, unsigned int len);
192 -
unsigned int textw(Monitor*, const char *text);
190 +
unsigned int textnw(const char *text, unsigned int len);
191 +
unsigned int textw(const char *text);
193 192
void tile(void);
194 193
void togglebar(const char *arg);
195 194
void togglefloating(const char *arg);
216 215
char stext[256];
217 216
int mcount = 1;
218 217
int selmonitor = 0;
218 +
int screen;
219 219
int (*xerrorxlib)(Display *, XErrorEvent *);
220 220
unsigned int bh, bpos;
221 221
unsigned int blw = 0;
343 343
	if(ev->window == m->barwin) {
344 344
		x = 0;
345 345
		for(i = 0; i < LENGTH(tags); i++) {
346 -
			x += textw(m, tags[i]);
346 +
			x += textw(tags[i]);
347 347
			if(ev->x < x) {
348 348
				if(ev->button == Button1) {
349 349
					if(ev->state & MODKEY)
408 408
		unban(stack);
409 409
		unmanage(stack);
410 410
	}
411 -
	for(i = 0; i < mcount; i++) {
412 -
		Monitor *m = &monitors[i];
413 -
		if(m->dc.font.set)
414 -
			XFreeFontSet(dpy, m->dc.font.set);
415 -
		else
416 -
			XFreeFont(dpy, m->dc.font.xfont);
417 -
		XUngrabKey(dpy, AnyKey, AnyModifier, root);
418 -
		XFreePixmap(dpy, m->dc.drawable);
419 -
		XFreeGC(dpy, m->dc.gc);
420 -
		XDestroyWindow(dpy, m->barwin);
421 -
		XFreeCursor(dpy, cursor[CurNormal]);
422 -
		XFreeCursor(dpy, cursor[CurResize]);
423 -
		XFreeCursor(dpy, cursor[CurMove]);
424 -
		XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
425 -
		XSync(dpy, False);
426 -
	}
411 +
	if(dc.font.set)
412 +
		XFreeFontSet(dpy, dc.font.set);
413 +
	else
414 +
		XFreeFont(dpy, dc.font.xfont);
415 +
416 +
	XUngrabKey(dpy, AnyKey, AnyModifier, root);
417 +
	XFreePixmap(dpy, dc.drawable);
418 +
	XFreeGC(dpy, dc.gc);
419 +
	XFreeCursor(dpy, cursor[CurNormal]);
420 +
	XFreeCursor(dpy, cursor[CurResize]);
421 +
	XFreeCursor(dpy, cursor[CurMove]);
422 +
	for(i = 0; i < mcount; i++)
423 +
		XDestroyWindow(dpy, monitors[i].barwin);
424 +
	XSync(dpy, False);
425 +
	XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
427 426
}
428 427
429 428
void
476 475
	Monitor *m = &monitors[selmonitor];
477 476
478 477
	if(ev->window == root && (ev->width != m->sw || ev->height != m->sh)) {
478 +
		/* TODO -- update Xinerama dimensions here */
479 479
		m->sw = ev->width;
480 480
		m->sh = ev->height;
481 481
		XFreePixmap(dpy, dc.drawable);
482 -
		dc.drawable = XCreatePixmap(dpy, root, m->sw, bh, DefaultDepth(dpy, m->screen));
482 +
		dc.drawable = XCreatePixmap(dpy, root, DisplayWidth(root, screen), bh, DefaultDepth(dpy, screen));
483 483
		XResizeWindow(dpy, m->barwin, m->sw, bh);
484 484
		updatebarpos(m);
485 485
		arrange();
566 566
567 567
	for(i = 0; i < mcount; i++) {
568 568
		Monitor *m = &monitors[i];
569 -
		m->dc.x = 0;
569 +
		dc.x = 0;
570 570
		for(c = stack; c && !isvisible(c, i); c = c->snext);
571 571
		fprintf(stderr, "m%d %s\n", i, c ? c->name : "NIL");
572 572
		for(j = 0; j < LENGTH(tags); j++) {
573 -
			m->dc.w = textw(m, tags[j]);
573 +
			dc.w = textw(tags[j]);
574 574
			if(m->seltags[j]) {
575 -
				drawtext(m, tags[j], m->dc.sel, isurgent(i, j));
575 +
				drawtext(m, tags[j], dc.sel, isurgent(i, j));
576 576
				drawsquare(m, c && c->tags[j] && c->monitor == i,
577 -
						isoccupied(i, j), isurgent(i, j), m->dc.sel);
577 +
						isoccupied(i, j), isurgent(i, j), dc.sel);
578 578
			}
579 579
			else {
580 -
				drawtext(m, tags[j], m->dc.norm, isurgent(i, j));
580 +
				drawtext(m, tags[j], dc.norm, isurgent(i, j));
581 581
				drawsquare(m, c && c->tags[j] && c->monitor == i,
582 -
						isoccupied(i, j), isurgent(i, j), m->dc.norm);
582 +
						isoccupied(i, j), isurgent(i, j), dc.norm);
583 583
			}
584 -
			m->dc.x += m->dc.w;
584 +
			dc.x += dc.w;
585 585
		}
586 -
		m->dc.w = blw;
587 -
		drawtext(m, m->layout->symbol, m->dc.norm, False);
588 -
		x = m->dc.x + m->dc.w;
586 +
		dc.w = blw;
587 +
		drawtext(m, m->layout->symbol, dc.norm, False);
588 +
		x = dc.x + dc.w;
589 589
		if(i == selmonitor) {
590 -
			m->dc.w = textw(m, stext);
591 -
			m->dc.x = m->sw - m->dc.w;
592 -
			if(m->dc.x < x) {
593 -
				m->dc.x = x;
594 -
				m->dc.w = m->sw - x;
590 +
			dc.w = textw(stext);
591 +
			dc.x = m->sw - dc.w;
592 +
			if(dc.x < x) {
593 +
				dc.x = x;
594 +
				dc.w = m->sw - x;
595 595
			}
596 -
			drawtext(m, stext, m->dc.norm, False);
596 +
			drawtext(m, stext, dc.norm, False);
597 597
		}
598 598
		else
599 -
			m->dc.x = m->sw;
600 -
		if((m->dc.w = m->dc.x - x) > bh) {
601 -
			m->dc.x = x;
599 +
			dc.x = m->sw;
600 +
		if((dc.w = dc.x - x) > bh) {
601 +
			dc.x = x;
602 602
			if(c) {
603 -
				drawtext(m, c->name, m->dc.sel, False);
604 -
				drawsquare(m, False, c->isfloating, False, m->dc.sel);
603 +
				drawtext(m, c->name, dc.sel, False);
604 +
				drawsquare(m, False, c->isfloating, False, dc.sel);
605 605
			}
606 606
			else
607 -
				drawtext(m, NULL, m->dc.norm, False);
607 +
				drawtext(m, NULL, dc.norm, False);
608 608
		}
609 -
		XCopyArea(dpy, m->dc.drawable, m->barwin, m->dc.gc, 0, 0, m->sw, bh, 0, 0);
609 +
		XCopyArea(dpy, dc.drawable, m->barwin, dc.gc, 0, 0, m->sw, bh, 0, 0);
610 610
		XSync(dpy, False);
611 611
	}
612 612
}
615 615
drawsquare(Monitor *m, Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]) {
616 616
	int x;
617 617
	XGCValues gcv;
618 -
	XRectangle r = { m->dc.x, m->dc.y, m->dc.w, m->dc.h };
618 +
	XRectangle r = { dc.x, dc.y, dc.w, dc.h };
619 619
620 620
	gcv.foreground = col[invert ? ColBG : ColFG];
621 -
	XChangeGC(dpy, m->dc.gc, GCForeground, &gcv);
622 -
	x = (m->dc.font.ascent + m->dc.font.descent + 2) / 4;
623 -
	r.x = m->dc.x + 1;
624 -
	r.y = m->dc.y + 1;
621 +
	XChangeGC(dpy, dc.gc, GCForeground, &gcv);
622 +
	x = (dc.font.ascent + dc.font.descent + 2) / 4;
623 +
	r.x = dc.x + 1;
624 +
	r.y = dc.y + 1;
625 625
	if(filled) {
626 626
		r.width = r.height = x + 1;
627 -
		XFillRectangles(dpy, m->dc.drawable, m->dc.gc, &r, 1);
627 +
		XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
628 628
	}
629 629
	else if(empty) {
630 630
		r.width = r.height = x;
631 -
		XDrawRectangles(dpy, m->dc.drawable, m->dc.gc, &r, 1);
631 +
		XDrawRectangles(dpy, dc.drawable, dc.gc, &r, 1);
632 632
	}
633 633
}
634 634
637 637
	int x, y, w, h;
638 638
	static char buf[256];
639 639
	unsigned int len, olen;
640 -
	XRectangle r = { m->dc.x, m->dc.y, m->dc.w, m->dc.h };
640 +
	XRectangle r = { dc.x, dc.y, dc.w, dc.h };
641 641
642 -
	XSetForeground(dpy, m->dc.gc, col[invert ? ColFG : ColBG]);
643 -
	XFillRectangles(dpy, m->dc.drawable, m->dc.gc, &r, 1);
642 +
	XSetForeground(dpy, dc.gc, col[invert ? ColFG : ColBG]);
643 +
	XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
644 644
	if(!text)
645 645
		return;
646 646
	w = 0;
649 649
		len = sizeof buf - 1;
650 650
	memcpy(buf, text, len);
651 651
	buf[len] = 0;
652 -
	h = m->dc.font.ascent + m->dc.font.descent;
653 -
	y = m->dc.y + (m->dc.h / 2) - (h / 2) + m->dc.font.ascent;
654 -
	x = m->dc.x + (h / 2);
652 +
	h = dc.font.ascent + dc.font.descent;
653 +
	y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent;
654 +
	x = dc.x + (h / 2);
655 655
	/* shorten text if necessary */
656 -
	while(len && (w = textnw(m, buf, len)) > m->dc.w - h)
656 +
	while(len && (w = textnw(buf, len)) > dc.w - h)
657 657
		buf[--len] = 0;
658 658
	if(len < olen) {
659 659
		if(len > 1)
663 663
		if(len > 3)
664 664
			buf[len - 3] = '.';
665 665
	}
666 -
	if(w > m->dc.w)
666 +
	if(w > dc.w)
667 667
		return; /* too long */
668 -
	XSetForeground(dpy, m->dc.gc, col[invert ? ColBG : ColFG]);
669 -
	if(m->dc.font.set)
670 -
		XmbDrawString(dpy, m->dc.drawable, m->dc.font.set, m->dc.gc, x, y, buf, len);
668 +
	XSetForeground(dpy, dc.gc, col[invert ? ColBG : ColFG]);
669 +
	if(dc.font.set)
670 +
		XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len);
671 671
	else
672 -
		XDrawString(dpy, m->dc.drawable, m->dc.gc, x, y, buf, len);
672 +
		XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len);
673 673
}
674 674
675 675
void *
740 740
		for(c = stack; c && !isvisible(c, c->monitor); c = c->snext);
741 741
	if(sel && sel != c) {
742 742
		grabbuttons(sel, False);
743 -
		XSetWindowBorder(dpy, sel->win, monitors[sel->monitor].dc.norm[ColBorder]);
743 +
		XSetWindowBorder(dpy, sel->win, dc.norm[ColBorder]);
744 744
	}
745 745
	if(c) {
746 746
		detachstack(c);
750 750
	sel = c;
751 751
	drawbar();
752 752
	if(c) {
753 -
		XSetWindowBorder(dpy, c->win, m->dc.sel[ColBorder]);
753 +
		XSetWindowBorder(dpy, c->win, dc.sel[ColBorder]);
754 754
		XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
755 755
		selmonitor = c->monitor;
756 756
	}
809 809
}
810 810
811 811
unsigned long
812 -
getcolor(const char *colstr, int screen) {
812 +
getcolor(const char *colstr) {
813 813
	Colormap cmap = DefaultColormap(dpy, screen);
814 814
	XColor color;
815 815
937 937
}
938 938
939 939
void
940 -
initfont(Monitor *m, const char *fontstr) {
940 +
initfont(const char *fontstr) {
941 941
	char *def, **missing;
942 942
	int i, n;
943 943
944 944
	missing = NULL;
945 -
	if(m->dc.font.set)
946 -
		XFreeFontSet(dpy, m->dc.font.set);
947 -
	m->dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def);
945 +
	if(dc.font.set)
946 +
		XFreeFontSet(dpy, dc.font.set);
947 +
	dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def);
948 948
	if(missing) {
949 949
		while(n--)
950 950
			fprintf(stderr, "dwm: missing fontset: %s\n", missing[n]);
951 951
		XFreeStringList(missing);
952 952
	}
953 -
	if(m->dc.font.set) {
953 +
	if(dc.font.set) {
954 954
		XFontSetExtents *font_extents;
955 955
		XFontStruct **xfonts;
956 956
		char **font_names;
957 -
		m->dc.font.ascent = m->dc.font.descent = 0;
958 -
		font_extents = XExtentsOfFontSet(m->dc.font.set);
959 -
		n = XFontsOfFontSet(m->dc.font.set, &xfonts, &font_names);
960 -
		for(i = 0, m->dc.font.ascent = 0, m->dc.font.descent = 0; i < n; i++) {
961 -
			if(m->dc.font.ascent < (*xfonts)->ascent)
962 -
				m->dc.font.ascent = (*xfonts)->ascent;
963 -
			if(m->dc.font.descent < (*xfonts)->descent)
964 -
				m->dc.font.descent = (*xfonts)->descent;
957 +
		dc.font.ascent = dc.font.descent = 0;
958 +
		font_extents = XExtentsOfFontSet(dc.font.set);
959 +
		n = XFontsOfFontSet(dc.font.set, &xfonts, &font_names);
960 +
		for(i = 0, dc.font.ascent = 0, dc.font.descent = 0; i < n; i++) {
961 +
			if(dc.font.ascent < (*xfonts)->ascent)
962 +
				dc.font.ascent = (*xfonts)->ascent;
963 +
			if(dc.font.descent < (*xfonts)->descent)
964 +
				dc.font.descent = (*xfonts)->descent;
965 965
			xfonts++;
966 966
		}
967 967
	}
968 968
	else {
969 -
		if(m->dc.font.xfont)
970 -
			XFreeFont(dpy, m->dc.font.xfont);
971 -
		m->dc.font.xfont = NULL;
972 -
		if(!(m->dc.font.xfont = XLoadQueryFont(dpy, fontstr))
973 -
		&& !(m->dc.font.xfont = XLoadQueryFont(dpy, "fixed")))
969 +
		if(dc.font.xfont)
970 +
			XFreeFont(dpy, dc.font.xfont);
971 +
		dc.font.xfont = NULL;
972 +
		if(!(dc.font.xfont = XLoadQueryFont(dpy, fontstr))
973 +
		&& !(dc.font.xfont = XLoadQueryFont(dpy, "fixed")))
974 974
			eprint("error, cannot load font: '%s'\n", fontstr);
975 -
		m->dc.font.ascent = m->dc.font.xfont->ascent;
976 -
		m->dc.font.descent = m->dc.font.xfont->descent;
975 +
		dc.font.ascent = dc.font.xfont->ascent;
976 +
		dc.font.descent = dc.font.xfont->descent;
977 977
	}
978 -
	m->dc.font.height = m->dc.font.ascent + m->dc.font.descent;
978 +
	dc.font.height = dc.font.ascent + dc.font.descent;
979 979
}
980 980
981 981
Bool
1101 1101
	}
1102 1102
	wc.border_width = c->border;
1103 1103
	XConfigureWindow(dpy, w, CWBorderWidth, &wc);
1104 -
	XSetWindowBorder(dpy, w, m->dc.norm[ColBorder]);
1104 +
	XSetWindowBorder(dpy, w, dc.norm[ColBorder]);
1105 1105
	configure(c); /* propagates border_width, if size doesn't change */
1106 1106
	updatesizehints(c);
1107 1107
	XSelectInput(dpy, w, EnterWindowMask | FocusChangeMask | PropertyChangeMask | StructureNotifyMask);
1549 1549
1550 1550
void
1551 1551
setup(void) {
1552 -
	unsigned int i, j, k;
1552 +
	unsigned int i;
1553 1553
	Monitor *m;
1554 1554
	XSetWindowAttributes wa;
1555 1555
	XineramaScreenInfo *info = NULL;
1573 1573
		info = XineramaQueryScreens(dpy, &mcount);
1574 1574
	monitors = emallocz(mcount * sizeof(Monitor));
1575 1575
1576 -
	root = DefaultRootWindow(dpy);
1576 +
	screen = DefaultScreen(dpy);
1577 +
	root = RootWindow(dpy, screen);
1578 +
1579 +
	/* init appearance */
1580 +
	dc.norm[ColBorder] = getcolor(NORMBORDERCOLOR);
1581 +
	dc.norm[ColBG] = getcolor(NORMBGCOLOR);
1582 +
	dc.norm[ColFG] = getcolor(NORMFGCOLOR);
1583 +
	dc.sel[ColBorder] = getcolor(SELBORDERCOLOR);
1584 +
	dc.sel[ColBG] = getcolor(SELBGCOLOR);
1585 +
	dc.sel[ColFG] = getcolor(SELFGCOLOR);
1586 +
	initfont(FONT);
1587 +
	dc.h = bh = dc.font.height + 2;
1588 +
	dc.drawable = XCreatePixmap(dpy, root, DisplayWidth(dpy, screen), bh, DefaultDepth(dpy, screen));
1589 +
	dc.gc = XCreateGC(dpy, root, 0, 0);
1590 +
	XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
1591 +
	if(!dc.font.set)
1592 +
		XSetFont(dpy, dc.gc, dc.font.xfont->fid);
1577 1593
1594 +
	for(blw = i = 0; i < LENGTH(layouts); i++) {
1595 +
		i = textw(layouts[i].symbol);
1596 +
		if(i > blw)
1597 +
			blw = i;
1598 +
	}
1578 1599
	for(i = 0; i < mcount; i++) {
1579 1600
		/* init geometry */
1580 1601
		m = &monitors[i];
1581 1602
1582 -
		m->screen = isxinerama ? 0 : i;
1603 +
		m->monitor = i;
1583 1604
1584 1605
		if (mcount != 1 && isxinerama) {
1585 1606
			m->sx = info[i].x_org;
1591 1612
		else {
1592 1613
			m->sx = 0;
1593 1614
			m->sy = 0;
1594 -
			m->sw = DisplayWidth(dpy, m->screen);
1595 -
			m->sh = DisplayHeight(dpy, m->screen);
1615 +
			m->sw = DisplayWidth(dpy, screen);
1616 +
			m->sh = DisplayHeight(dpy, screen);
1596 1617
		}
1597 1618
1598 1619
		m->seltags = emallocz(sizeof initags);
1601 1622
		memcpy(m->seltags, initags, sizeof initags);
1602 1623
		memcpy(m->prevtags, initags, sizeof initags);
1603 1624
1604 -
		/* init appearance */
1605 -
		m->dc.norm[ColBorder] = getcolor(NORMBORDERCOLOR, m->screen);
1606 -
		m->dc.norm[ColBG] = getcolor(NORMBGCOLOR, m->screen);
1607 -
		m->dc.norm[ColFG] = getcolor(NORMFGCOLOR, m->screen);
1608 -
		m->dc.sel[ColBorder] = getcolor(SELBORDERCOLOR, m->screen);
1609 -
		m->dc.sel[ColBG] = getcolor(SELBGCOLOR, m->screen);
1610 -
		m->dc.sel[ColFG] = getcolor(SELFGCOLOR, m->screen);
1611 -
		initfont(m, FONT);
1612 -
		m->dc.h = bh = m->dc.font.height + 2;
1613 -
1614 1625
		/* init layouts */
1615 1626
		m->mwfact = MWFACT;
1616 1627
		m->layout = &layouts[0];
1617 -
		for(blw = k = 0; k < LENGTH(layouts); k++) {
1618 -
			j = textw(m, layouts[k].symbol);
1619 -
			if(j > blw)
1620 -
				blw = j;
1621 -
		}
1622 1628
1623 1629
		// TODO: bpos per screen?
1624 1630
		bpos = BARPOS;
1628 1634
1629 1635
		/* init bars */
1630 1636
		m->barwin = XCreateWindow(dpy, root, m->sx, m->sy, m->sw, bh, 0,
1631 -
				DefaultDepth(dpy, m->screen), CopyFromParent, DefaultVisual(dpy, m->screen),
1637 +
				DefaultDepth(dpy, screen), CopyFromParent, DefaultVisual(dpy, screen),
1632 1638
				CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa);
1633 1639
		XDefineCursor(dpy, m->barwin, cursor[CurNormal]);
1634 1640
		updatebarpos(m);
1635 1641
		XMapRaised(dpy, m->barwin);
1636 1642
		strcpy(stext, "dwm-"VERSION);
1637 -
		m->dc.drawable = XCreatePixmap(dpy, root, m->sw, bh, DefaultDepth(dpy, m->screen));
1638 -
		m->dc.gc = XCreateGC(dpy, root, 0, 0);
1639 -
		XSetLineAttributes(dpy, m->dc.gc, 1, LineSolid, CapButt, JoinMiter);
1640 -
		if(!m->dc.font.set)
1641 -
			XSetFont(dpy, m->dc.gc, m->dc.font.xfont->fid);
1642 1643
1643 1644
		/* EWMH support per monitor */
1644 1645
		XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32,
1700 1701
}
1701 1702
1702 1703
unsigned int
1703 -
textnw(Monitor *m, const char *text, unsigned int len) {
1704 +
textnw(const char *text, unsigned int len) {
1704 1705
	XRectangle r;
1705 1706
1706 -
	if(m->dc.font.set) {
1707 -
		XmbTextExtents(m->dc.font.set, text, len, NULL, &r);
1707 +
	if(dc.font.set) {
1708 +
		XmbTextExtents(dc.font.set, text, len, NULL, &r);
1708 1709
		return r.width;
1709 1710
	}
1710 -
	return XTextWidth(m->dc.font.xfont, text, len);
1711 +
	return XTextWidth(dc.font.xfont, text, len);
1711 1712
}
1712 1713
1713 1714
unsigned int
1714 -
textw(Monitor *m, const char *text) {
1715 -
	return textnw(m, text, strlen(text)) + m->dc.font.height;
1715 +
textw(const char *text) {
1716 +
	return textnw(text, strlen(text)) + dc.font.height;
1716 1717
}
1717 1718
1718 1719
void