#ifndef FEELIN_H
#define FEELIN_H    1

/*
**    $VER: feelin.h 3.0 (26-06-2002)
**
**    feelin.library definitions
**
**    © 2001-02 Laviale Olivier (Lotan9@aol.com)
*/

/// Module information
#include    <exec/libraries.h>
#include    <exec/semaphores.h>

#include    <graphics/rastport.h>
#include    <graphics/text.h>
#include    <intuition/intuition.h>
#include    <utility/tagitem.h>

#define     TRUE -1
#define     FV_VERSION 4L

#define     FEELIN_DEV

/*
   All constants follow these rules :

   FM_<method>          - General method, understood by all classes
   FM_<class>_<method>  - Class method
   FA_<attrib>          - General attribute, known by many classes.
   FA_<class>_<attrib>  - Specific class attribute
   FV_<class>_<value>   - Special attribute value
   FS_<name>            - Shortcut to structure name
   FP_<class>_<value>   - Preference value, resolved on FM_Setup

   FA_<attrib> definitions are followed by a comment [ISG] :
      I : it's possible to specify this attribute at object creation time.
      S : it's possible to change this attribute with F_Set().
      G : it's possible to get this attribute with F_Get().

   FR_<class> = Registered class id (unsigned 24 bits)
   FR_<class>_Mthd = First Method ID of <class>
   FR_<class>_Attr = First Attribute ID of <class>
   FR_<class>_Pref = First Preference ID of <class>

   Ranges:

   $F0000000 - $FFFFFFFF is reserved for Feelin methods.
   $8F000000 - $8FFFFFFF is reserved for Feelin attributes.
   $50000000 - $5FFFFFFF is reserver for Preference items.

   $C0000000 - $CFFFFFFF is reserved for custom classes methods.
   $8C000000 - $8CFFFFFF is reserved for custom classes attributes.
*/

#define MTHD_BASE 0xF0000000
#define ATTR_BASE 0x8F000000
#define PREF_BASE 0x50000000

#define FCCM_BASE 0xC0000000
#define FCCA_BASE 0x8C000000
//+

/*** Misc ******************************************************************/

/// System Structures
//#define FS_Class                    FeelinClass

struct FeelinNode {
    struct FeelinNode              *Next;
    struct FeelinNode              *Prev;
};

struct FeelinList {
    struct FeelinNode              *Head;
    struct FeelinNode              *Tail;
};

struct FeelinListSemaphored {
    struct FeelinNode              *Head;
    struct FeelinNode              *Tail;
/* end of FeelinList header */
    struct SignalSemaphore          Semaphore;
};

struct FeelinNodeData {
    struct FeelinNode              *Next;
    struct FeelinNode              *Prev;
/* end of FeelinNode header */
    APTR                            Data;
};

struct FeelinClass {
    struct FeelinNode              *Next;
    struct FeelinNode              *Prev;
/* end of FeelinNode header */
    STRPTR                          ID;
    UWORD                           OffSet;
    UWORD                           Size;
    struct FeelinClass             *Super;

    APTR                            UserData;
    APTR                          (*Dispatcher)();
#ifdef FEELIN_DEV
    APTR                          (*Setup)();
    APTR                          (*Cleanup)();
    ULONG                           OpenCount;
    struct Library                 *Libbase;
    struct FeelinPool              *ObjectsPool;
#endif
};

struct FeelinBase
{
    struct  Library                 Libnode;
    UBYTE                           fb_Flags;
    UBYTE                           fb_Reserved;
    APTR                            fb_SegList;

    struct  FeelinServer           *SystemServer;

    struct  Library                *Exec;
    struct  Library                *Dos;
    struct  Library                *Graphics;
    struct  Library                *Intuition;
    struct  Library                *Utility;
    struct  Library                *Layers;

    struct  FeelinPool             *DefaultPool;
    struct  FeelinPool             *ClassesPool;

    struct  FeelinList              Pools;
    struct  FeelinList              Classes;
    struct  FeelinListSemaphored    Servers;

    struct  SignalSemaphore         RenderSemaphore;
    APTR                            Console;
    APTR                            PutChar;
};

#ifdef FEELIN_DEV
struct FeelinMemChunk
{
    struct  FeelinMemChunk         *Next;
    ULONG                           Size; /* Complete size (Struct + Alloc) */
/* Memory area follows */
};

struct FeelinPuddle
{
    struct  FeelinNode             *Next;
    struct  FeelinNode             *Prev;
/* end of FeelinNode header */
    struct  FeelinPool             *Pool;
    ULONG                           Lower;
    ULONG                           Upper;
    struct  FeelinMemChunk         *First;
    ULONG                           Size;   /* Real size of allocation */
    ULONG                           Free;   /* Memory area follows */
};

struct FeelinPool
{
    struct  FeelinNode             *Next;
    struct  FeelinNode             *Prev;
/* end of FeelinNode header */
    struct  SignalSemaphore         Semaphore;

    ULONG                           Flags;
    ULONG                           PuddleSize;
    ULONG                           ThreshSize;
    struct  FeelinList              Puddles;
};
#endif
//+
/// Macros:
/// Macros / Quick object's structure handling
#define INST_DATA(cl,o) ((void *) ( ((UBYTE *)o) + cl->OffSet))

#define _asarea(o)      ((struct FeelinArea *)(o))
#define _box(o)         (_asarea(o)->Box)
#define _x(o)           _box(o).x
#define _y(o)           _box(o).y
#define _w(o)           _box(o).w
#define _h(o)           _box(o).h
#define _x2(o)          (_x(o) + _w(o) - 1)
#define _y2(o)          (_y(o) + _h(o) - 1)
#define _inner(o)       (_asarea(o)->Inner)
#define _bl(o)          _inner(o).l
#define _bt(o)          _inner(o).t
#define _br(o)          _inner(o).r
#define _bb(o)          _inner(o).b
#define _mx(o)          (_x(o) + _bl(o))
#define _my(o)          (_y(o) + _bt(o))
#define _mw(o)          (_w(o) - _bl(o) - _br(o))
#define _mh(o)          (_h(o) - _bt(o) - _bb(o))
#define _mx2(o)         (_x2(o) - _br(o))
#define _my2(o)         (_y2(o) - _bb(o))
#define _minw(o)        (_asarea(o)->MinMax.MinW)
#define _minh(o)        (_asarea(o)->MinMax.MinH)
#define _maxw(o)        (_asarea(o)->MinMax.MaxW)
#define _maxh(o)        (_asarea(o)->MinMax.MaxH)
#define _weight(o)      (_asarea(o)->Weight)
#define _flags(o)       (_asarea(o)->Flags)
#define _font(o)        (_asarea(o)->Font)
#define _handler(o)     (_asarea(o)->Handler)
#define _pens(o)        (_asarea(o)->Pens)
#define _pen(o,p)       (_asarea(o)->Pens[p])

