summaryrefslogtreecommitdiff
path: root/packages/morphunits/src/workbench.pas
blob: 8b8b8dcb57a051601def8f707213aff9028da083 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
{
    This file is part of the Free Pascal run time library.

    A file in Amiga system run time library.
    Copyright (c) 1998-2003 by Nils Sjoholm
    member of the Amiga RTL development team.

    See the file COPYING.FPC, included in this distribution,
    for details about the copyright.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

 **********************************************************************}
{$PACKRECORDS 2}

unit workbench;

interface

uses
  exec, amigados, utility, intuition, agraphics;

// wb startup defines
type
  PWBArg = ^TWBArg;
  TWBArg = record
    wa_Lock: BPTR;   // a lock descriptor
    wa_Name: STRPTR; // a string relative to that lock
  end;

  WBArgList = array[1..100] of TWBArg; // Only 1..smNumArgs are valid
  PWBArgList = ^WBArgList;

  PWBStartup = ^TWBStartup;
  TWBStartup = record
    sm_Message: TMessage;   // a standard message structure
    sm_Process: PMsgPort;   // the process descriptor for you
    sm_Segment: BPTR;       // a descriptor for your code
    sm_NumArgs: Longint;    // the number of elements in ArgList
    sm_ToolWindow: STRPTR;  // description of window
    sm_ArgList: PWBArgList; // the arguments themselves
  end;

const
  WBDISK    = 1;
  WBDRAWER  = 2;
  WBTOOL    = 3;
  WBPROJECT = 4;
  WBGARBAGE = 5;
  WBDEVICE  = 6;
  WBKICK    = 7;
  WBAPPICON = 8;

type
  POldDrawerData = ^TOldDrawerData;
  TOldDrawerData = record
    dd_NewWindow: TNewWindow; // args to open window
    dd_CurrentX: Longint;     // current x coordinate of origin
    dd_CurrentY: Longint;     // current y coordinate of origin
  end;

const
  // the amount of DrawerData actually written to disk
  OLDDRAWERDATAFILESIZE  = SizeOf(TOldDrawerData);

type
  PDrawerData = ^TDrawerData;
  TDrawerData = record
    dd_NewWindow: TNewWindow; // args to open window
    dd_CurrentX: Longint;     // current x coordinate of origin
    dd_CurrentY: Longint;     // current y coordinate of origin
    dd_Flags: Longint;        // flags for drawer DDFLAGS_*
    dd_ViewModes: Word;       // view mode for drawer DDVM_*
  end;

const
  // the amount of DrawerData actually written to disk
  DRAWERDATAFILESIZE  = SizeOf(TDrawerData);

  // dd_ViewModes
  DDVM_BYDEFAULT = 0;
  DDVM_BYICON    = 1; // view as icons
  DDVM_BYNAME    = 2; // view as text, sorted by name
  DDVM_BYDATE    = 3; // view as text, sorted by date
  DDVM_BYSIZE    = 4; // view as text, sorted by size
  DDVM_BYTYPE    = 5; // view as text, sorted by type

  // definitions for dd_Flags
  DDFLAGS_SHOWDEFAULT = 0; // default (show only icons)
  DDFLAGS_SHOWICONS   = 1; // show only icons
  DDFLAGS_SHOWALL     = 2; // show all files

type
  PDiskObject = ^TDiskObject;
  TDiskObject = record
    do_Magic: Word;         // a magic number at the start of the file
    do_Version: Word;       // a version number, so we can change it
    do_Gadget: TGadget;     // a copy of in core gadget
    do_Type: Byte;
    do_DefaultTool: STRPTR;
    do_ToolTypes: PPChar;
    do_CurrentX: LongInt;
    do_CurrentY: LongInt;
    do_DrawerData: PDrawerData;
    do_ToolWindow: STRPTR;  // only applies to tools
    do_StackSize: Longint;  // only applies to tools
  end;

const
  WB_DISKMAGIC        = $e310; // a magic number, not easily impersonated
  WB_DISKVERSION      = 1;     // our current version number
  WB_DISKREVISION     = 1;     // our current revision number
  WB_DISKREVISIONMASK = 255;   // I only use the lower 8 bits of Gadget.UserData for the revision #

type
  PFreeList = ^TFreeList;
  TFreeList = record
    fl_NumFree: SmallInt;
    fl_MemList: TList;
  end;

