Browse Source

Another.

Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Ronald G. Minnich 8 years ago
parent
commit
ea6c3d9d39

+ 33 - 33
sys/src/libcontrol/box.c

@@ -59,7 +59,7 @@ boxkey(Control *c, Rune *rp)
 	Box *b;
 
 	b = (Box*)c;
-	chanprint(b->event, "%q: key 0x%x", b->name, rp[0]);
+	chanprint(b->Control.event, "%q: key 0x%x", b->Control.name, rp[0]);
 }
 
 static void
@@ -68,8 +68,8 @@ boxmouse(Control *c, Mouse *m)
 	Box *b;
 
 	b = (Box*)c;
-	if (ptinrect(m->xy,b->rect))
-		chanprint(b->event, "%q: mouse %P %d %ld", b->name,
+	if (ptinrect(m->xy,b->Control.rect))
+		chanprint(b->Control.event, "%q: mouse %P %d %ld", b->Control.name,
 			m->xy, m->buttons, m->msec);
 }
 
@@ -85,16 +85,16 @@ boxshow(Box *b)
 	Image *i;
 	Rectangle r;
 
-	if(b->hidden)
+	if(b->Control.hidden)
 		return;
 	if(b->border > 0){
-		border(b->screen, b->rect, b->border, b->bordercolor->image, ZP);
-		r = insetrect(b->rect, b->border);
+		border(b->Control.screen, b->Control.rect, b->border, b->bordercolor->image, ZP);
+		r = insetrect(b->Control.rect, b->border);
 	}else
-		r = b->rect;
+		r = b->Control.rect;
 	i = b->image->image;
 	/* BUG: ALIGNMENT AND CLIPPING */
-	draw(b->screen, r, i, nil, ZP);
+	draw(b->Control.screen, r, i, nil, ZP);
 }
 
 static void
@@ -108,67 +108,67 @@ boxctl(Control *c, CParse *cp)
 	cmd = _ctllookup(cp->args[0], cmds, nelem(cmds));
 	switch(cmd){
 	default:
-		ctlerror("%q: unrecognized message '%s'", b->name, cp->str);
+		ctlerror("%q: unrecognized message '%s'", b->Control.name, cp->str);
 		break;
 	case EAlign:
-		_ctlargcount(b, cp, 2);
+		_ctlargcount(&b->Control, cp, 2);
 		b->align = _ctlalignment(cp->args[1]);
 		break;
 	case EBorder:
-		_ctlargcount(b, cp, 2);
+		_ctlargcount(&b->Control, cp, 2);
 		if(cp->iargs[1] < 0)
-			ctlerror("%q: bad border: %c", b->name, cp->str);
+			ctlerror("%q: bad border: %c", b->Control.name, cp->str);
 		b->border = cp->iargs[1];
 		break;
 	case EBordercolor:
-		_ctlargcount(b, cp, 2);
-		_setctlimage(b, &b->bordercolor, cp->args[1]);
+		_ctlargcount(&b->Control, cp, 2);
+		_setctlimage(&b->Control, &b->bordercolor, cp->args[1]);
 		break;
 	case EFocus:
-		_ctlargcount(b, cp, 2);
-		chanprint(b->event, "%q: focus %s", b->name, cp->args[1]);
+		_ctlargcount(&b->Control, cp, 2);
+		chanprint(b->Control.event, "%q: focus %s", b->Control.name, cp->args[1]);
 		break;
 	case EHide:
-		_ctlargcount(b, cp, 1);
-		b->hidden = 1;
+		_ctlargcount(&b->Control, cp, 1);
+		b->Control.hidden = 1;
 		break;
 	case EImage:
-		_ctlargcount(b, cp, 2);
-		_setctlimage(b, &b->image, cp->args[1]);
+		_ctlargcount(&b->Control, cp, 2);
+		_setctlimage(&b->Control, &b->image, cp->args[1]);
 		break;
 	case ERect:
-		_ctlargcount(b, cp, 5);
+		_ctlargcount(&b->Control, cp, 5);
 		r.min.x = cp->iargs[1];
 		r.min.y = cp->iargs[2];
 		r.max.x = cp->iargs[3];
 		r.max.y = cp->iargs[4];
 		if(Dx(r)<0 || Dy(r)<0)
-			ctlerror("%q: bad rectangle: %s", b->name, cp->str);
-		b->rect = r;
+			ctlerror("%q: bad rectangle: %s", b->Control.name, cp->str);
+		b->Control.rect = r;
 		break;
 	case EReveal:
-		_ctlargcount(b, cp, 1);
-		b->hidden = 0;
+		_ctlargcount(&b->Control, cp, 1);
+		b->Control.hidden = 0;
 		boxshow(b);
 		break;
 	case EShow:
-		_ctlargcount(b, cp, 1);
+		_ctlargcount(&b->Control, cp, 1);
 		boxshow(b);
 		break;
 	case ESize:
 		if (cp->nargs == 3)
 			r.max = Pt(0x7fffffff, 0x7fffffff);
 		else{
-			_ctlargcount(b, cp, 5);
+			_ctlargcount(&b->Control, cp, 5);
 			r.max.x = cp->iargs[3];
 			r.max.y = cp->iargs[4];
 		}
 		r.min.x = cp->iargs[1];
 		r.min.y = cp->iargs[2];
 		if(r.min.x<=0 || r.min.y<=0 || r.max.x<=0 || r.max.y<=0 || r.max.x < r.min.x || r.max.y < r.min.y)
-			ctlerror("%q: bad sizes: %s", b->name, cp->str);
-		b->size.min = r.min;
-		b->size.max = r.max;
+			ctlerror("%q: bad sizes: %s", b->Control.name, cp->str);
+		b->Control.size.min = r.min;
+		b->Control.size.max = r.max;
 		break;
 	}
 }