#define _render(o)      (_asarea(o)->Render)
#define _context(o)     (_render(o)->psContext)
#define _winobj(o)      (_render(o)->paWindowObject)
#define _client(o)      (_render(o)->paClientObject)
#define _win(o)         (_render(o)->psWindow)
#define _rp(o)          (_render(o)->psRPort)
#define _scr(o)         (_context(o)->psScreen)
#define _fixw(o)        (_minw(o) == _maxw(o))
#define _fixh(o)        (_minh(o) == _maxh(o))
//+
/// Macros / Drawing
#define _FPen(o,fp)        (SetAPen(rp,_pen(o,fp)))
#define _APen(p)           (SetAPen(rp,p))
#define _BPen(p)           (SetBPen(rp,p))
#define _DrMd(m)           (SetDrMd(rp,m))
#define _Plot(x1,y1)       (WritePixel(rp,x1,y1))
#define _Move(x,y)         (Move(rp,x,y))
#define _Draw(x,y)         (Draw(rp,x,y))
#define _Boxf(x1,y1,x2,y2) (RectFill(rp,x1,y1,x2,y2))
#define _Text(s,c)         (Text(rp,s,c))
//+
/// Macros / Object Generation
enum {
    FV_MakeObj_Label = 1,                       // label:PTR TO CHAR, flags:LONG
    FV_MakeObj_Button,                          // label:PTR TO CHAR
    FV_MakeObj_Bar,                             // Horiz:BOOL
    FV_MakeObj_BarTitle,                        // label:PTR TO CHAR
    FV_MakeObj_Gauge,                           // Horiz:BOOl,LONG Min, LONG Max, LONG Value
    FV_MakeObj_Slider,                          // Horiz:BOOl,LONG Min, LONG Max, LONG Value
    FV_MakeObj_Prop,                            // Horiz:BOOl,LONG entries, LONG visible, LONG first
    FV_MakeObj_String                           // label:PTR TO CHAR,maxlen:LONG
};

#define SimpleButton(x)       F_MakeObj(FV_MakeObj_Button,x)
#define Bar                   F_MakeObjA(FV_MakeObj_Bar,NULL)
#define BarTitle(x)           F_MakeObj(FV_MakeObj_BarTitle,x)
#define Gauge(h,mi,ma,v)      F_MakeObj(FV_MakeObj_Gauge,h,mi,ma,v)
#define Slider(h,mi,ma,v)     F_MakeObj(FV_MakeObj_Slider,h,mi,ma,v)
#define Prop(h,e,v,f)         F_MakeObj(FV_MakeObj_Prop,h,e,v,f)
#define String(s,l)           F_MakeObj(FV_MakeObj_String,s,l)

#define Child       FA_Child
#define End         TAG_DONE)
//+
///Macros / C
#ifdef _DCC
#define REG(x) __ ## x
#define ASM
#define SAVEDS __geta4
#else
#define REG(x) register __ ## x
#define ASM    __asm
#define SAVEDS __saveds
#endif

#define REG_D0  REG(d0)
#define REG_D1  REG(d1)
#define REG_D2  REG(d2)
#define REG_D3  REG(d3)
#define REG_D4  REG(d4)
#define REG_D5  REG(d5)
#define REG_D6  REG(d6)
#define REG_D7  REG(d7)

#define REG_A0  REG(a0)
#define REG_A1  REG(a1)
#define REG_A2  REG(a2)
#define REG_A3  REG(a3)
#define REG_A4  REG(a4)
#define REG_A5  REG(a5)
#define REG_A6  REG(a6)
#define REG_A7  REG(a7)

#define MAKE_ID(a,b,c,d)    \
    ((ULONG) (a)<<24 | (ULONG) (b)<<16 | (ULONG) (c)<<8 | (ULONG) (d))
//+
//+
/// Keyboards events coming along FM_HandleEvent
#define FV_Key_Release         -2     // upstroke return - Not a real key, faked when FK_PRESS is released
#define FV_Key_None            -1
#define FV_Key_Press            0
#define FV_Key_Toggle           1
#define FV_Key_Top              2     // control up
#define FV_Key_Bottom           3     // control down
#define FV_Key_Up               4     // up
#define FV_Key_Down             5     // down
#define FV_Key_Left             6     // left
#define FV_Key_Right            7     // right
#define FV_Key_Word_Prev        8     // shift left
#define FV_Key_Word_Next        9     // shift right
#define FV_Key_Line_Start      10     // alt left
#define FV_Key_Line_End        11     // alt right
#define FV_Key_Object_Next     12     // tab
#define FV_Key_Object_Prev     13     // shift tab
#define FV_Key_Char_Back       14     // backspace
#define FV_Key_Char_Del        15     // del
#define FV_Key_Word_Back       16     // alt backspace
#define FV_Key_Word_Del        17     // alt del
#define FV_Key_Line_Back       18     // shift backspace
#define FV_Key_Line_Del        19     // shift del
#define FV_Key_Window_Close    20     // esc
//+

/*** Root Object for most objects ******************************************/

/// Object                             0x000000
#define FC_Object          "Object.fc"

#define FR_Object           0x000000
#define FR_Object_Mthd      MTHD_BASE | FR_Object
#define FR_Object_Attr      ATTR_BASE | FR_Object

#define FM_New                                      0xF0000000
#define FM_Dispose                                  0xF0000001
#define FM_Set                                      0xF0000002
#define FM_Get                                      0xF0000003
#define FM_Notify                                   0xF0000004
#define FM_UnNotify                                 0xF0000005
#define FM_UnNotifyAttr                             0xF0000006
#define FM_MultiSet                                 0xF0000007
#define FM_SetAsString                              0xF0000008
#define FM_WriteLong                                0xF0000009
#define FM_WriteString                              0xF000000A
#define FM_CallDispatcher                           0xF000000B

#define FA_ID                                       0x8F000000
#define FA_UserData                                 0x8F000001
#define FA_NoNotify                                 0x8F000002
#define FA_Parent                                   0x8F000003
#define FA_Class                                    0x8F000004
#define FA_Revision                                 0x8F000005
#define FA_Version                                  0x8F000006
#define FA_ClassID                                  0x8F000007
#define FA_SuperID                                  0x8F000008
#define FA_DataSize                                 0x8F000009
#define FA_Dispatcher                               0x8F00000A
#define FA_ClassInit                                0x8F00000B
#define FA_ClassExit                                0x8F00000C
#define FA_ClassData                                0x8F00000D
#define FA_ClassPool                                0x8F00000E