const
{ workbench does different complement modes for its gadgets. It supports separate images, complement mode, and backfill mode.
  The first two are identical to intuitions GADGIMAGE and GADGHCOMP. backfill is similar to GADGHCOMP, but the region outside of the
  image (which normally would be color three when complemented) is flood-filled to color zero. }
  GFLG_GADGBACKFILL = $0001;
  GADGBACKFILL      = GFLG_GADGBACKFILL; // an old synonym

  NO_ICON_POSITION  = $80000000; // if an icon does not really live anywhere, set its current position to here

  AM_VERSION = 1; // If you find am_Version >= AM_VERSION, you know this structure has at least the fields defined in this version of the include file

type
  PAppMessage = ^TAppMessage;
  TAppMessage = record
    am_Message: TMessage;   // standard message structure
    am_Type: Word;          // message type AMTYPE_*
    am_UserData: LongWord;  // application specific
    am_ID: LongWord;        // application definable ID
    am_NumArgs: LongInt;    // # of elements in arglist
    am_ArgList: PWBArgList; // the arguements themselves
    am_Version: Word;       // will be AM_VERSION
    am_Class: Word;         // message class AMCLASSICON_*
    am_MouseX: SmallInt;    // mouse x position of event
    am_MouseY: SmallInt;    // mouse y position of event
    am_Seconds: LongWord;   // current system clock time
    am_Micros: LongWord;    // current system clock time
    am_Reserved: array[0..7] of LongWord; // avoid recompilation
  end;

// types of app messages
const
  // am_Type
  AMTYPE_APPWINDOW     = 7;  // app window message
  AMTYPE_APPICON       = 8;  // app icon message
  AMTYPE_APPMENUITEM   = 9;  // app menu item message
  AMTYPE_APPWINDOWZONE = 10; // app menu item message

  //am_Class Classes of AppIcon messages (V44)
  AMCLASSICON_Open        = 0;  // The "Open" menu item was invoked, the icon got double-clicked or an icon got dropped on it.
  AMCLASSICON_Copy        = 1;  // The "Copy" menu item was invoked
  AMCLASSICON_Rename      = 2;  // The "Rename" menu item was invoked
  AMCLASSICON_Information = 3;  // The "Information" menu item was invoked
  AMCLASSICON_Snapshot    = 4;  // The "Snapshot" menu item was invoked
  AMCLASSICON_UnSnapshot  = 5;  // The "UnSnapshot" menu item was invoked
  AMCLASSICON_LeaveOut    = 6;  // The "Leave Out" menu item was invoked
  AMCLASSICON_PutAway     = 7;  // The "Put Away" menu item was invoked
  AMCLASSICON_Delete      = 8;  // The "Delete" menu item was invoked
  AMCLASSICON_FormatDisk  = 9;  // The "Format Disk" menu item was invoked
  AMCLASSICON_EmptyTrash  = 10; // The "Empty Trash" menu item was invoked

  AMCLASSICON_Selected    = 11; // The icon is now selected
  AMCLASSICON_Unselected  = 12; // The icon is now unselected

// The following structures are private.  These are just stub structures for code compatibility...
type
  PAppWindow = ^TAppWindow;
  TAppWindow = record
    aw_PRIVATE: APTR;
  end;

  PAppWindowDropZone = ^TAppWindowDropZone;
  TAppWindowDropZone = record
    awdz_PRIVATE: APTR;
  end;

  PAppIcon = ^TAppIcon;
  TAppIcon = record
    ai_PRIVATE: APTR;
  end;

  PAppMenuItem = ^TAppMenuItem;
  TAppMenuItem = record
    ami_PRIVATE: APTR;
  end;

  PAppMenu = ^TAppMenu;
  TAppMenu = record
    am_PRIVATE: APTR;
  end;

