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