long enum {
    FV_Notify_None,
    FV_Notify_Self,
    FV_Notify_Parent,
    FV_Notify_Window,
    FV_Notify_Client,
    FV_Notify_Always  = 0x49893131,
    FV_Notify_Toggle  = 0x49893132
};

#define FV_Notify_Value FV_Notify_Always

struct FeelinObject
{
    struct  FeelinNode             *Next;
    struct  FeelinNode             *Prev;
/* end of FeelinNode header */
    struct  FeelinObject           *Parent;
    ULONG                           ID;
    ULONG                           UserData;
};
//+

/*** Servers ***************************************************************/

///Server                             0x800000
#define FC_Server          "Server.fc"

#define FR_Server           0x800000
#define FR_Server_Mthd      MTHD_BASE | FR_Server
#define FR_Server_Attr      ATTR_BASE | FR_Server

long enum {
    FSA_Remove = FR_Server
};

#define FA_Server_Port                              0x8F800000

struct FeelinServer {
    struct Node                     ss_Link;
    WORD                            ss_NestCount;
    struct MinList                  ss_WaitQueue;
    struct SemaphoreRequest         ss_MultipleLink;
    struct Task                    *ss_Owner;
    WORD                            ss_QueueCount;
/* end of SignalSempahore header */
    UWORD                           nReserved;
    ULONG                           nOpenCount;
    struct MsgPort                 *psPort;
    struct FeelinNode               sNode;
};

struct FeelinServerMessage {
    struct Node                     mn_Node;
    struct MsgPort                 *mn_ReplyPort;
    UWORD                           mn_Length;
/* end of Message Header */
    UWORD                           Reserved;
    ULONG                           nAction;
    ULONG                          *pnArgs;
    ULONG                           nReturn;
};
//+
///SystemServer                       0x800040
#define FR_SystemServer         0x800040
#define FR_SystemServer_Mthd    MTHD_BASE | FR_SystemServer
#define FR_SystemServer_Attr    ATTR_BASE | FR_SystemServer

#define FM_SystemServer_OpenLibrary                 0xF0800040
#define FM_SystemServer_CloseLibrary                0xF0800041
#define FM_SystemServer_ObtainTags                  0xF0800042
#define FM_SystemServer_MakeObject                  0xF0800043
#define FM_SystemServer_OpenFont                    0xF0800044
#define FM_SystemServer_CloseFont                   0xF0800045
#define FM_SystemServer_ClipboardLoad               0xF0800046
#define FM_SystemServer_ClipboardSave               0xF0800047

#define FA_SystemServer                             0x8F800040
//+
///WindowServer                       0x800080
#define FR_WindowServer         0x800080
#define FR_WindowServer_Mthd    MTHD_BASE | FR_WindowServer
#define FR_WindowServer_Attr    ATTR_BASE | FR_WindowServer
#define FR_WindowServer_Actn    FR_WindowServer

#define FA_SharedIDCMPPort                          0x8F800080
//+
///DisplayServer                      0x8000C0
#define FR_DisplayServer        0x8000C0
#define FR_DisplayServer_Mthd   MTHD_BASE | FR_DisplayServer
#define FR_DisplayServer_Attr   ATTR_BASE | FR_DisplayServer

#define FM_DisplayServer_FindDisplay                0xF08000C0
#define FM_DisplayServer_OpenDisplay                0xF08000C1
#define FM_DisplayServer_CloseDisplay               0xF08000C2
//+

/*** Tools *****************************************************************/

/// Tool                               0x700000
#define FC_Tool "Tool.fc"

#define FR_Tool        0x700000
#define FR_Tool_Mthd   MTHD_BASE | FR_Tool
#define FR_Tool_Attr   ATTR_BASE | FR_Tool

#define FA_Tool_Owner                               0x8F700000

struct FeelinTool {
    struct  FeelinObject           *Owner;
};
//+
/// Family                             0x700040
#define FC_Family           "Family.fc"
#define FamilyObject        F_NewObj(FC_Family

#define FR_Family           0x700040
#define FR_Family_Mthd      MTHD_BASE | FR_Family
#define FR_Family_Attr      ATTR_BASE | FR_Family

#define FM_Family_AddTail                           0xF0700040
#define FM_Family_Remove                            0xF0700041
#define FM_Family_AddHead                           0xF0700042
#define FM_Family_Insert                            0xF0700043
#define FM_Family_Sort                              0xF0700044
#define FM_Family_Transfer                          0xF0700045
#define FM_AddMember                                0xF0700040
#define FM_RemMember                                0xF0700041

#define FA_Child                                    0x8F700040
#define FA_Family                                   0x8F700041
#define FA_Family_List                              0x8F700042
#define FA_Family_Head                              0x8F700043
#define FA_Family_Tail                              0x8F700044

struct FeelinFamily { /*OF FeelinTool*/
    struct  FeelinObject           *Owner;
/*  end of FeelinTool header */
    struct  FeelinObject           *Head;
    struct  FeelinObject           *Tail;
};
//+
/// Numeric                            0x700080
#define FC_Numeric      "Numeric.fc"
#define NumericObject   F_NewObj(FC_Numeric

#define FR_Numeric        0x700080
#define FR_Numeric_Mthd   MTHD_BASE | FR_Numeric
#define FR_Numeric_Attr   ATTR_BASE | FR_Numeric

#define FM_Numeric_Increase                         0xF0700080
#define FM_Numeric_Decrease                         0xF0700081
#define FM_Numeric_Stringify                        0xF0700082
#define FM_Numeric_Reset                            0xF0700083

#define FA_Numeric_Default                          0x8F700080
#define FA_Numeric_Value                            0x8F700081
#define FA_Numeric_Min                              0x8F700082
#define FA_Numeric_Max                              0x8F700083
#define FA_Numeric_Step                             0x8F700084
#define FA_Numeric_Format                           0x8F700085
#define FA_Numeric_Formula                          0x8F700086
#define FA_Numeric_Multiply                         0x8F700087
#define FA_Numeric_Divide                           0x8F700088

#ifdef FEELIN_DEV
struct FeelinNumeric {/*OF feelinTool*/
    struct  FeelinObject           *Owner;
/* end of FeelinTool header */
    LONG                            Default;
    LONG                            Value;
    LONG                            Min;
    LONG                            Max;
    LONG                            Step;
    STRPTR                          String;
    STRPTR                          Format;
};
#endif
//+
/// FrameDisplay                       0x7000C0
#define FC_FrameDisplay        "FrameDisplay.fc"
#define FR_FrameDisplay         0x7000C0
#define FR_FrameDisplay_Mthd    MTHD_BASE | FR_FrameDisplay
#define FR_FrameDisplay_Attr    ATTR_BASE | FR_FrameDisplay
#define FR_FrameDisplay_Pref    PREF_BASE | FR_FrameDisplay