@@ -183,8 +183,8 @@ createbox(Controlset *cs, char *name)
 	b->bordercolor = _getctlimage("black");
 	b->align = Aupperleft;
 	b->key = boxkey;
-	b->mouse = boxmouse;
-	b->ctl = boxctl;
-	b->exit = boxfree;
+	b->Control.mouse = boxmouse;
+	b->Control.ctl = boxctl;
+	b->Control.exit = boxfree;
 	return (Control *)b;
 }

+ 42 - 42
sys/src/libcontrol/button.c

@@ -89,18 +89,18 @@ buttonshow(Button *b)
 {
 	Rectangle r;
 
-	if (b->hidden)
+	if (b->Control.hidden)
 		return;
-	r = b->rect;
+	r = b->Control.rect;
 	if(b->border > 0){
-		border(b->screen, r, b->border, b->bordercolor->image, ZP);
-		r = insetrect(b->rect, b->border);
+		border(b->Control.screen, r, b->border, b->bordercolor->image, ZP);
+		r = insetrect(b->Control.rect, b->border);
 	}
-	draw(b->screen, r, b->image->image, nil, b->image->image->r.min);
+	draw(b->Control.screen, r, b->image->image, nil, b->image->image->r.min);
 	if(b->off)
-		draw(b->screen, r, b->pale->image, b->mask->image, b->mask->image->r.min);
+		draw(b->Control.screen, r, b->pale->image, b->mask->image, b->mask->image->r.min);
 	else if(b->pressed)
-		draw(b->screen, r, b->light->image, b->mask->image, b->mask->image->r.min);
+		draw(b->Control.screen, r, b->light->image, b->mask->image, b->mask->image->r.min);
 	b->lastshow = b->pressed;
 	flushimage(display, 1);
 }
