forwarding build fix when MUIA_Scrollgroup_AutoBars is defined (NicJA).
[AROS-Contrib.git] / scalos / main / Patches.c
blobb6915647979654375810f0a534581ff43b8c54cd
1 // Patches.c
2 // $Date$
3 // $Revision$
6 #include <exec/types.h>
7 #include <graphics/rastport.h>
8 #include <utility/hooks.h>
9 #include <intuition/gadgetclass.h>
10 #include <intuition/intuitionbase.h>
11 #include <workbench/workbench.h>
12 #include <workbench/startup.h>
13 #include <workbench/icon.h>
14 #include <libraries/gadtools.h>
15 #include <libraries/iffparse.h>
16 #include <datatypes/pictureclass.h>
17 #include <dos/dostags.h>
18 #include <guigfx/guigfx.h>
20 #define __USE_SYSBASE
22 #include <proto/dos.h>
23 #include <proto/exec.h>
24 #include <proto/layers.h>
25 #include <proto/intuition.h>
26 #include <proto/graphics.h>
27 #include <proto/utility.h>
28 #include <proto/icon.h>
29 #include <proto/iconobject.h>
30 #include <proto/guigfx.h>
31 #include <proto/datatypes.h>
32 #include <proto/gadtools.h>
33 #include "debug.h"
34 #include <proto/scalos.h>
36 #include <clib/alib_protos.h>
38 #include <defs.h>
39 #include <datatypes/iconobject.h>
40 #include <scalos/palette.h>
41 #include <scalos/pattern.h>
42 #include <scalos/scalos.h>
44 #include <stdlib.h>
45 #include <stdio.h>
46 #include <string.h>
47 #include <ctype.h>
49 #include "scalos_structures.h"
50 #include "FsAbstraction.h"
51 #include "functions.h"
52 #include "Variables.h"
53 #include "Patches.h"
55 //----------------------------------------------------------------------------
57 // local data structures
59 #if defined(__MORPHOS__)
60 // Extended DiskObject structure
61 #define OWN_MAGIC 0x466f4164
63 struct OwnDiskObject
65 struct DiskObject diskobj;
66 struct FreeList *fl; /* this is safe for WB 3.1 */
67 /* start of additions */
68 ULONG ownmagic;
69 APTR ownptr;
70 APTR png_context;
71 ULONG ttnum;
72 ULONG ttcur;
73 STRPTR path;
74 APTR glowchunk;
75 ULONG glowsize;
76 struct BitMap *pngimage;
77 ULONG pngimage_width;
78 ULONG pngimage_height;
81 #define ISOWN(x) (((struct OwnDiskObject *)x)->ownmagic == OWN_MAGIC && ((struct OwnDiskObject *)x)->ownptr == x)
83 #endif /* __MORPHOS__ */
86 struct DosOpenInfo
88 BPTR doi_fh; // Filehandle as returned from Open - our key
89 LONG doi_AccessMode; // accessMode from Open()
90 struct DateStamp doi_DateBefore; // file's DateStamp immediately after Open()
93 //----------------------------------------------------------------------------
95 // local functions
97 static LONG ReOpenScalos(void);
98 static APTR CloneDOImage(const APTR origImage);
99 static STRPTR *CloneDOToolTypes(CONST_STRPTR *origToolTypes);
100 static struct DiskObject *CloneDiskObject(const struct DiskObject *origDiskObj);
101 static void ScaFreeDiskObject(struct DiskObject *DiskObj);
102 static SAVEDS(ULONG) AppChangeFunc(struct WBArg *ArgArray, struct SM_RunProcess *msg);
103 static void PatchRefreshIcon(CONST_STRPTR IconName, UBYTE IconType);
104 static BOOL IsScalosProcess(void);
105 static void PatchOpenDisposeData(void *data);
106 static void PatchOpenDisposeKey(void *key);
107 static int PatchOpenCompare(const void *key1, const void *key2);
108 #ifdef TEST_OPENWINDOWTAGLIST
109 static void ByteDump(const void *Data, size_t Length);
110 #endif /* TEST_OPENWINDOWTAGLIST */
111 static void PatchAsyncWBUndoRename(CONST_STRPTR oldName, CONST_STRPTR newName);
112 static void PatchAsyncWBUndoCreateDir(CONST_STRPTR name);
114 //----------------------------------------------------------------------------
116 // public data items
118 #ifdef __AROS__
120 #ifdef TEST_OPENWINDOWTAGLIST
121 struct Window * (*OldOpenWindowTagList) ();
122 #endif /* TEST_OPENWINDOWTAGLIST */
123 ULONG (*OldCloseWB) ();
124 ULONG (*OldOpenWB) ();
125 ULONG (*OldRemoveAppIcon) ();
126 BOOL (*OldRemoveAppWindow) ();
127 BOOL (*OldRemoveAppMenuItem) ();
128 struct Screen * (*OldOpenScreenTagList) ();
129 void (*OldUpdateWorkbench) ();
130 APTR OldAddAppIconA;
131 APTR OldAddAppWindowA;
132 APTR OldAppAppMenuItemA;
133 APTR OldSetBackFill;
134 APTR OldWBInfo;
135 BOOL (*OldPutDiskObject) ();
136 BOOL (*OldDeleteDiskObject) ();
137 BOOL (*OldPutIconTagList) ();
138 ULONG (*OldDeleteFile) ();
139 ULONG (*OldRename) ();
140 BPTR (*OldOpen) ();
141 ULONG (*OldClose) ();
142 BPTR (*OldCreateDir) ();
144 #else
146 #ifdef TEST_OPENWINDOWTAGLIST
147 LIBFUNC_P3_DPROTO(struct Window *, (*OldOpenWindowTagList),
148 A0, struct NewWindow *, newWin,
149 A1, const struct TagItem *, TagList,
150 A6, struct IntuitionBase *, iBase);
151 #endif /* TEST_OPENWINDOWTAGLIST */
153 LIBFUNC_P1_DPROTO(ULONG, (*OldCloseWB),
154 A6, struct IntuitionBase *, iBase);
155 LIBFUNC_P1_DPROTO(ULONG, (*OldOpenWB),
156 A6, struct IntuitionBase *, iBase);
157 LIBFUNC_P2_DPROTO(ULONG, (*OldRemoveAppIcon),
158 A0, struct AppIcon *, appIcon,
159 A6, struct Library *, wbBase);
160 LIBFUNC_P2_DPROTO(BOOL, (*OldRemoveAppWindow),
161 A0, struct AppWindow *, aw,
162 A6, struct Library *, wbBase);
163 LIBFUNC_P2_DPROTO(BOOL, (*OldRemoveAppMenuItem),
164 A0, struct AppMenuItem *, ami,
165 A6, struct Library *, wbBase);
166 LIBFUNC_P3_DPROTO(struct Screen *, (*OldOpenScreenTagList),
167 A0, struct NewScreen *, newScr,
168 A1, const struct TagItem *, TagList,
169 A6, struct IntuitionBase *, iBase);
170 LIBFUNC_P4_DPROTO(void, (*OldUpdateWorkbench),
171 A0, CONST_STRPTR, Name,
172 A1, BPTR, ParentLock,
173 D0, LONG, Action,
174 A6, struct Library *, wbBase);
175 APTR OldAddAppIconA;
176 APTR OldAddAppWindowA;
177 APTR OldAppAppMenuItemA;
178 APTR OldSetBackFill;
179 APTR OldWBInfo;
180 LIBFUNC_P3_DPROTO(BOOL, (*OldPutDiskObject),
181 A0, CONST_STRPTR, Name,
182 A1, const struct DiskObject *, diskObj,
183 A6, struct Library *, IconBase);
184 LIBFUNC_P2_DPROTO(BOOL, (*OldDeleteDiskObject),
185 A0, CONST_STRPTR, Name,
186 A6, struct Library *, IconBase);
187 LIBFUNC_P4_DPROTO(BOOL, (*OldPutIconTagList),
188 A0, CONST_STRPTR, Name,
189 A1, const struct DiskObject *, diskObj,
190 A2, struct TagItem *, tags,
191 A6, struct Library *, IconBase);
193 LIBFUNC_P2_DPROTO(ULONG, (*OldDeleteFile),
194 D1, CONST_STRPTR, Name,
195 A6, struct DosLibrary *, dOSBase);
196 LIBFUNC_P3_DPROTO(ULONG, (*OldRename),
197 D1, CONST_STRPTR, oldName,
198 D2, CONST_STRPTR, newName,
199 A6, struct DosLibrary *, dOSBase);
200 LIBFUNC_P3_DPROTO(BPTR, (*OldOpen),
201 D1, CONST_STRPTR, name,
202 D2, LONG, accessMode,
203 A6, struct DosLibrary *, DOSBase);
204 LIBFUNC_P2_DPROTO(ULONG, (*OldClose),
205 D1, BPTR, file,
206 A6, struct DosLibrary *, DOSBase);
207 LIBFUNC_P2_DPROTO(BPTR, (*OldCreateDir),
208 D1, CONST_STRPTR, name,
209 A6, struct DosLibrary *, DOSBase);
211 //LIBFUNC_P1_DPROTO(CONST_STRPTR, (*OldwbPrivate2),
212 // D0, ULONG, StringID);
214 #endif
216 //----------------------------------------------------------------------------
218 // local data items
220 static struct BTree *PatchOpenBTree = NULL;
221 static ULONG DoiCount;
223 //----------------------------------------------------------------------------
225 // CloseWorkBench() replacement
226 LIBFUNC_P1(LONG, sca_CloseWorkBench,
227 A6, struct IntuitionBase *, iBase, 0)
229 struct MsgPort *ReplyPort = NULL;
230 LONG Success = FALSE;
232 d1(KPrintF("%s/%s/%ld: Start\n", __FILE__, __FUNC__, __LINE__));
234 do {
235 struct SM_AppSleep *smas;
236 struct ScaWindowStruct *ws;
238 if (!CheckAllowCloseWB())
239 return FALSE;
241 d1(KPrintF("%s/%s/%ld: \n", __FILE__, __FUNC__, __LINE__));
243 if (MainWindowTask->sleepflag)
245 Success = TRUE;
246 break;
249 d1(KPrintF("%s/%s/%ld: \n", __FILE__, __FUNC__, __LINE__));
251 MainWindowTask->sleepflag = TRUE;
253 ReplyPort = CreateMsgPort();
254 if (NULL == ReplyPort)
255 break;
257 d1(KPrintF("%s/%s/%ld: \n", __FILE__, __FUNC__, __LINE__));
259 PatternsOff(MainWindowTask, ReplyPort);
260 d1(KPrintF("%s/%s/%ld: \n", __FILE__, __FUNC__, __LINE__));
261 FreePatternPrefs();
262 d1(KPrintF("%s/%s/%ld: \n", __FILE__, __FUNC__, __LINE__));
264 if (GuiGFXBase && PenShareMap)
266 DeletePenShareMap(PenShareMap);
267 PenShareMap = NULL;
270 if (IconBase->lib_Version >= 44)
272 // IconControlA()
273 IconControl(NULL,
274 ICONCTRLA_SetGlobalScreen, NULL,
275 TAG_END);
278 smas = (struct SM_AppSleep *) SCA_AllocMessage(MTYP_AppSleep, 0);
279 if (NULL == smas)
280 break;
282 d1(KPrintF("%s/%s/%ld: \n", __FILE__, __FUNC__, __LINE__));
284 smas->ScalosMessage.sm_Message.mn_ReplyPort = ReplyPort;
286 PutMsg(iInfos.xii_iinfos.ii_MainMsgPort, &smas->ScalosMessage.sm_Message);
288 WaitReply(ReplyPort, &MainWindowTask->mwt, MTYP_AppSleep);
290 SCA_LockWindowList(SCA_LockWindowList_Shared);
292 for (ws=winlist.wl_WindowStruct; ws; ws = (struct ScaWindowStruct *) ws->ws_Node.mln_Succ)
294 struct internalScaWindowTask *iwtx = (struct internalScaWindowTask *) ws->ws_WindowTask;
296 if (iwtx)
297 iwtx->iwt_OrigWinScreen = NULL;
300 SCA_UnLockWindowList();
302 d1(KPrintF("%s/%s/%ld: \n", __FILE__, __FUNC__, __LINE__));
304 UnlockScalosPens();
306 FreeScreenDrawInfo(iInfos.xii_iinfos.ii_Screen, iInfos.xii_iinfos.ii_DrawInfo);
307 iInfos.xii_iinfos.ii_DrawInfo = NULL;
309 FreeVisualInfo(iInfos.xii_iinfos.ii_visualinfo);
310 iInfos.xii_iinfos.ii_visualinfo = NULL;
312 UnlockPubScreen("Workbench", iInfos.xii_iinfos.ii_Screen);
313 iInfos.xii_iinfos.ii_Screen = NULL;
315 d1(KPrintF("%s/%s/%ld: OldCloseWB=%08lx\n", __FILE__, __FUNC__, __LINE__, OldCloseWB));
317 #ifdef __AROS__
318 Success = AROS_CALL0(LONG, (*OldCloseWB),
319 struct IntuitionBase *, iBase);
320 #else
321 Success = CALLLIBFUNC_P1((*OldCloseWB), A6, iBase);
322 #endif
323 } while (0);
325 d1(KPrintF("%s/%s/%ld: Success=%ld\n", __FILE__, __FUNC__, __LINE__, Success));
327 if (ReplyPort)
328 DeleteMsgPort(ReplyPort);
330 if (!Success)
331 ReOpenScalos();
333 return Success;
335 LIBFUNC_END
338 // OpenWorkBench() replacement
339 LIBFUNC_P1(IPTR, sca_OpenWorkBench,
340 A6, struct IntuitionBase *, iBase, 0)
342 LONG Success;
344 d1(KPrintF("%s/%s/%ld: \n", __FILE__, __FUNC__, __LINE__));
346 do {
347 if (!MainWindowTask->sleepflag)
349 Success = TRUE;
350 break;
353 #ifdef __AROS__
354 Success = AROS_CALL0(IPTR, (*OldOpenWB),
355 struct IntuitionBase *, iBase);
356 #else
357 Success = CALLLIBFUNC_P1((*OldOpenWB), A6, iBase);
358 #endif
359 if (!Success)
360 break;
362 Success = ReOpenScalos();
363 } while (0);
365 // OpenWorkBench() is supposed to return WBScreeen !!!
367 return Success ? (IPTR) iInfos.xii_iinfos.ii_Screen : 0L;
369 LIBFUNC_END
372 static LONG ReOpenScalos(void)
374 LONG Success = FALSE;
375 struct MsgPort *ReplyPort = NULL;
377 do {
378 struct SM_AppWakeup *smaw;
380 if (NULL == iInfos.xii_iinfos.ii_Screen)
381 iInfos.xii_iinfos.ii_Screen = LockPubScreen("Workbench");
382 if (NULL == iInfos.xii_iinfos.ii_Screen)
383 break;
385 LockScalosPens();
387 if (NULL == iInfos.xii_iinfos.ii_DrawInfo)
388 iInfos.xii_iinfos.ii_DrawInfo = GetScreenDrawInfo(iInfos.xii_iinfos.ii_Screen);
389 if (NULL == iInfos.xii_iinfos.ii_DrawInfo)
390 break;
392 if (NULL == iInfos.xii_iinfos.ii_visualinfo)
393 iInfos.xii_iinfos.ii_visualinfo = GetVisualInfoA(iInfos.xii_iinfos.ii_Screen, NULL);
395 if (IconBase->lib_Version >= 44)
397 // IconControlA()
398 IconControl(NULL,
399 ICONCTRLA_SetGlobalScreen, (IPTR) iInfos.xii_iinfos.ii_Screen,
400 TAG_END);
403 SetDefaultPubScreen("Workbench");
405 if (GuiGFXBase && NULL == PenShareMap)
406 PenShareMap = CreatePenShareMapA(NULL);
408 #if defined(__MORPHOS__)
409 #if defined(SA_OpacitySupport)
410 if (IntuitionBase->LibNode.lib_Version >= 51)
412 LONG attr;
414 GetAttr(SA_OpacitySupport, iInfos.xii_iinfos.ii_Screen, &attr);
415 d1(KPrintF("%s/%s/%ld: SA_OpacitySupport=%ld\n", __FILE__, __FUNC__, __LINE__, attr));
416 iInfos.xii_Layers3D = attr > SAOS_OpacitySupport_OnOff;
418 else
419 #endif //defined(SA_OpacitySupport)
421 iInfos.xii_Layers3D = NULL != FindTask("« LayerInfoTask »");
423 #endif //defined(__MORPHOS__)
425 ReplyPort = CreateMsgPort();
426 if (NULL == ReplyPort)
427 break;
429 smaw = (struct SM_AppWakeup *) SCA_AllocMessage(MTYP_AppWakeup, 0);
430 if (NULL == smaw)
431 break;
433 smaw->ScalosMessage.sm_Message.mn_ReplyPort = ReplyPort,
434 smaw->smaw_ReLayout = TRUE;
436 PutMsg(iInfos.xii_iinfos.ii_MainMsgPort, &smaw->ScalosMessage.sm_Message);
438 WaitReply(ReplyPort, &MainWindowTask->mwt, MTYP_AppWakeup);
440 ReadPatternPrefs();
441 PatternsOn(MainWindowTask);
443 MainWindowTask->sleepflag = FALSE;
444 } while (0);
446 if (ReplyPort)
447 DeleteMsgPort(ReplyPort);
449 return Success;
453 // AppIcon = AddAppIconA(id, userdata, text, msgport, lock, diskobj, taglist)
454 // D0 D0 D1 A0 A1 A2 A3 A4
455 LIBFUNC_P8(struct AppIcon *, sca_AddAppIconA,
456 D0, ULONG, Id,
457 D1, ULONG, UserData,
458 A0, CONST_STRPTR, IconText,
459 A1, struct MsgPort *, iconPort,
460 A2, BPTR, lock,
461 A3, struct DiskObject *, DiskObj,
462 A4, struct TagItem *, TagList,
463 A6, struct Library *, wbBase, 0)
465 struct DiskObject *DiskObjClone = NULL;
466 struct AppObject *appIcon = NULL;
467 Object *IconObj = NULL;
469 d1(KPrintF("%s/%s/%ld: id=%08lx UserData=%08lx <%s>\n", __FILE__, __FUNC__, __LINE__, Id, UserData, IconText));
471 (void) lock;
472 (void) wbBase;
474 do {
475 if (NULL == FindTagItem(WBAPPICONA_RenderHook, TagList)
476 && strlen(IconText) > 0)
478 struct MsgPort *ReplyPort = CreateMsgPort();
480 d1(KPrintF("%s/%s/%ld: ReplyPort=%08lx\n", __FILE__, __FUNC__, __LINE__, ReplyPort));
482 if (ReplyPort)
484 struct WBArg ArgArray;
486 ArgArray.wa_Name = (STRPTR) IconText;
488 RunProcess(&MainWindowTask->mwt.iwt_WindowTask,
489 (RUNPROCFUNC) AppChangeFunc,
490 sizeof(ArgArray)/sizeof(ULONG), &ArgArray, ReplyPort);
492 do {
493 struct SM_RunProcess *msg;
495 WaitPort(ReplyPort);
496 msg = (struct SM_RunProcess *) GetMsg(ReplyPort);
498 d1(KPrintF("%s/%s/%ld: msg=%08lx\n", __FILE__, __FUNC__, __LINE__, msg));
500 if (msg && ID_IMSG == msg->ScalosMessage.sm_Signature
501 && msg->ScalosMessage.sm_MessageType == MTYP_RunProcess)
503 struct WBArg *ArgArray = (struct WBArg *) &msg->Flags;
505 IconObj = (Object *) ArgArray->wa_Name;
506 d1(kprintf("%s/%s/%ld: IconObj=%08lx\n", __FILE__, __FUNC__, __LINE__, IconObj));
508 SCA_FreeMessage(&msg->ScalosMessage);
510 if (IconObj)
511 DiskObj = NULL;
512 break;
514 } while (1);
516 DeleteMsgPort(ReplyPort);
520 if (NULL == IconObj)
522 #if defined(__MORPHOS__)
523 d1(KPrintF("%s/%s/%ld: DiskObj=%08lx\n", __FILE__, __FUNC__, __LINE__, DiskObj));
524 if (ISOWN(DiskObj))
526 struct OwnDiskObject *odo = (struct OwnDiskObject *) DiskObj;
528 d1(KPrintF("%s/%s/%ld: odo=%08lx path=<%s>\n", __FILE__, __FUNC__, __LINE__, odo, odo->path));
530 if (odo->path)
532 STRPTR PathCopy = AllocCopyString(odo->path);
534 if (PathCopy)
536 ULONG pos = IsIconName(PathCopy);
538 d1(KPrintF("%s/%s/%ld: PathCopy=<%s> pos=%08lx\n", __FILE__, __FUNC__, __LINE__, PathCopy, pos));
540 if (0 != pos && ~0 != pos)
542 // remove ".info" extension
543 STRPTR ppos = (STRPTR) pos;
544 *ppos = '\0';
547 d1(KPrintF("%s/%s/%ld: PathCopy=<%s>\n", __FILE__, __FUNC__, __LINE__, PathCopy));
549 IconObj = NewIconObjectTags(PathCopy,
550 IDTA_SupportedIconTypes, CurrentPrefs.pref_SupportedIconTypes,
551 IDTA_SizeConstraints, (ULONG) &CurrentPrefs.pref_IconSizeConstraints,
552 IDTA_ScalePercentage, CurrentPrefs.pref_IconScaleFactor,
553 IDTA_SizeConstraints, (ULONG) &iInfos.xii_iinfos.ii_AppWindowStruct->ws_IconSizeConstraints,
554 IDTA_ScalePercentage, iInfos.xii_iinfos.ii_AppWindowStruct->ws_IconScaleFactor,
555 TAG_END);
557 FreeCopyString(PathCopy);
561 #endif /* __MORPHOS__ */
563 if (NULL == TagList || !GetTagData(WBAPPICONA_PropagatePosition, 0, TagList))
565 DiskObj = DiskObjClone = CloneDiskObject(DiskObj);
568 if (NULL == DiskObj)
569 break;
571 if (NULL == IconObj)
573 IconObj = Convert2IconObjectTags(DiskObj,
574 IDTA_SupportedIconTypes, CurrentPrefs.pref_SupportedIconTypes,
575 TAG_END);
579 d1(KPrintF("%s/%s/%ld: IconObj=%08lx\n", __FILE__, __FUNC__, __LINE__, IconObj));
580 if (NULL == IconObj)
581 break;
583 SetAttrs(IconObj,
584 IDTA_Text, (IPTR) IconText,
585 TAG_END);
587 OpenLibrary("scalos.library", 0);
589 appIcon = SCA_NewAddAppIcon(Id, UserData, IconObj, iconPort, TagList);
591 d1(KPrintF("%s/%s/%ld: appIcon=%08lx\n", __FILE__, __FUNC__, __LINE__, appIcon));
592 if (NULL == appIcon)
593 break;
595 appIcon->appo_userdata2 = DiskObj;
596 } while (0);
598 if (NULL == appIcon)
600 if (IconObj)
601 DisposeIconObject(IconObj);
603 if (DiskObjClone)
604 ScaFreeDiskObject(DiskObjClone);
607 d1(KPrintF("%s/%s/%ld: appIcon=%08lx\n", __FILE__, __FUNC__, __LINE__, appIcon));
609 return (struct AppIcon *) appIcon;
611 LIBFUNC_END
614 static APTR CloneDOImage(const APTR origImage)
616 struct Image *NewImage = NULL;
617 const struct Image *OldImage = (struct Image *) origImage;
619 do {
620 size_t ImgSize;
622 if (NULL == origImage)
623 break;
625 if (0 == TypeOfMem(origImage))
626 break;
628 if (0 == TypeOfMem(OldImage->ImageData))
629 break;
631 NewImage = ScalosAlloc(sizeof(struct Image));
632 if (NULL == NewImage)
633 break;
635 *NewImage = *OldImage;
637 ImgSize = ((OldImage->Width + OldImage->LeftEdge + 15) & ~0x0f)
638 * (OldImage->TopEdge + OldImage->Height) * OldImage->Depth;
639 ImgSize = (ImgSize + 3) & ~0x03; // round to longaligned
641 NewImage->ImageData = ScalosAlloc(ImgSize);
642 if (NULL == NewImage->ImageData)
643 break;
645 CopyMemQuick(OldImage->ImageData, NewImage->ImageData, ImgSize);
646 //??? CacheClearU();
647 } while (0);
649 if (NewImage && NULL == NewImage->ImageData)
651 ScalosFree(NewImage);
652 NewImage = NULL;
655 return NewImage;
659 static STRPTR *CloneDOToolTypes(CONST_STRPTR *origToolTypes)
661 STRPTR *NewToolTypes;
662 STRPTR *dplp, dlp;
663 CONST_STRPTR *splp;
664 ULONG ttLength, ttCount;
666 d1(kprintf("%s/%s/%ld: origToolTypes=%08lx\n", __FILE__, __FUNC__, __LINE__, origToolTypes));
668 if (NULL == origToolTypes)
669 return NULL;
671 ttLength = sizeof(STRPTR);
672 ttCount = 1;
674 for (splp=origToolTypes; *splp; splp++)
676 ttCount++;
677 ttLength += sizeof(STRPTR) + strlen(*splp) + 1;
678 d1(kprintf("%s/%s/%ld: (ToolType) <%s>\n", __FILE__, __FUNC__, __LINE__, *splp));
681 d1(kprintf("%s/%s/%ld: ttCount=%ld ttLength=%ld\n", __FILE__, __FUNC__, __LINE__, ttCount, ttLength));
683 NewToolTypes = ScalosAlloc(ttLength);
685 d1(kprintf("%s/%s/%ld: NewToolTypes=%08lx\n", __FILE__, __FUNC__, __LINE__, NewToolTypes));
686 if (NULL == NewToolTypes)
687 return NULL;
689 dlp = ((STRPTR) NewToolTypes) + ttCount * sizeof(STRPTR);
691 for (dplp=NewToolTypes, splp=origToolTypes; *splp; dplp++, splp++)
693 *dplp = dlp;
694 strcpy(*dplp, *splp);
695 dlp += 1 + strlen(dlp);
697 *dplp = NULL;
699 d1(kprintf("%s/%s/%ld: NewToolTypes=%08lx\n", __FILE__, __FUNC__, __LINE__, NewToolTypes));
701 return NewToolTypes;
705 static struct DiskObject *CloneDiskObject(const struct DiskObject *origDiskObj)
707 struct DiskObject *NewDiskObj;
709 #if 0
710 // test for CloneDOToolTypes() function
712 // Test
713 STRPTR *ytt;
714 STRPTR xTT[] =
716 "Erster Text",
717 "2",
718 "Dritte Textzeile",
719 "Vier",
721 NULL
724 ytt = CloneDOToolTypes(xTT);
725 if (ytt)
726 ScalosFree(ytt);
728 #endif
730 if (IconBase->lib_Version >= 44)
732 d1(kprintf("%s/%s/%ld: \n", __FILE__, __FUNC__, __LINE__));
734 // DupDiskObjectA(
735 NewDiskObj = DupDiskObject((struct DiskObject *)origDiskObj,
736 ICONDUPA_DuplicateImages, TRUE,
737 ICONDUPA_DuplicateImageData, TRUE,
738 ICONDUPA_DuplicateToolTypes, TRUE,
739 ICONDUPA_ActivateImageData, TRUE,
740 TAG_END);
742 d1(kprintf("%s/%s/%ld: NewDiskObj=%08lx\n", __FILE__, __FUNC__, __LINE__, NewDiskObj));
744 else
746 NewDiskObj = GetDiskObject(NULL);
748 d1(kprintf("%s/%s/%ld: NewDiskObj=%08lx\n", __FILE__, __FUNC__, __LINE__, NewDiskObj));
749 if (NewDiskObj)
751 #if defined(__MORPHOS__)
752 *NewDiskObj = *origDiskObj;
753 #endif /* __MORPHOS__ */
755 NewDiskObj->do_Gadget.Width = origDiskObj->do_Gadget.Width;
756 NewDiskObj->do_Gadget.Height = origDiskObj->do_Gadget.Height;
757 NewDiskObj->do_Gadget.Flags = origDiskObj->do_Gadget.Flags;
759 NewDiskObj->do_Gadget.GadgetRender = CloneDOImage(origDiskObj->do_Gadget.GadgetRender);
761 d1(kprintf("%s/%s/%ld: GadgetRender=%08lx\n", __FILE__, __FUNC__, __LINE__, NewDiskObj->do_Gadget.GadgetRender));
763 if (origDiskObj->do_Gadget.Flags & GFLG_GADGHIMAGE)
765 NewDiskObj->do_Gadget.SelectRender = CloneDOImage(origDiskObj->do_Gadget.SelectRender);
766 d1(kprintf("%s/%s/%ld: SelectRender=%08lx\n", __FILE__, __FUNC__, __LINE__, NewDiskObj->do_Gadget.SelectRender));
768 if (NULL == NewDiskObj->do_Gadget.SelectRender)
769 NewDiskObj->do_Gadget.Flags &= ~GFLG_GADGHIMAGE;
772 NewDiskObj->do_CurrentX = origDiskObj->do_CurrentX;
773 NewDiskObj->do_CurrentY = origDiskObj->do_CurrentY;
775 NewDiskObj->do_ToolTypes = CloneDOToolTypes((CONST_STRPTR *) origDiskObj->do_ToolTypes);
777 d1(kprintf("%s/%s/%ld: ToolTypes=%08lx\n", __FILE__, __FUNC__, __LINE__, NewDiskObj->do_ToolTypes));
781 return NewDiskObj;
785 static void ScaFreeDiskObject(struct DiskObject *DiskObj)
787 if (IconBase->lib_Version < 44)
789 if (DiskObj->do_Gadget.GadgetRender)
791 struct Image *img = (struct Image *) DiskObj->do_Gadget.GadgetRender;
793 if (img->ImageData)
794 ScalosFree(img->ImageData);
796 ScalosFree(img);
798 DiskObj->do_Gadget.GadgetRender = NULL;
800 if (DiskObj->do_Gadget.SelectRender)
802 struct Image *img = (struct Image *) DiskObj->do_Gadget.SelectRender;
804 if (img->ImageData)
805 ScalosFree(img->ImageData);
807 ScalosFree(img);
809 DiskObj->do_Gadget.SelectRender = NULL;
811 if (DiskObj->do_ToolTypes)
813 ScalosFree(DiskObj->do_ToolTypes);
814 DiskObj->do_ToolTypes = NULL;
818 FreeDiskObject(DiskObj);
822 static SAVEDS(ULONG) AppChangeFunc(struct WBArg *ArgArray, struct SM_RunProcess *msg)
824 STRPTR Path = NULL;
825 Object *IconObj = NULL;
827 d1(kprintf("%s/%s/%ld: msg=%08lx ArgArray=%08lx\n", __FILE__, __FUNC__, __LINE__, msg, ArgArray));
828 d1(kprintf("%s/%s/%ld: <%s>\n", __FILE__, __FUNC__, __LINE__, ArgArray->wa_Name));
830 do {
831 struct ScaWindowStruct *ws = iInfos.xii_iinfos.ii_AppWindowStruct;
833 // check if AppIcon name contains invalid characters ":/"
834 if (strchr(ArgArray->wa_Name, ':'))
835 break;
836 if (strchr(ArgArray->wa_Name, '/'))
837 break;
839 Path = AllocPathBuffer();
840 if (NULL == Path)
841 break;
843 stccpy(Path, CurrentPrefs.pref_DefIconPath, Max_PathLen);
844 AddPart(Path, ArgArray->wa_Name, Max_PathLen);
846 d1(kprintf("%s/%s/%ld: Path=<%s>\n", __FILE__, __FUNC__, __LINE__, Path));
848 IconObj = NewIconObjectTags(Path,
849 IDTA_SizeConstraints, (IPTR) &ws->ws_IconSizeConstraints,
850 IDTA_ScalePercentage, ws->ws_IconScaleFactor,
851 TAG_END);
852 d1(kprintf("%s/%s/%ld: IconObj=%08lx\n", __FILE__, __FUNC__, __LINE__, IconObj));
853 if (IconObj)
854 break; // Success!!
856 stccpy(Path, CurrentPrefs.pref_DefIconPath, Max_PathLen);
857 AddPart(Path, "def_", Max_PathLen);
858 SafeStrCat(Path, ArgArray->wa_Name, Max_PathLen);
860 d1(kprintf("%s/%s/%ld: Path=<%s>\n", __FILE__, __FUNC__, __LINE__, Path));
862 IconObj = NewIconObjectTags(Path,
863 IDTA_SizeConstraints, (IPTR) &ws->ws_IconSizeConstraints,
864 IDTA_ScalePercentage, ws->ws_IconScaleFactor,
865 TAG_END);
866 } while (0);
868 if (Path)
869 FreePathBuffer(Path);
871 d1(kprintf("%s/%s/%ld: IconObj=%08lx\n", __FILE__, __FUNC__, __LINE__, IconObj));
873 // return Result
874 ArgArray->wa_Name = (STRPTR) IconObj;
876 return 0;
881 // success = RemoveAppIcon(AppIcon)
882 // D0 A0
883 LIBFUNC_P2(ULONG, sca_RemoveAppIcon,
884 A0, struct AppIcon *, appIcon,
885 A6, struct Library *, wbBase, 0)
887 struct AppObject *AppObj = (struct AppObject *) appIcon;
888 BOOL Success = TRUE;
889 struct TagItem *TagList;
890 struct DiskObject *DiskObj;
891 Object *IconObj;
893 d1(kprintf("%s/%s/%ld: appIcon=%08lx\n", __FILE__, __FUNC__, __LINE__, appIcon));
895 if (NULL == AppObj || 0 == TypeOfMem(appIcon) || ID_SC != AppObj->appo_Kennung)
897 #ifdef __AROS__
898 return AROS_CALL1(BOOL, (*OldRemoveAppIcon),
899 AROS_LDA(struct AppIcon *, appIcon, A0),
900 struct Library *, wbBase);
901 #else
902 return CALLLIBFUNC_P2((*OldRemoveAppIcon), A0, appIcon, A6, wbBase);
903 #endif
906 TagList = AppObj->appo_TagList;
907 DiskObj = AppObj->appo_userdata2;
908 IconObj = AppObj->appo_object.appoo_IconObject;
910 CloseLibrary(&ScalosBase->scb_LibNode);
912 d1(kprintf("%s/%s/%ld: IconObj=%08lx\n", __FILE__, __FUNC__, __LINE__, IconObj));
914 SCA_RemoveAppObject(AppObj);
916 if (TagList && GetTagData(WBAPPICONA_PropagatePosition, 0, TagList))
917 DiskObj = NULL; // DiskObject was not cloned and must not be freed
919 FreeTagItems(TagList); // TagList may be NULL!
921 DisposeIconObject(IconObj);
923 if (DiskObj)
924 ScaFreeDiskObject(DiskObj);
926 return Success;
928 LIBFUNC_END
931 // AppIcon = AddAppWindowA(id, userdata, window, msgport, taglist)
932 // D0 D0 D1 A0 A1 A2
933 LIBFUNC_P6(struct AppWindow *, sca_AddAppWindowA,
934 D0, ULONG, Id,
935 D1, ULONG, UserData,
936 A0, struct Window *, window,
937 A1, struct MsgPort *, iconPort,
938 A2, struct TagItem *, TagList,
939 A6, struct Library *, wbBase, 0)
941 (void) wbBase;
943 d1(KPrintF("%s/%s/%ld: Id=%08lx UserData=%08lx\n", __FILE__, __FUNC__, __LINE__, Id, UserData));
945 OpenLibrary("scalos.library", 0);
947 return (struct AppWindow *) SCA_NewAddAppWindow(Id, UserData, window, iconPort, TagList);
949 LIBFUNC_END
952 // success = RemoveAppWindow(AppWindow)
953 // D0 A0
954 LIBFUNC_P2(BOOL, sca_RemoveAppWindow,
955 A0, struct AppWindow *, aw,
956 A6, struct Library *, wbBase, 0)
958 struct AppObject *appo = (struct AppObject *) aw;
960 d1(KPrintF("%s/%s/%ld: aw=%08lx\n", __FILE__, __FUNC__, __LINE__, aw));
962 if (NULL == aw || 0 == TypeOfMem(aw) || ID_SC != appo->appo_Kennung)
963 #ifdef __AROS__
964 return AROS_CALL1(BOOL, (*OldRemoveAppWindow),
965 AROS_LDA(struct AppWindow *, aw, A0),
966 struct Library *, wbBase);
967 #else
968 return (BOOL) CALLLIBFUNC_P2((*OldRemoveAppWindow), A0, aw, A6, wbBase);
969 #endif
971 CloseLibrary(&ScalosBase->scb_LibNode);
973 return SCA_RemoveAppObject(appo);
975 LIBFUNC_END
978 // AppMenuItem = AddAppMenuItemA(id, userdata, text, msgport, taglist)
979 // D0 D0 D1 A0 A1 A2
980 LIBFUNC_P6(struct AppMenuItem *, sca_AddAppMenuItemA,
981 D0, ULONG, Id,
982 D1, ULONG, UserData,
983 A0, CONST_STRPTR, text,
984 A1, struct MsgPort *, iconPort,
985 A2, struct TagItem *, TagList,
986 A6, struct Library *, wbBase, 0)
988 (void) wbBase;
990 d1(KPrintF("%s/%s/%ld: Id=%08lx UserData=%08lx\n", __FILE__, __FUNC__, __LINE__, Id, UserData));
992 OpenLibrary("scalos.library", 0);
994 return (struct AppMenuItem *) SCA_NewAddAppMenuItem(Id, UserData, text, iconPort, TagList);
996 LIBFUNC_END
999 // success = RemoveAppMenuItem(AppWindow)
1000 // D0 A0
1001 LIBFUNC_P2(BOOL, sca_RemoveAppMenuItem,
1002 A0, struct AppMenuItem *, ami,
1003 A6, struct Library *, wbBase, 0)
1005 struct AppObject *appo = (struct AppObject *) ami;
1007 d1(KPrintF("%s/%s/%ld: ami=%08lx\n", __FILE__, __FUNC__, __LINE__, ami));
1009 if (NULL == ami || 0 == TypeOfMem(ami) || ID_SC != appo->appo_Kennung)
1010 #if __AROS__
1011 return AROS_CALL1(BOOL, (*OldRemoveAppMenuItem),
1012 AROS_LDA(struct AppMenuItem *, ami, A0),
1013 struct Library *, wbBase);
1014 #else
1015 return (BOOL) CALLLIBFUNC_P2((*OldRemoveAppMenuItem), A0, ami, A6, wbBase);
1016 #endif
1018 CloseLibrary(&ScalosBase->scb_LibNode);
1020 return SCA_RemoveAppObject(appo);
1022 LIBFUNC_END
1025 #ifdef TEST_OPENWINDOWTAGLIST
1026 // Window = OpenWindowTagList( NewWindow, TagItems )
1027 // D0 A0 A1
1029 // struct Window *OpenWindowTagList( struct NewScreen *, struct TagItem * );
1030 LIBFUNC_P3(struct Window *, sca_OpenWindowTagList,
1031 A0, struct NewWindow *, newWin,
1032 A1, const struct TagItem *, TagList,
1033 A6, struct IntuitionBase *, iBase)
1035 struct Window *Win = NULL;
1036 // struct TagItem *tl = TagList;
1037 // struct TagItem *ti;
1039 d1(KPrintF("\n%s/%s/%ld: Task=<%s> NewWindow=%08lx\n", __FILE__, __FUNC__, __LINE__, FindTask(NULL)->tc_Node.ln_Name, newWin));
1041 while ((ti = NextTagItem(&tl)))
1043 switch (ti->ti_Tag)
1045 case WA_Dummy:
1046 d1(KPrintF("%s/%s/%ld: WA_Dummy data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1047 break;
1048 case WA_Left:
1049 d1(KPrintF("%s/%s/%ld: WA_Left data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1050 break;
1051 case WA_Top:
1052 d1(KPrintF("%s/%s/%ld: WA_Top data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1053 break;
1054 case WA_Width:
1055 d1(KPrintF("%s/%s/%ld: WA_Width data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1056 break;
1057 case WA_Height:
1058 d1(KPrintF("%s/%s/%ld: WA_Height data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1059 break;
1060 case WA_DetailPen:
1061 d1(KPrintF("%s/%s/%ld: WA_DetailPen data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1062 break;
1063 case WA_BlockPen:
1064 d1(KPrintF("%s/%s/%ld: WA_BlockPen data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1065 break;
1066 case WA_IDCMP:
1067 d1(KPrintF("%s/%s/%ld: WA_IDCMP data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1068 break;
1069 case WA_Flags:
1070 d1(KPrintF("%s/%s/%ld: WA_Flags data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1071 break;
1072 case WA_Gadgets:
1073 d1(KPrintF("%s/%s/%ld: WA_Gadgets data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1074 break;
1075 case WA_Checkmark:
1076 d1(KPrintF("%s/%s/%ld: WA_Checkmark data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1077 break;
1078 case WA_Title:
1079 d1(KPrintF("%s/%s/%ld: WA_Title data=<%s>\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1080 break;
1081 case WA_ScreenTitle:
1082 d1(KPrintF("%s/%s/%ld: WA_ScreenTitle data=<%s>\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1083 break;
1084 case WA_CustomScreen:
1085 d1(KPrintF("%s/%s/%ld: WA_CustomScreen data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1086 break;
1087 case WA_SuperBitMap:
1088 d1(KPrintF("%s/%s/%ld: WA_SuperBitMap data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1089 break;
1090 case WA_MinWidth:
1091 d1(KPrintF("%s/%s/%ld: WA_MinWidth data=%öd\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1092 break;
1093 case WA_MinHeight:
1094 d1(KPrintF("%s/%s/%ld: WA_MinHeight data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1095 break;
1096 case WA_MaxWidth:
1097 d1(KPrintF("%s/%s/%ld: WA_MaxWidth data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1098 break;
1099 case WA_MaxHeight:
1100 d1(KPrintF("%s/%s/%ld: WA_MaxHeight data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1101 break;
1102 case WA_InnerWidth:
1103 d1(KPrintF("%s/%s/%ld: WA_InnerWidth data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1104 break;
1105 case WA_InnerHeight:
1106 d1(KPrintF("%s/%s/%ld: WA_InnerHeight data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1107 break;
1108 case WA_PubScreenName:
1109 d1(KPrintF("%s/%s/%ld: WA_PubScreenName data=<%s>\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1110 break;
1111 case WA_PubScreen:
1112 d1(KPrintF("%s/%s/%ld: WA_PubScreen data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1113 break;
1114 case WA_PubScreenFallBack:
1115 d1(KPrintF("%s/%s/%ld: WA_PubScreenFallBack data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1116 break;
1117 case WA_WindowName:
1118 d1(KPrintF("%s/%s/%ld: WA_WindowName data=<%s>\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1119 break;
1120 case WA_Colors:
1121 d1(KPrintF("%s/%s/%ld: WA_Colors data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1122 break;
1123 case WA_Zoom:
1124 d1(KPrintF("%s/%s/%ld: WA_Zoom data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1125 break;
1126 case WA_MouseQueue:
1127 d1(KPrintF("%s/%s/%ld: WA_MouseQueue data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1128 break;
1129 case WA_BackFill:
1130 d1(KPrintF("%s/%s/%ld: WA_BackFill data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1131 break;
1132 case WA_RptQueue:
1133 d1(KPrintF("%s/%s/%ld: WA_RptQueue data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1134 break;
1135 case WA_SizeGadget:
1136 d1(KPrintF("%s/%s/%ld: WA_SizeGadget data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1137 break;
1138 case WA_DragBar:
1139 d1(KPrintF("%s/%s/%ld: WA_DragBar data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1140 break;
1141 case WA_DepthGadget:
1142 d1(KPrintF("%s/%s/%ld: WA_DepthGadget data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1143 break;
1144 case WA_CloseGadget:
1145 d1(KPrintF("%s/%s/%ld: WA_CloseGadget data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1146 break;
1147 case WA_Backdrop:
1148 d1(KPrintF("%s/%s/%ld: WA_Backdrop data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1149 break;
1150 case WA_ReportMouse:
1151 d1(KPrintF("%s/%s/%ld: WA_ReportMouse data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1152 break;
1153 case WA_NoCareRefresh:
1154 d1(KPrintF("%s/%s/%ld: WA_NoCareRefresh data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1155 break;
1156 case WA_Borderless:
1157 d1(KPrintF("%s/%s/%ld: WA_Borderless data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1158 break;
1159 case WA_Activate:
1160 d1(KPrintF("%s/%s/%ld: WA_Activate data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1161 break;
1162 case WA_RMBTrap:
1163 d1(KPrintF("%s/%s/%ld: WA_RMBTrap data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1164 break;
1165 case WA_WBenchWindow:
1166 d1(KPrintF("%s/%s/%ld: WA_WBenchWindow data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1167 break;
1168 case WA_SimpleRefresh:
1169 d1(KPrintF("%s/%s/%ld: WA_SimpleRefresh data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1170 break;
1171 case WA_SmartRefresh:
1172 d1(KPrintF("%s/%s/%ld: WA_SmartRefresh data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1173 break;
1174 case WA_SizeBRight:
1175 d1(KPrintF("%s/%s/%ld: WA_SizeBRight data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1176 break;
1177 case WA_SizeBBottom:
1178 d1(KPrintF("%s/%s/%ld: WA_SizeBBottom data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1179 break;
1180 case WA_AutoAdjust:
1181 d1(KPrintF("%s/%s/%ld: WA_AutoAdjust data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1182 break;
1183 case WA_GimmeZeroZero:
1184 d1(KPrintF("%s/%s/%ld: WA_GimmeZeroZero data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1185 break;
1186 case WA_MenuHelp:
1187 d1(KPrintF("%s/%s/%ld: WA_MenuHelp data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1188 break;
1189 case WA_NewLookMenus:
1190 d1(KPrintF("%s/%s/%ld: WA_NewLookMenus data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1191 break;
1192 case WA_AmigaKey:
1193 d1(KPrintF("%s/%s/%ld: WA_AmigaKey data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1194 break;
1195 case WA_NotifyDepth:
1196 d1(KPrintF("%s/%s/%ld: WA_NotifyDepth data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1197 break;
1198 case WA_Pointer:
1199 d1(KPrintF("%s/%s/%ld: WA_Pointer data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1200 break;
1201 case WA_BusyPointer:
1202 d1(KPrintF("%s/%s/%ld: WA_BusyPointer data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1203 break;
1204 case WA_PointerDelay:
1205 d1(KPrintF("%s/%s/%ld: WA_PointerDelay data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1206 break;
1207 case WA_TabletMessages:
1208 d1(KPrintF("%s/%s/%ld: WA_TabletMessages data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1209 break;
1210 case WA_HelpGroup:
1211 d1(KPrintF("%s/%s/%ld: WA_HelpGroup data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1212 break;
1213 case WA_HelpGroupWindow:
1214 d1(KPrintF("%s/%s/%ld: WA_HelpGroupWindow data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1215 break;
1216 case WA_ExtraTitlebarGadgets:
1217 d1(KPrintF("%s/%s/%ld: WA_ExtraTitlebarGadgets data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1218 break;
1219 case WA_ExtraGadgetsStartID:
1220 d1(KPrintF("%s/%s/%ld: WA_ExtraGadgetsStartID data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1221 break;
1222 case WA_ExtraGadget_Iconify:
1223 d1(KPrintF("%s/%s/%ld: WA_ExtraGadget_Iconify data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1224 break;
1225 case WA_ExtraGadget_Lock:
1226 d1(KPrintF("%s/%s/%ld: WA_ExtraGadget_Lock data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1227 break;
1228 case WA_ExtraGadget_MUI:
1229 d1(KPrintF("%s/%s/%ld: WA_ExtraGadget_MUI data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1230 break;
1231 case WA_ExtraGadget_PopUp:
1232 d1(KPrintF("%s/%s/%ld: WA_ExtraGadget_PopUp data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1233 break;
1234 case WA_ExtraGadget_Snapshot:
1235 d1(KPrintF("%s/%s/%ld: WA_ExtraGadget_Snapshot data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1236 break;
1237 case WA_ExtraGadget_Jump:
1238 d1(KPrintF("%s/%s/%ld: WA_ExtraGadget_Jump data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1239 break;
1240 case WA_SkinInfo:
1241 d1(KPrintF("%s/%s/%ld: WA_SkinInfo data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1242 break;
1243 case WA_TransparentRegion:
1244 d1(KPrintF("%s/%s/%ld: WA_TransparentRegion data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1245 break;
1246 case WA_TransparentRegionHook:
1247 d1(KPrintF("%s/%s/%ld: WA_TransparentRegionHook data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1248 break;
1249 case WA_UserPort:
1250 d1(KPrintF("%s/%s/%ld: WA_UserPort data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1251 break;
1252 case WA_ToolbarWindow:
1253 d1(KPrintF("%s/%s/%ld: WA_ToolbarWindow data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1254 break;
1255 case WA_PointerType:
1256 d1(KPrintF("%s/%s/%ld: WA_PointerType data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1257 break;
1258 case WA_FrontWindow:
1259 d1(KPrintF("%s/%s/%ld: WA_FrontWindow data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1260 break;
1261 case WA_Parent:
1262 d1(KPrintF("%s/%s/%ld: WA_Parent data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1263 break;
1264 case WA_Opacity:
1265 d1(KPrintF("%s/%s/%ld: WA_Opacity data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1266 break;
1267 case WA_HasAlpha:
1268 d1(KPrintF("%s/%s/%ld: WA_HasAlpha data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1269 break;
1270 case WA_SizeNumerator:
1271 d1(KPrintF("%s/%s/%ld: WA_SizeNumerator data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1272 break;
1273 case WA_SizeDenominator:
1274 d1(KPrintF("%s/%s/%ld: WA_SizeDenominator data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1275 break;
1276 case WA_SizeExtraWidth:
1277 d1(KPrintF("%s/%s/%ld: WA_SizeExtraWidth data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1278 break;
1279 case WA_SizeExtraHeight:
1280 d1(KPrintF("%s/%s/%ld: WA_SizeExtraHeight data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1281 break;
1282 case WA_HitLevel:
1283 d1(KPrintF("%s/%s/%ld: WA_HitLevel data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1284 break;
1285 case WA_ShadowTop:
1286 d1(KPrintF("%s/%s/%ld: WA_ShadowTop data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1287 break;
1288 case WA_ShadowLeft:
1289 d1(KPrintF("%s/%s/%ld: WA_ShadowLeft data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1290 break;
1291 case WA_ShadowRight:
1292 d1(KPrintF("%s/%s/%ld: WA_ShadowRight data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1293 break;
1294 case WA_ShadowBottom:
1295 d1(KPrintF("%s/%s/%ld: WA_ShadowBottom data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1296 break;
1297 case WA_VisibleOnMaximize:
1298 d1(KPrintF("%s/%s/%ld: WA_VisibleOnMaximize data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1299 break;
1300 case WA_Dummy + 150:
1301 d1(KPrintF("%s/%s/%ld: WA_Dummy + 150 data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1302 if (TypeOfMem(ti->ti_Data))
1304 struct MinNode *mn = (struct MinNode *) ti->ti_Data;
1306 while (mn)
1308 d1(KPrintF("%s/%s/%ld: mn=%08lx\n", __FILE__, __FUNC__, __LINE__, mn));
1309 ByteDump(mn, 0x110);
1310 mn = mn->mln_Succ;
1313 break;
1314 default:
1315 d1(KPrintF("%s/%s/%ld: tag=%08lx data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Tag, ti->ti_Data));
1316 break;
1321 #ifdef __AROS__
1322 Win = AROS_CALL2(struct Window *, (*OldOpenWindowTagList),
1323 AROS_LDA(struct NewWindow *, newWin, A0),
1324 AROS_LDA(struct TagItem *, TagList, A1),
1325 struct IntuitionBase *, iBase);
1326 #else
1327 Win = (struct Window *) CALLLIBFUNC_P3((*OldOpenWindowTagList),
1328 A0, newWin,
1329 A1, TagList,
1330 A6, iBase);
1331 #endif
1333 d1(KPrintF("%s/%s/%ld: >>> Window=%08lx\n", __FILE__, __FUNC__, __LINE__, Win));
1334 if (Win)
1335 d1(KPrintF("%s/%s/%ld: >>> MoreFlags=%08lx\n", __FILE__, __FUNC__, __LINE__, Win->MoreFlags));
1337 return Win;
1339 LIBFUNC_END
1340 #endif /* TEST_OPENWINDOWTAGLIST */
1343 // Screen = OpenScreenTagList( NewScreen, TagItems )
1344 // D0 A0 A1
1346 // struct Screen *OpenScreenTagList( struct NewScreen *, struct TagItem * );
1347 LIBFUNC_P3(struct Screen *, sca_OpenScreenTagList,
1348 A0, struct NewScreen *, newScr,
1349 A1, const struct TagItem *, TagList,
1350 A6, struct IntuitionBase *, iBase, 0)
1352 struct Screen *Scr = NULL;
1353 CONST_STRPTR PubScreenName;
1355 d1(KPrintF("%s/%s/%ld: NewScreen=%08lx\n", __FILE__, __FUNC__, __LINE__, newScr));
1357 PubScreenName = (CONST_STRPTR) GetTagData(SA_PubName, (IPTR)NULL, (struct TagItem *) TagList);
1359 if (PubScreenName && 0 == strcmp("Workbench", PubScreenName))
1361 // Workbench screen is going to be opened
1362 struct TagItem *AllocatedTagList;
1364 d1(KPrintF("%s/%s/%ld: driPens=%08lx ScreenColorList=%08lx\n", \
1365 __FILE__, __FUNC__, __LINE__, driPens, ScreenColorList));
1367 AllocatedTagList = CloneTagItems((struct TagItem *)TagList);
1368 d1(KPrintF("%s/%s/%ld: AllocatedTagList=%08lx\n", __FILE__, __FUNC__, __LINE__, AllocatedTagList));
1370 if (AllocatedTagList)
1372 struct TagItem *tag;
1373 struct TagItem ti[10];
1374 short nTag = 0;
1376 // replace any existing SA_Pens, SA_Colors32, and SA_ShowTitle by TAG_IGNORE
1377 tag = FindTagItem(SA_Pens, AllocatedTagList);
1378 d1(KPrintF("%s/%s/%ld: SA_Pens=%08lx\n", __FILE__, __FUNC__, __LINE__, tag));
1379 if (tag)
1380 tag->ti_Tag = TAG_IGNORE;
1381 tag = FindTagItem(SA_Colors32, AllocatedTagList);
1382 d1(KPrintF("%s/%s/%ld: SA_Colors32=%08lx\n", __FILE__, __FUNC__, __LINE__, tag));
1383 if (tag)
1384 tag->ti_Tag = TAG_IGNORE;
1385 tag = FindTagItem(SA_ShowTitle, AllocatedTagList);
1386 d1(KPrintF("%s/%s/%ld: SA_ShowTitle=%08lx\n", __FILE__, __FUNC__, __LINE__, tag));
1387 if (tag)
1388 tag->ti_Tag = TAG_IGNORE;
1390 if (-1 != PalettePrefs.pal_driPens[0])
1392 ti[nTag].ti_Tag = SA_Pens;
1393 ti[nTag++].ti_Data = (IPTR) PalettePrefs.pal_driPens;
1395 d1(KPrintF("%s/%s/%ld: driPens[0]=%ld driPens[1]=%ld\n", __FILE__, __FUNC__, __LINE__, PalettePrefs.pal_driPens[0], PalettePrefs.pal_driPens[1]));
1397 #if 0
1399 short n;
1400 for (n=0; PalettePrefs.pal_driPens[n]>=0; n++)
1401 KPrintF("%s/%s/%ld: driPens[%ld]=%ld\n", __FILE__, __FUNC__, __LINE__, n, PalettePrefs.pal_driPens[n]);
1403 #endif
1405 if (PalettePrefs.pal_ScreenColorList)
1407 ti[nTag].ti_Tag = SA_Colors32;
1408 ti[nTag++].ti_Data = (IPTR) PalettePrefs.pal_ScreenColorList;
1410 #if 0
1412 short n, nmax = PalettePrefs.pal_ScreenColorList[0] >> 16;
1413 short col = PalettePrefs.pal_ScreenColorList[0] & 0xffff;
1414 for (n=0; n<nmax; n++,col++)
1416 kprintf("%s/%s/%ld: pen[%ld] : %08lx %08lx %08lx\n",
1417 __FILE__, __FUNC__, __LINE__, col, PalettePrefs.pal_ScreenColorList[1+3*n], \
1418 PalettePrefs.pal_ScreenColorList[2+3*n], PalettePrefs.pal_ScreenColorList[3+3*n]);
1421 #endif
1423 if (CurrentPrefs.pref_FullBenchFlag)
1425 ti[nTag].ti_Tag = SA_ShowTitle;
1426 ti[nTag++].ti_Data = FALSE;
1428 ti[nTag].ti_Tag = TAG_MORE;
1429 ti[nTag++].ti_Data = (IPTR) AllocatedTagList;
1431 ti[nTag].ti_Tag = TAG_END;
1433 #ifdef __AROS__
1434 Scr = AROS_CALL2(struct Screen *, (*OldOpenScreenTagList),
1435 AROS_LDA(struct NewScreen *, newScr, A0),
1436 AROS_LDA(struct TagItem *, ti, A1),
1437 struct IntuitionBase *, iBase);
1438 #else
1439 Scr = (struct Screen *) CALLLIBFUNC_P3((*OldOpenScreenTagList),
1440 A0, newScr,
1441 A1, ti,
1442 A6, iBase);
1443 #endif
1445 if (Scr && PalettePrefs.pal_ScreenColorList)
1447 short n, nmax = PalettePrefs.pal_ScreenColorList[0] >> 16;
1448 short col = PalettePrefs.pal_ScreenColorList[0] & 0xffff;
1450 for (n=0; n<nmax; n++,col++)
1452 ObtainPen(Scr->ViewPort.ColorMap, col,
1453 PalettePrefs.pal_ScreenColorList[1+3*n],
1454 PalettePrefs.pal_ScreenColorList[2+3*n],
1455 PalettePrefs.pal_ScreenColorList[3+3*n],
1460 FreeTagItems(AllocatedTagList);
1463 else
1465 #ifdef __AROS__
1466 Scr = AROS_CALL2(struct Screen *, (*OldOpenScreenTagList),
1467 AROS_LDA(struct NewScreen *, newScr, A0),
1468 AROS_LDA(const struct TagItem *, TagList, A1),
1469 struct IntuitionBase *, iBase);
1470 #else
1471 Scr = (struct Screen *) CALLLIBFUNC_P3((*OldOpenScreenTagList),
1472 A0, newScr,
1473 A1, TagList,
1474 A6, iBase);
1475 #endif
1478 d1(KPrintF("%s/%s/%ld: Scr=%08lx\n", __FILE__, __FUNC__, __LINE__, Scr));
1480 return Scr;
1482 LIBFUNC_END
1485 // UpdateWorkbench(name, parentlock, action)
1486 // A0 A1 D0
1488 // VOID UpdateWorkbench(char *, BPTR, LONG);
1489 LIBFUNC_P4(void, sca_UpdateWorkbench,
1490 A0, CONST_STRPTR, Name,
1491 A1, BPTR, ParentLock,
1492 D0, LONG, Action,
1493 A6, struct Library *, wbBase, 0)
1495 struct ScaUpdateIcon_IW upd;
1497 (void) Action;
1498 (void) wbBase;
1500 d1(kprintf("%s/%s/%ld: Name=<%s> Action=%ld\n", __FILE__, __FUNC__, __LINE__, Name, Action));
1501 debugLock_d1(ParentLock);
1503 upd.ui_iw_Lock = ParentLock;
1504 upd.ui_iw_Name = (STRPTR) Name;
1505 upd.ui_IconType = ICONTYPE_NONE;
1507 SCA_UpdateIcon(SIV_IconWin, &upd, sizeof(upd));
1509 LIBFUNC_END
1512 //LIBFUNC_P2(CONST_STRPTR, sca_GetLocString,
1513 // D0, ULONG, StringID,
1514 // A6, struct Library *, wbBase)
1516 // return GetLocString(StringID);
1518 //LIBFUNC_END
1521 // private Workbench function -84
1522 LIBFUNC_P1(LONG, sca_SetBackFill,
1523 A6, struct Library *, wbBase, 0)
1525 (void) wbBase;
1527 return 0;
1529 LIBFUNC_END
1533 // worked = WBInfo(lock, name, screen)
1534 // d0 a0 a1 a2
1536 // ULONG WBInfo(BPTR, STRPTR, struct Screen *);
1538 LIBFUNC_P4(ULONG, sca_WBInfo,
1539 A0, BPTR, lock,
1540 A1, STRPTR, name,
1541 A2, struct Screen *, screen,
1542 A6, struct Library *, wbBase, 0)
1544 ULONG Success;
1545 struct ScaIconNode in;
1547 (void) wbBase;
1548 (void) screen;
1550 d1(KPrintF("%s/%s/%ld: START Name=<%s> screen=%08lx\n", __FILE__, __FUNC__, __LINE__, name, screen));
1551 debugLock_d1(lock);
1553 (void) SCA_LockWindowList(SCA_LockWindowList_Shared);
1555 memset(&in, 0, sizeof(in));
1557 in.in_Lock = lock;
1558 in.in_Name = name;
1559 in.in_Icon = NewIconObjectTags(name,
1560 TAG_END);
1561 if (NULL == in.in_Icon)
1563 in.in_Icon = SCA_GetDefIconObject(lock, name);
1566 WBInfoStart((struct internalScaWindowTask *) winlist.wl_WindowStruct->ws_WindowTask,
1567 &in, NULL);
1569 Success = TRUE;
1571 SCA_UnLockWindowList();
1573 d1(KPrintF("%s/%s/%ld: END Success=%ld\n", __FILE__, __FUNC__, __LINE__, Success));
1575 return Success;
1577 LIBFUNC_END
1580 // status = PutDiskObject(name, diskobj)
1581 // D0 A0 A1
1583 // BOOL PutDiskObject(STRPTR, struct DiskObject *);
1584 LIBFUNC_P3(BOOL, sca_PutDiskObject,
1585 A0, CONST_STRPTR, Name,
1586 A1, const struct DiskObject *, diskObj,
1587 A6, struct Library *, IconBase, 0)
1589 #ifdef __AROS__
1590 BOOL Success = AROS_CALL2(BOOL, (*OldPutDiskObject),
1591 AROS_LDA(CONST_STRPTR, Name, A0),
1592 AROS_LDA(const struct DiskObject *, diskObj, A1),
1593 struct Library *, IconBase);
1594 #else
1595 BOOL Success = CALLLIBFUNC_P3((*OldPutDiskObject),
1596 A0, Name, A1, diskObj, A6, IconBase);
1597 #endif
1599 d1(KPrintF("%s/%s/%ld: Success=%ld\n", __FILE__, __FUNC__, __LINE__, Success));
1601 if (Success)
1602 PatchRefreshIcon(Name, diskObj->do_Type);
1604 return Success;
1606 LIBFUNC_END
1609 // result = DeleteDiskObject(name)
1610 // D0 A0
1612 // BOOL DeleteDiskObject(STRPTR);
1613 LIBFUNC_P2(BOOL, sca_DeleteDiskObject,
1614 A0, CONST_STRPTR, Name,
1615 A6, struct Library *, IconBase, 0)
1617 #ifdef __AROS__
1618 BOOL Success = AROS_CALL1(BOOL, (*OldDeleteDiskObject),
1619 AROS_LDA(CONST_STRPTR, Name, A0),
1620 struct Library *, IconBase);
1621 #else
1622 BOOL Success = CALLLIBFUNC_P2((*OldDeleteDiskObject),
1623 A0, Name, A6, IconBase);
1624 #endif
1626 d1(KPrintF("%s/%s/%ld: Success=%ld\n", __FILE__, __FUNC__, __LINE__, Success));
1628 if (Success)
1629 PatchRefreshIcon(Name, ICONTYPE_NONE);
1631 return Success;
1633 LIBFUNC_END
1636 // success = PutIconTagList(name,icon,tags);
1637 // D0 A0 A1 A2
1639 // BOOL PutIconTagList(STRPTR name,struct DiskObject *icon,
1640 // struct TagItem *tags);
1641 LIBFUNC_P4(BOOL, sca_PutIconTagList,
1642 A0, CONST_STRPTR, Name,
1643 A1, const struct DiskObject *, diskObj,
1644 A2, struct TagItem *, tags,
1645 A6, struct Library *, IconBase, 0)
1647 //ULONG NotifyWB;
1648 #ifdef __AROS__
1649 BOOL Success = AROS_CALL3(BOOL, (*OldPutIconTagList),
1650 AROS_LDA(CONST_STRPTR, Name, A0),
1651 AROS_LDA(const struct DiskObject *, diskObj, A1),
1652 AROS_LDA(struct TagItem *, tags, A2),
1653 struct Library *, IconBase);
1654 #else
1655 BOOL Success = CALLLIBFUNC_P4((*OldPutIconTagList),
1656 A0, Name, A1, diskObj, A2, tags, A6, IconBase);
1657 #endif
1659 //NotifyWB = GetTagData(ICONPUTA_NotifyWorkbench, FALSE, tags);
1661 d1(KPrintF("%s/%s/%ld: Success=%ld NotifyWB=%ld\n", __FILE__, __FUNC__, __LINE__, Success, NotifyWB));
1663 if (Success)
1664 PatchRefreshIcon(Name, diskObj->do_Type);
1666 return Success;
1668 LIBFUNC_END
1672 static void PatchRefreshIcon(CONST_STRPTR IconName, UBYTE IconType)
1674 d1(KPrintF("%s/%s/%ld: START Name=<%s> IconType=%lu\n", __FILE__, __FUNC__, __LINE__, IconName, IconType));
1675 if (!IsScalosProcess())
1677 STRPTR Path = AllocCopyString(IconName);
1679 d1(KPrintF("%s/%s/%ld: Path=%08lx\n", __FILE__, __FUNC__, __LINE__, Path));
1680 if (Path)
1682 struct ScaUpdateIcon_IW upd;
1683 STRPTR lp;
1684 char ch;
1686 d1(KPrintF("%s/%s/%ld: Path=<%s>\n", __FILE__, __FUNC__, __LINE__, Path));
1687 StripIconExtension(Path);
1688 d1(KPrintF("%s/%s/%ld: Path=<%s>\n", __FILE__, __FUNC__, __LINE__, Path));
1690 lp = PathPart(Path);
1691 ch = *lp;
1692 *lp = '\0';
1694 upd.ui_iw_Lock = Lock(Path, ACCESS_READ);
1695 debugLock_d1(upd.ui_iw_Lock);
1697 *lp = ch;
1699 if (upd.ui_iw_Lock)
1701 upd.ui_iw_Name = FilePart(Path);
1702 upd.ui_IconType = IconType;
1703 d1(KPrintF("%s/%s/%ld: ui_iw_Name=<%s>\n", __FILE__, __FUNC__, __LINE__, upd.ui_iw_Name));
1705 SCA_UpdateIcon(WSV_Type_IconWindow, &upd, sizeof(upd));
1707 UnLock(upd.ui_iw_Lock);
1710 FreeCopyString(Path);
1713 d1(KPrintF("%s/%s/%ld: END \n", __FILE__, __FUNC__, __LINE__));
1717 // success = DeleteFile( name )
1718 // D0 D1
1720 // BOOL DeleteFile(STRPTR)
1721 LIBFUNC_P2(ULONG, sca_DeleteFile,
1722 D1, CONST_STRPTR, Name,
1723 A6, struct DosLibrary *, DOSBase, 0)
1725 ULONG Success;
1727 d1(KPrintF("%s/%s/%ld: START Name=<%s> Task=<%s>\n", __FILE__, __FUNC__, __LINE__, Name, FindTask(NULL)->tc_Node.ln_Name));
1729 #ifdef __AROS__
1730 Success = AROS_CALL1(BOOL, (*OldDeleteFile),
1731 AROS_LDA(CONST_STRPTR, Name, D1),
1732 struct DosLibrary *, DOSBase);
1733 #else
1734 Success = CALLLIBFUNC_P2((*OldDeleteFile),
1735 D1, Name, A6, DOSBase);
1736 #endif
1738 if (Success)
1740 PatchRefreshIcon(Name, ICONTYPE_NONE);
1743 d1(KPrintF("%s/%s/%ld: END Success=%ld\n", __FILE__, __FUNC__, __LINE__, Success));
1745 return Success;
1747 LIBFUNC_END
1750 // success = Rename( oldName, newName )
1751 // D0 D1 D2
1753 // BOOL Rename(STRPTR, STRPTR)
1754 LIBFUNC_P3(ULONG, sca_Rename,
1755 D1, CONST_STRPTR, oldName,
1756 D2, CONST_STRPTR, newName,
1757 A6, struct DosLibrary *, DOSBase, 0)
1759 struct internalScaWindowTask *iwtMain = (struct internalScaWindowTask *) iInfos.xii_iinfos.ii_MainWindowStruct->ws_WindowTask;
1760 ULONG isIcon;
1761 STRPTR fName = NULL;
1762 BOOL Success;
1763 BPTR fLock;
1764 BPTR parentLock = BNULL;
1765 struct ScaIconNode *in = NULL;
1766 struct List HistoryPathList;
1767 BOOL WinListLocked = FALSE;
1769 d1(kprintf("%s/%s/%ld: oldName=<%s> newName=<%s> Task=<%s>\n", __FILE__, __FUNC__, __LINE__, oldName, newName, FindTask(NULL)->tc_Node.ln_Name));
1771 do {
1772 NewList(&HistoryPathList);
1774 PatchAsyncWBUndoRename(oldName, newName);
1776 fLock = Lock((STRPTR) oldName, ACCESS_READ);
1777 debugLock_d1(fLock);
1779 isIcon = IsIconName(oldName);
1781 if (BNULL == fLock)
1782 break;
1784 WinListLocked = CollectRenameAdjustHistoryPaths(&HistoryPathList, fLock);
1786 if (FALSE == isIcon)
1787 break;
1789 parentLock = ParentDir(fLock);
1790 debugLock_d1(parentLock);
1791 if ((BPTR)NULL == parentLock)
1792 break;
1794 fName = AllocCopyString(FilePart((STRPTR) oldName));
1795 if (NULL == fName)
1796 break;
1798 StripIconExtension(fName);
1800 d1(kprintf("%s/%s/%ld: \n", __FILE__, __FUNC__, __LINE__));
1801 in = FindBackdropIconExclusive(parentLock, fName);
1802 if (NULL == in)
1803 break;
1804 } while (0);
1806 d1(kprintf("%s/%s/%ld: in=%08lx fLock=%08lx\n", __FILE__, __FUNC__, __LINE__, in, fLock));
1808 #ifdef __AROS__
1809 Success = AROS_CALL2(LONG, (*OldRename),
1810 AROS_LDA(CONST_STRPTR, oldName, D1),
1811 AROS_LDA(CONST_STRPTR, newName, D2),
1812 struct DosLibrary *, DOSBase);
1813 #else
1814 Success = CALLLIBFUNC_P3((*OldRename),
1815 D1, oldName, D2, newName, A6, DOSBase);
1816 #endif
1818 if (Success)
1820 d1(KPrintF("%s/%s/%ld: isIcon=%08lx parentLock=%08lx\n", __FILE__, __FUNC__, __LINE__, isIcon, parentLock));
1822 AdjustRenameAdjustHistoryPaths(&HistoryPathList, fLock);
1824 if (0 == isIcon && fLock)
1826 // adjust window name of renamed drawer
1827 d1(kprintf("%s/%s/%ld: \n", __FILE__, __FUNC__, __LINE__));
1828 AdjustRenamedWindowName(fLock);
1831 if (in)
1833 // adjust renamed backdrop icon
1834 debugLock_d1(fLock);
1835 d1(kprintf("%s/%s/%ld: in=%08lx <%s>\n", __FILE__, __FUNC__, __LINE__, in, GetIconName(in)));
1837 AdjustBackdropRenamed(fLock, in);
1839 d1(kprintf("%s/%s/%ld: \n", __FILE__, __FUNC__, __LINE__));
1842 if (parentLock && fName)
1844 // initiate removal of old object
1845 struct ScaUpdateIcon_IW upd;
1847 upd.ui_iw_Lock = parentLock;
1848 upd.ui_iw_Name = fName;
1849 upd.ui_IconType = ICONTYPE_NONE;
1851 debugLock_d1(parentLock);
1852 d1(KPrintF("%s/%s/%ld: fName=<%s>\n", __FILE__, __FUNC__, __LINE__, fName));
1854 SCA_UpdateIcon(SIV_IconWin, &upd, sizeof(upd));
1857 do {
1858 // force update for new object
1859 struct ScaUpdateIcon_IW upd;
1861 isIcon = IsIconName(newName);
1862 if (FALSE == isIcon)
1863 break;
1865 if (fLock)
1867 UnLock(fLock);
1868 //fLock = NULL;
1870 if (parentLock)
1872 UnLock(parentLock);
1873 parentLock = (BPTR)NULL;
1875 if (fName)
1877 FreeCopyString(fName);
1878 fName = NULL;
1881 fLock = Lock((STRPTR) newName, ACCESS_READ);
1882 debugLock_d1(fLock);
1883 if ((BPTR)NULL == fLock)
1884 break;
1886 parentLock = ParentDir(fLock);
1887 debugLock_d1(parentLock);
1888 if ((BPTR)NULL == parentLock)
1889 break;
1891 fName = AllocCopyString(FilePart((STRPTR) newName));
1892 d1(KPrintF("%s/%s/%ld: fName=%08lx\n", __FILE__, __FUNC__, __LINE__, fName));
1893 if (NULL == fName)
1894 break;
1896 StripIconExtension(fName);
1898 d1(KPrintF("%s/%s/%ld: \n", __FILE__, __FUNC__, __LINE__));
1900 upd.ui_iw_Lock = parentLock;
1901 upd.ui_iw_Name = fName;
1902 upd.ui_IconType = ICONTYPE_NONE;
1904 debugLock_d1(parentLock);
1905 d1(KPrintF("%s/%s/%ld: fName=<%s>\n", __FILE__, __FUNC__, __LINE__, fName));
1907 SCA_UpdateIcon(SIV_IconWin, &upd, sizeof(upd));
1908 } while (0);
1911 d1(KPrintF("%s/%s/%ld: \n", __FILE__, __FUNC__, __LINE__));
1913 if (in)
1914 ScalosUnLockIconList(iwtMain);
1915 if (parentLock)
1916 UnLock(parentLock);
1917 if (fName)
1918 FreeCopyString(fName);
1919 if (fLock)
1920 UnLock(fLock);
1922 CleanupRenameAdjustHistoryPaths(&HistoryPathList, WinListLocked);
1924 d1(KPrintF("%s/%s/%ld: END Success=%ld\n", __FILE__, __FUNC__, __LINE__, Success));
1926 return Success;
1928 LIBFUNC_END
1931 // file = Open( name, accessMode )
1932 // D0 D1 D2
1934 // BPTR Open(STRPTR, LONG)
1935 LIBFUNC_P3(BPTR, sca_Open,
1936 D1, CONST_STRPTR, name,
1937 D2, LONG, accessMode,
1938 A6, struct DosLibrary *, DOSBase, 0)
1940 BPTR file;
1941 T_ExamineData *fib = NULL;
1942 struct DosOpenInfo *doi;
1944 #ifdef __AROS__
1945 file = AROS_CALL2(BPTR, (*OldOpen),
1946 AROS_LDA(CONST_STRPTR, name, D1),
1947 AROS_LDA(LONG, accessMode, D2),
1948 struct DosLibrary *, DOSBase);
1949 #else
1950 file = CALLLIBFUNC_P3((*OldOpen),
1951 D1, name, D2, accessMode,
1952 A6, DOSBase);
1953 #endif
1955 d1(KPrintF("%s/%s/%ld: file=%08lx name=<%s> accessMode=%ld\n", __FILE__, __FUNC__, __LINE__, file, name, accessMode));
1956 #if 1
1957 do {
1958 struct FileHandle *fh;
1960 d1(KPrintF("%s/%s/%ld: file=%08lx\n", __FILE__, __FUNC__, __LINE__, file));
1961 if (BNULL == file)
1962 break;
1963 if (IsScalosProcess())
1964 break;
1965 if (IsInteractive(file))
1966 break;
1968 if (MODE_OLDFILE == accessMode)
1969 break;
1971 fh = BADDR(file);
1972 d1(KPrintF("%s/%s/%ld: fh_Type=%08lx\n", __FILE__, __FUNC__, __LINE__, fh->fh_Type));
1973 if (NULL == fh->fh_Type)
1974 break;
1975 if (NULL == PatchOpenBTree)
1976 break;
1978 if (!ScalosExamineBegin(&fib))
1979 break;
1980 d1(KPrintF("%s/%s/%ld: fib=%08lx\n", __FILE__, __FUNC__, __LINE__, fib));
1982 if (!ScalosExamineFH(file, &fib))
1983 break;
1985 doi = ScalosAlloc(sizeof(struct DosOpenInfo));
1986 d1(KPrintF("%s/%s/%ld: doi=%08lx\n", __FILE__, __FUNC__, __LINE__, doi));
1987 if (NULL == doi)
1988 break;
1990 DoiCount++;
1992 doi->doi_fh = file;
1993 doi->doi_AccessMode = accessMode;
1994 doi->doi_DateBefore = *ScalosExamineGetDate(fib);
1996 if (BTreeInsert(PatchOpenBTree, (APTR) doi->doi_fh, doi))
1998 // Node with this key already exists
1999 d1(KPrintF("%s/%s/%ld: key already exists\n", __FILE__, __FUNC__, __LINE__));
2000 BTreeHide(PatchOpenBTree, (APTR) doi->doi_fh);
2001 (void) BTreeInsert(PatchOpenBTree, (APTR) doi->doi_fh, doi);
2004 d1(KPrintF("%s/%s/%ld: file=%08lx DoiCount=%ld BTreeNumberOfNodes=%ld name=<%s>\n", \
2005 __FILE__, __FUNC__, __LINE__, file, DoiCount, BTreeNumberOfNodes(PatchOpenBTree), name));
2006 } while (0);
2008 ScalosExamineEnd(&fib);
2009 #endif
2010 return file;
2012 LIBFUNC_END
2015 // success = Close( file )
2016 // D0 D1
2018 // BOOL Close(BPTR)
2019 LIBFUNC_P2(ULONG, sca_Close,
2020 D1, BPTR, file,
2021 A6, struct DosLibrary *, DOSBase, 0)
2023 BOOL Success;
2024 struct DosOpenInfo *doi = NULL;
2025 T_ExamineData *fib = NULL;
2026 STRPTR FileName = NULL;
2027 BOOL DoUpdate = FALSE;
2029 d1(KPrintF("%s/%s/%ld: file=%08lx\n", __FILE__, __FUNC__, __LINE__, file));
2030 d1(KPrintF("%s/%s/%ld: IsInteractive=%ld\n", __FILE__, __FUNC__, __LINE__, IsInteractive(file)));
2031 #if 1
2033 do {
2034 struct FileHandle *fh;
2036 d1(KPrintF("%s/%s/%ld: file=%08lx\n", __FILE__, __FUNC__, __LINE__, file));
2037 if (BNULL == file)
2038 break;
2040 if (NULL == PatchOpenBTree)
2041 break;
2043 d1(KPrintF("%s/%s/%ld: BTreeNumberOfNodes=%ld\n", __FILE__, __FUNC__, __LINE__, BTreeNumberOfNodes(PatchOpenBTree)));
2045 doi = BTreeFind(PatchOpenBTree, (APTR) file);
2046 d1(KPrintF("%s/%s/%ld: doi=%08lx\n", __FILE__, __FUNC__, __LINE__, doi));
2047 if (NULL == doi)
2048 break;
2050 if (IsScalosProcess())
2051 break;
2052 if (IsInteractive(file))
2053 break;
2055 fh = BADDR(file);
2056 d1(KPrintF("%s/%s/%ld: fh_Type=%08lx\n", __FILE__, __FUNC__, __LINE__, fh->fh_Type));
2057 if (BNULL == fh->fh_Type)
2058 break;
2060 d1(kprintf("%s/%s/%ld: fh_Link=%08lx fh_Port=%08lx fh_Type=%08lx\n", __FILE__, __FUNC__, __LINE__, fh->fh_Link, fh->fh_Port, fh->fh_Type));
2062 if (!ScalosExamineBegin(&fib))
2063 break;
2065 d1(KPrintF("%s/%s/%ld: fib=%08lx\n", __FILE__, __FUNC__, __LINE__, fib));
2067 if (!ScalosExamineFH(file, &fib))
2068 break;
2070 d1(KPrintF("%s/%s/%ld: doi_DateBefore: ds_Days=%ld ds_Minute=%ld ds_Tick=%ld\n", \
2071 __FILE__, __FUNC__, __LINE__, doi->doi_DateBefore.ds_Days,
2072 doi->doi_DateBefore.ds_Minute, doi->doi_DateBefore.ds_Tick));
2073 d1(KPrintF("%s/%s/%ld: fib_FileName=<%s> ds_Days=%ld ds_Minute=%ld ds_Tick=%ld\n", \
2074 __FILE__, __FUNC__, __LINE__, fib->fib_FileName, \
2075 fib->fib_Date.ds_Days, fib->fib_Date.ds_Minute, fib->fib_Date.ds_Tick));
2076 d1(KPrintF("%s/%s/%ld: doi_AccessMode=%ld\n", __FILE__, __FUNC__, __LINE__, doi->doi_AccessMode));
2077 d1(KPrintF("%s/%s/%ld: CompareDates=%08lx\n", __FILE__, __FUNC__, __LINE__, CompareDates(&fib->fib_Date, &doi->doi_DateBefore)));
2079 if (MODE_NEWFILE == doi->doi_AccessMode ||
2080 0 != CompareDates(ScalosExamineGetDate(fib), &doi->doi_DateBefore))
2082 d1(KPrintF("%s/%s/%ld: doi_DateBefore: ds_Days=%ld ds_Minute=%ld ds_Tick=%ld\n", \
2083 __FILE__, __FUNC__, __LINE__, doi->doi_DateBefore.ds_Days,
2084 doi->doi_DateBefore.ds_Minute, doi->doi_DateBefore.ds_Tick));
2085 d1(KPrintF("%s/%s/%ld: fib_FileName=<%s> ds_Days=%ld ds_Minute=%ld ds_Tick=%ld\n", \
2086 __FILE__, __FUNC__, __LINE__, fib->fib_FileName, \
2087 fib->fib_Date.ds_Days, fib->fib_Date.ds_Minute, fib->fib_Date.ds_Tick));
2089 FileName = AllocPathBuffer();
2090 d1(KPrintF("%s/%s/%ld: FileName=%08lx\n", __FILE__, __FUNC__, __LINE__, FileName));
2091 if (NULL == FileName)
2092 break;
2094 // retrieve full filename
2095 if (!NameFromFH(file, FileName, Max_PathLen))
2096 break;
2098 d1(KPrintF("%s/%s/%ld: FileName=<%s>\n", __FILE__, __FUNC__, __LINE__, FileName));
2100 DoUpdate = TRUE;
2102 } while (0);
2104 if (doi)
2106 //BOOL HideResult;
2107 /* HideResult = */ BTreeHide(PatchOpenBTree, (APTR) file);
2108 d1(KPrintF("%s/%s/%ld: HideResult=%ld DoiCount=%ld BTreeNumberOfNodes=%ld\n", __FILE__, __FUNC__, __LINE__, HideResult, DoiCount, BTreeNumberOfNodes(PatchOpenBTree)));
2110 #endif
2112 #ifdef __AROS__
2113 Success = AROS_CALL1(BOOL, (*OldClose),
2114 AROS_LDA(BPTR, file, D1),
2115 struct DosLibrary *, DOSBase);
2116 #else
2117 Success = CALLLIBFUNC_P2((*OldClose),
2118 D1, file, A6, DOSBase);
2119 #endif
2121 #if 1
2122 ScalosExamineEnd(&fib);
2124 if (DoUpdate)
2126 d1(KPrintF("%s/%s/%ld: FileName=<%s>\n", __FILE__, __FUNC__, __LINE__, FileName));
2127 PatchRefreshIcon(FileName, ICONTYPE_NONE);
2130 if (FileName)
2131 FreePathBuffer(FileName);
2132 #endif
2134 d1(kprintf("%s/%s/%ld: Success=%ld\n", __FILE__, __FUNC__, __LINE__, Success));
2136 return Success;
2138 LIBFUNC_END
2141 // success = CreateDir( name )
2142 // D0 D1
2144 // BOOL CreateDir(STRPTR)
2145 LIBFUNC_P2(BPTR, sca_CreateDir,
2146 D1, CONST_STRPTR, name,
2147 A6, struct DosLibrary *, DOSBase, 0)
2149 BPTR lock;
2151 d1(KPrintF("%s/%s/%ld: START Name=<%s> Task=<%s>\n", __FILE__, __FUNC__, __LINE__, name, FindTask(NULL)->tc_Node.ln_Name));
2153 PatchAsyncWBUndoCreateDir(name);
2155 #ifdef __AROS__
2156 lock = AROS_CALL1(BPTR, (*OldCreateDir),
2157 AROS_LDA(CONST_STRPTR, name, D1),
2158 struct DosLibrary *, DOSBase);
2159 #else
2160 lock = CALLLIBFUNC_P2((*OldCreateDir),
2161 D1, name, A6, DOSBase);
2162 #endif
2164 if (BNULL != lock)
2166 PatchRefreshIcon(name, WBDRAWER);
2169 d1(KPrintF("%s/%s/%ld: END lock=%ld\n", __FILE__, __FUNC__, __LINE__, lock));
2171 return lock;
2173 LIBFUNC_END
2176 static BOOL IsScalosProcess(void)
2178 struct Task *myTask = FindTask(NULL);
2180 d1(KPrintF("%s/%s/%ld: ln_Name=<%s>\n", __FILE__, __FUNC__, __LINE__, myTask->tc_Node.ln_Name ? myTask->tc_Node.ln_Name : ""));
2182 return (BOOL) (NULL == myTask->tc_Node.ln_Name ||
2183 (0 == strncmp(myTask->tc_Node.ln_Name, "Scalos_", strlen("Scalos_"))) ||
2184 (0 == strcmp(myTask->tc_Node.ln_Name, "newdrawer.module")) ||
2185 (0 == strcmp(myTask->tc_Node.ln_Name, "delete.module")) ||
2186 (0 == strcmp(myTask->tc_Node.ln_Name, "rename.module")) );
2190 static void PatchOpenDisposeData(void *data)
2192 d1(KPrintF("%s/%s/%ld: doi=%08lx\n", __FILE__, __FUNC__, __LINE__, data));
2193 DoiCount--;
2194 ScalosFree(data);
2198 static void PatchOpenDisposeKey(void *key)
2200 // No-op since key is only handed as reference to IconScanEntry->ise_Fib.fib_FileName
2201 // and IconScanEntry nodes are managed within rilc_NonIconScanList
2202 (void) key;
2205 static int PatchOpenCompare(const void *key1, const void *key2)
2207 return ((BPTR) key2) - ((BPTR) key1);
2211 BOOL PatchInit(void)
2213 PatchOpenBTree = BTreeCreate(PatchOpenDisposeData, PatchOpenDisposeKey, PatchOpenCompare);
2214 d1(KPrintF("%s/%s/%ld: PatchOpenBTree=%08lx\n", __FILE__, __FUNC__, __LINE__, PatchOpenBTree));
2216 return (BOOL) (NULL != PatchOpenBTree);
2221 void PatchCleanup(void)
2223 if (PatchOpenBTree)
2225 BTreeDispose(PatchOpenBTree);
2226 PatchOpenBTree = NULL;
2230 #ifdef TEST_OPENWINDOWTAGLIST
2231 static void ByteDump(const void *p, size_t Length)
2233 const unsigned char *Data = (const unsigned char *) p;
2234 unsigned long count;
2235 unsigned char Line[80];
2236 unsigned char *lp;
2238 lp = Line;
2239 for (count=0; count<Length; count++)
2241 *lp++ = isprint(*Data) ? *Data : '.';
2242 KPrintF("%02x ", *Data++);
2243 if ((count+1) % 16 == 0)
2245 *lp = '\0';
2246 lp = Line;
2247 KPrintF("\t%s\n", Line);
2251 *lp = '\0';
2252 while (count % 16 != 0)
2254 KPrintF(" ");
2255 count++;
2257 KPrintF("\t%s\n", Line);
2259 #endif /* TEST_OPENWINDOWTAGLIST */
2262 static void PatchAsyncWBUndoRename(CONST_STRPTR oldName, CONST_STRPTR newName)
2264 CONST_STRPTR ProcName = FindTask(NULL)->tc_Node.ln_Name;
2266 if ((0 == strcmp(ProcName, "ASYNCWB")) && (0 == IsIconName(oldName)))
2268 BPTR dirLock = CurrentDir(BNULL);
2270 CurrentDir(dirLock);
2272 DoMethod(iInfos.xii_iinfos.ii_MainWindowStruct->ws_WindowTask->mt_MainObject,
2273 SCCM_IconWin_AddUndoEvent,
2274 UNDO_Rename,
2275 UNDOTAG_CopySrcDirLock, dirLock,
2276 UNDOTAG_CopySrcName, oldName,
2277 UNDOTAG_CopyDestName, newName,
2278 TAG_END
2284 static void PatchAsyncWBUndoCreateDir(CONST_STRPTR name)
2286 CONST_STRPTR ProcName = FindTask(NULL)->tc_Node.ln_Name;
2288 if (0 == strcmp(ProcName, "AsyncWB - textinput process"))
2290 BPTR dirLock = CurrentDir(BNULL);
2292 CurrentDir(dirLock);
2294 DoMethod(iInfos.xii_iinfos.ii_MainWindowStruct->ws_WindowTask->mt_MainObject,
2295 SCCM_IconWin_AddUndoEvent,
2296 UNDO_NewDrawer,
2297 UNDOTAG_IconDirLock, dirLock,
2298 UNDOTAG_IconName, name,
2299 TAG_END