#define FrameDisplayObject      F_NewObj(FC_FrameDisplay

/* Methods */

#define FM_FrameDisplay_Draw                        0xF07000C0

/* Attributes */

#define FA_Frame                                    0x8F7000C0
#define FA_AltFrame                                 0x8F7000C1
#define FA_Back                                     0x8F7000C2
#define FA_AltBack                                  0x8F7000C3
#define FA_Frame_Font                               0x8F7000C4
#define FA_Frame_Title                              0x8F7000C5
#define FA_Frame_PreParse                           0x8F7000C6
#define FA_Frame_Position                           0x8F7000C7

/* Preference Items */

#define FP_Frame_Font                               0x507000C0
#define FP_Frame_PreParse                           0x507000C1
#define FP_Frame_Position                           0x507000C2
#define FP_Frame_Window                             0x507000C3
#define FP_Frame_Group                              0x507000C4
#define FP_Frame_Button                             0x507000C5
#define FP_Frame_Cycle                              0x507000C6
#define FP_Frame_Slider                             0x507000C7
#define FP_Frame_SliderKnob                         0x507000C8
#define FP_Frame_Scroller                           0x507000C9
#define FP_Frame_Listview                           0x507000CA
#define FP_Frame_ListXxx                            0x507000CB
#define FP_Frame_String                             0x507000CC
#define FP_Frame_Text                               0x507000CD
#define FP_Frame_Gauge                              0x507000CE
#define FP_Frame_Prop                               0x507000CF

/* Special values */

#define FV_Frame_None                   NULL
#define FV_Frame_LastBuiltin            255L
#define FF_Frame_InheritedBackground    (1L << 00)
#define FF_Frame_TitleDown              (1L << 01)
#define FF_Frame_Fill                   (1L << 00)

enum {                                  /* FA_Frame_Position */
   FV_Frame_UpLeft,
   FV_Frame_UpRight,
   FV_Frame_UpCenter,
   FV_Frame_DownLeft,
   FV_Frame_DownRight,
   FV_Frame_DownCenter
};

struct FeelinInner  { UBYTE l,t,r,b; };

#define FS_Inner    FeelinInner

struct FeelinFrameDisplay
{
    struct FeelinObject            *paOwner;
/* end of FeelinTool header */
    APTR                            paBackground;
    struct FS_Inner                 psInners[2];
    UWORD                           nFlags;
};

struct FS_FrameDisplay_Draw { struct FeelinRect *Rect; struct FeelinRender *Render; ULONG Flags; };

#ifdef FEELIN_DEV
struct FeelinFrameSpec
{
   UWORD id,aid; ULONG space,aspace;
};
#endif

#define NoFrame         FA_Frame,FV_Frame_None
#define ButtonFrame     FA_Frame,FP_Frame_Button
#define TextFrame       FA_Frame,FP_Frame_Text
#define StringFrame     FA_Frame,FP_Frame_String
#define PropFrame       FA_Frame,FP_Frame_Prop
#define SliderFrame     FA_Frame,FP_Frame_Slider
#define GaugeFrame      FA_Frame,FP_Frame_Gauge
#define GroupFrame      FA_Frame,FP_Frame_Group
//+

/*** GUI System ************************************************************/

/// Client                             0x004000
#define FC_Client         "Client.fc"
#define ClientObject       F_NewObj(FC_Client

#define FR_Client       0x004000
#define FR_Client_Mthd  MTHD_BASE | FR_Client
#define FR_Client_Attr  ATTR_BASE | FR_Client

#define FM_Client_Run                               0xF0004000
#define FM_Client_Event                             0xF0004001
#define FM_Client_WaitEvent                         0xF0004002
#define FM_Client_ReturnID                          0xF0004003
#define FM_Client_AddSignalHandler                  0xF0004004
#define FM_Client_RemSignalHandler                  0xF0004005
#define FM_Client_Resolve                           0xF0004006
#define FM_Client_OpenFont                          0xF0004007
#define FM_Client_Load                              0xF0004008
#define FM_Client_Save                              0xF0004009

#define FA_Client                                   0x8F004000
#define FA_Client_Title                             0x8F004001
#define FA_Client_Version                           0x8F004002
#define FA_Client_Copyright                         0x8F004003
#define FA_Client_Author                            0x8F004004
#define FA_Client_Description                       0x8F004005
#define FA_Client_Base                              0x8F004006
#define FA_Client_Unique                            0x8F004007
#define FA_Client_Signal                            0x8F004008
#define FA_Client_UserSignals                       0x8F004009
#define FA_Client_WindowPort                        0x8F00400A
#define FA_Client_BrokerPort                        0x8F00400B
#define FA_Client_BrokerHook                        0x8F00400C
#define FA_Client_BrokerPri                         0x8F00400D
#define FA_Client_Broker                            0x8F00400E
#define FA_Client_GUISpace                          0x8F00400F
#define FA_Client_OBJSpace                          0x8F004010
#define FA_Client_Context                           0x8F004011

#define FV_Client_Quit      -1L

enum {
    FV_Client_ENV,
    FV_Client_ENVARC,
    FV_Client_BOTH
};

struct FeelinSignalHandler
{
    struct  FeelinSignalHandler    *Next;
    struct  FeelinSignalHandler    *Prev;
/* end of FeelinNode header */
    ULONG                           Flags;
    struct  FeelinObject           *Object;
    ULONG                           Method;

    ULONG                           Signals;  /* Secs */
    ULONG                           Reserved; /* Micros */
/*
    union
    {
        struct
        {
            ULONG   Signals;
            ULONG   Reserved;
        } sig;

        struct
        {
            ULONG   Secs;
            ULONG   Micros;
        } timer;
    }
*/
};

#define FF_SignalHandler_Timer      (1L << 00)

struct FS_Resolve  { ULONG ID; ULONG *Storage; };
struct FS_OpenFont { struct FeelinObject *Obj; ULONG Type; };
//+
/// Window                             0x004040
#define FC_Window          "Window.fc"
#define WindowObject        F_NewObj(FC_Window

#define FR_Window       0x004040
#define FR_Window_Mthd  MTHD_BASE | FR_Window
#define FR_Window_Attr  ATTR_BASE | FR_Window
#define FR_Window_Pref  PREF_BASE | FR_Window

#define FM_Window_Event                             0xF0004040
#define FM_Window_ChainAdd                          0xF0004041
#define FM_Window_ChainRem                          0xF0004042
#define FM_Window_AddEventHandler                   0xF0004043
#define FM_Window_RemEventHandler                   0xF0004044
#define FM_Window_Layout                            0xF0004045
#define FM_Window_Draw                              0xF0004046
#define FM_Window_CreateDragDrop                    0xF0004047