@@ -113,7 +113,7 @@ buttonmouse(Control *c, Mouse *m)
 	b = (Button*)c;
 
 	if(m->buttons&7) {
-		if (ptinrect(m->xy,b->rect)) {
+		if (ptinrect(m->xy,b->Control.rect)) {
 			if (b->off) {
 				b->off = 0;
 				buttonshow(b);
@@ -134,8 +134,8 @@ buttonmouse(Control *c, Mouse *m)
 				b->pressed = m->buttons & 7;
 			buttonshow(b);
 		}else	/* generate event on button up */
-			if (ptinrect(m->xy,b->rect))
-				chanprint(b->event, b->format, b->name, b->pressed);
+			if (ptinrect(m->xy,b->Control.rect))
+				chanprint(b->Control.event, b->Control.format, b->Control.name, b->pressed);
 			else {
 				b->off = 0;
 				b->pressed = b->prepress;
@@ -156,91 +156,91 @@ buttonctl(Control *c, CParse *cp)
 	cmd = _ctllookup(cp->args[0], cmds, nelem(cmds));
 	switch(cmd){
 	default:
-		ctlerror("%q: unrecognized message '%s'", b->name, cp->str);
+		ctlerror("%q: unrecognized message '%s'", b->Control.name, cp->str);
 		break;
 	case EAlign:
-		_ctlargcount(b, cp, 2);
+		_ctlargcount(&b->Control, cp, 2);
 		b->align = _ctlalignment(cp->args[1]);
 		b->lastshow = -1;	/* force redraw */
 		break;
 	case EBorder:
-		_ctlargcount(b, cp, 2);
+		_ctlargcount(&b->Control, cp, 2);
 		b->border = cp->iargs[1];
 		b->lastshow = -1;	/* force redraw */
 		break;
 	case EBordercolor:
-		_ctlargcount(b, cp, 2);
-		_setctlimage(b, &b->bordercolor, cp->args[1]);
+		_ctlargcount(&b->Control, cp, 2);
+		_setctlimage(&b->Control, &b->bordercolor, cp->args[1]);
 		b->lastshow = -1;	/* force redraw */
 		break;
 	case EFocus:
 		/* ignore focus change */
 		break;
 	case EFormat:
-		_ctlargcount(b, cp, 2);
-		b->format = ctlstrdup(cp->args[1]);
+		_ctlargcount(&b->Control, cp, 2);
+		b->Control.format = ctlstrdup(cp->args[1]);
 		break;
 	case EHide:
-		_ctlargcount(b, cp, 1);
-		b->hidden = 1;
+		_ctlargcount(&b->Control, cp, 1);
+		b->Control.hidden = 1;
 		break;
 	case EImage:
-		_ctlargcount(b, cp, 2);
-		_setctlimage(b, &b->image, cp->args[1]);
+		_ctlargcount(&b->Control, cp, 2);
+		_setctlimage(&b->Control, &b->image, cp->args[1]);
 		b->lastshow = -1;	/* force redraw */
 		break;
 	case ELight:
-		_ctlargcount(b, cp, 2);
-		_setctlimage(b, &b->light, cp->args[1]);
+		_ctlargcount(&b->Control, cp, 2);
+		_setctlimage(&b->Control, &b->light, cp->args[1]);
 		b->lastshow = -1;	/* force redraw */
 		break;
 	case EMask:
-		_ctlargcount(b, cp, 2);
-		_setctlimage(b, &b->mask, cp->args[1]);
+		_ctlargcount(&b->Control, cp, 2);
+		_setctlimage(&b->Control, &b->mask, cp->args[1]);
 		b->lastshow = -1;	/* force redraw */
 		break;
 	case EPale:
-		_ctlargcount(b, cp, 2);
-		_setctlimage(b, &b->pale, cp->args[1]);
+		_ctlargcount(&b->Control, cp, 2);
+		_setctlimage(&b->Control, &b->pale, cp->args[1]);
 		b->lastshow = -1;	/* force redraw */
 		break;
 	case ERect:
-		_ctlargcount(b, cp, 5);
+		_ctlargcount(&b->Control, cp, 5);
 		r.min.x = cp->iargs[1];
 		r.min.y = cp->iargs[2];
 		r.max.x = cp->iargs[3];
 		r.max.y = cp->iargs[4];
 		if(Dx(r)<0 || Dy(r)<0)
-			ctlerror("%q: bad rectangle: %s", b->name, cp->str);
-		b->rect = r;
+			ctlerror("%q: bad rectangle: %s", b->Control.name, cp->str);
+		b->Control.rect = r;
 		b->lastshow = -1;	/* force redraw */
 		break;
 	case EReveal:
-		_ctlargcount(b, cp, 1);
-		b->hidden = 0;
+		_ctlargcount(&b->Control, cp, 1);
+		b->Control.hidden = 0;
 		buttonshow(b);
 		break;
 	case EShow:
-		_ctlargcount(b, cp, 1);
+		_ctlargcount(&b->Control, cp, 1);
 		buttonshow(b);
 		break;
 	case ESize:
 		if (cp->nargs == 3)
 			r.max = Pt(0x7fffffff, 0x7fffffff);
 		else{
-			_ctlargcount(b, cp, 5);
+			_ctlargcount(&b->Control, cp, 5);
 			r.max.x = cp->iargs[3];
 			r.max.y = cp->iargs[4];
 		}
 		r.min.x = cp->iargs[1];
 		r.min.y = cp->iargs[2];
 		if(r.min.x<=0 || r.min.y<=0 || r.max.x<=0 || r.max.y<=0 || r.max.x < r.min.x || r.max.y < r.min.y)
-			ctlerror("%q: bad sizes: %s", b->name, cp->str);
-		b->size.min = r.min;
-		b->size.max = r.max;
+			ctlerror("%q: bad sizes: %s", b->Control.name, cp->str);
+		b->Control.size.min = r.min;
+		b->Control.size.max = r.max;
 		break;
 	case EValue:
-		_ctlargcount(b, cp, 2);
+		_ctlargcount(&b->Control, cp, 2);
 		if((cp->iargs[1]!=0) != b->pressed){
 			b->pressed ^= 1;
 			buttonshow(b);
@@ -259,14 +259,14 @@ createbutton(Controlset *cs, char *name)
 	b->light = _getctlimage("yellow");
 	b->pale = _getctlimage("paleyellow");
 	b->bordercolor = _getctlimage("black");
-	b->format = ctlstrdup("%q: value %d");
+	b->Control.format = ctlstrdup("%q: value %d");
 	b->lastshow = -1;
 	b->border = 0;
 	b->align = Aupperleft;
-	b->ctl = buttonctl;
-	b->mouse = buttonmouse;
+	b->Control.ctl = buttonctl;
+	b->Control.mouse = buttonmouse;
 	b->key = nil;
-	b->exit = buttonfree;
+	b->Control.exit = buttonfree;
 	b->off = 0;
 	b->prepress = 0;
 	return (Control*)b;

+ 26 - 26
sys/src/libcontrol/menu.c

@@ -104,14 +104,14 @@ menushow(Menu0 *m)
 	Point p, q;
 	Image *im, *c;
 
-	if(m->hidden || m->window == nil)
+	if(m->Control.hidden || m->window == nil)
 		return;
 
 	m->visible = 1;
 	f = m->font->font;
-	draw(m->window, m->rect, m->image->image, nil, m->image->image->r.min);
+	draw(m->window, m->Control.rect, m->image->image, nil, m->image->image->r.min);
 	if(m->border > 0)
-		border(m->window, m->rect, m->border, m->bordercolor->image, ZP);
+		border(m->window, m->Control.rect, m->border, m->bordercolor->image, ZP);
 	/* text goes here */
 	dx = 0;
 	for(i=0; i<m->nline; i++){
@@ -120,7 +120,7 @@ menushow(Menu0 *m)
 			dx = w;
 	}
 	dy = m->nline*f->height;
-	clipr = insetrect(m->rect, m->border);
+	clipr = insetrect(m->Control.rect, m->border);
 	p = _ctlalignpoint(clipr, dx, dy, m->align);
 	im = m->textcolor->image;
 //	if(m->pressed)
@@ -141,7 +141,7 @@ menushow(Menu0 *m)
 		p.y += f->height;
 	}
 //	if(m->pressed)
-//		draw(m->screen, m->rect, m->lighm->image, m->mask->image, m->mask->image->r.min);
+//		draw(m->Control.screen, m->Control.rect, m->lighm->image, m->mask->image, m->mask->image->r.min);
 	flushimage(display, 1);
 }
 
@@ -171,7 +171,7 @@ menuhide(Menu0 *m)
 {
 	freeimage(m->window);
 	m->window = nil;
-	m->rect.max.y = m->rect.min.y;	/* go to zero size */
+	m->Control.rect.max.y = m->Control.rect.min.y;	/* go to zero size */
 	m->lastbut = 0;
 	m->visible = 0;
 	if(m->selection >= 0)
@@ -191,12 +191,12 @@ menutrack(Control *c, Mouse *ms)
 	if(m->window == nil)
 		return;
 	if(m->lastbut && ms->buttons==0){	/* menu was released */
-		chanprint(m->event, "%q: value %d", m->name, m->selection);
+		chanprint(m->Control.event, "%q: value %d", m->Control.name, m->selection);
 		menuhide(m);
 		return;
 	}
 	m->lastbut = ms->buttons;
-	r = insetrect(m->rect, m->border);
+	r = insetrect(m->Control.rect, m->border);
 	if(!ptinrect(ms->xy, r))
 		s = -1;
 	else{
@@ -222,7 +222,7 @@ menuctl(Control *c, CParse *cp)
 	cmd = _ctllookup(cp->args[0], cmds, nelem(cmds));
 	switch(cmd){
 	default:
-		ctlerror("%q: unrecognized message '%s'", m->name, cp->str);
+		ctlerror("%q: unrecognized message '%s'", m->Control.name, cp->str);
 		break;
 	case EAdd:
 		_ctlargcount(m, cp, 2);
@@ -256,11 +256,11 @@ menuctl(Control *c, CParse *cp)
 		break;
 	case EFormat:
 		_ctlargcount(m, cp, 2);
-		m->format = ctlstrdup(cp->args[1]);
+		m->Control.format = ctlstrdup(cp->args[1]);
 		break;
 	case EHide:
 		_ctlargcount(m, cp, 1);
-		m->hidden = 1;
+		m->Control.hidden = 1;
 		break;
 	case EImage:
 		_ctlargcount(m, cp, 2);
@@ -274,13 +274,13 @@ menuctl(Control *c, CParse *cp)
 		r.max.x = cp->iargs[3];
 		r.max.y = cp->iargs[4];
 		if(Dx(r)<0 || Dy(r)<0)
-			ctlerror("%q: bad rectangle: %s", m->name, cp->str);
-		m->rect = r;
+			ctlerror("%q: bad rectangle: %s", m->Control.name, cp->str);
+		m->Control.rect = r;
 		menushow(m);
 		break;
 	case EReveal:
 		_ctlargcount(m, cp, 1);
-		m->hidden = 0;
+		m->Control.hidden = 0;
 		menushow(m);
 		break;
 	case ESelectcolor:
@@ -308,9 +308,9 @@ menuctl(Control *c, CParse *cp)
 		r.min.x = cp->iargs[1];
 		r.min.y = cp->iargs[2];
 		if(r.min.x<=0 || r.min.y<=0 || r.max.x<=0 || r.max.y<=0 || r.max.x < r.min.x || r.max.y < r.min.y)
-			ctlerror("%q: bad sizes: %s", m->name, cp->str);
-		m->size.min = r.min;
-		m->size.max = r.max;
+			ctlerror("%q: bad sizes: %s", m->Control.name, cp->str);
+		m->Control.size.min = r.min;
+		m->Control.size.max = r.max;
 		break;
 	case ETextcolor:
 		_ctlargcount(m, cp, 2);
@@ -331,11 +331,11 @@ menuctl(Control *c, CParse *cp)
 		if(m->window != nil)
 			break;
 		diag = menusize(m);
-		m->rect.max.x = m->rect.min.x + diag.x;
-		m->rect.max.y = m->rect.min.y + diag.y;
-		m->window = allocwindow(_screen, m->rect, Refbackup, DWhite);
+		m->Control.rect.max.x = m->Control.rect.min.x + diag.x;
+		m->Control.rect.max.y = m->Control.rect.min.y + diag.y;
+		m->window = allocwindow(_screen, m->Control.rect, Refbackup, DWhite);
 		if(m->window == nil)
-			m->window = m->screen;
+			m->window = m->Control.screen;
 		up = m->prevsel;
 		if(up<0 || up>=m->nline)
 			up = 0;
@@ -343,7 +343,7 @@ menuctl(Control *c, CParse *cp)
 		menushow(m);
 		h = m->font->font->height;
 		moveto(m->controlset->mousectl,
-			Pt(m->rect.min.x+Dx(m->rect)/2, m->rect.min.y+up*h+h/2));
+			Pt(m->Control.rect.min.x+Dx(m->Control.rect)/2, m->Control.rect.min.y+up*h+h/2));
 //		_ctlfocus(m, 1);
 		break;
 	}
@@ -361,15 +361,15 @@ createmenu(Controlset *cs, char *name)
 	m->selectcolor = _getctlimage("yellow");
 	m->selecttextcolor = _getctlimage("black");
 	m->bordercolor = _getctlimage("black");
-	m->format = ctlstrdup("%q: value %d");
+	m->Control.format = ctlstrdup("%q: value %d");
 	m->border = 0;
 	m->align = Aupperleft;
 	m->visible = 0;
 	m->window = nil;
 	m->lastbut = 0;
 	m->selection = -1;
-	m->mouse = menutrack;
-	m->ctl = menuctl;
-	m->exit = menufree;
+	m->Control.mouse = menutrack;
+	m->Control.ctl = menuctl;
+	m->Control.exit = menufree;
 	return (Control *)m;
 }

+ 25 - 25
sys/src/libcontrol/radiobutton.c

@@ -75,7 +75,7 @@ radioshow(Radio *r)
 {
 	int i;
 
-	if (r->hidden)
+	if (r->Control.hidden)
 		return;
 	for(i=0; i<r->nbuttons; i++){
 		_ctlprint(r->buttons[i], "value %d", (r->value==i));
@@ -96,14 +96,14 @@ radioctl(Control *c, CParse *cp)
 	cmd = _ctllookup(cp->args[0], cmds, nelem(cmds));
 	switch(cmd){
 	default:
-		ctlerror("%q: unrecognized message '%s'", r->name, cp->str);
+		ctlerror("%q: unrecognized message '%s'", r->Control.name, cp->str);
 		break;
 	case EAdd:
-		_ctlargcount(r, cp, 2);
+		_ctlargcount(&r->Control, cp, 2);
 		c = controlcalled(cp->args[1]);
 		if(c == nil)
-			ctlerror("%q: can't add %s: %r", r->name, cp->args[1]);
-		snprint(fmt, sizeof fmt, "%%q: %q button %%d", r->name);
+			ctlerror("%q: can't add %s: %r", r->Control.name, cp->args[1]);
+		snprint(fmt, sizeof fmt, "%%q: %q button %%d", r->Control.name);
 		_ctlprint(c, "format %q", fmt);
 		controlwire(c, "event", c->controlset->ctl);
 		r->buttons = ctlrealloc(r->buttons, (r->nbuttons+1)*sizeof(Control*));
@@ -114,67 +114,67 @@ radioctl(Control *c, CParse *cp)
 		break;
 	case EButton:
 		if (cp->sender == nil)
-			ctlerror("%q: senderless buttonevent: %q", r->name, cp->str);
+			ctlerror("%q: senderless buttonevent: %q", r->Control.name, cp->str);
 		c = controlcalled(cp->sender);
 		for(i=0; i<r->nbuttons; i++)
 			if (c == r->buttons[i])
 				break;
 		if (i == r->nbuttons)
-			ctlerror("%q: not my event: %q", r->name, cp->str);
+			ctlerror("%q: not my event: %q", r->Control.name, cp->str);
 		if(cp->iargs[1] == 0){
 			/* button was turned off; turn it back on */
 			_ctlprint(c, "value 1");
 		}else{
 			r->value = i;
-			chanprint(r->event, r->format, r->name, i);
+			chanprint(r->Control.event, r->Control.format, r->Control.name, i);
 			radioshow(r);
 		}
 		break;
 	case EFormat:
-		_ctlargcount(r, cp, 2);
-		r->format = ctlstrdup(cp->args[1]);
+		_ctlargcount(&r->Control, cp, 2);
+		r->Control.format = ctlstrdup(cp->args[1]);
 		break;
 	case EHide:
-		_ctlargcount(r, cp, 1);
-		r->hidden = 1;
+		_ctlargcount(&r->Control, cp, 1);
+		r->Control.hidden = 1;
 		break;
 	case EFocus:
 		/* ignore focus change */
 		break;
 	case ERect:
-		_ctlargcount(r, cp, 5);
+		_ctlargcount(&r->Control, cp, 5);
 		rect.min.x = cp->iargs[1];
 		rect.min.y = cp->iargs[2];
 		rect.max.x = cp->iargs[3];
 		rect.max.y = cp->iargs[4];
-		r->rect = rect;
+		r->Control.rect = rect;
 		break;
 	case EReveal:
-		_ctlargcount(r, cp, 1);
-		r->hidden = 0;
+		_ctlargcount(&r->Control, cp, 1);
+		r->Control.hidden = 0;
 		radioshow(r);
 		break;
 	case EShow:
-		_ctlargcount(r, cp, 1);
+		_ctlargcount(&r->Control, cp, 1);
 		radioshow(r);
 		break;
 	case ESize:
 		if (cp->nargs == 3)
 			rect.max = Pt(0x7fffffff, 0x7fffffff);
 		else{
-			_ctlargcount(r, cp, 5);
+			_ctlargcount(&r->Control, cp, 5);
 			rect.max.x = cp->iargs[3];
 			rect.max.y = cp->iargs[4];
 		}
 		rect.min.x = cp->iargs[1];
 		rect.min.y = cp->iargs[2];
 		if(rect.min.x<=0 || rect.min.y<=0 || rect.max.x<=0 || rect.max.y<=0 || rect.max.x < rect.min.x || rect.max.y < rect.min.y)
-			ctlerror("%q: bad sizes: %s", r->name, cp->str);
-		r->size.min = rect.min;
-		r->size.max = rect.max;
+			ctlerror("%q: bad sizes: %s", r->Control.name, cp->str);
+		r->Control.size.min = rect.min;
+		r->Control.size.max = rect.max;
 		break;
 	case EValue:
-		_ctlargcount(r, cp, 2);
+		_ctlargcount(&r->Control, cp, 2);
 		r->value = cp->iargs[1];
 		radioshow(r);
 		break;
@@ -187,9 +187,9 @@ createradiobutton(Controlset *cs, char *name)
 	Radio *r;
 
 	r = (Radio*)_createctl(cs, "label", sizeof(Radio), name);
-	r->format = ctlstrdup("%q: value %d");
+	r->Control.format = ctlstrdup("%q: value %d");
 	r->value = -1;	/* nobody set at first */
-	r->mouse = radiomouse;
-	r->ctl = radioctl;
+	r->Control.mouse = radiomouse;
+	r->Control.ctl = radioctl;
 	return (Control*)r;
 }

+ 37 - 37
sys/src/libcontrol/scribble.c

@@ -83,15 +83,15 @@ scribmouse(Control *c, Mouse *m)
 			resetstroke(b);
 		}
 		/* mouse is down */
-		if (ptinrect(m->xy,b->rect))
+		if (ptinrect(m->xy,b->Control.rect))
 			addpoint(b, m->xy);
 	} else if (b->lastbut & 0x1) {
 		/* mouse went up */
-		if (ptinrect(m->xy,b->rect)) {
+		if (ptinrect(m->xy,b->Control.rect)) {
 			r = recognize(b->scrib);
 			scribchar(b, r);
 			scribshow(b);
-			if (r) chanprint(b->event, b->format, b->name, r);
+			if (r) chanprint(b->Control.event, b->Control.format, b->Control.name, r);
 		}
 	}
 	b->lastbut = m->buttons;
@@ -133,16 +133,16 @@ scribshow(Scrib *b)
 	Scribble *s = b->scrib;
 	char buf[32];
 
-	if (b->hidden)
+	if (b->Control.hidden)
 		return;
 	if(b->border > 0){
-		r = insetrect(b->rect, b->border);
-		border(b->screen, b->rect, b->border, b->bordercolor->image, ZP);
+		r = insetrect(b->Control.rect, b->border);
+		border(b->Control.screen, b->Control.rect, b->border, b->bordercolor->image, ZP);
 	}else
-		r = b->rect;
+		r = b->Control.rect;
 
 	i = b->image->image;
-	draw(b->screen, r, i, nil, i->r.min);
+	draw(b->Control.screen, r, i, nil, i->r.min);
 
 	if (s->ctrlShift)
 		mode = " ^C";
@@ -159,7 +159,7 @@ scribshow(Scrib *b)
 
 	snprint(buf, sizeof buf, "%s %s", mode, b->lastchar);
 
-	string(b->screen, r.min, b->color->image, ZP, b->font->font, buf);
+	string(b->Control.screen, r.min, b->color->image, ZP, b->font->font, buf);
 	flushimage(display, 1);
 }
 
@@ -175,73 +175,73 @@ scribctl(Control *c, CParse *cp)
 	switch(cmd){
 	default:
 		abort();
-		ctlerror("%q: unrecognized message '%s'", b->name, cp->str);
+		ctlerror("%q: unrecognized message '%s'", b->Control.name, cp->str);
 		break;
 	case EAlign:
-		_ctlargcount(b, cp, 2);
+		_ctlargcount(&b->Control, cp, 2);
 		b->align = _ctlalignment(cp->args[1]);
 		break;
 	case EBorder:
-		_ctlargcount(b, cp, 2);
+		_ctlargcount(&b->Control, cp, 2);
 		if(cp->iargs[1] < 0)
-			ctlerror("%q: bad border: %c", b->name, cp->str);
+			ctlerror("%q: bad border: %c", b->Control.name, cp->str);
 		b->border = cp->iargs[1];
 		break;
 	case EBordercolor:
-		_ctlargcount(b, cp, 2);
-		_setctlimage(b, &b->bordercolor, cp->args[1]);
+		_ctlargcount(&b->Control, cp, 2);
+		_setctlimage(&b->Control, &b->bordercolor, cp->args[1]);
 		break;
 	case EFocus:
 		break;
 	case EImage:
-		_ctlargcount(b, cp, 2);
-		_setctlimage(b, &b->image, cp->args[1]);
+		_ctlargcount(&b->Control, cp, 2);
+		_setctlimage(&b->Control, &b->image, cp->args[1]);
 		break;
 	case ELinecolor:
-		_ctlargcount(b, cp, 2);
-		_setctlimage(b, &b->bordercolor, cp->args[1]);
+		_ctlargcount(&b->Control, cp, 2);
+		_setctlimage(&b->Control, &b->bordercolor, cp->args[1]);
 		break;
 	case ERect:
-		_ctlargcount(b, cp, 5);
+		_ctlargcount(&b->Control, cp, 5);
 		r.min.x = cp->iargs[1];
 		r.min.y = cp->iargs[2];
 		r.max.x = cp->iargs[3];
 		r.max.y = cp->iargs[4];
 		if(Dx(r)<0 || Dy(r)<0)
-			ctlerror("%q: bad rectangle: %s", b->name, cp->str);
-		b->rect = r;
+			ctlerror("%q: bad rectangle: %s", b->Control.name, cp->str);
+		b->Control.rect = r;
 		break;
 	case EReveal:
-		_ctlargcount(b, cp, 1);
-		b->hidden = 0;
+		_ctlargcount(&b->Control, cp, 1);
+		b->Control.hidden = 0;
 		scribshow(b);
 		break;
 	case EShow:
-		_ctlargcount(b, cp, 1);
+		_ctlargcount(&b->Control, cp, 1);
 		scribshow(b);
 		break;
 	case EFont:
-		_ctlargcount(b, cp, 2);
-		_setctlfont(b, &b->font, cp->args[1]);
+		_ctlargcount(&b->Control, cp, 2);
+		_setctlfont(&b->Control, &b->font, cp->args[1]);
 		break;
 	case EHide:
-		_ctlargcount(b, cp, 1);
-		b->hidden = 1;
+		_ctlargcount(&b->Control, cp, 1);
+		b->Control.hidden = 1;
 		break;
 	case ESize:
 		if (cp->nargs == 3)
 			r.max = Pt(0x7fffffff, 0x7fffffff);
 		else{
-			_ctlargcount(b, cp, 5);
+			_ctlargcount(&b->Control, cp, 5);
 			r.max.x = cp->iargs[3];
 			r.max.y = cp->iargs[4];
 		}
 		r.min.x = cp->iargs[1];
 		r.min.y = cp->iargs[2];
 		if(r.min.x<=0 || r.min.y<=0 || r.max.x<=0 || r.max.y<=0 || r.max.x < r.min.x || r.max.y < r.min.y)
-			ctlerror("%q: bad sizes: %s", b->name, cp->str);
-		b->size.min = r.min;
-		b->size.max = r.max;
+			ctlerror("%q: bad sizes: %s", b->Control.name, cp->str);
+		b->Control.size.min = r.min;
+		b->Control.size.max = r.max;
 		break;
 	}
 }
@@ -311,14 +311,14 @@ createscribble(Controlset *cs, char *name)
 	b->color = _getctlimage("black");
 	b->bordercolor = _getctlimage("black");
 	b->align = Aupperleft;
-	b->format = ctlstrdup("%q: value 0x%x");
+	b->Control.format = ctlstrdup("%q: value 0x%x");
 	b->font = _getctlfont("font");
 	b->scrib = scribblealloc();
 	b->lastbut = 0;
 	b->bordercolor = _getctlimage("black");
 	b->border = 0;
-	b->ctl = scribctl;
-	b->mouse = scribmouse;
-	b->exit = scribfree;
+	b->Control.ctl = scribctl;
+	b->Control.mouse = scribmouse;
+	b->Control.exit = scribfree;
 	return (Control*)b;
 }

+ 3 - 3
sys/src/libcontrol/slider.c

@@ -155,7 +155,7 @@ sliderctl(Control *c, CParse *cp)
 		break;
 	case EBordercolor:
 		_ctlargcount(&s->Control, cp, 2);
-		_setctlimage(s, &s->bordercolor, cp->args[1]);
+		_setctlimage(&s->Control, &s->bordercolor, cp->args[1]);
 		break;
 	case EClamp:
 		_ctlargcount(&s->Control, cp, 3);
@@ -179,11 +179,11 @@ sliderctl(Control *c, CParse *cp)
 		break;
 	case EImage:
 		_ctlargcount(&s->Control, cp, 2);
-		_setctlimage(s, &s->image, cp->args[1]);
+		_setctlimage(&s->Control, &s->image, cp->args[1]);
 		break;
 	case EIndicatorcolor:
 		_ctlargcount(&s->Control, cp, 2);
-		_setctlimage(s, &s->indicatorcolor, cp->args[1]);
+		_setctlimage(&s->Control, &s->indicatorcolor, cp->args[1]);
 		break;
 	case EMax:
 		_ctlargcount(&s->Control, cp, 2);