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>
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>
34 #include <proto/scalos.h>
36 #include <clib/alib_protos.h>
39 #include <datatypes/iconobject.h>
40 #include <scalos/palette.h>
41 #include <scalos/pattern.h>
42 #include <scalos/scalos.h>
49 #include "scalos_structures.h"
50 #include "FsAbstraction.h"
51 #include "functions.h"
52 #include "Variables.h"
55 //----------------------------------------------------------------------------
57 // local data structures
59 #if defined(__MORPHOS__)
60 // Extended DiskObject structure
61 #define OWN_MAGIC 0x466f4164
65 struct DiskObject diskobj
;
66 struct FreeList
*fl
; /* this is safe for WB 3.1 */
67 /* start of additions */
76 struct BitMap
*pngimage
;
78 ULONG pngimage_height
;
81 #define ISOWN(x) (((struct OwnDiskObject *)x)->ownmagic == OWN_MAGIC && ((struct OwnDiskObject *)x)->ownptr == x)
83 #endif /* __MORPHOS__ */
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 //----------------------------------------------------------------------------
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 //----------------------------------------------------------------------------
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
) ();
131 APTR OldAddAppWindowA
;
132 APTR OldAppAppMenuItemA
;
135 BOOL (*OldPutDiskObject
) ();
136 BOOL (*OldDeleteDiskObject
) ();
137 BOOL (*OldPutIconTagList
) ();
138 ULONG (*OldDeleteFile
) ();
139 ULONG (*OldRename
) ();
141 ULONG (*OldClose
) ();
142 BPTR (*OldCreateDir
) ();
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
,
174 A6
, struct Library
*, wbBase
);
176 APTR OldAddAppWindowA
;
177 APTR OldAppAppMenuItemA
;
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
),
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);
216 //----------------------------------------------------------------------------
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__
));
235 struct SM_AppSleep
*smas
;
236 struct ScaWindowStruct
*ws
;
238 if (!CheckAllowCloseWB())
241 d1(KPrintF("%s/%s/%ld: \n", __FILE__
, __FUNC__
, __LINE__
));
243 if (MainWindowTask
->sleepflag
)
249 d1(KPrintF("%s/%s/%ld: \n", __FILE__
, __FUNC__
, __LINE__
));
251 MainWindowTask
->sleepflag
= TRUE
;
253 ReplyPort
= CreateMsgPort();
254 if (NULL
== ReplyPort
)
257 d1(KPrintF("%s/%s/%ld: \n", __FILE__
, __FUNC__
, __LINE__
));
259 PatternsOff(MainWindowTask
, ReplyPort
);
260 d1(KPrintF("%s/%s/%ld: \n", __FILE__
, __FUNC__
, __LINE__
));
262 d1(KPrintF("%s/%s/%ld: \n", __FILE__
, __FUNC__
, __LINE__
));
264 if (GuiGFXBase
&& PenShareMap
)
266 DeletePenShareMap(PenShareMap
);
270 if (IconBase
->lib_Version
>= 44)
274 ICONCTRLA_SetGlobalScreen
, NULL
,
278 smas
= (struct SM_AppSleep
*) SCA_AllocMessage(MTYP_AppSleep
, 0);
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
;
297 iwtx
->iwt_OrigWinScreen
= NULL
;
300 SCA_UnLockWindowList();
302 d1(KPrintF("%s/%s/%ld: \n", __FILE__
, __FUNC__
, __LINE__
));
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
));
318 Success
= AROS_CALL0(LONG
, (*OldCloseWB
),
319 struct IntuitionBase
*, iBase
);
321 Success
= CALLLIBFUNC_P1((*OldCloseWB
), A6
, iBase
);
325 d1(KPrintF("%s/%s/%ld: Success=%ld\n", __FILE__
, __FUNC__
, __LINE__
, Success
));
328 DeleteMsgPort(ReplyPort
);
338 // OpenWorkBench() replacement
339 LIBFUNC_P1(IPTR
, sca_OpenWorkBench
,
340 A6
, struct IntuitionBase
*, iBase
, 0)
344 d1(KPrintF("%s/%s/%ld: \n", __FILE__
, __FUNC__
, __LINE__
));
347 if (!MainWindowTask
->sleepflag
)
354 Success
= AROS_CALL0(IPTR
, (*OldOpenWB
),
355 struct IntuitionBase
*, iBase
);
357 Success
= CALLLIBFUNC_P1((*OldOpenWB
), A6
, iBase
);
362 Success
= ReOpenScalos();
365 // OpenWorkBench() is supposed to return WBScreeen !!!
367 return Success
? (IPTR
) iInfos
.xii_iinfos
.ii_Screen
: 0L;
372 static LONG
ReOpenScalos(void)
374 LONG Success
= FALSE
;
375 struct MsgPort
*ReplyPort
= NULL
;
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
)
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
)
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)
399 ICONCTRLA_SetGlobalScreen
, (IPTR
) iInfos
.xii_iinfos
.ii_Screen
,
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)
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
;
419 #endif //defined(SA_OpacitySupport)
421 iInfos
.xii_Layers3D
= NULL
!= FindTask("« LayerInfoTask »");
423 #endif //defined(__MORPHOS__)
425 ReplyPort
= CreateMsgPort();
426 if (NULL
== ReplyPort
)
429 smaw
= (struct SM_AppWakeup
*) SCA_AllocMessage(MTYP_AppWakeup
, 0);
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
);
441 PatternsOn(MainWindowTask
);
443 MainWindowTask
->sleepflag
= FALSE
;
447 DeleteMsgPort(ReplyPort
);
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
,
458 A0
, CONST_STRPTR
, IconText
,
459 A1
, struct MsgPort
*, iconPort
,
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
));
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
));
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
);
493 struct SM_RunProcess
*msg
;
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
);
516 DeleteMsgPort(ReplyPort
);
522 #if defined(__MORPHOS__)
523 d1(KPrintF("%s/%s/%ld: DiskObj=%08lx\n", __FILE__
, __FUNC__
, __LINE__
, 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
));
532 STRPTR PathCopy
= AllocCopyString(odo
->path
);
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
;
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
,
557 FreeCopyString(PathCopy
);
561 #endif /* __MORPHOS__ */
563 if (NULL
== TagList
|| !GetTagData(WBAPPICONA_PropagatePosition
, 0, TagList
))
565 DiskObj
= DiskObjClone
= CloneDiskObject(DiskObj
);
573 IconObj
= Convert2IconObjectTags(DiskObj
,
574 IDTA_SupportedIconTypes
, CurrentPrefs
.pref_SupportedIconTypes
,
579 d1(KPrintF("%s/%s/%ld: IconObj=%08lx\n", __FILE__
, __FUNC__
, __LINE__
, IconObj
));
584 IDTA_Text
, (IPTR
) IconText
,
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
));
595 appIcon
->appo_userdata2
= DiskObj
;
601 DisposeIconObject(IconObj
);
604 ScaFreeDiskObject(DiskObjClone
);
607 d1(KPrintF("%s/%s/%ld: appIcon=%08lx\n", __FILE__
, __FUNC__
, __LINE__
, appIcon
));
609 return (struct AppIcon
*) appIcon
;
614 static APTR
CloneDOImage(const APTR origImage
)
616 struct Image
*NewImage
= NULL
;
617 const struct Image
*OldImage
= (struct Image
*) origImage
;
622 if (NULL
== origImage
)
625 if (0 == TypeOfMem(origImage
))
628 if (0 == TypeOfMem(OldImage
->ImageData
))
631 NewImage
= ScalosAlloc(sizeof(struct Image
));
632 if (NULL
== NewImage
)
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
)
645 CopyMemQuick(OldImage
->ImageData
, NewImage
->ImageData
, ImgSize
);
649 if (NewImage
&& NULL
== NewImage
->ImageData
)
651 ScalosFree(NewImage
);
659 static STRPTR
*CloneDOToolTypes(CONST_STRPTR
*origToolTypes
)
661 STRPTR
*NewToolTypes
;
664 ULONG ttLength
, ttCount
;
666 d1(kprintf("%s/%s/%ld: origToolTypes=%08lx\n", __FILE__
, __FUNC__
, __LINE__
, origToolTypes
));
668 if (NULL
== origToolTypes
)
671 ttLength
= sizeof(STRPTR
);
674 for (splp
=origToolTypes
; *splp
; splp
++)
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
)
689 dlp
= ((STRPTR
) NewToolTypes
) + ttCount
* sizeof(STRPTR
);
691 for (dplp
=NewToolTypes
, splp
=origToolTypes
; *splp
; dplp
++, splp
++)
694 strcpy(*dplp
, *splp
);
695 dlp
+= 1 + strlen(dlp
);
699 d1(kprintf("%s/%s/%ld: NewToolTypes=%08lx\n", __FILE__
, __FUNC__
, __LINE__
, NewToolTypes
));
705 static struct DiskObject
*CloneDiskObject(const struct DiskObject
*origDiskObj
)
707 struct DiskObject
*NewDiskObj
;
710 // test for CloneDOToolTypes() function
724 ytt
= CloneDOToolTypes(xTT
);
730 if (IconBase
->lib_Version
>= 44)
732 d1(kprintf("%s/%s/%ld: \n", __FILE__
, __FUNC__
, __LINE__
));
735 NewDiskObj
= DupDiskObject((struct DiskObject
*)origDiskObj
,
736 ICONDUPA_DuplicateImages
, TRUE
,
737 ICONDUPA_DuplicateImageData
, TRUE
,
738 ICONDUPA_DuplicateToolTypes
, TRUE
,
739 ICONDUPA_ActivateImageData
, TRUE
,
742 d1(kprintf("%s/%s/%ld: NewDiskObj=%08lx\n", __FILE__
, __FUNC__
, __LINE__
, NewDiskObj
));
746 NewDiskObj
= GetDiskObject(NULL
);
748 d1(kprintf("%s/%s/%ld: NewDiskObj=%08lx\n", __FILE__
, __FUNC__
, __LINE__
, 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
));
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
;
794 ScalosFree(img
->ImageData
);
798 DiskObj
->do_Gadget
.GadgetRender
= NULL
;
800 if (DiskObj
->do_Gadget
.SelectRender
)
802 struct Image
*img
= (struct Image
*) DiskObj
->do_Gadget
.SelectRender
;
805 ScalosFree(img
->ImageData
);
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
)
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
));
831 struct ScaWindowStruct
*ws
= iInfos
.xii_iinfos
.ii_AppWindowStruct
;
833 // check if AppIcon name contains invalid characters ":/"
834 if (strchr(ArgArray
->wa_Name
, ':'))
836 if (strchr(ArgArray
->wa_Name
, '/'))
839 Path
= AllocPathBuffer();
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
,
852 d1(kprintf("%s/%s/%ld: IconObj=%08lx\n", __FILE__
, __FUNC__
, __LINE__
, IconObj
));
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
,
869 FreePathBuffer(Path
);
871 d1(kprintf("%s/%s/%ld: IconObj=%08lx\n", __FILE__
, __FUNC__
, __LINE__
, IconObj
));
874 ArgArray
->wa_Name
= (STRPTR
) IconObj
;
881 // success = RemoveAppIcon(AppIcon)
883 LIBFUNC_P2(ULONG
, sca_RemoveAppIcon
,
884 A0
, struct AppIcon
*, appIcon
,
885 A6
, struct Library
*, wbBase
, 0)
887 struct AppObject
*AppObj
= (struct AppObject
*) appIcon
;
889 struct TagItem
*TagList
;
890 struct DiskObject
*DiskObj
;
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
)
898 return AROS_CALL1(BOOL
, (*OldRemoveAppIcon
),
899 AROS_LDA(struct AppIcon
*, appIcon
, A0
),
900 struct Library
*, wbBase
);
902 return CALLLIBFUNC_P2((*OldRemoveAppIcon
), A0
, appIcon
, A6
, wbBase
);
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
);
924 ScaFreeDiskObject(DiskObj
);
931 // AppIcon = AddAppWindowA(id, userdata, window, msgport, taglist)
933 LIBFUNC_P6(struct AppWindow
*, sca_AddAppWindowA
,
936 A0
, struct Window
*, window
,
937 A1
, struct MsgPort
*, iconPort
,
938 A2
, struct TagItem
*, TagList
,
939 A6
, struct Library
*, wbBase
, 0)
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
);
952 // success = RemoveAppWindow(AppWindow)
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
)
964 return AROS_CALL1(BOOL
, (*OldRemoveAppWindow
),
965 AROS_LDA(struct AppWindow
*, aw
, A0
),
966 struct Library
*, wbBase
);
968 return (BOOL
) CALLLIBFUNC_P2((*OldRemoveAppWindow
), A0
, aw
, A6
, wbBase
);
971 CloseLibrary(&ScalosBase
->scb_LibNode
);
973 return SCA_RemoveAppObject(appo
);
978 // AppMenuItem = AddAppMenuItemA(id, userdata, text, msgport, taglist)
980 LIBFUNC_P6(struct AppMenuItem
*, sca_AddAppMenuItemA
,
983 A0
, CONST_STRPTR
, text
,
984 A1
, struct MsgPort
*, iconPort
,
985 A2
, struct TagItem
*, TagList
,
986 A6
, struct Library
*, wbBase
, 0)
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
);
999 // success = RemoveAppMenuItem(AppWindow)
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
)
1011 return AROS_CALL1(BOOL
, (*OldRemoveAppMenuItem
),
1012 AROS_LDA(struct AppMenuItem
*, ami
, A0
),
1013 struct Library
*, wbBase
);
1015 return (BOOL
) CALLLIBFUNC_P2((*OldRemoveAppMenuItem
), A0
, ami
, A6
, wbBase
);
1018 CloseLibrary(&ScalosBase
->scb_LibNode
);
1020 return SCA_RemoveAppObject(appo
);
1025 #ifdef TEST_OPENWINDOWTAGLIST
1026 // Window = OpenWindowTagList( NewWindow, TagItems )
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)))
1046 d1(KPrintF("%s/%s/%ld: WA_Dummy data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1049 d1(KPrintF("%s/%s/%ld: WA_Left data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1052 d1(KPrintF("%s/%s/%ld: WA_Top data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1055 d1(KPrintF("%s/%s/%ld: WA_Width data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1058 d1(KPrintF("%s/%s/%ld: WA_Height data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1061 d1(KPrintF("%s/%s/%ld: WA_DetailPen data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1064 d1(KPrintF("%s/%s/%ld: WA_BlockPen data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1067 d1(KPrintF("%s/%s/%ld: WA_IDCMP data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1070 d1(KPrintF("%s/%s/%ld: WA_Flags data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1073 d1(KPrintF("%s/%s/%ld: WA_Gadgets data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1076 d1(KPrintF("%s/%s/%ld: WA_Checkmark data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1079 d1(KPrintF("%s/%s/%ld: WA_Title data=<%s>\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1081 case WA_ScreenTitle:
1082 d1(KPrintF("%s/%s/%ld: WA_ScreenTitle data=<%s>\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1084 case WA_CustomScreen:
1085 d1(KPrintF("%s/%s/%ld: WA_CustomScreen data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1087 case WA_SuperBitMap:
1088 d1(KPrintF("%s/%s/%ld: WA_SuperBitMap data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1091 d1(KPrintF("%s/%s/%ld: WA_MinWidth data=%öd\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1094 d1(KPrintF("%s/%s/%ld: WA_MinHeight data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1097 d1(KPrintF("%s/%s/%ld: WA_MaxWidth data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1100 d1(KPrintF("%s/%s/%ld: WA_MaxHeight data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1103 d1(KPrintF("%s/%s/%ld: WA_InnerWidth data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1105 case WA_InnerHeight:
1106 d1(KPrintF("%s/%s/%ld: WA_InnerHeight data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1108 case WA_PubScreenName:
1109 d1(KPrintF("%s/%s/%ld: WA_PubScreenName data=<%s>\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1112 d1(KPrintF("%s/%s/%ld: WA_PubScreen data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1114 case WA_PubScreenFallBack:
1115 d1(KPrintF("%s/%s/%ld: WA_PubScreenFallBack data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1118 d1(KPrintF("%s/%s/%ld: WA_WindowName data=<%s>\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1121 d1(KPrintF("%s/%s/%ld: WA_Colors data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1124 d1(KPrintF("%s/%s/%ld: WA_Zoom data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1127 d1(KPrintF("%s/%s/%ld: WA_MouseQueue data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1130 d1(KPrintF("%s/%s/%ld: WA_BackFill data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1133 d1(KPrintF("%s/%s/%ld: WA_RptQueue data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1136 d1(KPrintF("%s/%s/%ld: WA_SizeGadget data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1139 d1(KPrintF("%s/%s/%ld: WA_DragBar data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1141 case WA_DepthGadget:
1142 d1(KPrintF("%s/%s/%ld: WA_DepthGadget data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1144 case WA_CloseGadget:
1145 d1(KPrintF("%s/%s/%ld: WA_CloseGadget data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1148 d1(KPrintF("%s/%s/%ld: WA_Backdrop data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1150 case WA_ReportMouse:
1151 d1(KPrintF("%s/%s/%ld: WA_ReportMouse data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1153 case WA_NoCareRefresh:
1154 d1(KPrintF("%s/%s/%ld: WA_NoCareRefresh data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1157 d1(KPrintF("%s/%s/%ld: WA_Borderless data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1160 d1(KPrintF("%s/%s/%ld: WA_Activate data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1163 d1(KPrintF("%s/%s/%ld: WA_RMBTrap data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1165 case WA_WBenchWindow:
1166 d1(KPrintF("%s/%s/%ld: WA_WBenchWindow data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1168 case WA_SimpleRefresh:
1169 d1(KPrintF("%s/%s/%ld: WA_SimpleRefresh data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1171 case WA_SmartRefresh:
1172 d1(KPrintF("%s/%s/%ld: WA_SmartRefresh data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1175 d1(KPrintF("%s/%s/%ld: WA_SizeBRight data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1177 case WA_SizeBBottom:
1178 d1(KPrintF("%s/%s/%ld: WA_SizeBBottom data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1181 d1(KPrintF("%s/%s/%ld: WA_AutoAdjust data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1183 case WA_GimmeZeroZero:
1184 d1(KPrintF("%s/%s/%ld: WA_GimmeZeroZero data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1187 d1(KPrintF("%s/%s/%ld: WA_MenuHelp data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1189 case WA_NewLookMenus:
1190 d1(KPrintF("%s/%s/%ld: WA_NewLookMenus data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1193 d1(KPrintF("%s/%s/%ld: WA_AmigaKey data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1195 case WA_NotifyDepth:
1196 d1(KPrintF("%s/%s/%ld: WA_NotifyDepth data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1199 d1(KPrintF("%s/%s/%ld: WA_Pointer data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1201 case WA_BusyPointer:
1202 d1(KPrintF("%s/%s/%ld: WA_BusyPointer data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1204 case WA_PointerDelay:
1205 d1(KPrintF("%s/%s/%ld: WA_PointerDelay data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1207 case WA_TabletMessages:
1208 d1(KPrintF("%s/%s/%ld: WA_TabletMessages data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1211 d1(KPrintF("%s/%s/%ld: WA_HelpGroup data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1213 case WA_HelpGroupWindow:
1214 d1(KPrintF("%s/%s/%ld: WA_HelpGroupWindow data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1216 case WA_ExtraTitlebarGadgets:
1217 d1(KPrintF("%s/%s/%ld: WA_ExtraTitlebarGadgets data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1219 case WA_ExtraGadgetsStartID:
1220 d1(KPrintF("%s/%s/%ld: WA_ExtraGadgetsStartID data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1222 case WA_ExtraGadget_Iconify:
1223 d1(KPrintF("%s/%s/%ld: WA_ExtraGadget_Iconify data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1225 case WA_ExtraGadget_Lock:
1226 d1(KPrintF("%s/%s/%ld: WA_ExtraGadget_Lock data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1228 case WA_ExtraGadget_MUI:
1229 d1(KPrintF("%s/%s/%ld: WA_ExtraGadget_MUI data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1231 case WA_ExtraGadget_PopUp:
1232 d1(KPrintF("%s/%s/%ld: WA_ExtraGadget_PopUp data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1234 case WA_ExtraGadget_Snapshot:
1235 d1(KPrintF("%s/%s/%ld: WA_ExtraGadget_Snapshot data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1237 case WA_ExtraGadget_Jump:
1238 d1(KPrintF("%s/%s/%ld: WA_ExtraGadget_Jump data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1241 d1(KPrintF("%s/%s/%ld: WA_SkinInfo data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1243 case WA_TransparentRegion:
1244 d1(KPrintF("%s/%s/%ld: WA_TransparentRegion data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1246 case WA_TransparentRegionHook:
1247 d1(KPrintF("%s/%s/%ld: WA_TransparentRegionHook data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1250 d1(KPrintF("%s/%s/%ld: WA_UserPort data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1252 case WA_ToolbarWindow:
1253 d1(KPrintF("%s/%s/%ld: WA_ToolbarWindow data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1255 case WA_PointerType:
1256 d1(KPrintF("%s/%s/%ld: WA_PointerType data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1258 case WA_FrontWindow:
1259 d1(KPrintF("%s/%s/%ld: WA_FrontWindow data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1262 d1(KPrintF("%s/%s/%ld: WA_Parent data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1265 d1(KPrintF("%s/%s/%ld: WA_Opacity data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1268 d1(KPrintF("%s/%s/%ld: WA_HasAlpha data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1270 case WA_SizeNumerator:
1271 d1(KPrintF("%s/%s/%ld: WA_SizeNumerator data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1273 case WA_SizeDenominator:
1274 d1(KPrintF("%s/%s/%ld: WA_SizeDenominator data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1276 case WA_SizeExtraWidth:
1277 d1(KPrintF("%s/%s/%ld: WA_SizeExtraWidth data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1279 case WA_SizeExtraHeight:
1280 d1(KPrintF("%s/%s/%ld: WA_SizeExtraHeight data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1283 d1(KPrintF("%s/%s/%ld: WA_HitLevel data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1286 d1(KPrintF("%s/%s/%ld: WA_ShadowTop data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1289 d1(KPrintF("%s/%s/%ld: WA_ShadowLeft data=%ld\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1291 case WA_ShadowRight:
1292 d1(KPrintF("%s/%s/%ld: WA_ShadowRight data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1294 case WA_ShadowBottom:
1295 d1(KPrintF("%s/%s/%ld: WA_ShadowBottom data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
1297 case WA_VisibleOnMaximize:
1298 d1(KPrintF("%s/%s/%ld: WA_VisibleOnMaximize data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Data));
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;
1308 d1(KPrintF("%s/%s/%ld: mn=%08lx\n", __FILE__, __FUNC__, __LINE__, mn));
1309 ByteDump(mn, 0x110);
1315 d1(KPrintF("%s/%s/%ld: tag=%08lx data=%08lx\n", __FILE__, __FUNC__, __LINE__, ti->ti_Tag, ti->ti_Data));
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
);
1327 Win
= (struct Window
*) CALLLIBFUNC_P3((*OldOpenWindowTagList
),
1333 d1(KPrintF("%s/%s/%ld: >>> Window=%08lx\n", __FILE__
, __FUNC__
, __LINE__
, Win
));
1335 d1(KPrintF("%s/%s/%ld: >>> MoreFlags=%08lx\n", __FILE__
, __FUNC__
, __LINE__
, Win
->MoreFlags
));
1340 #endif /* TEST_OPENWINDOWTAGLIST */
1343 // Screen = OpenScreenTagList( NewScreen, TagItems )
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];
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
));
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
));
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
));
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]));
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
]);
1405 if (PalettePrefs
.pal_ScreenColorList
)
1407 ti
[nTag
].ti_Tag
= SA_Colors32
;
1408 ti
[nTag
++].ti_Data
= (IPTR
) PalettePrefs
.pal_ScreenColorList
;
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
]);
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
;
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
);
1439 Scr
= (struct Screen
*) CALLLIBFUNC_P3((*OldOpenScreenTagList
),
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
);
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
);
1471 Scr
= (struct Screen
*) CALLLIBFUNC_P3((*OldOpenScreenTagList
),
1478 d1(KPrintF("%s/%s/%ld: Scr=%08lx\n", __FILE__
, __FUNC__
, __LINE__
, Scr
));
1485 // UpdateWorkbench(name, parentlock, action)
1488 // VOID UpdateWorkbench(char *, BPTR, LONG);
1489 LIBFUNC_P4(void, sca_UpdateWorkbench
,
1490 A0
, CONST_STRPTR
, Name
,
1491 A1
, BPTR
, ParentLock
,
1493 A6
, struct Library
*, wbBase
, 0)
1495 struct ScaUpdateIcon_IW upd
;
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
));
1512 //LIBFUNC_P2(CONST_STRPTR, sca_GetLocString,
1513 // D0, ULONG, StringID,
1514 // A6, struct Library *, wbBase)
1516 // return GetLocString(StringID);
1521 // private Workbench function -84
1522 LIBFUNC_P1(LONG
, sca_SetBackFill
,
1523 A6
, struct Library
*, wbBase
, 0)
1533 // worked = WBInfo(lock, name, screen)
1536 // ULONG WBInfo(BPTR, STRPTR, struct Screen *);
1538 LIBFUNC_P4(ULONG
, sca_WBInfo
,
1541 A2
, struct Screen
*, screen
,
1542 A6
, struct Library
*, wbBase
, 0)
1545 struct ScaIconNode in
;
1550 d1(KPrintF("%s/%s/%ld: START Name=<%s> screen=%08lx\n", __FILE__
, __FUNC__
, __LINE__
, name
, screen
));
1553 (void) SCA_LockWindowList(SCA_LockWindowList_Shared
);
1555 memset(&in
, 0, sizeof(in
));
1559 in
.in_Icon
= NewIconObjectTags(name
,
1561 if (NULL
== in
.in_Icon
)
1563 in
.in_Icon
= SCA_GetDefIconObject(lock
, name
);
1566 WBInfoStart((struct internalScaWindowTask
*) winlist
.wl_WindowStruct
->ws_WindowTask
,
1571 SCA_UnLockWindowList();
1573 d1(KPrintF("%s/%s/%ld: END Success=%ld\n", __FILE__
, __FUNC__
, __LINE__
, Success
));
1580 // status = PutDiskObject(name, diskobj)
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)
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
);
1595 BOOL Success
= CALLLIBFUNC_P3((*OldPutDiskObject
),
1596 A0
, Name
, A1
, diskObj
, A6
, IconBase
);
1599 d1(KPrintF("%s/%s/%ld: Success=%ld\n", __FILE__
, __FUNC__
, __LINE__
, Success
));
1602 PatchRefreshIcon(Name
, diskObj
->do_Type
);
1609 // result = DeleteDiskObject(name)
1612 // BOOL DeleteDiskObject(STRPTR);
1613 LIBFUNC_P2(BOOL
, sca_DeleteDiskObject
,
1614 A0
, CONST_STRPTR
, Name
,
1615 A6
, struct Library
*, IconBase
, 0)
1618 BOOL Success
= AROS_CALL1(BOOL
, (*OldDeleteDiskObject
),
1619 AROS_LDA(CONST_STRPTR
, Name
, A0
),
1620 struct Library
*, IconBase
);
1622 BOOL Success
= CALLLIBFUNC_P2((*OldDeleteDiskObject
),
1623 A0
, Name
, A6
, IconBase
);
1626 d1(KPrintF("%s/%s/%ld: Success=%ld\n", __FILE__
, __FUNC__
, __LINE__
, Success
));
1629 PatchRefreshIcon(Name
, ICONTYPE_NONE
);
1636 // success = PutIconTagList(name,icon,tags);
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)
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
);
1655 BOOL Success
= CALLLIBFUNC_P4((*OldPutIconTagList
),
1656 A0
, Name
, A1
, diskObj
, A2
, tags
, A6
, IconBase
);
1659 //NotifyWB = GetTagData(ICONPUTA_NotifyWorkbench, FALSE, tags);
1661 d1(KPrintF("%s/%s/%ld: Success=%ld NotifyWB=%ld\n", __FILE__
, __FUNC__
, __LINE__
, Success
, NotifyWB
));
1664 PatchRefreshIcon(Name
, diskObj
->do_Type
);
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
));
1682 struct ScaUpdateIcon_IW upd
;
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
);
1694 upd
.ui_iw_Lock
= Lock(Path
, ACCESS_READ
);
1695 debugLock_d1(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 )
1720 // BOOL DeleteFile(STRPTR)
1721 LIBFUNC_P2(ULONG
, sca_DeleteFile
,
1722 D1
, CONST_STRPTR
, Name
,
1723 A6
, struct DosLibrary
*, DOSBase
, 0)
1727 d1(KPrintF("%s/%s/%ld: START Name=<%s> Task=<%s>\n", __FILE__
, __FUNC__
, __LINE__
, Name
, FindTask(NULL
)->tc_Node
.ln_Name
));
1730 Success
= AROS_CALL1(BOOL
, (*OldDeleteFile
),
1731 AROS_LDA(CONST_STRPTR
, Name
, D1
),
1732 struct DosLibrary
*, DOSBase
);
1734 Success
= CALLLIBFUNC_P2((*OldDeleteFile
),
1735 D1
, Name
, A6
, DOSBase
);
1740 PatchRefreshIcon(Name
, ICONTYPE_NONE
);
1743 d1(KPrintF("%s/%s/%ld: END Success=%ld\n", __FILE__
, __FUNC__
, __LINE__
, Success
));
1750 // success = Rename( oldName, newName )
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
;
1761 STRPTR fName
= NULL
;
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
));
1772 NewList(&HistoryPathList
);
1774 PatchAsyncWBUndoRename(oldName
, newName
);
1776 fLock
= Lock((STRPTR
) oldName
, ACCESS_READ
);
1777 debugLock_d1(fLock
);
1779 isIcon
= IsIconName(oldName
);
1784 WinListLocked
= CollectRenameAdjustHistoryPaths(&HistoryPathList
, fLock
);
1786 if (FALSE
== isIcon
)
1789 parentLock
= ParentDir(fLock
);
1790 debugLock_d1(parentLock
);
1791 if ((BPTR
)NULL
== parentLock
)
1794 fName
= AllocCopyString(FilePart((STRPTR
) oldName
));
1798 StripIconExtension(fName
);
1800 d1(kprintf("%s/%s/%ld: \n", __FILE__
, __FUNC__
, __LINE__
));
1801 in
= FindBackdropIconExclusive(parentLock
, fName
);
1806 d1(kprintf("%s/%s/%ld: in=%08lx fLock=%08lx\n", __FILE__
, __FUNC__
, __LINE__
, in
, fLock
));
1809 Success
= AROS_CALL2(LONG
, (*OldRename
),
1810 AROS_LDA(CONST_STRPTR
, oldName
, D1
),
1811 AROS_LDA(CONST_STRPTR
, newName
, D2
),
1812 struct DosLibrary
*, DOSBase
);
1814 Success
= CALLLIBFUNC_P3((*OldRename
),
1815 D1
, oldName
, D2
, newName
, A6
, DOSBase
);
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
);
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
));
1858 // force update for new object
1859 struct ScaUpdateIcon_IW upd
;
1861 isIcon
= IsIconName(newName
);
1862 if (FALSE
== isIcon
)
1873 parentLock
= (BPTR
)NULL
;
1877 FreeCopyString(fName
);
1881 fLock
= Lock((STRPTR
) newName
, ACCESS_READ
);
1882 debugLock_d1(fLock
);
1883 if ((BPTR
)NULL
== fLock
)
1886 parentLock
= ParentDir(fLock
);
1887 debugLock_d1(parentLock
);
1888 if ((BPTR
)NULL
== parentLock
)
1891 fName
= AllocCopyString(FilePart((STRPTR
) newName
));
1892 d1(KPrintF("%s/%s/%ld: fName=%08lx\n", __FILE__
, __FUNC__
, __LINE__
, fName
));
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
));
1911 d1(KPrintF("%s/%s/%ld: \n", __FILE__
, __FUNC__
, __LINE__
));
1914 ScalosUnLockIconList(iwtMain
);
1918 FreeCopyString(fName
);
1922 CleanupRenameAdjustHistoryPaths(&HistoryPathList
, WinListLocked
);
1924 d1(KPrintF("%s/%s/%ld: END Success=%ld\n", __FILE__
, __FUNC__
, __LINE__
, Success
));
1931 // file = Open( name, accessMode )
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)
1941 T_ExamineData
*fib
= NULL
;
1942 struct DosOpenInfo
*doi
;
1945 file
= AROS_CALL2(BPTR
, (*OldOpen
),
1946 AROS_LDA(CONST_STRPTR
, name
, D1
),
1947 AROS_LDA(LONG
, accessMode
, D2
),
1948 struct DosLibrary
*, DOSBase
);
1950 file
= CALLLIBFUNC_P3((*OldOpen
),
1951 D1
, name
, D2
, accessMode
,
1955 d1(KPrintF("%s/%s/%ld: file=%08lx name=<%s> accessMode=%ld\n", __FILE__
, __FUNC__
, __LINE__
, file
, name
, accessMode
));
1958 struct FileHandle
*fh
;
1960 d1(KPrintF("%s/%s/%ld: file=%08lx\n", __FILE__
, __FUNC__
, __LINE__
, file
));
1963 if (IsScalosProcess())
1965 if (IsInteractive(file
))
1968 if (MODE_OLDFILE
== accessMode
)
1972 d1(KPrintF("%s/%s/%ld: fh_Type=%08lx\n", __FILE__
, __FUNC__
, __LINE__
, fh
->fh_Type
));
1973 if (NULL
== fh
->fh_Type
)
1975 if (NULL
== PatchOpenBTree
)
1978 if (!ScalosExamineBegin(&fib
))
1980 d1(KPrintF("%s/%s/%ld: fib=%08lx\n", __FILE__
, __FUNC__
, __LINE__
, fib
));
1982 if (!ScalosExamineFH(file
, &fib
))
1985 doi
= ScalosAlloc(sizeof(struct DosOpenInfo
));
1986 d1(KPrintF("%s/%s/%ld: doi=%08lx\n", __FILE__
, __FUNC__
, __LINE__
, doi
));
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
));
2008 ScalosExamineEnd(&fib
);
2015 // success = Close( file )
2019 LIBFUNC_P2(ULONG
, sca_Close
,
2021 A6
, struct DosLibrary
*, DOSBase
, 0)
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
)));
2034 struct FileHandle
*fh
;
2036 d1(KPrintF("%s/%s/%ld: file=%08lx\n", __FILE__
, __FUNC__
, __LINE__
, file
));
2040 if (NULL
== PatchOpenBTree
)
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
));
2050 if (IsScalosProcess())
2052 if (IsInteractive(file
))
2056 d1(KPrintF("%s/%s/%ld: fh_Type=%08lx\n", __FILE__
, __FUNC__
, __LINE__
, fh
->fh_Type
));
2057 if (BNULL
== fh
->fh_Type
)
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
))
2065 d1(KPrintF("%s/%s/%ld: fib=%08lx\n", __FILE__
, __FUNC__
, __LINE__
, fib
));
2067 if (!ScalosExamineFH(file
, &fib
))
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
)
2094 // retrieve full filename
2095 if (!NameFromFH(file
, FileName
, Max_PathLen
))
2098 d1(KPrintF("%s/%s/%ld: FileName=<%s>\n", __FILE__
, __FUNC__
, __LINE__
, FileName
));
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
)));
2113 Success
= AROS_CALL1(BOOL
, (*OldClose
),
2114 AROS_LDA(BPTR
, file
, D1
),
2115 struct DosLibrary
*, DOSBase
);
2117 Success
= CALLLIBFUNC_P2((*OldClose
),
2118 D1
, file
, A6
, DOSBase
);
2122 ScalosExamineEnd(&fib
);
2126 d1(KPrintF("%s/%s/%ld: FileName=<%s>\n", __FILE__
, __FUNC__
, __LINE__
, FileName
));
2127 PatchRefreshIcon(FileName
, ICONTYPE_NONE
);
2131 FreePathBuffer(FileName
);
2134 d1(kprintf("%s/%s/%ld: Success=%ld\n", __FILE__
, __FUNC__
, __LINE__
, Success
));
2141 // success = CreateDir( name )
2144 // BOOL CreateDir(STRPTR)
2145 LIBFUNC_P2(BPTR
, sca_CreateDir
,
2146 D1
, CONST_STRPTR
, name
,
2147 A6
, struct DosLibrary
*, DOSBase
, 0)
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
);
2156 lock
= AROS_CALL1(BPTR
, (*OldCreateDir
),
2157 AROS_LDA(CONST_STRPTR
, name
, D1
),
2158 struct DosLibrary
*, DOSBase
);
2160 lock
= CALLLIBFUNC_P2((*OldCreateDir
),
2161 D1
, name
, A6
, DOSBase
);
2166 PatchRefreshIcon(name
, WBDRAWER
);
2169 d1(KPrintF("%s/%s/%ld: END lock=%ld\n", __FILE__
, __FUNC__
, __LINE__
, lock
));
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
));
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
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)
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];
2239 for (count
=0; count
<Length
; count
++)
2241 *lp
++ = isprint(*Data
) ? *Data
: '.';
2242 KPrintF("%02x ", *Data
++);
2243 if ((count
+1) % 16 == 0)
2247 KPrintF("\t%s\n", Line
);
2252 while (count
% 16 != 0)
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
,
2275 UNDOTAG_CopySrcDirLock
, dirLock
,
2276 UNDOTAG_CopySrcName
, oldName
,
2277 UNDOTAG_CopyDestName
, newName
,
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
,
2297 UNDOTAG_IconDirLock
, dirLock
,
2298 UNDOTAG_IconName
, name
,