#define FA_Window                                   0x8F004040
#define FA_Window_Title                             0x8F004041
#define FA_Window_ScreenTitle                       0x8F004042
#define FA_Window_Open                              0x8F004043
#define FA_Window_CloseRequest                      0x8F004044
#define FA_Window_Active                            0x8F004045
#define FA_Window_ActiveObject                      0x8F004046
#define FA_Window_Backdrop                          0x8F004047
#define FA_Window_Borderless                        0x8F004048
#define FA_Window_CloseGadget                       0x8F004049
#define FA_Window_DepthGadget                       0x8F00404A
#define FA_Window_SizeGadget                        0x8F00404B
#define FA_Window_DragBar                           0x8F00404C
#define FA_Window_MouseObject                       0x8F00404D
#define FA_Window_Renderer                          0x8F00404E
#define FA_Window_HandlePopHelp                     0x8F00404F

#define FP_Font_Window                              0x50004040
#define FP_Window_Renderer                          0x50004041
#define FP_Window_PopHelpDelay                      0x50004042

long enum {
    FV_Window_ActiveObject_Prev = -2,
    FV_Window_ActiveObject_Next,
    FV_Window_ActiveObject_None
};

/*** Window / FS_Render ****************************************************/

#define FeelinRender                FS_Render // backward compatibility

struct FeelinRender {
    struct FeelinServer             *psSystemServer;
    struct FeelinObject             *paClientObject;     // Valid between FM_Setup / FM_Cleanup
    struct FeelinObject             *paWindowObject;     // Valid between FM_Setup / FM_Cleanup
    struct FeelinDisplayContext     *psContext;          // Valid between FM_Setup / FM_Cleanup
    struct Window                   *psWindow;           // Valid between FM_Show  / FM_Hide
    struct RastPort                 *psRPort;            // Valid between FM_Show  / FM_Hide
    ULONG                           *pnPens;             // Set at will
    ULONG                             nFlags;
};

#define FF_Render_Refreshing        (1L << 00)
#define FF_Render_Forbid            (1L << 01)

/*** Window / FS_EventHandler **********************************************/

#define FeelinEventHandler          FS_EventHandler // backward compatibility

struct FS_EventHandler {
    struct FS_EventHandler         *Next;
    struct FS_EventHandler         *Prev;
/* end of FeelinNode header */
    UWORD                           Flags;
    BYTE                            Priority;       // Linked by priority
    UBYTE                           Reserved;
    ULONG                           Events;         // One or more IDCMP flags this handler should react on
    APTR                            Object;         // Object which should receive FM_HandleEvent
    struct FeelinClass             *Class;          // If class <> NIL then class will be called instead of object.class
};

#define FF_HandleEvent_Eat          (1L << 00)
//+
/*** GUI Classes ***********************************************************/

/// Area                               0x000040
#define FC_Area               "Area.fc"
#define AreaObject            F_NewObj(FC_Area
#define InputImmediate        FA_InputMode,FV_InputMode_Immediate
#define InputRelease          FA_InputMode,FV_InputMode_Release
#define InputToggle           FA_InputMode,FV_InputMode_Toggle
#define DontChain             FA_ChainToCycle,FALSE
#define HorizLayout           FA_Horizontal,TRUE

#define FR_Area         0x000040
#define FR_Area_Mthd    MTHD_BASE | FR_Area
#define FR_Area_Attr    ATTR_BASE | FR_Area
#define FR_Area_Pref    PREF_BASE | FR_Area

#define FM_Setup                                    0xF0000040
#define FM_Cleanup                                  0xF0000041
#define FM_Show                                     0xF0000042
#define FM_Hide                                     0xF0000043
#define FM_AskMinMax                                0xF0000044
#define FM_Layout                                   0xF0000045
#define FM_Draw                                     0xF0000046
#define FM_DrawBackground                           0xF0000047
#define FM_HandleEvent                              0xF0000048
#define FM_Active                                   0xF0000049
#define FM_Inactive                                 0xF000004A
#define FM_ModifyHandler                            0xF000004B
#define FM_BuildContextMenu                         0xF000004C
#define FM_BuildContextHelp                         0xF000004D
#define FM_DragQuery                                0xF000004E
#define FM_DragBegin                                0xF000004F
#define FM_DragFinish                               0xF0000050
#define FM_DragReport                               0xF0000051
#define FM_DragDrop                                 0xF0000052

#define FA_Area                                     0x8F000040
#define FA_Left                                     0x8F000041
#define FA_Top                                      0x8F000042
#define FA_Right                                    0x8F000043
#define FA_Bottom                                   0x8F000044
#define FA_Width                                    0x8F000045
#define FA_Height                                   0x8F000046
#define FA_Inner                                    0x8F000047
#define FA_Inner_Left                               0x8F000048
#define FA_Inner_Top                                0x8F000049
#define FA_Inner_Right                              0x8F00004A
#define FA_Inner_Bottom                             0x8F00004B
#define FA_Inner_Width                              0x8F00004C
#define FA_Inner_Height                             0x8F00004D
#define FA_MinWidth                                 0x8F00004E
#define FA_MinHeight                                0x8F00004F
#define FA_MaxWidth                                 0x8F000050
#define FA_MaxHeight                                0x8F000051
#define FA_FixWidth                                 0x8F000052
#define FA_FixHeight                                0x8F000053
#define FA_FixWidthTxt                              0x8F000054
#define FA_FixHeightTxt                             0x8F000055
#define FA_Fixed                                    0x8F000056
#define FA_FixedWidth                               0x8F000057
#define FA_FixedHeight                              0x8F000058
#define FA_Active                                   0x8F000059
#define FA_Selected                                 0x8F00005A
#define FA_Pressed                                  0x8F00005B
#define FA_Hidden                                   0x8F00005C
#define FA_Disabled                                 0x8F00005D
#define FA_Draggable                                0x8F00005E
#define FA_Dropable                                 0x8F00005F
#define FA_Timer                                    0x8F000060
#define FA_Font                                     0x8F000061
#define FA_FillArea                                 0x8F000062
#define FA_Weight                                   0x8F000063
#define FA_Horizontal                               0x8F000064
#define FA_InputMode                                0x8F000065
#define FA_ControlChar                              0x8F000066
#define FA_ChainToCycle                             0x8F000067
#define FA_WindowObject                             0x8F000068
#define FA_HiddenPage                               0x8F000069

long enum {
    FV_InputMode_None = 0,
    FV_InputMode_Immediate,
    FV_InputMode_Release,
    FV_InputMode_Toggle
};

long enum {
    FV_Font_Inherit = -1
};

