From f59c45265bd883d9467d635f20afaa8d960a8148 Mon Sep 17 00:00:00 2001 From: neil Date: Mon, 20 Apr 2015 16:16:33 +0000 Subject: [PATCH] - Update the pen in OM_SET before calling the supermethod. Otherwise, MUIA_Pendisplay_Pen will not be up-to-date if used during notifications. - Perform notifications for attributes that may change as a side-effect of changes to other attributes (e.g. when MUIA_Pendisplay_Spec changes, MUIA_Pendisplay_Pen and MUIA_Pendisplay_RGBcolor also change). - Give the right value for MUIA_Pendisplay_RGBcolor when a non-RGB penspec is used. - Do not fill in requests for MUIA_Pendisplay_RGBcolor if an invalid penspec is used. - No longer includes flags in the value returned for MUIA_Pendisplay_Pen. - If a reference object is set, redirect most attribute queries to it. git-svn-id: https://svn.aros.org/svn/aros/trunk/AROS@50436 fb15a70f-31f2-0310-bbcc-cdcc74a49acc --- workbench/libs/muimaster/classes/pendisplay.c | 52 +++++++++++++++++++++------ 1 file changed, 41 insertions(+), 11 deletions(-) diff --git a/workbench/libs/muimaster/classes/pendisplay.c b/workbench/libs/muimaster/classes/pendisplay.c index bbea660dbc..0d2485645d 100644 --- a/workbench/libs/muimaster/classes/pendisplay.c +++ b/workbench/libs/muimaster/classes/pendisplay.c @@ -1,5 +1,5 @@ /* - Copyright © 2002-2003, The AROS Development Team. All rights reserved. + Copyright © 2002-2015, The AROS Development Team. All rights reserved. $Id$ */ @@ -44,7 +44,8 @@ IPTR Pendisplay__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) return FALSE; data = INST_DATA(cl, obj); - /* Format identifies need to be long enforced because of RawDoFmt() + + /* Format identifiers need to be long enforced because of RawDoFmt() * limits */ snprintf(data->penspec.ps_buf, sizeof(data->penspec.ps_buf), "%lc%d", (int)PST_MUI, (int)MPEN_TEXT); @@ -104,6 +105,8 @@ IPTR Pendisplay__OM_SET(struct IClass *cl, Object *obj, struct TagItem *tag; BOOL newcol = FALSE; IPTR retval; + struct TagItem extra_tags[] = {{TAG_IGNORE, 0}, {TAG_IGNORE, 0}, + {TAG_IGNORE, 0}, {TAG_MORE, (IPTR)msg->ops_AttrList}}; data = INST_DATA(cl, obj); @@ -127,6 +130,9 @@ IPTR Pendisplay__OM_SET(struct IClass *cl, Object *obj, MUIA_Pendisplay_Spec, MUIV_TriggerValue); } newcol = TRUE; + extra_tags[0].ti_Tag = MUIA_Pendisplay_Pen; + extra_tags[1].ti_Tag = MUIA_Pendisplay_RGBcolor; + extra_tags[2].ti_Tag = MUIA_Pendisplay_Spec; break; case MUIA_Pendisplay_RGBcolor: @@ -140,6 +146,8 @@ IPTR Pendisplay__OM_SET(struct IClass *cl, Object *obj, (unsigned int)rgb->blue); } newcol = TRUE; + extra_tags[0].ti_Tag = MUIA_Pendisplay_Pen; + extra_tags[2].ti_Tag = MUIA_Pendisplay_Spec; break; case MUIA_Pendisplay_Spec: @@ -148,14 +156,14 @@ IPTR Pendisplay__OM_SET(struct IClass *cl, Object *obj, data->penspec = *(struct MUI_PenSpec *)tag->ti_Data; newcol = TRUE; } + extra_tags[0].ti_Tag = MUIA_Pendisplay_Pen; + extra_tags[1].ti_Tag = MUIA_Pendisplay_RGBcolor; break; } } - retval = DoSuperMethodA(cl, obj, (Msg) msg); - if (newcol && (_flags(obj) & MADF_SETUP)) { if (data->pen != -1) @@ -171,8 +179,22 @@ IPTR Pendisplay__OM_SET(struct IClass *cl, Object *obj, } MUI_Redraw(obj, MADF_DRAWUPDATE); + + if (data->pen != -1) + GetRGB32(muiRenderInfo(obj)->mri_Colormap, data->pen & 0xffff, 1, + (ULONG *)&data->rgb); + else + extra_tags[1].ti_Tag = TAG_IGNORE; + + /* Prepare notification values for attributes affected by pen change */ + extra_tags[0].ti_Data = data->pen & 0xffff; + extra_tags[1].ti_Data = (IPTR) &data->rgb; + extra_tags[2].ti_Data = (IPTR) &data->penspec; + msg->ops_AttrList = extra_tags; } + retval = DoSuperMethodA(cl, obj, (Msg) msg); + return retval; } @@ -182,10 +204,14 @@ IPTR Pendisplay__OM_GET(struct IClass *cl, Object *obj, struct Pendisplay_DATA *data = INST_DATA(cl, obj); IPTR *store = msg->opg_Storage; + /* Redirect queries to the object we reference, if any */ + if (data->refobj != NULL && msg->opg_AttrID != MUIA_Pendisplay_Reference) + return DoMethodA(data->refobj, (Msg) msg); + switch (msg->opg_AttrID) { case MUIA_Pendisplay_Pen: - *store = (IPTR) data->pen; + *store = (IPTR) data->pen & 0xffff; break; case MUIA_Pendisplay_Reference: @@ -194,7 +220,6 @@ IPTR Pendisplay__OM_GET(struct IClass *cl, Object *obj, case MUIA_Pendisplay_RGBcolor: { - // FIXME: MUIA_Pendisplay_RGBColor (only works for RGB pen specs) struct MUI_PenSpec_intern intpenspec; zune_pen_spec_to_intern(&data->penspec, &intpenspec); @@ -203,18 +228,23 @@ IPTR Pendisplay__OM_GET(struct IClass *cl, Object *obj, case PST_MUI: case PST_CMAP: case PST_SYS: + GetRGB32(muiRenderInfo(obj)->mri_Colormap, + data->pen & 0xffff, 1, (ULONG *)&data->rgb); break; case PST_RGB: data->rgb = intpenspec.p_rgb; break; } - *store = (IPTR) & data->rgb; + if (data->pen != -1) + *store = (IPTR) &data->rgb; + else + return FALSE; } break; case MUIA_Pendisplay_Spec: - *store = (IPTR) & data->penspec; + *store = (IPTR) &data->penspec; break; default: @@ -321,7 +351,7 @@ IPTR Pendisplay__MUIM_Pendisplay_SetColormap(struct IClass *cl, snprintf(penspec.ps_buf, sizeof(penspec.ps_buf), "%lc%d", (int)PST_CMAP, (int)msg->colormap); - set(obj, MUIA_Pendisplay_Spec, (IPTR) & penspec); + set(obj, MUIA_Pendisplay_Spec, (IPTR) &penspec); return 0; } @@ -334,7 +364,7 @@ IPTR Pendisplay__MUIM_Pendisplay_SetRGB(struct IClass *cl, Object *obj, snprintf(penspec.ps_buf, sizeof(penspec.ps_buf), "%lc%08x,%08x,%08x", (int)PST_RGB, (unsigned int)msg->r, (unsigned int)msg->g, (unsigned int)msg->b); - set(obj, MUIA_Pendisplay_Spec, (IPTR) & penspec); + set(obj, MUIA_Pendisplay_Spec, (IPTR) &penspec); return 0; } @@ -346,7 +376,7 @@ IPTR Pendisplay__MUIM_Pendisplay_SetMUIPen(struct IClass *cl, Object *obj, snprintf(penspec.ps_buf, sizeof(penspec.ps_buf), "%lc%d", (int)PST_MUI, (int)msg->muipen); - set(obj, MUIA_Pendisplay_Spec, (IPTR) & penspec); + set(obj, MUIA_Pendisplay_Spec, (IPTR) &penspec); return 0; } -- 2.11.4.GIT