1
0
mirror of https://github.com/deadw00d/AROS.git synced 2025-11-19 16:21:21 +00:00

let the theme specify the frame thickness used for rendering its screen and window bar areas. fix rendering the screen title-bar imagery.

This commit is contained in:
Kalamatee
2025-08-30 10:25:51 +01:00
committed by deadwood
parent ef5df6f450
commit 636c20af26
4 changed files with 126 additions and 43 deletions

View File

@ -264,6 +264,7 @@ static void LoadSystemConfig(STRPTR path, struct DecorConfig * dc)
dc->RightBorderNoGadgets = 0;
dc->BottomBorderNoGadgets = 0;
dc->BarHeight = 0;
dc->BarFrame = 0;
dc->SizeAddX = 0;
dc->SizeAddY = 0;
dc->UpDownAddX = 0;
@ -289,6 +290,7 @@ static void LoadSystemConfig(STRPTR path, struct DecorConfig * dc)
dc->SLogoOffset = 0;
dc->STitleOffset = 0;
dc->SBarHeight = 0;
dc->SBarFrame = 0;
dc->SBarChildPre_o = 0;
dc->SBarChildPre_s = 0;
dc->SBarChildFill_o = 0;
@ -362,6 +364,8 @@ static void LoadSystemConfig(STRPTR path, struct DecorConfig * dc)
dc->BottomBorderNoGadgets = GetInt(v);
} else if ((v = strstr(line, "BarHeight ")) == line) {
dc->BarHeight = GetInt(v); //screen, window
} else if ((v = strstr(line, "BarFrame ")) == line) {
dc->BarFrame = GetInt(v);
} else if ((v = strstr(line, "BarJoinTB ")) == line) {
GetIntegers(v, &dc->BarJoinTB_o, &dc->BarJoinTB_s);
} else if ((v = strstr(line, "BarPreGadget ")) == line) {
@ -448,6 +452,8 @@ static void LoadSystemConfig(STRPTR path, struct DecorConfig * dc)
dc->STitleOffset = GetInt(v);
} else if ((v = strstr(line, "SBarHeight ")) == line) {
dc->SBarHeight = GetInt(v);
} else if ((v = strstr(line, "SBarFrame ")) == line) {
dc->SBarFrame = GetInt(v);
} else if ((v = strstr(line, "SBarChildPre ")) == line) {
GetIntegers(v, &dc->SBarChildPre_o, &dc->SBarChildPre_s);
} else if ((v = strstr(line, "SBarChildFill ")) == line) {

View File

@ -18,6 +18,7 @@ struct DecorConfig
LONG SLogoOffset;
LONG STitleOffset;
LONG SBarHeight;
LONG SBarFrame;
LONG SBarChildPre_o;
LONG SBarChildPre_s;
LONG SBarChildFill_o;
@ -42,6 +43,7 @@ struct DecorConfig
BOOL BarRounded;
BOOL BarVertical;
LONG BarHeight;
LONG BarFrame;
LONG BarJoinTB_o;
LONG BarJoinTB_s;
LONG BarPreGadget_o;

View File

@ -54,9 +54,11 @@
const TEXT version_string[] = "$VER: Decoration 1.10 (01.04.2023)";
STRPTR __detached_name = "Decorator";
struct IClass *screenchildgclass = NULL;
#define MAGIC_PRIVATE_SKIN 0x0001
#define MAGIC_PRIVATE_TITLECHILD 0x0F0F
#define MAGIC_PRIVATE_TITLECLASS 0x0F0E
#define MAGIC_PRIVATE_TITLECHILD 0x0F0F
struct DecorationDecorator
{
@ -263,6 +265,12 @@ int main(void)
{
switch(msg->msg.mn_Magic)
{
case MAGIC_PRIVATE_TITLECLASS:
dmsg = (struct DecoratorMessage *) msg;
if (decor) {
dmsg->dm_Class = (IPTR)screenchildgclass;
}
break;
case MAGIC_PRIVATE_TITLECHILD:
dmsg = (struct DecoratorMessage *) msg;
if (decor)

View File

@ -36,6 +36,10 @@ struct scrdecor_data
Object *FirstChild;
};
struct scrdecorchildg_data
{
};
static void DisposeScreenSkinning(struct scrdecor_data *data)
{
}
@ -108,8 +112,14 @@ static IPTR scrdecor_dispose(Class *cl, Object *obj, struct opSet *msg)
static IPTR scrdecor_get(Class *cl, Object *obj, struct opGet *msg)
{
struct scrdecor_data *data = INST_DATA(cl, obj);
switch(msg->opg_AttrID)
{
case SA_ScreenbarTextColor:
*msg->opg_Storage = data->dc->STitleColorText;
break;
case SDA_TrueColorOnly:
*msg->opg_Storage = TRUE;
break;
@ -186,9 +196,13 @@ static IPTR scrdecor_set(Class *cl, Object *obj, struct opSet *msg)
childlayoutmsg.gpl_GInfo = &childgadinf;
childlayoutmsg.gpl_Initial = 0;
D(bug("[screendecor] %s: FirstChild @ 0x%p\n", __func__, data->FirstChild));
((struct Gadget *)(data->FirstChild))->TopEdge = 0 + CHILDPADDING;
((struct Gadget *)(data->FirstChild))->Height = childgadinf.gi_Screen->BarHeight - (CHILDPADDING << 1);
D(bug("[screendecor] %s: top %u, height %u\n", __func__, ((struct Gadget *)(data->FirstChild))->TopEdge, ((struct Gadget *)(data->FirstChild))->Height));
DoMethodA(data->FirstChild, &childlayoutmsg);
scr_findtitlearea(data, (childgadinf.gi_Screen), &left, &right);
@ -242,33 +256,85 @@ static IPTR scrdecor_draw_screenbar(Class *cl, Object *obj, struct sdpDrawScreen
{
if (data->dc->SBarGadPre_s > 0)
{
WriteTiledImageHorizontal(rp, sd->img_stitlebar, 0,
WriteVerticalScaledTiledImageHorizontal(rp,
sd->img_stitlebar, 0,
data->dc->SBarGadPre_o, data->dc->SBarGadPre_s,
right + 1, 0, data->dc->SBarGadPre_o);
right + 1, 0,
data->dc->SBarHeight,
data->dc->SBarGadPre_o, scr->BarHeight + 1);
}
if (data->dc->SBarGadFill_s > 0)
{
WriteTiledImageHorizontal(rp, sd->img_stitlebar, 0,
WriteVerticalScaledTiledImageHorizontal(rp,
sd->img_stitlebar, 0,
data->dc->SBarGadFill_o, data->dc->SBarGadFill_s,
right + data->dc->SBarGadPre_s + 1, 0, scr->Width - (right + data->dc->SBarGadPre_s + data->dc->SBarGadPost_s));
right + data->dc->SBarGadPre_s + 1, 0,
data->dc->SBarHeight,
scr->Width - (right + data->dc->SBarGadPre_s + data->dc->SBarGadPost_s), scr->BarHeight + 1);
}
if (data->dc->SBarGadPost_s > 0)
{
WriteTiledImageHorizontal(rp, sd->img_stitlebar, 0,
WriteVerticalScaledTiledImageHorizontal(rp,
sd->img_stitlebar, 0,
data->dc->SBarGadPost_o, data->dc->SBarGadPost_s,
scr->Width - data->dc->SBarGadPost_s, 0, data->dc->SBarGadPost_s);
scr->Width - data->dc->SBarGadPost_s, 0,
data->dc->SBarHeight,
data->dc->SBarGadPost_s, scr->BarHeight + 1);
}
}
if ((data->FirstChild) && (((struct Gadget *)(data->FirstChild))->Width > 2)) {
D(bug("[screendecor] draw_screenbar: titlechild width = %d\n", ((struct Gadget *)(data->FirstChild))->Width));
right = right - (((struct Gadget *)(data->FirstChild))->Width + data->dc->SBarChildPre_s + data->dc->SBarChildPost_s);
if (sd->img_stitlebar->ok)
{
if (data->dc->SBarChildPre_s > 0)
{
WriteVerticalScaledTiledImageHorizontal(rp,
sd->img_stitlebar, 0,
data->dc->SBarChildPre_o, data->dc->SBarChildPre_s,
right + 1, 0,
data->dc->SBarHeight,
data->dc->SBarChildPre_s, scr->BarHeight + 1);
}
if (data->dc->SBarChildFill_s > 0)
{
WriteVerticalScaledTiledImageHorizontal(rp,
sd->img_stitlebar, 0,
data->dc->SBarChildFill_o, data->dc->SBarChildFill_s,
right + data->dc->SBarChildPre_s + 1, 0,
data->dc->SBarHeight,
((struct Gadget *)(data->FirstChild))->Width, scr->BarHeight + 1);
}
else
{
WriteVerticalScaledTiledImageHorizontal(rp,
sd->img_stitlebar, 0,
0, filllen,
right + data->dc->SBarChildPre_s + 1, 0,
data->dc->SBarHeight,
right + 1, scr->BarHeight + 1);
}
if (data->dc->SBarChildPost_s > 0)
{
WriteVerticalScaledTiledImageHorizontal(rp,
sd->img_stitlebar, 0,
data->dc->SBarChildPost_o, data->dc->SBarChildPost_s,
right + data->dc->SBarChildPre_s + ((struct Gadget *)(data->FirstChild))->Width + 1, 0,
data->dc->SBarHeight,
data->dc->SBarChildPost_s, scr->BarHeight + 1);
}
}
}
if (sd->img_stitlebar->ok)
{
WriteVerticalScaledTiledImageHorizontal(rp, sd->img_stitlebar, 0, 0,
filllen , 0, 0, data->dc->SBarHeight, right + 1, scr->BarHeight + 1);
WriteVerticalScaledTiledImageHorizontal(rp,
sd->img_stitlebar, 0,
0, filllen,
0, 0,
data->dc->SBarHeight,
right + 1, scr->BarHeight + 1);
}
}
@ -298,12 +364,13 @@ static IPTR scrdecor_draw_screenbar(Class *cl, Object *obj, struct sdpDrawScreen
if (!(sd->truecolor) || ((data->dc->STitleOutline == FALSE) && (data->dc->STitleShadow == FALSE)))
{
if ((data->dc->STitleColorText != 0xFFFFFFFF) && !beeping)
if ((data->dc->STitleColorText != 0xFFFFFFFF) && !beeping) {
SetRPAttrs(rp, RPTAG_PenMode, FALSE, RPTAG_FgColor, data->dc->STitleColorText, TAG_DONE);
else if ((data->dc->STitleColorShadow != 0xFFFFFFFF) && beeping)
} else if ((data->dc->STitleColorShadow != 0xFFFFFFFF) && beeping) {
SetRPAttrs(rp, RPTAG_PenMode, FALSE, RPTAG_FgColor, data->dc->STitleColorShadow, TAG_DONE);
else
} else {
SetAPen(rp, pens[beeping ? BARBLOCKPEN : BARDETAILPEN]);
}
Move(rp, tx, ty);
Text(rp, scr->Title, len);
}
@ -355,42 +422,23 @@ static IPTR scrdecor_draw_screenbar(Class *cl, Object *obj, struct sdpDrawScreen
GREDRAW_REDRAW
};
if (sd->img_stitlebar->ok)
{
if (data->dc->SBarChildPre_s > 0)
{
WriteTiledImageHorizontal(rp, sd->img_stitlebar, 0,
data->dc->SBarChildPre_o, data->dc->SBarChildPre_s,
right + 1, 0, data->dc->SBarChildPre_s);
}
if (data->dc->SBarChildFill_s > 0)
{
WriteTiledImageHorizontal(rp, sd->img_stitlebar, 0,
data->dc->SBarChildFill_o, data->dc->SBarChildFill_s,
right + data->dc->SBarChildPre_s + 1, 0, ((struct Gadget *)(data->FirstChild))->Width);
}
else
{
WriteVerticalScaledTiledImageHorizontal(rp, sd->img_stitlebar, 0,
0, filllen , right + data->dc->SBarChildPre_s + 1, 0, data->dc->SBarHeight, right, scr->BarHeight + 1);
}
if (data->dc->SBarChildPost_s > 0)
{
WriteTiledImageHorizontal(rp, sd->img_stitlebar, 0,
data->dc->SBarChildPost_o, data->dc->SBarChildPost_s,
right + data->dc->SBarChildPre_s + ((struct Gadget *)(data->FirstChild))->Width + 1, 0, data->dc->SBarChildPost_s);
}
}
ULONG barheight = sd->img_stitlebar->h;
childgadinf.gi_Screen = ((struct Gadget *)(data->FirstChild))->SpecialInfo = scr;
if (barheight < childgadinf.gi_Screen->BarHeight)
barheight = childgadinf.gi_Screen->BarHeight;
childgadinf.gi_RastPort = rp;
childgadinf.gi_Pens.DetailPen = pens[DETAILPEN];
childgadinf.gi_Pens.BlockPen = pens[BLOCKPEN];
childgadinf.gi_Pens.DetailPen = pens[BARDETAILPEN];
childgadinf.gi_Pens.BlockPen = pens[BARBLOCKPEN];
childgadinf.gi_DrInfo = dri;
// TODO: Query the real area padding from the theme..
childgadinf.gi_Domain.Left = right + data->dc->SBarChildPre_s + 1;
childgadinf.gi_Domain.Width = ((struct Gadget *)(data->FirstChild))->Width;
childgadinf.gi_Domain.Top = 0 + CHILDPADDING; // TODO: Get the real area from the theme..
childgadinf.gi_Domain.Height = sd->img_stitlebar->h - (CHILDPADDING << 1);
D(bug("[screendecor] draw_screenbar: rendering titlechild @ 0x%p, msg @ 0x%p, info @ 0x%p\n", data->FirstChild, &childrendermsg, &childgadinf));
childgadinf.gi_Domain.Top = 0 + CHILDPADDING;
childgadinf.gi_Domain.Height = barheight - (CHILDPADDING << 1);
D(
bug("[screendecor] %s: rendering titlechild @ 0x%p, msg @ 0x%p, info @ 0x%p\n", __func__, data->FirstChild, &childrendermsg, &childgadinf);
bug("[screendecor] %s: %u,%u->%u,%u\n", __func__, childgadinf.gi_Domain.Left, childgadinf.gi_Domain.Top, childgadinf.gi_Domain.Left + childgadinf.gi_Domain.Width - 1, childgadinf.gi_Domain.Top + childgadinf.gi_Domain.Height - 1);
)
DoMethodA(data->FirstChild, &childrendermsg);
}
@ -620,6 +668,18 @@ static IPTR scrdecor_dispatcher(struct IClass *cl, Object *obj, Msg msg)
return retval;
}
static IPTR scrdecorchildg_dispatcher(struct IClass *cl, Object *obj, Msg msg)
{
IPTR retval;
retval = DoSuperMethodA(cl, obj, msg);
return retval;
}
extern struct IClass *screenchildgclass;
struct IClass * MakeScreenDecorClass()
{
struct IClass * cl = MakeClass(NULL, SCRDECORCLASS, NULL, sizeof(struct scrdecor_data), 0);
@ -627,6 +687,13 @@ struct IClass * MakeScreenDecorClass()
{
cl->cl_Dispatcher.h_Entry = HookEntry;
cl->cl_Dispatcher.h_SubEntry = (HOOKFUNC)scrdecor_dispatcher;
screenchildgclass = MakeClass(NULL, "gadgetclass", NULL, sizeof(struct scrdecorchildg_data), 0);
if (screenchildgclass)
{
screenchildgclass->cl_Dispatcher.h_Entry = HookEntry;
screenchildgclass->cl_Dispatcher.h_SubEntry = (HOOKFUNC)scrdecorchildg_dispatcher;
}
}
return cl;