const
  // Tags for use with AddAppIconA()
  WBA_Dummy = TAG_USER + $A000;

  WBAPPICONA_SupportsOpen        = WBA_Dummy + 1;  // (Boolean) AppIcon responds to the "Open" menu item
  WBAPPICONA_SupportsCopy        = WBA_Dummy + 2;  // (Boolean) AppIcon responds to the "Copy" menu item
  WBAPPICONA_SupportsRename      = WBA_Dummy + 3;  // (Boolean) AppIcon responds to the "Rename" menu item
  WBAPPICONA_SupportsInformation = WBA_Dummy + 4;  // (Boolean) AppIcon responds to the "Information" menu item
  WBAPPICONA_SupportsSnapshot    = WBA_Dummy + 5;  // (Boolean) AppIcon responds to the "Snapshot" menu item
  WBAPPICONA_SupportsUnSnapshot  = WBA_Dummy + 6;  // (Boolean) AppIcon responds to the "UnSnapshot" menu item
  WBAPPICONA_SupportsLeaveOut    = WBA_Dummy + 7;  // (Boolean) AppIcon responds to the "LeaveOut" menu item
  WBAPPICONA_SupportsPutAway     = WBA_Dummy + 8;  // (Boolean) AppIcon responds to the "PutAway" menu item
  WBAPPICONA_SupportsDelete      = WBA_Dummy + 9;  // (Boolean) AppIcon responds to the "Delete" menu item
  WBAPPICONA_SupportsFormatDisk  = WBA_Dummy + 10; // (Boolean) AppIcon responds to the "FormatDisk" menu item
  WBAPPICONA_SupportsEmptyTrash  = WBA_Dummy + 11; // (Boolean) AppIcon responds to the "EmptyTrash" menu item
  WBAPPICONA_PropagatePosition   = WBA_Dummy + 12; // (Boolean) AppIcon position should be propagated back to original DiskObject
  WBAPPICONA_RenderHook          = WBA_Dummy + 13; // (PHook) Callback hook to be invoked when rendering this icon
  WBAPPICONA_NotifySelectState   = WBA_Dummy + 14; // (Boolean) AppIcon wants to be notified when its select state changes
  // Tags for use with AddAppMenuA()
  WBAPPMENUA_CommandKeyString = WBA_Dummy + 15; // (STRPTR) Command key string for this AppMenu
  // Tags for use with OpenWorkbenchObjectA()
  WBOPENA_ArgLock = WBA_Dummy + 16; // Corresponds to the wa_Lock member of a TWBArg
  WBOPENA_ArgName = WBA_Dummy + 17; // Corresponds to the wa_Name member of a TWBArg
  // Tags for use with WorkbenchControlA()
  WBCTRLA_IsOpen              = WBA_Dummy + 18; // (PLongWord) Check if the named drawer is currently open
  WBCTRLA_DuplicateSearchPath = WBA_Dummy + 19; // (^BPTR) Create a duplicate of the Workbench private search path list
  WBCTRLA_FreeSearchPath      = WBA_Dummy + 20; // (BPTR) Free the duplicated search path list
  WBCTRLA_GetDefaultStackSize = WBA_Dummy + 21; // (PLongWord) Get the default stack size for launching programs with
  WBCTRLA_SetDefaultStackSize = WBA_Dummy + 22; // (LongWord) Set the default stack size for launching programs with
  WBCTRLA_RedrawAppIcon       = WBA_Dummy + 23; // (PAppIcon) Cause an AppIcon to be redrawn
  WBCTRLA_GetProgramList      = WBA_Dummy + 24; // (PList) Get a list of currently running Workbench programs
  WBCTRLA_FreeProgramList     = WBA_Dummy + 25; // (PList) Release the list of currently running Workbench programs
  // Tags for use with AddAppWindowDropZoneA()
  WBDZA_Left      = WBA_Dummy + 26; // (SmallInt) Zone left edge
  WBDZA_RelRight  = WBA_Dummy + 27; // (SmallInt) Zone left edge, if relative to the right edge of the window
  WBDZA_Top       = WBA_Dummy + 28; // (SmallInt) Zone top edge
  WBDZA_RelBottom = WBA_Dummy + 29; // (SmallInt) Zone top edge, if relative to the bottom edge of the window
  WBDZA_Width     = WBA_Dummy + 30; // (SmallInt) Zone width
  WBDZA_RelWidth  = WBA_Dummy + 31; // (SmallInt) Zone width, if relative to the window width
  WBDZA_Height    = WBA_Dummy + 32; // (SmallInt) Zone height
  WBDZA_RelHeight = WBA_Dummy + 33; // (SmallInt) Zone height, if relative to the window height
  WBDZA_Box       = WBA_Dummy + 34; // (PIBox) Zone position and size
  WBDZA_Hook      = WBA_Dummy + 35; // (PHook) Hook to invoke when the mouse enters or leave a drop zone
  // Tags for use with WorkbenchControlA()

  WBCTRLA_GetSelectedIconList  = WBA_Dummy + 36; // (PList) Get a list of currently selected icons
  WBCTRLA_FreeSelectedIconList = WBA_Dummy + 37; // (PList) Release the list of currently selected icons
  WBCTRLA_GetOpenDrawerList    = WBA_Dummy + 38; // (PList) Get a list of currently open drawers
  WBCTRLA_FreeOpenDrawerList   = WBA_Dummy + 39; // (PList) Release the list of currently open icons

  WBA_Reserved1 = WBA_Dummy + 40;
  WBA_Reserved2 = WBA_Dummy + 41;

  WBCTRLA_GetHiddenDeviceList    = WBA_Dummy + 42; // (PList) Get the list of hidden devices
  WBCTRLA_FreeHiddenDeviceList   = WBA_Dummy + 43; // (PList) Release the list of hidden devices
  WBCTRLA_AddHiddenDeviceName    = WBA_Dummy + 44; // (STRPTR) Add the name of a device which Workbench should never try to read a disk icon from
  WBCTRLA_RemoveHiddenDeviceName = WBA_Dummy + 45; // (STRPTR) Remove a name from list of hidden devices

  WBA_Reserved3 = WBA_Dummy + 46;

  WBCTRLA_GetTypeRestartTime = WBA_Dummy + 47; // (PLongWord) Get the number of seconds that have to pass before typing the next character in a drawer window will restart with a new file name
  WBCTRLA_SetTypeRestartTime = WBA_Dummy + 48; // (LongWord) Set the number of seconds that have to pass before typing the next character in a drawer window will restart with a new file name

  WBA_Reserved4 = WBA_Dummy + 49;

  WBA_Reserved5  = WBA_Dummy + 50;
  WBA_Reserved6  = WBA_Dummy + 51;
  WBA_Reserved7  = WBA_Dummy + 52;
  WBA_Reserved8  = WBA_Dummy + 53;
  WBA_Reserved9  = WBA_Dummy + 54;
  WBA_Reserved10 = WBA_Dummy + 55;
  WBA_Reserved11 = WBA_Dummy + 56;
  WBA_Reserved12 = WBA_Dummy + 57;
  WBA_Reserved13 = WBA_Dummy + 58;
  WBA_Reserved14 = WBA_Dummy + 59;
  WBA_Reserved15 = WBA_Dummy + 60;
  WBA_Reserved16 = WBA_Dummy + 61;
  WBA_Reserved17 = WBA_Dummy + 62;
  WBA_Reserved18 = WBA_Dummy + 63;
  WBA_Reserved19 = WBA_Dummy + 64;

  WBAPPMENUA_GetKey = WBA_Dummy + 65; // (PLongWord) Item to be added should get sub menu items attached to; make room for it, then return the key to use later for attaching the items
  WBAPPMENUA_UseKey = WBA_Dummy + 66; // (LongWord) This item should be attached to a sub menu; the key provided refers to the sub menu it should be attached to

  // V45
  WBCTRLA_GetCopyHook      = WBA_Dummy + 69; // (PPHook) Obtain the hook that will be invoked when Workbench starts to copy files and data
  WBCTRLA_SetCopyHook      = WBA_Dummy + 70; // (PHook) Install the hook that will be invoked when Workbench starts to copy files and data
  WBCTRLA_GetDeleteHook    = WBA_Dummy + 71; // (PPHook) Obtain the hook that will be invoked when Workbench discards files and drawers or empties the trashcan
  WBCTRLA_SetDeleteHook    = WBA_Dummy + 72; // (PHook) Install the hook that will be invoked when Workbench discards files and drawers or empties the trashcan
  WBCTRLA_GetTextInputHook = WBA_Dummy + 73; // (PPHook) Obtain the hook that will be invoked when Workbench requests that the user enters text, such as when a file is to be renamed or a new drawer is to be created
  WBCTRLA_SetTextInputHook = WBA_Dummy + 74; // (PHook) Install the hook that will be invoked when Workbench requests that the user enters text, such as when a file is to be renamed or a new drawer is to be created

  WBOPENA_Show   = WBA_Dummy + 75; // (Byte) When opening a drawer, show all files or only icons? This must be one out of DDFLAGS_SHOWICONS, or DDFLAGS_SHOWALL
  WBOPENA_ViewBy = WBA_Dummy + 76; // (Byte) When opening a drawer, view the contents by icon, name, date, size or type? This must be one out of DDVM_BYICON, DDVM_BYNAME, DDVM_BYDATE, DDVM_BYSIZE or DDVM_BYTYPE;

  WBAPPMENUA_GetTitleKey = WBA_Dummy + 77; // (PLongWord) Item to be added is in fact a new menu title; make room for it, then return the key to use later for attaching the items

  WBCTRLA_AddSetupCleanupHook = WBA_Dummy + 78; // (PHook) Add a hook that will be invoked when Workbench is about to shut down (cleanup), and when Workbench has returned to operational state (setup)
  WBCTRLA_RemSetupCleanupHook = WBA_Dummy + 79; // (PHook) Remove a hook that has been installed with the WBCTRLA_AddSetupCleanupHook tag

  // V50
  WBAPPICONA_Clone = WBA_Dummy + 80; // (Boolean) Clone appicon default: False

  WBA_LAST_TAG = WBAPPICONA_Clone;

  // The message your setup/cleanup hook gets invoked with.
