1 #ifndef LIBAMI_H
2 #define LIBAMI_H
3 
4 #include <X11/Xlib.h>
5 #include <X11/Xmd.h>
6 
7 #ifdef AMIGAOS
8 #include <exec/types.h>
9 #include <exec/nodes.h>
10 #include <exec/lists.h>
11 #include <utility/hooks.h>
12 #include <dos/dos.h>
13 #include <dos/rdargs.h>
14 #include <proto/exec.h>
15 #include <proto/dos.h>
16 #include <proto/icon.h>
17 #include <proto/iffparse.h>
18 #include <proto/locale.h>
19 #else
20 
21 #define GLOBAL	extern
22 #define IMPORT	extern
23 #define STATIC	static
24 #define REGISTER register
25 
26 #ifndef VOID
27 #define VOID	void
28 #endif
29 
30 #ifndef BYTE
31 #define BYTE Amiga_BYTE
32 #endif
33 #ifndef BOOL
34 #define BOOL Amiga_BOOL
35 #endif
36 
37 typedef void   *APTR;
38 typedef INT32  LONG;
39 typedef CARD32 ULONG;
40 typedef BITS32 LONGBITS;
41 typedef INT16  WORD;
42 typedef CARD16 UWORD;
43 typedef BITS16 WORDBITS;
44 typedef INT8   BYTE;
45 typedef CARD8  UBYTE;
46 typedef CARD8  BYTEBITS;
47 typedef CARD16 RPTR;
48 typedef unsigned char  *STRPTR;
49 typedef INT16  BOOL;
50 
51 #ifndef TRUE
52 #define TRUE	1
53 #endif
54 #ifndef FALSE
55 #define FALSE	0
56 #endif
57 #ifndef NULL
58 #define NULL	0L
59 #endif
60 
61 #define WF_NOICONIFY 1
62 
63 struct Node {
64   struct  Node *ln_Succ;
65   struct  Node *ln_Pred;
66   UBYTE   ln_Type;
67   BYTE    ln_Pri;
68   char    *ln_Name;
69 };
70 
71 struct MinNode {
72   struct MinNode *mln_Succ;
73   struct MinNode *mln_Pred;
74 };
75 
76 struct List {
77   struct  Node *lh_Head;
78   struct  Node *lh_Tail;
79   struct  Node *lh_TailPred;
80   UBYTE   lh_Type;
81   UBYTE   l_pad;
82 };
83 
84 struct MinList {
85   struct  MinNode *mlh_Head;
86   struct  MinNode *mlh_Tail;
87   struct  MinNode *mlh_TailPred;
88 };
89 
90 extern void AddHead(struct List *, struct Node *);
91 extern void AddTail(struct List *, struct Node *);
92 extern void Enqueue(struct List *, struct Node *);
93 extern struct Node *FindName(struct List *, STRPTR);
94 extern void Insert(struct List *, struct Node *, struct Node *);
95 extern struct Node *RemHead(struct List *);
96 extern void Remove(struct Node *);
97 extern struct Node *RemTail(struct List *);
98 extern void NewList(struct List *);
99 
100 struct CSource {
101   UBYTE	*CS_Buffer;
102   LONG	CS_Length;
103   LONG	CS_CurChr;
104 };
105 
106 struct RDArgs {
107   struct CSource RDA_Source;
108   void *RDA_DAList;
109   UBYTE *RDA_Buffer;
110   LONG RDA_BufSiz;
111   UBYTE *RDA_ExtHelp;
112   LONG RDA_Flags;
113 };
114 
115 struct Image
116 {
117   WORD LeftEdge, TopEdge, Width, Height, Depth;
118   UWORD *ImageData;
119   UBYTE PlanePick, PlaneOnOff;
120   struct Image *NextImage;
121 };
122 
123 struct Gadget
124 {
125   struct Gadget *NextGadget;
126   WORD LeftEdge, TopEdge, Width, Height;
127   UWORD Flags, Activation, GadgetType;
128   APTR GadgetRender, SelectRender;
129   struct IntuiText *GadgetText;
130   LONG MutualExclude;
131   APTR SpecialInfo;
132   UWORD GadgetID;
133   APTR UserData;
134 };
135 
136 struct NewWindow
137 {
138   WORD LeftEdge, TopEdge, Width, Height;
139   UBYTE DetailPen, BlockPen;
140   ULONG IDCMPFlags, Flags;
141   struct Gadget *FirstGadget;
142   struct Image *CheckMark;
143   UBYTE *Title;
144   struct Screen *Screen;
145   struct BitMap *BitMap;
146   WORD MinWidth, MinHeight;
147   UWORD MaxWidth, MaxHeight;
148   UWORD Type;
149 };
150 
151 struct DrawerData {
152   struct NewWindow dd_NewWindow;
153   LONG dd_CurrentX;
154   LONG dd_CurrentY;
155   ULONG dd_Flags;
156   UWORD dd_ViewModes;
157 };
158 
159 struct DiskObject {
160   UWORD do_Magic;
161   UWORD do_Version;
162   struct Gadget do_Gadget;
163   UBYTE do_Type;
164   char *do_DefaultTool;
165   char **do_ToolTypes;
166   LONG do_CurrentX;
167   LONG do_CurrentY;
168   struct DrawerData *do_DrawerData;
169   char *do_ToolWindow;
170   LONG do_StackSize;
171 };
172 
173 struct Hook
174 {
175   struct MinNode h_MinNode;
176   ULONG	   (*h_Entry)();	/* assembler entry point */
177   ULONG	   (*h_SubEntry)();	/* often HLL entry point */
178   APTR	   h_Data;		/* owner specific	 */
179 };
180 
181 struct IFFHandle
182 {
183   ULONG iff_Stream;
184   ULONG iff_Flags;
185   LONG  iff_Depth;	/*  Depth of context stack */
186   /* private fields */
187   struct Hook *iff_Hook;
188 };
189 
190 struct IFFStreamCmd
191 {
192     LONG sc_Command;	/* Operation to be performed (IFFCMD_) */
193     APTR sc_Buf;	/* Pointer to data buffer	       */
194     LONG sc_NBytes;	/* Number of bytes to be affected      */
195 };
196 
197 
198 #define RDAB_STDIN	0	/* Use "STDIN" rather than "COMMAND LINE" */
199 #define RDAF_STDIN	1
200 #define RDAB_NOALLOC	1	/* If set, do not allocate extra string space.*/
201 #define RDAF_NOALLOC	2
202 #define RDAB_NOPROMPT	2	/* Disable reprompting for string input. */
203 #define RDAF_NOPROMPT	4
204 
205 #define ITEM_EQUAL	-2	/* "=" Symbol */
206 #define ITEM_ERROR	-1	/* error */
207 #define ITEM_NOTHING	0	/* *N, ;, endstreamch */
208 #define ITEM_UNQUOTED	1	/* unquoted item */
209 #define ITEM_QUOTED	2	/* quoted item */
210 
211 #define MAX_TEMPLATE_ITEMS 100
212 #define MAX_MULTIARGS 128
213 
214 #define ERROR_NO_FREE_STORE  103
215 #define ERROR_BAD_TEMPLATE  114
216 #define ERROR_BAD_NUMBER  115
217 #define ERROR_REQUIRED_ARG_MISSING  116
218 #define ERROR_KEY_NEEDS_ARG  117
219 #define ERROR_TOO_MANY_ARGS  118
220 #define ERROR_LINE_TOO_LONG  120
221 
222 #define IFFERR_EOF	  -1L	/* Reached logical end of file	*/
223 #define IFFERR_EOC	  -2L	/* About to leave context	*/
224 #define IFFERR_NOSCOPE	  -3L	/* No valid scope for property	*/
225 #define IFFERR_NOMEM	  -4L	/* Internal memory alloc failed */
226 #define IFFERR_READ	  -5L	/* Stream read error		*/
227 #define IFFERR_WRITE	  -6L	/* Stream write error		*/
228 #define IFFERR_SEEK	  -7L	/* Stream seek error		*/
229 #define IFFERR_MANGLED	  -8L	/* Data in file is corrupt	*/
230 #define IFFERR_SYNTAX	  -9L	/* IFF syntax error		*/
231 #define IFFERR_NOTIFF	  -10L	/* Not an IFF file		*/
232 #define IFFERR_NOHOOK	  -11L	/* No call-back hook provided	*/
233 #define IFF_RETURN2CLIENT -12L	/* Client handler normal return */
234 
235 #define IFFF_READ	0L			 /* read mode - default    */
236 #define IFFF_WRITE	1L			 /* write mode		   */
237 #define IFFF_RWBITS	(IFFF_READ | IFFF_WRITE) /* read/write bits	   */
238 #define IFFF_FSEEK	(1L<<1)		 /* forward seek only	   */
239 #define IFFF_RSEEK	(1L<<2)		 /* random seek	   */
240 #define IFFF_RESERVED	0xFFFF0000L		 /* Don't touch these bits */
241 
242 #define IFFCMD_INIT	0	/* Prepare the stream for a session */
243 #define IFFCMD_CLEANUP	1	/* Terminate stream session	    */
244 #define IFFCMD_READ	2	/* Read bytes from stream	    */
245 #define IFFCMD_WRITE	3	/* Write bytes to stream	    */
246 #define IFFCMD_SEEK	4	/* Seek on stream		    */
247 #define IFFCMD_ENTRY	5	/* You just entered a new context   */
248 #define IFFCMD_EXIT	6	/* You're about to leave a context  */
249 #define IFFCMD_PURGELCI 7	/* Purge a LocalContextItem	    */
250 
251 
252 extern void FreeArgs(struct RDArgs *);
253 extern LONG ReadItem(STRPTR, LONG, struct CSource *);
254 extern LONG FindArg(STRPTR, STRPTR);
255 extern struct RDArgs * ReadArgs(STRPTR, LONG *, struct RDArgs *);
256 
257 extern UBYTE ToUpper(UBYTE);
258 extern LONG StrToLong(STRPTR, LONG *);
259 extern LONG Stricmp(STRPTR, STRPTR);
260 
261 extern char *BumpRevision(char *, char *);
262 extern BOOL DeleteDiskObject(char *);
263 extern void FreeDiskObject(struct DiskObject *);
264 extern struct DiskObject *GetDefDiskObject(LONG);
265 extern struct DiskObject *GetDiskObject(char *);
266 extern struct DiskObject *GetDiskObjectNew(char *);
267 extern BOOL MatchToolValue(char *, char *);
268 extern BOOL PutDiskObject(char *, struct DiskObject *);
269 
270 extern BOOL Fault(LONG, UBYTE *, UBYTE *, LONG);
271 extern BOOL PrintFault(LONG, UBYTE *);
272 extern LONG IoErr();
273 extern LONG SetIoErr(LONG);
274 
275 extern struct IFFHandle *AllocIFF( void );
276 extern LONG OpenIFF( struct IFFHandle *iff, long rwMode );
277 extern LONG ParseIFF( struct IFFHandle *iff, long control );
278 extern void CloseIFF( struct IFFHandle *iff );
279 extern void FreeIFF( struct IFFHandle *iff );
280 
281 extern LONG ReadChunkBytes( struct IFFHandle *iff, APTR buf, long numBytes );
282 extern LONG WriteChunkBytes( struct IFFHandle *iff, APTR buf, long numBytes );
283 extern LONG ReadChunkRecords( struct IFFHandle *iff, APTR buf, long bytesPerRecord, long numRecords );
284 extern LONG WriteChunkRecords( struct IFFHandle *iff, APTR buf, long bytesPerRecord, long numRecords );
285 
286 extern LONG PushChunk( struct IFFHandle *iff, long type, long id, long size );
287 extern LONG PopChunk( struct IFFHandle *iff );
288 
289 extern LONG EntryHandler( struct IFFHandle *iff, long type, long id, long position, struct Hook *handler, APTR object );
290 extern LONG ExitHandler( struct IFFHandle *iff, long type, long id, long position, struct Hook *handler, APTR object );
291 
292 extern LONG PropChunk( struct IFFHandle *iff, long type, long id );
293 extern LONG PropChunks( struct IFFHandle *iff, LONG *propArray, long numPairs );
294 extern LONG StopChunk( struct IFFHandle *iff, long type, long id );
295 extern LONG StopChunks( struct IFFHandle *iff, LONG *propArray, long numPairs );
296 extern LONG CollectionChunk( struct IFFHandle *iff, long type, long id );
297 extern LONG CollectionChunks( struct IFFHandle *iff, LONG *propArray, long numPairs );
298 extern LONG StopOnExit( struct IFFHandle *iff, long type, long id );
299 
300 extern struct StoredProperty *FindProp( struct IFFHandle *iff, long type, long id );
301 extern struct CollectionItem *FindCollection( struct IFFHandle *iff, long type, long id );
302 extern struct ContextNode *FindPropContext( struct IFFHandle *iff );
303 extern struct ContextNode *CurrentChunk( struct IFFHandle *iff );
304 extern struct ContextNode *ParentChunk( struct ContextNode *contextNode );
305 
306 extern struct LocalContextItem *AllocLocalItem( long type, long id, long ident, long dataSize );
307 extern APTR LocalItemData( struct LocalContextItem *localItem );
308 extern void SetLocalItemPurge( struct LocalContextItem *localItem, struct Hook *purgeHook );
309 extern void FreeLocalItem( struct LocalContextItem *localItem );
310 extern struct LocalContextItem *FindLocalItem( struct IFFHandle *iff, long type, long id, long ident );
311 extern LONG StoreLocalItem( struct IFFHandle *iff, struct LocalContextItem *localItem, long position );
312 extern void StoreItemInContext( struct IFFHandle *iff, struct LocalContextItem *localItem, struct ContextNode *contextNode );
313 
314 extern void InitIFF( struct IFFHandle *iff, long flags, struct Hook *streamHook );
315 
316 extern LONG GoodID( long id );
317 extern LONG GoodType( long type );
318 extern STRPTR IDtoStr( long id, STRPTR buf );
319 
320 #endif
321 
322 extern LONG OpenIFFasFile( struct IFFHandle *iff, char *fn, char *mode );
323 
324 struct ColorStore { unsigned long *colors; int ncolors; Colormap cmap; };
325 extern Pixmap image_to_pixmap(Display *, Window, GC, unsigned long,
326 			      unsigned long *, int, struct Image *, int, int,
327 			      struct ColorStore *);
328 extern void free_color_store(Display *, struct ColorStore *);
329 
330 typedef union { LONG num; APTR ptr; } Argtype;
331 
332 extern void initargs(int, char **);
333 
334 extern char *amiwm_version;
335 
336 extern int md_fd;
337 extern Window md_root;
338 
339 #define WINDOW_EVENT(e) ((e)->xany.display==(Display *)1)
340 #define FRAME_EVENT(e) ((e)->xany.display==(Display *)2)
341 #define ICON_EVENT(e) ((e)->xany.display==(Display *)3)
342 
343 #define IN_ROOT_MASK 1
344 #define IN_WINDOW_MASK 2
345 #define IN_FRAME_MASK 4
346 #define IN_ICON_MASK 8
347 #define IN_ANYTHING_MASK (~0)
348 
349 /* module.c */
350 extern void md_exit(int);
351 extern int md_handle_input(void);
352 extern void md_process_queued_events(void);
353 extern void md_main_loop(void);
354 extern int md_connection_number(void);
355 extern int md_command(XID, int, void *, int, char **);
356 extern int md_command0(XID, int, void *, int);
357 extern int md_command00(XID, int);
358 extern Display *md_display(void);
359 extern char *md_init(int, char *[]);
360 
361 /* broker.c */
362 extern int cx_broker(unsigned long, void (*)(XEvent *, unsigned long));
363 extern int cx_send_event(unsigned long, XEvent *);
364 
365 /* mdscreen.c */
366 extern int md_rotate_screen(Window);
367 extern int md_front(Window);
368 extern int md_back(Window);
369 extern int md_iconify(Window);
370 extern int md_errormsg(Window, char *);
371 
372 /* eventdispatcher.c */
373 extern void cx_event_broker(int, unsigned long, int (*)(XEvent*));
374 
375 /* kbdsupport.c */
376 extern int md_grabkey(int, unsigned int);
377 extern int md_ungrabkey(int);
378 
379 /* hotkey.c */
380 extern void cx_hotkey(KeySym, unsigned int, int, int,
381 		      void (*)(XEvent*,void*), void*);
382 
383 /* mdicon.c */
384 extern Window md_create_appicon(Window, int, int, char *,
385 				Pixmap, Pixmap, Pixmap);
386 extern Pixmap md_image_to_pixmap(Window, unsigned long, struct Image *,
387 				 int, int, struct ColorStore *);
388 extern char *get_current_icondir(void);
389 
390 /* mdwindow.c */
391 extern int md_set_appwindow(Window);
392 
393 #endif
394