#define FP_Font_Normal                              0x50000040
#define FP_Font_Tiny                                0x50000041
#define FP_Font_Big                                 0x50000042
#define FP_Font_Fixed                               0x50000043
#define FP_Font_Button                              0x50000044

#define FF_Horizontal          (1L << 00)
#define FF_Area_Selected       (1L << 01)
#define FF_Area_Pressed        (1L << 02)
#define FF_Area_Hidden         (1L << 03)
#define FF_Area_Disabled       (1L << 04)
#define FF_Area_Draggable      (1L << 05)
#define FF_Area_Dropable       (1L << 06)
#define FF_Area_FixedWidth     (1L << 07)
#define FF_Area_FixedHeight    (1L << 08)
#define FF_Area_Fixed          FF_Area_FixedWidth | FF_Area_FixedHeight
#define FF_Area_Active         (1L << 09)
#define FF_Area_HiddenPage     (1L << 10)
#define FF_ChainToCycle        (1L << 11)
#define FF_FillArea            (1L << 12)

#define FF_Custom_1            (1L << 25)
#define FF_Custom_2            (1L << 26)
#define FF_Custom_3            (1L << 27)
#define FF_Custom_4            (1L << 28)
#define FF_Custom_5            (1L << 29)
#define FF_Custom_6            (1L << 30)
#define FF_Custom_7            (1L << 31)
#define FF_Custom_8            (1L << 32)

#define FF_Draw_Object         (1L << 00)
#define FF_Draw_Update         (1L << 01)
#define FF_Draw_Fill           (1L << 02)
#define FF_Draw_Custom_1       (1L << 25)
#define FF_Draw_Custom_2       (1L << 26)
#define FF_Draw_Custom_3       (1L << 27)
#define FF_Draw_Custom_4       (1L << 28)
#define FF_Draw_Custom_5       (1L << 29)
#define FF_Draw_Custom_6       (1L << 30)
#define FF_Draw_Custom_7       (1L << 31)
#define FF_Draw_Custom_8       (1L << 32)

#define FV_MAXMAX 10000L

#define FeelinRect              FS_Rect // Backward compatibility
#define FS_Box                  FeelinBox
#define FS_MinMax               FeelinMinMax

//struct FeelinRect   { UWORD x1,y1,x2,y2; };
struct FeelinBox    { UWORD x,y,w,h; };
struct FeelinMinMax { UWORD MinW,MinH,MaxW,MaxH; };

struct FS_Rect {
    UWORD                           x1,y1,x2,y2;
};

/* Object */

struct FeelinArea {
    struct  FeelinObject            ObjectNode;
    ULONG                           Flags;
    struct  FeelinRender           *Render;

//    struct  FeelinRect              Area;
    struct  FS_Box                  Box;
    struct  FS_Inner                Inner;
    struct  FeelinMinMax            MinMax;

    ULONG                          *Pens;
    struct  TextFont               *Font;
    struct  FeelinEventHandler     *Handler;
    UWORD                           Weight;
/* Private data below */
};

struct FS_Draw             { ULONG Flags; };
struct FS_DrawBackground   { UWORD x1,y1,x2,y2; ULONG Flags; };
struct FS_Setup            { struct FeelinRender *Render; };
struct FS_HandleEvent      { struct IntuiMessage *Msg; ULONG Key; };
struct FS_DragQuery        { struct FeelinObject *Source; LONG MouseX, MouseY; };
struct FS_BuildContextHelp { LONG MouseX, MouseY;STRPTR Help; };
struct FS_BuildContextMenu { LONG MouseX, MouseY;struct FeelinObject *Menu; struct FeelinObject *ContextOwner; struct FeelinRender *Render; };
//+
///Image                              0x000080
#define FC_Image        "Image.fc"
#define ImageObject     F_NewObj(FC_Image

#define FR_Image        0x000080
#define FR_Image_Mthd   MTHD_BASE | FR_Image
#define FR_Image_Attr   ATTR_BASE | FR_Image

#define FA_Image                                    0x8F000080
#define FA_AltImage                                 0x8F000081
#define FA_Image_Width                              0x8F000082
#define FA_Image_Height                             0x8F000083
#define FA_Image_Precision                          0x8F000084
#define FA_Image_State                              0x8F000085

long enum {
    FV_Image_Normal,
    FV_Image_Selected,
    FV_Image_Enabled,
    FV_Image_Disabled
};
//+
/// Text                               0x0000C0
#define FC_Text     "Text.fc"
#define TextObject  F_NewObj(FC_Text

#define FR_Text        0x0000C0
#define FR_Text_Mthd   MTHD_BASE | FR_Text
#define FR_Text_Attr   ATTR_BASE | FR_Text

#define FA_Text                                     0x8F900080
#define FA_Text_PreParse                            0x8F900081
#define FA_Text_AltPreParse                         0x8F0000C0
#define FA_Text_SetMin                              0x8F0000C1
#define FA_Text_HCenter                             0x8F0000C2
#define FA_Text_VCenter                             0x8F0000C3
#define FA_Text_Static                              0x8F0000C4

//+
///Bar                                0x000100
#define FC_Bar      "Bar.fc"
#define BarObject    F_NewObj(FC_Bar

#define FR_Bar          0x000100
#define FR_Bar_Mthd     MTHD_BASE | FR_Bar
#define FR_Bar_Attr     ATTR_BASE | FR_Bar
#define FR_Bar_Pref     PREF_BASE | FR_Bar

#define FA_Bar_Title        0x8F000100
#define FA_Bar_PreParse     0x8F000101

#define FP_Bar_PreParse     0x50000100
//+
///Gauge                              0x000140
#define FC_Gauge       "Gauge.fc"
#define GaugeObject     F_NewObj(FC_Gauge

#define FR_Gauge        0x000140
#define FR_Gauge_Mthd   MTHD_BASE | FR_Gauge
#define FR_Gauge_Attr   ATTR_BASE | FR_Gauge

#define FA_Gauge_Simple     0x8F000140
#define FA_Gauge_Info       0x8F000141
//+
/// Balance                            0x000280
#define FC_Balance        "Balance.fc"
#define BalanceObject      F_NewObj(FC_Balance
#define BalanceID(id)      F_NewObj(FC_Balance,[FA_ID,id,TAG_DONE])

#define FR_Balance          0x000280
#define FR_Balance_Mthd     MTHD_BASE | FR_Balance
#define FR_Balance_Attr     ATTR_BASE | FR_Balance
#define FR_Balance_Pref     PREF_BASE | FR_Balance

#define FA_Balance_QuickDraw                        0x8F000280

#define FP_Balance_QuickDraw                        0x50000280
//+

