2 Copyright © 1995-2013, The AROS Development Team. All rights reserved.
5 Decoration support code
8 #include <intuition/screens.h>
9 #include <intuition/intuition.h>
10 #include <intuition/windecorclass.h>
11 #include <intuition/scrdecorclass.h>
12 #include <intuition/gadgetclass.h>
13 #include <intuition/extensions.h>
14 #include <proto/exec.h>
15 #include <proto/intuition.h>
16 #include <proto/dos.h>
18 #include "intuition_intern.h"
19 #include "intuition_customize.h"
20 #include "inputhandler_actions.h"
22 BOOL
int_LoadDecorator(const char *name
, struct IntScreen
*screen
, struct IntuitionBase
*IntuitionBase
)
25 struct NewDecorator
*nd
= NULL
;
27 ObtainSemaphore(&((struct IntIntuitionBase
*)(IntuitionBase
))->ScrDecorSem
);
31 nd
= (struct NewDecorator
*)FindName(&GetPrivIBase(IntuitionBase
)->Decorations
, name
);
35 struct DosLibrary
*DOSBase
= GetPrivIBase(IntuitionBase
)->DOSBase
;
37 /* Open dos.library only once, when first needed */
39 GetPrivIBase(IntuitionBase
)->DOSBase
= DOSBase
= (struct DosLibrary
*)OpenLibrary("dos.library", 36);
45 if (!IsListEmpty(&GetPrivIBase(IntuitionBase
)->Decorations
))
47 node
= GetPrivIBase(IntuitionBase
)->Decorations
.lh_Head
;
48 for (; node
->ln_Succ
; node
= node
->ln_Succ
)
50 struct NewDecorator
*d
= (struct NewDecorator
*) node
;
52 if ((d
->nd_IntPattern
!= NULL
) && (screen
->Screen
.Title
!= NULL
))
54 if (MatchPattern(d
->nd_IntPattern
, screen
->Screen
.Title
))
63 nd
= ((struct IntIntuitionBase
*)(IntuitionBase
))->Decorator
;
68 ReleaseSemaphore(&((struct IntIntuitionBase
*)(IntuitionBase
))->ScrDecorSem
);
70 screen
->Decorator
= nd
;
73 screen
->ScrDecorObj
= NewObjectA(nd
->nd_ScreenClass
, NULL
, nd
->nd_ScreenTags
);
74 screen
->MenuDecorObj
= NewObjectA(nd
->nd_MenuClass
, NULL
, nd
->nd_MenuTags
);
75 screen
->WinDecorObj
= NewObjectA(nd
->nd_WindowClass
, NULL
, nd
->nd_WindowTags
);
79 screen
->ScrDecorObj
= NewObjectA(GetPrivIBase(IntuitionBase
)->ScrDecorClass
, NULL
, GetPrivIBase(IntuitionBase
)->ScrDecorTags
);
80 screen
->MenuDecorObj
= NewObjectA(GetPrivIBase(IntuitionBase
)->MenuDecorClass
, NULL
, GetPrivIBase(IntuitionBase
)->MenuDecorTags
);
81 screen
->WinDecorObj
= NewObjectA(GetPrivIBase(IntuitionBase
)->WinDecorClass
, NULL
, GetPrivIBase(IntuitionBase
)->WinDecorTags
);
84 GetAttr(SDA_UserBuffer
, screen
->ScrDecorObj
, &userbuffersize
);
85 screen
->DecorUserBufferSize
= userbuffersize
;
88 screen
->DecorUserBuffer
= (IPTR
)AllocMem(userbuffersize
, MEMF_ANY
| MEMF_CLEAR
);
89 if (!screen
->DecorUserBuffer
)
96 struct RemoveDecoratorMsg
98 struct IntuiActionMsg msg
;
99 struct NewDecorator
*nd
;
102 /* This is called on the input.device's context */
104 static VOID
int_removedecorator(struct RemoveDecoratorMsg
*m
,
105 struct IntuitionBase
*IntuitionBase
)
107 struct DecoratorMessage msg
;
108 struct MsgPort
*port
= CreateMsgPort();
112 Remove((struct Node
*)m
->nd
);
113 FreeVec(m
->nd
->nd_IntPattern
);
115 msg
.dm_Message
.mn_ReplyPort
= port
;
116 msg
.dm_Message
.mn_Magic
= MAGIC_DECORATOR
;
117 msg
.dm_Message
.mn_Version
= DECORATOR_VERSION
;
118 msg
.dm_Class
= DM_CLASS_DESTROYDECORATOR
;
121 msg
.dm_Object
= (IPTR
)m
->nd
;
123 PutMsg(m
->nd
->nd_Port
, (struct Message
*)&msg
);
130 /* !!! ScrDecorSem must be obtained and released by the caller !!! */
131 void int_UnloadDecorator(struct NewDecorator
*tnd
, struct IntuitionBase
*IntuitionBase
)
133 if ((tnd
->nd_cnt
== 0) && (tnd
->nd_Port
!= NULL
))
135 struct RemoveDecoratorMsg msg
;
138 DoASyncAction((APTR
)int_removedecorator
, &msg
.msg
, sizeof(msg
), IntuitionBase
);
142 BOOL
int_InitDecorator(struct Screen
*screen
)
145 struct sdpInitScreen msg
;
147 msg
.MethodID
= SDM_INITSCREEN
;
148 msg
.sdp_Screen
= screen
;
149 msg
.sdp_TrueColor
= (GetPrivScreen(screen
)->DInfo
.dri_Flags
& DRIF_DIRECTCOLOR
) ? TRUE
: FALSE
;
150 msg
.sdp_FontHeight
= GetPrivScreen(screen
)->DInfo
.dri_Font
->tf_YSize
;
151 msg
.sdp_BarVBorder
= screen
->BarVBorder
;
152 msg
.sdp_BarHBorder
= screen
->BarHBorder
;
153 msg
.sdp_MenuVBorder
= screen
->MenuVBorder
;
154 msg
.spd_MenuHBorder
= screen
->MenuHBorder
;
155 msg
.sdp_WBorTop
= screen
->WBorTop
;
156 msg
.sdp_WBorLeft
= screen
->WBorLeft
;
157 msg
.sdp_WBorRight
= screen
->WBorRight
;
158 msg
.sdp_WBorBottom
= screen
->WBorBottom
;
159 msg
.sdp_TitleHack
= 0;
160 msg
.sdp_BarHeight
= screen
->BarHeight
;
161 msg
.sdp_UserBuffer
= ((struct IntScreen
*)screen
)->DecorUserBuffer
;
163 ok
= DoMethodA(GetPrivScreen(screen
)->ScrDecorObj
, &msg
.MethodID
);
166 screen
->BarHeight
= msg
.sdp_BarHeight
;
167 screen
->BarVBorder
= msg
.sdp_BarVBorder
;
168 screen
->BarHBorder
= msg
.sdp_BarHBorder
;
169 screen
->MenuVBorder
= msg
.sdp_MenuVBorder
;
170 screen
->MenuHBorder
= msg
.spd_MenuHBorder
;
171 screen
->WBorTop
= msg
.sdp_WBorTop
;
172 screen
->WBorLeft
= msg
.sdp_WBorLeft
;
173 screen
->WBorRight
= msg
.sdp_WBorRight
;
174 screen
->WBorBottom
= msg
.sdp_WBorBottom
;
180 void int_CalcSkinInfo(struct Screen
*screen
, struct IntuitionBase
*IntuitionBase
)
182 if (screen
->FirstGadget
)
184 struct sdpLayoutScreenGadgets lmsg
;
186 lmsg
.MethodID
= SDM_LAYOUT_SCREENGADGETS
;
187 lmsg
.sdp_TrueColor
= (GetPrivScreen(screen
)->DInfo
.dri_Flags
& DRIF_DIRECTCOLOR
) ? TRUE
: FALSE
;
188 lmsg
.sdp_Layer
= screen
->BarLayer
;
189 lmsg
.sdp_Gadgets
= screen
->FirstGadget
;
190 lmsg
.sdp_Flags
= SDF_LSG_INITIAL
| SDF_LSG_MULTIPLE
;
191 lmsg
.sdp_UserBuffer
= ((struct IntScreen
*)screen
)->DecorUserBuffer
;
193 DoMethodA(((struct IntScreen
*)(screen
))->ScrDecorObj
, &lmsg
.MethodID
);