Browse Source

deanono libcontrol

Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Ronald G. Minnich 8 years ago
parent
commit
394166ce9e
4 changed files with 188 additions and 188 deletions
  1. 28 28
      sys/src/libcontrol/tabs.c
  2. 61 61
      sys/src/libcontrol/text.c
  3. 46 46
      sys/src/libcontrol/textbutton.c
  4. 53 53
      sys/src/libcontrol/textbutton3.c

+ 28 - 28
sys/src/libcontrol/tabs.c

@@ -77,7 +77,7 @@ tabshow(Tab *t)
 	Rectangle r;
 	Group *g;
 
-	if (t->hidden)
+	if (t->Control.hidden)
 		return;
 	for(i=0; i<t->nbuttons; i++){
 		_ctlprint(t->buttons[i], "value %d", (t->selected==i));
@@ -93,7 +93,7 @@ tabshow(Tab *t)
 	r = g->separators[0];
 	r.min.x = t->buttons[t->selected]->rect.min.x;
 	r.max.x = t->buttons[t->selected]->rect.max.x;
-	draw(t->screen, r, t->image->image, nil, t->image->image->r.min);
+	draw(t->Control.screen, r, t->image->image, nil, t->image->image->r.min);
 	flushimage(display, 1);
 }
 
@@ -118,17 +118,17 @@ tabctl(Control *c, CParse *cp)
 	switch(cmd){
 	case EAdd:
 		if ((cp->nargs & 1) == 0)
-			ctlerror("%q: arg count: %s", t->name, cp->args[1]);
+			ctlerror("%q: arg count: %s", t->Control.name, cp->args[1]);
 		for (i = 1; i < cp->nargs; i += 2){
 			cbut = controlcalled(cp->args[i]);
 			if (cbut == nil)
-				ctlerror("%q: no such control: %s", t->name, cp->args[i]);
+				ctlerror("%q: no such control: %s", t->Control.name, cp->args[i]);
 			cwin = controlcalled(cp->args[i+1]);
 			if (cwin == nil)
-				ctlerror("%q: no such control: %s", t->name, cp->args[i+1]);
+				ctlerror("%q: no such control: %s", t->Control.name, cp->args[i+1]);
 			_ctladdgroup(t->tabrow, cbut);
 			_ctlprint(t->tabstack, "add %q", cp->args[i+1]);
-			_ctlprint(cbut, "format '%%s: %q button %%d'", t->name);
+			_ctlprint(cbut, "format '%%s: %q button %%d'", t->Control.name);
 			controlwire(cbut, "event", t->controlset->ctl);
 			t->buttons = ctlrealloc(t->buttons, (t->nbuttons+1)*sizeof(Control*));
 			t->buttons[t->nbuttons] = cbut;
@@ -136,35 +136,35 @@ tabctl(Control *c, CParse *cp)
 			t->selected = -1;
 		}
 		_ctlprint(t->tabcolumn, "size");
-		t->size = t->tabcolumn->size;
+		t->Control.size = t->tabcolumn->size;
 		break;
 	case EBorder:
-		_ctlargcount(t, cp, 2);
+		_ctlargcount(&t->Control, cp, 2);
 		if(cp->iargs[1] < 0)
-			ctlerror("%q: bad border: %c", t->name, cp->str);
+			ctlerror("%q: bad border: %c", t->Control.name, cp->str);
 		t->border = cp->iargs[1];
 		break;
 	case EBordercolor:
-		_ctlargcount(t, cp, 2);
-		_setctlimage(t, &t->bordercolor, cp->args[1]);
+		_ctlargcount(&t->Control, cp, 2);
+		_setctlimage(&t->Control, &t->bordercolor, cp->args[1]);
 		break;
 	case EButton:
-		_ctlargcount(t, cp, 2);
+		_ctlargcount(&t->Control, cp, 2);
 		if (cp->sender == nil)
-			ctlerror("%q: senderless buttonevent: %q", t->name, cp->str);
+			ctlerror("%q: senderless buttonevent: %q", t->Control.name, cp->str);
 		cbut = controlcalled(cp->sender);
 		for(i=0; i<t->nbuttons; i++)
 			if (cbut == t->buttons[i])
 				break;
 		if (i == t->nbuttons)
-			ctlerror("%q: not my event: %q", t->name, cp->str);
+			ctlerror("%q: not my event: %q", t->Control.name, cp->str);
 		if(cp->iargs[1] == 0){
 			/* button was turned off; turn it back on */
 			_ctlprint(cbut, "value 1");
 		}else{
 			t->selected = i;
 			if (t->_format)
-				chanprint(t->event, t->_format, t->name, i);
+				chanprint(t->Control.event, t->_format, t->Control.name, i);
 			tabshow(t);
 		}
 		break;
@@ -172,31 +172,31 @@ tabctl(Control *c, CParse *cp)
 		/* ignore focus change */
 		break;
 	case EFormat:
-		_ctlargcount(t, cp, 2);
+		_ctlargcount(&t->Control, cp, 2);
 		t->_format = ctlstrdup(cp->args[1]);
 		break;
 	case EImage:
-		_ctlargcount(t, cp, 2);
-		_setctlimage(t, &t->image, cp->args[1]);
+		_ctlargcount(&t->Control, cp, 2);
+		_setctlimage(&t->Control, &t->image, cp->args[1]);
 		break;
 	case ESeparation:
 		t->tabrow->ctl(t->tabrow, cp);
 		t->tabcolumn->ctl(t->tabcolumn, cp);
 		break;
 	case ERect:
-		_ctlargcount(t, cp, 5);
+		_ctlargcount(&t->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", t->name, cp->str);
-		t->rect = r;
+			ctlerror("%q: bad rectangle: %s", t->Control.name, cp->str);
+		t->Control.rect = r;
 		r = insetrect(r, t->border);
 		_ctlprint(t->tabcolumn, "rect %R", r);
 		break;
 	case EReveal:
-		_ctlargcount(t, cp, 1);
+		_ctlargcount(&t->Control, cp, 1);
 	case EHide:
 	case ESize:
 		t->tabcolumn->ctl(t->tabcolumn, cp);
@@ -205,14 +205,14 @@ tabctl(Control *c, CParse *cp)
 		tabshow(t);
 		break;
 	case EValue:
-		_ctlargcount(t, cp, 2);
+		_ctlargcount(&t->Control, cp, 2);
 		if (cp->iargs[1] < 0 || cp->iargs[1] >= t->nbuttons)
-			ctlerror("%q: illegal value '%s'", t->name, cp->str);
+			ctlerror("%q: illegal value '%s'", t->Control.name, cp->str);
 		t->selected = cp->iargs[1];
 		tabshow(t);
 		break;
 	default:
-		ctlerror("%q: unrecognized message '%s'", t->name, cp->str);
+		ctlerror("%q: unrecognized message '%s'", t->Control.name, cp->str);
 		break;
 	}
 }
