1 #ifndef _APRICOT_H_
2 #define _APRICOT_H_
3 
4 #define PRIMA_CORE 1
5 #ifdef PRIMA_CORE
6 #define POLLUTE_NAME_SPACE 1
7 #endif
8 
9 #define PRIMA_CORE_VERSION 2017050901
10 
11 #define PRIMA_VERSION_BOOTCHECK \
12 	if(apc_get_core_version()!=PRIMA_CORE_VERSION) \
13 		croak("Prima object version(%ld) doesn't match module version(%ld). Recompile the module", \
14 			(long int)apc_get_core_version(), (long int)PRIMA_CORE_VERSION )
15 
16 #include "generic/config.h"
17 #if defined(HAS_GLIBC) && !defined(_GNU_SOURCE)
18 #	define _GNU_SOURCE
19 #endif
20 
21 #ifdef _MSC_VER
22 	#define BROKEN_COMPILER       1
23 	#define BROKEN_PERL_PLATFORM  1
24 	#define snprintf              _snprintf
25 	#define vsnprintf             _vsnprintf
26 	#define stricmp               _stricmp
27 	#define strnicmp              _strnicmp
28 	#define HAVE_SNPRINTF         1
29 	#define HAVE_STRICMP          1
30 	#define HAVE_STRNICMP         1
31 #elif defined(WIN32)
32 	#define BROKEN_PERL_PLATFORM  1
33 #endif
34 
35 #ifdef WORD
36 #error "Reconsider the order in which you #include files"
37 #endif
38 
39 #ifdef HAVE_SYS_TYPES_H
40 #include <sys/types.h>
41 #endif
42 #ifdef HAVE_SYS_BITYPES_H
43 #include <sys/bitypes.h>
44 #endif
45 #ifdef HAVE_SYS_INTTYPES_H
46 #include <sys/inttypes.h>
47 #endif
48 #ifdef HAVE_STDINT_H
49 #include <stdint.h>
50 #endif
51 #define __XSlock_h__ 28
52 #include <EXTERN.h>
53 #include <perl.h>
54 #ifdef REMOVE_dTHR_FROM_dSP
55 #undef dSP
56 #define dSP                djSP
57 #endif
58 #include <XSUB.h>
59 
60 #ifdef PERL_OBJECT
61 	#define XS_STARTPARAMS   CV* cv, CPerlObj* pPerl
62 	#define XS_CALLPARAMS    cv, pPerl
63 #else
64 	#define XS_STARTPARAMS   CV* cv
65 	#define XS_CALLPARAMS    cv
66 #endif
67 
68 #if defined(_MSC_VER) && defined(PERL_OBJECT)
69 class XSLockManager
70 {
71 public:
XSLockManager()72 		XSLockManager() { InitializeCriticalSection(&cs); };
~XSLockManager()73 		~XSLockManager() { DeleteCriticalSection(&cs); };
Enter(void)74 		void Enter(void) { EnterCriticalSection(&cs); };
Leave(void)75 		void Leave(void) { LeaveCriticalSection(&cs); };
76 protected:
77 		CRITICAL_SECTION cs;
78 };
79 
80 extern XSLockManager g_XSLock;
81 extern CPerlObj* pPerl;
82 
83 class XSLock
84 {
85 public:
XSLock(CPerlObj * p)86 		XSLock(CPerlObj *p) {
87 				g_XSLock.Enter();
88 				::pPerl = p;
89 		};
~XSLock()90 		~XSLock() { g_XSLock.Leave(); };
91 };
92 
93 /* PERL_CAPI does its own locking in xs_handler() */
94 #if defined(PERL_OBJECT) && !defined(PERL_CAPI)
95 #undef dXSARGS
96 #define dXSARGS \
97 		XSLock localLock(pPerl);                        \
98 		dSP; dMARK;                                     \
99 		I32 ax = mark - PL_stack_base + 1;              \
100 		I32 items = sp - mark
101 #endif  /* PERL_OBJECT && !PERL_CAPI */
102 #endif
103 
104 #ifdef __cplusplus
105 extern "C" {
106 #endif
107 
108 #if defined (package)
109 	#undef mod
110 	#undef list
111 	#undef package
112 	#undef ref
113 #endif
114 
115 #if defined(WORD) && (WORD==257)
116 #undef WORD
117 #endif
118 #include <stdlib.h>
119 
120 #ifdef BROKEN_PERL_PLATFORM
121 	#undef open
122 	#undef fopen
123 	#undef vfprintf
124 	#undef fclose
125 	#undef feof
126 	#undef ferror
127 	#undef environ
128 	#undef strerror
129 	#undef fread
130 	#undef fwrite
131 	#undef fopen
132 	#undef fdopen
133 	#undef freopen
134 	#undef fclose
135 	#undef fputc
136 	#undef ungetc
137 	#undef getc
138 	#undef fileno
139 	#undef clearerr
140 	#undef fflush
141 	#undef ftell
142 	#undef fseek
143 	#undef fgetpos
144 	#undef fsetpos
145 	#undef rewind
146 	#undef tmpfile
147 	#undef abort
148 	#undef fstat
149 	#undef stat
150 	#undef rename
151 	#undef setmode
152 	#undef lseek
153 	#undef tell
154 	#undef dup
155 	#undef dup2
156 	#undef open
157 	#undef close
158 	#undef eof
159 	#undef read
160 	#undef write
161 	#undef _open_osfhandle
162 	#undef _get_osfhandle
163 	#undef spawnvp
164 	#undef mkdir
165 	#undef rmdir
166 	#undef chdir
167 	#undef flock
168 	#undef execv
169 	#undef execvp
170 	#undef perror
171 	#undef setbuf
172 	#undef setvbuf
173 	#undef flushall
174 	#undef fcloseall
175 	#undef fgets
176 	#undef gets
177 	#undef fgetc
178 	#undef putc
179 	#undef puts
180 	#undef getchar
181 	#undef putchar
182 	#undef close
183 	#undef dup
184 	#ifdef win32_close
185 		#define close  win32_close
186 		#define dup    win32_dup
187 	#endif
188 	#ifdef PerlIO_stderr    /* ActiveState quirks */
189 		#if (PERL_VERSION == 8) /* broken stderr definition */
190 			#undef stderr
191 			#define stderr PerlIO_stderr()
192 		#endif
193 		#if (PERL_VERSION >= 6) /* broken fprintf definition */
194 			#define fprintf PerlIO_printf
195 		#else
196 		#endif
197 	#elif (PERL_VERSION == 7)
198 		#define fprintf PerlIO_printf
199 	#else
200 		#undef fprintf
201 		#ifdef win32_stderr
202 			#undef stderr
203 			#define stderr win32_stderr()
204 		#endif
205 	#endif
206 #endif
207 
208 #ifdef PTRV
209 #undef PTR2UV
210 #define PTR2UV(x) ((UV)(PTRV)(x))
211 #undef PTR2IV
212 #define PTR2IV(x) ((IV)(PTRV)(x))
213 #undef INT2PTR
214 #define INT2PTR(type,x) ((type)((PTRV)x))
215 #endif
216 
217 #ifndef SvPV_nolen
218 #define SvPV_nolen(_sv)  SvPV(_sv,na)
219 #endif
220 
221 #define PERL_CALL_METHOD   clean_perl_call_method
222 #define PERL_CALL_PV       clean_perl_call_pv
223 
224 #ifndef HAVE_BZERO
225 extern void bzero(void*,size_t);
226 #endif
227 #ifdef HAVE_STRICMP
228 #ifndef HAVE_STRCASECMP
229 #define strcasecmp(a,b) stricmp((a),(b))
230 #endif
231 #else
232 #ifdef HAVE_STRCASECMP
233 #define stricmp(a,b) strcasecmp((a),(b))
234 #else
235 #define strcasecmp(a,b) stricmp((a),(b))
236 #define PRIMA_NEED_OWN_STRICMP 1
237 extern int
238 stricmp(const char *s1, const char *s2);
239 #endif
240 #ifdef HAVE_STRNICMP
241 #ifndef HAVE_STRNCASECMP
242 #define strncasecmp(a,b,c) strnicmp((a),(b),(c))
243 #endif
244 #else
245 #ifdef HAVE_STRNCASECMP
246 #define strnicmp(a,b,c) strncasecmp((a),(b),(c))
247 #else
248 #define strncasecmp(a,b,c) strnicmp((a),(b),(c))
249 #define PRIMA_NEED_OWN_STRNICMP 1
250 extern int
251 strnicmp(const char *s1, const char *s2, size_t count);
252 #endif
253 #endif
254 #endif
255 #ifndef HAVE_STRCASESTR
256 char * strcasestr( const char * s, const char * find);
257 #endif
258 #ifndef HAVE_REALLOCF
259 extern void *
260 reallocf(void *ptr, size_t size);
261 #endif
262 
263 #ifdef HAVE_STRINGS_H
264 #include <strings.h>
265 #endif
266 #ifdef HAVE_PMPRINTF_H
267 #define printf PmPrintf
268 extern unsigned long PmPrintf(char *, ...);
269 #endif
270 
271 
272 #if ! ( defined( HAVE_SNPRINTF) || defined( HAVE__SNPRINTF))
273 extern int
274 snprintf( char *, size_t, const char *, ...);
275 
276 extern int
277 vsnprintf( char *, size_t, const char *, va_list);
278 #endif
279 
280 #ifndef HAVE_MEMMEM
281 extern void *
282 memmem(const void *l, size_t l_len, const void *s, size_t s_len);
283 #endif
284 
285 
286 #define alloc1(typ)     ((typ*)malloc(sizeof(typ)))
287 #define allocn(typ,n)   ((typ*)malloc((n)*sizeof(typ)))
288 #define allocs(n)       ((char*)malloc(n))
289 #define allocb(n)       ((Byte*)malloc(n))
290 #define alloc1z(typ)    ((typ*)prima_mallocz(sizeof(typ)))
291 #define allocnz(typ,n)  ((typ*)prima_mallocz((n)*sizeof(typ)))
292 
293 extern void *
294 prima_mallocz( size_t sz);
295 
296 typedef I32 Bool;
297 #if PTRSIZE==LONGSIZE
298 typedef unsigned long Handle;
299 #define PR_HANDLE "lu"
300 #elif PTRSIZE==INTSIZE
301 typedef unsigned int Handle;
302 #define PR_HANDLE "u"
303 #elif PTRSIZE==SHORTSIZE
304 typedef unsigned short Handle;
305 #define PR_HANDLE "hu"
306 #elif defined(HAS_LONG_LONG) && PTRSIZE==LONGLONGSIZE
307 typedef unsigned long long Handle;
308 #define PR_HANDLE "llu"
309 #elif defined(HAS_QUAD) && PTRSIZE==8
310 typedef Uquad_t Handle;
311 #define PR_HANDLE "U64d"
312 #else
313 #error "Cannot find adequate integer type"
314 #endif
315 typedef Handle ApiHandle;
316 
317 
318 #define __xstr1(x) #x
319 #define __xstr2(x) __xstr1(x)
320 #define PR_HANDLE_FMT "0x%0" __xstr2(PTRSIZE) PR_HANDLE
321 
322 #include "Types.h"
323 
324 #if !defined(HAVE_INT8_T)
325 typedef I8 int8_t;
326 #endif
327 #if !defined(HAVE_INT16_T)
328 typedef I16  int16_t;
329 #endif
330 #if !defined(HAVE_INT32_T)
331 typedef I32  int32_t;
332 #endif
333 #if !defined(HAVE_UINT8_T)
334 #if defined(HAVE_U_INT8_T)
335 typedef u_int8_t        uint8_t;
336 #else
337 typedef U8 uint8_t;
338 #endif
339 #endif
340 #if !defined(HAVE_UINT16_T)
341 #if defined(HAVE_U_INT16_T)
342 typedef u_int16_t       uint16_t;
343 #else
344 typedef U16 uint16_t;
345 #endif
346 #endif
347 #if !defined(HAVE_UINT32_T)
348 #if defined(HAVE_U_INT32_T)
349 typedef u_int32_t       uint32_t;
350 #else
351 typedef U32 uint32_t;
352 #endif
353 #endif
354 #if !defined(HAVE_UINT64_T)
355 #if defined(HAVE_U_INT64_T)
356 typedef u_int64_t       uint64_t;
357 #elif defined U64
358 typedef U64 uint64_t;
359 #elif defined(_MSC_VER) && _MSC_VER <= 1500
360 typedef unsigned __int64 uint64_t;
361 typedef __int64 int64_t;
362 #else
363 typedef unsigned long uint64_t;
364 #endif
365 #endif
366 #if !defined(HAVE_SSIZE_T)
367 typedef size_t ssize_t;
368 #endif
369 
370 typedef uint32_t        Color;
371 
372 typedef uint8_t         Byte;
373 typedef int16_t         Short;
374 typedef int32_t         Long;
375 
376 #undef INT16_MIN
377 #undef INT16_MAX
378 #undef INT32_MIN
379 #undef INT32_MAX
380 #define INT16_MIN (-32768)
381 #define INT16_MAX 32767
382 #define INT32_MIN  (-2147483647L-1)
383 #define INT32_MAX 2147483647L
384 
385 typedef struct _RGBColor
386 {
387 	unsigned char b;
388 	unsigned char g;
389 	unsigned char r;
390 } RGBColor, *PRGBColor;
391 
392 typedef struct { float  re, im; } Complex;
393 typedef struct { double re, im; } DComplex;
394 typedef struct { float  r,  ph; } TrigComplex;
395 typedef struct { double r,  ph; } TrigDComplex;
396 
397 #ifdef __cplusplus
398 #define nil       NULL
399 #else
400 #define nil       Null(void*)
401 #endif
402 #define NULL_HANDLE Null(Handle)
403 #define NULL_SV     &PL_sv_undef
404 #define NULL_HANDLE Null(Handle)
405 #define NULL_SV     &PL_sv_undef
406 
407 #ifndef true
408 #define true TRUE
409 #endif
410 
411 #ifndef false
412 #define false FALSE
413 #endif
414 
415 typedef struct _List
416 {
417 	Handle * items;
418 	int    count;
419 	int    size;
420 	int    delta;
421 } List, *PList;
422 
423 /* Event structures */
424 
425 #ifdef KeyEvent
426 #undef KeyEvent
427 #endif
428 
429 typedef struct _KeyEvent {
430 	int    cmd;
431 	int    subcmd;
432 	Handle source;
433 	int    code;
434 	int    key;
435 	int    mod;
436 	int    repeat;
437 } KeyEvent, *PKeyEvent;
438 
439 #ifdef PositionalEvent
440 #undef PositionalEvent
441 #endif
442 
443 typedef struct _PositionalEvent {
444 	int    cmd;
445 	int    subcmd;
446 	Handle source;
447 	Point  where;
448 	int    button;
449 	int    mod;
450 	Bool   dblclk;
451 } PositionalEvent, *PPositionalEvent;
452 
453 #ifdef DNDEvent
454 #undef DNDEvent
455 #endif
456 
457 typedef struct _DNDEvent {
458 	int    cmd;
459 	int    allow;
460 	int    action;
461 	int    modmap;
462 	Handle clipboard;
463 	Point  where;
464 	Box    pad;
465 	Handle counterpart;
466 } DNDEvent, *PDNDEvent;
467 
468 #ifdef GenericEvent
469 #undef GenericEvent
470 #endif
471 
472 typedef struct _GenericEvent {
473 	int    cmd;
474 	int    subcmd;
475 	Handle source;
476 	int    i;
477 	long   l;
478 	Bool   B;
479 	Point  P;
480 	Rect   R;
481 	void*  p;
482 	Handle H;
483 } GenericEvent, *PGenericEvent;
484 
485 typedef union _Event {
486 	int             cmd;
487 	GenericEvent    gen;
488 	PositionalEvent pos;
489 	KeyEvent        key;
490 	DNDEvent        dnd;
491 } Event, *PEvent;
492 
493 typedef struct _PostMsg {
494 	int     msgId;
495 	Handle  h;
496 	SV   *  info1;
497 	SV   *  info2;
498 } PostMsg, *PPostMsg;
499 
500 /* hashes support */
501 /* It's a mere coincidence that hashes in Prima guts implemented */
502 /* by means of Perl hashes */
503 
504 #ifdef POLLUTE_NAME_SPACE
505 #define hash_create        prima_hash_create
506 #define hash_destroy       prima_hash_destroy
507 #define hash_fetch         prima_hash_fetch
508 #define hash_delete        prima_hash_delete
509 #define hash_store         prima_hash_store
510 #define hash_count         prima_hash_count
511 #define hash_first_that    prima_hash_first_that
512 #endif
513 
514 typedef HV *PHash;
515 typedef Bool HashProc( void * item, int keyLen, void * key, void * params);
516 typedef HashProc *PHashProc;
517 
518 extern PHash primaObjects;
519 
520 extern PHash
521 prima_hash_create( void);
522 
523 extern void
524 prima_hash_destroy( PHash self, Bool killAll);
525 
526 extern void*
527 prima_hash_fetch( PHash self, const void *key, int keyLen);
528 
529 extern void*
530 prima_hash_delete( PHash self, const void *key, int keyLen, Bool kill);
531 
532 extern Bool
533 prima_hash_store( PHash self, const void *key, int keyLen, void *val);
534 
535 #define prima_hash_count(hash) (HvKEYS(( HV*) hash))
536 
537 extern void*
538 prima_hash_first_that( PHash self, void *action, void *params, int *pKeyLen, void **pKey);
539 
540 extern char *
541 prima_normalize_resource_string( char *name, Bool isClass);
542 
543 /* tables of constants support */
544 
545 #ifdef GENERATE_TABLE_GENERATOR
546 #ifndef TABLE_GENERATOR_NEWSVSTRING
547 #define TABLE_GENERATOR_NEWSVSTRING
548 static SV*
newSVstring(char * s)549 newSVstring( char *s)
550 {
551 	return newSVpv( s, 0);
552 }
553 #endif
554 #define START_TABLE(package,type) \
555 typedef struct { \
556 	const char *name;   \
557 	type value;  \
558 } ConstTable_##package; \
559 ConstTable_##package Prima_Autoload_##package##_constants[] = {
560 #define CONSTANT(package,const_name) \
561 	{ #const_name , package##const_name },
562 #define CONSTANT2(package,const_name,string_name) \
563 	{ #string_name , package##const_name },
564 #define END_TABLE4(package,type,suffix,conversion) \
565 }; /* end of table */ \
566 static SV* newSVstring( char *s); \
567 XS(prima_autoload_##package##_constant) \
568 { \
569 	static PHash table = nil; \
570 	dXSARGS; \
571 	char *name; \
572 	unsigned int i; \
573 	type *r; \
574 \
575 	if (!table) { \
576 		table = hash_create(); \
577 		if (!table) croak( #package "::constant: cannot create hash"); \
578 		for ( i = 0; i < sizeof( Prima_Autoload_##package##_constants) \
579 					/ sizeof( ConstTable_##package); i++) \
580 			hash_store( table, \
581 							Prima_Autoload_##package##_constants[i]. name, \
582 							(I32) strlen( Prima_Autoload_##package##_constants[i]. name), \
583 							&Prima_Autoload_##package##_constants[i]. value); \
584 	} \
585 \
586 	if ( items != 1) croak( "invalid call to " #package "::constant"); \
587 	name = SvPV_nolen( ST( 0)); \
588 	SPAGAIN; \
589 	SP -= items; \
590 	r = (type *)hash_fetch( table, name, (I32) strlen( name)); \
591 	if ( !r) croak( "invalid value: " #package "::%s", name); \
592 	XPUSHs( sv_2mortal( newSV##suffix((conversion)*r))); \
593 	PUTBACK; \
594 	return; \
595 } \
596 void register_##package##_constants( void) { \
597 	HV *unused_hv; \
598 	GV *unused_gv; \
599 	SV *sv; \
600 	CV *cv; \
601 	unsigned int i; \
602 \
603 	newXS( #package "::constant", prima_autoload_##package##_constant, #package); \
604 	sv = newSVpv("", 0); \
605 	for ( i = 0; i < sizeof( Prima_Autoload_##package##_constants) \
606 				/ sizeof( ConstTable_##package); i++) { \
607 		sv_setpvf( sv, "%s::%s", #package, Prima_Autoload_##package##_constants[i]. name); \
608 		cv = sv_2cv(sv, &unused_hv, &unused_gv, true); \
609 		sv_setpv((SV*)cv, ""); \
610 	} \
611 	sv_free( sv); \
612 }
613 #else
614 #define START_TABLE(package,type) \
615 typedef struct { \
616 	const char *name;   \
617 	type value;  \
618 } ConstTable_##package;
619 #define CONSTANT(package,const_name) /* nothing */
620 #define CONSTANT2(package,const_name,string_name) /* nothing */
621 #define END_TABLE4(package,type,suffix,conversion) /* nothing */
622 #endif
623 #define END_TABLE(package,type) END_TABLE4(package,type,iv,IV)
624 #define END_TABLE_CHAR(package,type) END_TABLE4(package,type,string,char*)
625 
626 /* Object life stages */
627 #define csDeadInInit    -2         /* dead before any init() code */
628 #define csConstructing  -1         /* before create() finished */
629 #define csNormal         0         /* normal during life stage */
630 #define csDestroying     1         /* destroy() started */
631 #define csFrozen         2         /* cleanup() started - no messages available at this point */
632 #define csFinalizing     3         /* done() started */
633 #define csDead           4         /* destroy() finished - no methods available at this point */
634 
635 /* Notification types */
636 #define NT(const_name) CONSTANT(nt,const_name)
637 START_TABLE(nt,UV)
638 #define ntPrivateFirst   0x0
639 NT(PrivateFirst)
640 #define ntCustomFirst    0x1
641 NT(CustomFirst)
642 #define ntSingle         0x0
643 NT(Single)
644 #define ntMultiple       0x2
645 NT(Multiple)
646 #define ntEvent          0x4
647 NT(Event)
648 #define ntFluxNormal     0x0
649 NT(FluxNormal)
650 #define ntFluxReverse    0x8
651 NT(FluxReverse)
652 #define ntSMASK         ntMultiple | ntEvent
653 NT(SMASK)
654 #define ntDefault       ntPrivateFirst | ntMultiple | ntFluxReverse
655 NT(Default)
656 #define ntProperty      ntPrivateFirst | ntSingle   | ntFluxNormal
657 NT(Property)
658 #define ntRequest       ntPrivateFirst | ntEvent    | ntFluxNormal
659 NT(Request)
660 #define ntNotification  ntCustomFirst  | ntMultiple | ntFluxReverse
661 NT(Notification)
662 #define ntAction        ntCustomFirst  | ntSingle   | ntFluxReverse
663 NT(Action)
664 #define ntCommand       ntCustomFirst  | ntEvent    | ntFluxReverse
665 NT(Command)
666 
667 END_TABLE(nt,UV)
668 #undef NT
669 
670 /* Modality types */
671 #define MT(const_name) CONSTANT(mt,const_name)
672 START_TABLE(mt,UV)
673 #define mtNone           0
674 MT(None)
675 #define mtShared         1
676 MT(Shared)
677 #define mtExclusive      2
678 MT(Exclusive)
679 
680 END_TABLE(mt,UV)
681 #undef MT
682 
683 
684 /* Command event types */
685 #define ctQueueMask      0x00070000     /* masks bits that defines behavior in !csNormal stages: */
686 #define ctCacheable      0x00000000     /* Command caches in the queue */
687 #define ctDiscardable    0x00010000     /* Command should be discarded */
688 #define ctPassThrough    0x00020000     /* Command passes as normal */
689 #define ctSingle         0x00040000     /* Command caches in the queue only once, then changes ct bits to */
690 #define ctSingleResponse 0x00050000     /* ctSingleResponse */
691 #define ctNoInhibit      0x00080000     /* Valid for csDestroying and csFrozen */
692 
693 /* Apricot events */
694 /* commands */
695 #define CM(const_name) CONSTANT(cm,const_name)
696 START_TABLE(cm,UV)
697 #define cmClose         (0x00000005|ctDiscardable)
698 CM(Close)
699 #define cmChangeOwner   (0x00000006|ctDiscardable)
700 CM(ChangeOwner)
701 #define cmChildEnter    (0x00000007|ctDiscardable)
702 CM(ChildEnter)
703 #define cmChildLeave    (0x00000008|ctDiscardable)
704 CM(ChildLeave)
705 #define cmCreate        (0x00000009|ctPassThrough)
706 CM(Create)
707 #define cmDestroy       (0x0000000B|ctPassThrough|ctNoInhibit)
708 CM(Destroy)
709 #define cmHide          (0x0000000C|ctDiscardable) /* visible flag aware */
710 CM(Hide)
711 #define cmShow          (0x0000000D|ctDiscardable) /*           commands */
712 CM(Show)
713 #define cmReceiveFocus  (0x0000000E|ctDiscardable) /* focused flag aware */
714 CM(ReceiveFocus)
715 #define cmReleaseFocus  (0x0000000F|ctDiscardable) /*           commands */
716 CM(ReleaseFocus)
717 #define cmPaint         (0x00000010|ctSingle)      /* WM_PAINT analog */
718 CM(Paint)
719 #define cmRepaint       (0x00000010|ctSingleResponse) /* and it's response action */
720 CM(Repaint)
721 #define cmSize          (0x00000011|ctPassThrough) /* WM_SIZE analog */
722 CM(Size)
723 #define cmMove          (0x00000012|ctPassThrough) /* WM_MOVE analog */
724 CM(Move)
725 #define cmColorChanged  (0x00000013|ctDiscardable) /* generates when color changed */
726 CM(ColorChanged)
727 #define cmZOrderChanged (0x00000014|ctDiscardable) /* z-order change command */
728 CM(ZOrderChanged)
729 #define cmEnable        (0x00000015|ctDiscardable) /* enabled flag aware */
730 CM(Enable)
731 #define cmDisable       (0x00000016|ctDiscardable) /*           commands */
732 CM(Disable)
733 #define cmActivate      (0x00000017)               /* commands for window */
734 CM(Activate)
735 #define cmDeactivate    (0x00000018)               /* active stage change */
736 CM(Deactivate)
737 #define cmFontChanged   (0x00000019|ctDiscardable) /* generates when font changed */
738 CM(FontChanged)
739 #define cmWindowState   (0x0000001A|ctDiscardable) /* generates when window state changed */
740 CM(WindowState)
741 #define cmTimer          0x0000001C                /* WM_TIMER analog */
742 CM(Timer)
743 #define cmClick          0x0000001D                /* common click */
744 CM(Click)
745 #define cmCalcBounds    (0x0000001E|ctPassThrough) /* query on change size */
746 CM(CalcBounds)
747 #define cmPost           0x0000001F                /* posted message */
748 CM(Post)
749 #define cmPopup          0x00000020                /* interactive popup request */
750 CM(Popup)
751 #define cmExecute        0x00000021                /* dialog execution start */
752 CM(Execute)
753 #define cmSetup          0x00000022                /* first message for alive and active widget */
754 CM(Setup)
755 #define cmHint           0x00000023                /* hint show/hide message */
756 CM(Hint)
757 #define cmDragBegin      0x00000024                /* Drag'n'drop aware */
758 CM(DragBegin)
759 #define cmDragOver       0x00000025                /*         constants */
760 CM(DragOver)
761 #define cmDragEnd        0x00000026                /* * */
762 CM(DragEnd)
763 #define cmDragQuery      0x00000027                /* * */
764 CM(DragQuery)
765 #define cmDragResponse   0x00000028                /* * */
766 CM(DragResponse)
767 #define cmMenu          (0x00000029|ctDiscardable) /* send when menu going to be activated */
768 CM(Menu)
769 #define cmEndModal       0x0000002A                /* dialog execution end */
770 CM(EndModal)
771 #define cmSysHandle      0x0000002B                /* system handle recreated */
772 CM(SysHandle)
773 #define cmIdle           0x0000002C                /* idle handler */
774 CM(Idle)
775 #define cmMenuItemMeasure 0x0000002D               /* query custom menu item size */
776 CM(MenuItemMeasure)
777 #define cmMenuItemPaint  0x0000002E                /* menu item custom paint */
778 CM(MenuItemPaint)
779 #define cmClipboard      0x0000002F                /* called on X11 to precise type of data to be pasted */
780 CM(Clipboard)
781 
782 #define cmMenuCmd        0x00000050                /* interactive menu command */
783 CM(MenuCmd)
784 #define cmKeyDown        0x00000051                /* generic key down handler cmd */
785 CM(KeyDown)
786 #define cmKeyUp          0x00000052                /* generic key up handler cmd (rare used) */
787 CM(KeyUp)
788 #define cmMouseDown      0x00000053                /* WM_BUTTONxDOWN & WM_BUTTONxDBLCLK analog */
789 CM(MouseDown)
790 #define cmMouseUp        0x00000054                /* WM_BUTTONxUP analog */
791 CM(MouseUp)
792 #define cmMouseMove      0x00000055                /* WM_MOUSEMOVE analog */
793 CM(MouseMove)
794 #define cmMouseWheel     0x00000056                /* WM_MOUSEWHEEL analog */
795 CM(MouseWheel)
796 #define cmMouseClick     0x00000057                /* click response command */
797 CM(MouseClick)
798 #define cmMouseEnter     0x00000058                /* mouse entered window area */
799 CM(MouseEnter)
800 #define cmMouseLeave     0x00000059                /* mouse left window area */
801 CM(MouseLeave)
802 #define cmTranslateAccel 0x0000005A                /* key event spred to non-focused windows */
803 CM(TranslateAccel)
804 #define cmDelegateKey    0x0000005B                /* reserved for key mapping */
805 CM(DelegateKey)
806 #define cmFileRead       0x00000070
807 #define cmFileWrite      0x00000071
808 #define cmFileException  0x00000072
809 
810 #define cmImageHeaderReady 0x00000073
811 #define cmImageDataReady 0x00000074
812 END_TABLE(cm,UV)
813 #undef CM
814 
815 /* mouse buttons & message box constants */
816 #define MB(const_name) CONSTANT(mb,const_name)
817 #define MB2(const_name,string_name) CONSTANT2(mb,const_name,string_name)
818 START_TABLE(mb,UV)
819 #define mb1             1
820 MB2(1,b1)
821 #define mb2             2
822 MB2(2,b2)
823 #define mb3             4
824 MB2(3,b3)
825 #define mb4             8
826 MB2(4,b4)
827 #define mb5             16
828 MB2(5,b5)
829 #define mb6             32
830 MB2(6,b6)
831 #define mb7             64
832 MB2(7,b7)
833 #define mb8             128
834 MB2(8,b8)
835 #define mb9             0x100
836 MB2(9,b9)
837 #define mb10            0x200
838 MB2(10,b10)
839 #define mb11            0x400
840 MB2(11,b11)
841 #define mb12            0x800
842 MB2(12,b12)
843 #define mb13            0x1000
844 MB2(13,b13)
845 #define mb14            0x2000
846 MB2(14,b14)
847 #define mb15            0x4000
848 MB2(15,b15)
849 #define mb16            0x8000
850 MB2(16,b16)
851 #define mbLeft          mb1
852 MB(Left)
853 #define mbRight         mb3
854 MB(Right)
855 #define mbMiddle        mb2
856 MB(Middle)
857 #define mbOK            0x0001
858 MB(OK)
859 #define mbOk            mbOK
860 MB(Ok)
861 #define mbYes           0x0002
862 MB(Yes)
863 #define mbCancel        0x0004
864 MB(Cancel)
865 #define mbNo            0x0008
866 MB(No)
867 #define mbAbort         0x0010
868 MB(Abort)
869 #define mbRetry         0x0020
870 MB(Retry)
871 #define mbIgnore        0x0040
872 MB(Ignore)
873 #define mbHelp          0x0080
874 MB(Help)
875 #define mbOKCancel      (mbOK|mbCancel)
876 MB(OKCancel)
877 #define mbOkCancel      mbOKCancel
878 MB(OkCancel)
879 #define mbYesNo         (mbYes|mbNo)
880 MB(YesNo)
881 #define mbYesNoCancel   (mbYes|mbNo|mbCancel)
882 MB(YesNoCancel)
883 #ifdef Error
884 #undef Error
885 #endif
886 #define mbError         0x0100
887 MB(Error)
888 #define mbWarning       0x0200
889 MB(Warning)
890 #define mbInformation   0x0400
891 MB(Information)
892 #define mbQuestion      0x0800
893 MB(Question)
894 #define mbNoSound       0x1000
895 MB(NoSound)
896 #define mbChangeAll     0xCA11
897 MB(ChangeAll)
898 END_TABLE(mb,UV)
899 #undef MB
900 #undef MB2
901 
902 /* keyboard modifiers */
903 #define KM(const_name) CONSTANT(km,const_name)
904 START_TABLE(km,UV)
905 #define kmShift         0x01000000
906 KM(Shift)
907 #define kmCtrl          0x04000000
908 KM(Ctrl)
909 #define kmAlt           0x08000000
910 KM(Alt)
911 #define kmEscape        0x10000000
912 KM(Escape)
913 #define kmUnicode       0x10000000
914 KM(Unicode)
915 #define kmKeyPad        0x40000000
916 KM(KeyPad)
917 #define kmDeadKey       0x80000000
918 KM(DeadKey)
919 END_TABLE(km,UV)
920 #undef KM
921 
922 #define KB(const_name) CONSTANT(kb,const_name)
923 START_TABLE(kb,UV)
924 /* keyboard masks */
925 #define kbCharMask      0x000000ff
926 KB(CharMask)
927 #define kbCodeMask      0x00ffff00
928 KB(CodeMask)
929 #define kbModMask       0xff000000
930 KB(ModMask)
931 
932 /* bad key or no key code */
933 #define kbNoKey         0x00FFFF00
934 KB(NoKey)
935 
936 /* virtual keys which are modifiers at the same time */
937 #define kbShiftL        0x00010100
938 KB(ShiftL)
939 #define kbShiftR        0x00010200
940 KB(ShiftR)
941 #define kbCtrlL         0x00010300
942 KB(CtrlL)
943 #define kbCtrlR         0x00010400
944 KB(CtrlR)
945 #define kbAltL          0x00010500
946 KB(AltL)
947 #define kbAltR          0x00010600
948 KB(AltR)
949 #define kbMetaL         0x00010700
950 KB(MetaL)
951 #define kbMetaR         0x00010800
952 KB(MetaR)
953 #define kbSuperL        0x00010900
954 KB(SuperL)
955 #define kbSuperR        0x00010a00
956 KB(SuperR)
957 #define kbHyperL        0x00010b00
958 KB(HyperL)
959 #define kbHyperR        0x00010c00
960 KB(HyperR)
961 #define kbCapsLock      0x00010d00
962 KB(CapsLock)
963 #define kbNumLock       0x00010e00
964 KB(NumLock)
965 #define kbScrollLock    0x00010f00
966 KB(ScrollLock)
967 #define kbShiftLock     0x00011000
968 KB(ShiftLock)
969 
970 /* Virtual keys which have character code at the same time */
971 #define kbBackspace     0x00020800
972 KB(Backspace)
973 #define kbTab           0x00020900
974 KB(Tab)
975 #define kbKPTab         (kmKeyPad | kbTab)      /* C-only */
976 #define kbLinefeed      0x00020a00
977 KB(Linefeed)
978 #define kbEnter         0x00020d00
979 KB(Enter)
980 #define kbReturn        kbEnter
981 KB(Return)
982 #define kbKPEnter       (kmKeyPad | kbEnter)    /* C-only */
983 #define kbKPReturn      kbKPEnter               /* C-only */
984 #define kbEscape        0x00021b00
985 KB(Escape)
986 #define kbEsc           kbEscape
987 KB(Esc)
988 #define kbSpace         0x00022000
989 KB(Space)
990 #define kbKPSpace       (kmKeyPad | kbSpace)    /* C-only */
991 
992 #define kbKPEqual       (kmKeyPad | '=')        /* C-only */
993 #define kbKPMultiply    (kmKeyPad | '*')        /* C-only */
994 #define kbKPAdd         (kmKeyPad | '+')        /* C-only */
995 #define kbKPSeparator   (kmKeyPad | ',')        /* C-only */
996 #define kbKPSubtract    (kmKeyPad | '-')        /* C-only */
997 #define kbKPDecimal     (kmKeyPad | '.')        /* C-only */
998 #define kbKPDivide      (kmKeyPad | '/')        /* C-only */
999 #define kbKP0           (kmKeyPad | '0')        /* C-only */
1000 #define kbKP1           (kmKeyPad | '1')        /* C-only */
1001 #define kbKP2           (kmKeyPad | '2')        /* C-only */
1002 #define kbKP3           (kmKeyPad | '3')        /* C-only */
1003 #define kbKP4           (kmKeyPad | '4')        /* C-only */
1004 #define kbKP5           (kmKeyPad | '5')        /* C-only */
1005 #define kbKP6           (kmKeyPad | '6')        /* C-only */
1006 #define kbKP7           (kmKeyPad | '7')        /* C-only */
1007 #define kbKP8           (kmKeyPad | '8')        /* C-only */
1008 #define kbKP9           (kmKeyPad | '9')        /* C-only */
1009 
1010 /* Other virtual keys */
1011 #define kbClear         0x00040100
1012 KB(Clear)
1013 #define kbPause         0x00040200
1014 #ifdef Pause
1015 #undef Pause
1016 #endif
1017 KB(Pause)
1018 #define kbSysRq         0x00040300
1019 KB(SysRq)
1020 #define kbSysReq        kbSysRq
1021 KB(SysReq)
1022 #define kbDelete        0x00040400
1023 KB(Delete)
1024 #define kbKPDelete      (kmKeyPad | kbDelete)   /* C-only */
1025 #define kbHome          0x00040500
1026 KB(Home)
1027 #define kbKPHome        (kmKeyPad | kbHome)     /* C-only */
1028 #define kbLeft          0x00040600
1029 KB(Left)
1030 #define kbKPLeft        (kmKeyPad | kbLeft)     /* C-only */
1031 #define kbUp            0x00040700
1032 KB(Up)
1033 #define kbKPUp          (kmKeyPad | kbUp)       /* C-only */
1034 #define kbRight         0x00040800
1035 KB(Right)
1036 #define kbKPRight       (kmKeyPad | kbRight)    /* C-only */
1037 #define kbDown          0x00040900
1038 KB(Down)
1039 #define kbKPDown        (kmKeyPad | kbDown)     /* C-only */
1040 #define kbPgUp          0x00040a00
1041 KB(PgUp)
1042 #define kbPrior         kbPgUp
1043 KB(Prior)
1044 #define kbPageUp        kbPgUp
1045 KB(PageUp)
1046 #define kbKPPgUp        (kmKeyPad | kbPgUp)     /* C-only */
1047 #define kbKPPrior       kbKPPgUp                /* C-only */
1048 #define kbKPPageUp      kbKPPgUp                /* C-only */
1049 #define kbPgDn          0x00040b00
1050 KB(PgDn)
1051 #define kbNext          kbPgDn
1052 KB(Next)
1053 #define kbPageDown      kbPgDn
1054 KB(PageDown)
1055 #define kbKPPgDn        (kmKeyPad | kbPgDn)     /* C-only */
1056 #define kbKPNext        kbKPPgDn                /* C-only */
1057 #define kbKPPageDown    kbKPPgDn                /* C-only */
1058 #define kbEnd           0x00040c00
1059 KB(End)
1060 #define kbKPEnd         (kmKeyPad | kbEnd)      /* C-only */
1061 #define kbBegin         0x00040d00
1062 KB(Begin)
1063 #define kbKPBegin       (kmKeyPad | kbBegin)    /* C-only */
1064 #define kbSelect        0x00040e00
1065 KB(Select)
1066 #define kbPrint         0x00040f00
1067 KB(Print)
1068 #define kbPrintScr      kbPrint
1069 KB(PrintScr)
1070 #define kbExecute       0x00041000
1071 KB(Execute)
1072 #define kbInsert        0x00041100
1073 KB(Insert)
1074 #define kbKPInsert      (kmKeyPad | kbInsert)   /* C-only */
1075 #define kbUndo          0x00041200
1076 KB(Undo)
1077 #define kbRedo          0x00041300
1078 KB(Redo)
1079 #define kbMenu          0x00041400
1080 KB(Menu)
1081 #define kbFind          0x00041500
1082 KB(Find)
1083 #define kbCancel        0x00041600
1084 KB(Cancel)
1085 #define kbHelp          0x00041700
1086 KB(Help)
1087 #define kbBreak         0x00041800
1088 KB(Break)
1089 #define kbBackTab       0x00041900
1090 KB(BackTab)
1091 
1092 /* Virtual function keys */
1093 #define kbF1            0x00080100
1094 KB(F1)
1095 #define kbKPF1          (kmKeyPad | kbF1)       /* C-only */
1096 #define kbF2            0x00080200
1097 KB(F2)
1098 #define kbKPF2          (kmKeyPad | kbF2)       /* C-only */
1099 #define kbF3            0x00080300
1100 KB(F3)
1101 #define kbKPF3          (kmKeyPad | kbF3)       /* C-only */
1102 #define kbF4            0x00080400
1103 KB(F4)
1104 #define kbKPF4          (kmKeyPad | kbF4)       /* C-only */
1105 #define kbF5            0x00080500
1106 KB(F5)
1107 #define kbF6            0x00080600
1108 KB(F6)
1109 #define kbF7            0x00080700
1110 KB(F7)
1111 #define kbF8            0x00080800
1112 KB(F8)
1113 #define kbF9            0x00080900
1114 KB(F9)
1115 #define kbF10           0x00080a00
1116 KB(F10)
1117 #define kbF11           0x00080b00
1118 KB(F11)
1119 #define kbL1            kbF11
1120 KB(L1)
1121 #define kbF12           0x00080c00
1122 KB(F12)
1123 #define kbL2            kbF12
1124 KB(L2)
1125 #define kbF13           0x00080d00
1126 KB(F13)
1127 #define kbL3            kbF13
1128 KB(L3)
1129 #define kbF14           0x00080e00
1130 KB(F14)
1131 #define kbL4            kbF14
1132 KB(L4)
1133 #define kbF15           0x00080f00
1134 KB(F15)
1135 #define kbL5            kbF15
1136 KB(L5)
1137 #define kbF16           0x00081000
1138 KB(F16)
1139 #define kbL6            kbF16
1140 KB(L6)
1141 #define kbF17           0x00081100
1142 KB(F17)
1143 #define kbL7            kbF17
1144 KB(L7)
1145 #define kbF18           0x00081200
1146 KB(F18)
1147 #define kbL8            kbF18
1148 KB(L8)
1149 #define kbF19           0x00081300
1150 KB(F19)
1151 #define kbL9            kbF19
1152 KB(L9)
1153 #define kbF20           0x00081400
1154 KB(F20)
1155 #define kbL10           kbF20
1156 KB(L10)
1157 #define kbF21           0x00081500
1158 KB(F21)
1159 #define kbR1            kbF21
1160 KB(R1)
1161 #define kbF22           0x00081600
1162 KB(F22)
1163 #define kbR2            kbF22
1164 KB(R2)
1165 #define kbF23           0x00081700
1166 KB(F23)
1167 #define kbR3            kbF23
1168 KB(R3)
1169 #define kbF24           0x00081800
1170 KB(F24)
1171 #define kbR4            kbF24
1172 KB(R4)
1173 #define kbF25           0x00081900
1174 KB(F25)
1175 #define kbR5            kbF25
1176 KB(R5)
1177 #define kbF26           0x00081a00
1178 KB(F26)
1179 #define kbR6            kbF26
1180 KB(R6)
1181 #define kbF27           0x00081b00
1182 KB(F27)
1183 #define kbR7            kbF27
1184 KB(R7)
1185 #define kbF28           0x00081c00
1186 KB(F28)
1187 #define kbR8            kbF28
1188 KB(R8)
1189 #define kbF29           0x00081d00
1190 KB(F29)
1191 #define kbR9            kbF29
1192 KB(R9)
1193 #define kbF30           0x00081e00
1194 KB(F30)
1195 #define kbR10           kbF30
1196 KB(R10)
1197 END_TABLE(kb,UV)
1198 #undef KB
1199 
1200 #define TA(const_name) CONSTANT(ta,const_name)
1201 START_TABLE(ta,UV)
1202 #define taLeft      1
1203 TA(Left)
1204 #define taRight     2
1205 TA(Right)
1206 #define taCenter    3
1207 TA(Center)
1208 #define taTop       4
1209 TA(Top)
1210 #define taBottom    8
1211 TA(Bottom)
1212 #define taMiddle    12
1213 TA(Middle)
1214 END_TABLE(ta,UV)
1215 #undef TA
1216 
1217 /* Please, please, PLEASE!  Do not use directly! */
1218 
1219 typedef struct _VmtPatch
1220 {
1221 	void *vmtAddr;
1222 	void *procAddr;
1223 	const char *name;
1224 } VmtPatch;
1225 
1226 typedef struct _VMT {         /* Whatever VMT */
1227 	char *className;
1228 	struct _VMT *super;
1229 	struct _VMT *base;
1230 	int instanceSize;
1231 	VmtPatch *patch;
1232 	int patchLength;
1233 	int vmtSize;
1234 } VMT, *PVMT;
1235 
1236 typedef struct _AnyObject {   /* Whatever Object */
1237 	PVMT self;
1238 	PVMT *super;
1239 	SV   *mate;
1240 	struct _AnyObject *killPtr;
1241 } AnyObject, *PAnyObject;
1242 
1243 extern FillPattern fillPatterns[];
1244 
1245 /* gencls rtl support */
1246 
1247 #define C_NUMERIC_UNDEF   -90909090
1248 #define C_STRING_UNDEF    "__C_CHAR_UNDEF__"
1249 #define C_POINTER_UNDEF   NULL_SV
1250 
1251 /* run-time class information functions */
1252 
1253 extern Bool
1254 kind_of( Handle object, void *cls);
1255 
1256 /* perl links */
1257 
1258 extern I32
1259 clean_perl_call_method( char* methname, I32 flags);
1260 
1261 extern I32
1262 clean_perl_call_pv( char* subname, I32 flags);
1263 
1264 extern void
1265 build_static_vmt( void *vmt);
1266 
1267 extern Bool
1268 build_dynamic_vmt( void *vmt, const char *ancestorName, int ancestorVmtSize);
1269 
1270 extern PVMT
1271 gimme_the_vmt( const char *className);
1272 
1273 extern Handle
1274 gimme_the_mate( SV *perlObject);
1275 
1276 extern Handle
1277 gimme_the_real_mate( SV *perlObject);
1278 
1279 extern Handle
1280 create_mate( SV *perlObject);
1281 
1282 extern SV*
1283 eval( char* string);
1284 
1285 extern CV*
1286 sv_query_method( SV * object, char *methodName, Bool cacheIt);
1287 
1288 extern CV*
1289 query_method( Handle object, char *methodName, Bool cacheIt);
1290 
1291 extern SV*
1292 call_perl_indirect( Handle self, char *subName, const char *format,
1293 						Bool cdecl, Bool coderef, va_list params);
1294 
1295 extern SV*
1296 call_perl( Handle self, char *subName, const char *format, ...);
1297 
1298 extern SV*
1299 sv_call_perl( SV * mate, char *subName, const char *format, ...);
1300 
1301 extern SV*
1302 notify_perl( Handle self, char *methodName, const char *format, ...);
1303 
1304 extern SV*
1305 cv_call_perl( SV * mate, SV * coderef, const char *format, ...);
1306 
1307 extern Handle
1308 Object_create( char * className, HV * profile);
1309 
1310 extern void
1311 Object_destroy( Handle self);
1312 
1313 extern void
1314 protect_object( Handle obj);
1315 
1316 extern void
1317 unprotect_object( Handle obj);
1318 
1319 extern void
1320 prima_refcnt_inc( Handle obj);
1321 
1322 extern void
1323 prima_refcnt_dec( Handle obj);
1324 
1325 extern void
1326 prima_kill_zombies( void);
1327 
1328 /*
1329 exception_* functions are solely needed as a workaround of a Win64 bug when running 32-bit programs.
1330 It can be manifested when a perl code dies in f.ex. onPaint, and the triggered longjmp is
1331 expected to land somewhere in perl guts. Except it doesn't, and the next 32-bit executed code
1332 is right after DispatchMessage.
1333 
1334 Discussion on stackoverflow here:
1335 http://stackoverflow.com/questions/32525561/64-bit-windows-longjmp-lands-in-a-wrong-place
1336 */
1337 
1338 extern void
1339 exception_remember( char * text);
1340 
1341 extern Bool
1342 exception_charged( void );
1343 
1344 extern Bool
1345 exception_block( Bool block );
1346 
1347 extern void
1348 exception_check_raise( void );
1349 
1350 #ifdef PRIMA_PLATFORM_X11
1351 #define EXCEPTION_CHECK_RAISE exception_check_raise()
1352 #else
1353 #define EXCEPTION_CHECK_RAISE if ( exception_charged()) return
1354 #endif
1355 
1356 
1357 extern HV*
1358 parse_hv( I32 ax, SV **sp, I32 items, SV **mark,
1359 			int expected, const char *methodName);
1360 
1361 extern void
1362 push_hv( I32 ax, SV **sp, I32 items, SV **mark, int callerReturns, HV *hv);
1363 
1364 extern SV**
1365 push_hv_for_REDEFINED( SV **sp, HV *hv);
1366 
1367 extern int
1368 pop_hv_for_REDEFINED( SV **sp, int count, HV *hv, int shouldBe);
1369 
1370 extern void
1371 perl_error(void);
1372 
1373 extern void*
1374 create_object( const char *objClass, const char *types, ...);
1375 
1376 #ifdef __GNUC__
1377 #define SvBOOL(sv) ({ SV *svsv = sv; SvTRUE(svsv);})
1378 #else
1379 __INLINE__ Bool
SvBOOL(SV * sv)1380 SvBOOL( SV *sv)
1381 {
1382 	return SvTRUE(sv);
1383 }
1384 #endif
1385 
1386 #define pexist( key) hv_exists( profile, # key, (I32) strlen( #key))
1387 #define pdelete( key) (void) hv_delete( profile, # key, (I32) strlen( #key), G_DISCARD)
1388 #define dPROFILE  SV ** temporary_prf_Sv
1389 #define pget_sv( key) ((( temporary_prf_Sv = hv_fetch( profile, # key, (I32) strlen( # key), 0)) == nil) ? \
1390 	croak( "Panic: bad profile key (``%s'') requested in ``%s'', line %d\n", # key, __FILE__, __LINE__ ), &PL_sv_undef : *temporary_prf_Sv)
1391 #define pget_sv_void( key) ((( temporary_prf_Sv = hv_fetch( profile, # key, (I32) strlen( # key), 0)) == nil) ? \
1392 	croak( "Panic: bad profile key (``%s'') requested in ``%s'', line %d\n", # key, __FILE__, __LINE__ ) : (void)NULL)
1393 #define pget_i( key)  ( pget_sv_void( key), SvIV( *temporary_prf_Sv))
1394 #define pget_f( key)  ( pget_sv_void( key), SvNV( *temporary_prf_Sv))
1395 #define pget_c( key)  ( pget_sv_void( key), SvPV_nolen( *temporary_prf_Sv))
1396 #define pget_H( key)  gimme_the_mate( pget_sv( key))
1397 #define pget_B( key)  ( SvTRUE( pget_sv( key)))
1398 
1399 #define pset_sv_noinc( key, value) (void)hv_store( profile, # key, (I32) strlen( # key), value, 0)
1400 #define pset_sv( key, value) pset_sv_noinc( key, newSVsv( value))
1401 #define pset_i( key, value)  pset_sv_noinc( key, newSViv( value))
1402 #define pset_f( key, value)  pset_sv_noinc( key, newSVnv( value))
1403 #define pset_c( key, value)  pset_sv_noinc( key, newSVpv( value, 0))
1404 #define pset_b( key, value, len)  pset_sv_noinc( key, newSVpv( value, ( len)))
1405 #define pset_H( key, value)  pset_sv_noinc( key, (value) ? newSVsv((( PAnyObject) (value))-> mate) : NULL_SV)
1406 
1407 #define create_instance( obj)  (                                   \
1408 	temporary_prf_Sv = ( SV **) Object_create( obj, profile),       \
1409 	( temporary_prf_Sv ?                                            \
1410 		--SvREFCNT( SvRV((( PAnyObject) temporary_prf_Sv)-> mate))  \
1411 		: 0),                                                       \
1412 	( Handle) temporary_prf_Sv                                      \
1413 	)
1414 
1415 #ifdef POLLUTE_NAME_SPACE
1416 #define TransmogrifyHandle(c,h)         ((P##c)(h))
1417 #define PAbstractMenu(h)                TransmogrifyHandle(AbstractMenu,(h))
1418 #define CAbstractMenu(h)                (PAbstractMenu(h)->self)
1419 #define PApplication(h)                 TransmogrifyHandle(Application,(h))
1420 #define CApplication(h)                 (PApplication(h)-> self)
1421 #define PComponent(h)                   TransmogrifyHandle(Component,(h))
1422 #define CComponent(h)                   (PComponent(h)-> self)
1423 #define PClipboard(h)                   TransmogrifyHandle(Clipboard,(h))
1424 #define CClipboard(h)                   (PClipboard(h)-> self)
1425 #define PDrawable(h)                    TransmogrifyHandle(Drawable,(h))
1426 #define CDrawable(h)                    (PDrawable(h)-> self)
1427 #define PFile(h)                        TransmogrifyHandle(File,(h))
1428 #define CFile(h)                        (PFile(h)-> self)
1429 #define PIcon(h)                        TransmogrifyHandle(Icon,(h))
1430 #define CIcon(h)                        (PIcon(h)-> self)
1431 #define PImage(h)                       TransmogrifyHandle(Image,(h))
1432 #define CImage(h)                       (PImage(h)-> self)
1433 #define PObject(h)                      TransmogrifyHandle(Object,(h))
1434 #define CObject(h)                      (PObject(h)-> self)
1435 #define PMenu(h)                        TransmogrifyHandle(Menu,(h))
1436 #define CMenu(h)                        (PMenu(h)-> self)
1437 #define PPopup(h)                       TransmogrifyHandle(Popup,(h))
1438 #define CPopup(h)                       (PPopup(h)-> self)
1439 #define PPrinter(h)                     TransmogrifyHandle(Printer,(h))
1440 #define CPrinter(h)                     (PPrinter(h)-> self)
1441 #define PRegion(h)                      TransmogrifyHandle(Region,(h))
1442 #define CRegion(h)                      (PRegion(h)-> self)
1443 #define PTimer(h)                       TransmogrifyHandle(Timer,(h))
1444 #define CTimer(h)                       (PTimer(h)-> self)
1445 #define PWidget(h)                      TransmogrifyHandle(Widget,(h))
1446 #define CWidget(h)                      (PWidget(h)-> self)
1447 #define PWindow(h)                      TransmogrifyHandle(Window,(h))
1448 #define CWindow(h)                      (PWindow(h)-> self)
1449 #endif
1450 
1451 /* mapping functions */
1452 
1453 #define endCtx          0x19740108
1454 
1455 extern Handle
1456 ctx_remap_def ( Handle value, Handle * table, Bool direct, Handle default_value);
1457 
1458 #define ctx_remap_end(a,b,c)    ctx_remap_def((a),(b),(c), endCtx)
1459 #define ctx_remap(a,b,c)        ctx_remap_def((a),(b),(c), 0)
1460 
1461 /* utility functions */
1462 
1463 extern char *
1464 duplicate_string( const char *);
1465 
1466 /* lists support */
1467 
1468 typedef Bool ListProc ( Handle item, void * params);
1469 typedef ListProc *PListProc;
1470 
1471 extern void
1472 list_create( PList self, int size, int delta);
1473 
1474 extern PList
1475 plist_create( int size, int delta);
1476 
1477 extern PList
1478 plist_dup( PList self );
1479 
1480 extern void
1481 list_destroy( PList self);
1482 
1483 extern void
1484 plist_destroy( PList self);
1485 
1486 extern int
1487 list_add( PList self, Handle item);
1488 
1489 extern int
1490 list_insert_at( PList self, Handle item, int pos);
1491 
1492 extern Handle
1493 list_at( PList self, int index);
1494 
1495 extern void
1496 list_delete( PList self, Handle item);
1497 
1498 extern void
1499 list_delete_at( PList self, int index);
1500 
1501 extern void
1502 list_delete_all( PList self, Bool kill);
1503 
1504 extern int
1505 list_first_that( PList self, void * action, void * params);
1506 
1507 extern int
1508 list_index_of( PList self, Handle item);
1509 
1510 /* utf8 */
1511 extern int
1512 prima_utf8_length( const char * utf8, int length);
1513 
1514 extern Bool
1515 prima_is_utf8_sv( SV * sv);
1516 
1517 extern SV*
1518 prima_svpv_utf8( const char *text, int is_utf8);
1519 
1520 extern FILE*
1521 prima_open_file( const char *text, Bool is_utf8, const char * mode);
1522 
1523 #if PERL_PATCHLEVEL >= 16
1524 #define prima_utf8_uvchr(_text, _textlen, _charlen) \
1525 	utf8_to_uvchr_buf(( U8*)(_text), (U8*)(_text) + (_textlen), _charlen)
1526 #define prima_utf8_uvchr_end(_text, _end, _charlen) \
1527 	utf8_to_uvchr_buf(( U8*)(_text), (U8*)(_end), _charlen)
1528 #else
1529 #define prima_utf8_uvchr(_text, _textlen, _charlen) \
1530 	utf8_to_uvchr(( U8*)(_text), _charlen)
1531 #define prima_utf8_uvchr_end prima_utf8_uvchr
1532 #endif
1533 
1534 extern SV *
1535 prima_array_new( size_t size);
1536 
1537 #define prima_array_get_storage(array) SvPVX(array)
1538 
1539 extern void
1540 prima_array_truncate( SV * array, size_t length );
1541 
1542 extern SV *
1543 prima_array_tie( SV * array, size_t size_of_entry, char * letter);
1544 
1545 extern Bool
1546 prima_array_parse( SV * sv, void ** ref, size_t * length, char ** letter);
1547 
1548 extern Bool
1549 prima_read_point( SV *rv_av, int * pt, int number, char * error);
1550 
1551 extern void *
1552 prima_read_array( SV * points, char * procName, char type, int div, int min, int max, int * n_points, Bool * do_free);
1553 
1554 /* OS types */
1555 #define APC(const_name) CONSTANT(apc,const_name)
1556 START_TABLE(apc,UV)
1557 #define apcWin32                2
1558 APC(Win32)
1559 #define apcUnix                 3
1560 APC(Unix)
1561 END_TABLE(apc,UV)
1562 #undef APC
1563 
1564 /* GUI types */
1565 #define GUI(const_name) CONSTANT(gui,const_name)
1566 START_TABLE(gui,UV)
1567 #define guiDefault              0
1568 GUI(Default)
1569 #define guiPM                   1
1570 GUI(PM)
1571 #define guiWindows              2
1572 GUI(Windows)
1573 #define guiXLib                 3
1574 GUI(XLib)
1575 #define guiGTK2                 4 /* back-compat */
1576 #define guiGTK                  4
1577 GUI(GTK2)
1578 GUI(GTK)
1579 END_TABLE(gui,UV)
1580 #undef GUI
1581 
1582 /* drives types (for platforms which have 'em) */
1583 /* also, text justification constants for draw_text */
1584 #define DT(const_name) CONSTANT(dt,const_name)
1585 START_TABLE(dt,UV)
1586 #define dtUnknown               0
1587 DT(Unknown)
1588 #define dtNone                  1
1589 DT(None)
1590 #define dtFloppy                2
1591 DT(Floppy)
1592 #define dtHDD                   3
1593 DT(HDD)
1594 #define dtNetwork               4
1595 DT(Network)
1596 #define dtCDROM                 5
1597 DT(CDROM)
1598 #define dtMemory                6
1599 DT(Memory)
1600 
1601 #define dtLeft                     0x00000
1602 DT(Left)
1603 #define dtRight                    0x00001
1604 DT(Right)
1605 #define dtCenter                   0x00002
1606 DT(Center)
1607 #define dtTop                      0x00000
1608 DT(Top)
1609 #define dtBottom                   0x00004
1610 DT(Bottom)
1611 #define dtVCenter                  0x00008
1612 DT(VCenter)
1613 #define dtDrawMnemonic             0x00010
1614 DT(DrawMnemonic)
1615 #define dtDrawSingleChar           0x00020
1616 DT(DrawSingleChar)
1617 #define dtDrawPartial              0x00040
1618 DT(DrawPartial)
1619 #define dtNewLineBreak             0x00080
1620 DT(NewLineBreak)
1621 #define dtSpaceBreak               0x00100
1622 DT(SpaceBreak)
1623 #define dtWordBreak                0x00200
1624 DT(WordBreak)
1625 #define dtExpandTabs               0x00400
1626 DT(ExpandTabs)
1627 #define dtUseExternalLeading       0x00800
1628 DT(UseExternalLeading)
1629 #define dtUseClip                  0x01000
1630 DT(UseClip)
1631 #define dtQueryHeight              0x02000
1632 DT(QueryHeight)
1633 #define dtQueryLinesDrawn          0x00000
1634 DT(QueryLinesDrawn)
1635 #define dtNoWordWrap               0x04000
1636 DT(NoWordWrap)
1637 #define dtWordWrap                 0x00000
1638 DT(WordWrap)
1639 #define dtDefault                  (dtNewLineBreak|dtWordBreak|dtExpandTabs|dtUseExternalLeading)
1640 DT(Default)
1641 
1642 END_TABLE(dt,UV)
1643 #undef DT
1644 
1645 /* apc error constants */
1646 #define errOk                    0x0000
1647 #define errApcError              0x0001
1648 #define errInvObject             0x0002
1649 #define errInvParams             0x0003
1650 #define errInvWindowIcon         0x0100
1651 #define errInvClipboardData      0x0101
1652 #define errInvPrinter            0x0102
1653 #define errNoPrinters            0x0103
1654 #define errUserCancelled         0x0104
1655 
1656 
1657 /* system-independent object option flags */
1658 typedef struct _ObjectOptions_ {
1659 	unsigned optInDestroyList       : 1;   /* Object */
1660 	unsigned optcmDestroy           : 1;   /* Component */
1661 	unsigned optUTF8_name           : 1;
1662 	unsigned optInDraw              : 1;   /* Drawable */
1663 	unsigned optInDrawInfo          : 1;
1664 	unsigned optTextOutBaseLine     : 1;
1665 	unsigned optSystemDrawable      : 1;
1666 	unsigned optAutoEnableChildren  : 1;   /* Widget */
1667 	unsigned optBriefKeys           : 1;
1668 	unsigned optBuffered            : 1;
1669 	unsigned optDropSession         : 1;
1670 	unsigned optModalHorizon        : 1;
1671 	unsigned optOwnerBackColor      : 1;
1672 	unsigned optOwnerColor          : 1;
1673 	unsigned optOwnerFont           : 1;
1674 	unsigned optOwnerHint           : 1;
1675 	unsigned optOwnerShowHint       : 1;
1676 	unsigned optOwnerPalette        : 1;
1677 	unsigned optPackPropagate       : 1;
1678 	unsigned optSetupComplete       : 1;
1679 	unsigned optSelectable          : 1;
1680 	unsigned optShowHint            : 1;
1681 	unsigned optSystemSelectable    : 1;
1682 	unsigned optTabStop             : 1;
1683 	unsigned optScaleChildren       : 1;
1684 	unsigned optUTF8_helpContext    : 1;
1685 	unsigned optPreserveType        : 1;   /* Image */
1686 	unsigned optAutoPopup           : 1;   /* Popup */
1687 	unsigned optActive              : 1;   /* Timer */
1688 	unsigned optOwnerIcon           : 1;   /* Window */
1689 	unsigned optMainWindow          : 1;
1690 	unsigned optDirtyRegion         : 1;   /* Region */
1691 } ObjectOptions;
1692 
1693 #define opt_set( option)           (PObject(self)-> options. option = 1)
1694 #define opt_clear( option)         (PObject(self)-> options. option = 0)
1695 #define is_opt( option)            (PObject(self)-> options. option)
1696 #define opt_assign( option, value) (PObject(self)->options. option = (value) ? 1 : 0)
1697 #define opt_InPaint                ( is_opt( optInDraw) || is_opt( optInDrawInfo))
1698 
1699 /* apc class constants */
1700 #define WC(const_name) CONSTANT(wc,const_name)
1701 START_TABLE(wc,UV)
1702 #define wcUndef               0x0000000
1703 WC(Undef)
1704 #define wcButton              0x0010000
1705 WC(Button)
1706 #define wcCheckBox            0x0020000
1707 WC(CheckBox)
1708 #define wcCombo               0x0030000
1709 WC(Combo)
1710 #define wcDialog              0x0040000
1711 WC(Dialog)
1712 #define wcEdit                0x0050000
1713 WC(Edit)
1714 #define wcInputLine           0x0060000
1715 WC(InputLine)
1716 #define wcLabel               0x0070000
1717 WC(Label)
1718 #define wcListBox             0x0080000
1719 WC(ListBox)
1720 #define wcMenu                0x0090000
1721 WC(Menu)
1722 #define wcPopup               0x00A0000
1723 WC(Popup)
1724 #define wcRadio               0x00B0000
1725 WC(Radio)
1726 #define wcScrollBar           0x00C0000
1727 WC(ScrollBar)
1728 #define wcSlider              0x00D0000
1729 WC(Slider)
1730 #define wcWidget              0x00E0000
1731 WC(Widget)
1732 #define wcCustom              wcWidget
1733 WC(Custom)
1734 #define wcWindow              0x00F0000
1735 WC(Window)
1736 #define wcApplication         0x0100000
1737 WC(Application)
1738 #define wcMask                0xFFF0000
1739 WC(Mask)
1740 END_TABLE(wc,UV)
1741 #undef WC
1742 
1743 /* geometry manager types */
1744 #define GT(const_name) CONSTANT(gt,const_name)
1745 START_TABLE(gt,UV)
1746 #define gtDefault          0
1747 GT(Default)
1748 #define gtGrowMode         0
1749 GT(GrowMode)
1750 #define gtPack             1
1751 GT(Pack)
1752 #define gtPlace            2
1753 GT(Place)
1754 #define gtMax              2
1755 GT(Max)
1756 END_TABLE(gt,UV)
1757 #undef GT
1758 
1759 /* widget grow constats */
1760 #define GM(const_name) CONSTANT(gm,const_name)
1761 START_TABLE(gm,UV)
1762 #define gmGrowLoX             0x001
1763 GM(GrowLoX)
1764 #define gmGrowLoY             0x002
1765 GM(GrowLoY)
1766 #define gmGrowHiX             0x004
1767 GM(GrowHiX)
1768 #define gmGrowHiY             0x008
1769 GM(GrowHiY)
1770 #define gmGrowAll             0x00F
1771 GM(GrowAll)
1772 #define gmXCenter             0x010
1773 GM(XCenter)
1774 #define gmYCenter             0x020
1775 GM(YCenter)
1776 #define gmCenter              (gmXCenter|gmYCenter)
1777 GM(Center)
1778 #define gmDontCare            0x040
1779 GM(DontCare)
1780 /* shortcuts */
1781 #define gmClient              (gmGrowHiX|gmGrowHiY)
1782 GM(Client)
1783 #define gmRight               (gmGrowLoX|gmGrowHiY)
1784 GM(Right)
1785 #define gmLeft                gmGrowHiY
1786 GM(Left)
1787 #define gmFloor               gmGrowHiX
1788 GM(Floor)
1789 #define gmCeiling             (gmGrowHiX|gmGrowLoY)
1790 GM(Ceiling)
1791 END_TABLE(gm,UV)
1792 #undef GM
1793 
1794 /* border icons */
1795 #define BI(const_name) CONSTANT(bi,const_name)
1796 START_TABLE(bi,UV)
1797 #define    biSystemMenu    1
1798 BI(SystemMenu)
1799 #define    biMinimize      2
1800 BI(Minimize)
1801 #define    biMaximize      4
1802 BI(Maximize)
1803 #define    biTitleBar      8
1804 BI(TitleBar)
1805 #define    biAll           (biSystemMenu|biMinimize|biMaximize|biTitleBar)
1806 BI(All)
1807 END_TABLE(bi,UV)
1808 #undef BI
1809 
1810 /* border styles */
1811 #define BS(const_name) CONSTANT(bs,const_name)
1812 START_TABLE(bs,UV)
1813 #define   bsNone           0
1814 BS(None)
1815 #define   bsSizeable       1
1816 BS(Sizeable)
1817 #define   bsSingle         2
1818 BS(Single)
1819 #define   bsDialog         3
1820 BS(Dialog)
1821 END_TABLE(bs,UV)
1822 #undef BS
1823 
1824 /* window states */
1825 #define WS(const_name) CONSTANT(ws,const_name)
1826 START_TABLE(ws,UV)
1827 #define   wsNormal         0
1828 WS(Normal)
1829 #define   wsMinimized      1
1830 WS(Minimized)
1831 #define   wsMaximized      2
1832 WS(Maximized)
1833 END_TABLE(ws,UV)
1834 #undef WS
1835 
1836 /* z-order query constants */
1837 #define   zoFirst          0
1838 #define   zoLast           1
1839 #define   zoNext           2
1840 #define   zoPrev           3
1841 
1842 /* paint state values */
1843 #define PS(const_name) CONSTANT(ps,const_name)
1844 START_TABLE(ps,UV)
1845 #define   psDisabled        0
1846 PS(Disabled)
1847 #define   psEnabled         1
1848 PS(Enabled)
1849 #define   psInformation     2
1850 PS(Information)
1851 END_TABLE(ps,UV)
1852 #undef PS
1853 
1854 /* system values */
1855 #define SV(const_name) CONSTANT(sv,const_name)
1856 START_TABLE(sv,UV)
1857 #define   svYMenu           0
1858 SV(YMenu)
1859 #define   svYTitleBar       1
1860 SV(YTitleBar)
1861 #define   svXIcon           2
1862 SV(XIcon)
1863 #define   svYIcon           3
1864 SV(YIcon)
1865 #define   svXSmallIcon      4
1866 SV(XSmallIcon)
1867 #define   svYSmallIcon      5
1868 SV(YSmallIcon)
1869 #define   svXPointer        6
1870 SV(XPointer)
1871 #define   svYPointer        7
1872 SV(YPointer)
1873 #define   svXScrollbar      8
1874 SV(XScrollbar)
1875 #define   svYScrollbar      9
1876 SV(YScrollbar)
1877 #define   svXCursor         10
1878 SV(XCursor)
1879 #define   svAutoScrollFirst 11
1880 SV(AutoScrollFirst)
1881 #define   svAutoScrollNext  12
1882 SV(AutoScrollNext)
1883 #define   svInsertMode      13
1884 SV(InsertMode)
1885 #define   svXbsNone         14
1886 SV(XbsNone)
1887 #define   svYbsNone         15
1888 SV(YbsNone)
1889 #define   svXbsSizeable     16
1890 SV(XbsSizeable)
1891 #define   svYbsSizeable     17
1892 SV(YbsSizeable)
1893 #define   svXbsSingle       18
1894 SV(XbsSingle)
1895 #define   svYbsSingle       19
1896 SV(YbsSingle)
1897 #define   svXbsDialog       20
1898 SV(XbsDialog)
1899 #define   svYbsDialog       21
1900 SV(YbsDialog)
1901 #define   svMousePresent    22
1902 SV(MousePresent)
1903 #define   svMouseButtons    23
1904 SV(MouseButtons)
1905 #define   svWheelPresent    24
1906 SV(WheelPresent)
1907 #define   svSubmenuDelay    25
1908 SV(SubmenuDelay)
1909 #define   svFullDrag        26
1910 SV(FullDrag)
1911 #define   svDblClickDelay   27
1912 SV(DblClickDelay)
1913 #define   svShapeExtension  28
1914 SV(ShapeExtension)
1915 #define   svColorPointer    29
1916 SV(ColorPointer)
1917 #define   svCanUTF8_Input   30
1918 SV(CanUTF8_Input)
1919 #define   svCanUTF8_Output  31
1920 SV(CanUTF8_Output)
1921 #define   svCompositeDisplay 32
1922 SV(CompositeDisplay)
1923 #define   svLayeredWidgets  33
1924 SV(LayeredWidgets)
1925 #define   svFixedPointerSize 35
1926 SV(FixedPointerSize)
1927 #define   svMenuCheckSize   36
1928 SV(MenuCheckSize)
1929 #define   svFriBidi         37
1930 SV(FriBidi)
1931 #define   svAntialias       38
1932 SV(Antialias)
1933 END_TABLE(sv,UV)
1934 #undef SV
1935 
1936 extern Handle application;
1937 
1938 /* *****************
1939 *  apc functions   *
1940 ***************** */
1941 
1942 extern Handle
1943 apc_get_core_version(void);
1944 
1945 extern char *
1946 apc_last_error(void);
1947 
1948 extern Handle
1949 apc_get_application(void);
1950 
1951 /* Application management */
1952 extern Bool
1953 apc_application_begin_paint( Handle self);
1954 
1955 extern Bool
1956 apc_application_begin_paint_info( Handle self);
1957 
1958 extern Bool
1959 apc_application_create( Handle self);
1960 
1961 extern Bool
1962 apc_application_close( Handle self);
1963 
1964 extern Bool
1965 apc_application_destroy( Handle self);
1966 
1967 extern Bool
1968 apc_application_end_paint( Handle self);
1969 
1970 extern Bool
1971 apc_application_end_paint_info( Handle self);
1972 
1973 extern Bool
1974 apc_application_get_bitmap( Handle self, Handle image, int x, int y, int xLen, int yLen);
1975 
1976 extern int
1977 apc_application_get_gui_info( char * description, int len1, char * language, int len2);
1978 
1979 extern Handle
1980 apc_application_get_widget_from_point( Handle self, Point point);
1981 
1982 extern Handle
1983 apc_application_get_handle( Handle self, ApiHandle apiHandle);
1984 
1985 extern Rect
1986 apc_application_get_indents( Handle self);
1987 
1988 extern int
1989 apc_application_get_os_info( char *system, int slen,
1990 			char *release, int rlen,
1991 			char *vendor, int vlen,
1992 			char *arch, int alen);
1993 
1994 extern Point
1995 apc_application_get_size( Handle self);
1996 
1997 extern Box *
1998 apc_application_get_monitor_rects( Handle self, int * nrects);
1999 
2000 extern Bool
2001 apc_application_go( Handle self);
2002 
2003 extern Bool
2004 apc_application_lock( Handle self);
2005 
2006 extern Bool
2007 apc_application_stop( Handle self);
2008 
2009 extern Bool
2010 apc_application_sync( void);
2011 
2012 extern Bool
2013 apc_application_unlock( Handle self);
2014 
2015 extern Bool
2016 apc_application_yield( Bool wait_for_event );
2017 
2018 /* Component */
2019 extern Bool
2020 apc_component_create( Handle self);
2021 
2022 extern Bool
2023 apc_component_destroy( Handle self);
2024 
2025 extern Bool
2026 apc_component_fullname_changed_notify( Handle self);
2027 
2028 /* Window */
2029 extern Bool
2030 apc_window_create( Handle self, Handle owner, Bool syncPaint, int borderIcons, int borderStyle,
2031 	Bool taskList, int windowState, int onTop, Bool useOrigin, Bool useSize, Bool layered);
2032 
2033 extern Bool
2034 apc_window_activate( Handle self);
2035 
2036 extern Bool
2037 apc_window_is_active( Handle self);
2038 
2039 extern Bool
2040 apc_window_close( Handle self);
2041 
2042 extern Handle
2043 apc_window_get_active( void);
2044 
2045 extern int
2046 apc_window_get_border_icons( Handle self);
2047 
2048 extern int
2049 apc_window_get_border_style( Handle self);
2050 
2051 extern ApiHandle
2052 apc_window_get_client_handle( Handle self);
2053 
2054 extern Point
2055 apc_window_get_client_pos( Handle self);
2056 
2057 extern Point
2058 apc_window_get_client_size( Handle self);
2059 
2060 extern Bool
2061 apc_window_get_icon( Handle self, Handle icon);
2062 
2063 extern Bool
2064 apc_window_get_on_top( Handle self);
2065 
2066 extern int
2067 apc_window_get_window_state( Handle self);
2068 
2069 extern Bool
2070 apc_window_get_task_listed( Handle self);
2071 
2072 extern Bool
2073 apc_window_set_caption( Handle self, const char* caption, Bool utf8);
2074 
2075 extern Bool
2076 apc_window_set_client_pos( Handle self, int x, int y);
2077 
2078 extern Bool
2079 apc_window_set_client_rect( Handle self, int x, int y, int width, int height);
2080 
2081 extern Bool
2082 apc_window_set_client_size( Handle self, int x, int y);
2083 
2084 extern Bool
2085 apc_window_set_effects( Handle self, HV* effects );
2086 
2087 extern Bool
2088 apc_window_set_menu( Handle self, Handle menu);
2089 
2090 extern Bool
2091 apc_window_set_icon( Handle self, Handle icon);
2092 
2093 extern Bool
2094 apc_window_set_window_state( Handle self, int state);
2095 
2096 extern Bool
2097 apc_window_execute( Handle self, Handle insertBefore);
2098 
2099 extern Bool
2100 apc_window_execute_shared( Handle self, Handle insertBefore);
2101 
2102 extern Bool
2103 apc_window_end_modal( Handle self);
2104 
2105 
2106 /* Widget management */
2107 
2108 typedef struct {
2109 	/* common geometry fields */
2110 	Handle         next;           /* dynamically filled linked list of pack slaves */
2111 	Handle         in;             /* 'in' option */
2112 	/* pack */
2113 	Point          pad;            /* border padding */
2114 	Point          ipad;           /* size increaze */
2115 	Handle         order;          /* if non-nil, BEFORE or AFTER a widget */
2116 	/* place */
2117 	int x, y;
2118 	float relX, relY;
2119 	float relWidth, relHeight;
2120 
2121 	/* bitwise fields */
2122 	/* common */
2123 	unsigned int   anchorx    : 2; /* 0 - left, 1 - center, 2 - right */
2124 	unsigned int   anchory    : 2; /* 0 - bottom, 1 - center, 2 - top */
2125 	/* pack */
2126 	unsigned int   after      : 1; /* 0 - order is BEFORE; 1 - order is AFTER */
2127 	unsigned int   expand     : 1; /* causes the allocation rectange to fill all remaining space */
2128 	unsigned int   fillx      : 1; /* fill horizontal extent */
2129 	unsigned int   filly      : 1; /* fill vertical extent */
2130 	unsigned int   side       : 2; /* 0 - left, 1 - bottom, 2 - right, 3 - top */
2131 	/* place */
2132 	unsigned int   use_x      : 1;
2133 	unsigned int   use_y      : 1;
2134 	unsigned int   use_w      : 1;
2135 	unsigned int   use_h      : 1;
2136 	unsigned int   use_rx     : 1;
2137 	unsigned int   use_ry     : 1;
2138 	unsigned int   use_rw     : 1;
2139 	unsigned int   use_rh     : 1;
2140 } GeomInfo, *PGeomInfo;
2141 
2142 extern Bool
2143 apc_widget_create( Handle self, Handle owner, Bool syncPaint,
2144 	Bool clipOwner, Bool transparent, ApiHandle parentHandle, Bool layered);
2145 
2146 extern Bool
2147 apc_widget_begin_paint( Handle self, Bool insideOnPaint);
2148 
2149 extern Bool
2150 apc_widget_begin_paint_info( Handle self);
2151 
2152 extern Bool
2153 apc_widget_destroy( Handle self);
2154 
2155 extern PFont
2156 apc_widget_default_font( PFont copyTo);
2157 
2158 extern Bool
2159 apc_widget_end_paint( Handle self);
2160 
2161 extern Bool
2162 apc_widget_end_paint_info( Handle self);
2163 
2164 extern Bool
2165 apc_widget_get_clip_by_children( Handle self);
2166 
2167 extern Bool
2168 apc_widget_get_clip_owner( Handle self);
2169 
2170 extern Color
2171 apc_widget_get_color( Handle self, int index);
2172 
2173 extern Bool
2174 apc_widget_get_first_click( Handle self);
2175 
2176 extern Handle
2177 apc_widget_get_focused( void);
2178 
2179 extern ApiHandle
2180 apc_widget_get_handle( Handle self);
2181 
2182 extern Rect
2183 apc_widget_get_invalid_rect( Handle self);
2184 
2185 extern Bool
2186 apc_widget_get_layered_request( Handle self);
2187 
2188 extern Handle
2189 apc_widget_get_z_order( Handle self, int zOrderId);
2190 
2191 extern ApiHandle
2192 apc_widget_get_parent_handle( Handle self);
2193 
2194 extern Point
2195 apc_widget_get_pos( Handle self);
2196 
2197 extern Bool
2198 apc_widget_get_shape( Handle self, Handle mask);
2199 
2200 extern Point
2201 apc_widget_get_size( Handle self);
2202 
2203 extern Bool
2204 apc_widget_get_sync_paint( Handle self);
2205 
2206 extern Bool
2207 apc_widget_get_transparent( Handle self);
2208 
2209 extern Bool
2210 apc_widget_is_captured( Handle self);
2211 
2212 extern Bool
2213 apc_widget_is_enabled( Handle self);
2214 
2215 extern Bool
2216 apc_widget_is_exposed( Handle self);
2217 
2218 extern Bool
2219 apc_widget_is_focused( Handle self);
2220 
2221 extern Bool
2222 apc_widget_surface_is_layered( Handle self);
2223 
2224 extern Bool
2225 apc_widget_is_responsive( Handle self);
2226 
2227 extern Bool
2228 apc_widget_is_showing( Handle self);
2229 
2230 extern Bool
2231 apc_widget_is_visible( Handle self);
2232 
2233 extern Bool
2234 apc_widget_invalidate_rect( Handle self, Rect * rect);
2235 
2236 extern Color
2237 apc_widget_map_color( Handle self, Color color);
2238 
2239 extern Bool
2240 apc_widget_map_points( Handle self, Bool toScreen, int count, Point * points);
2241 
2242 /* scroll results */
2243 #define SCR(const_name) CONSTANT(scr,const_name)
2244 START_TABLE(scr,UV)
2245 #define   scrError         0
2246 SCR(Error)
2247 #define   scrNoExpose      1
2248 SCR(NoExpose)
2249 #define   scrExpose        2
2250 SCR(Expose)
2251 END_TABLE(scr,UV)
2252 #undef BS
2253 
2254 extern int
2255 apc_widget_scroll( Handle self, int horiz, int vert,
2256 						Rect *confine, Rect *clip,
2257 						Bool scrollChildren);
2258 
2259 extern Bool
2260 apc_widget_set_capture( Handle self, Bool capture, Handle confineTo);
2261 
2262 extern Bool
2263 apc_widget_set_color( Handle self, Color color, int index);
2264 
2265 extern Bool
2266 apc_widget_set_clip_by_children( Handle self, Bool clip_by_children);
2267 
2268 extern Bool
2269 apc_widget_set_enabled( Handle self, Bool enable);
2270 
2271 extern Bool
2272 apc_widget_set_first_click( Handle self, Bool firstClick);
2273 
2274 extern Bool
2275 apc_widget_set_focused( Handle self);
2276 
2277 extern Bool
2278 apc_widget_set_font( Handle self, PFont font);
2279 
2280 extern Bool
2281 apc_widget_set_palette( Handle self);
2282 
2283 extern Bool
2284 apc_widget_set_pos( Handle self, int x, int y);
2285 
2286 extern Bool
2287 apc_widget_set_rect( Handle self, int x, int y, int width, int height);
2288 
2289 extern Bool
2290 apc_widget_set_shape( Handle self, Handle mask);
2291 
2292 extern Bool
2293 apc_widget_set_size( Handle self, int width, int height);
2294 
2295 extern Bool
2296 apc_widget_set_size_bounds( Handle self, Point min, Point max);
2297 
2298 extern Bool
2299 apc_widget_set_visible( Handle self, Bool show);
2300 
2301 extern Bool
2302 apc_widget_set_z_order( Handle self, Handle behind, Bool top);
2303 
2304 extern Bool
2305 apc_widget_update( Handle self);
2306 
2307 extern Bool
2308 apc_widget_validate_rect( Handle self, Rect rect);
2309 
2310 /* standard system pointers */
2311 #define CR(const_name) CONSTANT(cr,const_name)
2312 START_TABLE(cr,IV)
2313 #define crDefault      -1
2314 CR(Default)
2315 #define crArrow        0
2316 CR(Arrow)
2317 #define crText         1
2318 CR(Text)
2319 #define crWait         2
2320 CR(Wait)
2321 #define crSize         3
2322 CR(Size)
2323 #define crMove         4
2324 CR(Move)
2325 #define crSizeWest     5
2326 CR(SizeWest)
2327 #define crSizeW        crSizeWest
2328 CR(SizeW)
2329 #define crSizeEast     6
2330 CR(SizeEast)
2331 #define crSizeE        crSizeEast
2332 CR(SizeE)
2333 #define crSizeWE       7
2334 CR(SizeWE)
2335 #define crSizeNorth    8
2336 CR(SizeNorth)
2337 #define crSizeN        crSizeNorth
2338 CR(SizeN)
2339 #define crSizeSouth    9
2340 CR(SizeSouth)
2341 #define crSizeS        crSizeSouth
2342 CR(SizeS)
2343 #define crSizeNS       10
2344 CR(SizeNS)
2345 #define crSizeNW       11
2346 CR(SizeNW)
2347 #define crSizeSE       12
2348 CR(SizeSE)
2349 #define crSizeNE       13
2350 CR(SizeNE)
2351 #define crSizeSW       14
2352 CR(SizeSW)
2353 #define crInvalid      15
2354 CR(Invalid)
2355 #define crDragNone     16
2356 CR(DragNone)
2357 #define crDragCopy     17
2358 CR(DragCopy)
2359 #define crDragMove     18
2360 CR(DragMove)
2361 #define crDragLink     19
2362 CR(DragLink)
2363 #define crCrosshair    20
2364 CR(Crosshair)
2365 #define crUpArrow      21
2366 CR(UpArrow)
2367 #define crQuestionArrow 22
2368 CR(QuestionArrow)
2369 #define crHand         23
2370 CR(Hand)
2371 #define crUser         24
2372 CR(User)
2373 END_TABLE(cr,UV)
2374 #undef CR
2375 
2376 /* Widget attributes */
2377 extern Bool
2378 apc_cursor_set_pos( Handle self, int x, int y);
2379 
2380 extern Bool
2381 apc_cursor_set_size( Handle self, int x, int y);
2382 
2383 extern Bool
2384 apc_cursor_set_visible( Handle self, Bool visible);
2385 
2386 extern Point
2387 apc_cursor_get_pos( Handle self);
2388 
2389 extern Point
2390 apc_cursor_get_size( Handle self);
2391 
2392 extern Bool
2393 apc_cursor_get_visible( Handle self);
2394 
2395 extern Point
2396 apc_pointer_get_hot_spot( Handle self);
2397 
2398 extern Point
2399 apc_pointer_get_pos( Handle self);
2400 
2401 extern int
2402 apc_pointer_get_shape( Handle self);
2403 
2404 extern Point
2405 apc_pointer_get_size( Handle self);
2406 
2407 extern Bool
2408 apc_pointer_get_bitmap( Handle self, Handle icon);
2409 
2410 extern Bool
2411 apc_pointer_get_visible( Handle self);
2412 
2413 extern Bool
2414 apc_pointer_set_pos( Handle self, int x, int y);
2415 
2416 extern Bool
2417 apc_pointer_set_shape( Handle self, int sysPtrId);
2418 
2419 extern Bool
2420 apc_pointer_set_user( Handle self, Handle icon, Point hotSpot);
2421 
2422 extern Bool
2423 apc_pointer_set_visible( Handle self, Bool visible);
2424 
2425 extern int
2426 apc_pointer_get_state( Handle self);
2427 
2428 extern int
2429 apc_kbd_get_state( Handle self);
2430 
2431 /* Clipboard */
2432 #define cfText     0
2433 #define cfBitmap   1
2434 #define cfImage    cfBitmap
2435 #define cfUTF8     2
2436 #define cfCustom   3
2437 
2438 typedef struct {
2439 	Handle image;
2440 	Byte * data;
2441 	IV length;
2442 } ClipboardDataRec, *PClipboardDataRec;
2443 
2444 extern PList
2445 apc_get_standard_clipboards( void);
2446 
2447 extern Bool
2448 apc_clipboard_create( Handle self);
2449 
2450 extern Bool
2451 apc_clipboard_destroy( Handle self);
2452 
2453 extern Bool
2454 apc_clipboard_open( Handle self);
2455 
2456 extern Bool
2457 apc_clipboard_close( Handle self);
2458 
2459 extern Bool
2460 apc_clipboard_clear( Handle self);
2461 
2462 extern PList
2463 apc_clipboard_get_formats( Handle self);
2464 
2465 extern Bool
2466 apc_clipboard_get_data( Handle self, Handle id, PClipboardDataRec c);
2467 
2468 extern ApiHandle
2469 apc_clipboard_get_handle( Handle self);
2470 
2471 extern Bool
2472 apc_clipboard_has_format( Handle self, Handle id);
2473 
2474 extern Bool
2475 apc_clipboard_set_data( Handle self, Handle id, PClipboardDataRec c);
2476 
2477 extern Handle
2478 apc_clipboard_register_format( Handle self, const char *format);
2479 
2480 extern Bool
2481 apc_clipboard_deregister_format( Handle self, Handle id);
2482 
2483 extern Bool
2484 apc_clipboard_is_dnd( Handle self);
2485 
2486 /* Drag and drop */
2487 
2488 #define DND(const_name) CONSTANT(dnd,const_name)
2489 START_TABLE(dnd,UV)
2490 #define    dndNone               0x00
2491 DND(None)
2492 #define    dndCopy               0x01
2493 DND(Copy)
2494 #define    dndMove               0x02
2495 DND(Move)
2496 #define    dndLink               0x04
2497 DND(Link)
2498 #define    dndMask               0x07
2499 DND(Mask)
2500 END_TABLE(dnd,UV)
2501 #undef DND
2502 
2503 extern Bool
2504 apc_dnd_get_aware( Handle self );
2505 
2506 extern Bool
2507 apc_dnd_set_aware( Handle self, Bool is_target );
2508 
2509 extern int
2510 apc_dnd_start( Handle self, int actions, Bool default_pointers, Handle * counterpart);
2511 
2512 extern Handle
2513 apc_dnd_get_clipboard( Handle self );
2514 
2515 /* Menus & popups */
2516 
2517 typedef struct _MenuItemReg {   /* Menu item registration record */
2518 	char * variable;             /* perl variable name */
2519 	char * text;                 /* menu text */
2520 	char * accel;                /* accelerator text */
2521 	int    key;                  /* accelerator key, kbXXX */
2522 	int    id;                   /* unique id */
2523 	char * perlSub;              /* sub name */
2524 	Handle bitmap;               /* bitmap if not nil */
2525 	SV *   code;                 /* code if not nil */
2526 	SV *   options;              /* use options if not nil */
2527 	Handle icon;                 /* custom checked bitmap */
2528 	int    group;                /* radio group */
2529 	struct _MenuItemReg* down;   /* pointer to submenu */
2530 	struct _MenuItemReg* next;   /* pointer to next item */
2531 	struct {
2532 		unsigned int checked       : 1;  /* true if item is checked */
2533 		unsigned int disabled      : 1;
2534 		unsigned int rightAdjust   : 1;  /* true if right adjust ordered */
2535 		unsigned int divider       : 1;  /* true if it's line divider */
2536 		unsigned int utf8_variable : 1;
2537 		unsigned int utf8_text     : 1;
2538 		unsigned int utf8_accel    : 1;
2539 		unsigned int utf8_perlSub  : 1;
2540 		unsigned int autotoggle    : 1;  /* true if menu is toggled automatially */
2541 		unsigned int custom_draw   : 1;  /* true if menu item is drawn through onMenuItemPaint */
2542 	} flags;
2543 } MenuItemReg, *PMenuItemReg;
2544 
2545 extern Bool
2546 apc_menu_create( Handle self, Handle owner);
2547 
2548 extern Bool
2549 apc_menu_update( Handle self, PMenuItemReg oldBranch, PMenuItemReg newBranch);
2550 
2551 extern Bool
2552 apc_menu_destroy( Handle self);
2553 
2554 extern PFont
2555 apc_menu_default_font( PFont font);
2556 
2557 extern Color
2558 apc_menu_get_color( Handle self, int index);
2559 
2560 extern PFont
2561 apc_menu_get_font( Handle self, PFont font);
2562 
2563 extern Bool
2564 apc_menu_set_color( Handle self, Color color, int index);
2565 
2566 extern Bool
2567 apc_menu_set_font( Handle self, PFont font);
2568 
2569 extern Bool
2570 apc_menu_item_begin_paint( Handle self, PEvent event);
2571 
2572 extern Bool
2573 apc_menu_item_end_paint( Handle self, PEvent event);
2574 
2575 extern Bool
2576 apc_menu_item_delete( Handle self, PMenuItemReg m);
2577 
2578 extern Bool
2579 apc_menu_item_set_accel( Handle self, PMenuItemReg m);
2580 
2581 extern Bool
2582 apc_menu_item_set_autotoggle( Handle self, PMenuItemReg m);
2583 
2584 extern Bool
2585 apc_menu_item_set_check( Handle self, PMenuItemReg m);
2586 
2587 extern Bool
2588 apc_menu_item_set_enabled( Handle self, PMenuItemReg m);
2589 
2590 extern Bool
2591 apc_menu_item_set_icon( Handle self, PMenuItemReg m);
2592 
2593 extern Bool
2594 apc_menu_item_set_image( Handle self, PMenuItemReg m);
2595 
2596 extern Bool
2597 apc_menu_item_set_key( Handle self, PMenuItemReg m);
2598 
2599 extern Bool
2600 apc_menu_item_set_text( Handle self, PMenuItemReg m);
2601 
2602 extern ApiHandle
2603 apc_menu_get_handle( Handle self);
2604 
2605 extern Bool
2606 apc_popup_create( Handle self, Handle owner);
2607 
2608 extern PFont
2609 apc_popup_default_font( PFont font);
2610 
2611 extern Bool
2612 apc_popup( Handle self, int x, int y, Rect * anchor);
2613 
2614 /* Timer */
2615 extern Bool
2616 apc_timer_create( Handle self);
2617 
2618 extern Bool
2619 apc_timer_destroy( Handle self);
2620 
2621 extern int
2622 apc_timer_get_timeout( Handle self);
2623 
2624 extern Bool
2625 apc_timer_set_timeout( Handle self, int timeout);
2626 
2627 extern Bool
2628 apc_timer_start( Handle self);
2629 
2630 extern Bool
2631 apc_timer_stop( Handle self);
2632 
2633 extern ApiHandle
2634 apc_timer_get_handle( Handle self);
2635 
2636 /* Messages */
2637 #define mbError        0x0100
2638 #define mbWarning      0x0200
2639 #define mbInformation  0x0400
2640 #define mbQuestion     0x0800
2641 
2642 extern Bool
2643 apc_message( Handle self, PEvent ev, Bool post);
2644 
2645 extern Bool
2646 apc_show_message( const char* message, Bool utf8);
2647 
2648 
2649 /* graphics constants */
2650 #define ARGB(r,g,b) ((uint32_t)(((unsigned char)(b)|((uint32_t)((unsigned char)(g))<<8))|(((uint32_t)((unsigned char)(r)))<<16)))
2651 
2652 /* colors */
2653 #define CL(const_name) CONSTANT(cl,const_name)
2654 START_TABLE(cl,UV)
2655 #define    clBlack            ARGB(0,0,0)
2656 CL(Black)
2657 #define    clBlue             ARGB(0,0,128)
2658 CL(Blue)
2659 #define    clGreen            ARGB(0,128,0)
2660 CL(Green)
2661 #define    clCyan             ARGB(0,128,128)
2662 CL(Cyan)
2663 #define    clRed              ARGB(128,0,0)
2664 CL(Red)
2665 #define    clMagenta          ARGB(128,0,128)
2666 CL(Magenta)
2667 #define    clBrown            ARGB(128,128,0)
2668 CL(Brown)
2669 #define    clLightGray        ARGB(192,192,192)
2670 CL(LightGray)
2671 #define    clDarkGray         ARGB(63,63,63)
2672 CL(DarkGray)
2673 #define    clLightBlue        ARGB(0,0,255)
2674 CL(LightBlue)
2675 #define    clLightGreen       ARGB(0,255,0)
2676 CL(LightGreen)
2677 #define    clLightCyan        ARGB(0,255,255)
2678 CL(LightCyan)
2679 #define    clLightRed         ARGB(255,0,0)
2680 CL(LightRed)
2681 #define    clLightMagenta     ARGB(255,0,255)
2682 CL(LightMagenta)
2683 #define    clYellow           ARGB(255,255,0)
2684 CL(Yellow)
2685 #define    clWhite            ARGB(255,255,255)
2686 CL(White)
2687 #define    clGray             ARGB(128,128,128)
2688 CL(Gray)
2689 #define    clSysFlag          (uint32_t)(0x10000000)
2690 CL(SysFlag)
2691 #define    clSysMask          (uint32_t)(0xEFFFFFFF)
2692 CL(SysMask)
2693 #define    clInvalid          (uint32_t)(0x10000000)
2694 CL(Invalid)
2695 #define    clNormalText       (uint32_t)(0x10000001)
2696 CL(NormalText)
2697 #define    clFore             (uint32_t)(0x10000001)
2698 CL(Fore)
2699 #define    clNormal           (uint32_t)(0x10000002)
2700 CL(Normal)
2701 #define    clBack             (uint32_t)(0x10000002)
2702 CL(Back)
2703 #define    clHiliteText       (uint32_t)(0x10000003)
2704 CL(HiliteText)
2705 #define    clHilite           (uint32_t)(0x10000004)
2706 CL(Hilite)
2707 #define    clDisabledText     (uint32_t)(0x10000005)
2708 CL(DisabledText)
2709 #define    clDisabled         (uint32_t)(0x10000006)
2710 CL(Disabled)
2711 #define    clLight3DColor     (uint32_t)(0x10000007)
2712 CL(Light3DColor)
2713 #define    clDark3DColor      (uint32_t)(0x10000008)
2714 CL(Dark3DColor)
2715 #define    clSet              (uint32_t)(0x10000009)
2716 CL(Set)
2717 #define    clClear            (uint32_t)(0x1000000A)
2718 CL(Clear)
2719 #define    clMaxSysColor      (uint32_t)(0x1000000A)
2720 CL(MaxSysColor)
2721 END_TABLE(cl,UV)
2722 #undef CL
2723 
2724 /* color indices */
2725 #define CI(const_name) CONSTANT(ci,const_name)
2726 START_TABLE(ci,UV)
2727 #define    ciNormalText    0
2728 CI(NormalText)
2729 #define    ciFore          0
2730 CI(Fore)
2731 #define    ciNormal        1
2732 CI(Normal)
2733 #define    ciBack          1
2734 CI(Back)
2735 #define    ciHiliteText    2
2736 CI(HiliteText)
2737 #define    ciHilite        3
2738 CI(Hilite)
2739 #define    ciDisabledText  4
2740 CI(DisabledText)
2741 #define    ciDisabled      5
2742 CI(Disabled)
2743 #define    ciLight3DColor  6
2744 CI(Light3DColor)
2745 #define    ciDark3DColor   7
2746 CI(Dark3DColor)
2747 #define    ciMaxId         7
2748 CI(MaxId)
2749 END_TABLE(ci,UV)
2750 #undef CI
2751 
2752 typedef Color ColorSet[ ciMaxId + 1];
2753 
2754 /* raster operations */
2755 typedef enum {
2756 	ropCopyPut = 0,      /* dest  = src */
2757 	ropXorPut,           /* dest ^= src */
2758 	ropAndPut,           /* dest &= src */
2759 	ropOrPut,            /* dest |= src */
2760 	ropNotPut,           /* dest = !src */
2761 	ropInvert,           /* dest = !dest*/
2762 	ropBlackness,        /* dest = 0 */
2763 	ropNotDestAnd,       /* dest = (!dest) & src */
2764 	ropNotDestOr,        /* dest = (!dest) | src */
2765 	ropWhiteness,        /* dest = 1 */
2766 	ropNotSrcAnd,        /* dest &= !src */
2767 	ropNotSrcOr,         /* dest |= !src */
2768 	ropNotXor,           /* dest = !(src ^ dest) */
2769 	ropNotAnd,           /* dest = !(src & dest) */
2770 	ropNotOr,            /* dest = !(src | dest) */
2771 	ropNoOper,           /* dest = dest */
2772 
2773 	/* Porter-Duff operators for 32-bit ARGB image operations */
2774 	ropSrcOver = 0, /* save value as ropCopy, to serve as a default */
2775 	ropXor = ropXorPut, /* so they have same value */
2776 	ropDstOver,
2777 	ropSrcCopy,
2778 	ropDstCopy,
2779 	ropClear,
2780 	ropSrcIn,
2781 	ropDstIn,
2782 	ropSrcOut,
2783 	ropDstOut,
2784 	ropSrcAtop,
2785 	ropDstAtop,
2786 	/* and their extensions, photoshop blend modes */
2787 	ropAdd,
2788 	ropMultiply,
2789 	ropScreen,
2790 	ropNoOper2 = ropNoOper,
2791 	ropOverlay,
2792 	ropDarken,
2793 	ropLighten,
2794 	ropColorDodge,
2795 	ropColorBurn,
2796 	ropHardLight,
2797 	ropSoftLight,
2798 	ropDifference,
2799 	ropExclusion,
2800 	ropMaxPDFunc = ropExclusion,
2801 
2802 	/* 8-bit standalone alpha */
2803 	ropAlphaCopy          = 0x0000100,
2804 
2805 	/* extensions for Prima's own Image.put */
2806 	ropPorterDuffMask     = 0x000001F,
2807 	ropSrcAlpha           = 0x1000000,
2808 	ropSrcAlphaShift      = 8,
2809 	ropDstAlpha           = 0x2000000,
2810 	ropDstAlphaShift      = 16,
2811 	ropConstantAlpha      = 0x3000000,
2812 	ropPremultiply        = 0x4000000,
2813 	ropConstantColor      = 0x8000000
2814 } ROP;
2815 
2816 
2817 #define ropNotSrcXor  ropNotXor    /* dest ^= !src */
2818 #define ropNotDestXor ropNotXor    /* dest  = !dest ^ src */
2819 
2820 #define ROP(const_name) CONSTANT(rop,const_name)
2821 
2822 START_TABLE(rop,UV)
2823 ROP(Blackness) ROP(NotOr) ROP(NotSrcAnd) ROP(NotPut) ROP(NotDestAnd)
2824 ROP(Invert) ROP(XorPut) ROP(NotAnd) ROP(AndPut) ROP(NotXor) ROP(NoOper)
2825 ROP(NotSrcOr) ROP(CopyPut) ROP(NotDestOr) ROP(OrPut) ROP(Whiteness)
2826 ROP(NotSrcXor) ROP(NotDestXor)
2827 
2828 ROP(SrcOver) ROP(SrcCopy) ROP(SrcIn) ROP(SrcOut) ROP(SrcAtop)
2829 ROP(DstOver) ROP(DstCopy) ROP(DstIn) ROP(DstOut) ROP(DstAtop)
2830 ROP(Xor) ROP(Clear)
2831 
2832 ROP(Add) ROP(Multiply) ROP(Screen) ROP(Overlay)
2833 ROP(Darken) ROP(Lighten) ROP(ColorDodge) ROP(ColorBurn)
2834 ROP(HardLight) ROP(SoftLight) ROP(Difference) ROP(Exclusion)
2835 
2836 ROP(SrcAlpha) ROP(SrcAlphaShift)
2837 ROP(DstAlpha) ROP(DstAlphaShift)
2838 ROP(PorterDuffMask) ROP(ConstantAlpha) ROP(AlphaCopy)
2839 ROP(Premultiply) ROP(ConstantColor)
2840 END_TABLE(rop,UV)
2841 #undef ROP
2842 
2843 /* line ends */
2844 #define LE(const_name) CONSTANT(le,const_name)
2845 START_TABLE(le,UV)
2846 #define    leFlat           0
2847 LE(Flat)
2848 #define    leSquare         1
2849 LE(Square)
2850 #define    leRound          2
2851 LE(Round)
2852 END_TABLE(le,UV)
2853 #undef LE
2854 
2855 /* line joins */
2856 #define LJ(const_name) CONSTANT(lj,const_name)
2857 START_TABLE(lj,UV)
2858 #define    ljRound          0
2859 LJ(Round)
2860 #define    ljBevel          1
2861 LJ(Bevel)
2862 #define    ljMiter          2
2863 LJ(Miter)
2864 END_TABLE(lj,UV)
2865 #undef LJ
2866 
2867 /* line patterns */
2868 #define LP(const_name) CONSTANT(lp,const_name)
2869 START_TABLE(lp,unsigned char*)
2870 #define    lpNull           (unsigned char*) ""              /* */
2871 LP(Null)
2872 #define    lpSolid          (unsigned char*) "\1"            /* ___________  */
2873 LP(Solid)
2874 #define    lpDash           (unsigned char*) "\x9\3"         /* __ __ __ __  */
2875 LP(Dash)
2876 #define    lpLongDash       (unsigned char*) "\x16\6"        /* _____ _____  */
2877 LP(LongDash)
2878 #define    lpShortDash      (unsigned char*) "\3\3"          /* _ _ _ _ _ _  */
2879 LP(ShortDash)
2880 #define    lpDot            (unsigned char*) "\1\3"          /* . . . . . .  */
2881 LP(Dot)
2882 #define    lpDotDot         (unsigned char*) "\1\1"          /* ............ */
2883 LP(DotDot)
2884 #define    lpDashDot        (unsigned char*) "\x9\3\1\3"     /* _._._._._._  */
2885 LP(DashDot)
2886 #define    lpDashDotDot     (unsigned char*) "\x9\3\1\3\1\3" /* _.._.._.._.. */
2887 LP(DashDotDot)
2888 END_TABLE_CHAR(lp,unsigned char*)
2889 #undef LP
2890 
2891 /* fill modes */
2892 #define FM(const_name) CONSTANT(fm,const_name)
2893 START_TABLE(fm,UV)
2894 #define    fmAlternate       0
2895 FM(Alternate)
2896 #define    fmWinding         1
2897 FM(Winding)
2898 #define    fmOverlay         2
2899 FM(Overlay)
2900 END_TABLE(fm,UV)
2901 #undef FM
2902 
2903 /* font styles */
2904 #define FS(const_name) CONSTANT(fs,const_name)
2905 START_TABLE(fs,UV)
2906 #define    fsNormal         0x0000
2907 FS(Normal)
2908 #define    fsBold           0x0001
2909 FS(Bold)
2910 #define    fsThin           0x0002
2911 FS(Thin)
2912 #define    fsItalic         0x0004
2913 FS(Italic)
2914 #define    fsUnderlined     0x0008
2915 FS(Underlined)
2916 #define    fsStruckOut      0x0010
2917 FS(StruckOut)
2918 #define    fsOutline        0x0020
2919 FS(Outline)
2920 #define    fsMask           0x003F
2921 END_TABLE(fs,UV)
2922 #undef FS
2923 
2924 /* font pitches */
2925 #define FP(const_name) CONSTANT(fp,const_name)
2926 START_TABLE(fp,UV)
2927 #define    fpDefault        0x0000
2928 FP(Default)
2929 #define    fpVariable       0x0001
2930 FP(Variable)
2931 #define    fpFixed          0x0002
2932 FP(Fixed)
2933 #define    fpMask           0x0003
2934 
2935 /* fill constants */
2936 #define    fpEmpty          0 /*   Uses background color */
2937 FP(Empty)
2938 #define    fpSolid          1 /*   Uses draw color fill */
2939 FP(Solid)
2940 #define    fpLine           2 /*   --- */
2941 FP(Line)
2942 #define    fpLtSlash        3 /*   /// */
2943 FP(LtSlash)
2944 #define    fpSlash          4 /*   /// thick */
2945 FP(Slash)
2946 #define    fpBkSlash        5 /*   \\\ thick */
2947 FP(BkSlash)
2948 #define    fpLtBkSlash      6 /*   \\\ light */
2949 FP(LtBkSlash)
2950 #define    fpHatch          7 /*   Light hatch */
2951 FP(Hatch)
2952 #define    fpXHatch         8 /*   Heavy cross hatch */
2953 FP(XHatch)
2954 #define    fpInterleave     9 /*   Interleaving line */
2955 FP(Interleave)
2956 #define    fpWideDot       10 /*   Widely spaced dot */
2957 FP(WideDot)
2958 #define    fpCloseDot      11 /*   Closely spaced dot */
2959 FP(CloseDot)
2960 #define    fpSimpleDots    12 /*   . . . . . . . . . . */
2961 FP(SimpleDots)
2962 #define    fpBorland       13 /*   #################### */
2963 FP(Borland)
2964 #define    fpParquet       14 /*   \/\/\/\/\/\/\/\/\/\/ */
2965 FP(Parquet)
2966 #define    fpCritters      15 /*   critters */
2967 FP(Critters)
2968 #define    fpMaxId         15
2969 FP(MaxId)
2970 END_TABLE(fp,UV)
2971 #undef FP
2972 
2973 /* font vector constants */
2974 #define FV(const_name) CONSTANT(fv,const_name)
2975 START_TABLE(fv,UV)
2976 #define    fvBitmap         0x0000
2977 FV(Bitmap)
2978 #define    fvOutline        0x0001
2979 FV(Outline)
2980 #define    fvDefault        0x0002
2981 FV(Default)
2982 #define    fvScalableBitmap 0x0003
2983 FV(ScalableBitmap)
2984 #define    fvMask           0x0003
2985 END_TABLE(fv,UV)
2986 #undef FV
2987 
2988 
2989 /* font weigths */
2990 #define FW(const_name) CONSTANT(fw,const_name)
2991 START_TABLE(fw,UV)
2992 #define    fwUltraLight     1
2993 FW(UltraLight)
2994 #define    fwExtraLight     2
2995 FW(ExtraLight)
2996 #define    fwLight          3
2997 FW(Light)
2998 #define    fwSemiLight      4
2999 FW(SemiLight)
3000 #define    fwMedium         5
3001 FW(Medium)
3002 #define    fwSemiBold       6
3003 FW(SemiBold)
3004 #define    fwBold           7
3005 FW(Bold)
3006 #define    fwExtraBold      8
3007 FW(ExtraBold)
3008 #define    fwUltraBold      9
3009 FW(UltraBold)
3010 END_TABLE(fw,UV)
3011 #undef FW
3012 
3013 #define IM(const_name) CONSTANT(im,const_name)
3014 START_TABLE(im,UV)
3015 #define    imNone                0
3016 IM(None)
3017 #define    imbpp1                0x001
3018 IM(bpp1)
3019 #define    imbpp4                0x004
3020 IM(bpp4)
3021 #define    imbpp8                0x008
3022 IM(bpp8)
3023 #define    imbpp16               0x010
3024 IM(bpp16)
3025 #define    imbpp24               0x018
3026 IM(bpp24)
3027 #define    imbpp32               0x020
3028 IM(bpp32)
3029 #define    imbpp64               0x040
3030 IM(bpp64)
3031 #define    imbpp128              0x080
3032 IM(bpp128)
3033 #define    imBPP                 0x0FF
3034 IM(BPP)
3035 
3036 #define    imColor               0x0000
3037 IM(Color)
3038 #define    imGrayScale           0x1000
3039 IM(GrayScale)
3040 #define    imRealNumber          0x2000
3041 IM(RealNumber)
3042 #define    imComplexNumber       0x4000
3043 IM(ComplexNumber)
3044 #define    imTrigComplexNumber   0x8000
3045 IM(TrigComplexNumber)
3046 #define    imSignedInt           0x0100
3047 IM(SignedInt)
3048 #define    imCategory            0xFF00
3049 IM(Category)
3050 
3051 
3052 #define    imFMT                 0xFF0000
3053 IM(FMT)
3054 
3055 /* imbpp24 subformats */
3056 #define    imfmtRGB              0x000000
3057 IM(fmtRGB)
3058 #define    imfmtBGR              0x010000
3059 IM(fmtBGR)
3060 
3061 /* imbpp32 subformats */
3062 #define    imfmtRGBI             0x000000
3063 IM(fmtRGBI)
3064 #define    imfmtIRGB             0x010000
3065 IM(fmtIRGB)
3066 #define    imfmtBGRI             0x020000
3067 IM(fmtBGRI)
3068 #define    imfmtIBGR             0x030000
3069 IM(fmtIBGR)
3070 
3071 /* Shortcuts and composites */
3072 #define    imMono           imbpp1
3073 IM(Mono)
3074 #define    imBW             (imMono|imGrayScale)
3075 IM(BW)
3076 #define    im16             imbpp4
3077 IM(16)
3078 #define    imNibble         im16
3079 IM(Nibble)
3080 #define    im256            imbpp8
3081 IM(256)
3082 #define    imRGB            imbpp24
3083 IM(RGB)
3084 #define    imTriple         imRGB
3085 IM(Triple)
3086 #define    imByte           (imbpp8|imGrayScale)
3087 IM(Byte)
3088 #define    imShort          (imbpp16|imGrayScale|imSignedInt)
3089 IM(Short)
3090 #define    imLong           (imbpp32|imGrayScale|imSignedInt)
3091 IM(Long)
3092 #define    imFloat          ((sizeof(float)*8)|imGrayScale|imRealNumber)
3093 IM(Float)
3094 #define    imDouble         ((sizeof(double)*8)|imGrayScale|imRealNumber)
3095 IM(Double)
3096 #define    imComplex        ((sizeof(float)*8*2)|imGrayScale|imComplexNumber)
3097 IM(Complex)
3098 #define    imDComplex       ((sizeof(double)*8*2)|imGrayScale|imComplexNumber)
3099 IM(DComplex)
3100 #define    imTrigComplex    ((sizeof(float)*8*2)|imGrayScale|imTrigComplexNumber)
3101 IM(TrigComplex)
3102 #define    imTrigDComplex   ((sizeof(double)*8*2)|imGrayScale|imTrigComplexNumber)
3103 IM(TrigDComplex)
3104 END_TABLE(im,UV)
3105 #undef IM
3106 
3107 #define MAX_SIZEOF_PIXEL (sizeof(double) * 2)
3108 typedef Byte ColorPixel[MAX_SIZEOF_PIXEL];
3109 
3110 /* Image statistics constants */
3111 #define IS(const_name) CONSTANT(is,const_name)
3112 START_TABLE(is,UV)
3113 #define isRangeLo        0
3114 IS(RangeLo)
3115 #define isRangeHi        1
3116 IS(RangeHi)
3117 #define isMean           2
3118 IS(Mean)
3119 #define isVariance       3
3120 IS(Variance)
3121 #define isStdDev         4
3122 IS(StdDev)
3123 #define isSum            5
3124 IS(Sum)
3125 #define isSum2           6
3126 IS(Sum2)
3127 #define isMaxIndex       6
3128 IS(MaxIndex)
3129 END_TABLE(is,UV)
3130 #undef IS
3131 
3132 /* Image conversion types: dithering */
3133 #define ICTD(const_name) CONSTANT(ictd,const_name)
3134 START_TABLE(ictd,UV)
3135 #define    ictdNone               0
3136 ICTD(None)
3137 #define    ictdOrdered            1
3138 ICTD(Ordered)
3139 #define    ictdErrorDiffusion     2
3140 ICTD(ErrorDiffusion)
3141 #define    ictdMask               0x0f
3142 ICTD(Mask)
3143 END_TABLE(ictd,UV)
3144 #undef ICTD
3145 
3146 /* Image conversion types: palette optimization */
3147 #define ICTP(const_name) CONSTANT(ictp,const_name)
3148 START_TABLE(ictp,UV)
3149 #define    ictpUnoptimized        0
3150 ICTP(Unoptimized)
3151 #define    ictpCubic              0x10
3152 ICTP(Cubic)
3153 #define    ictpOptimized          0x20
3154 ICTP(Optimized)
3155 #define    ictpMask               0xf0
3156 ICTP(Mask)
3157 END_TABLE(ictp,UV)
3158 #undef ICTP
3159 
3160 /* Image conversion types */
3161 #define ICT(const_name) CONSTANT(ict,const_name)
3162 START_TABLE(ict,UV)
3163 #define    ictNone               (ictdNone|ictpUnoptimized)
3164 ICT(None)
3165 #define    ictPosterization      (ictdNone|ictpOptimized)
3166 ICT(Posterization)
3167 #define    ictOrdered            (ictdOrdered|ictpCubic)
3168 ICT(Ordered)
3169 #define    ictErrorDiffusion     (ictdErrorDiffusion|ictpCubic)
3170 ICT(ErrorDiffusion)
3171 #define    ictOptimized          (ictdErrorDiffusion|ictpOptimized)
3172 ICT(Optimized)
3173 END_TABLE(ict,UV)
3174 #undef ICT
3175 
3176 /* Image scaling types */
3177 #define IST(const_name) CONSTANT(ist,const_name)
3178 START_TABLE(ist,UV)
3179 #define    istNone               0
3180 IST(None)
3181 #define    istBoxX               1
3182 IST(BoxX)
3183 #define    istBoxY               2
3184 IST(BoxY)
3185 #define    istBox                (istBoxX|istBoxY)
3186 IST(Box)
3187 #define    istAND                4
3188 IST(AND)
3189 #define    istOR                 5
3190 IST(OR)
3191 #define    istTriangle           6
3192 IST(Triangle)
3193 #define    istQuadratic          7
3194 IST(Quadratic)
3195 #define    istSinc               8
3196 IST(Sinc)
3197 #define    istHermite            9
3198 IST(Hermite)
3199 #define    istCubic              10
3200 IST(Cubic)
3201 #define    istGaussian           11
3202 IST(Gaussian)
3203 END_TABLE(ist,UV)
3204 #define istMax istGaussian
3205 #undef IST
3206 
3207 /* Icon auto masking types */
3208 #define AM(const_name) CONSTANT(am,const_name)
3209 START_TABLE(am,UV)
3210 #define    amNone               0
3211 AM(None)
3212 #define    amMaskColor           1
3213 AM(MaskColor)
3214 #define    amAuto                2
3215 AM(Auto)
3216 #define    amMaskIndex           3
3217 AM(MaskIndex)
3218 END_TABLE(am,UV)
3219 #undef AM
3220 
3221 /* image & bitmaps */
3222 extern Bool
3223 apc_image_create( Handle self);
3224 
3225 extern Bool
3226 apc_image_destroy( Handle self);
3227 
3228 extern Bool
3229 apc_image_begin_paint( Handle self);
3230 
3231 extern Bool
3232 apc_image_begin_paint_info( Handle self);
3233 
3234 extern Bool
3235 apc_image_end_paint( Handle self);
3236 
3237 extern Bool
3238 apc_image_end_paint_info( Handle self);
3239 
3240 extern Bool
3241 apc_image_update_change( Handle self);
3242 
3243 extern const char *
3244 apc_image_get_error_message( char *errorMsgBuf, int bufLen);
3245 
3246 extern ApiHandle
3247 apc_image_get_handle( Handle self);
3248 
3249 /* text wrap options */
3250 #define DBT(const_name) CONSTANT(dbt,const_name)
3251 START_TABLE(dbt,UV)
3252 #define dbtBitmap         0    /* 1-bit BW bitmap */
3253 DBT(Bitmap)
3254 #define dbtPixmap         1    /* more-than-1 bit color bitmap */
3255 DBT(Pixmap)
3256 #define dbtLayered        2    /* ARGB bitmap */
3257 DBT(Layered)
3258 END_TABLE(dbt,UV)
3259 #undef DBT
3260 
3261 
3262 extern Bool
3263 apc_dbm_create( Handle self, int type);
3264 
3265 extern Bool
3266 apc_dbm_destroy( Handle self);
3267 
3268 extern ApiHandle
3269 apc_dbm_get_handle( Handle self);
3270 
3271 /* text wrap options */
3272 #define TW(const_name) CONSTANT(tw,const_name)
3273 START_TABLE(tw,UV)
3274 #define twCalcMnemonic    0x001    /* calculate first ~ entry */
3275 TW(CalcMnemonic)
3276 #define twCalcTabs        0x002    /* calculate tabs */
3277 TW(CalcTabs)
3278 #define twBreakSingle     0x004    /* return single empty line if text cannot be fitted in */
3279 TW(BreakSingle)
3280 #define twNewLineBreak    0x008    /* break line at \n */
3281 TW(NewLineBreak)
3282 #define twSpaceBreak      0x010    /* break line at spaces */
3283 TW(SpaceBreak)
3284 #define twReturnLines     0x000    /* return wrapped lines */
3285 TW(ReturnLines)
3286 #define twReturnChunks    0x020    /* return array of offsets & lengths */
3287 TW(ReturnChunks)
3288 #define twWordBreak       0x040    /* break line at word boundary, if necessary */
3289 TW(WordBreak)
3290 #define twExpandTabs      0x080    /* expand tabs */
3291 TW(ExpandTabs)
3292 #define twCollapseTilde   0x100    /* remove ~ from line */
3293 TW(CollapseTilde)
3294 #define twReturnFirstLineLength 0x220
3295 TW(ReturnFirstLineLength)
3296 #define twReturnGlyphs    0x400
3297 TW(ReturnGlyphs)
3298 #define twDefault         (twNewLineBreak|twCalcTabs|twExpandTabs|twReturnLines|twWordBreak)
3299 TW(Default)
3300 END_TABLE(tw,UV)
3301 #undef TW
3302 
3303 /* find/replace dialog scope type */
3304 #define FDS(const_name) CONSTANT(fds,const_name)
3305 START_TABLE(fds,UV)
3306 #define fdsCursor             0
3307 FDS(Cursor)
3308 #define fdsTop                1
3309 FDS(Top)
3310 #define fdsBottom             2
3311 FDS(Bottom)
3312 END_TABLE(fds,UV)
3313 #undef FDS
3314 
3315 /* find/replace dialog options */
3316 #define FDO(const_name) CONSTANT(fdo,const_name)
3317 START_TABLE(fdo,UV)
3318 #define fdoMatchCase                0x01
3319 FDO(MatchCase)
3320 #define fdoWordsOnly                0x02
3321 FDO(WordsOnly)
3322 #define fdoRegularExpression        0x04
3323 FDO(RegularExpression)
3324 #define fdoBackwardSearch           0x08
3325 FDO(BackwardSearch)
3326 #define fdoReplacePrompt            0x10
3327 FDO(ReplacePrompt)
3328 END_TABLE(fdo,UV)
3329 #undef FDO
3330 
3331 /* System bitmaps index */
3332 #define SBMP(const_name) CONSTANT(sbmp,const_name)
3333 START_TABLE(sbmp,UV)
3334 #define sbmpLogo                         0
3335 SBMP(Logo)
3336 #define sbmpCheckBoxChecked              1
3337 SBMP(CheckBoxChecked)
3338 #define sbmpCheckBoxCheckedPressed       2
3339 SBMP(CheckBoxCheckedPressed)
3340 #define sbmpCheckBoxUnchecked            3
3341 SBMP(CheckBoxUnchecked)
3342 #define sbmpCheckBoxUncheckedPressed     4
3343 SBMP(CheckBoxUncheckedPressed)
3344 #define sbmpRadioChecked                 5
3345 SBMP(RadioChecked)
3346 #define sbmpRadioCheckedPressed          6
3347 SBMP(RadioCheckedPressed)
3348 #define sbmpRadioUnchecked               7
3349 SBMP(RadioUnchecked)
3350 #define sbmpRadioUncheckedPressed        8
3351 SBMP(RadioUncheckedPressed)
3352 #define sbmpWarning                      9
3353 SBMP(Warning)
3354 #define sbmpInformation                 10
3355 SBMP(Information)
3356 #define sbmpQuestion                    11
3357 SBMP(Question)
3358 #define sbmpOutlineCollapse             12
3359 SBMP(OutlineCollapse)
3360 #define sbmpOutlineExpand               13
3361 SBMP(OutlineExpand)
3362 #define sbmpError                       14
3363 SBMP(Error)
3364 #define sbmpSysMenu                     15
3365 SBMP(SysMenu)
3366 #define sbmpSysMenuPressed              16
3367 SBMP(SysMenuPressed)
3368 #define sbmpMax                         17
3369 SBMP(Max)
3370 #define sbmpMaxPressed                  18
3371 SBMP(MaxPressed)
3372 #define sbmpMin                         19
3373 SBMP(Min)
3374 #define sbmpMinPressed                  20
3375 SBMP(MinPressed)
3376 #define sbmpRestore                     21
3377 SBMP(Restore)
3378 #define sbmpRestorePressed              22
3379 SBMP(RestorePressed)
3380 #define sbmpClose                       23
3381 SBMP(Close)
3382 #define sbmpClosePressed                24
3383 SBMP(ClosePressed)
3384 #define sbmpHide                        25
3385 SBMP(Hide)
3386 #define sbmpHidePressed                 26
3387 SBMP(HidePressed)
3388 #define sbmpDriveUnknown                27
3389 SBMP(DriveUnknown)
3390 #define sbmpDriveFloppy                 28
3391 SBMP(DriveFloppy)
3392 #define sbmpDriveHDD                    29
3393 SBMP(DriveHDD)
3394 #define sbmpDriveNetwork                30
3395 SBMP(DriveNetwork)
3396 #define sbmpDriveCDROM                  31
3397 SBMP(DriveCDROM)
3398 #define sbmpDriveMemory                 32
3399 SBMP(DriveMemory)
3400 #define sbmpGlyphOK                     33
3401 SBMP(GlyphOK)
3402 #define sbmpGlyphCancel                 34
3403 SBMP(GlyphCancel)
3404 #define sbmpSFolderOpened               35
3405 SBMP(SFolderOpened)
3406 #define sbmpSFolderClosed               36
3407 SBMP(SFolderClosed)
3408 #define sbmpLast                        36
3409 SBMP(Last)
3410 END_TABLE(sbmp,UV)
3411 #undef SBMP
3412 
3413 typedef struct _FontABC
3414 {
3415 	float a;
3416 	float b;
3417 	float c;
3418 } FontABC, *PFontABC;
3419 
3420 typedef struct _TextWrapRec {
3421 	char * text;                        /* text to be wrapped */
3422 	Bool   utf8_text;                   /* is utf8 */
3423 	int    textLen;                     /* text length in bytes */
3424 	int    utf8_textLen;                /* text length in characters */
3425 	int    width;                       /* width to wrap with */
3426 	int    tabIndent;                   /* \t replace to tabIndent spaces */
3427 	int    options;                     /* twXXX constants */
3428 	int    count;                       /* count of lines returned */
3429 	int    t_start;                     /* ~ starting point */
3430 	int    t_end;                       /* ~ ending point */
3431 	int    t_line;                      /* ~ line */
3432 	int    t_pos;                       /* ~ offset in t_line in characters */
3433 	int    t_bytepos;                   /* ~ offset in t_line in bytes */
3434 	char * t_char;                      /* letter next to ~ */
3435 
3436 	PFontABC * ascii;                   /* eventual abc caches, to be freed after call. */
3437 	PList    * unicode;                 /* NB - .ascii can be present in .unicode ! */
3438 } TextWrapRec, *PTextWrapRec;
3439 
3440 typedef struct {
3441 	uint16_t * glyphs;   /* glyphset to be wrapped */
3442 	uint16_t * indexes;  /* for visual ordering; also, won't break within a cluster */
3443 	uint16_t * advances;
3444 	int16_t  * positions;
3445 	uint16_t * fonts;
3446 	int        offset;   /* for from/len offsetting */
3447 	int        n_glyphs; /* glyphset length in words */
3448 	int        text_len; /* original index[-1] */
3449 	int        width;    /* width to wrap with */
3450 	int        options;  /* twXXX constants */
3451 	int        count;    /* count of lines returned */
3452 	PList    * cache;
3453 } GlyphWrapRec;
3454 
3455 /* regions */
3456 
3457 #define rgnEmpty     0
3458 #define rgnRectangle 1
3459 #define rgnPolygon   2
3460 #define rgnImage     3
3461 
3462 typedef struct {
3463 	int n_points;
3464 	int fill_mode;
3465 	Point* points;
3466 } PolygonRegionRec;
3467 
3468 typedef struct {
3469 	int n_boxes;
3470 	Box* boxes;
3471 } BoxRegionRec, *PBoxRegionRec;
3472 
3473 typedef struct {
3474 	int type;
3475 	union {
3476 		BoxRegionRec box;
3477 		PolygonRegionRec polygon;
3478 		Handle image;
3479 	} data;
3480 } RegionRec, *PRegionRec;
3481 
3482 #define RGNOP(const_name) CONSTANT(rgnop,const_name)
3483 START_TABLE(rgnop,UV)
3484 #define rgnopCopy       0
3485 RGNOP(Copy)
3486 #define rgnopIntersect  1
3487 RGNOP(Intersect)
3488 #define rgnopUnion      2
3489 RGNOP(Union)
3490 #define rgnopXor        3
3491 RGNOP(Xor)
3492 #define rgnopDiff       4
3493 RGNOP(Diff)
3494 END_TABLE(rgnop,UV)
3495 #undef RGNOP
3496 
3497 #define RGN(const_name) CONSTANT(rgn,const_name)
3498 START_TABLE(rgn,UV)
3499 #define rgnOutside      0
3500 RGN(Outside)
3501 #define rgnInside       1
3502 RGN(Inside)
3503 #define rgnPartially    2
3504 RGN(Partially)
3505 END_TABLE(rgn,UV)
3506 #undef RGN
3507 
3508 extern Bool
3509 apc_region_create( Handle self, PRegionRec rec);
3510 
3511 extern Bool
3512 apc_region_destroy( Handle self);
3513 
3514 extern Bool
3515 apc_region_offset( Handle self, int dx, int dy);
3516 
3517 extern Bool
3518 apc_region_combine( Handle self, Handle other_region, int rgnop);
3519 
3520 extern Bool
3521 apc_region_point_inside( Handle self, Point p);
3522 
3523 extern int
3524 apc_region_rect_inside( Handle self, Rect r);
3525 
3526 extern Bool
3527 apc_region_equals( Handle self, Handle other_region);
3528 
3529 extern Box
3530 apc_region_get_box( Handle self);
3531 
3532 extern Bool
3533 apc_region_is_empty( Handle self);
3534 
3535 extern ApiHandle
3536 apc_region_get_handle( Handle self);
3537 
3538 extern PRegionRec
3539 apc_region_copy_rects( Handle self);
3540 
3541 /* gp functions */
3542 extern Bool
3543 apc_gp_init( Handle self);
3544 
3545 extern Bool
3546 apc_gp_done( Handle self);
3547 
3548 extern Bool
3549 apc_gp_aa_fill_poly( Handle self, int numPts, NPoint * points);
3550 
3551 extern Bool
3552 apc_gp_alpha( Handle self, int alpha, int x1, int y1, int x2, int y2);
3553 
3554 extern Bool
3555 apc_gp_arc( Handle self, int x, int y, int dX, int dY, double angleStart, double angleEnd);
3556 
3557 extern Bool
3558 apc_gp_bar( Handle self, int x1, int y1, int x2, int y2);
3559 
3560 extern Bool
3561 apc_gp_bars( Handle self, int nr, Rect *rr);
3562 
3563 extern Bool
3564 apc_gp_can_draw_alpha( Handle self);
3565 
3566 extern Bool
3567 apc_gp_clear( Handle self, int x1, int y1, int x2, int y2);
3568 
3569 extern Bool
3570 apc_gp_chord( Handle self, int x, int y, int dX, int dY, double angleStart, double angleEnd);
3571 
3572 extern Bool
3573 apc_gp_draw_poly( Handle self, int numPts, Point * points);
3574 
3575 extern Bool
3576 apc_gp_draw_poly2( Handle self, int numPts, Point * points);
3577 
3578 extern Bool
3579 apc_gp_ellipse( Handle self, int x, int y, int dX, int dY);
3580 
3581 extern Bool
3582 apc_gp_fill_chord( Handle self, int x, int y, int dX, int dY, double angleStart, double angleEnd);
3583 
3584 extern Bool
3585 apc_gp_fill_ellipse( Handle self, int x, int y, int dX, int dY);
3586 
3587 extern Bool
3588 apc_gp_fill_poly( Handle self, int numPts, Point * points);
3589 
3590 extern Bool
3591 apc_gp_fill_sector( Handle self, int x, int y, int dX, int dY, double angleStart, double angleEnd);
3592 
3593 extern Bool
3594 apc_gp_flood_fill( Handle self, int x, int y, Color borderColor, Bool singleBorder);
3595 
3596 #define GGO(const_name) CONSTANT(ggo,const_name)
3597 START_TABLE(ggo,UV)
3598 #define ggoGlyphIndex   0x01
3599 #define ggoUseHints     0x02
3600 #define ggoUnicode      0x04
3601 
3602 #define ggoMove         0
3603 GGO(Move)
3604 #define ggoLine         1
3605 GGO(Line)
3606 #define ggoConic        2
3607 GGO(Conic)
3608 #define ggoCubic        3
3609 GGO(Cubic)
3610 END_TABLE(ggo,UV)
3611 #undef GGO
3612 
3613 extern int
3614 apc_gp_get_glyph_outline( Handle self, int index, int flags, int ** buffer);
3615 
3616 extern Color
3617 apc_gp_get_pixel( Handle self, int x, int y);
3618 
3619 extern Bool
3620 apc_gp_line( Handle self, int x1, int y1, int x2, int y2);
3621 
3622 extern Bool
3623 apc_gp_put_image( Handle self, Handle image, int x, int y,
3624 						int xFrom, int yFrom, int xLen, int yLen, int rop);
3625 extern Bool
3626 apc_gp_rectangle( Handle self, int x1, int y1, int x2, int y2);
3627 
3628 extern Bool
3629 apc_gp_sector( Handle self, int x, int y, int dX, int dY,
3630 					double angleStart, double angleEnd);
3631 
3632 extern Bool
3633 apc_gp_set_pixel( Handle self, int x, int y, Color color);
3634 
3635 extern Bool
3636 apc_gp_stretch_image( Handle self, Handle image,
3637 	int x, int y, int xFrom, int yFrom,
3638 	int xDestLen, int yDestLen, int xLen, int yLen,
3639 	int rop);
3640 
3641 #define TO(const_name) CONSTANT(to,const_name)
3642 START_TABLE(to,UV)
3643 #define toPlain          0x0000
3644 TO(Plain)
3645 #define toAddOverhangs   0x0001
3646 TO(AddOverhangs)
3647 #define toGlyphs         0x0002
3648 TO(Glyphs)
3649 #define toUTF8           0x0004
3650 #define toUnicode        0x0004
3651 TO(Unicode)
3652 #define toRTL            0x8000
3653 TO(RTL)
3654 #define toPitch          8
3655 END_TABLE(to,UV)
3656 #undef TO
3657 
3658 typedef struct {
3659 	char     *language;
3660 	uint32_t *text;
3661 	int len, flags;
3662 	Byte     *analysis;
3663 	uint16_t *v2l;
3664 
3665 	unsigned int n_glyphs, n_glyphs_max;
3666 	uint16_t *glyphs, *indexes, *advances;
3667 	int16_t *positions;
3668 	uint16_t *fonts;
3669 } TextShapeRec, *PTextShapeRec;
3670 
3671 typedef Bool TextShapeFunc( Handle self, PTextShapeRec rec);
3672 typedef TextShapeFunc *PTextShapeFunc;
3673 
3674 typedef struct {
3675 	int len, flags, text_len;
3676 	uint16_t *glyphs, *indexes, *advances;
3677 	int16_t  *positions;
3678 	uint16_t *fonts;
3679 } GlyphsOutRec, *PGlyphsOutRec;
3680 
3681 extern Bool
3682 apc_gp_glyphs_out( Handle self, PGlyphsOutRec t, int x, int y);
3683 
3684 extern Bool
3685 apc_gp_text_out( Handle self, const char * text, int x, int y, int len, int flags);
3686 
3687 /* gpi settings */
3688 extern int
3689 apc_gp_get_alpha( Handle self);
3690 
3691 extern Bool
3692 apc_gp_get_antialias( Handle self);
3693 
3694 extern Color
3695 apc_gp_get_back_color( Handle self);
3696 
3697 extern int
3698 apc_gp_get_bpp( Handle self);
3699 
3700 extern Color
3701 apc_gp_get_color( Handle self);
3702 
3703 extern Rect
3704 apc_gp_get_clip_rect( Handle self);
3705 
3706 extern PFontABC
3707 apc_gp_get_font_abc( Handle self, int firstChar, int lastChar, int flags);
3708 
3709 extern PFontABC
3710 apc_gp_get_font_def( Handle self, int firstChar, int lastChar, int flags);
3711 
3712 extern unsigned long *
3713 apc_gp_get_font_ranges( Handle self, int * count);
3714 
3715 #define MAPPER_FLAGS_COMBINING_SUPPORTED 0x01
3716 #define MAPPER_FLAGS_SYNTHETIC_PITCH     0x02
3717 
3718 extern unsigned long *
3719 apc_gp_get_mapper_ranges(PFont font, int * count, unsigned int * flags);
3720 
3721 extern char *
3722 apc_gp_get_font_languages( Handle self);
3723 
3724 extern int
3725 apc_gp_get_fill_mode( Handle self);
3726 
3727 extern FillPattern *
3728 apc_gp_get_fill_pattern( Handle self);
3729 
3730 extern Point
3731 apc_gp_get_fill_pattern_offset( Handle self);
3732 
3733 extern Point*
3734 apc_gp_get_glyphs_box( Handle self, PGlyphsOutRec text);
3735 
3736 extern int
3737 apc_gp_get_glyphs_width( Handle self, PGlyphsOutRec text);
3738 
3739 extern ApiHandle
3740 apc_gp_get_handle( Handle self);
3741 
3742 extern int
3743 apc_gp_get_line_end( Handle self);
3744 
3745 extern int
3746 apc_gp_get_line_join( Handle self);
3747 
3748 extern float
3749 apc_gp_get_line_width( Handle self);
3750 
3751 extern int
3752 apc_gp_get_line_pattern( Handle self, unsigned char * buffer);
3753 
3754 extern float
3755 apc_gp_get_miter_limit( Handle self);
3756 
3757 extern Color
3758 apc_gp_get_nearest_color( Handle self, Color color);
3759 
3760 extern PRGBColor
3761 apc_gp_get_physical_palette( Handle self, int * colors);
3762 
3763 extern Bool
3764 apc_gp_get_region( Handle self, Handle rgn);
3765 
3766 extern Point
3767 apc_gp_get_resolution( Handle self);
3768 
3769 extern int
3770 apc_gp_get_rop( Handle self);
3771 
3772 extern int
3773 apc_gp_get_rop2( Handle self);
3774 
3775 extern Point*
3776 apc_gp_get_text_box( Handle self, const char * text, int len, int flags);
3777 
3778 extern Bool
3779 apc_gp_get_text_opaque( Handle self);
3780 
3781 #define TS(const_name) CONSTANT(ts,const_name)
3782 START_TABLE(ts,UV)
3783 #define tsNone      0
3784 TS(None)
3785 #define tsGlyphs    1
3786 TS(Glyphs)
3787 #define tsFull      2
3788 TS(Full)
3789 #define tsDefault   tsFull
3790 TS(Default)
3791 #define tsBytes     3
3792 TS(Bytes)
3793 END_TABLE(ts,UV)
3794 #undef TS
3795 
3796 extern PTextShapeFunc
3797 apc_gp_get_text_shaper( Handle self, int * type);
3798 
3799 extern int
3800 apc_gp_get_text_width( Handle self, const char * text, int len, int flags);
3801 
3802 extern Bool
3803 apc_gp_get_text_out_baseline( Handle self);
3804 
3805 extern Point
3806 apc_gp_get_transform( Handle self);
3807 
3808 extern Bool
3809 apc_gp_set_alpha( Handle self, int alpha);
3810 
3811 extern Bool
3812 apc_gp_set_antialias( Handle self, Bool aa);
3813 
3814 extern Bool
3815 apc_gp_set_back_color( Handle self, Color color);
3816 
3817 extern Bool
3818 apc_gp_set_clip_rect( Handle self, Rect clipRect);
3819 
3820 extern Bool
3821 apc_gp_set_color( Handle self, Color color);
3822 
3823 extern Bool
3824 apc_gp_set_fill_mode( Handle self, int fillMode);
3825 
3826 extern Bool
3827 apc_gp_set_fill_pattern( Handle self, FillPattern pattern);
3828 
3829 extern Bool
3830 apc_gp_set_fill_pattern_offset( Handle self, Point offset);
3831 
3832 extern Bool
3833 apc_gp_set_font( Handle self, PFont font);
3834 
3835 extern Bool
3836 apc_gp_set_line_end( Handle self, int lineEnd);
3837 
3838 extern Bool
3839 apc_gp_set_line_join( Handle self, int lineJoin);
3840 
3841 extern Bool
3842 apc_gp_set_line_width( Handle self, float lineWidth);
3843 
3844 extern Bool
3845 apc_gp_set_line_pattern( Handle self, unsigned char * pattern, int len);
3846 
3847 extern Bool
3848 apc_gp_set_miter_limit( Handle self, float limit);
3849 
3850 extern Bool
3851 apc_gp_set_palette( Handle self);
3852 
3853 extern Bool
3854 apc_gp_set_region( Handle self, Handle rgn);
3855 
3856 extern Bool
3857 apc_gp_set_rop( Handle self, int rop);
3858 
3859 extern Bool
3860 apc_gp_set_rop2( Handle self, int rop);
3861 
3862 extern Bool
3863 apc_gp_set_transform( Handle self, int x, int y);
3864 
3865 extern Bool
3866 apc_gp_set_text_opaque( Handle self, Bool opaque);
3867 
3868 extern Bool
3869 apc_gp_set_text_out_baseline( Handle self, Bool baseline);
3870 
3871 /* printer */
3872 extern Bool
3873 apc_prn_create( Handle self);
3874 
3875 extern Bool
3876 apc_prn_destroy( Handle self);
3877 
3878 extern PrinterInfo*
3879 apc_prn_enumerate( Handle self, int * count);
3880 
3881 extern Bool
3882 apc_prn_select( Handle self, const char* printer);
3883 
3884 extern ApiHandle
3885 apc_prn_get_handle( Handle self);
3886 
3887 extern char*
3888 apc_prn_get_selected( Handle self);
3889 
3890 extern Point
3891 apc_prn_get_size( Handle self);
3892 
3893 extern Point
3894 apc_prn_get_resolution( Handle self);
3895 
3896 extern char*
3897 apc_prn_get_default( Handle self);
3898 
3899 extern Bool
3900 apc_prn_setup( Handle self);
3901 
3902 extern Bool
3903 apc_prn_begin_doc( Handle self, const char* docName);
3904 
3905 extern Bool
3906 apc_prn_begin_paint_info( Handle self);
3907 
3908 extern Bool
3909 apc_prn_end_doc( Handle self);
3910 
3911 extern Bool
3912 apc_prn_end_paint_info( Handle self);
3913 
3914 extern Bool
3915 apc_prn_new_page( Handle self);
3916 
3917 extern Bool
3918 apc_prn_abort_doc( Handle self);
3919 
3920 extern Bool
3921 apc_prn_enum_options( Handle self, int * count, char *** options);
3922 
3923 extern Bool
3924 apc_prn_get_option( Handle self, char * option, char ** value);
3925 
3926 extern Bool
3927 apc_prn_set_option( Handle self, char * option, char * value);
3928 
3929 /* fonts */
3930 extern PFont
3931 apc_font_default( PFont font);
3932 
3933 extern int
3934 apc_font_load( Handle self, char* filename);
3935 
3936 extern Bool
3937 apc_font_pick( Handle self, PFont source, PFont dest);
3938 
3939 extern PFont
3940 apc_fonts( Handle self, const char *facename, const char *encoding, int *retCount);
3941 
3942 extern PHash
3943 apc_font_encodings( Handle self);
3944 
3945 /* system metrics */
3946 extern Bool
3947 apc_sys_get_insert_mode( void);
3948 
3949 extern PFont
3950 apc_sys_get_msg_font( PFont copyTo);
3951 
3952 extern PFont
3953 apc_sys_get_caption_font( PFont copyTo);
3954 
3955 extern int
3956 apc_sys_get_value( int sysValue);
3957 
3958 extern Bool
3959 apc_sys_set_insert_mode( Bool insMode);
3960 
3961 /* file */
3962 #define FE(const_name) CONSTANT(fe,const_name)
3963 START_TABLE(fe,UV)
3964 #define feRead      1
3965 FE(Read)
3966 #define feWrite     2
3967 FE(Write)
3968 #define feException 4
3969 FE(Exception)
3970 END_TABLE(fe,UV)
3971 #undef FE
3972 
3973 extern Bool
3974 apc_file_attach( Handle self);
3975 
3976 extern Bool
3977 apc_file_detach( Handle self);
3978 
3979 extern Bool
3980 apc_file_change_mask( Handle self);
3981 
3982 /* etc */
3983 extern Bool
3984 apc_beep( int style);
3985 
3986 extern Bool
3987 apc_beep_tone( int freq, int duration);
3988 
3989 /* fetch resource constants */
3990 #define FR(const_name) CONSTANT(fr,const_name)
3991 START_TABLE(fr,UV)
3992 #define frString    0
3993 FR(String)
3994 #define frColor     1
3995 FR(Color)
3996 #define frFont      2
3997 FR(Font)
3998 END_TABLE(fr,UV)
3999 #undef FR
4000 
4001 extern Bool
4002 apc_fetch_resource( const char *className, const char *name,
4003 	const char *resClass, const char *res,
4004 	Handle owner, int resType,
4005 	void *val);
4006 
4007 extern Color
4008 apc_lookup_color( const char *colorName);
4009 
4010 extern char *
4011 apc_system_action( const char *params);
4012 
4013 extern Bool
4014 apc_query_drives_map( const char *firstDrive, char *result, int len);
4015 
4016 extern int
4017 apc_query_drive_type( const char *drive);
4018 
4019 extern char*
4020 apc_get_user_name( void);
4021 
4022 extern PList
4023 apc_getdir( const char *dirname, Bool is_utf8);
4024 
4025 typedef struct {
4026 	uint32_t dev;
4027 	uint32_t ino;
4028 	uint32_t mode;
4029 	uint32_t nlink;
4030 	uint32_t uid;
4031 	uint32_t gid;
4032 	uint32_t rdev;
4033 	uint64_t size;
4034 	int32_t  blksize;
4035 	int32_t  blocks;
4036 	float    atim;
4037 	float    mtim;
4038 	float    ctim;
4039 } StatRec, *PStatRec;
4040 
4041 typedef struct {
4042 	Bool      is_utf8, is_active;
4043 	void *    handle;
4044 } DirHandleRec, *PDirHandleRec;
4045 
4046 extern int
4047 apc_fs_access(const char *name, Bool is_utf8, int mode, Bool effective);
4048 
4049 extern Bool
4050 apc_fs_chdir(const char *path, Bool is_utf8 );
4051 
4052 extern Bool
4053 apc_fs_chmod( const char *path, Bool is_utf8, int mode);
4054 
4055 extern Bool
4056 apc_fs_closedir( PDirHandleRec dh);
4057 
4058 extern char *
4059 apc_fs_from_local(const char * text, int * len);
4060 
4061 extern char*
4062 apc_fs_getcwd(void);
4063 
4064 extern char*
4065 apc_fs_getenv(const char * varname, Bool is_utf8, Bool * do_free);
4066 
4067 extern Bool
4068 apc_fs_link( const char* oldname, Bool is_old_utf8, const char * newname, Bool is_new_utf8 );
4069 
4070 extern Bool
4071 apc_fs_mkdir( const char* path, Bool is_utf8, int mode);
4072 
4073 extern Bool
4074 apc_fs_opendir( const char *path, PDirHandleRec dh);
4075 
4076 extern int
4077 apc_fs_open_file( const char* path, Bool is_utf8, int flags, int mode);
4078 
4079 #define PATH_MAX_UTF8 (PATH_MAX*6)
4080 extern Bool
4081 apc_fs_readdir( PDirHandleRec dh, char * entry);
4082 
4083 extern Bool
4084 apc_fs_rename( const char* oldname, Bool is_old_utf8, const char * newname, Bool is_new_utf8 );
4085 
4086 extern Bool
4087 apc_fs_rewinddir( PDirHandleRec dh );
4088 
4089 extern Bool
4090 apc_fs_rmdir( const char* path, Bool is_utf8 );
4091 
4092 extern Bool
4093 apc_fs_seekdir( PDirHandleRec dh, long position );
4094 
4095 extern Bool
4096 apc_fs_setenv(const char * varname, Bool is_name_utf8, const char * value, Bool is_value_utf8);
4097 
4098 extern Bool
4099 apc_fs_stat(const char *name, Bool is_utf8, Bool link, PStatRec statrec);
4100 
4101 extern char *
4102 apc_fs_to_local(const char * text, Bool fail_if_cannot, int * len);
4103 
4104 extern long
4105 apc_fs_telldir( PDirHandleRec dh );
4106 
4107 extern Bool
4108 apc_fs_unlink( const char* path, Bool is_utf8 );
4109 
4110 extern Bool
4111 apc_fs_utime( double atime, double mtime, const char* path, Bool is_utf8 );
4112 
4113 extern Bool
4114 apc_dl_export(char *path);
4115 
4116 /* OpenMP support */
4117 extern int
4118 prima_omp_max_threads(void);
4119 
4120 extern int
4121 prima_omp_thread_num(void);
4122 
4123 extern void
4124 prima_omp_set_num_threads(int num);
4125 
4126 #ifdef HAVE_OPENMP
4127 #define OMP_MAX_THREADS prima_omp_max_threads()
4128 #define OMP_THREAD_NUM prima_omp_thread_num()
4129 #else
4130 #define OMP_MAX_THREADS 1
4131 #define OMP_THREAD_NUM  0
4132 #endif
4133 
4134 typedef struct {
4135 	void *stack, *heap;
4136 	unsigned int elem_size, count, size;
4137 } semistatic_t;
4138 
4139 extern void
4140 semistatic_init( semistatic_t * s, void * stack, unsigned int elem_size, unsigned int static_size);
4141 
4142 extern int
4143 semistatic_expand( semistatic_t * s, unsigned int desired_elems);
4144 
4145 extern void
4146 semistatic_done( semistatic_t * s);
4147 
4148 #define semistatic_at(s,type,i) (((type*)s.heap)[i])
4149 
4150 #define semistatic_push(s,type,v) \
4151 	((( s.count >= s.size ) ? semistatic_expand(&s,-1) : 1) && \
4152 		(((((type*)s.heap)[s.count++])=v) || 1))
4153 
4154 #ifdef __cplusplus
4155 }
4156 #endif
4157 
4158 #endif
4159 
4160