type
  PSetupCleanupHookMsg = ^TSetupCleanupHookMsg;
  TSetupCleanupHookMsg = record
    schm_Length: LongWord;
    schm_State: LongInt;   // SCHMSTATE_*
  end;

const
  // schm_State
  SCHMSTATE_TryCleanup = 0; // Workbench will attempt to shut down now.
  SCHMSTATE_Cleanup    = 1; // Workbench will really shut down now.
  SCHMSTATE_Setup      = 2; // Workbench is operational again or could not be shut down.

type
// The message your AppIcon rendering hook gets invoked with.
  PAppIconRenderMsg = ^TAppIconRenderMsg;
  TAppIconRenderMsg = record
    arm_RastPort: PRastPort; // RastPort to render into
    arm_Icon: PDiskObject;   // The icon to be rendered
    arm_Label: STRPTR;       // The icon label txt
    arm_Tags: PTagItem;      // Further tags to be passed on to DrawIconStateA().
    arm_Left: SmallInt;      // \ Rendering origin, not taking the
    arm_Top: SmallInt;       // / button border into account.
    arm_Width: SmallInt;     // \ Limit your rendering to
    arm_Height: SmallInt;    // / this area.
    arm_State: LongWord;     // IDS_SELECTED, IDS_NORMAL, etc.
  end;

