Tabs to spaces, more consistent formatting.
[AROS.git] / workbench / libs / asl / fontreqsupport.c
blob240beeee7971659cd43524729e9a412171b28817
1 /*
2 Copyright © 1995-2001, The AROS Development Team. All rights reserved.
3 $Id$
5 Desc:
6 Lang: english
7 */
9 /*****************************************************************************************/
11 #include <proto/exec.h>
12 #include <proto/dos.h>
13 #include <proto/intuition.h>
14 #include <proto/graphics.h>
15 #include <proto/utility.h>
16 #include <proto/diskfont.h>
17 #include <exec/memory.h>
18 #include <exec/initializers.h>
19 #include <intuition/imageclass.h>
20 #include <dos/dos.h>
21 #include <stdio.h>
22 #include <string.h>
23 #include <stdlib.h>
25 #include <clib/macros.h>
27 #include "asl_intern.h"
28 #include "fontreqsupport.h"
29 #include "fontreqhooks.h"
30 #include "layout.h"
32 #define SDEBUG 0
33 #define DEBUG 0
34 //#define ADEBUG 0
36 #include <aros/debug.h>
38 /*****************************************************************************************/
40 static WORD FOCompareFontNodes(struct IntFontReq *iforeq, struct Node *node1,
41 struct Node *node2, struct AslBase_intern *AslBase)
43 return Stricmp(node1->ln_Name, node2->ln_Name);
46 /*****************************************************************************************/
48 static WORD FOCompareSizeNodes(struct IntFontReq *iforeq, struct Node *node1,
49 struct Node *node2, struct AslBase_intern *AslBase)
51 return ((IPTR)node1->ln_Name) - ((IPTR)node2->ln_Name);
54 /*****************************************************************************************/
56 static int AVFCompare(struct AvailFonts *one, struct AvailFonts *two)
58 int retval = strcmp(one->af_Attr.ta_Name, two->af_Attr.ta_Name);
60 if (!retval) retval = ((int)one->af_Attr.ta_YSize) -
61 ((int)two->af_Attr.ta_YSize);
63 return retval;
66 /*****************************************************************************************/
68 static void SortAvailFonts(struct AvailFontsHeader *afh, struct AslBase_intern *AslBase)
70 struct AvailFonts *avf;
71 WORD numentries;
73 avf = (struct AvailFonts *)&afh[1];
74 numentries = afh->afh_NumEntries;
75 if (numentries < 2) return;
77 qsort(avf,
78 numentries,
79 sizeof(*avf),
80 (int (*)(const void *, const void *))AVFCompare);
83 /*****************************************************************************************/
85 LONG FOGetFonts(struct LayoutData *ld, struct AslBase_intern *AslBase)
87 struct FOUserData *udata = (struct FOUserData *)ld->ld_UserData;
88 struct IntFontReq *iforeq = (struct IntFontReq *)ld->ld_IntReq;
89 struct AvailFonts *avf;
90 ULONG afshortage = 0, afsize = 100;
91 WORD i;
93 FOFreeFonts(ld, AslBase);
97 udata->AFH = (struct AvailFontsHeader *)AllocVec(afsize, MEMF_ANY);
98 if (udata->AFH)
100 afshortage = AvailFonts((STRPTR)udata->AFH, afsize, AFF_MEMORY | AFF_DISK);
102 if (afshortage)
104 FreeVec(udata->AFH);
105 afsize += afshortage;
109 } while (udata->AFH && afshortage);
111 if (!udata->AFH) return ERROR_NO_FREE_STORE;
113 SortAvailFonts(udata->AFH, AslBase);
115 avf = (struct AvailFonts *)&udata->AFH[1];
117 for(i = 0; i < udata->AFH->afh_NumEntries;)
119 struct AvailFonts *avf_start = avf;
120 struct ASLLVFontReqNode *fontnode;
121 UWORD num_sizes = 1;
122 WORD i2 = i;
124 while (i2 < udata->AFH->afh_NumEntries - 1)
126 i2++; avf++;
127 if (strcmp(avf_start->af_Attr.ta_Name, avf->af_Attr.ta_Name)) break;
128 num_sizes++;
131 i += num_sizes; avf = avf_start + num_sizes;
133 if (iforeq->ifo_Flags & FOF_FIXEDWIDTHONLY)
135 if (avf_start->af_Attr.ta_Flags & FPF_PROPORTIONAL) continue;
138 if (iforeq->ifo_FilterFunc)
140 #ifdef __MORPHOS__
142 ULONG ret;
144 REG_A4 = (ULONG)iforeq->ifo_IntReq.ir_BasePtr; /* Compatability */
145 REG_A0 = (ULONG)iforeq->ifo_FilterFunc;
146 REG_A2 = (ULONG)ld->ld_Req;
147 REG_A1 = (ULONG)&avf_start->af_Attr;
148 ret = (*MyEmulHandle->EmulCallDirect68k)(iforeq->ifo_FilterFunc->h_Entry);
150 if (!ret) continue;
152 #else
153 if (!(CallHookPkt(iforeq->ifo_FilterFunc, ld->ld_Req, &avf_start->af_Attr))) continue;
154 #endif
157 if (iforeq->ifo_HookFunc && (iforeq->ifo_Flags & FOF_FILTERFUNC))
159 #ifdef __MORPHOS__
161 ULONG ret;
162 UWORD *funcptr = iforeq->ifo_HookFunc;
163 ULONG *p = (ULONG *)REG_A7 - 3;
165 p[0] = (ULONG)FOF_FILTERFUNC;
166 p[1] = (ULONG)&avf_start->af_Attr;
167 p[2] = (ULONG)ld->ld_Req;
168 REG_A7 = (ULONG)p;
170 if (*funcptr >= (UWORD)0xFF00)
171 REG_A7 -= 4;
173 REG_A4 = (ULONG)iforeq->ifo_IntReq.ir_BasePtr; /* Compatability */
175 ret = (ULONG)(*MyEmulHandle->EmulCallDirect68k)(funcptr);
177 if (*funcptr >= (UWORD)0xFF00)
178 REG_A7 += 4;
180 REG_A7 += (3*4);
182 if (!ret) continue;
184 #else
185 if (!(iforeq->ifo_HookFunc(FOF_FILTERFUNC,
186 &avf_start->af_Attr,
187 (struct FontRequester *)ld->ld_Req))) continue;
188 #endif
191 fontnode = MyAllocVecPooled(ld->ld_IntReq->ir_MemPool,
192 sizeof(*fontnode) + sizeof(struct Node) * num_sizes,
193 AslBase);
195 if (fontnode)
197 char *sp;
198 WORD len;
199 UWORD prevsize = 0;
201 sp = strchr(avf_start->af_Attr.ta_Name, '.');
202 if (sp)
204 len = (IPTR)sp - (IPTR)avf_start->af_Attr.ta_Name - 1;;
206 else
208 /* Paranoia: Should never happen */
209 len = strlen(avf_start->af_Attr.ta_Name);
212 strncpy(fontnode->Name, avf_start->af_Attr.ta_Name, len + 1);
213 fontnode->node.ln_Name = fontnode->Name;
214 fontnode->TAttr = avf_start->af_Attr;
215 fontnode->TAttr.ta_Name = fontnode->Name;
217 fontnode->NumSizes = num_sizes;
219 NEWLIST(&fontnode->SizeList);
221 for(i2 = 0; i2 < num_sizes; i2++, avf_start++)
223 UWORD size = avf_start->af_Attr.ta_YSize;
225 if (size == prevsize) continue;
227 if ((size < iforeq->ifo_MinHeight) ||
228 (size > iforeq->ifo_MaxHeight)) continue;
230 fontnode->SizeNode[i2].ln_Name = (char *)(IPTR)size;
231 SortInNode(iforeq, &fontnode->SizeList, &fontnode->SizeNode[i2], (APTR)FOCompareSizeNodes, AslBase);
233 prevsize = size;
236 SortInNode(iforeq, &udata->NameListviewList, &fontnode->node, (APTR)FOCompareFontNodes, AslBase);
240 } /* for(i = 0; i < udata->AFH->afh_NumEntries; ) */
242 if (udata->NameListview)
244 struct TagItem set_tags[] =
246 {ASLLV_Labels, (IPTR)&udata->NameListviewList },
247 {TAG_DONE }
249 STRPTR fontname;
250 IPTR fontsize;
252 SetGadgetAttrsA((struct Gadget *)udata->NameListview, ld->ld_Window, NULL, set_tags);
254 GetAttr(STRINGA_TextVal, udata->NameString, (IPTR *)&fontname);
255 GetAttr(STRINGA_LongVal, udata->SizeString, (IPTR *)&fontsize);
257 FORestore(ld, fontname, fontsize, AslBase);
261 return IsListEmpty(&udata->NameListviewList) ? ERROR_NO_MORE_ENTRIES : 0;
265 /*****************************************************************************************/
267 void FOFreeFonts(struct LayoutData *ld, struct AslBase_intern *AslBase)
269 struct FOUserData *udata = (struct FOUserData *)ld->ld_UserData;
270 struct ASLVFontReqNode *node, *succ;
271 struct TagItem set_tags[] =
273 {ASLLV_Labels, 0 },
274 {TAG_DONE }
277 udata->ActiveFont = NULL;
279 if (udata->NameListview) SetGadgetAttrsA((struct Gadget *)udata->NameListview, ld->ld_Window, NULL, set_tags);
280 if (udata->SizeListview) SetGadgetAttrsA((struct Gadget *)udata->SizeListview, ld->ld_Window, NULL, set_tags);
282 ForeachNodeSafe(&udata->NameListviewList, node, succ)
284 MyFreeVecPooled(node, AslBase);
287 NEWLIST(&udata->NameListviewList);
289 if (udata->AFH)
291 FreeVec(udata->AFH);
292 udata->AFH = NULL;
296 /*****************************************************************************************/
298 VOID FOUpdatePreview(struct LayoutData *ld, struct AslBase_intern *AslBase)
300 struct FOUserData *udata = (struct FOUserData *)ld->ld_UserData;
301 struct IntReq *intreq = ld->ld_IntReq;
302 struct IntFontReq *iforeq = (struct IntFontReq *)ld->ld_IntReq;
303 struct TextAttr ta;
304 struct TextFont *font;
305 IPTR val;
306 STRPTR name;
308 GetAttr(STRINGA_LongVal, udata->SizeString, &val);
309 ta.ta_YSize = (WORD)val;
310 ta.ta_Flags = 0;
311 ta.ta_Style = 0;
313 GetAttr(STRINGA_TextVal, udata->NameString, (IPTR *)&name);
314 if ((name = VecPooledCloneString(name, ".font", intreq->ir_MemPool, AslBase)))
316 UBYTE style = FS_NORMAL;
317 UBYTE apen = iforeq->ifo_FrontPen;
318 UBYTE bpen = iforeq->ifo_BackPen;
320 ta.ta_Name = name;
322 if (iforeq->ifo_Flags & FOF_DOSTYLE)
324 style = FOGetStyle(ld, AslBase);
327 if (iforeq->ifo_Flags & FOF_DOFRONTPEN)
329 apen = FOGetFGColor(ld, AslBase);
332 if (iforeq->ifo_Flags & FOF_DOBACKPEN)
334 bpen = FOGetBGColor(ld, AslBase);
337 font = OpenDiskFont(&ta);
339 struct TagItem settags[] =
341 {ASLFP_Font , (IPTR)font },
342 {ASLFP_Style, style },
343 {ASLFP_APen , apen },
344 {ASLFP_BPen , bpen },
345 {TAG_DONE }
348 SetGadgetAttrsA((struct Gadget *)udata->Preview, ld->ld_Window, NULL, settags);
351 if (udata->PreviewFont) CloseFont(udata->PreviewFont);
352 udata->PreviewFont = font;
354 MyFreeVecPooled(name, AslBase);
358 /*****************************************************************************************/
360 struct ASLLVFontReqNode *FOGetActiveFont(struct LayoutData *ld, struct AslBase_intern *AslBase)
362 struct FOUserData *udata = (struct FOUserData *)ld->ld_UserData;
363 IPTR active;
365 GetAttr(ASLLV_Active, udata->NameListview, &active);
367 return (struct ASLLVFontReqNode *)FindListNode(&udata->NameListviewList, active);
370 /*****************************************************************************************/
372 void FOChangeActiveFont(struct LayoutData *ld, WORD delta, UWORD quali, BOOL jump, struct AslBase_intern *AslBase)
374 struct FOUserData *udata = (struct FOUserData *)ld->ld_UserData;
375 IPTR active, total, visible, size;
377 GetAttr(ASLLV_Active , udata->NameListview, &active );
378 GetAttr(ASLLV_Total , udata->NameListview, &total );
379 GetAttr(ASLLV_Visible , udata->NameListview, &visible);
380 GetAttr(STRINGA_LongVal, udata->SizeString , &size );
382 if (total)
384 if (quali & (IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT))
386 delta *= (visible - 1);
388 else if (quali & (IEQUALIFIER_LALT | IEQUALIFIER_RALT | IEQUALIFIER_CONTROL))
390 delta *= total;
392 else if (jump)
394 /* try to jump to first item which matches text in name string gadget,
395 but only if text in string gadget mismatches actual active
396 item's text (in this case move normally = one step)) */
398 struct ASLLVFontReqNode *node;
399 UBYTE buffer[MAXFONTNAME + 2];
400 STRPTR val;
401 WORD i, len;
402 BOOL dojump = TRUE;
404 GetAttr(STRINGA_TextVal, udata->NameString, (IPTR *)&val);
405 strcpy(buffer, val);
407 len = strlen(buffer);
409 if (len)
411 if (((LONG)active) >= 0)
413 if ((node = (struct ASLLVFontReqNode *)FindListNode(&udata->NameListviewList, (WORD)active)))
415 if (stricmp(node->node.ln_Name, buffer) == 0) dojump = FALSE;
419 if (dojump)
421 i = 0;
422 ForeachNode(&udata->NameListviewList, node)
424 if (Strnicmp((CONST_STRPTR)node->node.ln_Name, (CONST_STRPTR)buffer, len) == 0)
426 active = i;
427 delta = 0;
428 break;
430 i++;
433 } /* if (dojump) */
435 } /* if (len) */
438 active += delta;
440 if (((LONG)active) < 0) active = 0;
441 if (active >= total) active = total - 1;
443 FOActivateFont(ld, active, (LONG)size, AslBase);
447 /*****************************************************************************************/
449 void FOChangeActiveSize(struct LayoutData *ld, WORD delta, UWORD quali, struct AslBase_intern *AslBase)
451 struct FOUserData *udata = (struct FOUserData *)ld->ld_UserData;
452 IPTR active, total, visible;
454 GetAttr(ASLLV_Active , udata->SizeListview, &active );
455 GetAttr(ASLLV_Total , udata->SizeListview, &total );
456 GetAttr(ASLLV_Visible, udata->SizeListview, &visible);
458 if (total)
460 if (quali & (IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT))
462 delta *= (visible - 1);
464 else if (quali & (IEQUALIFIER_LALT | IEQUALIFIER_RALT | IEQUALIFIER_CONTROL))
466 delta *= total;
469 active += delta;
471 if (((LONG)active) < 0) active = 0;
472 if (active >= total) active = total - 1;
474 FOActivateSize(ld, active, AslBase);
478 /*****************************************************************************************/
480 void FOActivateFont(struct LayoutData *ld, WORD which, LONG size, struct AslBase_intern *AslBase)
482 struct FOUserData *udata = (struct FOUserData *)ld->ld_UserData;
483 // struct IntFontReq *iforeq = (struct IntFontReq *)ld->ld_IntReq;
484 struct ASLLVFontReqNode *fontnode;
485 struct Node *node;
486 struct TagItem name_tags[] =
488 {ASLLV_Active , 0 },
489 {ASLLV_MakeVisible , 0 },
490 {TAG_DONE }
492 struct TagItem size_tags[] =
494 {ASLLV_Labels , 0 },
495 {ASLLV_Active , (IPTR)-1 },
496 {ASLLV_MakeVisible , 0 },
497 {TAG_DONE }
499 WORD sizelvindex = 0;
501 fontnode = (struct ASLLVFontReqNode *)FindListNode(&udata->NameListviewList, which);
502 udata->ActiveFont = fontnode;
504 if (!fontnode)
506 SetGadgetAttrsA((struct Gadget *)udata->SizeListview, ld->ld_Window, NULL, size_tags);
508 name_tags[0].ti_Data = (IPTR)-1;
509 name_tags[1].ti_Tag = TAG_IGNORE;
510 SetGadgetAttrsA((struct Gadget *)udata->NameListview, ld->ld_Window, NULL, name_tags);
512 else
514 name_tags[0].ti_Data = name_tags[1].ti_Data = which;
515 SetGadgetAttrsA((struct Gadget *)udata->NameListview, ld->ld_Window, NULL, name_tags);
517 size_tags[0].ti_Data = (IPTR)&fontnode->SizeList;
518 ForeachNode(&fontnode->SizeList, node)
520 MARK_UNSELECTED(node);
521 if ((IPTR)node->ln_Name == size)
523 size_tags[1].ti_Data = size_tags[2].ti_Data = sizelvindex;
525 sizelvindex++;
527 SetGadgetAttrsA((struct Gadget *)udata->SizeListview, ld->ld_Window, NULL, size_tags);
529 FOSetFontString(fontnode->node.ln_Name, ld, AslBase);
532 FOUpdatePreview(ld, AslBase);
535 /*****************************************************************************************/
537 void FOActivateSize(struct LayoutData *ld, WORD which, struct AslBase_intern *AslBase)
539 struct FOUserData *udata = (struct FOUserData *)ld->ld_UserData;
540 // struct IntFontReq *iforeq = (struct IntFontReq *)ld->ld_IntReq;
541 struct Node *node;
542 struct TagItem size_tags[] =
544 {ASLLV_Active , 0 },
545 {ASLLV_MakeVisible , 0 },
546 {TAG_DONE }
549 if (!udata->ActiveFont) return;
551 if (which >= 0)
553 node = FindListNode(&udata->ActiveFont->SizeList, which);
555 else
557 LONG size = -which;
558 BOOL found = FALSE;
560 which = 0;
561 ForeachNode(&udata->ActiveFont->SizeList, node)
563 if ((IPTR)node->ln_Name == size)
565 found = TRUE;
566 break;
568 which++;
571 if (!found) node = NULL;
574 size_tags[0].ti_Data = node ? which : -1;
575 size_tags[1].ti_Data = node ? which : 0;
577 SetGadgetAttrsA((struct Gadget *)udata->SizeListview, ld->ld_Window, NULL, size_tags);
579 if (node) FOSetSizeString((IPTR)node->ln_Name, ld, AslBase);
581 FOUpdatePreview(ld, AslBase);
584 /*****************************************************************************************/
586 void FORestore(struct LayoutData *ld, STRPTR fontname, LONG fontsize, struct AslBase_intern *AslBase)
588 struct FOUserData *udata = (struct FOUserData *)ld->ld_UserData;
589 struct IntFontReq *iforeq = (struct IntFontReq *)ld->ld_IntReq;
590 struct ASLLVFontReqNode *fontnode;
591 struct TagItem set_tags[] =
593 {ASLLV_Labels , 0 },
594 {TAG_DONE }
596 UBYTE initialfontname[MAXFONTNAME + 2];
597 char *sp;
598 WORD i = 0;
600 strncpy(initialfontname, fontname, MAXFONTNAME + 1);
601 if ((sp = strchr(initialfontname, '.'))) *sp = '\0';
603 FOSetSizeString(fontsize, ld, AslBase);
605 SetGadgetAttrsA((struct Gadget *)udata->SizeListview, ld->ld_Window, NULL, set_tags);
607 ForeachNode(&udata->NameListviewList, fontnode)
609 if (stricmp(fontnode->node.ln_Name, initialfontname) == 0) break;
610 i++;
613 if (iforeq->ifo_Flags & FOF_DODRAWMODE)
615 FOSetDrawMode(ld, iforeq->ifo_DrawMode, AslBase);
618 if (iforeq->ifo_Flags & FOF_DOSTYLE)
620 FOSetStyle(ld, iforeq->ifo_TextAttr.ta_Style, AslBase);
623 if (iforeq->ifo_Flags & FOF_DOFRONTPEN)
625 FOSetFGColor(ld, iforeq->ifo_FrontPen, AslBase);
628 if (iforeq->ifo_Flags & FOF_DOBACKPEN)
630 FOSetBGColor(ld, iforeq->ifo_BackPen, AslBase);
633 FOActivateFont(ld, i, fontsize, AslBase);
636 /*****************************************************************************************/
638 void FOSetFontString(STRPTR name, struct LayoutData *ld, struct AslBase_intern *AslBase)
640 struct FOUserData *udata = (struct FOUserData *)ld->ld_UserData;
641 struct TagItem set_tags[] =
643 {STRINGA_TextVal , (IPTR)name },
644 {TAG_DONE }
647 SetGadgetAttrsA((struct Gadget *)udata->NameString, ld->ld_Window, NULL, set_tags);
650 /*****************************************************************************************/
652 void FOSetSizeString(LONG size, struct LayoutData *ld, struct AslBase_intern *AslBase)
654 struct FOUserData *udata = (struct FOUserData *)ld->ld_UserData;
655 struct TagItem set_tags[] =
657 {STRINGA_LongVal , (IPTR)size },
658 {TAG_DONE }
661 SetGadgetAttrsA((struct Gadget *)udata->SizeString, ld->ld_Window, NULL, set_tags);
664 /*****************************************************************************************/
666 LONG FOGetDrawMode(struct LayoutData *ld, struct AslBase_intern *AslBase)
668 struct FOUserData *udata = (struct FOUserData *)ld->ld_UserData;
669 IPTR active;
671 ASSERT(udata->DrawModeGadget);
673 GetAttr(ASLCY_Active, udata->DrawModeGadget, &active);
675 return (LONG)active;
678 /*****************************************************************************************/
680 void FOSetDrawMode(struct LayoutData *ld, UWORD id, struct AslBase_intern *AslBase)
682 struct FOUserData *udata = (struct FOUserData *)ld->ld_UserData;
683 struct TagItem set_tags[] =
685 {ASLCY_Active , id },
686 {TAG_DONE }
689 ASSERT(udata->DrawModeGadget);
691 SetGadgetAttrsA((struct Gadget *)udata->DrawModeGadget, ld->ld_Window, NULL, set_tags);
695 /*****************************************************************************************/
697 UBYTE FOGetStyle(struct LayoutData *ld, struct AslBase_intern *AslBase)
699 struct FOUserData *udata = (struct FOUserData *)ld->ld_UserData;
700 IPTR style;
702 ASSERT(udata->StyleGadget);
704 GetAttr(ASLFS_Style, udata->StyleGadget, &style);
706 return (UBYTE)style;
709 /*****************************************************************************************/
711 void FOSetStyle(struct LayoutData *ld, UBYTE style, struct AslBase_intern *AslBase)
713 struct FOUserData *udata = (struct FOUserData *)ld->ld_UserData;
714 struct TagItem set_tags[] =
716 {ASLFS_Style , style },
717 {TAG_DONE }
720 ASSERT(udata->StyleGadget);
722 SetGadgetAttrsA((struct Gadget *)udata->StyleGadget, ld->ld_Window, NULL, set_tags);
726 /*****************************************************************************************/
728 UBYTE FOGetFGColor(struct LayoutData *ld, struct AslBase_intern *AslBase)
730 struct FOUserData *udata = (struct FOUserData *)ld->ld_UserData;
731 IPTR color;
733 ASSERT(udata->FGColorGadget);
735 GetAttr(ASLCP_Color, udata->FGColorGadget, &color);
737 return (UBYTE)color;
740 /*****************************************************************************************/
742 void FOSetFGColor(struct LayoutData *ld, UBYTE color, struct AslBase_intern *AslBase)
744 struct FOUserData *udata = (struct FOUserData *)ld->ld_UserData;
745 struct TagItem set_tags[] =
747 {ASLCP_Color , color },
748 {TAG_DONE }
751 ASSERT(udata->FGColorGadget);
753 SetGadgetAttrsA((struct Gadget *)udata->FGColorGadget, ld->ld_Window, NULL, set_tags);
757 /*****************************************************************************************/
759 UBYTE FOGetBGColor(struct LayoutData *ld, struct AslBase_intern *AslBase)
761 struct FOUserData *udata = (struct FOUserData *)ld->ld_UserData;
762 IPTR color;
764 ASSERT(udata->BGColorGadget);
766 GetAttr(ASLCP_Color, udata->BGColorGadget, &color);
768 return (UBYTE)color;
771 /*****************************************************************************************/
773 void FOSetBGColor(struct LayoutData *ld, UBYTE color, struct AslBase_intern *AslBase)
775 struct FOUserData *udata = (struct FOUserData *)ld->ld_UserData;
776 struct TagItem set_tags[] =
778 {ASLCP_Color , color },
779 {TAG_DONE }
782 ASSERT(udata->BGColorGadget);
784 SetGadgetAttrsA((struct Gadget *)udata->BGColorGadget, ld->ld_Window, NULL, set_tags);
788 /*****************************************************************************************/