/// Group                              0x001000
#define FC_Group     "Group.fc"
#define GroupObject  F_NewObj(FC_Group
#define VGroup       F_NewObj(FC_Group,FA_ChainToCycle,FALSE
#define HGroup       F_NewObj(FC_Group,FA_ChainToCycle,FALSE,FA_Horizontal,TRUE
#define Page         F_NewObj(FC_Group,FA_ChainToCycle,TRUE,FA_Group_PageMode,TRUE

#define FR_Group        0x001000
#define FR_Group_Mthd   MTHD_BASE | FR_Group
#define FR_Group_Attr   ATTR_BASE | FR_Group
#define FR_Group_Pref   PREF_BASE | FR_Group

#define FA_Group_HSpacing                           0x8F001000
#define FA_Group_VSpacing                           0x8F001001
#define FA_Group_SameWidth                          0x8F001002
#define FA_Group_SameHeight                         0x8F001003
#define FA_Group_SameSize                           0x8F001004
#define FA_Group_RelSizing                          0x8F001005
#define FA_Group_Rows                               0x8F001006
#define FA_Group_Forward                            0x8F001007
#define FA_Group_PageMode                           0x8F001008
#define FA_Group_PageTitles                         0x8F001009
#define FA_Group_PageFont                           0x8F00100A
#define FA_Group_PageStyle                          0x8F00100B
#define FA_Group_ActivePage                         0x8F00100C

#define FP_Group_PageFont                           0x50001000
#define FP_Group_HSpacing                           0x50001001
#define FP_Group_VSpacing                           0x50001002
#define FP_Group_PageStyle                          0x50001003

long enum {
    FV_Group_ActivePage_Prev = -4,
    FV_Group_ActivePage_Next,
    FV_Group_ActivePage_Last,
    FV_Group_ActivePage_First
};
//+

/*** Other Classes *********************************************************/

/// ImageDisplay                       0x900040 / Image
#define FC_ImageDisplay          "ImageDisplay.fc"
#define ImageDisplayObject       F_NewObj(FC_ImageDisplay

#define FR_ImageDisplay         0x900040
#define FR_ImageDisplay_Mthd    MTHD_BASE | FR_ImageDisplay
#define FR_ImageDisplay_Attr    ATTR_BASE | FR_ImageDisplay
#define FR_ImageDisplay_Pref    PREF_BASE | FR_ImageDisplay

#define FM_ImageDisplay_Draw                        0xF0900040
#define FM_ImageDisplay_Setup                       0xF0900041
#define FM_ImageDisplay_Cleanup                     0xF0900042

#define FA_ImageDisplay                             0x8F900040

struct FS_ImageDisplay_Render  {struct FeelinRender *Render; };
struct FS_ImageDisplay_Draw    {struct FeelinRect *Rect; struct FeelinRender *Render; };

long enum {
    FI_None,
    FI_Shine,               FI_HalfShine,              FI_Fill,             FI_HalfShadow,             FI_Shadow,           FI_HalfDark,            FI_Dark,             FI_Highlight,
    FI_Shine_HalfShine,     FI_HalfShine_Fill,         FI_Fill_HalfShadow,  FI_HalfShadow_Shadow,      FI_Shadow_HalfDark,  FI_HalfDark_Dark,       FI_Dark_Highlight,
    FI_Shine_Fill,          FI_HalfShine_HalfShadow,   FI_Fill_Shadow,      FI_HalfShadow_HalfDark,    FI_Shadow_Dark,      FI_HalfDark_Highlight,
    FI_Shine_HalfShadow,    FI_HalfShine_Shadow,       FI_Fill_HalfDark,    FI_HalfShadow_Dark,        FI_Shadow_Highlight,
    FI_Shine_Shadow,        FI_HalfShine_HalfDark,     FI_Fill_Dark,        FI_HalfShadow_Highlight,
    FI_Shine_HalfDark,      FI_HalfShine_Dark,         FI_Fill_Highlight,
    FI_Shine_Dark,          FI_HalfShine_Highlight,
    FI_Shine_Highlight
};

#define FP_Back_Window                              0x50900040
#define FP_Back_Screen                              0x50900041
#define FP_Back_Requester                           0x50900042
#define FP_Back_Group                               0x50900043
#define FP_Back_Button                              0x50900044
#define FP_Back_ButtonAlt                           0x50900045
#define FP_Back_Text                                0x50900046
#define FP_Back_String                              0x50900047
#define FP_Back_StringAlt                           0x50900048
#define FP_Back_List                                0x50900049
#define FP_Back_Prop                                0x5090004A
#define FP_Back_Slider                              0x5090004B
#define FP_Back_Gauge                               0x5090004C
#define FP_Back_Pop                                 0x5090004D
#define FP_Back_Page                                0x5090004E

#define NoBack          FA_Back, FI_None

#define WindowBack      FA_Back, FP_Back_Window
#define ScreenBack      FA_Back, FP_Back_Screen
#define RequesterBack   FA_Back, FP_Back_Requester
#define GroupBack       FA_Back, FP_Back_Group
#define TextBack        FA_Back, FP_Back_Text
#define StringBack      FA_Back, FP_Back_String, FA_AltBack,FP_Back_StringAlt
#define ButtonBack      FA_Back, FP_Back_Button, FA_AltBack,FP_Back_ButtonAlt
#define GaugeBack       FA_Back, FP_Back_Gauge
#define ListBack        FA_Back, FP_Back_List
#define PropBack        FA_Back, FP_Back_Prop
#define SliderBack      FA_Back, FP_Back_Slider
#define PopBack         FA_Back, FP_Back_Pop
//+
/// TextDisplay                        0x900080 / Text
#define FC_TextDisplay        "TextDisplay.fc"
#define FS_TextDisplay_Size   FeelinS_TextDisplay_Size
#define FS_TextDisplay_Draw   FeelinS_ImageDisplay_Draw
#define TextDisplayObject     F_NewObj(FC_TextDisplay

#define FR_TextDisplay       0x900080
#define FR_TextDisplay_Mthd  MTHD_BASE | FR_TextDisplay
#define FR_TextDisplay_Attr  ATTR_BASE | FR_TextDisplay

#define FM_TextDisplay_Size                         0xF0900080
#define FM_TextDisplay_Draw                         0xF0900040

#define FA_TextDisplay_Contents                     0x8F900080
#define FA_TextDisplay_PreParse                     0x8F900081
#define FA_TextDisplay_Font                         0x8F900082
#define FA_TextDisplay_Width                        0x8F900083
#define FA_TextDisplay_Height                       0x8F900084
#define FA_TextDisplay_Interline                    0x8F900085
#define FA_TextDisplay_Overflow                     0x8F900086
#define FA_TextDisplay_Align                        0x8F900087
#define FA_TextDisplay_Style                        0x8F900088
#define FA_TextDisplay_APen                         0x8F900089
#define FA_TextDisplay_BPen                         0x8F90008A
#define FA_TextDisplay_UnderShort                   0x8F90008B

