]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libcontrol/label.c
bcm64: do not use OTP_BOOTMODE_REG to determine OSC frequency (thanks richard miller)
[plan9front.git] / sys / src / libcontrol / label.c
1 #include <u.h>
2 #include <libc.h>
3 #include <draw.h>
4 #include <thread.h>
5 #include <mouse.h>
6 #include <keyboard.h>
7 #include <control.h>
8
9 typedef struct Label Label;
10
11 struct Label
12 {
13         Control;
14         int             border;
15         CFont   *font;
16         CImage  *image;
17         CImage  *textcolor;
18         CImage  *bordercolor;
19         char            *text;
20         int             align;
21 };
22
23 enum{
24         EAlign,
25         EBorder,
26         EBordercolor,
27         EFocus,
28         EFont,
29         EHide,
30         EImage,
31         ERect,
32         EReveal,
33         EShow,
34         ESize,
35         ETextcolor,
36         EValue,
37 };
38
39 static char *cmds[] = {
40         [EAlign] =                      "align",
41         [EBorder] =             "border",
42         [EBordercolor] =        "bordercolor",
43         [EFocus] =              "focus",
44         [EFont] =                       "font",
45         [EHide] =                       "hide",
46         [EImage] =              "image",
47         [ERect] =                       "rect",
48         [EReveal] =             "reveal",
49         [EShow] =                       "show",
50         [ESize] =                       "size",
51         [ETextcolor] =          "textcolor",
52         [EValue] =                      "value",
53         nil
54 };
55
56 static void     labelshow(Label*);
57
58 static void
59 labelfree(Control *c)
60 {
61         Label *l;
62
63         l = (Label*)c;
64         _putctlfont(l->font);
65         _putctlimage(l->image);
66         _putctlimage(l->textcolor);
67         _putctlimage(l->bordercolor);
68         free(l->text);
69 }
70
71
72 static void
73 labelshow(Label *l)
74 {
75         Rectangle r;
76         Point p;
77
78         if (l->hidden)
79                 return;
80         r = l->rect;
81         draw(l->screen, r, l->image->image, nil, l->image->image->r.min);
82         if(l->border > 0){
83                 border(l->screen, r, l->border, l->bordercolor->image, l->bordercolor->image->r.min);
84                 r = insetrect(r, l->border);
85         }
86         p = _ctlalignpoint(r,
87                 stringwidth(l->font->font, l->text),
88                 l->font->font->height, l->align);
89         _string(l->screen, p, l->textcolor->image,
90                 ZP, l->font->font, l->text, nil, strlen(l->text),
91                 r, nil, ZP, SoverD);
92         flushimage(display, 1);
93 }
94
95 static void
96 labelctl(Control *c, CParse *cp)
97 {
98         int cmd;
99         Rectangle r;
100         Label *l;
101
102         l = (Label*)c;
103         cmd = _ctllookup(cp->args[0], cmds, nelem(cmds));
104         switch(cmd){
105         default:
106                 ctlerror("%q: unrecognized message '%s'", l->name, cp->str);
107                 break;
108         case EAlign:
109                 _ctlargcount(l, cp, 2);
110                 l->align = _ctlalignment(cp->args[1]);
111                 break;
112         case EBorder:
113                 _ctlargcount(l, cp, 2);
114                 if(cp->iargs[1] < 0)
115                         ctlerror("%q: bad border: %c", l->name, cp->str);
116                 l->border = cp->iargs[1];
117                 break;
118         case EBordercolor:
119                 _ctlargcount(l, cp, 2);
120                 _setctlimage(l, &l->bordercolor, cp->args[1]);
121                 break;
122         case EFocus:
123                 /* ignore focus change */
124                 break;
125         case EFont:
126                 _ctlargcount(l, cp, 2);
127                 _setctlfont(l, &l->font, cp->args[1]);
128                 break;
129         case EHide:
130                 _ctlargcount(l, cp, 1);
131                 l->hidden = 1;
132                 break;
133         case EImage:
134                 _ctlargcount(l, cp, 2);
135                 _setctlimage(l, &l->image, cp->args[1]);
136                 break;
137         case ERect:
138                 _ctlargcount(l, cp, 5);
139                 r.min.x = cp->iargs[1];
140                 r.min.y = cp->iargs[2];
141                 r.max.x = cp->iargs[3];
142                 r.max.y = cp->iargs[4];
143                 if(Dx(r)<=0 || Dy(r)<=0)
144                         ctlerror("%q: bad rectangle: %s", l->name, cp->str);
145                 l->rect = r;
146                 break;
147         case EReveal:
148                 _ctlargcount(l, cp, 1);
149                 l->hidden = 0;
150                 labelshow(l);
151                 break;
152         case EShow:
153                 _ctlargcount(l, cp, 1);
154                 labelshow(l);
155                 /*
156                 _ctlargcount(l, cp, 2);
157                 _setctlimage(l, &l->textcolor, cp->args[1]);
158                 */
159                 break;
160         case ESize:
161                 if (cp->nargs == 3)
162                         r.max = Pt(0x7fffffff, 0x7fffffff);
163                 else{
164                         _ctlargcount(l, cp, 5);
165                         r.max.x = cp->iargs[3];
166                         r.max.y = cp->iargs[4];
167                 }
168                 r.min.x = cp->iargs[1];
169                 r.min.y = cp->iargs[2];
170                 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)
171                         ctlerror("%q: bad sizes: %s", l->name, cp->str);
172                 l->size.min = r.min;
173                 l->size.max = r.max;
174                 break;
175         case ETextcolor:
176                 _ctlargcount(l, cp, 2);
177                 _setctlimage(l, &l->textcolor, cp->args[1]);
178                 break;
179         case EValue:
180                 _ctlargcount(l, cp, 2);
181                 if(strcmp(cp->args[1], l->text) != 0){
182                         free(l->text);
183                         l->text = ctlstrdup(cp->args[1]);
184                         labelshow(l);
185                 }
186                 break;
187         }
188 }
189
190 Control*
191 createlabel(Controlset *cs, char *name)
192 {
193         Label *l;
194
195         l = (Label*)_createctl(cs, "label", sizeof(Label), name);
196         l->text = ctlstrdup("");
197         l->image = _getctlimage("white");
198         l->textcolor = _getctlimage("black");
199         l->bordercolor = _getctlimage("black");
200         l->font = _getctlfont("font");
201         l->border = 0;
202         l->ctl = labelctl;
203         l->exit = labelfree;
204         return (Control *)l;
205 }