// The message your drop zone hook gets invoked with. }
  PAppWindowDropZoneMsg = ^TAppWindowDropZoneMsg;
  TAppWindowDropZoneMsg = record
    adzm_RastPort: PRastPort; // RastPort to render into.
    adzm_DropZoneBox: TIBox;  // Limit your rendering to this area.
    adzm_ID: LongWord;        // \ These come from straight
    adzm_UserData: LongWord;  // / from AddAppWindowDropZoneA().
    adzm_Action: LongInt;     // See below for a list of actions. ADZMACTION_*
  end;

const
  // adzm_Action
  ADZMACTION_Enter = 0;
  ADZMACTION_Leave = 1;

type
// The message your icon selection change hook is invoked with.
  PIconSelectMsg = ^TIconSelectMsg;
  TIconSelectMsg = record
    ism_Length: LongWord;      // Size of this data structure (in bytes)
    ism_Drawer: BPTR;          // Lock on the drawer this object resides in, NULL for Workbench backdrop (devices)
    ism_Name: STRPTR;          // Name of the object in question
    ism_Type: Word;            // One of WBDISK, WBDRAWER, WBTOOL, WBPROJECT, WBGARBAGE, WBDEVICE, WBKICK or WBAPPICON
    ism_Selected: WordBool;    // True if currently selected, False otherwise.
    ism_Tags: PTagItem;        // Pointer to the list of tag items passed to ChangeWorkbenchSelectionA()
    ism_DrawerWindow: PWindow; // Pointer to the window attached to this icon,if the icon is a drawer-like object.}
    ism_ParentWindow : PWindow;{ Pointer to the window the icon resides in. }

    ism_Left: SmallInt;   // Position and size of the icon;
    ism_Top: SmallInt;    // note that the icon may not entirely
    ism_Width: SmallInt;  // reside within the visible bounds of
    ism_Height: SmallInt; // the parent window
  end;