long enum {
    FV_TextDisplay_Left,
    FV_TextDisplay_Center,
    FV_TextDisplay_Right,
    FV_TextDisplay_Justify
};

#define FV_TextDisplay_Plain        (1L << 00)
#define FF_TextDisplay_Bold         (1L << 01)
#define FF_TextDisplay_Italic       (1L << 02)
#define FF_TextDisplay_Underlined   (1L << 03)
#define FV_TextDisplay_Simple       (1L << 04)
#define FF_TextDisplay_Shadow       (1L << 05)
#define FF_TextDisplay_Light        (1L << 06)
#define FF_TextDisplay_Emboss       (1L << 07)
#define FF_TextDisplay_Ghost        (1L << 08)

struct FeelinS_TextDisplay_Size { struct FeelinRect *Rect; };

struct FeelinTextDisplay {
    UWORD                           nWidth;
    UWORD                           nHeight;
};
//+
/// Dataspace                          0x9000C0 / Client
#define FC_Dataspace       "Dataspace.fc"
#define DataspaceObject     F_NewObj(FC_Dataspace

#define FR_Dataspace        0x9000C0
#define FR_Dataspace_Mthd   MTHD_BASE | FR_Dataspace
#define FR_Dataspace_Attr   ATTR_BASE | FR_Dataspace

#define FM_Dataspace_Add                            0xF09000C0
#define FM_Dataspace_Remove                         0xF09000C1
#define FM_Dataspace_Find                           0xF09000C2
#define FM_Dataspace_Clear                          0xF09000C3
#define FM_Dataspace_Merge                          0xF09000C4
#define FM_Dataspace_ReadIFF                        0xF09000C5
#define FM_Dataspace_WriteIFF                       0xF09000C6
#define FM_Dataspace_Resolve                        0xF09000C7

#define FA_Dataspace_Pool                           0x8F9000C0
//+
/// DisplayContext                     0x900140 / Client
#define FC_DisplayContext "DisplayContext.fc"

#define FR_DisplayContext       0x900140
#define FR_DisplayContext_Mthd  MTHD_BASE | FR_DisplayContext
#define FR_DisplayContext_Attr  ATTR_BASE | FR_DisplayContext
#define FR_DisplayContext_Pref  PREF_BASE | FR_DisplayContext

struct FeelinDisplayContext {
    LONG               *Scheme;
    struct  Screen     *Screen;
};
//+
/// Display                            0x901000 / DisplayServer
#define FC_Display "Display.fc"

#define FR_Display          0x901000
#define FR_Display_Mthd     MTHD_BASE | FR_Display
#define FR_Display_Attr     ATTR_BASE | FR_Display
#define FR_Display_Pref     PREF_BASE | FR_Display

#define FM_Display_CreatePen                        0xF0901000
#define FM_Display_DeletePen                        0xF0901001
#define FM_Display_CreateScheme                     0xF0901002
#define FM_Display_DeleteScheme                     0xF0901003

#define FM_CreatePen        FM_Display_CreatePen
#define FM_DeletePen        FM_Display_DeletePen
#define FM_CreateScheme     FM_Display_CreateScheme
#define FM_DeleteScheme     FM_Display_DeleteScheme

#define FA_Display_Name                             0x8F901000
#define FA_Display_Title                            0x8F901001
#define FA_Display_Width                            0x8F901002
#define FA_Display_Height                           0x8F901003
#define FA_Display_Depth                            0x8F901004
#define FA_Display_ScreenMode                       0x8F901005
#define FA_Display_Overscan                         0x8F901006
#define FA_Display_Scheme                           0x8F901007
#define FA_Display_SchemeSpec                       0x8F901008
#define FA_Display_Font                             0x8F901009
#define FA_Display_Background                       0x8F90100A
#define FA_Display_Spec                             0x8F90100B
#define FA_Display_Screen                           0x8F90100C
#define FA_Display_ColorMap                         0x8F90100D
#define FA_Display_Pens                             0x8F90100E

#define FP_Display_Name                             0x50901000
/*
OBJECT feelinDisplaySpec
   publicname[031]:ARRAY OF CHAR, nullbyte1:CHAR
   screenname[255]:ARRAY OF CHAR, nullbyte2:CHAR
   fontname[79]:ARRAY OF CHAR,    nullbyte3:CHAR
   background[255]:ARRAY OF CHAR, nullbyte4:CHAR
   flags
   screenmode
   overscan
   width:INT
   height:INT
   depth:INT
   version:INT -> struct version for future expansion

   pens:feelinSchemeSpec
ENDOBJECT
*/
//+
/// Pen                                0x901040 / DisplayServer / Display
#define FR_Pen          0x901040
#define FR_Pen_Attr     ATTR_BASE | FR_Pen
#define FR_Pen_Mthd     MTHD_BASE | FR_Pen
#define FR_Pen_Pref     PREF_BASE | FR_Pen

#define FA_Pen_Text                                 0x8F901040
#define FA_Pen_Shine                                0x8F901041
#define FA_Pen_HalfShine                            0x8F901042
#define FA_Pen_Fill                                 0x8F901043
#define FA_Pen_HalfShadow                           0x8F901044
#define FA_Pen_Shadow                               0x8F901045
#define FA_Pen_HalfDark                             0x8F901046
#define FA_Pen_Dark                                 0x8F901047
#define FA_Pen_Highlight                            0x8F901048
#define FA_SchemeSpec                               0x8F901049

long enum {
    FV_Pen_Text,         // 0
    FV_Pen_Shine,        // 1
    FV_Pen_HalfShine,    // 2
    FV_Pen_Fill,         // 3
    FV_Pen_HalfShadow,   // 4
    FV_Pen_Shadow,       // 5
    FV_Pen_HalfDark,     // 6
    FV_Pen_Dark,         // 7
    FV_Pen_Highlight,    // 8
    FV_Pen_Max
};

#define FP_Pen_Shine                                0x50901040
#define FP_Pen_Fill                                 0x50901041
#define FP_Pen_Shadow                               0x50901042
#define FP_Pen_Dark                                 0x50901043
#define FP_Pen_Text                                 0x50901044
#define FP_Pen_Highlight                            0x50901045

struct FeelinPenSpec
{
    UBYTE    blackbox[12];
};

struct FeelinSchemeSpec
{
    UBYTE       Shine[12];
    UBYTE       Fill[12];
    UBYTE       Dark[12];
    UBYTE       Text[12];
    UBYTE       Highlight[12];
    UBYTE       Shadow[12];
};
//+

#endif