@@ -247,9 +247,9 @@ createtab(Controlset *cs, char *name)
 	t = (Tab*)_createctl(cs, "tab", sizeof(Tab), name);
 	t->selected = -1;
 	t->nbuttons = 0;
-	t->ctl = tabctl;
-	t->mouse = nil;
-	t->exit = tabfree;
+	t->Control.ctl = tabctl;
+	t->Control.mouse = nil;
+	t->Control.exit = tabfree;
 	snprint(s, sizeof s, "_%s-row", name);
 	t->tabrow = createrow(cs, s);
 	snprint(s, sizeof s, "_%s-stack", name);

+ 61 - 61
sys/src/libcontrol/text.c

@@ -124,14 +124,14 @@ textmouse(Control *c, Mouse *m)
 	int sel;
 
 	t = (Text*)c;
-	if (debug) fprint(2, "textmouse %s t->lastbut %d; m->buttons %d\n", t->name, t->lastbut, m->buttons);
+	if (debug) fprint(2, "textmouse %s t->lastbut %d; m->buttons %d\n", t->Control.name, t->lastbut, m->buttons);
 	if (t->warp >= 0)
 		return;
 	if ((t->selectstyle == Selup) && (m->buttons&7)) {
 		sel = textline(t, m->xy);
 		if (t->sel >= 0) {
 //			if (debug) fprint(2, "textmouse Selup %q sel=%d t->sel=%d t->but=%d\n",
-//						t->name, sel, t->sel, t->but);
+//						t->Control.name, sel, t->sel, t->but);
 			t->offsel = (sel == t->sel) ? 0 : 1;
 			if ((sel == t->sel &&
 				    ((t->selected[t->sel] && !t->but) ||
@@ -148,13 +148,13 @@ textmouse(Control *c, Mouse *m)
 			sel = texttoggle(t, m->xy);
 			if(sel >= 0) {
 				if (t->selectstyle == Seldown) {
-					chanprint(t->event, "%q: select %d %d",
-						t->name, sel, t->selected[sel] ? (m->buttons & 7) : 0);
+					chanprint(t->Control.event, "%q: select %d %d",
+						t->Control.name, sel, t->selected[sel] ? (m->buttons & 7) : 0);
 					if (debug) fprint(2, "textmouse Seldown event %q: select %d %d\n",
-						t->name, sel, t->selected[sel] ? (m->buttons & 7) : 0);
+						t->Control.name, sel, t->selected[sel] ? (m->buttons & 7) : 0);
 				} else {
 					if (debug) fprint(2, "textmouse Selup no event yet %q: select %d %d\n",
-						t->name, sel, t->selected[sel] ? (m->buttons & 7) : 0);
+						t->Control.name, sel, t->selected[sel] ? (m->buttons & 7) : 0);
 					t->sel = sel;
 					t->but =  t->selected[sel] ? (m->buttons & 7) : 0;
 				}
@@ -163,10 +163,10 @@ textmouse(Control *c, Mouse *m)
 			sel = textline(t, m->xy);
 			t->offsel = 0;
 			if ((sel >= 0) && (sel == t->sel)) {
-				chanprint(t->event, "%q: select %d %d",
-					t->name, sel, t->but);
+				chanprint(t->Control.event, "%q: select %d %d",
+					t->Control.name, sel, t->but);
 				if (debug) fprint(2, "textmouse Selup event %q: select %d %d\n",
-					t->name, sel, t->but);
+					t->Control.name, sel, t->but);
 			} else if (sel != t->sel) {
 				if  ((t->selected[t->sel] && t->but) ||
                                          ((!t->selected[t->sel]) && (!t->but))) {
@@ -175,7 +175,7 @@ textmouse(Control *c, Mouse *m)
 					textshow(t);
 				}
 				if (debug) fprint(2, "textmouse Selup cancel %q: select %d %d\n",
-					t->name, sel, t->but);
+					t->Control.name, sel, t->but);
 			}
 			t->sel = -1;
 			t->but = 0;
@@ -212,13 +212,13 @@ textshow(Text *t)
 	Font *f;
 	Rune *text;
 
-	if (t->hidden)
+	if (t->Control.hidden)
 		return;
-	r = t->rect;
+	r = t->Control.rect;
 	f = t->font->font;
-	draw(t->screen, r, t->image->image, nil, t->image->image->r.min);
+	draw(t->Control.screen, r, t->image->image, nil, t->image->image->r.min);
 	if(t->border > 0){
-		border(t->screen, r, t->border, t->bordercolor->image, t->bordercolor->image->r.min);
+		border(t->Control.screen, r, t->border, t->bordercolor->image, t->bordercolor->image->r.min);
 		r = insetrect(r, t->border);
 	}
 	tr = r;
@@ -228,9 +228,9 @@ textshow(Text *t)
 		ntext = runestrlen(text);
 		r.max.y = r.min.y+f->height;
 		if(t->sel == i && t->offsel)
-			draw(t->screen, r, t->selectingcolor->image, nil, ZP);
+			draw(t->Control.screen, r, t->selectingcolor->image, nil, ZP);
 		else if(t->selected[i])
-			draw(t->screen, r, t->selectcolor->image, nil, ZP);
+			draw(t->Control.screen, r, t->selectcolor->image, nil, ZP);
 		p = _ctlalignpoint(r,
 			runestringnwidth(f, text, ntext),
 			f->height, t->align);
@@ -241,7 +241,7 @@ textshow(Text *t)
 			moveto(t->controlset->mousectl, p2);
 			t->warp = -1;
 		}
-		_string(t->screen, p, t->textcolor->image,
+		_string(t->Control.screen, p, t->textcolor->image,
 			ZP, f, nil, text, ntext, tr,
 			nil, ZP, SoverD);
 		r.min.y += f->height;
@@ -261,24 +261,24 @@ textctl(Control *c, CParse *cp)
 	cmd = _ctllookup(cp->args[0], cmds, nelem(cmds));
 	switch(cmd){
 	default:
-		ctlerror("%q: unrecognized message '%s'", t->name, cp->str);
+		ctlerror("%q: unrecognized message '%s'", t->Control.name, cp->str);
 		break;
 	case EAlign:
-		_ctlargcount(t, cp, 2);
+		_ctlargcount(&t->Control, cp, 2);
 		t->align = _ctlalignment(cp->args[1]);
 		break;
 	case EBorder:
-		_ctlargcount(t, cp, 2);
+		_ctlargcount(&t->Control, cp, 2);
 		if(cp->iargs[1] < 0)
-			ctlerror("%q: bad border: %c", t->name, cp->str);
+			ctlerror("%q: bad border: %c", t->Control.name, cp->str);
 		t->border = cp->iargs[1];
 		break;
 	case EBordercolor:
-		_ctlargcount(t, cp, 2);
-		_setctlimage(t, &t->bordercolor, cp->args[1]);
+		_ctlargcount(&t->Control, cp, 2);
+		_setctlimage(&t->Control, &t->bordercolor, cp->args[1]);
 		break;
 	case EClear:
-		_ctlargcount(t, cp, 1);
+		_ctlargcount(&t->Control, cp, 1);
 		for(i=0; i<t->nline; i++)
 			free(t->line[i]);
 		free(t->line);
@@ -289,10 +289,10 @@ textctl(Control *c, CParse *cp)
 		textshow(t);
 		break;
 	case EDelete:
-		_ctlargcount(t, cp, 2);
+		_ctlargcount(&t->Control, cp, 2);
 		i = cp->iargs[1];
 		if(i<0 || i>=t->nline)
-			ctlerror("%q: line number out of range: %s", t->name, cp->str);
+			ctlerror("%q: line number out of range: %s", t->Control.name, cp->str);
 		free(t->line[i]);
 		memmove(t->line+i, t->line+i+1, (t->nline-(i+1))*sizeof(Rune*));
 		memmove(t->selected+i, t->selected+i+1, t->nline-(i+1));
@@ -302,50 +302,50 @@ textctl(Control *c, CParse *cp)
 	case EFocus:
 		break;
 	case EFont:
-		_ctlargcount(t, cp, 2);
+		_ctlargcount(&t->Control, cp, 2);
 		_setctlfont(t, &t->font, cp->args[1]);
 		break;
 	case EHide:
-		_ctlargcount(t, cp, 1);
-		t->hidden = 1;
+		_ctlargcount(&t->Control, cp, 1);
+		t->Control.hidden = 1;
 		break;
 	case EImage:
-		_ctlargcount(t, cp, 2);
-		_setctlimage(t, &t->image, cp->args[1]);
+		_ctlargcount(&t->Control, cp, 2);
+		_setctlimage(&t->Control, &t->image, cp->args[1]);
 		break;
 	case ERect:
-		_ctlargcount(t, cp, 5);
+		_ctlargcount(&t->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", t->name, cp->str);
-		t->rect = r;
+			ctlerror("%q: bad rectangle: %s", t->Control.name, cp->str);
+		t->Control.rect = r;
 		t->nvis = (Dy(r)-2*t->border)/t->font->font->height;
 		break;
 	case EReplace:
-		_ctlargcount(t, cp, 3);
+		_ctlargcount(&t->Control, cp, 3);
 		i = cp->iargs[1];
 		if(i<0 || i>=t->nline)
-			ctlerror("%q: line number out of range: %s", t->name, cp->str);
+			ctlerror("%q: line number out of range: %s", t->Control.name, cp->str);
 		free(t->line[i]);
 		t->line[i] = _ctlrunestr(cp->args[2]);
 		textshow(t);
 		break;
 	case EReveal:
-		_ctlargcount(t, cp, 1);
-		t->hidden = 0;
+		_ctlargcount(&t->Control, cp, 1);
+		t->Control.hidden = 0;
 		textshow(t);
 		break;
 	case EScroll:
-		_ctlargcount(t, cp, 2);
+		_ctlargcount(&t->Control, cp, 2);
 		t->scroll = cp->iargs[1];
 		break;
 	case ESelect:
 		if(cp->nargs!=2 && cp->nargs!=3)
 	badselect:
-			ctlerror("%q: bad select message: %s", t->name, cp->str);
+			ctlerror("%q: bad select message: %s", t->Control.name, cp->str);
 		if(cp->nargs == 2){
 			if(strcmp(cp->args[1], "all") == 0){
 				memset(t->selected, 1, t->nline);
@@ -361,53 +361,53 @@ textctl(Control *c, CParse *cp)
 			break;
 		}
 		if(cp->iargs[1]<0 || cp->iargs[1]>=t->nline)
-			ctlerror("%q: selection index out of range (nline %d): %s", t->name, t->nline, cp->str);
+			ctlerror("%q: selection index out of range (nline %d): %s", t->Control.name, t->nline, cp->str);
 		if(t->selected[cp->iargs[1]] != (cp->iargs[2]!=0))
 			texttogglei(t, cp->iargs[1]);
 		break;
 	case ESelectcolor:
-		_ctlargcount(t, cp, 2);
-		_setctlimage(t, &t->selectcolor, cp->args[1]);
+		_ctlargcount(&t->Control, cp, 2);
+		_setctlimage(&t->Control, &t->selectcolor, cp->args[1]);
 		break;
 	case ESelectmode:
-		_ctlargcount(t, cp, 2);
+		_ctlargcount(&t->Control, cp, 2);
 		if(strcmp(cp->args[1], "single") == 0)
 			t->selectmode = Selsingle;
 		else if(strncmp(cp->args[1], "multi", 5) == 0)
 			t->selectmode = Selmulti;
 		break;
 	case ESelectstyle:
-		_ctlargcount(t, cp, 2);
+		_ctlargcount(&t->Control, cp, 2);
 		 if(strcmp(cp->args[1], "down") == 0)
 			t->selectstyle = Seldown;
 		else if(strcmp(cp->args[1], "up") == 0)
 			t->selectstyle = Selup;
 		break;
 	case EShow:
-		_ctlargcount(t, cp, 1);
+		_ctlargcount(&t->Control, cp, 1);
 		textshow(t);
 		break;
 	case ESize:
 		if (cp->nargs == 3)
 			r.max = Pt(10000, 10000);
 		else{
-			_ctlargcount(t, cp, 5);
+			_ctlargcount(&t->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", t->name, cp->str);
-		t->size.min = r.min;
-		t->size.max = r.max;
+			ctlerror("%q: bad sizes: %s", t->Control.name, cp->str);
+		t->Control.size.min = r.min;
+		t->Control.size.max = r.max;
 		break;
 	case ETextcolor:
-		_ctlargcount(t, cp, 2);
-		_setctlimage(t, &t->textcolor, cp->args[1]);
+		_ctlargcount(&t->Control, cp, 2);
+		_setctlimage(&t->Control, &t->textcolor, cp->args[1]);
 		break;
 	case ETopline:
-		_ctlargcount(t, cp, 2);
+		_ctlargcount(&t->Control, cp, 2);
 		i = cp->iargs[1];
 		if(i < 0)
 			i = 0;
@@ -432,14 +432,14 @@ textctl(Control *c, CParse *cp)
 	case EAdd:
 		switch (cp->nargs) {
 		default:
-			ctlerror("%q: wrong argument count in '%s'", t->name, cp->str);
+			ctlerror("%q: wrong argument count in '%s'", t->Control.name, cp->str);
 		case 2:
 			n = t->nline;
 			break;
 		case 3:
 			n = cp->iargs[1];
 			if(n<0 || n>t->nline)
-				ctlerror("%q: line number out of range: %s", t->name, cp->str);
+				ctlerror("%q: line number out of range: %s", t->Control.name, cp->str);
 			break;
 		}
 		rp = _ctlrunestr(cp->args[cp->nargs-1]);
@@ -464,10 +464,10 @@ textctl(Control *c, CParse *cp)
 				textshow(t);
 		break;
 	case EWarp:
-		_ctlargcount(t, cp, 2);
+		_ctlargcount(&t->Control, cp, 2);
 		i = cp->iargs[1];
 		if(i <0 || i>=t->nline)
-			ctlerror("%q: selection index out of range (nline %d): %s", t->name, t->nline, cp->str);
+			ctlerror("%q: selection index out of range (nline %d): %s", t->Control.name, t->nline, cp->str);
 		if(i < t->topline || i >=  t->topline+t->nvis){
 			t->topline = i;
 		}
@@ -499,7 +499,7 @@ textline(Text *t, Point p)
 	Rectangle r;
 	int i;
 
-	r = t->rect;
+	r = t->Control.rect;
 	if(t->border > 0)
 		r = insetrect(r, t->border);
 	if(!ptinrect(p, r))
@@ -540,9 +540,9 @@ createtext(Controlset *cs, char *name)
 	t->selectmode = Selsingle;
 	t->selectstyle = Selup; // Seldown;
 	t->lastbut = 0;
-	t->mouse = textmouse;
-	t->ctl = textctl;
-	t->exit = textfree;
+	t->Control.mouse = textmouse;
+	t->Control.ctl = textctl;
+	t->Control.exit = textfree;
 	t->warp = -1;
 	t->sel = -1;
 	t->offsel = 0;

+ 46 - 46
sys/src/libcontrol/textbutton.c

@@ -94,7 +94,7 @@ textbuttonmouse(Control *c, Mouse *m)
 
 	t = (Textbutton *)c;
 	if(m->buttons&7) {
-		if (ptinrect(m->xy,t->rect)) {
+		if (ptinrect(m->xy,t->Control.rect)) {
 			if (t->off) {
 				t->off = 0;
 				textbuttonshow(t);
@@ -115,8 +115,8 @@ textbuttonmouse(Control *c, Mouse *m)
 				t->pressed = 1;
 			textbuttonshow(t);
 		}else{	/* generate event on button up */
-			if (ptinrect(m->xy,t->rect))
-				chanprint(t->event, t->format, t->name, t->pressed);
+			if (ptinrect(m->xy,t->Control.rect))
+				chanprint(t->Control.event, t->Control.format, t->Control.name, t->pressed);
 			else {
 				t->off = 0;
 				t->pressed = t->prepress;
@@ -156,12 +156,12 @@ textbuttonshow(Textbutton *t)
 	Point p, q;
 	Image *im;
 
-	if(t->hidden || (t->lastshow == t->pressed && t->showoff == t->off))
+	if(t->Control.hidden || (t->lastshow == t->pressed && t->showoff == t->off))
 		return;
 	f = t->font->font;
-	draw(t->screen, t->rect, t->image->image, nil, t->image->image->r.min);
+	draw(t->Control.screen, t->Control.rect, t->image->image, nil, t->image->image->r.min);
 	if(t->border > 0)
-		border(t->screen, t->rect, t->border, t->bordercolor->image, ZP);
+		border(t->Control.screen, t->Control.rect, t->border, t->bordercolor->image, ZP);
 	/* text goes here */
 	dx = 0;
 	for(i=0; i<t->nline; i++){
@@ -170,7 +170,7 @@ textbuttonshow(Textbutton *t)
 			dx = w;
 	}
 	dy = t->nline*f->height;
-	clipr = insetrect(t->rect, t->border);
+	clipr = insetrect(t->Control.rect, t->border);
 	p = _ctlalignpoint(clipr, dx, dy, t->align);
 	im = t->textcolor->image;
 	if(t->off)
@@ -182,13 +182,13 @@ textbuttonshow(Textbutton *t)
 		r.max.x = p.x+dx;
 		r.max.y = p.y+f->height;
 		q = _ctlalignpoint(r, stringwidth(f, t->line[i]), f->height, t->align%3);
-		_string(t->screen, q, im,
+		_string(t->Control.screen, q, im,
 			ZP, f, t->line[i], nil, strlen(t->line[i]),
 			clipr, nil, ZP, SoverD);
 		p.y += f->height;
 	}
 	if(t->off || t->pressed)
-		draw(t->screen, t->rect, t->light->image, t->mask->image, t->mask->image->r.min);
+		draw(t->Control.screen, t->Control.rect, t->light->image, t->mask->image, t->mask->image->r.min);
 	t->lastshow = t->pressed;
 	t->showoff = t->off;
 	flushimage(display, 1);
@@ -205,82 +205,82 @@ textbuttonctl(Control *c, CParse *cp)
 	cmd = _ctllookup(cp->args[0], cmds, nelem(cmds));
 	switch(cmd){
 	default:
-		ctlerror("%q: unrecognized message '%s'", t->name, cp->str);
+		ctlerror("%q: unrecognized message '%s'", t->Control.name, cp->str);
 		break;
 	case EAlign:
-		_ctlargcount(t, cp, 2);
+		_ctlargcount(&t->Control, cp, 2);
 		t->align = _ctlalignment(cp->args[1]);
 		t->lastshow = -1;	/* force redraw */
 		break;
 	case EBorder:
-		_ctlargcount(t, cp, 2);
+		_ctlargcount(&t->Control, cp, 2);
 		t->border = cp->iargs[1];
 		t->lastshow = -1;	/* force redraw */
 		break;
 	case EBordercolor:
-		_ctlargcount(t, cp, 2);
-		_setctlimage(t, &t->bordercolor, cp->args[1]);
+		_ctlargcount(&t->Control, cp, 2);
+		_setctlimage(&t->Control, &t->bordercolor, cp->args[1]);
 		t->lastshow = -1;	/* force redraw */
 		break;
 	case EFocus:
 		break;
 	case EFont:
-		_ctlargcount(t, cp, 2);
+		_ctlargcount(&t->Control, cp, 2);
 		_setctlfont(t, &t->font, cp->args[1]);
 		t->lastshow = -1;	/* force redraw */
 		break;
 	case EFormat:
-		_ctlargcount(t, cp, 2);
-		t->format = ctlstrdup(cp->args[1]);
+		_ctlargcount(&t->Control, cp, 2);
+		t->Control.format = ctlstrdup(cp->args[1]);
 		break;
 	case EHide:
-		_ctlargcount(t, cp, 1);
-		t->hidden = 1;
+		_ctlargcount(&t->Control, cp, 1);
+		t->Control.hidden = 1;
 		break;
 	case EImage:
-		_ctlargcount(t, cp, 2);
-		_setctlimage(t, &t->image, cp->args[1]);
+		_ctlargcount(&t->Control, cp, 2);
+		_setctlimage(&t->Control, &t->image, cp->args[1]);
 		t->lastshow = -1;	/* force redraw */
 		break;
 	case ELight:
-		_ctlargcount(t, cp, 2);
-		_setctlimage(t, &t->light, cp->args[1]);
+		_ctlargcount(&t->Control, cp, 2);
+		_setctlimage(&t->Control, &t->light, cp->args[1]);
 		t->lastshow = -1;	/* force redraw */
 		break;
 	case EMask:
-		_ctlargcount(t, cp, 2);
-		_setctlimage(t, &t->mask, cp->args[1]);
+		_ctlargcount(&t->Control, cp, 2);
+		_setctlimage(&t->Control, &t->mask, cp->args[1]);
 		t->lastshow = -1;	/* force redraw */
 		break;
 	case EPaletextcolor:
-		_ctlargcount(t, cp, 2);
-		_setctlimage(t, &t->paletextcolor, cp->args[1]);
+		_ctlargcount(&t->Control, cp, 2);
+		_setctlimage(&t->Control, &t->paletextcolor, cp->args[1]);
 		t->lastshow = -1;	/* force redraw */
 		break;
 	case EPressedtextcolor:
-		_ctlargcount(t, cp, 2);
-		_setctlimage(t, &t->pressedtextcolor, cp->args[1]);
+		_ctlargcount(&t->Control, cp, 2);
+		_setctlimage(&t->Control, &t->pressedtextcolor, cp->args[1]);
 		t->lastshow = -1;	/* force redraw */
 		break;
 	case ERect:
-		_ctlargcount(t, cp, 5);
+		_ctlargcount(&t->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", t->name, cp->str);
-		t->rect = r;
+			ctlerror("%q: bad rectangle: %s", t->Control.name, cp->str);
+		t->Control.rect = r;
 		t->lastshow = -1;	/* force redraw */
 		break;
 	case EReveal:
-		_ctlargcount(t, cp, 1);
-		t->hidden = 0;
+		_ctlargcount(&t->Control, cp, 1);
+		t->Control.hidden = 0;
 		t->lastshow = -1;	/* force redraw */
 		textbuttonshow(t);
 		break;
 	case EShow:
-		_ctlargcount(t, cp, 1);
+		_ctlargcount(&t->Control, cp, 1);
 		t->lastshow = -1;	/* force redraw */
 		textbuttonshow(t);
 		break;
@@ -288,16 +288,16 @@ textbuttonctl(Control *c, CParse *cp)
 		if (cp->nargs == 3)
 			r.max = Pt(0x7fffffff, 0x7fffffff);
 		else{
-			_ctlargcount(t, cp, 5);
+			_ctlargcount(&t->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", t->name, cp->str);
-		t->size.min = r.min;
-		t->size.max = r.max;
+			ctlerror("%q: bad sizes: %s", t->Control.name, cp->str);
+		t->Control.size.min = r.min;
+		t->Control.size.max = r.max;
 		break;
 	case EText:
 		/* free existing text */
@@ -311,12 +311,12 @@ textbuttonctl(Control *c, CParse *cp)
 		textbuttonshow(t);
 		break;
 	case ETextcolor:
-		_ctlargcount(t, cp, 2);
-		_setctlimage(t, &t->textcolor, cp->args[1]);
+		_ctlargcount(&t->Control, cp, 2);
+		_setctlimage(&t->Control, &t->textcolor, cp->args[1]);
 		t->lastshow = -1;	/* force redraw */
 		break;
 	case EValue:
-		_ctlargcount(t, cp, 2);
+		_ctlargcount(&t->Control, cp, 2);
 		if((cp->iargs[1]!=0) != t->pressed){
 			t->pressed ^= 1;
 			textbuttonshow(t);
@@ -341,11 +341,11 @@ createtextbutton(Controlset *cs, char *name)
 	t->pressedtextcolor = _getctlimage("black");
 	t->paletextcolor = _getctlimage("paleyellow");
 	t->font = _getctlfont("font");
-	t->format = ctlstrdup("%q: value %d");
+	t->Control.format = ctlstrdup("%q: value %d");
 	t->lastshow = -1;
-	t->mouse = textbuttonmouse;
-	t->ctl = textbuttonctl;
-	t->exit = textbuttonfree;
+	t->Control.mouse = textbuttonmouse;
+	t->Control.ctl = textbuttonctl;
+	t->Control.exit = textbuttonfree;
 	t->prepress = 0;
 	t->off = 0;
 	t->showoff = -1;

+ 53 - 53
sys/src/libcontrol/textbutton3.c

@@ -23,7 +23,7 @@ typedef struct Textbutton3 Textbutton3;
 
 struct Textbutton3
 {
-	Control;
+	Control Control;
 	CFont	*font;
 	CImage	*image;
 	CImage	*mask;
@@ -111,9 +111,9 @@ textbutton3mouse(Control *c, Mouse *m)
 			t->lastbut = m->buttons & 1;
 		}else if((m->buttons&1) == 0 && (t->lastbut&1) == 1){
 			if(t->gettextflg == 0)
-				chanprint(t->event, t->format, t->name, t->pressed, m->xy.x, m->xy.y);
+				chanprint(t->Control.event, t->Control.format, t->Control.name, t->pressed, m->xy.x, m->xy.y);
 			else
-				chanprint(t->event, "%q: value %q", t->name, t->line[0]);
+				chanprint(t->Control.event, "%q: value %q", t->Control.name, t->line[0]);
 			t->pressed ^= 1;
 			textbutton3show(t);
 			t->lastbut = m->buttons & 1;
@@ -126,9 +126,9 @@ textbutton3mouse(Control *c, Mouse *m)
 			t->lastbut = m->buttons & 2;
 		}else if((m->buttons&2) == 0 && (t->lastbut&2) == 2){
 			if(t->gettextflg == 0)
-				chanprint(t->event, t->format, t->name, t->pressed, m->xy.x, m->xy.y);
+				chanprint(t->Control.event, t->Control.format, t->Control.name, t->pressed, m->xy.x, m->xy.y);
 			else
-				chanprint(t->event, "%q: value %q", t->name, t->line[0]);
+				chanprint(t->Control.event, "%q: value %q", t->Control.name, t->line[0]);
 			t->pressed ^= 2;
 			textbutton3show(t);
 			t->lastbut = m->buttons & 2;
@@ -141,9 +141,9 @@ textbutton3mouse(Control *c, Mouse *m)
 			t->lastbut = m->buttons & 4;
 		}else if((m->buttons&4) == 0 && (t->lastbut&4) == 4){
 			if(t->gettextflg == 0)
-				chanprint(t->event, t->format, t->name, t->pressed, m->xy.x, m->xy.y);
+				chanprint(t->Control.event, t->Control.format, t->Control.name, t->pressed, m->xy.x, m->xy.y);
 			else
-				chanprint(t->event, "%q: value %q", t->name, t->line[0]);
+				chanprint(t->Control.event, "%q: value %q", t->Control.name, t->line[0]);
 			t->pressed ^= 4;
 			textbutton3show(t);
 			t->lastbut = m->buttons & 4;
@@ -179,14 +179,14 @@ textbutton3show(Textbutton3 *t)
 	Point p, q;
 	Image *im;
 
-	if(t->hidden || t->lastshow == t->pressed)
+	if(t->Control.hidden || t->lastshow == t->pressed)
 		return;
 	f = t->font->font;
-	draw(t->screen, t->rect, t->image->image, nil, t->image->image->r.min);
+	draw(t->Control.screen, t->Control.rect, t->image->image, nil, t->image->image->r.min);
 	if(t->pressed || t->toggle)
-		draw(t->screen, t->rect, t->light->image, t->mask->image, t->mask->image->r.min);
+		draw(t->Control.screen, t->Control.rect, t->light->image, t->mask->image, t->mask->image->r.min);
 	if(t->border > 0)
-		border(t->screen, t->rect, t->border, t->bordercolor->image, ZP);
+		border(t->Control.screen, t->Control.rect, t->border, t->bordercolor->image, ZP);
 	/* text goes here */
 	dx = 0;
 	for(i=0; i<t->nline; i++){
@@ -195,7 +195,7 @@ textbutton3show(Textbutton3 *t)
 			dx = w;
 	}
 	dy = t->nline*f->height;
-	clipr = insetrect(t->rect, t->border);
+	clipr = insetrect(t->Control.rect, t->border);
 	p = _ctlalignpoint(clipr, dx, dy, t->align);
 	im = t->textcolor->image;
 	if(t->pressed)
@@ -205,7 +205,7 @@ textbutton3show(Textbutton3 *t)
 		r.max.x = p.x+dx;
 		r.max.y = p.y+f->height;
 		q = _ctlalignpoint(r, stringwidth(f, t->line[i]), f->height, t->align%3);
-		_string(t->screen, q, im,
+		_string(t->Control.screen, q, im,
 			ZP, f, t->line[i], nil, strlen(t->line[i]),
 			clipr, nil, ZP, SoverD);
 		p.y += f->height;
@@ -225,77 +225,77 @@ textbutton3ctl(Control *c, CParse *cp)
 	cmd = _ctllookup(cp->args[0], cmds, nelem(cmds));
 	switch(cmd){
 	default:
-		ctlerror("%q: unrecognized message '%s'", t->name, cp->str);
+		ctlerror("%q: unrecognized message '%s'", t->Control.name, cp->str);
 		break;
 	case EAlign:
-		_ctlargcount(t, cp, 2);
+		_ctlargcount(&t->Control, cp, 2);
 		t->align = _ctlalignment(cp->args[1]);
 		t->lastshow = -1;	/* force redraw */
 		break;
 	case EBorder:
-		_ctlargcount(t, cp, 2);
+		_ctlargcount(&t->Control, cp, 2);
 		t->border = cp->iargs[1];
 		t->lastshow = -1;	/* force redraw */
 		break;
 	case EBordercolor:
-		_ctlargcount(t, cp, 2);
-		_setctlimage(t, &t->bordercolor, cp->args[1]);
+		_ctlargcount(&t->Control, cp, 2);
+		_setctlimage(&t->Control, &t->bordercolor, cp->args[1]);
 		t->lastshow = -1;	/* force redraw */
 		break;
 	case EFocus:
 		break;
 	case EFont:
-		_ctlargcount(t, cp, 2);
-		_setctlfont(t, &t->font, cp->args[1]);
+		_ctlargcount(&t->Control, cp, 2);
+		_setctlfont(&t->Control, &t->font, cp->args[1]);
 		t->lastshow = -1;	/* force redraw */
 		break;
 	case EFormat:
-		_ctlargcount(t, cp, 2);
-		t->format = ctlstrdup(cp->args[1]);
+		_ctlargcount(&t->Control, cp, 2);
+		t->Control.format = ctlstrdup(cp->args[1]);
 		break;
 	case EHide:
-		_ctlargcount(t, cp, 1);
-		t->hidden = 1;
+		_ctlargcount(&t->Control, cp, 1);
+		t->Control.hidden = 1;
 		break;
 	case EImage:
-		_ctlargcount(t, cp, 2);
-		_setctlimage(t, &t->image, cp->args[1]);
+		_ctlargcount(&t->Control, cp, 2);
+		_setctlimage(&t->Control, &t->image, cp->args[1]);
 		t->lastshow = -1;	/* force redraw */
 		break;
 	case ELight:
-		_ctlargcount(t, cp, 2);
-		_setctlimage(t, &t->light, cp->args[1]);
+		_ctlargcount(&t->Control, cp, 2);
+		_setctlimage(&t->Control, &t->light, cp->args[1]);
 		t->lastshow = -1;	/* force redraw */
 		break;
 	case EMask:
-		_ctlargcount(t, cp, 2);
-		_setctlimage(t, &t->mask, cp->args[1]);
+		_ctlargcount(&t->Control, cp, 2);
+		_setctlimage(&t->Control, &t->mask, cp->args[1]);
 		t->lastshow = -1;	/* force redraw */
 		break;
 	case EPressedtextcolor:
-		_ctlargcount(t, cp, 2);
-		_setctlimage(t, &t->pressedtextcolor, cp->args[1]);
+		_ctlargcount(&t->Control, cp, 2);
+		_setctlimage(&t->Control, &t->pressedtextcolor, cp->args[1]);
 		t->lastshow = -1;	/* force redraw */
 		break;
 	case ERect:
-		_ctlargcount(t, cp, 5);
+		_ctlargcount(&t->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", t->name, cp->str);
-		t->rect = r;
+			ctlerror("%q: bad rectangle: %s", t->Control.name, cp->str);
+		t->Control.rect = r;
 		t->lastshow = -1;	/* force redraw */
 		break;
 	case EReveal:
-		_ctlargcount(t, cp, 1);
-		t->hidden = 0;
+		_ctlargcount(&t->Control, cp, 1);
+		t->Control.hidden = 0;
 		t->lastshow = -1;	/* force redraw */
 		textbutton3show(t);
 		break;
 	case EShow:
-		_ctlargcount(t, cp, 1);
+		_ctlargcount(&t->Control, cp, 1);
 		t->lastshow = -1;	/* force redraw */
 		textbutton3show(t);
 		break;
@@ -303,16 +303,16 @@ textbutton3ctl(Control *c, CParse *cp)
 		if (cp->nargs == 3)
 			r.max = Pt(0x7fffffff, 0x7fffffff);
 		else{
-			_ctlargcount(t, cp, 5);
+			_ctlargcount(&t->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", t->name, cp->str);
-		t->size.min = r.min;
-		t->size.max = r.max;
+			ctlerror("%q: bad sizes: %s", t->Control.name, cp->str);
+		t->Control.size.min = r.min;
+		t->Control.size.max = r.max;
 		break;
 	case EText:
 		/* free existing text */
@@ -326,12 +326,12 @@ textbutton3ctl(Control *c, CParse *cp)
 		textbutton3show(t);
 		break;
 	case ETextcolor:
-		_ctlargcount(t, cp, 2);
-		_setctlimage(t, &t->textcolor, cp->args[1]);
+		_ctlargcount(&t->Control, cp, 2);
+		_setctlimage(&t->Control, &t->textcolor, cp->args[1]);
 		t->lastshow = -1;	/* force redraw */
 		break;
 	case EEnable:
-		_ctlargcount(t, cp, 2);
+		_ctlargcount(&t->Control, cp, 2);
 		if(strcmp(cp->args[1], "left") == 0)
 				t->left = 1;
 		else if(strcmp(cp->args[1], "middle") == 0)
@@ -340,7 +340,7 @@ textbutton3ctl(Control *c, CParse *cp)
 				t->right = 1;
 		break;
 	case EDisable:
-		_ctlargcount(t, cp, 2);
+		_ctlargcount(&t->Control, cp, 2);
 		if(strcmp(cp->args[1], "left") == 0)
 			t->left = 0;
 		else if(strcmp(cp->args[1], "middle") == 0)
@@ -349,7 +349,7 @@ textbutton3ctl(Control *c, CParse *cp)
 			t->right = 0;
 		break;
 	case EToggle:
-		_ctlargcount(t, cp, 2);
+		_ctlargcount(&t->Control, cp, 2);
 		if(strcmp(cp->args[1], "on") == 0)
 			t->toggle = 1;
 		else if(strcmp(cp->args[1], "off") == 0)
@@ -357,14 +357,14 @@ textbutton3ctl(Control *c, CParse *cp)
 		t->lastshow = -1;	/* force redraw */
 		break;
 	case EGettext:
-		_ctlargcount(t, cp, 2);
+		_ctlargcount(&t->Control, cp, 2);
 		if(strcmp(cp->args[1], "on") == 0)
 			t->gettextflg = 1;
 		else if(strcmp(cp->args[1], "off") == 0)
 			t->gettextflg = 0;
 		break;
 	case EValue:
-		_ctlargcount(t, cp, 2);
+		_ctlargcount(&t->Control, cp, 2);
 		if((cp->iargs[1]!=0) != t->pressed){
 			t->pressed ^= 1;
 			textbutton3show(t);
@@ -388,11 +388,11 @@ createtextbutton3(Controlset *cs, char *name)
 	t->textcolor = _getctlimage("black");
 	t->pressedtextcolor = _getctlimage("black");
 	t->font = _getctlfont("font");
-	t->format = ctlstrdup("%q: value %d %d %d");
+	t->Control.format = ctlstrdup("%q: value %d %d %d");
 	t->lastshow = -1;
-	t->mouse = textbutton3mouse;
-	t->ctl = textbutton3ctl;
-	t->exit = textbutton3free;
+	t->Control.mouse = textbutton3mouse;
+	t->Control.ctl = textbutton3ctl;
+	t->Control.exit = textbutton3free;
 	t->left = 1;
 	t->middle = 1;
 	t->right = 1;