const
  // These are the values your hook code can return.
  ISMACTION_Unselect = 0; // Unselect the icon
  ISMACTION_Select   = 1; // Select the icon
  ISMACTION_Ignore   = 2; // Do not change the selection state.
  ISMACTION_Stop     = 3; // Do not invoke the hook code again, leave the icon as it is.

type
// The messages your copy hook is invoked with.
  PCopyBeginMsg = ^TCopyBeginMsg;
  TCopyBeginMsg = record
    cbm_Length: LongWord;        // Size of this data structure in bytes
    cbm_Action: LongInt;         // Will be set to CPACTION_Begin (see below)
    cbm_SourceDrawer: BPTR;      // A lock on the source drawer
    cbm_DestinationDrawer: BPTR; // A lock on the destination drawer
  end;

  PCopyDataMsg = ^TCopyDataMsg;
  TCopyDataMsg = record
    cdm_Length: LongWord;        // Size of this data structure in bytes.
    cdm_Action: LongInt;         // Will be set to CPACTION_Copy (see below).
    cdm_SourceLock: BPTR;        // A lock on the parent directory of the source file/drawer.
    cdm_SourceName: STRPTR;      // The name of the source file or drawer.
    cdm_DestinationLock: BPTR;   // A lock on the parent directory of the destination file/drawer.
    cdm_DestinationName: STRPTR; // The name of the destination file/drawer. This may or may not match the name of the source file/drawer in case the
                                 //   data is to be copied under a different name. For example, this is the case with the Workbench "Copy" command which
                                 //   creates duplicates of file/drawers by prefixing the duplicate's name with "Copy_XXX_of".
    cdm_DestinationX: LongInt;   // When the icon corresponding to the destination is written to disk, this is the position (put into its
    cdm_DestinationY: LongInt;   // DiskObject^.do_CurrentX/DiskObject^.do_CurrentY fields) it should be placed at
  end;

  PCopyEndMsg = ^TCopyEndMsg;
  TCopyEndMsg = record
    cem_Length: LongWord; // Size of this data structure in bytes
    cem_Action: LongInt;  // Will be set to CPACTION_End (see below)
  end;

const
  CPACTION_Begin = 0; // This message arrives for each file or drawer to be copied.
  CPACTION_Copy  = 1; // This message arrives when all files/drawers have been copied.
  CPACTION_End   = 2;

type
// The messages your delete hook is invoked with.
  PDeleteBeginMsg = ^TDeleteBeginMsg;
  TDeleteBeginMsg = record
    dbm_Length: LongWord; // Size of this data structure in bytes.
    dbm_Action: LongInt;  // Will be set to either DLACTION_BeginDiscard or DLACTION_BeginEmptyTrash (see below).
  end;

  PDeleteDataMsg = ^TDeleteDataMsg;
  TDeleteDataMsg = record
    ddm_Length: LongWord; // Size of this data structure in bytes.
    ddm_Action: LongInt;  // Will be set to either DLACTION_DeleteContents or DLACTION_DeleteObject (see below).
    ddm_Lock: BPTR;       // A Lock on the parent directory of the object whose contents or which itself should be deleted.
    ddm_Name: STRPTR;     // The name of the object whose contents or which itself should be deleted.
  end;

  PDeleteEndMsg = ^TDeleteEndMsg;
  TDeleteEndMsg = record
    dem_Length: LongWord; // Size of this data structure in bytes
    dem_Action: LongInt;   // Will be set to DLACTION_End (see below)
  end;

const
  DLACTION_BeginDiscard    = 0; // This indicates that the following delete operations are intended to empty the trashcan.
  DLACTION_BeginEmptyTrash = 1; // This indicates that the object described by lock and name refers to a drawer; you should empty its contents but  DO NOT  delete the drawer itself!
  DLACTION_DeleteContents  = 3; // This indicates that the object described by lock and name should be deleted; this could be a file or an empty drawer.
  DLACTION_DeleteObject    = 4; // This indicates that the deletion process is finished.
  DLACTION_End             = 5;

type
// The messages your text input hook is invoked with.
  PTextInputMsg = ^TTextInputMsg;
  TTextInputMsg = record
    tim_Length: LongWord; // Size of this data structure in bytes.
    tim_Action: LongInt;  // One of the TIACTION_* values listed below.
    tim_Prompt: STRPTR;   // The Workbench suggested result, depending on what kind of input is requested (as indicated by the tim_Action member).
  end;

const
  TIACTION_Rename        = 0; // A file or drawer is to be renamed.
  TIACTION_RelabelVolume = 1; // A volume is to be relabeled.
  TIACTION_NewDrawer     = 2; // A new drawer is to be created.
  TIACTION_Execute       = 3; // A program or script is to be executed.

// Parameters for the UpdateWorkbench() function.
  UPDATEWB_ObjectRemoved = 0; // Object has been deleted.
  UPDATEWB_ObjectAdded   = 1; // Object is new or has changed.

  WORKBENCHNAME : PChar  = 'workbench.library';

var
  WorkbenchBase: PLibrary = nil;

function AddAppIconA(Id: LongWord location 'd0'; UserData: LongWord location 'd1'; Text_: PChar location 'a0'; MsgPort: PMsgPort location 'a1'; Lock: BPTR location 'a2'; DiskObj: PDiskObject location 'a3'; const TagList: PTagItem location 'a4'): PAppIcon; syscall WorkbenchBase 060;
function AddAppMenuItemA(Id: LongWord location 'd0'; UserData: LongWord location 'd1'; Text_: PChar location 'a0'; MsgPort: PMsgPort location 'a1'; const TagList: PTagItem location 'a2'): PAppMenuItem; syscall WorkbenchBase 072;
function AddAppWindowA(Id: LongWord location 'd0'; UserData: LongWord location 'd1'; Window: PWindow location 'a0'; MsgPort: PMsgPort location 'a1'; const TagList: PTagItem location 'a2'): PAppWindow; syscall WorkbenchBase 048;
function RemoveAppIcon(AppIcon: PAppIcon location 'a0'): LongBool; syscall WorkbenchBase 066;
function RemoveAppMenuItem(AppMenuItem: PAppMenuItem location 'a0'): LongBool; syscall WorkbenchBase 078;
function RemoveAppWindow(AppWindow: PAppWindow location 'a0'): LongBool; syscall WorkbenchBase 054;
procedure WBInfo(Lock: BPTR location 'a0'; Name: STRPTR location 'a1'; Screen: PScreen location 'a2'); syscall WorkbenchBase 090;

function AddAppWindowDropZoneA(Aw: PAppWindow location 'a0'; Id: LongWord location 'd0'; UserData: LongWord location 'd1'; const Tags: PTagItem location 'a1'): PAppWindowDropZone; syscall WorkbenchBase 114;
function ChangeWorkbenchSelectionA(Name: STRPTR location 'a0'; Hook: PHook location 'a1'; const Tags: PTagItem location 'a2'): LongBool; syscall WorkbenchBase 126;
function CloseWorkbenchObjectA(Name: STRPTR location 'a0'; const Tags: PTagItem location 'a1'): LongBool; syscall WorkbenchBase 102;
function MakeWorkbenchObjectVisibleA(Name: STRPTR location 'a0'; const Tags: PTagItem location 'a1'): LongBool; syscall WorkbenchBase 132;
function OpenWorkbenchObjectA(Name: STRPTR location 'a0'; const Tags: PTagItem location 'a1'): LongBool; syscall WorkbenchBase 096;
function RemoveAppWindowDropZone(Aw: PAppWindow location 'a0'; DropZone: PAppWindowDropZone location 'a1'): LongBool; syscall WorkbenchBase 120;
function WorkbenchControlA(Name: STRPTR location 'a0'; const Tags: PTagItem location 'a1'): LongBool; syscall WorkbenchBase 108;
// V51
function ManageDesktopObjectA(Name: PChar; Action: LongInt; Tags: PTagItem): Boolean; syscall BaseSysV WorkbenchBase 148;
function CreateDrawerA(Drawer: PChar; Tags: PTagItem): Boolean; syscall BaseSysV WorkbenchBase 154;
function CreateIconA(Name: PChar; Tags: PTagItem): Boolean; syscall BaseSysV WorkbenchBase 160;

function AddAppIcon(Id: LongWord; UserData: LongWord; Text_: PChar; MsgPort: PMsgPort; Lock: BPTR; DiskObj: PDiskObject; const TagList: array of PtrUInt): PAppIcon; inline;
function AddAppMenuItem(Id: LongWord; UserData: LongWord; Text_: PChar; MsgPort: PMsgPort; const Tags: array of PtrUInt): PAppMenuItem; inline;
function AddAppWindow(Id: LongWord; UserData: LongWord; Window: PWindow; MsgPort: PMsgPort; const Tags: array of PtrUInt): PAppWindow; inline;

function OpenWorkbenchObject(Name: PChar; const Tags: array of PtrUInt): LongBool; inline;
function CloseWorkbenchObject(Name: PChar; const Tags: array of PtrUInt): LongBool; inline;
function WorkbenchControl(Name: PChar; const Tags: array of PtrUInt): LongBool; inline;
function AddAppWindowDropZone(Aw: PAppWindow; Id: LongWord; UserData: LongWord; const Tags: array of PtrUInt): PAppWindowDropZone; inline;
function ChangeWorkbenchSelection(Name: STRPTR; Hook: PHook; const Tags: array of PtrUInt): LongBool; inline;
function MakeWorkbenchObjectVisible(Name: STRPTR; const Tags: array of PtrUInt): LongBool; inline;
// V51
function ManageDesktopObjectTags(Name: PChar; Action: LongInt; const Tags: array of PtrUInt): Boolean; inline;
function CreateDrawerTags(Drawer: PChar; const Tags: array of PtrUInt): Boolean; inline;
function CreateIconTags(Name: PChar; const Tags: array of PtrUInt): Boolean; inline;

implementation

function AddAppIcon(Id: LongWord; UserData: LongWord; Text_: PChar; MsgPort: PMsgPort; Lock: BPTR; DiskObj: PDiskObject; const TagList: array of PtrUInt): PAppIcon;
begin
  AddAppIcon := AddAppIconA(Id, UserData, Text_, MsgPort, Lock, Diskobj, @TagList);
end;

function AddAppMenuItem(Id: LongWord; UserData: LongWord; Text_: PChar; MsgPort: PMsgPort; const Tags: array of PtrUInt): PAppMenuItem;
begin
  AddAppMenuItem := AddAppMenuItemA(Id, UserData, Text_, MsgPort, @Tags);
end;

function AddAppWindow(Id: LongWord; UserData: LongWord; Window: PWindow; MsgPort: PMsgPort; const Tags: array of PtrUInt): PAppWindow;
begin
  AddAppWindow := AddAppWindowA(Id, UserData, Window, MsgPort, @Tags);
end;

function OpenWorkbenchObject(Name: PChar; const Tags: array of PtrUInt): LongBool;
begin
  OpenWorkbenchObject := OpenWorkbenchObjectA(Name, @Tags);
end;

function CloseWorkbenchObject(Name: PChar; const Tags: array of PtrUInt): LongBool;
begin
  CloseWorkbenchObject := CloseWorkbenchObjectA(Name, @Tags);
end;

function WorkbenchControl(Name: PChar; const Tags: array of PtrUInt): LongBool;
begin
  WorkbenchControl := WorkbenchControlA(Name, @Tags);
end;

function AddAppWindowDropZone(Aw: PAppWindow; Id: LongWord; UserData: LongWord; const Tags: array of PtrUInt): PAppWindowDropZone;
begin
  AddAppWindowDropZone := AddAppWindowDropZoneA(Aw, Id, UserData, @Tags);
end;

function ChangeWorkbenchSelection(Name: STRPTR; Hook: PHook; const Tags: array of PtrUInt): LongBool;
begin
  ChangeWorkbenchSelection := ChangeWorkbenchSelectionA(Name, Hook, @Tags);
end;

function MakeWorkbenchObjectVisible(Name: STRPTR; const Tags: array of PtrUInt): LongBool;
begin
  MakeWorkbenchObjectVisible := MakeWorkbenchObjectVisibleA(Name, @Tags);
end;

function ManageDesktopObjectTags(Name: PChar; Action: LongInt; const Tags: array of PtrUInt): Boolean;
begin
  ManageDesktopObjectTags := ManageDesktopObjectA(Name, Action, @Tags);
end;

function CreateDrawerTags(Drawer: PChar; const Tags: array of PtrUInt): Boolean;
begin
  CreateDrawerTags := CreateDrawerA(Drawer, @Tags);
end;

function CreateIconTags(Name: PChar; const Tags: array of PtrUInt): Boolean;
begin
  CreateIconTags := CreateIconA(Name, @Tags);
end;

const
  LIBVERSION: LongWord = 0;

initialization
  WorkbenchBase := OpenLibrary(WORKBENCHNAME, LIBVERSION);
finalization
  if Assigned(WorkbenchBase) then
  CloseLibrary(WorkbenchBase);
end.