From 6fad23f5fbca93c5270cba83f07e755c1d312db9 Mon Sep 17 00:00:00 2001 From: neil Date: Fri, 14 Sep 2012 19:47:19 +0000 Subject: [PATCH] Tabs to spaces, more consistent formatting. git-svn-id: https://svn.aros.org/svn/aros/trunk/AROS@45798 fb15a70f-31f2-0310-bbcc-cdcc74a49acc --- workbench/libs/muimaster/classes/application.c | 1409 ++++--- workbench/libs/muimaster/classes/application.h | 581 ++- workbench/libs/muimaster/classes/area.c | 2362 ++++++----- workbench/libs/muimaster/classes/area.h | 965 +++-- workbench/libs/muimaster/classes/balance.c | 1662 ++++---- workbench/libs/muimaster/classes/balance.h | 3 +- workbench/libs/muimaster/classes/bitmap.c | 1126 +++--- workbench/libs/muimaster/classes/bitmap.h | 27 +- workbench/libs/muimaster/classes/bodychunk.c | 812 ++-- workbench/libs/muimaster/classes/bodychunk.h | 12 +- workbench/libs/muimaster/classes/boopsi.c | 965 +++-- workbench/libs/muimaster/classes/boopsi.h | 81 +- workbench/libs/muimaster/classes/chunkyimage.c | 670 +-- workbench/libs/muimaster/classes/chunkyimage.h | 14 +- workbench/libs/muimaster/classes/coloradjust.c | 1183 +++--- workbench/libs/muimaster/classes/coloradjust.h | 17 +- workbench/libs/muimaster/classes/colorfield.c | 632 +-- workbench/libs/muimaster/classes/colorfield.h | 10 +- workbench/libs/muimaster/classes/configdata.c | 2227 +++++----- workbench/libs/muimaster/classes/configdata.h | 173 +- workbench/libs/muimaster/classes/crawling.c | 289 +- workbench/libs/muimaster/classes/cycle.c | 932 +++-- workbench/libs/muimaster/classes/cycle.h | 4 +- workbench/libs/muimaster/classes/dataspace.c | 672 +-- workbench/libs/muimaster/classes/dataspace.h | 114 +- workbench/libs/muimaster/classes/dirlist.c | 1071 ++--- workbench/libs/muimaster/classes/dirlist.h | 143 +- workbench/libs/muimaster/classes/dtpic.c | 227 +- workbench/libs/muimaster/classes/dtpic.h | 4 +- workbench/libs/muimaster/classes/dtpic_private.h | 8 +- workbench/libs/muimaster/classes/family.c | 233 +- workbench/libs/muimaster/classes/family.h | 74 +- workbench/libs/muimaster/classes/floattext.c | 578 +-- workbench/libs/muimaster/classes/floattext.h | 14 +- workbench/libs/muimaster/classes/frameadjust.c | 229 +- workbench/libs/muimaster/classes/frameadjust.h | 5 +- workbench/libs/muimaster/classes/framedisplay.c | 156 +- workbench/libs/muimaster/classes/framedisplay.h | 5 +- workbench/libs/muimaster/classes/gauge.c | 784 ++-- workbench/libs/muimaster/classes/gauge.h | 26 +- workbench/libs/muimaster/classes/gauge_private.h | 2 +- workbench/libs/muimaster/classes/image.h | 67 +- workbench/libs/muimaster/classes/imageadjust.c | 2050 +++++----- workbench/libs/muimaster/classes/imageadjust.h | 16 +- workbench/libs/muimaster/classes/imagedisplay.c | 720 ++-- workbench/libs/muimaster/classes/imagedisplay.h | 14 +- workbench/libs/muimaster/classes/knob.c | 987 ++--- workbench/libs/muimaster/classes/knob.h | 6 +- workbench/libs/muimaster/classes/levelmeter.c | 875 ++-- workbench/libs/muimaster/classes/levelmeter.h | 8 +- workbench/libs/muimaster/classes/list.c | 1859 +++++---- workbench/libs/muimaster/classes/list.h | 589 ++- workbench/libs/muimaster/classes/listview.c | 287 +- workbench/libs/muimaster/classes/listview.h | 29 +- workbench/libs/muimaster/classes/mccprefs.c | 33 +- workbench/libs/muimaster/classes/mccprefs.h | 2 +- workbench/libs/muimaster/classes/menuitem.c | 1023 ++--- workbench/libs/muimaster/classes/menuitem.h | 46 +- workbench/libs/muimaster/classes/notify.c | 735 ++-- workbench/libs/muimaster/classes/notify.h | 326 +- workbench/libs/muimaster/classes/numeric.c | 609 +-- workbench/libs/muimaster/classes/numeric.h | 138 +- workbench/libs/muimaster/classes/numericbutton.c | 1119 ++--- .../libs/muimaster/classes/numericbutton_private.h | 50 +- workbench/libs/muimaster/classes/palette.c | 284 +- workbench/libs/muimaster/classes/palette.h | 15 +- workbench/libs/muimaster/classes/palette_private.h | 4 +- workbench/libs/muimaster/classes/penadjust.c | 255 +- workbench/libs/muimaster/classes/penadjust.h | 10 +- .../libs/muimaster/classes/penadjust_private.h | 10 +- workbench/libs/muimaster/classes/pendisplay.c | 823 ++-- workbench/libs/muimaster/classes/pendisplay.h | 85 +- .../libs/muimaster/classes/pendisplay_private.h | 6 +- workbench/libs/muimaster/classes/pixmap.c | 599 +-- workbench/libs/muimaster/classes/pixmap.h | 45 +- workbench/libs/muimaster/classes/popasl.c | 816 ++-- workbench/libs/muimaster/classes/popasl.h | 12 +- workbench/libs/muimaster/classes/popframe.c | 456 ++- workbench/libs/muimaster/classes/popframe.h | 19 +- workbench/libs/muimaster/classes/popimage.c | 489 ++- workbench/libs/muimaster/classes/popimage.h | 21 +- workbench/libs/muimaster/classes/poplist.c | 129 +- workbench/libs/muimaster/classes/poplist.h | 5 +- workbench/libs/muimaster/classes/popobject.c | 742 ++-- workbench/libs/muimaster/classes/popobject.h | 23 +- workbench/libs/muimaster/classes/poppen.c | 392 +- workbench/libs/muimaster/classes/poppen.h | 13 +- workbench/libs/muimaster/classes/popscreen.c | 138 +- workbench/libs/muimaster/classes/popscreen.h | 2 +- workbench/libs/muimaster/classes/popstring.c | 206 +- workbench/libs/muimaster/classes/popstring.h | 38 +- workbench/libs/muimaster/classes/process.c | 135 +- workbench/libs/muimaster/classes/process.h | 99 +- workbench/libs/muimaster/classes/prop.c | 2237 +++++----- workbench/libs/muimaster/classes/prop.h | 112 +- workbench/libs/muimaster/classes/radio.c | 231 +- workbench/libs/muimaster/classes/radio.h | 10 +- workbench/libs/muimaster/classes/rectangle.c | 813 ++-- workbench/libs/muimaster/classes/rectangle.h | 10 +- workbench/libs/muimaster/classes/register.c | 1548 +++---- workbench/libs/muimaster/classes/register.h | 8 +- workbench/libs/muimaster/classes/scale.c | 574 +-- workbench/libs/muimaster/classes/scale.h | 6 +- workbench/libs/muimaster/classes/scrollbar.c | 357 +- workbench/libs/muimaster/classes/scrollbar.h | 4 +- workbench/libs/muimaster/classes/scrollbutton.c | 437 +- workbench/libs/muimaster/classes/scrollbutton.h | 21 +- workbench/libs/muimaster/classes/scrollgroup.c | 785 ++-- workbench/libs/muimaster/classes/scrollgroup.h | 20 +- workbench/libs/muimaster/classes/semaphore.c | 83 +- workbench/libs/muimaster/classes/semaphore.h | 46 +- workbench/libs/muimaster/classes/settings.c | 92 +- workbench/libs/muimaster/classes/settings.h | 2 +- workbench/libs/muimaster/classes/settingsgroup.c | 65 +- workbench/libs/muimaster/classes/settingsgroup.h | 24 +- workbench/libs/muimaster/classes/slider.c | 1079 ++--- workbench/libs/muimaster/classes/slider.h | 12 +- workbench/libs/muimaster/classes/string.c | 4271 ++++++++++---------- workbench/libs/muimaster/classes/string.h | 158 +- workbench/libs/muimaster/classes/text.c | 334 +- workbench/libs/muimaster/classes/text.h | 101 +- workbench/libs/muimaster/classes/title.c | 307 +- workbench/libs/muimaster/classes/title.h | 2 +- workbench/libs/muimaster/classes/virtgroup.c | 23 +- workbench/libs/muimaster/classes/virtgroup.h | 20 +- workbench/libs/muimaster/classes/volumelist.c | 536 +-- workbench/libs/muimaster/classes/volumelist.h | 4 +- workbench/libs/muimaster/classes/window.c | 3277 ++++++++------- workbench/libs/muimaster/classes/window.h | 701 ++-- 129 files changed, 30259 insertions(+), 26011 deletions(-) rewrite workbench/libs/muimaster/classes/application.h (73%) rewrite workbench/libs/muimaster/classes/area.h (79%) rewrite workbench/libs/muimaster/classes/balance.c (75%) rewrite workbench/libs/muimaster/classes/bitmap.c (66%) rewrite workbench/libs/muimaster/classes/bodychunk.c (60%) rewrite workbench/libs/muimaster/classes/boopsi.c (79%) rewrite workbench/libs/muimaster/classes/boopsi.h (64%) rewrite workbench/libs/muimaster/classes/chunkyimage.c (65%) rewrite workbench/libs/muimaster/classes/coloradjust.c (72%) rewrite workbench/libs/muimaster/classes/colorfield.c (74%) rewrite workbench/libs/muimaster/classes/configdata.c (61%) rewrite workbench/libs/muimaster/classes/crawling.c (63%) rewrite workbench/libs/muimaster/classes/dataspace.c (63%) rewrite workbench/libs/muimaster/classes/dataspace.h (67%) rewrite workbench/libs/muimaster/classes/dirlist.c (79%) rewrite workbench/libs/muimaster/classes/dirlist.h (64%) rewrite workbench/libs/muimaster/classes/floattext.c (60%) rewrite workbench/libs/muimaster/classes/gauge.c (74%) rewrite workbench/libs/muimaster/classes/image.h (63%) rewrite workbench/libs/muimaster/classes/imageadjust.c (78%) rewrite workbench/libs/muimaster/classes/imagedisplay.c (67%) rewrite workbench/libs/muimaster/classes/knob.c (64%) rewrite workbench/libs/muimaster/classes/levelmeter.c (72%) rewrite workbench/libs/muimaster/classes/list.h (78%) rewrite workbench/libs/muimaster/classes/menuitem.c (63%) rewrite workbench/libs/muimaster/classes/notify.h (83%) rewrite workbench/libs/muimaster/classes/numeric.h (78%) rewrite workbench/libs/muimaster/classes/numericbutton.c (61%) rewrite workbench/libs/muimaster/classes/numericbutton_private.h (64%) rewrite workbench/libs/muimaster/classes/pendisplay.c (71%) rewrite workbench/libs/muimaster/classes/pendisplay.h (64%) rewrite workbench/libs/muimaster/classes/popasl.c (61%) rewrite workbench/libs/muimaster/classes/popframe.c (67%) rewrite workbench/libs/muimaster/classes/popimage.c (64%) rewrite workbench/libs/muimaster/classes/popobject.c (76%) rewrite workbench/libs/muimaster/classes/poppen.c (66%) rewrite workbench/libs/muimaster/classes/process.h (71%) rewrite workbench/libs/muimaster/classes/prop.c (66%) rewrite workbench/libs/muimaster/classes/prop.h (63%) rewrite workbench/libs/muimaster/classes/rectangle.c (63%) rewrite workbench/libs/muimaster/classes/register.c (65%) rewrite workbench/libs/muimaster/classes/scale.c (75%) rewrite workbench/libs/muimaster/classes/scrollbar.c (66%) rewrite workbench/libs/muimaster/classes/scrollbutton.c (74%) rewrite workbench/libs/muimaster/classes/scrollgroup.c (79%) rewrite workbench/libs/muimaster/classes/slider.c (65%) rewrite workbench/libs/muimaster/classes/string.c (68%) rewrite workbench/libs/muimaster/classes/string.h (63%) rewrite workbench/libs/muimaster/classes/text.h (68%) rewrite workbench/libs/muimaster/classes/volumelist.c (68%) rewrite workbench/libs/muimaster/classes/window.h (73%) diff --git a/workbench/libs/muimaster/classes/application.c b/workbench/libs/muimaster/classes/application.c index ab040810f4..0e609c738a 100644 --- a/workbench/libs/muimaster/classes/application.c +++ b/workbench/libs/muimaster/classes/application.c @@ -50,7 +50,7 @@ extern struct Library *MUIMasterBase; struct TrackingNode { struct MinNode tn_Node; - Object *tn_Application; + Object *tn_Application; }; struct MUI_ApplicationData @@ -218,19 +218,20 @@ static struct MQNode *CreateMQNode(LONG count) { struct MQNode *mq; - mq = (struct MQNode *)mui_alloc(sizeof(struct MQNode) + (count * sizeof(IPTR))); + mq = (struct MQNode *)mui_alloc(sizeof(struct MQNode) + + (count * sizeof(IPTR))); if (!mq) return NULL; mq->mq_Count = count; - mq->mq_Msg = (IPTR *)(((char *)mq)+sizeof(struct MQNode)); + mq->mq_Msg = (IPTR *) (((char *)mq) + sizeof(struct MQNode)); return mq; } /* * Free an IQ Method got from CreateIQMethod() */ -static void DeleteMQNode(struct MQNode *mq) +static void DeleteMQNode(struct MQNode *mq) { mui_free(mq); } @@ -246,9 +247,11 @@ struct RIDNode }; -static struct RIDNode *CreateRIDNode(struct MUI_ApplicationData *data, ULONG retid) +static struct RIDNode *CreateRIDNode(struct MUI_ApplicationData *data, + ULONG retid) { struct RIDNode *rid; + if ((rid = mui_alloc_struct(struct RIDNode))) { rid->rid_Value = retid; @@ -257,7 +260,8 @@ static struct RIDNode *CreateRIDNode(struct MUI_ApplicationData *data, ULONG ret } -static void DeleteRIDNode (struct MUI_ApplicationData *data, struct RIDNode *rid) +static void DeleteRIDNode(struct MUI_ApplicationData *data, + struct RIDNode *rid) { mui_free(rid); } @@ -266,9 +270,9 @@ static void DeleteRIDNode (struct MUI_ApplicationData *data, struct RIDNode *ri /************************************************************************** Process a pushed method. **************************************************************************/ -static BOOL application_do_pushed_method (struct MUI_ApplicationData *data) +static BOOL application_do_pushed_method(struct MUI_ApplicationData *data) { - struct MQNode *mq; + struct MQNode *mq; ObtainSemaphore(&data->app_MethodSemaphore); @@ -276,7 +280,7 @@ static BOOL application_do_pushed_method (struct MUI_ApplicationData *data) { ReleaseSemaphore(&data->app_MethodSemaphore); - DoMethodA(mq->mq_Dest, (Msg)mq->mq_Msg); + DoMethodA(mq->mq_Dest, (Msg) mq->mq_Msg); DeleteMQNode(mq); return TRUE; } @@ -284,10 +288,11 @@ static BOOL application_do_pushed_method (struct MUI_ApplicationData *data) return FALSE; } -static Object *find_application_by_base(struct IClass *cl, Object *obj, STRPTR base) +static Object *find_application_by_base(struct IClass *cl, Object *obj, + STRPTR base) { struct TrackingNode *tn; - Object *retval = NULL; + Object *retval = NULL; ObtainSemaphore(&MUIMB(MUIMasterBase)->ZuneSemaphore); ForeachNode(&MUIMB(MUIMasterBase)->Applications, tn) @@ -310,13 +315,14 @@ static Object *find_application_by_base(struct IClass *cl, Object *obj, STRPTR b /************************************************************************** OM_NEW **************************************************************************/ -static IPTR Application__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) +static IPTR Application__OM_NEW(struct IClass *cl, Object *obj, + struct opSet *msg) { struct MUI_ApplicationData *data; - struct TagItem *tags,*tag; - BOOL bad_childs = FALSE ; + struct TagItem *tags, *tag; + BOOL bad_childs = FALSE; - obj = (Object *)DoSuperMethodA(cl, obj, (Msg)msg); + obj = (Object *) DoSuperMethodA(cl, obj, (Msg) msg); if (!obj) return FALSE; @@ -324,38 +330,41 @@ static IPTR Application__OM_NEW(struct IClass *cl, Object *obj, struct opSet *ms data = INST_DATA(cl, obj); /* init input handler list */ - NewList((struct List*)&(data->app_IHList)); + NewList((struct List *)&(data->app_IHList)); /* init input queue */ - NewList((struct List*)&(data->app_MethodQueue)); + NewList((struct List *)&(data->app_MethodQueue)); /* init return ids queue */ - NewList((struct List*)&(data->app_ReturnIDQueue)); + NewList((struct List *)&(data->app_ReturnIDQueue)); /* window list */ data->app_WindowFamily = MUI_NewObjectA(MUIC_Family, NULL); if (!data->app_WindowFamily) { - CoerceMethod(cl,obj,OM_DISPOSE); + CoerceMethod(cl, obj, OM_DISPOSE); return 0; } data->app_GlobalInfo.mgi_ApplicationObject = obj; if (!(data->app_GlobalInfo.mgi_WindowsPort = CreateMsgPort())) { - CoerceMethod(cl,obj,OM_DISPOSE); + CoerceMethod(cl, obj, OM_DISPOSE); return 0; } data->app_Task = FindTask(NULL); /* Parse prefs */ - data->app_SingleTask = (BOOL)GetTagData(MUIA_Application_SingleTask, FALSE, - msg->ops_AttrList); - data->app_Base = (STRPTR)GetTagData(MUIA_Application_Base, (IPTR)"UNNAMED", msg->ops_AttrList); + data->app_SingleTask = + (BOOL) GetTagData(MUIA_Application_SingleTask, FALSE, + msg->ops_AttrList); + data->app_Base = + (STRPTR) GetTagData(MUIA_Application_Base, (IPTR) "UNNAMED", + msg->ops_AttrList); if (!data->app_Base || strpbrk(data->app_Base, ":/()#?*,")) { - data->app_Base = NULL; /* don't remove */ + data->app_Base = NULL; /* don't remove */ CoerceMethod(cl, obj, OM_DISPOSE); return 0; @@ -383,8 +392,9 @@ static IPTR Application__OM_NEW(struct IClass *cl, Object *obj, struct opSet *ms if ((other_app = find_application_by_base(cl, obj, data->app_Base))) { //FIXME "Is calling MUIM_Application_PushMethod on an alien application object safe?" - DoMethod(other_app, MUIM_Application_PushMethod, (IPTR)other_app, 3, - MUIM_Set, MUIA_Application_DoubleStart, TRUE); + DoMethod(other_app, MUIM_Application_PushMethod, + (IPTR) other_app, 3, MUIM_Set, MUIA_Application_DoubleStart, + TRUE); data->app_Base = NULL; } ReleaseSemaphore(&MUIMB(MUIMasterBase)->ZuneSemaphore); @@ -399,13 +409,14 @@ static IPTR Application__OM_NEW(struct IClass *cl, Object *obj, struct opSet *ms } data->app_GlobalInfo.mgi_Configdata = - MUI_NewObject(MUIC_Configdata, MUIA_Configdata_Application, obj, TAG_DONE); + MUI_NewObject(MUIC_Configdata, MUIA_Configdata_Application, obj, + TAG_DONE); if (!data->app_GlobalInfo.mgi_Configdata) { - CoerceMethod(cl,obj,OM_DISPOSE); + CoerceMethod(cl, obj, OM_DISPOSE); return 0; } - get(data->app_GlobalInfo.mgi_Configdata,MUIA_Configdata_ZunePrefs, + get(data->app_GlobalInfo.mgi_Configdata, MUIA_Configdata_ZunePrefs, &data->app_GlobalInfo.mgi_Prefs); // D(bug("muimaster.library/application.c: Message Port created at 0x%lx\n", @@ -414,19 +425,22 @@ static IPTR Application__OM_NEW(struct IClass *cl, Object *obj, struct opSet *ms /* Setup timer stuff */ if (!(data->app_TimerPort = CreateMsgPort())) { - CoerceMethod(cl,obj,OM_DISPOSE); + CoerceMethod(cl, obj, OM_DISPOSE); return 0; } - if (!(data->app_TimerReq = (struct timerequest *)CreateIORequest(data->app_TimerPort, sizeof(struct timerequest)))) + if (!(data->app_TimerReq = + (struct timerequest *)CreateIORequest(data->app_TimerPort, + sizeof(struct timerequest)))) { - CoerceMethod(cl,obj,OM_DISPOSE); + CoerceMethod(cl, obj, OM_DISPOSE); return 0; } - if (OpenDevice(TIMERNAME, UNIT_VBLANK, (struct IORequest *)data->app_TimerReq, 0)) + if (OpenDevice(TIMERNAME, UNIT_VBLANK, + (struct IORequest *)data->app_TimerReq, 0)) { - CoerceMethod(cl,obj,OM_DISPOSE); + CoerceMethod(cl, obj, OM_DISPOSE); return 0; } @@ -441,132 +455,132 @@ static IPTR Application__OM_NEW(struct IClass *cl, Object *obj, struct opSet *ms data->app_Version = "Unnamed 0.0"; data->app_Description = "?"; - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) { switch (tag->ti_Tag) { - case MUIA_Application_Author: - data->app_Author = (STRPTR)tag->ti_Data; - break; + case MUIA_Application_Author: + data->app_Author = (STRPTR) tag->ti_Data; + break; - case MUIA_Application_Base: - /* moved before config parsing */ - break; + case MUIA_Application_Base: + /* moved before config parsing */ + break; - case MUIA_Application_Copyright: - data->app_Copyright = (STRPTR)tag->ti_Data; - break; + case MUIA_Application_Copyright: + data->app_Copyright = (STRPTR) tag->ti_Data; + break; - case MUIA_Application_Description: - data->app_Description = (STRPTR)tag->ti_Data; - break; + case MUIA_Application_Description: + data->app_Description = (STRPTR) tag->ti_Data; + break; - case MUIA_Application_HelpFile: - data->app_HelpFile = (STRPTR)tag->ti_Data; - break; + case MUIA_Application_HelpFile: + data->app_HelpFile = (STRPTR) tag->ti_Data; + break; - case MUIA_Application_SingleTask: - /* moved before config parsing */ - break; + case MUIA_Application_SingleTask: + /* moved before config parsing */ + break; - case MUIA_Application_Title: - data->app_Title = (STRPTR)tag->ti_Data; - break; + case MUIA_Application_Title: + data->app_Title = (STRPTR) tag->ti_Data; + break; - case MUIA_Application_Version: - data->app_Version = (STRPTR)tag->ti_Data; - break; + case MUIA_Application_Version: + data->app_Version = (STRPTR) tag->ti_Data; + break; - case MUIA_Application_Version_Number: - data->app_Version_Number = (STRPTR)tag->ti_Data; - break; + case MUIA_Application_Version_Number: + data->app_Version_Number = (STRPTR) tag->ti_Data; + break; - case MUIA_Application_Version_Date: - data->app_Version_Date = (STRPTR)tag->ti_Data; - break; + case MUIA_Application_Version_Date: + data->app_Version_Date = (STRPTR) tag->ti_Data; + break; - case MUIA_Application_Version_Extra: - data->app_Version_Extra = (STRPTR) tag->ti_Data; - break; + case MUIA_Application_Version_Extra: + data->app_Version_Extra = (STRPTR) tag->ti_Data; + break; - case MUIA_Application_Window: - if (tag->ti_Data) DoMethod(obj,OM_ADDMEMBER,tag->ti_Data); - else bad_childs = TRUE; - break; + case MUIA_Application_Window: + if (tag->ti_Data) + DoMethod(obj, OM_ADDMEMBER, tag->ti_Data); + else + bad_childs = TRUE; + break; - case MUIA_Application_Menustrip: - data->app_Menustrip = (Object*)tag->ti_Data; - break; + case MUIA_Application_Menustrip: + data->app_Menustrip = (Object *) tag->ti_Data; + break; - case MUIA_Application_BrokerPri: - data->app_BrokerPri = (BYTE)tag->ti_Data; - break; + case MUIA_Application_BrokerPri: + data->app_BrokerPri = (BYTE) tag->ti_Data; + break; - case MUIA_Application_BrokerHook: - data->app_BrokerHook = (struct Hook *)tag->ti_Data; - break; + case MUIA_Application_BrokerHook: + data->app_BrokerHook = (struct Hook *)tag->ti_Data; + break; - case MUIA_Application_Active: - data->app_Active = tag->ti_Data ? TRUE : FALSE; - break; + case MUIA_Application_Active: + data->app_Active = tag->ti_Data ? TRUE : FALSE; + break; - case MUIA_Application_UsedClasses: + case MUIA_Application_UsedClasses: + { + STRPTR *list = (STRPTR *) tag->ti_Data; + if (!list) + break; + while (*list) { - STRPTR *list = (STRPTR *)tag->ti_Data; - if (!list) break; - while (*list) - { - struct IClass *icl = MUI_GetClass(*list); - if (icl) - MUI_FreeClass(icl); - ++list; - } + struct IClass *icl = MUI_GetClass(*list); + if (icl) + MUI_FreeClass(icl); + ++list; } - break; + } + break; - case MUIA_Application_UseRexx: - data->app_UseRexx = tag->ti_Data ? TRUE: FALSE; - break; + case MUIA_Application_UseRexx: + data->app_UseRexx = tag->ti_Data ? TRUE : FALSE; + break; - case MUIA_Application_Commands: - data->app_Commands = (struct MUI_Command *)tag->ti_Data; - break; + case MUIA_Application_Commands: + data->app_Commands = (struct MUI_Command *)tag->ti_Data; + break; - case MUIA_Application_RexxHook: - data->app_RexxHook = (struct Hook *)tag->ti_Data; - break; + case MUIA_Application_RexxHook: + data->app_RexxHook = (struct Hook *)tag->ti_Data; + break; - case MUIA_Application_DiskObject: - data->app_DiskObject = (struct DiskObject *)tag->ti_Data; - break; + case MUIA_Application_DiskObject: + data->app_DiskObject = (struct DiskObject *)tag->ti_Data; + break; } } /* create MUIA_Application_Version if NULL */ - if - ( - data->app_Version == NULL - && data->app_Title != NULL && data->app_Version_Number != NULL - ) + if (data->app_Version == NULL + && data->app_Title != NULL && data->app_Version_Number != NULL) { STRPTR result = NULL; - ULONG length = 0; + ULONG length = 0; /* Calculate length */ length = strlen("$VER: ") + strlen(data->app_Title) + 1 /* space */ - + strlen(data->app_Version_Number) + 1 /* NULL */; + + strlen(data->app_Version_Number) + 1 /* NULL */ ; if (data->app_Version_Date != NULL) { - length += 1 /* space */ + 1 /* ( */ - + strlen(data->app_Version_Date) + 1 /* ) */; + length += 1 /* space */ + 1 /* ( */ + + strlen(data->app_Version_Date) + 1 /* ) */ ; } if (data->app_Version_Extra != NULL) { - length += 1 /* space */ + 1 /* [ */ - + strlen(data->app_Version_Extra) + 1 /* ] */; + length += 1 /* space */ + 1 /* [ */ + + strlen(data->app_Version_Extra) + 1 /* ] */ ; } /* Allocate memory */ @@ -596,7 +610,7 @@ static IPTR Application__OM_NEW(struct IClass *cl, Object *obj, struct opSet *ms strlcat(result, "]", length); } - data->app_Version = result; + data->app_Version = result; data->app_VersionAllocated = TRUE; } @@ -608,7 +622,9 @@ static IPTR Application__OM_NEW(struct IClass *cl, Object *obj, struct opSet *ms return 0; } - if (CxBase && GetTagData(MUIA_Application_UseCommodities, TRUE, msg->ops_AttrList)) + if (CxBase + && GetTagData(MUIA_Application_UseCommodities, TRUE, + msg->ops_AttrList)) { data->app_BrokerPort = CreateMsgPort(); @@ -616,23 +632,29 @@ static IPTR Application__OM_NEW(struct IClass *cl, Object *obj, struct opSet *ms { struct NewBroker nb; - nb.nb_Version = NB_VERSION; - nb.nb_Name = data->app_Title ? data->app_Title : (STRPTR)"Unnamed"; - nb.nb_Title = data->app_Version ? data->app_Version : (STRPTR)"Unnamed"; - nb.nb_Descr = data->app_Description ? data->app_Description : (STRPTR)"?"; - nb.nb_Unique = 0; - nb.nb_Flags = COF_SHOW_HIDE; - nb.nb_Pri = data->app_BrokerPri; - nb.nb_Port = data->app_BrokerPort; - nb.nb_ReservedChannel = 0; - - if (strncmp(nb.nb_Title, "$VER: ", 6) == 0) nb.nb_Title += 6; + nb.nb_Version = NB_VERSION; + nb.nb_Name = + data->app_Title ? data->app_Title : (STRPTR) "Unnamed"; + nb.nb_Title = + data->app_Version ? data->app_Version : (STRPTR) "Unnamed"; + nb.nb_Descr = + data->app_Description ? data-> + app_Description : (STRPTR) "?"; + nb.nb_Unique = 0; + nb.nb_Flags = COF_SHOW_HIDE; + nb.nb_Pri = data->app_BrokerPri; + nb.nb_Port = data->app_BrokerPort; + nb.nb_ReservedChannel = 0; + + if (strncmp(nb.nb_Title, "$VER: ", 6) == 0) + nb.nb_Title += 6; data->app_Broker = CxBroker(&nb, 0); if (data->app_Broker) { - if (data->app_Active) ActivateCxObj(data->app_Broker, 1); + if (data->app_Active) + ActivateCxObj(data->app_Broker, 1); } } } @@ -645,9 +667,11 @@ static IPTR Application__OM_NEW(struct IClass *cl, Object *obj, struct opSet *ms data->app_RexxPort->mp_Node.ln_Name = StrDup(data->app_Base); if (data->app_RexxPort->mp_Node.ln_Name != NULL) { - D(bug("[MUI] %s is using REXX!\n",data->app_RexxPort->mp_Node.ln_Name)); + D(bug("[MUI] %s is using REXX!\n", + data->app_RexxPort->mp_Node.ln_Name)); char *i; - for (i = data->app_RexxPort->mp_Node.ln_Name; *i != '\0'; i++) + for (i = data->app_RexxPort->mp_Node.ln_Name; *i != '\0'; + i++) { *i = toupper(*i); } @@ -661,17 +685,19 @@ static IPTR Application__OM_NEW(struct IClass *cl, Object *obj, struct opSet *ms } } - if (data->app_Menustrip) DoMethod(data->app_Menustrip, MUIM_ConnectParent, (IPTR)obj); + if (data->app_Menustrip) + DoMethod(data->app_Menustrip, MUIM_ConnectParent, (IPTR) obj); data->app_AppPort = CreateMsgPort(); ObtainSemaphore(&MUIMB(MUIMasterBase)->ZuneSemaphore); data->app_TrackingNode.tn_Application = obj; - AddTail((struct List *)&MUIMB(MUIMasterBase)->Applications, (struct Node*)&data->app_TrackingNode); + AddTail((struct List *)&MUIMB(MUIMasterBase)->Applications, + (struct Node *)&data->app_TrackingNode); data->app_is_TNode_in_list = TRUE; ReleaseSemaphore(&MUIMB(MUIMasterBase)->ZuneSemaphore); - return (IPTR)obj; + return (IPTR) obj; } @@ -679,7 +705,8 @@ static IPTR Application__OM_NEW(struct IClass *cl, Object *obj, struct opSet *ms /************************************************************************** OM_DISPOSE **************************************************************************/ -static IPTR Application__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) +static IPTR Application__OM_DISPOSE(struct IClass *cl, Object *obj, + Msg msg) { struct MUI_ApplicationData *data = INST_DATA(cl, obj); struct RIDNode *rid; @@ -688,16 +715,18 @@ static IPTR Application__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) if (data->app_Base) { char filename[255]; - positionmode=data->app_GlobalInfo.mgi_Prefs->window_position; + positionmode = data->app_GlobalInfo.mgi_Prefs->window_position; if (positionmode >= 1) { snprintf(filename, 255, "ENV:zune/%s.prefs", data->app_Base); - DoMethod(data->app_GlobalInfo.mgi_Configdata, MUIM_Configdata_Save, (IPTR)filename); + DoMethod(data->app_GlobalInfo.mgi_Configdata, + MUIM_Configdata_Save, (IPTR) filename); } if (positionmode == 2) { snprintf(filename, 255, "ENVARC:zune/%s.prefs", data->app_Base); - DoMethod(data->app_GlobalInfo.mgi_Configdata, MUIM_Configdata_Save, (IPTR)filename); + DoMethod(data->app_GlobalInfo.mgi_Configdata, + MUIM_Configdata_Save, (IPTR) filename); } } @@ -721,14 +750,16 @@ static IPTR Application__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) { get(data->app_WindowFamily, MUIA_Family_List, &children); if (children == NULL) - break; + break; - cstate = (Object *)children->mlh_Head; + cstate = (Object *) children->mlh_Head; if ((child = NextObject(&cstate))) { - D(bug("Application_Dispose(%p) : OM_REMMEMBER(%p)\n", obj, child)); - DoMethod(obj, OM_REMMEMBER, (IPTR)child); - D(bug("Application_Dispose(%p) : MUI_DisposeObject(%p)\n", obj, child)); + D(bug("Application_Dispose(%p) : OM_REMMEMBER(%p)\n", obj, + child)); + DoMethod(obj, OM_REMMEMBER, (IPTR) child); + D(bug("Application_Dispose(%p) : MUI_DisposeObject(%p)\n", + obj, child)); MUI_DisposeObject(child); } @@ -759,7 +790,7 @@ static IPTR Application__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) { struct Message *msg; - while((msg = GetMsg(data->app_BrokerPort))) + while ((msg = GetMsg(data->app_BrokerPort))) { ReplyMsg(msg); } @@ -774,7 +805,8 @@ static IPTR Application__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) { while (data->app_TimerOutstanding) { - if (Wait(1L << data->app_TimerPort->mp_SigBit | 4096) & 4096) + if (Wait(1L << data->app_TimerPort-> + mp_SigBit | 4096) & 4096) break; data->app_TimerOutstanding--; } @@ -788,7 +820,7 @@ static IPTR Application__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) if (data->app_RexxPort) { struct Message *msg; - while((msg = GetMsg(data->app_RexxPort))) + while ((msg = GetMsg(data->app_RexxPort))) { ReplyMsg(msg); } @@ -809,7 +841,7 @@ static IPTR Application__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) if (data->app_AppPort) { struct Message *msg; - while((msg = GetMsg(data->app_AppPort))) + while ((msg = GetMsg(data->app_AppPort))) ReplyMsg(msg); DeleteMsgPort(data->app_AppPort); @@ -825,7 +857,9 @@ static IPTR Application__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) /* free returnid stuff */ - while ((rid = (struct RIDNode *)RemHead((struct List *)&data->app_ReturnIDQueue))) + while ((rid = + (struct RIDNode *)RemHead((struct List *)&data-> + app_ReturnIDQueue))) { DeleteRIDNode(data, rid); } @@ -837,11 +871,12 @@ static IPTR Application__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) /************************************************************************** OM_SET **************************************************************************/ -static IPTR Application__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) +static IPTR Application__OM_SET(struct IClass *cl, Object *obj, + struct opSet *msg) { - struct MUI_ApplicationData *data = INST_DATA(cl, obj); - struct TagItem *tags = msg->ops_AttrList; - struct TagItem *tag; + struct MUI_ApplicationData *data = INST_DATA(cl, obj); + struct TagItem *tags = msg->ops_AttrList; + struct TagItem *tag; /* There are many ways to find out what tag items provided by set() ** we do know. The best way should be using NextTagItem() and simply @@ -853,417 +888,444 @@ static IPTR Application__OM_SET(struct IClass *cl, Object *obj, struct opSet *ms switch (tag->ti_Tag) { - case MUIA_Application_SearchWinId: - data->searchwinid = tag->ti_Data; - break; + case MUIA_Application_SearchWinId: + data->searchwinid = tag->ti_Data; + break; - case MUIA_Application_CopyWinPosToApp: - addr = (IPTR *) tag->ti_Data; - CopyMem((CONST_APTR) tag->ti_Data, &data->winposused, *(addr)); - break; + case MUIA_Application_CopyWinPosToApp: + addr = (IPTR *) tag->ti_Data; + CopyMem((CONST_APTR) tag->ti_Data, &data->winposused, *(addr)); + break; - case MUIA_Application_SetWinPos: + case MUIA_Application_SetWinPos: + { + struct windowpos *winp; + winp = (struct windowpos *)tag->ti_Data; + //kprintf("SetWinPos %d %d %d %d %d\n", winp->id, winp->x1, + // winp->y1, winp->w1, winp->h1); + int i; + for (i = 0; i < MAXWINS - 1; i++) { - struct windowpos *winp; - winp = (struct windowpos *) tag->ti_Data; - //kprintf("SetWinPos %d %d %d %d %d\n",winp->id,winp->x1,winp->y1,winp->w1,winp->h1); - int i; - for (i = 0 ; i < MAXWINS -1 ; i++) + if (data->winpos[i].w1) { - if (data->winpos[i].w1) + if (winp->id == data->winpos[i].id) { - if (winp->id == data->winpos[i].id) //existing entry is overwritten - { - data->winpos[i].x1 = winp->x1;data->winpos[i].y1 = winp->y1; - data->winpos[i].w1 = winp->w1;data->winpos[i].h1 = winp->h1; - data->winpos[i].x2 = winp->x2;data->winpos[i].y2 = winp->y2; - data->winpos[i].w2 = winp->w2;data->winpos[i].h2 = winp->h2; - break; - } - } - else - { // a new entry is add - data->winpos[i].id = winp->id; - data->winpos[i].x1 = winp->x1;data->winpos[i].y1 = winp->y1; - data->winpos[i].w1 = winp->w1;data->winpos[i].h1 = winp->h1; - data->winpos[i].x2 = winp->x2;data->winpos[i].y2 = winp->y2; - data->winpos[i].w2 = winp->w2;data->winpos[i].h2 = winp->h2; + //existing entry is overwritten + data->winpos[i].x1 = winp->x1; + data->winpos[i].y1 = winp->y1; + data->winpos[i].w1 = winp->w1; + data->winpos[i].h1 = winp->h1; + data->winpos[i].x2 = winp->x2; + data->winpos[i].y2 = winp->y2; + data->winpos[i].w2 = winp->w2; + data->winpos[i].h2 = winp->h2; break; } } + else + { + // a new entry is added + data->winpos[i].id = winp->id; + data->winpos[i].x1 = winp->x1; + data->winpos[i].y1 = winp->y1; + data->winpos[i].w1 = winp->w1; + data->winpos[i].h1 = winp->h1; + data->winpos[i].x2 = winp->x2; + data->winpos[i].y2 = winp->y2; + data->winpos[i].w2 = winp->w2; + data->winpos[i].h2 = winp->h2; + break; + } } - break; + } + break; - case MUIA_Application_Configdata: - DoMethod(obj, MUIM_Application_PushMethod, (IPTR)obj, 2, - MUIM_Application_SetConfigdata, tag->ti_Data); - break; + case MUIA_Application_Configdata: + DoMethod(obj, MUIM_Application_PushMethod, (IPTR) obj, 2, + MUIM_Application_SetConfigdata, tag->ti_Data); + break; - case MUIA_Application_HelpFile: - data->app_HelpFile = (STRPTR)tag->ti_Data; - break; + case MUIA_Application_HelpFile: + data->app_HelpFile = (STRPTR) tag->ti_Data; + break; - case MUIA_Application_Iconified: + case MUIA_Application_Iconified: + { + BOOL do_iconify = tag->ti_Data == 1; + if (data->app_Iconified != do_iconify) { - BOOL do_iconify = tag->ti_Data == 1; - if (data->app_Iconified != do_iconify) - { - data->app_Iconified = do_iconify; + data->app_Iconified = do_iconify; - nnset(obj, MUIA_ShowMe, !data->app_Iconified); + nnset(obj, MUIA_ShowMe, !data->app_Iconified); - /* Inform workbench.library */ - if (data->app_Iconified) + /* Inform workbench.library */ + if (data->app_Iconified) + { + STRPTR appname = + data->app_Title ? data-> + app_Title : (STRPTR) "Unnamed"; + struct DiskObject *dobj = + (struct DiskObject *)XGET(obj, + MUIA_Application_DiskObject); + + if (dobj == NULL) { - STRPTR appname = data->app_Title ? data->app_Title : (STRPTR)"Unnamed"; - struct DiskObject * dobj = (struct DiskObject *)XGET(obj, MUIA_Application_DiskObject); - - if (dobj == NULL) + /* Get default AppIcon in ENV:SYS or ENVARC:SYS */ + dobj = GetDefDiskObject(WBAPPICON); + if (dobj) + data->app_DefaultDiskObject = dobj; + else { - /* Get defaults AppIcon either in ENV:SYS or ENVARC:SYS */ - dobj = GetDefDiskObject(WBAPPICON); - if (dobj) data->app_DefaultDiskObject = dobj; + /* First default: ENV:SYS/def_MUI.info */ + dobj = GetDiskObject("ENV:SYS/def_MUI"); + if (dobj) + data->app_DefaultDiskObject = dobj; else { - /* Get defaults - first ENV:SYS/def_MUI.info */ - dobj = GetDiskObject("ENV:SYS/def_MUI"); - if (dobj) data->app_DefaultDiskObject = dobj; + /* Second default: ENV:SYS/def_Zune.info */ + dobj = + GetDiskObject("ENV:SYS/def_Zune"); + if (dobj) + data->app_DefaultDiskObject = dobj; else { - /* Get defaults - second ENV:SYS/def_Zune.info */ - dobj = GetDiskObject("ENV:SYS/def_Zune"); - if (dobj) data->app_DefaultDiskObject = dobj; - else - { - /* Get default - third, default tool icon */ - dobj = GetDefDiskObject(WBTOOL); - if (dobj) data->app_DefaultDiskObject = dobj; - } + /* Third default: default tool icon */ + dobj = GetDefDiskObject(WBTOOL); + if (dobj) + data->app_DefaultDiskObject = + dobj; } } } + } - if (dobj == NULL) - break; + if (dobj == NULL) + break; - dobj->do_CurrentX = NO_ICON_POSITION; - dobj->do_CurrentY = NO_ICON_POSITION; + dobj->do_CurrentX = NO_ICON_POSITION; + dobj->do_CurrentY = NO_ICON_POSITION; - data->app_AppIcon = AddAppIconA(0L, 0L, appname, data->app_AppPort, BNULL, dobj, NULL); + data->app_AppIcon = + AddAppIconA(0L, 0L, appname, data->app_AppPort, + BNULL, dobj, NULL); + } + else + { + if (data->app_AppIcon) + { + RemoveAppIcon(data->app_AppIcon); + data->app_AppIcon = NULL; } - else + if (data->app_DefaultDiskObject) { - if (data->app_AppIcon) - { - RemoveAppIcon(data->app_AppIcon); - data->app_AppIcon = NULL; - } - if (data->app_DefaultDiskObject) - { - FreeDiskObject(data->app_DefaultDiskObject); - data->app_DefaultDiskObject = NULL; - } + FreeDiskObject(data->app_DefaultDiskObject); + data->app_DefaultDiskObject = NULL; } } } - break; + } + break; - case MUIA_ShowMe: + case MUIA_ShowMe: + { + /* Ok ok, you think this stinks? Well, think of it as + an attribute belonging to an interface which + MUIC_Application, together with MUIC_Area and a few + others implement. It makes sense now, yes? */ + struct List *wlist = NULL; + APTR wstate; + Object *curwin = NULL; + Object *lastwin = NULL; + + /* MUIA_ShowMe can cause MUIM_Setup/MUIM_Cleanup to be issued. + * On the other hand it is allowed to add/remove other + * application windows in MUIM_Setup/MUIM_Cleanup. + * This means after processing a window from internal list, + * the list needs to be re-read and iteration started again, + * because wstate can become invalid. + * Note: The code below assumes that the window won't remove + * itself from the list. + */ + + while (1) { - /* Ok ok, you think this stinks? Well, think of it as - an attribute belonging to an interface which MUIC_Application, - together with MUIC_Area and a few others implement. It makes - sense now, yes? */ - struct List *wlist = NULL; - APTR wstate; - Object *curwin = NULL; - Object *lastwin = NULL; - - /* MUIA_ShowMe can cause MUIM_Setup/MUIM_Cleanup to be issued. On the - * other hand it is allowed to add/remove other application windows in - * MUIM_Setup/MUIM_Cleanup. This means after processing a window from - * internal list, the list needs to be re-read and iteration started - * again, because wstate can become invalid. - * Note: The code below assumes that the window won't remove - * itself from the list. - */ - - while(1) + get(data->app_WindowFamily, MUIA_Family_List, &wlist); + wstate = (Object *) wlist->lh_Head; + while ((curwin = NextObject(&wstate))) { - get(data->app_WindowFamily, MUIA_Family_List, &wlist); - wstate = (Object *)wlist->lh_Head; - while((curwin = NextObject(&wstate))) - { - if (lastwin == NULL) break; - if (curwin == lastwin) - { - curwin = NextObject(&wstate); - break; - } - } - - /* This is the window to be processed */ - if (curwin) - { - set(curwin, MUIA_ShowMe, tag->ti_Data); - lastwin = curwin; - } - else + if (lastwin == NULL) + break; + if (curwin == lastwin) { - /* No more windows */ + curwin = NextObject(&wstate); break; } } + + /* This is the window to be processed */ + if (curwin) + { + set(curwin, MUIA_ShowMe, tag->ti_Data); + lastwin = curwin; + } + else + { + /* No more windows */ + break; + } } - break; + } + break; - case MUIA_Application_Sleep: - { - struct List *wlist = NULL; - APTR wstate; - Object *curwin; + case MUIA_Application_Sleep: + { + struct List *wlist = NULL; + APTR wstate; + Object *curwin; - if (tag->ti_Data) + if (tag->ti_Data) + { + data->app_SleepCount++; + if (data->app_SleepCount == 1) { - data->app_SleepCount++; - if (data->app_SleepCount == 1) + get(obj, MUIA_Application_WindowList, &wlist); + if (wlist) { - get(obj, MUIA_Application_WindowList, &wlist); - if (wlist) + wstate = wlist->lh_Head; + while ((curwin = NextObject(&wstate))) { - wstate = wlist->lh_Head; - while ((curwin = NextObject(&wstate))) - { - set(curwin, MUIA_Window_Sleep, TRUE); - } + set(curwin, MUIA_Window_Sleep, TRUE); } } } - else + } + else + { + data->app_SleepCount--; + if (data->app_SleepCount == 0) { - data->app_SleepCount--; - if (data->app_SleepCount == 0) + get(obj, MUIA_Application_WindowList, &wlist); + if (wlist) { - get(obj, MUIA_Application_WindowList, &wlist); - if (wlist) + wstate = wlist->lh_Head; + while ((curwin = NextObject(&wstate))) { - wstate = wlist->lh_Head; - while ((curwin = NextObject(&wstate))) - { - set(curwin, MUIA_Window_Sleep, FALSE); - } + set(curwin, MUIA_Window_Sleep, FALSE); } } } } - break; + } + break; - case MUIA_Application_MenuAction: - data->app_MenuAction = tag->ti_Data; - break; + case MUIA_Application_MenuAction: + data->app_MenuAction = tag->ti_Data; + break; - case MUIA_Application_BrokerHook: - data->app_BrokerHook = (struct Hook *)tag->ti_Data; - break; + case MUIA_Application_BrokerHook: + data->app_BrokerHook = (struct Hook *)tag->ti_Data; + break; - case MUIA_Application_Active: - data->app_Active = tag->ti_Data ? TRUE : FALSE; - if (data->app_Broker) - { - ActivateCxObj(data->app_Broker, data->app_Active); - } - break; + case MUIA_Application_Active: + data->app_Active = tag->ti_Data ? TRUE : FALSE; + if (data->app_Broker) + { + ActivateCxObj(data->app_Broker, data->app_Active); + } + break; - case MUIA_Application_Commands: - data->app_Commands = (struct MUI_Command *)tag->ti_Data; - break; + case MUIA_Application_Commands: + data->app_Commands = (struct MUI_Command *)tag->ti_Data; + break; - case MUIA_Application_RexxString: - data->app_RexxString = (STRPTR)tag->ti_Data; - break; + case MUIA_Application_RexxString: + data->app_RexxString = (STRPTR) tag->ti_Data; + break; - case MUIA_Application_RexxHook: - data->app_RexxHook = (struct Hook *)tag->ti_Data; - break; + case MUIA_Application_RexxHook: + data->app_RexxHook = (struct Hook *)tag->ti_Data; + break; - case MUIA_Application_DiskObject: - data->app_DiskObject = (struct DiskObject *)tag->ti_Data; - break; + case MUIA_Application_DiskObject: + data->app_DiskObject = (struct DiskObject *)tag->ti_Data; + break; } } - return DoSuperMethodA(cl, obj, (Msg)msg); + return DoSuperMethodA(cl, obj, (Msg) msg); } /* * OM_GET */ -static IPTR Application__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) +static IPTR Application__OM_GET(struct IClass *cl, Object *obj, + struct opGet *msg) { #define STORE *(msg->opg_Storage) struct MUI_ApplicationData *data = INST_DATA(cl, obj); - switch(msg->opg_AttrID) + switch (msg->opg_AttrID) { - case MUIA_Application_GetWinPosAddr: - STORE = (IPTR) &data->winposused; - return TRUE; + case MUIA_Application_GetWinPosAddr: + STORE = (IPTR) & data->winposused; + return TRUE; - case MUIA_Application_GetWinPosSize: + case MUIA_Application_GetWinPosSize: + { + int i; + for (i = 0; i < MAXWINS - 1; i++) { - int i; - for (i=0 ; i < MAXWINS -1 ; i++) + if (!data->winpos[i].w1) { - if (!data->winpos[i].w1 ) - { - i *= sizeof (struct windowpos); - i += sizeof (long); - data->winposused=i; - STORE=i; - return(TRUE); - } + i *= sizeof(struct windowpos); + i += sizeof(long); + data->winposused = i; + STORE = i; + return (TRUE); } - STORE=0; - return TRUE; } + STORE = 0; + return TRUE; + } - case MUIA_Application_GetWinPos: + case MUIA_Application_GetWinPos: + { + int i; + if (data->searchwinid) { - int i; - if (data->searchwinid) + for (i = 0; i < MAXWINS - 1; i++) { - for (i=0 ; i < MAXWINS -1 ; i++) + if (data->winpos[i].w1) { - if (data->winpos[i].w1 ) + if (data->searchwinid == data->winpos[i].id) { - if (data->searchwinid == data->winpos[i].id) - { - STORE = (IPTR) &data->winpos[i].id; - return 1; - } + STORE = (IPTR) & data->winpos[i].id; + return 1; } - else - break; } + else + break; } - STORE=0; - return 1; } - return TRUE; + STORE = 0; + return 1; + } + return TRUE; - case MUIA_Version: - STORE = __version; - return TRUE; + case MUIA_Version: + STORE = __version; + return TRUE; - case MUIA_Revision: - STORE = __revision; - return TRUE; + case MUIA_Revision: + STORE = __revision; + return TRUE; - case MUIA_Application_Author: - STORE = (IPTR)data->app_Author; - return TRUE; + case MUIA_Application_Author: + STORE = (IPTR) data->app_Author; + return TRUE; - case MUIA_Application_Base: - STORE = (IPTR)data->app_Base; - return TRUE; + case MUIA_Application_Base: + STORE = (IPTR) data->app_Base; + return TRUE; - case MUIA_Application_Copyright: - STORE = (IPTR)data->app_Copyright; - return TRUE; + case MUIA_Application_Copyright: + STORE = (IPTR) data->app_Copyright; + return TRUE; - case MUIA_Application_Description: - STORE = (IPTR)data->app_Description; - return TRUE; + case MUIA_Application_Description: + STORE = (IPTR) data->app_Description; + return TRUE; - case MUIA_Application_DoubleStart: - return TRUE; + case MUIA_Application_DoubleStart: + return TRUE; - case MUIA_Application_ForceQuit: - STORE = (IPTR)data->app_ForceQuit; - return TRUE; + case MUIA_Application_ForceQuit: + STORE = (IPTR) data->app_ForceQuit; + return TRUE; - case MUIA_Application_HelpFile: - STORE = (IPTR)data->app_HelpFile; - return TRUE; + case MUIA_Application_HelpFile: + STORE = (IPTR) data->app_HelpFile; + return TRUE; - case MUIA_Application_Iconified: - STORE = (IPTR)data->app_Iconified; - return TRUE; + case MUIA_Application_Iconified: + STORE = (IPTR) data->app_Iconified; + return TRUE; - case MUIA_Application_Title: - STORE = (IPTR)data->app_Title; - return TRUE; + case MUIA_Application_Title: + STORE = (IPTR) data->app_Title; + return TRUE; - case MUIA_Application_Version: - STORE = (IPTR)data->app_Version; - return TRUE; + case MUIA_Application_Version: + STORE = (IPTR) data->app_Version; + return TRUE; - case MUIA_Application_Version_Number: - STORE = (IPTR) data->app_Version_Number; - return TRUE; + case MUIA_Application_Version_Number: + STORE = (IPTR) data->app_Version_Number; + return TRUE; - case MUIA_Application_Version_Date: - STORE = (IPTR) data->app_Version_Date; - return TRUE; + case MUIA_Application_Version_Date: + STORE = (IPTR) data->app_Version_Date; + return TRUE; - case MUIA_Application_Version_Extra: - STORE = (IPTR) data->app_Version_Extra; - return TRUE; + case MUIA_Application_Version_Extra: + STORE = (IPTR) data->app_Version_Extra; + return TRUE; - case MUIA_Application_WindowList: - return GetAttr(MUIA_Family_List, data->app_WindowFamily, msg->opg_Storage); + case MUIA_Application_WindowList: + return GetAttr(MUIA_Family_List, data->app_WindowFamily, + msg->opg_Storage); - case MUIA_Application_Menustrip: - STORE = (IPTR)data->app_Menustrip; - return TRUE; + case MUIA_Application_Menustrip: + STORE = (IPTR) data->app_Menustrip; + return TRUE; - case MUIA_Application_MenuAction: - STORE = (IPTR)data->app_MenuAction; - return TRUE; + case MUIA_Application_MenuAction: + STORE = (IPTR) data->app_MenuAction; + return TRUE; - case MUIA_Application_BrokerPort: - STORE = (IPTR)data->app_BrokerPort; - return TRUE; + case MUIA_Application_BrokerPort: + STORE = (IPTR) data->app_BrokerPort; + return TRUE; - case MUIA_Application_BrokerPri: - STORE = (IPTR)data->app_BrokerPri; - return TRUE; + case MUIA_Application_BrokerPri: + STORE = (IPTR) data->app_BrokerPri; + return TRUE; - case MUIA_Application_BrokerHook: - STORE = (IPTR)data->app_BrokerHook; - return TRUE; + case MUIA_Application_BrokerHook: + STORE = (IPTR) data->app_BrokerHook; + return TRUE; - case MUIA_Application_Broker: - STORE = (IPTR)data->app_Broker; - return TRUE; + case MUIA_Application_Broker: + STORE = (IPTR) data->app_Broker; + return TRUE; - case MUIA_Application_Active: - STORE = data->app_Active; - return TRUE; + case MUIA_Application_Active: + STORE = data->app_Active; + return TRUE; - case MUIA_Application_Commands: - STORE = (IPTR)data->app_Commands; - return TRUE; + case MUIA_Application_Commands: + STORE = (IPTR) data->app_Commands; + return TRUE; - case MUIA_Application_RexxMsg: - STORE = (IPTR)data->app_RexxMsg; - return TRUE; + case MUIA_Application_RexxMsg: + STORE = (IPTR) data->app_RexxMsg; + return TRUE; - case MUIA_Application_RexxHook: - STORE = (IPTR)data->app_RexxHook; - return TRUE; + case MUIA_Application_RexxHook: + STORE = (IPTR) data->app_RexxHook; + return TRUE; - case MUIA_Application_DiskObject: - STORE = (IPTR)data->app_DiskObject; - return TRUE; + case MUIA_Application_DiskObject: + STORE = (IPTR) data->app_DiskObject; + return TRUE; } /* our handler didn't understand the attribute, we simply pass ** it to our superclass now */ - return(DoSuperMethodA(cl, obj, (Msg) msg)); + return (DoSuperMethodA(cl, obj, (Msg) msg)); #undef STORE } @@ -1271,15 +1333,17 @@ static IPTR Application__OM_GET(struct IClass *cl, Object *obj, struct opGet *ms /************************************************************************** OM_ADDMEMBER **************************************************************************/ -static IPTR Application__OM_ADDMEMBER(struct IClass *cl, Object *obj, struct opMember *msg) +static IPTR Application__OM_ADDMEMBER(struct IClass *cl, Object *obj, + struct opMember *msg) { struct MUI_ApplicationData *data = INST_DATA(cl, obj); - D(bug("Application_AddMember: Adding 0x%lx to window member list\n",msg->opam_Object)); + D(bug("Application_AddMember: Adding 0x%lx to window member list\n", + msg->opam_Object)); - DoMethodA(data->app_WindowFamily, (Msg)msg); + DoMethodA(data->app_WindowFamily, (Msg) msg); /* Application knows its GlobalInfo, so we can inform window */ - DoMethod(msg->opam_Object, MUIM_ConnectParent, (IPTR)obj); + DoMethod(msg->opam_Object, MUIM_ConnectParent, (IPTR) obj); return TRUE; } @@ -1287,14 +1351,16 @@ static IPTR Application__OM_ADDMEMBER(struct IClass *cl, Object *obj, struct opM /************************************************************************** OM_REMMEMBER **************************************************************************/ -static IPTR Application__OM_REMMEMBER(struct IClass *cl, Object *obj, struct opMember *msg) +static IPTR Application__OM_REMMEMBER(struct IClass *cl, Object *obj, + struct opMember *msg) { struct MUI_ApplicationData *data = INST_DATA(cl, obj); - D(bug("Application_RemMember: Removing 0x%lx from window member list\n",msg->opam_Object)); + D(bug("Application_RemMember: Removing 0x%lx from window member list\n", + msg->opam_Object)); DoMethod(msg->opam_Object, MUIM_DisconnectParent); - DoMethodA(data->app_WindowFamily, (Msg)msg); + DoMethodA(data->app_WindowFamily, (Msg) msg); return TRUE; } @@ -1303,30 +1369,34 @@ static IPTR Application__OM_REMMEMBER(struct IClass *cl, Object *obj, struct opM /************************************************************************** MUIM_Application_AddInputHandler **************************************************************************/ -static IPTR Application__MUIM_AddInputHandler(struct IClass *cl, Object *obj, - struct MUIP_Application_AddInputHandler *msg) +static IPTR Application__MUIM_AddInputHandler(struct IClass *cl, + Object *obj, struct MUIP_Application_AddInputHandler *msg) { struct MUI_ApplicationData *data = INST_DATA(cl, obj); if (msg->ihnode->ihn_Flags & MUIIHNF_TIMER) { - struct timerequest_ext *time_ext = (struct timerequest_ext *)AllocVec(sizeof(struct timerequest_ext),MEMF_PUBLIC); + struct timerequest_ext *time_ext = + (struct timerequest_ext *)AllocVec(sizeof(struct + timerequest_ext), MEMF_PUBLIC); if (time_ext) { - /* Store the request inside the input handler, so that we can remove - ** the inputhandler without problems */ - msg->ihnode->ihn_Node.mln_Pred = (struct MinNode*)time_ext; - - time_ext->treq = *data->app_TimerReq; - time_ext->treq.tr_node.io_Command = TR_ADDREQUEST; - time_ext->treq.tr_time.tv_secs = msg->ihnode->ihn_Millis/1000; - time_ext->treq.tr_time.tv_micro = (msg->ihnode->ihn_Millis%1000)*1000; - time_ext->ihn = msg->ihnode; - SendIO((struct IORequest*)time_ext); + /* Store the request inside the input handler, so that we can + ** remove the inputhandler without problems */ + msg->ihnode->ihn_Node.mln_Pred = (struct MinNode *)time_ext; + + time_ext->treq = *data->app_TimerReq; + time_ext->treq.tr_node.io_Command = TR_ADDREQUEST; + time_ext->treq.tr_time.tv_secs = msg->ihnode->ihn_Millis / 1000; + time_ext->treq.tr_time.tv_micro = + (msg->ihnode->ihn_Millis % 1000) * 1000; + time_ext->ihn = msg->ihnode; + SendIO((struct IORequest *)time_ext); } } else - AddTail((struct List *)&data->app_IHList, (struct Node *)msg->ihnode); + AddTail((struct List *)&data->app_IHList, + (struct Node *)msg->ihnode); return TRUE; } @@ -1334,15 +1404,17 @@ static IPTR Application__MUIM_AddInputHandler(struct IClass *cl, Object *obj, /************************************************************************** MUIM_Application_RemInputHandler **************************************************************************/ -static IPTR Application__MUIM_RemInputHandler(struct IClass *cl, Object *obj, struct MUIP_Application_RemInputHandler *msg) +static IPTR Application__MUIM_RemInputHandler(struct IClass *cl, + Object *obj, struct MUIP_Application_RemInputHandler *msg) { //struct MUI_ApplicationData *data = INST_DATA(cl, obj); if (msg->ihnode->ihn_Flags & MUIIHNF_TIMER) { - struct timerequest_ext *time_ext = (struct timerequest_ext*)msg->ihnode->ihn_Node.mln_Pred; - if (!CheckIO((struct IORequest*)time_ext)) - AbortIO((struct IORequest*)time_ext); - WaitIO((struct IORequest*)time_ext); + struct timerequest_ext *time_ext = + (struct timerequest_ext *)msg->ihnode->ihn_Node.mln_Pred; + if (!CheckIO((struct IORequest *)time_ext)) + AbortIO((struct IORequest *)time_ext); + WaitIO((struct IORequest *)time_ext); FreeVec(time_ext); } else @@ -1352,13 +1424,13 @@ static IPTR Application__MUIM_RemInputHandler(struct IClass *cl, Object *obj, st } -void _zune_window_message(struct IntuiMessage *imsg); /* from window.c */ +void _zune_window_message(struct IntuiMessage *imsg); /* from window.c */ /* * MUIM_Application_InputBuffered : process all pending events */ static IPTR Application__MUIM_InputBuffered(struct IClass *cl, Object *obj, - struct MUIP_Application_InputBuffered *msg) + struct MUIP_Application_InputBuffered *msg) { struct MUI_ApplicationData *data = INST_DATA(cl, obj); struct IntuiMessage *imsg; @@ -1367,11 +1439,12 @@ static IPTR Application__MUIM_InputBuffered(struct IClass *cl, Object *obj, while (application_do_pushed_method(data)) ; - imsg = (struct IntuiMessage *)GetMsg(data->app_GlobalInfo.mgi_WindowsPort); + imsg = + (struct IntuiMessage *)GetMsg(data->app_GlobalInfo.mgi_WindowsPort); if (imsg != NULL) { /* Let window object process message */ - _zune_window_message(imsg); /* will reply the message */ + _zune_window_message(imsg); /* will reply the message */ } return TRUE; } @@ -1379,13 +1452,14 @@ static IPTR Application__MUIM_InputBuffered(struct IClass *cl, Object *obj, /************************************************************************** MUIM_Application_NewInput : application main loop **************************************************************************/ -static IPTR Application__MUIM_NewInput(struct IClass *cl, Object *obj, struct MUIP_Application_NewInput *msg) +static IPTR Application__MUIM_NewInput(struct IClass *cl, Object *obj, + struct MUIP_Application_NewInput *msg) { struct MUI_ApplicationData *data = INST_DATA(cl, obj); struct RIDNode *rid; - ULONG retval = 0; - ULONG signal, signalmask; - ULONG handler_mask = 0; /* the mask of the signal handlers */ + ULONG retval = 0; + ULONG signal, signalmask; + ULONG handler_mask = 0; /* the mask of the signal handlers */ struct MinNode *mn; //struct MinNode ihn_Node; @@ -1429,15 +1503,18 @@ static IPTR Application__MUIM_NewInput(struct IClass *cl, Object *obj, struct MU if (signal & signalmask) { - if (signal & (1L << data->app_GlobalInfo.mgi_WindowsPort->mp_SigBit)) + if (signal & (1L << data->app_GlobalInfo.mgi_WindowsPort-> + mp_SigBit)) { struct IntuiMessage *imsg; /* process all pushed methods */ - while ((imsg = (struct IntuiMessage *)GetMsg(data->app_GlobalInfo.mgi_WindowsPort))) + while ((imsg = + (struct IntuiMessage *)GetMsg(data->app_GlobalInfo. + mgi_WindowsPort))) { /* Let window object process message */ - _zune_window_message(imsg); /* will reply the message */ + _zune_window_message(imsg); /* will reply the message */ } } @@ -1448,55 +1525,62 @@ static IPTR Application__MUIM_NewInput(struct IClass *cl, Object *obj, struct MU struct List list; NewList(&list); - /* At first we fetch all messages from the message port and store them - ** in a list, we use the node of the Message here */ - while ((time_ext = (struct timerequest_ext *)GetMsg(data->app_TimerPort))) - AddTail(&list,(struct Node*)time_ext); - - /* Now we proccess the list and resend the timer io, no loop can happen - ** we use RemHead() because the handler can remove it itself and so - ** a FreeVec() could happen in MUIM_Application_RemInputHandler which would - ** destroy the the ln->Succ of course */ + /* At first we fetch all messages from the message port and store + ** them in a list, we use the node of the Message here */ + while ((time_ext = + (struct timerequest_ext *)GetMsg(data->app_TimerPort))) + AddTail(&list, (struct Node *)time_ext); + + /* Now we proccess the list and resend the timer io, no loop can + ** happen. We use RemHead() because the handler can remove it + ** itself and so a FreeVec() could happen in + ** MUIM_Application_RemInputHandler which would destroy the + ** ln->Succ of course */ while ((n = RemHead(&list))) { - struct timerequest_ext *time_ext = (struct timerequest_ext *)n; + struct timerequest_ext *time_ext = + (struct timerequest_ext *)n; struct MUI_InputHandlerNode *ihn = time_ext->ihn; - time_ext->treq.tr_time.tv_secs = time_ext->ihn->ihn_Millis/1000; - time_ext->treq.tr_time.tv_micro = (time_ext->ihn->ihn_Millis%1000)*1000; + time_ext->treq.tr_time.tv_secs = + time_ext->ihn->ihn_Millis / 1000; + time_ext->treq.tr_time.tv_micro = + (time_ext->ihn->ihn_Millis % 1000) * 1000; SendIO((struct IORequest *)&time_ext->treq); - DoMethod(ihn->ihn_Object,ihn->ihn_Method); + DoMethod(ihn->ihn_Object, ihn->ihn_Method); } } - if (data->app_BrokerPort && (signal & (1L << data->app_BrokerPort->mp_SigBit))) + if (data->app_BrokerPort + && (signal & (1L << data->app_BrokerPort->mp_SigBit))) { CxMsg *msg; - while((msg = (CxMsg *)GetMsg(data->app_BrokerPort))) + while ((msg = (CxMsg *) GetMsg(data->app_BrokerPort))) { - switch(CxMsgType(msg)) + switch (CxMsgType(msg)) { - case CXM_COMMAND: - switch(CxMsgID(msg)) - { - case CXCMD_DISABLE: - set(obj, MUIA_Application_Active, FALSE); - break; - - case CXCMD_ENABLE: - set(obj, MUIA_Application_Active, TRUE); - break; - - case CXCMD_APPEAR: - case CXCMD_DISAPPEAR: - /* No default handling - application need to be in control of this */ - break; - - case CXCMD_KILL: - SetSignal(SIGBREAKF_CTRL_C, SIGBREAKF_CTRL_C); - break; - } + case CXM_COMMAND: + switch (CxMsgID(msg)) + { + case CXCMD_DISABLE: + set(obj, MUIA_Application_Active, FALSE); + break; + + case CXCMD_ENABLE: + set(obj, MUIA_Application_Active, TRUE); + break; + + case CXCMD_APPEAR: + case CXCMD_DISAPPEAR: + /* No default handling - application needs to be in + * control of this */ + break; + + case CXCMD_KILL: + SetSignal(SIGBREAKF_CTRL_C, SIGBREAKF_CTRL_C); break; + } + break; } if (data->app_BrokerHook) @@ -1508,26 +1592,32 @@ static IPTR Application__MUIM_NewInput(struct IClass *cl, Object *obj, struct MU } } - if (data->app_RexxPort && (signal & (1L << data->app_RexxPort->mp_SigBit))) + if (data->app_RexxPort + && (signal & (1L << data->app_RexxPort->mp_SigBit))) { D(bug("[MUI] Got Rexx message!\n")); struct Message *msg; - while((msg = GetMsg(data->app_RexxPort))) + while ((msg = GetMsg(data->app_RexxPort))) { ReplyMsg(msg); } } - if (data->app_AppPort && (signal & (1L << data->app_AppPort->mp_SigBit))) + if (data->app_AppPort + && (signal & (1L << data->app_AppPort->mp_SigBit))) { struct AppMessage *appmsg; - while((appmsg = (struct AppMessage *)GetMsg(data->app_AppPort))) + while ((appmsg = + (struct AppMessage *)GetMsg(data->app_AppPort))) { - if ((appmsg->am_Type == AMTYPE_APPICON) && (appmsg->am_NumArgs == 0) - && (appmsg->am_ArgList == NULL) && (XGET(obj, MUIA_Application_Iconified) == TRUE)) + if ((appmsg->am_Type == AMTYPE_APPICON) + && (appmsg->am_NumArgs == 0) + && (appmsg->am_ArgList == NULL) + && (XGET(obj, MUIA_Application_Iconified) == TRUE)) { - ReplyMsg((struct Message *)appmsg); /* Reply before removing AppIcon */ + /* Reply before removing AppIcon */ + ReplyMsg((struct Message *)appmsg); set(obj, MUIA_Application_Iconified, FALSE); continue; } @@ -1538,11 +1628,13 @@ static IPTR Application__MUIM_NewInput(struct IClass *cl, Object *obj, struct MU if (signal & handler_mask) { - for (mn = data->app_IHList.mlh_Head; mn->mln_Succ; mn = mn->mln_Succ) + for (mn = data->app_IHList.mlh_Head; mn->mln_Succ; + mn = mn->mln_Succ) { struct MUI_InputHandlerNode *ihn; ihn = (struct MUI_InputHandlerNode *)mn; - if (signal & ihn->ihn_Signals) DoMethod(ihn->ihn_Object,ihn->ihn_Method); + if (signal & ihn->ihn_Signals) + DoMethod(ihn->ihn_Object, ihn->ihn_Method); } } } @@ -1554,7 +1646,9 @@ static IPTR Application__MUIM_NewInput(struct IClass *cl, Object *obj, struct MU *msg->signal = signalmask; /* set return code */ - if ((rid = (struct RIDNode *)RemHead((struct List *)&data->app_ReturnIDQueue))) + if ((rid = + (struct RIDNode *)RemHead((struct List *)&data-> + app_ReturnIDQueue))) { retval = rid->rid_Value; DeleteRIDNode(data, rid); @@ -1565,9 +1659,10 @@ static IPTR Application__MUIM_NewInput(struct IClass *cl, Object *obj, struct MU /************************************************************************** MUIM_Application_Input : application main loop - This method shouldn't be used in new programm. As it polls all signals. + This method shouldn't be used in any new program. As it polls all signals. **************************************************************************/ -static IPTR Application__MUIM_Input(struct IClass *cl, Object *obj, struct MUIP_Application_Input *msg) +static IPTR Application__MUIM_Input(struct IClass *cl, Object *obj, + struct MUIP_Application_Input *msg) { struct MUI_ApplicationData *data = INST_DATA(cl, obj); ULONG signal = 0, handler_mask = 0; @@ -1592,24 +1687,28 @@ static IPTR Application__MUIM_Input(struct IClass *cl, Object *obj, struct MUIP_ *msg->signal = signal; - return Application__MUIM_NewInput(cl, obj, (APTR)msg); + return Application__MUIM_NewInput(cl, obj, (APTR) msg); } /************************************************************************** MUIM_Application_PushMethod: Add a method in the method FIFO. Will be executed in the next event loop. **************************************************************************/ -static IPTR Application__MUIM_PushMethod(struct IClass *cl, Object *obj, struct MUIP_Application_PushMethod *msg) +static IPTR Application__MUIM_PushMethod(struct IClass *cl, Object *obj, + struct MUIP_Application_PushMethod *msg) { struct MUI_ApplicationData *data = INST_DATA(cl, obj); struct MQNode *mq; - LONG i; - IPTR *m = (IPTR *)&msg->count; /* Warning, it will break on 64-bit BigEndian systems!!! */ - LONG count = msg->count & 0xf; /* MUI4 uses count to pass additional information */ + LONG i; + IPTR *m = (IPTR *) & msg->count; /* FIXME: breaks on 64-bit BigEndian systems */ + LONG count; + + count = msg->count & 0xf; /* MUI4 uses count to pass additional info */ mq = CreateMQNode(count); - if (!mq) return 0; - mq->mq_Dest = msg->dest; + if (!mq) + return 0; + mq->mq_Dest = msg->dest; /* fill msg */ for (i = 0; i < count; i++) @@ -1621,7 +1720,8 @@ static IPTR Application__MUIM_PushMethod(struct IClass *cl, Object *obj, struct ReleaseSemaphore(&data->app_MethodSemaphore); /* CHECKME: to wake task up as soon as possible! */ - Signal(data->app_Task, 1L << data->app_GlobalInfo.mgi_WindowsPort->mp_SigBit); + Signal(data->app_Task, + 1L << data->app_GlobalInfo.mgi_WindowsPort->mp_SigBit); return TRUE; } @@ -1632,7 +1732,7 @@ static IPTR Application__MUIM_PushMethod(struct IClass *cl, Object *obj, struct * the next call to MUIM_Application_NewInput. kinda obsolete :) */ static IPTR Application__MUIM_ReturnID(struct IClass *cl, Object *obj, - struct MUIP_Application_ReturnID *msg) + struct MUIP_Application_ReturnID *msg) { struct MUI_ApplicationData *data = INST_DATA(cl, obj); struct RIDNode *rid; @@ -1656,14 +1756,15 @@ static IPTR Application__MUIM_ReturnID(struct IClass *cl, Object *obj, * MUIM_FindUData : tests if the MUIA_UserData of the object * contains the given and returns the object pointer in this case. */ -static IPTR Application__MUIM_FindUData(struct IClass *cl, Object *obj, struct MUIP_FindUData *msg) +static IPTR Application__MUIM_FindUData(struct IClass *cl, Object *obj, + struct MUIP_FindUData *msg) { struct MUI_ApplicationData *data = INST_DATA(cl, obj); if (muiNotifyData(obj)->mnd_UserData == msg->udata) - return (IPTR)obj; + return (IPTR) obj; - return DoMethodA(data->app_WindowFamily, (Msg)msg); + return DoMethodA(data->app_WindowFamily, (Msg) msg); } @@ -1672,7 +1773,8 @@ static IPTR Application__MUIM_FindUData(struct IClass *cl, Object *obj, struct M * contains the given and gets to for itself * in this case. */ -static IPTR Application__MUIM_GetUData(struct IClass *cl, Object *obj, struct MUIP_GetUData *msg) +static IPTR Application__MUIM_GetUData(struct IClass *cl, Object *obj, + struct MUIP_GetUData *msg) { struct MUI_ApplicationData *data = INST_DATA(cl, obj); @@ -1681,7 +1783,7 @@ static IPTR Application__MUIM_GetUData(struct IClass *cl, Object *obj, struct MU get(obj, msg->attr, msg->storage); return TRUE; } - return DoMethodA(data->app_WindowFamily, (Msg)msg); + return DoMethodA(data->app_WindowFamily, (Msg) msg); } @@ -1689,14 +1791,15 @@ static IPTR Application__MUIM_GetUData(struct IClass *cl, Object *obj, struct MU * MUIM_SetUData : This method tests if the MUIA_UserData of the object * contains the given and sets to for itself in this case. */ -static IPTR Application__MUIM_SetUData(struct IClass *cl, Object *obj, struct MUIP_SetUData *msg) +static IPTR Application__MUIM_SetUData(struct IClass *cl, Object *obj, + struct MUIP_SetUData *msg) { struct MUI_ApplicationData *data = INST_DATA(cl, obj); if (muiNotifyData(obj)->mnd_UserData == msg->udata) set(obj, msg->attr, msg->val); - DoMethodA(data->app_WindowFamily, (Msg)msg); + DoMethodA(data->app_WindowFamily, (Msg) msg); return TRUE; } @@ -1705,7 +1808,8 @@ static IPTR Application__MUIM_SetUData(struct IClass *cl, Object *obj, struct MU * MUIM_SetUDataOnce : This method tests if the MUIA_UserData of the object * contains the given and sets to for itself in this case. */ -static IPTR Application__MUIM_SetUDataOnce(struct IClass *cl, Object *obj, struct MUIP_SetUDataOnce *msg) +static IPTR Application__MUIM_SetUDataOnce(struct IClass *cl, Object *obj, + struct MUIP_SetUDataOnce *msg) { struct MUI_ApplicationData *data = INST_DATA(cl, obj); @@ -1714,30 +1818,32 @@ static IPTR Application__MUIM_SetUDataOnce(struct IClass *cl, Object *obj, struc set(obj, msg->attr, msg->val); return TRUE; } - return DoMethodA(data->app_WindowFamily, (Msg)msg); + return DoMethodA(data->app_WindowFamily, (Msg) msg); } /************************************************************************** MUIM_Application_AboutMUI: brought up the about window, centered on refwindow **************************************************************************/ -static IPTR Application__MUIM_AboutMUI(struct IClass *cl, Object *obj, struct MUIP_Application_AboutMUI *msg) +static IPTR Application__MUIM_AboutMUI(struct IClass *cl, Object *obj, + struct MUIP_Application_AboutMUI *msg) { struct MUI_ApplicationData *data = INST_DATA(cl, obj); if (!data->app_AboutWin) { data->app_AboutWin = AboutmuiObject, - msg->refwindow ? MUIA_Window_RefWindow : TAG_IGNORE, msg->refwindow, - MUIA_Window_LeftEdge, MUIV_Window_LeftEdge_Centered, - MUIA_Window_TopEdge, MUIV_Window_TopEdge_Centered, - MUIA_Aboutmui_Application, obj, + msg->refwindow ? MUIA_Window_RefWindow : TAG_IGNORE, + msg->refwindow, MUIA_Window_LeftEdge, + MUIV_Window_LeftEdge_Centered, MUIA_Window_TopEdge, + MUIV_Window_TopEdge_Centered, MUIA_Aboutmui_Application, obj, End; if (!data->app_AboutWin) return 0; - DoMethod(data->app_AboutWin, MUIM_Notify, MUIA_Window_CloseRequest, TRUE, - (IPTR)obj, 3, MUIM_WriteLong, 0L, (IPTR)&data->app_AboutWin); - } /* if (!data->app_AboutWin) */ + DoMethod(data->app_AboutWin, MUIM_Notify, MUIA_Window_CloseRequest, + TRUE, (IPTR) obj, 3, MUIM_WriteLong, 0L, + (IPTR) & data->app_AboutWin); + } /* if (!data->app_AboutWin) */ if (data->app_AboutWin) { @@ -1748,7 +1854,7 @@ static IPTR Application__MUIM_AboutMUI(struct IClass *cl, Object *obj, struct MU } static IPTR Application__MUIM_SetConfigdata(struct IClass *cl, Object *obj, - struct MUIP_Application_SetConfigdata *msg) + struct MUIP_Application_SetConfigdata *msg) { struct MUI_ApplicationData *data = INST_DATA(cl, obj); struct MinList *children = NULL; @@ -1756,23 +1862,25 @@ static IPTR Application__MUIM_SetConfigdata(struct IClass *cl, Object *obj, Object *child; get(data->app_WindowFamily, MUIA_Family_List, &children); - if (children) { - cstate = (Object *)children->mlh_Head; - if ((child = NextObject(&cstate))) - { - D(bug("closing window %p\n", child)); + if (children) + { + cstate = (Object *) children->mlh_Head; + if ((child = NextObject(&cstate))) + { + D(bug("closing window %p\n", child)); - set(child, MUIA_Window_Open, FALSE); + set(child, MUIA_Window_Open, FALSE); - } + } } if (data->app_GlobalInfo.mgi_Configdata) MUI_DisposeObject(data->app_GlobalInfo.mgi_Configdata); data->app_GlobalInfo.mgi_Configdata = msg->configdata; - get(data->app_GlobalInfo.mgi_Configdata,MUIA_Configdata_ZunePrefs, + get(data->app_GlobalInfo.mgi_Configdata, MUIA_Configdata_ZunePrefs, &data->app_GlobalInfo.mgi_Prefs); - DoMethod(obj, MUIM_Application_PushMethod, (IPTR)obj, 1, MUIM_Application_OpenWindows); + DoMethod(obj, MUIM_Application_PushMethod, (IPTR) obj, 1, + MUIM_Application_OpenWindows); return 0; } @@ -1781,7 +1889,7 @@ static IPTR Application__MUIM_SetConfigdata(struct IClass *cl, Object *obj, * Opens all windows of an application */ static IPTR Application__MUIM_OpenWindows(struct IClass *cl, Object *obj, - struct MUIP_Application_OpenWindows *msg) + struct MUIP_Application_OpenWindows *msg) { struct MUI_ApplicationData *data = INST_DATA(cl, obj); struct MinList *children = NULL; @@ -1792,7 +1900,7 @@ static IPTR Application__MUIM_OpenWindows(struct IClass *cl, Object *obj, if (!children) return 0; - cstate = (Object *)children->mlh_Head; + cstate = (Object *) children->mlh_Head; if ((child = NextObject(&cstate))) { set(child, MUIA_Window_Open, TRUE); @@ -1801,21 +1909,21 @@ static IPTR Application__MUIM_OpenWindows(struct IClass *cl, Object *obj, } -static IPTR Application__MUIM_OpenConfigWindow(struct IClass *cl, Object *obj, - struct MUIP_Application_OpenConfigWindow *msg) +static IPTR Application__MUIM_OpenConfigWindow(struct IClass *cl, + Object *obj, struct MUIP_Application_OpenConfigWindow *msg) { struct MUI_ApplicationData *data = INST_DATA(cl, obj); - struct TagItem tags[] = - { - { SYS_Asynch , FALSE }, - { SYS_Input , 0 }, - { SYS_Output , 0 }, - { NP_StackSize , AROS_STACKSIZE}, - { TAG_DONE } + struct TagItem tags[] = { + {SYS_Asynch, FALSE}, + {SYS_Input, 0}, + {SYS_Output, 0}, + {NP_StackSize, AROS_STACKSIZE}, + {TAG_DONE} }; char cmd[255]; - snprintf(cmd, 255, "sys:prefs/Zune %s %ld", data->app_Base ? data->app_Base : (STRPTR) "", (long) obj); + snprintf(cmd, 255, "sys:prefs/Zune %s %ld", + data->app_Base ? data->app_Base : (STRPTR) "", (long)obj); if (SystemTagList(cmd, tags) == -1) { @@ -1826,21 +1934,21 @@ static IPTR Application__MUIM_OpenConfigWindow(struct IClass *cl, Object *obj, if (data->app_Base) { snprintf(cmd, 255, "ENV:zune/%s.prefs", data->app_Base); - DoMethod(data->app_GlobalInfo.mgi_Configdata, MUIM_Configdata_Load, (IPTR)cmd); + DoMethod(data->app_GlobalInfo.mgi_Configdata, MUIM_Configdata_Load, + (IPTR) cmd); } return 1; } -static IPTR Application__MUIM_Execute(Class *CLASS, Object *self, Msg message) +static IPTR Application__MUIM_Execute(Class *CLASS, Object *self, + Msg message) { IPTR signals = 0L; while - ( - DoMethod(self, MUIM_Application_NewInput, (IPTR) &signals) - != MUIV_Application_ReturnID_Quit - ) + (DoMethod(self, MUIM_Application_NewInput, (IPTR) & signals) + != MUIV_Application_ReturnID_Quit) { if (signals) { @@ -1854,11 +1962,12 @@ static IPTR Application__MUIM_Execute(Class *CLASS, Object *self, Msg message) } -static IPTR Application__MUIM_UpdateMenus(struct IClass *cl, Object *obj, Msg message) +static IPTR Application__MUIM_UpdateMenus(struct IClass *cl, Object *obj, + Msg message) { struct List *wlist = NULL; - APTR wstate; - Object *curwin; + APTR wstate; + Object *curwin; get(obj, MUIA_Application_WindowList, &wlist); @@ -1874,7 +1983,8 @@ static IPTR Application__MUIM_UpdateMenus(struct IClass *cl, Object *obj, Msg me return 0; } -static IPTR Application__MUIM_Load(struct IClass *cl, Object *obj, struct MUIP_Application_Load *message) +static IPTR Application__MUIM_Load(struct IClass *cl, Object *obj, + struct MUIP_Application_Load *message) { struct MUI_ApplicationData *data = INST_DATA(cl, obj); struct IFFHandle *iff; @@ -1885,22 +1995,22 @@ static IPTR Application__MUIM_Load(struct IClass *cl, Object *obj, struct MUIP_A Object *cstate; Object *child; - if(!data->app_Base) + if (!data->app_Base) return 0; dataspace = MUI_NewObject(MUIC_Dataspace, TAG_DONE); - if(!dataspace) + if (!dataspace) return 0; - if(message->name == MUIV_Application_Load_ENV) + if (message->name == MUIV_Application_Load_ENV) snprintf(name, sizeof(name), "ENV:Zune/%s.cfg", data->app_Base); - else if(message->name == MUIV_Application_Load_ENVARC) + else if (message->name == MUIV_Application_Load_ENVARC) snprintf(name, sizeof(name), "ENVARC:Zune/%s.cfg", data->app_Base); else strncpy(name, message->name, sizeof(name)); fh = Open(name, MODE_OLDFILE); - if(fh) + if (fh) { if ((iff = AllocIFF())) { @@ -1914,7 +2024,8 @@ static IPTR Application__MUIM_Load(struct IClass *cl, Object *obj, struct MUIP_A { if (!ParseIFF(iff, IFFPARSE_SCAN)) { - DoMethod(dataspace, MUIM_Dataspace_ReadIFF, iff, ID_PREF, ID_MUIO); + DoMethod(dataspace, MUIM_Dataspace_ReadIFF, iff, + ID_PREF, ID_MUIO); } } @@ -1926,7 +2037,7 @@ static IPTR Application__MUIM_Load(struct IClass *cl, Object *obj, struct MUIP_A } get(data->app_WindowFamily, MUIA_Family_List, &children); - cstate = (Object *)children->mlh_Head; + cstate = (Object *) children->mlh_Head; while ((child = NextObject(&cstate))) { DoMethod(child, MUIM_Import, dataspace); @@ -1937,7 +2048,8 @@ static IPTR Application__MUIM_Load(struct IClass *cl, Object *obj, struct MUIP_A return 0; } -static IPTR Application__MUIM_Save(struct IClass *cl, Object *obj, struct MUIP_Application_Save *message) +static IPTR Application__MUIM_Save(struct IClass *cl, Object *obj, + struct MUIP_Application_Save *message) { struct MUI_ApplicationData *data = INST_DATA(cl, obj); struct IFFHandle *iff; @@ -1948,29 +2060,29 @@ static IPTR Application__MUIM_Save(struct IClass *cl, Object *obj, struct MUIP_A Object *cstate; Object *child; - if(!data->app_Base) + if (!data->app_Base) return 0; dataspace = MUI_NewObject(MUIC_Dataspace, TAG_DONE); - if(!dataspace) + if (!dataspace) return 0; get(data->app_WindowFamily, MUIA_Family_List, &children); - cstate = (Object *)children->mlh_Head; + cstate = (Object *) children->mlh_Head; while ((child = NextObject(&cstate))) { DoMethod(child, MUIM_Export, dataspace); } - if(message->name == MUIV_Application_Save_ENV) + if (message->name == MUIV_Application_Save_ENV) snprintf(name, sizeof(name), "ENV:Zune/%s.cfg", data->app_Base); - else if(message->name == MUIV_Application_Save_ENVARC) + else if (message->name == MUIV_Application_Save_ENVARC) snprintf(name, sizeof(name), "ENVARC:Zune/%s.cfg", data->app_Base); else strncpy(name, message->name, sizeof(name)); fh = Open(name, MODE_NEWFILE); - if(fh) + if (fh) { if ((iff = AllocIFF())) { @@ -1982,21 +2094,23 @@ static IPTR Application__MUIM_Save(struct IClass *cl, Object *obj, struct MUIP_A { if (!PushChunk(iff, ID_PREF, ID_FORM, IFFSIZE_UNKNOWN)) { - if (!PushChunk(iff, ID_PREF, ID_PRHD, sizeof(struct FilePrefHeader))) + if (!PushChunk(iff, ID_PREF, ID_PRHD, + sizeof(struct FilePrefHeader))) { struct FilePrefHeader head; head.ph_Version = PHV_CURRENT; head.ph_Type = 0; head.ph_Flags[0] = - head.ph_Flags[1] = - head.ph_Flags[2] = - head.ph_Flags[3] = 0; + head.ph_Flags[1] = + head.ph_Flags[2] = head.ph_Flags[3] = 0; - if (WriteChunkBytes(iff, &head, sizeof(head)) == sizeof(head)) + if (WriteChunkBytes(iff, &head, + sizeof(head)) == sizeof(head)) { PopChunk(iff); - DoMethod(dataspace, MUIM_Dataspace_WriteIFF, iff, ID_PREF, ID_MUIO); + DoMethod(dataspace, MUIM_Dataspace_WriteIFF, + iff, ID_PREF, ID_MUIO); } else { @@ -2024,43 +2138,68 @@ BOOPSI_DISPATCHER(IPTR, Application_Dispatcher, cl, obj, msg) { switch (msg->MethodID) { - case OM_NEW: return Application__OM_NEW(cl, obj, (struct opSet *) msg); - case OM_DISPOSE: return Application__OM_DISPOSE(cl, obj, msg); - case OM_SET: return Application__OM_SET(cl, obj, (struct opSet *)msg); - case OM_GET: return Application__OM_GET(cl, obj, (struct opGet *)msg); - case OM_ADDMEMBER: return Application__OM_ADDMEMBER(cl, obj, (APTR)msg); - case OM_REMMEMBER: return Application__OM_REMMEMBER(cl, obj, (APTR)msg); - case MUIM_Application_AddInputHandler: return Application__MUIM_AddInputHandler(cl, obj, (APTR)msg); - case MUIM_Application_RemInputHandler: return Application__MUIM_RemInputHandler(cl, obj, (APTR)msg); - case MUIM_Application_Input: return Application__MUIM_Input(cl, obj, (APTR)msg); - case MUIM_Application_InputBuffered: return Application__MUIM_InputBuffered(cl, obj, (APTR)msg); - case MUIM_Application_NewInput: return Application__MUIM_NewInput(cl, obj, (APTR)msg); - case MUIM_Application_PushMethod: return Application__MUIM_PushMethod(cl, obj, (APTR)msg); - case MUIM_Application_ReturnID: return Application__MUIM_ReturnID(cl, obj, (APTR)msg); - case MUIM_FindUData: return Application__MUIM_FindUData(cl, obj, (APTR)msg); - case MUIM_GetUData: return Application__MUIM_GetUData(cl, obj, (APTR)msg); - case MUIM_SetUData: return Application__MUIM_SetUData(cl, obj, (APTR)msg); - case MUIM_SetUDataOnce: return Application__MUIM_SetUDataOnce(cl, obj, (APTR)msg); - case MUIM_Application_AboutMUI: return Application__MUIM_AboutMUI(cl, obj, (APTR)msg); - case MUIM_Application_SetConfigdata: return Application__MUIM_SetConfigdata(cl, obj, (APTR)msg); - case MUIM_Application_OpenWindows: return Application__MUIM_OpenWindows(cl, obj, (APTR)msg); - case MUIM_Application_OpenConfigWindow: return Application__MUIM_OpenConfigWindow(cl, obj, (APTR)msg); - case MUIM_Application_Execute: return Application__MUIM_Execute(cl, obj, msg); - case MUIM_Application_UpdateMenus: return Application__MUIM_UpdateMenus(cl, obj, msg); - case MUIM_Application_Load: return Application__MUIM_Load(cl, obj, (APTR) msg); - case MUIM_Application_Save: return Application__MUIM_Save(cl, obj, (APTR) msg); + case OM_NEW: + return Application__OM_NEW(cl, obj, (struct opSet *)msg); + case OM_DISPOSE: + return Application__OM_DISPOSE(cl, obj, msg); + case OM_SET: + return Application__OM_SET(cl, obj, (struct opSet *)msg); + case OM_GET: + return Application__OM_GET(cl, obj, (struct opGet *)msg); + case OM_ADDMEMBER: + return Application__OM_ADDMEMBER(cl, obj, (APTR) msg); + case OM_REMMEMBER: + return Application__OM_REMMEMBER(cl, obj, (APTR) msg); + case MUIM_Application_AddInputHandler: + return Application__MUIM_AddInputHandler(cl, obj, (APTR) msg); + case MUIM_Application_RemInputHandler: + return Application__MUIM_RemInputHandler(cl, obj, (APTR) msg); + case MUIM_Application_Input: + return Application__MUIM_Input(cl, obj, (APTR) msg); + case MUIM_Application_InputBuffered: + return Application__MUIM_InputBuffered(cl, obj, (APTR) msg); + case MUIM_Application_NewInput: + return Application__MUIM_NewInput(cl, obj, (APTR) msg); + case MUIM_Application_PushMethod: + return Application__MUIM_PushMethod(cl, obj, (APTR) msg); + case MUIM_Application_ReturnID: + return Application__MUIM_ReturnID(cl, obj, (APTR) msg); + case MUIM_FindUData: + return Application__MUIM_FindUData(cl, obj, (APTR) msg); + case MUIM_GetUData: + return Application__MUIM_GetUData(cl, obj, (APTR) msg); + case MUIM_SetUData: + return Application__MUIM_SetUData(cl, obj, (APTR) msg); + case MUIM_SetUDataOnce: + return Application__MUIM_SetUDataOnce(cl, obj, (APTR) msg); + case MUIM_Application_AboutMUI: + return Application__MUIM_AboutMUI(cl, obj, (APTR) msg); + case MUIM_Application_SetConfigdata: + return Application__MUIM_SetConfigdata(cl, obj, (APTR) msg); + case MUIM_Application_OpenWindows: + return Application__MUIM_OpenWindows(cl, obj, (APTR) msg); + case MUIM_Application_OpenConfigWindow: + return Application__MUIM_OpenConfigWindow(cl, obj, (APTR) msg); + case MUIM_Application_Execute: + return Application__MUIM_Execute(cl, obj, msg); + case MUIM_Application_UpdateMenus: + return Application__MUIM_UpdateMenus(cl, obj, msg); + case MUIM_Application_Load: + return Application__MUIM_Load(cl, obj, (APTR) msg); + case MUIM_Application_Save: + return Application__MUIM_Save(cl, obj, (APTR) msg); } - return(DoSuperMethodA(cl, obj, msg)); + return (DoSuperMethodA(cl, obj, msg)); } BOOPSI_DISPATCHER_END - /* * Class descriptor. */ -const struct __MUIBuiltinClass _MUI_Application_desc = { +const struct __MUIBuiltinClass _MUI_Application_desc = +{ MUIC_Application, MUIC_Notify, sizeof(struct MUI_ApplicationData), - (void*)Application_Dispatcher + (void *) Application_Dispatcher }; diff --git a/workbench/libs/muimaster/classes/application.h b/workbench/libs/muimaster/classes/application.h dissimilarity index 73% index 235973b564..e76e9fc4ef 100644 --- a/workbench/libs/muimaster/classes/application.h +++ b/workbench/libs/muimaster/classes/application.h @@ -1,216 +1,365 @@ -/* - Copyright © 1999, David Le Corfec. - Copyright © 2002-2003, The AROS Development Team. - All rights reserved. - - $Id$ -*/ - -#ifndef _MUI_CLASSES_APPLICATION_H -#define _MUI_CLASSES_APPLICATION_H - -#ifndef EXEC_SEMAPHORES_H -#include -#endif - -/*** Name *******************************************************************/ -#define MUIC_Application "Application.mui" - -/*** Identifier base (for Zune extensions) **********************************/ -#define MUIB_Application (MUIB_ZUNE | 0x00000100) - -/*** Methods ****************************************************************/ -#define MUIM_Application_AboutMUI (MUIB_MUI|0x0042d21d) /* MUI: V14 */ -#define MUIM_Application_AddInputHandler (MUIB_MUI|0x0042f099) /* MUI: V11 */ -#define MUIM_Application_CheckRefresh (MUIB_MUI|0x00424d68) /* MUI: V11 */ -#define MUIM_Application_GetMenuCheck (MUIB_MUI|0x0042c0a7) /* MUI: V4 */ -#define MUIM_Application_GetMenuState (MUIB_MUI|0x0042a58f) /* MUI: V4 */ -#define MUIM_Application_Input (MUIB_MUI|0x0042d0f5) /* MUI: V4 */ -#define MUIM_Application_InputBuffered (MUIB_MUI|0x00427e59) /* MUI: V4 */ -#define MUIM_Application_Load (MUIB_MUI|0x0042f90d) /* MUI: V4 */ -#define MUIM_Application_NewInput (MUIB_MUI|0x00423ba6) /* MUI: V11 */ -#define MUIM_Application_OpenConfigWindow (MUIB_MUI|0x004299ba) /* MUI: V11 */ -#define MUIM_Application_PushMethod (MUIB_MUI|0x00429ef8) /* MUI: V4 */ -#define MUIM_Application_RemInputHandler (MUIB_MUI|0x0042e7af) /* MUI: V11 */ -#define MUIM_Application_ReturnID (MUIB_MUI|0x004276ef) /* MUI: V4 */ -#define MUIM_Application_Save (MUIB_MUI|0x004227ef) /* MUI: V4 */ -#define MUIM_Application_SetConfigItem (MUIB_MUI|0x00424a80) /* MUI: V11 */ -#define MUIM_Application_SetMenuCheck (MUIB_MUI|0x0042a707) /* MUI: V4 */ -#define MUIM_Application_SetMenuState (MUIB_MUI|0x00428bef) /* MUI: V4 */ -#define MUIM_Application_ShowHelp (MUIB_MUI|0x00426479) /* MUI: V4 */ - -#define MUIM_Application_SetConfigdata (MUIB_Application | 0x00000000) /* Zune 20030407 */ -#define MUIM_Application_OpenWindows (MUIB_Application | 0x00000001) /* Zune 20030407 */ -#define MUIM_Application_Iconify (MUIB_Application | 0x00000002) /* Zune: V1 */ -#define MUIM_Application_Execute (MUIB_Application | 0x00000003) -#define MUIM_Application_UpdateMenus (MUIB_Application | 0x00000004) /* Zune 20070712 */ -/* Method Structures */ -struct MUIP_Application_AboutMUI { STACKED ULONG MethodID; STACKED Object *refwindow; }; -struct MUIP_Application_AddInputHandler { STACKED ULONG MethodID; STACKED struct MUI_InputHandlerNode *ihnode; }; -struct MUIP_Application_CheckRefresh { STACKED ULONG MethodID; }; -struct MUIP_Application_GetMenuCheck { STACKED ULONG MethodID; STACKED ULONG MenuID; }; -struct MUIP_Application_GetMenuState { STACKED ULONG MethodID; STACKED ULONG MenuID; }; -struct MUIP_Application_Input { STACKED ULONG MethodID; STACKED ULONG *signal; }; -struct MUIP_Application_InputBuffered { STACKED ULONG MethodID; }; -struct MUIP_Application_Load { STACKED ULONG MethodID; STACKED STRPTR name; }; -struct MUIP_Application_NewInput { STACKED ULONG MethodID; STACKED ULONG *signal; }; -struct MUIP_Application_OpenConfigWindow { STACKED ULONG MethodID; STACKED ULONG flags; }; -struct MUIP_Application_PushMethod { STACKED ULONG MethodID; STACKED Object *dest; STACKED LONG count; /* more elements may follow */ }; -struct MUIP_Application_RemInputHandler { STACKED ULONG MethodID; STACKED struct MUI_InputHandlerNode *ihnode; }; -struct MUIP_Application_ReturnID { STACKED ULONG MethodID; STACKED ULONG retid; }; -struct MUIP_Application_Save { STACKED ULONG MethodID; STACKED STRPTR name; }; -struct MUIP_Application_SetConfigItem { STACKED ULONG MethodID; STACKED ULONG item; STACKED APTR data; }; -struct MUIP_Application_SetMenuCheck { STACKED ULONG MethodID; STACKED ULONG MenuID; STACKED LONG stat; }; -struct MUIP_Application_SetMenuState { STACKED ULONG MethodID; STACKED ULONG MenuID; STACKED LONG stat; }; -struct MUIP_Application_ShowHelp { STACKED ULONG MethodID; STACKED Object *window; STACKED char *name; STACKED char *node; STACKED LONG line; }; -struct MUIP_Application_SetConfigdata { STACKED ULONG MethodID; STACKED APTR configdata; }; -struct MUIP_Application_OpenWindows { STACKED ULONG MethodID; }; -struct MUIP_Application_UpdateMenus { STACKED ULONG MethodID; }; - -/*** Attributes *************************************************************/ -#define MUIA_Application_Active (MUIB_MUI|0x004260ab) /* MUI: V4 isg BOOL */ -#define MUIA_Application_Author (MUIB_MUI|0x00424842) /* MUI: V4 i.g STRPTR */ -#define MUIA_Application_Base (MUIB_MUI|0x0042e07a) /* MUI: V4 i.g STRPTR */ -#define MUIA_Application_Broker (MUIB_MUI|0x0042dbce) /* MUI: V4 ..g Broker * */ -#define MUIA_Application_BrokerHook (MUIB_MUI|0x00428f4b) /* MUI: V4 isg struct Hook * */ -#define MUIA_Application_BrokerPort (MUIB_MUI|0x0042e0ad) /* MUI: V6 ..g struct MsgPort * */ -#define MUIA_Application_BrokerPri (MUIB_MUI|0x0042c8d0) /* MUI: V6 i.g LONG */ -#define MUIA_Application_Commands (MUIB_MUI|0x00428648) /* MUI: V4 isg struct MUI_Command * */ -#define MUIA_Application_Copyright (MUIB_MUI|0x0042ef4d) /* MUI: V4 i.g STRPTR */ -#define MUIA_Application_Description (MUIB_MUI|0x00421fc6) /* MUI: V4 i.g STRPTR */ -#define MUIA_Application_DiskObject (MUIB_MUI|0x004235cb) /* MUI: V4 isg struct DiskObject * */ -#define MUIA_Application_DoubleStart (MUIB_MUI|0x00423bc6) /* MUI: V4 ..g BOOL */ -#define MUIA_Application_DropObject (MUIB_MUI|0x00421266) /* MUI: V5 is. Object * */ -#define MUIA_Application_ForceQuit (MUIB_MUI|0x004257df) /* MUI: V8 ..g BOOL */ -#define MUIA_Application_HelpFile (MUIB_MUI|0x004293f4) /* MUI: V8 isg STRPTR */ -#define MUIA_Application_Iconified (MUIB_MUI|0x0042a07f) /* MUI: V4 .sg BOOL */ -#define MUIA_Application_MenuAction (MUIB_MUI|0x00428961) /* MUI: V4 ..g ULONG */ -#define MUIA_Application_MenuHelp (MUIB_MUI|0x0042540b) /* MUI: V4 ..g ULONG */ -#define MUIA_Application_Menustrip (MUIB_MUI|0x004252d9) /* MUI: V8 i.. Object * */ -#define MUIA_Application_RexxHook (MUIB_MUI|0x00427c42) /* MUI: V7 isg struct Hook * */ -#define MUIA_Application_RexxMsg (MUIB_MUI|0x0042fd88) /* MUI: V4 ..g struct RxMsg * */ -#define MUIA_Application_RexxString (MUIB_MUI|0x0042d711) /* MUI: V4 .s. STRPTR */ -#define MUIA_Application_SingleTask (MUIB_MUI|0x0042a2c8) /* MUI: V4 i.. BOOL */ -#define MUIA_Application_Sleep (MUIB_MUI|0x00425711) /* MUI: V4 .s. BOOL */ -#define MUIA_Application_Title (MUIB_MUI|0x004281b8) /* MUI: V4 i.g STRPTR */ -#define MUIA_Application_UseCommodities (MUIB_MUI|0x00425ee5) /* MUI: V10 i.. BOOL */ -#define MUIA_Application_UsedClasses (MUIB_MUI|0x0042e9a7) /* MUI undoc: V20 i.. STRPTR [] */ -#define MUIA_Application_UseRexx (MUIB_MUI|0x00422387) /* MUI: V10 i.. BOOL */ -#define MUIA_Application_SetWinPos (MUIB_MUI|0x00432387) -#define MUIA_Application_GetWinPos (MUIB_MUI|0x00432388) -#define MUIA_Application_SearchWinId (MUIB_MUI|0x00432389) -#define MUIA_Application_GetWinPosAddr (MUIB_MUI|0x00432390) -#define MUIA_Application_GetWinPosSize (MUIB_MUI|0x00432391) -#define MUIA_Application_CopyWinPosToApp (MUIB_MUI|0x00432392) -#define MAXWINS 300 - -struct windowpos -{ -ULONG id; -WORD x1,y1,w1,h1; -WORD x2,y2,w2,h2; -}; - -/*+ - [I-G] CONST_STRPTR - Standard DOS version string. Example: "$VER: Program 1.3 (14.11.03)". - Zune extension: If unspecified or NULL, it will be automatically - constructed from MUIA_Application_Title, MUIA_Application_Version_Number, - MUIA_Application_Version_Date and MUIA_Application_Version_Extra as - follows: "$VER: <version> (<date>) [<extra>]". -+*/ -#define MUIA_Application_Version (MUIB_MUI|0x0042b33f) - -#define MUIA_Application_Window (MUIB_MUI|0x0042bfe0) /* MUI: V4 i.. Object * */ -#define MUIA_Application_WindowList (MUIB_MUI|0x00429abe) /* MUI: V13 ..g struct List * */ - -#define MUIA_Application_Configdata (MUIB_Application | 0x00000000) /* Zune 20030407 .s. Object * */ - -/*+ - [I-G] CONST_STRPTR - Version number. Examples: "1.5", "2.37.4b". -+*/ -#define MUIA_Application_Version_Number (MUIB_Application | 0x00000001) - -/*+ - [I-G] CONST_STRPTR - Date information on the standard international YYYY-MM-DD format. -+*/ -#define MUIA_Application_Version_Date (MUIB_Application | 0x00000002) - -/*+ - [I-G] CONST_STRPTR - Arbitrary extra version information. Example: "nightly build". -+*/ -#define MUIA_Application_Version_Extra (MUIB_Application | 0x00000003) - - -/* MUI Obsolette tags */ -#ifdef MUI_OBSOLETE -#define MUIA_Application_Menu (MUIB_MUI|0x00420e1f) /* MUI: V4 i.g struct NewMenu * */ -#endif /* MUI_OBSOLETE */ - -/************************************************************************** - Structure used ba MUIM_Application_AddInputHandler/RemInputHandler -**************************************************************************/ -struct MUI_InputHandlerNode -{ - struct MinNode ihn_Node; - Object *ihn_Object; - union - { - ULONG ihn_sigs; - struct - { - UWORD ihn_millis; - UWORD ihn_current; - } ihn_timer; - } - ihn_stuff; - ULONG ihn_Flags; - ULONG ihn_Method; -}; - -/* Easier access to the members */ -#define ihn_Millis ihn_stuff.ihn_timer.ihn_millis -#define ihn_Current ihn_stuff.ihn_timer.ihn_current -#define ihn_Signals ihn_stuff.ihn_sigs - -/* Flags for ihn_Flags */ -#define MUIIHNF_TIMER (1<<0) /* you want to be called every ihn_Millis msecs */ - -/************************************************************************** - Special values for the name field of MUIM_Application_Load/Save -**************************************************************************/ -#define MUIV_Application_Save_ENV ((STRPTR) 0) -#define MUIV_Application_Save_ENVARC ((STRPTR)~0) -#define MUIV_Application_Load_ENV ((STRPTR) 0) -#define MUIV_Application_Load_ENVARC ((STRPTR)~0) - - -/************************************************************************** - Special Values MUIM_Application_ReturnID. Usally programm should leave - the event loop if this is set -**************************************************************************/ -#define MUIV_Application_ReturnID_Quit ((ULONG)-1) - - - -extern const struct __MUIBuiltinClass _MUI_Application_desc; /* PRIV */ - - - -struct MUI_GlobalInfo -{ - ULONG priv0; - Object *mgi_ApplicationObject; - - /* The following data is private only, might be extented! */ - struct MsgPort *mgi_WindowsPort; /* application-wide IDCMP port */ /* PRIV */ - Object *mgi_Configdata; /* The config data */ /* PRIV */ - struct ZunePrefsNew *mgi_Prefs; /* For faster access */ /* PRIV */ - struct Screen *mgi_CustomScreen; /* Screen opened customly by the application */ /* PRIV */ -}; - - -#endif /* _MUI_CLASSES_APPLICATION_H */ +/* + Copyright © 1999, David Le Corfec. + Copyright © 2002-2003, The AROS Development Team. + All rights reserved. + + $Id$ +*/ + +#ifndef _MUI_CLASSES_APPLICATION_H +#define _MUI_CLASSES_APPLICATION_H + +#ifndef EXEC_SEMAPHORES_H +#include <exec/semaphores.h> +#endif + +/*** Name *******************************************************************/ +#define MUIC_Application "Application.mui" + +/*** Identifier base (for Zune extensions) **********************************/ +#define MUIB_Application (MUIB_ZUNE | 0x00000100) + +/*** Methods ****************************************************************/ +#define MUIM_Application_AboutMUI (MUIB_MUI|0x0042d21d) /* MUI: V14 */ +#define MUIM_Application_AddInputHandler (MUIB_MUI|0x0042f099) /* MUI: V11 */ +#define MUIM_Application_CheckRefresh (MUIB_MUI|0x00424d68) /* MUI: V11 */ +#define MUIM_Application_GetMenuCheck (MUIB_MUI|0x0042c0a7) /* MUI: V4 */ +#define MUIM_Application_GetMenuState (MUIB_MUI|0x0042a58f) /* MUI: V4 */ +#define MUIM_Application_Input (MUIB_MUI|0x0042d0f5) /* MUI: V4 */ +#define MUIM_Application_InputBuffered (MUIB_MUI|0x00427e59) /* MUI: V4 */ +#define MUIM_Application_Load (MUIB_MUI|0x0042f90d) /* MUI: V4 */ +#define MUIM_Application_NewInput (MUIB_MUI|0x00423ba6) /* MUI: V11 */ +#define MUIM_Application_OpenConfigWindow (MUIB_MUI|0x004299ba) /* MUI: V11 */ +#define MUIM_Application_PushMethod (MUIB_MUI|0x00429ef8) /* MUI: V4 */ +#define MUIM_Application_RemInputHandler (MUIB_MUI|0x0042e7af) /* MUI: V11 */ +#define MUIM_Application_ReturnID (MUIB_MUI|0x004276ef) /* MUI: V4 */ +#define MUIM_Application_Save (MUIB_MUI|0x004227ef) /* MUI: V4 */ +#define MUIM_Application_SetConfigItem (MUIB_MUI|0x00424a80) /* MUI: V11 */ +#define MUIM_Application_SetMenuCheck (MUIB_MUI|0x0042a707) /* MUI: V4 */ +#define MUIM_Application_SetMenuState (MUIB_MUI|0x00428bef) /* MUI: V4 */ +#define MUIM_Application_ShowHelp (MUIB_MUI|0x00426479) /* MUI: V4 */ + +#define MUIM_Application_SetConfigdata (MUIB_Application | 0x00000000) /* Zune 20030407 */ +#define MUIM_Application_OpenWindows (MUIB_Application | 0x00000001) /* Zune 20030407 */ +#define MUIM_Application_Iconify (MUIB_Application | 0x00000002) /* Zune: V1 */ +#define MUIM_Application_Execute (MUIB_Application | 0x00000003) +#define MUIM_Application_UpdateMenus (MUIB_Application | 0x00000004) /* Zune 20070712 */ + +/* Method Structures */ +struct MUIP_Application_AboutMUI +{ + STACKED ULONG MethodID; + STACKED Object *refwindow; +}; + +struct MUIP_Application_AddInputHandler +{ + STACKED ULONG MethodID; + STACKED struct MUI_InputHandlerNode *ihnode; +}; + +struct MUIP_Application_CheckRefresh +{ + STACKED ULONG MethodID; +}; + +struct MUIP_Application_GetMenuCheck +{ + STACKED ULONG MethodID; + STACKED ULONG MenuID; +}; + +struct MUIP_Application_GetMenuState +{ + STACKED ULONG MethodID; + STACKED ULONG MenuID; +}; + +struct MUIP_Application_Input +{ + STACKED ULONG MethodID; + STACKED ULONG *signal; +}; + +struct MUIP_Application_InputBuffered +{ + STACKED ULONG MethodID; +}; + +struct MUIP_Application_Load +{ + STACKED ULONG MethodID; + STACKED STRPTR name; +}; + +struct MUIP_Application_NewInput +{ + STACKED ULONG MethodID; + STACKED ULONG *signal; +}; + +struct MUIP_Application_OpenConfigWindow +{ + STACKED ULONG MethodID; + STACKED ULONG flags; +}; + +struct MUIP_Application_PushMethod +{ + STACKED ULONG MethodID; + STACKED Object *dest; + STACKED LONG count; /* more elements may follow */ +}; + +struct MUIP_Application_RemInputHandler +{ + STACKED ULONG MethodID; + STACKED struct MUI_InputHandlerNode *ihnode; +}; + +struct MUIP_Application_ReturnID +{ + STACKED ULONG MethodID; + STACKED ULONG retid; +}; + +struct MUIP_Application_Save +{ + STACKED ULONG MethodID; + STACKED STRPTR name; +}; + +struct MUIP_Application_SetConfigItem +{ + STACKED ULONG MethodID; + STACKED ULONG item; + STACKED APTR data; +}; + +struct MUIP_Application_SetMenuCheck +{ + STACKED ULONG MethodID; + STACKED ULONG MenuID; + STACKED LONG stat; +}; + +struct MUIP_Application_SetMenuState +{ + STACKED ULONG MethodID; + STACKED ULONG MenuID; + STACKED LONG stat; +}; + +struct MUIP_Application_ShowHelp +{ + STACKED ULONG MethodID; + STACKED Object *window; + STACKED char *name; + STACKED char *node; + STACKED LONG line; +}; + +struct MUIP_Application_SetConfigdata +{ + STACKED ULONG MethodID; + STACKED APTR configdata; +}; + +struct MUIP_Application_OpenWindows +{ + STACKED ULONG MethodID; +}; + +struct MUIP_Application_UpdateMenus +{ + STACKED ULONG MethodID; +}; + +/*** Attributes *************************************************************/ +#define MUIA_Application_Active \ + (MUIB_MUI|0x004260ab) /* MUI: V4 isg BOOL */ +#define MUIA_Application_Author \ + (MUIB_MUI|0x00424842) /* MUI: V4 i.g STRPTR */ +#define MUIA_Application_Base \ + (MUIB_MUI|0x0042e07a) /* MUI: V4 i.g STRPTR */ +#define MUIA_Application_Broker \ + (MUIB_MUI|0x0042dbce) /* MUI: V4 ..g Broker * */ +#define MUIA_Application_BrokerHook \ + (MUIB_MUI|0x00428f4b) /* MUI: V4 isg struct Hook * */ +#define MUIA_Application_BrokerPort \ + (MUIB_MUI|0x0042e0ad) /* MUI: V6 ..g struct MsgPort * */ +#define MUIA_Application_BrokerPri \ + (MUIB_MUI|0x0042c8d0) /* MUI: V6 i.g LONG */ +#define MUIA_Application_Commands \ + (MUIB_MUI|0x00428648) /* MUI: V4 isg struct MUI_Command * */ +#define MUIA_Application_Copyright \ + (MUIB_MUI|0x0042ef4d) /* MUI: V4 i.g STRPTR */ +#define MUIA_Application_Description \ + (MUIB_MUI|0x00421fc6) /* MUI: V4 i.g STRPTR */ +#define MUIA_Application_DiskObject \ + (MUIB_MUI|0x004235cb) /* MUI: V4 isg struct DiskObject * */ +#define MUIA_Application_DoubleStart \ + (MUIB_MUI|0x00423bc6) /* MUI: V4 ..g BOOL */ +#define MUIA_Application_DropObject \ + (MUIB_MUI|0x00421266) /* MUI: V5 is. Object * */ +#define MUIA_Application_ForceQuit \ + (MUIB_MUI|0x004257df) /* MUI: V8 ..g BOOL */ +#define MUIA_Application_HelpFile \ + (MUIB_MUI|0x004293f4) /* MUI: V8 isg STRPTR */ +#define MUIA_Application_Iconified \ + (MUIB_MUI|0x0042a07f) /* MUI: V4 .sg BOOL */ +#define MUIA_Application_MenuAction \ + (MUIB_MUI|0x00428961) /* MUI: V4 ..g ULONG */ +#define MUIA_Application_MenuHelp \ + (MUIB_MUI|0x0042540b) /* MUI: V4 ..g ULONG */ +#define MUIA_Application_Menustrip \ + (MUIB_MUI|0x004252d9) /* MUI: V8 i.. Object * */ +#define MUIA_Application_RexxHook \ + (MUIB_MUI|0x00427c42) /* MUI: V7 isg struct Hook * */ +#define MUIA_Application_RexxMsg \ + (MUIB_MUI|0x0042fd88) /* MUI: V4 ..g struct RxMsg * */ +#define MUIA_Application_RexxString \ + (MUIB_MUI|0x0042d711) /* MUI: V4 .s. STRPTR */ +#define MUIA_Application_SingleTask \ + (MUIB_MUI|0x0042a2c8) /* MUI: V4 i.. BOOL */ +#define MUIA_Application_Sleep \ + (MUIB_MUI|0x00425711) /* MUI: V4 .s. BOOL */ +#define MUIA_Application_Title \ + (MUIB_MUI|0x004281b8) /* MUI: V4 i.g STRPTR */ +#define MUIA_Application_UseCommodities \ + (MUIB_MUI|0x00425ee5) /* MUI: V10 i.. BOOL */ +#define MUIA_Application_UsedClasses \ + (MUIB_MUI|0x0042e9a7) /* MUI undoc: V20 i.. STRPTR [] */ +#define MUIA_Application_UseRexx \ + (MUIB_MUI|0x00422387) /* MUI: V10 i.. BOOL */ +#define MUIA_Application_SetWinPos \ + (MUIB_MUI|0x00432387) +#define MUIA_Application_GetWinPos \ + (MUIB_MUI|0x00432388) +#define MUIA_Application_SearchWinId \ + (MUIB_MUI|0x00432389) +#define MUIA_Application_GetWinPosAddr \ + (MUIB_MUI|0x00432390) +#define MUIA_Application_GetWinPosSize \ + (MUIB_MUI|0x00432391) +#define MUIA_Application_CopyWinPosToApp \ + (MUIB_MUI|0x00432392) +#define MAXWINS 300 + +struct windowpos +{ + ULONG id; + WORD x1, y1, w1, h1; + WORD x2, y2, w2, h2; +}; + +/*+ + [I-G] CONST_STRPTR + Standard DOS version string. Example: "$VER: Program 1.3 (14.11.03)". + Zune extension: If unspecified or NULL, it will be automatically + constructed from MUIA_Application_Title, MUIA_Application_Version_Number, + MUIA_Application_Version_Date and MUIA_Application_Version_Extra as + follows: "$VER: <title> <version> (<date>) [<extra>]". ++*/ +#define MUIA_Application_Version \ + (MUIB_MUI|0x0042b33f) + +#define MUIA_Application_Window \ + (MUIB_MUI|0x0042bfe0) /* MUI: V4 i.. Object * */ +#define MUIA_Application_WindowList \ + (MUIB_MUI|0x00429abe) /* MUI: V13 ..g struct List * */ + +#define MUIA_Application_Configdata \ + (MUIB_Application | 0x00000000) /* Zune 20030407 .s. Object * */ + +/*+ + [I-G] CONST_STRPTR + Version number. Examples: "1.5", "2.37.4b". ++*/ +#define MUIA_Application_Version_Number \ + (MUIB_Application | 0x00000001) + +/*+ + [I-G] CONST_STRPTR + Date information on the standard international YYYY-MM-DD format. ++*/ +#define MUIA_Application_Version_Date \ + (MUIB_Application | 0x00000002) + +/*+ + [I-G] CONST_STRPTR + Arbitrary extra version information. Example: "nightly build". ++*/ +#define MUIA_Application_Version_Extra \ + (MUIB_Application | 0x00000003) + + +/* MUI Obsolette tags */ +#ifdef MUI_OBSOLETE +#define MUIA_Application_Menu \ + (MUIB_MUI | 0x00420e1f) /* MUI: V4 i.g struct NewMenu * */ +#endif /* MUI_OBSOLETE */ + +/************************************************************************** + Structure used ba MUIM_Application_AddInputHandler/RemInputHandler +**************************************************************************/ +struct MUI_InputHandlerNode +{ + struct MinNode ihn_Node; + Object *ihn_Object; + union + { + ULONG ihn_sigs; + struct + { + UWORD ihn_millis; + UWORD ihn_current; + } ihn_timer; + } + ihn_stuff; + ULONG ihn_Flags; + ULONG ihn_Method; +}; + +/* Easier access to the members */ +#define ihn_Millis ihn_stuff.ihn_timer.ihn_millis +#define ihn_Current ihn_stuff.ihn_timer.ihn_current +#define ihn_Signals ihn_stuff.ihn_sigs + +/* Flags for ihn_Flags */ +#define MUIIHNF_TIMER (1<<0) /* you want to be called every ihn_Millis msecs */ + +/************************************************************************** + Special values for the name field of MUIM_Application_Load/Save +**************************************************************************/ +#define MUIV_Application_Save_ENV ((STRPTR) 0) +#define MUIV_Application_Save_ENVARC ((STRPTR)~0) +#define MUIV_Application_Load_ENV ((STRPTR) 0) +#define MUIV_Application_Load_ENVARC ((STRPTR)~0) + + +/************************************************************************** + Special Values MUIM_Application_ReturnID. Usually program should leave + the event loop if this is set +**************************************************************************/ +#define MUIV_Application_ReturnID_Quit ((ULONG)-1) + + +extern const struct __MUIBuiltinClass _MUI_Application_desc; /* PRIV */ + + +struct MUI_GlobalInfo +{ + ULONG priv0; + Object *mgi_ApplicationObject; + + /* The following data is private only, might be extended! */ + struct MsgPort *mgi_WindowsPort; /* application-wide IDCMP port *//* PRIV */ + struct MsgPort *mgi_AppPort; /* application-wide AppMessage port */ /* PRIV */ + Object *mgi_Configdata; /* The config data *//* PRIV */ + struct ZunePrefsNew *mgi_Prefs; /* For faster access *//* PRIV */ + struct Screen *mgi_CustomScreen; /* Screen opened customly by the application *//* PRIV */ +}; + + +#endif /* _MUI_CLASSES_APPLICATION_H */ diff --git a/workbench/libs/muimaster/classes/area.c b/workbench/libs/muimaster/classes/area.c index 5d6bde4e31..b13ba32c87 100644 --- a/workbench/libs/muimaster/classes/area.c +++ b/workbench/libs/muimaster/classes/area.c @@ -33,7 +33,7 @@ extern struct Library *MUIMasterBase; #include "bubbleengine.h" #include "datatypescache.h" - + // #define MYDEBUG 1 #include "debug.h" @@ -112,19 +112,17 @@ static const int __revision = 1; //static STRPTR zune_area_to_string (Object *area); //#endif -static const struct MUI_FrameSpec_intern *get_intframe( - Object *obj, - struct MUI_AreaData *data, - struct MUI_FrameSpec_intern *tempstore); -static void set_inner_sizes (Object *obj, struct MUI_AreaData *data); -static void set_title_sizes (Object *obj, struct MUI_AreaData *data); +static const struct MUI_FrameSpec_intern *get_intframe(Object *obj, + struct MUI_AreaData *data, struct MUI_FrameSpec_intern *tempstore); +static void set_inner_sizes(Object *obj, struct MUI_AreaData *data); +static void set_title_sizes(Object *obj, struct MUI_AreaData *data); static void area_update_msizes(Object *obj, struct MUI_AreaData *data, - const struct MUI_FrameSpec_intern *frame, - const struct ZuneFrameGfx *zframe); -static void setup_control_char (struct MUI_AreaData *data, Object *obj, - struct IClass *cl); -static void cleanup_control_char (struct MUI_AreaData *data, Object *obj); + const struct MUI_FrameSpec_intern *frame, + const struct ZuneFrameGfx *zframe); +static void setup_control_char(struct MUI_AreaData *data, Object *obj, + struct IClass *cl); +static void cleanup_control_char(struct MUI_AreaData *data, Object *obj); //static void setup_cycle_chain (struct MUI_AreaData *data, Object *obj); //static void cleanup_cycle_chain (struct MUI_AreaData *data, Object *obj); @@ -149,21 +147,25 @@ static void _zune_focus_new(Object *obj, int type) int x1 = _left(obj); int y1 = _top(obj); - int x2 = _left(obj) + _width(obj) -1; - int y2 = _top(obj) + _height(obj) -1; + int x2 = _left(obj) + _width(obj) - 1; + int y2 = _top(obj) + _height(obj) - 1; - if (!parent || parent == _win(obj)) return; + if (!parent || parent == _win(obj)) + return; SetABPenDrMd(rp, _pens(obj)[MPEN_SHINE], _pens(obj)[MPEN_SHADOW], JAM2); if (type == ZUNE_FOCUS_TYPE_ACTIVE_OBJ) { SetDrPt(rp, 0xCCCC); - x1--; y1--; x2++; y2++; + x1--; + y1--; + x2++; + y2++; } else { - SetDrPt(rp,0xF0F0); + SetDrPt(rp, 0xF0F0); } Move(rp, x1, y1); @@ -181,24 +183,28 @@ static void _zune_focus_destroy(Object *obj, int type) //bug("_zune_focus_destroy 1 %p\n", obj); if (NULL == obj || !(_flags(obj) & MADF_CANDRAW)) - return; + return; parent = _parent(obj); int x1 = _left(obj); int y1 = _top(obj); int x2 = _left(obj) + _width(obj) - 1; - int y2 = _top(obj) + _height(obj) - 1; - int width; + int y2 = _top(obj) + _height(obj) - 1; + int width; int height; if (type == ZUNE_FOCUS_TYPE_ACTIVE_OBJ) { - if (!parent || parent == _win(obj)) return; + if (!parent || parent == _win(obj)) + return; - x1--; y1--; x2++; y2++; + x1--; + y1--; + x2++; + y2++; width = x2 - x1 + 1; height = y2 - y1 + 1; - + DoMethod(parent, MUIM_DrawBackground, x1, y1, width, 1, x1, y1, 0); DoMethod(parent, MUIM_DrawBackground, x2, y1, 1, height, x2, y1, 0); DoMethod(parent, MUIM_DrawBackground, x1, y2, width, 1, x1, y2, 0); @@ -206,10 +212,10 @@ static void _zune_focus_destroy(Object *obj, int type) } else { - struct Region *region; - struct Rectangle rect; - APTR clip = NULL; - + struct Region *region; + struct Rectangle rect; + APTR clip = NULL; + region = NewRegion(); if (region) { @@ -217,43 +223,41 @@ static void _zune_focus_destroy(Object *obj, int type) rect.MinY = _top(obj); rect.MaxX = _right(obj); rect.MaxY = _top(obj); - + OrRectRegion(region, &rect); - + rect.MinX = _right(obj); rect.MinY = _top(obj); rect.MaxX = _right(obj); rect.MaxY = _bottom(obj); - + OrRectRegion(region, &rect); - + rect.MinX = _left(obj); rect.MinY = _bottom(obj); rect.MaxX = _right(obj); rect.MaxY = _bottom(obj); - + OrRectRegion(region, &rect); - + rect.MinX = _left(obj); rect.MinY = _top(obj); rect.MaxX = _left(obj); rect.MaxY = _bottom(obj); - + OrRectRegion(region, &rect); - - clip = MUI_AddClipRegion(muiRenderInfo(obj), region); - - } /* if (region) */ - + + clip = MUI_AddClipRegion(muiRenderInfo(obj), region); + + } + MUI_Redraw(obj, MADF_DRAWOBJECT); - + if (region) { MUI_RemoveClipRegion(muiRenderInfo(obj), clip); } - } - } @@ -263,190 +267,198 @@ OM_NEW static IPTR Area__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) { struct MUI_AreaData *data; - struct TagItem *tags,*tag; + struct TagItem *tags, *tag; - obj = (Object *)DoSuperMethodA(cl, obj, (Msg)msg); - if (!obj) return FALSE; + obj = (Object *) DoSuperMethodA(cl, obj, (Msg) msg); + if (!obj) + return FALSE; - /* Initial local instance data */ + /* Initial local instance data */ data = INST_DATA(cl, obj); - data->mad_Flags = MADF_FILLAREA | MADF_SHOWME | MADF_SHOWSELSTATE | MADF_DROPABLE; + data->mad_Flags = + MADF_FILLAREA | MADF_SHOWME | MADF_SHOWSELSTATE | MADF_DROPABLE; data->mad_HorizWeight = data->mad_VertWeight = 100; data->mad_InputMode = MUIV_InputMode_None; /* parse initial taglist */ - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) { switch (tag->ti_Tag) { - case MUIA_Background: + case MUIA_Background: - data->mad_Flags |= MADF_OWNBG; - if (data->mad_BackgroundSpec) - { - zune_image_spec_free(data->mad_BackgroundSpec); - } - data->mad_BackgroundSpec = zune_image_spec_duplicate(tag->ti_Data); + data->mad_Flags |= MADF_OWNBG; + if (data->mad_BackgroundSpec) + { + zune_image_spec_free(data->mad_BackgroundSpec); + } + data->mad_BackgroundSpec = + zune_image_spec_duplicate(tag->ti_Data); - break; - - case MUIA_ControlChar: - data->mad_ControlChar = tag->ti_Data; - break; - - case MUIA_CycleChain: - _handle_bool_tag(data->mad_Flags, tag->ti_Data, MADF_CYCLECHAIN); - break; - - case MUIA_Disabled: - case MUIA_NestedDisabled: - if (tag->ti_Data) - { - data->mad_DisableCount = 1; - } - break; - - case MUIA_FillArea: - _handle_bool_tag(data->mad_Flags, tag->ti_Data, MADF_FILLAREA); - break; - - case MUIA_Draggable: - _handle_bool_tag(data->mad_Flags, tag->ti_Data, MADF_DRAGGABLE); - break; - - case MUIA_Dropable: - _handle_bool_tag(data->mad_Flags, tag->ti_Data, MADF_DROPABLE); - break; - - case MUIA_FixHeight: - data->mad_Flags |= MADF_FIXHEIGHT; - data->mad_HardHeight = tag->ti_Data; - break; - - case MUIA_FixHeightTxt: - data->mad_HardHeightTxt = (STRPTR)tag->ti_Data; - break; - - case MUIA_FixWidth: - data->mad_Flags |= MADF_FIXWIDTH; - data->mad_HardWidth = tag->ti_Data; - break; - - case MUIA_FixWidthTxt: - data->mad_HardWidthTxt = (STRPTR)tag->ti_Data; - break; - - case MUIA_Font: - data->mad_FontPreset = tag->ti_Data; - break; - - case MUIA_Frame: - data->mad_Frame = tag->ti_Data; - break; - - case MUIA_FramePhantomHoriz: - data->mad_Flags |= MADF_FRAMEPHANTOM; - break; - - case MUIA_FrameTitle: - data->mad_FrameTitle = (STRPTR)tag->ti_Data; - break; - - case MUIA_HorizWeight: - data->mad_HorizWeight = tag->ti_Data; - break; - - case MUIA_InnerBottom: - data->mad_Flags |= MADF_INNERBOTTOM; - data->mad_InnerBottom = CLAMP((IPTR)tag->ti_Data, 0, 32); - break; - - case MUIA_InnerLeft: - data->mad_Flags |= MADF_INNERLEFT; - data->mad_InnerLeft = CLAMP((IPTR)tag->ti_Data, 0, 32); - break; - - case MUIA_InnerRight: - data->mad_Flags |= MADF_INNERRIGHT; - data->mad_InnerRight = CLAMP((IPTR)tag->ti_Data, 0, 32); - break; - - case MUIA_InnerTop: - data->mad_Flags |= MADF_INNERTOP; - data->mad_InnerTop = CLAMP((IPTR)tag->ti_Data, 0, 32); - break; - - case MUIA_InputMode: - data->mad_InputMode = tag->ti_Data; - break; - - case MUIA_MaxHeight: - data->mad_Flags |= MADF_MAXHEIGHT; - data->mad_HardHeight = tag->ti_Data; - break; - - case MUIA_MaxWidth: - data->mad_Flags |= MADF_MAXWIDTH; - data->mad_HardWidth = tag->ti_Data; - break; - - case MUIA_Selected: - _handle_bool_tag(data->mad_Flags, tag->ti_Data, MADF_SELECTED); - break; - - case MUIA_ShortHelp: - data->mad_ShortHelp = (STRPTR)tag->ti_Data; - break; - - case MUIA_ShowMe: - _handle_bool_tag(data->mad_Flags, tag->ti_Data, MADF_SHOWME); - break; - - case MUIA_ShowSelState: - _handle_bool_tag(data->mad_Flags, tag->ti_Data, MADF_SHOWSELSTATE); - break; - - case MUIA_VertWeight: - data->mad_VertWeight = tag->ti_Data; - break; - - case MUIA_Weight: - data->mad_HorizWeight = data->mad_VertWeight = tag->ti_Data; - break; - - case MUIA_ContextMenu: - data->mad_ContextMenu = (Object*)tag->ti_Data; - break; + break; + + case MUIA_ControlChar: + data->mad_ControlChar = tag->ti_Data; + break; + + case MUIA_CycleChain: + _handle_bool_tag(data->mad_Flags, tag->ti_Data, + MADF_CYCLECHAIN); + break; + + case MUIA_Disabled: + case MUIA_NestedDisabled: + if (tag->ti_Data) + { + data->mad_DisableCount = 1; + } + break; + + case MUIA_FillArea: + _handle_bool_tag(data->mad_Flags, tag->ti_Data, MADF_FILLAREA); + break; + + case MUIA_Draggable: + _handle_bool_tag(data->mad_Flags, tag->ti_Data, MADF_DRAGGABLE); + break; + + case MUIA_Dropable: + _handle_bool_tag(data->mad_Flags, tag->ti_Data, MADF_DROPABLE); + break; + + case MUIA_FixHeight: + data->mad_Flags |= MADF_FIXHEIGHT; + data->mad_HardHeight = tag->ti_Data; + break; + + case MUIA_FixHeightTxt: + data->mad_HardHeightTxt = (STRPTR) tag->ti_Data; + break; + + case MUIA_FixWidth: + data->mad_Flags |= MADF_FIXWIDTH; + data->mad_HardWidth = tag->ti_Data; + break; + + case MUIA_FixWidthTxt: + data->mad_HardWidthTxt = (STRPTR) tag->ti_Data; + break; + + case MUIA_Font: + data->mad_FontPreset = tag->ti_Data; + break; + + case MUIA_Frame: + data->mad_Frame = tag->ti_Data; + break; + + case MUIA_FramePhantomHoriz: + data->mad_Flags |= MADF_FRAMEPHANTOM; + break; + + case MUIA_FrameTitle: + data->mad_FrameTitle = (STRPTR) tag->ti_Data; + break; + + case MUIA_HorizWeight: + data->mad_HorizWeight = tag->ti_Data; + break; + + case MUIA_InnerBottom: + data->mad_Flags |= MADF_INNERBOTTOM; + data->mad_InnerBottom = CLAMP((IPTR) tag->ti_Data, 0, 32); + break; + + case MUIA_InnerLeft: + data->mad_Flags |= MADF_INNERLEFT; + data->mad_InnerLeft = CLAMP((IPTR) tag->ti_Data, 0, 32); + break; + + case MUIA_InnerRight: + data->mad_Flags |= MADF_INNERRIGHT; + data->mad_InnerRight = CLAMP((IPTR) tag->ti_Data, 0, 32); + break; + + case MUIA_InnerTop: + data->mad_Flags |= MADF_INNERTOP; + data->mad_InnerTop = CLAMP((IPTR) tag->ti_Data, 0, 32); + break; + + case MUIA_InputMode: + data->mad_InputMode = tag->ti_Data; + break; + + case MUIA_MaxHeight: + data->mad_Flags |= MADF_MAXHEIGHT; + data->mad_HardHeight = tag->ti_Data; + break; + + case MUIA_MaxWidth: + data->mad_Flags |= MADF_MAXWIDTH; + data->mad_HardWidth = tag->ti_Data; + break; + + case MUIA_Selected: + _handle_bool_tag(data->mad_Flags, tag->ti_Data, MADF_SELECTED); + break; + + case MUIA_ShortHelp: + data->mad_ShortHelp = (STRPTR) tag->ti_Data; + break; + + case MUIA_ShowMe: + _handle_bool_tag(data->mad_Flags, tag->ti_Data, MADF_SHOWME); + break; + + case MUIA_ShowSelState: + _handle_bool_tag(data->mad_Flags, tag->ti_Data, + MADF_SHOWSELSTATE); + break; + + case MUIA_VertWeight: + data->mad_VertWeight = tag->ti_Data; + break; + + case MUIA_Weight: + data->mad_HorizWeight = data->mad_VertWeight = tag->ti_Data; + break; + + case MUIA_ContextMenu: + data->mad_ContextMenu = (Object *) tag->ti_Data; + break; } } - /* In Soliton MUIA_Selected was setted to MUIV_InputMode_RelVerify (=1) for MUIA_Input_Mode - ** MUIV_InputMode_RelVerify which is wrong of course but MUI seems to filter this out - ** so we have to do it also - */ + /* In Soliton MUIA_Selected was setted to MUIV_InputMode_RelVerify (=1) + ** for MUIA_Input_Mode MUIV_InputMode_RelVerify which is wrong of + ** course but MUI seems to filter this out so we have to do it also + */ if (data->mad_InputMode == MUIV_InputMode_RelVerify) { if (data->mad_Flags & MADF_SELECTED) - D(bug("MUIA_Selected was set in OM_NEW, although being in MUIV_InputMode_RelVerify\n")); + D(bug("MUIA_Selected was set in OM_NEW, " + "although being in MUIV_InputMode_RelVerify\n")); data->mad_Flags &= ~MADF_SELECTED; } - data->mad_ehn.ehn_Events = 0; /* Will be filled on demand */ + data->mad_ehn.ehn_Events = 0; /* Will be filled on demand */ data->mad_ehn.ehn_Priority = -5; - /* Please also send mui key events to us, no idea if mui handles this like this */ - data->mad_ehn.ehn_Flags = MUI_EHF_ALWAYSKEYS; - data->mad_ehn.ehn_Object = obj; - data->mad_ehn.ehn_Class = cl; - data->mad_hiehn.ehn_Events = 0; + /* Please also send mui key events to us, no idea if mui handles this + * like this */ + data->mad_ehn.ehn_Flags = MUI_EHF_ALWAYSKEYS; + data->mad_ehn.ehn_Object = obj; + data->mad_ehn.ehn_Class = cl; + + data->mad_hiehn.ehn_Events = 0; data->mad_hiehn.ehn_Priority = -10; - data->mad_hiehn.ehn_Flags = MUI_EHF_HANDLEINPUT; - data->mad_hiehn.ehn_Object = obj; - data->mad_hiehn.ehn_Class = 0; + data->mad_hiehn.ehn_Flags = MUI_EHF_HANDLEINPUT; + data->mad_hiehn.ehn_Object = obj; + data->mad_hiehn.ehn_Class = 0; - return (IPTR)obj; + return (IPTR) obj; } /************************************************************************** @@ -456,7 +468,8 @@ static IPTR Area__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) { struct MUI_AreaData *data = INST_DATA(cl, obj); - zune_image_spec_free(data->mad_BackgroundSpec); /* Safe to call this with NULL */ + /* Safe to call this with NULL */ + zune_image_spec_free(data->mad_BackgroundSpec); return DoSuperMethodA(cl, obj, msg); } @@ -467,256 +480,279 @@ OM_SET **************************************************************************/ static IPTR Area__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) { - struct MUI_AreaData *data = INST_DATA(cl, obj); - struct TagItem *tags = msg->ops_AttrList; - struct TagItem *tag; - CONST_STRPTR old_backgroundspec; - - int change_disable = 0; /* Has the disable state changed? */ + struct MUI_AreaData *data = INST_DATA(cl, obj); + struct TagItem *tags = msg->ops_AttrList; + struct TagItem *tag; + CONST_STRPTR old_backgroundspec; + + int change_disable = 0; /* Has the disable state changed? */ while ((tag = NextTagItem(&tags)) != NULL) { switch (tag->ti_Tag) { - case MUIA_Background: - old_backgroundspec = data->mad_BackgroundSpec; - data->mad_BackgroundSpec = zune_image_spec_duplicate(tag->ti_Data); - if (!data->mad_BackgroundSpec) - { - /* Out of memory */ - data->mad_BackgroundSpec = old_backgroundspec; - break; - } - - data->mad_Flags |= MADF_OWNBG; - - if (old_backgroundspec && (strcmp(data->mad_BackgroundSpec, old_backgroundspec) == 0)) - { - /* New background does not differ from old one */ - zune_image_spec_free(old_backgroundspec); - tag->ti_Tag = TAG_IGNORE; - break; - } - - zune_image_spec_free(old_backgroundspec); - - if (data->mad_Background) - { - if (_flags(obj) & MADF_CANDRAW) - { - zune_imspec_hide(data->mad_Background); - } - if (_flags(obj) & MADF_SETUP) - { - zune_imspec_cleanup(data->mad_Background); - data->mad_Background = NULL; - } - } - - if (_flags(obj) & MADF_SETUP) - { - data->mad_Background = - zune_imspec_setup((IPTR)data->mad_BackgroundSpec, - muiRenderInfo(obj)); - } + case MUIA_Background: + old_backgroundspec = data->mad_BackgroundSpec; + data->mad_BackgroundSpec = + zune_image_spec_duplicate(tag->ti_Data); + if (!data->mad_BackgroundSpec) + { + /* Out of memory */ + data->mad_BackgroundSpec = old_backgroundspec; + break; + } + + data->mad_Flags |= MADF_OWNBG; + + if (old_backgroundspec + && (strcmp(data->mad_BackgroundSpec, + old_backgroundspec) == 0)) + { + /* New background does not differ from old one */ + zune_image_spec_free(old_backgroundspec); + tag->ti_Tag = TAG_IGNORE; + break; + } + + zune_image_spec_free(old_backgroundspec); + + if (data->mad_Background) + { if (_flags(obj) & MADF_CANDRAW) { - zune_imspec_show(data->mad_Background, obj); + zune_imspec_hide(data->mad_Background); } - MUI_Redraw(obj, MADF_DRAWOBJECT); - break; - - case MUIA_FillArea: - _handle_bool_tag(data->mad_Flags, tag->ti_Data, MADF_FILLAREA); - break; - - case MUIA_Frame: - /* this is not documented in MUI but it is possible, - and needed to suppress frame for external images */ - data->mad_Frame = tag->ti_Data; - if (muiGlobalInfo(obj)) + if (_flags(obj) & MADF_SETUP) { - set_inner_sizes(obj, data); - set_title_sizes(obj, data); + zune_imspec_cleanup(data->mad_Background); + data->mad_Background = NULL; } - break; - - case MUIA_ControlChar: + } + + if (_flags(obj) & MADF_SETUP) + { + data->mad_Background = + zune_imspec_setup((IPTR) data->mad_BackgroundSpec, + muiRenderInfo(obj)); + } + if (_flags(obj) & MADF_CANDRAW) + { + zune_imspec_show(data->mad_Background, obj); + } + MUI_Redraw(obj, MADF_DRAWOBJECT); + break; + + case MUIA_FillArea: + _handle_bool_tag(data->mad_Flags, tag->ti_Data, MADF_FILLAREA); + break; + + case MUIA_Frame: + /* this is not documented in MUI but it is possible, + and needed to suppress frame for external images */ + data->mad_Frame = tag->ti_Data; + if (muiGlobalInfo(obj)) + { + set_inner_sizes(obj, data); + set_title_sizes(obj, data); + } + break; + + case MUIA_ControlChar: + if (_flags(obj) & MADF_SETUP) + cleanup_control_char(data, obj); + data->mad_ControlChar = tag->ti_Data; + if (_flags(obj) & MADF_SETUP) + setup_control_char(data, obj, cl); + break; + + case MUIA_CycleChain: + // if (data->mad_InputMode == MUIV_InputMode_None) + // break; + + if ((!(_flags(obj) & MADF_CYCLECHAIN) && tag->ti_Data) + || ((_flags(obj) & MADF_CYCLECHAIN) && !tag->ti_Data)) + { if (_flags(obj) & MADF_SETUP) + { cleanup_control_char(data, obj); - data->mad_ControlChar = tag->ti_Data; - if (_flags(obj) & MADF_SETUP) + _handle_bool_tag(data->mad_Flags, tag->ti_Data, + MADF_CYCLECHAIN); setup_control_char(data, obj, cl); - break; - - case MUIA_CycleChain: - // if (data->mad_InputMode == MUIV_InputMode_None) - // break; - - if ((!(_flags(obj) & MADF_CYCLECHAIN) && tag->ti_Data) - || ((_flags(obj) & MADF_CYCLECHAIN) && !tag->ti_Data)) - { - if (_flags(obj) & MADF_SETUP) - { - cleanup_control_char(data,obj); - _handle_bool_tag(data->mad_Flags, tag->ti_Data, MADF_CYCLECHAIN); - setup_control_char(data,obj,cl); - } else _handle_bool_tag(data->mad_Flags, tag->ti_Data, MADF_CYCLECHAIN); } - break; - - case MUIA_Disabled: - if (tag->ti_Data) + else + _handle_bool_tag(data->mad_Flags, tag->ti_Data, + MADF_CYCLECHAIN); + } + break; + + case MUIA_Disabled: + if (tag->ti_Data) + { + if (!data->mad_DisableCount) { - if (!data->mad_DisableCount) - { - data->mad_DisableCount = 1; - change_disable = 1; - } + data->mad_DisableCount = 1; + change_disable = 1; } - else + } + else + { + if (data->mad_DisableCount) { - if (data->mad_DisableCount) - { - data->mad_DisableCount = 0; - change_disable = 1; - } + data->mad_DisableCount = 0; + change_disable = 1; } - break; - - case MUIA_NestedDisabled: - if (tag->ti_Data) - { - if (!data->mad_DisableCount) change_disable = 1; - data->mad_DisableCount++; - } - else + } + break; + + case MUIA_NestedDisabled: + if (tag->ti_Data) + { + if (!data->mad_DisableCount) + change_disable = 1; + data->mad_DisableCount++; + } + else + { + if (data->mad_DisableCount) { - if (data->mad_DisableCount) - { - data->mad_DisableCount--; - if (!data->mad_DisableCount) change_disable = 1; - } + data->mad_DisableCount--; + if (!data->mad_DisableCount) + change_disable = 1; } - break; - - - case MUIA_HorizWeight: - data->mad_HorizWeight = tag->ti_Data; - break; - - case MUIA_Pressed: - if (tag->ti_Data) - data->mad_Flags |= MADF_PRESSED; - else - data->mad_Flags &= ~MADF_PRESSED; - break; - - case MUIA_ShortHelp: - data->mad_ShortHelp = (STRPTR)tag->ti_Data; - break; - - case MUIA_ShowMe: + } + break; + + + case MUIA_HorizWeight: + data->mad_HorizWeight = tag->ti_Data; + break; + + case MUIA_Pressed: + if (tag->ti_Data) + data->mad_Flags |= MADF_PRESSED; + else + data->mad_Flags &= ~MADF_PRESSED; + break; + + case MUIA_ShortHelp: + data->mad_ShortHelp = (STRPTR) tag->ti_Data; + break; + + case MUIA_ShowMe: { ULONG oldflags = data->mad_Flags; int recalc = 0; - - if (tag->ti_Data) data->mad_Flags |= MADF_SHOWME; - else data->mad_Flags &= ~MADF_SHOWME; - + + if (tag->ti_Data) + data->mad_Flags |= MADF_SHOWME; + else + data->mad_Flags &= ~MADF_SHOWME; + if (oldflags != data->mad_Flags) { if (!tag->ti_Data) { - /* Should be made invisible, so send a MUIM_Hide and then a MUIM_Cleanup to the object if needed, - ** as objects with MUIA_ShowMe to false neighter get MUIM_Setup nor MUIM_Show */ - if (_flags(obj)&MADF_CANDRAW) + /* Should be made invisible, so send a MUIM_Hide and + ** then a MUIM_Cleanup to the object if needed, + ** as objects with MUIA_ShowMe to false get neither + ** MUIM_Setup nor MUIM_Show */ + if (_flags(obj) & MADF_CANDRAW) { DoHideMethod(obj); recalc = 1; } - #if 0 /* SHOWME affects only show/hide */ - if (_flags(obj)&MADF_SETUP) DoMethod(obj,MUIM_Cleanup); - #endif - } +#if 0 /* SHOWME affects only show/hide */ + if (_flags(obj) & MADF_SETUP) + DoMethod(obj, MUIM_Cleanup); +#endif + } else { - Object *parent = _parent(obj); /* Will be NULL if direct child of a window! */ + Object *parent = _parent(obj); + /* Will be NULL if direct child of a window! */ + if (parent) { - #if 0 /* SHOWME affects only show/hide */ - if (_flags(parent) & MADF_SETUP) DoSetupMethod(obj,muiRenderInfo(parent)); - #endif - if (_flags(parent) & MADF_CANDRAW) - { - DoShowMethod(obj); - recalc = 1; +#if 0 /* SHOWME affects only show/hide */ + if (_flags(parent) & MADF_SETUP) + DoSetupMethod(obj, muiRenderInfo(parent)); +#endif + if (_flags(parent) & MADF_CANDRAW) + { + DoShowMethod(obj); + recalc = 1; + } } - } else + else { - /* Check if window is open... */ + /* Check if window is open... */ } } - - if (recalc && muiRenderInfo(obj)) /* If renderinfo is NULL _win(obj) does not work (crash) */ + + /* If renderinfo is NULL _win(obj) doesn't work (crash) */ + if (recalc && muiRenderInfo(obj)) { - DoMethod(_win(obj), MUIM_Window_RecalcDisplay, (IPTR)_parent(obj)); + DoMethod(_win(obj), MUIM_Window_RecalcDisplay, + (IPTR) _parent(obj)); } } } break; - - case MUIA_Selected: - /* D(bug(" Area_Set(%p) : - MUIA_Selected val=%ld sss=%d\n", obj, tag->ti_Data, !!(data->mad_Flags & MADF_SHOWSELSTATE))); - */ - if (tag->ti_Data && !(data->mad_Flags & MADF_SELECTED)) - { - data->mad_Flags |= MADF_SELECTED; - MUI_Redraw(obj, MADF_DRAWOBJECT); - } - else if (!tag->ti_Data && (data->mad_Flags & MADF_SELECTED)) - { - data->mad_Flags &= ~MADF_SELECTED; - MUI_Redraw(obj, MADF_DRAWOBJECT); - } - else - { - tag->ti_Tag = TAG_IGNORE; - } - /* if (data->mad_Flags & MADF_SHOWSELSTATE) */ - /* MUI_Redraw(obj, MADF_DRAWOBJECT); */ - /* else */ - /* MUI_Redraw(obj, MADF_DRAWUPDATE); */ - break; - - case MUIA_Timer: - data->mad_Timeval = tag->ti_Data; - break; - - case MUIA_VertWeight: - data->mad_VertWeight = tag->ti_Data; - break; - - case MUIA_Draggable: - _handle_bool_tag(data->mad_Flags, tag->ti_Data, MADF_DRAGGABLE); - break; - - case MUIA_Dropable: - _handle_bool_tag(data->mad_Flags, tag->ti_Data, MADF_DROPABLE); - break; - - case MUIA_ContextMenu: - data->mad_ContextMenu = (Object*)tag->ti_Data; - break; - - case MUIA_Font: - data->mad_FontPreset = tag->ti_Data; - break; - - case MUIA_InputMode: - data->mad_InputMode = tag->ti_Data; - break; + + case MUIA_Selected: + /* D(bug(" Area_Set(%p) : + MUIA_Selected val=%ld sss=%d\n", obj, tag->ti_Data, + !!(data->mad_Flags & MADF_SHOWSELSTATE))); + */ + if (tag->ti_Data && !(data->mad_Flags & MADF_SELECTED)) + { + data->mad_Flags |= MADF_SELECTED; + MUI_Redraw(obj, MADF_DRAWOBJECT); + } + else if (!tag->ti_Data && (data->mad_Flags & MADF_SELECTED)) + { + data->mad_Flags &= ~MADF_SELECTED; + MUI_Redraw(obj, MADF_DRAWOBJECT); + } + else + { + tag->ti_Tag = TAG_IGNORE; + } +#if 0 + if (data->mad_Flags & MADF_SHOWSELSTATE) + MUI_Redraw(obj, MADF_DRAWOBJECT); + else + MUI_Redraw(obj, MADF_DRAWUPDATE); +#endif + break; + + case MUIA_Timer: + data->mad_Timeval = tag->ti_Data; + break; + + case MUIA_VertWeight: + data->mad_VertWeight = tag->ti_Data; + break; + + case MUIA_Draggable: + _handle_bool_tag(data->mad_Flags, tag->ti_Data, MADF_DRAGGABLE); + break; + + case MUIA_Dropable: + _handle_bool_tag(data->mad_Flags, tag->ti_Data, MADF_DROPABLE); + break; + + case MUIA_ContextMenu: + data->mad_ContextMenu = (Object *) tag->ti_Data; + break; + + case MUIA_Font: + data->mad_FontPreset = tag->ti_Data; + break; + + case MUIA_InputMode: + data->mad_InputMode = tag->ti_Data; + break; } } @@ -726,7 +762,7 @@ static IPTR Area__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) MUI_Redraw(obj, MADF_DRAWOBJECT); } - return DoSuperMethodA(cl, obj, (Msg)msg); + return DoSuperMethodA(cl, obj, (Msg) msg); } @@ -739,120 +775,120 @@ static IPTR Area__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) struct MUI_AreaData *data = INST_DATA(cl, obj); - switch(msg->opg_AttrID) - { - case MUIA_Background: - STORE = (IPTR)data->mad_Background; - return TRUE; - - case MUIA_BottomEdge: - STORE = (IPTR)_bottom(obj); - return TRUE; - - case MUIA_ControlChar: - STORE = data->mad_ControlChar; - return TRUE; - - case MUIA_CycleChain: - STORE = ((data->mad_Flags & MADF_CYCLECHAIN) != 0); - return TRUE; - - case MUIA_Disabled: - case MUIA_NestedDisabled: - STORE = !!data->mad_DisableCount; /* BOOLEAN */ - return TRUE; - - case MUIA_Font: - STORE = (IPTR)data->mad_FontPreset; - return TRUE; - - case MUIA_Height: - STORE = (IPTR)_height(obj); - return TRUE; - - case MUIA_HorizWeight: - STORE = (IPTR)data->mad_HorizWeight; - return TRUE; - - case MUIA_InnerBottom: - STORE = (IPTR)data->mad_InnerBottom; - return TRUE; - - case MUIA_InnerLeft: - STORE = (IPTR)data->mad_InnerLeft; - return TRUE; - - case MUIA_InnerRight: - STORE = (IPTR)data->mad_InnerRight; - return TRUE; - - case MUIA_InnerTop: - STORE = (IPTR)data->mad_InnerTop; - return TRUE; - - case MUIA_LeftEdge: - STORE = (IPTR)_left(obj); - return TRUE; - - case MUIA_Pressed: - STORE = !!(data->mad_Flags & MADF_PRESSED); - return TRUE; - - case MUIA_RightEdge: - STORE = (IPTR)_right(obj); - return TRUE; - - case MUIA_Selected: - STORE = !!(data->mad_Flags & MADF_SELECTED); - return TRUE; - - case MUIA_ShortHelp: - STORE = (IPTR)data->mad_ShortHelp; - return TRUE; - - case MUIA_ShowMe: - STORE = !!(data->mad_Flags & MADF_SHOWME); - return TRUE; - - case MUIA_Timer: - return TRUE; - - case MUIA_TopEdge: - STORE = (IPTR)_top(obj); - return TRUE; - - case MUIA_VertWeight: - STORE = (IPTR)data->mad_VertWeight; - return TRUE; - - case MUIA_Width: - STORE = (IPTR)_width(obj); - return TRUE; - - case MUIA_Window: - if (muiAreaData(obj)->mad_RenderInfo) - STORE = (IPTR)_window(obj); - else - STORE = 0L; - return TRUE; - - case MUIA_WindowObject: - if (muiAreaData(obj)->mad_RenderInfo) - STORE = (IPTR)_win(obj); - else - STORE = 0L; - return TRUE; - - case MUIA_ContextMenu: - STORE = (IPTR)data->mad_ContextMenu; - return TRUE; + switch (msg->opg_AttrID) + { + case MUIA_Background: + STORE = (IPTR) data->mad_Background; + return TRUE; + + case MUIA_BottomEdge: + STORE = (IPTR) _bottom(obj); + return TRUE; + + case MUIA_ControlChar: + STORE = data->mad_ControlChar; + return TRUE; + + case MUIA_CycleChain: + STORE = ((data->mad_Flags & MADF_CYCLECHAIN) != 0); + return TRUE; + + case MUIA_Disabled: + case MUIA_NestedDisabled: + STORE = ! !data->mad_DisableCount; /* BOOLEAN */ + return TRUE; + + case MUIA_Font: + STORE = (IPTR) data->mad_FontPreset; + return TRUE; + + case MUIA_Height: + STORE = (IPTR) _height(obj); + return TRUE; + + case MUIA_HorizWeight: + STORE = (IPTR) data->mad_HorizWeight; + return TRUE; + + case MUIA_InnerBottom: + STORE = (IPTR) data->mad_InnerBottom; + return TRUE; + + case MUIA_InnerLeft: + STORE = (IPTR) data->mad_InnerLeft; + return TRUE; + + case MUIA_InnerRight: + STORE = (IPTR) data->mad_InnerRight; + return TRUE; + + case MUIA_InnerTop: + STORE = (IPTR) data->mad_InnerTop; + return TRUE; + + case MUIA_LeftEdge: + STORE = (IPTR) _left(obj); + return TRUE; + + case MUIA_Pressed: + STORE = ! !(data->mad_Flags & MADF_PRESSED); + return TRUE; + + case MUIA_RightEdge: + STORE = (IPTR) _right(obj); + return TRUE; + + case MUIA_Selected: + STORE = ! !(data->mad_Flags & MADF_SELECTED); + return TRUE; + + case MUIA_ShortHelp: + STORE = (IPTR) data->mad_ShortHelp; + return TRUE; + + case MUIA_ShowMe: + STORE = ! !(data->mad_Flags & MADF_SHOWME); + return TRUE; + + case MUIA_Timer: + return TRUE; + + case MUIA_TopEdge: + STORE = (IPTR) _top(obj); + return TRUE; + + case MUIA_VertWeight: + STORE = (IPTR) data->mad_VertWeight; + return TRUE; + + case MUIA_Width: + STORE = (IPTR) _width(obj); + return TRUE; + + case MUIA_Window: + if (muiAreaData(obj)->mad_RenderInfo) + STORE = (IPTR) _window(obj); + else + STORE = 0L; + return TRUE; + + case MUIA_WindowObject: + if (muiAreaData(obj)->mad_RenderInfo) + STORE = (IPTR) _win(obj); + else + STORE = 0L; + return TRUE; + + case MUIA_ContextMenu: + STORE = (IPTR) data->mad_ContextMenu; + return TRUE; - case MUIA_Frame: - STORE = (IPTR)data->mad_Frame; - return TRUE; + case MUIA_Frame: + STORE = (IPTR) data->mad_Frame; + return TRUE; } - return(DoSuperMethodA(cl, obj, (Msg) msg)); + return (DoSuperMethodA(cl, obj, (Msg) msg)); #undef STORE } @@ -860,18 +896,19 @@ static IPTR Area__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) /************************************************************************** MUIM_AskMinMax **************************************************************************/ -static IPTR Area__MUIM_AskMinMax(struct IClass *cl, Object *obj, struct MUIP_AskMinMax *msg) +static IPTR Area__MUIM_AskMinMax(struct IClass *cl, Object *obj, + struct MUIP_AskMinMax *msg) { struct MUI_AreaData *data = INST_DATA(cl, obj); const struct ZuneFrameGfx *zframe; const struct MUI_FrameSpec_intern *frame; struct MUI_FrameSpec_intern tempframe; - + frame = get_intframe(obj, data, &tempframe); zframe = zune_zframe_get(obj, frame); area_update_msizes(obj, data, frame, zframe); - + msg->MinMaxInfo->MinWidth = _subwidth(obj); msg->MinMaxInfo->MinHeight = _subheight(obj); @@ -880,7 +917,8 @@ static IPTR Area__MUIM_AskMinMax(struct IClass *cl, Object *obj, struct MUIP_Ask msg->MinMaxInfo->DefWidth = msg->MinMaxInfo->MinWidth; msg->MinMaxInfo->DefHeight = msg->MinMaxInfo->MinHeight; -/* D(bug("Area_AskMinMax 0x%lx (%s): Min=%ldx%ld Max=%ldx%ld Def=%ldx%ld\n", obj, data->mad_FrameTitle, */ +/* D(bug("Area_AskMinMax 0x%lx (%s): Min=%ldx%ld Max=%ldx%ld Def=%ldx%ld\n", + obj, data->mad_FrameTitle, */ /* msg->MinMaxInfo->MinWidth, msg->MinMaxInfo->MinHeight, */ /* msg->MinMaxInfo->MaxWidth, msg->MinMaxInfo->MaxHeight, */ /* msg->MinMaxInfo->DefWidth, msg->MinMaxInfo->DefHeight)); */ @@ -894,61 +932,68 @@ static IPTR Area__MUIM_AskMinMax(struct IClass *cl, Object *obj, struct MUIP_Ask void __area_finish_minmax(Object *obj, struct MUI_MinMax *MinMaxInfo) { struct MUI_AreaData *data = muiAreaData(obj); - + if ((_flags(obj) & MADF_FIXHEIGHT) && data->mad_HardHeight) { int h = data->mad_HardHeight + data->mad_subheight; - + MinMaxInfo->MinHeight = - MinMaxInfo->DefHeight = - MinMaxInfo->MaxHeight = CLAMP(h, MinMaxInfo->MinHeight, MinMaxInfo->MaxHeight); + MinMaxInfo->DefHeight = + MinMaxInfo->MaxHeight = + CLAMP(h, MinMaxInfo->MinHeight, MinMaxInfo->MaxHeight); } else if (data->mad_HardHeightTxt) { ZText *text; - - if ((text = zune_text_new(NULL, data->mad_HardHeightTxt, ZTEXT_ARG_NONE, 0))) + + if ((text = + zune_text_new(NULL, data->mad_HardHeightTxt, ZTEXT_ARG_NONE, + 0))) { zune_text_get_bounds(text, obj); - + MinMaxInfo->MinHeight = - MinMaxInfo->DefHeight = - MinMaxInfo->MaxHeight = - CLAMP(text->height + data->mad_subheight, MinMaxInfo->MinHeight, MinMaxInfo->MaxHeight); - + MinMaxInfo->DefHeight = + MinMaxInfo->MaxHeight = + CLAMP(text->height + data->mad_subheight, + MinMaxInfo->MinHeight, MinMaxInfo->MaxHeight); + zune_text_destroy(text); } } else if (_flags(obj) & MADF_MAXHEIGHT) - { + { MinMaxInfo->MaxHeight = CLAMP(data->mad_HardHeight + data->mad_subheight, - MinMaxInfo->MinHeight, - MinMaxInfo->MaxHeight); + MinMaxInfo->MinHeight, MinMaxInfo->MaxHeight); } if ((_flags(obj) & MADF_FIXWIDTH) && data->mad_HardWidth) { int w = data->mad_HardWidth + data->mad_subwidth; - + MinMaxInfo->MinWidth = - MinMaxInfo->DefWidth = - MinMaxInfo->MaxWidth = CLAMP(w, MinMaxInfo->MinWidth, MinMaxInfo->MaxWidth); + MinMaxInfo->DefWidth = + MinMaxInfo->MaxWidth = + CLAMP(w, MinMaxInfo->MinWidth, MinMaxInfo->MaxWidth); } else if (data->mad_HardWidthTxt) { ZText *text; - - if ((text = zune_text_new(NULL, data->mad_HardWidthTxt, ZTEXT_ARG_NONE, 0))) + + if ((text = + zune_text_new(NULL, data->mad_HardWidthTxt, ZTEXT_ARG_NONE, + 0))) { zune_text_get_bounds(text, obj); - + MinMaxInfo->MinWidth = - MinMaxInfo->DefWidth = - MinMaxInfo->MaxWidth = - CLAMP(text->width + data->mad_subwidth, MinMaxInfo->MinWidth, MinMaxInfo->MaxWidth); - + MinMaxInfo->DefWidth = + MinMaxInfo->MaxWidth = + CLAMP(text->width + data->mad_subwidth, + MinMaxInfo->MinWidth, MinMaxInfo->MaxWidth); + zune_text_destroy(text); } @@ -957,8 +1002,7 @@ void __area_finish_minmax(Object *obj, struct MUI_MinMax *MinMaxInfo) { MinMaxInfo->MaxWidth = CLAMP(data->mad_HardWidth + data->mad_subwidth, - MinMaxInfo->MinWidth, - MinMaxInfo->MaxWidth); + MinMaxInfo->MinWidth, MinMaxInfo->MaxWidth); } /* Set minmax */ @@ -970,12 +1014,12 @@ void __area_finish_minmax(Object *obj, struct MUI_MinMax *MinMaxInfo) _defheight(obj) = MinMaxInfo->DefHeight; } -/* <-- _top(obj) (frame title position depends of _top(obj)) -* ====== Title ===== <-- frame_top (depends of title, if centered/above) -* | | <-- bgtop (depends of frame, bg always begins under frame) -* | | -* | | -* ================== <-- "bgbottom" and "frame_bottom" (frame overwrites bg (1)) +/* <-- _top(obj) (frame title position depends of _top(obj)) +* ==== Title === <-- frame_top (depends of title, if centered/above) +* | | <-- bgtop (depends of frame, bg always begins under frame) +* | | +* | | +* ============== <-- "bgbottom" and "frame_bottom" (frame overwrites bg (1)) * * (1) : needed for phantom frame objects, where no frame overwrites bg, thus bg * must go as far as theorical bottom frame border. @@ -984,14 +1028,16 @@ void __area_finish_minmax(Object *obj, struct MUI_MinMax *MinMaxInfo) /* * draw object background if MADF_FILLAREA. */ -static void Area_Draw_handle_background(Object *obj, struct MUI_AreaData *data, ULONG flags, - const struct ZuneFrameGfx *zframe) +static void Area_Draw_handle_background(Object *obj, + struct MUI_AreaData *data, ULONG flags, + const struct ZuneFrameGfx *zframe) { struct MUI_ImageSpec_intern *background; - struct Rectangle r, r2, rects[4]; + struct Rectangle r, r2, rects[4]; int i, bgtop, bgleft, bgw, bgh, numrects; - if (!(data->mad_Flags & MADF_SELECTED) || !(data->mad_Flags & MADF_SHOWSELSTATE)) + if (!(data->mad_Flags & MADF_SELECTED) + || !(data->mad_Flags & MADF_SHOWSELSTATE)) background = data->mad_Background; else background = data->mad_SelBack; @@ -1013,7 +1059,7 @@ static void Area_Draw_handle_background(Object *obj, struct MUI_AreaData *data, r.MinY = bgtop; r.MaxX = bgleft + bgw - 1; r.MaxY = bgtop + bgh - 1; - + if (data->mad_Flags & MADF_FILLAREA) { rects[0] = r; @@ -1022,67 +1068,67 @@ static void Area_Draw_handle_background(Object *obj, struct MUI_AreaData *data, else { /* MADF_FILLAREA not set. Only draw frame outside of - innerbox (_mleft, _mtop, _mright, _mbottom): - - ............. - .***********. - .*#########*. - .*#########*. - .***********. - ............. - - # = innerbox - * = frame outside of innerbox - . = object frame - */ - + innerbox (_mleft, _mtop, _mright, _mbottom): + + ............. + .***********. + .*#########*. + .*#########*. + .***********. + ............. + + # = innerbox + * = frame outside of innerbox + . = object frame + */ + r2.MinX = _mleft(obj); r2.MinY = _mtop(obj); r2.MaxX = _mright(obj); r2.MaxY = _mbottom(obj); - + numrects = SubtractRectFromRect(&r, &r2, rects); } - - for(i = 0; i < numrects; i++) + + for (i = 0; i < numrects; i++) { if (!background) { - /* This will do the rest, TODO: on MADF_DRAWALL we not really need to draw this */ - /* D(bug(" Area_Draw(%p):%ld: MUIM_DrawBackground\n", obj, __LINE__)); */ - /* ATTENTION: This draws the clipped away regions of the area. Comment out and */ - /* check the result to see what I mean. */ + /* This will do the rest, TODO: on MADF_DRAWALL we not really + * need to draw this */ + /* D(bug(" Area_Draw(%p):%ld: MUIM_DrawBackground\n", obj, + __LINE__)); */ + /* ATTENTION: This draws the clipped away regions of the area. + * Comment out and check the result to see what I mean. */ DoMethod(obj, MUIM_DrawBackground, rects[i].MinX, rects[i].MinY, - rects[i].MaxX - rects[i].MinX + 1, rects[i].MaxY - rects[i].MinY + 1, - rects[i].MinX, rects[i].MinY, - data->mad_Flags - ); + rects[i].MaxX - rects[i].MinX + 1, + rects[i].MaxY - rects[i].MinY + 1, rects[i].MinX, + rects[i].MinY, data->mad_Flags); } else { - /* D(bug(" Area_Draw(%p):%ld: zune_imspec_draw\n", obj, __LINE__)); */ + /* D(bug(" Area_Draw(%p):%ld: zune_imspec_draw\n", obj, + __LINE__)); */ zune_imspec_draw(background, data->mad_RenderInfo, rects[i].MinX, rects[i].MinY, - rects[i].MaxX - rects[i].MinX + 1, rects[i].MaxY - rects[i].MinY + 1, - rects[i].MinX, rects[i].MinY, - 0 - ); + rects[i].MaxX - rects[i].MinX + 1, + rects[i].MaxY - rects[i].MinY + 1, rects[i].MinX, + rects[i].MinY, 0); } } - - if (muiGlobalInfo(obj)->mgi_Prefs->window_redraw == WINDOW_REDRAW_WITHOUT_CLEAR) + + if (muiGlobalInfo(obj)->mgi_Prefs->window_redraw == + WINDOW_REDRAW_WITHOUT_CLEAR) { if (bgtop > _top(obj) && !(flags & MADF_DRAWALL)) { /* Fill in the gap produced by the title with the background - * of the parent object but only if - * the upper object hasn't drawn it already - * (which is the case if MADF_DRAWALL is setted) */ - DoMethod( - obj, MUIM_DrawParentBackground, bgleft, _top(obj), bgw, bgtop - _top(obj), - bgleft, _top(obj), data->mad_Flags - ); + * of the parent object but only if + * the upper object hasn't drawn it already + * (which is the case if MADF_DRAWALL is setted) */ + DoMethod(obj, MUIM_DrawParentBackground, bgleft, _top(obj), bgw, + bgtop - _top(obj), bgleft, _top(obj), data->mad_Flags); } } } @@ -1092,9 +1138,9 @@ static void Area_Draw_handle_background(Object *obj, struct MUI_AreaData *data, * draw object frame + title if not MADF_FRAMEPHANTOM. */ static void Area_Draw_handle_frame(Object *obj, struct MUI_AreaData *data, - const struct ZuneFrameGfx *zframe) + const struct ZuneFrameGfx *zframe) { - APTR textdrawclip = (APTR)-1; + APTR textdrawclip = (APTR) - 1; struct Region *region; int tx; int tw, frame_height, frame_top; @@ -1106,29 +1152,32 @@ static void Area_Draw_handle_frame(Object *obj, struct MUI_AreaData *data, /* no frametitle, just draw frame and return */ if (!data->mad_FrameTitle) { - zframe->draw(zframe->customframe, muiRenderInfo(obj), _left(obj), _top(obj), _width(obj), _height(obj), _left(obj), _top(obj), _width(obj), _height(obj)); + zframe->draw(zframe->customframe, muiRenderInfo(obj), _left(obj), + _top(obj), _width(obj), _height(obj), _left(obj), _top(obj), + _width(obj), _height(obj)); return; } - + /* set clipping so that frame is not drawn behind title */ switch (muiGlobalInfo(obj)->mgi_Prefs->group_title_color) { - case GROUP_TITLE_COLOR_OUTLINE: - addtw = 2; - break; - case GROUP_TITLE_COLOR_3D: - addtw = 1; - break; - default: - addtw = 0; + case GROUP_TITLE_COLOR_OUTLINE: + addtw = 2; + break; + case GROUP_TITLE_COLOR_3D: + addtw = 1; + break; + default: + addtw = 0; } - maxtxtwidth = _width(obj) - zframe->ileft - zframe->iright - 2 * 5 - addtw; + maxtxtwidth = + _width(obj) - zframe->ileft - zframe->iright - 2 * 5 - addtw; nchars = TextFit(_rp(obj), data->mad_FrameTitle, - strlen(data->mad_FrameTitle), - &te, NULL, 1, maxtxtwidth, _font(obj)->tf_YSize); + strlen(data->mad_FrameTitle), + &te, NULL, 1, maxtxtwidth, _font(obj)->tf_YSize); tw = te.te_Width + addtw; tx = _left(obj) + (_width(obj) - tw) / 2; @@ -1140,34 +1189,38 @@ static void Area_Draw_handle_frame(Object *obj, struct MUI_AreaData *data, { struct Rectangle rect; int hspace = _font(obj)->tf_YSize / 8; - + rect.MinX = tx - hspace; rect.MinY = _top(obj); rect.MaxX = tx + tw - 1 + hspace; - rect.MaxY = _top(obj) + _font(obj)->tf_YSize - 1; // frame is not thick enough anywhy - OrRectRegion(region,&rect); - + rect.MaxY = _top(obj) + _font(obj)->tf_YSize - 1; + // frame is not thick enough anyway + OrRectRegion(region, &rect); + rect.MinX = _left(obj); rect.MinY = _top(obj); rect.MaxX = _right(obj); rect.MaxY = _bottom(obj); - XorRectRegion(region,&rect); - - textdrawclip = MUI_AddClipRegion(muiRenderInfo(obj),region); + XorRectRegion(region, &rect); + + textdrawclip = MUI_AddClipRegion(muiRenderInfo(obj), region); } - zframe->draw(zframe->customframe, muiRenderInfo(obj), _left(obj), frame_top, _width(obj), frame_height, _left(obj), frame_top, _width(obj), frame_height); + zframe->draw(zframe->customframe, muiRenderInfo(obj), _left(obj), + frame_top, _width(obj), frame_height, _left(obj), frame_top, + _width(obj), frame_height); - if (region && textdrawclip != (APTR)-1) + if (region && textdrawclip != (APTR) - 1) { - MUI_RemoveClipRegion(muiRenderInfo(obj),textdrawclip); -/* DisposeRegion(region);*/ /* sba: DisposeRegion happens in MUI_RemoveClipRegion, this seems wrong to me */ + MUI_RemoveClipRegion(muiRenderInfo(obj), textdrawclip); + /* DisposeRegion(region);*/ /* sba: DisposeRegion happens in MUI_RemoveClipRegion, this seems wrong to me */ } /* Title text drawing */ SetDrMd(_rp(obj), JAM1); SetAPen(_rp(obj), _pens(obj)[MPEN_SHADOW]); - if (muiGlobalInfo(obj)->mgi_Prefs->group_title_color == GROUP_TITLE_COLOR_3D) + if (muiGlobalInfo(obj)->mgi_Prefs->group_title_color == + GROUP_TITLE_COLOR_3D) { Move(_rp(obj), tx + 1, _top(obj) + _font(obj)->tf_Baseline + 1); Text(_rp(obj), data->mad_FrameTitle, nchars); @@ -1175,10 +1228,11 @@ static void Area_Draw_handle_frame(Object *obj, struct MUI_AreaData *data, Move(_rp(obj), tx, _top(obj) + _font(obj)->tf_Baseline); Text(_rp(obj), data->mad_FrameTitle, nchars); } - else if (muiGlobalInfo(obj)->mgi_Prefs->group_title_color == GROUP_TITLE_COLOR_OUTLINE) + else if (muiGlobalInfo(obj)->mgi_Prefs->group_title_color == + GROUP_TITLE_COLOR_OUTLINE) { SetAPen(_rp(obj), _pens(obj)[MPEN_SHINE]); - + tx += addtw / 2; Move(_rp(obj), tx + 1, _top(obj) + _font(obj)->tf_Baseline); Text(_rp(obj), data->mad_FrameTitle, nchars); @@ -1188,14 +1242,15 @@ static void Area_Draw_handle_frame(Object *obj, struct MUI_AreaData *data, Text(_rp(obj), data->mad_FrameTitle, nchars); Move(_rp(obj), tx, _top(obj) + _font(obj)->tf_Baseline - 1); Text(_rp(obj), data->mad_FrameTitle, nchars); - + SetAPen(_rp(obj), _pens(obj)[MPEN_SHADOW]); Move(_rp(obj), tx, _top(obj) + _font(obj)->tf_Baseline); Text(_rp(obj), data->mad_FrameTitle, nchars); } else { - if (muiGlobalInfo(obj)->mgi_Prefs->group_title_color == GROUP_TITLE_COLOR_HILITE) + if (muiGlobalInfo(obj)->mgi_Prefs->group_title_color == + GROUP_TITLE_COLOR_HILITE) { SetAPen(_rp(obj), _pens(obj)[MPEN_SHINE]); } @@ -1207,50 +1262,55 @@ static void Area_Draw_handle_frame(Object *obj, struct MUI_AreaData *data, /************************************************************************** MUIM_Draw **************************************************************************/ -static IPTR Area__MUIM_Draw(struct IClass *cl, Object *obj, struct MUIP_Draw *msg) +static IPTR Area__MUIM_Draw(struct IClass *cl, Object *obj, + struct MUIP_Draw *msg) { struct MUI_AreaData *data = INST_DATA(cl, obj); const struct ZuneFrameGfx *zframe; struct TextFont *obj_font = NULL; ULONG flags = data->mad_Flags & MADF_DRAWFLAGS; - + //APTR areaclip; -/* D(bug("Area_Draw(0x%lx) %ldx%ldx%ldx%ld\n",obj,_left(obj),_top(obj),_right(obj),_bottom(obj))); */ -/* D(bug(" Area_Draw(%p) msg=0x%08lx flags=0x%08lx\n",obj, msg->flags,_flags(obj))); */ +/* D(bug("Area_Draw(0x%lx) %ldx%ldx%ldx%ld\n", obj, _left(obj), + _top(obj),_right(obj),_bottom(obj))); */ +/* D(bug(" Area_Draw(%p) msg=0x%08lx flags=0x%08lx\n", obj, msg->flags, + _flags(obj))); */ if (flags & MADF_DRAWALL) - flags |= MADF_DRAWOBJECT; + flags |= MADF_DRAWOBJECT; msg->flags = flags; data->mad_Flags &= ~MADF_DRAWFLAGS; - + if (!(flags & MADF_DRAWOBJECT)) { - /* dont draw bg/frame, let subclass redraw content only - **/ - return 0; + /* dont draw bg/frame, let subclass redraw content only + **/ + return 0; } - + /* Background cant be drawn without knowing anything about frame, thus some * calculations are made before background and frame drawing. */ { - /* on selected state, will get the opposite frame */ - const struct MUI_FrameSpec_intern *frame; - struct MUI_FrameSpec_intern tempframe; - int state; + /* on selected state, will get the opposite frame */ + const struct MUI_FrameSpec_intern *frame; + struct MUI_FrameSpec_intern tempframe; + int state; - frame = get_intframe(obj, data, &tempframe); - state = frame->state; - if ((data->mad_Flags & MADF_SELECTED) && (data->mad_Flags & MADF_SHOWSELSTATE)) - state ^= 1; + frame = get_intframe(obj, data, &tempframe); + state = frame->state; + if ((data->mad_Flags & MADF_SELECTED) + && (data->mad_Flags & MADF_SHOWSELSTATE)) + state ^= 1; - zframe = zune_zframe_get_with_state( - obj, frame, state); - /* update innersizes as there are frames which have different inner spacings in selected state */ - area_update_msizes(obj, data, frame, zframe); + zframe = zune_zframe_get_with_state(obj, frame, state); + + /* update innersizes as there are frames which have different inner + * spacings in selected state */ + area_update_msizes(obj, data, frame, zframe); } /* Background drawing */ @@ -1263,7 +1323,7 @@ static IPTR Area__MUIM_Draw(struct IClass *cl, Object *obj, struct MUIP_Draw *ms /* Frame and frametitle drawing */ if (!(data->mad_Flags & MADF_FRAMEPHANTOM)) { - Area_Draw_handle_frame(obj, data, zframe); + Area_Draw_handle_frame(obj, data, zframe); } _font(obj) = obj_font; @@ -1277,25 +1337,30 @@ static IPTR Area__MUIM_Draw(struct IClass *cl, Object *obj, struct MUIP_Draw *ms /************************************************************************** MUIM_DrawParentBackground **************************************************************************/ -static IPTR Area__MUIM_DrawParentBackground(struct IClass *cl, Object *obj, struct MUIP_DrawParentBackground *msg) +static IPTR Area__MUIM_DrawParentBackground(struct IClass *cl, Object *obj, + struct MUIP_DrawParentBackground *msg) { struct MUI_AreaData *data = INST_DATA(cl, obj); Object *parent = NULL; - if (!(data->mad_Flags & MADF_CANDRAW)) /* not between show/hide */ - return FALSE; + if (!(data->mad_Flags & MADF_CANDRAW)) /* not between show/hide */ + return FALSE; get(obj, MUIA_Parent, &parent); if (parent) { DoMethod(parent, MUIM_DrawBackground, msg->left, msg->top, - msg->width, msg->height, msg->xoffset, msg->yoffset, msg->flags); + msg->width, msg->height, msg->xoffset, msg->yoffset, + msg->flags); } else { - D(bug("Area_DrawParentBackground(%p) : MUIM_Window_DrawBackground\n", obj)); + D(bug + ("Area_DrawParentBackground(%p) : MUIM_Window_DrawBackground\n", + obj)); DoMethod(_win(obj), MUIM_Window_DrawBackground, msg->left, msg->top, - msg->width, msg->height, msg->xoffset, msg->yoffset, msg->flags); + msg->width, msg->height, msg->xoffset, msg->yoffset, + msg->flags); } return TRUE; } @@ -1303,26 +1368,28 @@ static IPTR Area__MUIM_DrawParentBackground(struct IClass *cl, Object *obj, stru /************************************************************************** MUIM_DrawBackground **************************************************************************/ -static IPTR Area__MUIM_DrawBackground(struct IClass *cl, Object *obj, struct MUIP_DrawBackground *msg) +static IPTR Area__MUIM_DrawBackground(struct IClass *cl, Object *obj, + struct MUIP_DrawBackground *msg) { struct MUI_AreaData *data = INST_DATA(cl, obj); struct MUI_ImageSpec_intern *bg; LONG state; - if (!(data->mad_Flags & MADF_CANDRAW)) /* not between show/hide */ - return FALSE; + if (!(data->mad_Flags & MADF_CANDRAW)) /* not between show/hide */ + return FALSE; - if ((msg->flags & MADF_SELECTED) && (msg->flags & MADF_SHOWSELSTATE) && data->mad_SelBack) - { + if ((msg->flags & MADF_SELECTED) && (msg->flags & MADF_SHOWSELSTATE) + && data->mad_SelBack) + { /* D(bug("Area_DrawBackground(%p): selected bg\n", obj)); */ bg = data->mad_SelBack; - state = IDS_SELECTED; + state = IDS_SELECTED; } else { /* D(bug("Area_DrawBackground(%p): normal bg\n", obj)); */ - bg = data->mad_Background; - state = IDS_NORMAL; + bg = data->mad_Background; + state = IDS_NORMAL; } const struct ZuneFrameGfx *zframe; @@ -1331,17 +1398,19 @@ static IPTR Area__MUIM_DrawBackground(struct IClass *cl, Object *obj, struct MUI if (!bg) { - D(bug("Area_DrawBackground(%p) : MUIM_DrawParentBackground\n", - obj)); + D(bug("Area_DrawBackground(%p) : MUIM_DrawParentBackground\n", + obj)); - return DoMethod(obj, MUIM_DrawParentBackground, msg->left, msg->top, - msg->width, msg->height, msg->xoffset, msg->yoffset, msg->flags); + return DoMethod(obj, MUIM_DrawParentBackground, msg->left, msg->top, + msg->width, msg->height, msg->xoffset, msg->yoffset, + msg->flags); } frame = get_intframe(obj, data, &tempframe); int xstate = frame->state; - if ((data->mad_Flags & MADF_SELECTED) && (data->mad_Flags & MADF_SHOWSELSTATE)) + if ((data->mad_Flags & MADF_SELECTED) + && (data->mad_Flags & MADF_SHOWSELSTATE)) xstate ^= 1; zframe = zune_zframe_get_with_state(obj, frame, xstate); @@ -1349,7 +1418,7 @@ static IPTR Area__MUIM_DrawBackground(struct IClass *cl, Object *obj, struct MUI if (zframe->customframe == NULL) { /* D(bug("Area_DrawBackground(%p): draw bg\n", obj)); */ - zune_imspec_draw(bg, data->mad_RenderInfo, + zune_imspec_draw(bg, data->mad_RenderInfo, msg->left, msg->top, msg->width, msg->height, msg->xoffset, msg->yoffset, state); @@ -1368,87 +1437,94 @@ static IPTR Area__MUIM_DrawBackground(struct IClass *cl, Object *obj, struct MUI } } - if (zframe->customframe) - { - zframe->draw(zframe->customframe, muiRenderInfo(obj), _left(obj), _top(obj), _width(obj), _height(obj), msg->left, msg->top, msg->width, msg->height); - } + if (zframe->customframe) + { + zframe->draw(zframe->customframe, muiRenderInfo(obj), _left(obj), + _top(obj), _width(obj), _height(obj), msg->left, msg->top, + msg->width, msg->height); + } return TRUE; } -static IPTR Area__MUIM_DrawBackgroundBuffered(struct IClass *cl, Object *obj, struct MUIP_DrawBackgroundBuffered *msg) +static IPTR Area__MUIM_DrawBackgroundBuffered(struct IClass *cl, + Object *obj, struct MUIP_DrawBackgroundBuffered *msg) { struct MUI_AreaData *data = INST_DATA(cl, obj); struct MUI_ImageSpec_intern *bg; LONG state = 0; - if (!(data->mad_Flags & MADF_CANDRAW)) /* not between show/hide */ - return FALSE; + if (!(data->mad_Flags & MADF_CANDRAW)) /* not between show/hide */ + return FALSE; bg = data->mad_Background; /* D(bug("Area_DrawBackground(%p): draw bg\n", obj)); */ zune_imspec_drawbuffered(bg, msg->rp, data->mad_RenderInfo, - msg->left, msg->top, msg->width, msg->height, - msg->xoffset+msg->left, msg->yoffset+msg->top, state, msg->left, msg->top, 1, - _mleft(obj), _mtop(obj), _mright(obj), _mbottom(obj)); + msg->left, msg->top, msg->width, msg->height, + msg->xoffset + msg->left, msg->yoffset + msg->top, state, msg->left, + msg->top, 1, _mleft(obj), _mtop(obj), _mright(obj), _mbottom(obj)); return TRUE; } /* Perverting the EventHandlerNode structure to specify a shortcut. */ -static void setup_control_char (struct MUI_AreaData *data, Object *obj, struct IClass *cl) +static void setup_control_char(struct MUI_AreaData *data, Object *obj, + struct IClass *cl) { if (data->mad_ControlChar != 0 || data->mad_Flags & MADF_CYCLECHAIN) { - data->mad_ccn.ehn_Events = data->mad_ControlChar; - switch (data->mad_InputMode) - { + data->mad_ccn.ehn_Events = data->mad_ControlChar; + switch (data->mad_InputMode) + { case MUIV_InputMode_RelVerify: - data->mad_ccn.ehn_Flags = MUIKEY_PRESS; - break; + data->mad_ccn.ehn_Flags = MUIKEY_PRESS; + break; case MUIV_InputMode_Toggle: - data->mad_ccn.ehn_Flags = MUIKEY_TOGGLE; - break; + data->mad_ccn.ehn_Flags = MUIKEY_TOGGLE; + break; case MUIV_InputMode_Immediate: - data->mad_ccn.ehn_Flags = MUIKEY_PRESS; - break; - } - data->mad_ccn.ehn_Priority = 0; - data->mad_ccn.ehn_Object = obj; - data->mad_ccn.ehn_Class = cl; - DoMethod(_win(obj), MUIM_Window_AddControlCharHandler, (IPTR)&data->mad_ccn); + data->mad_ccn.ehn_Flags = MUIKEY_PRESS; + break; + } + data->mad_ccn.ehn_Priority = 0; + data->mad_ccn.ehn_Object = obj; + data->mad_ccn.ehn_Class = cl; + DoMethod(_win(obj), MUIM_Window_AddControlCharHandler, + (IPTR) & data->mad_ccn); } } -static void cleanup_control_char (struct MUI_AreaData *data, Object *obj) +static void cleanup_control_char(struct MUI_AreaData *data, Object *obj) { if (data->mad_ControlChar != 0 || data->mad_Flags & MADF_CYCLECHAIN) { - DoMethod(_win(obj), - MUIM_Window_RemControlCharHandler, (IPTR)&data->mad_ccn); + DoMethod(_win(obj), + MUIM_Window_RemControlCharHandler, (IPTR) & data->mad_ccn); } } -static const struct MUI_FrameSpec_intern *get_intframe( - Object *obj, struct MUI_AreaData *data, struct MUI_FrameSpec_intern *tempstore) +static const struct MUI_FrameSpec_intern *get_intframe(Object *obj, + struct MUI_AreaData *data, struct MUI_FrameSpec_intern *tempstore) { if (data->mad_Frame > 100) { - /* Frame is spec in string format. Store it in tempstore and return a pointer - to it. The caller should have such a temp variable on the stack. Don't want - to add it to MUI_AreaData as that will increase mem usage of every object. */ - - if (zune_frame_spec_to_intern((CONST_STRPTR)data->mad_Frame, tempstore)) - { + /* Frame is spec in string format. Store it in tempstore and return + a pointer to it. The caller should have such a temp variable on + the stack. Don't want to add it to MUI_AreaData as that will + increase mem usage of every object. */ + + if (zune_frame_spec_to_intern((CONST_STRPTR) data->mad_Frame, + tempstore)) + { return tempstore; - } - else - { - return &muiGlobalInfo(obj)->mgi_Prefs->frames[MUIV_Frame_None]; - } + } + else + { + return &muiGlobalInfo(obj)->mgi_Prefs->frames[MUIV_Frame_None]; + } } else { @@ -1457,49 +1533,51 @@ static const struct MUI_FrameSpec_intern *get_intframe( } } -static void set_inner_sizes (Object *obj, struct MUI_AreaData *data) +static void set_inner_sizes(Object *obj, struct MUI_AreaData *data) { const struct MUI_FrameSpec_intern *frame; struct MUI_FrameSpec_intern tempframe; - + frame = get_intframe(obj, data, &tempframe); // Use frame inner spacing when not hardcoded if (!(data->mad_Flags & MADF_INNERLEFT)) - data->mad_InnerLeft = frame->innerLeft; + data->mad_InnerLeft = frame->innerLeft; if (!(data->mad_Flags & MADF_INNERTOP)) - data->mad_InnerTop = frame->innerTop; + data->mad_InnerTop = frame->innerTop; if (!(data->mad_Flags & MADF_INNERRIGHT)) - data->mad_InnerRight = frame->innerRight; + data->mad_InnerRight = frame->innerRight; if (!(data->mad_Flags & MADF_INNERBOTTOM)) - data->mad_InnerBottom = frame->innerBottom; + data->mad_InnerBottom = frame->innerBottom; } -static void set_title_sizes (Object *obj, struct MUI_AreaData *data) +static void set_title_sizes(Object *obj, struct MUI_AreaData *data) { if (data->mad_FrameTitle) { - const struct ZuneFrameGfx *zframe; - const struct MUI_FrameSpec_intern *frame; - struct MUI_FrameSpec_intern tempframe; - - frame = get_intframe(obj, data, &tempframe); - zframe = zune_zframe_get(obj, frame); + const struct ZuneFrameGfx *zframe; + const struct MUI_FrameSpec_intern *frame; + struct MUI_FrameSpec_intern tempframe; - _font(obj) = zune_font_get(obj, MUIV_Font_Title); + frame = get_intframe(obj, data, &tempframe); + zframe = zune_zframe_get(obj, frame); - switch (muiGlobalInfo(obj)->mgi_Prefs->group_title_position) - { + _font(obj) = zune_font_get(obj, MUIV_Font_Title); + + switch (muiGlobalInfo(obj)->mgi_Prefs->group_title_position) + { case GROUP_TITLE_POSITION_ABOVE: - data->mad_TitleHeightAbove = _font(obj)->tf_Baseline; - break; + data->mad_TitleHeightAbove = _font(obj)->tf_Baseline; + break; case GROUP_TITLE_POSITION_CENTERED: - data->mad_TitleHeightAbove = _font(obj)->tf_YSize / 2; - break; - } + data->mad_TitleHeightAbove = _font(obj)->tf_YSize / 2; + break; + } - data->mad_TitleHeightAdd = _font(obj)->tf_YSize - data->mad_InnerTop - zframe->itop; - data->mad_TitleHeightBelow = data->mad_TitleHeightAdd - data->mad_TitleHeightAbove; + data->mad_TitleHeightAdd = + _font(obj)->tf_YSize - data->mad_InnerTop - zframe->itop; + data->mad_TitleHeightBelow = + data->mad_TitleHeightAdd - data->mad_TitleHeightAbove; } } @@ -1509,25 +1587,26 @@ First method to be called after an OM_NEW, it is the place for all initializations depending on the environment, but not on the gadget size/position. Matched by MUIM_Cleanup. **************************************************************************/ -static IPTR Area__MUIM_Setup(struct IClass *cl, Object *obj, struct MUIP_Setup *msg) +static IPTR Area__MUIM_Setup(struct IClass *cl, Object *obj, + struct MUIP_Setup *msg) { struct MUI_AreaData *data = INST_DATA(cl, obj); const struct ZuneFrameGfx *zframe; const struct MUI_FrameSpec_intern *frame; struct MUI_FrameSpec_intern tempframe; - + muiRenderInfo(obj) = msg->RenderInfo; if (data->mad_Frame) { - /* no frame allowed for root object (see Area.doc) */ - Object *rootobj = NULL; - get(_win(obj), MUIA_Window_RootObject, &rootobj); - if (rootobj == obj) - { - data->mad_Frame = MUIV_Frame_None; - data->mad_FrameTitle = NULL; - } + /* no frame allowed for root object (see Area.doc) */ + Object *rootobj = NULL; + get(_win(obj), MUIA_Window_RootObject, &rootobj); + if (rootobj == obj) + { + data->mad_Frame = MUIV_Frame_None; + data->mad_FrameTitle = NULL; + } } set_inner_sizes(obj, data); @@ -1540,43 +1619,48 @@ static IPTR Area__MUIM_Setup(struct IClass *cl, Object *obj, struct MUIP_Setup * if (data->mad_Flags & MADF_OWNBG) { - data->mad_Background = zune_imspec_setup((IPTR)data->mad_BackgroundSpec, - muiRenderInfo(obj)); + data->mad_Background = + zune_imspec_setup((IPTR) data->mad_BackgroundSpec, + muiRenderInfo(obj)); } if ((data->mad_Flags & MADF_SHOWSELSTATE) && - (data->mad_InputMode != MUIV_InputMode_None)) + (data->mad_InputMode != MUIV_InputMode_None)) { - data->mad_SelBack = zune_imspec_setup(MUII_SelectedBack, muiRenderInfo(obj)); + data->mad_SelBack = + zune_imspec_setup(MUII_SelectedBack, muiRenderInfo(obj)); } if (data->mad_InputMode != MUIV_InputMode_None || data->mad_ContextMenu) { - data->mad_ehn.ehn_Events = IDCMP_MOUSEBUTTONS; - DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR)&data->mad_ehn); + data->mad_ehn.ehn_Events = IDCMP_MOUSEBUTTONS; + DoMethod(_win(obj), MUIM_Window_AddEventHandler, + (IPTR) & data->mad_ehn); } /* Those are filled by RequestIDCMP() */ if (data->mad_hiehn.ehn_Events) - DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR)&data->mad_hiehn); + DoMethod(_win(obj), MUIM_Window_AddEventHandler, + (IPTR) & data->mad_hiehn); - setup_control_char (data, obj, cl); + setup_control_char(data, obj, cl); // setup_cycle_chain (data, obj); if (data->mad_FontPreset == MUIV_Font_Inherit) { - if (_parent(obj) != NULL && _parent(obj) != _win(obj)) - data->mad_Font = _font(_parent(obj)); - else - { - D(bug("Area_Setup %p: getting normal font\n", obj)); - data->mad_Font = zune_font_get(obj, MUIV_Font_Normal); - D(bug("Area_Setup %p: got normal font %p\n", obj, data->mad_Font)); - } + if (_parent(obj) != NULL && _parent(obj) != _win(obj)) + data->mad_Font = _font(_parent(obj)); + else + { + D(bug("Area_Setup %p: getting normal font\n", obj)); + data->mad_Font = zune_font_get(obj, MUIV_Font_Normal); + D(bug("Area_Setup %p: got normal font %p\n", obj, + data->mad_Font)); + } } else { - data->mad_Font = zune_font_get(obj, data->mad_FontPreset); + data->mad_Font = zune_font_get(obj, data->mad_FontPreset); } _flags(obj) |= MADF_SETUP; @@ -1592,48 +1676,53 @@ static IPTR Area__MUIM_Setup(struct IClass *cl, Object *obj, struct MUIP_Setup * /************************************************************************** Called to match a MUIM_Setup, when environment is no more available. **************************************************************************/ -static IPTR Area__MUIM_Cleanup(struct IClass *cl, Object *obj, struct MUIP_Cleanup *msg) +static IPTR Area__MUIM_Cleanup(struct IClass *cl, Object *obj, + struct MUIP_Cleanup *msg) { struct MUI_AreaData *data = INST_DATA(cl, obj); _flags(obj) &= ~MADF_SETUP; // cleanup_cycle_chain (data, obj); - cleanup_control_char (data, obj); + cleanup_control_char(data, obj); if (data->mad_Timer.ihn_Millis) { - DoMethod(_app(obj), MUIM_Application_RemInputHandler, (IPTR)&data->mad_Timer); - data->mad_Timer.ihn_Millis = 0; + DoMethod(_app(obj), MUIM_Application_RemInputHandler, + (IPTR) & data->mad_Timer); + data->mad_Timer.ihn_Millis = 0; } /* Remove the handler if it is added */ if (data->mad_hiehn.ehn_Events) - DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR)&data->mad_hiehn); + DoMethod(_win(obj), MUIM_Window_RemEventHandler, + (IPTR) & data->mad_hiehn); /* Remove the event handler if it has been added */ if (data->mad_ehn.ehn_Events) - DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR)&data->mad_ehn); + DoMethod(_win(obj), MUIM_Window_RemEventHandler, + (IPTR) & data->mad_ehn); D(bug("Area cleanup %p active=%p\n", obj, - (Object *)XGET(_win(obj), MUIA_Window_ActiveObject))); - if (obj == (Object *)XGET(_win(obj), MUIA_Window_ActiveObject)) + (Object *) XGET(_win(obj), MUIA_Window_ActiveObject))); + if (obj == (Object *) XGET(_win(obj), MUIA_Window_ActiveObject)) { - D(bug("we are active, unset us\n")); - set(_win(obj), MUIA_Window_ActiveObject, MUIV_Window_ActiveObject_None); + D(bug("we are active, unset us\n")); + set(_win(obj), MUIA_Window_ActiveObject, + MUIV_Window_ActiveObject_None); } /* It's save to call the following function with NULL */ if ((data->mad_Flags & MADF_SHOWSELSTATE) && - (data->mad_InputMode != MUIV_InputMode_None)) + (data->mad_InputMode != MUIV_InputMode_None)) { - zune_imspec_cleanup(data->mad_SelBack); - data->mad_SelBack = NULL; + zune_imspec_cleanup(data->mad_SelBack); + data->mad_SelBack = NULL; } if (data->mad_Flags & MADF_OWNBG) { - zune_imspec_cleanup(data->mad_Background); - data->mad_Background = NULL; + zune_imspec_cleanup(data->mad_Background); + data->mad_Background = NULL; } muiRenderInfo(obj) = NULL; @@ -1647,16 +1736,17 @@ Called after the window is open and the area layouted, but before any drawing. Matched by one MUIM_Hide. Good place to init things depending on gadget size/position. **************************************************************************/ -static IPTR Area__MUIM_Show(struct IClass *cl, Object *obj, struct MUIP_Show *msg) +static IPTR Area__MUIM_Show(struct IClass *cl, Object *obj, + struct MUIP_Show *msg) { struct MUI_AreaData *data = INST_DATA(cl, obj); zune_imspec_show(data->mad_Background, obj); if (data->mad_Flags & MADF_SHOWSELSTATE - && data->mad_InputMode != MUIV_InputMode_None) + && data->mad_InputMode != MUIV_InputMode_None) { - zune_imspec_show(data->mad_SelBack, obj); + zune_imspec_show(data->mad_SelBack, obj); } return TRUE; @@ -1665,21 +1755,22 @@ static IPTR Area__MUIM_Show(struct IClass *cl, Object *obj, struct MUIP_Show *ms /************************************************************************** Called when the window is about to be closed, to match MUIM_Show. **************************************************************************/ -static IPTR Area__MUIM_Hide(struct IClass *cl, Object *obj, struct MUIP_Hide *msg) +static IPTR Area__MUIM_Hide(struct IClass *cl, Object *obj, + struct MUIP_Hide *msg) { struct MUI_AreaData *data = INST_DATA(cl, obj); zune_imspec_hide(data->mad_Background); if (data->mad_Flags & MADF_SHOWSELSTATE - && data->mad_InputMode != MUIV_InputMode_None) + && data->mad_InputMode != MUIV_InputMode_None) { - zune_imspec_hide(data->mad_SelBack); + zune_imspec_hide(data->mad_SelBack); } if (data->mad_ContextZMenu) { - zune_close_menu(data->mad_ContextZMenu); - data->mad_ContextZMenu = NULL; + zune_close_menu(data->mad_ContextZMenu); + data->mad_ContextZMenu = NULL; } return TRUE; @@ -1692,7 +1783,7 @@ static IPTR Area__MUIM_GoActive(struct IClass *cl, Object *obj, Msg msg) { //bug("Area_GoActive %p\n", obj); if (_flags(obj) & MADF_CANDRAW) - _zune_focus_new(obj, ZUNE_FOCUS_TYPE_ACTIVE_OBJ); + _zune_focus_new(obj, ZUNE_FOCUS_TYPE_ACTIVE_OBJ); return TRUE; } @@ -1703,7 +1794,7 @@ static IPTR Area__MUIM_GoInactive(struct IClass *cl, Object *obj, Msg msg) { //bug("Area_GoInactive %p\n", obj); if (_flags(obj) & MADF_CANDRAW) - _zune_focus_destroy(obj, ZUNE_FOCUS_TYPE_ACTIVE_OBJ); + _zune_focus_destroy(obj, ZUNE_FOCUS_TYPE_ACTIVE_OBJ); return TRUE; } @@ -1711,17 +1802,19 @@ static IPTR Area__MUIM_GoInactive(struct IClass *cl, Object *obj, Msg msg) This one or derived methods wont be called if short help is not set in area instdata. So set this to a dummy val if overriding **************************************************************************/ -static IPTR Area__MUIM_CreateShortHelp(struct IClass *cl, Object *obj, struct MUIP_CreateShortHelp *msg) +static IPTR Area__MUIM_CreateShortHelp(struct IClass *cl, Object *obj, + struct MUIP_CreateShortHelp *msg) { struct MUI_AreaData *data = INST_DATA(cl, obj); - return (IPTR)data->mad_ShortHelp; + return (IPTR) data->mad_ShortHelp; } /************************************************************************** ... **************************************************************************/ -static IPTR Area__MUIM_DeleteShortHelp(struct IClass *cl, Object *obj, struct MUIP_DeleteShortHelp *msg) +static IPTR Area__MUIM_DeleteShortHelp(struct IClass *cl, Object *obj, + struct MUIP_DeleteShortHelp *msg) { return TRUE; } @@ -1729,18 +1822,21 @@ static IPTR Area__MUIM_DeleteShortHelp(struct IClass *cl, Object *obj, struct MU /************************************************************************** ... **************************************************************************/ -static IPTR Area__MUIM_CreateBubble(struct IClass *cl, Object *obj, struct MUIP_CreateBubble *msg) +static IPTR Area__MUIM_CreateBubble(struct IClass *cl, Object *obj, + struct MUIP_CreateBubble *msg) { - return (IPTR)zune_bubble_create(obj, msg->x, msg->y, msg->txt, msg->flags); + return (IPTR) zune_bubble_create(obj, msg->x, msg->y, msg->txt, + msg->flags); } /************************************************************************** ... **************************************************************************/ -static IPTR Area__MUIM_DeleteBubble(struct IClass *cl, Object *obj, struct MUIP_DeleteBubble *msg) +static IPTR Area__MUIM_DeleteBubble(struct IClass *cl, Object *obj, + struct MUIP_DeleteBubble *msg) { zune_bubble_delete(obj, msg->bubble); - + return TRUE; } @@ -1756,31 +1852,31 @@ static void handle_press(struct IClass *cl, Object *obj) if (!data->mad_Timer.ihn_Millis) { data->mad_Timer.ihn_Millis = 300; - DoMethod(_app(obj), MUIM_Application_AddInputHandler, (IPTR)&data->mad_Timer); + DoMethod(_app(obj), MUIM_Application_AddInputHandler, + (IPTR) & data->mad_Timer); } SetAttrs(obj, MUIA_Selected, TRUE, MUIA_Pressed, TRUE, TAG_DONE); break; case MUIV_InputMode_Immediate: - { - IPTR selected = FALSE; - - get(obj, MUIA_Selected, &selected); - if (selected) { + IPTR selected = FALSE; + + get(obj, MUIA_Selected, &selected); + if (selected) + { /* D(bug("handle_press(%p) : nnset MUIA_Selected FALSE\n", obj)); */ - nnset(obj, MUIA_Selected, FALSE); - } + nnset(obj, MUIA_Selected, FALSE); + } /* D(bug("handle_press(%p) : set MUIA_Selected TRUE\n", obj)); */ - set(obj, MUIA_Selected, TRUE); + set(obj, MUIA_Selected, TRUE); /* D(bug("handle_press(%p) : done\n", obj)); */ - break; - } + break; + } case MUIV_InputMode_Toggle: // although undocumented, MUI sets MUIA_Pressed too SetAttrs(obj, MUIA_Selected, !(data->mad_Flags & MADF_SELECTED), - MUIA_Pressed, !(data->mad_Flags & MADF_PRESSED), - TAG_DONE); + MUIA_Pressed, !(data->mad_Flags & MADF_PRESSED), TAG_DONE); break; } } @@ -1792,275 +1888,317 @@ static void handle_release(struct IClass *cl, Object *obj, int cancel) if (data->mad_InputMode == MUIV_InputMode_RelVerify) { - if (data->mad_Flags & MADF_SELECTED) - { - if (cancel) - nnset(obj, MUIA_Pressed, FALSE); - else - set(obj, MUIA_Pressed, FALSE); - - set(obj, MUIA_Selected, FALSE); - } + if (data->mad_Flags & MADF_SELECTED) + { + if (cancel) + nnset(obj, MUIA_Pressed, FALSE); + else + set(obj, MUIA_Pressed, FALSE); + + set(obj, MUIA_Selected, FALSE); + } } if (data->mad_Timer.ihn_Millis) { - DoMethod(_app(obj), MUIM_Application_RemInputHandler, (IPTR)&data->mad_Timer); + DoMethod(_app(obj), MUIM_Application_RemInputHandler, + (IPTR) & data->mad_Timer); data->mad_Timer.ihn_Millis = 0; } } -static IPTR event_button(Class *cl, Object *obj, struct IntuiMessage *imsg) +static IPTR event_button(Class *cl, Object *obj, + struct IntuiMessage *imsg) { struct MUI_AreaData *data = INST_DATA(cl, obj); BOOL in = _between(_left(obj), imsg->MouseX, _right(obj)) - && _between(_top(obj), imsg->MouseY, _bottom(obj)); + && _between(_top(obj), imsg->MouseY, _bottom(obj)); switch (imsg->Code) { - case SELECTDOWN: + case SELECTDOWN: if (data->mad_InputMode == MUIV_InputMode_None) break; if (in) { -// set(_win(obj), MUIA_Window_ActiveObject, obj); +// set(_win(obj), MUIA_Window_ActiveObject, obj); data->mad_ClickX = imsg->MouseX; data->mad_ClickY = imsg->MouseY; - if ((data->mad_InputMode != MUIV_InputMode_Toggle) && (data->mad_Flags & MADF_SELECTED)) - break; - nnset(obj,MUIA_Timer,0); + if ((data->mad_InputMode != MUIV_InputMode_Toggle) + && (data->mad_Flags & MADF_SELECTED)) + break; + nnset(obj, MUIA_Timer, 0); if (data->mad_InputMode == MUIV_InputMode_RelVerify) { - if (data->mad_ehn.ehn_Events) DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR)&data->mad_ehn); - data->mad_ehn.ehn_Events |= IDCMP_MOUSEMOVE | IDCMP_RAWKEY; - DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR)&data->mad_ehn); - } + if (data->mad_ehn.ehn_Events) + DoMethod(_win(obj), MUIM_Window_RemEventHandler, + (IPTR) & data->mad_ehn); + data->mad_ehn.ehn_Events |= IDCMP_MOUSEMOVE | IDCMP_RAWKEY; + DoMethod(_win(obj), MUIM_Window_AddEventHandler, + (IPTR) & data->mad_ehn); + } handle_press(cl, obj); return MUI_EventHandlerRC_Eat; } - case SELECTUP: + case SELECTUP: if (data->mad_InputMode == MUIV_InputMode_None) break; if (data->mad_ehn.ehn_Events != IDCMP_MOUSEBUTTONS) { - DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR)&data->mad_ehn); - data->mad_ehn.ehn_Events = IDCMP_MOUSEBUTTONS; - DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR)&data->mad_ehn); - if (!in) nnset(obj, MUIA_Pressed, FALSE); - handle_release(cl, obj, FALSE /*cancel*/ ); + DoMethod(_win(obj), MUIM_Window_RemEventHandler, + (IPTR) & data->mad_ehn); + data->mad_ehn.ehn_Events = IDCMP_MOUSEBUTTONS; + DoMethod(_win(obj), MUIM_Window_AddEventHandler, + (IPTR) & data->mad_ehn); + if (!in) + nnset(obj, MUIA_Pressed, FALSE); + handle_release(cl, obj, FALSE /*cancel */ ); return MUI_EventHandlerRC_Eat; } break; - case MENUDOWN: + case MENUDOWN: if (in && data->mad_ContextMenu) { - Object *menuobj = (Object*)DoMethod(obj, MUIM_ContextMenuBuild, imsg->MouseX, imsg->MouseY); + Object *menuobj = + (Object *) DoMethod(obj, MUIM_ContextMenuBuild, + imsg->MouseX, imsg->MouseY); if (menuobj) { - struct NewMenu *newmenu = NULL; - - /* stegerg: HACKME, CHECKME! The menu/menu item objs should automatically - be connected (parentobject setup) without need for - this, but they aren't. Because of how family class is and - is used by other classes, I think!? */ - DoMethod(menuobj, MUIM_ConnectParent, obj); - - get(menuobj,MUIA_Menuitem_NewMenu,&newmenu); - if (newmenu) - { - if (data->mad_ContextZMenu) zune_close_menu(data->mad_ContextZMenu); - data->mad_ContextZMenu = zune_open_menu(_window(obj),newmenu); - } + struct NewMenu *newmenu = NULL; - if (data->mad_ehn.ehn_Events) DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR)&data->mad_ehn); - data->mad_ehn.ehn_Events |= IDCMP_MOUSEMOVE; - DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR)&data->mad_ehn); - } - return MUI_EventHandlerRC_Eat; + /* stegerg: HACKME, CHECKME! The menu/menu item objs should + automatically be connected (parentobject setup) without + need for this, but they aren't. Because of how family + class is and is used by other classes, I think!? */ + DoMethod(menuobj, MUIM_ConnectParent, obj); + + get(menuobj, MUIA_Menuitem_NewMenu, &newmenu); + if (newmenu) + { + if (data->mad_ContextZMenu) + zune_close_menu(data->mad_ContextZMenu); + data->mad_ContextZMenu = + zune_open_menu(_window(obj), newmenu); + } + + if (data->mad_ehn.ehn_Events) + DoMethod(_win(obj), MUIM_Window_RemEventHandler, + (IPTR) & data->mad_ehn); + data->mad_ehn.ehn_Events |= IDCMP_MOUSEMOVE; + DoMethod(_win(obj), MUIM_Window_AddEventHandler, + (IPTR) & data->mad_ehn); } - break; + return MUI_EventHandlerRC_Eat; + } + break; - case MENUUP: + case MENUUP: if (data->mad_ContextZMenu) { struct MenuItem *item = zune_leave_menu(data->mad_ContextZMenu); - DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR)&data->mad_ehn); - data->mad_ehn.ehn_Events = IDCMP_MOUSEBUTTONS; - DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR)&data->mad_ehn); - + DoMethod(_win(obj), MUIM_Window_RemEventHandler, + (IPTR) & data->mad_ehn); + data->mad_ehn.ehn_Events = IDCMP_MOUSEBUTTONS; + DoMethod(_win(obj), MUIM_Window_AddEventHandler, + (IPTR) & data->mad_ehn); + if (item) { - Object *itemobj = (Object*)GTMENUITEM_USERDATA(item); - - /* CHECKME: MUIA_MenuItem_Trigger should probably be set inside - MUIM_ContextMenuChoice!? But there I only know about - itemobj, not MenuItem itself! */ + Object *itemobj = (Object *) GTMENUITEM_USERDATA(item); + + /* CHECKME: MUIA_MenuItem_Trigger should probably be set inside + MUIM_ContextMenuChoice!? But there I only know about + itemobj, not MenuItem itself! */ if (item->Flags & CHECKIT) - { - set(itemobj, MUIA_Menuitem_Checked, !!(item->Flags & CHECKED)); - - } /* if (item->Flags & CHECKIT) */ - - set(itemobj, MUIA_Menuitem_Trigger, item); - - DoMethod(obj, MUIM_ContextMenuChoice, itemobj); - - } /* if (item) */ - + { + set(itemobj, MUIA_Menuitem_Checked, + ! !(item->Flags & CHECKED)); + + } + + set(itemobj, MUIA_Menuitem_Trigger, item); + + DoMethod(obj, MUIM_ContextMenuChoice, itemobj); + + } + zune_close_menu(data->mad_ContextZMenu); data->mad_ContextZMenu = NULL; - - return MUI_EventHandlerRC_Eat; - - } /* if (data->mad_ContextZMenu) */ + + return MUI_EventHandlerRC_Eat; + + } break; } return 0; } -static IPTR event_motion(Class *cl, Object *obj, struct IntuiMessage *imsg) +static IPTR event_motion(Class *cl, Object *obj, + struct IntuiMessage *imsg) { struct MUI_AreaData *data = INST_DATA(cl, obj); if ((imsg->Qualifier & IEQUALIFIER_RBUTTON) && data->mad_ContextZMenu) { - zune_mouse_update(data->mad_ContextZMenu, 0); - return MUI_EventHandlerRC_Eat; + zune_mouse_update(data->mad_ContextZMenu, 0); + return MUI_EventHandlerRC_Eat; } if (imsg->Qualifier & IEQUALIFIER_LEFTBUTTON) { - BOOL in = _between(_left(obj), imsg->MouseX, _right(obj)) - && _between(_top(obj), imsg->MouseY, _bottom(obj)); + BOOL in = _between(_left(obj), imsg->MouseX, _right(obj)) + && _between(_top(obj), imsg->MouseY, _bottom(obj)); - if (in) - { - if ((data->mad_Flags & MADF_DRAGGABLE) && ((abs(data->mad_ClickX-imsg->MouseX) >= 3) || (abs(data->mad_ClickY-imsg->MouseY)>=3))) - /* should be user configurable */ + if (in) { - if (data->mad_InputMode == MUIV_InputMode_RelVerify) - set(obj, MUIA_Selected, FALSE); - nnset(obj, MUIA_Pressed, FALSE); + if ((data->mad_Flags & MADF_DRAGGABLE) + && ((abs(data->mad_ClickX - imsg->MouseX) >= 3) + || (abs(data->mad_ClickY - imsg->MouseY) >= 3))) + /* should be user configurable */ + { + if (data->mad_InputMode == MUIV_InputMode_RelVerify) + set(obj, MUIA_Selected, FALSE); + nnset(obj, MUIA_Pressed, FALSE); - if (data->mad_ehn.ehn_Events) DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR)&data->mad_ehn); - data->mad_ehn.ehn_Events = IDCMP_MOUSEBUTTONS; - DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR)&data->mad_ehn); - if (data->mad_Timer.ihn_Millis) - { - DoMethod(_app(obj), MUIM_Application_RemInputHandler, (IPTR)&data->mad_Timer); - data->mad_Timer.ihn_Millis = 0; - } + if (data->mad_ehn.ehn_Events) + DoMethod(_win(obj), MUIM_Window_RemEventHandler, + (IPTR) & data->mad_ehn); + data->mad_ehn.ehn_Events = IDCMP_MOUSEBUTTONS; + DoMethod(_win(obj), MUIM_Window_AddEventHandler, + (IPTR) & data->mad_ehn); + if (data->mad_Timer.ihn_Millis) + { + DoMethod(_app(obj), MUIM_Application_RemInputHandler, + (IPTR) & data->mad_Timer); + data->mad_Timer.ihn_Millis = 0; + } - DoMethod(obj,MUIM_DoDrag, data->mad_ClickX - _left(obj), data->mad_ClickY - _top(obj), 0); - return MUI_EventHandlerRC_Eat; + DoMethod(obj, MUIM_DoDrag, data->mad_ClickX - _left(obj), + data->mad_ClickY - _top(obj), 0); + return MUI_EventHandlerRC_Eat; + } } - } - if (data->mad_InputMode == MUIV_InputMode_RelVerify) - { - if (!in && (data->mad_Flags & MADF_SELECTED)) /* going out */ - { - set(obj, MUIA_Selected, FALSE); - } - else if (in && !(data->mad_Flags & MADF_SELECTED)) /* going in */ + if (data->mad_InputMode == MUIV_InputMode_RelVerify) { - set(obj, MUIA_Selected, TRUE); + if (!in && (data->mad_Flags & MADF_SELECTED)) /* going out */ + { + set(obj, MUIA_Selected, FALSE); + } + else if (in && !(data->mad_Flags & MADF_SELECTED)) /* going in */ + { + set(obj, MUIA_Selected, TRUE); + } } } - } return MUI_EventHandlerRC_Eat; } /************************************************************************** ... **************************************************************************/ -static IPTR Area__MUIM_HandleEvent(struct IClass *cl, Object *obj, struct MUIP_HandleEvent *msg) +static IPTR Area__MUIM_HandleEvent(struct IClass *cl, Object *obj, + struct MUIP_HandleEvent *msg) { struct MUI_AreaData *data = INST_DATA(cl, obj); - //bug("Area_HandleEvent [%p] imsg=%p muikey=%ld\n", obj, msg->imsg, msg->muikey); - if (data->mad_DisableCount) return 0; - if (data->mad_InputMode == MUIV_InputMode_None && !data->mad_ContextMenu) return 0; + //bug("Area_HandleEvent [%p] imsg=%p muikey=%ld\n", obj, msg->imsg, + // msg->muikey); + if (data->mad_DisableCount) + return 0; + if (data->mad_InputMode == MUIV_InputMode_None + && !data->mad_ContextMenu) + return 0; if (msg->muikey != MUIKEY_NONE) { - switch (msg->muikey) - { - case MUIKEY_PRESS: + switch (msg->muikey) + { + case MUIKEY_PRESS: if (data->mad_Flags & MADF_SELECTED) - break; + break; if (data->mad_ehn.ehn_Events) - DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR)&data->mad_ehn); + DoMethod(_win(obj), MUIM_Window_RemEventHandler, + (IPTR) & data->mad_ehn); data->mad_ehn.ehn_Events |= IDCMP_RAWKEY; - DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR)&data->mad_ehn); + DoMethod(_win(obj), MUIM_Window_AddEventHandler, + (IPTR) & data->mad_ehn); handle_press(cl, obj); return MUI_EventHandlerRC_Eat; - case MUIKEY_TOGGLE: + case MUIKEY_TOGGLE: if (data->mad_InputMode == MUIV_InputMode_Toggle) - set(obj, MUIA_Selected, !(data->mad_Flags & MADF_SELECTED)); + set(obj, MUIA_Selected, !(data->mad_Flags & MADF_SELECTED)); return MUI_EventHandlerRC_Eat; - case MUIKEY_RELEASE: + case MUIKEY_RELEASE: if (data->mad_ehn.ehn_Events) - DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR)&data->mad_ehn); + DoMethod(_win(obj), MUIM_Window_RemEventHandler, + (IPTR) & data->mad_ehn); data->mad_ehn.ehn_Events = IDCMP_MOUSEBUTTONS; - DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR)&data->mad_ehn); - handle_release(cl, obj, FALSE /* cancel */); + DoMethod(_win(obj), MUIM_Window_AddEventHandler, + (IPTR) & data->mad_ehn); + handle_release(cl, obj, FALSE /* cancel */ ); return MUI_EventHandlerRC_Eat; - } - return 0; + } + return 0; } if (msg->imsg) { - switch (msg->imsg->Class) - { - case IDCMP_MOUSEBUTTONS: return event_button(cl, obj, msg->imsg); - case IDCMP_MOUSEMOVE: return event_motion(cl, obj, msg->imsg); - case IDCMP_RAWKEY: - { - unsigned char code; - UWORD msg_code; - /* Remove the up prefix as convert key does not convert a upkey event */ - msg_code = msg->imsg->Code; - msg->imsg->Code &= ~IECODE_UP_PREFIX; - code = ConvertKey(msg->imsg); - msg->imsg->Code = msg_code; - - if (code != 0 && code == data->mad_ControlChar) + switch (msg->imsg->Class) { - if (msg->imsg->Code & IECODE_UP_PREFIX) - { - msg->muikey = MUIKEY_RELEASE; - } - else + case IDCMP_MOUSEBUTTONS: + return event_button(cl, obj, msg->imsg); + case IDCMP_MOUSEMOVE: + return event_motion(cl, obj, msg->imsg); + case IDCMP_RAWKEY: { - msg->muikey = MUIKEY_PRESS; - } - msg->imsg = NULL; - return Area__MUIM_HandleEvent(cl, obj, msg); - } + unsigned char code; + UWORD msg_code; + /* Remove the up prefix as convert key does not convert an + * upkey event */ + msg_code = msg->imsg->Code; + msg->imsg->Code &= ~IECODE_UP_PREFIX; + code = ConvertKey(msg->imsg); + msg->imsg->Code = msg_code; + + if (code != 0 && code == data->mad_ControlChar) + { + if (msg->imsg->Code & IECODE_UP_PREFIX) + { + msg->muikey = MUIKEY_RELEASE; + } + else + { + msg->muikey = MUIKEY_PRESS; + } + msg->imsg = NULL; + return Area__MUIM_HandleEvent(cl, obj, msg); + } - if (msg->imsg->Qualifier & (IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT)) - { - DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR)&data->mad_ehn); - data->mad_ehn.ehn_Events = IDCMP_MOUSEBUTTONS; - DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR)&data->mad_ehn); - handle_release(cl,obj, TRUE /*cancel */); - } - return MUI_EventHandlerRC_Eat; + if (msg->imsg-> + Qualifier & (IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT)) + { + DoMethod(_win(obj), MUIM_Window_RemEventHandler, + (IPTR) & data->mad_ehn); + data->mad_ehn.ehn_Events = IDCMP_MOUSEBUTTONS; + DoMethod(_win(obj), MUIM_Window_AddEventHandler, + (IPTR) & data->mad_ehn); + handle_release(cl, obj, TRUE /*cancel */ ); + } + return MUI_EventHandlerRC_Eat; + } + break; } - break; - } } return 0; } @@ -2068,26 +2206,29 @@ static IPTR Area__MUIM_HandleEvent(struct IClass *cl, Object *obj, struct MUIP_H /************************************************************************** ... **************************************************************************/ -static IPTR Area__MUIM_HandleInput(struct IClass *cl, Object *obj, struct MUIP_HandleInput *msg) +static IPTR Area__MUIM_HandleInput(struct IClass *cl, Object *obj, + struct MUIP_HandleInput *msg) { - /* Actually a dummy, but real MUI does handle here the input stuff which Zune - ** has in Area_HandleEvent. For compatibility we should do this too - **/ - //bug("Area_HandleEvent [%p] imsg=%p muikey=%ld\b", obj, msg->imsg, msg->muikey); + /* Actually a dummy, but real MUI does handle here the input stuff which + * Zune has in Area_HandleEvent. For compatibility we should do this too */ + //bug("Area_HandleEvent [%p] imsg=%p muikey=%ld\b", obj, msg->imsg, + // msg->muikey); return 0; } /************************************************************************** Trivial; custom classes may override this to get dynamic menus. **************************************************************************/ -static IPTR Area__MUIM_ContextMenuBuild(struct IClass *cl, Object *obj, struct MUIP_ContextMenuBuild *msg) +static IPTR Area__MUIM_ContextMenuBuild(struct IClass *cl, Object *obj, + struct MUIP_ContextMenuBuild *msg) { struct MUI_AreaData *data = INST_DATA(cl, obj); - return (IPTR)data->mad_ContextMenu; /* a Menustrip object */ + return (IPTR) data->mad_ContextMenu; /* a Menustrip object */ } /**************************************************************************/ -static IPTR Area__MUIM_ContextMenuChoice(struct IClass *cl, Object *obj, struct MUIP_ContextMenuChoice *msg) +static IPTR Area__MUIM_ContextMenuChoice(struct IClass *cl, Object *obj, + struct MUIP_ContextMenuChoice *msg) { set(obj, MUIA_ContextMenuTrigger, msg->item); return 0; @@ -2097,15 +2238,17 @@ static IPTR Area__MUIM_ContextMenuChoice(struct IClass *cl, Object *obj, struct /************************************************************************** MUIM_Export : to export an objects "contents" to a dataspace object. **************************************************************************/ -static IPTR Area__MUIM_Export(struct IClass *cl, Object *obj, struct MUIP_Export *msg) +static IPTR Area__MUIM_Export(struct IClass *cl, Object *obj, + struct MUIP_Export *msg) { struct MUI_AreaData *data = INST_DATA(cl, obj); ULONG id; if ((id = muiNotifyData(obj)->mnd_ObjectID)) { - char selected = (data->mad_Flags & MADF_SELECTED)?1:0; - DoMethod(msg->dataspace, MUIM_Dataspace_Add, (IPTR)&selected, sizeof(char),(IPTR)id); + char selected = (data->mad_Flags & MADF_SELECTED) ? 1 : 0; + DoMethod(msg->dataspace, MUIM_Dataspace_Add, (IPTR) & selected, + sizeof(char), (IPTR) id); } return 0; } @@ -2114,13 +2257,16 @@ static IPTR Area__MUIM_Export(struct IClass *cl, Object *obj, struct MUIP_Export /************************************************************************** MUIM_Import : to import an objects "contents" from a dataspace object. **************************************************************************/ -static IPTR Area__MUIM_Import(struct IClass *cl, Object *obj, struct MUIP_Import *msg) +static IPTR Area__MUIM_Import(struct IClass *cl, Object *obj, + struct MUIP_Import *msg) { ULONG id; if ((id = muiNotifyData(obj)->mnd_ObjectID)) { - char *selected = (char*)DoMethod(msg->dataspace, MUIM_Dataspace_Find, (IPTR)id); + char *selected = + (char *)DoMethod(msg->dataspace, MUIM_Dataspace_Find, + (IPTR) id); if (selected) set(obj, MUIA_Selected, *selected); @@ -2135,52 +2281,67 @@ static IPTR Area__MUIM_Timer(struct IClass *cl, Object *obj, Msg msg) { struct MUI_AreaData *data = INST_DATA(cl, obj); if (data->mad_Timer.ihn_Millis) - DoMethod(_app(obj), MUIM_Application_RemInputHandler, (IPTR)&data->mad_Timer); + DoMethod(_app(obj), MUIM_Application_RemInputHandler, + (IPTR) & data->mad_Timer); data->mad_Timer.ihn_Millis = 50; - DoMethod(_app(obj), MUIM_Application_AddInputHandler, (IPTR)&data->mad_Timer); + DoMethod(_app(obj), MUIM_Application_AddInputHandler, + (IPTR) & data->mad_Timer); if (data->mad_Flags & MADF_SELECTED) - set(obj, MUIA_Timer, ++muiAreaData(obj)->mad_Timeval); + set(obj, MUIA_Timer, ++muiAreaData(obj)->mad_Timeval); return 0; } /************************************************************************** MUIM_DoDrag **************************************************************************/ -static IPTR Area__MUIM_DoDrag(struct IClass *cl, Object *obj, struct MUIP_DoDrag *msg) +static IPTR Area__MUIM_DoDrag(struct IClass *cl, Object *obj, + struct MUIP_DoDrag *msg) { //struct MUI_AreaData *data = INST_DATA(cl, obj); - DoMethod(_win(obj), MUIM_Window_DragObject, (IPTR)obj, msg->touchx, msg->touchy, msg->flags); + DoMethod(_win(obj), MUIM_Window_DragObject, (IPTR) obj, msg->touchx, + msg->touchy, msg->flags); return 0; } /************************************************************************** MUIM_CreateDragImage **************************************************************************/ -static IPTR Area__MUIM_CreateDragImage(struct IClass *cl, Object *obj, struct MUIP_CreateDragImage *msg) +static IPTR Area__MUIM_CreateDragImage(struct IClass *cl, Object *obj, + struct MUIP_CreateDragImage *msg) { - struct MUI_DragImage *img = (struct MUI_DragImage *)AllocVec(sizeof(struct MUIP_CreateDragImage),MEMF_CLEAR); + struct MUI_DragImage *img = + (struct MUI_DragImage *)AllocVec(sizeof(struct + MUIP_CreateDragImage), MEMF_CLEAR); if (img) { const struct ZuneFrameGfx *zframe; - LONG depth = GetBitMapAttr(_screen(obj)->RastPort.BitMap,BMA_DEPTH); + LONG depth = + GetBitMapAttr(_screen(obj)->RastPort.BitMap, BMA_DEPTH); - zframe = zune_zframe_get(obj, &muiGlobalInfo(obj)->mgi_Prefs->frames[MUIV_Frame_Drag]); + zframe = + zune_zframe_get(obj, + &muiGlobalInfo(obj)->mgi_Prefs->frames[MUIV_Frame_Drag]); img->width = _width(obj) + zframe->ileft + zframe->iright; img->height = _height(obj) + zframe->itop + zframe->ibottom; - if ((img->bm = AllocBitMap(img->width,img->height,depth,BMF_MINPLANES,_screen(obj)->RastPort.BitMap))) + if ((img->bm = + AllocBitMap(img->width, img->height, depth, BMF_MINPLANES, + _screen(obj)->RastPort.BitMap))) { /* Render the stuff now */ struct RastPort *rp_save = muiRenderInfo(obj)->mri_RastPort; struct RastPort temprp; InitRastPort(&temprp); temprp.BitMap = img->bm; - ClipBlit(_rp(obj),_left(obj),_top(obj),&temprp,zframe->ileft,zframe->itop,_width(obj),_height(obj),0xc0); + ClipBlit(_rp(obj), _left(obj), _top(obj), &temprp, + zframe->ileft, zframe->itop, _width(obj), _height(obj), + 0xc0); muiRenderInfo(obj)->mri_RastPort = &temprp; - zframe->draw(zframe->customframe, muiRenderInfo(obj), 0, 0, img->width, img->height, 0, 0, img->width, img->height); + zframe->draw(zframe->customframe, muiRenderInfo(obj), 0, 0, + img->width, img->height, 0, 0, img->width, img->height); muiRenderInfo(obj)->mri_RastPort = rp_save; } @@ -2188,18 +2349,20 @@ static IPTR Area__MUIM_CreateDragImage(struct IClass *cl, Object *obj, struct MU img->touchy = msg->touchy; img->flags = 0; } - return (IPTR)img; + return (IPTR) img; } /************************************************************************** MUIM_DeleteDragImage **************************************************************************/ -static IPTR Area__MUIM_DeleteDragImage(struct IClass *cl, Object *obj, struct MUIP_DeleteDragImage *msg) +static IPTR Area__MUIM_DeleteDragImage(struct IClass *cl, Object *obj, + struct MUIP_DeleteDragImage *msg) { if (msg->di) { - if (msg->di->bm) FreeBitMap(msg->di->bm); - FreeVec(msg->di); + if (msg->di->bm) + FreeBitMap(msg->di->bm); + FreeVec(msg->di); } return 0; } @@ -2207,16 +2370,19 @@ static IPTR Area__MUIM_DeleteDragImage(struct IClass *cl, Object *obj, struct MU /************************************************************************** MUIM_DragQueryExtended **************************************************************************/ -static IPTR Area__MUIM_DragQueryExtended(struct IClass *cl, Object *obj, struct MUIP_DragQueryExtended *msg) +static IPTR Area__MUIM_DragQueryExtended(struct IClass *cl, Object *obj, + struct MUIP_DragQueryExtended *msg) { struct MUI_AreaData *data = INST_DATA(cl, obj); if (data->mad_Flags & MADF_DROPABLE) { - if (_left(obj) <= msg->x && msg->x <= _right(obj) && _top(obj) <= msg->y && msg->y <= _bottom(obj)) - { - if (DoMethod(obj,MUIM_DragQuery,(IPTR)msg->obj) == MUIV_DragQuery_Accept) - return (IPTR)obj; - } + if (_left(obj) <= msg->x && msg->x <= _right(obj) + && _top(obj) <= msg->y && msg->y <= _bottom(obj)) + { + if (DoMethod(obj, MUIM_DragQuery, + (IPTR) msg->obj) == MUIV_DragQuery_Accept) + return (IPTR) obj; + } } return 0; } @@ -2224,7 +2390,8 @@ static IPTR Area__MUIM_DragQueryExtended(struct IClass *cl, Object *obj, struct /************************************************************************** MUIM_DragBegin **************************************************************************/ -static IPTR Area__MUIM_DragBegin(struct IClass *cl, Object *obj, struct MUIP_DragBegin *msg) +static IPTR Area__MUIM_DragBegin(struct IClass *cl, Object *obj, + struct MUIP_DragBegin *msg) { //struct MUI_AreaData *data = INST_DATA(cl, obj); _zune_focus_new(obj, ZUNE_FOCUS_TYPE_DROP_OBJ); @@ -2234,7 +2401,8 @@ static IPTR Area__MUIM_DragBegin(struct IClass *cl, Object *obj, struct MUIP_Dra /************************************************************************** MUIM_DragFinish **************************************************************************/ -static IPTR Area__MUIM_DragFinish(struct IClass *cl, Object *obj, struct MUIP_DragFinish *msg) +static IPTR Area__MUIM_DragFinish(struct IClass *cl, Object *obj, + struct MUIP_DragFinish *msg) { //struct MUI_AreaData *data = INST_DATA(cl, obj); _zune_focus_destroy(obj, ZUNE_FOCUS_TYPE_DROP_OBJ); @@ -2248,13 +2416,14 @@ static IPTR Area__MUIM_DragFinish(struct IClass *cl, Object *obj, struct MUIP_Dr * Depends on inner sizes and frame */ static void area_update_msizes(Object *obj, struct MUI_AreaData *data, - const struct MUI_FrameSpec_intern *frame, - const struct ZuneFrameGfx *zframe) + const struct MUI_FrameSpec_intern *frame, + const struct ZuneFrameGfx *zframe) { /* if (XGET(obj, MUIA_UserData) == 42) */ /* { */ -/* D(bug("area_update_msizes(%p) : ileft=%ld itop=%ld\n", obj, zframe->ileft, zframe->itop)); */ +/* D(bug("area_update_msizes(%p) : ileft=%ld itop=%ld\n", obj, */ +/* zframe->ileft, zframe->itop)); */ /* } */ struct dt_frame_image *fi = zframe->customframe; @@ -2265,36 +2434,44 @@ static void area_update_msizes(Object *obj, struct MUI_AreaData *data, //UWORD h = fi->tile_top + fi->tile_bottom; data->mad_addleft = data->mad_InnerLeft + zframe->ileft; - data->mad_subwidth = data->mad_addleft + data->mad_InnerRight + zframe->iright; - data->mad_addtop = data->mad_InnerTop + data->mad_TitleHeightAdd + zframe->itop; - data->mad_subheight = data->mad_addtop + data->mad_InnerBottom + zframe->ibottom; + data->mad_subwidth = + data->mad_addleft + data->mad_InnerRight + zframe->iright; + data->mad_addtop = + data->mad_InnerTop + data->mad_TitleHeightAdd + zframe->itop; + data->mad_subheight = + data->mad_addtop + data->mad_InnerBottom + zframe->ibottom; } else { data->mad_addleft = data->mad_InnerLeft + zframe->ileft; - data->mad_subwidth = data->mad_addleft + data->mad_InnerRight + zframe->iright; - data->mad_addtop = data->mad_InnerTop + data->mad_TitleHeightAdd + zframe->itop; - data->mad_subheight = data->mad_addtop + data->mad_InnerBottom + zframe->ibottom; + data->mad_subwidth = + data->mad_addleft + data->mad_InnerRight + zframe->iright; + data->mad_addtop = + data->mad_InnerTop + data->mad_TitleHeightAdd + zframe->itop; + data->mad_subheight = + data->mad_addtop + data->mad_InnerBottom + zframe->ibottom; } if (data->mad_Flags & MADF_FRAMEPHANTOM) { - data->mad_addleft = 0; - data->mad_subwidth = 0; + data->mad_addleft = 0; + data->mad_subwidth = 0; } // clamping ... maybe ? -/* D(bug("area_update_msizes(%x,%d) => addleft/top=%d/%d, subwidth/height=%d/%d\n", */ -/* obj, data->mad_Frame, data->mad_addleft, data->mad_addtop, data->mad_subwidth, data->mad_subheight)); */ +/* D(bug("area_update_msizes(%x,%d) => addleft/top=%d/%d, " */ +/* "subwidth/height=%d/%d\n", */ +/* obj, data->mad_Frame, data->mad_addleft, data->mad_addtop, */ +/* data->mad_subwidth, data->mad_subheight)); */ } /************************************************************************** MUIM_Area_UnknownDropDestination **************************************************************************/ -IPTR Area__MUIM_UnknownDropDestination(struct IClass *cl, Object *obj, struct MUIP_UnknownDropDestination *msg) +IPTR Area__MUIM_UnknownDropDestination(struct IClass *cl, Object *obj, + struct MUIP_UnknownDropDestination *msg) { - return 0; } @@ -2303,89 +2480,128 @@ MUIM_UpdateInnerSizes - Updates the innersizes of an object. You actually should only call this method if the dimensions of an object would not be affected, otherwise the results are unexpected **************************************************************************/ -static IPTR Area__MUIM_UpdateInnerSizes(struct IClass *cl, Object *obj, struct MUIP_UpdateInnerSizes *msg) +static IPTR Area__MUIM_UpdateInnerSizes(struct IClass *cl, Object *obj, + struct MUIP_UpdateInnerSizes *msg) { struct MUI_AreaData *data = INST_DATA(cl, obj); const struct ZuneFrameGfx *zframe; const struct MUI_FrameSpec_intern *frame; struct MUI_FrameSpec_intern tempframe; - + if (_flags(obj) & MADF_SETUP) { - frame = get_intframe(obj, data, &tempframe); - zframe = zune_zframe_get(obj, frame); + frame = get_intframe(obj, data, &tempframe); + zframe = zune_zframe_get(obj, frame); area_update_msizes(obj, data, frame, zframe); } return 1; } static IPTR Area__MUIM_FindAreaObject(struct IClass *cl, Object *obj, - struct MUIP_FindAreaObject *msg) + struct MUIP_FindAreaObject *msg) { if (msg->obj == obj) - return (IPTR)obj; + return (IPTR) obj; else - return (IPTR)NULL; + return (IPTR) NULL; } BOOPSI_DISPATCHER(IPTR, Area_Dispatcher, cl, obj, msg) { switch (msg->MethodID) { - case OM_NEW: return Area__OM_NEW(cl, obj, (struct opSet *) msg); - case OM_DISPOSE: return Area__OM_DISPOSE(cl, obj, msg); - case OM_SET: return Area__OM_SET(cl, obj, (struct opSet *)msg); - case OM_GET: return Area__OM_GET(cl, obj, (struct opGet *)msg); - case MUIM_AskMinMax: return Area__MUIM_AskMinMax(cl, obj, (APTR)msg); - case MUIM_Draw: return Area__MUIM_Draw(cl, obj, (APTR)msg); - case MUIM_DrawBackground: return Area__MUIM_DrawBackground(cl, obj, (APTR)msg); - case MUIM_DrawBackgroundBuffered: return Area__MUIM_DrawBackgroundBuffered(cl, obj, (APTR)msg); - case MUIM_DrawParentBackground: return Area__MUIM_DrawParentBackground(cl, obj, (APTR)msg); - case MUIM_Setup: return Area__MUIM_Setup(cl, obj, (APTR)msg); - case MUIM_Cleanup: return Area__MUIM_Cleanup(cl, obj, (APTR)msg); - case MUIM_Show: return Area__MUIM_Show(cl, obj, (APTR)msg); - case MUIM_Hide: return Area__MUIM_Hide(cl, obj, (APTR)msg); - case MUIM_GoActive: return Area__MUIM_GoActive(cl, obj, (APTR)msg); - case MUIM_GoInactive: return Area__MUIM_GoInactive(cl, obj, (APTR)msg); - case MUIM_Layout: return 1; - case MUIM_CreateShortHelp: return Area__MUIM_CreateShortHelp(cl, obj, (APTR)msg); - case MUIM_DeleteShortHelp: return Area__MUIM_DeleteShortHelp(cl, obj, (APTR)msg); - case MUIM_CreateBubble: return Area__MUIM_CreateBubble(cl, obj, (APTR)msg); - case MUIM_DeleteBubble: return Area__MUIM_DeleteBubble(cl, obj, (APTR)msg); - case MUIM_HandleEvent: return Area__MUIM_HandleEvent(cl, obj, (APTR)msg); - case MUIM_ContextMenuBuild: return Area__MUIM_ContextMenuBuild(cl, obj, (APTR)msg); - case MUIM_ContextMenuChoice: return Area__MUIM_ContextMenuChoice(cl, obj, (APTR)msg); - case MUIM_Timer: return Area__MUIM_Timer(cl,obj,msg); - case MUIM_UpdateInnerSizes: return Area__MUIM_UpdateInnerSizes(cl,obj,(APTR)msg); - case MUIM_DragQuery: return MUIV_DragQuery_Refuse; - case MUIM_DragBegin: return Area__MUIM_DragBegin(cl,obj,(APTR)msg); - case MUIM_DragDrop: return FALSE; - case MUIM_UnknownDropDestination: return Area__MUIM_UnknownDropDestination(cl,obj,(APTR)msg); - case MUIM_DragFinish: return Area__MUIM_DragFinish(cl,obj,(APTR)msg); - case MUIM_DragReport: return MUIV_DragReport_Continue; /* or MUIV_DragReport_Abort? */ - case MUIM_DoDrag: return Area__MUIM_DoDrag(cl, obj, (APTR)msg); - case MUIM_CreateDragImage: return Area__MUIM_CreateDragImage(cl, obj, (APTR)msg); - case MUIM_DeleteDragImage: return Area__MUIM_DeleteDragImage(cl, obj, (APTR)msg); - case MUIM_DragQueryExtended: return Area__MUIM_DragQueryExtended(cl, obj, (APTR)msg); - case MUIM_HandleInput: return Area__MUIM_HandleInput(cl, obj, (APTR)msg); - case MUIM_FindAreaObject: return Area__MUIM_FindAreaObject(cl, obj, (APTR)msg); - - case MUIM_Export: return Area__MUIM_Export(cl, obj, (APTR)msg); - case MUIM_Import: return Area__MUIM_Import(cl, obj, (APTR)msg); + case OM_NEW: + return Area__OM_NEW(cl, obj, (struct opSet *)msg); + case OM_DISPOSE: + return Area__OM_DISPOSE(cl, obj, msg); + case OM_SET: + return Area__OM_SET(cl, obj, (struct opSet *)msg); + case OM_GET: + return Area__OM_GET(cl, obj, (struct opGet *)msg); + case MUIM_AskMinMax: + return Area__MUIM_AskMinMax(cl, obj, (APTR) msg); + case MUIM_Draw: + return Area__MUIM_Draw(cl, obj, (APTR) msg); + case MUIM_DrawBackground: + return Area__MUIM_DrawBackground(cl, obj, (APTR) msg); + case MUIM_DrawBackgroundBuffered: + return Area__MUIM_DrawBackgroundBuffered(cl, obj, (APTR) msg); + case MUIM_DrawParentBackground: + return Area__MUIM_DrawParentBackground(cl, obj, (APTR) msg); + case MUIM_Setup: + return Area__MUIM_Setup(cl, obj, (APTR) msg); + case MUIM_Cleanup: + return Area__MUIM_Cleanup(cl, obj, (APTR) msg); + case MUIM_Show: + return Area__MUIM_Show(cl, obj, (APTR) msg); + case MUIM_Hide: + return Area__MUIM_Hide(cl, obj, (APTR) msg); + case MUIM_GoActive: + return Area__MUIM_GoActive(cl, obj, (APTR) msg); + case MUIM_GoInactive: + return Area__MUIM_GoInactive(cl, obj, (APTR) msg); + case MUIM_Layout: + return 1; + case MUIM_CreateShortHelp: + return Area__MUIM_CreateShortHelp(cl, obj, (APTR) msg); + case MUIM_DeleteShortHelp: + return Area__MUIM_DeleteShortHelp(cl, obj, (APTR) msg); + case MUIM_CreateBubble: + return Area__MUIM_CreateBubble(cl, obj, (APTR) msg); + case MUIM_DeleteBubble: + return Area__MUIM_DeleteBubble(cl, obj, (APTR) msg); + case MUIM_HandleEvent: + return Area__MUIM_HandleEvent(cl, obj, (APTR) msg); + case MUIM_ContextMenuBuild: + return Area__MUIM_ContextMenuBuild(cl, obj, (APTR) msg); + case MUIM_ContextMenuChoice: + return Area__MUIM_ContextMenuChoice(cl, obj, (APTR) msg); + case MUIM_Timer: + return Area__MUIM_Timer(cl, obj, msg); + case MUIM_UpdateInnerSizes: + return Area__MUIM_UpdateInnerSizes(cl, obj, (APTR) msg); + case MUIM_DragQuery: + return MUIV_DragQuery_Refuse; + case MUIM_DragBegin: + return Area__MUIM_DragBegin(cl, obj, (APTR) msg); + case MUIM_DragDrop: + return FALSE; + case MUIM_UnknownDropDestination: + return Area__MUIM_UnknownDropDestination(cl, obj, (APTR) msg); + case MUIM_DragFinish: + return Area__MUIM_DragFinish(cl, obj, (APTR) msg); + case MUIM_DragReport: + return MUIV_DragReport_Continue; /* or MUIV_DragReport_Abort? */ + case MUIM_DoDrag: + return Area__MUIM_DoDrag(cl, obj, (APTR) msg); + case MUIM_CreateDragImage: + return Area__MUIM_CreateDragImage(cl, obj, (APTR) msg); + case MUIM_DeleteDragImage: + return Area__MUIM_DeleteDragImage(cl, obj, (APTR) msg); + case MUIM_DragQueryExtended: + return Area__MUIM_DragQueryExtended(cl, obj, (APTR) msg); + case MUIM_HandleInput: + return Area__MUIM_HandleInput(cl, obj, (APTR) msg); + case MUIM_FindAreaObject: + return Area__MUIM_FindAreaObject(cl, obj, (APTR) msg); + + case MUIM_Export: + return Area__MUIM_Export(cl, obj, (APTR) msg); + case MUIM_Import: + return Area__MUIM_Import(cl, obj, (APTR) msg); } return DoSuperMethodA(cl, obj, msg); } BOOPSI_DISPATCHER_END - /* * Class descriptor. */ -const struct __MUIBuiltinClass _MUI_Area_desc = { - MUIC_Area, - MUIC_Notify, - sizeof(struct MUI_AreaData), - (void*)Area_Dispatcher +const struct __MUIBuiltinClass _MUI_Area_desc = +{ + MUIC_Area, + MUIC_Notify, + sizeof(struct MUI_AreaData), + (void *) Area_Dispatcher }; - diff --git a/workbench/libs/muimaster/classes/area.h b/workbench/libs/muimaster/classes/area.h dissimilarity index 79% index fe33cc3a7d..e8003465b8 100644 --- a/workbench/libs/muimaster/classes/area.h +++ b/workbench/libs/muimaster/classes/area.h @@ -1,336 +1,629 @@ -/* - Copyright © 1999, David Le Corfec. - Copyright © 2002 - 2012, The AROS Development Team. - All rights reserved. - - $Id$ -*/ - -#ifndef _MUI_CLASSES_AREA_H -#define _MUI_CLASSES_AREA_H - -#ifndef INTUITION_INTUITION_H -#include <intuition/intuition.h> -#endif - -#ifndef GRAPHICS_GRAPHICS_H -#include <graphics/gfx.h> -#endif - -#ifndef _MUI_CLASSES_WINDOW_H -#include "classes/window.h" /* for MUI_EventHandlerNode, will be gone if this MUI_AreaData is moved to area.c */ -#endif - -/*** Name *******************************************************************/ -#define MUIC_Area "Area.mui" - -/*** Identifier base (for Zune extensions) **********************************/ -#define MUIB_Area (MUIB_ZUNE | 0x00000200) - -/*** Methods ****************************************************************/ -#define MUIM_AskMinMax (MUIB_MUI|0x00423874) /* MUI: V4 */ /* For Custom Classes only */ -#define MUIM_Cleanup (MUIB_MUI|0x0042d985) /* MUI: V4 */ /* For Custom Classes only */ -#define MUIM_ContextMenuBuild (MUIB_MUI|0x00429d2e) /* MUI: V11 */ -#define MUIM_ContextMenuChoice (MUIB_MUI|0x00420f0e) /* MUI: V11 */ -#define MUIM_CreateBubble (MUIB_MUI|0x00421c41) /* MUI: V18 */ -#define MUIM_CreateDragImage (MUIB_MUI|0x0042eb6f) /* MUI: V18 */ /* For Custom Classes only */ /* Undoc */ -#define MUIM_CreateShortHelp (MUIB_MUI|0x00428e93) /* MUI: V11 */ -#define MUIM_CustomBackfill (MUIB_MUI|0x00428d73) /* Undoc */ -#define MUIM_DeleteBubble (MUIB_MUI|0x004211af) /* MUI: V18 */ -#define MUIM_DeleteDragImage (MUIB_MUI|0x00423037) /* MUI: V18 */ /* For Custom Classes only */ /* Undoc */ -#define MUIM_DeleteShortHelp (MUIB_MUI|0x0042d35a) /* MUI: V11 */ -#define MUIM_DoDrag (MUIB_MUI|0x004216bb) /* MUI: V18 */ /* For Custom Classes only */ /* Undoc */ -#define MUIM_DragBegin (MUIB_MUI|0x0042c03a) /* MUI: V11 */ -#define MUIM_DragDrop (MUIB_MUI|0x0042c555) /* MUI: V11 */ -#define MUIM_UnknownDropDestination (MUIB_MUI|0x00425550) /* ZUNE */ -#define MUIM_DragFinish (MUIB_MUI|0x004251f0) /* MUI: V11 */ -#define MUIM_DragQuery (MUIB_MUI|0x00420261) /* MUI: V11 */ -#define MUIM_DragReport (MUIB_MUI|0x0042edad) /* MUI: V11 */ -#define MUIM_Draw (MUIB_MUI|0x00426f3f) /* MUI: V4 */ /* For Custom Classes only */ -#define MUIM_DrawBackground (MUIB_MUI|0x004238ca) /* MUI: V11 */ -#define MUIM_GoActive (MUIB_MUI|0x0042491a) /* Undoc */ -#define MUIM_GoInactive (MUIB_MUI|0x00422c0c) /* Undoc */ -#define MUIM_HandleEvent (MUIB_MUI|0x00426d66) /* MUI: V16 */ /* For Custom Classes only */ -#define MUIM_HandleInput (MUIB_MUI|0x00422a1a) /* MUI: V4 */ /* For Custom Classes only */ -#define MUIM_Hide (MUIB_MUI|0x0042f20f) /* MUI: V4 */ /* For Custom Classes only */ -#define MUIM_Setup (MUIB_MUI|0x00428354) /* MUI: V4 */ /* For Custom Classes only */ -#define MUIM_Show (MUIB_MUI|0x0042cc84) /* MUI: V4 */ /* For Custom Classes only */ -struct MUIP_AskMinMax {STACKED ULONG MethodID; STACKED struct MUI_MinMax *MinMaxInfo;}; -struct MUIP_Cleanup {STACKED ULONG MethodID;}; -struct MUIP_ContextMenuBuild {STACKED ULONG MethodID; STACKED LONG mx; STACKED LONG my;}; -struct MUIP_ContextMenuChoice {STACKED ULONG MethodID; STACKED Object *item;}; -struct MUIP_CreateBubble {STACKED ULONG MethodID; STACKED LONG x; STACKED LONG y; STACKED char *txt; STACKED ULONG flags;}; -struct MUIP_CreateDragImage {STACKED ULONG MethodID; STACKED LONG touchx; STACKED LONG touchy; STACKED ULONG flags;}; -struct MUIP_CreateShortHelp {STACKED ULONG MethodID; STACKED LONG mx; STACKED LONG my;}; -struct MUIP_CustomBackfill {STACKED ULONG MethodID; STACKED LONG left; STACKED LONG top; STACKED LONG right; STACKED LONG bottom; STACKED LONG xoffset; STACKED LONG yoffset;}; -struct MUIP_DeleteBubble {STACKED ULONG MethodID; STACKED APTR bubble;}; -struct MUIP_DeleteDragImage {STACKED ULONG MethodID; STACKED struct MUI_DragImage *di;}; -struct MUIP_DeleteShortHelp {STACKED ULONG MethodID; STACKED STRPTR help; }; -struct MUIP_DoDrag {STACKED ULONG MethodID; STACKED LONG touchx; STACKED LONG touchy; STACKED ULONG flags;}; -struct MUIP_UnknownDropDestination {STACKED ULONG MethodID; STACKED struct IntuiMessage *imsg; }; -struct MUIP_DragBegin {STACKED ULONG MethodID; STACKED Object *obj;}; -struct MUIP_DragDrop {STACKED ULONG MethodID; STACKED Object *obj; STACKED LONG x; STACKED LONG y;}; -struct MUIP_DragFinish {STACKED ULONG MethodID; STACKED Object *obj;}; -struct MUIP_DragQuery {STACKED ULONG MethodID; STACKED Object *obj;}; -struct MUIP_DragReport {STACKED ULONG MethodID; STACKED Object *obj; STACKED LONG x; STACKED LONG y; STACKED LONG update;}; -struct MUIP_Draw {STACKED ULONG MethodID; STACKED ULONG flags;}; -struct MUIP_DrawBackground {STACKED ULONG MethodID; STACKED LONG left; STACKED LONG top; STACKED LONG width; STACKED LONG height; STACKED LONG xoffset; STACKED LONG yoffset; STACKED LONG flags;}; -struct MUIP_DrawBackgroundBuffered {STACKED ULONG MethodID; STACKED struct RastPort *rp; STACKED LONG left; STACKED LONG top; STACKED LONG width; STACKED LONG height; STACKED LONG xoffset; STACKED LONG yoffset; STACKED LONG flags;}; -struct MUIP_GoActive {STACKED ULONG MethodID;}; -struct MUIP_GoInacrive {STACKED ULONG MethodID;}; -struct MUIP_HandleEvent {STACKED ULONG MethodID; STACKED struct IntuiMessage *imsg; STACKED LONG muikey;}; -struct MUIP_HandleInput {STACKED ULONG MethodID; STACKED struct IntuiMessage *imsg; STACKED LONG muikey;}; -struct MUIP_Hide {STACKED ULONG MethodID;}; -struct MUIP_Setup {STACKED ULONG MethodID; STACKED struct MUI_RenderInfo *RenderInfo;}; -struct MUIP_Show {STACKED ULONG MethodID;}; - -#define MUIM_Layout (MUIB_Area | 0x00000000) -#define MUIM_DrawParentBackground (MUIB_Area | 0x00000001) -#define MUIM_DragQueryExtended (MUIB_Area | 0x00000002) /* PRIV - returns a object or NULL */ -#define MUIM_Timer (MUIB_Area | 0x00000003) /* PRIV */ -#define MUIM_UpdateInnerSizes (MUIB_Area | 0x00000004) /* PRIV for now */ -#define MUIM_FindAreaObject (MUIB_Area | 0x00000005) /* PRIV */ -#define MUIM_DrawBackgroundBuffered (MUIB_Area | 0x00000006) /* PRIV */ -struct MUIP_Layout {STACKED ULONG MethodID;}; -struct MUIP_DrawParentBackground {STACKED ULONG MethodID; STACKED LONG left; STACKED LONG top; STACKED LONG width; STACKED LONG height; STACKED LONG xoffset; STACKED LONG yoffset; STACKED LONG flags;}; -struct MUIP_DragQueryExtended {STACKED ULONG MethodID; STACKED Object *obj; STACKED LONG x; STACKED LONG y;}; /* PRIV */ -struct MUIP_Timer {STACKED ULONG MethodID; }; /* PRIV */ -struct MUIP_UpdateInnerSizes {STACKED ULONG MethodID; }; /* PRIV */ -struct MUIP_FindAreaObject {STACKED ULONG MethodID; STACKED Object *obj;}; /* PRIV */ - -struct MUI_DragImage -{ - struct BitMap *bm; - WORD width; /* exact width and height of bitmap */ - WORD height; - WORD touchx; /* position of pointer click relative to bitmap */ - WORD touchy; - ULONG flags; -}; - -// #define MUIF_DRAGIMAGE_HASMASK (1<<0) /* Use provided mask for drawing */ /* Not supported at the moment */ -#define MUIF_DRAGIMAGE_SOURCEALPHA (1<<1) /* Use drag image source alpha information for transparrent drawing */ - -/*** Attributes *************************************************************/ -#define MUIA_Background (MUIB_MUI|0x0042545b) /* MUI: V4 is. LONG */ -#define MUIA_BottomEdge (MUIB_MUI|0x0042e552) /* MUI: V4 ..g LONG */ -#define MUIA_ContextMenu (MUIB_MUI|0x0042b704) /* MUI: V11 isg Object * */ -#define MUIA_ContextMenuTrigger (MUIB_MUI|0x0042a2c1) /* MUI: V11 ..g Object * */ -#define MUIA_ControlChar (MUIB_MUI|0x0042120b) /* MUI: V4 isg char */ -#define MUIA_CustomBackfill (MUIB_MUI|0x00420a63) /* undoc i.. */ -#define MUIA_CycleChain (MUIB_MUI|0x00421ce7) /* MUI: V11 isg LONG */ -#define MUIA_Disabled (MUIB_MUI|0x00423661) /* MUI: V4 isg BOOL */ -#define MUIA_DoubleBuffer (MUIB_MUI|0x0042a9c7) /* MUI: V20 isg BOOL */ -#define MUIA_Draggable (MUIB_MUI|0x00420b6e) /* MUI: V11 isg BOOL */ -#define MUIA_Dropable (MUIB_MUI|0x0042fbce) /* MUI: V11 isg BOOL */ -#define MUIA_FillArea (MUIB_MUI|0x004294a3) /* MUI: V4 is. BOOL */ -#define MUIA_FixHeight (MUIB_MUI|0x0042a92b) /* MUI: V4 i.. LONG */ -#define MUIA_FixHeightTxt (MUIB_MUI|0x004276f2) /* MUI: V4 i.. STRPTR */ -#define MUIA_FixWidth (MUIB_MUI|0x0042a3f1) /* MUI: V4 i.. LONG */ -#define MUIA_FixWidthTxt (MUIB_MUI|0x0042d044) /* MUI: V4 i.. STRPTR */ -#define MUIA_Font (MUIB_MUI|0x0042be50) /* MUI: V4 i.g struct TextFont * */ -#define MUIA_Frame (MUIB_MUI|0x0042ac64) /* MUI: V4 i.. LONG */ -#define MUIA_FramePhantomHoriz (MUIB_MUI|0x0042ed76) /* MUI: V4 i.. BOOL */ -#define MUIA_FrameTitle (MUIB_MUI|0x0042d1c7) /* MUI: V4 i.. STRPTR */ -#define MUIA_Height (MUIB_MUI|0x00423237) /* MUI: V4 ..g LONG */ -#define MUIA_HorizDisappear (MUIB_MUI|0x00429615) /* MUI: V11 isg LONG */ -#define MUIA_HorizWeight (MUIB_MUI|0x00426db9) /* MUI: V4 isg WORD */ -#define MUIA_InnerBottom (MUIB_MUI|0x0042f2c0) /* MUI: V4 i.g LONG */ -#define MUIA_InnerLeft (MUIB_MUI|0x004228f8) /* MUI: V4 i.g LONG */ -#define MUIA_InnerRight (MUIB_MUI|0x004297ff) /* MUI: V4 i.g LONG */ -#define MUIA_InnerTop (MUIB_MUI|0x00421eb6) /* MUI: V4 i.g LONG */ -#define MUIA_InputMode (MUIB_MUI|0x0042fb04) /* MUI: V4 i.. LONG */ -#define MUIA_LeftEdge (MUIB_MUI|0x0042bec6) /* MUI: V4 ..g LONG */ -#define MUIA_MaxHeight (MUIB_MUI|0x004293e4) /* MUI: V11 i.. LONG */ -#define MUIA_MaxWidth (MUIB_MUI|0x0042f112) /* MUI: V11 i.. LONG */ -#define MUIA_Pressed (MUIB_MUI|0x00423535) /* MUI: V4 ..g BOOL */ -#define MUIA_RightEdge (MUIB_MUI|0x0042ba82) /* MUI: V4 ..g LONG */ -#define MUIA_Selected (MUIB_MUI|0x0042654b) /* MUI: V4 isg BOOL */ -#define MUIA_ShortHelp (MUIB_MUI|0x00428fe3) /* MUI: V11 isg STRPTR */ -#define MUIA_ShowMe (MUIB_MUI|0x00429ba8) /* MUI: V4 isg BOOL */ -#define MUIA_ShowSelState (MUIB_MUI|0x0042caac) /* MUI: V4 i.. BOOL */ -#define MUIA_Timer (MUIB_MUI|0x00426435) /* MUI: V4 ..g LONG */ -#define MUIA_TopEdge (MUIB_MUI|0x0042509b) /* MUI: V4 ..g LONG */ -#define MUIA_VertDisappear (MUIB_MUI|0x0042d12f) /* MUI: V11 isg LONG */ -#define MUIA_VertWeight (MUIB_MUI|0x004298d0) /* MUI: V4 isg WORD */ -#define MUIA_Weight (MUIB_MUI|0x00421d1f) /* MUI: V4 i.. WORD */ -#define MUIA_Width (MUIB_MUI|0x0042b59c) /* MUI: V4 ..g LONG */ -#define MUIA_Window (MUIB_MUI|0x00421591) /* MUI: V4 ..g struct Window * */ -#define MUIA_WindowObject (MUIB_MUI|0x0042669e) /* MUI: V4 ..g Object * */ - -#define MUIA_NestedDisabled (MUIB_Area | 0x00000000) /* Zune 20030530 isg BOOL */ - -#ifdef MUI_OBSOLETE -#define MUIA_ExportID (MUIB_MUI|0x0042d76e) /* V4 isg ULONG */ -#endif /* MUI_OBSOLETE */ - -struct MUI_ImageSpec_intern; - -struct MUI_AreaData -{ - struct MUI_RenderInfo *mad_RenderInfo; /* RenderInfo for this object */ - struct MUI_ImageSpec_intern *mad_Background; /* bg setting - *private* ! */ - struct TextFont *mad_Font; /* Font which is used to draw */ - struct MUI_MinMax mad_MinMax; /* min/max/default dimensions */ - struct IBox mad_Box; /* coordinates and dim of this object after layouted */ - BYTE mad_addleft; /* left offset (frame & innerspacing) */ - BYTE mad_addtop; /* top offset (frame & innerspacing) */ - BYTE mad_subwidth; /* additional width (frame & innerspacing) */ - BYTE mad_subheight; /* additional height (frame & innerspacing) */ - ULONG mad_Flags; /* some flags; see below */ - ULONG mad_Flags2; -// 40 bytes up to here - - /* The following data is private */ - /* START PRIV */ -// offset 40 - UWORD mad_HorizWeight; /* weight values for layout. default 100 */ - UWORD mad_VertWeight; -// offset 44 -// ? -// offset 48 - ULONG mad_IDCMP; /* IDCMP flags this listens to (for HandleInput) */ -// offset 52 - CONST_STRPTR mad_BackgroundSpec; -// offset 56 - IPTR mad_FontPreset; /* MUIV_Font_xxx or pointer to struct TextFont */ -// offset 76 - CONST_STRPTR mad_FrameTitle; /* for groups. Req. mad_Frame > 0 */ -// Inner values at offset 88 in MUI: - BYTE mad_InnerLeft; /* frame or hardcoded */ - BYTE mad_InnerTop; - BYTE mad_InnerRight; - BYTE mad_InnerBottom; -// offset 94 - BYTE mad_FrameOBSOLETE; /* frame setting -- private */ -// offset 95 - BYTE mad_InputMode; /* how to react to events */ -// offset 96 - TEXT mad_ControlChar; /* key shortcut */ - BYTE mad_TitleHeightAdd;/* frame title height = mad_TitleBelow + mad_TitleBaseline */ - BYTE mad_TitleHeightBelow; /* height below frame */ - BYTE mad_TitleHeightAbove; /* height above frame */ -// 100 -// ? - IPTR mad_Frame; - WORD mad_HardHeight; /* if harcoded dim (see flags) */ - WORD mad_HardWidth; /* if harcoded dim (see flags) */ - CONST_STRPTR mad_HardWidthTxt; - CONST_STRPTR mad_HardHeightTxt; -// TODO: move SelBack in RenderInfo as it's common for all objects - struct MUI_ImageSpec_intern *mad_SelBack; /* selected state background */ - CONST_STRPTR mad_ShortHelp; /* bubble help */ -// there's an event handler at 114 - struct MUI_EventHandlerNode mad_ehn; - struct MUI_InputHandlerNode mad_Timer; /* MUIA_Timer */ - ULONG mad_Timeval; /* just to trigger notifications */ - struct MUI_EventHandlerNode mad_ccn; /* gross hack for control char */ - Object *mad_ContextMenu; /* menu strip */ - LONG mad_ClickX; /* x position of the initial SELECTDOWN click */ - LONG mad_ClickY; /* y position of the intiial SELECTDOWN click */ - struct ZMenu *mad_ContextZMenu; - struct MUI_EventHandlerNode mad_hiehn; /* Eventhandler to simulate MUIM_HandleInput */ - - LONG mad_DisableCount; /* counts number of disables */ - /* END PRIV */ -// only 148 bytes for the struct in MUI ! -}; - -/* Flags during MUIM_Draw */ -#define MADF_DRAWOBJECT (1<< 0) /* draw object completely */ -#define MADF_DRAWUPDATE (1<< 1) /* update object */ - -#define MADF_DRAWALL (1<< 31) - - -/* mad_Flags, private one */ -#define MADF_DRAW_XXX (1<< 2) /* PRIV - mui verified, what use ? */ -#define MADF_DRAGGABLE (1<< 3) /* PRIV - mui verified */ -#define MADF_MAXHEIGHT (1<< 4) /* PRIV - share bit 6 in mui */ -#define MADF_CYCLECHAIN (1<< 5) /* PRIV - mui verified */ -#define MADF_MAXWIDTH (1<< 6) /* PRIV - share bit 6 in mui */ -#define MADF_DRAGGING (1<< 7) /* PRIV - zune-specific ? */ -#define MADF_OWNBG (1<< 8) /* PRIV - zune-specific ? */ -#define MADF_SHOWME (1<< 9) /* PRIV - mui verified */ -#define MADF_BORDERGADGET (1<< 10) /* PRIV - is a border gadget; zune-specific ? */ -#define MADF_DRAWFRAME (1<< 11) /* PRIV - nearly mui verified */ -#define MADF_DRAW_XXX_2 (1<< 12) /* PRIV - mui verified, what use ? */ -#define MADF_DROPABLE (1<< 13) /* PRIV - mui verified */ -#define MADF_CANDRAW (1<< 14) /* PRIV - roughly mui equivalent */ -#define MADF_DISABLED (1<< 15) /* PRIV - mui verified */ -#define MADF_SHOWSELSTATE (1<< 16) /* PRIV - mui verified */ -#define MADF_PRESSED (1<< 17) /* PRIV - nearly mui verified */ -#define MADF_SELECTED (1<< 18) /* PRIV - mui verified */ -#define MADF_FIXHEIGHT (1<< 19) /* PRIV - zune-specific */ -#define MADF_FILLAREA (1<< 20) /* PRIV - mui verified */ -#define MADF_FIXWIDTH (1<< 22) /* PRIV - zune-specific */ -#define MADF_FIXHEIGHTTXT (1<< 22) /* PRIV - mui verified (unused in zune) */ -#define MADF_INNERLEFT (1<< 23) /* PRIV - mui verified */ -#define MADF_INNERTOP (1<< 24) /* PRIV - mui verified */ -#define MADF_INNERRIGHT (1<< 25) /* PRIV - mui verified */ -#define MADF_INNERBOTTOM (1<< 26) /* PRIV - mui verified */ -#define MADF_FRAMEPHANTOM (1<< 27) /* PRIV - mui verified */ -#define MADF_SETUP (1<< 28) /* PRIV - zune-specific */ - -#define MADF_INVIRTUALGROUP (1<<29) /* PRIV UNDOC: The object is inside a virtual group */ -#define MADF_ISVIRTUALGROUP (1<<30) /* PRIV UNDOC: The object is a virtual group */ - -#define MADF_DRAWFLAGS (MADF_DRAWOBJECT | MADF_DRAWUPDATE | MADF_DRAW_XXX \ - | MADF_DRAWFRAME | MADF_DRAW_XXX_2 | MADF_DRAWALL) - - -// offset 94 (byte) (frame << 1) (lsb is SETUP_DONE flag) -enum { - MUIV_Frame_None = 0, - MUIV_Frame_Button, - MUIV_Frame_ImageButton, - MUIV_Frame_Text, - MUIV_Frame_String, - MUIV_Frame_ReadList, - MUIV_Frame_InputList, - MUIV_Frame_Prop, - MUIV_Frame_Gauge, - MUIV_Frame_Group, - MUIV_Frame_PopUp, - MUIV_Frame_Virtual, - MUIV_Frame_Slider, - MUIV_Frame_Knob, - MUIV_Frame_Drag, - MUIV_Frame_Count, - MUIV_Frame_Register = 21, -}; - -// offset 95 -enum { - MUIV_InputMode_None = 0, // 0x00 - MUIV_InputMode_RelVerify, // 0x40 (1<<6) - MUIV_InputMode_Immediate, // 0x80 (1<<7) - MUIV_InputMode_Toggle, // 0xc0 (1<<7 | 1<<6) -}; - - - -enum { - MUIV_DragQuery_Refuse = 0, - MUIV_DragQuery_Accept, -}; - -enum { - MUIV_DragReport_Abort = 0, - MUIV_DragReport_Continue, - MUIV_DragReport_Lock, - MUIV_DragReport_Refresh, -}; - -#define MUIV_CreateBubble_DontHidePointer (1<<0) - -/* A private functions and macros */ -void __area_finish_minmax(Object *obj, struct MUI_MinMax *MinMaxInfo); - -/*#define DRAW_BG_RECURSIVE (1<<1)*/ -#define _vweight(obj) (muiAreaData(obj)->mad_VertWeight) /* accesses private members PRIV */ -#define _hweight(obj) (muiAreaData(obj)->mad_HorizWeight) /* accesses private members PRIV */ - -extern const struct __MUIBuiltinClass _MUI_Area_desc; /* PRIV */ - -#endif /* _MUI_CLASSES_AREA_H */ +/* + Copyright © 1999, David Le Corfec. + Copyright © 2002 - 2012, The AROS Development Team. + All rights reserved. + + $Id$ +*/ + +#ifndef _MUI_CLASSES_AREA_H +#define _MUI_CLASSES_AREA_H + +#ifndef INTUITION_INTUITION_H +#include <intuition/intuition.h> +#endif + +#ifndef GRAPHICS_GRAPHICS_H +#include <graphics/gfx.h> +#endif + +#ifndef _MUI_CLASSES_WINDOW_H +#include "classes/window.h" /* for MUI_EventHandlerNode, will be gone if this MUI_AreaData is moved to area.c */ +#endif + +/*** Name *******************************************************************/ +#define MUIC_Area "Area.mui" + +/*** Identifier base (for Zune extensions) **********************************/ +#define MUIB_Area (MUIB_ZUNE | 0x00000200) + +/*** Methods ****************************************************************/ +#define MUIM_AskMinMax \ + (MUIB_MUI | 0x00423874) /* MUI: V4 */ /* For Custom Classes only */ +#define MUIM_Cleanup \ + (MUIB_MUI | 0x0042d985) /* MUI: V4 */ /* For Custom Classes only */ +#define MUIM_ContextMenuBuild \ + (MUIB_MUI | 0x00429d2e) /* MUI: V11 */ +#define MUIM_ContextMenuChoice \ + (MUIB_MUI | 0x00420f0e) /* MUI: V11 */ +#define MUIM_CreateBubble \ + (MUIB_MUI | 0x00421c41) /* MUI: V18 */ +#define MUIM_CreateDragImage \ + (MUIB_MUI | 0x0042eb6f) /* MUI: V18 */ /* For Custom Classes only, undoc */ +#define MUIM_CreateShortHelp \ + (MUIB_MUI | 0x00428e93) /* MUI: V11 */ +#define MUIM_CustomBackfill \ + (MUIB_MUI | 0x00428d73) /* Undoc */ +#define MUIM_DeleteBubble \ + (MUIB_MUI | 0x004211af) /* MUI: V18 */ +#define MUIM_DeleteDragImage \ + (MUIB_MUI | 0x00423037) /* MUI: V18 */ /* For Custom Classes only, undoc */ +#define MUIM_DeleteShortHelp \ + (MUIB_MUI | 0x0042d35a) /* MUI: V11 */ +#define MUIM_DoDrag \ + (MUIB_MUI | 0x004216bb) /* MUI: V18 */ /* For Custom Classes only, undoc */ +#define MUIM_DragBegin \ + (MUIB_MUI | 0x0042c03a) /* MUI: V11 */ +#define MUIM_DragDrop \ + (MUIB_MUI | 0x0042c555) /* MUI: V11 */ +#define MUIM_UnknownDropDestination \ + (MUIB_MUI | 0x00425550) /* ZUNE */ +#define MUIM_DragFinish \ + (MUIB_MUI | 0x004251f0) /* MUI: V11 */ +#define MUIM_DragQuery \ + (MUIB_MUI | 0x00420261) /* MUI: V11 */ +#define MUIM_DragReport \ + (MUIB_MUI | 0x0042edad) /* MUI: V11 */ +#define MUIM_Draw \ + (MUIB_MUI | 0x00426f3f) /* MUI: V4 */ /* For Custom Classes only */ +#define MUIM_DrawBackground \ + (MUIB_MUI | 0x004238ca) /* MUI: V11 */ +#define MUIM_GoActive \ + (MUIB_MUI | 0x0042491a) /* Undoc */ +#define MUIM_GoInactive \ + (MUIB_MUI | 0x00422c0c) /* Undoc */ +#define MUIM_HandleEvent \ + (MUIB_MUI | 0x00426d66) /* MUI: V16 */ /* For Custom Classes only */ +#define MUIM_HandleInput \ + (MUIB_MUI | 0x00422a1a) /* MUI: V4 */ /* For Custom Classes only */ +#define MUIM_Hide \ + (MUIB_MUI | 0x0042f20f) /* MUI: V4 */ /* For Custom Classes only */ +#define MUIM_Setup \ + (MUIB_MUI | 0x00428354) /* MUI: V4 */ /* For Custom Classes only */ +#define MUIM_Show \ + (MUIB_MUI | 0x0042cc84) /* MUI: V4 */ /* For Custom Classes only */ + +struct MUIP_AskMinMax +{ + STACKED ULONG MethodID; + STACKED struct MUI_MinMax *MinMaxInfo; +}; + +struct MUIP_Cleanup +{ + STACKED ULONG MethodID; +}; + +struct MUIP_ContextMenuBuild +{ + STACKED ULONG MethodID; + STACKED LONG mx; + STACKED LONG my; +}; + +struct MUIP_ContextMenuChoice +{ + STACKED ULONG MethodID; + STACKED Object *item; +}; + +struct MUIP_CreateBubble +{ + STACKED ULONG MethodID; + STACKED LONG x; + STACKED LONG y; + STACKED char *txt; + STACKED ULONG flags; +}; + +struct MUIP_CreateDragImage +{ + STACKED ULONG MethodID; + STACKED LONG touchx; + STACKED LONG touchy; + STACKED ULONG flags; +}; + +struct MUIP_CreateShortHelp +{ + STACKED ULONG MethodID; + STACKED LONG mx; + STACKED LONG my; +}; + +struct MUIP_CustomBackfill +{ + STACKED ULONG MethodID; + STACKED LONG left; + STACKED LONG top; + STACKED LONG right; + STACKED LONG bottom; + STACKED LONG xoffset; + STACKED LONG yoffset; +}; + +struct MUIP_DeleteBubble +{ + STACKED ULONG MethodID; + STACKED APTR bubble; +}; + +struct MUIP_DeleteDragImage +{ + STACKED ULONG MethodID; + STACKED struct MUI_DragImage *di; +}; + +struct MUIP_DeleteShortHelp +{ + STACKED ULONG MethodID; + STACKED STRPTR help; +}; + +struct MUIP_DoDrag +{ + STACKED ULONG MethodID; + STACKED LONG touchx; + STACKED LONG touchy; + STACKED ULONG flags; +}; + +struct MUIP_UnknownDropDestination +{ + STACKED ULONG MethodID; + STACKED struct IntuiMessage *imsg; +}; + +struct MUIP_DragBegin +{ + STACKED ULONG MethodID; + STACKED Object *obj; +}; + +struct MUIP_DragDrop +{ + STACKED ULONG MethodID; + STACKED Object *obj; + STACKED LONG x; + STACKED LONG y; +}; + +struct MUIP_DragFinish +{ + STACKED ULONG MethodID; + STACKED Object *obj; +}; + +struct MUIP_DragQuery +{ + STACKED ULONG MethodID; + STACKED Object *obj; +}; + +struct MUIP_DragReport +{ + STACKED ULONG MethodID; + STACKED Object *obj; + STACKED LONG x; + STACKED LONG y; + STACKED LONG update; +}; + +struct MUIP_Draw +{ + STACKED ULONG MethodID; + STACKED ULONG flags; +}; + +struct MUIP_DrawBackground +{ + STACKED ULONG MethodID; + STACKED LONG left; + STACKED LONG top; + STACKED LONG width; + STACKED LONG height; + STACKED LONG xoffset; + STACKED LONG yoffset; + STACKED LONG flags; +}; + +struct MUIP_DrawBackgroundBuffered +{ + STACKED ULONG MethodID; + STACKED struct RastPort *rp; + STACKED LONG left; + STACKED LONG top; + STACKED LONG width; + STACKED LONG height; + STACKED LONG xoffset; + STACKED LONG yoffset; + STACKED LONG flags; +}; + +struct MUIP_GoActive +{ + STACKED ULONG MethodID; +}; + +struct MUIP_GoInacrive +{ + STACKED ULONG MethodID; +}; + +struct MUIP_HandleEvent +{ + STACKED ULONG MethodID; + STACKED struct IntuiMessage *imsg; + STACKED LONG muikey; +}; + +struct MUIP_HandleInput +{ + STACKED ULONG MethodID; + STACKED struct IntuiMessage *imsg; + STACKED LONG muikey; +}; + +struct MUIP_Hide +{ + STACKED ULONG MethodID; +}; + +struct MUIP_Setup +{ + STACKED ULONG MethodID; + STACKED struct MUI_RenderInfo *RenderInfo; +}; + +struct MUIP_Show +{ + STACKED ULONG MethodID; +}; + +#define MUIM_Layout \ + (MUIB_Area | 0x00000000) +#define MUIM_DrawParentBackground \ + (MUIB_Area | 0x00000001) +#define MUIM_DragQueryExtended \ + (MUIB_Area | 0x00000002) /* PRIV - returns a object or NULL */ +#define MUIM_Timer \ + (MUIB_Area | 0x00000003) /* PRIV */ +#define MUIM_UpdateInnerSizes \ + (MUIB_Area | 0x00000004) /* PRIV for now */ +#define MUIM_FindAreaObject \ + (MUIB_Area | 0x00000005) /* PRIV */ +#define MUIM_DrawBackgroundBuffered \ + (MUIB_Area | 0x00000006) /* PRIV */ + +struct MUIP_Layout +{ + STACKED ULONG MethodID; +}; + +struct MUIP_DrawParentBackground +{ + STACKED ULONG MethodID; + STACKED LONG left; + STACKED LONG top; + STACKED LONG width; + STACKED LONG height; + STACKED LONG xoffset; + STACKED LONG yoffset; + STACKED LONG flags; +}; + +struct MUIP_DragQueryExtended +{ + STACKED ULONG MethodID; + STACKED Object *obj; + STACKED LONG x; + STACKED LONG y; +}; /* PRIV */ + +struct MUIP_Timer +{ + STACKED ULONG MethodID; +}; /* PRIV */ + +struct MUIP_UpdateInnerSizes +{ + STACKED ULONG MethodID; +}; /* PRIV */ + +struct MUIP_FindAreaObject +{ + STACKED ULONG MethodID; + STACKED Object *obj; +}; /* PRIV */ + +struct MUI_DragImage +{ + struct BitMap *bm; + WORD width; /* exact width and height of bitmap */ + WORD height; + WORD touchx; /* position of pointer click relative to bitmap */ + WORD touchy; + ULONG flags; +}; + +// #define MUIF_DRAGIMAGE_HASMASK (1<<0) /* Use provided mask for drawing */ + /* Not supported at the moment */ +#define MUIF_DRAGIMAGE_SOURCEALPHA (1<<1) /* Use drag image source alpha + * information for transparent + * drawing */ + +/*** Attributes *************************************************************/ +#define MUIA_Background \ + (MUIB_MUI | 0x0042545b) /* MUI: V4 is. LONG */ +#define MUIA_BottomEdge \ + (MUIB_MUI | 0x0042e552) /* MUI: V4 ..g LONG */ +#define MUIA_ContextMenu \ + (MUIB_MUI | 0x0042b704) /* MUI: V11 isg Object * */ +#define MUIA_ContextMenuTrigger \ + (MUIB_MUI | 0x0042a2c1) /* MUI: V11 ..g Object * */ +#define MUIA_ControlChar \ + (MUIB_MUI | 0x0042120b) /* MUI: V4 isg char */ +#define MUIA_CustomBackfill \ + (MUIB_MUI | 0x00420a63) /* undoc i.. */ +#define MUIA_CycleChain \ + (MUIB_MUI | 0x00421ce7) /* MUI: V11 isg LONG */ +#define MUIA_Disabled \ + (MUIB_MUI | 0x00423661) /* MUI: V4 isg BOOL */ +#define MUIA_DoubleBuffer \ + (MUIB_MUI | 0x0042a9c7) /* MUI: V20 isg BOOL */ +#define MUIA_Draggable \ + (MUIB_MUI | 0x00420b6e) /* MUI: V11 isg BOOL */ +#define MUIA_Dropable \ + (MUIB_MUI | 0x0042fbce) /* MUI: V11 isg BOOL */ +#define MUIA_FillArea \ + (MUIB_MUI | 0x004294a3) /* MUI: V4 is. BOOL */ +#define MUIA_FixHeight \ + (MUIB_MUI | 0x0042a92b) /* MUI: V4 i.. LONG */ +#define MUIA_FixHeightTxt \ + (MUIB_MUI | 0x004276f2) /* MUI: V4 i.. STRPTR */ +#define MUIA_FixWidth \ + (MUIB_MUI | 0x0042a3f1) /* MUI: V4 i.. LONG */ +#define MUIA_FixWidthTxt \ + (MUIB_MUI | 0x0042d044) /* MUI: V4 i.. STRPTR */ +#define MUIA_Font \ + (MUIB_MUI | 0x0042be50) /* MUI: V4 i.g struct TextFont * */ +#define MUIA_Frame \ + (MUIB_MUI | 0x0042ac64) /* MUI: V4 i.. LONG */ +#define MUIA_FramePhantomHoriz \ + (MUIB_MUI | 0x0042ed76) /* MUI: V4 i.. BOOL */ +#define MUIA_FrameTitle \ + (MUIB_MUI | 0x0042d1c7) /* MUI: V4 i.. STRPTR */ +#define MUIA_Height \ + (MUIB_MUI | 0x00423237) /* MUI: V4 ..g LONG */ +#define MUIA_HorizDisappear \ + (MUIB_MUI | 0x00429615) /* MUI: V11 isg LONG */ +#define MUIA_HorizWeight \ + (MUIB_MUI | 0x00426db9) /* MUI: V4 isg WORD */ +#define MUIA_InnerBottom \ + (MUIB_MUI | 0x0042f2c0) /* MUI: V4 i.g LONG */ +#define MUIA_InnerLeft \ + (MUIB_MUI | 0x004228f8) /* MUI: V4 i.g LONG */ +#define MUIA_InnerRight \ + (MUIB_MUI | 0x004297ff) /* MUI: V4 i.g LONG */ +#define MUIA_InnerTop \ + (MUIB_MUI | 0x00421eb6) /* MUI: V4 i.g LONG */ +#define MUIA_InputMode \ + (MUIB_MUI | 0x0042fb04) /* MUI: V4 i.. LONG */ +#define MUIA_LeftEdge \ + (MUIB_MUI | 0x0042bec6) /* MUI: V4 ..g LONG */ +#define MUIA_MaxHeight \ + (MUIB_MUI | 0x004293e4) /* MUI: V11 i.. LONG */ +#define MUIA_MaxWidth \ + (MUIB_MUI | 0x0042f112) /* MUI: V11 i.. LONG */ +#define MUIA_Pressed \ + (MUIB_MUI | 0x00423535) /* MUI: V4 ..g BOOL */ +#define MUIA_RightEdge \ + (MUIB_MUI | 0x0042ba82) /* MUI: V4 ..g LONG */ +#define MUIA_Selected \ + (MUIB_MUI | 0x0042654b) /* MUI: V4 isg BOOL */ +#define MUIA_ShortHelp \ + (MUIB_MUI | 0x00428fe3) /* MUI: V11 isg STRPTR */ +#define MUIA_ShowMe \ + (MUIB_MUI | 0x00429ba8) /* MUI: V4 isg BOOL */ +#define MUIA_ShowSelState \ + (MUIB_MUI | 0x0042caac) /* MUI: V4 i.. BOOL */ +#define MUIA_Timer \ + (MUIB_MUI | 0x00426435) /* MUI: V4 ..g LONG */ +#define MUIA_TopEdge \ + (MUIB_MUI | 0x0042509b) /* MUI: V4 ..g LONG */ +#define MUIA_VertDisappear \ + (MUIB_MUI | 0x0042d12f) /* MUI: V11 isg LONG */ +#define MUIA_VertWeight \ + (MUIB_MUI | 0x004298d0) /* MUI: V4 isg WORD */ +#define MUIA_Weight \ + (MUIB_MUI | 0x00421d1f) /* MUI: V4 i.. WORD */ +#define MUIA_Width \ + (MUIB_MUI | 0x0042b59c) /* MUI: V4 ..g LONG */ +#define MUIA_Window \ + (MUIB_MUI | 0x00421591) /* MUI: V4 ..g struct Window * */ +#define MUIA_WindowObject \ + (MUIB_MUI | 0x0042669e) /* MUI: V4 ..g Object * */ + +#define MUIA_NestedDisabled \ + (MUIB_Area | 0x00000000) /* Zune 20030530 isg BOOL */ + +#ifdef MUI_OBSOLETE +#define MUIA_ExportID (MUIB_MUI | 0x0042d76e) /* V4 isg ULONG */ +#endif /* MUI_OBSOLETE */ + +struct MUI_ImageSpec_intern; + +struct MUI_AreaData +{ + struct MUI_RenderInfo *mad_RenderInfo; /* RenderInfo for this object */ + struct MUI_ImageSpec_intern *mad_Background; /* bg setting - *private* ! */ + struct TextFont *mad_Font; /* Font which is used to draw */ + struct MUI_MinMax mad_MinMax; /* min/max/default dimensions */ + struct IBox mad_Box; /* coordinates and dim of this object after layouted */ + BYTE mad_addleft; /* left offset (frame & innerspacing) */ + BYTE mad_addtop; /* top offset (frame & innerspacing) */ + BYTE mad_subwidth; /* additional width (frame & innerspacing) */ + BYTE mad_subheight; /* additional height (frame & innerspacing) */ + ULONG mad_Flags; /* some flags; see below */ + ULONG mad_Flags2; +// 40 bytes up to here + + /* The following data is private */ + /* START PRIV */ +// offset 40 + UWORD mad_HorizWeight; /* weight values for layout. default 100 */ + UWORD mad_VertWeight; +// offset 44 +// ? +// offset 48 + ULONG mad_IDCMP; /* IDCMP flags this listens to (for HandleInput) */ +// offset 52 + CONST_STRPTR mad_BackgroundSpec; +// offset 56 + IPTR mad_FontPreset; /* MUIV_Font_xxx or pointer to struct TextFont */ +// offset 76 + CONST_STRPTR mad_FrameTitle; /* for groups. Req. mad_Frame > 0 */ +// Inner values at offset 88 in MUI: + BYTE mad_InnerLeft; /* frame or hardcoded */ + BYTE mad_InnerTop; + BYTE mad_InnerRight; + BYTE mad_InnerBottom; +// offset 94 + BYTE mad_FrameOBSOLETE; /* frame setting -- private */ +// offset 95 + BYTE mad_InputMode; /* how to react to events */ +// offset 96 + TEXT mad_ControlChar; /* key shortcut */ + BYTE mad_TitleHeightAdd; /* frame title height = mad_TitleBelow + mad_TitleBaseline */ + BYTE mad_TitleHeightBelow; /* height below frame */ + BYTE mad_TitleHeightAbove; /* height above frame */ +// 100 +// ? + IPTR mad_Frame; + WORD mad_HardHeight; /* if harcoded dim (see flags) */ + WORD mad_HardWidth; /* if harcoded dim (see flags) */ + CONST_STRPTR mad_HardWidthTxt; + CONST_STRPTR mad_HardHeightTxt; +// TODO: move SelBack in RenderInfo as it's common for all objects + struct MUI_ImageSpec_intern *mad_SelBack; /* selected state background */ + CONST_STRPTR mad_ShortHelp; /* bubble help */ +// there's an event handler at 114 + struct MUI_EventHandlerNode mad_ehn; + struct MUI_InputHandlerNode mad_Timer; /* MUIA_Timer */ + ULONG mad_Timeval; /* just to trigger notifications */ + struct MUI_EventHandlerNode mad_ccn; /* gross hack for control char */ + Object *mad_ContextMenu; /* menu strip */ + LONG mad_ClickX; /* x position of the initial SELECTDOWN click */ + LONG mad_ClickY; /* y position of the intiial SELECTDOWN click */ + struct ZMenu *mad_ContextZMenu; + struct MUI_EventHandlerNode mad_hiehn; /* Eventhandler to simulate MUIM_HandleInput */ + + LONG mad_DisableCount; /* counts number of disables */ + /* END PRIV */ +// only 148 bytes for the struct in MUI ! +}; + +/* Flags during MUIM_Draw */ +#define MADF_DRAWOBJECT (1<< 0) /* draw object completely */ +#define MADF_DRAWUPDATE (1<< 1) /* update object */ + +#define MADF_DRAWALL (1<< 31) + + +/* mad_Flags, private one */ +#define MADF_DRAW_XXX (1<< 2) /* PRIV - mui verified, what use ? */ +#define MADF_DRAGGABLE (1<< 3) /* PRIV - mui verified */ +#define MADF_MAXHEIGHT (1<< 4) /* PRIV - share bit 6 in mui */ +#define MADF_CYCLECHAIN (1<< 5) /* PRIV - mui verified */ +#define MADF_MAXWIDTH (1<< 6) /* PRIV - share bit 6 in mui */ +#define MADF_DRAGGING (1<< 7) /* PRIV - zune-specific ? */ +#define MADF_OWNBG (1<< 8) /* PRIV - zune-specific ? */ +#define MADF_SHOWME (1<< 9) /* PRIV - mui verified */ +#define MADF_BORDERGADGET (1<< 10) /* PRIV - is a border gadget; zune-specific ? */ +#define MADF_DRAWFRAME (1<< 11) /* PRIV - nearly mui verified */ +#define MADF_DRAW_XXX_2 (1<< 12) /* PRIV - mui verified, what use ? */ +#define MADF_DROPABLE (1<< 13) /* PRIV - mui verified */ +#define MADF_CANDRAW (1<< 14) /* PRIV - roughly mui equivalent */ +#define MADF_DISABLED (1<< 15) /* PRIV - mui verified */ +#define MADF_SHOWSELSTATE (1<< 16) /* PRIV - mui verified */ +#define MADF_PRESSED (1<< 17) /* PRIV - nearly mui verified */ +#define MADF_SELECTED (1<< 18) /* PRIV - mui verified */ +#define MADF_FIXHEIGHT (1<< 19) /* PRIV - zune-specific */ +#define MADF_FILLAREA (1<< 20) /* PRIV - mui verified */ +#define MADF_FIXWIDTH (1<< 22) /* PRIV - zune-specific */ +#define MADF_FIXHEIGHTTXT (1<< 22) /* PRIV - mui verified (unused in zune) */ +#define MADF_INNERLEFT (1<< 23) /* PRIV - mui verified */ +#define MADF_INNERTOP (1<< 24) /* PRIV - mui verified */ +#define MADF_INNERRIGHT (1<< 25) /* PRIV - mui verified */ +#define MADF_INNERBOTTOM (1<< 26) /* PRIV - mui verified */ +#define MADF_FRAMEPHANTOM (1<< 27) /* PRIV - mui verified */ +#define MADF_SETUP (1<< 28) /* PRIV - zune-specific */ + +#define MADF_INVIRTUALGROUP (1<<29) /* PRIV UNDOC: The object is inside a virtual group */ +#define MADF_ISVIRTUALGROUP (1<<30) /* PRIV UNDOC: The object is a virtual group */ + +#define MADF_DRAWFLAGS (MADF_DRAWOBJECT | MADF_DRAWUPDATE | MADF_DRAW_XXX \ + | MADF_DRAWFRAME | MADF_DRAW_XXX_2 | MADF_DRAWALL) + + +// offset 94 (byte) (frame << 1) (lsb is SETUP_DONE flag) +enum +{ + MUIV_Frame_None = 0, + MUIV_Frame_Button, + MUIV_Frame_ImageButton, + MUIV_Frame_Text, + MUIV_Frame_String, + MUIV_Frame_ReadList, + MUIV_Frame_InputList, + MUIV_Frame_Prop, + MUIV_Frame_Gauge, + MUIV_Frame_Group, + MUIV_Frame_PopUp, + MUIV_Frame_Virtual, + MUIV_Frame_Slider, + MUIV_Frame_Knob, + MUIV_Frame_Drag, + MUIV_Frame_Count, + MUIV_Frame_Register = 21, +}; + +// offset 95 +enum +{ + MUIV_InputMode_None = 0, // 0x00 + MUIV_InputMode_RelVerify, // 0x40 (1<<6) + MUIV_InputMode_Immediate, // 0x80 (1<<7) + MUIV_InputMode_Toggle, // 0xc0 (1<<7 | 1<<6) +}; + + + +enum +{ + MUIV_DragQuery_Refuse = 0, + MUIV_DragQuery_Accept, +}; + +enum +{ + MUIV_DragReport_Abort = 0, + MUIV_DragReport_Continue, + MUIV_DragReport_Lock, + MUIV_DragReport_Refresh, +}; + +#define MUIV_CreateBubble_DontHidePointer (1<<0) + +/* A private functions and macros */ +void __area_finish_minmax(Object * obj, struct MUI_MinMax *MinMaxInfo); + +/*#define DRAW_BG_RECURSIVE (1<<1)*/ +#define _vweight(obj) \ + (muiAreaData(obj)->mad_VertWeight) /* accesses private members PRIV */ +#define _hweight(obj) \ + (muiAreaData(obj)->mad_HorizWeight) /* accesses private members PRIV */ + +extern const struct __MUIBuiltinClass _MUI_Area_desc; /* PRIV */ + +#endif /* _MUI_CLASSES_AREA_H */ diff --git a/workbench/libs/muimaster/classes/balance.c b/workbench/libs/muimaster/classes/balance.c dissimilarity index 75% index 355d3b1380..61493aca25 100644 --- a/workbench/libs/muimaster/classes/balance.c +++ b/workbench/libs/muimaster/classes/balance.c @@ -1,812 +1,850 @@ -/* - Copyright © 2002-2006, The AROS Development Team. All rights reserved. - $Id$ -*/ - -#include <string.h> -#include <stdlib.h> - -#include <exec/types.h> - -#include <clib/alib_protos.h> -#include <proto/intuition.h> -#include <proto/graphics.h> -#include <proto/utility.h> -#include <proto/exec.h> -#include <proto/muimaster.h> - -#include "mui.h" -#include "muimaster_intern.h" -#include "support.h" -#include "prefs.h" -#include "balance_private.h" - -/* #define MYDEBUG 0 */ -#include "debug.h" - -extern struct Library *MUIMasterBase; - -/* - * [FirstBound .... <- balance -> .... SecondBound] - */ - - -IPTR Balance__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct Balance_DATA *data; - struct TagItem *tags; - struct TagItem *tag; - - obj = (Object *)DoSuperMethodA(cl, obj, (Msg)msg); - - if (!obj) - return 0; - - /* Initial local instance data */ - data = INST_DATA(cl, obj); - - /* parse initial taglist */ - - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) - { - switch (tag->ti_Tag) - { - case MUIA_Balance_Quiet: - break; - } - } - - data->ehn.ehn_Events = IDCMP_MOUSEBUTTONS; - data->ehn.ehn_Priority = 0; - data->ehn.ehn_Flags = 0; - data->ehn.ehn_Object = obj; - data->ehn.ehn_Class = cl; - - D(bug("Balance_New(0x%lx)\n",obj)); - - return (IPTR)obj; -} - -IPTR Balance__MUIM_Setup(struct IClass *cl, Object *obj, struct MUIP_Setup *msg) -{ - struct Balance_DATA *data = INST_DATA(cl, obj); - - if (!(DoSuperMethodA(cl, obj, (Msg) msg))) - return FALSE; - - if (_parent(obj)) - get(_parent(obj), MUIA_Group_Horiz, &data->horizgroup); - - DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR)&data->ehn); - - return TRUE; -} - -IPTR Balance__MUIM_Cleanup(struct IClass *cl, Object *obj, struct MUIP_Cleanup *msg) -{ - struct Balance_DATA *data = INST_DATA(cl, obj); - - DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR)&data->ehn); - - return DoSuperMethodA(cl, obj, (Msg) msg); -} - -/************************************************************************** - MUIM_AskMinMax -**************************************************************************/ -IPTR Balance__MUIM_AskMinMax(struct IClass *cl, Object *obj, struct MUIP_AskMinMax *msg) -{ - struct Balance_DATA *data = INST_DATA(cl, obj); - - DoSuperMethodA(cl, obj, (Msg)msg); - - if (data->horizgroup) - { - msg->MinMaxInfo->MinWidth += 3; - msg->MinMaxInfo->DefWidth = msg->MinMaxInfo->MinWidth; - msg->MinMaxInfo->MaxWidth = msg->MinMaxInfo->DefWidth; - msg->MinMaxInfo->MaxHeight = MUI_MAXMAX; - } - else - { - msg->MinMaxInfo->MinHeight += 3; - msg->MinMaxInfo->DefHeight = msg->MinMaxInfo->MinHeight; - msg->MinMaxInfo->MaxHeight = msg->MinMaxInfo->DefHeight; - msg->MinMaxInfo->MaxWidth = MUI_MAXMAX; - } - - return TRUE; -} - - -IPTR Balance__MUIM_Draw(struct IClass *cl, Object *obj, struct MUIP_Draw *msg) -{ - struct Balance_DATA *data = INST_DATA(cl, obj); - LONG col1, col2; - - DoSuperMethodA(cl, obj, (Msg)msg); - - if (!(msg->flags & MADF_DRAWOBJECT)) - return 0; - - if (_mwidth(obj) < 1 || _mheight(obj) < 1) - return TRUE; - - if (data->state == NOT_CLICKED) - { - col1 = MPEN_TEXT; - col2 = MPEN_SHINE; - } - else - { - col2 = MPEN_TEXT; - col1 = MPEN_SHINE; - } - - if (data->horizgroup) - { - SetAPen(_rp(obj), _pens(obj)[col1]); - Move(_rp(obj), _mleft(obj), _mtop(obj)); - Draw(_rp(obj), _mleft(obj), _mbottom(obj)); - SetAPen(_rp(obj), _pens(obj)[MPEN_FILL]); - Move(_rp(obj), _mleft(obj) + 1, _mtop(obj)); - Draw(_rp(obj), _mleft(obj) + 1, _mbottom(obj)); - SetAPen(_rp(obj), _pens(obj)[col2]); - Move(_rp(obj), _mleft(obj) + 2, _mtop(obj)); - Draw(_rp(obj), _mleft(obj) + 2, _mbottom(obj)); - } - else - { - SetAPen(_rp(obj), _pens(obj)[col1]); - Move(_rp(obj), _mleft(obj), _mtop(obj)); - Draw(_rp(obj), _mright(obj), _mtop(obj)); - SetAPen(_rp(obj), _pens(obj)[MPEN_FILL]); - Move(_rp(obj), _mleft(obj), _mtop(obj) + 1); - Draw(_rp(obj), _mright(obj), _mtop(obj) + 1); - SetAPen(_rp(obj), _pens(obj)[col2]); - Move(_rp(obj), _mleft(obj), _mtop(obj) + 2); - Draw(_rp(obj), _mright(obj), _mtop(obj) + 2); - } - - return TRUE; -} - -static void draw_object_frame (Object *obj, Object *o, BOOL fixed) -{ - SetAPen(_rp(obj), _pens(obj)[MPEN_TEXT]); - Move(_rp(obj), _left(o), _top(o)); - Draw(_rp(obj), _left(o), _bottom(o)); - Draw(_rp(obj), _right(o), _bottom(o)); - Draw(_rp(obj), _right(o), _top(o)); - Draw(_rp(obj), _left(o), _top(o)); - if (!fixed) - { - Draw(_rp(obj), _right(o), _bottom(o)); - Move(_rp(obj), _right(o), _top(o)); - Draw(_rp(obj), _left(o), _bottom(o)); - } -} - -static LONG get_first_bound (struct Balance_DATA *data, Object *obj) -{ - ULONG spacing = 0; - - if (data->horizgroup) - { - get(_parent(obj), MUIA_Group_HorizSpacing, &spacing); - return _left(obj) + _minwidth(obj) + _subwidth(obj) + spacing; - } - else - { - get(_parent(obj), MUIA_Group_VertSpacing, &spacing); - return _top(obj) + _minheight(obj) + _subheight(obj) + spacing; - } -} - -static LONG get_second_bound (struct Balance_DATA *data, Object *obj) -{ - ULONG spacing = 0; - - if (data->horizgroup) - { - get(_parent(obj), MUIA_Group_HorizSpacing, &spacing); - return _right(obj) - _minwidth(obj) - _subwidth(obj) - spacing; - } - else - { - get(_parent(obj), MUIA_Group_VertSpacing, &spacing); - return _bottom(obj) - _minheight(obj) - _subheight(obj) - spacing; - } -} - - -static LONG get_first_bound_multi (struct Balance_DATA *data, Object *obj) -{ - if (data->horizgroup) - { - return _mleft(_parent(obj)); - } - else - { - return _mtop(_parent(obj)); - } -} - -static LONG get_second_bound_multi (struct Balance_DATA *data, Object *obj) -{ - if (data->horizgroup) - { - return _mright(_parent(obj)); - } - else - { - return _mbottom(_parent(obj)); - } -} - -static BOOL is_fixed_size (struct Balance_DATA *data, Object *obj) -{ - if (data->horizgroup) - { - return (_minwidth(obj) == _maxwidth(obj)); - } - else - { - return (_minheight(obj) == _maxheight(obj)); - } -} - - -static ULONG get_total_weight_2(struct Balance_DATA *data, Object *objA, Object *objB) -{ - if (data->horizgroup) - { - return _hweight(objA) + _hweight(objB); - } - else - { - return _vweight(objA) + _vweight(objB); - } -} - - -static void set_weight_2 (struct Balance_DATA *data, WORD current) -{ - LONG weightB; - LONG weightA; - - if (current >= data->second_bound) - { - weightB = 0; - weightA = data->total_weight; - D(bug("weightB = 0\n")); - } - else if (current <= data->first_bound) - { - weightA = 0; - weightB = data->total_weight; - D(bug("weightA = 0\n")); - } - else - { - D(bug("L=%ld, mid=%ld, R=%ld || M=%d\n", - data->first_bound, data->clickpos, data->second_bound, - current)); - weightA = (current - data->first_bound + 1) * data->total_weight - / (data->second_bound - data->first_bound + 1); - - D(bug("found wA = %ld\n", weightA)); - if (weightA > data->total_weight) - { - D(bug("*** weightA > data->total_weight\n")); - weightA = data->total_weight; - } - weightB = data->total_weight - weightA; - } - - if (data->horizgroup) - { - _hweight(data->obj_before) = weightA; - _hweight(data->obj_after) = weightB; - } - else - { - _vweight(data->obj_before) = weightA; - _vweight(data->obj_after) = weightB; - } -} - - -static void recalc_weights_neighbours (struct IClass *cl, Object *obj, WORD mouse) -{ - struct Balance_DATA *data = INST_DATA(cl, obj); - - if ((data->total_weight == -1) || (data->first_bound == -1) || (data->second_bound == -1)) - { - Object *sibling; - Object *object_state; - - object_state = (Object *)data->objs->lh_Head; - while ((sibling = NextObject(&object_state))) - { - if (!(_flags(sibling) & MADF_SHOWME)) - continue; -/* D(bug("sibling %lx\n", sibling)); */ - if (sibling == obj) - { - while ((sibling = NextObject(&object_state))) - { - if (!(_flags(sibling) & MADF_SHOWME)) - continue; - data->obj_after = sibling; - break; - } - break; - } - data->obj_before = sibling; - } - if (!(data->obj_before && data->obj_after)) - { - D(bug("Balance(%0xlx): missing siblings; before=%lx, after=%lx\n", - obj, data->obj_before, data->obj_after)); - return; - } - if (data->total_weight == -1) - data->total_weight = get_total_weight_2(data, data->obj_before, data->obj_after); - if (data->first_bound == -1) - data->first_bound = get_first_bound(data, data->obj_before); - if (data->second_bound == -1) - data->second_bound = get_second_bound(data, data->obj_after); - } - - set_weight_2(data, mouse); -} - -static LONG get_weight (struct Balance_DATA *data, Object *obj) -{ - if (data->horizgroup) - { - return _hweight(obj); - } - else - { - return _vweight(obj); - } -} - -static void set_weight (struct Balance_DATA *data, Object *obj, LONG w) -{ - if (data->horizgroup) - { - _hweight(obj) = w; - } - else - { - _vweight(obj) = w; - } -} - -static LONG get_size (struct Balance_DATA *data, Object *obj) -{ - if (data->horizgroup) - { - return _width(obj); - } - else - { - return _height(obj); - } -} - -#if 0 -static void set_interpolated_weight (struct Balance_DATA *data, Object *obj, - LONG oldw, LONG neww) -{ - if (data->horizgroup) - { - if (oldw) - _hweight(obj) = _hweight(obj) * neww / oldw; - else - _hweight(obj) = 0; - } - else - { - if (oldw) - _vweight(obj) = _vweight(obj) * neww / oldw; - else - _vweight(obj) = 0; - } - -} -#endif - -static void set_weight_all (struct Balance_DATA *data, Object *obj, WORD current) -{ - LONG weightB; - LONG weightA; - LONG ldelta, rdelta, lwbygad, rwbygad, lbonus, rbonus, lneg, rneg, lzero, rzero, count; - int lfirst, rfirst; - - { - if (data->lsize && data->rsize) - { - weightA = data->lsum - + ((current - data->clickpos) - * ((data->lsum / (double)data->lsize) + (data->rsum / (double)data->rsize)) - / 2.0); - } - else - weightA = data->lsum; - - if (weightA > data->total_weight) - { - D(bug("*** weightA > data->total_weight\n")); - weightA = data->total_weight; - } - if (weightA < 0) - { - D(bug("*** weightA < 0n")); - weightA = 0; - } - weightB = data->total_weight - weightA; - D(bug("normal : weights = %ld/%ld\n", weightA, weightB)); - } - - ldelta = weightA - data->oldWeightA; - rdelta = weightB - data->oldWeightB; - lwbygad = ldelta / data->lsiblings; - rwbygad = rdelta / data->rsiblings; - lbonus = ldelta % data->lsiblings; - if (lbonus < 0) - lbonus = -lbonus; - rbonus = rdelta % data->rsiblings; - if (rbonus < 0) - rbonus = -rbonus; - lfirst = (int) ((double)data->lsiblings*rand()/(RAND_MAX+1.0)); - rfirst = (int) ((double)data->rsiblings*rand()/(RAND_MAX+1.0)); - - count = 0; - do - { - Object *sibling; - Object *object_state; - WORD left = data->lsiblings; - - D(bug("delta=%ld/%ld; wbygad=%ld/%ld; bonus=%ld/%ld; first=%d/%d\n", ldelta, rdelta, - lwbygad, rwbygad, lbonus, rbonus, lfirst, rfirst)); - - if (count++ == 4) - { - D(bug("avoiding deadloop\n")); - break; - } - lneg = 0; - rneg = 0; - lzero = 0; - rzero = 0; - -/* D(bug("left weight : from %d to %d\n", data->lsum, weightA)); */ -/* D(bug("right weight : from %d to %d\n", data->rsum, weightB)); */ - object_state = (Object *)data->objs->lh_Head; - while ((sibling = NextObject(&object_state))) - { - if (!(_flags(sibling) & MADF_SHOWME)) - continue; - if (is_fixed_size(data, sibling)) - continue; - -/* D(bug(" B %d\n", left)); */ - if (left > 0) - { - WORD w1, w2; - w1 = get_weight(data, sibling); - w2 = w1; - if (w2 || (count < 2)) - { - w2 += lwbygad; - if ((lfirst-- <= 0) && lbonus-- > 0) - w2 += ((ldelta > 0) ? 1 : -1); - if (w2 < 0) - { - lzero++; - lneg += w2; - w2 = 0; - } - set_weight(data, sibling, w2); - /* D(bug(" w (left) from %d to %d (%ld -> %ld)\n", w1, w2, data->oldWeightA, weightA)); */ - } - } - else - { - WORD w1, w2; - w1 = get_weight(data, sibling); - w2 = w1; - if (w2 || (count < 2)) - { - w2 += rwbygad; - if ((rfirst-- <= 0) && rbonus-- > 0) - w2 += ((rdelta > 0) ? 1 : -1); - if (w2 < 0) - { - rzero++; - rneg += w2; - w2 = 0; - } - set_weight(data, sibling, w2); - /* D(bug(" w (right) from %d to %d (%ld -> %ld)\n", w1, w2, data->oldWeightB, weightB)); */ - } - } - left--; - } - if (lzero == data->lsiblings) - break; - if (rzero == data->rsiblings) - break; - - lwbygad = lneg / (data->lsiblings - lzero); - lbonus = -(lneg % (data->lsiblings - lzero)) + lbonus; - rwbygad = rneg / (data->rsiblings - rzero); - rbonus = -(rneg % (data->rsiblings - rzero)) + rbonus; - } while (lneg || rneg || (lbonus > 0) || (rbonus > 0)); - - data->oldWeightA = weightA; - data->oldWeightB = weightB; -} - - -static void recalc_weights_all (struct IClass *cl, Object *obj, WORD mouse) -{ - struct Balance_DATA *data = INST_DATA(cl, obj); - Object *first = NULL; - Object *last = NULL; - - D(bug("recalc_weights_all\n")); - - if ((data->total_weight == -1) || (data->lsiblings == -1) || (data->rsiblings == -1) - || (data->first_bound == -1) || (data->second_bound == -1)) - { - Object *sibling; - Object *object_state; - Object *next; - BOOL mid = FALSE; - - data->lsum = 0; - data->rsum = 0; - data->lsize = 0; - data->rsize = 0; - - object_state = (Object *)data->objs->lh_Head; - for (next = NextObject(&object_state); next ; next = NextObject(&object_state)) - { - sibling = next; - if (!(_flags(sibling) & MADF_SHOWME)) - continue; - - if (sibling == obj) - { - mid = TRUE; - data->rsiblings = 0; - continue; - } - - if (is_fixed_size(data, sibling)) - continue; - - if (!first) - { - first = sibling; - data->lsiblings = 1; - data->lsum += get_weight(data, sibling); - data->lsize += get_size(data, sibling); - } - else - { - if (!mid) - { - data->lsiblings++; - data->lsum += get_weight(data, sibling); - data->lsize += get_size(data, sibling); - } - else - { - data->rsiblings++; - data->rsum += get_weight(data, sibling); - data->rsize += get_size(data, sibling); - last = sibling; - } - } - } - - if (!first || !mid || !last) - return; - if (data->total_weight == -1) - data->total_weight = data->lsum + data->rsum; - - if (data->first_bound == -1) - data->first_bound = get_first_bound_multi(data, first); - - if (data->second_bound == -1) - data->second_bound = get_second_bound_multi(data, last); - - data->oldWeightA = data->lsum; - data->oldWeightB = data->rsum; - } - D(bug("Total Weight = %ld, left = %ld, right = %ld\n", data->total_weight, data->lsum, data->rsum)); - D(bug("bound 1 = %ld, bound 2 = %ld\n", data->first_bound, data->second_bound)); - set_weight_all(data, obj, mouse); -} - - -static void handle_move (struct IClass *cl, Object *obj, WORD mouse) -{ - struct Balance_DATA *data = INST_DATA(cl, obj); - - if (data->state == CLICKED) - recalc_weights_all(cl, obj, mouse); - else if (data->state == SHIFT_CLICKED) - recalc_weights_neighbours(cl, obj, mouse); - else - return; - - /* full drawing, or sketch */ - if (muiGlobalInfo(obj)->mgi_Prefs->balancing_look == BALANCING_SHOW_OBJECTS) - { - DoMethod(_parent(obj), MUIM_Hide); - - /* relayout with new weights */ - DoMethod(_parent(obj), MUIM_Layout); - - DoMethod(_parent(obj), MUIM_Show); - - MUI_Redraw(_parent(obj), MADF_DRAWALL); - } - else - { - Object *sibling; - Object *object_state; - - DoMethod(_parent(obj), MUIM_DrawBackground, _mleft(_parent(obj)), - _mtop(_parent(obj)), _mwidth(_parent(obj)), _mheight(_parent(obj)), - 0, 0, 0); - - /* relayout with new weights */ - DoMethod(_parent(obj), MUIM_Layout); - - DoMethod(obj, MADF_DRAWOBJECT); - - /* for each child, draw a black frame */ - object_state = (Object *)data->objs->lh_Head; - while ((sibling = NextObject(&object_state))) - { - if ((!(_flags(sibling) & MADF_SHOWME)) && (obj != sibling)) - continue; -/* D(bug("sibling %lx\n", sibling)); */ - - draw_object_frame(obj, sibling, is_fixed_size(data, sibling)); - } - } -} - - -/************************************************************************** - MUIM_HandleEvent -**************************************************************************/ -IPTR Balance__MUIM_HandleEvent(struct IClass *cl, Object *obj, struct MUIP_HandleEvent *msg) -{ - struct Balance_DATA *data = INST_DATA(cl, obj); - - if (msg->imsg) - { - switch (msg->imsg->Class) - { - case IDCMP_MOUSEBUTTONS: - if (msg->imsg->Code == SELECTDOWN) - { - if (_isinobject(msg->imsg->MouseX, msg->imsg->MouseY)) - { - get(_parent(obj), MUIA_Group_ChildList, &data->objs); - data->clickpos = data->horizgroup ? msg->imsg->MouseX : msg->imsg->MouseY; - data->lastpos = data->clickpos; - DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR)&data->ehn); - data->ehn.ehn_Events |= IDCMP_MOUSEMOVE; - DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR)&data->ehn); - if (msg->imsg->Qualifier & (IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT)) - { - data->state = SHIFT_CLICKED; - data->obj_before = NULL; - data->obj_after = NULL; - } - else - { - data->state = CLICKED; - data->lsiblings = -1; - data->rsiblings = -1; - } - data->total_weight = -1; - data->first_bound = -1; - data->second_bound = -1; - srand(1); - MUI_Redraw(obj, MADF_DRAWOBJECT); - } - } - else /* msg->imsg->Code != SELECTDOWN */ - { - if (data->state != NOT_CLICKED) - { - DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR)&data->ehn); - data->ehn.ehn_Events &= ~IDCMP_MOUSEMOVE; - DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR)&data->ehn); - data->state = NOT_CLICKED; - if (data->total_weight != -1) - { - DoMethod(_parent(obj), MUIM_Hide); - - /* relayout with new weights */ - DoMethod(_parent(obj), MUIM_Layout); - - DoMethod(_parent(obj), MUIM_Show); - MUI_Redraw(_parent(obj), MADF_DRAWOBJECT); - } - else - MUI_Redraw(obj, MADF_DRAWALL); - } - } - break; - - case IDCMP_MOUSEMOVE: - { - if ((data->horizgroup) && (msg->imsg->MouseX == data->lastpos)) - break; - if ((!data->horizgroup) && (msg->imsg->MouseY == data->lastpos)) - break; - data->lazy ^= 1; - if (data->lazy) - break; - - DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR)&data->ehn); - - if (data->horizgroup) - { - handle_move(cl, obj, msg->imsg->MouseX); - data->lastpos = msg->imsg->MouseX; - } - else - { - handle_move(cl, obj, msg->imsg->MouseY); - data->lastpos = msg->imsg->MouseY; - } - - data->ehn.ehn_Events |= IDCMP_MOUSEMOVE; - DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR)&data->ehn); - } - break; - } - } - - return 0; -} - -#if ZUNE_BUILTIN_BALANCE -BOOPSI_DISPATCHER(IPTR, Balance_Dispatcher, cl, obj, msg) -{ - switch (msg->MethodID) - { - case OM_NEW: return Balance__OM_NEW(cl, obj, (struct opSet *) msg); - case MUIM_Setup: return Balance__MUIM_Setup(cl, obj, (APTR)msg); - case MUIM_Cleanup: return Balance__MUIM_Cleanup(cl, obj, (APTR)msg); - case MUIM_AskMinMax: return Balance__MUIM_AskMinMax(cl, obj, (APTR)msg); - case MUIM_Draw: return Balance__MUIM_Draw(cl, obj, (APTR)msg); - case MUIM_HandleEvent: return Balance__MUIM_HandleEvent(cl, obj, (APTR)msg); - default: return DoSuperMethodA(cl, obj, msg); - } -} -BOOPSI_DISPATCHER_END - -const struct __MUIBuiltinClass _MUI_Balance_desc = -{ - MUIC_Balance, - MUIC_Area, - sizeof(struct Balance_DATA), - (void*)Balance_Dispatcher -}; -#endif +/* + Copyright © 2002-2006, The AROS Development Team. All rights reserved. + $Id$ +*/ + +#include <string.h> +#include <stdlib.h> + +#include <exec/types.h> + +#include <clib/alib_protos.h> +#include <proto/intuition.h> +#include <proto/graphics.h> +#include <proto/utility.h> +#include <proto/exec.h> +#include <proto/muimaster.h> + +#include "mui.h" +#include "muimaster_intern.h" +#include "support.h" +#include "prefs.h" +#include "balance_private.h" + +/* #define MYDEBUG 0 */ +#include "debug.h" + +extern struct Library *MUIMasterBase; + +/* + * [FirstBound .... <- balance -> .... SecondBound] + */ + + +IPTR Balance__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) +{ + struct Balance_DATA *data; + struct TagItem *tags; + struct TagItem *tag; + + obj = (Object *) DoSuperMethodA(cl, obj, (Msg) msg); + + if (!obj) + return 0; + + /* Initial local instance data */ + data = INST_DATA(cl, obj); + + /* parse initial taglist */ + + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) + { + switch (tag->ti_Tag) + { + case MUIA_Balance_Quiet: + break; + } + } + + data->ehn.ehn_Events = IDCMP_MOUSEBUTTONS; + data->ehn.ehn_Priority = 0; + data->ehn.ehn_Flags = 0; + data->ehn.ehn_Object = obj; + data->ehn.ehn_Class = cl; + + D(bug("Balance_New(0x%lx)\n", obj)); + + return (IPTR) obj; +} + +IPTR Balance__MUIM_Setup(struct IClass *cl, Object *obj, + struct MUIP_Setup *msg) +{ + struct Balance_DATA *data = INST_DATA(cl, obj); + + if (!(DoSuperMethodA(cl, obj, (Msg) msg))) + return FALSE; + + if (_parent(obj)) + get(_parent(obj), MUIA_Group_Horiz, &data->horizgroup); + + DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR) & data->ehn); + + return TRUE; +} + +IPTR Balance__MUIM_Cleanup(struct IClass *cl, Object *obj, + struct MUIP_Cleanup *msg) +{ + struct Balance_DATA *data = INST_DATA(cl, obj); + + DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR) & data->ehn); + + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +/************************************************************************** + MUIM_AskMinMax +**************************************************************************/ +IPTR Balance__MUIM_AskMinMax(struct IClass *cl, Object *obj, + struct MUIP_AskMinMax *msg) +{ + struct Balance_DATA *data = INST_DATA(cl, obj); + + DoSuperMethodA(cl, obj, (Msg) msg); + + if (data->horizgroup) + { + msg->MinMaxInfo->MinWidth += 3; + msg->MinMaxInfo->DefWidth = msg->MinMaxInfo->MinWidth; + msg->MinMaxInfo->MaxWidth = msg->MinMaxInfo->DefWidth; + msg->MinMaxInfo->MaxHeight = MUI_MAXMAX; + } + else + { + msg->MinMaxInfo->MinHeight += 3; + msg->MinMaxInfo->DefHeight = msg->MinMaxInfo->MinHeight; + msg->MinMaxInfo->MaxHeight = msg->MinMaxInfo->DefHeight; + msg->MinMaxInfo->MaxWidth = MUI_MAXMAX; + } + + return TRUE; +} + + +IPTR Balance__MUIM_Draw(struct IClass *cl, Object *obj, + struct MUIP_Draw *msg) +{ + struct Balance_DATA *data = INST_DATA(cl, obj); + LONG col1, col2; + + DoSuperMethodA(cl, obj, (Msg) msg); + + if (!(msg->flags & MADF_DRAWOBJECT)) + return 0; + + if (_mwidth(obj) < 1 || _mheight(obj) < 1) + return TRUE; + + if (data->state == NOT_CLICKED) + { + col1 = MPEN_TEXT; + col2 = MPEN_SHINE; + } + else + { + col2 = MPEN_TEXT; + col1 = MPEN_SHINE; + } + + if (data->horizgroup) + { + SetAPen(_rp(obj), _pens(obj)[col1]); + Move(_rp(obj), _mleft(obj), _mtop(obj)); + Draw(_rp(obj), _mleft(obj), _mbottom(obj)); + SetAPen(_rp(obj), _pens(obj)[MPEN_FILL]); + Move(_rp(obj), _mleft(obj) + 1, _mtop(obj)); + Draw(_rp(obj), _mleft(obj) + 1, _mbottom(obj)); + SetAPen(_rp(obj), _pens(obj)[col2]); + Move(_rp(obj), _mleft(obj) + 2, _mtop(obj)); + Draw(_rp(obj), _mleft(obj) + 2, _mbottom(obj)); + } + else + { + SetAPen(_rp(obj), _pens(obj)[col1]); + Move(_rp(obj), _mleft(obj), _mtop(obj)); + Draw(_rp(obj), _mright(obj), _mtop(obj)); + SetAPen(_rp(obj), _pens(obj)[MPEN_FILL]); + Move(_rp(obj), _mleft(obj), _mtop(obj) + 1); + Draw(_rp(obj), _mright(obj), _mtop(obj) + 1); + SetAPen(_rp(obj), _pens(obj)[col2]); + Move(_rp(obj), _mleft(obj), _mtop(obj) + 2); + Draw(_rp(obj), _mright(obj), _mtop(obj) + 2); + } + + return TRUE; +} + +static void draw_object_frame(Object *obj, Object *o, BOOL fixed) +{ + SetAPen(_rp(obj), _pens(obj)[MPEN_TEXT]); + Move(_rp(obj), _left(o), _top(o)); + Draw(_rp(obj), _left(o), _bottom(o)); + Draw(_rp(obj), _right(o), _bottom(o)); + Draw(_rp(obj), _right(o), _top(o)); + Draw(_rp(obj), _left(o), _top(o)); + if (!fixed) + { + Draw(_rp(obj), _right(o), _bottom(o)); + Move(_rp(obj), _right(o), _top(o)); + Draw(_rp(obj), _left(o), _bottom(o)); + } +} + +static LONG get_first_bound(struct Balance_DATA *data, Object *obj) +{ + ULONG spacing = 0; + + if (data->horizgroup) + { + get(_parent(obj), MUIA_Group_HorizSpacing, &spacing); + return _left(obj) + _minwidth(obj) + _subwidth(obj) + spacing; + } + else + { + get(_parent(obj), MUIA_Group_VertSpacing, &spacing); + return _top(obj) + _minheight(obj) + _subheight(obj) + spacing; + } +} + +static LONG get_second_bound(struct Balance_DATA *data, Object *obj) +{ + ULONG spacing = 0; + + if (data->horizgroup) + { + get(_parent(obj), MUIA_Group_HorizSpacing, &spacing); + return _right(obj) - _minwidth(obj) - _subwidth(obj) - spacing; + } + else + { + get(_parent(obj), MUIA_Group_VertSpacing, &spacing); + return _bottom(obj) - _minheight(obj) - _subheight(obj) - spacing; + } +} + + +static LONG get_first_bound_multi(struct Balance_DATA *data, Object *obj) +{ + if (data->horizgroup) + { + return _mleft(_parent(obj)); + } + else + { + return _mtop(_parent(obj)); + } +} + +static LONG get_second_bound_multi(struct Balance_DATA *data, Object *obj) +{ + if (data->horizgroup) + { + return _mright(_parent(obj)); + } + else + { + return _mbottom(_parent(obj)); + } +} + +static BOOL is_fixed_size(struct Balance_DATA *data, Object *obj) +{ + if (data->horizgroup) + { + return (_minwidth(obj) == _maxwidth(obj)); + } + else + { + return (_minheight(obj) == _maxheight(obj)); + } +} + + +static ULONG get_total_weight_2(struct Balance_DATA *data, Object *objA, + Object *objB) +{ + if (data->horizgroup) + { + return _hweight(objA) + _hweight(objB); + } + else + { + return _vweight(objA) + _vweight(objB); + } +} + + +static void set_weight_2(struct Balance_DATA *data, WORD current) +{ + LONG weightB; + LONG weightA; + + if (current >= data->second_bound) + { + weightB = 0; + weightA = data->total_weight; + D(bug("weightB = 0\n")); + } + else if (current <= data->first_bound) + { + weightA = 0; + weightB = data->total_weight; + D(bug("weightA = 0\n")); + } + else + { + D(bug("L=%ld, mid=%ld, R=%ld || M=%d\n", + data->first_bound, data->clickpos, data->second_bound, + current)); + weightA = (current - data->first_bound + 1) * data->total_weight + / (data->second_bound - data->first_bound + 1); + + D(bug("found wA = %ld\n", weightA)); + if (weightA > data->total_weight) + { + D(bug("*** weightA > data->total_weight\n")); + weightA = data->total_weight; + } + weightB = data->total_weight - weightA; + } + + if (data->horizgroup) + { + _hweight(data->obj_before) = weightA; + _hweight(data->obj_after) = weightB; + } + else + { + _vweight(data->obj_before) = weightA; + _vweight(data->obj_after) = weightB; + } +} + + +static void recalc_weights_neighbours(struct IClass *cl, Object *obj, + WORD mouse) +{ + struct Balance_DATA *data = INST_DATA(cl, obj); + + if ((data->total_weight == -1) || (data->first_bound == -1) + || (data->second_bound == -1)) + { + Object *sibling; + Object *object_state; + + object_state = (Object *) data->objs->lh_Head; + while ((sibling = NextObject(&object_state))) + { + if (!(_flags(sibling) & MADF_SHOWME)) + continue; +/* D(bug("sibling %lx\n", sibling)); */ + if (sibling == obj) + { + while ((sibling = NextObject(&object_state))) + { + if (!(_flags(sibling) & MADF_SHOWME)) + continue; + data->obj_after = sibling; + break; + } + break; + } + data->obj_before = sibling; + } + if (!(data->obj_before && data->obj_after)) + { + D(bug + ("Balance(%0xlx): missing siblings; before=%lx, after=%lx\n", + obj, data->obj_before, data->obj_after)); + return; + } + if (data->total_weight == -1) + data->total_weight = + get_total_weight_2(data, data->obj_before, data->obj_after); + if (data->first_bound == -1) + data->first_bound = get_first_bound(data, data->obj_before); + if (data->second_bound == -1) + data->second_bound = get_second_bound(data, data->obj_after); + } + + set_weight_2(data, mouse); +} + +static LONG get_weight(struct Balance_DATA *data, Object *obj) +{ + if (data->horizgroup) + { + return _hweight(obj); + } + else + { + return _vweight(obj); + } +} + +static void set_weight(struct Balance_DATA *data, Object *obj, LONG w) +{ + if (data->horizgroup) + { + _hweight(obj) = w; + } + else + { + _vweight(obj) = w; + } +} + +static LONG get_size(struct Balance_DATA *data, Object *obj) +{ + if (data->horizgroup) + { + return _width(obj); + } + else + { + return _height(obj); + } +} + +#if 0 +static void set_interpolated_weight(struct Balance_DATA *data, Object *obj, + LONG oldw, LONG neww) +{ + if (data->horizgroup) + { + if (oldw) + _hweight(obj) = _hweight(obj) * neww / oldw; + else + _hweight(obj) = 0; + } + else + { + if (oldw) + _vweight(obj) = _vweight(obj) * neww / oldw; + else + _vweight(obj) = 0; + } + +} +#endif + +static void set_weight_all(struct Balance_DATA *data, Object *obj, + WORD current) +{ + LONG weightB; + LONG weightA; + LONG ldelta, rdelta, lwbygad, rwbygad, lbonus, rbonus, lneg, rneg, + lzero, rzero, count; + int lfirst, rfirst; + + { + if (data->lsize && data->rsize) + { + weightA = data->lsum + + ((current - data->clickpos) + * ((data->lsum / (double)data->lsize) + + (data->rsum / (double)data->rsize)) / 2.0); + } + else + weightA = data->lsum; + + if (weightA > data->total_weight) + { + D(bug("*** weightA > data->total_weight\n")); + weightA = data->total_weight; + } + if (weightA < 0) + { + D(bug("*** weightA < 0n")); + weightA = 0; + } + weightB = data->total_weight - weightA; + D(bug("normal : weights = %ld/%ld\n", weightA, weightB)); + } + + ldelta = weightA - data->oldWeightA; + rdelta = weightB - data->oldWeightB; + lwbygad = ldelta / data->lsiblings; + rwbygad = rdelta / data->rsiblings; + lbonus = ldelta % data->lsiblings; + if (lbonus < 0) + lbonus = -lbonus; + rbonus = rdelta % data->rsiblings; + if (rbonus < 0) + rbonus = -rbonus; + lfirst = (int)((double)data->lsiblings * rand() / (RAND_MAX + 1.0)); + rfirst = (int)((double)data->rsiblings * rand() / (RAND_MAX + 1.0)); + + count = 0; + do + { + Object *sibling; + Object *object_state; + WORD left = data->lsiblings; + + D(bug("delta=%ld/%ld; wbygad=%ld/%ld; bonus=%ld/%ld; first=%d/%d\n", + ldelta, rdelta, lwbygad, rwbygad, lbonus, rbonus, lfirst, + rfirst)); + + if (count++ == 4) + { + D(bug("avoiding deadloop\n")); + break; + } + lneg = 0; + rneg = 0; + lzero = 0; + rzero = 0; + +/* D(bug("left weight : from %d to %d\n", data->lsum, weightA)); */ +/* D(bug("right weight : from %d to %d\n", data->rsum, weightB)); */ + object_state = (Object *) data->objs->lh_Head; + while ((sibling = NextObject(&object_state))) + { + if (!(_flags(sibling) & MADF_SHOWME)) + continue; + if (is_fixed_size(data, sibling)) + continue; + +/* D(bug(" B %d\n", left)); */ + if (left > 0) + { + WORD w1, w2; + w1 = get_weight(data, sibling); + w2 = w1; + if (w2 || (count < 2)) + { + w2 += lwbygad; + if ((lfirst-- <= 0) && lbonus-- > 0) + w2 += ((ldelta > 0) ? 1 : -1); + if (w2 < 0) + { + lzero++; + lneg += w2; + w2 = 0; + } + set_weight(data, sibling, w2); + /* D(bug(" w (left) from %d to %d (%ld -> %ld)\n", + * w1, w2, data->oldWeightA, weightA)); */ + } + } + else + { + WORD w1, w2; + w1 = get_weight(data, sibling); + w2 = w1; + if (w2 || (count < 2)) + { + w2 += rwbygad; + if ((rfirst-- <= 0) && rbonus-- > 0) + w2 += ((rdelta > 0) ? 1 : -1); + if (w2 < 0) + { + rzero++; + rneg += w2; + w2 = 0; + } + set_weight(data, sibling, w2); + /* D(bug(" w (right) from %d to %d (%ld -> %ld)\n", + * w1, w2, data->oldWeightB, weightB)); */ + } + } + left--; + } + if (lzero == data->lsiblings) + break; + if (rzero == data->rsiblings) + break; + + lwbygad = lneg / (data->lsiblings - lzero); + lbonus = -(lneg % (data->lsiblings - lzero)) + lbonus; + rwbygad = rneg / (data->rsiblings - rzero); + rbonus = -(rneg % (data->rsiblings - rzero)) + rbonus; + } + while (lneg || rneg || (lbonus > 0) || (rbonus > 0)); + + data->oldWeightA = weightA; + data->oldWeightB = weightB; +} + + +static void recalc_weights_all(struct IClass *cl, Object *obj, WORD mouse) +{ + struct Balance_DATA *data = INST_DATA(cl, obj); + Object *first = NULL; + Object *last = NULL; + + D(bug("recalc_weights_all\n")); + + if ((data->total_weight == -1) || (data->lsiblings == -1) + || (data->rsiblings == -1) || (data->first_bound == -1) + || (data->second_bound == -1)) + { + Object *sibling; + Object *object_state; + Object *next; + BOOL mid = FALSE; + + data->lsum = 0; + data->rsum = 0; + data->lsize = 0; + data->rsize = 0; + + object_state = (Object *) data->objs->lh_Head; + for (next = NextObject(&object_state); next; + next = NextObject(&object_state)) + { + sibling = next; + if (!(_flags(sibling) & MADF_SHOWME)) + continue; + + if (sibling == obj) + { + mid = TRUE; + data->rsiblings = 0; + continue; + } + + if (is_fixed_size(data, sibling)) + continue; + + if (!first) + { + first = sibling; + data->lsiblings = 1; + data->lsum += get_weight(data, sibling); + data->lsize += get_size(data, sibling); + } + else + { + if (!mid) + { + data->lsiblings++; + data->lsum += get_weight(data, sibling); + data->lsize += get_size(data, sibling); + } + else + { + data->rsiblings++; + data->rsum += get_weight(data, sibling); + data->rsize += get_size(data, sibling); + last = sibling; + } + } + } + + if (!first || !mid || !last) + return; + if (data->total_weight == -1) + data->total_weight = data->lsum + data->rsum; + + if (data->first_bound == -1) + data->first_bound = get_first_bound_multi(data, first); + + if (data->second_bound == -1) + data->second_bound = get_second_bound_multi(data, last); + + data->oldWeightA = data->lsum; + data->oldWeightB = data->rsum; + } + D(bug("Total Weight = %ld, left = %ld, right = %ld\n", + data->total_weight, data->lsum, data->rsum)); + D(bug("bound 1 = %ld, bound 2 = %ld\n", data->first_bound, + data->second_bound)); + set_weight_all(data, obj, mouse); +} + + +static void handle_move(struct IClass *cl, Object *obj, WORD mouse) +{ + struct Balance_DATA *data = INST_DATA(cl, obj); + + if (data->state == CLICKED) + recalc_weights_all(cl, obj, mouse); + else if (data->state == SHIFT_CLICKED) + recalc_weights_neighbours(cl, obj, mouse); + else + return; + + /* full drawing, or sketch */ + if (muiGlobalInfo(obj)->mgi_Prefs->balancing_look == + BALANCING_SHOW_OBJECTS) + { + DoMethod(_parent(obj), MUIM_Hide); + + /* relayout with new weights */ + DoMethod(_parent(obj), MUIM_Layout); + + DoMethod(_parent(obj), MUIM_Show); + + MUI_Redraw(_parent(obj), MADF_DRAWALL); + } + else + { + Object *sibling; + Object *object_state; + + DoMethod(_parent(obj), MUIM_DrawBackground, _mleft(_parent(obj)), + _mtop(_parent(obj)), _mwidth(_parent(obj)), + _mheight(_parent(obj)), 0, 0, 0); + + /* relayout with new weights */ + DoMethod(_parent(obj), MUIM_Layout); + + DoMethod(obj, MADF_DRAWOBJECT); + + /* for each child, draw a black frame */ + object_state = (Object *) data->objs->lh_Head; + while ((sibling = NextObject(&object_state))) + { + if ((!(_flags(sibling) & MADF_SHOWME)) && (obj != sibling)) + continue; +/* D(bug("sibling %lx\n", sibling)); */ + + draw_object_frame(obj, sibling, is_fixed_size(data, sibling)); + } + } +} + + +/************************************************************************** + MUIM_HandleEvent +**************************************************************************/ +IPTR Balance__MUIM_HandleEvent(struct IClass *cl, Object *obj, + struct MUIP_HandleEvent *msg) +{ + struct Balance_DATA *data = INST_DATA(cl, obj); + + if (msg->imsg) + { + switch (msg->imsg->Class) + { + case IDCMP_MOUSEBUTTONS: + if (msg->imsg->Code == SELECTDOWN) + { + if (_isinobject(msg->imsg->MouseX, msg->imsg->MouseY)) + { + get(_parent(obj), MUIA_Group_ChildList, &data->objs); + data->clickpos = + data->horizgroup ? msg->imsg->MouseX : msg->imsg-> + MouseY; + data->lastpos = data->clickpos; + DoMethod(_win(obj), MUIM_Window_RemEventHandler, + (IPTR) & data->ehn); + data->ehn.ehn_Events |= IDCMP_MOUSEMOVE; + DoMethod(_win(obj), MUIM_Window_AddEventHandler, + (IPTR) & data->ehn); + if (msg->imsg-> + Qualifier & (IEQUALIFIER_LSHIFT | + IEQUALIFIER_RSHIFT)) + { + data->state = SHIFT_CLICKED; + data->obj_before = NULL; + data->obj_after = NULL; + } + else + { + data->state = CLICKED; + data->lsiblings = -1; + data->rsiblings = -1; + } + data->total_weight = -1; + data->first_bound = -1; + data->second_bound = -1; + srand(1); + MUI_Redraw(obj, MADF_DRAWOBJECT); + } + } + else /* msg->imsg->Code != SELECTDOWN */ + { + if (data->state != NOT_CLICKED) + { + DoMethod(_win(obj), MUIM_Window_RemEventHandler, + (IPTR) & data->ehn); + data->ehn.ehn_Events &= ~IDCMP_MOUSEMOVE; + DoMethod(_win(obj), MUIM_Window_AddEventHandler, + (IPTR) & data->ehn); + data->state = NOT_CLICKED; + if (data->total_weight != -1) + { + DoMethod(_parent(obj), MUIM_Hide); + + /* relayout with new weights */ + DoMethod(_parent(obj), MUIM_Layout); + + DoMethod(_parent(obj), MUIM_Show); + MUI_Redraw(_parent(obj), MADF_DRAWOBJECT); + } + else + MUI_Redraw(obj, MADF_DRAWALL); + } + } + break; + + case IDCMP_MOUSEMOVE: + { + if ((data->horizgroup) + && (msg->imsg->MouseX == data->lastpos)) + break; + if ((!data->horizgroup) + && (msg->imsg->MouseY == data->lastpos)) + break; + data->lazy ^= 1; + if (data->lazy) + break; + + DoMethod(_win(obj), MUIM_Window_RemEventHandler, + (IPTR) & data->ehn); + + if (data->horizgroup) + { + handle_move(cl, obj, msg->imsg->MouseX); + data->lastpos = msg->imsg->MouseX; + } + else + { + handle_move(cl, obj, msg->imsg->MouseY); + data->lastpos = msg->imsg->MouseY; + } + + data->ehn.ehn_Events |= IDCMP_MOUSEMOVE; + DoMethod(_win(obj), MUIM_Window_AddEventHandler, + (IPTR) & data->ehn); + } + break; + } + } + + return 0; +} + +#if ZUNE_BUILTIN_BALANCE +BOOPSI_DISPATCHER(IPTR, Balance_Dispatcher, cl, obj, msg) +{ + switch (msg->MethodID) + { + case OM_NEW: + return Balance__OM_NEW(cl, obj, (struct opSet *)msg); + case MUIM_Setup: + return Balance__MUIM_Setup(cl, obj, (APTR) msg); + case MUIM_Cleanup: + return Balance__MUIM_Cleanup(cl, obj, (APTR) msg); + case MUIM_AskMinMax: + return Balance__MUIM_AskMinMax(cl, obj, (APTR) msg); + case MUIM_Draw: + return Balance__MUIM_Draw(cl, obj, (APTR) msg); + case MUIM_HandleEvent: + return Balance__MUIM_HandleEvent(cl, obj, (APTR) msg); + default: + return DoSuperMethodA(cl, obj, msg); + } +} +BOOPSI_DISPATCHER_END const struct __MUIBuiltinClass _MUI_Balance_desc = +{ + MUIC_Balance, + MUIC_Area, + sizeof(struct Balance_DATA), + (void *)Balance_Dispatcher +}; +#endif diff --git a/workbench/libs/muimaster/classes/balance.h b/workbench/libs/muimaster/classes/balance.h index 4a52d7476b..b6e0dc998b 100644 --- a/workbench/libs/muimaster/classes/balance.h +++ b/workbench/libs/muimaster/classes/balance.h @@ -13,7 +13,8 @@ #define MUIB_Balance (MUIB_ZUNE | 0x00000300) /*** Attributes *************************************************************/ -#define MUIA_Balance_Quiet (MUIB_Balance | 0x00000000) /* (zune) V20 i LONG */ +#define MUIA_Balance_Quiet \ + (MUIB_Balance | 0x00000000) /* (zune) V20 i LONG */ extern const struct __MUIBuiltinClass _MUI_Balance_desc; /* PRIV */ diff --git a/workbench/libs/muimaster/classes/bitmap.c b/workbench/libs/muimaster/classes/bitmap.c dissimilarity index 66% index 478de8cab0..977287ca1c 100644 --- a/workbench/libs/muimaster/classes/bitmap.c +++ b/workbench/libs/muimaster/classes/bitmap.c @@ -1,552 +1,574 @@ -/* - Copyright © 2002-2011, The AROS Development Team. All rights reserved. - $Id$ -*/ - -#include <graphics/gfx.h> -#include <graphics/view.h> -#include <clib/alib_protos.h> -#include <cybergraphx/cybergraphics.h> -#include <proto/exec.h> -#include <proto/graphics.h> -#include <proto/utility.h> -#include <proto/cybergraphics.h> -#include <proto/intuition.h> -#include <proto/muimaster.h> - -#include "mui.h" -#include "muimaster_intern.h" -#include "support.h" - -#include <string.h> - -extern struct Library *MUIMasterBase; - -struct MUI_BitmapData -{ - struct BitMap *bm, *remapped_bm; - ULONG *sourcecolors; - LONG width, height, precision, transparent; - UBYTE *mappingtable; - PLANEPTR mask; - WORD *remaptable; - BYTE usefriend; -}; - -static void remap_bitmap(struct IClass *cl, Object *obj) -{ - struct MUI_BitmapData *data = INST_DATA(cl, obj); - struct BitMap *friendbm = NULL; - struct RastPort temprp, bmrp, *scrrp; - UBYTE *linebuffer; - ULONG *cgfxcoltab = NULL; - LONG bmflags = 0; - WORD bmdepth, bmwidth, bmheight, bmcols, x, y; - - if (!data->mappingtable && !data->sourcecolors) return; - if (!data->bm || (data->width < 1) || (data->height < 1)) return; - - /* Don't remap if bitmap is hicolor/truecolor */ - if (GetBitMapAttr(data->bm, BMA_DEPTH) > 8) return; - - if (!data->mappingtable && !data->remaptable) - { - data->remaptable = AllocVec(256 * sizeof(WORD), MEMF_PUBLIC | MEMF_CLEAR); - if (!data->remaptable) return; - } - - scrrp = &_screen(obj)->RastPort; - - if (data->usefriend) - { - friendbm = scrrp->BitMap; - bmflags |= BMF_MINPLANES; - } - - linebuffer = AllocVec(data->width + 16, MEMF_PUBLIC); - if (!linebuffer) return; - - bmdepth = GetBitMapAttr(scrrp->BitMap, BMA_DEPTH); - if (bmdepth > 8) bmdepth = 8; - - bmcols = 1L << bmdepth; - - data->remapped_bm = AllocBitMap(data->width, data->height, bmdepth, bmflags, friendbm); - - if (!data->remapped_bm) - { - FreeVec(linebuffer); - return; - } - - bmwidth = GetBitMapAttr(data->remapped_bm, BMA_WIDTH); - bmheight = GetBitMapAttr(data->remapped_bm, BMA_HEIGHT); - - if (data->transparent != -1) - { - data->mask = AllocRaster(bmwidth,bmheight); - memset(data->mask, 0xff, RASSIZE(bmwidth, bmheight)); - } - - if (CyberGfxBase && - !data->mappingtable && - (GetBitMapAttr(data->remapped_bm, BMA_DEPTH) >= 15)) - { - cgfxcoltab = AllocVec(bmcols * sizeof(ULONG), MEMF_ANY); - - if (cgfxcoltab) - { - for(y = 0; y < bmcols; y++) - { - ULONG red = data->sourcecolors[y * 3] & 0xFF000000; - ULONG green = data->sourcecolors[y * 3 + 1] & 0xFF000000; - ULONG blue = data->sourcecolors[y * 3 + 2] & 0xFF000000; - - cgfxcoltab[y] = (red >> 8) | (green >> 16) | (blue >> 24); - } - } - - } - - InitRastPort(&temprp); - temprp.BitMap = AllocBitMap(data->width, 1, 1, 0, NULL); - - InitRastPort(&bmrp); - - for(y = 0; y < data->height; y++) - { - /* Read a line from source bitmap */ - - bmrp.BitMap = data->bm; - if (temprp.BitMap) - { - ReadPixelLine8(&bmrp, 0, y, data->width, linebuffer, &temprp); - } - else - { - for(x = 0; x < data->width; x++) - { - linebuffer[x] = ReadPixel(&bmrp, x, y); - } - } - - /* Build the mask, totaly slow but works */ - if (data->mask) - { - UBYTE *mask = data->mask + y * bmwidth / 8; - UBYTE xmask = 0x80; - - for(x = 0; x < data->width; x++) - { - if (linebuffer[x] == data->transparent) - { - *mask &= ~xmask; - } - - xmask >>= 1; - if (!xmask) - { - xmask = 0x80; - mask++; - } - } - } - - /* Remap the line */ - if (data->mappingtable) - { - for(x = 0; x < data->width; x++) - { - linebuffer[x] = data->mappingtable[linebuffer[x]]; - } - } - else if (!cgfxcoltab) - { - for(x = 0; x < data->width; x++) - { - UBYTE pixel = linebuffer[x]; - UBYTE remappixel = data->remaptable[pixel]; - - if (!remappixel) - { - struct TagItem tags[3]; - tags[0].ti_Tag = OBP_Precision; - tags[0].ti_Data = data->precision; - tags[1].ti_Tag = OBP_FailIfBad; - tags[1].ti_Data = FALSE; - tags[2].ti_Tag = 0; - - data->remaptable[pixel] = remappixel = ObtainBestPenA(_screen(obj)->ViewPort.ColorMap, - data->sourcecolors[pixel * 3], - data->sourcecolors[pixel * 3 + 1], - data->sourcecolors[pixel * 3 + 2], - tags) | 0x100; - } - - linebuffer[x] = (remappixel & 0xFF); - } - - } /* else if (!cgfxcoltab) */ - - /* Write line into destination bitmap */ - - bmrp.BitMap = data->remapped_bm; - - if (cgfxcoltab) - { - WriteLUTPixelArray(linebuffer, - 0, - 0, - data->width, - &bmrp, - cgfxcoltab, - 0, - y, - data->width, - 1, - CTABFMT_XRGB8); - } - else - { - bmrp.BitMap = data->remapped_bm; - if (temprp.BitMap) - { - WritePixelLine8(&bmrp, 0, y, data->width, linebuffer, &temprp); - } - else - { - for(x = 0; x < data->width; x++) - { - SetAPen(&bmrp, linebuffer[x]); - WritePixel(&bmrp, x, y); - } - } - - } - - } /* for(y = 0; y < data->height; y++) */ - - if (temprp.BitMap) - { - WaitBlit(); - FreeBitMap(temprp.BitMap); - } - - FreeVec(cgfxcoltab); - FreeVec(linebuffer); -} - -/************************************************************************** - OM_NEW -**************************************************************************/ -IPTR Bitmap__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct MUI_BitmapData *data; - struct TagItem *tag, *tags; - - obj = (Object *)DoSuperMethodA(cl, obj, (Msg)msg); - if (!obj) return FALSE; - - data = INST_DATA(cl, obj); - - data->precision = PRECISION_GUI; - data->transparent = -1; - - /* parse initial taglist */ - - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) - { - switch (tag->ti_Tag) - { - case MUIA_Bitmap_Bitmap: - data->bm = (struct BitMap *)tag->ti_Data; - break; - - case MUIA_Bitmap_Height: - data->height = (LONG)tag->ti_Data; - break; - - case MUIA_Bitmap_MappingTable: - data->mappingtable = (UBYTE *)tag->ti_Data; - break; - - case MUIA_Bitmap_Precision: - data->precision = (LONG)tag->ti_Data; - break; - - case MUIA_Bitmap_SourceColors: - data->sourcecolors = (ULONG *)tag->ti_Data; - break; - - case MUIA_Bitmap_Transparent: - data->transparent = (LONG)tag->ti_Data; - break; - - case MUIA_Bitmap_UseFriend: - data->usefriend = (tag->ti_Data != 0); - break; - - case MUIA_Bitmap_Width: - data->width = (LONG)tag->ti_Data; - break; - - } - } - - return (IPTR)obj; -} - -/************************************************************************** - OM_DISPOSE -**************************************************************************/ -IPTR Bitmap__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) -{ - struct MUI_BitmapData *data = INST_DATA(cl, obj); - - if (data->remapped_bm) - { - WaitBlit(); - FreeBitMap(data->remapped_bm); - } - if (data->remaptable) FreeVec(data->remaptable); - - return DoSuperMethodA(cl, obj, msg); -} - -/************************************************************************** - OM_SET -**************************************************************************/ -IPTR Bitmap__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct MUI_BitmapData *data = INST_DATA(cl, obj); - struct TagItem *tags = msg->ops_AttrList; - struct TagItem *tag; - - while ((tag = NextTagItem(&tags)) != NULL) - { - switch (tag->ti_Tag) - { - case MUIA_Bitmap_Bitmap: - if (!data->remapped_bm) - { - data->bm = (struct BitMap *)tag->ti_Data; - } - break; - - case MUIA_Bitmap_Height: - data->height = (LONG)tag->ti_Data; - break; - - case MUIA_Bitmap_MappingTable: - data->mappingtable = (UBYTE *)tag->ti_Data; - break; - - case MUIA_Bitmap_Precision: - data->precision = (LONG)tag->ti_Data; - break; - - case MUIA_Bitmap_SourceColors: - data->sourcecolors = (ULONG *)tag->ti_Data; - break; - - case MUIA_Bitmap_Transparent: - data->transparent = (LONG)tag->ti_Data; - break; - - case MUIA_Bitmap_Width: - data->width = (LONG)tag->ti_Data; - break; - - } - } - - return DoSuperMethodA(cl, obj, (Msg)msg); -} - -/************************************************************************** - OM_GET -**************************************************************************/ -IPTR Bitmap__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) -{ -#define STORE *(msg->opg_Storage) - - struct MUI_BitmapData *data = INST_DATA(cl, obj); - - switch(msg->opg_AttrID) - { - case MUIA_Bitmap_Bitmap: - STORE = (IPTR)data->bm; - return TRUE; - - case MUIA_Bitmap_Height: - STORE = (IPTR)data->height; - return TRUE; - - case MUIA_Bitmap_MappingTable: - STORE = (IPTR)data->mappingtable; - return TRUE; - - case MUIA_Bitmap_Precision: - STORE = (IPTR)data->precision; - return TRUE; - - case MUIA_Bitmap_RemappedBitmap: - STORE = (IPTR)data->remapped_bm; - return TRUE; - - case MUIA_Bitmap_SourceColors: - STORE = (IPTR)data->sourcecolors; - return TRUE; - - case MUIA_Bitmap_Transparent: - STORE = (IPTR)data->transparent; - return TRUE; - - case MUIA_Bitmap_Width: - STORE = (IPTR)data->width; - return TRUE; - } - - return DoSuperMethodA(cl, obj, (Msg)msg); -#undef STORE -} - -/************************************************************************** - MUIM_Setup -**************************************************************************/ -IPTR Bitmap__MUIM_Setup(struct IClass *cl, Object *obj, Msg msg) -{ - //struct MUI_BitmapData *data = INST_DATA(cl, obj); - - if (!DoSuperMethodA(cl, obj, (Msg)msg)) - return FALSE; - - remap_bitmap(cl, obj); - - return TRUE; -} - -/************************************************************************** - MUIM_Cleanup -**************************************************************************/ -IPTR Bitmap__MUIM_Cleanup(struct IClass *cl, Object *obj, Msg msg) -{ - struct MUI_BitmapData *data = INST_DATA(cl, obj); - - if (data->mask) - { - LONG bmwidth = GetBitMapAttr(data->remapped_bm, BMA_WIDTH); - LONG bmheight = GetBitMapAttr(data->remapped_bm, BMA_HEIGHT); - FreeRaster(data->mask,bmwidth,bmheight); - - data->mask = NULL; - } - - if (data->remapped_bm) - { - WaitBlit(); - FreeBitMap(data->remapped_bm); - data->remapped_bm = NULL; - - if (data->remaptable) - { - WORD i; - - for(i = 0; i < 256; i++) - { - if (data->remaptable[i]) - { - ReleasePen(_screen(obj)->ViewPort.ColorMap, data->remaptable[i] & 0xFF); - data->remaptable[i] = 0; - } - } - } - } - - return DoSuperMethodA(cl, obj, (Msg)msg); -} - -/************************************************************************** - MUIM_AskMinMax -**************************************************************************/ -IPTR Bitmap__MUIM_AskMinMax(struct IClass *cl, Object *obj, struct MUIP_AskMinMax *msg) -{ - DoSuperMethodA(cl, obj, (Msg)msg); - - msg->MinMaxInfo->MinWidth += 1; - msg->MinMaxInfo->MinHeight += 1; - - msg->MinMaxInfo->DefWidth += 1; - msg->MinMaxInfo->DefHeight += 1; - - msg->MinMaxInfo->MaxWidth = MUI_MAXMAX; - msg->MinMaxInfo->MaxHeight = MUI_MAXMAX; - - return TRUE; -} - -/************************************************************************** - MUIM_Draw -**************************************************************************/ -IPTR Bitmap__MUIM_Draw(struct IClass *cl, Object *obj, struct MUIP_Draw *msg) -{ - struct MUI_BitmapData *data = INST_DATA(cl, obj); - struct BitMap *bm; - - DoSuperMethodA(cl,obj,(Msg)msg); - - bm = data->remapped_bm ? data->remapped_bm : data->bm; - if (bm) - { - LONG width, height; - - width = data->width; - height = data->height; - - if (width > _mwidth(obj)) width = _mwidth(obj); - if (height > _mheight(obj)) height = _mheight(obj); - - if ((width > 0) && (height > 0)) - { - if (data->mask) - { - BltMaskBitMapRastPort(bm, 0, 0, _rp(obj), _mleft(obj), _mtop(obj), width, height, 0xE0, data->mask); - } - else - { - BltBitMapRastPort(bm, 0, 0, _rp(obj), _mleft(obj), _mtop(obj), width, height, 0xC0); - } - } - } - - return TRUE; -} - - -BOOPSI_DISPATCHER(IPTR, Bitmap_Dispatcher, cl, obj, msg) -{ - switch (msg->MethodID) - { - case OM_NEW: return Bitmap__OM_NEW(cl, obj, (struct opSet *)msg); - case OM_DISPOSE: return Bitmap__OM_DISPOSE(cl, obj, msg); - case OM_SET: return Bitmap__OM_SET(cl, obj, (struct opSet *)msg); - case OM_GET: return Bitmap__OM_GET(cl, obj, (struct opGet *)msg); - case MUIM_Setup: return Bitmap__MUIM_Setup(cl, obj, msg); - case MUIM_Cleanup: return Bitmap__MUIM_Cleanup(cl, obj, msg); - case MUIM_AskMinMax: return Bitmap__MUIM_AskMinMax(cl, obj, (struct MUIP_AskMinMax *)msg); - case MUIM_Draw: return Bitmap__MUIM_Draw(cl, obj, (struct MUIP_Draw *)msg); - } - - return DoSuperMethodA(cl, obj, msg); -} -BOOPSI_DISPATCHER_END - -/* - * Class descriptor. - */ -const struct __MUIBuiltinClass _MUI_Bitmap_desc = { - MUIC_Bitmap, - MUIC_Area, - sizeof(struct MUI_BitmapData), - (void*)Bitmap_Dispatcher -}; +/* + Copyright © 2002-2011, The AROS Development Team. All rights reserved. + $Id$ +*/ + +#include <graphics/gfx.h> +#include <graphics/view.h> +#include <clib/alib_protos.h> +#include <cybergraphx/cybergraphics.h> +#include <proto/exec.h> +#include <proto/graphics.h> +#include <proto/utility.h> +#include <proto/cybergraphics.h> +#include <proto/intuition.h> +#include <proto/muimaster.h> + +#include "mui.h" +#include "muimaster_intern.h" +#include "support.h" + +#include <string.h> + +extern struct Library *MUIMasterBase; + +struct MUI_BitmapData +{ + struct BitMap *bm, *remapped_bm; + ULONG *sourcecolors; + LONG width, height, precision, transparent; + UBYTE *mappingtable; + PLANEPTR mask; + WORD *remaptable; + BYTE usefriend; +}; + +static void remap_bitmap(struct IClass *cl, Object *obj) +{ + struct MUI_BitmapData *data = INST_DATA(cl, obj); + struct BitMap *friendbm = NULL; + struct RastPort temprp, bmrp, *scrrp; + UBYTE *linebuffer; + ULONG *cgfxcoltab = NULL; + LONG bmflags = 0; + WORD bmdepth, bmwidth, bmheight, bmcols, x, y; + + if (!data->mappingtable && !data->sourcecolors) + return; + if (!data->bm || (data->width < 1) || (data->height < 1)) + return; + + /* Don't remap if bitmap is hicolor/truecolor */ + if (GetBitMapAttr(data->bm, BMA_DEPTH) > 8) + return; + + if (!data->mappingtable && !data->remaptable) + { + data->remaptable = + AllocVec(256 * sizeof(WORD), MEMF_PUBLIC | MEMF_CLEAR); + if (!data->remaptable) + return; + } + + scrrp = &_screen(obj)->RastPort; + + if (data->usefriend) + { + friendbm = scrrp->BitMap; + bmflags |= BMF_MINPLANES; + } + + linebuffer = AllocVec(data->width + 16, MEMF_PUBLIC); + if (!linebuffer) + return; + + bmdepth = GetBitMapAttr(scrrp->BitMap, BMA_DEPTH); + if (bmdepth > 8) + bmdepth = 8; + + bmcols = 1L << bmdepth; + + data->remapped_bm = + AllocBitMap(data->width, data->height, bmdepth, bmflags, friendbm); + + if (!data->remapped_bm) + { + FreeVec(linebuffer); + return; + } + + bmwidth = GetBitMapAttr(data->remapped_bm, BMA_WIDTH); + bmheight = GetBitMapAttr(data->remapped_bm, BMA_HEIGHT); + + if (data->transparent != -1) + { + data->mask = AllocRaster(bmwidth, bmheight); + memset(data->mask, 0xff, RASSIZE(bmwidth, bmheight)); + } + + if (CyberGfxBase && + !data->mappingtable && + (GetBitMapAttr(data->remapped_bm, BMA_DEPTH) >= 15)) + { + cgfxcoltab = AllocVec(bmcols * sizeof(ULONG), MEMF_ANY); + + if (cgfxcoltab) + { + for (y = 0; y < bmcols; y++) + { + ULONG red = data->sourcecolors[y * 3] & 0xFF000000; + ULONG green = data->sourcecolors[y * 3 + 1] & 0xFF000000; + ULONG blue = data->sourcecolors[y * 3 + 2] & 0xFF000000; + + cgfxcoltab[y] = (red >> 8) | (green >> 16) | (blue >> 24); + } + } + + } + + InitRastPort(&temprp); + temprp.BitMap = AllocBitMap(data->width, 1, 1, 0, NULL); + + InitRastPort(&bmrp); + + for (y = 0; y < data->height; y++) + { + /* Read a line from source bitmap */ + + bmrp.BitMap = data->bm; + if (temprp.BitMap) + { + ReadPixelLine8(&bmrp, 0, y, data->width, linebuffer, &temprp); + } + else + { + for (x = 0; x < data->width; x++) + { + linebuffer[x] = ReadPixel(&bmrp, x, y); + } + } + + /* Build the mask, totaly slow but works */ + if (data->mask) + { + UBYTE *mask = data->mask + y * bmwidth / 8; + UBYTE xmask = 0x80; + + for (x = 0; x < data->width; x++) + { + if (linebuffer[x] == data->transparent) + { + *mask &= ~xmask; + } + + xmask >>= 1; + if (!xmask) + { + xmask = 0x80; + mask++; + } + } + } + + /* Remap the line */ + if (data->mappingtable) + { + for (x = 0; x < data->width; x++) + { + linebuffer[x] = data->mappingtable[linebuffer[x]]; + } + } + else if (!cgfxcoltab) + { + for (x = 0; x < data->width; x++) + { + UBYTE pixel = linebuffer[x]; + UBYTE remappixel = data->remaptable[pixel]; + + if (!remappixel) + { + struct TagItem tags[3]; + tags[0].ti_Tag = OBP_Precision; + tags[0].ti_Data = data->precision; + tags[1].ti_Tag = OBP_FailIfBad; + tags[1].ti_Data = FALSE; + tags[2].ti_Tag = 0; + + data->remaptable[pixel] = remappixel = + ObtainBestPenA(_screen(obj)->ViewPort.ColorMap, + data->sourcecolors[pixel * 3], + data->sourcecolors[pixel * 3 + 1], + data->sourcecolors[pixel * 3 + 2], tags) | 0x100; + } + + linebuffer[x] = (remappixel & 0xFF); + } + + } + + /* Write line into destination bitmap */ + + bmrp.BitMap = data->remapped_bm; + + if (cgfxcoltab) + { + WriteLUTPixelArray(linebuffer, + 0, + 0, + data->width, + &bmrp, cgfxcoltab, 0, y, data->width, 1, CTABFMT_XRGB8); + } + else + { + bmrp.BitMap = data->remapped_bm; + if (temprp.BitMap) + { + WritePixelLine8(&bmrp, 0, y, data->width, linebuffer, + &temprp); + } + else + { + for (x = 0; x < data->width; x++) + { + SetAPen(&bmrp, linebuffer[x]); + WritePixel(&bmrp, x, y); + } + } + + } + + } + + if (temprp.BitMap) + { + WaitBlit(); + FreeBitMap(temprp.BitMap); + } + + FreeVec(cgfxcoltab); + FreeVec(linebuffer); +} + +/************************************************************************** + OM_NEW +**************************************************************************/ +IPTR Bitmap__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) +{ + struct MUI_BitmapData *data; + struct TagItem *tag, *tags; + + obj = (Object *) DoSuperMethodA(cl, obj, (Msg) msg); + if (!obj) + return FALSE; + + data = INST_DATA(cl, obj); + + data->precision = PRECISION_GUI; + data->transparent = -1; + + /* parse initial taglist */ + + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) + { + switch (tag->ti_Tag) + { + case MUIA_Bitmap_Bitmap: + data->bm = (struct BitMap *)tag->ti_Data; + break; + + case MUIA_Bitmap_Height: + data->height = (LONG) tag->ti_Data; + break; + + case MUIA_Bitmap_MappingTable: + data->mappingtable = (UBYTE *) tag->ti_Data; + break; + + case MUIA_Bitmap_Precision: + data->precision = (LONG) tag->ti_Data; + break; + + case MUIA_Bitmap_SourceColors: + data->sourcecolors = (ULONG *) tag->ti_Data; + break; + + case MUIA_Bitmap_Transparent: + data->transparent = (LONG) tag->ti_Data; + break; + + case MUIA_Bitmap_UseFriend: + data->usefriend = (tag->ti_Data != 0); + break; + + case MUIA_Bitmap_Width: + data->width = (LONG) tag->ti_Data; + break; + + } + } + + return (IPTR) obj; +} + +/************************************************************************** + OM_DISPOSE +**************************************************************************/ +IPTR Bitmap__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) +{ + struct MUI_BitmapData *data = INST_DATA(cl, obj); + + if (data->remapped_bm) + { + WaitBlit(); + FreeBitMap(data->remapped_bm); + } + if (data->remaptable) + FreeVec(data->remaptable); + + return DoSuperMethodA(cl, obj, msg); +} + +/************************************************************************** + OM_SET +**************************************************************************/ +IPTR Bitmap__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) +{ + struct MUI_BitmapData *data = INST_DATA(cl, obj); + struct TagItem *tags = msg->ops_AttrList; + struct TagItem *tag; + + while ((tag = NextTagItem(&tags)) != NULL) + { + switch (tag->ti_Tag) + { + case MUIA_Bitmap_Bitmap: + if (!data->remapped_bm) + { + data->bm = (struct BitMap *)tag->ti_Data; + } + break; + + case MUIA_Bitmap_Height: + data->height = (LONG) tag->ti_Data; + break; + + case MUIA_Bitmap_MappingTable: + data->mappingtable = (UBYTE *) tag->ti_Data; + break; + + case MUIA_Bitmap_Precision: + data->precision = (LONG) tag->ti_Data; + break; + + case MUIA_Bitmap_SourceColors: + data->sourcecolors = (ULONG *) tag->ti_Data; + break; + + case MUIA_Bitmap_Transparent: + data->transparent = (LONG) tag->ti_Data; + break; + + case MUIA_Bitmap_Width: + data->width = (LONG) tag->ti_Data; + break; + + } + } + + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +/************************************************************************** + OM_GET +**************************************************************************/ +IPTR Bitmap__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) +{ +#define STORE *(msg->opg_Storage) + + struct MUI_BitmapData *data = INST_DATA(cl, obj); + + switch (msg->opg_AttrID) + { + case MUIA_Bitmap_Bitmap: + STORE = (IPTR) data->bm; + return TRUE; + + case MUIA_Bitmap_Height: + STORE = (IPTR) data->height; + return TRUE; + + case MUIA_Bitmap_MappingTable: + STORE = (IPTR) data->mappingtable; + return TRUE; + + case MUIA_Bitmap_Precision: + STORE = (IPTR) data->precision; + return TRUE; + + case MUIA_Bitmap_RemappedBitmap: + STORE = (IPTR) data->remapped_bm; + return TRUE; + + case MUIA_Bitmap_SourceColors: + STORE = (IPTR) data->sourcecolors; + return TRUE; + + case MUIA_Bitmap_Transparent: + STORE = (IPTR) data->transparent; + return TRUE; + + case MUIA_Bitmap_Width: + STORE = (IPTR) data->width; + return TRUE; + } + + return DoSuperMethodA(cl, obj, (Msg) msg); +#undef STORE +} + +/************************************************************************** + MUIM_Setup +**************************************************************************/ +IPTR Bitmap__MUIM_Setup(struct IClass *cl, Object *obj, Msg msg) +{ + //struct MUI_BitmapData *data = INST_DATA(cl, obj); + + if (!DoSuperMethodA(cl, obj, (Msg) msg)) + return FALSE; + + remap_bitmap(cl, obj); + + return TRUE; +} + +/************************************************************************** + MUIM_Cleanup +**************************************************************************/ +IPTR Bitmap__MUIM_Cleanup(struct IClass *cl, Object *obj, Msg msg) +{ + struct MUI_BitmapData *data = INST_DATA(cl, obj); + + if (data->mask) + { + LONG bmwidth = GetBitMapAttr(data->remapped_bm, BMA_WIDTH); + LONG bmheight = GetBitMapAttr(data->remapped_bm, BMA_HEIGHT); + FreeRaster(data->mask, bmwidth, bmheight); + + data->mask = NULL; + } + + if (data->remapped_bm) + { + WaitBlit(); + FreeBitMap(data->remapped_bm); + data->remapped_bm = NULL; + + if (data->remaptable) + { + WORD i; + + for (i = 0; i < 256; i++) + { + if (data->remaptable[i]) + { + ReleasePen(_screen(obj)->ViewPort.ColorMap, + data->remaptable[i] & 0xFF); + data->remaptable[i] = 0; + } + } + } + } + + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +/************************************************************************** + MUIM_AskMinMax +**************************************************************************/ +IPTR Bitmap__MUIM_AskMinMax(struct IClass *cl, Object *obj, + struct MUIP_AskMinMax *msg) +{ + DoSuperMethodA(cl, obj, (Msg) msg); + + msg->MinMaxInfo->MinWidth += 1; + msg->MinMaxInfo->MinHeight += 1; + + msg->MinMaxInfo->DefWidth += 1; + msg->MinMaxInfo->DefHeight += 1; + + msg->MinMaxInfo->MaxWidth = MUI_MAXMAX; + msg->MinMaxInfo->MaxHeight = MUI_MAXMAX; + + return TRUE; +} + +/************************************************************************** + MUIM_Draw +**************************************************************************/ +IPTR Bitmap__MUIM_Draw(struct IClass *cl, Object *obj, + struct MUIP_Draw *msg) +{ + struct MUI_BitmapData *data = INST_DATA(cl, obj); + struct BitMap *bm; + + DoSuperMethodA(cl, obj, (Msg) msg); + + bm = data->remapped_bm ? data->remapped_bm : data->bm; + if (bm) + { + LONG width, height; + + width = data->width; + height = data->height; + + if (width > _mwidth(obj)) + width = _mwidth(obj); + if (height > _mheight(obj)) + height = _mheight(obj); + + if ((width > 0) && (height > 0)) + { + if (data->mask) + { + BltMaskBitMapRastPort(bm, 0, 0, _rp(obj), _mleft(obj), + _mtop(obj), width, height, 0xE0, data->mask); + } + else + { + BltBitMapRastPort(bm, 0, 0, _rp(obj), _mleft(obj), + _mtop(obj), width, height, 0xC0); + } + } + } + + return TRUE; +} + + +BOOPSI_DISPATCHER(IPTR, Bitmap_Dispatcher, cl, obj, msg) +{ + switch (msg->MethodID) + { + case OM_NEW: + return Bitmap__OM_NEW(cl, obj, (struct opSet *)msg); + case OM_DISPOSE: + return Bitmap__OM_DISPOSE(cl, obj, msg); + case OM_SET: + return Bitmap__OM_SET(cl, obj, (struct opSet *)msg); + case OM_GET: + return Bitmap__OM_GET(cl, obj, (struct opGet *)msg); + case MUIM_Setup: + return Bitmap__MUIM_Setup(cl, obj, msg); + case MUIM_Cleanup: + return Bitmap__MUIM_Cleanup(cl, obj, msg); + case MUIM_AskMinMax: + return Bitmap__MUIM_AskMinMax(cl, obj, + (struct MUIP_AskMinMax *)msg); + case MUIM_Draw: + return Bitmap__MUIM_Draw(cl, obj, (struct MUIP_Draw *)msg); + } + + return DoSuperMethodA(cl, obj, msg); +} +BOOPSI_DISPATCHER_END + +/* + * Class descriptor. + */ +const struct __MUIBuiltinClass _MUI_Bitmap_desc = +{ + MUIC_Bitmap, + MUIC_Area, + sizeof(struct MUI_BitmapData), + (void *) Bitmap_Dispatcher +}; diff --git a/workbench/libs/muimaster/classes/bitmap.h b/workbench/libs/muimaster/classes/bitmap.h index ecabc01f82..1bfff9afff 100644 --- a/workbench/libs/muimaster/classes/bitmap.h +++ b/workbench/libs/muimaster/classes/bitmap.h @@ -13,15 +13,24 @@ #define MUIB_Bitmap (MUIB_ZUNE | 0x00000400) /*** Attributes *************************************************************/ -#define MUIA_Bitmap_Bitmap (MUIB_MUI|0x004279bd) /* MUI: V8 isg struct BitMap * */ -#define MUIA_Bitmap_Height (MUIB_MUI|0x00421560) /* MUI: V8 isg LONG */ -#define MUIA_Bitmap_MappingTable (MUIB_MUI|0x0042e23d) /* MUI: V8 isg UBYTE * */ -#define MUIA_Bitmap_Precision (MUIB_MUI|0x00420c74) /* MUI: V11 isg LONG */ -#define MUIA_Bitmap_RemappedBitmap (MUIB_MUI|0x00423a47) /* MUI: V11 ..g struct BitMap * */ -#define MUIA_Bitmap_SourceColors (MUIB_MUI|0x00425360) /* MUI: V8 isg ULONG * */ -#define MUIA_Bitmap_Transparent (MUIB_MUI|0x00422805) /* MUI: V8 isg LONG */ -#define MUIA_Bitmap_UseFriend (MUIB_MUI|0x004239d8) /* MUI: V11 i.. BOOL */ -#define MUIA_Bitmap_Width (MUIB_MUI|0x0042eb3a) /* MUI: V8 isg LONG */ +#define MUIA_Bitmap_Bitmap \ + (MUIB_MUI | 0x004279bd) /* MUI: V8 isg struct BitMap * */ +#define MUIA_Bitmap_Height \ + (MUIB_MUI | 0x00421560) /* MUI: V8 isg LONG */ +#define MUIA_Bitmap_MappingTable \ + (MUIB_MUI | 0x0042e23d) /* MUI: V8 isg UBYTE * */ +#define MUIA_Bitmap_Precision \ + (MUIB_MUI | 0x00420c74) /* MUI: V11 isg LONG */ +#define MUIA_Bitmap_RemappedBitmap \ + (MUIB_MUI | 0x00423a47) /* MUI: V11 ..g struct BitMap * */ +#define MUIA_Bitmap_SourceColors \ + (MUIB_MUI | 0x00425360) /* MUI: V8 isg ULONG * */ +#define MUIA_Bitmap_Transparent \ + (MUIB_MUI | 0x00422805) /* MUI: V8 isg LONG */ +#define MUIA_Bitmap_UseFriend \ + (MUIB_MUI | 0x004239d8) /* MUI: V11 i.. BOOL */ +#define MUIA_Bitmap_Width \ + (MUIB_MUI | 0x0042eb3a) /* MUI: V8 isg LONG */ extern const struct __MUIBuiltinClass _MUI_Bitmap_desc; /* PRIV */ diff --git a/workbench/libs/muimaster/classes/bodychunk.c b/workbench/libs/muimaster/classes/bodychunk.c dissimilarity index 60% index dfdeffb32b..338cdf2832 100644 --- a/workbench/libs/muimaster/classes/bodychunk.c +++ b/workbench/libs/muimaster/classes/bodychunk.c @@ -1,397 +1,415 @@ -/* - Copyright © 2002-2011, The AROS Development Team. All rights reserved. - $Id$ -*/ - -#include <graphics/gfx.h> -#include <graphics/view.h> -#include <clib/alib_protos.h> -#include <proto/exec.h> -#include <proto/graphics.h> -#include <proto/utility.h> -#include <proto/intuition.h> -#include <proto/muimaster.h> - -#include "mui.h" -#include "muimaster_intern.h" -#include "support.h" - -extern struct Library *MUIMasterBase; - -struct MUI_BodychunkData -{ - struct BitMap *bm; - UBYTE *body; - LONG width, height, depth; - UBYTE compression; - UBYTE masking; -}; - -static void planar2chunky(UBYTE *src, UBYTE *dest, WORD width, WORD depth, LONG bpr) -{ - UBYTE *s, *d, byte; - UBYTE pmask, dmask = 1, notdmask = ~1; - WORD x, pl; - - for(pl = 0; pl < depth; pl++) - { - pmask = 0x80; - s = src; - d = dest; - - byte = *s++; - - for(x = 0; x < width; x++) - { - if (byte & pmask) - { - *d++ |= dmask; - } - else - { - *d++ &= notdmask; - } - - if (pmask == 0x1) - { - pmask = 0x80; - byte = *s++; - } - else - { - pmask >>= 1; - } - } - - dmask <<= 1; notdmask = ~dmask; - - src += bpr; - } -} - -static UBYTE *unpack_byterun1(UBYTE *src, UBYTE *dest, LONG unpackedsize) -{ - UBYTE r; - BYTE c; - - for(;;) - { - c = (BYTE)(*src++); - if (c >= 0) - { - while(c-- >= 0) - { - *dest++ = *src++; - if (--unpackedsize <= 0) return src; - } - } - else if (c != -128) - { - c = -c; - r = *src++; - - while(c-- >= 0) - { - *dest++ = r; - if (--unpackedsize <= 0) return src; - } - } - } - -} - -static BOOL make_bitmap(struct IClass *cl, Object *obj) -{ - struct MUI_BodychunkData *data = INST_DATA(cl, obj); - struct RastPort bmrp, temprp; - UBYTE *chunkyline; - UBYTE *bodyptr, *unpackptr; - LONG w16, bpr, bpl; - WORD x, y, totdepth; - - if (!data->body || - (data->width < 1) || - (data->height < 1) || - (data->depth < 1) || - (data->depth > 8) || - (data->compression > 1) ) - { - return FALSE; - } - - chunkyline = AllocVec(2 * (data->width + 16), MEMF_PUBLIC | MEMF_CLEAR); - if (!chunkyline) return FALSE; - - unpackptr = chunkyline + data->width + 16; - - data->bm = AllocBitMap(data->width, data->height, data->depth, BMF_CLEAR, NULL); - if (!data->bm) - { - FreeVec(chunkyline); - return FALSE; - } - - InitRastPort(&temprp); - temprp.BitMap = AllocBitMap(data->width, 1, 1, 0, NULL); - - InitRastPort(&bmrp); - bmrp.BitMap = data->bm; - - bodyptr = data->body; - w16 = (data->width + 15) & ~15; - bpr = w16 / 8; - - totdepth = data->depth + ((data->masking == 1) ? 1 : 0); - bpl = bpr * totdepth; - - for(y = 0; y < data->height; y++) - { - if (data->compression) - { - bodyptr = unpack_byterun1(bodyptr, unpackptr, bpl); - planar2chunky(unpackptr, chunkyline, data->width, data->depth, bpr); - } - else - { - planar2chunky(bodyptr, chunkyline, data->width, data->depth, bpr); - bodyptr += bpl; - } - - if (temprp.BitMap) - { - WritePixelLine8(&bmrp, 0, y, data->width, chunkyline, &temprp); - } - else - { - for(x = 0; x < data->width; x++) - { - SetAPen(&bmrp, chunkyline[x]); - WritePixel(&bmrp, x, y); - } - } - } - - if (temprp.BitMap) - { - WaitBlit(); - FreeBitMap(temprp.BitMap); - } - - FreeVec(chunkyline); - - return TRUE; -} - -/************************************************************************** - OM_NEW -**************************************************************************/ -IPTR Bodychunk__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct MUI_BodychunkData *data; - struct TagItem *tag, *tags; - - obj = (Object *)DoSuperMethodA(cl, obj, (Msg)msg); - if (!obj) return FALSE; - - data = INST_DATA(cl, obj); - - /* parse initial taglist */ - - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) - { - switch (tag->ti_Tag) - { - case MUIA_Bodychunk_Body: - data->body = (UBYTE *)tag->ti_Data; - break; - - case MUIA_Bodychunk_Compression: - data->compression = (UBYTE)tag->ti_Data; - break; - - case MUIA_Bodychunk_Depth: - data->depth = (LONG)tag->ti_Data; - break; - - case MUIA_Bodychunk_Masking: - data->masking = (UBYTE)tag->ti_Data; - break; - - case MUIA_Bitmap_Width: - data->width = (LONG)tag->ti_Data; - break; - - case MUIA_Bitmap_Height: - data->height = (LONG)tag->ti_Data; - break; - - } - } - - return (IPTR)obj; -} - -/************************************************************************** - OM_DISPOSE -**************************************************************************/ -IPTR Bodychunk__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) -{ - struct MUI_BodychunkData *data = INST_DATA(cl, obj); - - if (data->bm) - { - WaitBlit(); - FreeBitMap(data->bm); - } - - return DoSuperMethodA(cl, obj, msg); -} - -/************************************************************************** - OM_SET -**************************************************************************/ -IPTR Bodychunk__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct MUI_BodychunkData *data = INST_DATA(cl, obj); - struct TagItem *tags = msg->ops_AttrList; - struct TagItem *tag; - - while ((tag = NextTagItem(&tags)) != NULL) - { - switch (tag->ti_Tag) - { - case MUIA_Bodychunk_Body: - data->body = (UBYTE *)tag->ti_Data; - break; - - case MUIA_Bodychunk_Compression: - data->compression = (UBYTE)tag->ti_Data; - break; - - case MUIA_Bodychunk_Depth: - data->depth = (LONG)tag->ti_Data; - break; - - case MUIA_Bodychunk_Masking: - data->masking = (UBYTE)tag->ti_Data; - break; - - case MUIA_Bitmap_Width: - data->width = (LONG)tag->ti_Data; - break; - - case MUIA_Bitmap_Height: - data->height = (LONG)tag->ti_Data; - break; - - } - } - - return DoSuperMethodA(cl, obj, (Msg)msg); -} - -/************************************************************************** - OM_GET -**************************************************************************/ -IPTR Bodychunk__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) -{ -#define STORE *(msg->opg_Storage) - - struct MUI_BodychunkData *data = INST_DATA(cl, obj); - - switch(msg->opg_AttrID) - { - case MUIA_Bodychunk_Body: - STORE = (IPTR)data->body; - return TRUE; - - case MUIA_Bodychunk_Compression: - STORE = (IPTR)data->compression; - return TRUE; - - case MUIA_Bodychunk_Depth: - STORE = (IPTR)data->depth; - return TRUE; - - case MUIA_Bodychunk_Masking: - STORE = (IPTR)data->masking; - return TRUE; - - } - - return DoSuperMethodA(cl, obj, (Msg)msg); -#undef STORE -} - -/************************************************************************** - MUIM_Setup -**************************************************************************/ -IPTR Bodychunk__MUIM_Setup(struct IClass *cl, Object *obj, struct MUIP_Setup *msg) -{ - struct MUI_BodychunkData *data = INST_DATA(cl, obj); - - if (!make_bitmap(cl, obj)) return FALSE; - - set(obj, MUIA_Bitmap_Bitmap, (IPTR)data->bm); - - if (!DoSuperMethodA(cl, obj, (Msg)msg)) - { - set(obj, MUIA_Bitmap_Bitmap, NULL); - WaitBlit(); - FreeBitMap(data->bm); - data->bm = NULL; - - return FALSE; - } - - return TRUE; -} - -/************************************************************************** - MUIM_Cleanup -**************************************************************************/ -IPTR Bodychunk__MUIM_Cleanup(struct IClass *cl, Object *obj, struct MUIP_Cleanup *msg) -{ - struct MUI_BodychunkData *data = INST_DATA(cl, obj); - IPTR retval; - - retval = DoSuperMethodA(cl, obj, (Msg)msg); - if (data->bm) - { - set(obj, MUIA_Bitmap_Bitmap, NULL); - - WaitBlit(); - - FreeBitMap(data->bm); - data->bm = NULL; - } - - return retval; -} - - -BOOPSI_DISPATCHER(IPTR, Bodychunk_Dispatcher, cl, obj, msg) -{ - switch (msg->MethodID) - { - case OM_NEW: return Bodychunk__OM_NEW(cl, obj, (struct opSet *)msg); - case OM_DISPOSE: return Bodychunk__OM_DISPOSE(cl, obj, msg); - case OM_SET: return Bodychunk__OM_SET(cl, obj, (struct opSet *)msg); - case OM_GET: return Bodychunk__OM_GET(cl, obj, (struct opGet *)msg); - case MUIM_Setup: return Bodychunk__MUIM_Setup(cl, obj, (struct MUIP_Setup *)msg); - case MUIM_Cleanup: return Bodychunk__MUIM_Cleanup(cl, obj, (struct MUIP_Cleanup *)msg); - } - - return DoSuperMethodA(cl, obj, msg); -} -BOOPSI_DISPATCHER_END - -/* - * Class descriptor. - */ -const struct __MUIBuiltinClass _MUI_Bodychunk_desc = { - MUIC_Bodychunk, - MUIC_Bitmap, - sizeof(struct MUI_BodychunkData), - (void*)Bodychunk_Dispatcher -}; +/* + Copyright © 2002-2011, The AROS Development Team. All rights reserved. + $Id$ +*/ + +#include <graphics/gfx.h> +#include <graphics/view.h> +#include <clib/alib_protos.h> +#include <proto/exec.h> +#include <proto/graphics.h> +#include <proto/utility.h> +#include <proto/intuition.h> +#include <proto/muimaster.h> + +#include "mui.h" +#include "muimaster_intern.h" +#include "support.h" + +extern struct Library *MUIMasterBase; + +struct MUI_BodychunkData +{ + struct BitMap *bm; + UBYTE *body; + LONG width, height, depth; + UBYTE compression; + UBYTE masking; +}; + +static void planar2chunky(UBYTE *src, UBYTE *dest, WORD width, WORD depth, + LONG bpr) +{ + UBYTE *s, *d, byte; + UBYTE pmask, dmask = 1, notdmask = ~1; + WORD x, pl; + + for (pl = 0; pl < depth; pl++) + { + pmask = 0x80; + s = src; + d = dest; + + byte = *s++; + + for (x = 0; x < width; x++) + { + if (byte & pmask) + { + *d++ |= dmask; + } + else + { + *d++ &= notdmask; + } + + if (pmask == 0x1) + { + pmask = 0x80; + byte = *s++; + } + else + { + pmask >>= 1; + } + } + + dmask <<= 1; + notdmask = ~dmask; + + src += bpr; + } +} + +static UBYTE *unpack_byterun1(UBYTE *src, UBYTE *dest, LONG unpackedsize) +{ + UBYTE r; + BYTE c; + + for (;;) + { + c = (BYTE) (*src++); + if (c >= 0) + { + while (c-- >= 0) + { + *dest++ = *src++; + if (--unpackedsize <= 0) + return src; + } + } + else if (c != -128) + { + c = -c; + r = *src++; + + while (c-- >= 0) + { + *dest++ = r; + if (--unpackedsize <= 0) + return src; + } + } + } + +} + +static BOOL make_bitmap(struct IClass *cl, Object *obj) +{ + struct MUI_BodychunkData *data = INST_DATA(cl, obj); + struct RastPort bmrp, temprp; + UBYTE *chunkyline; + UBYTE *bodyptr, *unpackptr; + LONG w16, bpr, bpl; + WORD x, y, totdepth; + + if (!data->body || + (data->width < 1) || + (data->height < 1) || + (data->depth < 1) || (data->depth > 8) || (data->compression > 1)) + { + return FALSE; + } + + chunkyline = AllocVec(2 * (data->width + 16), MEMF_PUBLIC | MEMF_CLEAR); + if (!chunkyline) + return FALSE; + + unpackptr = chunkyline + data->width + 16; + + data->bm = + AllocBitMap(data->width, data->height, data->depth, BMF_CLEAR, + NULL); + if (!data->bm) + { + FreeVec(chunkyline); + return FALSE; + } + + InitRastPort(&temprp); + temprp.BitMap = AllocBitMap(data->width, 1, 1, 0, NULL); + + InitRastPort(&bmrp); + bmrp.BitMap = data->bm; + + bodyptr = data->body; + w16 = (data->width + 15) & ~15; + bpr = w16 / 8; + + totdepth = data->depth + ((data->masking == 1) ? 1 : 0); + bpl = bpr * totdepth; + + for (y = 0; y < data->height; y++) + { + if (data->compression) + { + bodyptr = unpack_byterun1(bodyptr, unpackptr, bpl); + planar2chunky(unpackptr, chunkyline, data->width, data->depth, + bpr); + } + else + { + planar2chunky(bodyptr, chunkyline, data->width, data->depth, + bpr); + bodyptr += bpl; + } + + if (temprp.BitMap) + { + WritePixelLine8(&bmrp, 0, y, data->width, chunkyline, &temprp); + } + else + { + for (x = 0; x < data->width; x++) + { + SetAPen(&bmrp, chunkyline[x]); + WritePixel(&bmrp, x, y); + } + } + } + + if (temprp.BitMap) + { + WaitBlit(); + FreeBitMap(temprp.BitMap); + } + + FreeVec(chunkyline); + + return TRUE; +} + +/************************************************************************** + OM_NEW +**************************************************************************/ +IPTR Bodychunk__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) +{ + struct MUI_BodychunkData *data; + struct TagItem *tag, *tags; + + obj = (Object *) DoSuperMethodA(cl, obj, (Msg) msg); + if (!obj) + return FALSE; + + data = INST_DATA(cl, obj); + + /* parse initial taglist */ + + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) + { + switch (tag->ti_Tag) + { + case MUIA_Bodychunk_Body: + data->body = (UBYTE *) tag->ti_Data; + break; + + case MUIA_Bodychunk_Compression: + data->compression = (UBYTE) tag->ti_Data; + break; + + case MUIA_Bodychunk_Depth: + data->depth = (LONG) tag->ti_Data; + break; + + case MUIA_Bodychunk_Masking: + data->masking = (UBYTE) tag->ti_Data; + break; + + case MUIA_Bitmap_Width: + data->width = (LONG) tag->ti_Data; + break; + + case MUIA_Bitmap_Height: + data->height = (LONG) tag->ti_Data; + break; + + } + } + + return (IPTR) obj; +} + +/************************************************************************** + OM_DISPOSE +**************************************************************************/ +IPTR Bodychunk__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) +{ + struct MUI_BodychunkData *data = INST_DATA(cl, obj); + + if (data->bm) + { + WaitBlit(); + FreeBitMap(data->bm); + } + + return DoSuperMethodA(cl, obj, msg); +} + +/************************************************************************** + OM_SET +**************************************************************************/ +IPTR Bodychunk__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) +{ + struct MUI_BodychunkData *data = INST_DATA(cl, obj); + struct TagItem *tags = msg->ops_AttrList; + struct TagItem *tag; + + while ((tag = NextTagItem(&tags)) != NULL) + { + switch (tag->ti_Tag) + { + case MUIA_Bodychunk_Body: + data->body = (UBYTE *) tag->ti_Data; + break; + + case MUIA_Bodychunk_Compression: + data->compression = (UBYTE) tag->ti_Data; + break; + + case MUIA_Bodychunk_Depth: + data->depth = (LONG) tag->ti_Data; + break; + + case MUIA_Bodychunk_Masking: + data->masking = (UBYTE) tag->ti_Data; + break; + + case MUIA_Bitmap_Width: + data->width = (LONG) tag->ti_Data; + break; + + case MUIA_Bitmap_Height: + data->height = (LONG) tag->ti_Data; + break; + + } + } + + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +/************************************************************************** + OM_GET +**************************************************************************/ +IPTR Bodychunk__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) +{ +#define STORE *(msg->opg_Storage) + + struct MUI_BodychunkData *data = INST_DATA(cl, obj); + + switch (msg->opg_AttrID) + { + case MUIA_Bodychunk_Body: + STORE = (IPTR) data->body; + return TRUE; + + case MUIA_Bodychunk_Compression: + STORE = (IPTR) data->compression; + return TRUE; + + case MUIA_Bodychunk_Depth: + STORE = (IPTR) data->depth; + return TRUE; + + case MUIA_Bodychunk_Masking: + STORE = (IPTR) data->masking; + return TRUE; + + } + + return DoSuperMethodA(cl, obj, (Msg) msg); +#undef STORE +} + +/************************************************************************** + MUIM_Setup +**************************************************************************/ +IPTR Bodychunk__MUIM_Setup(struct IClass *cl, Object *obj, + struct MUIP_Setup *msg) +{ + struct MUI_BodychunkData *data = INST_DATA(cl, obj); + + if (!make_bitmap(cl, obj)) + return FALSE; + + set(obj, MUIA_Bitmap_Bitmap, (IPTR) data->bm); + + if (!DoSuperMethodA(cl, obj, (Msg) msg)) + { + set(obj, MUIA_Bitmap_Bitmap, NULL); + WaitBlit(); + FreeBitMap(data->bm); + data->bm = NULL; + + return FALSE; + } + + return TRUE; +} + +/************************************************************************** + MUIM_Cleanup +**************************************************************************/ +IPTR Bodychunk__MUIM_Cleanup(struct IClass *cl, Object *obj, + struct MUIP_Cleanup *msg) +{ + struct MUI_BodychunkData *data = INST_DATA(cl, obj); + IPTR retval; + + retval = DoSuperMethodA(cl, obj, (Msg) msg); + if (data->bm) + { + set(obj, MUIA_Bitmap_Bitmap, NULL); + + WaitBlit(); + + FreeBitMap(data->bm); + data->bm = NULL; + } + + return retval; +} + + +BOOPSI_DISPATCHER(IPTR, Bodychunk_Dispatcher, cl, obj, msg) +{ + switch (msg->MethodID) + { + case OM_NEW: + return Bodychunk__OM_NEW(cl, obj, (struct opSet *)msg); + case OM_DISPOSE: + return Bodychunk__OM_DISPOSE(cl, obj, msg); + case OM_SET: + return Bodychunk__OM_SET(cl, obj, (struct opSet *)msg); + case OM_GET: + return Bodychunk__OM_GET(cl, obj, (struct opGet *)msg); + case MUIM_Setup: + return Bodychunk__MUIM_Setup(cl, obj, (struct MUIP_Setup *)msg); + case MUIM_Cleanup: + return Bodychunk__MUIM_Cleanup(cl, obj, (struct MUIP_Cleanup *)msg); + } + + return DoSuperMethodA(cl, obj, msg); +} + +BOOPSI_DISPATCHER_END +/* + * Class descriptor. + */ +const struct __MUIBuiltinClass _MUI_Bodychunk_desc = +{ + MUIC_Bodychunk, + MUIC_Bitmap, + sizeof(struct MUI_BodychunkData), + (void *) Bodychunk_Dispatcher +}; diff --git a/workbench/libs/muimaster/classes/bodychunk.h b/workbench/libs/muimaster/classes/bodychunk.h index 4e00ead067..3ad43910ae 100644 --- a/workbench/libs/muimaster/classes/bodychunk.h +++ b/workbench/libs/muimaster/classes/bodychunk.h @@ -13,10 +13,14 @@ #define MUIB_Bodychunk (MUIB_ZUNE | 0x00000500) /*** Attributes *************************************************************/ -#define MUIA_Bodychunk_Body (MUIB_MUI|0x0042ca67) /* V8 isg UBYTE * */ -#define MUIA_Bodychunk_Compression (MUIB_MUI|0x0042de5f) /* V8 isg UBYTE */ -#define MUIA_Bodychunk_Depth (MUIB_MUI|0x0042c392) /* V8 isg LONG */ -#define MUIA_Bodychunk_Masking (MUIB_MUI|0x00423b0e) /* V8 isg UBYTE */ +#define MUIA_Bodychunk_Body \ + (MUIB_MUI | 0x0042ca67) /* V8 isg UBYTE * */ +#define MUIA_Bodychunk_Compression \ + (MUIB_MUI | 0x0042de5f) /* V8 isg UBYTE */ +#define MUIA_Bodychunk_Depth \ + (MUIB_MUI | 0x0042c392) /* V8 isg LONG */ +#define MUIA_Bodychunk_Masking \ + (MUIB_MUI | 0x00423b0e) /* V8 isg UBYTE */ extern const struct __MUIBuiltinClass _MUI_Bodychunk_desc; /* PRIV */ diff --git a/workbench/libs/muimaster/classes/boopsi.c b/workbench/libs/muimaster/classes/boopsi.c dissimilarity index 79% index 7d7676458e..01c807ce01 100644 --- a/workbench/libs/muimaster/classes/boopsi.c +++ b/workbench/libs/muimaster/classes/boopsi.c @@ -1,448 +1,517 @@ -/* - Copyright © 2002-2003, The AROS Development Team. All rights reserved. - $Id$ -*/ - -#define MUIMASTER_YES_INLINE_STDARG - -#include <exec/memory.h> -#include <intuition/icclass.h> -#include <intuition/gadgetclass.h> -#include <clib/alib_protos.h> -#include <proto/exec.h> -#include <proto/intuition.h> -#include <proto/utility.h> -#include <proto/muimaster.h> - -#include "debug.h" -#include "mui.h" -#include "support_classes.h" -#include "muimaster_intern.h" -#include "boopsi_private.h" - -extern struct Library *MUIMasterBase; - -IPTR Boopsi__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct Boopsi_DATA *data; - struct TagItem *tags,*tag; - - obj = (Object *)DoSuperNewTags(cl, obj, NULL, - MUIA_FillArea, FALSE, - TAG_MORE, (IPTR) msg->ops_AttrList); - if (!obj) - return FALSE; - - data = INST_DATA(cl, obj); - - data->boopsi_taglist = CloneTagItems(msg->ops_AttrList); - data->boopsi_maxwidth = data->boopsi_maxheight = MUI_MAXMAX; - - /* parse initial taglist */ - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) - { - switch (tag->ti_Tag) - { - case MUIA_Boopsi_Class: - data->boopsi_class = (struct IClass*)tag->ti_Data; - break; - - case MUIA_Boopsi_ClassID: - data->boopsi_classid = (char*)tag->ti_Data; - break; - - case MUIA_Boopsi_MaxHeight: - data->boopsi_minwidth = tag->ti_Data; - break; - - case MUIA_Boopsi_MaxWidth: - data->boopsi_maxwidth = tag->ti_Data; - break; - - case MUIA_Boopsi_MinHeight: - data->boopsi_minheight = tag->ti_Data; - break; - - case MUIA_Boopsi_MinWidth: - data->boopsi_minwidth = tag->ti_Data; - break; - - case MUIA_Boopsi_Remember: - { - struct TagItem *new_remember; - if ((new_remember = AllocVec(sizeof(struct TagItem)*(data->remember_len + 2),MEMF_CLEAR))) /* +2 because of the TAG_DONE */ - { - if (data->remember) CopyMem(data->remember, new_remember, sizeof(struct TagItem)*data->remember_len); - new_remember[data->remember_len].ti_Tag = tag->ti_Data; - if (data->remember) FreeVec(data->remember); - data->remember = new_remember; - data->remember_len++; - } - } - break; - - case MUIA_Boopsi_Smart: - data->boopsi_smart = tag->ti_Data; - break; - - case MUIA_Boopsi_TagDrawInfo: - data->boopsi_tagdrawinfo = tag->ti_Data; - break; - - case MUIA_Boopsi_TagScreen: - data->boopsi_tagscreen = tag->ti_Data; - break; - - case MUIA_Boopsi_TagWindow: - data->boopsi_tagwindow = tag->ti_Data; - break; - - } - } - - /* Now fill in the initial remember tag datas in our remember tag list */ - for (tags = data->remember; (tag = NextTagItem(&tags)); ) - { - struct TagItem *set_tag = FindTagItem(tag->ti_Tag,msg->ops_AttrList); - if (set_tag) tag->ti_Data = set_tag->ti_Data; - } - - data->ehn.ehn_Events = IDCMP_IDCMPUPDATE; - data->ehn.ehn_Priority = 0; - data->ehn.ehn_Flags = 0; - data->ehn.ehn_Object = obj; - data->ehn.ehn_Class = cl; - - return (IPTR)obj; -} - -IPTR Boopsi__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) -{ - struct Boopsi_DATA *data = INST_DATA(cl, obj); - - if (data->boopsi_taglist) FreeTagItems(data->boopsi_taglist); - if (data->remember) FreeVec(data->remember); - return DoSuperMethodA(cl,obj,msg); -} - -IPTR Boopsi__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct TagItem *tags,*tag; - struct Boopsi_DATA *data = INST_DATA(cl, obj); - int only_trigger = 0; - int no_notify = 0; - - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) - { - switch (tag->ti_Tag) - { - case MUIA_Boopsi_Class: - data->boopsi_class = (struct IClass*)tag->ti_Data; - break; - - case MUIA_Boopsi_ClassID: - data->boopsi_classid = (char*)tag->ti_Data; - break; - - case MUIA_Boopsi_MaxHeight: - data->boopsi_minwidth = tag->ti_Data; - break; - - case MUIA_Boopsi_MaxWidth: - data->boopsi_maxwidth = tag->ti_Data; - break; - - case MUIA_Boopsi_MinHeight: - data->boopsi_minheight = tag->ti_Data; - break; - - case MUIA_Boopsi_MinWidth: - data->boopsi_minwidth = tag->ti_Data; - break; - - case MUIA_Boopsi_TagDrawInfo: - data->boopsi_tagdrawinfo = tag->ti_Data; - break; - - case MUIA_Boopsi_TagScreen: - data->boopsi_tagscreen = tag->ti_Data; - break; - - case MUIA_Boopsi_TagWindow: - data->boopsi_tagwindow = tag->ti_Data; - break; - - case MUIA_Boopsi_OnlyTrigger: - only_trigger = 1; - break; - - case MUIA_NoNotify: - no_notify = tag->ti_Data; - break; - } - } - - /* Now fill in remember list tag datas in our remember tag list */ - for (tags = data->remember; (tag = NextTagItem(&tags)); ) - { - struct TagItem *set_tag = FindTagItem(tag->ti_Tag,msg->ops_AttrList); - if (set_tag) tag->ti_Data = set_tag->ti_Data; - } - - if (!only_trigger) - { - if (data->boopsi_object) - { - /* Rendering will happen here!! This could make problems with virtual groups, forward this to MUIM_Draw??? */ - if (no_notify) SetAttrs(data->boopsi_object, ICA_TARGET, NULL, TAG_DONE); - if (SetGadgetAttrsA((struct Gadget*)data->boopsi_object,_window(obj),NULL,msg->ops_AttrList)) - RefreshGList((struct Gadget*)data->boopsi_object, _window(obj), NULL, 1); - if (no_notify) SetAttrs(data->boopsi_object, ICA_TARGET, ICTARGET_IDCMP, TAG_DONE); - } - } - - return DoSuperMethodA(cl,obj,(Msg)msg); -} - - -#define STORE *(msg->opg_Storage) -IPTR Boopsi__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) -{ - struct Boopsi_DATA *data = INST_DATA(cl, obj); - - switch (msg->opg_AttrID) - { - case MUIA_Boopsi_Object: STORE = (IPTR)data->boopsi_object; - - default: - { - struct TagItem *tags,*tag; - - /* look in the rember list first */ - for (tags = data->remember; (tag = NextTagItem(&tags)); ) - { - if (tag->ti_Tag == msg->opg_AttrID) - { - if (data->boopsi_object) - { /* Call the get method of the boopsi object and update the remember list */ - IPTR val; - - if (GetAttr(msg->opg_AttrID,data->boopsi_object,&val)) - tag->ti_Data = val; - } - - STORE = tag->ti_Data; - return 1; - } - } - - /* The id is not in the attr list, so we try the boopsi object first (fills in the msg then) */ - if (data->boopsi_object) - { - IPTR val; - - if (GetAttr(msg->opg_AttrID,data->boopsi_object,&val)) - { - STORE=val; - return 1; - } - } - - /* No success so we try the superclass */ - return DoSuperMethodA(cl,obj,(Msg)msg); - } - } - - return 1; -} -#undef STORE - -IPTR Boopsi__MUIM_AskMinMax(struct IClass *cl, Object *obj, struct MUIP_AskMinMax *msg) -{ - struct Boopsi_DATA *data = INST_DATA(cl, obj); - - /* - ** let our superclass first fill in what it thinks about sizes. - ** this will e.g. add the size of frame and inner spacing. - */ - DoSuperMethodA(cl, obj, (Msg)msg); - - msg->MinMaxInfo->MinWidth += data->boopsi_minwidth; - msg->MinMaxInfo->MinHeight += data->boopsi_minheight; - msg->MinMaxInfo->DefWidth += data->boopsi_minwidth; - msg->MinMaxInfo->DefHeight += data->boopsi_minheight; - msg->MinMaxInfo->MaxWidth += data->boopsi_maxwidth; - msg->MinMaxInfo->MaxHeight += data->boopsi_maxheight; - return TRUE; -} - -IPTR Boopsi__MUIM_Setup(struct IClass *cl, Object *obj, struct MUIP_Setup *msg) -{ - struct Boopsi_DATA *data = INST_DATA(cl, obj); - IPTR rc = DoSuperMethodA(cl, obj, (Msg)msg); - if (!rc) return 0; - - DoMethod(_win(obj),MUIM_Window_AddEventHandler,(IPTR)&data->ehn); - - return 1; -} - -IPTR Boopsi__MUIM_Cleanup(struct IClass *cl, Object *obj, struct MUIP_Cleanup *msg) -{ - struct Boopsi_DATA *data = INST_DATA(cl, obj); - DoMethod(_win(obj),MUIM_Window_RemEventHandler,(IPTR)&data->ehn); - return DoSuperMethodA(cl, obj, (Msg)msg); -} - -IPTR Boopsi__MUIM_Show(struct IClass *cl, Object *obj, struct MUIP_Show *msg) -{ - struct Boopsi_DATA *data = INST_DATA(cl, obj); - IPTR rc = DoSuperMethodA(cl, obj, (Msg)msg); - struct TagItem *tag; - BOOL completely_visible = TRUE; - -D(bug("boopsi_show: obj coord %d,%d - %d,%d\n", -_mleft(obj), _mtop(obj), _mright(obj), _mbottom(obj))); - - if (_flags(obj) & MADF_INVIRTUALGROUP) - { - Object *wnd = NULL, *parent; - - get(obj, MUIA_WindowObject,&wnd); - parent = obj; - while (get(parent,MUIA_Parent,&parent)) - { - if (!parent) break; - if (parent == wnd) break; - - if (_flags(parent) & MADF_ISVIRTUALGROUP) - { - if ((_mleft(obj) < _mleft(parent)) || - (_mright(obj) > _mright(parent)) || - (_mtop(obj) < _mtop(parent)) || - (_mbottom(obj) > _mbottom(parent))) - { - completely_visible = FALSE; - D(bug("=== boopsi object: completely visible FALSE for obj %x at %d,%d - %d,%d\n", - obj, _mleft(obj), _mtop(obj), _mright(obj), _mbottom(obj))); - break; - } - } - } - } - - if (completely_visible) - { - if ((tag = FindTagItem(GA_Left,data->boopsi_taglist))) tag->ti_Data = _mleft(obj); - if ((tag = FindTagItem(GA_Top,data->boopsi_taglist))) tag->ti_Data = _mtop(obj); - if ((tag = FindTagItem(GA_Width,data->boopsi_taglist))) tag->ti_Data = _mwidth(obj); - if ((tag = FindTagItem(GA_Height,data->boopsi_taglist))) tag->ti_Data = _mheight(obj); - if (data->boopsi_tagscreen && (tag = FindTagItem(data->boopsi_tagscreen,data->boopsi_taglist))) tag->ti_Data = (IPTR)_screen(obj); - if (data->boopsi_tagwindow && (tag = FindTagItem(data->boopsi_tagwindow,data->boopsi_taglist))) tag->ti_Data = (IPTR)_window(obj); - if (data->boopsi_tagdrawinfo && (tag = FindTagItem(data->boopsi_tagdrawinfo,data->boopsi_taglist))) tag->ti_Data = (IPTR)_dri(obj); - - if ((data->boopsi_object = NewObjectA(data->boopsi_class, data->boopsi_classid, data->boopsi_taglist))) - { - SetAttrsA(data->boopsi_object,data->remember); - AddGadget(_window(obj),(struct Gadget*)data->boopsi_object,~0); - } - } - - return rc; -} - -IPTR Boopsi__MUIM_Draw(struct IClass *cl, Object *obj, struct MUIP_Draw *msg) -{ - struct Boopsi_DATA *data = INST_DATA(cl, obj); - DoSuperMethodA(cl, obj, (Msg)msg); - - if (!(msg->flags & (MADF_DRAWOBJECT | MADF_DRAWUPDATE))) return 1; - if (data->boopsi_object) RefreshGList((struct Gadget*)data->boopsi_object, _window(obj), NULL, 1); - return 1; -} - -IPTR Boopsi__MUIM_Hide(struct IClass *cl, Object *obj, struct MUIP_Hide *msg) -{ - struct Boopsi_DATA *data = INST_DATA(cl, obj); - if (data->boopsi_object) - { - struct TagItem *tags,*tag; - - /* Now fill in the initial remember tag datas in our remember tag list */ - for (tags = data->remember; (tag = NextTagItem(&tags)); ) - { - GetAttr(tag->ti_Tag, data->boopsi_object, &tag->ti_Data); - } - - RemoveGadget(_window(obj),(struct Gadget*)data->boopsi_object); - DisposeObject(data->boopsi_object); - data->boopsi_object = NULL; - } - - return DoSuperMethodA(cl, obj, (Msg)msg); -} - -IPTR Boopsi__MUIM_HandleEvent(struct IClass *cl, Object *obj, struct MUIP_HandleEvent *msg) -{ - //struct Boopsi_DATA *data = INST_DATA(cl, obj); - - if (msg->imsg) - { - if (msg->imsg->Class == IDCMP_IDCMPUPDATE) - { -// struct TagItem *tags,*tag; - - /* Go through the tag list (iaddress) and set all the tags, this is somewhat stupid, - ** because all objects which hear on the same notifies will receive the notify - ** although their value has not changed really, but this how MUI seems to mange it - ** (this could real make big problems if using MUIV_TriggerValue) - ** a better idea, is to distinguish this via a allocatable gadgetid, and the - ** object checks wheather the gadget id equals to its allocated - **/ - - SetAttrs(obj,MUIA_Boopsi_OnlyTrigger,TRUE,TAG_MORE,(IPTR)msg->imsg->IAddress); - -// for (tags = (struct TagItem*)msg->imsg->IAddress; (tag = NextTagItem(&tags)); ) -// { -// } - } - } - - return 0; -} - -#if ZUNE_BUILTIN_BOOPSI -BOOPSI_DISPATCHER(IPTR, Boopsi_Dispatcher, cl, obj, msg) -{ - switch (msg->MethodID) - { - case OM_NEW: return Boopsi__OM_NEW(cl, obj, (struct opSet *) msg); - case OM_DISPOSE: return Boopsi__OM_DISPOSE(cl, obj, msg); - case OM_GET: return Boopsi__OM_GET(cl, obj, (struct opGet *)msg); - case OM_SET: return Boopsi__OM_SET(cl, obj, (struct opSet *)msg); - case MUIM_Setup: return Boopsi__MUIM_Setup(cl, obj, (APTR)msg); - case MUIM_Cleanup: return Boopsi__MUIM_Cleanup(cl, obj, (APTR)msg); - case MUIM_Show: return Boopsi__MUIM_Show(cl, obj, (APTR)msg); - case MUIM_Hide: return Boopsi__MUIM_Hide(cl, obj, (APTR)msg); - case MUIM_AskMinMax: return Boopsi__MUIM_AskMinMax(cl, obj, (APTR)msg); - case MUIM_Draw: return Boopsi__MUIM_Draw(cl, obj, (APTR)msg); - case MUIM_HandleEvent: return Boopsi__MUIM_HandleEvent(cl, obj, (APTR)msg); - } - { - struct Boopsi_DATA *data = INST_DATA(cl, obj); - if (((msg->MethodID >> 16) != ((TAG_USER >> 16) | 0x0042)) && data->boopsi_object) - { - return DoMethodA(data->boopsi_object, msg); - } - return DoSuperMethodA(cl, obj, msg); - } -} -BOOPSI_DISPATCHER_END - -const struct __MUIBuiltinClass _MUI_Boopsi_desc = { - MUIC_Boopsi, - MUIC_Area, - sizeof(struct Boopsi_DATA), - (void*)Boopsi_Dispatcher -}; -#endif /* ZUNE_BUILTIN_BOOPSI */ +/* + Copyright © 2002-2003, The AROS Development Team. All rights reserved. + $Id$ +*/ + +#define MUIMASTER_YES_INLINE_STDARG + +#include <exec/memory.h> +#include <intuition/icclass.h> +#include <intuition/gadgetclass.h> +#include <clib/alib_protos.h> +#include <proto/exec.h> +#include <proto/intuition.h> +#include <proto/utility.h> +#include <proto/muimaster.h> + +#include "debug.h" +#include "mui.h" +#include "support_classes.h" +#include "muimaster_intern.h" +#include "boopsi_private.h" + +extern struct Library *MUIMasterBase; + +IPTR Boopsi__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) +{ + struct Boopsi_DATA *data; + struct TagItem *tags, *tag; + + obj = (Object *) DoSuperNewTags(cl, obj, NULL, + MUIA_FillArea, FALSE, TAG_MORE, (IPTR) msg->ops_AttrList); + if (!obj) + return FALSE; + + data = INST_DATA(cl, obj); + + data->boopsi_taglist = CloneTagItems(msg->ops_AttrList); + data->boopsi_maxwidth = data->boopsi_maxheight = MUI_MAXMAX; + + /* parse initial taglist */ + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) + { + switch (tag->ti_Tag) + { + case MUIA_Boopsi_Class: + data->boopsi_class = (struct IClass *)tag->ti_Data; + break; + + case MUIA_Boopsi_ClassID: + data->boopsi_classid = (char *)tag->ti_Data; + break; + + case MUIA_Boopsi_MaxHeight: + data->boopsi_minwidth = tag->ti_Data; + break; + + case MUIA_Boopsi_MaxWidth: + data->boopsi_maxwidth = tag->ti_Data; + break; + + case MUIA_Boopsi_MinHeight: + data->boopsi_minheight = tag->ti_Data; + break; + + case MUIA_Boopsi_MinWidth: + data->boopsi_minwidth = tag->ti_Data; + break; + + case MUIA_Boopsi_Remember: + { + struct TagItem *new_remember; + if ((new_remember = AllocVec(sizeof(struct TagItem) + * (data->remember_len + 2), MEMF_CLEAR))) + /* +2 because of the TAG_DONE */ + { + if (data->remember) + CopyMem(data->remember, new_remember, + sizeof(struct TagItem) * data->remember_len); + new_remember[data->remember_len].ti_Tag = tag->ti_Data; + if (data->remember) + FreeVec(data->remember); + data->remember = new_remember; + data->remember_len++; + } + } + break; + + case MUIA_Boopsi_Smart: + data->boopsi_smart = tag->ti_Data; + break; + + case MUIA_Boopsi_TagDrawInfo: + data->boopsi_tagdrawinfo = tag->ti_Data; + break; + + case MUIA_Boopsi_TagScreen: + data->boopsi_tagscreen = tag->ti_Data; + break; + + case MUIA_Boopsi_TagWindow: + data->boopsi_tagwindow = tag->ti_Data; + break; + + } + } + + /* Now fill in the initial remember tag datas in our remember tag list */ + for (tags = data->remember; (tag = NextTagItem(&tags));) + { + struct TagItem *set_tag = + FindTagItem(tag->ti_Tag, msg->ops_AttrList); + if (set_tag) + tag->ti_Data = set_tag->ti_Data; + } + + data->ehn.ehn_Events = IDCMP_IDCMPUPDATE; + data->ehn.ehn_Priority = 0; + data->ehn.ehn_Flags = 0; + data->ehn.ehn_Object = obj; + data->ehn.ehn_Class = cl; + + return (IPTR) obj; +} + +IPTR Boopsi__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) +{ + struct Boopsi_DATA *data = INST_DATA(cl, obj); + + if (data->boopsi_taglist) + FreeTagItems(data->boopsi_taglist); + if (data->remember) + FreeVec(data->remember); + return DoSuperMethodA(cl, obj, msg); +} + +IPTR Boopsi__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) +{ + struct TagItem *tags, *tag; + struct Boopsi_DATA *data = INST_DATA(cl, obj); + int only_trigger = 0; + int no_notify = 0; + + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) + { + switch (tag->ti_Tag) + { + case MUIA_Boopsi_Class: + data->boopsi_class = (struct IClass *)tag->ti_Data; + break; + + case MUIA_Boopsi_ClassID: + data->boopsi_classid = (char *)tag->ti_Data; + break; + + case MUIA_Boopsi_MaxHeight: + data->boopsi_minwidth = tag->ti_Data; + break; + + case MUIA_Boopsi_MaxWidth: + data->boopsi_maxwidth = tag->ti_Data; + break; + + case MUIA_Boopsi_MinHeight: + data->boopsi_minheight = tag->ti_Data; + break; + + case MUIA_Boopsi_MinWidth: + data->boopsi_minwidth = tag->ti_Data; + break; + + case MUIA_Boopsi_TagDrawInfo: + data->boopsi_tagdrawinfo = tag->ti_Data; + break; + + case MUIA_Boopsi_TagScreen: + data->boopsi_tagscreen = tag->ti_Data; + break; + + case MUIA_Boopsi_TagWindow: + data->boopsi_tagwindow = tag->ti_Data; + break; + + case MUIA_Boopsi_OnlyTrigger: + only_trigger = 1; + break; + + case MUIA_NoNotify: + no_notify = tag->ti_Data; + break; + } + } + + /* Now fill in remember list tag datas in our remember tag list */ + for (tags = data->remember; (tag = NextTagItem(&tags));) + { + struct TagItem *set_tag = + FindTagItem(tag->ti_Tag, msg->ops_AttrList); + if (set_tag) + tag->ti_Data = set_tag->ti_Data; + } + + if (!only_trigger) + { + if (data->boopsi_object) + { + /* Rendering will happen here!! This could make problems with + * virtual groups, forward this to MUIM_Draw??? */ + if (no_notify) + SetAttrs(data->boopsi_object, ICA_TARGET, NULL, TAG_DONE); + if (SetGadgetAttrsA((struct Gadget *)data->boopsi_object, + _window(obj), NULL, msg->ops_AttrList)) + RefreshGList((struct Gadget *)data->boopsi_object, + _window(obj), NULL, 1); + if (no_notify) + SetAttrs(data->boopsi_object, ICA_TARGET, ICTARGET_IDCMP, + TAG_DONE); + } + } + + return DoSuperMethodA(cl, obj, (Msg) msg); +} + + +#define STORE *(msg->opg_Storage) +IPTR Boopsi__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) +{ + struct Boopsi_DATA *data = INST_DATA(cl, obj); + + switch (msg->opg_AttrID) + { + case MUIA_Boopsi_Object: + STORE = (IPTR) data->boopsi_object; + + default: + { + struct TagItem *tags, *tag; + + /* look in the rember list first */ + for (tags = data->remember; (tag = NextTagItem(&tags));) + { + if (tag->ti_Tag == msg->opg_AttrID) + { + if (data->boopsi_object) + { + /* Call the get method of the boopsi object + * and update the remember list */ + IPTR val; + + if (GetAttr(msg->opg_AttrID, data->boopsi_object, + &val)) + tag->ti_Data = val; + } + + STORE = tag->ti_Data; + return 1; + } + } + + /* The id is not in the attr list, so we try the boopsi object + * first (fills in the msg then) */ + if (data->boopsi_object) + { + IPTR val; + + if (GetAttr(msg->opg_AttrID, data->boopsi_object, &val)) + { + STORE = val; + return 1; + } + } + + /* No success so we try the superclass */ + return DoSuperMethodA(cl, obj, (Msg) msg); + } + } + + return 1; +} +#undef STORE + +IPTR Boopsi__MUIM_AskMinMax(struct IClass *cl, Object *obj, + struct MUIP_AskMinMax *msg) +{ + struct Boopsi_DATA *data = INST_DATA(cl, obj); + + /* + ** let our superclass first fill in what it thinks about sizes. + ** this will e.g. add the size of frame and inner spacing. + */ + DoSuperMethodA(cl, obj, (Msg) msg); + + msg->MinMaxInfo->MinWidth += data->boopsi_minwidth; + msg->MinMaxInfo->MinHeight += data->boopsi_minheight; + msg->MinMaxInfo->DefWidth += data->boopsi_minwidth; + msg->MinMaxInfo->DefHeight += data->boopsi_minheight; + msg->MinMaxInfo->MaxWidth += data->boopsi_maxwidth; + msg->MinMaxInfo->MaxHeight += data->boopsi_maxheight; + return TRUE; +} + +IPTR Boopsi__MUIM_Setup(struct IClass *cl, Object *obj, + struct MUIP_Setup *msg) +{ + struct Boopsi_DATA *data = INST_DATA(cl, obj); + IPTR rc = DoSuperMethodA(cl, obj, (Msg) msg); + if (!rc) + return 0; + + DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR) & data->ehn); + + return 1; +} + +IPTR Boopsi__MUIM_Cleanup(struct IClass *cl, Object *obj, + struct MUIP_Cleanup *msg) +{ + struct Boopsi_DATA *data = INST_DATA(cl, obj); + DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR) & data->ehn); + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +IPTR Boopsi__MUIM_Show(struct IClass *cl, Object *obj, + struct MUIP_Show *msg) +{ + struct Boopsi_DATA *data = INST_DATA(cl, obj); + IPTR rc = DoSuperMethodA(cl, obj, (Msg) msg); + struct TagItem *tag; + BOOL completely_visible = TRUE; + + D(bug("boopsi_show: obj coord %d,%d - %d,%d\n", + _mleft(obj), _mtop(obj), _mright(obj), _mbottom(obj))); + + if (_flags(obj) & MADF_INVIRTUALGROUP) + { + Object *wnd = NULL, *parent; + + get(obj, MUIA_WindowObject, &wnd); + parent = obj; + while (get(parent, MUIA_Parent, &parent)) + { + if (!parent) + break; + if (parent == wnd) + break; + + if (_flags(parent) & MADF_ISVIRTUALGROUP) + { + if ((_mleft(obj) < _mleft(parent)) || + (_mright(obj) > _mright(parent)) || + (_mtop(obj) < _mtop(parent)) || + (_mbottom(obj) > _mbottom(parent))) + { + completely_visible = FALSE; + D(bug("=== boopsi object: completely visible FALSE " + "for obj %x at %d,%d - %d,%d\n", + obj, _mleft(obj), _mtop(obj), _mright(obj), + _mbottom(obj))); + break; + } + } + } + } + + if (completely_visible) + { + if ((tag = FindTagItem(GA_Left, data->boopsi_taglist))) + tag->ti_Data = _mleft(obj); + if ((tag = FindTagItem(GA_Top, data->boopsi_taglist))) + tag->ti_Data = _mtop(obj); + if ((tag = FindTagItem(GA_Width, data->boopsi_taglist))) + tag->ti_Data = _mwidth(obj); + if ((tag = FindTagItem(GA_Height, data->boopsi_taglist))) + tag->ti_Data = _mheight(obj); + if (data->boopsi_tagscreen + && (tag = + FindTagItem(data->boopsi_tagscreen, data->boopsi_taglist))) + tag->ti_Data = (IPTR) _screen(obj); + if (data->boopsi_tagwindow + && (tag = + FindTagItem(data->boopsi_tagwindow, data->boopsi_taglist))) + tag->ti_Data = (IPTR) _window(obj); + if (data->boopsi_tagdrawinfo + && (tag = + FindTagItem(data->boopsi_tagdrawinfo, + data->boopsi_taglist))) + tag->ti_Data = (IPTR) _dri(obj); + + if ((data->boopsi_object = + NewObjectA(data->boopsi_class, data->boopsi_classid, + data->boopsi_taglist))) + { + SetAttrsA(data->boopsi_object, data->remember); + AddGadget(_window(obj), (struct Gadget *)data->boopsi_object, ~0); + } + } + + return rc; +} + +IPTR Boopsi__MUIM_Draw(struct IClass *cl, Object *obj, + struct MUIP_Draw *msg) +{ + struct Boopsi_DATA *data = INST_DATA(cl, obj); + DoSuperMethodA(cl, obj, (Msg) msg); + + if (!(msg->flags & (MADF_DRAWOBJECT | MADF_DRAWUPDATE))) + return 1; + if (data->boopsi_object) + RefreshGList((struct Gadget *)data->boopsi_object, _window(obj), + NULL, 1); + return 1; +} + +IPTR Boopsi__MUIM_Hide(struct IClass *cl, Object *obj, + struct MUIP_Hide *msg) +{ + struct Boopsi_DATA *data = INST_DATA(cl, obj); + if (data->boopsi_object) + { + struct TagItem *tags, *tag; + + /* Fill in the initial remember tag data in our remember tag list */ + for (tags = data->remember; (tag = NextTagItem(&tags));) + { + GetAttr(tag->ti_Tag, data->boopsi_object, &tag->ti_Data); + } + + RemoveGadget(_window(obj), (struct Gadget *)data->boopsi_object); + DisposeObject(data->boopsi_object); + data->boopsi_object = NULL; + } + + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +IPTR Boopsi__MUIM_HandleEvent(struct IClass *cl, Object *obj, + struct MUIP_HandleEvent *msg) +{ + //struct Boopsi_DATA *data = INST_DATA(cl, obj); + + if (msg->imsg) + { + if (msg->imsg->Class == IDCMP_IDCMPUPDATE) + { +// struct TagItem *tags,*tag; + + /* Go through the tag list (iaddress) and set all the tags; + ** this is somewhat stupid, because all objects which hear on + ** the same notifies will receive the notify although their + ** value has not changed really, but this is how MUI seems to + ** mange it (this could really make big problems if using + ** MUIV_TriggerValue). A better idea, is to distinguish this + ** via an allocatable gadgetid, and the object checks wheather + ** the gadget id equals to its allocated one + **/ + + SetAttrs(obj, MUIA_Boopsi_OnlyTrigger, TRUE, TAG_MORE, + (IPTR) msg->imsg->IAddress); + +// for (tags = (struct TagItem*)msg->imsg->IAddress; +// (tag = NextTagItem(&tags)); ) +// { +// } + } + } + + return 0; +} + +#if ZUNE_BUILTIN_BOOPSI +BOOPSI_DISPATCHER(IPTR, Boopsi_Dispatcher, cl, obj, msg) +{ + switch (msg->MethodID) + { + case OM_NEW: + return Boopsi__OM_NEW(cl, obj, (struct opSet *)msg); + case OM_DISPOSE: + return Boopsi__OM_DISPOSE(cl, obj, msg); + case OM_GET: + return Boopsi__OM_GET(cl, obj, (struct opGet *)msg); + case OM_SET: + return Boopsi__OM_SET(cl, obj, (struct opSet *)msg); + case MUIM_Setup: + return Boopsi__MUIM_Setup(cl, obj, (APTR) msg); + case MUIM_Cleanup: + return Boopsi__MUIM_Cleanup(cl, obj, (APTR) msg); + case MUIM_Show: + return Boopsi__MUIM_Show(cl, obj, (APTR) msg); + case MUIM_Hide: + return Boopsi__MUIM_Hide(cl, obj, (APTR) msg); + case MUIM_AskMinMax: + return Boopsi__MUIM_AskMinMax(cl, obj, (APTR) msg); + case MUIM_Draw: + return Boopsi__MUIM_Draw(cl, obj, (APTR) msg); + case MUIM_HandleEvent: + return Boopsi__MUIM_HandleEvent(cl, obj, (APTR) msg); + } + { + struct Boopsi_DATA *data = INST_DATA(cl, obj); + if (((msg->MethodID >> 16) != ((TAG_USER >> 16) | 0x0042)) + && data->boopsi_object) + { + return DoMethodA(data->boopsi_object, msg); + } + return DoSuperMethodA(cl, obj, msg); + } +} +BOOPSI_DISPATCHER_END + +const struct __MUIBuiltinClass _MUI_Boopsi_desc = +{ + MUIC_Boopsi, + MUIC_Area, + sizeof(struct Boopsi_DATA), + (void *) Boopsi_Dispatcher +}; +#endif /* ZUNE_BUILTIN_BOOPSI */ diff --git a/workbench/libs/muimaster/classes/boopsi.h b/workbench/libs/muimaster/classes/boopsi.h dissimilarity index 64% index 2b64f2e734..45e142d849 100644 --- a/workbench/libs/muimaster/classes/boopsi.h +++ b/workbench/libs/muimaster/classes/boopsi.h @@ -1,34 +1,47 @@ -/* - Copyright © 2002-2003, The AROS Development Team. All rights reserved. - $Id$ -*/ - -#ifndef _MUI_CLASSES_BOOPSI_H -#define _MUI_CLASSES_BOOPSI_H - -/*** Name *******************************************************************/ -#define MUIC_Boopsi "Boopsi.mui" - -/*** Identifier base (for Zune extensions) **********************************/ -#define MUIB_Boopsi (MUIB_ZUNE | 0x00000600) - -/*** Attributes *************************************************************/ -#define MUIA_Boopsi_Class (MUIB_MUI|0x00426999) /* V4 isg struct IClass * */ -#define MUIA_Boopsi_ClassID (MUIB_MUI|0x0042bfa3) /* V4 isg char * */ -#define MUIA_Boopsi_MaxHeight (MUIB_MUI|0x0042757f) /* V4 isg ULONG */ -#define MUIA_Boopsi_MaxWidth (MUIB_MUI|0x0042bcb1) /* V4 isg ULONG */ -#define MUIA_Boopsi_MinHeight (MUIB_MUI|0x00422c93) /* V4 isg ULONG */ -#define MUIA_Boopsi_MinWidth (MUIB_MUI|0x00428fb2) /* V4 isg ULONG */ -#define MUIA_Boopsi_Object (MUIB_MUI|0x00420178) /* V4 ..g Object * */ -#define MUIA_Boopsi_Remember (MUIB_MUI|0x0042f4bd) /* V4 i.. ULONG */ -#define MUIA_Boopsi_Smart (MUIB_MUI|0x0042b8d7) /* V9 i.. BOOL */ -#define MUIA_Boopsi_TagDrawInfo (MUIB_MUI|0x0042bae7) /* V4 isg ULONG */ -#define MUIA_Boopsi_TagScreen (MUIB_MUI|0x0042bc71) /* V4 isg ULONG */ -#define MUIA_Boopsi_TagWindow (MUIB_MUI|0x0042e11d) /* V4 isg ULONG */ - -#define MUIA_Boopsi_OnlyTrigger (MUIB_Boopsi | 0x00000000) /* ZV1 .s. BOOL PRIV (for notification) */ - - -extern const struct __MUIBuiltinClass _MUI_Boopsi_desc; /* PRIV */ - -#endif /* _MUI_CLASSES_BOOPSI_H */ +/* + Copyright © 2002-2003, The AROS Development Team. All rights reserved. + $Id$ +*/ + +#ifndef _MUI_CLASSES_BOOPSI_H +#define _MUI_CLASSES_BOOPSI_H + +/*** Name *******************************************************************/ +#define MUIC_Boopsi "Boopsi.mui" + +/*** Identifier base (for Zune extensions) **********************************/ +#define MUIB_Boopsi (MUIB_ZUNE | 0x00000600) + +/*** Attributes *************************************************************/ +#define MUIA_Boopsi_Class \ + (MUIB_MUI | 0x00426999) /* V4 isg struct IClass * */ +#define MUIA_Boopsi_ClassID \ + (MUIB_MUI | 0x0042bfa3) /* V4 isg char * */ +#define MUIA_Boopsi_MaxHeight \ + (MUIB_MUI | 0x0042757f) /* V4 isg ULONG */ +#define MUIA_Boopsi_MaxWidth \ + (MUIB_MUI | 0x0042bcb1) /* V4 isg ULONG */ +#define MUIA_Boopsi_MinHeight \ + (MUIB_MUI | 0x00422c93) /* V4 isg ULONG */ +#define MUIA_Boopsi_MinWidth \ + (MUIB_MUI | 0x00428fb2) /* V4 isg ULONG */ +#define MUIA_Boopsi_Object \ + (MUIB_MUI | 0x00420178) /* V4 ..g Object * */ +#define MUIA_Boopsi_Remember \ + (MUIB_MUI | 0x0042f4bd) /* V4 i.. ULONG */ +#define MUIA_Boopsi_Smart \ + (MUIB_MUI | 0x0042b8d7) /* V9 i.. BOOL */ +#define MUIA_Boopsi_TagDrawInfo \ + (MUIB_MUI | 0x0042bae7) /* V4 isg ULONG */ +#define MUIA_Boopsi_TagScreen \ + (MUIB_MUI | 0x0042bc71) /* V4 isg ULONG */ +#define MUIA_Boopsi_TagWindow \ + (MUIB_MUI | 0x0042e11d) /* V4 isg ULONG */ + +#define MUIA_Boopsi_OnlyTrigger \ + (MUIB_Boopsi | 0x00000000) /* ZV1 .s. BOOL PRIV (for notification) */ + + +extern const struct __MUIBuiltinClass _MUI_Boopsi_desc; /* PRIV */ + +#endif /* _MUI_CLASSES_BOOPSI_H */ diff --git a/workbench/libs/muimaster/classes/chunkyimage.c b/workbench/libs/muimaster/classes/chunkyimage.c dissimilarity index 65% index e5ed6f4834..e2de02f17c 100644 --- a/workbench/libs/muimaster/classes/chunkyimage.c +++ b/workbench/libs/muimaster/classes/chunkyimage.c @@ -1,328 +1,342 @@ -/* - Copyright © 2002-2011, The AROS Development Team. All rights reserved. - $Id$ -*/ - -#include <graphics/gfx.h> -#include <graphics/view.h> -#include <clib/alib_protos.h> -#include <proto/exec.h> -#include <proto/graphics.h> -#include <proto/utility.h> -#include <proto/intuition.h> -#include <proto/muimaster.h> - -#include "mui.h" -#include "muimaster_intern.h" -#include "support.h" - -extern struct Library *MUIMasterBase; - -struct MUI_ChunkyImageData -{ - struct BitMap *bm; - UBYTE *pixels; - UBYTE *palette; - ULONG *palette32; - UWORD width, height, numcolors, modulo; -}; - -static BOOL make_bitmap(struct IClass *cl, Object *obj) -{ - struct MUI_ChunkyImageData *data = INST_DATA(cl, obj); - struct RastPort temprp; - WORD depth; - - if (!data->pixels || - (data->width < 1) || - (data->height < 1) || - (data->numcolors < 1) || - (data->numcolors > 256)) - { - return FALSE; - } - - if (data->palette) - { - data->palette32 = AllocVec(data->numcolors * 3 * sizeof(ULONG), MEMF_ANY); - if (!data->palette32) return FALSE; - - if (data->palette32) - { - UBYTE *src = data->palette; - ULONG *dest = data->palette32; - WORD i; - - for(i = 0; i < data->numcolors; i++) - { - *dest++ = ((ULONG)(*src++)) * 0x01010101; - *dest++ = ((ULONG)(*src++)) * 0x01010101; - *dest++ = ((ULONG)(*src++)) * 0x01010101; - } - } - } - - for(depth = 1; (1L << depth) < data->numcolors; depth++) - { - } - - data->bm = AllocBitMap(data->width, data->height, depth, BMF_CLEAR, NULL); - if (!data->bm) - { - if (data->palette32) - { - FreeVec(data->palette32); - data->palette32 = NULL; - } - return FALSE; - } - - InitRastPort(&temprp); - temprp.BitMap = data->bm; - - WriteChunkyPixels(&temprp, - 0, - 0, - data->width - 1, - data->height - 1, - data->pixels, - data->modulo); - - return TRUE; -} - -/************************************************************************** - OM_NEW -**************************************************************************/ -IPTR ChunkyImage__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct MUI_ChunkyImageData *data; - struct TagItem *tag, *tags; - - obj = (Object *)DoSuperMethodA(cl, obj, (Msg)msg); - if (!obj) return FALSE; - - data = INST_DATA(cl, obj); - - /* parse initial taglist */ - - data->modulo = 0xFFFF; - - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) - { - switch (tag->ti_Tag) - { - case MUIA_ChunkyImage_Pixels: - data->pixels = (UBYTE *)tag->ti_Data; - break; - - case MUIA_ChunkyImage_Palette: - data->palette = (UBYTE *)tag->ti_Data; - break; - - case MUIA_ChunkyImage_NumColors: - data->numcolors = (LONG)tag->ti_Data; - break; - - case MUIA_ChunkyImage_Modulo: - data->modulo = (LONG)tag->ti_Data; - break; - - case MUIA_Bitmap_Width: - data->width = (LONG)tag->ti_Data; - break; - - case MUIA_Bitmap_Height: - data->height = (LONG)tag->ti_Data; - break; - - } - } - - if (data->modulo == 0xFFFF) data->modulo = data->width; - - return (IPTR)obj; -} - -/************************************************************************** - OM_DISPOSE -**************************************************************************/ -IPTR ChunkyImage__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) -{ - struct MUI_ChunkyImageData *data = INST_DATA(cl, obj); - - if (data->bm) - { - WaitBlit(); - FreeBitMap(data->bm); - } - - return DoSuperMethodA(cl, obj, msg); -} - -/************************************************************************** - OM_SET -**************************************************************************/ -IPTR ChunkyImage__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct MUI_ChunkyImageData *data = INST_DATA(cl, obj); - struct TagItem *tags = msg->ops_AttrList; - struct TagItem *tag; - - while ((tag = NextTagItem(&tags)) != NULL) - { - switch (tag->ti_Tag) - { - case MUIA_ChunkyImage_Pixels: - data->pixels = (UBYTE *)tag->ti_Data; - break; - - case MUIA_ChunkyImage_Palette: - data->palette = (UBYTE*)tag->ti_Data; - break; - - case MUIA_ChunkyImage_NumColors: - data->numcolors = (LONG)tag->ti_Data; - break; - - case MUIA_ChunkyImage_Modulo: - data->modulo = (LONG)tag->ti_Data; - break; - - case MUIA_Bitmap_Width: - data->width = (LONG)tag->ti_Data; - break; - - case MUIA_Bitmap_Height: - data->height = (LONG)tag->ti_Data; - break; - - } - } - - return DoSuperMethodA(cl, obj, (Msg)msg); -} - -/************************************************************************** - OM_GET -**************************************************************************/ -IPTR ChunkyImage__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) -{ -#define STORE *(msg->opg_Storage) - - struct MUI_ChunkyImageData *data = INST_DATA(cl, obj); - - switch(msg->opg_AttrID) - { - case MUIA_ChunkyImage_Pixels: - STORE = (IPTR)data->pixels; - return TRUE; - - case MUIA_ChunkyImage_Palette: - STORE = (IPTR)data->palette; - return TRUE; - - case MUIA_ChunkyImage_NumColors: - STORE = (IPTR)data->numcolors; - return TRUE; - - case MUIA_ChunkyImage_Modulo: - STORE = (IPTR)data->modulo; - return TRUE; - - } - - return DoSuperMethodA(cl, obj, (Msg)msg); -#undef STORE -} - -/************************************************************************** - MUIM_Setup -**************************************************************************/ -IPTR ChunkyImage__MUIM_Setup(struct IClass *cl, Object *obj, struct MUIP_Setup *msg) -{ - struct MUI_ChunkyImageData *data = INST_DATA(cl, obj); - - if (!make_bitmap(cl, obj)) return FALSE; - - set(obj, MUIA_Bitmap_Bitmap, (IPTR)data->bm); - - if (data->palette32) - { - set(obj, MUIA_Bitmap_SourceColors, (IPTR)data->palette32); - } - - if (!DoSuperMethodA(cl, obj, (Msg)msg)) - { - set(obj, MUIA_Bitmap_Bitmap, NULL); - WaitBlit(); - FreeBitMap(data->bm); - data->bm = NULL; - if (data->palette32) - { - set(obj, MUIA_Bitmap_SourceColors, NULL); - - FreeVec(data->palette32); - data->palette32 = NULL; - } - return FALSE; - } - - return TRUE; -} - -/************************************************************************** - MUIM_Cleanup -**************************************************************************/ -IPTR ChunkyImage__MUIM_Cleanup(struct IClass *cl, Object *obj, struct MUIP_Cleanup *msg) -{ - struct MUI_ChunkyImageData *data = INST_DATA(cl, obj); - IPTR retval; - - retval = DoSuperMethodA(cl, obj, (Msg)msg); - if (data->bm) - { - set(obj, MUIA_Bitmap_Bitmap, NULL); - - WaitBlit(); - - FreeBitMap(data->bm); - data->bm = NULL; - - if (data->palette32) - { - set(obj, MUIA_Bitmap_SourceColors, NULL); - FreeVec(data->palette32); - data->palette32 = NULL; - } - } - - return retval; -} - - -BOOPSI_DISPATCHER(IPTR, ChunkyImage_Dispatcher, cl, obj, msg) -{ - switch (msg->MethodID) - { - case OM_NEW: return ChunkyImage__OM_NEW(cl, obj, (struct opSet *)msg); - case OM_DISPOSE: return ChunkyImage__OM_DISPOSE(cl, obj, msg); - case OM_SET: return ChunkyImage__OM_SET(cl, obj, (struct opSet *)msg); - case OM_GET: return ChunkyImage__OM_GET(cl, obj, (struct opGet *)msg); - case MUIM_Setup: return ChunkyImage__MUIM_Setup(cl, obj, (struct MUIP_Setup *)msg); - case MUIM_Cleanup: return ChunkyImage__MUIM_Cleanup(cl, obj, (struct MUIP_Cleanup *)msg); - } - - return DoSuperMethodA(cl, obj, msg); -} -BOOPSI_DISPATCHER_END - -/* - * Class descriptor. - */ -const struct __MUIBuiltinClass _MUI_ChunkyImage_desc = { - MUIC_ChunkyImage, - MUIC_Bitmap, - sizeof(struct MUI_ChunkyImageData), - (void*)ChunkyImage_Dispatcher -}; +/* + Copyright © 2002-2011, The AROS Development Team. All rights reserved. + $Id$ +*/ + +#include <graphics/gfx.h> +#include <graphics/view.h> +#include <clib/alib_protos.h> +#include <proto/exec.h> +#include <proto/graphics.h> +#include <proto/utility.h> +#include <proto/intuition.h> +#include <proto/muimaster.h> + +#include "mui.h" +#include "muimaster_intern.h" +#include "support.h" + +extern struct Library *MUIMasterBase; + +struct MUI_ChunkyImageData +{ + struct BitMap *bm; + UBYTE *pixels; + UBYTE *palette; + ULONG *palette32; + UWORD width, height, numcolors, modulo; +}; + +static BOOL make_bitmap(struct IClass *cl, Object *obj) +{ + struct MUI_ChunkyImageData *data = INST_DATA(cl, obj); + struct RastPort temprp; + WORD depth; + + if (!data->pixels || + (data->width < 1) || + (data->height < 1) || + (data->numcolors < 1) || (data->numcolors > 256)) + { + return FALSE; + } + + if (data->palette) + { + data->palette32 = + AllocVec(data->numcolors * 3 * sizeof(ULONG), MEMF_ANY); + if (!data->palette32) + return FALSE; + + if (data->palette32) + { + UBYTE *src = data->palette; + ULONG *dest = data->palette32; + WORD i; + + for (i = 0; i < data->numcolors; i++) + { + *dest++ = ((ULONG) (*src++)) * 0x01010101; + *dest++ = ((ULONG) (*src++)) * 0x01010101; + *dest++ = ((ULONG) (*src++)) * 0x01010101; + } + } + } + + for (depth = 1; (1L << depth) < data->numcolors; depth++) + { + } + + data->bm = + AllocBitMap(data->width, data->height, depth, BMF_CLEAR, NULL); + if (!data->bm) + { + if (data->palette32) + { + FreeVec(data->palette32); + data->palette32 = NULL; + } + return FALSE; + } + + InitRastPort(&temprp); + temprp.BitMap = data->bm; + + WriteChunkyPixels(&temprp, + 0, + 0, data->width - 1, data->height - 1, data->pixels, data->modulo); + + return TRUE; +} + +/************************************************************************** + OM_NEW +**************************************************************************/ +IPTR ChunkyImage__OM_NEW(struct IClass *cl, Object *obj, + struct opSet *msg) +{ + struct MUI_ChunkyImageData *data; + struct TagItem *tag, *tags; + + obj = (Object *) DoSuperMethodA(cl, obj, (Msg) msg); + if (!obj) + return FALSE; + + data = INST_DATA(cl, obj); + + /* parse initial taglist */ + + data->modulo = 0xFFFF; + + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) + { + switch (tag->ti_Tag) + { + case MUIA_ChunkyImage_Pixels: + data->pixels = (UBYTE *) tag->ti_Data; + break; + + case MUIA_ChunkyImage_Palette: + data->palette = (UBYTE *) tag->ti_Data; + break; + + case MUIA_ChunkyImage_NumColors: + data->numcolors = (LONG) tag->ti_Data; + break; + + case MUIA_ChunkyImage_Modulo: + data->modulo = (LONG) tag->ti_Data; + break; + + case MUIA_Bitmap_Width: + data->width = (LONG) tag->ti_Data; + break; + + case MUIA_Bitmap_Height: + data->height = (LONG) tag->ti_Data; + break; + + } + } + + if (data->modulo == 0xFFFF) + data->modulo = data->width; + + return (IPTR) obj; +} + +/************************************************************************** + OM_DISPOSE +**************************************************************************/ +IPTR ChunkyImage__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) +{ + struct MUI_ChunkyImageData *data = INST_DATA(cl, obj); + + if (data->bm) + { + WaitBlit(); + FreeBitMap(data->bm); + } + + return DoSuperMethodA(cl, obj, msg); +} + +/************************************************************************** + OM_SET +**************************************************************************/ +IPTR ChunkyImage__OM_SET(struct IClass *cl, Object *obj, + struct opSet *msg) +{ + struct MUI_ChunkyImageData *data = INST_DATA(cl, obj); + struct TagItem *tags = msg->ops_AttrList; + struct TagItem *tag; + + while ((tag = NextTagItem(&tags)) != NULL) + { + switch (tag->ti_Tag) + { + case MUIA_ChunkyImage_Pixels: + data->pixels = (UBYTE *) tag->ti_Data; + break; + + case MUIA_ChunkyImage_Palette: + data->palette = (UBYTE *) tag->ti_Data; + break; + + case MUIA_ChunkyImage_NumColors: + data->numcolors = (LONG) tag->ti_Data; + break; + + case MUIA_ChunkyImage_Modulo: + data->modulo = (LONG) tag->ti_Data; + break; + + case MUIA_Bitmap_Width: + data->width = (LONG) tag->ti_Data; + break; + + case MUIA_Bitmap_Height: + data->height = (LONG) tag->ti_Data; + break; + + } + } + + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +/************************************************************************** + OM_GET +**************************************************************************/ +IPTR ChunkyImage__OM_GET(struct IClass *cl, Object *obj, + struct opGet *msg) +{ +#define STORE *(msg->opg_Storage) + + struct MUI_ChunkyImageData *data = INST_DATA(cl, obj); + + switch (msg->opg_AttrID) + { + case MUIA_ChunkyImage_Pixels: + STORE = (IPTR) data->pixels; + return TRUE; + + case MUIA_ChunkyImage_Palette: + STORE = (IPTR) data->palette; + return TRUE; + + case MUIA_ChunkyImage_NumColors: + STORE = (IPTR) data->numcolors; + return TRUE; + + case MUIA_ChunkyImage_Modulo: + STORE = (IPTR) data->modulo; + return TRUE; + + } + + return DoSuperMethodA(cl, obj, (Msg) msg); +#undef STORE +} + +/************************************************************************** + MUIM_Setup +**************************************************************************/ +IPTR ChunkyImage__MUIM_Setup(struct IClass *cl, Object *obj, + struct MUIP_Setup *msg) +{ + struct MUI_ChunkyImageData *data = INST_DATA(cl, obj); + + if (!make_bitmap(cl, obj)) + return FALSE; + + set(obj, MUIA_Bitmap_Bitmap, (IPTR) data->bm); + + if (data->palette32) + { + set(obj, MUIA_Bitmap_SourceColors, (IPTR) data->palette32); + } + + if (!DoSuperMethodA(cl, obj, (Msg) msg)) + { + set(obj, MUIA_Bitmap_Bitmap, NULL); + WaitBlit(); + FreeBitMap(data->bm); + data->bm = NULL; + if (data->palette32) + { + set(obj, MUIA_Bitmap_SourceColors, NULL); + + FreeVec(data->palette32); + data->palette32 = NULL; + } + return FALSE; + } + + return TRUE; +} + +/************************************************************************** + MUIM_Cleanup +**************************************************************************/ +IPTR ChunkyImage__MUIM_Cleanup(struct IClass *cl, Object *obj, + struct MUIP_Cleanup *msg) +{ + struct MUI_ChunkyImageData *data = INST_DATA(cl, obj); + IPTR retval; + + retval = DoSuperMethodA(cl, obj, (Msg) msg); + if (data->bm) + { + set(obj, MUIA_Bitmap_Bitmap, NULL); + + WaitBlit(); + + FreeBitMap(data->bm); + data->bm = NULL; + + if (data->palette32) + { + set(obj, MUIA_Bitmap_SourceColors, NULL); + FreeVec(data->palette32); + data->palette32 = NULL; + } + } + + return retval; +} + + +BOOPSI_DISPATCHER(IPTR, ChunkyImage_Dispatcher, cl, obj, msg) +{ + switch (msg->MethodID) + { + case OM_NEW: + return ChunkyImage__OM_NEW(cl, obj, (struct opSet *)msg); + case OM_DISPOSE: + return ChunkyImage__OM_DISPOSE(cl, obj, msg); + case OM_SET: + return ChunkyImage__OM_SET(cl, obj, (struct opSet *)msg); + case OM_GET: + return ChunkyImage__OM_GET(cl, obj, (struct opGet *)msg); + case MUIM_Setup: + return ChunkyImage__MUIM_Setup(cl, obj, (struct MUIP_Setup *)msg); + case MUIM_Cleanup: + return ChunkyImage__MUIM_Cleanup(cl, obj, + (struct MUIP_Cleanup *)msg); + } + + return DoSuperMethodA(cl, obj, msg); +} +BOOPSI_DISPATCHER_END + +/* + * Class descriptor. + */ +const struct __MUIBuiltinClass _MUI_ChunkyImage_desc = +{ + MUIC_ChunkyImage, + MUIC_Bitmap, + sizeof(struct MUI_ChunkyImageData), + (void *) ChunkyImage_Dispatcher +}; diff --git a/workbench/libs/muimaster/classes/chunkyimage.h b/workbench/libs/muimaster/classes/chunkyimage.h index 356852583e..7bae5b8494 100644 --- a/workbench/libs/muimaster/classes/chunkyimage.h +++ b/workbench/libs/muimaster/classes/chunkyimage.h @@ -13,12 +13,16 @@ #define MUIB_ChunkyImage (MUIB_ZUNE | 0x00004000) /*** Attributes *************************************************************/ -#define MUIA_ChunkyImage_Pixels (MUIB_ChunkyImage | 0x00000000) /* V8 isg UBYTE * */ -#define MUIA_ChunkyImage_Palette (MUIB_ChunkyImage | 0x00000001) /* V8 isg UBYTE * */ -#define MUIA_ChunkyImage_NumColors (MUIB_ChunkyImage | 0x00000002) /* V8 isg LONG */ -#define MUIA_ChunkyImage_Modulo (MUIB_ChunkyImage | 0x00000003) /* V8 isg LONG */ +#define MUIA_ChunkyImage_Pixels \ + (MUIB_ChunkyImage | 0x00000000) /* V8 isg UBYTE * */ +#define MUIA_ChunkyImage_Palette \ + (MUIB_ChunkyImage | 0x00000001) /* V8 isg UBYTE * */ +#define MUIA_ChunkyImage_NumColors \ + (MUIB_ChunkyImage | 0x00000002) /* V8 isg LONG */ +#define MUIA_ChunkyImage_Modulo \ + (MUIB_ChunkyImage | 0x00000003) /* V8 isg LONG */ -extern const struct __MUIBuiltinClass _MUI_ChunkyImage_desc; /* PRIV */ +extern const struct __MUIBuiltinClass _MUI_ChunkyImage_desc; /* PRIV */ #endif /* _MUI_CLASSES_CHUNKYIMAGE_H */ diff --git a/workbench/libs/muimaster/classes/coloradjust.c b/workbench/libs/muimaster/classes/coloradjust.c dissimilarity index 72% index d885740244..ce3c667c71 100644 --- a/workbench/libs/muimaster/classes/coloradjust.c +++ b/workbench/libs/muimaster/classes/coloradjust.c @@ -1,579 +1,604 @@ -/* - Copyright © 2002-2003, The AROS Development Team. All rights reserved. - $Id$ -*/ - -#define MUIMASTER_YES_INLINE_STDARG - -#include <stdio.h> - -#include <graphics/gfx.h> -#include <graphics/view.h> -#include <graphics/gfxmacros.h> -#include <intuition/gadgetclass.h> -#include <gadgets/colorwheel.h> -#include <gadgets/gradientslider.h> -#include <intuition/icclass.h> -#include <clib/alib_protos.h> -#include <proto/exec.h> -#include <proto/graphics.h> -#include <proto/utility.h> -#include <proto/intuition.h> -#include <proto/colorwheel.h> -#include <proto/muimaster.h> - -#include <string.h> - -#include "mui.h" -#include "muimaster_intern.h" -#include "support.h" -#include "support_classes.h" -#include "coloradjust_private.h" - -/* #define MYDEBUG 1 */ -#include "debug.h" - -extern struct Library *MUIMasterBase; - -#define FLAG_FIXED_PEN 1 -#define FLAG_PEN_ALLOCATED 2 -#define FLAG_NO_PEN 4 - -#define ColorWheelBase data->colorwheelbase -#define IColorWheel data->icolorwheel - -static void NotifyGun(Object *obj, struct Coloradjust_DATA *data, LONG gun) -{ - static Tag guntotag[3] = - { - MUIA_Coloradjust_Red, - MUIA_Coloradjust_Green, - MUIA_Coloradjust_Blue - }; - - struct TagItem tags[] = - { - {0 , 0}, - {MUIA_Coloradjust_RGB, 0}, - {TAG_DONE } - }; - - tags[0].ti_Tag = guntotag[gun]; - tags[0].ti_Data = data->rgb[gun]; - tags[1].ti_Data = (IPTR)data->rgb; - - CoerceMethod(data->notifyclass, obj, OM_SET, (IPTR)tags, NULL); -} - -static void NotifyAll(Object *obj, struct Coloradjust_DATA *data) -{ - struct TagItem tags[] = - { - {MUIA_Coloradjust_Red , 0 }, - {MUIA_Coloradjust_Green, 0 }, - {MUIA_Coloradjust_Blue , 0 }, - {MUIA_Coloradjust_RGB , 0 }, - {TAG_DONE } - }; - tags[0].ti_Data = data->rgb[0]; - tags[1].ti_Data = data->rgb[1]; - tags[2].ti_Data = data->rgb[2]; - tags[3].ti_Data = (IPTR)data->rgb; - CoerceMethod(data->notifyclass, obj, OM_SET, (IPTR)tags, NULL); -} - -static void SliderFunc(struct Hook *hook, Object *obj, APTR msg) -{ - struct ColorWheelRGB cw; - struct Coloradjust_DATA *data = *(struct Coloradjust_DATA **)msg; - IPTR gun = ((IPTR *)msg)[1]; - - ULONG red = XGET(data->rslider,MUIA_Numeric_Value); - ULONG green = XGET(data->gslider,MUIA_Numeric_Value); - ULONG blue = XGET(data->bslider,MUIA_Numeric_Value); - - cw.cw_Red = (red<<24)|(red<<16)|(red<<8)|red; - cw.cw_Green = (green<<24)|(green<<16)|(green<<8)|green; - cw.cw_Blue = (blue<<24)|(blue<<16)|(blue<<8)|blue; - - data->rgb[0] = cw.cw_Red; - data->rgb[1] = cw.cw_Green; - data->rgb[2] = cw.cw_Blue; - - nnset(data->colfield, MUIA_Colorfield_RGB, (IPTR)data->rgb); - - if (data->wheel) - { - struct ColorWheelHSB hsb; - - ConvertRGBToHSB(&cw, &hsb); - nnset(data->wheel, WHEEL_HSB, (IPTR)&hsb); - nnset(data->grad, GRAD_CurVal, 0xFFFF - (hsb.cw_Brightness >> 16)); - - if (data->gradpen != -1) - { - hsb.cw_Brightness = 0xFFFFFFFF; - ConvertHSBToRGB(&hsb, &cw); - - SetRGB32(&_screen(obj)->ViewPort, data->gradpen, cw.cw_Red, cw.cw_Green, cw.cw_Blue); - if (data->truecolor) MUI_Redraw(data->grad, MADF_DRAWUPDATE); - } - } - - NotifyGun(obj, data, gun); -} - -static void WheelFunc(struct Hook *hook, Object *obj, APTR msg) -{ - struct Coloradjust_DATA *data = *(struct Coloradjust_DATA **)msg; - struct ColorWheelHSB hsb; - struct ColorWheelRGB cw; - - hsb.cw_Hue = XGET(data->wheel, WHEEL_Hue); - hsb.cw_Saturation = XGET(data->wheel, WHEEL_Saturation); - hsb.cw_Brightness = 0xFFFF - XGET(data->grad, GRAD_CurVal); - hsb.cw_Brightness |= (hsb.cw_Brightness << 16) ; - - ConvertHSBToRGB(&hsb, &cw); - - data->rgb[0] = cw.cw_Red; - data->rgb[1] = cw.cw_Green; - data->rgb[2] = cw.cw_Blue; - - nnset(data->rslider, MUIA_Numeric_Value, data->rgb[0] >> 24); - nnset(data->gslider, MUIA_Numeric_Value, data->rgb[1] >> 24); - nnset(data->bslider, MUIA_Numeric_Value, data->rgb[2] >> 24); - - nnset(data->colfield, MUIA_Colorfield_RGB, (IPTR)data->rgb); - - if (data->gradpen != -1) - { - hsb.cw_Brightness = 0xFFFFFFFF; - ConvertHSBToRGB(&hsb, &cw); - - SetRGB32(&_screen(obj)->ViewPort, data->gradpen, cw.cw_Red, cw.cw_Green, cw.cw_Blue); - if (data->truecolor) MUI_Redraw(data->grad, MADF_DRAWUPDATE); - } - - NotifyAll(obj, data); -} - -static void GradFunc(struct Hook *hook, Object *obj, APTR msg) -{ - struct Coloradjust_DATA *data = *(struct Coloradjust_DATA **)msg; - struct ColorWheelHSB hsb; - struct ColorWheelRGB cw; - - ULONG bright = XGET(data->grad, GRAD_CurVal); - - bright = 0xFFFF - bright; - bright |= (bright << 16); - - hsb.cw_Hue = XGET(data->wheel, WHEEL_Hue); - hsb.cw_Saturation = XGET(data->wheel, WHEEL_Saturation); - hsb.cw_Brightness = bright; - - ConvertHSBToRGB(&hsb, &cw); - - data->rgb[0] = cw.cw_Red; - data->rgb[1] = cw.cw_Green; - data->rgb[2] = cw.cw_Blue; - - nnset(data->rslider, MUIA_Numeric_Value, data->rgb[0] >> 24); - nnset(data->gslider, MUIA_Numeric_Value, data->rgb[1] >> 24); - nnset(data->bslider, MUIA_Numeric_Value, data->rgb[2] >> 24); - - nnset(data->colfield, MUIA_Colorfield_RGB, (IPTR)data->rgb); - - NotifyAll(obj, data); -} - - -IPTR Coloradjust__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct Coloradjust_DATA *data; - struct TagItem *tags; - struct TagItem *tag; - struct Library *colorwheelbase, *gradientsliderbase; - Object *rslider, *gslider, *bslider; - Object *colfield, *wheel = NULL, *grad = NULL; - ULONG *rgb; - - colorwheelbase = OpenLibrary("gadgets/colorwheel.gadget", 0); - gradientsliderbase = OpenLibrary("gadgets/gradientslider.gadget", 0); - - obj = (Object *) DoSuperNewTags - ( - cl, obj, NULL, - - MUIA_Group_Columns, 2, - MUIA_Group_VertSpacing, 1, - - Child, (IPTR) Label1("Red:"), - Child, (IPTR) (rslider = (Object *)(SliderObject, MUIA_Group_Horiz, TRUE, MUIA_Numeric_Min, 0, MUIA_Numeric_Max, 255, End)), - Child, (IPTR) Label1("Green:"), - Child, (IPTR) (gslider = (Object *)(SliderObject, MUIA_Group_Horiz, TRUE, MUIA_Numeric_Min, 0, MUIA_Numeric_Max, 255, End)), - Child, (IPTR) Label1("Blue:"), - Child, (IPTR) (bslider = (Object *)(SliderObject, MUIA_Group_Horiz, TRUE, MUIA_Numeric_Min, 0, MUIA_Numeric_Max, 255, End)), - Child, (IPTR) VSpace(1), - Child, (IPTR) VSpace(1), - Child, (IPTR) (colfield = (Object *)(ColorfieldObject, TextFrame, MUIA_Weight, 0, End)), - Child, (!colorwheelbase || !gradientsliderbase) ? (IPTR) HVSpace : (IPTR) HGroup, - /* FIXME: this looks severely broken if the HVSpace path is taken... */ - MUIA_Group_HorizSpacing, 2, - Child, (IPTR) (wheel = (Object *)BoopsiObject, - MUIA_Boopsi_ClassID, (IPTR) "colorwheel.gadget", - MUIA_Boopsi_MinWidth, 16, - MUIA_Boopsi_MinHeight, 16, - MUIA_Boopsi_Remember, WHEEL_Saturation, - MUIA_Boopsi_Remember, WHEEL_Hue, - MUIA_Boopsi_TagScreen, WHEEL_Screen, - WHEEL_Screen, (IPTR)NULL, - GA_Left, 0, - GA_Top, 0, - GA_Width, 0, - GA_Height, 0, - ICA_TARGET, ICTARGET_IDCMP, - MUIA_FillArea, TRUE, - End), - Child, (IPTR) (grad = (Object *)BoopsiObject, - MUIA_Boopsi_ClassID, (IPTR) "gradientslider.gadget", - MUIA_Boopsi_MinWidth, 16, - MUIA_Boopsi_MinHeight, 16, - MUIA_Boopsi_MaxWidth, 16, - MUIA_Boopsi_Remember, GRAD_CurVal, - MUIA_Boopsi_Remember, GRAD_PenArray, - MUIA_Boopsi_Remember, GRAD_KnobPixels, - GA_Left, 0, - GA_Top, 0, - GA_Width, 0, - GA_Height, 0, - GRAD_KnobPixels, 8, - PGA_Freedom, LORIENT_VERT, - ICA_TARGET, ICTARGET_IDCMP, - MUIA_FillArea, TRUE, - End), - End, - - TAG_MORE, (IPTR) msg->ops_AttrList - ); - - if (!obj) - { - CloseLibrary(gradientsliderbase); - CloseLibrary(colorwheelbase); - return FALSE; - } - - data = INST_DATA(cl, obj); - - data->colorwheelbase = colorwheelbase; - data->gradientsliderbase = gradientsliderbase; - if (!EXEC_INTERFACE_GET_MAIN(data->icolorwheel,data->colorwheelbase)) - { - CoerceMethod(cl,obj,OM_DISPOSE); - return 0; - } - data->notifyclass = cl->cl_Super->cl_Super; - - data->sliderhook.h_Entry = HookEntry; - data->sliderhook.h_SubEntry = (HOOKFUNC)SliderFunc; - - data->wheelhook.h_Entry = HookEntry; - data->wheelhook.h_SubEntry = (HOOKFUNC)WheelFunc; - - data->gradhook.h_Entry = HookEntry; - data->gradhook.h_SubEntry = (HOOKFUNC)GradFunc; - - data->rslider = rslider; - data->gslider = gslider; - data->bslider = bslider; - data->colfield = colfield; - data->wheel = wheel; - data->grad = grad; - - data->rgb[0] = data->rgb[1] = data->rgb[2] = 0xFFFFFFFF; - - /* parse initial taglist */ - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) - { - switch (tag->ti_Tag) - { - case MUIA_Coloradjust_Red: - data->rgb[0] = (ULONG)tag->ti_Data; - break; - - case MUIA_Coloradjust_Green: - data->rgb[1] = (ULONG)tag->ti_Data; - break; - - case MUIA_Coloradjust_Blue: - data->rgb[2] = (ULONG)tag->ti_Data; - break; - - case MUIA_Coloradjust_RGB: - rgb = (ULONG *)tag->ti_Data; - data->rgb[0] = *rgb++; - data->rgb[1] = *rgb++; - data->rgb[2] = *rgb++; - break; - - } - } - - nnset(colfield, MUIA_Colorfield_RGB, (IPTR)data->rgb); - nnset(rslider, MUIA_Numeric_Value, data->rgb[0] >> 24); - nnset(gslider, MUIA_Numeric_Value, data->rgb[1] >> 24); - nnset(bslider, MUIA_Numeric_Value, data->rgb[2] >> 24); - - if (wheel) - { - struct ColorWheelRGB cw; - struct ColorWheelHSB hsb; - - cw.cw_Red = data->rgb[0]; - cw.cw_Green = data->rgb[1]; - cw.cw_Blue = data->rgb[2]; - - ConvertRGBToHSB(&cw, &hsb); - - nnset(wheel, WHEEL_HSB, (IPTR)&hsb); - /* just to be sure - colorwheel seems to have some problems */ - nnset(wheel, WHEEL_Saturation, hsb.cw_Saturation); - nnset(wheel, WHEEL_Hue, hsb.cw_Hue); - nnset(data->grad, GRAD_CurVal, 0xFFFF - (hsb.cw_Brightness >> 16)); - nnset(data->grad, GRAD_PenArray, (IPTR)data->gradpenarray); - } - - DoMethod(rslider, MUIM_Notify, MUIA_Numeric_Value, MUIV_EveryTime, (IPTR)obj, 4, MUIM_CallHook, (IPTR)&data->sliderhook, (IPTR)data, 0); - DoMethod(gslider, MUIM_Notify, MUIA_Numeric_Value, MUIV_EveryTime, (IPTR)obj, 4, MUIM_CallHook, (IPTR)&data->sliderhook, (IPTR)data, 1); - DoMethod(bslider, MUIM_Notify, MUIA_Numeric_Value, MUIV_EveryTime, (IPTR)obj, 4, MUIM_CallHook, (IPTR)&data->sliderhook, (IPTR)data, 2); - - if (wheel) - { - DoMethod(wheel, MUIM_Notify, WHEEL_Hue, MUIV_EveryTime, (IPTR)obj, 3, MUIM_CallHook, (IPTR)&data->wheelhook, (IPTR)data); - DoMethod(wheel, MUIM_Notify, WHEEL_Saturation, MUIV_EveryTime, (IPTR)obj, 3, MUIM_CallHook, (IPTR)&data->wheelhook, (IPTR)data); - DoMethod(grad, MUIM_Notify, GRAD_CurVal, MUIV_EveryTime, (IPTR)obj, 3, MUIM_CallHook, (IPTR)&data->gradhook, (IPTR)data); - - } - return (IPTR)obj; -} - -IPTR Coloradjust__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) -{ - struct Coloradjust_DATA *data; - struct Library *colorwheelbase; - struct Library *gradientsliderbase; - IPTR retval; - - data = INST_DATA(cl, obj); - - EXEC_INTERFACE_DROP(data->icolorwheel); - colorwheelbase = data->colorwheelbase; - gradientsliderbase = data->gradientsliderbase; - - retval = DoSuperMethodA(cl, obj, msg); - - if (colorwheelbase) CloseLibrary(colorwheelbase); - if (gradientsliderbase) CloseLibrary(gradientsliderbase); - - return retval; -} - -IPTR Coloradjust__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct Coloradjust_DATA *data; - struct TagItem *tags; - struct TagItem *tag; - ULONG *rgb; - BOOL newcol = FALSE; - - data = INST_DATA(cl, obj); - - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) - { - switch (tag->ti_Tag) - { - case MUIA_Coloradjust_Red: - data->rgb[0] = (ULONG)tag->ti_Data; - newcol = TRUE; - break; - - case MUIA_Coloradjust_Green: - data->rgb[1] = (ULONG)tag->ti_Data; - newcol = TRUE; - break; - - case MUIA_Coloradjust_Blue: - data->rgb[2] = (ULONG)tag->ti_Data; - newcol = TRUE; - break; - - case MUIA_Coloradjust_RGB: - rgb = (ULONG *)tag->ti_Data; - data->rgb[0] = *rgb++; - data->rgb[1] = *rgb++; - data->rgb[2] = *rgb++; - newcol = TRUE; - break; - - } - } - - if (newcol) - { - nnset(data->rslider, MUIA_Numeric_Value, data->rgb[0] >> 24); - nnset(data->gslider, MUIA_Numeric_Value, data->rgb[1] >> 24); - nnset(data->bslider, MUIA_Numeric_Value, data->rgb[2] >> 24); - D(bug("coloradjust: sliders set to %ld, %ld, %ld\n", data->rgb[0] >> 24, - data->rgb[1] >> 24, data->rgb[2] >> 24)); - - nnset(data->colfield, MUIA_Colorfield_RGB, (IPTR)data->rgb); - - if (data->wheel) - { - struct ColorWheelRGB cw; - struct ColorWheelHSB hsb; - - cw.cw_Red = data->rgb[0]; - cw.cw_Green = data->rgb[1]; - cw.cw_Blue = data->rgb[2]; - - ConvertRGBToHSB(&cw, &hsb); - nnset(data->wheel, WHEEL_HSB, (IPTR)&hsb); - nnset(data->wheel, WHEEL_Saturation, hsb.cw_Saturation); - nnset(data->wheel, WHEEL_Hue, hsb.cw_Hue); - nnset(data->grad, GRAD_CurVal, 0xFFFF - (hsb.cw_Brightness >> 16)); - - if ((_flags(obj) & MADF_SETUP) && (data->gradpen != -1)) - { - hsb.cw_Brightness = 0xFFFFFFFF; - ConvertHSBToRGB(&hsb, &cw); - - SetRGB32(&_screen(obj)->ViewPort, data->gradpen, cw.cw_Red, cw.cw_Green, cw.cw_Blue); - if (data->truecolor) - { - MUI_Redraw(data->grad, MADF_DRAWOBJECT); - } - } - - } - } - - return DoSuperMethodA(cl, obj, (Msg)msg); -} - -IPTR Coloradjust__OM_GET(struct IClass *cl, Object * obj, struct opGet *msg) -{ - struct Coloradjust_DATA *data = INST_DATA(cl, obj); - IPTR *store = msg->opg_Storage; - - switch (msg->opg_AttrID) - { - case MUIA_Coloradjust_Red: - *store = data->rgb[0]; - return TRUE; - - case MUIA_Coloradjust_Green: - *store = data->rgb[1]; - return TRUE; - - case MUIA_Coloradjust_Blue: - *store = data->rgb[2]; - return TRUE; - - case MUIA_Coloradjust_RGB: - *(IPTR *)store = (IPTR)&data->rgb[0]; - return TRUE; - } - - return DoSuperMethodA(cl, obj, (Msg)msg); -} - -IPTR Coloradjust__MUIM_Setup(struct IClass *cl, Object *obj, struct MUIP_Setup *msg) -{ - struct Coloradjust_DATA *data = INST_DATA(cl,obj); - - if (!(DoSuperMethodA(cl, obj, (Msg)msg))) return 0; - - if (data->wheel) - { - struct ColorWheelHSB hsb; - struct ColorWheelRGB rgb; - - rgb.cw_Red = data->rgb[0]; - rgb.cw_Green = data->rgb[1]; - rgb.cw_Blue = data->rgb[2]; - - data->gradpenarray[0] = _pens(obj)[MPEN_SHINE]; - data->gradpenarray[1] = _pens(obj)[MPEN_SHADOW]; - data->gradpenarray[2] = (UWORD)~0; - - data->gradpen = ObtainPen(_screen(obj)->ViewPort.ColorMap, - (ULONG)-1, - rgb.cw_Red, - rgb.cw_Green, - rgb.cw_Blue, - PENF_EXCLUSIVE); - - if (data->gradpen != -1) - { - data->gradpenarray[0] = data->gradpen; - } - - ConvertRGBToHSB(&rgb, &hsb); - /* setting this will force wheel to properly set its display */ - nnset(data->wheel, WHEEL_Saturation, hsb.cw_Saturation); - nnset(data->wheel, WHEEL_Hue, hsb.cw_Hue); - - hsb.cw_Brightness = 0xFFFFFFFF; - ConvertHSBToRGB(&hsb, &rgb); - - if (data->gradpen != -1) - { - SetRGB32(&_screen(obj)->ViewPort, data->gradpen, rgb.cw_Red, rgb.cw_Green, rgb.cw_Blue); - } - - data->truecolor = GetBitMapAttr(_screen(obj)->RastPort.BitMap, BMA_DEPTH) >= 15; - } - - return 1; -} - -IPTR Coloradjust__MUIM_Cleanup(struct IClass *cl, Object *obj, struct MUIP_Cleanup *msg) -{ - struct Coloradjust_DATA *data = INST_DATA(cl,obj); - - if (data->gradpen != -1) - { - ReleasePen(_screen(obj)->ViewPort.ColorMap, data->gradpen); - data->gradpen = -1; - } - - return DoSuperMethodA(cl, obj, (Msg)msg); -} - -#if ZUNE_BUILTIN_COLORADJUST -BOOPSI_DISPATCHER(IPTR, Coloradjust_Dispatcher, cl, obj, msg) -{ - switch (msg->MethodID) - { - case OM_NEW: return Coloradjust__OM_NEW(cl, obj, (struct opSet *)msg); - case OM_DISPOSE: return Coloradjust__OM_DISPOSE(cl, obj, msg); - case OM_SET: return Coloradjust__OM_SET(cl, obj, (struct opSet *)msg); - case OM_GET: return Coloradjust__OM_GET(cl, obj, (struct opGet *)msg); - case MUIM_Setup: return Coloradjust__MUIM_Setup(cl, obj, (struct MUIP_Setup *)msg); - case MUIM_Cleanup: return Coloradjust__MUIM_Cleanup(cl, obj, (struct MUIP_Cleanup *)msg); - default: return DoSuperMethodA(cl, obj, msg); - } -} -BOOPSI_DISPATCHER_END - -const struct __MUIBuiltinClass _MUI_Coloradjust_desc = -{ - MUIC_Coloradjust, - MUIC_Group, - sizeof(struct Coloradjust_DATA), - (void*)Coloradjust_Dispatcher -}; -#endif /* ZUNE_BUILTIN_COLORADJUST */ +/* + Copyright © 2002-2003, The AROS Development Team. All rights reserved. + $Id$ +*/ + +#define MUIMASTER_YES_INLINE_STDARG + +#include <stdio.h> + +#include <graphics/gfx.h> +#include <graphics/view.h> +#include <graphics/gfxmacros.h> +#include <intuition/gadgetclass.h> +#include <gadgets/colorwheel.h> +#include <gadgets/gradientslider.h> +#include <intuition/icclass.h> +#include <clib/alib_protos.h> +#include <proto/exec.h> +#include <proto/graphics.h> +#include <proto/utility.h> +#include <proto/intuition.h> +#include <proto/colorwheel.h> +#include <proto/muimaster.h> + +#include <string.h> + +#include "mui.h" +#include "muimaster_intern.h" +#include "support.h" +#include "support_classes.h" +#include "coloradjust_private.h" + +/* #define MYDEBUG 1 */ +#include "debug.h" + +extern struct Library *MUIMasterBase; + +#define FLAG_FIXED_PEN 1 +#define FLAG_PEN_ALLOCATED 2 +#define FLAG_NO_PEN 4 + +#define ColorWheelBase data->colorwheelbase +#define IColorWheel data->icolorwheel + +static void NotifyGun(Object *obj, struct Coloradjust_DATA *data, LONG gun) +{ + static Tag guntotag[3] = { + MUIA_Coloradjust_Red, + MUIA_Coloradjust_Green, + MUIA_Coloradjust_Blue + }; + + struct TagItem tags[] = { + {0, 0}, + {MUIA_Coloradjust_RGB, 0}, + {TAG_DONE} + }; + + tags[0].ti_Tag = guntotag[gun]; + tags[0].ti_Data = data->rgb[gun]; + tags[1].ti_Data = (IPTR) data->rgb; + + CoerceMethod(data->notifyclass, obj, OM_SET, (IPTR) tags, NULL); +} + +static void NotifyAll(Object *obj, struct Coloradjust_DATA *data) +{ + struct TagItem tags[] = { + {MUIA_Coloradjust_Red, 0}, + {MUIA_Coloradjust_Green, 0}, + {MUIA_Coloradjust_Blue, 0}, + {MUIA_Coloradjust_RGB, 0}, + {TAG_DONE} + }; + tags[0].ti_Data = data->rgb[0]; + tags[1].ti_Data = data->rgb[1]; + tags[2].ti_Data = data->rgb[2]; + tags[3].ti_Data = (IPTR) data->rgb; + CoerceMethod(data->notifyclass, obj, OM_SET, (IPTR) tags, NULL); +} + +static void SliderFunc(struct Hook *hook, Object *obj, APTR msg) +{ + struct ColorWheelRGB cw; + struct Coloradjust_DATA *data = *(struct Coloradjust_DATA **)msg; + IPTR gun = ((IPTR *) msg)[1]; + + ULONG red = XGET(data->rslider, MUIA_Numeric_Value); + ULONG green = XGET(data->gslider, MUIA_Numeric_Value); + ULONG blue = XGET(data->bslider, MUIA_Numeric_Value); + + cw.cw_Red = (red << 24) | (red << 16) | (red << 8) | red; + cw.cw_Green = (green << 24) | (green << 16) | (green << 8) | green; + cw.cw_Blue = (blue << 24) | (blue << 16) | (blue << 8) | blue; + + data->rgb[0] = cw.cw_Red; + data->rgb[1] = cw.cw_Green; + data->rgb[2] = cw.cw_Blue; + + nnset(data->colfield, MUIA_Colorfield_RGB, (IPTR) data->rgb); + + if (data->wheel) + { + struct ColorWheelHSB hsb; + + ConvertRGBToHSB(&cw, &hsb); + nnset(data->wheel, WHEEL_HSB, (IPTR) & hsb); + nnset(data->grad, GRAD_CurVal, 0xFFFF - (hsb.cw_Brightness >> 16)); + + if (data->gradpen != -1) + { + hsb.cw_Brightness = 0xFFFFFFFF; + ConvertHSBToRGB(&hsb, &cw); + + SetRGB32(&_screen(obj)->ViewPort, data->gradpen, cw.cw_Red, + cw.cw_Green, cw.cw_Blue); + if (data->truecolor) + MUI_Redraw(data->grad, MADF_DRAWUPDATE); + } + } + + NotifyGun(obj, data, gun); +} + +static void WheelFunc(struct Hook *hook, Object *obj, APTR msg) +{ + struct Coloradjust_DATA *data = *(struct Coloradjust_DATA **)msg; + struct ColorWheelHSB hsb; + struct ColorWheelRGB cw; + + hsb.cw_Hue = XGET(data->wheel, WHEEL_Hue); + hsb.cw_Saturation = XGET(data->wheel, WHEEL_Saturation); + hsb.cw_Brightness = 0xFFFF - XGET(data->grad, GRAD_CurVal); + hsb.cw_Brightness |= (hsb.cw_Brightness << 16); + + ConvertHSBToRGB(&hsb, &cw); + + data->rgb[0] = cw.cw_Red; + data->rgb[1] = cw.cw_Green; + data->rgb[2] = cw.cw_Blue; + + nnset(data->rslider, MUIA_Numeric_Value, data->rgb[0] >> 24); + nnset(data->gslider, MUIA_Numeric_Value, data->rgb[1] >> 24); + nnset(data->bslider, MUIA_Numeric_Value, data->rgb[2] >> 24); + + nnset(data->colfield, MUIA_Colorfield_RGB, (IPTR) data->rgb); + + if (data->gradpen != -1) + { + hsb.cw_Brightness = 0xFFFFFFFF; + ConvertHSBToRGB(&hsb, &cw); + + SetRGB32(&_screen(obj)->ViewPort, data->gradpen, cw.cw_Red, + cw.cw_Green, cw.cw_Blue); + if (data->truecolor) + MUI_Redraw(data->grad, MADF_DRAWUPDATE); + } + + NotifyAll(obj, data); +} + +static void GradFunc(struct Hook *hook, Object *obj, APTR msg) +{ + struct Coloradjust_DATA *data = *(struct Coloradjust_DATA **)msg; + struct ColorWheelHSB hsb; + struct ColorWheelRGB cw; + + ULONG bright = XGET(data->grad, GRAD_CurVal); + + bright = 0xFFFF - bright; + bright |= (bright << 16); + + hsb.cw_Hue = XGET(data->wheel, WHEEL_Hue); + hsb.cw_Saturation = XGET(data->wheel, WHEEL_Saturation); + hsb.cw_Brightness = bright; + + ConvertHSBToRGB(&hsb, &cw); + + data->rgb[0] = cw.cw_Red; + data->rgb[1] = cw.cw_Green; + data->rgb[2] = cw.cw_Blue; + + nnset(data->rslider, MUIA_Numeric_Value, data->rgb[0] >> 24); + nnset(data->gslider, MUIA_Numeric_Value, data->rgb[1] >> 24); + nnset(data->bslider, MUIA_Numeric_Value, data->rgb[2] >> 24); + + nnset(data->colfield, MUIA_Colorfield_RGB, (IPTR) data->rgb); + + NotifyAll(obj, data); +} + + +IPTR Coloradjust__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) +{ + struct Coloradjust_DATA *data; + struct TagItem *tags; + struct TagItem *tag; + struct Library *colorwheelbase, *gradientsliderbase; + Object *rslider, *gslider, *bslider; + Object *colfield, *wheel = NULL, *grad = NULL; + ULONG *rgb; + + colorwheelbase = OpenLibrary("gadgets/colorwheel.gadget", 0); + gradientsliderbase = OpenLibrary("gadgets/gradientslider.gadget", 0); + + obj = (Object *) DoSuperNewTags + (cl, obj, NULL, + MUIA_Group_Columns, 2, + MUIA_Group_VertSpacing, 1, + Child, (IPTR) Label1("Red:"), + Child, (IPTR) (rslider = + (Object *) (SliderObject, MUIA_Group_Horiz, TRUE, + MUIA_Numeric_Min, 0, MUIA_Numeric_Max, 255, End)), Child, + (IPTR) Label1("Green:"), Child, (IPTR) (gslider = + (Object *) (SliderObject, MUIA_Group_Horiz, TRUE, + MUIA_Numeric_Min, 0, MUIA_Numeric_Max, 255, End)), Child, + (IPTR) Label1("Blue:"), Child, (IPTR) (bslider = + (Object *) (SliderObject, MUIA_Group_Horiz, TRUE, + MUIA_Numeric_Min, 0, MUIA_Numeric_Max, 255, End)), Child, + (IPTR) VSpace(1), Child, (IPTR) VSpace(1), Child, (IPTR) (colfield = + (Object *) (ColorfieldObject, TextFrame, MUIA_Weight, 0, End)), + Child, (!colorwheelbase + || !gradientsliderbase) ? (IPTR) HVSpace : (IPTR) HGroup, + /* FIXME: this looks severely broken if the HVSpace path is taken... */ + MUIA_Group_HorizSpacing, 2, + Child, (IPTR) (wheel = (Object *) BoopsiObject, + MUIA_Boopsi_ClassID, (IPTR) "colorwheel.gadget", + MUIA_Boopsi_MinWidth, 16, + MUIA_Boopsi_MinHeight, 16, + MUIA_Boopsi_Remember, WHEEL_Saturation, + MUIA_Boopsi_Remember, WHEEL_Hue, + MUIA_Boopsi_TagScreen, WHEEL_Screen, + WHEEL_Screen, (IPTR) NULL, + GA_Left, 0, + GA_Top, 0, + GA_Width, 0, + GA_Height, 0, + ICA_TARGET, ICTARGET_IDCMP, + MUIA_FillArea, TRUE, + End), + Child, (IPTR) (grad = (Object *) BoopsiObject, + MUIA_Boopsi_ClassID, (IPTR) "gradientslider.gadget", + MUIA_Boopsi_MinWidth, 16, + MUIA_Boopsi_MinHeight, 16, + MUIA_Boopsi_MaxWidth, 16, + MUIA_Boopsi_Remember, GRAD_CurVal, + MUIA_Boopsi_Remember, GRAD_PenArray, + MUIA_Boopsi_Remember, GRAD_KnobPixels, + GA_Left, 0, + GA_Top, 0, + GA_Width, 0, + GA_Height, 0, + GRAD_KnobPixels, 8, + PGA_Freedom, LORIENT_VERT, + ICA_TARGET, ICTARGET_IDCMP, + MUIA_FillArea, TRUE, + End), End, TAG_MORE, (IPTR) msg->ops_AttrList); + + if (!obj) + { + CloseLibrary(gradientsliderbase); + CloseLibrary(colorwheelbase); + return FALSE; + } + + data = INST_DATA(cl, obj); + + data->colorwheelbase = colorwheelbase; + data->gradientsliderbase = gradientsliderbase; + if (!EXEC_INTERFACE_GET_MAIN(data->icolorwheel, data->colorwheelbase)) + { + CoerceMethod(cl, obj, OM_DISPOSE); + return 0; + } + data->notifyclass = cl->cl_Super->cl_Super; + + data->sliderhook.h_Entry = HookEntry; + data->sliderhook.h_SubEntry = (HOOKFUNC) SliderFunc; + + data->wheelhook.h_Entry = HookEntry; + data->wheelhook.h_SubEntry = (HOOKFUNC) WheelFunc; + + data->gradhook.h_Entry = HookEntry; + data->gradhook.h_SubEntry = (HOOKFUNC) GradFunc; + + data->rslider = rslider; + data->gslider = gslider; + data->bslider = bslider; + data->colfield = colfield; + data->wheel = wheel; + data->grad = grad; + + data->rgb[0] = data->rgb[1] = data->rgb[2] = 0xFFFFFFFF; + + /* parse initial taglist */ + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) + { + switch (tag->ti_Tag) + { + case MUIA_Coloradjust_Red: + data->rgb[0] = (ULONG) tag->ti_Data; + break; + + case MUIA_Coloradjust_Green: + data->rgb[1] = (ULONG) tag->ti_Data; + break; + + case MUIA_Coloradjust_Blue: + data->rgb[2] = (ULONG) tag->ti_Data; + break; + + case MUIA_Coloradjust_RGB: + rgb = (ULONG *) tag->ti_Data; + data->rgb[0] = *rgb++; + data->rgb[1] = *rgb++; + data->rgb[2] = *rgb++; + break; + + } + } + + nnset(colfield, MUIA_Colorfield_RGB, (IPTR) data->rgb); + nnset(rslider, MUIA_Numeric_Value, data->rgb[0] >> 24); + nnset(gslider, MUIA_Numeric_Value, data->rgb[1] >> 24); + nnset(bslider, MUIA_Numeric_Value, data->rgb[2] >> 24); + + if (wheel) + { + struct ColorWheelRGB cw; + struct ColorWheelHSB hsb; + + cw.cw_Red = data->rgb[0]; + cw.cw_Green = data->rgb[1]; + cw.cw_Blue = data->rgb[2]; + + ConvertRGBToHSB(&cw, &hsb); + + nnset(wheel, WHEEL_HSB, (IPTR) & hsb); + /* just to be sure - colorwheel seems to have some problems */ + nnset(wheel, WHEEL_Saturation, hsb.cw_Saturation); + nnset(wheel, WHEEL_Hue, hsb.cw_Hue); + nnset(data->grad, GRAD_CurVal, 0xFFFF - (hsb.cw_Brightness >> 16)); + nnset(data->grad, GRAD_PenArray, (IPTR) data->gradpenarray); + } + + DoMethod(rslider, MUIM_Notify, MUIA_Numeric_Value, MUIV_EveryTime, + (IPTR) obj, 4, MUIM_CallHook, (IPTR) & data->sliderhook, + (IPTR) data, 0); + DoMethod(gslider, MUIM_Notify, MUIA_Numeric_Value, MUIV_EveryTime, + (IPTR) obj, 4, MUIM_CallHook, (IPTR) & data->sliderhook, + (IPTR) data, 1); + DoMethod(bslider, MUIM_Notify, MUIA_Numeric_Value, MUIV_EveryTime, + (IPTR) obj, 4, MUIM_CallHook, (IPTR) & data->sliderhook, + (IPTR) data, 2); + + if (wheel) + { + DoMethod(wheel, MUIM_Notify, WHEEL_Hue, MUIV_EveryTime, (IPTR) obj, + 3, MUIM_CallHook, (IPTR) & data->wheelhook, (IPTR) data); + DoMethod(wheel, MUIM_Notify, WHEEL_Saturation, MUIV_EveryTime, + (IPTR) obj, 3, MUIM_CallHook, (IPTR) & data->wheelhook, + (IPTR) data); + DoMethod(grad, MUIM_Notify, GRAD_CurVal, MUIV_EveryTime, (IPTR) obj, + 3, MUIM_CallHook, (IPTR) & data->gradhook, (IPTR) data); + + } + return (IPTR) obj; +} + +IPTR Coloradjust__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) +{ + struct Coloradjust_DATA *data; + struct Library *colorwheelbase; + struct Library *gradientsliderbase; + IPTR retval; + + data = INST_DATA(cl, obj); + + EXEC_INTERFACE_DROP(data->icolorwheel); + colorwheelbase = data->colorwheelbase; + gradientsliderbase = data->gradientsliderbase; + + retval = DoSuperMethodA(cl, obj, msg); + + if (colorwheelbase) + CloseLibrary(colorwheelbase); + if (gradientsliderbase) + CloseLibrary(gradientsliderbase); + + return retval; +} + +IPTR Coloradjust__OM_SET(struct IClass *cl, Object *obj, + struct opSet *msg) +{ + struct Coloradjust_DATA *data; + struct TagItem *tags; + struct TagItem *tag; + ULONG *rgb; + BOOL newcol = FALSE; + + data = INST_DATA(cl, obj); + + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) + { + switch (tag->ti_Tag) + { + case MUIA_Coloradjust_Red: + data->rgb[0] = (ULONG) tag->ti_Data; + newcol = TRUE; + break; + + case MUIA_Coloradjust_Green: + data->rgb[1] = (ULONG) tag->ti_Data; + newcol = TRUE; + break; + + case MUIA_Coloradjust_Blue: + data->rgb[2] = (ULONG) tag->ti_Data; + newcol = TRUE; + break; + + case MUIA_Coloradjust_RGB: + rgb = (ULONG *) tag->ti_Data; + data->rgb[0] = *rgb++; + data->rgb[1] = *rgb++; + data->rgb[2] = *rgb++; + newcol = TRUE; + break; + + } + } + + if (newcol) + { + nnset(data->rslider, MUIA_Numeric_Value, data->rgb[0] >> 24); + nnset(data->gslider, MUIA_Numeric_Value, data->rgb[1] >> 24); + nnset(data->bslider, MUIA_Numeric_Value, data->rgb[2] >> 24); + D(bug("coloradjust: sliders set to %ld, %ld, %ld\n", + data->rgb[0] >> 24, data->rgb[1] >> 24, + data->rgb[2] >> 24)); + + nnset(data->colfield, MUIA_Colorfield_RGB, (IPTR) data->rgb); + + if (data->wheel) + { + struct ColorWheelRGB cw; + struct ColorWheelHSB hsb; + + cw.cw_Red = data->rgb[0]; + cw.cw_Green = data->rgb[1]; + cw.cw_Blue = data->rgb[2]; + + ConvertRGBToHSB(&cw, &hsb); + nnset(data->wheel, WHEEL_HSB, (IPTR) & hsb); + nnset(data->wheel, WHEEL_Saturation, hsb.cw_Saturation); + nnset(data->wheel, WHEEL_Hue, hsb.cw_Hue); + nnset(data->grad, GRAD_CurVal, + 0xFFFF - (hsb.cw_Brightness >> 16)); + + if ((_flags(obj) & MADF_SETUP) && (data->gradpen != -1)) + { + hsb.cw_Brightness = 0xFFFFFFFF; + ConvertHSBToRGB(&hsb, &cw); + + SetRGB32(&_screen(obj)->ViewPort, data->gradpen, cw.cw_Red, + cw.cw_Green, cw.cw_Blue); + if (data->truecolor) + { + MUI_Redraw(data->grad, MADF_DRAWOBJECT); + } + } + + } + } + + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +IPTR Coloradjust__OM_GET(struct IClass *cl, Object *obj, + struct opGet *msg) +{ + struct Coloradjust_DATA *data = INST_DATA(cl, obj); + IPTR *store = msg->opg_Storage; + + switch (msg->opg_AttrID) + { + case MUIA_Coloradjust_Red: + *store = data->rgb[0]; + return TRUE; + + case MUIA_Coloradjust_Green: + *store = data->rgb[1]; + return TRUE; + + case MUIA_Coloradjust_Blue: + *store = data->rgb[2]; + return TRUE; + + case MUIA_Coloradjust_RGB: + *(IPTR *) store = (IPTR) & data->rgb[0]; + return TRUE; + } + + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +IPTR Coloradjust__MUIM_Setup(struct IClass *cl, Object *obj, + struct MUIP_Setup *msg) +{ + struct Coloradjust_DATA *data = INST_DATA(cl, obj); + + if (!(DoSuperMethodA(cl, obj, (Msg) msg))) + return 0; + + if (data->wheel) + { + struct ColorWheelHSB hsb; + struct ColorWheelRGB rgb; + + rgb.cw_Red = data->rgb[0]; + rgb.cw_Green = data->rgb[1]; + rgb.cw_Blue = data->rgb[2]; + + data->gradpenarray[0] = _pens(obj)[MPEN_SHINE]; + data->gradpenarray[1] = _pens(obj)[MPEN_SHADOW]; + data->gradpenarray[2] = (UWORD) ~ 0; + + data->gradpen = ObtainPen(_screen(obj)->ViewPort.ColorMap, + (ULONG) - 1, + rgb.cw_Red, rgb.cw_Green, rgb.cw_Blue, PENF_EXCLUSIVE); + + if (data->gradpen != -1) + { + data->gradpenarray[0] = data->gradpen; + } + + ConvertRGBToHSB(&rgb, &hsb); + /* setting this will force wheel to properly set its display */ + nnset(data->wheel, WHEEL_Saturation, hsb.cw_Saturation); + nnset(data->wheel, WHEEL_Hue, hsb.cw_Hue); + + hsb.cw_Brightness = 0xFFFFFFFF; + ConvertHSBToRGB(&hsb, &rgb); + + if (data->gradpen != -1) + { + SetRGB32(&_screen(obj)->ViewPort, data->gradpen, rgb.cw_Red, + rgb.cw_Green, rgb.cw_Blue); + } + + data->truecolor = + GetBitMapAttr(_screen(obj)->RastPort.BitMap, BMA_DEPTH) >= 15; + } + + return 1; +} + +IPTR Coloradjust__MUIM_Cleanup(struct IClass *cl, Object *obj, + struct MUIP_Cleanup *msg) +{ + struct Coloradjust_DATA *data = INST_DATA(cl, obj); + + if (data->gradpen != -1) + { + ReleasePen(_screen(obj)->ViewPort.ColorMap, data->gradpen); + data->gradpen = -1; + } + + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +#if ZUNE_BUILTIN_COLORADJUST +BOOPSI_DISPATCHER(IPTR, Coloradjust_Dispatcher, cl, obj, msg) +{ + switch (msg->MethodID) + { + case OM_NEW: + return Coloradjust__OM_NEW(cl, obj, (struct opSet *)msg); + case OM_DISPOSE: + return Coloradjust__OM_DISPOSE(cl, obj, msg); + case OM_SET: + return Coloradjust__OM_SET(cl, obj, (struct opSet *)msg); + case OM_GET: + return Coloradjust__OM_GET(cl, obj, (struct opGet *)msg); + case MUIM_Setup: + return Coloradjust__MUIM_Setup(cl, obj, (struct MUIP_Setup *)msg); + case MUIM_Cleanup: + return Coloradjust__MUIM_Cleanup(cl, obj, + (struct MUIP_Cleanup *)msg); + default: + return DoSuperMethodA(cl, obj, msg); + } +} +BOOPSI_DISPATCHER_END + +const struct __MUIBuiltinClass _MUI_Coloradjust_desc = +{ + MUIC_Coloradjust, + MUIC_Group, + sizeof(struct Coloradjust_DATA), + (void *) Coloradjust_Dispatcher +}; +#endif /* ZUNE_BUILTIN_COLORADJUST */ diff --git a/workbench/libs/muimaster/classes/coloradjust.h b/workbench/libs/muimaster/classes/coloradjust.h index df2cb93003..a89cc6299c 100644 --- a/workbench/libs/muimaster/classes/coloradjust.h +++ b/workbench/libs/muimaster/classes/coloradjust.h @@ -13,13 +13,18 @@ #define MUIB_Coloradjust (MUIB_ZUNE | 0x00000700) /*** Attributes *************************************************************/ -#define MUIA_Coloradjust_Red (MUIB_MUI|0x00420eaa) /* isg ULONG */ -#define MUIA_Coloradjust_Green (MUIB_MUI|0x004285ab) /* isg ULONG */ -#define MUIA_Coloradjust_Blue (MUIB_MUI|0x0042b8a3) /* isg ULONG */ -#define MUIA_Coloradjust_RGB (MUIB_MUI|0x0042f899) /* isg ULONG * */ -#define MUIA_Coloradjust_ModeID (MUIB_MUI|0x0042ec59) /* isg ULONG */ +#define MUIA_Coloradjust_Red \ + (MUIB_MUI | 0x00420eaa) /* isg ULONG */ +#define MUIA_Coloradjust_Green \ + (MUIB_MUI | 0x004285ab) /* isg ULONG */ +#define MUIA_Coloradjust_Blue \ + (MUIB_MUI | 0x0042b8a3) /* isg ULONG */ +#define MUIA_Coloradjust_RGB \ + (MUIB_MUI | 0x0042f899) /* isg ULONG * */ +#define MUIA_Coloradjust_ModeID \ + (MUIB_MUI | 0x0042ec59) /* isg ULONG */ -extern const struct __MUIBuiltinClass _MUI_Coloradjust_desc; /* PRIV */ +extern const struct __MUIBuiltinClass _MUI_Coloradjust_desc; /* PRIV */ #endif /* _MUI_CLASSES_COLORADJUST_H */ diff --git a/workbench/libs/muimaster/classes/colorfield.c b/workbench/libs/muimaster/classes/colorfield.c dissimilarity index 74% index df6db98dd2..922a9b9066 100644 --- a/workbench/libs/muimaster/classes/colorfield.c +++ b/workbench/libs/muimaster/classes/colorfield.c @@ -1,308 +1,324 @@ -/* - Copyright © 2002-2003, The AROS Development Team. All rights reserved. - $Id$ -*/ - -#define MUIMASTER_YES_INLINE_STDARG - -#include <stdio.h> - -#include <graphics/gfx.h> -#include <graphics/view.h> -#include <graphics/gfxmacros.h> -#include <clib/alib_protos.h> -#include <proto/exec.h> -#include <proto/graphics.h> -#include <proto/utility.h> -#include <proto/intuition.h> -#include <proto/muimaster.h> - -#include <string.h> - -#include "mui.h" -#include "muimaster_intern.h" -#include "textengine.h" -#include "support.h" -#include "support_classes.h" -#include "colorfield_private.h" - -/* #define MYDEBUG 1 */ -#include "debug.h" - -extern struct Library *MUIMasterBase; - -#define FLAG_FIXED_PEN 1 -#define FLAG_PEN_ALLOCATED 2 -#define FLAG_NO_PEN 4 - - -IPTR Colorfield__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct Colorfield_DATA *data; - struct TagItem *tags; - struct TagItem *tag; - ULONG *rgb; - - obj = (Object *)DoSuperMethodA(cl, obj, (Msg)msg); - if (!obj) return FALSE; - - data = INST_DATA(cl, obj); - - /* parse initial taglist */ - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) - { - switch (tag->ti_Tag) - { - case MUIA_Colorfield_Red: - data->rgb[0] = (ULONG)tag->ti_Data; - break; - - case MUIA_Colorfield_Green: - data->rgb[1] = (ULONG)tag->ti_Data; - break; - - case MUIA_Colorfield_Blue: - data->rgb[2] = (ULONG)tag->ti_Data; - break; - - case MUIA_Colorfield_RGB: - rgb = (ULONG *)tag->ti_Data; - data->rgb[0] = *rgb++; - data->rgb[1] = *rgb++; - data->rgb[2] = *rgb++; - break; - - case MUIA_Colorfield_Pen: - data->pen = (UBYTE)tag->ti_Data; - data->pen = FLAG_FIXED_PEN; - break; - - } - } - - return (IPTR)obj; -} - -IPTR Colorfield__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct Colorfield_DATA *data; - struct TagItem *tags; - struct TagItem *tag; - ULONG *rgb; - BOOL newcol = FALSE; - IPTR retval; - - data = INST_DATA(cl, obj); - - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) - { - switch (tag->ti_Tag) - { - case MUIA_Colorfield_Red: - data->rgb[0] = (ULONG)tag->ti_Data; - newcol = TRUE; - break; - - case MUIA_Colorfield_Green: - data->rgb[1] = (ULONG)tag->ti_Data; - newcol = TRUE; - break; - - case MUIA_Colorfield_Blue: - data->rgb[2] = (ULONG)tag->ti_Data; - newcol = TRUE; - break; - - case MUIA_Colorfield_RGB: - rgb = (ULONG *)tag->ti_Data; - data->rgb[0] = *rgb++; - data->rgb[1] = *rgb++; - data->rgb[2] = *rgb++; - newcol = TRUE; - break; - - case MUIA_Colorfield_Pen: - if (data->flags & FLAG_PEN_ALLOCATED) - { - ReleasePen(_screen(obj)->ViewPort.ColorMap, data->pen); - data->flags &= ~(FLAG_PEN_ALLOCATED | FLAG_NO_PEN); - } - data->pen = (UBYTE)data->pen; - data->flags |= FLAG_FIXED_PEN; - break; - - } - } - - retval = DoSuperMethodA(cl, obj, (Msg)msg); - - if (newcol && (_flags(obj) & MADF_SETUP) && !(data->flags & FLAG_NO_PEN)) - { - SetRGB32(&_screen(obj)->ViewPort, data->pen, data->rgb[0], data->rgb[1], data->rgb[2]); - - if (GetBitMapAttr(_rp(obj)->BitMap, BMA_DEPTH) > 8) - { - MUI_Redraw(obj, MADF_DRAWUPDATE); - } - } - - return retval; -} - -IPTR Colorfield__OM_GET(struct IClass *cl, Object * obj, struct opGet *msg) -{ - struct Colorfield_DATA *data = INST_DATA(cl, obj); - IPTR *store = msg->opg_Storage; - - switch (msg->opg_AttrID) - { - case MUIA_Colorfield_Red: - *store = data->rgb[0]; - break; - - case MUIA_Colorfield_Green: - *store = data->rgb[1]; - break; - - case MUIA_Colorfield_Blue: - *store = data->rgb[2]; - break; - - case MUIA_Colorfield_RGB: - *(ULONG **)store = data->rgb; - break; - - case MUIA_Colorfield_Pen: - *store = data->pen; - break; - - default: - return DoSuperMethodA(cl, obj, (Msg)msg); - } - - return TRUE; -} - -IPTR Colorfield__MUIM_Setup(struct IClass *cl, Object *obj, struct MUIP_Setup *msg) -{ - struct Colorfield_DATA *data = INST_DATA(cl,obj); - - if (!(DoSuperMethodA(cl, obj, (Msg)msg))) return 0; - - if (data->flags & FLAG_FIXED_PEN) - { - SetRGB32(&_screen(obj)->ViewPort, - data->pen, - data->rgb[0], - data->rgb[1], - data->rgb[2]); - } - else - { - LONG pen; - - pen = ObtainPen(_screen(obj)->ViewPort.ColorMap, - (ULONG)-1, - data->rgb[0], - data->rgb[1], - data->rgb[2], - PENF_EXCLUSIVE); - - if (pen == -1) - { - data->flags |= FLAG_NO_PEN; - data->pen = 0; - } - else - { - data->pen = (UBYTE)pen; - data->flags |= FLAG_PEN_ALLOCATED; - } - } - - return 1; -} - -IPTR Colorfield__MUIM_Cleanup(struct IClass *cl, Object *obj, struct MUIP_Cleanup *msg) -{ - struct Colorfield_DATA *data = INST_DATA(cl,obj); - - if (data->flags & FLAG_PEN_ALLOCATED) - { - ReleasePen(_screen(obj)->ViewPort.ColorMap, data->pen); - data->flags &= ~FLAG_PEN_ALLOCATED; - data->pen = 0; - } - data->flags &= ~FLAG_NO_PEN; - - return DoSuperMethodA(cl, obj, (Msg)msg); -} - -IPTR Colorfield__MUIM_AskMinMax(struct IClass *cl, Object *obj, struct MUIP_AskMinMax *msg) -{ - DoSuperMethodA(cl,obj,(Msg)msg); - - msg->MinMaxInfo->MinWidth += 1; - msg->MinMaxInfo->MinHeight += 1; - msg->MinMaxInfo->DefWidth += 16; - msg->MinMaxInfo->DefHeight += 16; - msg->MinMaxInfo->MaxWidth = MUI_MAXMAX; - msg->MinMaxInfo->MaxHeight = MUI_MAXMAX; - - return 0; -} - -IPTR Colorfield__MUIM_Draw(struct IClass *cl, Object *obj, struct MUIP_Draw *msg) -{ - struct Colorfield_DATA *data = INST_DATA(cl,obj); - - DoSuperMethodA(cl,obj,(Msg)msg); - - if (!(msg->flags & (MADF_DRAWOBJECT | MADF_DRAWUPDATE))) - return FALSE; - - if (data->flags & FLAG_NO_PEN) - { - static UWORD pat[] = {0x1111,0x2222,0x4444,0x8888}; - - SetAfPt(_rp(obj), pat, 2); - SetABPenDrMd(_rp(obj), _pens(obj)[MPEN_SHADOW], _pens(obj)[MPEN_BACKGROUND],JAM2); - - } - else - { - SetABPenDrMd(_rp(obj), data->pen, 0,JAM1); - } - - RectFill(_rp(obj), _mleft(obj), _mtop(obj), _mright(obj), _mbottom(obj)); - - SetAfPt(_rp(obj), NULL, 0); - - return 0; -} - -#if ZUNE_BUILTIN_COLORFIELD -BOOPSI_DISPATCHER(IPTR, Colorfield_Dispatcher, cl, obj, msg) -{ - switch (msg->MethodID) - { - case OM_NEW: return Colorfield__OM_NEW(cl, obj, (struct opSet *)msg); - case OM_SET: return Colorfield__OM_SET(cl, obj, (struct opSet *)msg); - case OM_GET: return Colorfield__OM_GET(cl, obj, (struct opGet *)msg); - case MUIM_Setup: return Colorfield__MUIM_Setup(cl, obj, (struct MUIP_Setup *)msg); - case MUIM_Cleanup: return Colorfield__MUIM_Cleanup(cl, obj, (struct MUIP_Cleanup *)msg); - case MUIM_AskMinMax: return Colorfield__MUIM_AskMinMax(cl, obj, (struct MUIP_AskMinMax*)msg); - case MUIM_Draw: return Colorfield__MUIM_Draw(cl, obj, (struct MUIP_Draw*)msg); - default: return DoSuperMethodA(cl, obj, msg); - } -} -BOOPSI_DISPATCHER_END - -const struct __MUIBuiltinClass _MUI_Colorfield_desc = -{ - MUIC_Colorfield, - MUIC_Area, - sizeof(struct Colorfield_DATA), - (void*)Colorfield_Dispatcher -}; -#endif /* ZUNE_BUILTIN_COLORFIELD */ +/* + Copyright © 2002-2003, The AROS Development Team. All rights reserved. + $Id$ +*/ + +#define MUIMASTER_YES_INLINE_STDARG + +#include <stdio.h> + +#include <graphics/gfx.h> +#include <graphics/view.h> +#include <graphics/gfxmacros.h> +#include <clib/alib_protos.h> +#include <proto/exec.h> +#include <proto/graphics.h> +#include <proto/utility.h> +#include <proto/intuition.h> +#include <proto/muimaster.h> + +#include <string.h> + +#include "mui.h" +#include "muimaster_intern.h" +#include "textengine.h" +#include "support.h" +#include "support_classes.h" +#include "colorfield_private.h" + +/* #define MYDEBUG 1 */ +#include "debug.h" + +extern struct Library *MUIMasterBase; + +#define FLAG_FIXED_PEN 1 +#define FLAG_PEN_ALLOCATED 2 +#define FLAG_NO_PEN 4 + + +IPTR Colorfield__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) +{ + struct Colorfield_DATA *data; + struct TagItem *tags; + struct TagItem *tag; + ULONG *rgb; + + obj = (Object *) DoSuperMethodA(cl, obj, (Msg) msg); + if (!obj) + return FALSE; + + data = INST_DATA(cl, obj); + + /* parse initial taglist */ + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) + { + switch (tag->ti_Tag) + { + case MUIA_Colorfield_Red: + data->rgb[0] = (ULONG) tag->ti_Data; + break; + + case MUIA_Colorfield_Green: + data->rgb[1] = (ULONG) tag->ti_Data; + break; + + case MUIA_Colorfield_Blue: + data->rgb[2] = (ULONG) tag->ti_Data; + break; + + case MUIA_Colorfield_RGB: + rgb = (ULONG *) tag->ti_Data; + data->rgb[0] = *rgb++; + data->rgb[1] = *rgb++; + data->rgb[2] = *rgb++; + break; + + case MUIA_Colorfield_Pen: + data->pen = (UBYTE) tag->ti_Data; + data->pen = FLAG_FIXED_PEN; + break; + + } + } + + return (IPTR) obj; +} + +IPTR Colorfield__OM_SET(struct IClass *cl, Object *obj, + struct opSet *msg) +{ + struct Colorfield_DATA *data; + struct TagItem *tags; + struct TagItem *tag; + ULONG *rgb; + BOOL newcol = FALSE; + IPTR retval; + + data = INST_DATA(cl, obj); + + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) + { + switch (tag->ti_Tag) + { + case MUIA_Colorfield_Red: + data->rgb[0] = (ULONG) tag->ti_Data; + newcol = TRUE; + break; + + case MUIA_Colorfield_Green: + data->rgb[1] = (ULONG) tag->ti_Data; + newcol = TRUE; + break; + + case MUIA_Colorfield_Blue: + data->rgb[2] = (ULONG) tag->ti_Data; + newcol = TRUE; + break; + + case MUIA_Colorfield_RGB: + rgb = (ULONG *) tag->ti_Data; + data->rgb[0] = *rgb++; + data->rgb[1] = *rgb++; + data->rgb[2] = *rgb++; + newcol = TRUE; + break; + + case MUIA_Colorfield_Pen: + if (data->flags & FLAG_PEN_ALLOCATED) + { + ReleasePen(_screen(obj)->ViewPort.ColorMap, data->pen); + data->flags &= ~(FLAG_PEN_ALLOCATED | FLAG_NO_PEN); + } + data->pen = (UBYTE) data->pen; + data->flags |= FLAG_FIXED_PEN; + break; + + } + } + + retval = DoSuperMethodA(cl, obj, (Msg) msg); + + if (newcol && (_flags(obj) & MADF_SETUP) + && !(data->flags & FLAG_NO_PEN)) + { + SetRGB32(&_screen(obj)->ViewPort, data->pen, data->rgb[0], + data->rgb[1], data->rgb[2]); + + if (GetBitMapAttr(_rp(obj)->BitMap, BMA_DEPTH) > 8) + { + MUI_Redraw(obj, MADF_DRAWUPDATE); + } + } + + return retval; +} + +IPTR Colorfield__OM_GET(struct IClass *cl, Object *obj, + struct opGet *msg) +{ + struct Colorfield_DATA *data = INST_DATA(cl, obj); + IPTR *store = msg->opg_Storage; + + switch (msg->opg_AttrID) + { + case MUIA_Colorfield_Red: + *store = data->rgb[0]; + break; + + case MUIA_Colorfield_Green: + *store = data->rgb[1]; + break; + + case MUIA_Colorfield_Blue: + *store = data->rgb[2]; + break; + + case MUIA_Colorfield_RGB: + *(ULONG **) store = data->rgb; + break; + + case MUIA_Colorfield_Pen: + *store = data->pen; + break; + + default: + return DoSuperMethodA(cl, obj, (Msg) msg); + } + + return TRUE; +} + +IPTR Colorfield__MUIM_Setup(struct IClass *cl, Object *obj, + struct MUIP_Setup *msg) +{ + struct Colorfield_DATA *data = INST_DATA(cl, obj); + + if (!(DoSuperMethodA(cl, obj, (Msg) msg))) + return 0; + + if (data->flags & FLAG_FIXED_PEN) + { + SetRGB32(&_screen(obj)->ViewPort, + data->pen, data->rgb[0], data->rgb[1], data->rgb[2]); + } + else + { + LONG pen; + + pen = ObtainPen(_screen(obj)->ViewPort.ColorMap, + (ULONG) - 1, + data->rgb[0], data->rgb[1], data->rgb[2], PENF_EXCLUSIVE); + + if (pen == -1) + { + data->flags |= FLAG_NO_PEN; + data->pen = 0; + } + else + { + data->pen = (UBYTE) pen; + data->flags |= FLAG_PEN_ALLOCATED; + } + } + + return 1; +} + +IPTR Colorfield__MUIM_Cleanup(struct IClass *cl, Object *obj, + struct MUIP_Cleanup *msg) +{ + struct Colorfield_DATA *data = INST_DATA(cl, obj); + + if (data->flags & FLAG_PEN_ALLOCATED) + { + ReleasePen(_screen(obj)->ViewPort.ColorMap, data->pen); + data->flags &= ~FLAG_PEN_ALLOCATED; + data->pen = 0; + } + data->flags &= ~FLAG_NO_PEN; + + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +IPTR Colorfield__MUIM_AskMinMax(struct IClass *cl, Object *obj, + struct MUIP_AskMinMax *msg) +{ + DoSuperMethodA(cl, obj, (Msg) msg); + + msg->MinMaxInfo->MinWidth += 1; + msg->MinMaxInfo->MinHeight += 1; + msg->MinMaxInfo->DefWidth += 16; + msg->MinMaxInfo->DefHeight += 16; + msg->MinMaxInfo->MaxWidth = MUI_MAXMAX; + msg->MinMaxInfo->MaxHeight = MUI_MAXMAX; + + return 0; +} + +IPTR Colorfield__MUIM_Draw(struct IClass *cl, Object *obj, + struct MUIP_Draw *msg) +{ + struct Colorfield_DATA *data = INST_DATA(cl, obj); + + DoSuperMethodA(cl, obj, (Msg) msg); + + if (!(msg->flags & (MADF_DRAWOBJECT | MADF_DRAWUPDATE))) + return FALSE; + + if (data->flags & FLAG_NO_PEN) + { + static UWORD pat[] = { 0x1111, 0x2222, 0x4444, 0x8888 }; + + SetAfPt(_rp(obj), pat, 2); + SetABPenDrMd(_rp(obj), _pens(obj)[MPEN_SHADOW], + _pens(obj)[MPEN_BACKGROUND], JAM2); + + } + else + { + SetABPenDrMd(_rp(obj), data->pen, 0, JAM1); + } + + RectFill(_rp(obj), _mleft(obj), _mtop(obj), _mright(obj), + _mbottom(obj)); + + SetAfPt(_rp(obj), NULL, 0); + + return 0; +} + +#if ZUNE_BUILTIN_COLORFIELD +BOOPSI_DISPATCHER(IPTR, Colorfield_Dispatcher, cl, obj, msg) +{ + switch (msg->MethodID) + { + case OM_NEW: + return Colorfield__OM_NEW(cl, obj, (struct opSet *)msg); + case OM_SET: + return Colorfield__OM_SET(cl, obj, (struct opSet *)msg); + case OM_GET: + return Colorfield__OM_GET(cl, obj, (struct opGet *)msg); + case MUIM_Setup: + return Colorfield__MUIM_Setup(cl, obj, (struct MUIP_Setup *)msg); + case MUIM_Cleanup: + return Colorfield__MUIM_Cleanup(cl, obj, + (struct MUIP_Cleanup *)msg); + case MUIM_AskMinMax: + return Colorfield__MUIM_AskMinMax(cl, obj, + (struct MUIP_AskMinMax *)msg); + case MUIM_Draw: + return Colorfield__MUIM_Draw(cl, obj, (struct MUIP_Draw *)msg); + default: + return DoSuperMethodA(cl, obj, msg); + } +} +BOOPSI_DISPATCHER_END + +const struct __MUIBuiltinClass _MUI_Colorfield_desc = +{ + MUIC_Colorfield, + MUIC_Area, + sizeof(struct Colorfield_DATA), + (void *) Colorfield_Dispatcher +}; +#endif /* ZUNE_BUILTIN_COLORFIELD */ diff --git a/workbench/libs/muimaster/classes/colorfield.h b/workbench/libs/muimaster/classes/colorfield.h index 1d950a0110..f6541e85e9 100644 --- a/workbench/libs/muimaster/classes/colorfield.h +++ b/workbench/libs/muimaster/classes/colorfield.h @@ -13,11 +13,11 @@ #define MUIB_Colorfield (MUIB_ZUNE | 0x00000800) /*** Attributes *************************************************************/ -#define MUIA_Colorfield_Pen (MUIB_MUI|0x0042713a) /* ..g ULONG */ -#define MUIA_Colorfield_Red (MUIB_MUI|0x004279f6) /* isg ULONG */ -#define MUIA_Colorfield_Green (MUIB_MUI|0x00424466) /* isg ULONG */ -#define MUIA_Colorfield_Blue (MUIB_MUI|0x0042d3b0) /* isg ULONG */ -#define MUIA_Colorfield_RGB (MUIB_MUI|0x0042677a) /* isg ULONG * */ +#define MUIA_Colorfield_Pen (MUIB_MUI | 0x0042713a) /* ..g ULONG */ +#define MUIA_Colorfield_Red (MUIB_MUI | 0x004279f6) /* isg ULONG */ +#define MUIA_Colorfield_Green (MUIB_MUI | 0x00424466) /* isg ULONG */ +#define MUIA_Colorfield_Blue (MUIB_MUI | 0x0042d3b0) /* isg ULONG */ +#define MUIA_Colorfield_RGB (MUIB_MUI | 0x0042677a) /* isg ULONG * */ extern const struct __MUIBuiltinClass _MUI_Colorfield_desc; /* PRIV */ diff --git a/workbench/libs/muimaster/classes/configdata.c b/workbench/libs/muimaster/classes/configdata.c dissimilarity index 61% index 534a3a1554..659450bbaf 100644 --- a/workbench/libs/muimaster/classes/configdata.c +++ b/workbench/libs/muimaster/classes/configdata.c @@ -1,1039 +1,1188 @@ -/* - Copyright 2002, The AROS Development Team. - All rights reserved. - - $Id$ -*/ -#include <stdlib.h> -#include <string.h> -#include <stdio.h> - -#include <exec/types.h> -#include <prefs/prefhdr.h> -#include <clib/alib_protos.h> -#include <proto/exec.h> -#include <proto/intuition.h> -#include <proto/utility.h> -#include <proto/iffparse.h> -#include <proto/dos.h> -#include <proto/commodities.h> -#include <proto/muimaster.h> - -/* #define MYDEBUG 1 */ -#include "debug.h" - -#include "muimaster_intern.h" -#include "mui.h" -#include "support.h" -#include "prefs.h" -#include "imspec.h" - -extern struct Library *MUIMasterBase; - -struct MUI_ConfigdataData -{ - Object *app; - CONST_STRPTR appbase; - struct ZunePrefsNew prefs; -}; - - -static CONST_STRPTR GetConfigString(Object *obj, ULONG id) -{ - return (CONST_STRPTR)DoMethod(obj, MUIM_Configdata_GetString, id); -} - -static ULONG GetConfigULong(Object *obj, ULONG id) -{ - return (ULONG)DoMethod(obj, MUIM_Configdata_GetULong, id); -} - - -/************************************************************************** - Default ImageSpec values -**************************************************************************/ - -struct spec_cfg { - ULONG muiv; - ULONG cfgid; - CONST_STRPTR defspec; -}; - -const static struct spec_cfg DefImspecValues[] = -{ - { MUII_WindowBack, MUICFG_Background_Window, "0:128" }, - { MUII_RequesterBack, MUICFG_Background_Requester, "0:137" }, - { MUII_ButtonBack, MUICFG_Background_Button, "0:128" }, - { MUII_ListBack, MUICFG_Background_List, "0:128" }, - { MUII_TextBack, MUICFG_Background_Text, "0:128" }, - { MUII_PropBack, MUICFG_Background_Prop, "0:128" }, - { MUII_PopupBack, MUICFG_Background_PopUp, "0:128" }, - { MUII_SelectedBack, MUICFG_Background_Selected, "0:131" }, - { MUII_ListCursor, MUICFG_Background_ListCursor, "0:131" }, - { MUII_ListSelect, MUICFG_Background_ListSelect, "0:135" }, - { MUII_ListSelCur, MUICFG_Background_ListSelCur, "0:138" }, - { MUII_ArrowUp, MUICFG_Image_ArrowUp, "1:0" }, - { MUII_ArrowDown, MUICFG_Image_ArrowDown, "1:1" }, - { MUII_ArrowLeft, MUICFG_Image_ArrowLeft, "1:2" }, - { MUII_ArrowRight, MUICFG_Image_ArrowRight, "1:3" }, - { MUII_CheckMark, MUICFG_Image_CheckMark, "1:4" }, - { MUII_RadioButton, MUICFG_Image_RadioButton, "1:5" }, - { MUII_Cycle, MUICFG_Image_Cycle, "1:6" }, - { MUII_PopUp, MUICFG_Image_PopUp, "1:7" }, - { MUII_PopFile, MUICFG_Image_PopFile, "1:8" }, - { MUII_PopDrawer, MUICFG_Image_PopDrawer, "1:9" }, - { MUII_PropKnob, MUICFG_Image_PropKnob, "0:129" }, - { MUII_Drawer, MUICFG_Image_Drawer, "1:10" }, - { MUII_HardDisk, MUICFG_Image_HardDisk, "1:11" }, - { MUII_Disk, MUICFG_Image_Disk, "1:12" }, - { MUII_Chip, MUICFG_Image_Chip, "1:13" }, - { MUII_Volume, MUICFG_Image_Volume, "1:14" }, - { MUII_RegisterBack, MUICFG_Background_Register, "0:128" }, - { MUII_Network, MUICFG_Image_Network, "1:15" }, - { MUII_Assign, MUICFG_Image_Assign, "1:16" }, - { MUII_TapePlay, MUICFG_Image_TapePlay, "1:17" }, - { MUII_TapePlayBack, MUICFG_Image_TapePlayBack, "1:18" }, - { MUII_TapePause, MUICFG_Image_TapePause, "1:19" }, - { MUII_TapeStop, MUICFG_Image_TapeStop, "1:20" }, - { MUII_TapeRecord, MUICFG_Image_TapeRecord, "1:21" }, - { MUII_GroupBack, MUICFG_Background_Framed, "0:128" }, - { MUII_SliderBack, MUICFG_Background_Slider, "0:128" }, - { MUII_SliderKnob, MUICFG_Background_SliderKnob, "0:128" }, - { MUII_TapeUp, MUICFG_Image_TapeUp, "1:22" }, - { MUII_TapeDown, MUICFG_Image_TapeDown, "1:23" }, - { MUII_PageBack, MUICFG_Background_Page, "0:128" }, - { MUII_ReadListBack, MUICFG_Background_ReadList, "0:128" }, - { 0, 0, NULL }, -}; - -/* called by Configdata_New */ -static void init_imspecs (Object *obj, struct MUI_ConfigdataData *data) -{ - int i; - - for (i = 0; DefImspecValues[i].defspec; i++) - { - CONST_STRPTR imspec; - const struct spec_cfg *img = DefImspecValues + i; - - imspec = GetConfigString(obj, img->cfgid); -/* D(bug("init_imspecs: %ld %lx %s ...\n", img->muiv, img->cfgid, imspec)); */ - data->prefs.imagespecs[img->muiv] = imspec; - if (!data->prefs.imagespecs[img->muiv]) - { -/* D(bug("*** init_imspecs: null imagespec %ld\n", img->muiv)); */ - } - } -} - -/************************************************************************** - Default FrameSpec values -**************************************************************************/ - -/* spec format : type, recessed, left, right, up, down spacing */ -const static struct spec_cfg DefFramespecValues[] = -{ - { MUIV_Frame_None, MUICFG_Invalid, "000000" }, /* invisible frame */ - { MUIV_Frame_Button, MUICFG_Frame_Button, "202211" }, /* text button */ - { MUIV_Frame_ImageButton, MUICFG_Frame_ImageButton, "202211" }, /* image button */ - { MUIV_Frame_Text, MUICFG_Frame_Text, "212211" }, /* textfield without input */ - { MUIV_Frame_String, MUICFG_Frame_String, "302211" }, /* string gadget */ - { MUIV_Frame_ReadList, MUICFG_Frame_ReadList, "212211" }, /* list without input */ - { MUIV_Frame_InputList, MUICFG_Frame_InputList, "202211" }, /* list with input */ - { MUIV_Frame_Prop, MUICFG_Frame_Prop, "202211" }, /* scrollbar container */ - { MUIV_Frame_Gauge, MUICFG_Frame_Gauge, "210000" }, /* gauge */ - { MUIV_Frame_Group, MUICFG_Frame_Group, "314444" }, /* normal group */ - { MUIV_Frame_PopUp, MUICFG_Frame_PopUp, "112211" }, /* cycle menu, popup window */ - { MUIV_Frame_Virtual, MUICFG_Frame_Virtual, "212211" }, /* virt group */ - { MUIV_Frame_Slider, MUICFG_Frame_Slider, "400000" }, /* slider container */ - { MUIV_Frame_Knob, MUICFG_Frame_Knob, "202211" }, /* slider knob */ - { MUIV_Frame_Drag, MUICFG_Frame_Drag, "300000" }, /* dnd frame */ - { -1, -1, NULL }, -}; - -/* called by Configdata_New */ -static void init_framespecs (Object *obj, struct MUI_ConfigdataData *data) -{ - int i; - - for (i = 0; DefFramespecValues[i].defspec; i++) - { - CONST_STRPTR framespec; - const struct spec_cfg *fcfg = DefFramespecValues + i; - - framespec = GetConfigString(obj, fcfg->cfgid); - zune_frame_spec_to_intern(framespec, - &data->prefs.frames[fcfg->muiv]); - } -} - -/************************************************************************** - Default ULONG values -**************************************************************************/ - -struct def_ulval { - ULONG id; - ULONG val; -}; - -const static struct def_ulval DefULValues[] = -{ - { MUICFG_Window_Spacing_Left, 4 }, - { MUICFG_Window_Spacing_Right, 4 }, - { MUICFG_Window_Spacing_Top, 3 }, - { MUICFG_Window_Buttons, 0 }, - { MUICFG_Window_Spacing_Bottom, 3 }, - { MUICFG_Window_Positions, WINDOW_POSITION_FORGET_ON_EXIT }, - { MUICFG_Window_Redraw, WINDOW_REDRAW_WITHOUT_CLEAR }, - { MUICFG_Window_Refresh, WINDOW_REFRESH_SIMPLE }, - { MUICFG_Radio_HSpacing, 4 }, - { MUICFG_Radio_VSpacing, 1 }, - { MUICFG_Group_HSpacing, 6 }, - { MUICFG_Group_VSpacing, 3 }, - { MUICFG_Cycle_MenuCtrl_Position, CYCLE_MENU_POSITION_BELOW }, - { MUICFG_Cycle_MenuCtrl_Level, 2 }, - { MUICFG_Cycle_MenuCtrl_Speed, 0 }, - { MUICFG_Cycle_Menu_Recessed, FALSE }, - { MUICFG_Listview_Font_Leading, 1 }, - { MUICFG_Listview_Smoothed, FALSE }, - { MUICFG_Listview_SmoothVal, 0 }, - { MUICFG_Listview_Refresh, LISTVIEW_REFRESH_MIXED }, - { MUICFG_Listview_Multi, LISTVIEW_MULTI_SHIFTED }, - { MUICFG_GroupTitle_Position, GROUP_TITLE_POSITION_CENTERED }, - { MUICFG_GroupTitle_Color, GROUP_TITLE_COLOR_HILITE }, - { MUICFG_Scrollbar_Type, SCROLLBAR_TYPE_STANDARD }, - { MUICFG_Scrollbar_Arrangement, SCROLLBAR_ARRANGEMENT_TOP }, - { MUICFG_Balance_Look, BALANCING_SHOW_FRAMES }, - { MUICFG_Dragndrop_Look, DND_LOOK_GHOSTED_ON_BOX }, - { MUICFG_Drag_Autostart, TRUE }, - { MUICFG_Drag_Autostart_Length, 3 }, - { MUICFG_Drag_LeftButton, TRUE }, - { MUICFG_Drag_MiddleButton, FALSE }, - { MUICFG_Register_TruncateTitles, FALSE }, - { MUICFG_Screen_Mode, 0 }, - { MUICFG_Screen_Mode_ID, -1 }, - { MUICFG_Screen_Width, 0 }, - { MUICFG_Screen_Height, 0 }, - { MUICFG_PublicScreen_PopToFront, TRUE }, - { MUICFG_Iconification_ShowIcon, TRUE }, - { MUICFG_Iconification_ShowMenu, FALSE }, - { MUICFG_Iconification_OnStartup, FALSE }, - { MUICFG_Interfaces_EnableARexx, TRUE }, - { MUICFG_BubbleHelp_FirstDelay, 30 }, - { MUICFG_BubbleHelp_NextDelay, 10 }, - { 0, 0 }, -}; - -/************************************************************************** - Default string values -**************************************************************************/ - -struct def_strval { - ULONG id; - CONST_STRPTR val; -}; - -/* NULL values not allowed */ -const static struct def_strval DefStrValues[] = -{ - { MUICFG_Font_Normal, "" }, - { MUICFG_Font_List, "" }, - { MUICFG_Font_Tiny, "" }, - { MUICFG_Font_Fixed, "" }, - { MUICFG_Font_Title, "" }, - { MUICFG_Font_Big, "" }, - { MUICFG_Font_Button, "" }, - { MUICFG_Font_Knob, "" }, - { MUICFG_String_Background, "2:m2" }, - { MUICFG_String_Text, "m5" }, - { MUICFG_String_ActiveBackground, "2:m1" }, - { MUICFG_String_ActiveText, "m5" }, - { MUICFG_String_Cursor, "m7" }, - { MUICFG_String_MarkedBackground, "m6" }, - { MUICFG_String_MarkedText, "m0" }, - { MUICFG_ActiveObject_Color, "m0" }, - { MUICFG_Keyboard_Press, "-upstroke return" }, - { MUICFG_Keyboard_Toggle, "-repeat space" }, - { MUICFG_Keyboard_Up, "-repeat up" }, - { MUICFG_Keyboard_Down, "-repeat down" }, - { MUICFG_Keyboard_PageUp, "-repeat shift up" }, - { MUICFG_Keyboard_PageDown, "-repeat shift down" }, - { MUICFG_Keyboard_Top, "control up" }, - { MUICFG_Keyboard_Bottom, "control down" }, - { MUICFG_Keyboard_Left, "-repeat left" }, - { MUICFG_Keyboard_Right, "-repeat right" }, - { MUICFG_Keyboard_WordLeft, "-repeat control left" }, - { MUICFG_Keyboard_WordRight, "-repeat control right" }, - { MUICFG_Keyboard_LineStart, "shift left" }, - { MUICFG_Keyboard_LineEnd, "shift right" }, - { MUICFG_Keyboard_NextGadget, "-repeat tab" }, - { MUICFG_Keyboard_PrevGadget, "-repeat shift tab" }, - { MUICFG_Keyboard_GadgetOff, "control tab" }, - { MUICFG_Keyboard_CloseWindow, "esc" }, - { MUICFG_Keyboard_NextWindow, "-repeat alt tab" }, - { MUICFG_Keyboard_PrevWindow, "-repeat alt shift tab" }, - { MUICFG_Keyboard_Help, "help" }, - { MUICFG_Keyboard_Popup, "control p" }, - { MUICFG_Drag_LMBModifier, "control" }, - { MUICFG_Drag_MMBModifier, "" }, - { MUICFG_PublicScreen, "" }, - { MUICFG_Iconification_Hotkey, "" }, - { 0, 0 }, -}; - - -/************************************************************************** - OM_NEW - Load global (and maybe application-specific) prefs files into the dataspace, - then fill the prefs struct with dataspace or default values -**************************************************************************/ -IPTR Configdata__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct MUI_ConfigdataData *data; - struct TagItem *tags; - struct TagItem *tag; - //APTR cdata; - int i,res = 0; - - obj = (Object *)DoSuperMethodA(cl, obj, (Msg)msg); - if (!obj) return (IPTR)NULL; - -/* D(bug("Configdata_New(%p)\n", obj)); */ - - data = INST_DATA(cl, obj); - - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) - { - switch (tag->ti_Tag) - { - case MUIA_Configdata_Application: - data->app = (Object *)tag->ti_Data; - break; - case MUIA_Configdata_ApplicationBase: - data->appbase = (CONST_STRPTR)tag->ti_Data; - break; - } - } - - if (data->app && !data->appbase) - { - get(data->app, MUIA_Application_Base, &data->appbase); - } - - if (data->appbase) - { - char filename[255]; - snprintf(filename, 255, "ENV:zune/%s.prefs", data->appbase); - res = DoMethod(obj, MUIM_Configdata_Load, (IPTR)filename); - if (!res) - { - snprintf(filename, 255, "ENVARC:zune/%s.prefs", data->appbase); - res=DoMethod(obj, MUIM_Configdata_Load, (IPTR)filename); - } - } - if (!res) //load only global prefs if no local app pref is found - { - if (!DoMethod(obj, MUIM_Configdata_Load, (IPTR)"ENV:zune/global.prefs")) - { - DoMethod(obj, MUIM_Configdata_Load, (IPTR)"ENVARC:zune/global.prefs"); - } - } - /*---------- fonts stuff ----------*/ - - data->prefs.fonts[-MUIV_Font_Normal] = GetConfigString(obj, MUICFG_Font_Normal); - data->prefs.fonts[-MUIV_Font_List] = GetConfigString(obj, MUICFG_Font_List); - data->prefs.fonts[-MUIV_Font_Tiny] = GetConfigString(obj, MUICFG_Font_Tiny); - data->prefs.fonts[-MUIV_Font_Fixed] = GetConfigString(obj, MUICFG_Font_Fixed); - data->prefs.fonts[-MUIV_Font_Title] = GetConfigString(obj, MUICFG_Font_Title); - data->prefs.fonts[-MUIV_Font_Big] = GetConfigString(obj, MUICFG_Font_Big); - data->prefs.fonts[-MUIV_Font_Button] = GetConfigString(obj, MUICFG_Font_Button); - data->prefs.fonts[-MUIV_Font_Knob] = GetConfigString(obj, MUICFG_Font_Knob); - - /*---------- images stuff ----------*/ - - init_imspecs(obj, data); - - /*---------- frame stuff ----------*/ - - init_framespecs(obj, data); - - /*---------- system stuff ----------*/ - - data->prefs.publicscreen_name = GetConfigString(obj, MUICFG_PublicScreen); - data->prefs.publicscreen_pop_to_front = GetConfigULong(obj, MUICFG_PublicScreen_PopToFront); - data->prefs.iconification_hotkey = GetConfigString(obj, MUICFG_Iconification_Hotkey); - data->prefs.iconification_show_icon = GetConfigULong(obj, MUICFG_Iconification_ShowIcon); - data->prefs.iconification_show_menu = GetConfigULong(obj, MUICFG_Iconification_ShowMenu); - data->prefs.iconification_on_startup = GetConfigULong(obj, MUICFG_Iconification_OnStartup); - data->prefs.interfaces_enable_arexx = GetConfigULong(obj, MUICFG_Interfaces_EnableARexx); - data->prefs.bubblehelp_first_delay = GetConfigULong(obj, MUICFG_BubbleHelp_FirstDelay); - data->prefs.bubblehelp_next_delay = GetConfigULong(obj, MUICFG_BubbleHelp_NextDelay); - - /*---------- window stuff ----------*/ - - data->prefs.window_inner_left = GetConfigULong(obj, MUICFG_Window_Spacing_Left); - data->prefs.window_inner_right = GetConfigULong(obj, MUICFG_Window_Spacing_Right); - data->prefs.window_inner_top = GetConfigULong(obj, MUICFG_Window_Spacing_Top); - data->prefs.window_inner_bottom = GetConfigULong(obj, MUICFG_Window_Spacing_Bottom); - data->prefs.window_position = GetConfigULong(obj, MUICFG_Window_Positions); - data->prefs.window_redraw = GetConfigULong(obj, MUICFG_Window_Redraw); - data->prefs.window_refresh = GetConfigULong(obj, MUICFG_Window_Refresh); - data->prefs.screenmode = GetConfigULong(obj, MUICFG_Screen_Mode); - data->prefs.screenmodeid = GetConfigULong(obj, MUICFG_Screen_Mode_ID); - data->prefs.screen_width = GetConfigULong(obj, MUICFG_Screen_Width); - data->prefs.screen_height = GetConfigULong(obj, MUICFG_Screen_Height); - data->prefs.window_buttons = GetConfigULong(obj, MUICFG_Window_Buttons); - - /*---------- group stuff ----------*/ - - data->prefs.group_title_position = GetConfigULong(obj, MUICFG_GroupTitle_Position); - data->prefs.group_title_color = GetConfigULong(obj, MUICFG_GroupTitle_Color); - data->prefs.group_hspacing = GetConfigULong(obj, MUICFG_Group_HSpacing); - data->prefs.group_vspacing = GetConfigULong(obj, MUICFG_Group_VSpacing); - - /*---------- registers ----------*/ - - data->prefs.register_look = REGISTER_LOOK_TRADITIONAL; - data->prefs.register_truncate_titles = GetConfigULong(obj, MUICFG_Register_TruncateTitles); - - /*---------- Buttons ----------*/ - - data->prefs.radiobutton_hspacing = GetConfigULong(obj, MUICFG_Radio_HSpacing); - data->prefs.radiobutton_vspacing = GetConfigULong(obj, MUICFG_Radio_VSpacing); - - /*---------- Cycles ----------*/ - - data->prefs.cycle_menu_position = GetConfigULong(obj, MUICFG_Cycle_MenuCtrl_Position); - data->prefs.cycle_menu_min_entries = GetConfigULong(obj, MUICFG_Cycle_MenuCtrl_Level); - data->prefs.cycle_menu_speed = GetConfigULong(obj, MUICFG_Cycle_MenuCtrl_Speed); - data->prefs.cycle_menu_recessed_entries = GetConfigULong(obj, MUICFG_Cycle_Menu_Recessed); - - /*---------- Sliders ----------*/ - /* all taken care of in frames and images */ - - /*---------- Scrollbars ----------*/ - - data->prefs.scrollbar_type = GetConfigULong(obj, MUICFG_Scrollbar_Type); - data->prefs.scrollbar_arrangement = GetConfigULong(obj, MUICFG_Scrollbar_Arrangement); - - /*---------- Lists ----------*/ - - data->prefs.list_linespacing = GetConfigULong(obj, MUICFG_Listview_Font_Leading); - data->prefs.list_smoothed = GetConfigULong(obj, MUICFG_Listview_Smoothed); - data->prefs.list_smoothval = GetConfigULong(obj, MUICFG_Listview_SmoothVal); - data->prefs.list_multi = GetConfigULong(obj, MUICFG_Listview_Multi); - data->prefs.list_refresh = GetConfigULong(obj, MUICFG_Listview_Refresh); - - /*---------- Strings ----------*/ - data->prefs.string_bg_inactive = GetConfigString(obj, MUICFG_String_Background); - data->prefs.string_text_inactive = GetConfigString(obj, MUICFG_String_Text); - data->prefs.string_bg_active = GetConfigString(obj, MUICFG_String_ActiveBackground); - data->prefs.string_text_active = GetConfigString(obj, MUICFG_String_ActiveText); - data->prefs.string_cursor = GetConfigString(obj, MUICFG_String_Cursor); - data->prefs.string_bg_marked = GetConfigString(obj, MUICFG_String_MarkedBackground); - data->prefs.string_text_marked = GetConfigString(obj, MUICFG_String_MarkedText); - - /*---------- Navigation ----------*/ - - data->prefs.drag_left_button = GetConfigULong(obj, MUICFG_Drag_LeftButton); - data->prefs.drag_left_modifier.readable_hotkey = GetConfigString(obj, MUICFG_Drag_LMBModifier); - data->prefs.drag_middle_button = GetConfigULong(obj, MUICFG_Drag_MiddleButton); - data->prefs.drag_middle_modifier.readable_hotkey = GetConfigString(obj, MUICFG_Drag_MMBModifier); - data->prefs.drag_autostart = GetConfigULong(obj, MUICFG_Drag_Autostart); - data->prefs.drag_autostart_length = GetConfigULong(obj, MUICFG_Drag_Autostart_Length); - data->prefs.drag_look = GetConfigULong(obj, MUICFG_Dragndrop_Look); - data->prefs.balancing_look = GetConfigULong(obj, MUICFG_Balance_Look); - - if (data->prefs.drag_left_modifier.readable_hotkey != NULL) - data->prefs.drag_left_modifier.ix_well = - !ParseIX(data->prefs.drag_left_modifier.readable_hotkey, - &data->prefs.drag_left_modifier.ix); - else - data->prefs.drag_left_modifier.ix_well = 0; - - if (data->prefs.drag_middle_modifier.readable_hotkey != NULL) - data->prefs.drag_middle_modifier.ix_well = - !ParseIX(data->prefs.drag_middle_modifier.readable_hotkey, - &data->prefs.drag_middle_modifier.ix); - else - data->prefs.drag_middle_modifier.ix_well = 0; - - data->prefs.active_object_color = GetConfigString(obj, MUICFG_ActiveObject_Color); - /*---------- mui keys ----------*/ - - data->prefs.muikeys[MUIKEY_PRESS].readable_hotkey = GetConfigString(obj, MUICFG_Keyboard_Press); - data->prefs.muikeys[MUIKEY_TOGGLE].readable_hotkey = GetConfigString(obj, MUICFG_Keyboard_Toggle); - data->prefs.muikeys[MUIKEY_UP].readable_hotkey = GetConfigString(obj, MUICFG_Keyboard_Up); - data->prefs.muikeys[MUIKEY_DOWN].readable_hotkey = GetConfigString(obj, MUICFG_Keyboard_Down); - data->prefs.muikeys[MUIKEY_PAGEUP].readable_hotkey = GetConfigString(obj, MUICFG_Keyboard_PageUp); - data->prefs.muikeys[MUIKEY_PAGEDOWN].readable_hotkey = GetConfigString(obj, MUICFG_Keyboard_PageDown); - data->prefs.muikeys[MUIKEY_TOP].readable_hotkey = GetConfigString(obj, MUICFG_Keyboard_Top); - data->prefs.muikeys[MUIKEY_BOTTOM].readable_hotkey = GetConfigString(obj, MUICFG_Keyboard_Bottom); - data->prefs.muikeys[MUIKEY_LEFT].readable_hotkey = GetConfigString(obj, MUICFG_Keyboard_Left); - data->prefs.muikeys[MUIKEY_RIGHT].readable_hotkey = GetConfigString(obj, MUICFG_Keyboard_Right); - data->prefs.muikeys[MUIKEY_WORDLEFT].readable_hotkey = GetConfigString(obj, MUICFG_Keyboard_WordLeft); - data->prefs.muikeys[MUIKEY_WORDRIGHT].readable_hotkey = GetConfigString(obj, MUICFG_Keyboard_WordRight); - data->prefs.muikeys[MUIKEY_LINESTART].readable_hotkey = GetConfigString(obj, MUICFG_Keyboard_LineStart); - data->prefs.muikeys[MUIKEY_LINEEND].readable_hotkey = GetConfigString(obj, MUICFG_Keyboard_LineEnd); - data->prefs.muikeys[MUIKEY_GADGET_NEXT].readable_hotkey = GetConfigString(obj, MUICFG_Keyboard_NextGadget); - data->prefs.muikeys[MUIKEY_GADGET_PREV].readable_hotkey = GetConfigString(obj, MUICFG_Keyboard_PrevGadget); - data->prefs.muikeys[MUIKEY_GADGET_OFF].readable_hotkey = GetConfigString(obj, MUICFG_Keyboard_GadgetOff); - data->prefs.muikeys[MUIKEY_WINDOW_CLOSE].readable_hotkey = GetConfigString(obj, MUICFG_Keyboard_CloseWindow); - data->prefs.muikeys[MUIKEY_WINDOW_NEXT].readable_hotkey = GetConfigString(obj, MUICFG_Keyboard_NextWindow); - data->prefs.muikeys[MUIKEY_WINDOW_PREV].readable_hotkey = GetConfigString(obj, MUICFG_Keyboard_PrevWindow); - data->prefs.muikeys[MUIKEY_HELP].readable_hotkey = GetConfigString(obj, MUICFG_Keyboard_Help); - data->prefs.muikeys[MUIKEY_POPUP].readable_hotkey = GetConfigString(obj, MUICFG_Keyboard_Popup); - - for (i = 0; i < MUIKEY_COUNT; i++) - { - if (data->prefs.muikeys[i].readable_hotkey) - data->prefs.muikeys[i].ix_well = !ParseIX(data->prefs.muikeys[i].readable_hotkey, &data->prefs.muikeys[i].ix); - else data->prefs.muikeys[i].ix_well = 0; - } - - /*---------- CustomFrames ----------*/ - data->prefs.customframe_config_1 = GetConfigString(obj, MUICFG_CustomFrame_1); - data->prefs.customframe_config_2 = GetConfigString(obj, MUICFG_CustomFrame_2); - data->prefs.customframe_config_3 = GetConfigString(obj, MUICFG_CustomFrame_3); - data->prefs.customframe_config_4 = GetConfigString(obj, MUICFG_CustomFrame_4); - data->prefs.customframe_config_5 = GetConfigString(obj, MUICFG_CustomFrame_5); - data->prefs.customframe_config_6 = GetConfigString(obj, MUICFG_CustomFrame_6); - data->prefs.customframe_config_7 = GetConfigString(obj, MUICFG_CustomFrame_7); - data->prefs.customframe_config_8 = GetConfigString(obj, MUICFG_CustomFrame_8); - data->prefs.customframe_config_9 = GetConfigString(obj, MUICFG_CustomFrame_9); - data->prefs.customframe_config_10 = GetConfigString(obj, MUICFG_CustomFrame_10); - data->prefs.customframe_config_11 = GetConfigString(obj, MUICFG_CustomFrame_11); - data->prefs.customframe_config_12 = GetConfigString(obj, MUICFG_CustomFrame_12); - data->prefs.customframe_config_13 = GetConfigString(obj, MUICFG_CustomFrame_13); - data->prefs.customframe_config_14 = GetConfigString(obj, MUICFG_CustomFrame_14); - data->prefs.customframe_config_15 = GetConfigString(obj, MUICFG_CustomFrame_15); - data->prefs.customframe_config_16 = GetConfigString(obj, MUICFG_CustomFrame_16); - - /*---------- Special ----------*/ - /* all taken care of in frames and images */ - - return (IPTR)obj; -} - -/************************************************************************** - OM_DISPOSE -**************************************************************************/ -IPTR Configdata__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) -{ -/* struct MUI_ConfigdataData *data = INST_DATA(cl, obj); */ -/* int i; */ - - return DoSuperMethodA(cl,obj,msg); -} - -/************************************************************************** - OM_GET -**************************************************************************/ -IPTR Configdata__OM_GET(struct IClass *cl, Object * obj, struct opGet *msg) -{ - struct MUI_ConfigdataData *data = INST_DATA(cl, obj); - IPTR *store = msg->opg_Storage; - ULONG tag = msg->opg_AttrID; - - switch (tag) - { - case MUIA_Configdata_ZunePrefs: - *store = (IPTR)&data->prefs; - DoMethod(obj, MUIM_Configdata_GetWindowPos,0); - return 1; - } - - return DoSuperMethodA(cl, obj, (Msg)msg); -} - -#ifndef AROS_BIG_ENDIAN -#define AROS_BIG_ENDIAN 0 -#endif - -static LONG windowpos_endian(IPTR data, BOOL isNative) -{ - LONG size, items; - WORD cnt, i, j; - void *p = (void*)data; - - if (AROS_BIG_ENDIAN) { - size = *(LONG *)p; - } else { - if (isNative) { - size = *(LONG *)p; - } else { - size = AROS_BE2LONG(*((LONG*)p)); - } - *((LONG*)p) = AROS_SWAP_BYTES_LONG(*((LONG*)p)); - } - - cnt = sizeof(LONG); - items = (size - sizeof(LONG)) / sizeof(struct windowpos); - D(bug("size=%d items=%d\n", size, items)); - if (size > 100 || items > 100) { - bug("%s crashed...\n", FindTask(NULL)->tc_Node.ln_Name); - {volatile int dead = 1; while (dead); } - } - - for (i = 0; i < items; i++) { - if (AROS_BIG_ENDIAN) { - D(bug("ID=%08x\n", *((LONG*)(p + cnt)))); - } else { - if (isNative) D(bug("ID=%08x\n", *((LONG*)(p + cnt)))); - *((LONG*)(p + cnt)) = AROS_SWAP_BYTES_LONG(*((LONG*)(p + cnt))); - if (!isNative) D(bug("ID=%08x\n", *((LONG*)(p + cnt)))); - } - cnt += sizeof(LONG); - for (j = 0; j < 8; j++) { - if (AROS_BIG_ENDIAN) { - D(bug("V%d: %d\n", j, *((WORD*)(p + cnt)))); - } else { - if (isNative) D(bug("V%d: %d\n", j, *((WORD*)(p + cnt)))); - *((WORD*)(p + cnt)) = AROS_SWAP_BYTES_LONG(*((WORD*)(p + cnt))); - if (!isNative) D(bug("V%d: %d\n", j, *((WORD*)(p + cnt)))); - } - cnt += sizeof(WORD); - } - } - D(bug("size=%d\n", cnt)); - return cnt; -} - -static IPTR Configdata_GetWindowPos(struct IClass *cl, Object * obj, - struct MUIP_Configdata_GetString *msg) -{ - struct MUI_ConfigdataData *data; - IPTR s; - data = INST_DATA(cl, obj); - //kprintf ("getwindowpos\n"); - s = (IPTR)DoMethod(obj, MUIM_Dataspace_Find,MUICFG_WindowPos); - if (s && data->app) { - windowpos_endian(s, FALSE); - set(data->app,MUIA_Application_CopyWinPosToApp,s); - windowpos_endian(s, TRUE); - } - return s; -} - -static IPTR Configdata_SetWindowPos(struct IClass *cl, Object * obj, - struct MUIP_Configdata_GetString *msg) -{ - struct MUI_ConfigdataData *data; - //kprintf ("setwindowpos\n"); - data = INST_DATA(cl, obj); - IPTR addr = 0; - LONG size = 0; - - if (data->app) - { - get(data->app,MUIA_Application_GetWinPosAddr, &addr); - get(data->app,MUIA_Application_GetWinPosSize, &size); - /* We can ignore size-variable because - * MUIA_Application_GetWinPosSize updates *((LONG*)addr) */ - size = windowpos_endian(addr, TRUE); - DoMethod(obj, MUIM_Dataspace_Add,addr,size,MUICFG_WindowPos); - windowpos_endian(addr, FALSE); - } - return 0; -} - - - -/************************************************************************** - MUIM_Configdata_GetString - Check if string is found in dataspace, then if not found, search each - builtin array -**************************************************************************/ -IPTR Configdata__MUIM_GetString(struct IClass *cl, Object * obj, - struct MUIP_Configdata_GetString *msg) -{ - CONST_STRPTR s; - - s = (CONST_STRPTR)DoMethod(obj, MUIM_Dataspace_Find, msg->id); - if (!s) - { - int i; - - for (i = 0; DefStrValues[i].id; i++) - { - if (DefStrValues[i].id == msg->id) - return (IPTR)DefStrValues[i].val; - } - for (i = 0; DefImspecValues[i].defspec; i++) - { - if (DefImspecValues[i].cfgid == msg->id) - return (IPTR)DefImspecValues[i].defspec; - } - for (i = 0; DefFramespecValues[i].defspec; i++) - { - if (DefFramespecValues[i].cfgid == msg->id) - return (IPTR)DefFramespecValues[i].defspec; - } - return (IPTR)0; - } - else - { - return (IPTR)s; - } -} - -/************************************************************************** - MUIM_Configdata_SetImspec - search in builtin array first, to not not have in dataspace the default - value (would be redundant) -**************************************************************************/ -IPTR Configdata__MUIM_SetImspec(struct IClass *cl, Object * obj, - struct MUIP_Configdata_SetImspec *msg) -{ - int i; - - if (!msg->imspec || !*msg->imspec || *msg->imspec == '6') - { -/* D(bug("Configdata_SetImspec(%p) : id %08lx, val invalid\n", */ -/* obj, msg->id)); */ - return 0; - } - - for (i = 0; DefImspecValues[i].defspec; i++) - { - if (DefImspecValues[i].cfgid == msg->id) - if (!strcmp(DefImspecValues[i].defspec, msg->imspec)) - { -/* D(bug("Configdata_SetImspec(%p) : set to def, id %08lx, val %s\n", */ -/* obj, msg->id, msg->imspec)); */ - DoMethod(obj, MUIM_Dataspace_Remove, msg->id); - return 0; - } - } - - for (i = 0; DefStrValues[i].id; i++) - { - if (DefStrValues[i].id == msg->id) - if (!strcmp(DefStrValues[i].val, msg->imspec)) - { - DoMethod(obj, MUIM_Dataspace_Remove, msg->id); - return 0; - } - } - - DoMethod(obj, MUIM_Dataspace_Add, (IPTR)msg->imspec, strlen(msg->imspec) + 1, msg->id); - return 0; -} - -/************************************************************************** - MUIM_Configdata_SetFramespec -**************************************************************************/ -IPTR Configdata__MUIM_SetFramespec(struct IClass *cl, Object * obj, - struct MUIP_Configdata_SetFramespec *msg) -{ - int i; - - if (!msg->framespec || !*msg->framespec) - { -/* D(bug("Configdata_SetFramespec(%p) : id %08lx, val invalid\n", */ -/* obj, msg->id)); */ - return 0; - } - - for (i = 0; DefFramespecValues[i].defspec; i++) - { - if (DefFramespecValues[i].cfgid == msg->id) - if (!strcmp(DefFramespecValues[i].defspec, msg->framespec)) - { -/* D(bug("Configdata_SetFramespec(%p) : set to def, id %08lx, val %s\n", */ -/* obj, msg->id, msg->framespec)); */ - DoMethod(obj, MUIM_Dataspace_Remove, msg->id); - return 0; - } - } - - DoMethod(obj, MUIM_Dataspace_Add, (IPTR)msg->framespec, - strlen(msg->framespec) + 1, msg->id); - return 0; -} - -/************************************************************************** - MUIM_Configdata_SetPenspec -**************************************************************************/ -IPTR Configdata__MUIM_SetPenspec(struct IClass *cl, Object * obj, - struct MUIP_Configdata_SetPenspec *msg) -{ - int i; - - if (!msg->penspec || !*msg->penspec) - return 0; - - for (i = 0; DefStrValues[i].id; i++) - { - if (DefStrValues[i].id == msg->id) - if (!strcmp(DefStrValues[i].val, msg->penspec)) - { - DoMethod(obj, MUIM_Dataspace_Remove, msg->id); - return 0; - } - } - - DoMethod(obj, MUIM_Dataspace_Add, (IPTR)msg->penspec, - strlen(msg->penspec) + 1, msg->id); - return 0; -} - -/************************************************************************** - MUIM_Configdata_SetFont -**************************************************************************/ -IPTR Configdata__MUIM_SetFont(struct IClass *cl, Object * obj, - struct MUIP_Configdata_SetFont *msg) -{ - if (!msg->font || !*msg->font) - { -/* D(bug("Configdata_SetFont(%p) : id %08lx, val invalid\n", */ -/* obj, msg->id)); */ - DoMethod(obj, MUIM_Dataspace_Remove, msg->id); - return 0; - } - - DoMethod(obj, MUIM_Dataspace_Add, (IPTR)msg->font, strlen(msg->font) + 1, msg->id); - return 0; -} - -/************************************************************************** - MUIM_Configdata_SetString -**************************************************************************/ -IPTR Configdata__MUIM_SetString(struct IClass *cl, Object * obj, - struct MUIP_Configdata_SetString *msg) -{ - int i; - - for (i = 0; DefStrValues[i].id; i++) - { - if (DefStrValues[i].id == msg->id) - if (!strcmp(DefStrValues[i].val, msg->string)) - { - DoMethod(obj, MUIM_Dataspace_Remove, msg->id); - return 0; - } - } - - DoMethod(obj, MUIM_Dataspace_Add, (IPTR)msg->string, strlen(msg->string) + 1, msg->id); - return 0; -} - -/************************************************************************** - MUIM_Configdata_GetULong -**************************************************************************/ -IPTR Configdata__MUIM_GetULong(struct IClass *cl, Object * obj, - struct MUIP_Configdata_GetULong *msg) -{ - ULONG *vp; - - vp = (ULONG *)DoMethod(obj, MUIM_Dataspace_Find, msg->id); - if (!vp) - { - int i; - - for (i = 0; DefULValues[i].id != 0; i++) - { - if (DefULValues[i].id == msg->id) - return DefULValues[i].val; - } - return 0; - } - else - { - return AROS_BE2LONG(*vp); - } -} - -/************************************************************************** - MUIM_Configdata_SetULong -**************************************************************************/ -IPTR Configdata__MUIM_SetULong(struct IClass *cl, Object * obj, - struct MUIP_Configdata_SetULong *msg) -{ - ULONG v = msg->val; - ULONG *vp = &v; - int i; - - for (i = 0; DefULValues[i].id != 0; i++) - { - if (DefULValues[i].id == msg->id) - if (DefULValues[i].val == v) - { -/* D(bug("Configdata_SetULong(%p) : set to def, id %08lx, val %ld\n", */ -/* obj, msg->id, v)); */ - DoMethod(obj, MUIM_Dataspace_Remove, msg->id); - return 0; - } - } - - v = AROS_LONG2BE(v); -/* D(bug("Configdata_SetULong(%p): adding %08lx to %08lx chunk\n", obj, v, msg->id)); */ - DoMethod(obj, MUIM_Dataspace_Add, (IPTR)vp, 4, msg->id); - return 0; -} - - -/************************************************************************** - SavePrefsHeader: Write a PRHD chunk -**************************************************************************/ -static int SavePrefsHeader(struct IFFHandle *iff) -{ - if (!PushChunk( iff, 0, MAKE_ID('P','R','H','D'), IFFSIZE_UNKNOWN)) - { - struct PrefHeader ph; - ph.ph_Version = 0; - ph.ph_Type = 0; - ph.ph_Flags = 0; - - if (WriteChunkBytes(iff, &ph, sizeof(struct PrefHeader))) - if (!PopChunk(iff)) return 1; - PopChunk(iff); - } - return 0; -} - -/************************************************************************** - MUIM_Configdata_Save -**************************************************************************/ -IPTR Configdata__MUIM_Save(struct IClass *cl, Object * obj, - struct MUIP_Configdata_Save *msg) -{ - struct IFFHandle *iff; - if ((iff = AllocIFF())) - { - if (!(iff->iff_Stream = (IPTR)Open(msg->filename,MODE_NEWFILE))) - { - /* Try to Create the directory where the file is located */ - char *path = StrDup(msg->filename); - if (path) - { - char *path_end = PathPart(path); - if (path_end != path) - { - BPTR lock; - *path_end = 0; - if ((lock = CreateDir(path))) - { - UnLock(lock); - iff->iff_Stream = (IPTR)Open(msg->filename,MODE_NEWFILE); - } - } - FreeVec(path); - } - } - - if (iff->iff_Stream) - { - InitIFFasDOS(iff); - - if (!OpenIFF(iff, IFFF_WRITE)) - { - if (!PushChunk(iff, MAKE_ID('P','R','E','F'), ID_FORM, IFFSIZE_UNKNOWN)) - { - Configdata_SetWindowPos(cl, obj, (APTR)msg); - if (SavePrefsHeader(iff)) - { - DoMethod(obj,MUIM_Dataspace_WriteIFF, (IPTR)iff, 0, MAKE_ID('M','U','I','C')); - } - PopChunk(iff); - } - - CloseIFF(iff); - } - Close((BPTR)iff->iff_Stream); - } - FreeIFF(iff); - } - return 0; -} - - -/************************************************************************** - MUIM_Configdata_Load - Get the content of the file into the object. -**************************************************************************/ -IPTR Configdata__MUIM_Load(struct IClass *cl, Object * obj, - struct MUIP_Configdata_Load *msg) -{ - struct IFFHandle *iff; - IPTR res = TRUE; - - if ((iff = AllocIFF())) - { - D(bug("loading prefs from %s\n", msg->filename)); - if ((iff->iff_Stream = (IPTR)Open(msg->filename,MODE_OLDFILE))) - { - InitIFFasDOS(iff); - - if (!OpenIFF(iff, IFFF_READ)) - { - StopChunk( iff, MAKE_ID('P','R','E','F'), MAKE_ID('M','U','I','C')); - - while (!ParseIFF(iff, IFFPARSE_SCAN)) - { - struct ContextNode *cn; - if (!(cn = CurrentChunk(iff))) continue; - if (cn->cn_ID == MAKE_ID('M','U','I','C')) - DoMethod(obj, MUIM_Dataspace_ReadIFF, (IPTR)iff); - } - - CloseIFF(iff); - } - else - { - res = FALSE; - } - Close((BPTR)iff->iff_Stream); - } - else - { - res = FALSE; - } - FreeIFF(iff); - } - else - { - res = FALSE; - } - return res; -} - - -/* - * The class dispatcher - */ -BOOPSI_DISPATCHER(IPTR, Configdata_Dispatcher, cl, obj, msg) -{ - switch (msg->MethodID) - { - case OM_NEW: return Configdata__OM_NEW(cl, obj, (struct opSet *)msg); - case OM_DISPOSE: return Configdata__OM_DISPOSE(cl, obj, (APTR)msg); - case OM_GET: return Configdata__OM_GET(cl, obj, (APTR)msg); - case MUIM_Configdata_GetString: return Configdata__MUIM_GetString(cl, obj, (APTR)msg); - case MUIM_Configdata_GetULong: return Configdata__MUIM_GetULong(cl, obj, (APTR)msg); - case MUIM_Configdata_SetULong: return Configdata__MUIM_SetULong(cl, obj, (APTR)msg); - case MUIM_Configdata_SetImspec: return Configdata__MUIM_SetImspec(cl, obj, (APTR)msg); - case MUIM_Configdata_SetFramespec: return Configdata__MUIM_SetFramespec(cl, obj, (APTR)msg); - case MUIM_Configdata_SetPenspec: return Configdata__MUIM_SetPenspec(cl, obj, (APTR)msg); - case MUIM_Configdata_SetFont: return Configdata__MUIM_SetFont(cl, obj, (APTR)msg); - case MUIM_Configdata_SetString: return Configdata__MUIM_SetString(cl, obj, (APTR)msg); - case MUIM_Configdata_Save: return Configdata__MUIM_Save(cl, obj, (APTR)msg); - case MUIM_Configdata_Load: return Configdata__MUIM_Load(cl, obj, (APTR)msg); - case MUIM_Configdata_SetWindowPos: return Configdata_SetWindowPos(cl, obj, (APTR)msg); - case MUIM_Configdata_GetWindowPos: return Configdata_GetWindowPos(cl, obj, (APTR)msg); - - } - - return DoSuperMethodA(cl, obj, msg); -} -BOOPSI_DISPATCHER_END - -/* - * Class descriptor. - */ -const struct __MUIBuiltinClass _MUI_Configdata_desc = { - MUIC_Configdata, /* Class name */ - MUIC_Dataspace, /* super class name */ - sizeof(struct MUI_ConfigdataData), /* size of class own datas */ - (void*)Configdata_Dispatcher /* class dispatcher */ -}; +/* + Copyright 2002, The AROS Development Team. + All rights reserved. + + $Id$ +*/ +#include <stdlib.h> +#include <string.h> +#include <stdio.h> + +#include <exec/types.h> +#include <prefs/prefhdr.h> +#include <clib/alib_protos.h> +#include <proto/exec.h> +#include <proto/intuition.h> +#include <proto/utility.h> +#include <proto/iffparse.h> +#include <proto/dos.h> +#include <proto/commodities.h> +#include <proto/muimaster.h> + +/* #define MYDEBUG 1 */ +#include "debug.h" + +#include "muimaster_intern.h" +#include "mui.h" +#include "support.h" +#include "prefs.h" +#include "imspec.h" + +extern struct Library *MUIMasterBase; + +struct MUI_ConfigdataData +{ + Object *app; + CONST_STRPTR appbase; + struct ZunePrefsNew prefs; +}; + + +static CONST_STRPTR GetConfigString(Object *obj, ULONG id) +{ + return (CONST_STRPTR) DoMethod(obj, MUIM_Configdata_GetString, id); +} + +static ULONG GetConfigULong(Object *obj, ULONG id) +{ + return (ULONG) DoMethod(obj, MUIM_Configdata_GetULong, id); +} + + +/************************************************************************** + Default ImageSpec values +**************************************************************************/ + +struct spec_cfg +{ + ULONG muiv; + ULONG cfgid; + CONST_STRPTR defspec; +}; + +const static struct spec_cfg DefImspecValues[] = +{ + { MUII_WindowBack, MUICFG_Background_Window, "0:128" }, + { MUII_RequesterBack, MUICFG_Background_Requester, "0:137" }, + { MUII_ButtonBack, MUICFG_Background_Button, "0:128" }, + { MUII_ListBack, MUICFG_Background_List, "0:128" }, + { MUII_TextBack, MUICFG_Background_Text, "0:128" }, + { MUII_PropBack, MUICFG_Background_Prop, "0:128" }, + { MUII_PopupBack, MUICFG_Background_PopUp, "0:128" }, + { MUII_SelectedBack, MUICFG_Background_Selected, "0:131" }, + { MUII_ListCursor, MUICFG_Background_ListCursor, "0:131" }, + { MUII_ListSelect, MUICFG_Background_ListSelect, "0:135" }, + { MUII_ListSelCur, MUICFG_Background_ListSelCur, "0:138" }, + { MUII_ArrowUp, MUICFG_Image_ArrowUp, "1:0" }, + { MUII_ArrowDown, MUICFG_Image_ArrowDown, "1:1" }, + { MUII_ArrowLeft, MUICFG_Image_ArrowLeft, "1:2" }, + { MUII_ArrowRight, MUICFG_Image_ArrowRight, "1:3" }, + { MUII_CheckMark, MUICFG_Image_CheckMark, "1:4" }, + { MUII_RadioButton, MUICFG_Image_RadioButton, "1:5" }, + { MUII_Cycle, MUICFG_Image_Cycle, "1:6" }, + { MUII_PopUp, MUICFG_Image_PopUp, "1:7" }, + { MUII_PopFile, MUICFG_Image_PopFile, "1:8" }, + { MUII_PopDrawer, MUICFG_Image_PopDrawer, "1:9" }, + { MUII_PropKnob, MUICFG_Image_PropKnob, "0:129" }, + { MUII_Drawer, MUICFG_Image_Drawer, "1:10" }, + { MUII_HardDisk, MUICFG_Image_HardDisk, "1:11" }, + { MUII_Disk, MUICFG_Image_Disk, "1:12" }, + { MUII_Chip, MUICFG_Image_Chip, "1:13" }, + { MUII_Volume, MUICFG_Image_Volume, "1:14" }, + { MUII_RegisterBack, MUICFG_Background_Register, "0:128" }, + { MUII_Network, MUICFG_Image_Network, "1:15" }, + { MUII_Assign, MUICFG_Image_Assign, "1:16" }, + { MUII_TapePlay, MUICFG_Image_TapePlay, "1:17" }, + { MUII_TapePlayBack, MUICFG_Image_TapePlayBack, "1:18" }, + { MUII_TapePause, MUICFG_Image_TapePause, "1:19" }, + { MUII_TapeStop, MUICFG_Image_TapeStop, "1:20" }, + { MUII_TapeRecord, MUICFG_Image_TapeRecord, "1:21" }, + { MUII_GroupBack, MUICFG_Background_Framed, "0:128" }, + { MUII_SliderBack, MUICFG_Background_Slider, "0:128" }, + { MUII_SliderKnob, MUICFG_Background_SliderKnob, "0:128" }, + { MUII_TapeUp, MUICFG_Image_TapeUp, "1:22" }, + { MUII_TapeDown, MUICFG_Image_TapeDown, "1:23" }, + { MUII_PageBack, MUICFG_Background_Page, "0:128" }, + { MUII_ReadListBack, MUICFG_Background_ReadList, "0:128" }, + { 0, 0, NULL }, +}; + +/* called by Configdata_New */ +static void init_imspecs(Object *obj, struct MUI_ConfigdataData *data) +{ + int i; + + for (i = 0; DefImspecValues[i].defspec; i++) + { + CONST_STRPTR imspec; + const struct spec_cfg *img = DefImspecValues + i; + + imspec = GetConfigString(obj, img->cfgid); +/* D(bug("init_imspecs: %ld %lx %s ...\n", img->muiv, img->cfgid, imspec)); */ + data->prefs.imagespecs[img->muiv] = imspec; + if (!data->prefs.imagespecs[img->muiv]) + { +/* D(bug("*** init_imspecs: null imagespec %ld\n", img->muiv)); */ + } + } +} + +/************************************************************************** + Default FrameSpec values +**************************************************************************/ + +/* spec format : type, recessed, left, right, up, down spacing */ +const static struct spec_cfg DefFramespecValues[] = +{ + { MUIV_Frame_None, MUICFG_Invalid, "000000" }, /* invisible frame */ + { MUIV_Frame_Button, MUICFG_Frame_Button, "202211" }, /* text button */ + { MUIV_Frame_ImageButton, MUICFG_Frame_ImageButton, "202211" }, /* image button */ + { MUIV_Frame_Text, MUICFG_Frame_Text, "212211" }, /* textfield without input */ + { MUIV_Frame_String, MUICFG_Frame_String, "302211" }, /* string gadget */ + { MUIV_Frame_ReadList, MUICFG_Frame_ReadList, "212211" }, /* list without input */ + { MUIV_Frame_InputList, MUICFG_Frame_InputList, "202211" }, /* list with input */ + { MUIV_Frame_Prop, MUICFG_Frame_Prop, "202211" }, /* scrollbar container */ + { MUIV_Frame_Gauge, MUICFG_Frame_Gauge, "210000" }, /* gauge */ + { MUIV_Frame_Group, MUICFG_Frame_Group, "314444" }, /* normal group */ + { MUIV_Frame_PopUp, MUICFG_Frame_PopUp, "112211" }, /* cycle menu, popup window */ + { MUIV_Frame_Virtual, MUICFG_Frame_Virtual, "212211" }, /* virt group */ + { MUIV_Frame_Slider, MUICFG_Frame_Slider, "400000" }, /* slider container */ + { MUIV_Frame_Knob, MUICFG_Frame_Knob, "202211" }, /* slider knob */ + { MUIV_Frame_Drag, MUICFG_Frame_Drag, "300000" }, /* dnd frame */ + { -1, -1, NULL }, +}; + +/* called by Configdata_New */ +static void init_framespecs(Object *obj, struct MUI_ConfigdataData *data) +{ + int i; + + for (i = 0; DefFramespecValues[i].defspec; i++) + { + CONST_STRPTR framespec; + const struct spec_cfg *fcfg = DefFramespecValues + i; + + framespec = GetConfigString(obj, fcfg->cfgid); + zune_frame_spec_to_intern(framespec, + &data->prefs.frames[fcfg->muiv]); + } +} + +/************************************************************************** + Default ULONG values +**************************************************************************/ + +struct def_ulval +{ + ULONG id; + ULONG val; +}; + +const static struct def_ulval DefULValues[] = { + {MUICFG_Window_Spacing_Left, 4}, + {MUICFG_Window_Spacing_Right, 4}, + {MUICFG_Window_Spacing_Top, 3}, + {MUICFG_Window_Buttons, 0}, + {MUICFG_Window_Spacing_Bottom, 3}, + {MUICFG_Window_Positions, WINDOW_POSITION_FORGET_ON_EXIT}, + {MUICFG_Window_Redraw, WINDOW_REDRAW_WITHOUT_CLEAR}, + {MUICFG_Window_Refresh, WINDOW_REFRESH_SIMPLE}, + {MUICFG_Radio_HSpacing, 4}, + {MUICFG_Radio_VSpacing, 1}, + {MUICFG_Group_HSpacing, 6}, + {MUICFG_Group_VSpacing, 3}, + {MUICFG_Cycle_MenuCtrl_Position, CYCLE_MENU_POSITION_BELOW}, + {MUICFG_Cycle_MenuCtrl_Level, 2}, + {MUICFG_Cycle_MenuCtrl_Speed, 0}, + {MUICFG_Cycle_Menu_Recessed, FALSE}, + {MUICFG_Listview_Font_Leading, 1}, + {MUICFG_Listview_Smoothed, FALSE}, + {MUICFG_Listview_SmoothVal, 0}, + {MUICFG_Listview_Refresh, LISTVIEW_REFRESH_MIXED}, + {MUICFG_Listview_Multi, LISTVIEW_MULTI_SHIFTED}, + {MUICFG_GroupTitle_Position, GROUP_TITLE_POSITION_CENTERED}, + {MUICFG_GroupTitle_Color, GROUP_TITLE_COLOR_HILITE}, + {MUICFG_Scrollbar_Type, SCROLLBAR_TYPE_STANDARD}, + {MUICFG_Scrollbar_Arrangement, SCROLLBAR_ARRANGEMENT_TOP}, + {MUICFG_Balance_Look, BALANCING_SHOW_FRAMES}, + {MUICFG_Dragndrop_Look, DND_LOOK_GHOSTED_ON_BOX}, + {MUICFG_Drag_Autostart, TRUE}, + {MUICFG_Drag_Autostart_Length, 3}, + {MUICFG_Drag_LeftButton, TRUE}, + {MUICFG_Drag_MiddleButton, FALSE}, + {MUICFG_Register_TruncateTitles, FALSE}, + {MUICFG_Screen_Mode, 0}, + {MUICFG_Screen_Mode_ID, -1}, + {MUICFG_Screen_Width, 0}, + {MUICFG_Screen_Height, 0}, + {MUICFG_PublicScreen_PopToFront, TRUE}, + {MUICFG_Iconification_ShowIcon, TRUE}, + {MUICFG_Iconification_ShowMenu, FALSE}, + {MUICFG_Iconification_OnStartup, FALSE}, + {MUICFG_Interfaces_EnableARexx, TRUE}, + {MUICFG_BubbleHelp_FirstDelay, 30}, + {MUICFG_BubbleHelp_NextDelay, 10}, + {0, 0}, +}; + +/************************************************************************** + Default string values +**************************************************************************/ + +struct def_strval +{ + ULONG id; + CONST_STRPTR val; +}; + +/* NULL values not allowed */ +const static struct def_strval DefStrValues[] = { + {MUICFG_Font_Normal, ""}, + {MUICFG_Font_List, ""}, + {MUICFG_Font_Tiny, ""}, + {MUICFG_Font_Fixed, ""}, + {MUICFG_Font_Title, ""}, + {MUICFG_Font_Big, ""}, + {MUICFG_Font_Button, ""}, + {MUICFG_Font_Knob, ""}, + {MUICFG_String_Background, "2:m2"}, + {MUICFG_String_Text, "m5"}, + {MUICFG_String_ActiveBackground, "2:m1"}, + {MUICFG_String_ActiveText, "m5"}, + {MUICFG_String_Cursor, "m7"}, + {MUICFG_String_MarkedBackground, "m6"}, + {MUICFG_String_MarkedText, "m0"}, + {MUICFG_ActiveObject_Color, "m0"}, + {MUICFG_Keyboard_Press, "-upstroke return"}, + {MUICFG_Keyboard_Toggle, "-repeat space"}, + {MUICFG_Keyboard_Up, "-repeat up"}, + {MUICFG_Keyboard_Down, "-repeat down"}, + {MUICFG_Keyboard_PageUp, "-repeat shift up"}, + {MUICFG_Keyboard_PageDown, "-repeat shift down"}, + {MUICFG_Keyboard_Top, "control up"}, + {MUICFG_Keyboard_Bottom, "control down"}, + {MUICFG_Keyboard_Left, "-repeat left"}, + {MUICFG_Keyboard_Right, "-repeat right"}, + {MUICFG_Keyboard_WordLeft, "-repeat control left"}, + {MUICFG_Keyboard_WordRight, "-repeat control right"}, + {MUICFG_Keyboard_LineStart, "shift left"}, + {MUICFG_Keyboard_LineEnd, "shift right"}, + {MUICFG_Keyboard_NextGadget, "-repeat tab"}, + {MUICFG_Keyboard_PrevGadget, "-repeat shift tab"}, + {MUICFG_Keyboard_GadgetOff, "control tab"}, + {MUICFG_Keyboard_CloseWindow, "esc"}, + {MUICFG_Keyboard_NextWindow, "-repeat alt tab"}, + {MUICFG_Keyboard_PrevWindow, "-repeat alt shift tab"}, + {MUICFG_Keyboard_Help, "help"}, + {MUICFG_Keyboard_Popup, "control p"}, + {MUICFG_Drag_LMBModifier, "control"}, + {MUICFG_Drag_MMBModifier, ""}, + {MUICFG_PublicScreen, ""}, + {MUICFG_Iconification_Hotkey, ""}, + {0, 0}, +}; + + +/************************************************************************** + OM_NEW + Load global (and maybe application-specific) prefs files into the dataspace, + then fill the prefs struct with dataspace or default values +**************************************************************************/ +IPTR Configdata__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) +{ + struct MUI_ConfigdataData *data; + struct TagItem *tags; + struct TagItem *tag; + //APTR cdata; + int i, res = 0; + + obj = (Object *) DoSuperMethodA(cl, obj, (Msg) msg); + if (!obj) + return (IPTR) NULL; + +/* D(bug("Configdata_New(%p)\n", obj)); */ + + data = INST_DATA(cl, obj); + + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) + { + switch (tag->ti_Tag) + { + case MUIA_Configdata_Application: + data->app = (Object *) tag->ti_Data; + break; + case MUIA_Configdata_ApplicationBase: + data->appbase = (CONST_STRPTR) tag->ti_Data; + break; + } + } + + if (data->app && !data->appbase) + { + get(data->app, MUIA_Application_Base, &data->appbase); + } + + if (data->appbase) + { + char filename[255]; + snprintf(filename, 255, "ENV:zune/%s.prefs", data->appbase); + res = DoMethod(obj, MUIM_Configdata_Load, (IPTR) filename); + if (!res) + { + snprintf(filename, 255, "ENVARC:zune/%s.prefs", data->appbase); + res = DoMethod(obj, MUIM_Configdata_Load, (IPTR) filename); + } + } + + // load only global prefs if no local app pref is found + if (!res) + { + if (!DoMethod(obj, MUIM_Configdata_Load, + (IPTR) "ENV:zune/global.prefs")) + { + DoMethod(obj, MUIM_Configdata_Load, + (IPTR) "ENVARC:zune/global.prefs"); + } + } + /*---------- fonts stuff ----------*/ + + data->prefs.fonts[-MUIV_Font_Normal] = + GetConfigString(obj, MUICFG_Font_Normal); + data->prefs.fonts[-MUIV_Font_List] = + GetConfigString(obj, MUICFG_Font_List); + data->prefs.fonts[-MUIV_Font_Tiny] = + GetConfigString(obj, MUICFG_Font_Tiny); + data->prefs.fonts[-MUIV_Font_Fixed] = + GetConfigString(obj, MUICFG_Font_Fixed); + data->prefs.fonts[-MUIV_Font_Title] = + GetConfigString(obj, MUICFG_Font_Title); + data->prefs.fonts[-MUIV_Font_Big] = + GetConfigString(obj, MUICFG_Font_Big); + data->prefs.fonts[-MUIV_Font_Button] = + GetConfigString(obj, MUICFG_Font_Button); + data->prefs.fonts[-MUIV_Font_Knob] = + GetConfigString(obj, MUICFG_Font_Knob); + + /*---------- images stuff ----------*/ + + init_imspecs(obj, data); + + /*---------- frame stuff ----------*/ + + init_framespecs(obj, data); + + /*---------- system stuff ----------*/ + + data->prefs.publicscreen_name = + GetConfigString(obj, MUICFG_PublicScreen); + data->prefs.publicscreen_pop_to_front = + GetConfigULong(obj, MUICFG_PublicScreen_PopToFront); + data->prefs.iconification_hotkey = + GetConfigString(obj, MUICFG_Iconification_Hotkey); + data->prefs.iconification_show_icon = + GetConfigULong(obj, MUICFG_Iconification_ShowIcon); + data->prefs.iconification_show_menu = + GetConfigULong(obj, MUICFG_Iconification_ShowMenu); + data->prefs.iconification_on_startup = + GetConfigULong(obj, MUICFG_Iconification_OnStartup); + data->prefs.interfaces_enable_arexx = + GetConfigULong(obj, MUICFG_Interfaces_EnableARexx); + data->prefs.bubblehelp_first_delay = + GetConfigULong(obj, MUICFG_BubbleHelp_FirstDelay); + data->prefs.bubblehelp_next_delay = + GetConfigULong(obj, MUICFG_BubbleHelp_NextDelay); + + /*---------- window stuff ----------*/ + + data->prefs.window_inner_left = + GetConfigULong(obj, MUICFG_Window_Spacing_Left); + data->prefs.window_inner_right = + GetConfigULong(obj, MUICFG_Window_Spacing_Right); + data->prefs.window_inner_top = + GetConfigULong(obj, MUICFG_Window_Spacing_Top); + data->prefs.window_inner_bottom = + GetConfigULong(obj, MUICFG_Window_Spacing_Bottom); + data->prefs.window_position = + GetConfigULong(obj, MUICFG_Window_Positions); + data->prefs.window_redraw = GetConfigULong(obj, MUICFG_Window_Redraw); + data->prefs.window_refresh = GetConfigULong(obj, MUICFG_Window_Refresh); + data->prefs.screenmode = GetConfigULong(obj, MUICFG_Screen_Mode); + data->prefs.screenmodeid = GetConfigULong(obj, MUICFG_Screen_Mode_ID); + data->prefs.screen_width = GetConfigULong(obj, MUICFG_Screen_Width); + data->prefs.screen_height = GetConfigULong(obj, MUICFG_Screen_Height); + data->prefs.window_buttons = GetConfigULong(obj, MUICFG_Window_Buttons); + + /*---------- group stuff ----------*/ + + data->prefs.group_title_position = + GetConfigULong(obj, MUICFG_GroupTitle_Position); + data->prefs.group_title_color = + GetConfigULong(obj, MUICFG_GroupTitle_Color); + data->prefs.group_hspacing = GetConfigULong(obj, MUICFG_Group_HSpacing); + data->prefs.group_vspacing = GetConfigULong(obj, MUICFG_Group_VSpacing); + + /*---------- registers ----------*/ + + data->prefs.register_look = REGISTER_LOOK_TRADITIONAL; + data->prefs.register_truncate_titles = + GetConfigULong(obj, MUICFG_Register_TruncateTitles); + + /*---------- Buttons ----------*/ + + data->prefs.radiobutton_hspacing = + GetConfigULong(obj, MUICFG_Radio_HSpacing); + data->prefs.radiobutton_vspacing = + GetConfigULong(obj, MUICFG_Radio_VSpacing); + + /*---------- Cycles ----------*/ + + data->prefs.cycle_menu_position = + GetConfigULong(obj, MUICFG_Cycle_MenuCtrl_Position); + data->prefs.cycle_menu_min_entries = + GetConfigULong(obj, MUICFG_Cycle_MenuCtrl_Level); + data->prefs.cycle_menu_speed = + GetConfigULong(obj, MUICFG_Cycle_MenuCtrl_Speed); + data->prefs.cycle_menu_recessed_entries = + GetConfigULong(obj, MUICFG_Cycle_Menu_Recessed); + + /*---------- Sliders ----------*/ + /* all taken care of in frames and images */ + + /*---------- Scrollbars ----------*/ + + data->prefs.scrollbar_type = GetConfigULong(obj, MUICFG_Scrollbar_Type); + data->prefs.scrollbar_arrangement = + GetConfigULong(obj, MUICFG_Scrollbar_Arrangement); + + /*---------- Lists ----------*/ + + data->prefs.list_linespacing = + GetConfigULong(obj, MUICFG_Listview_Font_Leading); + data->prefs.list_smoothed = + GetConfigULong(obj, MUICFG_Listview_Smoothed); + data->prefs.list_smoothval = + GetConfigULong(obj, MUICFG_Listview_SmoothVal); + data->prefs.list_multi = GetConfigULong(obj, MUICFG_Listview_Multi); + data->prefs.list_refresh = GetConfigULong(obj, MUICFG_Listview_Refresh); + + /*---------- Strings ----------*/ + data->prefs.string_bg_inactive = + GetConfigString(obj, MUICFG_String_Background); + data->prefs.string_text_inactive = + GetConfigString(obj, MUICFG_String_Text); + data->prefs.string_bg_active = + GetConfigString(obj, MUICFG_String_ActiveBackground); + data->prefs.string_text_active = + GetConfigString(obj, MUICFG_String_ActiveText); + data->prefs.string_cursor = GetConfigString(obj, MUICFG_String_Cursor); + data->prefs.string_bg_marked = + GetConfigString(obj, MUICFG_String_MarkedBackground); + data->prefs.string_text_marked = + GetConfigString(obj, MUICFG_String_MarkedText); + + /*---------- Navigation ----------*/ + + data->prefs.drag_left_button = + GetConfigULong(obj, MUICFG_Drag_LeftButton); + data->prefs.drag_left_modifier.readable_hotkey = + GetConfigString(obj, MUICFG_Drag_LMBModifier); + data->prefs.drag_middle_button = + GetConfigULong(obj, MUICFG_Drag_MiddleButton); + data->prefs.drag_middle_modifier.readable_hotkey = + GetConfigString(obj, MUICFG_Drag_MMBModifier); + data->prefs.drag_autostart = GetConfigULong(obj, MUICFG_Drag_Autostart); + data->prefs.drag_autostart_length = + GetConfigULong(obj, MUICFG_Drag_Autostart_Length); + data->prefs.drag_look = GetConfigULong(obj, MUICFG_Dragndrop_Look); + data->prefs.balancing_look = GetConfigULong(obj, MUICFG_Balance_Look); + + if (data->prefs.drag_left_modifier.readable_hotkey != NULL) + data->prefs.drag_left_modifier.ix_well = + !ParseIX(data->prefs.drag_left_modifier.readable_hotkey, + &data->prefs.drag_left_modifier.ix); + else + data->prefs.drag_left_modifier.ix_well = 0; + + if (data->prefs.drag_middle_modifier.readable_hotkey != NULL) + data->prefs.drag_middle_modifier.ix_well = + !ParseIX(data->prefs.drag_middle_modifier.readable_hotkey, + &data->prefs.drag_middle_modifier.ix); + else + data->prefs.drag_middle_modifier.ix_well = 0; + + data->prefs.active_object_color = + GetConfigString(obj, MUICFG_ActiveObject_Color); + /*---------- mui keys ----------*/ + + data->prefs.muikeys[MUIKEY_PRESS].readable_hotkey = + GetConfigString(obj, MUICFG_Keyboard_Press); + data->prefs.muikeys[MUIKEY_TOGGLE].readable_hotkey = + GetConfigString(obj, MUICFG_Keyboard_Toggle); + data->prefs.muikeys[MUIKEY_UP].readable_hotkey = + GetConfigString(obj, MUICFG_Keyboard_Up); + data->prefs.muikeys[MUIKEY_DOWN].readable_hotkey = + GetConfigString(obj, MUICFG_Keyboard_Down); + data->prefs.muikeys[MUIKEY_PAGEUP].readable_hotkey = + GetConfigString(obj, MUICFG_Keyboard_PageUp); + data->prefs.muikeys[MUIKEY_PAGEDOWN].readable_hotkey = + GetConfigString(obj, MUICFG_Keyboard_PageDown); + data->prefs.muikeys[MUIKEY_TOP].readable_hotkey = + GetConfigString(obj, MUICFG_Keyboard_Top); + data->prefs.muikeys[MUIKEY_BOTTOM].readable_hotkey = + GetConfigString(obj, MUICFG_Keyboard_Bottom); + data->prefs.muikeys[MUIKEY_LEFT].readable_hotkey = + GetConfigString(obj, MUICFG_Keyboard_Left); + data->prefs.muikeys[MUIKEY_RIGHT].readable_hotkey = + GetConfigString(obj, MUICFG_Keyboard_Right); + data->prefs.muikeys[MUIKEY_WORDLEFT].readable_hotkey = + GetConfigString(obj, MUICFG_Keyboard_WordLeft); + data->prefs.muikeys[MUIKEY_WORDRIGHT].readable_hotkey = + GetConfigString(obj, MUICFG_Keyboard_WordRight); + data->prefs.muikeys[MUIKEY_LINESTART].readable_hotkey = + GetConfigString(obj, MUICFG_Keyboard_LineStart); + data->prefs.muikeys[MUIKEY_LINEEND].readable_hotkey = + GetConfigString(obj, MUICFG_Keyboard_LineEnd); + data->prefs.muikeys[MUIKEY_GADGET_NEXT].readable_hotkey = + GetConfigString(obj, MUICFG_Keyboard_NextGadget); + data->prefs.muikeys[MUIKEY_GADGET_PREV].readable_hotkey = + GetConfigString(obj, MUICFG_Keyboard_PrevGadget); + data->prefs.muikeys[MUIKEY_GADGET_OFF].readable_hotkey = + GetConfigString(obj, MUICFG_Keyboard_GadgetOff); + data->prefs.muikeys[MUIKEY_WINDOW_CLOSE].readable_hotkey = + GetConfigString(obj, MUICFG_Keyboard_CloseWindow); + data->prefs.muikeys[MUIKEY_WINDOW_NEXT].readable_hotkey = + GetConfigString(obj, MUICFG_Keyboard_NextWindow); + data->prefs.muikeys[MUIKEY_WINDOW_PREV].readable_hotkey = + GetConfigString(obj, MUICFG_Keyboard_PrevWindow); + data->prefs.muikeys[MUIKEY_HELP].readable_hotkey = + GetConfigString(obj, MUICFG_Keyboard_Help); + data->prefs.muikeys[MUIKEY_POPUP].readable_hotkey = + GetConfigString(obj, MUICFG_Keyboard_Popup); + + for (i = 0; i < MUIKEY_COUNT; i++) + { + if (data->prefs.muikeys[i].readable_hotkey) + data->prefs.muikeys[i].ix_well = + !ParseIX(data->prefs.muikeys[i].readable_hotkey, + &data->prefs.muikeys[i].ix); + else + data->prefs.muikeys[i].ix_well = 0; + } + + /*---------- CustomFrames ----------*/ + data->prefs.customframe_config_1 = + GetConfigString(obj, MUICFG_CustomFrame_1); + data->prefs.customframe_config_2 = + GetConfigString(obj, MUICFG_CustomFrame_2); + data->prefs.customframe_config_3 = + GetConfigString(obj, MUICFG_CustomFrame_3); + data->prefs.customframe_config_4 = + GetConfigString(obj, MUICFG_CustomFrame_4); + data->prefs.customframe_config_5 = + GetConfigString(obj, MUICFG_CustomFrame_5); + data->prefs.customframe_config_6 = + GetConfigString(obj, MUICFG_CustomFrame_6); + data->prefs.customframe_config_7 = + GetConfigString(obj, MUICFG_CustomFrame_7); + data->prefs.customframe_config_8 = + GetConfigString(obj, MUICFG_CustomFrame_8); + data->prefs.customframe_config_9 = + GetConfigString(obj, MUICFG_CustomFrame_9); + data->prefs.customframe_config_10 = + GetConfigString(obj, MUICFG_CustomFrame_10); + data->prefs.customframe_config_11 = + GetConfigString(obj, MUICFG_CustomFrame_11); + data->prefs.customframe_config_12 = + GetConfigString(obj, MUICFG_CustomFrame_12); + data->prefs.customframe_config_13 = + GetConfigString(obj, MUICFG_CustomFrame_13); + data->prefs.customframe_config_14 = + GetConfigString(obj, MUICFG_CustomFrame_14); + data->prefs.customframe_config_15 = + GetConfigString(obj, MUICFG_CustomFrame_15); + data->prefs.customframe_config_16 = + GetConfigString(obj, MUICFG_CustomFrame_16); + + /*---------- Special ----------*/ + /* all taken care of in frames and images */ + + return (IPTR) obj; +} + +/************************************************************************** + OM_DISPOSE +**************************************************************************/ +IPTR Configdata__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) +{ +/* struct MUI_ConfigdataData *data = INST_DATA(cl, obj); */ +/* int i; */ + + return DoSuperMethodA(cl, obj, msg); +} + +/************************************************************************** + OM_GET +**************************************************************************/ +IPTR Configdata__OM_GET(struct IClass *cl, Object *obj, + struct opGet *msg) +{ + struct MUI_ConfigdataData *data = INST_DATA(cl, obj); + IPTR *store = msg->opg_Storage; + ULONG tag = msg->opg_AttrID; + + switch (tag) + { + case MUIA_Configdata_ZunePrefs: + *store = (IPTR) & data->prefs; + DoMethod(obj, MUIM_Configdata_GetWindowPos, 0); + return 1; + } + + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +#ifndef AROS_BIG_ENDIAN +#define AROS_BIG_ENDIAN 0 +#endif + +static LONG windowpos_endian(IPTR data, BOOL isNative) +{ + LONG size, items; + WORD cnt, i, j; + void *p = (void *)data; + + if (AROS_BIG_ENDIAN) + { + size = *(LONG *) p; + } + else + { + if (isNative) + { + size = *(LONG *) p; + } + else + { + size = AROS_BE2LONG(*((LONG *) p)); + } + *((LONG *) p) = AROS_SWAP_BYTES_LONG(*((LONG *) p)); + } + + cnt = sizeof(LONG); + items = (size - sizeof(LONG)) / sizeof(struct windowpos); + D(bug("size=%d items=%d\n", size, items)); + if (size > 100 || items > 100) + { + bug("%s crashed...\n", FindTask(NULL)->tc_Node.ln_Name); + { + volatile int dead = 1; + while (dead); + } + } + + for (i = 0; i < items; i++) + { + if (AROS_BIG_ENDIAN) + { + D(bug("ID=%08x\n", *((LONG *) (p + cnt)))); + } + else + { + if (isNative) + D(bug("ID=%08x\n", *((LONG *) (p + cnt)))); + *((LONG *) (p + cnt)) = + AROS_SWAP_BYTES_LONG(*((LONG *) (p + cnt))); + if (!isNative) + D(bug("ID=%08x\n", *((LONG *) (p + cnt)))); + } + cnt += sizeof(LONG); + for (j = 0; j < 8; j++) + { + if (AROS_BIG_ENDIAN) + { + D(bug("V%d: %d\n", j, *((WORD *) (p + cnt)))); + } + else + { + if (isNative) + D(bug("V%d: %d\n", j, *((WORD *) (p + cnt)))); + *((WORD *) (p + cnt)) = + AROS_SWAP_BYTES_LONG(*((WORD *) (p + cnt))); + if (!isNative) + D(bug("V%d: %d\n", j, *((WORD *) (p + cnt)))); + } + cnt += sizeof(WORD); + } + } + D(bug("size=%d\n", cnt)); + return cnt; +} + +static IPTR Configdata_GetWindowPos(struct IClass *cl, Object *obj, + struct MUIP_Configdata_GetString *msg) +{ + struct MUI_ConfigdataData *data; + IPTR s; + data = INST_DATA(cl, obj); + //kprintf ("getwindowpos\n"); + s = (IPTR) DoMethod(obj, MUIM_Dataspace_Find, MUICFG_WindowPos); + if (s && data->app) + { + windowpos_endian(s, FALSE); + set(data->app, MUIA_Application_CopyWinPosToApp, s); + windowpos_endian(s, TRUE); + } + return s; +} + +static IPTR Configdata_SetWindowPos(struct IClass *cl, Object *obj, + struct MUIP_Configdata_GetString *msg) +{ + struct MUI_ConfigdataData *data; + //kprintf ("setwindowpos\n"); + data = INST_DATA(cl, obj); + IPTR addr = 0; + LONG size = 0; + + if (data->app) + { + get(data->app, MUIA_Application_GetWinPosAddr, &addr); + get(data->app, MUIA_Application_GetWinPosSize, &size); + + /* We can ignore size-variable because + * MUIA_Application_GetWinPosSize updates *((LONG*)addr) */ + size = windowpos_endian(addr, TRUE); + DoMethod(obj, MUIM_Dataspace_Add, addr, size, MUICFG_WindowPos); + windowpos_endian(addr, FALSE); + } + return 0; +} + + + +/************************************************************************** + MUIM_Configdata_GetString + Check if string is found in dataspace, then if not found, search each + builtin array +**************************************************************************/ +IPTR Configdata__MUIM_GetString(struct IClass *cl, Object *obj, + struct MUIP_Configdata_GetString *msg) +{ + CONST_STRPTR s; + + s = (CONST_STRPTR) DoMethod(obj, MUIM_Dataspace_Find, msg->id); + if (!s) + { + int i; + + for (i = 0; DefStrValues[i].id; i++) + { + if (DefStrValues[i].id == msg->id) + return (IPTR) DefStrValues[i].val; + } + for (i = 0; DefImspecValues[i].defspec; i++) + { + if (DefImspecValues[i].cfgid == msg->id) + return (IPTR) DefImspecValues[i].defspec; + } + for (i = 0; DefFramespecValues[i].defspec; i++) + { + if (DefFramespecValues[i].cfgid == msg->id) + return (IPTR) DefFramespecValues[i].defspec; + } + return (IPTR) 0; + } + else + { + return (IPTR) s; + } +} + +/************************************************************************** + MUIM_Configdata_SetImspec + search in builtin array first, to not not have in dataspace the default + value (would be redundant) +**************************************************************************/ +IPTR Configdata__MUIM_SetImspec(struct IClass *cl, Object *obj, + struct MUIP_Configdata_SetImspec *msg) +{ + int i; + + if (!msg->imspec || !*msg->imspec || *msg->imspec == '6') + { +/* D(bug("Configdata_SetImspec(%p) : id %08lx, val invalid\n", */ +/* obj, msg->id)); */ + return 0; + } + + for (i = 0; DefImspecValues[i].defspec; i++) + { + if (DefImspecValues[i].cfgid == msg->id) + if (!strcmp(DefImspecValues[i].defspec, msg->imspec)) + { +/* D(bug("Configdata_SetImspec(%p) : set to def, id %08lx, val %s\n", */ +/* obj, msg->id, msg->imspec)); */ + DoMethod(obj, MUIM_Dataspace_Remove, msg->id); + return 0; + } + } + + for (i = 0; DefStrValues[i].id; i++) + { + if (DefStrValues[i].id == msg->id) + if (!strcmp(DefStrValues[i].val, msg->imspec)) + { + DoMethod(obj, MUIM_Dataspace_Remove, msg->id); + return 0; + } + } + + DoMethod(obj, MUIM_Dataspace_Add, (IPTR) msg->imspec, + strlen(msg->imspec) + 1, msg->id); + return 0; +} + +/************************************************************************** + MUIM_Configdata_SetFramespec +**************************************************************************/ +IPTR Configdata__MUIM_SetFramespec(struct IClass *cl, Object *obj, + struct MUIP_Configdata_SetFramespec *msg) +{ + int i; + + if (!msg->framespec || !*msg->framespec) + { +/* D(bug("Configdata_SetFramespec(%p) : id %08lx, val invalid\n", */ +/* obj, msg->id)); */ + return 0; + } + + for (i = 0; DefFramespecValues[i].defspec; i++) + { + if (DefFramespecValues[i].cfgid == msg->id) + if (!strcmp(DefFramespecValues[i].defspec, msg->framespec)) + { +/* D(bug("Configdata_SetFramespec(%p): " */ +/* "set to def, id %08lx, val %s\n", */ +/* obj, msg->id, msg->framespec)); */ + DoMethod(obj, MUIM_Dataspace_Remove, msg->id); + return 0; + } + } + + DoMethod(obj, MUIM_Dataspace_Add, (IPTR) msg->framespec, + strlen(msg->framespec) + 1, msg->id); + return 0; +} + +/************************************************************************** + MUIM_Configdata_SetPenspec +**************************************************************************/ +IPTR Configdata__MUIM_SetPenspec(struct IClass *cl, Object *obj, + struct MUIP_Configdata_SetPenspec *msg) +{ + int i; + + if (!msg->penspec || !*msg->penspec) + return 0; + + for (i = 0; DefStrValues[i].id; i++) + { + if (DefStrValues[i].id == msg->id) + if (!strcmp(DefStrValues[i].val, msg->penspec)) + { + DoMethod(obj, MUIM_Dataspace_Remove, msg->id); + return 0; + } + } + + DoMethod(obj, MUIM_Dataspace_Add, (IPTR) msg->penspec, + strlen(msg->penspec) + 1, msg->id); + return 0; +} + +/************************************************************************** + MUIM_Configdata_SetFont +**************************************************************************/ +IPTR Configdata__MUIM_SetFont(struct IClass *cl, Object *obj, + struct MUIP_Configdata_SetFont *msg) +{ + if (!msg->font || !*msg->font) + { +/* D(bug("Configdata_SetFont(%p) : id %08lx, val invalid\n", */ +/* obj, msg->id)); */ + DoMethod(obj, MUIM_Dataspace_Remove, msg->id); + return 0; + } + + DoMethod(obj, MUIM_Dataspace_Add, (IPTR) msg->font, + strlen(msg->font) + 1, msg->id); + return 0; +} + +/************************************************************************** + MUIM_Configdata_SetString +**************************************************************************/ +IPTR Configdata__MUIM_SetString(struct IClass *cl, Object *obj, + struct MUIP_Configdata_SetString *msg) +{ + int i; + + for (i = 0; DefStrValues[i].id; i++) + { + if (DefStrValues[i].id == msg->id) + if (!strcmp(DefStrValues[i].val, msg->string)) + { + DoMethod(obj, MUIM_Dataspace_Remove, msg->id); + return 0; + } + } + + DoMethod(obj, MUIM_Dataspace_Add, (IPTR) msg->string, + strlen(msg->string) + 1, msg->id); + return 0; +} + +/************************************************************************** + MUIM_Configdata_GetULong +**************************************************************************/ +IPTR Configdata__MUIM_GetULong(struct IClass *cl, Object *obj, + struct MUIP_Configdata_GetULong *msg) +{ + ULONG *vp; + + vp = (ULONG *) DoMethod(obj, MUIM_Dataspace_Find, msg->id); + if (!vp) + { + int i; + + for (i = 0; DefULValues[i].id != 0; i++) + { + if (DefULValues[i].id == msg->id) + return DefULValues[i].val; + } + return 0; + } + else + { + return AROS_BE2LONG(*vp); + } +} + +/************************************************************************** + MUIM_Configdata_SetULong +**************************************************************************/ +IPTR Configdata__MUIM_SetULong(struct IClass *cl, Object *obj, + struct MUIP_Configdata_SetULong *msg) +{ + ULONG v = msg->val; + ULONG *vp = &v; + int i; + + for (i = 0; DefULValues[i].id != 0; i++) + { + if (DefULValues[i].id == msg->id) + if (DefULValues[i].val == v) + { +/* D(bug("Configdata_SetULong(%p):" */ +/* " set to def, id %08lx, val %ld\n", */ +/* obj, msg->id, v)); */ + DoMethod(obj, MUIM_Dataspace_Remove, msg->id); + return 0; + } + } + + v = AROS_LONG2BE(v); +/* D(bug("Configdata_SetULong(%p): adding %08lx to %08lx chunk\n", */ +/* obj, v, msg->id)); */ + DoMethod(obj, MUIM_Dataspace_Add, (IPTR) vp, 4, msg->id); + return 0; +} + + +/************************************************************************** + SavePrefsHeader: Write a PRHD chunk +**************************************************************************/ +static int SavePrefsHeader(struct IFFHandle *iff) +{ + if (!PushChunk(iff, 0, MAKE_ID('P', 'R', 'H', 'D'), IFFSIZE_UNKNOWN)) + { + struct PrefHeader ph; + ph.ph_Version = 0; + ph.ph_Type = 0; + ph.ph_Flags = 0; + + if (WriteChunkBytes(iff, &ph, sizeof(struct PrefHeader))) + if (!PopChunk(iff)) + return 1; + PopChunk(iff); + } + return 0; +} + +/************************************************************************** + MUIM_Configdata_Save +**************************************************************************/ +IPTR Configdata__MUIM_Save(struct IClass *cl, Object *obj, + struct MUIP_Configdata_Save *msg) +{ + struct IFFHandle *iff; + if ((iff = AllocIFF())) + { + if (!(iff->iff_Stream = (IPTR) Open(msg->filename, MODE_NEWFILE))) + { + /* Try to Create the directory where the file is located */ + char *path = StrDup(msg->filename); + if (path) + { + char *path_end = PathPart(path); + if (path_end != path) + { + BPTR lock; + *path_end = 0; + if ((lock = CreateDir(path))) + { + UnLock(lock); + iff->iff_Stream = + (IPTR) Open(msg->filename, MODE_NEWFILE); + } + } + FreeVec(path); + } + } + + if (iff->iff_Stream) + { + InitIFFasDOS(iff); + + if (!OpenIFF(iff, IFFF_WRITE)) + { + if (!PushChunk(iff, MAKE_ID('P', 'R', 'E', 'F'), ID_FORM, + IFFSIZE_UNKNOWN)) + { + Configdata_SetWindowPos(cl, obj, (APTR) msg); + if (SavePrefsHeader(iff)) + { + DoMethod(obj, MUIM_Dataspace_WriteIFF, (IPTR) iff, + 0, MAKE_ID('M', 'U', 'I', 'C')); + } + PopChunk(iff); + } + + CloseIFF(iff); + } + Close((BPTR) iff->iff_Stream); + } + FreeIFF(iff); + } + return 0; +} + + +/************************************************************************** + MUIM_Configdata_Load + Get the content of the file into the object. +**************************************************************************/ +IPTR Configdata__MUIM_Load(struct IClass *cl, Object *obj, + struct MUIP_Configdata_Load *msg) +{ + struct IFFHandle *iff; + IPTR res = TRUE; + + if ((iff = AllocIFF())) + { + D(bug("loading prefs from %s\n", msg->filename)); + if ((iff->iff_Stream = (IPTR) Open(msg->filename, MODE_OLDFILE))) + { + InitIFFasDOS(iff); + + if (!OpenIFF(iff, IFFF_READ)) + { + StopChunk(iff, MAKE_ID('P', 'R', 'E', 'F'), MAKE_ID('M', + 'U', 'I', 'C')); + + while (!ParseIFF(iff, IFFPARSE_SCAN)) + { + struct ContextNode *cn; + if (!(cn = CurrentChunk(iff))) + continue; + if (cn->cn_ID == MAKE_ID('M', 'U', 'I', 'C')) + DoMethod(obj, MUIM_Dataspace_ReadIFF, (IPTR) iff); + } + + CloseIFF(iff); + } + else + { + res = FALSE; + } + Close((BPTR) iff->iff_Stream); + } + else + { + res = FALSE; + } + FreeIFF(iff); + } + else + { + res = FALSE; + } + return res; +} + + +/* + * The class dispatcher + */ +BOOPSI_DISPATCHER(IPTR, Configdata_Dispatcher, cl, obj, msg) +{ + switch (msg->MethodID) + { + case OM_NEW: + return Configdata__OM_NEW(cl, obj, (struct opSet *)msg); + case OM_DISPOSE: + return Configdata__OM_DISPOSE(cl, obj, (APTR) msg); + case OM_GET: + return Configdata__OM_GET(cl, obj, (APTR) msg); + case MUIM_Configdata_GetString: + return Configdata__MUIM_GetString(cl, obj, (APTR) msg); + case MUIM_Configdata_GetULong: + return Configdata__MUIM_GetULong(cl, obj, (APTR) msg); + case MUIM_Configdata_SetULong: + return Configdata__MUIM_SetULong(cl, obj, (APTR) msg); + case MUIM_Configdata_SetImspec: + return Configdata__MUIM_SetImspec(cl, obj, (APTR) msg); + case MUIM_Configdata_SetFramespec: + return Configdata__MUIM_SetFramespec(cl, obj, (APTR) msg); + case MUIM_Configdata_SetPenspec: + return Configdata__MUIM_SetPenspec(cl, obj, (APTR) msg); + case MUIM_Configdata_SetFont: + return Configdata__MUIM_SetFont(cl, obj, (APTR) msg); + case MUIM_Configdata_SetString: + return Configdata__MUIM_SetString(cl, obj, (APTR) msg); + case MUIM_Configdata_Save: + return Configdata__MUIM_Save(cl, obj, (APTR) msg); + case MUIM_Configdata_Load: + return Configdata__MUIM_Load(cl, obj, (APTR) msg); + case MUIM_Configdata_SetWindowPos: + return Configdata_SetWindowPos(cl, obj, (APTR) msg); + case MUIM_Configdata_GetWindowPos: + return Configdata_GetWindowPos(cl, obj, (APTR) msg); + + } + + return DoSuperMethodA(cl, obj, msg); +} +BOOPSI_DISPATCHER_END + +/* + * Class descriptor. + */ +const struct __MUIBuiltinClass _MUI_Configdata_desc = +{ + MUIC_Configdata, /* Class name */ + MUIC_Dataspace, /* super class name */ + sizeof(struct MUI_ConfigdataData), /* size of class own datas */ + (void *) Configdata_Dispatcher /* class dispatcher */ +}; diff --git a/workbench/libs/muimaster/classes/configdata.h b/workbench/libs/muimaster/classes/configdata.h index 1b55a4ac51..748a59006a 100644 --- a/workbench/libs/muimaster/classes/configdata.h +++ b/workbench/libs/muimaster/classes/configdata.h @@ -14,34 +14,34 @@ /* The config items for MUIM_GetConfigItem */ #define MUICFG_Invalid (-1) -#define MUICFG_Window_Spacing_Left 0x01 /* ULONG, horiz pixels (def=4) */ -#define MUICFG_Window_Spacing_Right 0x02 /* ULONG, horiz pixels (def=4) */ -#define MUICFG_Window_Spacing_Top 0x03 /* ULONG, vert pixels (def=3) */ -#define MUICFG_Window_Spacing_Bottom 0x04 /* ULONG, vert pixels (def=3) */ -#define MUICFG_Radio_HSpacing 0x05 /* ULONG, horiz pixels (def=4) */ -#define MUICFG_Radio_VSpacing 0x06 /* ULONG, vertical pixels (def=1) */ -#define MUICFG_Group_HSpacing 0x07 /* ULONG, horiz pixels (def=6) */ -#define MUICFG_Group_VSpacing 0x08 /* ULONG, vertical pixels (def=3) */ -#define MUICFG_Scrollbar_Arrangement 0x09 /* ULONG, top = 0 (def), middle, bottom */ -#define MUICFG_Listview_Refresh 0x0a /* ULONG, linear, mixed = 1 (def) */ -#define MUICFG_Listview_Font_Leading 0x0b /* ULONG, vertical pixels (def=1) */ -#define MUICFG_Listview_SmoothVal 0x0c /* ULONG, ? (def=0) */ -#define MUICFG_Listview_Multi 0x0d /* ULONG, shifted = 0 (def), always */ -#define MUICFG_GroupTitle_Position 0x0f /* ULONG, 1=centered */ -#define MUICFG_GroupTitle_Color 0x10 /* ULONG, 0=normal */ -#define MUICFG_Cycle_MenuCtrl_Level 0x11 /* ULONG, num of entries (def=2) */ -#define MUICFG_Cycle_MenuCtrl_Position 0x12 /* ULONG, below = 0 (def), on active */ +#define MUICFG_Window_Spacing_Left 0x01 /* ULONG, horiz pixels (def=4) */ +#define MUICFG_Window_Spacing_Right 0x02 /* ULONG, horiz pixels (def=4) */ +#define MUICFG_Window_Spacing_Top 0x03 /* ULONG, vert pixels (def=3) */ +#define MUICFG_Window_Spacing_Bottom 0x04 /* ULONG, vert pixels (def=3) */ +#define MUICFG_Radio_HSpacing 0x05 /* ULONG, horiz pixels (def=4) */ +#define MUICFG_Radio_VSpacing 0x06 /* ULONG, vertical pixels (def=1) */ +#define MUICFG_Group_HSpacing 0x07 /* ULONG, horiz pixels (def=6) */ +#define MUICFG_Group_VSpacing 0x08 /* ULONG, vertical pixels (def=3) */ +#define MUICFG_Scrollbar_Arrangement 0x09 /* ULONG, top = 0 (def), middle, bottom */ +#define MUICFG_Listview_Refresh 0x0a /* ULONG, linear, mixed = 1 (def) */ +#define MUICFG_Listview_Font_Leading 0x0b /* ULONG, vertical pixels (def=1) */ +#define MUICFG_Listview_SmoothVal 0x0c /* ULONG, ? (def=0) */ +#define MUICFG_Listview_Multi 0x0d /* ULONG, shifted = 0 (def), always */ +#define MUICFG_GroupTitle_Position 0x0f /* ULONG, 1=centered */ +#define MUICFG_GroupTitle_Color 0x10 /* ULONG, 0=normal */ +#define MUICFG_Cycle_MenuCtrl_Level 0x11 /* ULONG, num of entries (def=2) */ +#define MUICFG_Cycle_MenuCtrl_Position 0x12 /* ULONG, below = 0 (def), on active */ #define MUICFG_Frame_Drag 0x18 -#define MUICFG_Cycle_Menu_Recessed 0x19 /* ULONG, false = 0 (def), true */ -#define MUICFG_Cycle_MenuCtrl_Speed 0x1a /* ULONG, num of ticks (0..50) (def=0) */ -#define MUICFG_Listview_Smoothed 0x1b /* ULONG, false = 0 (def), true */ -#define MUICFG_Window_Redraw 0x1d /* ULONG, no clear, clear = 1 (def) */ +#define MUICFG_Cycle_Menu_Recessed 0x19 /* ULONG, false = 0 (def), true */ +#define MUICFG_Cycle_MenuCtrl_Speed 0x1a /* ULONG, num of ticks (0..50) (def=0) */ +#define MUICFG_Listview_Smoothed 0x1b /* ULONG, false = 0 (def), true */ +#define MUICFG_Window_Redraw 0x1d /* ULONG, no clear, clear = 1 (def) */ #define MUICFG_Font_Normal 0x1e #define MUICFG_Font_List 0x1f #define MUICFG_Font_Tiny 0x20 #define MUICFG_Font_Fixed 0x21 #define MUICFG_Font_Title 0x22 -#define MUICFG_Font_Big 0x23 +#define MUICFG_Font_Big 0x23 #define MUICFG_PublicScreen 0x24 #define MUICFG_Frame_Button 0x2b #define MUICFG_Frame_ImageButton 0x2c @@ -118,30 +118,30 @@ #define MUICFG_Keyboard_Help 0x73 #define MUICFG_Keyboard_Popup 0x74 #define MUICFG_Window_Positions 0x7a -#define MUICFG_Balance_Look 0x7b /* ULONG, frame = 0 (def), object */ +#define MUICFG_Balance_Look 0x7b /* ULONG, frame = 0 (def), object */ #define MUICFG_Font_Button 0x80 -#define MUICFG_Scrollbar_Type 0x83 /* ULONG, standard = 0 (def), newlook, custom */ +#define MUICFG_Scrollbar_Type 0x83 /* ULONG, standard = 0 (def), newlook, custom */ #define MUICFG_String_Background 0x84 #define MUICFG_String_Text 0x85 #define MUICFG_String_ActiveBackground 0x86 #define MUICFG_String_ActiveText 0x87 #define MUICFG_Font_Knob 0x88 -#define MUICFG_Drag_LeftButton 0x89 /* ULONG, false, true (def) */ -#define MUICFG_Drag_MiddleButton 0x8a /* ULONG, false (def), true */ -#define MUICFG_Drag_LMBModifier 0x8b /* key desc (def = control) */ -#define MUICFG_Drag_MMBModifier 0x8c /* key desc */ -#define MUICFG_Drag_Autostart 0x8d /* ULONG, false = 0, true (def) */ -#define MUICFG_Drag_Autostart_Length 0x8e /* ULONG, pixels (def = 3) */ -#define MUICFG_ActiveObject_Color 0x8f /* penspec */ +#define MUICFG_Drag_LeftButton 0x89 /* ULONG, false, true (def) */ +#define MUICFG_Drag_MiddleButton 0x8a /* ULONG, false (def), true */ +#define MUICFG_Drag_LMBModifier 0x8b /* key desc (def = control) */ +#define MUICFG_Drag_MMBModifier 0x8c /* key desc */ +#define MUICFG_Drag_Autostart 0x8d /* ULONG, false = 0, true (def) */ +#define MUICFG_Drag_Autostart_Length 0x8e /* ULONG, pixels (def = 3) */ +#define MUICFG_ActiveObject_Color 0x8f /* penspec */ #define MUICFG_Frame_Knob 0x90 -#define MUICFG_Dragndrop_Look 0x94 /* ULONG, solid, ghosted on obj (def), ... */ +#define MUICFG_Dragndrop_Look 0x94 /* ULONG, solid, ghosted on obj (def), ... */ #define MUICFG_Background_Page 0x95 #define MUICFG_Background_ReadList 0x96 #define MUICFG_String_Cursor 0x400 #define MUICFG_String_MarkedBackground 0x401 #define MUICFG_String_MarkedText 0x402 #define MUICFG_Register_TruncateTitles 0x403 -#define MUICFG_Window_Refresh 0x404 +#define MUICFG_Window_Refresh 0x404 #define MUICFG_Screen_Mode 0x505 #define MUICFG_Screen_Mode_ID 0x506 #define MUICFG_Screen_Width 0x507 @@ -180,33 +180,92 @@ /*** Methods ****************************************************************/ -#define MUIM_Configdata_GetString (MUIB_Configdata | 0x00000000) /* Zune 20030319 */ -#define MUIM_Configdata_GetULong (MUIB_Configdata | 0x00000001) /* Zune 20030319 */ -#define MUIM_Configdata_SetULong (MUIB_Configdata | 0x00000002) /* Zune 20030320 */ -#define MUIM_Configdata_SetImspec (MUIB_Configdata | 0x00000003) /* Zune 20030323 */ -#define MUIM_Configdata_SetFramespec (MUIB_Configdata | 0x00000004) /* Zune 20030331 */ -#define MUIM_Configdata_SetFont (MUIB_Configdata | 0x00000005) /* Zune 20030323 */ -#define MUIM_Configdata_Save (MUIB_Configdata | 0x00000006) /* Zune 20030320 */ -#define MUIM_Configdata_Load (MUIB_Configdata | 0x00000007) /* Zune 20030320 */ -#define MUIM_Configdata_SetPenspec (MUIB_Configdata | 0x00000008) /* Zune 20030714 */ -#define MUIM_Configdata_SetString (MUIB_Configdata | 0x00000009) /* Zune 20030808 */ -struct MUIP_Configdata_GetString {STACKED ULONG MethodID; STACKED ULONG id; }; -struct MUIP_Configdata_GetULong {STACKED ULONG MethodID; STACKED ULONG id; }; -struct MUIP_Configdata_SetULong {STACKED ULONG MethodID; STACKED ULONG id; STACKED ULONG val; }; -struct MUIP_Configdata_SetImspec {STACKED ULONG MethodID; STACKED ULONG id; STACKED CONST_STRPTR imspec; }; -struct MUIP_Configdata_SetFramespec {STACKED ULONG MethodID; STACKED ULONG id; STACKED CONST_STRPTR framespec; }; -struct MUIP_Configdata_SetFont {STACKED ULONG MethodID; STACKED ULONG id; STACKED CONST_STRPTR font; }; -struct MUIP_Configdata_Save {STACKED ULONG MethodID; STACKED CONST_STRPTR filename; }; -struct MUIP_Configdata_Load {STACKED ULONG MethodID; STACKED CONST_STRPTR filename; }; -struct MUIP_Configdata_SetPenspec {STACKED ULONG MethodID; STACKED ULONG id; STACKED CONST_STRPTR penspec; }; -struct MUIP_Configdata_SetString {STACKED ULONG MethodID; STACKED ULONG id; STACKED CONST_STRPTR string; }; +#define MUIM_Configdata_GetString (MUIB_Configdata | 0x00000000) +#define MUIM_Configdata_GetULong (MUIB_Configdata | 0x00000001) +#define MUIM_Configdata_SetULong (MUIB_Configdata | 0x00000002) +#define MUIM_Configdata_SetImspec (MUIB_Configdata | 0x00000003) +#define MUIM_Configdata_SetFramespec (MUIB_Configdata | 0x00000004) +#define MUIM_Configdata_SetFont (MUIB_Configdata | 0x00000005) +#define MUIM_Configdata_Save (MUIB_Configdata | 0x00000006) +#define MUIM_Configdata_Load (MUIB_Configdata | 0x00000007) +#define MUIM_Configdata_SetPenspec (MUIB_Configdata | 0x00000008) +#define MUIM_Configdata_SetString (MUIB_Configdata | 0x00000009) + +struct MUIP_Configdata_GetString +{ + STACKED ULONG MethodID; + STACKED ULONG id; +}; + +struct MUIP_Configdata_GetULong +{ + STACKED ULONG MethodID; + STACKED ULONG id; +}; + +struct MUIP_Configdata_SetULong +{ + STACKED ULONG MethodID; + STACKED ULONG id; + STACKED ULONG val; +}; + +struct MUIP_Configdata_SetImspec +{ + STACKED ULONG MethodID; + STACKED ULONG id; + STACKED CONST_STRPTR imspec; +}; + +struct MUIP_Configdata_SetFramespec +{ + STACKED ULONG MethodID; + STACKED ULONG id; + STACKED CONST_STRPTR framespec; +}; + +struct MUIP_Configdata_SetFont +{ + STACKED ULONG MethodID; + STACKED ULONG id; + STACKED CONST_STRPTR font; +}; + +struct MUIP_Configdata_Save +{ + STACKED ULONG MethodID; + STACKED CONST_STRPTR filename; +}; + +struct MUIP_Configdata_Load +{ + STACKED ULONG MethodID; + STACKED CONST_STRPTR filename; +}; + +struct MUIP_Configdata_SetPenspec +{ + STACKED ULONG MethodID; + STACKED ULONG id; + STACKED CONST_STRPTR penspec; +}; + +struct MUIP_Configdata_SetString +{ + STACKED ULONG MethodID; + STACKED ULONG id; + STACKED CONST_STRPTR string; +}; /*** Attributes *************************************************************/ -#define MUIA_Configdata_Application (MUIB_Configdata | 0x00000000) /* ZV1: i.. Object * */ -#define MUIA_Configdata_ZunePrefs (MUIB_Configdata | 0x00000001) /* ZV1: PRIV .g. struct ZunePrefsNew * */ -#define MUIA_Configdata_ApplicationBase (MUIB_Configdata | 0x00000002) /* ZV1: i.. Object * */ +#define MUIA_Configdata_Application \ + (MUIB_Configdata | 0x00000000) /* ZV1: i.. Object * */ +#define MUIA_Configdata_ZunePrefs \ + (MUIB_Configdata | 0x00000001) /* ZV1: PRIV .g. struct ZunePrefsNew * */ +#define MUIA_Configdata_ApplicationBase \ + (MUIB_Configdata | 0x00000002) /* ZV1: i.. Object * */ -extern const struct __MUIBuiltinClass _MUI_Configdata_desc; /* PRIV */ +extern const struct __MUIBuiltinClass _MUI_Configdata_desc; /* PRIV */ #endif /* _MUI_CLASSES_CONFIGDATA_H */ diff --git a/workbench/libs/muimaster/classes/crawling.c b/workbench/libs/muimaster/classes/crawling.c dissimilarity index 63% index c4768c6e7f..7d981c0574 100644 --- a/workbench/libs/muimaster/classes/crawling.c +++ b/workbench/libs/muimaster/classes/crawling.c @@ -1,140 +1,149 @@ -/* - Copyright © 2002-2003, The AROS Development Team. All rights reserved. - $Id$ -*/ - -#define MUIMASTER_YES_INLINE_STDARG - -#include <exec/memory.h> -#include <clib/alib_protos.h> -#include <proto/exec.h> -#include <proto/dos.h> -#include <proto/utility.h> -#include <proto/intuition.h> -#include <proto/muimaster.h> - -#include <string.h> -#include <stdio.h> - -#include "mui.h" -#include "muimaster_intern.h" -#include "support.h" -#include "support_classes.h" -#include "debug.h" -#include "crawling_private.h" - -extern struct Library *MUIMasterBase; - -IPTR Crawling__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) -{ - obj = (Object *)DoSuperNewTags - ( - cl, obj, NULL, - TAG_MORE, (IPTR) msg->ops_AttrList - ); - - if (obj) - { - struct Crawling_DATA *data = INST_DATA(cl, obj); - - data->ehn.ehn_Events = 0; - data->ehn.ehn_Priority = 0; - data->ehn.ehn_Flags = 0; - data->ehn.ehn_Object = obj; - data->ehn.ehn_Class = cl; - - } - - return (IPTR)obj; -} - -IPTR Crawling__MUIM_Setup(struct IClass *cl, Object *obj, struct MUIP_Setup *msg) -{ - struct Crawling_DATA *data = INST_DATA(cl, obj); - IPTR retval; - - retval = DoSuperMethodA(cl, obj, (Msg)msg); - - data->ticker = CRAWLING_INITIAL_DELAY; - - return retval; -} - -IPTR Crawling__MUIM_Show(struct IClass *cl, Object *obj, struct MUIP_Show *msg) -{ - struct Crawling_DATA *data = INST_DATA(cl, obj); - IPTR retval; - - retval = DoSuperMethodA(cl, obj, (Msg)msg); - - data->ehn.ehn_Events |= IDCMP_INTUITICKS; - DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR)&data->ehn); - - return retval; -} - -IPTR Crawling__MUIM_Hide(struct IClass *cl, Object *obj, struct MUIP_Hide *msg) -{ - struct Crawling_DATA *data = INST_DATA(cl, obj); - - DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR)&data->ehn); - data->ehn.ehn_Events &= ~IDCMP_INTUITICKS; - - return DoSuperMethodA(cl, obj, (Msg)msg); - -} - -IPTR Crawling__MUIM_HandleEvent(struct IClass *cl, Object *obj, struct MUIP_HandleEvent *msg) -{ - if (msg->imsg) - { - if (msg->imsg->Class == IDCMP_INTUITICKS) - { - struct Crawling_DATA *data = INST_DATA(cl, obj); - - if (data->ticker) data->ticker--; - - if (data->ticker == 0) - { - IPTR virty = 0, virth = 0; - - get(obj, MUIA_Virtgroup_Top, &virty); - get(obj, MUIA_Virtgroup_Height, &virth); - - if (virth >= _mheight(obj)) - { - virty++; - if (virty + _mheight(obj) > virth) virty = 0; - - set(obj, MUIA_Virtgroup_Top, virty); - } - } - } - } - - return 0; -} - -#if ZUNE_BUILTIN_CRAWLING -BOOPSI_DISPATCHER(IPTR, Crawling_Dispatcher, cl, obj, msg) -{ - switch (msg->MethodID) - { - case OM_NEW: return Crawling__OM_NEW(cl, obj, (struct opSet *)msg); - case MUIM_Setup: return Crawling__MUIM_Setup(cl, obj, (APTR)msg); - case MUIM_Show: return Crawling__MUIM_Show(cl, obj, (APTR)msg); - case MUIM_Hide: return Crawling__MUIM_Hide(cl, obj, (APTR)msg); - case MUIM_HandleEvent: return Crawling__MUIM_HandleEvent(cl,obj,(APTR)msg); - default: return DoSuperMethodA(cl, obj, msg); - } -} -BOOPSI_DISPATCHER_END - -const struct __MUIBuiltinClass _MUI_Crawling_desc = -{ - MUIC_Crawling, - MUIC_Virtgroup, - sizeof(struct Crawling_DATA), - (void*)Crawling_Dispatcher -}; -#endif /* ZUNE_BUILTIN_CRAWLING */ +/* + Copyright © 2002-2003, The AROS Development Team. All rights reserved. + $Id$ +*/ + +#define MUIMASTER_YES_INLINE_STDARG + +#include <exec/memory.h> +#include <clib/alib_protos.h> +#include <proto/exec.h> +#include <proto/dos.h> +#include <proto/utility.h> +#include <proto/intuition.h> +#include <proto/muimaster.h> + +#include <string.h> +#include <stdio.h> + +#include "mui.h" +#include "muimaster_intern.h" +#include "support.h" +#include "support_classes.h" +#include "debug.h" +#include "crawling_private.h" + +extern struct Library *MUIMasterBase; + +IPTR Crawling__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) +{ + obj = (Object *) DoSuperNewTags + (cl, obj, NULL, TAG_MORE, (IPTR) msg->ops_AttrList); + + if (obj) + { + struct Crawling_DATA *data = INST_DATA(cl, obj); + + data->ehn.ehn_Events = 0; + data->ehn.ehn_Priority = 0; + data->ehn.ehn_Flags = 0; + data->ehn.ehn_Object = obj; + data->ehn.ehn_Class = cl; + + } + + return (IPTR) obj; +} + +IPTR Crawling__MUIM_Setup(struct IClass *cl, Object *obj, + struct MUIP_Setup *msg) +{ + struct Crawling_DATA *data = INST_DATA(cl, obj); + IPTR retval; + + retval = DoSuperMethodA(cl, obj, (Msg) msg); + + data->ticker = CRAWLING_INITIAL_DELAY; + + return retval; +} + +IPTR Crawling__MUIM_Show(struct IClass *cl, Object *obj, + struct MUIP_Show *msg) +{ + struct Crawling_DATA *data = INST_DATA(cl, obj); + IPTR retval; + + retval = DoSuperMethodA(cl, obj, (Msg) msg); + + data->ehn.ehn_Events |= IDCMP_INTUITICKS; + DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR) & data->ehn); + + return retval; +} + +IPTR Crawling__MUIM_Hide(struct IClass *cl, Object *obj, + struct MUIP_Hide *msg) +{ + struct Crawling_DATA *data = INST_DATA(cl, obj); + + DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR) & data->ehn); + data->ehn.ehn_Events &= ~IDCMP_INTUITICKS; + + return DoSuperMethodA(cl, obj, (Msg) msg); + +} + +IPTR Crawling__MUIM_HandleEvent(struct IClass *cl, Object *obj, + struct MUIP_HandleEvent *msg) +{ + if (msg->imsg) + { + if (msg->imsg->Class == IDCMP_INTUITICKS) + { + struct Crawling_DATA *data = INST_DATA(cl, obj); + + if (data->ticker) + data->ticker--; + + if (data->ticker == 0) + { + IPTR virty = 0, virth = 0; + + get(obj, MUIA_Virtgroup_Top, &virty); + get(obj, MUIA_Virtgroup_Height, &virth); + + if (virth >= _mheight(obj)) + { + virty++; + if (virty + _mheight(obj) > virth) + virty = 0; + + set(obj, MUIA_Virtgroup_Top, virty); + } + } + } + } + + return 0; +} + +#if ZUNE_BUILTIN_CRAWLING +BOOPSI_DISPATCHER(IPTR, Crawling_Dispatcher, cl, obj, msg) +{ + switch (msg->MethodID) + { + case OM_NEW: + return Crawling__OM_NEW(cl, obj, (struct opSet *)msg); + case MUIM_Setup: + return Crawling__MUIM_Setup(cl, obj, (APTR) msg); + case MUIM_Show: + return Crawling__MUIM_Show(cl, obj, (APTR) msg); + case MUIM_Hide: + return Crawling__MUIM_Hide(cl, obj, (APTR) msg); + case MUIM_HandleEvent: + return Crawling__MUIM_HandleEvent(cl, obj, (APTR) msg); + default: + return DoSuperMethodA(cl, obj, msg); + } +} +BOOPSI_DISPATCHER_END + +const struct __MUIBuiltinClass _MUI_Crawling_desc = +{ + MUIC_Crawling, + MUIC_Virtgroup, + sizeof(struct Crawling_DATA), + (void *) Crawling_Dispatcher +}; +#endif /* ZUNE_BUILTIN_CRAWLING */ diff --git a/workbench/libs/muimaster/classes/cycle.c b/workbench/libs/muimaster/classes/cycle.c index 0f68fe2d2e..b93f968e42 100644 --- a/workbench/libs/muimaster/classes/cycle.c +++ b/workbench/libs/muimaster/classes/cycle.c @@ -27,24 +27,24 @@ extern struct Library *MUIMasterBase; struct MUI_CycleData { - const char **entries; - int entries_active; - int entries_num; - int entries_width; - int entries_height; - int cycle_width; - int cycle_height; - Object *pageobj; - Object *imgobj; - struct MUI_EventHandlerNode ehn; - struct Hook pressedhook; - struct MUI_ImageSpec_intern *popbg; - struct Window *popwin; - WORD popitemwidth; - WORD popitemheight; - WORD popitemoffx; - WORD popitemoffy; - WORD activepopitem; + const char **entries; + int entries_active; + int entries_num; + int entries_width; + int entries_height; + int cycle_width; + int cycle_height; + Object *pageobj; + Object *imgobj; + struct MUI_EventHandlerNode ehn; + struct Hook pressedhook; + struct MUI_ImageSpec_intern *popbg; + struct Window *popwin; + WORD popitemwidth; + WORD popitemheight; + WORD popitemoffx; + WORD popitemoffy; + WORD activepopitem; }; @@ -53,15 +53,16 @@ struct MUI_CycleData void PressedHookFunc(struct Hook *hook, Object *obj, APTR msg) { - struct MUI_CycleData *data; - Class *cl = (Class *)hook->h_Data; - LONG act; + struct MUI_CycleData *data; + Class *cl = (Class *) hook->h_Data; + LONG act; data = INST_DATA(cl, obj); - + act = ++data->entries_active; - if (act >= data->entries_num) act = 0; - + if (act >= data->entries_num) + act = 0; + set(obj, MUIA_Cycle_Active, act); } @@ -70,88 +71,84 @@ OM_NEW **************************************************************************/ IPTR Cycle__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) { - struct MUI_CycleData *data; - struct TagItem *tag, *tags; - Object *pageobj, *imgobj; + struct MUI_CycleData *data; + struct TagItem *tag, *tags; + Object *pageobj, *imgobj; int i; obj = (Object *) DoSuperNewTags - ( - cl, obj, NULL, - + (cl, obj, NULL, ButtonFrame, - MUIA_Background, MUII_ButtonBack, - MUIA_InputMode, MUIV_InputMode_RelVerify, - MUIA_InnerTop, 1, + MUIA_Background, MUII_ButtonBack, + MUIA_InputMode, MUIV_InputMode_RelVerify, + MUIA_InnerTop, 1, MUIA_InnerBottom, 1, MUIA_Group_Horiz, TRUE, - Child, (IPTR) (imgobj = ImageObject, - MUIA_InnerLeft, 2, - MUIA_Image_Spec, (IPTR) "6:17", - MUIA_Image_FreeVert, TRUE, - End), + MUIA_InnerLeft, 2, + MUIA_Image_Spec, (IPTR) "6:17", + MUIA_Image_FreeVert, TRUE, + End), Child, (IPTR) (pageobj = PageGroup, End), - - TAG_MORE, (IPTR) msg->ops_AttrList - ); + TAG_MORE, (IPTR) msg->ops_AttrList); - if (!obj) return FALSE; + if (!obj) + return FALSE; data = INST_DATA(cl, obj); data->pageobj = pageobj; data->imgobj = imgobj; - + data->pressedhook.h_Entry = HookEntry; - data->pressedhook.h_SubEntry = (HOOKFUNC)PressedHookFunc; + data->pressedhook.h_SubEntry = (HOOKFUNC) PressedHookFunc; data->pressedhook.h_Data = cl; - + /* parse initial taglist */ - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) - { - switch (tag->ti_Tag) + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) { - case MUIA_Cycle_Entries: - data->entries = (const char**)tag->ti_Data; + switch (tag->ti_Tag) + { + case MUIA_Cycle_Entries: + data->entries = (const char **)tag->ti_Data; break; - - case MUIA_Cycle_Active: - data->entries_active = tag->ti_Data; + + case MUIA_Cycle_Active: + data->entries_active = tag->ti_Data; break; - } + } } if (!data->entries) { - D(bug("Cycle_New: No Entries specified!\n")); - CoerceMethod(cl,obj,OM_DISPOSE); - return (IPTR)NULL; + D(bug("Cycle_New: No Entries specified!\n")); + CoerceMethod(cl, obj, OM_DISPOSE); + return (IPTR) NULL; } /* Count the number of entries */ - for (i=0;data->entries[i];i++) + for (i = 0; data->entries[i]; i++) { Object *page; - + page = TextObject, - MUIA_Text_Contents, (IPTR)data->entries[i], - MUIA_Text_PreParse, (IPTR)"\033c", - End; - + MUIA_Text_Contents, (IPTR) data->entries[i], + MUIA_Text_PreParse, (IPTR) "\033c", End; + if (!page) { D(bug("Cycle_New: Could not create page object specified!\n")); - CoerceMethod(cl,obj,OM_DISPOSE); - return (IPTR)NULL; + CoerceMethod(cl, obj, OM_DISPOSE); + return (IPTR) NULL; } - - DoMethod(pageobj, OM_ADDMEMBER, (IPTR)page); + + DoMethod(pageobj, OM_ADDMEMBER, (IPTR) page); } data->entries_num = i; - if ((data->entries_active >= 0) && (data->entries_active < data->entries_num)) + if ((data->entries_active >= 0) + && (data->entries_active < data->entries_num)) { set(pageobj, MUIA_Group_ActivePage, data->entries_active); } @@ -159,16 +156,16 @@ IPTR Cycle__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) { data->entries_active = 0; } - + #if 1 DoMethod(obj, MUIM_Notify, MUIA_Pressed, FALSE, - (IPTR)obj, 2, MUIM_CallHook, (IPTR)&data->pressedhook); + (IPTR) obj, 2, MUIM_CallHook, (IPTR) & data->pressedhook); #else DoMethod(imgobj, MUIM_Notify, MUIA_Pressed, FALSE, - (IPTR)obj, 3, MUIM_Set, MUIA_Cycle_Active, MUIV_Cycle_Active_Next); + (IPTR) obj, 3, MUIM_Set, MUIA_Cycle_Active, MUIV_Cycle_Active_Next); #endif - - return (IPTR)obj; + + return (IPTR) obj; } /************************************************************************** @@ -176,63 +173,65 @@ OM_SET **************************************************************************/ IPTR Cycle__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) { - struct MUI_CycleData *data; - struct TagItem *tag, *tags; - LONG l; - BOOL noforward = TRUE; - + struct MUI_CycleData *data; + struct TagItem *tag, *tags; + LONG l; + BOOL noforward = TRUE; + data = INST_DATA(cl, obj); - - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) - { - switch (tag->ti_Tag) + + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) { - case MUIA_Cycle_Active: - l = (LONG)tag->ti_Data; + switch (tag->ti_Tag) + { + case MUIA_Cycle_Active: + l = (LONG) tag->ti_Data; if (l == MUIV_Cycle_Active_Next) - { - l = data->entries_active + 1; - if (l >= data->entries_num) l = 0; - } - else if (l == MUIV_Cycle_Active_Prev) - { - l = data->entries_active - 1; - if (l < 0) l = data->entries_num - 1; - } + { + l = data->entries_active + 1; + if (l >= data->entries_num) + l = 0; + } + else if (l == MUIV_Cycle_Active_Prev) + { + l = data->entries_active - 1; + if (l < 0) + l = data->entries_num - 1; + } + + if (l >= 0 && l < data->entries_num) + { + data->entries_active = l; + set(data->pageobj, MUIA_Group_ActivePage, + data->entries_active); + } + break; - if (l >= 0 && l < data->entries_num) - { - data->entries_active = l; - set(data->pageobj, MUIA_Group_ActivePage, data->entries_active); - } - break; - default: noforward = FALSE; break; + } } - } - + if (noforward) { struct opSet ops = *msg; - struct TagItem tags[] = - { - {MUIA_Group_Forward , FALSE }, - {TAG_MORE , 0 } - }; + struct TagItem tags[] = { + {MUIA_Group_Forward, FALSE}, + {TAG_MORE, 0} + }; + + /* Zune must also be compilable with SAS C on Amiga */ + tags[1].ti_Data = (IPTR) msg->ops_AttrList; - /* Zune must also be compilable with SAS C on Amiga */ - tags[1].ti_Data = (IPTR)msg->ops_AttrList; - - ops.ops_AttrList = tags; - - return DoSuperMethodA(cl,obj,(Msg)&ops); + ops.ops_AttrList = tags; + + return DoSuperMethodA(cl, obj, (Msg) & ops); } else { - return DoSuperMethodA(cl,obj,(Msg)msg); + return DoSuperMethodA(cl, obj, (Msg) msg); } } @@ -244,468 +243,494 @@ IPTR Cycle__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) struct MUI_CycleData *data = INST_DATA(cl, obj); #define STORE *(msg->opg_Storage) - switch(msg->opg_AttrID) + switch (msg->opg_AttrID) { - case MUIA_Cycle_Active: + case MUIA_Cycle_Active: STORE = data->entries_active; return 1; } - return DoSuperMethodA(cl,obj,(Msg)msg); + return DoSuperMethodA(cl, obj, (Msg) msg); } /************************************************************************** MUIM_Setup **************************************************************************/ -IPTR Cycle__MUIM_Setup(struct IClass *cl, Object *obj, struct MUIP_Setup *msg) +IPTR Cycle__MUIM_Setup(struct IClass *cl, Object *obj, + struct MUIP_Setup *msg) { - struct MUI_CycleData *data; + struct MUI_CycleData *data; - if (!(DoSuperMethodA(cl, obj, (Msg)msg))) - return 0; + if (!(DoSuperMethodA(cl, obj, (Msg) msg))) + return 0; data = INST_DATA(cl, obj); - data->ehn.ehn_Events = IDCMP_MOUSEBUTTONS | IDCMP_RAWKEY; + data->ehn.ehn_Events = IDCMP_MOUSEBUTTONS | IDCMP_RAWKEY; data->ehn.ehn_Priority = 1; - data->ehn.ehn_Flags = 0; - data->ehn.ehn_Object = obj; - data->ehn.ehn_Class = cl; + data->ehn.ehn_Flags = 0; + data->ehn.ehn_Object = obj; + data->ehn.ehn_Class = cl; + + DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR) & data->ehn); - DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR)&data->ehn); return 1; } /************************************************************************** MUIM_Cleanup **************************************************************************/ -IPTR Cycle__MUIM_Cleanup(struct IClass *cl, Object *obj, struct MUIP_Cleanup *msg) +IPTR Cycle__MUIM_Cleanup(struct IClass *cl, Object *obj, + struct MUIP_Cleanup *msg) { struct MUI_CycleData *data = INST_DATA(cl, obj); - DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR)&data->ehn); + DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR) & data->ehn); - return DoSuperMethodA(cl,obj,(Msg)msg); + return DoSuperMethodA(cl, obj, (Msg) msg); } static void KillPopupWin(Object *obj, struct MUI_CycleData *data) { struct MinList *childlist = NULL; - Object *child, *cstate; + Object *child, *cstate; if (data->popwin) { CloseWindow(data->popwin); data->popwin = NULL; } - + if (data->popbg) { zune_imspec_hide(data->popbg); zune_imspec_cleanup(data->popbg); - data->popbg = NULL; + data->popbg = NULL; } - + get(data->pageobj, MUIA_Group_ChildList, &childlist); - cstate = (Object *)childlist->mlh_Head; - while((child = NextObject(&cstate))) + cstate = (Object *) childlist->mlh_Head; + while ((child = NextObject(&cstate))) { ZText *text = NULL; - - get(child, MUIA_UserData, &text); - if (!text) break; - - zune_text_destroy(text); - - set(child, MUIA_UserData, 0); + + get(child, MUIA_UserData, &text); + if (!text) + break; + + zune_text_destroy(text); + + set(child, MUIA_UserData, 0); } - + if (data->ehn.ehn_Events & IDCMP_MOUSEMOVE) { - DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR)&data->ehn); - data->ehn.ehn_Events &= ~IDCMP_MOUSEMOVE; - DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR)&data->ehn); + DoMethod(_win(obj), MUIM_Window_RemEventHandler, + (IPTR) & data->ehn); + data->ehn.ehn_Events &= ~IDCMP_MOUSEMOVE; + DoMethod(_win(obj), MUIM_Window_AddEventHandler, + (IPTR) & data->ehn); } - + } -static void RenderPopupItem(Object *obj, struct MUI_CycleData *data, WORD which) +static void RenderPopupItem(Object *obj, struct MUI_CycleData *data, + WORD which) { - struct MinList *childlist = NULL; + struct MinList *childlist = NULL; struct RastPort *saverp; - Object *child, *cstate; - ZText *text = NULL; - WORD x1, y1, x2, y2, i = which; - + Object *child, *cstate; + ZText *text = NULL; + WORD x1, y1, x2, y2, i = which; + get(data->pageobj, MUIA_Group_ChildList, &childlist); - cstate = (Object *)childlist->mlh_Head; + cstate = (Object *) childlist->mlh_Head; - while((child = NextObject(&cstate)) && i--) + while ((child = NextObject(&cstate)) && i--) { } - if (!child) return; - + if (!child) + return; + get(child, MUIA_UserData, &text); - if (!text) return; /* paranoia */ - + if (!text) + return; /* paranoia */ + saverp = _rp(obj); _rp(obj) = data->popwin->RPort; - + x1 = data->popitemoffx; x2 = x1 + data->popitemwidth - 1; y1 = data->popitemoffy + which * data->popitemheight; y2 = y1 + data->popitemheight - 1; - + if (which == data->activepopitem) { WORD off = 0; - - if(muiGlobalInfo(obj)->mgi_Prefs->cycle_menu_recessed_entries) - { + + if (muiGlobalInfo(obj)->mgi_Prefs->cycle_menu_recessed_entries) + { SetAPen(data->popwin->RPort, _pens(obj)[MPEN_SHADOW]); - RectFill(data->popwin->RPort, x1, y1, x1, y2); - RectFill(data->popwin->RPort, x1 + 1, y1, x2 - 1, y1); + RectFill(data->popwin->RPort, x1, y1, x1, y2); + RectFill(data->popwin->RPort, x1 + 1, y1, x2 - 1, y1); SetAPen(data->popwin->RPort, _pens(obj)[MPEN_SHINE]); - RectFill(data->popwin->RPort, x2, y1, x2, y2); - RectFill(data->popwin->RPort, x1 + 1, y2, x2 - 1, y2); - - off = 1; - } - + RectFill(data->popwin->RPort, x2, y1, x2, y2); + RectFill(data->popwin->RPort, x1 + 1, y2, x2 - 1, y2); + + off = 1; + } + SetAPen(data->popwin->RPort, _pens(obj)[MPEN_FILL]); - RectFill(data->popwin->RPort, x1 + off, y1 + off, x2 - off, y2 - off); + RectFill(data->popwin->RPort, x1 + off, y1 + off, x2 - off, + y2 - off); } else { if (data->popbg) - { - zune_imspec_draw(data->popbg, muiRenderInfo(obj), - x1, y1, x2 - x1 + 1, y2 - y1 + 1, - x1, y1, 0); - } - else - { + { + zune_imspec_draw(data->popbg, muiRenderInfo(obj), + x1, y1, x2 - x1 + 1, y2 - y1 + 1, x1, y1, 0); + } + else + { SetAPen(data->popwin->RPort, 0); - RectFill(data->popwin->RPort, x1, y1, x2, y2); - } + RectFill(data->popwin->RPort, x1, y1, x2, y2); + } } - + SetAPen(data->popwin->RPort, _pens(obj)[MPEN_TEXT]); - + y1 += POPITEM_EXTRAHEIGHT / 2; - if(muiGlobalInfo(obj)->mgi_Prefs->cycle_menu_recessed_entries) + if (muiGlobalInfo(obj)->mgi_Prefs->cycle_menu_recessed_entries) { y1++; } - + zune_text_draw(text, obj, x1, x2, y1); - + _rp(obj) = saverp; - + } static BOOL MakePopupWin(Object *obj, struct MUI_CycleData *data) { - const struct ZuneFrameGfx *zframe; - struct MinList *childlist = NULL; - struct RastPort *rp, *saverp; - Object *child, *cstate; - WORD x, y, winx, winy, winw, winh, i; - + const struct ZuneFrameGfx *zframe; + struct MinList *childlist = NULL; + struct RastPort *rp, *saverp; + Object *child, *cstate; + WORD x, y, winx, winy, winw, winh, i; + data->popitemwidth = 0; data->popitemheight = 0; - + get(data->pageobj, MUIA_Group_ChildList, &childlist); - cstate = (Object *)childlist->mlh_Head; - while((child = NextObject(&cstate))) + cstate = (Object *) childlist->mlh_Head; + while ((child = NextObject(&cstate))) { - set(child, MUIA_UserData, 0); + set(child, MUIA_UserData, 0); } - - data->popitemwidth = _width(data->pageobj); + + data->popitemwidth = _width(data->pageobj); data->popitemheight = _height(data->pageobj); - data->popitemwidth += POPITEM_EXTRAWIDTH; + data->popitemwidth += POPITEM_EXTRAWIDTH; data->popitemheight += POPITEM_EXTRAHEIGHT; - if(muiGlobalInfo(obj)->mgi_Prefs->cycle_menu_recessed_entries) + if (muiGlobalInfo(obj)->mgi_Prefs->cycle_menu_recessed_entries) { data->popitemwidth += 2; - data->popitemheight += 2; - } - - zframe = zune_zframe_get(obj, &muiGlobalInfo(obj)->mgi_Prefs->frames[MUIV_Frame_PopUp]); - - data->popitemoffx = muiGlobalInfo(obj)->mgi_Prefs->frames[MUIV_Frame_PopUp].innerLeft + - zframe->ileft; - - data->popitemoffy = muiGlobalInfo(obj)->mgi_Prefs->frames[MUIV_Frame_PopUp].innerTop + - zframe->itop; - - winw = data->popitemwidth + data->popitemoffx + + data->popitemheight += 2; + } + + zframe = + zune_zframe_get(obj, + &muiGlobalInfo(obj)->mgi_Prefs->frames[MUIV_Frame_PopUp]); + + data->popitemoffx = + muiGlobalInfo(obj)->mgi_Prefs->frames[MUIV_Frame_PopUp].innerLeft + + zframe->ileft; + + data->popitemoffy = + muiGlobalInfo(obj)->mgi_Prefs->frames[MUIV_Frame_PopUp].innerTop + + zframe->itop; + + winw = data->popitemwidth + data->popitemoffx + muiGlobalInfo(obj)->mgi_Prefs->frames[MUIV_Frame_PopUp].innerRight + - zframe->iright; - + zframe->iright; + winh = data->popitemheight * data->entries_num + data->popitemoffy + - muiGlobalInfo(obj)->mgi_Prefs->frames[MUIV_Frame_PopUp].innerBottom + - zframe->ibottom; - + muiGlobalInfo(obj)->mgi_Prefs->frames[MUIV_Frame_PopUp]. + innerBottom + zframe->ibottom; + if ((winw > _screen(obj)->Width) || (winh > _screen(obj)->Height)) { return FALSE; } i = 0; - cstate = (Object *)childlist->mlh_Head; - while((child = NextObject(&cstate))) + cstate = (Object *) childlist->mlh_Head; + while ((child = NextObject(&cstate))) { ZText *text; - - text = zune_text_new("\33c", data->entries[i++], ZTEXT_ARG_NONE, 0); - if (!text) break; - - zune_text_get_bounds(text, obj); - set(child, MUIA_UserData, (IPTR)text); - } - + + text = zune_text_new("\33c", data->entries[i++], ZTEXT_ARG_NONE, 0); + if (!text) + break; + + zune_text_get_bounds(text, obj); + set(child, MUIA_UserData, (IPTR) text); + } + if (i != data->entries_num) { KillPopupWin(obj, data); - return FALSE; + return FALSE; } - + data->popbg = zune_imspec_setup(MUII_PopupBack, muiRenderInfo(obj)); - if (data->popbg) zune_imspec_show(data->popbg, obj); - - winx = _window(obj)->LeftEdge + _mleft(data->pageobj) - + if (data->popbg) + zune_imspec_show(data->popbg, obj); + + winx = _window(obj)->LeftEdge + _mleft(data->pageobj) - data->popitemoffx - POPITEM_EXTRAWIDTH / 2; - if(muiGlobalInfo(obj)->mgi_Prefs->cycle_menu_position == CYCLE_MENU_POSITION_BELOW) - { + if (muiGlobalInfo(obj)->mgi_Prefs->cycle_menu_position == + CYCLE_MENU_POSITION_BELOW) + { winy = _window(obj)->TopEdge + _bottom(obj) + 1; } else { - winy = _window(obj)->TopEdge + _mtop(data->pageobj) - data->popitemoffy - - POPITEM_EXTRAHEIGHT / 2 - data->entries_active * data->popitemheight; - } - - data->popwin = OpenWindowTags(NULL, WA_CustomScreen, (IPTR)_screen(obj), - WA_Left, winx, - WA_Top, winy, - WA_Width, winw, - WA_Height, winh, - WA_AutoAdjust, TRUE, - WA_Borderless, TRUE, - WA_Activate, FALSE, - WA_BackFill, (IPTR)LAYERS_NOBACKFILL, - TAG_DONE); - + winy = + _window(obj)->TopEdge + _mtop(data->pageobj) - + data->popitemoffy - POPITEM_EXTRAHEIGHT / 2 - + data->entries_active * data->popitemheight; + } + + data->popwin = + OpenWindowTags(NULL, WA_CustomScreen, (IPTR) _screen(obj), WA_Left, + winx, WA_Top, winy, WA_Width, winw, WA_Height, winh, WA_AutoAdjust, + TRUE, WA_Borderless, TRUE, WA_Activate, FALSE, WA_BackFill, + (IPTR) LAYERS_NOBACKFILL, TAG_DONE); + if (!data->popwin) { return FALSE; } - + rp = data->popwin->RPort; saverp = _rp(obj); _rp(obj) = rp; - zframe->draw(zframe->customframe, muiRenderInfo(obj), 0, 0, winw, winh, 0, 0, winw, winh); + zframe->draw(zframe->customframe, muiRenderInfo(obj), 0, 0, winw, winh, + 0, 0, winw, winh); /* FIXME: Render with popup background */ - + if (data->popbg) { - zune_imspec_draw(data->popbg, muiRenderInfo(obj), - zframe->ileft, zframe->itop, - winw - zframe->ileft - zframe->iright, - winh - zframe->itop - zframe->ibottom, - zframe->ileft, zframe->itop, 0); + zune_imspec_draw(data->popbg, muiRenderInfo(obj), + zframe->ileft, zframe->itop, + winw - zframe->ileft - zframe->iright, + winh - zframe->itop - zframe->ibottom, + zframe->ileft, zframe->itop, 0); } else { - SetAPen(rp, 0); - RectFill(rp, zframe->ileft, zframe->itop, - winw - 1 - zframe->iright, winh - 1 - zframe->ibottom); + SetAPen(rp, 0); + RectFill(rp, zframe->ileft, zframe->itop, + winw - 1 - zframe->iright, winh - 1 - zframe->ibottom); } - + x = data->popitemoffx; y = data->popitemoffy + POPITEM_EXTRAHEIGHT / 2; - - if(muiGlobalInfo(obj)->mgi_Prefs->cycle_menu_recessed_entries) + + if (muiGlobalInfo(obj)->mgi_Prefs->cycle_menu_recessed_entries) { - y++; + y++; } - + i = 0; - cstate = (Object *)childlist->mlh_Head; - while((child = NextObject(&cstate))) + cstate = (Object *) childlist->mlh_Head; + while ((child = NextObject(&cstate))) { ZText *text = NULL; - - get(child, MUIA_UserData, &text); - - SetAPen(_rp(obj), _pens(obj)[MPEN_TEXT]); - if (text) /* paranoia */ - { - zune_text_draw(text, obj, x, x + data->popitemwidth - 1, y); - } - - y += data->popitemheight; + + get(child, MUIA_UserData, &text); + + SetAPen(_rp(obj), _pens(obj)[MPEN_TEXT]); + if (text) /* paranoia */ + { + zune_text_draw(text, obj, x, x + data->popitemwidth - 1, y); + } + + y += data->popitemheight; } _rp(obj) = saverp; - + data->activepopitem = -1; - - return TRUE; - + + return TRUE; + } /************************************************************************** MUIM_HandleEvent **************************************************************************/ -IPTR Cycle__MUIM_HandleEvent(struct IClass *cl, Object *obj, struct MUIP_HandleEvent *msg) +IPTR Cycle__MUIM_HandleEvent(struct IClass *cl, Object *obj, + struct MUIP_HandleEvent *msg) { struct MUI_CycleData *data = INST_DATA(cl, obj); - BOOL fallthroughtomousemove = FALSE; - + BOOL fallthroughtomousemove = FALSE; + if (msg->muikey != MUIKEY_NONE) { - int old_active = data->popwin ? data->activepopitem : data->entries_active; - int new_active = old_active; - BOOL eat = FALSE; - - switch(msg->muikey) - { + int old_active = + data->popwin ? data->activepopitem : data->entries_active; + int new_active = old_active; + BOOL eat = FALSE; + + switch (msg->muikey) + { case MUIKEY_WINDOW_CLOSE: if (data->popwin) - { - KillPopupWin(obj, data); - eat = TRUE; - } - break; - - case MUIKEY_PRESS: - if (data->entries_num < muiGlobalInfo(obj)->mgi_Prefs->cycle_menu_min_entries) - { - /* fall through to MUIKEY_DOWN */ - } - else if (!data->popwin) - { - if (MakePopupWin(obj, data)) { - DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR)&data->ehn); - data->ehn.ehn_Events |= IDCMP_MOUSEMOVE; - DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR)&data->ehn); - eat = TRUE; - break; + KillPopupWin(obj, data); + eat = TRUE; } - else + break; + + case MUIKEY_PRESS: + if (data->entries_num < + muiGlobalInfo(obj)->mgi_Prefs->cycle_menu_min_entries) { /* fall through to MUIKEY_DOWN */ } - } - else if (data->popwin) - { - KillPopupWin(obj, data); - if (new_active != -1) + else if (!data->popwin) { - set(obj, MUIA_Cycle_Active, new_active); + if (MakePopupWin(obj, data)) + { + DoMethod(_win(obj), MUIM_Window_RemEventHandler, + (IPTR) & data->ehn); + data->ehn.ehn_Events |= IDCMP_MOUSEMOVE; + DoMethod(_win(obj), MUIM_Window_AddEventHandler, + (IPTR) & data->ehn); + eat = TRUE; + break; + } + else + { + /* fall through to MUIKEY_DOWN */ + } } - eat = TRUE; - break; - } - /* no break here, because of fall-throughs above */ - + else if (data->popwin) + { + KillPopupWin(obj, data); + if (new_active != -1) + { + set(obj, MUIA_Cycle_Active, new_active); + } + eat = TRUE; + break; + } + /* no break here, because of fall-throughs above */ + case MUIKEY_DOWN: if (new_active < data->entries_num - 1) - { - new_active++; - } - else if (!data->popwin) - { - new_active = 0; - } - - eat = TRUE; - break; - + { + new_active++; + } + else if (!data->popwin) + { + new_active = 0; + } + + eat = TRUE; + break; + case MUIKEY_UP: if (new_active) - { - new_active--; - } - else if (!data->popwin) - { - new_active = data->entries_num - 1; - } - - eat = TRUE; - break; - + { + new_active--; + } + else if (!data->popwin) + { + new_active = data->entries_num - 1; + } + + eat = TRUE; + break; + case MUIKEY_PAGEUP: case MUIKEY_TOP: new_active = 0; - eat = TRUE; - break; - + eat = TRUE; + break; + case MUIKEY_PAGEDOWN: case MUIKEY_BOTTOM: new_active = data->entries_num - 1; - eat = TRUE; - break; - } - - if (new_active != old_active) - { - if (data->popwin) - { - data->activepopitem = new_active; - - if (old_active != -1) RenderPopupItem(obj, data, old_active); - if (new_active != -1) RenderPopupItem(obj, data, new_active); - + eat = TRUE; + break; } - else + + if (new_active != old_active) { - set(obj, MUIA_Cycle_Active, new_active); + if (data->popwin) + { + data->activepopitem = new_active; + + if (old_active != -1) + RenderPopupItem(obj, data, old_active); + if (new_active != -1) + RenderPopupItem(obj, data, new_active); + + } + else + { + set(obj, MUIA_Cycle_Active, new_active); + } + } - - } - - if (eat) return MUI_EventHandlerRC_Eat; + + if (eat) + return MUI_EventHandlerRC_Eat; } - + if (!msg->imsg || - data->entries_num < muiGlobalInfo(obj)->mgi_Prefs->cycle_menu_min_entries) + data->entries_num < + muiGlobalInfo(obj)->mgi_Prefs->cycle_menu_min_entries) { return 0; } - - switch(msg->imsg->Class) + + switch (msg->imsg->Class) { - case IDCMP_MOUSEBUTTONS: - switch(msg->imsg->Code) + case IDCMP_MOUSEBUTTONS: + switch (msg->imsg->Code) { - case SELECTDOWN: - if (_between(_right(data->imgobj) + 1, msg->imsg->MouseX, _right(obj)) && - _between(_top(obj), msg->imsg->MouseY, _bottom(obj)) && - (muiAreaData(obj)->mad_Flags & MADF_CANDRAW) && - !data->popwin) + case SELECTDOWN: + if (_between(_right(data->imgobj) + 1, msg->imsg->MouseX, + _right(obj)) + && _between(_top(obj), msg->imsg->MouseY, _bottom(obj)) + && (muiAreaData(obj)->mad_Flags & MADF_CANDRAW) + && !data->popwin) { if (MakePopupWin(obj, data)) { - DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR)&data->ehn); - data->ehn.ehn_Events |= IDCMP_MOUSEMOVE; - DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR)&data->ehn); - - fallthroughtomousemove = TRUE; + DoMethod(_win(obj), MUIM_Window_RemEventHandler, + (IPTR) & data->ehn); + data->ehn.ehn_Events |= IDCMP_MOUSEMOVE; + DoMethod(_win(obj), MUIM_Window_AddEventHandler, + (IPTR) & data->ehn); + + fallthroughtomousemove = TRUE; } - break; + break; } else if (data->popwin) { @@ -716,7 +741,7 @@ IPTR Cycle__MUIM_HandleEvent(struct IClass *cl, Object *obj, struct MUIP_HandleE break; } /* no break here! */ - + case SELECTUP: case MENUUP: case MIDDLEUP: @@ -724,61 +749,65 @@ IPTR Cycle__MUIM_HandleEvent(struct IClass *cl, Object *obj, struct MUIP_HandleE if (data->popwin) { KillPopupWin(obj, data); - if ((data->activepopitem != -1) && - ((msg->imsg->Code == SELECTUP) || (msg->imsg->Code == SELECTDOWN))) - { - set(obj, MUIA_Cycle_Active, data->activepopitem); - } + if ((data->activepopitem != -1) && + ((msg->imsg->Code == SELECTUP) + || (msg->imsg->Code == SELECTDOWN))) + { + set(obj, MUIA_Cycle_Active, data->activepopitem); + } return MUI_EventHandlerRC_Eat; } break; - - - } /* switch(msg->imsg->Code) */ - + + + } + if (!fallthroughtomousemove) { break; } - + case IDCMP_MOUSEMOVE: if (data->popwin) { WORD x = data->popwin->MouseX; - WORD y = data->popwin->MouseY - data->popitemoffy; - WORD newactive = -1; - - if ((x >= 0) && (y >= 0) && - (x < data->popwin->Width) && (y < data->popitemheight * data->entries_num)) - { - newactive = y / data->popitemheight; - } - - if (newactive != data->activepopitem) - { - WORD oldactive = data->activepopitem; - - data->activepopitem = newactive; - - if (oldactive != -1) RenderPopupItem(obj, data, oldactive); - if (newactive != -1) RenderPopupItem(obj, data, newactive); - - } - + WORD y = data->popwin->MouseY - data->popitemoffy; + WORD newactive = -1; + + if ((x >= 0) && (y >= 0) && + (x < data->popwin->Width) + && (y < data->popitemheight * data->entries_num)) + { + newactive = y / data->popitemheight; + } + + if (newactive != data->activepopitem) + { + WORD oldactive = data->activepopitem; + + data->activepopitem = newactive; + + if (oldactive != -1) + RenderPopupItem(obj, data, oldactive); + if (newactive != -1) + RenderPopupItem(obj, data, newactive); + + } + return MUI_EventHandlerRC_Eat; } break; - - } /* switch(msg->imsg->Class) */ - + + } + return 0; - } /************************************************************************** MUIM_Hide **************************************************************************/ -IPTR Cycle__MUIM_Hide(struct IClass *cl, Object *obj, struct MUIP_Hide *msg) +IPTR Cycle__MUIM_Hide(struct IClass *cl, Object *obj, + struct MUIP_Hide *msg) { struct MUI_CycleData *data = INST_DATA(cl, obj); @@ -786,25 +815,24 @@ IPTR Cycle__MUIM_Hide(struct IClass *cl, Object *obj, struct MUIP_Hide *msg) { KillPopupWin(obj, data); } - - return DoSuperMethodA(cl, obj, (Msg)msg); + + return DoSuperMethodA(cl, obj, (Msg) msg); } /************************************************************************** MUIM_Export - to export an objects "contents" to a dataspace object. **************************************************************************/ -IPTR Cycle__MUIM_Export(struct IClass *cl, Object *obj, struct MUIP_Export *msg) +IPTR Cycle__MUIM_Export(struct IClass *cl, Object *obj, + struct MUIP_Export *msg) { struct MUI_CycleData *data = INST_DATA(cl, obj); ULONG id; if ((id = muiNotifyData(obj)->mnd_ObjectID)) { - LONG value = data->entries_active; - DoMethod(msg->dataspace, MUIM_Dataspace_Add, - (IPTR) &value, - sizeof(value), - (IPTR) id); + LONG value = data->entries_active; + DoMethod(msg->dataspace, MUIM_Dataspace_Add, + (IPTR) & value, sizeof(value), (IPTR) id); } return 0; } @@ -812,17 +840,19 @@ IPTR Cycle__MUIM_Export(struct IClass *cl, Object *obj, struct MUIP_Export *msg) /************************************************************************** MUIM_Import - to import an objects "contents" from a dataspace object. **************************************************************************/ -IPTR Cycle__MUIM_Import(struct IClass *cl, Object *obj, struct MUIP_Import *msg) +IPTR Cycle__MUIM_Import(struct IClass *cl, Object *obj, + struct MUIP_Import *msg) { ULONG id; LONG *s; if ((id = muiNotifyData(obj)->mnd_ObjectID)) { - if ((s = (LONG*) DoMethod(msg->dataspace, MUIM_Dataspace_Find, (IPTR) id))) - { - set(obj, MUIA_Cycle_Active, *s); - } + if ((s = (LONG *) DoMethod(msg->dataspace, MUIM_Dataspace_Find, + (IPTR) id))) + { + set(obj, MUIA_Cycle_Active, *s); + } } return 0; } @@ -831,15 +861,24 @@ BOOPSI_DISPATCHER(IPTR, Cycle_Dispatcher, cl, obj, msg) { switch (msg->MethodID) { - case OM_NEW: return Cycle__OM_NEW(cl, obj, (struct opSet *)msg); - case OM_SET: return Cycle__OM_SET(cl, obj, (struct opSet *)msg); - case OM_GET: return Cycle__OM_GET(cl, obj, (struct opGet *)msg); - case MUIM_Setup: return Cycle__MUIM_Setup(cl, obj, (APTR)msg); - case MUIM_Cleanup: return Cycle__MUIM_Cleanup(cl, obj, (APTR)msg); - case MUIM_Hide: return Cycle__MUIM_Hide(cl, obj, (APTR)msg); - case MUIM_HandleEvent: return Cycle__MUIM_HandleEvent(cl,obj,(APTR)msg); - case MUIM_Export: return Cycle__MUIM_Export(cl,obj,(APTR)msg); - case MUIM_Import: return Cycle__MUIM_Import(cl,obj,(APTR)msg); + case OM_NEW: + return Cycle__OM_NEW(cl, obj, (struct opSet *)msg); + case OM_SET: + return Cycle__OM_SET(cl, obj, (struct opSet *)msg); + case OM_GET: + return Cycle__OM_GET(cl, obj, (struct opGet *)msg); + case MUIM_Setup: + return Cycle__MUIM_Setup(cl, obj, (APTR) msg); + case MUIM_Cleanup: + return Cycle__MUIM_Cleanup(cl, obj, (APTR) msg); + case MUIM_Hide: + return Cycle__MUIM_Hide(cl, obj, (APTR) msg); + case MUIM_HandleEvent: + return Cycle__MUIM_HandleEvent(cl, obj, (APTR) msg); + case MUIM_Export: + return Cycle__MUIM_Export(cl, obj, (APTR) msg); + case MUIM_Import: + return Cycle__MUIM_Import(cl, obj, (APTR) msg); } return DoSuperMethodA(cl, obj, msg); @@ -849,9 +888,10 @@ BOOPSI_DISPATCHER_END /* * Class descriptor. */ -const struct __MUIBuiltinClass _MUI_Cycle_desc = { +const struct __MUIBuiltinClass _MUI_Cycle_desc = +{ MUIC_Cycle, - MUIC_Group, - sizeof(struct MUI_CycleData), - (void*)Cycle_Dispatcher + MUIC_Group, + sizeof(struct MUI_CycleData), + (void *) Cycle_Dispatcher }; diff --git a/workbench/libs/muimaster/classes/cycle.h b/workbench/libs/muimaster/classes/cycle.h index b063e263cc..9a79f37190 100644 --- a/workbench/libs/muimaster/classes/cycle.h +++ b/workbench/libs/muimaster/classes/cycle.h @@ -13,8 +13,8 @@ #define MUIB_Cycle (MUIB_ZUNE | 0x00000a00) /*** Attributes *************************************************************/ -#define MUIA_Cycle_Active (MUIB_MUI|0x00421788) /* MUI:V4 isg LONG */ -#define MUIA_Cycle_Entries (MUIB_MUI|0x00420629) /* MUI:V4 i.. STRPTR */ +#define MUIA_Cycle_Active (MUIB_MUI | 0x00421788) /* MUI:V4 isg LONG */ +#define MUIA_Cycle_Entries (MUIB_MUI | 0x00420629) /* MUI:V4 i.. STRPTR */ enum { diff --git a/workbench/libs/muimaster/classes/dataspace.c b/workbench/libs/muimaster/classes/dataspace.c dissimilarity index 63% index 938272f04b..73c0b6c3d3 100644 --- a/workbench/libs/muimaster/classes/dataspace.c +++ b/workbench/libs/muimaster/classes/dataspace.c @@ -1,329 +1,343 @@ -/* - Copyright © 2002-2006, The AROS Development Team. All rights reserved. - $Id$ -*/ - -#include <stdlib.h> -#include <string.h> - -#include <exec/types.h> -#include <clib/alib_protos.h> -#include <proto/exec.h> -#include <proto/intuition.h> -#include <proto/utility.h> -#include <proto/iffparse.h> -#include <proto/muimaster.h> - -#include "muimaster_intern.h" -#include "mui.h" -#include "support.h" - -extern struct Library *MUIMasterBase; - -struct Dataspace_Node -{ - struct MinNode node; - ULONG id; - ULONG len; - /* len bytes data follows */ -}; - -struct MUI_DataspaceData -{ - /* We store this as a linear list, but it has O(n) when looking - ** for an entry which is bad, because the is the most fequently used - ** operation. - */ - struct MinList list; - APTR pool; - APTR pool_allocated; - APTR current_pool; -}; - -IPTR Dataspace__OM_NEW (struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct MUI_DataspaceData *data; - struct TagItem *tags,*tag; - - obj = (Object *)DoSuperMethodA(cl, obj, (Msg)msg); - if (!obj) - return FALSE; - - data = INST_DATA(cl, obj); - - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) - { - switch (tag->ti_Tag) - { - case MUIA_Dataspace_Pool: - data->pool = (APTR)tag->ti_Data; - break; - } - } - - NewList((struct List*)&data->list); - - if (!data->pool) - { - if (!(data->pool_allocated = CreatePool(0,4096,4096))) - { - CoerceMethod(cl,obj,OM_DISPOSE); - return (IPTR)NULL; - } - data->current_pool = data->pool_allocated; - } - else - { - data->current_pool = data->pool; - } - - return (IPTR)obj; -} - - -IPTR Dataspace__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) -{ - struct MUI_DataspaceData *data = INST_DATA(cl, obj); - if (data->pool_allocated) DeletePool(data->pool_allocated); - else CoerceMethod(cl,obj,MUIM_Dataspace_Clear); - return DoSuperMethodA(cl, obj, msg); -} - -IPTR Dataspace__MUIM_Add(struct IClass *cl, Object *obj, struct MUIP_Dataspace_Add *msg) -{ - struct MUI_DataspaceData *data = INST_DATA(cl, obj); - struct Dataspace_Node *replace; - struct Dataspace_Node *node; - - if (NULL == msg->data || msg->len < 1 || msg->id < 1) - return 0; - - node = (struct Dataspace_Node*)AllocVecPooled(data->current_pool, - sizeof(struct Dataspace_Node)+msg->len); - if (NULL == node) - { - return 0; - } - - replace = List_First(&data->list); - while (replace) - { - if (replace->id == msg->id) - { - Remove((struct Node*)replace); - FreeVecPooled(data->current_pool, replace); - break; - } - replace = Node_Next(replace); - } - - AddTail((struct List*)&data->list,(struct Node*)node); - node->id = msg->id; - node->len = msg->len; - CopyMem(msg->data, node + 1, node->len); - return 1; -} - -IPTR Dataspace__MUIM_Clear(struct IClass *cl, Object *obj, struct MUIP_Dataspace_Clear *msg) -{ - struct MUI_DataspaceData *data = INST_DATA(cl, obj); - struct Dataspace_Node *node; - - node = List_First(&data->list); - while (node) - { - struct Dataspace_Node *tmp = node; - node = Node_Next(node); - - FreeVecPooled(data->current_pool, tmp); - } - - return 1; -} - -IPTR Dataspace__MUIM_Find(struct IClass *cl, Object *obj, struct MUIP_Dataspace_Find *msg) -{ - struct MUI_DataspaceData *data = INST_DATA(cl, obj); - struct Dataspace_Node *find; - - find = List_First(&data->list); - while (find) - { - if (find->id == msg->id) - { - return (IPTR)(find + 1); - } - find = Node_Next(find); - } - - return (IPTR)NULL; -} - -IPTR Dataspace__MUIM_Merge(struct IClass *cl, Object *obj, struct MUIP_Dataspace_Merge *msg) -{ - return 1; -} - -IPTR Dataspace__MUIM_Remove(struct IClass *cl, Object *obj, struct MUIP_Dataspace_Remove *msg) -{ - struct MUI_DataspaceData *data = INST_DATA(cl, obj); - struct Dataspace_Node *node; - - node = List_First(&data->list); - while (node) - { - if (node->id == msg->id) - { - Remove((struct Node*)node); - FreeVecPooled(data->current_pool, node); - return 1; - } - node = Node_Next(node); - } - - return 0; -} - -IPTR Dataspace__MUIM_ReadIFF(struct IClass *cl, Object *obj, struct MUIP_Dataspace_ReadIFF *msg) -{ - struct ContextNode *cn; - UBYTE *buffer, *p; - LONG read; - - LONG len; - ULONG id; - - cn = CurrentChunk(msg->handle); - if (!cn) - { - return IFFERR_EOF; - } - if (!(buffer = AllocVec(cn->cn_Size,0))) - { - return IFFERR_NOMEM; - } - read = ReadChunkBytes(msg->handle,buffer,cn->cn_Size); - if (read < 0) - { - FreeVec(buffer); - return read; - } - - p = buffer; - - while (p < buffer + read) - { - /* Since data can be stored on uneven addresses we must read - ** them byte by byte as MC68000 doesn't like this - */ - id = (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]; - p+=4; - len = (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]; - p+=4; - - /* p might be uneven but MUIM_Dataspace_Add use CopyMem() */ - - /* Now add the data */ - DoMethod(obj, MUIM_Dataspace_Add, (IPTR)p, len, id); - p += len; - } - FreeVec(buffer); - return 0; -} - -IPTR Dataspace__MUIM_WriteIFF(struct IClass *cl, Object *obj, struct MUIP_Dataspace_WriteIFF *msg) -{ - struct MUI_DataspaceData *data = INST_DATA(cl, obj); - struct Dataspace_Node *iter; - LONG rc; - - if ((rc = PushChunk(msg->handle,msg->type,msg->id,IFFSIZE_UNKNOWN))) return rc; - - iter = List_First(&data->list); - while (iter) - { - ULONG len = iter->len+8; - /* Data is stored in big-endian whatever your machine. - * Be sure sure to convert data to big endian. - */ - iter->id = AROS_LONG2BE(iter->id); - iter->len = AROS_LONG2BE(iter->len); - rc = WriteChunkBytes(msg->handle, &iter->id, len); /* ID - LEN - DATA */ - iter->id = AROS_LONG2BE(iter->id); - iter->len = AROS_LONG2BE(iter->len); - if (rc < 0) - { - return rc; - } - iter = Node_Next(iter); - } - if ((rc = PopChunk(msg->handle))) return rc; - return 0; -} - - -BOOPSI_DISPATCHER(IPTR, Dataspace_Dispatcher, cl, obj, msg) -{ - IPTR res; - - switch (msg->MethodID) - { - /* Whenever an object shall be created using NewObject(), it will be - ** sent a OM_NEW method. - */ - case OM_NEW: return Dataspace__OM_NEW(cl, obj, (struct opSet *) msg); - case OM_DISPOSE: return Dataspace__OM_DISPOSE(cl, obj, msg); - case MUIM_Dataspace_Add: - DoMethod(obj, MUIM_Semaphore_Obtain); - res = Dataspace__MUIM_Add(cl, obj, (APTR)msg); - DoMethod(obj, MUIM_Semaphore_Release); - return res; - case MUIM_Dataspace_Clear: - DoMethod(obj, MUIM_Semaphore_Obtain); - res = Dataspace__MUIM_Clear(cl, obj, (APTR)msg); - DoMethod(obj, MUIM_Semaphore_Release); - return res; - case MUIM_Dataspace_Find: - DoMethod(obj, MUIM_Semaphore_ObtainShared); - res = Dataspace__MUIM_Find(cl, obj, (APTR)msg); - DoMethod(obj, MUIM_Semaphore_Release); - /* now that sem is released, imagine that the object gets freed ... - * it really needs that the caller locks the object, - * and release it when done with the result - */ - return res; - case MUIM_Dataspace_Merge: - DoMethod(obj, MUIM_Semaphore_Obtain); - res = Dataspace__MUIM_Merge(cl, obj, (APTR)msg); - DoMethod(obj, MUIM_Semaphore_Release); - return res; - case MUIM_Dataspace_Remove: - DoMethod(obj, MUIM_Semaphore_Obtain); - res = Dataspace__MUIM_Remove(cl, obj, (APTR)msg); - DoMethod(obj, MUIM_Semaphore_Release); - return res; - case MUIM_Dataspace_ReadIFF: - DoMethod(obj, MUIM_Semaphore_Obtain); - res = (IPTR)Dataspace__MUIM_ReadIFF(cl, obj, (APTR)msg); - DoMethod(obj, MUIM_Semaphore_Release); - return res; - case MUIM_Dataspace_WriteIFF: - DoMethod(obj, MUIM_Semaphore_Obtain); - res = (IPTR)Dataspace__MUIM_WriteIFF(cl, obj, (APTR)msg); - DoMethod(obj, MUIM_Semaphore_Release); - return res; - } - - return DoSuperMethodA(cl, obj, msg); -} -BOOPSI_DISPATCHER_END - -/* - * Class descriptor. - */ -const struct __MUIBuiltinClass _MUI_Dataspace_desc = { - MUIC_Dataspace, /* Class name */ - MUIC_Semaphore, /* super class name */ - sizeof(struct MUI_DataspaceData), /* size of class own datas */ - (void*)Dataspace_Dispatcher /* class dispatcher */ -}; +/* + Copyright © 2002-2006, The AROS Development Team. All rights reserved. + $Id$ +*/ + +#include <stdlib.h> +#include <string.h> + +#include <exec/types.h> +#include <clib/alib_protos.h> +#include <proto/exec.h> +#include <proto/intuition.h> +#include <proto/utility.h> +#include <proto/iffparse.h> +#include <proto/muimaster.h> + +#include "muimaster_intern.h" +#include "mui.h" +#include "support.h" + +extern struct Library *MUIMasterBase; + +struct Dataspace_Node +{ + struct MinNode node; + ULONG id; + ULONG len; + /* len bytes data follows */ +}; + +struct MUI_DataspaceData +{ + /* We store this as a linear list, but it has O(n) when looking + ** for an entry which is bad, because the is the most fequently used + ** operation. + */ + struct MinList list; + APTR pool; + APTR pool_allocated; + APTR current_pool; +}; + +IPTR Dataspace__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) +{ + struct MUI_DataspaceData *data; + struct TagItem *tags, *tag; + + obj = (Object *) DoSuperMethodA(cl, obj, (Msg) msg); + if (!obj) + return FALSE; + + data = INST_DATA(cl, obj); + + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) + { + switch (tag->ti_Tag) + { + case MUIA_Dataspace_Pool: + data->pool = (APTR) tag->ti_Data; + break; + } + } + + NewList((struct List *)&data->list); + + if (!data->pool) + { + if (!(data->pool_allocated = CreatePool(0, 4096, 4096))) + { + CoerceMethod(cl, obj, OM_DISPOSE); + return (IPTR) NULL; + } + data->current_pool = data->pool_allocated; + } + else + { + data->current_pool = data->pool; + } + + return (IPTR) obj; +} + + +IPTR Dataspace__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) +{ + struct MUI_DataspaceData *data = INST_DATA(cl, obj); + if (data->pool_allocated) + DeletePool(data->pool_allocated); + else + CoerceMethod(cl, obj, MUIM_Dataspace_Clear); + return DoSuperMethodA(cl, obj, msg); +} + +IPTR Dataspace__MUIM_Add(struct IClass *cl, Object *obj, + struct MUIP_Dataspace_Add *msg) +{ + struct MUI_DataspaceData *data = INST_DATA(cl, obj); + struct Dataspace_Node *replace; + struct Dataspace_Node *node; + + if (NULL == msg->data || msg->len < 1 || msg->id < 1) + return 0; + + node = (struct Dataspace_Node *)AllocVecPooled(data->current_pool, + sizeof(struct Dataspace_Node) + msg->len); + if (NULL == node) + { + return 0; + } + + replace = List_First(&data->list); + while (replace) + { + if (replace->id == msg->id) + { + Remove((struct Node *)replace); + FreeVecPooled(data->current_pool, replace); + break; + } + replace = Node_Next(replace); + } + + AddTail((struct List *)&data->list, (struct Node *)node); + node->id = msg->id; + node->len = msg->len; + CopyMem(msg->data, node + 1, node->len); + return 1; +} + +IPTR Dataspace__MUIM_Clear(struct IClass *cl, Object *obj, + struct MUIP_Dataspace_Clear *msg) +{ + struct MUI_DataspaceData *data = INST_DATA(cl, obj); + struct Dataspace_Node *node; + + node = List_First(&data->list); + while (node) + { + struct Dataspace_Node *tmp = node; + node = Node_Next(node); + + FreeVecPooled(data->current_pool, tmp); + } + + return 1; +} + +IPTR Dataspace__MUIM_Find(struct IClass *cl, Object *obj, + struct MUIP_Dataspace_Find *msg) +{ + struct MUI_DataspaceData *data = INST_DATA(cl, obj); + struct Dataspace_Node *find; + + find = List_First(&data->list); + while (find) + { + if (find->id == msg->id) + { + return (IPTR) (find + 1); + } + find = Node_Next(find); + } + + return (IPTR) NULL; +} + +IPTR Dataspace__MUIM_Merge(struct IClass *cl, Object *obj, + struct MUIP_Dataspace_Merge *msg) +{ + return 1; +} + +IPTR Dataspace__MUIM_Remove(struct IClass *cl, Object *obj, + struct MUIP_Dataspace_Remove *msg) +{ + struct MUI_DataspaceData *data = INST_DATA(cl, obj); + struct Dataspace_Node *node; + + node = List_First(&data->list); + while (node) + { + if (node->id == msg->id) + { + Remove((struct Node *)node); + FreeVecPooled(data->current_pool, node); + return 1; + } + node = Node_Next(node); + } + + return 0; +} + +IPTR Dataspace__MUIM_ReadIFF(struct IClass *cl, Object *obj, + struct MUIP_Dataspace_ReadIFF *msg) +{ + struct ContextNode *cn; + UBYTE *buffer, *p; + LONG read; + + LONG len; + ULONG id; + + cn = CurrentChunk(msg->handle); + if (!cn) + { + return IFFERR_EOF; + } + if (!(buffer = AllocVec(cn->cn_Size, 0))) + { + return IFFERR_NOMEM; + } + read = ReadChunkBytes(msg->handle, buffer, cn->cn_Size); + if (read < 0) + { + FreeVec(buffer); + return read; + } + + p = buffer; + + while (p < buffer + read) + { + /* Since data can be stored on uneven addresses we must read + ** them byte by byte as MC68000 doesn't like this + */ + id = (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]; + p += 4; + len = (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]; + p += 4; + + /* p might be uneven but MUIM_Dataspace_Add use CopyMem() */ + + /* Now add the data */ + DoMethod(obj, MUIM_Dataspace_Add, (IPTR) p, len, id); + p += len; + } + FreeVec(buffer); + return 0; +} + +IPTR Dataspace__MUIM_WriteIFF(struct IClass *cl, Object *obj, + struct MUIP_Dataspace_WriteIFF *msg) +{ + struct MUI_DataspaceData *data = INST_DATA(cl, obj); + struct Dataspace_Node *iter; + LONG rc; + + if ((rc = PushChunk(msg->handle, msg->type, msg->id, IFFSIZE_UNKNOWN))) + return rc; + + iter = List_First(&data->list); + while (iter) + { + ULONG len = iter->len + 8; + /* Data is stored in big-endian whatever your machine. + * Be sure sure to convert data to big endian. + */ + iter->id = AROS_LONG2BE(iter->id); + iter->len = AROS_LONG2BE(iter->len); + rc = WriteChunkBytes(msg->handle, &iter->id, len); /* ID - LEN - DATA */ + iter->id = AROS_LONG2BE(iter->id); + iter->len = AROS_LONG2BE(iter->len); + if (rc < 0) + { + return rc; + } + iter = Node_Next(iter); + } + if ((rc = PopChunk(msg->handle))) + return rc; + return 0; +} + + +BOOPSI_DISPATCHER(IPTR, Dataspace_Dispatcher, cl, obj, msg) +{ + IPTR res; + + switch (msg->MethodID) + { + /* Whenever an object shall be created using NewObject(), it will be + ** sent a OM_NEW method. + */ + case OM_NEW: + return Dataspace__OM_NEW(cl, obj, (struct opSet *)msg); + case OM_DISPOSE: + return Dataspace__OM_DISPOSE(cl, obj, msg); + case MUIM_Dataspace_Add: + DoMethod(obj, MUIM_Semaphore_Obtain); + res = Dataspace__MUIM_Add(cl, obj, (APTR) msg); + DoMethod(obj, MUIM_Semaphore_Release); + return res; + case MUIM_Dataspace_Clear: + DoMethod(obj, MUIM_Semaphore_Obtain); + res = Dataspace__MUIM_Clear(cl, obj, (APTR) msg); + DoMethod(obj, MUIM_Semaphore_Release); + return res; + case MUIM_Dataspace_Find: + DoMethod(obj, MUIM_Semaphore_ObtainShared); + res = Dataspace__MUIM_Find(cl, obj, (APTR) msg); + DoMethod(obj, MUIM_Semaphore_Release); + /* now that sem is released, imagine that the object gets freed ... + * it really needs that the caller locks the object, + * and release it when done with the result + */ + return res; + case MUIM_Dataspace_Merge: + DoMethod(obj, MUIM_Semaphore_Obtain); + res = Dataspace__MUIM_Merge(cl, obj, (APTR) msg); + DoMethod(obj, MUIM_Semaphore_Release); + return res; + case MUIM_Dataspace_Remove: + DoMethod(obj, MUIM_Semaphore_Obtain); + res = Dataspace__MUIM_Remove(cl, obj, (APTR) msg); + DoMethod(obj, MUIM_Semaphore_Release); + return res; + case MUIM_Dataspace_ReadIFF: + DoMethod(obj, MUIM_Semaphore_Obtain); + res = (IPTR) Dataspace__MUIM_ReadIFF(cl, obj, (APTR) msg); + DoMethod(obj, MUIM_Semaphore_Release); + return res; + case MUIM_Dataspace_WriteIFF: + DoMethod(obj, MUIM_Semaphore_Obtain); + res = (IPTR) Dataspace__MUIM_WriteIFF(cl, obj, (APTR) msg); + DoMethod(obj, MUIM_Semaphore_Release); + return res; + } + + return DoSuperMethodA(cl, obj, msg); +} +BOOPSI_DISPATCHER_END + +/* + * Class descriptor. + */ +const struct __MUIBuiltinClass _MUI_Dataspace_desc = +{ + MUIC_Dataspace, /* Class name */ + MUIC_Semaphore, /* super class name */ + sizeof(struct MUI_DataspaceData), /* size of class own datas */ + (void *) Dataspace_Dispatcher /* class dispatcher */ +}; diff --git a/workbench/libs/muimaster/classes/dataspace.h b/workbench/libs/muimaster/classes/dataspace.h dissimilarity index 67% index e40ee29713..7c97a9e41a 100644 --- a/workbench/libs/muimaster/classes/dataspace.h +++ b/workbench/libs/muimaster/classes/dataspace.h @@ -1,38 +1,76 @@ -#ifndef _MUI_CLASSES_DATASPACE_H -#define _MUI_CLASSES_DATASPACE_H - -/* - Copyright © 2002-2003, The AROS Development Team. All rights reserved. - $Id$ -*/ - -/*** Name *******************************************************************/ -#define MUIC_Dataspace "Dataspace.mui" - -/*** Identifier base (for Zune extensions) **********************************/ -#define MUIB_Dataspace (MUIB_ZUNE | 0x00000b00) - - -/*** Methods ****************************************************************/ -#define MUIM_Dataspace_Add (MUIB_MUI|0x00423366) /* MUI: V11 */ -#define MUIM_Dataspace_Clear (MUIB_MUI|0x0042b6c9) /* MUI: V11 */ -#define MUIM_Dataspace_Find (MUIB_MUI|0x0042832c) /* MUI: V11 */ -#define MUIM_Dataspace_Merge (MUIB_MUI|0x00423e2b) /* MUI: V11 */ -#define MUIM_Dataspace_ReadIFF (MUIB_MUI|0x00420dfb) /* MUI: V11 */ -#define MUIM_Dataspace_Remove (MUIB_MUI|0x0042dce1) /* MUI: V11 */ -#define MUIM_Dataspace_WriteIFF (MUIB_MUI|0x00425e8e) /* MUI: V11 */ -struct MUIP_Dataspace_Add {STACKED ULONG MethodID; STACKED APTR data; STACKED LONG len; STACKED ULONG id;}; -struct MUIP_Dataspace_Clear {STACKED ULONG MethodID;}; -struct MUIP_Dataspace_Find {STACKED ULONG MethodID; STACKED ULONG id;}; -struct MUIP_Dataspace_Merge {STACKED ULONG MethodID; STACKED Object *dataspace;}; -struct MUIP_Dataspace_ReadIFF {STACKED ULONG MethodID; STACKED struct IFFHandle *handle;}; -struct MUIP_Dataspace_Remove {STACKED ULONG MethodID; STACKED ULONG id;}; -struct MUIP_Dataspace_WriteIFF {STACKED ULONG MethodID; STACKED struct IFFHandle *handle; STACKED ULONG type; STACKED ULONG id;}; - -/*** Attributes *************************************************************/ -#define MUIA_Dataspace_Pool (MUIB_MUI|0x00424cf9) /* MUI: V11 i.. APTR */ - - -extern const struct __MUIBuiltinClass _MUI_Dataspace_desc; /* PRIV */ - -#endif /* _MUI_CLASSES_DATASPACE_H */ +#ifndef _MUI_CLASSES_DATASPACE_H +#define _MUI_CLASSES_DATASPACE_H + +/* + Copyright © 2002-2003, The AROS Development Team. All rights reserved. + $Id$ +*/ + +/*** Name *******************************************************************/ +#define MUIC_Dataspace "Dataspace.mui" + +/*** Identifier base (for Zune extensions) **********************************/ +#define MUIB_Dataspace (MUIB_ZUNE | 0x00000b00) + + +/*** Methods ****************************************************************/ +#define MUIM_Dataspace_Add (MUIB_MUI | 0x00423366) /* MUI: V11 */ +#define MUIM_Dataspace_Clear (MUIB_MUI | 0x0042b6c9) /* MUI: V11 */ +#define MUIM_Dataspace_Find (MUIB_MUI | 0x0042832c) /* MUI: V11 */ +#define MUIM_Dataspace_Merge (MUIB_MUI | 0x00423e2b) /* MUI: V11 */ +#define MUIM_Dataspace_ReadIFF (MUIB_MUI | 0x00420dfb) /* MUI: V11 */ +#define MUIM_Dataspace_Remove (MUIB_MUI | 0x0042dce1) /* MUI: V11 */ +#define MUIM_Dataspace_WriteIFF (MUIB_MUI | 0x00425e8e) /* MUI: V11 */ + +struct MUIP_Dataspace_Add +{ + STACKED ULONG MethodID; + STACKED APTR data; + STACKED LONG len; + STACKED ULONG id; +}; + +struct MUIP_Dataspace_Clear +{ + STACKED ULONG MethodID; +}; + +struct MUIP_Dataspace_Find +{ + STACKED ULONG MethodID; + STACKED ULONG id; +}; + +struct MUIP_Dataspace_Merge +{ + STACKED ULONG MethodID; + STACKED Object *dataspace; +}; + +struct MUIP_Dataspace_ReadIFF +{ + STACKED ULONG MethodID; + STACKED struct IFFHandle *handle; +}; + +struct MUIP_Dataspace_Remove +{ + STACKED ULONG MethodID; + STACKED ULONG id; +}; + +struct MUIP_Dataspace_WriteIFF +{ + STACKED ULONG MethodID; + STACKED struct IFFHandle *handle; + STACKED ULONG type; + STACKED ULONG id; +}; + +/*** Attributes *************************************************************/ +#define MUIA_Dataspace_Pool (MUIB_MUI | 0x00424cf9) /* MUI: V11 i.. APTR */ + + +extern const struct __MUIBuiltinClass _MUI_Dataspace_desc; /* PRIV */ + +#endif /* _MUI_CLASSES_DATASPACE_H */ diff --git a/workbench/libs/muimaster/classes/dirlist.c b/workbench/libs/muimaster/classes/dirlist.c dissimilarity index 79% index 309536b9c3..3ab04e5052 100644 --- a/workbench/libs/muimaster/classes/dirlist.c +++ b/workbench/libs/muimaster/classes/dirlist.c @@ -1,523 +1,548 @@ -/* - Copyright © 2002-2006, The AROS Development Team. All rights reserved. - $Id$ -*/ - -#define MUIMASTER_YES_INLINE_STDARG - -#include <exec/memory.h> -#include <dos/exall.h> -#include <dos/datetime.h> -#include <clib/alib_protos.h> -#include <proto/exec.h> -#include <proto/dos.h> -#include <proto/intuition.h> -#include <proto/utility.h> -#include <proto/muimaster.h> - -#include <string.h> -#include <stdio.h> - -#include "mui.h" -#include "muimaster_intern.h" -#include "support.h" -#include "support_classes.h" -#include "dirlist_private.h" - -extern struct Library *MUIMasterBase; - -AROS_UFH3S(APTR, construct_func, -AROS_UFHA(struct Hook *, hook, A0), -AROS_UFHA(APTR, pool, A2), -AROS_UFHA(struct Dirlist_Entry *, entry, A1)) -{ - AROS_USERFUNC_INIT - - struct Dirlist_Entry *new; - - if ((new = AllocPooled(pool, sizeof(*new)))) - { - *new = *entry; - } - return new; - - AROS_USERFUNC_EXIT -} - -AROS_UFH3S(void, destruct_func, -AROS_UFHA(struct Hook *, hook, A0), -AROS_UFHA(APTR, pool, A2), -AROS_UFHA(struct Dirlist_Entry *, entry, A1)) -{ - AROS_USERFUNC_INIT - - FreePooled(pool, entry, sizeof(struct Dirlist_Entry)); - - AROS_USERFUNC_EXIT -} - -AROS_UFH3S(LONG, display_func, -AROS_UFHA(struct Hook *, hook, A0), -AROS_UFHA(char **, array, A2), -AROS_UFHA(struct Dirlist_Entry *, entry, A1)) -{ - AROS_USERFUNC_INIT - - struct Dirlist_DATA *data = hook->h_Data; - struct DateTime dt; - - /* MUI: name | size | Date | Time | Protection | Comment */ - if (entry) - { - *array++ = entry->fib.fib_FileName; - - if (entry->fib.fib_DirEntryType > 0) - { - *array++ = "\33I[6:22]"; - } - else - { - snprintf(data->size_string, sizeof(data->size_string), "%ld", (long)entry->fib.fib_Size); - *array++ = data->size_string; - } - - dt.dat_Stamp = entry->fib.fib_Date; - dt.dat_Format = FORMAT_DOS; - dt.dat_Flags = 0; - dt.dat_StrDay = NULL; - dt.dat_StrDate = data->date_string; - dt.dat_StrTime = data->time_string; - - DateToStr(&dt); - - *array++ = data->date_string; - *array++ = data->time_string; - - data->prot_string[0] = (entry->fib.fib_Protection & FIBF_SCRIPT) ? 's' : '-'; - data->prot_string[1] = (entry->fib.fib_Protection & FIBF_PURE) ? 'p' : '-'; - data->prot_string[2] = (entry->fib.fib_Protection & FIBF_ARCHIVE) ? 'a' : '-'; - data->prot_string[3] = (entry->fib.fib_Protection & FIBF_READ) ? '-' : 'r'; - data->prot_string[4] = (entry->fib.fib_Protection & FIBF_WRITE) ? '-' : 'w'; - data->prot_string[5] = (entry->fib.fib_Protection & FIBF_EXECUTE) ? '-' : 'e'; - data->prot_string[6] = (entry->fib.fib_Protection & FIBF_DELETE ) ? '-' : 'd'; - data->prot_string[7] = '\0'; - - *array++ = data->prot_string; - *array = entry->fib.fib_Comment; - } - else - { - *array++ = "Name"; - *array++ = "Size"; - *array++ = "Date"; - *array++ = "Time"; - *array++ = "Flags"; - *array = "Comment"; - } - - return 0; - - AROS_USERFUNC_EXIT -} - -IPTR Dirlist__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg); - -IPTR Dirlist__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) -{ - STRPTR format = (STRPTR)GetTagData(MUIA_List_Format, 0, msg->ops_AttrList); - - obj = (Object *)DoSuperNewTags - ( - cl, obj, NULL, - format ? TAG_IGNORE : MUIA_List_Format, (IPTR)",P=\33r,,,,", - TAG_MORE, (IPTR) msg->ops_AttrList - ); - - if (obj) - { - struct Dirlist_DATA *data = INST_DATA(cl, obj); - - data->status = MUIV_Dirlist_Status_Invalid; - - data->construct_hook.h_Entry = (HOOKFUNC)construct_func; - data->destruct_hook.h_Entry = (HOOKFUNC)destruct_func; - data->display_hook.h_Entry = (HOOKFUNC)display_func; - data->display_hook.h_Data = data; - - SetAttrs(obj, MUIA_List_ConstructHook, (IPTR)&data->construct_hook, - MUIA_List_DestructHook, (IPTR)&data->destruct_hook, - MUIA_List_DisplayHook, (IPTR)&data->display_hook, - TAG_DONE); - - Dirlist__OM_SET(cl, obj, msg); - } - - return (IPTR)obj; -} - -IPTR Dirlist__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) -{ - struct Dirlist_DATA *data = INST_DATA(cl, obj); - - FreeVec(data->path); - - return DoSuperMethodA(cl, obj, msg); -} - -static void ReadDirectory(Object *obj, struct Dirlist_DATA *data) -{ - struct FileInfoBlock *fib; - BPTR lock; - - if ((fib = AllocDosObject(DOS_FIB, NULL))) - { - if ((lock = Lock(data->directory, SHARED_LOCK))) - { - BOOL success; - - success = Examine(lock, fib); - - if (success && (fib->fib_DirEntryType > 0)) - { - for(;;) - { - BOOL isdir; - - success = ExNext(lock, fib); - - if (!success) - { - if (IoErr() == ERROR_NO_MORE_ENTRIES) success = TRUE; - - break; - } - - isdir = (fib->fib_DirEntryType > 0); - - if (data->filterhook) - { - struct ExAllData ead = {0}; - - ead.ed_Name = fib->fib_FileName; - ead.ed_Type = fib->fib_DirEntryType; - ead.ed_Size = fib->fib_Size; - ead.ed_Prot = fib->fib_Protection; - ead.ed_Days = fib->fib_Date.ds_Days; - ead.ed_Mins = fib->fib_Date.ds_Minute; - ead.ed_Ticks = fib->fib_Date.ds_Tick; - ead.ed_Comment = fib->fib_Comment; - - if (!CallHookPkt(data->filterhook, obj, &ead)) continue; - } - else - { - if (isdir && data->filesonly) continue; - if (!isdir && data->drawersonly) continue; - - if (data->rejecticons) - { - WORD len = strlen(fib->fib_FileName); - - if (len >= 5) - { - if (stricmp(fib->fib_FileName + len - 5, ".info") == 0) continue; - } - } - - if (!isdir || data->filterdrawers) - { - if (data->acceptpattern) - { - if (!MatchPatternNoCase(data->acceptpattern, fib->fib_FileName)) continue; - } - - if (data->rejectpattern) - { - if (MatchPatternNoCase(data->rejectpattern, fib->fib_FileName)) continue; - } - } - - if (isdir) - { - set(obj, MUIA_Dirlist_NumDrawers, ++data->numdrawers); - } - else - { - set(obj, MUIA_Dirlist_NumFiles, ++data->numfiles); - set(obj, MUIA_Dirlist_NumBytes, data->numbytes + fib->fib_Size); - } - - DoMethod(obj, MUIM_List_InsertSingle, (IPTR)fib, MUIV_List_Insert_Bottom); - - } /* no filterhook */ - - } /* for(;;) */ - - set(obj, MUIA_Dirlist_Status, MUIV_Dirlist_Status_Valid); - - - } /* if (success && (fib->fib_DirEntryType > 0)) */ - - UnLock(lock); - - } /* if ((lock = Lock(data->directory, SHARED_LOCK))) */ - FreeDosObject(DOS_FIB, fib); - - } /* if ((fib = AllocDosObject(DOS_FIB, NULL))) */ -} - -IPTR Dirlist__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct Dirlist_DATA *data = INST_DATA(cl, obj); - struct TagItem *tag, *tags; - BOOL directory_changed = FALSE; - - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) - { - IPTR tidata = tag->ti_Data; - - switch (tag->ti_Tag) - { - - case MUIA_Dirlist_AcceptPattern: - data->acceptpattern = (STRPTR)tidata; - break; - - case MUIA_Dirlist_Directory: - data->directory = (STRPTR)tidata; - directory_changed = TRUE; - break; - - case MUIA_Dirlist_DrawersOnly: - data->drawersonly = tidata ? TRUE : FALSE; - break; - - case MUIA_Dirlist_FilesOnly: - data->filesonly = tidata ? TRUE : FALSE; - break; - - case MUIA_Dirlist_FilterDrawers: - data->filterdrawers = tidata ? TRUE : FALSE; - break; - - case MUIA_Dirlist_FilterHook: - data->filterhook = (struct Hook *)tidata; - break; - - case MUIA_Dirlist_MultiSelDirs: - data->multiseldirs = tidata ? TRUE : FALSE; - break; - - case MUIA_Dirlist_RejectIcons: - data->rejecticons = tidata ? TRUE : FALSE; - break; - - case MUIA_Dirlist_RejectPattern: - data->rejectpattern = (STRPTR)tidata; - break; - - case MUIA_Dirlist_SortDirs: - data->sortdirs = tidata ? TRUE : FALSE; - break; - - case MUIA_Dirlist_SortHighLow: - data->sorthighlow = tidata ? TRUE : FALSE; - break; - - case MUIA_Dirlist_SortType: - data->sorttype = tidata; - break; - - case MUIA_Dirlist_Status: - data->status = tidata; - break; - - } /* switch (tag->ti_Tag) */ - - } /* for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) */ - - if (directory_changed) - { - if (data->status == MUIV_Dirlist_Status_Valid) - { - DoMethod(obj, MUIM_List_Clear); - - SetAttrs(obj, MUIA_Dirlist_Status , MUIV_Dirlist_Status_Invalid, - MUIA_Dirlist_NumBytes , 0 , - MUIA_Dirlist_NumFiles , 0 , - MUIA_Dirlist_NumDrawers, 0 , - TAG_DONE ); - - } - - if (data->directory) - { - ReadDirectory(obj, data); - } - - } - - return (msg->MethodID == OM_SET) ? DoSuperMethodA(cl, obj, (Msg)msg) : 0; - -} - -IPTR Dirlist__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) -{ - struct Dirlist_DATA *data = INST_DATA(cl, obj); - - #define STORE *(msg->opg_Storage) - - switch(msg->opg_AttrID) - { - case MUIA_Dirlist_AcceptPattern: - STORE = (IPTR)data->acceptpattern; - return 1; - - case MUIA_Dirlist_Directory: - STORE = (IPTR)data->directory; - return 1; - - case MUIA_Dirlist_DrawersOnly: - STORE = data->drawersonly; - return 1; - - case MUIA_Dirlist_FilesOnly: - STORE = data->filesonly; - return 1; - - case MUIA_Dirlist_FilterDrawers: - STORE = data->filterdrawers; - return 1; - - case MUIA_Dirlist_FilterHook: - STORE = (IPTR)data->filterhook; - return 1; - - case MUIA_Dirlist_MultiSelDirs: - STORE = data->multiseldirs; - return 1; - - case MUIA_Dirlist_NumBytes: - STORE = data->numbytes; - return 1; - - case MUIA_Dirlist_NumFiles: - STORE = data->numfiles; - return 1; - - case MUIA_Dirlist_NumDrawers: - STORE = data->numdrawers; - return 1; - - case MUIA_Dirlist_Path: - if (data->path) - { - FreeVec(data->path); - data->path = NULL; - } - - STORE = 0; - - if (data->status == MUIV_Dirlist_Status_Valid) - { - struct FileInfoBlock *fib; - - DoMethod(obj, MUIM_List_GetEntry, MUIV_List_GetEntry_Active, &fib); - - if (fib) - { - WORD len = strlen(fib->fib_FileName) + strlen(data->directory) + 3; - - data->path = AllocVec(len, MEMF_ANY); - if (data->path) - { - strcpy(data->path, data->directory); - if (AddPart(data->path, fib->fib_FileName, len)) - { - STORE = (IPTR)data->path; - } - } - } - } - return 1; - - case MUIA_Dirlist_RejectIcons: - STORE = data->rejecticons; - return 1; - - case MUIA_Dirlist_RejectPattern: - STORE = (IPTR)data->rejectpattern; - return 1; - - case MUIA_Dirlist_SortDirs: - STORE = data->sortdirs; - return 1; - - case MUIA_Dirlist_SortHighLow: - STORE = data->sorthighlow; - return 1; - - case MUIA_Dirlist_SortType: - STORE = data->sorttype; - return 1; - - case MUIA_Dirlist_Status: - STORE = data->status; - return 1; - - } - - return DoSuperMethodA(cl, obj, (Msg)msg); - -} - - -IPTR Dirlist__MUIM_Dirlist_ReRead(struct IClass *cl, Object *obj, struct MUIP_Dirlist_ReRead *msg) -{ - struct Dirlist_DATA *data = INST_DATA(cl, obj); - - set(obj, MUIA_List_Quiet, TRUE); - if (data->status == MUIV_Dirlist_Status_Valid) - { - DoMethod(obj, MUIM_List_Clear); - - SetAttrs(obj, MUIA_Dirlist_Status , MUIV_Dirlist_Status_Invalid, - MUIA_Dirlist_NumBytes , 0 , - MUIA_Dirlist_NumFiles , 0 , - MUIA_Dirlist_NumDrawers, 0 , - TAG_DONE ); - } - - if (data->directory) - { - ReadDirectory(obj, data); - } - set(obj, MUIA_List_Quiet, FALSE); - - return 0; -} - - -#if ZUNE_BUILTIN_DIRLIST -BOOPSI_DISPATCHER(IPTR, Dirlist_Dispatcher, cl, obj, msg) -{ - switch (msg->MethodID) - { - case OM_NEW: return Dirlist__OM_NEW(cl, obj, (struct opSet *)msg); - case OM_DISPOSE: return Dirlist__OM_DISPOSE(cl, obj, msg); - case OM_SET: return Dirlist__OM_SET(cl, obj, (struct opSet *)msg); - case OM_GET: return Dirlist__OM_GET(cl, obj, (struct opGet *)msg); - case MUIM_Dirlist_ReRead: return Dirlist__MUIM_Dirlist_ReRead(cl, obj, (struct opGet *)msg); - default: return DoSuperMethodA(cl, obj, msg); - } -} -BOOPSI_DISPATCHER_END - -const struct __MUIBuiltinClass _MUI_Dirlist_desc = -{ - MUIC_Dirlist, - MUIC_List, - sizeof(struct Dirlist_DATA), - (void*)Dirlist_Dispatcher -}; -#endif /* ZUNE_BUILTIN_DIRLIST */ +/* + Copyright © 2002-2006, The AROS Development Team. All rights reserved. + $Id$ +*/ + +#define MUIMASTER_YES_INLINE_STDARG + +#include <exec/memory.h> +#include <dos/exall.h> +#include <dos/datetime.h> +#include <clib/alib_protos.h> +#include <proto/exec.h> +#include <proto/dos.h> +#include <proto/intuition.h> +#include <proto/utility.h> +#include <proto/muimaster.h> + +#include <string.h> +#include <stdio.h> + +#include "mui.h" +#include "muimaster_intern.h" +#include "support.h" +#include "support_classes.h" +#include "dirlist_private.h" + +extern struct Library *MUIMasterBase; + +AROS_UFH3S(APTR, construct_func, + AROS_UFHA(struct Hook *, hook, A0), + AROS_UFHA(APTR, pool, A2), + AROS_UFHA(struct Dirlist_Entry *, entry, A1)) +{ + AROS_USERFUNC_INIT + + struct Dirlist_Entry *new; + + if ((new = AllocPooled(pool, sizeof(*new)))) + { + *new = *entry; + } + + return new; + + AROS_USERFUNC_EXIT +} + +AROS_UFH3S(void, destruct_func, + AROS_UFHA(struct Hook *, hook, A0), + AROS_UFHA(APTR, pool, A2), + AROS_UFHA(struct Dirlist_Entry *, entry, A1)) +{ + AROS_USERFUNC_INIT + + FreePooled(pool, entry, sizeof(struct Dirlist_Entry)); + + AROS_USERFUNC_EXIT +} + +AROS_UFH3S(LONG, display_func, + AROS_UFHA(struct Hook *, hook, A0), + AROS_UFHA(char **, array, A2), + AROS_UFHA(struct Dirlist_Entry *, entry, A1)) +{ + AROS_USERFUNC_INIT + + struct Dirlist_DATA *data = hook->h_Data; + struct DateTime dt; + + /* MUI: name | size | Date | Time | Protection | Comment */ + if (entry) + { + *array++ = entry->fib.fib_FileName; + + if (entry->fib.fib_DirEntryType > 0) + { + *array++ = "\33I[6:22]"; + } + else + { + snprintf(data->size_string, sizeof(data->size_string), "%ld", + (long)entry->fib.fib_Size); + *array++ = data->size_string; + } + + dt.dat_Stamp = entry->fib.fib_Date; + dt.dat_Format = FORMAT_DOS; + dt.dat_Flags = 0; + dt.dat_StrDay = NULL; + dt.dat_StrDate = data->date_string; + dt.dat_StrTime = data->time_string; + + DateToStr(&dt); + + *array++ = data->date_string; + *array++ = data->time_string; + + data->prot_string[0] = + (entry->fib.fib_Protection & FIBF_SCRIPT) ? 's' : '-'; + data->prot_string[1] = + (entry->fib.fib_Protection & FIBF_PURE) ? 'p' : '-'; + data->prot_string[2] = + (entry->fib.fib_Protection & FIBF_ARCHIVE) ? 'a' : '-'; + data->prot_string[3] = + (entry->fib.fib_Protection & FIBF_READ) ? '-' : 'r'; + data->prot_string[4] = + (entry->fib.fib_Protection & FIBF_WRITE) ? '-' : 'w'; + data->prot_string[5] = + (entry->fib.fib_Protection & FIBF_EXECUTE) ? '-' : 'e'; + data->prot_string[6] = + (entry->fib.fib_Protection & FIBF_DELETE) ? '-' : 'd'; + data->prot_string[7] = '\0'; + + *array++ = data->prot_string; + *array = entry->fib.fib_Comment; + } + else + { + *array++ = "Name"; + *array++ = "Size"; + *array++ = "Date"; + *array++ = "Time"; + *array++ = "Flags"; + *array = "Comment"; + } + + return 0; + + AROS_USERFUNC_EXIT +} + +IPTR Dirlist__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg); + +IPTR Dirlist__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) +{ + STRPTR format = + (STRPTR) GetTagData(MUIA_List_Format, 0, msg->ops_AttrList); + + obj = (Object *) DoSuperNewTags + (cl, obj, NULL, + format ? TAG_IGNORE : MUIA_List_Format, (IPTR) ",P=\33r,,,,", + TAG_MORE, (IPTR) msg->ops_AttrList); + + if (obj) + { + struct Dirlist_DATA *data = INST_DATA(cl, obj); + + data->status = MUIV_Dirlist_Status_Invalid; + + data->construct_hook.h_Entry = (HOOKFUNC) construct_func; + data->destruct_hook.h_Entry = (HOOKFUNC) destruct_func; + data->display_hook.h_Entry = (HOOKFUNC) display_func; + data->display_hook.h_Data = data; + + SetAttrs(obj, MUIA_List_ConstructHook, + (IPTR) & data->construct_hook, MUIA_List_DestructHook, + (IPTR) & data->destruct_hook, MUIA_List_DisplayHook, + (IPTR) & data->display_hook, TAG_DONE); + + Dirlist__OM_SET(cl, obj, msg); + } + + return (IPTR) obj; +} + +IPTR Dirlist__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) +{ + struct Dirlist_DATA *data = INST_DATA(cl, obj); + + FreeVec(data->path); + + return DoSuperMethodA(cl, obj, msg); +} + +static void ReadDirectory(Object *obj, struct Dirlist_DATA *data) +{ + struct FileInfoBlock *fib; + BPTR lock; + + if ((fib = AllocDosObject(DOS_FIB, NULL))) + { + if ((lock = Lock(data->directory, SHARED_LOCK))) + { + BOOL success; + + success = Examine(lock, fib); + + if (success && (fib->fib_DirEntryType > 0)) + { + for (;;) + { + BOOL isdir; + + success = ExNext(lock, fib); + + if (!success) + { + if (IoErr() == ERROR_NO_MORE_ENTRIES) + success = TRUE; + + break; + } + + isdir = (fib->fib_DirEntryType > 0); + + if (data->filterhook) + { + struct ExAllData ead = { 0 }; + + ead.ed_Name = fib->fib_FileName; + ead.ed_Type = fib->fib_DirEntryType; + ead.ed_Size = fib->fib_Size; + ead.ed_Prot = fib->fib_Protection; + ead.ed_Days = fib->fib_Date.ds_Days; + ead.ed_Mins = fib->fib_Date.ds_Minute; + ead.ed_Ticks = fib->fib_Date.ds_Tick; + ead.ed_Comment = fib->fib_Comment; + + if (!CallHookPkt(data->filterhook, obj, &ead)) + continue; + } + else + { + if (isdir && data->filesonly) + continue; + if (!isdir && data->drawersonly) + continue; + + if (data->rejecticons) + { + WORD len = strlen(fib->fib_FileName); + + if (len >= 5) + { + if (stricmp(fib->fib_FileName + len - 5, + ".info") == 0) + continue; + } + } + + if (!isdir || data->filterdrawers) + { + if (data->acceptpattern) + { + if (!MatchPatternNoCase(data->acceptpattern, + fib->fib_FileName)) + continue; + } + + if (data->rejectpattern) + { + if (MatchPatternNoCase(data->rejectpattern, + fib->fib_FileName)) + continue; + } + } + + if (isdir) + { + set(obj, MUIA_Dirlist_NumDrawers, + ++data->numdrawers); + } + else + { + set(obj, MUIA_Dirlist_NumFiles, + ++data->numfiles); + set(obj, MUIA_Dirlist_NumBytes, + data->numbytes + fib->fib_Size); + } + + DoMethod(obj, MUIM_List_InsertSingle, (IPTR) fib, + MUIV_List_Insert_Bottom); + + } /* no filterhook */ + + } /* for(;;) */ + + set(obj, MUIA_Dirlist_Status, MUIV_Dirlist_Status_Valid); + + + } + UnLock(lock); + + } + FreeDosObject(DOS_FIB, fib); + } +} + +IPTR Dirlist__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) +{ + struct Dirlist_DATA *data = INST_DATA(cl, obj); + struct TagItem *tag, *tags; + BOOL directory_changed = FALSE; + + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) + { + IPTR tidata = tag->ti_Data; + + switch (tag->ti_Tag) + { + + case MUIA_Dirlist_AcceptPattern: + data->acceptpattern = (STRPTR) tidata; + break; + + case MUIA_Dirlist_Directory: + data->directory = (STRPTR) tidata; + directory_changed = TRUE; + break; + + case MUIA_Dirlist_DrawersOnly: + data->drawersonly = tidata ? TRUE : FALSE; + break; + + case MUIA_Dirlist_FilesOnly: + data->filesonly = tidata ? TRUE : FALSE; + break; + + case MUIA_Dirlist_FilterDrawers: + data->filterdrawers = tidata ? TRUE : FALSE; + break; + + case MUIA_Dirlist_FilterHook: + data->filterhook = (struct Hook *)tidata; + break; + + case MUIA_Dirlist_MultiSelDirs: + data->multiseldirs = tidata ? TRUE : FALSE; + break; + + case MUIA_Dirlist_RejectIcons: + data->rejecticons = tidata ? TRUE : FALSE; + break; + + case MUIA_Dirlist_RejectPattern: + data->rejectpattern = (STRPTR) tidata; + break; + + case MUIA_Dirlist_SortDirs: + data->sortdirs = tidata ? TRUE : FALSE; + break; + + case MUIA_Dirlist_SortHighLow: + data->sorthighlow = tidata ? TRUE : FALSE; + break; + + case MUIA_Dirlist_SortType: + data->sorttype = tidata; + break; + + case MUIA_Dirlist_Status: + data->status = tidata; + break; + + } + } + + if (directory_changed) + { + if (data->status == MUIV_Dirlist_Status_Valid) + { + DoMethod(obj, MUIM_List_Clear); + + SetAttrs(obj, MUIA_Dirlist_Status, MUIV_Dirlist_Status_Invalid, + MUIA_Dirlist_NumBytes, 0, + MUIA_Dirlist_NumFiles, 0, + MUIA_Dirlist_NumDrawers, 0, TAG_DONE); + + } + + if (data->directory) + { + ReadDirectory(obj, data); + } + + } + + return (msg->MethodID == OM_SET) ? DoSuperMethodA(cl, obj, + (Msg) msg) : 0; + +} + +IPTR Dirlist__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) +{ + struct Dirlist_DATA *data = INST_DATA(cl, obj); + +#define STORE *(msg->opg_Storage) + + switch (msg->opg_AttrID) + { + case MUIA_Dirlist_AcceptPattern: + STORE = (IPTR) data->acceptpattern; + return 1; + + case MUIA_Dirlist_Directory: + STORE = (IPTR) data->directory; + return 1; + + case MUIA_Dirlist_DrawersOnly: + STORE = data->drawersonly; + return 1; + + case MUIA_Dirlist_FilesOnly: + STORE = data->filesonly; + return 1; + + case MUIA_Dirlist_FilterDrawers: + STORE = data->filterdrawers; + return 1; + + case MUIA_Dirlist_FilterHook: + STORE = (IPTR) data->filterhook; + return 1; + + case MUIA_Dirlist_MultiSelDirs: + STORE = data->multiseldirs; + return 1; + + case MUIA_Dirlist_NumBytes: + STORE = data->numbytes; + return 1; + + case MUIA_Dirlist_NumFiles: + STORE = data->numfiles; + return 1; + + case MUIA_Dirlist_NumDrawers: + STORE = data->numdrawers; + return 1; + + case MUIA_Dirlist_Path: + if (data->path) + { + FreeVec(data->path); + data->path = NULL; + } + + STORE = 0; + + if (data->status == MUIV_Dirlist_Status_Valid) + { + struct FileInfoBlock *fib; + + DoMethod(obj, MUIM_List_GetEntry, MUIV_List_GetEntry_Active, + &fib); + + if (fib) + { + WORD len = + strlen(fib->fib_FileName) + strlen(data->directory) + 3; + + data->path = AllocVec(len, MEMF_ANY); + if (data->path) + { + strcpy(data->path, data->directory); + if (AddPart(data->path, fib->fib_FileName, len)) + { + STORE = (IPTR) data->path; + } + } + } + } + return 1; + + case MUIA_Dirlist_RejectIcons: + STORE = data->rejecticons; + return 1; + + case MUIA_Dirlist_RejectPattern: + STORE = (IPTR) data->rejectpattern; + return 1; + + case MUIA_Dirlist_SortDirs: + STORE = data->sortdirs; + return 1; + + case MUIA_Dirlist_SortHighLow: + STORE = data->sorthighlow; + return 1; + + case MUIA_Dirlist_SortType: + STORE = data->sorttype; + return 1; + + case MUIA_Dirlist_Status: + STORE = data->status; + return 1; + } + + return DoSuperMethodA(cl, obj, (Msg) msg); +} + + +IPTR Dirlist__MUIM_Dirlist_ReRead(struct IClass *cl, Object *obj, + struct MUIP_Dirlist_ReRead *msg) +{ + struct Dirlist_DATA *data = INST_DATA(cl, obj); + + set(obj, MUIA_List_Quiet, TRUE); + if (data->status == MUIV_Dirlist_Status_Valid) + { + DoMethod(obj, MUIM_List_Clear); + + SetAttrs(obj, MUIA_Dirlist_Status, MUIV_Dirlist_Status_Invalid, + MUIA_Dirlist_NumBytes, 0, + MUIA_Dirlist_NumFiles, 0, + MUIA_Dirlist_NumDrawers, 0, TAG_DONE); + } + + if (data->directory) + { + ReadDirectory(obj, data); + } + set(obj, MUIA_List_Quiet, FALSE); + + return 0; +} + + +#if ZUNE_BUILTIN_DIRLIST +BOOPSI_DISPATCHER(IPTR, Dirlist_Dispatcher, cl, obj, msg) +{ + switch (msg->MethodID) + { + case OM_NEW: + return Dirlist__OM_NEW(cl, obj, (struct opSet *)msg); + case OM_DISPOSE: + return Dirlist__OM_DISPOSE(cl, obj, msg); + case OM_SET: + return Dirlist__OM_SET(cl, obj, (struct opSet *)msg); + case OM_GET: + return Dirlist__OM_GET(cl, obj, (struct opGet *)msg); + case MUIM_Dirlist_ReRead: + return Dirlist__MUIM_Dirlist_ReRead(cl, obj, (struct opGet *)msg); + default: + return DoSuperMethodA(cl, obj, msg); + } +} +BOOPSI_DISPATCHER_END + +const struct __MUIBuiltinClass _MUI_Dirlist_desc = +{ + MUIC_Dirlist, + MUIC_List, + sizeof(struct Dirlist_DATA), + (void *) Dirlist_Dispatcher +}; +#endif /* ZUNE_BUILTIN_DIRLIST */ diff --git a/workbench/libs/muimaster/classes/dirlist.h b/workbench/libs/muimaster/classes/dirlist.h dissimilarity index 64% index 9eab65c67d..c5bf98dd4d 100644 --- a/workbench/libs/muimaster/classes/dirlist.h +++ b/workbench/libs/muimaster/classes/dirlist.h @@ -1,60 +1,83 @@ -#ifndef _MUI_CLASSES_DIRLIST_H -#define _MUI_CLASSES_DIRLIST_H - -/* - Copyright © 2002-2003, The AROS Development Team. All rights reserved. - $Id$ -*/ - -/****************************************************************************/ -/*** Name *******************************************************************/ -#define MUIC_Dirlist "Dirlist.mui" - -/*** Identifer base (for Zune extensions) ***********************************/ -#define MUIB_Dirlist (MUIB_ZUNE | 0x00001800) - -/*** Methods ****************************************************************/ - -#define MUIM_Dirlist_ReRead (MUIB_MUI|0x00422d71) /* MUI: V4 */ -struct MUIP_Dirlist_ReRead {STACKED ULONG MethodID;}; - -/*** Attributes *************************************************************/ -#define MUIA_Dirlist_AcceptPattern (MUIB_MUI|0x0042760a) /* MUI: V4 is. STRPTR */ -#define MUIA_Dirlist_Directory (MUIB_MUI|0x0042ea41) /* MUI: V4 isg STRPTR */ -#define MUIA_Dirlist_DrawersOnly (MUIB_MUI|0x0042b379) /* MUI: V4 is. BOOL */ -#define MUIA_Dirlist_FilesOnly (MUIB_MUI|0x0042896a) /* MUI: V4 is. BOOL */ -#define MUIA_Dirlist_FilterDrawers (MUIB_MUI|0x00424ad2) /* MUI: V4 is. BOOL */ -#define MUIA_Dirlist_FilterHook (MUIB_MUI|0x0042ae19) /* MUI: V4 is. struct Hook * */ -#define MUIA_Dirlist_MultiSelDirs (MUIB_MUI|0x00428653) /* MUI: V6 is. BOOL */ -#define MUIA_Dirlist_NumBytes (MUIB_MUI|0x00429e26) /* MUI: V4 ..g LONG */ -#define MUIA_Dirlist_NumDrawers (MUIB_MUI|0x00429cb8) /* MUI: V4 ..g LONG */ -#define MUIA_Dirlist_NumFiles (MUIB_MUI|0x0042a6f0) /* MUI: V4 ..g LONG */ -#define MUIA_Dirlist_Path (MUIB_MUI|0x00426176) /* MUI: V4 ..g STRPTR */ -#define MUIA_Dirlist_RejectIcons (MUIB_MUI|0x00424808) /* MUI: V4 is. BOOL */ -#define MUIA_Dirlist_RejectPattern (MUIB_MUI|0x004259c7) /* MUI: V4 is. STRPTR */ -#define MUIA_Dirlist_SortDirs (MUIB_MUI|0x0042bbb9) /* MUI: V4 is. LONG */ -#define MUIA_Dirlist_SortHighLow (MUIB_MUI|0x00421896) /* MUI: V4 is. BOOL */ -#define MUIA_Dirlist_SortType (MUIB_MUI|0x004228bc) /* MUI: V4 is. LONG */ -#define MUIA_Dirlist_Status (MUIB_MUI|0x004240de) /* MUI: V4 ..g LONG */ - -enum { - MUIV_Dirlist_SortDirs_First = 0, - MUIV_Dirlist_SortDirs_Last, - MUIV_Dirlist_SortDirs_Mix, -}; - -enum { - MUIV_Dirlist_SortType_Name = 0, - MUIV_Dirlist_SortType_Date, - MUIV_Dirlist_SortType_Size, -}; - -enum { - MUIV_Dirlist_Status_Invalid = 0, - MUIV_Dirlist_Status_Reading, - MUIV_Dirlist_Status_Valid, -}; - -extern const struct __MUIBuiltinClass _MUI_Dirlist_desc; /* PRIV */ - -#endif /* _MUI_CLASSES_DIRLIST_H */ +#ifndef _MUI_CLASSES_DIRLIST_H +#define _MUI_CLASSES_DIRLIST_H + +/* + Copyright © 2002-2003, The AROS Development Team. All rights reserved. + $Id$ +*/ + +/****************************************************************************/ +/*** Name *******************************************************************/ +#define MUIC_Dirlist "Dirlist.mui" + +/*** Identifer base (for Zune extensions) ***********************************/ +#define MUIB_Dirlist (MUIB_ZUNE | 0x00001800) + +/*** Methods ****************************************************************/ + +#define MUIM_Dirlist_ReRead (MUIB_MUI | 0x00422d71) /* MUI: V4 */ +struct MUIP_Dirlist_ReRead +{ + STACKED ULONG MethodID; +}; + +/*** Attributes *************************************************************/ +#define MUIA_Dirlist_AcceptPattern \ + (MUIB_MUI | 0x0042760a) /* MUI: V4 is. STRPTR */ +#define MUIA_Dirlist_Directory \ + (MUIB_MUI | 0x0042ea41) /* MUI: V4 isg STRPTR */ +#define MUIA_Dirlist_DrawersOnly \ + (MUIB_MUI | 0x0042b379) /* MUI: V4 is. BOOL */ +#define MUIA_Dirlist_FilesOnly \ + (MUIB_MUI | 0x0042896a) /* MUI: V4 is. BOOL */ +#define MUIA_Dirlist_FilterDrawers \ + (MUIB_MUI | 0x00424ad2) /* MUI: V4 is. BOOL */ +#define MUIA_Dirlist_FilterHook \ + (MUIB_MUI | 0x0042ae19) /* MUI: V4 is. struct Hook * */ +#define MUIA_Dirlist_MultiSelDirs \ + (MUIB_MUI | 0x00428653) /* MUI: V6 is. BOOL */ +#define MUIA_Dirlist_NumBytes \ + (MUIB_MUI | 0x00429e26) /* MUI: V4 ..g LONG */ +#define MUIA_Dirlist_NumDrawers \ + (MUIB_MUI | 0x00429cb8) /* MUI: V4 ..g LONG */ +#define MUIA_Dirlist_NumFiles \ + (MUIB_MUI | 0x0042a6f0) /* MUI: V4 ..g LONG */ +#define MUIA_Dirlist_Path \ + (MUIB_MUI | 0x00426176) /* MUI: V4 ..g STRPTR */ +#define MUIA_Dirlist_RejectIcons \ + (MUIB_MUI | 0x00424808) /* MUI: V4 is. BOOL */ +#define MUIA_Dirlist_RejectPattern \ + (MUIB_MUI | 0x004259c7) /* MUI: V4 is. STRPTR */ +#define MUIA_Dirlist_SortDirs \ + (MUIB_MUI | 0x0042bbb9) /* MUI: V4 is. LONG */ +#define MUIA_Dirlist_SortHighLow \ + (MUIB_MUI | 0x00421896) /* MUI: V4 is. BOOL */ +#define MUIA_Dirlist_SortType \ + (MUIB_MUI | 0x004228bc) /* MUI: V4 is. LONG */ +#define MUIA_Dirlist_Status \ + (MUIB_MUI | 0x004240de) /* MUI: V4 ..g LONG */ + +enum +{ + MUIV_Dirlist_SortDirs_First = 0, + MUIV_Dirlist_SortDirs_Last, + MUIV_Dirlist_SortDirs_Mix, +}; + +enum +{ + MUIV_Dirlist_SortType_Name = 0, + MUIV_Dirlist_SortType_Date, + MUIV_Dirlist_SortType_Size, +}; + +enum +{ + MUIV_Dirlist_Status_Invalid = 0, + MUIV_Dirlist_Status_Reading, + MUIV_Dirlist_Status_Valid, +}; + +extern const struct __MUIBuiltinClass _MUI_Dirlist_desc; /* PRIV */ + +#endif /* _MUI_CLASSES_DIRLIST_H */ diff --git a/workbench/libs/muimaster/classes/dtpic.c b/workbench/libs/muimaster/classes/dtpic.c index 39dd2e916f..a446e600cd 100644 --- a/workbench/libs/muimaster/classes/dtpic.c +++ b/workbench/libs/muimaster/classes/dtpic.c @@ -49,13 +49,13 @@ static void killdto(struct Dtpic_DATA *data) { data->bm = NULL; data->bmhd = NULL; - + if (data->dto) { DisposeDTObject(data->dto); data->dto = NULL; } - + if (data->datatypesbase) { CloseLibrary(data->datatypesbase); @@ -68,34 +68,36 @@ static void killdto(struct Dtpic_DATA *data) */ IPTR Dtpic__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) { - obj = (Object *)DoSuperMethodA(cl, obj, (Msg)msg); + obj = (Object *) DoSuperMethodA(cl, obj, (Msg) msg); if (obj) { - struct Dtpic_DATA *data = INST_DATA(cl, obj); - struct TagItem *tags = msg->ops_AttrList; - struct TagItem *tag; + struct Dtpic_DATA *data = INST_DATA(cl, obj); + struct TagItem *tags = msg->ops_AttrList; + struct TagItem *tag; while ((tag = NextTagItem(&tags)) != NULL) { switch (tag->ti_Tag) { - case MUIA_Dtpic_Name: - data->name = AllocVec(strlen((char *)tag->ti_Data) + 1, MEMF_ANY); - strcpy((char *)data->name, (char *)tag->ti_Data); - break; + case MUIA_Dtpic_Name: + data->name = + AllocVec(strlen((char *)tag->ti_Data) + 1, MEMF_ANY); + strcpy((char *)data->name, (char *)tag->ti_Data); + break; } } } - return (IPTR)obj; + return (IPTR) obj; } IPTR setup_datatype(struct IClass *cl, Object *obj) { struct Dtpic_DATA *data = INST_DATA(cl, obj); - if (data->dto) killdto(data); /* Object already existed */ + if (data->dto) + killdto(data); /* Object already existed */ if (data->name) { @@ -104,23 +106,23 @@ IPTR setup_datatype(struct IClass *cl, Object *obj) /* Prevent DOS Requesters from showing up */ struct Process *me = (struct Process *)FindTask(0); - APTR oldwinptr = me->pr_WindowPtr; + APTR oldwinptr = me->pr_WindowPtr; - me->pr_WindowPtr = (APTR)-1; + me->pr_WindowPtr = (APTR) - 1; data->dto = NewDTObject(data->name, DTA_GroupID, GID_PICTURE, - OBP_Precision, PRECISION_IMAGE, - PDTA_Screen, _screen(obj), - PDTA_DestMode, PMODE_V43, - PDTA_UseFriendBitMap, TRUE, - TAG_DONE); + OBP_Precision, PRECISION_IMAGE, + PDTA_Screen, _screen(obj), + PDTA_DestMode, PMODE_V43, + PDTA_UseFriendBitMap, TRUE, TAG_DONE); me->pr_WindowPtr = oldwinptr; if (data->dto) { - struct FrameInfo fri = {0}; + struct FrameInfo fri = { 0 }; - DoMethod(data->dto, DTM_FRAMEBOX, 0, &fri, &fri, sizeof(struct FrameInfo), 0); + DoMethod(data->dto, DTM_FRAMEBOX, 0, &fri, &fri, + sizeof(struct FrameInfo), 0); if (fri.fri_Dimensions.Depth > 0) { @@ -135,75 +137,75 @@ IPTR setup_datatype(struct IClass *cl, Object *obj) else set(obj, MUIA_FillArea, FALSE); - GetDTAttrs(data->dto, PDTA_DestBitMap, &data->bm, TAG_DONE); + GetDTAttrs(data->dto, PDTA_DestBitMap, + &data->bm, TAG_DONE); if (!data->bm) { - GetDTAttrs(data->dto, PDTA_BitMap, &data->bm, TAG_DONE); + GetDTAttrs(data->dto, PDTA_BitMap, + &data->bm, TAG_DONE); } - if (data->bm) return TRUE; - - } /* if (data->bmhd) */ - - } /* if (DoMethod(data->dto, DTM_PROCLAYOUT, 0, 1)) */ - - } /* if (fri.fri_Dimensions.Depth > 0) */ - - } /* if (data->dto) */ - - } /* if ((data->datatypesbase = OpenLibrary("datatypes.library", 39))) */ - - } /* if (data->name) */ - + if (data->bm) + return TRUE; + } + } + } + } + } + } killdto(data); - return TRUE; } -IPTR Dtpic__MUIM_Setup(struct IClass *cl, Object *obj, struct MUIP_Setup *msg) +IPTR Dtpic__MUIM_Setup(struct IClass *cl, Object *obj, + struct MUIP_Setup *msg) { - if (!DoSuperMethodA(cl, obj, (Msg)msg)) return FALSE; - + if (!DoSuperMethodA(cl, obj, (Msg) msg)) + return FALSE; + return setup_datatype(cl, obj); } -IPTR Dtpic__MUIM_Cleanup(struct IClass *cl, Object *obj, struct MUIP_Cleanup *msg) +IPTR Dtpic__MUIM_Cleanup(struct IClass *cl, Object *obj, + struct MUIP_Cleanup *msg) { struct Dtpic_DATA *data = INST_DATA(cl, obj); - killdto(data); + killdto(data); - return DoSuperMethodA(cl, obj, (Msg)msg); + return DoSuperMethodA(cl, obj, (Msg) msg); } -IPTR Dtpic__MUIM_AskMinMax(struct IClass *cl, Object *obj, struct MUIP_AskMinMax *msg) +IPTR Dtpic__MUIM_AskMinMax(struct IClass *cl, Object *obj, + struct MUIP_AskMinMax *msg) { struct Dtpic_DATA *data = INST_DATA(cl, obj); - IPTR retval; - + IPTR retval; + retval = DoSuperMethodA(cl, obj, (Msg) msg); - + if (data->bm) { - msg->MinMaxInfo->MinWidth += data->bmhd->bmh_Width; + msg->MinMaxInfo->MinWidth += data->bmhd->bmh_Width; msg->MinMaxInfo->MinHeight += data->bmhd->bmh_Height; - msg->MinMaxInfo->DefWidth += data->bmhd->bmh_Width; + msg->MinMaxInfo->DefWidth += data->bmhd->bmh_Width; msg->MinMaxInfo->DefHeight += data->bmhd->bmh_Height; - msg->MinMaxInfo->MaxWidth += data->bmhd->bmh_Width; + msg->MinMaxInfo->MaxWidth += data->bmhd->bmh_Width; msg->MinMaxInfo->MaxHeight += data->bmhd->bmh_Height; } - + return retval; } -IPTR Dtpic__MUIM_Draw(struct IClass *cl, Object *obj, struct MUIP_Draw *msg) +IPTR Dtpic__MUIM_Draw(struct IClass *cl, Object *obj, + struct MUIP_Draw *msg) { struct Dtpic_DATA *data = INST_DATA(cl, obj); - DoSuperMethodA(cl, obj, (Msg)msg); - + DoSuperMethodA(cl, obj, (Msg) msg); + if ((msg->flags & MADF_DRAWOBJECT) && data->bm) { /* Note: codes taken from picture.datatype GM_RENDER routine */ @@ -211,8 +213,10 @@ IPTR Dtpic__MUIM_Draw(struct IClass *cl, Object *obj, struct MUIP_Draw *msg) if ((depth >= 15) && (data->bmhd->bmh_Masking == mskHasAlpha)) { - /* Transparency on high color rast port with alpha channel in picture*/ - ULONG * img = AllocVec(_mwidth(obj) * _mheight(obj) * 4, MEMF_ANY); + /* Transparency on high color rast port with alpha channel in + * picture */ + ULONG *img = + AllocVec(_mwidth(obj) * _mheight(obj) * 4, MEMF_ANY); if (img) { struct pdtBlitPixelArray pa; @@ -224,33 +228,37 @@ IPTR Dtpic__MUIM_Draw(struct IClass *cl, Object *obj, struct MUIP_Draw *msg) pa.pbpa_Top = 0; pa.pbpa_Width = _mwidth(obj); pa.pbpa_Height = _mheight(obj); - if(DoMethodA(data->dto, (Msg) &pa)) - WritePixelArrayAlpha(img, 0, 0, _mwidth(obj) * 4, _rp(obj), _mleft(obj), _mtop(obj), _mwidth(obj), _mheight(obj), 0xffffffff); + if (DoMethodA(data->dto, (Msg) & pa)) + WritePixelArrayAlpha(img, 0, 0, _mwidth(obj) * 4, + _rp(obj), _mleft(obj), _mtop(obj), _mwidth(obj), + _mheight(obj), 0xffffffff); FreeVec((APTR) img); } } else - { + { if (data->bmhd->bmh_Masking == mskHasMask) { /* Transparency with mask */ APTR mask = NULL; - GetDTAttrs(data->dto, PDTA_MaskPlane, (IPTR)&mask, TAG_DONE); + GetDTAttrs(data->dto, PDTA_MaskPlane, (IPTR) & mask, + TAG_DONE); - if (mask) - BltMaskBitMapRastPort(data->bm, 0, 0, _rp(obj), _mleft(obj), - _mtop(obj), _mwidth(obj), _mheight(obj), 0xE0, (PLANEPTR)mask); + if (mask) + BltMaskBitMapRastPort(data->bm, 0, 0, _rp(obj), + _mleft(obj), _mtop(obj), _mwidth(obj), + _mheight(obj), 0xE0, (PLANEPTR) mask); } else { /* All other cases */ - BltBitMapRastPort(data->bm, 0, 0, _rp(obj), _mleft(obj), _mtop(obj), - _mwidth(obj), _mheight(obj), 0xC0); + BltBitMapRastPort(data->bm, 0, 0, _rp(obj), _mleft(obj), + _mtop(obj), _mwidth(obj), _mheight(obj), 0xC0); } } } - + return 0; } @@ -258,7 +266,7 @@ IPTR Dtpic__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) { struct Dtpic_DATA *data = INST_DATA(cl, obj); - if(data->name) + if (data->name) FreeVec(data->name); return DoSuperMethodA(cl, obj, msg); @@ -266,48 +274,54 @@ IPTR Dtpic__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) IPTR Dtpic__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) { - struct Dtpic_DATA *data = INST_DATA(cl, obj); - struct TagItem *tags = msg->ops_AttrList; - struct TagItem *tag; - ULONG needs_redraw = 0; + struct Dtpic_DATA *data = INST_DATA(cl, obj); + struct TagItem *tags = msg->ops_AttrList; + struct TagItem *tag; + ULONG needs_redraw = 0; while ((tag = NextTagItem(&tags)) != NULL) { switch (tag->ti_Tag) { - case MUIA_Dtpic_Name: - if (!data->name || strcmp(data->name, (char *)tag->ti_Data)) /* If no filename or different filenames */ - { - if (data->name) FreeVec(data->name); - data->name = AllocVec(strlen((char *)tag->ti_Data) + 1, MEMF_ANY); - strcpy((char *)data->name,(char *)tag->ti_Data); - if (_flags(obj) & MADF_SETUP) setup_datatype(cl, obj); /* Run immediate setup only if base class is setup up */ - needs_redraw = 1; - } - break; + case MUIA_Dtpic_Name: + /* If no filename or different filenames */ + if (!data->name || strcmp(data->name, (char *)tag->ti_Data)) + { + if (data->name) + FreeVec(data->name); + data->name = + AllocVec(strlen((char *)tag->ti_Data) + 1, MEMF_ANY); + strcpy((char *)data->name, (char *)tag->ti_Data); + + /* Run immediate setup only if base class is setup up */ + if (_flags(obj) & MADF_SETUP) + setup_datatype(cl, obj); + needs_redraw = 1; + } + break; } } - + if (needs_redraw) { MUI_Redraw(obj, MADF_DRAWOBJECT); } - return DoSuperMethodA(cl, obj, (Msg)msg); + return DoSuperMethodA(cl, obj, (Msg) msg); } IPTR Dtpic__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) { struct Dtpic_DATA *data = INST_DATA(cl, obj); - switch(msg->opg_AttrID) + switch (msg->opg_AttrID) { - case MUIA_Dtpic_Name: - *(msg->opg_Storage) = (IPTR)data->name; - return TRUE; + case MUIA_Dtpic_Name: + *(msg->opg_Storage) = (IPTR) data->name; + return TRUE; } - return DoSuperMethodA(cl, obj, (Msg)msg); + return DoSuperMethodA(cl, obj, (Msg) msg); } #if ZUNE_BUILTIN_DTPIC @@ -315,24 +329,33 @@ BOOPSI_DISPATCHER(IPTR, Dtpic_Dispatcher, cl, obj, msg) { switch (msg->MethodID) { - case OM_NEW: return Dtpic__OM_NEW(cl, obj, (struct opSet *)msg); - case MUIM_Setup: return Dtpic__MUIM_Setup(cl, obj, (struct MUIP_Setup *)msg); - case MUIM_Cleanup: return Dtpic__MUIM_Cleanup(cl, obj, (struct MUIP_Clean *)msg); - case MUIM_AskMinMax: return Dtpic__MUIM_AskMinMax(cl, obj, (struct MUIP_AskMinMax *)msg); - case MUIM_Draw: return Dtpic__MUIM_Draw(cl, obj, (struct MUIP_Draw *)msg); - case OM_DISPOSE: return Dtpic__OM_DISPOSE(cl, obj, msg); - case OM_SET: return Dtpic__OM_SET(cl, obj, (struct opSet *)msg); - case OM_GET: return Dtpic__OM_GET(cl, obj, (struct opGet *)msg); - default: return DoSuperMethodA(cl, obj, msg); + case OM_NEW: + return Dtpic__OM_NEW(cl, obj, (struct opSet *)msg); + case MUIM_Setup: + return Dtpic__MUIM_Setup(cl, obj, (struct MUIP_Setup *)msg); + case MUIM_Cleanup: + return Dtpic__MUIM_Cleanup(cl, obj, (struct MUIP_Clean *)msg); + case MUIM_AskMinMax: + return Dtpic__MUIM_AskMinMax(cl, obj, (struct MUIP_AskMinMax *)msg); + case MUIM_Draw: + return Dtpic__MUIM_Draw(cl, obj, (struct MUIP_Draw *)msg); + case OM_DISPOSE: + return Dtpic__OM_DISPOSE(cl, obj, msg); + case OM_SET: + return Dtpic__OM_SET(cl, obj, (struct opSet *)msg); + case OM_GET: + return Dtpic__OM_GET(cl, obj, (struct opGet *)msg); + default: + return DoSuperMethodA(cl, obj, msg); } } BOOPSI_DISPATCHER_END const struct __MUIBuiltinClass _MUI_Dtpic_desc = -{ - MUIC_Dtpic, +{ + MUIC_Dtpic, MUIC_Area, - sizeof(struct Dtpic_DATA), - (void*)Dtpic_Dispatcher + sizeof(struct Dtpic_DATA), + (void *) Dtpic_Dispatcher }; #endif /* ZUNE_BUILTIN_DTPIC */ diff --git a/workbench/libs/muimaster/classes/dtpic.h b/workbench/libs/muimaster/classes/dtpic.h index 1c9cefef4f..f65fe901de 100644 --- a/workbench/libs/muimaster/classes/dtpic.h +++ b/workbench/libs/muimaster/classes/dtpic.h @@ -10,8 +10,8 @@ #define MUIC_Dtpic "Dtpic.mui" /*** Attributes *************************************************************/ -#define MUIA_Dtpic_Name (MUIB_MUI|0x00423d72) /* MUI: V18 isg STRPTR */ +#define MUIA_Dtpic_Name (MUIB_MUI | 0x00423d72) /* MUI: V18 isg STRPTR */ -extern const struct __MUIBuiltinClass _MUI_Dtpic_desc; /* PRIV */ +extern const struct __MUIBuiltinClass _MUI_Dtpic_desc; /* PRIV */ #endif /* _MUI_CLASSES_DTPIC_H */ diff --git a/workbench/libs/muimaster/classes/dtpic_private.h b/workbench/libs/muimaster/classes/dtpic_private.h index 909884b69f..64d5136a6f 100644 --- a/workbench/libs/muimaster/classes/dtpic_private.h +++ b/workbench/libs/muimaster/classes/dtpic_private.h @@ -4,11 +4,11 @@ /*** Instance data **********************************************************/ struct Dtpic_DATA { - struct Library *datatypesbase; - STRPTR name; - APTR dto; + struct Library *datatypesbase; + STRPTR name; + APTR dto; struct BitMapHeader *bmhd; - struct BitMap *bm; + struct BitMap *bm; }; #endif /* _DTPIC_PRIVATE_H_ */ diff --git a/workbench/libs/muimaster/classes/family.c b/workbench/libs/muimaster/classes/family.c index b59e6bcd57..6e28c14ae0 100644 --- a/workbench/libs/muimaster/classes/family.c +++ b/workbench/libs/muimaster/classes/family.c @@ -84,11 +84,11 @@ static const int __revision = 1; IPTR Family__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) { struct MUI_FamilyData *data; - struct TagItem *tags; - struct TagItem *tag; - BOOL bad_childs = FALSE; + struct TagItem *tags; + struct TagItem *tag; + BOOL bad_childs = FALSE; - obj = (Object *)DoSuperMethodA(cl, obj, (Msg)msg); + obj = (Object *) DoSuperMethodA(cl, obj, (Msg) msg); if (!obj) return FALSE; /* @@ -100,26 +100,27 @@ IPTR Family__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) /* * parse initial taglist */ - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) { - if (tag->ti_Tag == MUIA_Family_Child || tag->ti_Tag == MUIA_Group_Child) + if (tag->ti_Tag == MUIA_Family_Child + || tag->ti_Tag == MUIA_Group_Child) { - if (tag->ti_Data) /* add child */ + if (tag->ti_Data) /* add child */ DoMethod(obj, MUIM_Family_AddTail, tag->ti_Data); - else /* fail and dispose childs */ + else /* fail and dispose childs */ { bad_childs = TRUE; } } } - + if (bad_childs) { CoerceMethod(cl, obj, OM_DISPOSE); return 0; } - return (IPTR)obj; + return (IPTR) obj; } @@ -129,8 +130,8 @@ IPTR Family__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) IPTR Family__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) { struct MUI_FamilyData *data = INST_DATA(cl, obj); - Object *cstate = (Object *)data->childs.lh_Head; - Object *child; + Object *cstate = (Object *) data->childs.lh_Head; + Object *child; while ((child = NextObject(&cstate))) { @@ -150,37 +151,39 @@ IPTR Family__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) struct MUI_FamilyData *data = INST_DATA(cl, obj); IPTR *store = msg->opg_Storage; - switch(msg->opg_AttrID) + switch (msg->opg_AttrID) { - case MUIA_Family_List: - *store = (IPTR)&data->childs; - return TRUE; + case MUIA_Family_List: + *store = (IPTR) & data->childs; + return TRUE; - case MUIA_Version: - *store = __version; - return TRUE; + case MUIA_Version: + *store = __version; + return TRUE; - case MUIA_Revision: - *store = __revision; - return TRUE; + case MUIA_Revision: + *store = __revision; + return TRUE; - case MUIA_Family_ChildCount: + case MUIA_Family_ChildCount: { - Object *cstate = (Object *)data->childs.lh_Head; + Object *cstate = (Object *) data->childs.lh_Head; *store = 0; - while (NextObject(&cstate)) (*store)++; + while (NextObject(&cstate)) + (*store)++; return TRUE; } } - return(DoSuperMethodA(cl, obj, (Msg) msg)); + return (DoSuperMethodA(cl, obj, (Msg) msg)); } /* * MUIM_Family_AddHead : Add an object as first object to the family. */ -IPTR Family__MUIM_AddHead(struct IClass *cl, Object *obj, struct MUIP_Family_AddHead *msg) +IPTR Family__MUIM_AddHead(struct IClass *cl, Object *obj, + struct MUIP_Family_AddHead *msg) { struct MUI_FamilyData *data = INST_DATA(cl, obj); @@ -197,14 +200,16 @@ IPTR Family__MUIM_AddHead(struct IClass *cl, Object *obj, struct MUIP_Family_Add /* * MUIM_Family_AddTail : Add an object as last object to the family. */ -IPTR Family__MUIM_AddTail(struct IClass *cl, Object *obj, struct MUIP_Family_AddTail *msg) +IPTR Family__MUIM_AddTail(struct IClass *cl, Object *obj, + struct MUIP_Family_AddTail *msg) { struct MUI_FamilyData *data = INST_DATA(cl, obj); if (msg->obj) { - D(bug("Family_AddTail(%p): obj=%p node=%p\n", obj, msg->obj, _OBJECT(msg->obj))); - DoMethod(msg->obj, OM_ADDTAIL, (IPTR)&data->childs); + D(bug("Family_AddTail(%p): obj=%p node=%p\n", obj, msg->obj, + _OBJECT(msg->obj))); + DoMethod(msg->obj, OM_ADDTAIL, (IPTR) & data->childs); return TRUE; } else @@ -215,14 +220,15 @@ IPTR Family__MUIM_AddTail(struct IClass *cl, Object *obj, struct MUIP_Family_Add /* * MUIM_Family_Insert : Add an object after another object to the family. */ -IPTR Family__MUIM_Insert(struct IClass *cl, Object *obj, struct MUIP_Family_Insert *msg) +IPTR Family__MUIM_Insert(struct IClass *cl, Object *obj, + struct MUIP_Family_Insert *msg) { struct MUI_FamilyData *data = INST_DATA(cl, obj); if (msg->obj) { Insert(&(data->childs), (struct Node *)_OBJECT(msg->obj), - (struct Node *)_OBJECT(msg->pred)); + (struct Node *)_OBJECT(msg->pred)); return TRUE; } else @@ -234,10 +240,10 @@ IPTR Family__MUIM_Insert(struct IClass *cl, Object *obj, struct MUIP_Family_Inse * MUIM_Family_Remove : Remove an object from a family. */ IPTR Family__MUIM_Remove(struct IClass *cl, Object *obj, - struct MUIP_Family_Remove *msg) + struct MUIP_Family_Remove *msg) { /* struct MUI_FamilyData *data = INST_DATA(cl, obj); - struct Node *node; */ + struct Node *node; */ if (msg->obj) { @@ -253,14 +259,14 @@ IPTR Family__MUIM_Remove(struct IClass *cl, Object *obj, /* * MUIM_Family_Sort : Sort the children of a family. */ -IPTR Family__MUIM_Sort(struct IClass *cl, Object *obj, - struct MUIP_Family_Sort *msg) +IPTR Family__MUIM_Sort(struct IClass *cl, Object *obj, + struct MUIP_Family_Sort *msg) { struct MUI_FamilyData *data = INST_DATA(cl, obj); int i; NewList(&(data->childs)); - for (i = 0 ; msg->obj[i] ; i++) + for (i = 0; msg->obj[i]; i++) { AddTail(&(data->childs), (struct Node *)_OBJECT(msg->obj[i])); } @@ -272,16 +278,17 @@ IPTR Family__MUIM_Sort(struct IClass *cl, Object *obj, * MUIM_Family_Transfer : All the children of the family are removed and * added to another family in the same order. */ -IPTR Family__MUIM_Transfer(struct IClass *cl, Object *obj, struct MUIP_Family_Transfer *msg) +IPTR Family__MUIM_Transfer(struct IClass *cl, Object *obj, + struct MUIP_Family_Transfer *msg) { struct MUI_FamilyData *data = INST_DATA(cl, obj); - Object *cstate = (Object *)data->childs.lh_Head; - Object *child; + Object *cstate = (Object *) data->childs.lh_Head; + Object *child; while ((child = NextObject(&cstate))) { - DoMethod(obj, MUIM_Family_Remove, (IPTR)child); - DoMethod(msg->family, MUIM_Family_AddTail, (IPTR)child); + DoMethod(obj, MUIM_Family_Remove, (IPTR) child); + DoMethod(msg->family, MUIM_Family_AddTail, (IPTR) child); } return TRUE; } @@ -291,19 +298,21 @@ IPTR Family__MUIM_Transfer(struct IClass *cl, Object *obj, struct MUIP_Family_Tr MUIM_FindUData : tests if the MUIA_UserData of the object contains the given <udata> and returns the object pointer in this case. **************************************************************************/ -IPTR Family__MUIM_FindUData(struct IClass *cl, Object *obj, struct MUIP_FindUData *msg) +IPTR Family__MUIM_FindUData(struct IClass *cl, Object *obj, + struct MUIP_FindUData *msg) { struct MUI_FamilyData *data = INST_DATA(cl, obj); - Object *cstate = (Object *)data->childs.lh_Head; - Object *child; + Object *cstate = (Object *) data->childs.lh_Head; + Object *child; if (muiNotifyData(obj)->mnd_UserData == msg->udata) - return (IPTR)obj; + return (IPTR) obj; while ((child = NextObject(&cstate))) { - Object *found = (Object*)DoMethodA(child, (Msg)msg); - if (found) return (IPTR)found; + Object *found = (Object *) DoMethodA(child, (Msg) msg); + if (found) + return (IPTR) found; } return 0; } @@ -314,11 +323,12 @@ IPTR Family__MUIM_FindUData(struct IClass *cl, Object *obj, struct MUIP_FindUDat * contains the given <udata> and gets <attr> to <storage> for itself * in this case. */ -IPTR Family__MUIM_GetUData(struct IClass *cl, Object *obj, struct MUIP_GetUData *msg) +IPTR Family__MUIM_GetUData(struct IClass *cl, Object *obj, + struct MUIP_GetUData *msg) { struct MUI_FamilyData *data = INST_DATA(cl, obj); - Object *cstate = (Object *)data->childs.lh_Head; - Object *child; + Object *cstate = (Object *) data->childs.lh_Head; + Object *child; if (muiNotifyData(obj)->mnd_UserData == msg->udata) { @@ -326,8 +336,8 @@ IPTR Family__MUIM_GetUData(struct IClass *cl, Object *obj, struct MUIP_GetUData return TRUE; } while ((child = NextObject(&cstate))) - if (DoMethodA(child, (Msg)msg)) - return TRUE; + if (DoMethodA(child, (Msg) msg)) + return TRUE; return FALSE; } @@ -337,17 +347,18 @@ IPTR Family__MUIM_GetUData(struct IClass *cl, Object *obj, struct MUIP_GetUData * MUIM_SetUData : This method tests if the MUIA_UserData of the object * contains the given <udata> and sets <attr> to <val> for itself in this case. */ -IPTR Family__MUIM_SetUData(struct IClass *cl, Object *obj, struct MUIP_SetUData *msg) +IPTR Family__MUIM_SetUData(struct IClass *cl, Object *obj, + struct MUIP_SetUData *msg) { struct MUI_FamilyData *data = INST_DATA(cl, obj); - Object *cstate = (Object *)data->childs.lh_Head; - Object *child; + Object *cstate = (Object *) data->childs.lh_Head; + Object *child; if (muiNotifyData(obj)->mnd_UserData == msg->udata) set(obj, msg->attr, msg->val); while ((child = NextObject(&cstate))) - DoMethodA(child, (Msg)msg); + DoMethodA(child, (Msg) msg); return TRUE; } @@ -357,11 +368,12 @@ IPTR Family__MUIM_SetUData(struct IClass *cl, Object *obj, struct MUIP_SetUData * MUIM_SetUDataOnce : This method tests if the MUIA_UserData of the object * contains the given <udata> and sets <attr> to <val> for itself in this case. */ -IPTR Family__MUIM_SetUDataOnce(struct IClass *cl, Object *obj, struct MUIP_SetUDataOnce *msg) +IPTR Family__MUIM_SetUDataOnce(struct IClass *cl, Object *obj, + struct MUIP_SetUDataOnce *msg) { struct MUI_FamilyData *data = INST_DATA(cl, obj); - Object *cstate = (Object *)data->childs.lh_Head; - Object *child; + Object *cstate = (Object *) data->childs.lh_Head; + Object *child; if (muiNotifyData(obj)->mnd_UserData == msg->udata) { @@ -369,101 +381,106 @@ IPTR Family__MUIM_SetUDataOnce(struct IClass *cl, Object *obj, struct MUIP_SetUD return TRUE; } while ((child = NextObject(&cstate))) - if (DoMethodA(child, (Msg)msg)) - return TRUE; + if (DoMethodA(child, (Msg) msg)) + return TRUE; return FALSE; } -IPTR Family__MUIM_GetChild(struct IClass *cl, Object *obj, struct MUIP_Family_GetChild *msg) +IPTR Family__MUIM_GetChild(struct IClass *cl, Object *obj, + struct MUIP_Family_GetChild *msg) { - struct MUI_FamilyData *data = INST_DATA(cl, obj); - Object *cstate = (Object *)data->childs.lh_Head; - Object *child, *prev = NULL; - LONG counter = 0; + struct MUI_FamilyData *data = INST_DATA(cl, obj); + Object *cstate = (Object *) data->childs.lh_Head; + Object *child, *prev = NULL; + LONG counter = 0; while ((child = NextObject(&cstate))) { - if ((msg->nr >= 0) && (msg->nr == counter)) return (IPTR)child; + if ((msg->nr >= 0) && (msg->nr == counter)) + return (IPTR) child; if ((msg->ref != NULL) && (msg->ref == child)) { - if (msg->nr == MUIV_Family_GetChild_Next) return (IPTR)NextObject(&cstate); - if (msg->nr == MUIV_Family_GetChild_Previous) return (IPTR)prev; + if (msg->nr == MUIV_Family_GetChild_Next) + return (IPTR) NextObject(&cstate); + if (msg->nr == MUIV_Family_GetChild_Previous) + return (IPTR) prev; } - if (msg->nr == MUIV_Family_GetChild_First) return (IPTR)child; + if (msg->nr == MUIV_Family_GetChild_First) + return (IPTR) child; prev = child; counter++; } - if (msg->nr == MUIV_Family_GetChild_Last) return (IPTR)prev; + if (msg->nr == MUIV_Family_GetChild_Last) + return (IPTR) prev; - return (IPTR)NULL; + return (IPTR) NULL; } BOOPSI_DISPATCHER(IPTR, Family_Dispatcher, cl, obj, msg) { switch (msg->MethodID) { - case OM_NEW: - return Family__OM_NEW(cl, obj, (struct opSet *) msg); + case OM_NEW: + return Family__OM_NEW(cl, obj, (struct opSet *)msg); - case OM_DISPOSE: - return Family__OM_DISPOSE(cl, obj, msg); + case OM_DISPOSE: + return Family__OM_DISPOSE(cl, obj, msg); - case OM_GET: - return Family__OM_GET(cl, obj, (struct opGet *)msg); + case OM_GET: + return Family__OM_GET(cl, obj, (struct opGet *)msg); - case MUIM_Family_AddHead : - return Family__MUIM_AddHead(cl, obj, (APTR)msg); + case MUIM_Family_AddHead: + return Family__MUIM_AddHead(cl, obj, (APTR) msg); - case OM_ADDMEMBER: - case MUIM_Family_AddTail : - return Family__MUIM_AddTail(cl, obj, (APTR)msg); + case OM_ADDMEMBER: + case MUIM_Family_AddTail: + return Family__MUIM_AddTail(cl, obj, (APTR) msg); - case MUIM_Family_Insert : - return Family__MUIM_Insert(cl, obj, (APTR)msg); + case MUIM_Family_Insert: + return Family__MUIM_Insert(cl, obj, (APTR) msg); - case OM_REMMEMBER: - case MUIM_Family_Remove : - return Family__MUIM_Remove(cl, obj, (APTR)msg); + case OM_REMMEMBER: + case MUIM_Family_Remove: + return Family__MUIM_Remove(cl, obj, (APTR) msg); - case MUIM_Family_Sort : - return Family__MUIM_Sort(cl, obj, (APTR)msg); + case MUIM_Family_Sort: + return Family__MUIM_Sort(cl, obj, (APTR) msg); - case MUIM_Family_Transfer : - return Family__MUIM_Transfer(cl, obj, (APTR)msg); + case MUIM_Family_Transfer: + return Family__MUIM_Transfer(cl, obj, (APTR) msg); - case MUIM_FindUData: - return Family__MUIM_FindUData(cl, obj, (APTR)msg); + case MUIM_FindUData: + return Family__MUIM_FindUData(cl, obj, (APTR) msg); - case MUIM_GetUData : - return Family__MUIM_GetUData(cl, obj, (APTR)msg); + case MUIM_GetUData: + return Family__MUIM_GetUData(cl, obj, (APTR) msg); - case MUIM_SetUData : - return Family__MUIM_SetUData(cl, obj, (APTR)msg); + case MUIM_SetUData: + return Family__MUIM_SetUData(cl, obj, (APTR) msg); - case MUIM_SetUDataOnce : - return Family__MUIM_SetUDataOnce(cl, obj, (APTR)msg); + case MUIM_SetUDataOnce: + return Family__MUIM_SetUDataOnce(cl, obj, (APTR) msg); - case MUIM_Family_GetChild: - return Family__MUIM_GetChild(cl, obj, (APTR)msg); + case MUIM_Family_GetChild: + return Family__MUIM_GetChild(cl, obj, (APTR) msg); } - return(DoSuperMethodA(cl, obj, msg)); + return (DoSuperMethodA(cl, obj, msg)); } BOOPSI_DISPATCHER_END - /* * Class descriptor. */ -const struct __MUIBuiltinClass _MUI_Family_desc = { +const struct __MUIBuiltinClass _MUI_Family_desc = +{ MUIC_Family, MUIC_Notify, sizeof(struct MUI_FamilyData), - (void*)Family_Dispatcher + (void *) Family_Dispatcher }; - diff --git a/workbench/libs/muimaster/classes/family.h b/workbench/libs/muimaster/classes/family.h index 5b7b7dc552..c7d9175af3 100644 --- a/workbench/libs/muimaster/classes/family.h +++ b/workbench/libs/muimaster/classes/family.h @@ -16,25 +16,65 @@ #define MUIB_Family (MUIB_ZUNE | 0x00000c00) /*** Methods ****************************************************************/ -#define MUIM_Family_AddHead (MUIB_MUI|0x0042e200) /* MUI: V8 */ -#define MUIM_Family_AddTail (MUIB_MUI|0x0042d752) /* MUI: V8 */ -#define MUIM_Family_Insert (MUIB_MUI|0x00424d34) /* MUI: V8 */ -#define MUIM_Family_Remove (MUIB_MUI|0x0042f8a9) /* MUI: V8 */ -#define MUIM_Family_Sort (MUIB_MUI|0x00421c49) /* MUI: V8 */ -#define MUIM_Family_Transfer (MUIB_MUI|0x0042c14a) /* MUI: V8 */ -#define MUIM_Family_GetChild (MUIB_MUI|0x0042c556) /* MUI: V20 */ -struct MUIP_Family_AddHead {STACKED ULONG MethodID; STACKED Object *obj;}; -struct MUIP_Family_AddTail {STACKED ULONG MethodID; STACKED Object *obj;}; -struct MUIP_Family_Insert {STACKED ULONG MethodID; STACKED Object *obj; STACKED Object *pred;}; -struct MUIP_Family_Remove {STACKED ULONG MethodID; STACKED Object *obj;}; -struct MUIP_Family_Sort {STACKED ULONG MethodID; STACKED Object *obj[1];}; -struct MUIP_Family_Transfer {STACKED ULONG MethodID; STACKED Object *family;}; -struct MUIP_Family_GetChild {STACKED ULONG MethodID; STACKED LONG nr; STACKED Object *ref;}; +#define MUIM_Family_AddHead (MUIB_MUI | 0x0042e200) /* MUI: V8 */ +#define MUIM_Family_AddTail (MUIB_MUI | 0x0042d752) /* MUI: V8 */ +#define MUIM_Family_Insert (MUIB_MUI | 0x00424d34) /* MUI: V8 */ +#define MUIM_Family_Remove (MUIB_MUI | 0x0042f8a9) /* MUI: V8 */ +#define MUIM_Family_Sort (MUIB_MUI | 0x00421c49) /* MUI: V8 */ +#define MUIM_Family_Transfer (MUIB_MUI | 0x0042c14a) /* MUI: V8 */ +#define MUIM_Family_GetChild (MUIB_MUI | 0x0042c556) /* MUI: V20 */ + +struct MUIP_Family_AddHead +{ + STACKED ULONG MethodID; + STACKED Object *obj; +}; + +struct MUIP_Family_AddTail +{ + STACKED ULONG MethodID; + STACKED Object *obj; +}; + +struct MUIP_Family_Insert +{ + STACKED ULONG MethodID; + STACKED Object *obj; + STACKED Object *pred; +}; + +struct MUIP_Family_Remove +{ + STACKED ULONG MethodID; + STACKED Object *obj; +}; + +struct MUIP_Family_Sort +{ + STACKED ULONG MethodID; + STACKED Object *obj[1]; +}; + +struct MUIP_Family_Transfer +{ + STACKED ULONG MethodID; + STACKED Object *family; +}; + +struct MUIP_Family_GetChild +{ + STACKED ULONG MethodID; + STACKED LONG nr; + STACKED Object *ref; +}; /*** Attributes *************************************************************/ -#define MUIA_Family_Child (MUIB_MUI|0x0042c696) /* MUI: V8 i.. Object * */ -#define MUIA_Family_List (MUIB_MUI|0x00424b9e) /* MUI: V8 ..g struct MinList * */ -#define MUIA_Family_ChildCount (MUIB_MUI|0x0042b25a) /* MUI: V20 ..g LONG */ +#define MUIA_Family_Child \ + (MUIB_MUI | 0x0042c696) /* MUI: V8 i.. Object * */ +#define MUIA_Family_List \ + (MUIB_MUI | 0x00424b9e) /* MUI: V8 ..g struct MinList * */ +#define MUIA_Family_ChildCount \ + (MUIB_MUI | 0x0042b25a) /* MUI: V20 ..g LONG */ #define MUIV_Family_GetChild_First 0 #define MUIV_Family_GetChild_Last -1 diff --git a/workbench/libs/muimaster/classes/floattext.c b/workbench/libs/muimaster/classes/floattext.c dissimilarity index 60% index 64993110a1..1bb08e6bab 100644 --- a/workbench/libs/muimaster/classes/floattext.c +++ b/workbench/libs/muimaster/classes/floattext.c @@ -1,286 +1,292 @@ -/* - Copyright © 2002-2010, The AROS Development Team. All rights reserved. - $Id$ -*/ - -#define MUIMASTER_YES_INLINE_STDARG - -#define DEBUG 0 -#include <aros/debug.h> - -#include <exec/memory.h> -#include <clib/alib_protos.h> -#include <proto/exec.h> -#include <proto/dos.h> -#include <proto/intuition.h> -#include <proto/utility.h> -#include <proto/muimaster.h> - -#include <string.h> - -#include "mui.h" -#include "muimaster_intern.h" -#include "support.h" -#include "support_classes.h" -#include "floattext_private.h" - -extern struct Library *MUIMasterBase; - -// like strlen(), but \n ends string, too. -static long MyStrLen(const char *ptr) -{ - const char * start = ptr; - - while (*ptr && (*ptr != '\n')) ptr ++; - - return (((long)ptr) - ((long)start)); -} - -static void SetText(Object *obj, struct Floattext_DATA *data) -{ - DoMethod(obj, MUIM_List_Clear); - - if (data->text) - { - STRPTR pos = data->text; - for (;;) - { - LONG len = MyStrLen(pos); - DoMethod(obj, MUIM_List_InsertSingle, pos, MUIV_List_Insert_Bottom); - pos += len; - if (*pos == '\0') - break; - pos++; - } - } -} - -AROS_UFH3S(APTR, construct_func, -AROS_UFHA(struct Hook *, hook, A0), -AROS_UFHA(APTR, pool, A2), -AROS_UFHA(STRPTR, entry, A1)) -{ - AROS_USERFUNC_INIT - - // TODO: MUIA_Floattext_Justify - - struct Floattext_DATA *data = hook->h_Data; - - STRPTR new; - ULONG tabs = 0; - ULONG i; - ULONG slen = MyStrLen(entry); - ULONG size = slen + 1; - - // Count tabulators - for (i = 0; i < slen; i++) - { - if (entry[i] == '\t') - tabs++; - } - size += tabs * data->tabsize; // Worst case - - if ((new = AllocVecPooled(pool, size))) - { - ULONG oldpos = 0; - ULONG newpos = 0; - for (; oldpos < slen; oldpos++) - { - if (data->skipchars) - { - if (strchr(data->skipchars, entry[oldpos])) - { - continue; - } - } - - if (entry[oldpos] == '\t') - { - LONG spaces = data->tabsize - (newpos % data->tabsize); - for ( ; spaces > 0 ; spaces --) - { - new[newpos++] = ' '; - } - } - else - { - new[newpos++] = entry[oldpos]; - } - } - new[newpos] = '\0'; - } - return new; - - AROS_USERFUNC_EXIT -} - -AROS_UFH3S(void, destruct_func, -AROS_UFHA(struct Hook *, hook, A0), -AROS_UFHA(APTR, pool, A2), -AROS_UFHA(STRPTR, entry, A1)) -{ - AROS_USERFUNC_INIT - - FreeVecPooled(pool, entry); - - AROS_USERFUNC_EXIT -} - -IPTR Floattext__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct Floattext_DATA *data; - struct TagItem *tag; - struct TagItem *tags; - - obj = (Object *)DoSuperMethodA(cl, obj, (Msg)msg); - - if (!obj) - { - return 0; - } - - data = INST_DATA(cl, obj); - - data->construct_hook.h_Entry = (HOOKFUNC)construct_func; - data->construct_hook.h_Data = data; - data->destruct_hook.h_Entry = (HOOKFUNC)destruct_func; - - SetAttrs(obj, MUIA_List_ConstructHook, (IPTR)&data->construct_hook, - MUIA_List_DestructHook, (IPTR)&data->destruct_hook, - TAG_DONE); - - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) - { - switch (tag->ti_Tag) - { - case MUIA_Floattext_Justify: - data->justify = tag->ti_Data; - break; - - - case MUIA_Floattext_SkipChars: - data->skipchars = (STRPTR)tag->ti_Data; - break; - - case MUIA_Floattext_TabSize: - data->tabsize = tag->ti_Data; - break; - - case MUIA_Floattext_Text: - data->text = StrDup((STRPTR)tag->ti_Data); - break; - } - } - - if (data->tabsize == 0) - data->tabsize = 8; - else if (data->tabsize > 20) - data->tabsize = 20; - - SetText(obj, data); - - return (IPTR)obj; -} - -IPTR Floattext__OM_DISPOSE(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct Floattext_DATA *data = INST_DATA(cl, obj); - - FreeVec(data->text); - - return DoSuperMethodA(cl, obj, (Msg)msg); -} - -IPTR Floattext__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) -{ - struct Floattext_DATA *data = INST_DATA(cl, obj); -#define STORE *(msg->opg_Storage) - - switch(msg->opg_AttrID) - { - case MUIA_Floattext_Justify: - STORE = data->justify; - return 1; - - case MUIA_Floattext_Text: - STORE = (IPTR)data->text; - return 1; - - } - -#undef STORE - - return DoSuperMethodA(cl, obj, (Msg)msg); -} - -IPTR Floattext__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct Floattext_DATA *data = INST_DATA(cl, obj); - struct TagItem *tag; - struct TagItem *tags; - BOOL changed = FALSE; - - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) - { - switch (tag->ti_Tag) - { - case MUIA_Floattext_Justify: - data->justify = tag->ti_Data; - changed = TRUE; - break; - - case MUIA_Floattext_SkipChars: - data->skipchars = (STRPTR)tag->ti_Data; - changed = TRUE; - break; - - case MUIA_Floattext_TabSize: - data->tabsize = tag->ti_Data; - changed = TRUE; - break; - - case MUIA_Floattext_Text: - FreeVec(data->text); - data->text = StrDup((STRPTR)tag->ti_Data); - changed = TRUE; - break; - - } - } - - if (changed) // To avoid recursion - { - if (data->tabsize == 0) - data->tabsize = 8; - else if (data->tabsize > 20) - data->tabsize = 20; - - SetText(obj, data); - } - - return DoSuperMethodA(cl, obj, (Msg)msg); -} - -#if ZUNE_BUILTIN_FLOATTEXT -BOOPSI_DISPATCHER(IPTR, Floattext_Dispatcher, cl, obj, msg) -{ - switch (msg->MethodID) - { - case OM_NEW: return Floattext__OM_NEW(cl, obj, msg); - case OM_DISPOSE: return Floattext__OM_DISPOSE(cl, obj, msg); - case OM_GET: return Floattext__OM_GET(cl, obj, msg); - case OM_SET: return Floattext__OM_SET(cl, obj, msg); - - default: return DoSuperMethodA(cl, obj, msg); - } -} -BOOPSI_DISPATCHER_END - -const struct __MUIBuiltinClass _MUI_Floattext_desc = -{ - MUIC_Floattext, - MUIC_List, - sizeof(struct Floattext_DATA), - (void*)Floattext_Dispatcher -}; -#endif /* ZUNE_BUILTIN_FLOATTEXT */ +/* + Copyright © 2002-2010, The AROS Development Team. All rights reserved. + $Id$ +*/ + +#define MUIMASTER_YES_INLINE_STDARG + +#define DEBUG 0 +#include <aros/debug.h> + +#include <exec/memory.h> +#include <clib/alib_protos.h> +#include <proto/exec.h> +#include <proto/dos.h> +#include <proto/intuition.h> +#include <proto/utility.h> +#include <proto/muimaster.h> + +#include <string.h> + +#include "mui.h" +#include "muimaster_intern.h" +#include "support.h" +#include "support_classes.h" +#include "floattext_private.h" + +extern struct Library *MUIMasterBase; + +// like strlen(), but \n ends string, too. +static long MyStrLen(const char *ptr) +{ + const char *start = ptr; + + while (*ptr && (*ptr != '\n')) + ptr++; + + return (((long)ptr) - ((long)start)); +} + +static void SetText(Object *obj, struct Floattext_DATA *data) +{ + DoMethod(obj, MUIM_List_Clear); + + if (data->text) + { + STRPTR pos = data->text; + for (;;) + { + LONG len = MyStrLen(pos); + DoMethod(obj, MUIM_List_InsertSingle, pos, + MUIV_List_Insert_Bottom); + pos += len; + if (*pos == '\0') + break; + pos++; + } + } +} + +AROS_UFH3S(APTR, construct_func, + AROS_UFHA(struct Hook *, hook, A0), + AROS_UFHA(APTR, pool, A2), + AROS_UFHA(STRPTR, entry, A1)) +{ + AROS_USERFUNC_INIT + + // TODO: MUIA_Floattext_Justify + struct Floattext_DATA *data = hook->h_Data; + + STRPTR new; + ULONG tabs = 0; + ULONG i; + ULONG slen = MyStrLen(entry); + ULONG size = slen + 1; + + // Count tabulators + for (i = 0; i < slen; i++) + { + if (entry[i] == '\t') + tabs++; + } + size += tabs * data->tabsize; // Worst case + + if ((new = AllocVecPooled(pool, size))) + { + ULONG oldpos = 0; + ULONG newpos = 0; + for (; oldpos < slen; oldpos++) + { + if (data->skipchars) + { + if (strchr(data->skipchars, entry[oldpos])) + { + continue; + } + } + + if (entry[oldpos] == '\t') + { + LONG spaces = data->tabsize - (newpos % data->tabsize); + for (; spaces > 0; spaces--) + { + new[newpos++] = ' '; + } + } + else + { + new[newpos++] = entry[oldpos]; + } + } + new[newpos] = '\0'; + } + return new; + + AROS_USERFUNC_EXIT +} + +AROS_UFH3S(void, destruct_func, + AROS_UFHA(struct Hook *, hook, A0), + AROS_UFHA(APTR, pool, A2), + AROS_UFHA(STRPTR, entry, A1)) +{ + AROS_USERFUNC_INIT + + FreeVecPooled(pool, entry); + + AROS_USERFUNC_EXIT +} + +IPTR Floattext__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) +{ + struct Floattext_DATA *data; + struct TagItem *tag; + struct TagItem *tags; + + obj = (Object *) DoSuperMethodA(cl, obj, (Msg) msg); + + if (!obj) + { + return 0; + } + + data = INST_DATA(cl, obj); + + data->construct_hook.h_Entry = (HOOKFUNC) construct_func; + data->construct_hook.h_Data = data; + data->destruct_hook.h_Entry = (HOOKFUNC) destruct_func; + + SetAttrs(obj, MUIA_List_ConstructHook, (IPTR) & data->construct_hook, + MUIA_List_DestructHook, (IPTR) & data->destruct_hook, TAG_DONE); + + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) + { + switch (tag->ti_Tag) + { + case MUIA_Floattext_Justify: + data->justify = tag->ti_Data; + break; + + + case MUIA_Floattext_SkipChars: + data->skipchars = (STRPTR) tag->ti_Data; + break; + + case MUIA_Floattext_TabSize: + data->tabsize = tag->ti_Data; + break; + + case MUIA_Floattext_Text: + data->text = StrDup((STRPTR) tag->ti_Data); + break; + } + } + + if (data->tabsize == 0) + data->tabsize = 8; + else if (data->tabsize > 20) + data->tabsize = 20; + + SetText(obj, data); + + return (IPTR) obj; +} + +IPTR Floattext__OM_DISPOSE(struct IClass *cl, Object *obj, + struct opSet *msg) +{ + struct Floattext_DATA *data = INST_DATA(cl, obj); + + FreeVec(data->text); + + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +IPTR Floattext__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) +{ + struct Floattext_DATA *data = INST_DATA(cl, obj); +#define STORE *(msg->opg_Storage) + + switch (msg->opg_AttrID) + { + case MUIA_Floattext_Justify: + STORE = data->justify; + return 1; + + case MUIA_Floattext_Text: + STORE = (IPTR) data->text; + return 1; + + } + +#undef STORE + + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +IPTR Floattext__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) +{ + struct Floattext_DATA *data = INST_DATA(cl, obj); + struct TagItem *tag; + struct TagItem *tags; + BOOL changed = FALSE; + + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) + { + switch (tag->ti_Tag) + { + case MUIA_Floattext_Justify: + data->justify = tag->ti_Data; + changed = TRUE; + break; + + case MUIA_Floattext_SkipChars: + data->skipchars = (STRPTR) tag->ti_Data; + changed = TRUE; + break; + + case MUIA_Floattext_TabSize: + data->tabsize = tag->ti_Data; + changed = TRUE; + break; + + case MUIA_Floattext_Text: + FreeVec(data->text); + data->text = StrDup((STRPTR) tag->ti_Data); + changed = TRUE; + break; + + } + } + + if (changed) // To avoid recursion + { + if (data->tabsize == 0) + data->tabsize = 8; + else if (data->tabsize > 20) + data->tabsize = 20; + + SetText(obj, data); + } + + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +#if ZUNE_BUILTIN_FLOATTEXT +BOOPSI_DISPATCHER(IPTR, Floattext_Dispatcher, cl, obj, msg) +{ + switch (msg->MethodID) + { + case OM_NEW: + return Floattext__OM_NEW(cl, obj, msg); + case OM_DISPOSE: + return Floattext__OM_DISPOSE(cl, obj, msg); + case OM_GET: + return Floattext__OM_GET(cl, obj, msg); + case OM_SET: + return Floattext__OM_SET(cl, obj, msg); + + default: + return DoSuperMethodA(cl, obj, msg); + } +} +BOOPSI_DISPATCHER_END + +const struct __MUIBuiltinClass _MUI_Floattext_desc = +{ + MUIC_Floattext, + MUIC_List, + sizeof(struct Floattext_DATA), + (void *) Floattext_Dispatcher +}; +#endif /* ZUNE_BUILTIN_FLOATTEXT */ diff --git a/workbench/libs/muimaster/classes/floattext.h b/workbench/libs/muimaster/classes/floattext.h index 375d7dae73..bc53670b03 100644 --- a/workbench/libs/muimaster/classes/floattext.h +++ b/workbench/libs/muimaster/classes/floattext.h @@ -13,11 +13,15 @@ #define MUIB_Floattext (MUIB_ZUNE | 0x00001500) /*** Attributes *************************************************************/ -#define MUIA_Floattext_Justify (MUIB_MUI|0x0042dc03) /* MUI: V4 isg BOOL */ -#define MUIA_Floattext_SkipChars (MUIB_MUI|0x00425c7d) /* MUI: V4 is. STRPTR */ -#define MUIA_Floattext_TabSize (MUIB_MUI|0x00427d17) /* MUI: V4 is. LONG */ -#define MUIA_Floattext_Text (MUIB_MUI|0x0042d16a) /* MUI: V4 isg STRPTR */ +#define MUIA_Floattext_Justify \ + (MUIB_MUI | 0x0042dc03) /* MUI: V4 isg BOOL */ +#define MUIA_Floattext_SkipChars \ + (MUIB_MUI | 0x00425c7d) /* MUI: V4 is. STRPTR */ +#define MUIA_Floattext_TabSize \ + (MUIB_MUI | 0x00427d17) /* MUI: V4 is. LONG */ +#define MUIA_Floattext_Text \ + (MUIB_MUI | 0x0042d16a) /* MUI: V4 isg STRPTR */ -extern const struct __MUIBuiltinClass _MUI_Floattext_desc; /* PRIV */ +extern const struct __MUIBuiltinClass _MUI_Floattext_desc; /* PRIV */ #endif /* _MUI_CLASSES_VOLUMELIST_H */ diff --git a/workbench/libs/muimaster/classes/frameadjust.c b/workbench/libs/muimaster/classes/frameadjust.c index 0a3424b8c8..e9737f4d13 100644 --- a/workbench/libs/muimaster/classes/frameadjust.c +++ b/workbench/libs/muimaster/classes/frameadjust.c @@ -32,9 +32,9 @@ extern struct Library *MUIMasterBase; -static Object*MakeSpacingSlider (void) +static Object *MakeSpacingSlider(void) { - Object *obj = MUI_MakeObject(MUIO_Slider, (IPTR)"", 0, 9); + Object *obj = MUI_MakeObject(MUIO_Slider, (IPTR) "", 0, 9); set(obj, MUIA_CycleChain, 1); return obj; } @@ -45,7 +45,8 @@ struct SliderFuncMsg STACKED struct Frameadjust_DATA *data; }; -static void SliderFunc(struct Hook *hook, Object *obj, struct SliderFuncMsg *msg) +static void SliderFunc(struct Hook *hook, Object *obj, + struct SliderFuncMsg *msg) { struct Frameadjust_DATA *data = msg->data; Object *slider = msg->slider; @@ -56,27 +57,27 @@ static void SliderFunc(struct Hook *hook, Object *obj, struct SliderFuncMsg *msg if (slider == data->SL_top) { - nnset(data->SL_bottom, MUIA_Numeric_Value, val); - data->fs_intern.innerTop = val; - data->fs_intern.innerBottom = val; + nnset(data->SL_bottom, MUIA_Numeric_Value, val); + data->fs_intern.innerTop = val; + data->fs_intern.innerBottom = val; } else if (slider == data->SL_left) { - nnset(data->SL_right, MUIA_Numeric_Value, val); - data->fs_intern.innerLeft = val; - data->fs_intern.innerRight = val; + nnset(data->SL_right, MUIA_Numeric_Value, val); + data->fs_intern.innerLeft = val; + data->fs_intern.innerRight = val; } else if (slider == data->SL_bottom) { - data->fs_intern.innerBottom = val; + data->fs_intern.innerBottom = val; } else { - data->fs_intern.innerRight = val; + data->fs_intern.innerRight = val; } zune_frame_intern_to_spec(&data->fs_intern, fs); - set(data->FD_display, MUIA_Framedisplay_Spec, (IPTR)fs); + set(data->FD_display, MUIA_Framedisplay_Spec, (IPTR) fs); } @@ -87,7 +88,8 @@ struct FramesFuncMsg STACKED struct Frameadjust_DATA *data; }; -static void FramesFunc(struct Hook *hook, Object *obj, struct FramesFuncMsg *msg) +static void FramesFunc(struct Hook *hook, Object *obj, + struct FramesFuncMsg *msg) { struct Frameadjust_DATA *data = msg->data; char fs[10]; @@ -95,7 +97,7 @@ static void FramesFunc(struct Hook *hook, Object *obj, struct FramesFuncMsg *msg data->fs_intern.type = msg->type; data->fs_intern.state = msg->state; zune_frame_intern_to_spec(&data->fs_intern, fs); - set(data->FD_display, MUIA_Framedisplay_Spec, (IPTR)fs); + set(data->FD_display, MUIA_Framedisplay_Spec, (IPTR) fs); } static Object *MakeFrameDisplay(int i, int state) @@ -104,8 +106,8 @@ static Object *MakeFrameDisplay(int i, int state) char fs[10]; Object *obj; - if (i < 0 || i > (10+16)) - return HVSpace; + if (i < 0 || i > (10 + 16)) + return HVSpace; fsi.innerTop = fsi.innerLeft = fsi.innerBottom = fsi.innerRight = 9; fsi.type = i; @@ -113,35 +115,37 @@ static Object *MakeFrameDisplay(int i, int state) zune_frame_intern_to_spec(&fsi, fs); obj = MUI_NewObject(MUIC_Framedisplay, -// MUIA_FixWidth, 12, -// MUIA_FixHeight, 12, - ButtonFrame, - InnerSpacing(6, 6), - MUIA_Background, MUII_ButtonBack, - MUIA_InputMode, MUIV_InputMode_RelVerify, - MUIA_Framedisplay_Spec, (IPTR)fs, - TAG_DONE); +// MUIA_FixWidth, 12, +// MUIA_FixHeight, 12, + ButtonFrame, + InnerSpacing(6, 6), + MUIA_Background, MUII_ButtonBack, + MUIA_InputMode, MUIV_InputMode_RelVerify, + MUIA_Framedisplay_Spec, (IPTR) fs, TAG_DONE); set(obj, MUIA_CycleChain, 1); return obj; } -IPTR Frameadjust__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) +IPTR Frameadjust__OM_NEW(struct IClass *cl, Object *obj, + struct opSet *msg) { struct Frameadjust_DATA *data; - struct TagItem *tags; - struct TagItem *tag; + struct TagItem *tags; + struct TagItem *tag; Object *FD_display; Object *SL_top, *SL_left, *SL_right, *SL_bottom; Object *GR_fd; Object *GR_fd1; Object *GR_fd2; - int lut[] = { 0, 1, 2, 3, 4, 6, 9, 10, 8, 7, 5 , 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26}; + int lut[] = + { 0, 1, 2, 3, 4, 6, 9, 10, 8, 7, 5, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26 }; int i; obj = (Object *) DoSuperNewTags ( cl, obj, NULL, - + MUIA_Group_Horiz, TRUE, MUIA_Group_HorizSpacing, 20, @@ -176,7 +180,8 @@ IPTR Frameadjust__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) TAG_MORE, (IPTR) msg->ops_AttrList ); - if (!obj) return FALSE; + if (!obj) + return FALSE; data = INST_DATA(cl, obj); data->FD_display = FD_display; @@ -185,30 +190,32 @@ IPTR Frameadjust__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) data->SL_bottom = SL_bottom; data->SL_right = SL_right; data->slider_hook.h_Entry = HookEntry; - data->slider_hook.h_SubEntry = (HOOKFUNC)SliderFunc; + data->slider_hook.h_SubEntry = (HOOKFUNC) SliderFunc; data->frames_hook.h_Entry = HookEntry; - data->frames_hook.h_SubEntry = (HOOKFUNC)FramesFunc; + data->frames_hook.h_SubEntry = (HOOKFUNC) FramesFunc; for (i = 0; i < 11; i++) { - Object *obj; + Object *obj; - obj = MakeFrameDisplay(lut[i], 0); - DoMethod(obj, MUIM_Notify, MUIA_Pressed, FALSE, (IPTR)obj, 5, - MUIM_CallHook, (IPTR)&data->frames_hook, lut[i], 0, (IPTR)data); - DoMethod(GR_fd, OM_ADDMEMBER, (IPTR)obj); + obj = MakeFrameDisplay(lut[i], 0); + DoMethod(obj, MUIM_Notify, MUIA_Pressed, FALSE, (IPTR) obj, 5, + MUIM_CallHook, (IPTR) & data->frames_hook, lut[i], 0, + (IPTR) data); + DoMethod(GR_fd, OM_ADDMEMBER, (IPTR) obj); } - DoMethod(GR_fd, OM_ADDMEMBER, (IPTR)HVSpace); + DoMethod(GR_fd, OM_ADDMEMBER, (IPTR) HVSpace); for (i = 1; i < 11; i++) { - Object *obj; + Object *obj; - obj = MakeFrameDisplay(lut[i], 1); - DoMethod(obj, MUIM_Notify, MUIA_Pressed, FALSE, (IPTR)obj, 5, - MUIM_CallHook, (IPTR)&data->frames_hook, lut[i], 1, (IPTR)data); - DoMethod(GR_fd, OM_ADDMEMBER, (IPTR)obj); + obj = MakeFrameDisplay(lut[i], 1); + DoMethod(obj, MUIM_Notify, MUIA_Pressed, FALSE, (IPTR) obj, 5, + MUIM_CallHook, (IPTR) & data->frames_hook, lut[i], 1, + (IPTR) data); + DoMethod(GR_fd, OM_ADDMEMBER, (IPTR) obj); } @@ -216,95 +223,104 @@ IPTR Frameadjust__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) - for (i = 11; i < (11+8); i++) + for (i = 11; i < (11 + 8); i++) { - Object *obj; + Object *obj; - obj = MakeFrameDisplay(lut[i], 0); - DoMethod(obj, MUIM_Notify, MUIA_Pressed, FALSE, (IPTR)obj, 5, - MUIM_CallHook, (IPTR)&data->frames_hook, lut[i], 0, (IPTR)data); - DoMethod(GR_fd1, OM_ADDMEMBER, (IPTR)obj); + obj = MakeFrameDisplay(lut[i], 0); + DoMethod(obj, MUIM_Notify, MUIA_Pressed, FALSE, (IPTR) obj, 5, + MUIM_CallHook, (IPTR) & data->frames_hook, lut[i], 0, + (IPTR) data); + DoMethod(GR_fd1, OM_ADDMEMBER, (IPTR) obj); } - for (i = 11; i < (11+8); i++) + for (i = 11; i < (11 + 8); i++) { - Object *obj; + Object *obj; - obj = MakeFrameDisplay(lut[i], 1); - DoMethod(obj, MUIM_Notify, MUIA_Pressed, FALSE, (IPTR)obj, 5, - MUIM_CallHook, (IPTR)&data->frames_hook, lut[i], 1, (IPTR)data); - DoMethod(GR_fd1, OM_ADDMEMBER, (IPTR)obj); + obj = MakeFrameDisplay(lut[i], 1); + DoMethod(obj, MUIM_Notify, MUIA_Pressed, FALSE, (IPTR) obj, 5, + MUIM_CallHook, (IPTR) & data->frames_hook, lut[i], 1, + (IPTR) data); + DoMethod(GR_fd1, OM_ADDMEMBER, (IPTR) obj); } - for (i = 19; i < (19+8); i++) + for (i = 19; i < (19 + 8); i++) { - Object *obj; + Object *obj; - obj = MakeFrameDisplay(lut[i], 0); - DoMethod(obj, MUIM_Notify, MUIA_Pressed, FALSE, (IPTR)obj, 5, - MUIM_CallHook, (IPTR)&data->frames_hook, lut[i], 0, (IPTR)data); - DoMethod(GR_fd2, OM_ADDMEMBER, (IPTR)obj); + obj = MakeFrameDisplay(lut[i], 0); + DoMethod(obj, MUIM_Notify, MUIA_Pressed, FALSE, (IPTR) obj, 5, + MUIM_CallHook, (IPTR) & data->frames_hook, lut[i], 0, + (IPTR) data); + DoMethod(GR_fd2, OM_ADDMEMBER, (IPTR) obj); } - for (i = 19; i < (19+8); i++) + for (i = 19; i < (19 + 8); i++) { - Object *obj; + Object *obj; - obj = MakeFrameDisplay(lut[i], 1); - DoMethod(obj, MUIM_Notify, MUIA_Pressed, FALSE, (IPTR)obj, 5, - MUIM_CallHook, (IPTR)&data->frames_hook, lut[i], 1, (IPTR)data); - DoMethod(GR_fd2, OM_ADDMEMBER, (IPTR)obj); + obj = MakeFrameDisplay(lut[i], 1); + DoMethod(obj, MUIM_Notify, MUIA_Pressed, FALSE, (IPTR) obj, 5, + MUIM_CallHook, (IPTR) & data->frames_hook, lut[i], 1, + (IPTR) data); + DoMethod(GR_fd2, OM_ADDMEMBER, (IPTR) obj); } /* parse initial taglist */ - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) { - switch (tag->ti_Tag) - { - case MUIA_Frameadjust_Spec: - zune_frame_spec_to_intern((CONST_STRPTR)tag->ti_Data, &data->fs_intern); - set(data->FD_display, MUIA_Framedisplay_Spec, tag->ti_Data); - set(data->SL_left, MUIA_Numeric_Value, data->fs_intern.innerLeft); - set(data->SL_top, MUIA_Numeric_Value, data->fs_intern.innerTop); - set(data->SL_right, MUIA_Numeric_Value, data->fs_intern.innerRight); - set(data->SL_bottom, MUIA_Numeric_Value, data->fs_intern.innerBottom); - break; - } + switch (tag->ti_Tag) + { + case MUIA_Frameadjust_Spec: + zune_frame_spec_to_intern((CONST_STRPTR) tag->ti_Data, + &data->fs_intern); + set(data->FD_display, MUIA_Framedisplay_Spec, tag->ti_Data); + set(data->SL_left, MUIA_Numeric_Value, + data->fs_intern.innerLeft); + set(data->SL_top, MUIA_Numeric_Value, data->fs_intern.innerTop); + set(data->SL_right, MUIA_Numeric_Value, + data->fs_intern.innerRight); + set(data->SL_bottom, MUIA_Numeric_Value, + data->fs_intern.innerBottom); + break; + } } DoMethod(data->SL_left, MUIM_Notify, MUIA_Numeric_Value, MUIV_EveryTime, - (IPTR)obj, 4, MUIM_CallHook, - (IPTR)&data->slider_hook, (IPTR)data->SL_left, (IPTR)data); + (IPTR) obj, 4, MUIM_CallHook, + (IPTR) & data->slider_hook, (IPTR) data->SL_left, (IPTR) data); DoMethod(data->SL_top, MUIM_Notify, MUIA_Numeric_Value, MUIV_EveryTime, - (IPTR)obj, 4, MUIM_CallHook, - (IPTR)&data->slider_hook, (IPTR)data->SL_top, (IPTR)data); - DoMethod(data->SL_right, MUIM_Notify, MUIA_Numeric_Value, MUIV_EveryTime, - (IPTR)obj, 4, MUIM_CallHook, - (IPTR)&data->slider_hook, (IPTR)data->SL_right, (IPTR)data); - DoMethod(data->SL_bottom, MUIM_Notify, MUIA_Numeric_Value, MUIV_EveryTime, - (IPTR)obj, 4, MUIM_CallHook, - (IPTR)&data->slider_hook, (IPTR)data->SL_bottom, (IPTR)data); - - return (IPTR)obj; + (IPTR) obj, 4, MUIM_CallHook, + (IPTR) & data->slider_hook, (IPTR) data->SL_top, (IPTR) data); + DoMethod(data->SL_right, MUIM_Notify, MUIA_Numeric_Value, + MUIV_EveryTime, (IPTR) obj, 4, MUIM_CallHook, + (IPTR) & data->slider_hook, (IPTR) data->SL_right, (IPTR) data); + DoMethod(data->SL_bottom, MUIM_Notify, MUIA_Numeric_Value, + MUIV_EveryTime, (IPTR) obj, 4, MUIM_CallHook, + (IPTR) & data->slider_hook, (IPTR) data->SL_bottom, (IPTR) data); + + return (IPTR) obj; } -IPTR Frameadjust__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) +IPTR Frameadjust__OM_GET(struct IClass *cl, Object *obj, + struct opGet *msg) { struct Frameadjust_DATA *data = INST_DATA(cl, obj); - switch(msg->opg_AttrID) + switch (msg->opg_AttrID) { - case MUIA_Frameadjust_Spec: - zune_frame_intern_to_spec(&data->fs_intern, (STRPTR)data->spec); - *msg->opg_Storage = (IPTR)data->spec; - return(TRUE); + case MUIA_Frameadjust_Spec: + zune_frame_intern_to_spec(&data->fs_intern, (STRPTR) data->spec); + *msg->opg_Storage = (IPTR) data->spec; + return (TRUE); } - return(DoSuperMethodA(cl, obj, (Msg) msg)); + return (DoSuperMethodA(cl, obj, (Msg) msg)); } #if ZUNE_BUILTIN_FRAMEADJUST @@ -312,18 +328,21 @@ BOOPSI_DISPATCHER(IPTR, Frameadjust_Dispatcher, cl, obj, msg) { switch (msg->MethodID) { - case OM_NEW: return Frameadjust__OM_NEW(cl, obj, (struct opSet *)msg); - case OM_GET: return Frameadjust__OM_GET(cl,obj,(APTR)msg); - default: return DoSuperMethodA(cl, obj, msg); + case OM_NEW: + return Frameadjust__OM_NEW(cl, obj, (struct opSet *)msg); + case OM_GET: + return Frameadjust__OM_GET(cl, obj, (APTR) msg); + default: + return DoSuperMethodA(cl, obj, msg); } } BOOPSI_DISPATCHER_END const struct __MUIBuiltinClass _MUI_Frameadjust_desc = -{ - MUIC_Frameadjust, +{ + MUIC_Frameadjust, MUIC_Group, - sizeof(struct Frameadjust_DATA), - (void*)Frameadjust_Dispatcher + sizeof(struct Frameadjust_DATA), + (void *) Frameadjust_Dispatcher }; #endif /* ZUNE_BUILTIN_FRAMEADJUST */ diff --git a/workbench/libs/muimaster/classes/frameadjust.h b/workbench/libs/muimaster/classes/frameadjust.h index 5a772d56ee..848e4c4849 100644 --- a/workbench/libs/muimaster/classes/frameadjust.h +++ b/workbench/libs/muimaster/classes/frameadjust.h @@ -13,9 +13,10 @@ #define MUIB_Frameadjust (MUIB_ZUNE | 0x00000d00) /*** Attributes *************************************************************/ -#define MUIA_Frameadjust_Spec (MUIB_Frameadjust | 0x00000000) /* Zune 20030330 ig. CONST_STRPTR */ +#define MUIA_Frameadjust_Spec \ + (MUIB_Frameadjust | 0x00000000) /* Zune 20030330 ig. CONST_STRPTR */ -extern const struct __MUIBuiltinClass _MUI_Frameadjust_desc; /* PRIV */ +extern const struct __MUIBuiltinClass _MUI_Frameadjust_desc; /* PRIV */ #endif /* _MUI_CLASSES_FRAMEADJUST_H */ diff --git a/workbench/libs/muimaster/classes/framedisplay.c b/workbench/libs/muimaster/classes/framedisplay.c index ec56eab3b4..3878b835e2 100644 --- a/workbench/libs/muimaster/classes/framedisplay.c +++ b/workbench/libs/muimaster/classes/framedisplay.c @@ -30,76 +30,83 @@ extern struct Library *MUIMasterBase; -IPTR Framedisplay__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) +IPTR Framedisplay__OM_NEW(struct IClass *cl, Object *obj, + struct opSet *msg) { - struct Framedisplay_DATA *data; - struct TagItem *tags; - struct TagItem *tag; - + struct Framedisplay_DATA *data; + struct TagItem *tags; + struct TagItem *tag; + D(bug("Framedisplay_New starts\n")); - obj = (Object *)DoSuperMethodA(cl, obj, (Msg)msg); - if (!obj) return FALSE; - + obj = (Object *) DoSuperMethodA(cl, obj, (Msg) msg); + if (!obj) + return FALSE; + data = INST_DATA(cl, obj); /* parse initial taglist */ - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) { - switch (tag->ti_Tag) - { - case MUIA_Framedisplay_Spec: - zune_frame_spec_to_intern((CONST_STRPTR)tag->ti_Data, &data->fs_intern); - break; - } + switch (tag->ti_Tag) + { + case MUIA_Framedisplay_Spec: + zune_frame_spec_to_intern((CONST_STRPTR) tag->ti_Data, + &data->fs_intern); + break; + } } D(bug("Framedisplay_New(%lx) spec=%lx\n", obj, data->fs_intern)); - return (IPTR)obj; + return (IPTR) obj; } -IPTR Framedisplay__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) +IPTR Framedisplay__OM_SET(struct IClass *cl, Object *obj, + struct opSet *msg) { struct Framedisplay_DATA *data = INST_DATA(cl, obj); - struct TagItem *tags; - struct TagItem *tag; + struct TagItem *tags; + struct TagItem *tag; - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) { - switch (tag->ti_Tag) - { - case MUIA_Framedisplay_Spec: - zune_frame_spec_to_intern((CONST_STRPTR)tag->ti_Data, &data->fs_intern); - MUI_Redraw(obj, MADF_DRAWOBJECT); - break; - } + switch (tag->ti_Tag) + { + case MUIA_Framedisplay_Spec: + zune_frame_spec_to_intern((CONST_STRPTR) tag->ti_Data, + &data->fs_intern); + MUI_Redraw(obj, MADF_DRAWOBJECT); + break; + } } - - return (IPTR)DoSuperMethodA(cl,obj,(Msg)msg); + + return (IPTR) DoSuperMethodA(cl, obj, (Msg) msg); } -IPTR Framedisplay__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) +IPTR Framedisplay__OM_GET(struct IClass *cl, Object *obj, + struct opGet *msg) { struct Framedisplay_DATA *data = INST_DATA(cl, obj); switch (msg->opg_AttrID) { - case MUIA_Framedisplay_Spec: - zune_frame_intern_to_spec(&data->fs_intern, (STRPTR)data->spec); - *msg->opg_Storage = (IPTR)data->spec; - return(TRUE); + case MUIA_Framedisplay_Spec: + zune_frame_intern_to_spec(&data->fs_intern, (STRPTR) data->spec); + *msg->opg_Storage = (IPTR) data->spec; + return (TRUE); } - return (IPTR)DoSuperMethodA(cl,obj,(Msg)msg); + return (IPTR) DoSuperMethodA(cl, obj, (Msg) msg); } -IPTR Framedisplay__MUIM_AskMinMax(struct IClass *cl, Object *obj, struct MUIP_AskMinMax *msg) +IPTR Framedisplay__MUIM_AskMinMax(struct IClass *cl, Object *obj, + struct MUIP_AskMinMax *msg) { - DoSuperMethodA(cl,obj,(Msg)msg); + DoSuperMethodA(cl, obj, (Msg) msg); msg->MinMaxInfo->MinWidth += 8; msg->MinMaxInfo->MinHeight += 8; - + msg->MinMaxInfo->DefWidth += 16; msg->MinMaxInfo->DefHeight += 16; @@ -109,7 +116,8 @@ IPTR Framedisplay__MUIM_AskMinMax(struct IClass *cl, Object *obj, struct MUIP_As return 1; } -IPTR Framedisplay__MUIM_Draw(struct IClass *cl, Object *obj,struct MUIP_Draw *msg) +IPTR Framedisplay__MUIM_Draw(struct IClass *cl, Object *obj, + struct MUIP_Draw *msg) { struct Framedisplay_DATA *data = INST_DATA(cl, obj); const struct ZuneFrameGfx *zframe; @@ -117,17 +125,17 @@ IPTR Framedisplay__MUIM_Draw(struct IClass *cl, Object *obj,struct MUIP_Draw *ms WORD ileft, itop, iright, ibottom; int i; - DoSuperMethodA(cl,obj,(Msg)msg); + DoSuperMethodA(cl, obj, (Msg) msg); if (!(msg->flags & MADF_DRAWOBJECT)) - return 0; + return 0; zframe = zune_zframe_get(obj, &data->fs_intern); if (!zframe) - return 0; - zframe->draw(zframe->customframe, muiRenderInfo(obj), _mleft(obj), _mtop(obj), - _mwidth(obj), _mheight(obj), _mleft(obj), _mtop(obj), - _mwidth(obj), _mheight(obj)); + return 0; + zframe->draw(zframe->customframe, muiRenderInfo(obj), _mleft(obj), + _mtop(obj), _mwidth(obj), _mheight(obj), _mleft(obj), _mtop(obj), + _mwidth(obj), _mheight(obj)); ileft = _mleft(obj) + zframe->ileft + data->fs_intern.innerLeft; itop = _mtop(obj) + zframe->itop + data->fs_intern.innerTop; @@ -137,15 +145,15 @@ IPTR Framedisplay__MUIM_Draw(struct IClass *cl, Object *obj,struct MUIP_Draw *ms SetAPen(_rp(obj), _pens(obj)[MPEN_SHADOW]); region = MUI_AddClipping(muiRenderInfo(obj), ileft, itop, - iright - ileft + 1, ibottom - itop + 1); + iright - ileft + 1, ibottom - itop + 1); for (i = itop; i < ibottom + iright - ileft; i++) { - if (!(i % 4)) - { - Move(_rp(obj), ileft, i); - Draw(_rp(obj), ileft + i - itop, itop); - } + if (!(i % 4)) + { + Move(_rp(obj), ileft, i); + Draw(_rp(obj), ileft + i - itop, itop); + } } MUI_RemoveClipping(muiRenderInfo(obj), region); @@ -153,23 +161,25 @@ IPTR Framedisplay__MUIM_Draw(struct IClass *cl, Object *obj,struct MUIP_Draw *ms return 1; } -IPTR Framedisplay__MUIM_DragQuery(struct IClass *cl, Object *obj, struct MUIP_DragQuery *msg) +IPTR Framedisplay__MUIM_DragQuery(struct IClass *cl, Object *obj, + struct MUIP_DragQuery *msg) { struct MUI_FrameSpec *dummy = NULL; if (msg->obj == obj) - return MUIV_DragQuery_Refuse; + return MUIV_DragQuery_Refuse; if (!get(msg->obj, MUIA_Framedisplay_Spec, &dummy)) - return MUIV_DragQuery_Refuse; + return MUIV_DragQuery_Refuse; return MUIV_DragQuery_Accept; } -IPTR Framedisplay__MUIM_DragDrop(struct IClass *cl, Object *obj, struct MUIP_DragDrop *msg) +IPTR Framedisplay__MUIM_DragDrop(struct IClass *cl, Object *obj, + struct MUIP_DragDrop *msg) { struct MUI_FrameSpec *spec = NULL; get(msg->obj, MUIA_Framedisplay_Spec, &spec); - set(obj, MUIA_Framedisplay_Spec, (IPTR)spec); + set(obj, MUIA_Framedisplay_Spec, (IPTR) spec); return 0; } @@ -179,23 +189,31 @@ BOOPSI_DISPATCHER(IPTR, Framedisplay_Dispatcher, cl, obj, msg) { switch (msg->MethodID) { - case OM_NEW: return Framedisplay__OM_NEW(cl, obj, (struct opSet *)msg); - case OM_SET: return Framedisplay__OM_SET(cl, obj, (APTR)msg); - case OM_GET: return Framedisplay__OM_GET(cl, obj, (APTR)msg); - case MUIM_AskMinMax: return Framedisplay__MUIM_AskMinMax(cl,obj,(APTR)msg); - case MUIM_Draw: return Framedisplay__MUIM_Draw(cl,obj,(APTR)msg); - case MUIM_DragQuery: return Framedisplay__MUIM_DragQuery(cl,obj,(APTR)msg); - case MUIM_DragDrop: return Framedisplay__MUIM_DragDrop(cl,obj,(APTR)msg); - default: return DoSuperMethodA(cl, obj, msg); + case OM_NEW: + return Framedisplay__OM_NEW(cl, obj, (struct opSet *)msg); + case OM_SET: + return Framedisplay__OM_SET(cl, obj, (APTR) msg); + case OM_GET: + return Framedisplay__OM_GET(cl, obj, (APTR) msg); + case MUIM_AskMinMax: + return Framedisplay__MUIM_AskMinMax(cl, obj, (APTR) msg); + case MUIM_Draw: + return Framedisplay__MUIM_Draw(cl, obj, (APTR) msg); + case MUIM_DragQuery: + return Framedisplay__MUIM_DragQuery(cl, obj, (APTR) msg); + case MUIM_DragDrop: + return Framedisplay__MUIM_DragDrop(cl, obj, (APTR) msg); + default: + return DoSuperMethodA(cl, obj, msg); } } BOOPSI_DISPATCHER_END const struct __MUIBuiltinClass _MUI_Framedisplay_desc = -{ - MUIC_Framedisplay, - MUIC_Area, - sizeof(struct Framedisplay_DATA), - (void*)Framedisplay_Dispatcher +{ + MUIC_Framedisplay, + MUIC_Area, + sizeof(struct Framedisplay_DATA), + (void *) Framedisplay_Dispatcher }; #endif /* ZUNE_BUILTIN_FRAMEDISPLAY */ diff --git a/workbench/libs/muimaster/classes/framedisplay.h b/workbench/libs/muimaster/classes/framedisplay.h index 219c5b6199..f220ca6b3b 100644 --- a/workbench/libs/muimaster/classes/framedisplay.h +++ b/workbench/libs/muimaster/classes/framedisplay.h @@ -13,8 +13,9 @@ #define MUIB_Framedisplay (MUIB_ZUNE | 0x00000e00) /*** Attributes *************************************************************/ -#define MUIA_Framedisplay_Spec (MUIB_MUI|0x00421794) /* MUI: V?? isg struct MUI_FrameSpec * */ +#define MUIA_Framedisplay_Spec \ + (MUIB_MUI | 0x00421794) /* MUI: V?? isg struct MUI_FrameSpec * */ -extern const struct __MUIBuiltinClass _MUI_Framedisplay_desc; /* PRIV */ +extern const struct __MUIBuiltinClass _MUI_Framedisplay_desc; /* PRIV */ #endif /* _MUI_CLASSES_FRAMEDISPLAY_H */ diff --git a/workbench/libs/muimaster/classes/gauge.c b/workbench/libs/muimaster/classes/gauge.c dissimilarity index 74% index 54da0fd49b..1f534ad77a 100644 --- a/workbench/libs/muimaster/classes/gauge.c +++ b/workbench/libs/muimaster/classes/gauge.c @@ -1,376 +1,408 @@ -/* - Copyright © 2002-2011, The AROS Development Team. All rights reserved. - $Id$ -*/ - -#define MUIMASTER_YES_INLINE_STDARG - -#include <stdio.h> - -#include <graphics/gfx.h> -#include <graphics/view.h> -#include <clib/alib_protos.h> -#include <proto/exec.h> -#include <proto/graphics.h> -#include <proto/utility.h> -#include <proto/intuition.h> -#include <proto/muimaster.h> - -#include <string.h> - -#include "mui.h" -#include "muimaster_intern.h" -#include "textengine.h" -#include "support.h" -#include "support_classes.h" -#include "gauge_private.h" - -/* #define MYDEBUG 1 */ -#include "debug.h" - -extern struct Library *MUIMasterBase; - - -IPTR Gauge__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct Gauge_DATA *data; - struct TagItem *tag; - struct TagItem *tags; - - obj = (Object *)DoSuperMethodA(cl, obj, (Msg)msg); - if (!obj) return FALSE; - - data = INST_DATA(cl, obj); - - data->divide = 1; - data->max = 100; - data->horiz = FALSE; - data->current = 0; - data->dupinfo = FALSE; - data->info = NULL; - - /* parse initial taglist */ - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) - { - switch (tag->ti_Tag) - { - case MUIA_Gauge_Current: - data->current = tag->ti_Data; - break; - case MUIA_Gauge_Divide: - data->divide = tag->ti_Data; - break; - case MUIA_Gauge_Horiz: - data->horiz = tag->ti_Data; - break; - case MUIA_Gauge_InfoText: - data->info = (STRPTR)tag->ti_Data; - break; - case MUIA_Gauge_Max: - data->max = tag->ti_Data; - break; - case MUIA_Gauge_DupInfoText: - data->dupinfo = tag->ti_Data; - break; - } - } - if (data->divide != 0) - data->current /= data->divide; - if (data->current > data->max) - data->current = data->max; - if (data->dupinfo) - data->info = StrDup(data->info); - - if (data->info) - { - snprintf(data->buf, GAUGE_BUFSIZE, data->info, data->current); - } else data->buf[0] = 0; - -/* D(bug("Gauge_New(0x%lx, %d)\n",obj,muiAreaData(obj)->mad_Frame)); */ - - return (IPTR)obj; -} - -IPTR Gauge__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) -{ - struct Gauge_DATA *data = INST_DATA(cl,obj); - if (data->dupinfo && data->info) FreeVec(data->info); - return DoSuperMethodA(cl,obj,msg); -} - -IPTR Gauge__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct Gauge_DATA *data; - struct TagItem *tag; - struct TagItem *tags; - int info_changed = 0; - int need_redraw = 0; - - data = INST_DATA(cl, obj); - - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) - { - switch (tag->ti_Tag) - { - case MUIA_Gauge_Current: - if (data->current != tag->ti_Data) - { - data->current = tag->ti_Data; - info_changed = 1; - need_redraw = 1; - } - else - { - tag->ti_Tag = TAG_IGNORE; - } - break; - - case MUIA_Gauge_Divide: - if (data->divide != tag->ti_Data) - { - data->divide = tag->ti_Data; - info_changed = 1; - need_redraw = 1; - } - else - { - tag->ti_Tag = TAG_IGNORE; - } - break; - - case MUIA_Gauge_InfoText: - if (!data->info || strcmp(data->info, (STRPTR)tag->ti_Data)) - { - if (data->dupinfo) - { - if (data->info) FreeVec(data->info); - data->info = StrDup((STRPTR)tag->ti_Data); - } else - { - data->info = (STRPTR)tag->ti_Data; - } - need_redraw = info_changed = 1; - } - else - { - tag->ti_Tag = TAG_IGNORE; - } - break; - - case MUIA_Gauge_Max: - if (data->max != tag->ti_Data) - { - data->max = tag->ti_Data; - need_redraw = 1; - } - else - { - tag->ti_Tag = TAG_IGNORE; - } - break; - } - } - - if (data->divide != 0) - data->current /= data->divide; - if (data->current > data->max) - data->current = data->max; - - if (info_changed) - { - if (data->info) - { - snprintf(data->buf, GAUGE_BUFSIZE, data->info, data->current); - } else data->buf[0] = 0; - } - - if (need_redraw) - { - MUI_Redraw(obj,MADF_DRAWOBJECT); - } - return DoSuperMethodA(cl, obj, (Msg)msg); -} - -IPTR Gauge__OM_GET(struct IClass *cl, Object * obj, struct opGet *msg) -{ - struct Gauge_DATA *data = INST_DATA(cl, obj); - IPTR *store = msg->opg_Storage; - ULONG tag = msg->opg_AttrID; - - switch (tag) - { - case MUIA_Gauge_Current: - *store = data->current; - break; - - case MUIA_Gauge_Divide: - *store = data->divide; - break; - - case MUIA_Gauge_InfoText: - *store = (IPTR)data->info; - break; - - case MUIA_Gauge_Max: - *store = data->max; - break; - - case MUIA_Gauge_DupInfoText: - *store = (IPTR)data->dupinfo; - break; - - default: - return DoSuperMethodA(cl, obj, (Msg)msg); - } - - return TRUE; -} - -IPTR Gauge__MUIM_Setup(struct IClass *cl, Object *obj, struct MUIP_Setup *msg) -{ - struct Gauge_DATA *data = INST_DATA(cl,obj); - - if (!(DoSuperMethodA(cl, obj, (Msg)msg))) return 0; - - if (data->info) - { - struct RastPort rp; - - InitRastPort(&rp); - SetFont(&rp,_font(obj)); - - data->info_width = TextLength(&rp,data->buf,strlen(data->buf)); - data->info_height = _font(obj)->tf_YSize; - } - else - { - if (data->horiz) - { - data->info_width = 0; - data->info_height = 0; - } - else - { - data->info_width = 0; - data->info_height = 0; - } - } - - return 1; -} - -IPTR Gauge__MUIM_AskMinMax(struct IClass *cl, Object *obj, struct MUIP_AskMinMax *msg) -{ - struct Gauge_DATA *data = INST_DATA(cl,obj); - DoSuperMethodA(cl,obj,(Msg)msg); - - if (data->horiz) - { - msg->MinMaxInfo->MinWidth += data->info_width; - msg->MinMaxInfo->MinHeight += data->info_height + 2; - msg->MinMaxInfo->DefWidth += data->info_width + 10; - msg->MinMaxInfo->DefHeight += data->info_height + 2; - msg->MinMaxInfo->MaxWidth = MUI_MAXMAX; - if (data->info) - msg->MinMaxInfo->MaxHeight += data->info_height + 2; - else - msg->MinMaxInfo->MaxHeight = MUI_MAXMAX; - - } - else - { - msg->MinMaxInfo->MinWidth += data->info_width + 2; - msg->MinMaxInfo->MinHeight += data->info_height; - msg->MinMaxInfo->DefWidth += data->info_width + 2; - msg->MinMaxInfo->DefHeight += data->info_height + 10; - if (data->info) - msg->MinMaxInfo->MaxWidth += data->info_width + 2; - else - msg->MinMaxInfo->MaxWidth = MUI_MAXMAX; - - msg->MinMaxInfo->MaxHeight = MUI_MAXMAX; - } - return 0; -} - -IPTR Gauge__MUIM_Draw(struct IClass *cl, Object *obj, struct MUIP_Draw *msg) -{ - struct Gauge_DATA *data = INST_DATA(cl,obj); - //ULONG val; - - DoSuperMethodA(cl,obj,(Msg)msg); - -/* D(bug("Gauge_Draw(0x%lx) %ldx%ldx%ldx%ld :: %ldx%ldx%ldx%ld\n",obj,_left(obj),_top(obj),_right(obj),_bottom(obj), _mleft(obj),_mtop(obj), _mright(obj), _mbottom(obj))); */ - - if (data->horiz) - { - ULONG w; - if (data->max != 0) - { - w = _mwidth(obj) * data->current / data->max; /* NOTE: should be 64 bit */ - } else { - w = 0; - } - SetABPenDrMd(_rp(obj),_pens(obj)[MPEN_FILL],0,JAM1); - RectFill(_rp(obj),_mleft(obj),_mtop(obj),_mleft(obj) + w - 1, _mbottom(obj)); - - if (data->info) - { - ZText *ztext = zune_text_new("\33c\0338",data->buf,ZTEXT_ARG_NONE,0); - if (ztext) - { - zune_text_get_bounds(ztext, obj); - SetAPen(_rp(obj), _pens(obj)[MPEN_SHINE]); - zune_text_draw(ztext, obj, _mleft(obj),_mright(obj),_mtop(obj) + (_mheight(obj) - ztext->height)/2); - zune_text_destroy(ztext); - } - } - } - else - { - ULONG h; - h = _mheight(obj) * data->current / data->max; /* NOTE: should be 64 bit */ - - SetABPenDrMd(_rp(obj),_pens(obj)[MPEN_FILL],0,JAM1); - RectFill(_rp(obj),_mleft(obj),_mbottom(obj) - h + 1, _mright(obj),_mbottom(obj)); - - if (data->info) - { - ZText *ztext = zune_text_new("\33c\0338",data->buf,ZTEXT_ARG_NONE,0); - if (ztext) - { - zune_text_get_bounds(ztext, obj); - SetAPen(_rp(obj), _pens(obj)[MPEN_SHINE]); - zune_text_draw(ztext, obj, _mleft(obj),_mright(obj),_mtop(obj) + (_mheight(obj) - ztext->height)/2); - zune_text_destroy(ztext); - } - } - } - return 0; -} - - -#if ZUNE_BUILTIN_GAUGE -BOOPSI_DISPATCHER(IPTR, Gauge_Dispatcher, cl, obj, msg) -{ - switch (msg->MethodID) - { - case OM_NEW: return Gauge__OM_NEW(cl, obj, (struct opSet *)msg); - case OM_DISPOSE: return Gauge__OM_DISPOSE(cl, obj, (Msg)msg); - case OM_SET: return Gauge__OM_SET(cl, obj, (struct opSet *)msg); - case OM_GET: return Gauge__OM_GET(cl, obj, (struct opGet *)msg); - case MUIM_Setup: return Gauge__MUIM_Setup(cl, obj, (struct MUIP_Setup *)msg); - case MUIM_AskMinMax: return Gauge__MUIM_AskMinMax(cl, obj, (struct MUIP_AskMinMax*)msg); - case MUIM_Draw: return Gauge__MUIM_Draw(cl, obj, (struct MUIP_Draw*)msg); - default: return DoSuperMethodA(cl, obj, msg); - } -} -BOOPSI_DISPATCHER_END - -const struct __MUIBuiltinClass _MUI_Gauge_desc = { - MUIC_Gauge, - MUIC_Area, - sizeof(struct Gauge_DATA), - (void*)Gauge_Dispatcher -}; -#endif /* ZUNE_BUILTIN_GAUGE */ +/* + Copyright © 2002-2011, The AROS Development Team. All rights reserved. + $Id$ +*/ + +#define MUIMASTER_YES_INLINE_STDARG + +#include <stdio.h> + +#include <graphics/gfx.h> +#include <graphics/view.h> +#include <clib/alib_protos.h> +#include <proto/exec.h> +#include <proto/graphics.h> +#include <proto/utility.h> +#include <proto/intuition.h> +#include <proto/muimaster.h> + +#include <string.h> + +#include "mui.h" +#include "muimaster_intern.h" +#include "textengine.h" +#include "support.h" +#include "support_classes.h" +#include "gauge_private.h" + +/* #define MYDEBUG 1 */ +#include "debug.h" + +extern struct Library *MUIMasterBase; + + +IPTR Gauge__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) +{ + struct Gauge_DATA *data; + struct TagItem *tag; + struct TagItem *tags; + + obj = (Object *) DoSuperMethodA(cl, obj, (Msg) msg); + if (!obj) + return FALSE; + + data = INST_DATA(cl, obj); + + data->divide = 1; + data->max = 100; + data->horiz = FALSE; + data->current = 0; + data->dupinfo = FALSE; + data->info = NULL; + + /* parse initial taglist */ + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) + { + switch (tag->ti_Tag) + { + case MUIA_Gauge_Current: + data->current = tag->ti_Data; + break; + case MUIA_Gauge_Divide: + data->divide = tag->ti_Data; + break; + case MUIA_Gauge_Horiz: + data->horiz = tag->ti_Data; + break; + case MUIA_Gauge_InfoText: + data->info = (STRPTR) tag->ti_Data; + break; + case MUIA_Gauge_Max: + data->max = tag->ti_Data; + break; + case MUIA_Gauge_DupInfoText: + data->dupinfo = tag->ti_Data; + break; + } + } + if (data->divide != 0) + data->current /= data->divide; + if (data->current > data->max) + data->current = data->max; + if (data->dupinfo) + data->info = StrDup(data->info); + + if (data->info) + { + snprintf(data->buf, GAUGE_BUFSIZE, data->info, data->current); + } + else + data->buf[0] = 0; + +/* D(bug("Gauge_New(0x%lx, %d)\n",obj,muiAreaData(obj)->mad_Frame)); */ + + return (IPTR) obj; +} + +IPTR Gauge__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) +{ + struct Gauge_DATA *data = INST_DATA(cl, obj); + if (data->dupinfo && data->info) + FreeVec(data->info); + return DoSuperMethodA(cl, obj, msg); +} + +IPTR Gauge__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) +{ + struct Gauge_DATA *data; + struct TagItem *tag; + struct TagItem *tags; + int info_changed = 0; + int need_redraw = 0; + + data = INST_DATA(cl, obj); + + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) + { + switch (tag->ti_Tag) + { + case MUIA_Gauge_Current: + if (data->current != tag->ti_Data) + { + data->current = tag->ti_Data; + info_changed = 1; + need_redraw = 1; + } + else + { + tag->ti_Tag = TAG_IGNORE; + } + break; + + case MUIA_Gauge_Divide: + if (data->divide != tag->ti_Data) + { + data->divide = tag->ti_Data; + info_changed = 1; + need_redraw = 1; + } + else + { + tag->ti_Tag = TAG_IGNORE; + } + break; + + case MUIA_Gauge_InfoText: + if (!data->info || strcmp(data->info, (STRPTR) tag->ti_Data)) + { + if (data->dupinfo) + { + if (data->info) + FreeVec(data->info); + data->info = StrDup((STRPTR) tag->ti_Data); + } + else + { + data->info = (STRPTR) tag->ti_Data; + } + need_redraw = info_changed = 1; + } + else + { + tag->ti_Tag = TAG_IGNORE; + } + break; + + case MUIA_Gauge_Max: + if (data->max != tag->ti_Data) + { + data->max = tag->ti_Data; + need_redraw = 1; + } + else + { + tag->ti_Tag = TAG_IGNORE; + } + break; + } + } + + if (data->divide != 0) + data->current /= data->divide; + if (data->current > data->max) + data->current = data->max; + + if (info_changed) + { + if (data->info) + { + snprintf(data->buf, GAUGE_BUFSIZE, data->info, data->current); + } + else + data->buf[0] = 0; + } + + if (need_redraw) + { + MUI_Redraw(obj, MADF_DRAWOBJECT); + } + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +IPTR Gauge__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) +{ + struct Gauge_DATA *data = INST_DATA(cl, obj); + IPTR *store = msg->opg_Storage; + ULONG tag = msg->opg_AttrID; + + switch (tag) + { + case MUIA_Gauge_Current: + *store = data->current; + break; + + case MUIA_Gauge_Divide: + *store = data->divide; + break; + + case MUIA_Gauge_InfoText: + *store = (IPTR) data->info; + break; + + case MUIA_Gauge_Max: + *store = data->max; + break; + + case MUIA_Gauge_DupInfoText: + *store = (IPTR) data->dupinfo; + break; + + default: + return DoSuperMethodA(cl, obj, (Msg) msg); + } + + return TRUE; +} + +IPTR Gauge__MUIM_Setup(struct IClass *cl, Object *obj, + struct MUIP_Setup *msg) +{ + struct Gauge_DATA *data = INST_DATA(cl, obj); + + if (!(DoSuperMethodA(cl, obj, (Msg) msg))) + return 0; + + if (data->info) + { + struct RastPort rp; + + InitRastPort(&rp); + SetFont(&rp, _font(obj)); + + data->info_width = TextLength(&rp, data->buf, strlen(data->buf)); + data->info_height = _font(obj)->tf_YSize; + } + else + { + if (data->horiz) + { + data->info_width = 0; + data->info_height = 0; + } + else + { + data->info_width = 0; + data->info_height = 0; + } + } + + return 1; +} + +IPTR Gauge__MUIM_AskMinMax(struct IClass *cl, Object *obj, + struct MUIP_AskMinMax *msg) +{ + struct Gauge_DATA *data = INST_DATA(cl, obj); + DoSuperMethodA(cl, obj, (Msg) msg); + + if (data->horiz) + { + msg->MinMaxInfo->MinWidth += data->info_width; + msg->MinMaxInfo->MinHeight += data->info_height + 2; + msg->MinMaxInfo->DefWidth += data->info_width + 10; + msg->MinMaxInfo->DefHeight += data->info_height + 2; + msg->MinMaxInfo->MaxWidth = MUI_MAXMAX; + if (data->info) + msg->MinMaxInfo->MaxHeight += data->info_height + 2; + else + msg->MinMaxInfo->MaxHeight = MUI_MAXMAX; + + } + else + { + msg->MinMaxInfo->MinWidth += data->info_width + 2; + msg->MinMaxInfo->MinHeight += data->info_height; + msg->MinMaxInfo->DefWidth += data->info_width + 2; + msg->MinMaxInfo->DefHeight += data->info_height + 10; + if (data->info) + msg->MinMaxInfo->MaxWidth += data->info_width + 2; + else + msg->MinMaxInfo->MaxWidth = MUI_MAXMAX; + + msg->MinMaxInfo->MaxHeight = MUI_MAXMAX; + } + return 0; +} + +IPTR Gauge__MUIM_Draw(struct IClass *cl, Object *obj, + struct MUIP_Draw *msg) +{ + struct Gauge_DATA *data = INST_DATA(cl, obj); + //ULONG val; + + DoSuperMethodA(cl, obj, (Msg) msg); + +/* D(bug("Gauge_Draw(0x%lx) %ldx%ldx%ldx%ld :: %ldx%ldx%ldx%ld\n",obj,_left(obj),_top(obj),_right(obj),_bottom(obj), _mleft(obj),_mtop(obj), _mright(obj), _mbottom(obj))); */ + + if (data->horiz) + { + ULONG w; + if (data->max != 0) + { + /* NOTE: should be 64 bit */ + w = _mwidth(obj) * data->current / data->max; + } + else + { + w = 0; + } + SetABPenDrMd(_rp(obj), _pens(obj)[MPEN_FILL], 0, JAM1); + RectFill(_rp(obj), _mleft(obj), _mtop(obj), _mleft(obj) + w - 1, + _mbottom(obj)); + + if (data->info) + { + ZText *ztext = + zune_text_new("\33c\0338", data->buf, ZTEXT_ARG_NONE, 0); + if (ztext) + { + zune_text_get_bounds(ztext, obj); + SetAPen(_rp(obj), _pens(obj)[MPEN_SHINE]); + zune_text_draw(ztext, obj, _mleft(obj), _mright(obj), + _mtop(obj) + (_mheight(obj) - ztext->height) / 2); + zune_text_destroy(ztext); + } + } + } + else + { + ULONG h; + + /* NOTE: should be 64 bit */ + h = _mheight(obj) * data->current / data->max; + + SetABPenDrMd(_rp(obj), _pens(obj)[MPEN_FILL], 0, JAM1); + RectFill(_rp(obj), _mleft(obj), _mbottom(obj) - h + 1, _mright(obj), + _mbottom(obj)); + + if (data->info) + { + ZText *ztext = + zune_text_new("\33c\0338", data->buf, ZTEXT_ARG_NONE, 0); + if (ztext) + { + zune_text_get_bounds(ztext, obj); + SetAPen(_rp(obj), _pens(obj)[MPEN_SHINE]); + zune_text_draw(ztext, obj, _mleft(obj), _mright(obj), + _mtop(obj) + (_mheight(obj) - ztext->height) / 2); + zune_text_destroy(ztext); + } + } + } + return 0; +} + + +#if ZUNE_BUILTIN_GAUGE +BOOPSI_DISPATCHER(IPTR, Gauge_Dispatcher, cl, obj, msg) +{ + switch (msg->MethodID) + { + case OM_NEW: + return Gauge__OM_NEW(cl, obj, (struct opSet *)msg); + case OM_DISPOSE: + return Gauge__OM_DISPOSE(cl, obj, (Msg) msg); + case OM_SET: + return Gauge__OM_SET(cl, obj, (struct opSet *)msg); + case OM_GET: + return Gauge__OM_GET(cl, obj, (struct opGet *)msg); + case MUIM_Setup: + return Gauge__MUIM_Setup(cl, obj, (struct MUIP_Setup *)msg); + case MUIM_AskMinMax: + return Gauge__MUIM_AskMinMax(cl, obj, (struct MUIP_AskMinMax *)msg); + case MUIM_Draw: + return Gauge__MUIM_Draw(cl, obj, (struct MUIP_Draw *)msg); + default: + return DoSuperMethodA(cl, obj, msg); + } +} +BOOPSI_DISPATCHER_END + +const struct __MUIBuiltinClass _MUI_Gauge_desc = +{ + MUIC_Gauge, + MUIC_Area, + sizeof(struct Gauge_DATA), + (void *) Gauge_Dispatcher +}; +#endif /* ZUNE_BUILTIN_GAUGE */ diff --git a/workbench/libs/muimaster/classes/gauge.h b/workbench/libs/muimaster/classes/gauge.h index 62fa36b3ba..191c095860 100644 --- a/workbench/libs/muimaster/classes/gauge.h +++ b/workbench/libs/muimaster/classes/gauge.h @@ -13,15 +13,21 @@ #define MUIB_Gauge (MUIB_ZUNE | 0x00000f00) /*** Attributes *************************************************************/ -#define MUIA_Gauge_Current (MUIB_MUI|0x0042f0dd) /* MUI: V4 isg LONG */ -#define MUIA_Gauge_Divide (MUIB_MUI|0x0042d8df) /* MUI: V4 isg LONG */ -#define MUIA_Gauge_Horiz (MUIB_MUI|0x004232dd) /* MUI: V4 i.. BOOL */ -#define MUIA_Gauge_InfoText (MUIB_MUI|0x0042bf15) /* MUI: V7 isg STRPTR */ -#define MUIA_Gauge_Max (MUIB_MUI|0x0042bcdb) /* MUI: V4 isg LONG */ - -#define MUIA_Gauge_DupInfoText (MUIB_Gauge | 0x00000000) /* ZUNE: V1 i.. BOOL - defaults to FALSE */ - - -extern const struct __MUIBuiltinClass _MUI_Gauge_desc; /* PRIV */ +#define MUIA_Gauge_Current \ + (MUIB_MUI | 0x0042f0dd) /* MUI: V4 isg LONG */ +#define MUIA_Gauge_Divide \ + (MUIB_MUI | 0x0042d8df) /* MUI: V4 isg LONG */ +#define MUIA_Gauge_Horiz \ + (MUIB_MUI | 0x004232dd) /* MUI: V4 i.. BOOL */ +#define MUIA_Gauge_InfoText \ + (MUIB_MUI | 0x0042bf15) /* MUI: V7 isg STRPTR */ +#define MUIA_Gauge_Max \ + (MUIB_MUI | 0x0042bcdb) /* MUI: V4 isg LONG */ + +#define MUIA_Gauge_DupInfoText \ + (MUIB_Gauge | 0x00000000) /* ZUNE: V1 i.. BOOL - defaults to FALSE */ + + +extern const struct __MUIBuiltinClass _MUI_Gauge_desc; /* PRIV */ #endif /* _MUI_CLASSES_GAUGE_H */ diff --git a/workbench/libs/muimaster/classes/gauge_private.h b/workbench/libs/muimaster/classes/gauge_private.h index c6dab273f1..f5854cf0bf 100644 --- a/workbench/libs/muimaster/classes/gauge_private.h +++ b/workbench/libs/muimaster/classes/gauge_private.h @@ -9,7 +9,7 @@ struct Gauge_DATA BOOL horiz; BOOL dupinfo; - ULONG current; /* (dlc) LONG in MUI, (sba) but MUI seems to handle it like ULONG */ + ULONG current; /* LONG in MUI, but MUI seems to handle it like ULONG */ ULONG max; ULONG divide; STRPTR info; diff --git a/workbench/libs/muimaster/classes/image.h b/workbench/libs/muimaster/classes/image.h dissimilarity index 63% index f2907c49c4..db4b895bb9 100644 --- a/workbench/libs/muimaster/classes/image.h +++ b/workbench/libs/muimaster/classes/image.h @@ -1,29 +1,38 @@ -#ifndef _MUI_CLASSES_IMAGE_H -#define _MUI_CLASSES_IMAGE_H - -/* - Copyright 2002-2003, The AROS Development Team. All rights reserved. - $Id$ -*/ - -/*** Name *******************************************************************/ -#define MUIC_Image "Image.mui" - -/*** Identifier base (for Zune extensions) **********************************/ -#define MUIB_Image (MUIB_ZUNE | 0x00001300) - -/*** Attributes *************************************************************/ -#define MUIA_Image_FontMatch (MUIB_MUI|0x0042815d) /* MUI: V4 i.. BOOL */ -#define MUIA_Image_FontMatchHeight (MUIB_MUI|0x00429f26) /* MUI: V4 i.. BOOL */ -#define MUIA_Image_FontMatchWidth (MUIB_MUI|0x004239bf) /* MUI: V4 i.. BOOL */ -#define MUIA_Image_FreeHoriz (MUIB_MUI|0x0042da84) /* MUI: V4 i.. BOOL */ -#define MUIA_Image_FreeVert (MUIB_MUI|0x0042ea28) /* MUI: V4 i.. BOOL */ -#define MUIA_Image_OldImage (MUIB_MUI|0x00424f3d) /* MUI: V4 i.. struct Image * */ -#define MUIA_Image_Spec (MUIB_MUI|0x004233d5) /* MUI: V4 i.. char * */ -#define MUIA_Image_Prop (MUIB_MUI|0x004233d6) /* MUI: V4 i.. Object * (PRIVATE!) */ -#define MUIA_Image_State (MUIB_MUI|0x0042a3ad) /* MUI: V4 is. LONG */ - - -extern const struct __MUIBuiltinClass _MUI_Image_desc; /* PRIV */ - -#endif /* _MUI_CLASSES_IMAGE_H */ +#ifndef _MUI_CLASSES_IMAGE_H +#define _MUI_CLASSES_IMAGE_H + +/* + Copyright 2002-2003, The AROS Development Team. All rights reserved. + $Id$ +*/ + +/*** Name *******************************************************************/ +#define MUIC_Image "Image.mui" + +/*** Identifier base (for Zune extensions) **********************************/ +#define MUIB_Image (MUIB_ZUNE | 0x00001300) + +/*** Attributes *************************************************************/ +#define MUIA_Image_FontMatch \ + (MUIB_MUI | 0x0042815d) /* MUI: V4 i.. BOOL */ +#define MUIA_Image_FontMatchHeight \ + (MUIB_MUI | 0x00429f26) /* MUI: V4 i.. BOOL */ +#define MUIA_Image_FontMatchWidth \ + (MUIB_MUI | 0x004239bf) /* MUI: V4 i.. BOOL */ +#define MUIA_Image_FreeHoriz \ + (MUIB_MUI | 0x0042da84) /* MUI: V4 i.. BOOL */ +#define MUIA_Image_FreeVert \ + (MUIB_MUI | 0x0042ea28) /* MUI: V4 i.. BOOL */ +#define MUIA_Image_OldImage \ + (MUIB_MUI | 0x00424f3d) /* MUI: V4 i.. struct Image * */ +#define MUIA_Image_Spec \ + (MUIB_MUI | 0x004233d5) /* MUI: V4 i.. char * */ +#define MUIA_Image_Prop \ + (MUIB_MUI | 0x004233d6) /* MUI: V4 i.. Object * (PRIVATE!) */ +#define MUIA_Image_State \ + (MUIB_MUI | 0x0042a3ad) /* MUI: V4 is. LONG */ + + +extern const struct __MUIBuiltinClass _MUI_Image_desc; /* PRIV */ + +#endif /* _MUI_CLASSES_IMAGE_H */ diff --git a/workbench/libs/muimaster/classes/imageadjust.c b/workbench/libs/muimaster/classes/imageadjust.c dissimilarity index 78% index 0faa71286a..983f7a00da 100644 --- a/workbench/libs/muimaster/classes/imageadjust.c +++ b/workbench/libs/muimaster/classes/imageadjust.c @@ -1,989 +1,1061 @@ -/* - Copyright © 2002-2003, The AROS Development Team. All rights reserved. - $Id$ -*/ - -#define MUIMASTER_YES_INLINE_STDARG - -#include <stdio.h> -#include <stdlib.h> - -#include <graphics/gfx.h> -#include <graphics/view.h> -#include <clib/alib_protos.h> - -#include <proto/dos.h> -#include <proto/exec.h> -#include <proto/graphics.h> -#include <proto/utility.h> -#include <proto/intuition.h> -#include <proto/muimaster.h> - -#include <string.h> - -/* #define MYDEBUG 1 */ -#include "debug.h" - -#include "imspec_intern.h" -#include "mui.h" -#include "muimaster_intern.h" -#include "support.h" -#include "support_classes.h" -#include "imageadjust_private.h" - -extern struct Library *MUIMasterBase; - -STATIC STRPTR StrDupPooled(APTR pool, CONST_STRPTR str) -{ - char *newstr; - if (!str) return NULL; - newstr = AllocPooled(pool,strlen(str)+1); - if (newstr) strcpy(newstr,str); - return newstr; -} - -static void Bitmap_Function(struct Hook *hook, Object *obj, APTR msg) -{ - struct Imageadjust_DATA *data = *(struct Imageadjust_DATA **)msg; - char buf[255]; - STRPTR name = NULL; - - get(data->bitmap_string, MUIA_String_Contents, &name); - if (name && strlen(name) > 0) - { - snprintf(buf, 255, "5:%s", name); - set(data->bitmap_image, MUIA_Imagedisplay_Spec, (IPTR)buf); - } -} - - -static void Gradient_Function(struct Hook *hook, Object *obj, APTR msg) -{ - struct Imageadjust_DATA *data = *(struct Imageadjust_DATA **)msg; - struct MUI_RGBcolor *start_rgb; - struct MUI_RGBcolor *end_rgb; - LONG angle = XGET(data->gradient_angle_slider, MUIA_Numeric_Value); - LONG is_tiled = XGET(data->gradient_type_cycle, MUIA_Cycle_Active); - - start_rgb = (struct MUI_RGBcolor*)XGET(data->gradient_start_poppen, - MUIA_Pendisplay_RGBcolor); - end_rgb = (struct MUI_RGBcolor*)XGET(data->gradient_end_poppen, - MUIA_Pendisplay_RGBcolor); - - snprintf(data->gradient_imagespec,sizeof(data->gradient_imagespec), - "%s:%d,%08x,%08x,%08x-%08x,%08x,%08x", - is_tiled ? "8" : "7", - (int)angle, - (unsigned int)start_rgb->red, - (unsigned int)start_rgb->green, - (unsigned int)start_rgb->blue, - (unsigned int)end_rgb->red, - (unsigned int)end_rgb->green, - (unsigned int)end_rgb->blue); - - set(data->gradient_imagedisplay, MUIA_Imagedisplay_Spec, data->gradient_imagespec); -} - -static void GradientSwap_Function(struct Hook *hook, Object *obj, APTR msg) -{ - struct Imageadjust_DATA *data = *(struct Imageadjust_DATA **)msg; - struct MUI_RGBcolor *start_rgb; - struct MUI_RGBcolor *end_rgb; - struct MUI_RGBcolor tmp; - - start_rgb = (struct MUI_RGBcolor*)XGET(data->gradient_start_poppen, - MUIA_Pendisplay_RGBcolor); - end_rgb = (struct MUI_RGBcolor*)XGET(data->gradient_end_poppen, - MUIA_Pendisplay_RGBcolor); - - tmp = *start_rgb; - set(data->gradient_start_poppen, MUIA_Pendisplay_RGBcolor, (IPTR)end_rgb); - set(data->gradient_end_poppen, MUIA_Pendisplay_RGBcolor, (IPTR)&tmp); - Gradient_Function(NULL,obj,&data); -} - - -static VOID Pattern_Select_Function(struct Hook *hook, Object *obj, void **msg) -{ - struct Imageadjust_DATA *data = (struct Imageadjust_DATA *)hook->h_Data; - SIPTR new_selected = (SIPTR)msg[0]; - - if (data->last_pattern_selected != -1) - set(data->pattern_image[data->last_pattern_selected],MUIA_Selected,FALSE); - data->last_pattern_selected = new_selected; -} - - -static VOID Vector_Select_Function(struct Hook *hook, Object *obj, void **msg) -{ - struct Imageadjust_DATA *data = (struct Imageadjust_DATA *)hook->h_Data; - SIPTR new_selected = (SIPTR)msg[0]; - - if (data->last_vector_selected != -1) - set(data->vector_image[data->last_vector_selected],MUIA_Selected,FALSE); - data->last_vector_selected = new_selected; -} - - -struct ExternalListEntry { - STRPTR reldir; - ULONG dirlen; - STRPTR filename; - ULONG namelen; - LONG type; -}; - -static void Imageadjust_External_Display(struct Hook *h, char **strings, - struct ExternalListEntry *entry) -{ - static char buf[256]; - - if (entry->filename) - { - int len; - *strings = buf; - snprintf(buf, 256, "%s", FilePart(entry->filename)); - buf[255] = 0; - len = strlen(buf); - if (len > 4 && !strcmp(buf + len - 4, ".mf0")) - buf[len - 4] = 0; - else if (len > 4 && !strcmp(buf + len - 4, ".mb0")) - buf[len - 4] = 0; - else if (len > 4 && !strcmp(buf + len - 4, ".mbr")) - buf[len - 4] = 0; - else if (len > 6 && !strcmp(buf + len - 6, ".image")) - buf[len - 6] = 0; - } -} - -static struct ExternalListEntry * -Imageadjust_External_Construct(struct Hook *h, - APTR pool, - struct ExternalListEntry *ele) -{ - struct ExternalListEntry *entry = NULL; - - if (NULL == ele) - return NULL; - - if (NULL != ele->filename) - { - entry = AllocPooled(pool, sizeof(struct ExternalListEntry)); - if (NULL != entry) - { - *entry = *ele; - entry->filename = StrDupPooled(pool, entry->filename); - entry->reldir = StrDupPooled(pool, entry->reldir); - return entry; - } - } - return NULL; -} - -static void Imageadjust_External_Destruct(struct Hook *h, APTR pool, - struct ExternalListEntry *entry) -{ - if (entry != NULL) - { - if (entry->filename != NULL) - FreePooled(pool, entry->filename, entry->namelen + 1); - if (entry->reldir != NULL) - FreePooled(pool, entry->reldir, entry->dirlen + 1); - FreePooled(pool, entry, sizeof(struct ExternalListEntry)); - } -} - - -/************************************************************************** - Adds a directory to the list -**************************************************************************/ -static int AddDirectory(Object *list, STRPTR dir, LONG parent) -{ - BPTR lock = Lock(dir,ACCESS_READ); - struct ExAllControl *eac; - struct ExAllData *ead, *EAData; - LONG more; - int dir_len = strlen(dir); - if (!lock) return 0; - - //bug("AddDirectory: locked %s\n", dir); - - eac = (struct ExAllControl*)AllocDosObject(DOS_EXALLCONTROL, NULL); - if (!eac) - { - UnLock(lock); - return 0; - } - - EAData = AllocVec(1024, 0); - if (!EAData) - { - FreeDosObject(DOS_EXALLCONTROL, eac); - UnLock(lock); - return 0; - } - - eac->eac_LastKey = 0; - - do - { - //DoMethod(_app(list), MUIM_Application_InputBuffered); - - more = ExAll(lock, EAData, 1024, ED_TYPE, eac); - if ((!more) && (IoErr() != ERROR_NO_MORE_ENTRIES)) break; - if (eac->eac_Entries == 0) continue; - - ead = EAData; - do - { - size_t namelen = strlen(ead->ed_Name); - int len = dir_len + namelen + 10; - char *buf; - - //DoMethod(_app(list), MUIM_Application_InputBuffered); - - buf = AllocVec(len,0); - if (buf) - { - LONG num = 0; - int is_directory; - BOOL add_me = TRUE; - - if (ead->ed_Type > 0) - { - is_directory = 1; - if (ead->ed_Type == ST_SOFTLINK) - { - /* TODO: Special handling */ - } - } else is_directory = 0; - - strcpy(buf, dir); - AddPart(buf, ead->ed_Name, len); - - if (!is_directory && namelen > 4 - && !strcmp(ead->ed_Name + namelen - 4, ".mf1")) - add_me = FALSE; - if (!is_directory && namelen > 4 - && !strcmp(ead->ed_Name + namelen - 4, ".mb1")) - add_me = FALSE; - - if (add_me) - { - struct ExternalListEntry ele; - //bug("AddDirectory: adding image %s\n", buf); - - - ele.reldir = dir + strlen(IMSPEC_EXTERNAL_PREFIX); - ele.dirlen = strlen(ele.reldir); - ele.filename = ead->ed_Name; - ele.namelen = strlen(ele.filename); - ele.type = ead->ed_Type; - - if (! is_directory) - { - num = DoMethod(list, MUIM_List_InsertSingle, - (IPTR)&ele, - MUIV_List_Insert_Bottom); - } - } - // FIXME: where does num's value come from here? - if (num != -1 && is_directory) - { - AddDirectory(list, buf, num); - } - FreeVec(buf); - } - ead = ead->ed_Next; - } while (ead); - } while (more); - - FreeVec(EAData); - FreeDosObject(DOS_EXALLCONTROL, eac); - UnLock(lock); - return 1; -} - - - -/************************************************************************** - ... -**************************************************************************/ -STATIC VOID Imageadjust_SetImagespec(Object *obj, struct Imageadjust_DATA *data, char *spec) -{ - char *s; - if (!spec) spec = "0:128"; - - s = (char*)spec; - - switch (*s) - { - case '0': - { - LONG pat; - StrToLong(s+2,&pat); - pat -= MUII_BACKGROUND; - - if (pat >= 0 && pat < 18) - { - set(data->pattern_image[pat],MUIA_Selected,TRUE); - set(obj,MUIA_Group_ActivePage,0); - } - } - break; - - case '1': - { - LONG vect; - StrToLong(s+2,&vect); - - if (vect >= 0 && vect < 24) - { - set(data->vector_image[vect],MUIA_Selected,TRUE); - set(obj,MUIA_Group_ActivePage,1); - } - - } - break; - - case '2': - switch(data->adjust_type) - { - case MUIV_Imageadjust_Type_All: - case MUIV_Imageadjust_Type_Image: - nfset(obj, MUIA_Group_ActivePage, 2); - break; - case MUIV_Imageadjust_Type_Background: - nfset(obj, MUIA_Group_ActivePage, 1); - break; - default: - nfset(obj, MUIA_Group_ActivePage, 0); - break; - } - D(bug("imageadjust: setting color to %s\n", s)); - set(data->color_group, MUIA_Penadjust_Spec, (IPTR)s+2); - break; - - case '3': - case '4': - { - struct ExternalListEntry *entry; - LONG entries = 0; - int i; - - set(obj, MUIA_Group_ActivePage, 3); - - get(data->external_list, MUIA_List_Entries, &entries); - for (i = 0; i < entries; i++) - { - DoMethod(data->external_list, MUIM_List_GetEntry, i, - (IPTR)&entry); - if (entry != NULL - && entry->reldir != NULL - && entry->filename != NULL) - { - STRPTR file = FilePart(s+2); - //bug("entry->reldir = %s, s + 2 = %s, len=%d\n", - //entry->reldir, s + 2, strlen(s + 2) - strlen(file) - 1); - if (!strncmp(entry->reldir, s + 2, - strlen(s + 2) - strlen(file) - 1)) - { - //bug("entry->filename = %s, file = %s\n", - //entry->filename, file); - if (!strcmp(entry->filename, file)) - { - set(data->external_list, MUIA_List_Active, i); - break; - } - } - } - } - } - break; - - case '5': - set(data->bitmap_string,MUIA_String_Contents,(IPTR)s+2); - Bitmap_Function(NULL, obj, &data); - if (data->adjust_type == MUIV_Imageadjust_Type_All) - set(obj,MUIA_Group_ActivePage,4); - else - set(obj,MUIA_Group_ActivePage,2); - break; - - case '6': - { - LONG img; - StrToLong(s+2,&img); - } - break; - - case '7': - case '8': - { - struct MUI_ImageSpec_intern spec; - if (zune_gradient_string_to_intern(s+2,&spec)) - { - struct MUI_RGBcolor col; - col.red = spec.u.gradient.start_rgb[0]*0x01010101; - col.green = spec.u.gradient.start_rgb[1]*0x01010101; - col.blue = spec.u.gradient.start_rgb[2]*0x01010101; - - nnset(data->gradient_start_poppen, MUIA_Pendisplay_RGBcolor, &col); - - col.red = spec.u.gradient.end_rgb[0]*0x01010101; - col.green = spec.u.gradient.end_rgb[1]*0x01010101; - col.blue = spec.u.gradient.end_rgb[2]*0x01010101; - - nnset(data->gradient_end_poppen, MUIA_Pendisplay_RGBcolor, &col); - - nnset(data->gradient_angle_slider, MUIA_Numeric_Value, spec.u.gradient.angle); - - set(data->gradient_type_cycle, MUIA_Cycle_Active, *s == '7' ? 0 : 1); - } - - Gradient_Function(NULL,obj,&data); - if (data->adjust_type == MUIV_Imageadjust_Type_All) - set(obj,MUIA_Group_ActivePage,5); - else - set(obj,MUIA_Group_ActivePage,3); - } - break; - } -} - -IPTR Imageadjust__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct Imageadjust_DATA *data; - struct TagItem *tag; - struct TagItem *tags; - static const char * const labels_all[] = {"Pattern", "Vector", "Color", "External", "Bitmap", "Gradient", NULL}; - static const char * const labels_image[] = {"Pattern", "Vector", "Color", "External", NULL}; - static const char * const labels_bg[] = {"Pattern", "Color", "Bitmap", "Gradient", NULL}; - static const char * const labels_color[] = {"Color", NULL}; - static const char * const gradient_type_entries[] = {"Scaled", "Tiled", NULL}; - - Object *pattern_group = NULL; - Object *vector_group = NULL; - Object *external_list = NULL; - Object *bitmap_string = NULL; - Object *bitmap_image = NULL; - Object *bitmap_popasl = NULL; - Object *gradient_imagedisplay = NULL; - Object *gradient_start_poppen = NULL; - Object *gradient_end_poppen = NULL; - Object *gradient_angle_slider = NULL; - Object *gradient_type_cycle = NULL; - Object *gradient_horiz_button = NULL; - Object *gradient_vert_button = NULL; - Object *gradient_swap_button = NULL; - char *spec = NULL; - LONG i; - LONG adjust_type; - Object *color_group = NULL; - Object *external_group = NULL; - Object *bitmap_group = NULL; - Object *gradient_group = NULL; - - adjust_type = GetTagData(MUIA_Imageadjust_Type, MUIV_Imageadjust_Type_All, - msg->ops_AttrList); - - color_group = MUI_NewObject(MUIC_Penadjust, TAG_DONE); - - if (adjust_type == MUIV_Imageadjust_Type_All || - adjust_type == MUIV_Imageadjust_Type_Image) - { - external_group = (Object *)ListviewObject, - MUIA_Listview_List, (IPTR)(external_list = (Object *)ListObject, - InputListFrame, - MUIA_List_ConstructHook, MUIV_List_ConstructHook_String, - MUIA_List_DestructHook, MUIV_List_DestructHook_String, - End), - End; - } - - if (adjust_type == MUIV_Imageadjust_Type_All || - adjust_type == MUIV_Imageadjust_Type_Background) - { - bitmap_group = (Object *)VGroup, - Child, (IPTR)(bitmap_image = (Object *)ImagedisplayObject, - TextFrame, - InnerSpacing(0,0), - MUIA_Imagedisplay_FreeHoriz, TRUE, - MUIA_Imagedisplay_FreeVert, TRUE, - MUIA_Dropable, FALSE, - End), - Child, (IPTR)(bitmap_popasl = (Object *)PopaslObject, - MUIA_Popstring_String, (IPTR)(bitmap_string = (Object *)StringObject, - StringFrame, - MUIA_CycleChain, 1, - End), - MUIA_Popstring_Button, (IPTR)PopButton(MUII_PopFile), - End), - End; - - gradient_group = (Object *)ColGroup(2), - Child, (IPTR)FreeLabel("Type:"), - Child, (IPTR)(gradient_type_cycle = MUI_MakeObject(MUIO_Cycle, - (IPTR)"Type:", (IPTR)gradient_type_entries)), - Child, (IPTR)FreeLabel("Angle:"), - Child, (IPTR)VGroup, - Child, (IPTR)HGroup, - MUIA_Group_SameWidth, TRUE, - Child, (IPTR)(gradient_horiz_button = (Object *)TextObject, - ButtonFrame, - MUIA_Background, MUII_ButtonBack, - MUIA_InputMode, MUIV_InputMode_RelVerify, - MUIA_Text_PreParse, (IPTR)"\33c", - MUIA_Text_Contents, (IPTR)"Vertical", - End), - Child, (IPTR)(gradient_vert_button = (Object *)TextObject, - ButtonFrame, - MUIA_Background, MUII_ButtonBack, - MUIA_InputMode, MUIV_InputMode_RelVerify, - MUIA_Text_PreParse, (IPTR)"\33c", - MUIA_Text_Contents, (IPTR)"Horizontal", - End), - End, - Child, (IPTR)(gradient_angle_slider = (Object *)SliderObject, - MUIA_Group_Horiz, TRUE, - MUIA_Numeric_Min, 0, - MUIA_Numeric_Max, 179, - End), - End, - Child, (IPTR)FreeLabel("Colors:"), - Child, (IPTR)HGroup, - Child, (IPTR)(gradient_start_poppen = (Object *)PoppenObject, - MUIA_Window_Title, (IPTR) "Start pen", - MUIA_Pendisplay_Spec, (IPTR) "rbbbbbbbb,bbbbbbbb,bbbbbbbb", End), - Child, (IPTR)VCenter((gradient_swap_button = (Object *)TextObject, - ButtonFrame, - MUIA_Background, MUII_ButtonBack, - MUIA_InputMode, MUIV_InputMode_RelVerify, - MUIA_Text_Contents, (IPTR)"<->", - MUIA_Weight, 0, - End)), - Child, (IPTR)(gradient_end_poppen = (Object *)PoppenObject, - MUIA_Window_Title, (IPTR) "End pen", - MUIA_Pendisplay_Spec, (IPTR)"r55555555,55555555,55555555", End), - End, - Child, (IPTR)FreeLabel("Preview:"), - Child, (IPTR)(gradient_imagedisplay = (Object *)ImagedisplayObject, - TextFrame, - InnerSpacing(0,0), - MUIA_Imagedisplay_FreeHoriz, TRUE, - MUIA_Imagedisplay_FreeVert, TRUE, - MUIA_Dropable, FALSE, - End), - End; - } - - switch (adjust_type) - { - case MUIV_Imageadjust_Type_All: - obj = (Object *)DoSuperNewTags(cl, obj, NULL, - MUIA_Register_Titles, (IPTR)labels_all, - Child, (IPTR)HCenter((pattern_group = (Object *)ColGroup(6), End)), - Child, (IPTR)HCenter((vector_group = (Object *)ColGroup(6), End)), - Child, (IPTR)color_group, - Child, (IPTR)external_group, - Child, (IPTR)bitmap_group, - Child, (IPTR)gradient_group, - TAG_MORE, (IPTR)msg->ops_AttrList); - break; - case MUIV_Imageadjust_Type_Background: - obj = (Object *)DoSuperNewTags(cl, obj, NULL, - MUIA_Register_Titles, (IPTR)labels_bg, - Child, (IPTR)HCenter((pattern_group = (Object *)ColGroup(6), End)), - Child, (IPTR)color_group, - Child, (IPTR)bitmap_group, - Child, (IPTR)gradient_group, - TAG_MORE, (IPTR)msg->ops_AttrList); - break; - case MUIV_Imageadjust_Type_Image: - obj = (Object *)DoSuperNewTags(cl, obj, NULL, - MUIA_Register_Titles, (IPTR)labels_image, - Child, (IPTR)HCenter((pattern_group = (Object *)ColGroup(6), End)), - Child, (IPTR)HCenter((vector_group = (Object *)ColGroup(6), End)), - Child, (IPTR)color_group, - Child, (IPTR)external_group, - TAG_MORE, (IPTR)msg->ops_AttrList); - break; - case MUIV_Imageadjust_Type_Pen: - obj = (Object *)DoSuperNewTags(cl, obj, NULL, - MUIA_Register_Titles, (IPTR)labels_color, - Child, (IPTR)color_group, - TAG_MORE, (IPTR)msg->ops_AttrList); - break; - } - - if (!obj) return FALSE; - - data = INST_DATA(cl, obj); - data->adjust_type = adjust_type; - data->color_group = color_group; - data->originator = (APTR)GetTagData(MUIA_Imageadjust_Originator, 0, msg->ops_AttrList); - - if (adjust_type != MUIV_Imageadjust_Type_Pen) - { - data->last_pattern_selected = -1; - data->pattern_select_hook.h_Data = data; - data->pattern_select_hook.h_Entry = HookEntry; - data->pattern_select_hook.h_SubEntry = (HOOKFUNC)Pattern_Select_Function; - - for (i=0;i<18;i++) - { - data->pattern_image[i] = (Object *)ImageObject, - ButtonFrame, - MUIA_CycleChain, 1, - InnerSpacing(4,4), - MUIA_Image_Spec, i + MUII_BACKGROUND, - MUIA_InputMode, MUIV_InputMode_Immediate, - MUIA_Image_FreeHoriz, TRUE, - MUIA_Image_FreeVert, TRUE, - MUIA_FixWidth, 16, - MUIA_FixHeight, 16, - End; - - if (data->pattern_image[i]) - { - DoMethod(pattern_group,OM_ADDMEMBER,(IPTR)data->pattern_image[i]); - DoMethod(data->pattern_image[i],MUIM_Notify,MUIA_Selected,TRUE,(IPTR)obj,3,MUIM_CallHook,(IPTR)&data->pattern_select_hook,i); - } - } - - if (adjust_type != MUIV_Imageadjust_Type_Background) - { - data->last_vector_selected = -1; - data->vector_select_hook.h_Data = data; - data->vector_select_hook.h_Entry = HookEntry; - data->vector_select_hook.h_SubEntry = (HOOKFUNC)Vector_Select_Function; - - for (i=0;i<24;i++) - { - char spec[10]; - - snprintf(spec, sizeof(spec), "1:%d", (int)i); - data->vector_image[i] = (Object *)ImageObject, - ButtonFrame, - InnerSpacing(4,4), - MUIA_CycleChain, 1, - MUIA_Image_Spec, (IPTR)spec, - MUIA_InputMode, MUIV_InputMode_Immediate, - MUIA_Weight, 0, - End; - - if (data->vector_image[i]) - { - DoMethod(vector_group,OM_ADDMEMBER,(IPTR)data->vector_image[i]); - DoMethod(data->vector_image[i],MUIM_Notify,MUIA_Selected,TRUE,(IPTR)obj,3,MUIM_CallHook,(IPTR)&data->vector_select_hook,i); - } - } - } /* if (adjust_type != MUIV_Imageadjust_Type_Background) */ - - if (adjust_type != MUIV_Imageadjust_Type_Image) - { - data->bitmap_string = bitmap_string; - data->bitmap_image = bitmap_image; - data->bitmap_hook.h_Entry = HookEntry; - data->bitmap_hook.h_SubEntry = (HOOKFUNC)Bitmap_Function; - DoMethod(bitmap_popasl, MUIM_Notify, MUIA_Popasl_Active, FALSE, - (IPTR)obj, 3, MUIM_CallHook, (IPTR)&data->bitmap_hook, (IPTR)data); - DoMethod(bitmap_string, MUIM_Notify, MUIA_String_Acknowledge, MUIV_EveryTime, - (IPTR)obj, 3, MUIM_CallHook, (IPTR)&data->bitmap_hook, (IPTR)data); - } - } /* if (adjust_type != MUIV_Imageadjust_Type_Pen) */ - - if (gradient_imagedisplay) - { - data->gradient_imagedisplay = gradient_imagedisplay; - data->gradient_start_poppen = gradient_start_poppen; - data->gradient_end_poppen = gradient_end_poppen; - data->gradient_angle_slider = gradient_angle_slider; - data->gradient_type_cycle = gradient_type_cycle; - data->gradient_vert_button = gradient_vert_button; - data->gradient_horiz_button = gradient_horiz_button; - data->gradient_swap_button = gradient_swap_button; - - DoMethod(gradient_vert_button, MUIM_Notify, MUIA_Pressed, FALSE, - (IPTR)gradient_angle_slider, 3, MUIM_Set, MUIA_Numeric_Value, 90); - DoMethod(gradient_horiz_button, MUIM_Notify, MUIA_Pressed, FALSE, - (IPTR)gradient_angle_slider, 3, MUIM_Set, MUIA_Numeric_Value, 0); - - data->gradient_swap_hook.h_Entry = HookEntry; - data->gradient_swap_hook.h_SubEntry = (HOOKFUNC)GradientSwap_Function; - DoMethod(gradient_swap_button, MUIM_Notify, MUIA_Pressed, FALSE, - (IPTR)obj, 3, MUIM_CallHook, (IPTR)&data->gradient_swap_hook, (IPTR)data); - - data->gradient_hook.h_Entry = HookEntry; - data->gradient_hook.h_SubEntry = (HOOKFUNC)Gradient_Function; - DoMethod(gradient_start_poppen, MUIM_Notify, MUIA_Pendisplay_Spec, MUIV_EveryTime, - (IPTR)obj, 3, MUIM_CallHook, (IPTR)&data->gradient_hook, (IPTR)data); - DoMethod(gradient_end_poppen, MUIM_Notify, MUIA_Pendisplay_Spec, MUIV_EveryTime, - (IPTR)obj, 3, MUIM_CallHook, (IPTR)&data->gradient_hook, (IPTR)data); - DoMethod(gradient_angle_slider, MUIM_Notify, MUIA_Numeric_Value, MUIV_EveryTime, - (IPTR)obj, 3, MUIM_CallHook, (IPTR)&data->gradient_hook, (IPTR)data); - DoMethod(gradient_type_cycle, MUIM_Notify, MUIA_Cycle_Active, MUIV_EveryTime, - (IPTR)obj, 3, MUIM_CallHook, (IPTR)&data->gradient_hook, (IPTR)data); - - /* Set the gradient image to correct values */ - Gradient_Function(NULL,obj,&data); - - } /* if (gradient_imagedisplay) */ - - /* parse initial taglist */ - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) - { - switch (tag->ti_Tag) - { - case MUIA_Imageadjust_Spec: - spec = (char*)tag->ti_Data; - break; - } - } - - if (adjust_type != MUIV_Imageadjust_Type_Background && - adjust_type != MUIV_Imageadjust_Type_Pen) - { - data->external_list = external_list; - data->external_display_hook.h_Entry = HookEntry; - data->external_display_hook.h_SubEntry = (HOOKFUNC)Imageadjust_External_Display; - set(data->external_list, MUIA_List_DisplayHook, (IPTR)&data->external_display_hook); - - data->external_construct_hook.h_Entry = HookEntry; - data->external_construct_hook.h_SubEntry = (HOOKFUNC)Imageadjust_External_Construct; - set(data->external_list, MUIA_List_ConstructHook, (IPTR)&data->external_construct_hook); - - data->external_destruct_hook.h_Entry = HookEntry; - data->external_destruct_hook.h_SubEntry = (HOOKFUNC)Imageadjust_External_Destruct; - set(data->external_list, MUIA_List_DestructHook, (IPTR)&data->external_destruct_hook); - - /* Because we have many childs, we disable the forwarding of the notify method */ - DoMethod(obj, MUIM_Group_DoMethodNoForward, MUIM_Notify, - MUIA_Group_ActivePage, 3, (IPTR)obj, 1, - MUIM_Imageadjust_ReadExternal); - - if (data->originator) - DoMethod(data->external_list, MUIM_Notify, - MUIA_Listview_DoubleClick, TRUE, - MUIV_Notify_Application, 5, MUIM_Application_PushMethod, - (IPTR)data->originator, 2, MUIM_Popimage_CloseWindow, TRUE); - } - Imageadjust_SetImagespec(obj,data,spec); - return (IPTR)obj; -} - -IPTR Imageadjust__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) -{ - struct Imageadjust_DATA *data = INST_DATA(cl, obj); - - if (data->imagespec) FreeVec(data->imagespec); - - DoSuperMethodA(cl,obj,msg); - return 0; -} - -IPTR Imageadjust__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct TagItem *tags; - struct TagItem *tag; - struct Imageadjust_DATA *data = INST_DATA(cl, obj); - - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) - { - switch (tag->ti_Tag) - { - case MUIA_Imageadjust_Spec: - Imageadjust_SetImagespec(obj,data,(char*)tag->ti_Data); - break; - } - } - - return DoSuperMethodA(cl,obj,(Msg)msg); -} - -IPTR Imageadjust__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) -{ - struct Imageadjust_DATA *data = INST_DATA(cl, obj); - struct pages { - LONG type; - LONG pos[6]; - }; - - const static struct pages pages_per_type[] = - { - { MUIV_Imageadjust_Type_Pen, { 2, -1, -1, -1, -1, -1} }, - { MUIV_Imageadjust_Type_Background, { 0, 2, 4, 5, -1, -1} }, - { MUIV_Imageadjust_Type_Image, { 0, 1, 2, 3, -1, -1} }, - { MUIV_Imageadjust_Type_All, { 0, 1, 2, 3, 4, 5} }, - }; - - switch (msg->opg_AttrID) - { - case MUIA_Imageadjust_Spec: - { - int i; - - LONG act = 0; - if (data->imagespec) - { - FreeVec(data->imagespec); - data->imagespec = NULL; - } - - get(obj, MUIA_Group_ActivePage, &act); - - for (i = 0; i < 4; i++) - { - if (pages_per_type[i].type == data->adjust_type) - break; - } - - act = pages_per_type[i].pos[act]; - - switch (act) - { - case 0: /* Pattern */ - if ((data->imagespec = AllocVec(40,0))) - { - if (data->last_pattern_selected != -1) - snprintf(data->imagespec, 40, "0:%d", - (int)data->last_pattern_selected+128); - else - strcpy(data->imagespec,"0:128"); - } - break; - - case 1: - if ((data->imagespec = AllocVec(20,0))) - { - if (data->last_vector_selected != -1) - snprintf(data->imagespec, 20, "1:%d", - (int)data->last_vector_selected); - else - strcpy(data->imagespec,"0:128"); - } - break; - - case 2: - { - struct MUI_PenSpec *penspec = NULL; - - get(data->color_group, MUIA_Penadjust_Spec, &penspec); - if (penspec) - { - LONG len; - D(bug("imageadjust: penspec = %s\n", penspec)); - len = strlen((STRPTR)penspec) + 3; - if ((data->imagespec = AllocVec(len, 0))) - snprintf(data->imagespec, len, "2:%s", penspec->ps_buf); - } - } - break; - - case 3: /* External */ - { - struct ExternalListEntry *entry; - - DoMethod(data->external_list, MUIM_List_GetEntry, - MUIV_List_GetEntry_Active, (IPTR)&entry); - if (entry != NULL && entry->filename != NULL&& entry->reldir != NULL) - { - LONG len; - len = 2 + strlen(entry->reldir) + 1 + strlen(entry->filename) + 1; - if ((data->imagespec = AllocVec(len, 0))) - { - snprintf(data->imagespec, len, "3:%s/%s", - entry->reldir, entry->filename); - D(bug("Imageadjust_OM_GET: imspec=%s\n", data->imagespec)); - } - } - } - break; - - case 4: /* Bitmap */ - { - char *str = NULL; - get(data->bitmap_string,MUIA_String_Contents,&str); - if (str) - { - LONG len; - len = strlen(str) + 10; - if ((data->imagespec = AllocVec(len, 0))) - snprintf(data->imagespec, len, "5:%s", str); - } - } - break; - - case 5: /* Gradient */ - data->imagespec = StrDup(data->gradient_imagespec); - break; - } - if (data->imagespec) *msg->opg_Storage = (IPTR)data->imagespec; - else *msg->opg_Storage = (IPTR)"0:128"; - } - return TRUE; - } - - return (DoSuperMethodA(cl, obj, (Msg) msg)); -} - -IPTR Imageadjust__MUIM_Imageadjust_ReadExternal(struct IClass *cl, Object *obj, Msg msg) -{ - struct Imageadjust_DATA *data = INST_DATA(cl, obj); - - DoMethod(data->external_list, MUIM_List_Clear); - set(data->external_list, MUIA_List_Quiet, TRUE); - AddDirectory(data->external_list, IMSPEC_EXTERNAL_PREFIX, -1); - set(data->external_list, MUIA_List_Quiet, FALSE); - return 0; -} - -#if 0 -IPTR Imageadjust__MUIM_Imageadjust_ExternalSelected(struct IClass *cl, Object *obj, Msg msg) -{ - struct Imageadjust_DATA *data = INST_DATA(cl, obj); - - if (data->originator) - DoMethod(_app(obj), MUIM_Application_PushMethod, data->originator, 2, - MUIM_Popimage_CloseWindow, TRUE); - return 0; -} -#endif - -#if ZUNE_BUILTIN_IMAGEADJUST -BOOPSI_DISPATCHER(IPTR, Imageadjust_Dispatcher, cl, obj, msg) -{ - switch (msg->MethodID) - { - case OM_NEW: - return Imageadjust__OM_NEW(cl, obj, (struct opSet *)msg); - - case OM_DISPOSE: - return Imageadjust__OM_DISPOSE(cl,obj,(APTR)msg); - - case OM_SET: - return Imageadjust__OM_SET(cl, obj, (struct opSet *)msg); - - case OM_GET: - return Imageadjust__OM_GET(cl,obj,(APTR)msg); - - case MUIM_Imageadjust_ReadExternal: - return Imageadjust__MUIM_Imageadjust_ReadExternal(cl,obj,(APTR)msg); - - //case MUIM_Imageadjust_ExternalSelected: - //return Imageadjust__MUIM_Imageadjust_ExternalSelected(cl,obj,(APTR)msg); - - default: - return DoSuperMethodA(cl, obj, msg); - } -} -BOOPSI_DISPATCHER_END - -const struct __MUIBuiltinClass _MUI_Imageadjust_desc = -{ - MUIC_Imageadjust, - MUIC_Register, - sizeof(struct Imageadjust_DATA), - (void*)Imageadjust_Dispatcher -}; -#endif /* ZUNE_BUILTIN_IMAGEADJUST */ +/* + Copyright © 2002-2003, The AROS Development Team. All rights reserved. + $Id$ +*/ + +#define MUIMASTER_YES_INLINE_STDARG + +#include <stdio.h> +#include <stdlib.h> + +#include <graphics/gfx.h> +#include <graphics/view.h> +#include <clib/alib_protos.h> + +#include <proto/dos.h> +#include <proto/exec.h> +#include <proto/graphics.h> +#include <proto/utility.h> +#include <proto/intuition.h> +#include <proto/muimaster.h> + +#include <string.h> + +/* #define MYDEBUG 1 */ +#include "debug.h" + +#include "imspec_intern.h" +#include "mui.h" +#include "muimaster_intern.h" +#include "support.h" +#include "support_classes.h" +#include "imageadjust_private.h" + +extern struct Library *MUIMasterBase; + +STATIC STRPTR StrDupPooled(APTR pool, CONST_STRPTR str) +{ + char *newstr; + if (!str) + return NULL; + newstr = AllocPooled(pool, strlen(str) + 1); + if (newstr) + strcpy(newstr, str); + return newstr; +} + +static void Bitmap_Function(struct Hook *hook, Object *obj, APTR msg) +{ + struct Imageadjust_DATA *data = *(struct Imageadjust_DATA **)msg; + char buf[255]; + STRPTR name = NULL; + + get(data->bitmap_string, MUIA_String_Contents, &name); + if (name && strlen(name) > 0) + { + snprintf(buf, 255, "5:%s", name); + set(data->bitmap_image, MUIA_Imagedisplay_Spec, (IPTR) buf); + } +} + + +static void Gradient_Function(struct Hook *hook, Object *obj, APTR msg) +{ + struct Imageadjust_DATA *data = *(struct Imageadjust_DATA **)msg; + struct MUI_RGBcolor *start_rgb; + struct MUI_RGBcolor *end_rgb; + LONG angle = XGET(data->gradient_angle_slider, MUIA_Numeric_Value); + LONG is_tiled = XGET(data->gradient_type_cycle, MUIA_Cycle_Active); + + start_rgb = (struct MUI_RGBcolor *)XGET(data->gradient_start_poppen, + MUIA_Pendisplay_RGBcolor); + end_rgb = (struct MUI_RGBcolor *)XGET(data->gradient_end_poppen, + MUIA_Pendisplay_RGBcolor); + + snprintf(data->gradient_imagespec, sizeof(data->gradient_imagespec), + "%s:%d,%08x,%08x,%08x-%08x,%08x,%08x", + is_tiled ? "8" : "7", + (int)angle, + (unsigned int)start_rgb->red, + (unsigned int)start_rgb->green, + (unsigned int)start_rgb->blue, + (unsigned int)end_rgb->red, + (unsigned int)end_rgb->green, (unsigned int)end_rgb->blue); + + set(data->gradient_imagedisplay, MUIA_Imagedisplay_Spec, + data->gradient_imagespec); +} + +static void GradientSwap_Function(struct Hook *hook, Object *obj, APTR msg) +{ + struct Imageadjust_DATA *data = *(struct Imageadjust_DATA **)msg; + struct MUI_RGBcolor *start_rgb; + struct MUI_RGBcolor *end_rgb; + struct MUI_RGBcolor tmp; + + start_rgb = (struct MUI_RGBcolor *)XGET(data->gradient_start_poppen, + MUIA_Pendisplay_RGBcolor); + end_rgb = (struct MUI_RGBcolor *)XGET(data->gradient_end_poppen, + MUIA_Pendisplay_RGBcolor); + + tmp = *start_rgb; + set(data->gradient_start_poppen, MUIA_Pendisplay_RGBcolor, + (IPTR) end_rgb); + set(data->gradient_end_poppen, MUIA_Pendisplay_RGBcolor, (IPTR) & tmp); + Gradient_Function(NULL, obj, &data); +} + + +static VOID Pattern_Select_Function(struct Hook *hook, Object *obj, + void **msg) +{ + struct Imageadjust_DATA *data = (struct Imageadjust_DATA *)hook->h_Data; + SIPTR new_selected = (SIPTR) msg[0]; + + if (data->last_pattern_selected != -1) + set(data->pattern_image[data->last_pattern_selected], MUIA_Selected, + FALSE); + data->last_pattern_selected = new_selected; +} + + +static VOID Vector_Select_Function(struct Hook *hook, Object *obj, + void **msg) +{ + struct Imageadjust_DATA *data = (struct Imageadjust_DATA *)hook->h_Data; + SIPTR new_selected = (SIPTR) msg[0]; + + if (data->last_vector_selected != -1) + set(data->vector_image[data->last_vector_selected], MUIA_Selected, + FALSE); + data->last_vector_selected = new_selected; +} + + +struct ExternalListEntry +{ + STRPTR reldir; + ULONG dirlen; + STRPTR filename; + ULONG namelen; + LONG type; +}; + +static void Imageadjust_External_Display(struct Hook *h, char **strings, + struct ExternalListEntry *entry) +{ + static char buf[256]; + + if (entry->filename) + { + int len; + *strings = buf; + snprintf(buf, 256, "%s", FilePart(entry->filename)); + buf[255] = 0; + len = strlen(buf); + if (len > 4 && !strcmp(buf + len - 4, ".mf0")) + buf[len - 4] = 0; + else if (len > 4 && !strcmp(buf + len - 4, ".mb0")) + buf[len - 4] = 0; + else if (len > 4 && !strcmp(buf + len - 4, ".mbr")) + buf[len - 4] = 0; + else if (len > 6 && !strcmp(buf + len - 6, ".image")) + buf[len - 6] = 0; + } +} + +static struct ExternalListEntry *Imageadjust_External_Construct(struct Hook + *h, APTR pool, struct ExternalListEntry *ele) +{ + struct ExternalListEntry *entry = NULL; + + if (NULL == ele) + return NULL; + + if (NULL != ele->filename) + { + entry = AllocPooled(pool, sizeof(struct ExternalListEntry)); + if (NULL != entry) + { + *entry = *ele; + entry->filename = StrDupPooled(pool, entry->filename); + entry->reldir = StrDupPooled(pool, entry->reldir); + return entry; + } + } + return NULL; +} + +static void Imageadjust_External_Destruct(struct Hook *h, APTR pool, + struct ExternalListEntry *entry) +{ + if (entry != NULL) + { + if (entry->filename != NULL) + FreePooled(pool, entry->filename, entry->namelen + 1); + if (entry->reldir != NULL) + FreePooled(pool, entry->reldir, entry->dirlen + 1); + FreePooled(pool, entry, sizeof(struct ExternalListEntry)); + } +} + + +/************************************************************************** + Adds a directory to the list +**************************************************************************/ +static int AddDirectory(Object *list, STRPTR dir, LONG parent) +{ + BPTR lock = Lock(dir, ACCESS_READ); + struct ExAllControl *eac; + struct ExAllData *ead, *EAData; + LONG more; + int dir_len = strlen(dir); + if (!lock) + return 0; + + //bug("AddDirectory: locked %s\n", dir); + + eac = (struct ExAllControl *)AllocDosObject(DOS_EXALLCONTROL, NULL); + if (!eac) + { + UnLock(lock); + return 0; + } + + EAData = AllocVec(1024, 0); + if (!EAData) + { + FreeDosObject(DOS_EXALLCONTROL, eac); + UnLock(lock); + return 0; + } + + eac->eac_LastKey = 0; + + do + { + //DoMethod(_app(list), MUIM_Application_InputBuffered); + + more = ExAll(lock, EAData, 1024, ED_TYPE, eac); + if ((!more) && (IoErr() != ERROR_NO_MORE_ENTRIES)) + break; + if (eac->eac_Entries == 0) + continue; + + ead = EAData; + do + { + size_t namelen = strlen(ead->ed_Name); + int len = dir_len + namelen + 10; + char *buf; + + //DoMethod(_app(list), MUIM_Application_InputBuffered); + + buf = AllocVec(len, 0); + if (buf) + { + LONG num = 0; + int is_directory; + BOOL add_me = TRUE; + + if (ead->ed_Type > 0) + { + is_directory = 1; + if (ead->ed_Type == ST_SOFTLINK) + { + /* TODO: Special handling */ + } + } + else + is_directory = 0; + + strcpy(buf, dir); + AddPart(buf, ead->ed_Name, len); + + if (!is_directory && namelen > 4 + && !strcmp(ead->ed_Name + namelen - 4, ".mf1")) + add_me = FALSE; + if (!is_directory && namelen > 4 + && !strcmp(ead->ed_Name + namelen - 4, ".mb1")) + add_me = FALSE; + + if (add_me) + { + struct ExternalListEntry ele; + //bug("AddDirectory: adding image %s\n", buf); + + + ele.reldir = dir + strlen(IMSPEC_EXTERNAL_PREFIX); + ele.dirlen = strlen(ele.reldir); + ele.filename = ead->ed_Name; + ele.namelen = strlen(ele.filename); + ele.type = ead->ed_Type; + + if (!is_directory) + { + num = DoMethod(list, MUIM_List_InsertSingle, + (IPTR) & ele, MUIV_List_Insert_Bottom); + } + } + // FIXME: where does num's value come from here? + if (num != -1 && is_directory) + { + AddDirectory(list, buf, num); + } + FreeVec(buf); + } + ead = ead->ed_Next; + } + while (ead); + } + while (more); + + FreeVec(EAData); + FreeDosObject(DOS_EXALLCONTROL, eac); + UnLock(lock); + return 1; +} + + + +/************************************************************************** + ... +**************************************************************************/ +STATIC VOID Imageadjust_SetImagespec(Object *obj, + struct Imageadjust_DATA *data, char *spec) +{ + char *s; + if (!spec) + spec = "0:128"; + + s = (char *)spec; + + switch (*s) + { + case '0': + { + LONG pat; + StrToLong(s + 2, &pat); + pat -= MUII_BACKGROUND; + + if (pat >= 0 && pat < 18) + { + set(data->pattern_image[pat], MUIA_Selected, TRUE); + set(obj, MUIA_Group_ActivePage, 0); + } + } + break; + + case '1': + { + LONG vect; + StrToLong(s + 2, &vect); + + if (vect >= 0 && vect < 24) + { + set(data->vector_image[vect], MUIA_Selected, TRUE); + set(obj, MUIA_Group_ActivePage, 1); + } + + } + break; + + case '2': + switch (data->adjust_type) + { + case MUIV_Imageadjust_Type_All: + case MUIV_Imageadjust_Type_Image: + nfset(obj, MUIA_Group_ActivePage, 2); + break; + case MUIV_Imageadjust_Type_Background: + nfset(obj, MUIA_Group_ActivePage, 1); + break; + default: + nfset(obj, MUIA_Group_ActivePage, 0); + break; + } + D(bug("imageadjust: setting color to %s\n", s)); + set(data->color_group, MUIA_Penadjust_Spec, (IPTR) s + 2); + break; + + case '3': + case '4': + { + struct ExternalListEntry *entry; + LONG entries = 0; + int i; + + set(obj, MUIA_Group_ActivePage, 3); + + get(data->external_list, MUIA_List_Entries, &entries); + for (i = 0; i < entries; i++) + { + DoMethod(data->external_list, MUIM_List_GetEntry, i, + (IPTR) & entry); + if (entry != NULL + && entry->reldir != NULL && entry->filename != NULL) + { + STRPTR file = FilePart(s + 2); + //bug("entry->reldir = %s, s + 2 = %s, len=%d\n", + //entry->reldir, s + 2, strlen(s + 2) - strlen(file) - 1); + if (!strncmp(entry->reldir, s + 2, + strlen(s + 2) - strlen(file) - 1)) + { + //bug("entry->filename = %s, file = %s\n", + //entry->filename, file); + if (!strcmp(entry->filename, file)) + { + set(data->external_list, MUIA_List_Active, i); + break; + } + } + } + } + } + break; + + case '5': + set(data->bitmap_string, MUIA_String_Contents, (IPTR) s + 2); + Bitmap_Function(NULL, obj, &data); + if (data->adjust_type == MUIV_Imageadjust_Type_All) + set(obj, MUIA_Group_ActivePage, 4); + else + set(obj, MUIA_Group_ActivePage, 2); + break; + + case '6': + { + LONG img; + StrToLong(s + 2, &img); + } + break; + + case '7': + case '8': + { + struct MUI_ImageSpec_intern spec; + if (zune_gradient_string_to_intern(s + 2, &spec)) + { + struct MUI_RGBcolor col; + col.red = spec.u.gradient.start_rgb[0] * 0x01010101; + col.green = spec.u.gradient.start_rgb[1] * 0x01010101; + col.blue = spec.u.gradient.start_rgb[2] * 0x01010101; + + nnset(data->gradient_start_poppen, MUIA_Pendisplay_RGBcolor, + &col); + + col.red = spec.u.gradient.end_rgb[0] * 0x01010101; + col.green = spec.u.gradient.end_rgb[1] * 0x01010101; + col.blue = spec.u.gradient.end_rgb[2] * 0x01010101; + + nnset(data->gradient_end_poppen, MUIA_Pendisplay_RGBcolor, + &col); + + nnset(data->gradient_angle_slider, MUIA_Numeric_Value, + spec.u.gradient.angle); + + set(data->gradient_type_cycle, MUIA_Cycle_Active, + *s == '7' ? 0 : 1); + } + + Gradient_Function(NULL, obj, &data); + if (data->adjust_type == MUIV_Imageadjust_Type_All) + set(obj, MUIA_Group_ActivePage, 5); + else + set(obj, MUIA_Group_ActivePage, 3); + } + break; + } +} + +IPTR Imageadjust__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) +{ + struct Imageadjust_DATA *data; + struct TagItem *tag; + struct TagItem *tags; + static const char *const labels_all[] = + { "Pattern", "Vector", "Color", "External", "Bitmap", "Gradient", + NULL }; + static const char *const labels_image[] = + { "Pattern", "Vector", "Color", "External", NULL }; + static const char *const labels_bg[] = + { "Pattern", "Color", "Bitmap", "Gradient", NULL }; + static const char *const labels_color[] = { "Color", NULL }; + static const char *const gradient_type_entries[] = + { "Scaled", "Tiled", NULL }; + + Object *pattern_group = NULL; + Object *vector_group = NULL; + Object *external_list = NULL; + Object *bitmap_string = NULL; + Object *bitmap_image = NULL; + Object *bitmap_popasl = NULL; + Object *gradient_imagedisplay = NULL; + Object *gradient_start_poppen = NULL; + Object *gradient_end_poppen = NULL; + Object *gradient_angle_slider = NULL; + Object *gradient_type_cycle = NULL; + Object *gradient_horiz_button = NULL; + Object *gradient_vert_button = NULL; + Object *gradient_swap_button = NULL; + char *spec = NULL; + LONG i; + LONG adjust_type; + Object *color_group = NULL; + Object *external_group = NULL; + Object *bitmap_group = NULL; + Object *gradient_group = NULL; + + adjust_type = + GetTagData(MUIA_Imageadjust_Type, MUIV_Imageadjust_Type_All, + msg->ops_AttrList); + + color_group = MUI_NewObject(MUIC_Penadjust, TAG_DONE); + + if (adjust_type == MUIV_Imageadjust_Type_All || + adjust_type == MUIV_Imageadjust_Type_Image) + { + external_group = (Object *) ListviewObject, + MUIA_Listview_List, (IPTR) (external_list = + (Object *) ListObject, InputListFrame, + MUIA_List_ConstructHook, MUIV_List_ConstructHook_String, + MUIA_List_DestructHook, MUIV_List_DestructHook_String, + End), + End; + } + + if (adjust_type == MUIV_Imageadjust_Type_All || + adjust_type == MUIV_Imageadjust_Type_Background) + { + bitmap_group = (Object *) VGroup, + Child, (IPTR) (bitmap_image = (Object *) ImagedisplayObject, + TextFrame, + InnerSpacing(0, 0), + MUIA_Imagedisplay_FreeHoriz, TRUE, + MUIA_Imagedisplay_FreeVert, TRUE, + MUIA_Dropable, FALSE, + End), + Child, (IPTR) (bitmap_popasl = (Object *) PopaslObject, + MUIA_Popstring_String, (IPTR) (bitmap_string = + (Object *) StringObject, StringFrame, MUIA_CycleChain, 1, + End), + MUIA_Popstring_Button, (IPTR) PopButton(MUII_PopFile), + End), + End; + + gradient_group = (Object *) ColGroup(2), + Child, (IPTR) FreeLabel("Type:"), + Child, (IPTR) (gradient_type_cycle = MUI_MakeObject(MUIO_Cycle, + (IPTR) "Type:", (IPTR) gradient_type_entries)), + Child, (IPTR) FreeLabel("Angle:"), + Child, (IPTR) VGroup, + Child, (IPTR) HGroup, + MUIA_Group_SameWidth, TRUE, + Child, + (IPTR) (gradient_horiz_button = (Object *) TextObject, + ButtonFrame, + MUIA_Background, MUII_ButtonBack, + MUIA_InputMode, MUIV_InputMode_RelVerify, + MUIA_Text_PreParse, (IPTR) "\33c", + MUIA_Text_Contents, (IPTR) "Vertical", + End), + Child, + (IPTR) (gradient_vert_button = (Object *) TextObject, + ButtonFrame, + MUIA_Background, MUII_ButtonBack, + MUIA_InputMode, MUIV_InputMode_RelVerify, + MUIA_Text_PreParse, (IPTR) "\33c", + MUIA_Text_Contents, (IPTR) "Horizontal", + End), + End, + Child, (IPTR) (gradient_angle_slider = (Object *) SliderObject, + MUIA_Group_Horiz, TRUE, + MUIA_Numeric_Min, 0, + MUIA_Numeric_Max, 179, + End), + End, + Child, (IPTR) FreeLabel("Colors:"), + Child, (IPTR) HGroup, + Child, (IPTR) (gradient_start_poppen = (Object *) PoppenObject, + MUIA_Window_Title, (IPTR) "Start pen", + MUIA_Pendisplay_Spec, (IPTR) "rbbbbbbbb,bbbbbbbb,bbbbbbbb", + End), + Child, (IPTR) VCenter((gradient_swap_button = + (Object *) TextObject, ButtonFrame, + MUIA_Background, MUII_ButtonBack, + MUIA_InputMode, MUIV_InputMode_RelVerify, + MUIA_Text_Contents, (IPTR) "<->", + MUIA_Weight, 0, + End)), + Child, (IPTR) (gradient_end_poppen = + (Object *) PoppenObject, + MUIA_Window_Title, (IPTR) "End pen", + MUIA_Pendisplay_Spec, (IPTR) "r55555555,55555555,55555555", + End), + End, + Child, (IPTR) FreeLabel("Preview:"), + Child, (IPTR) (gradient_imagedisplay = + (Object *) ImagedisplayObject, TextFrame, + InnerSpacing(0, 0), + MUIA_Imagedisplay_FreeHoriz, TRUE, + MUIA_Imagedisplay_FreeVert, TRUE, + MUIA_Dropable, FALSE, + End), + End; + } + + switch (adjust_type) + { + case MUIV_Imageadjust_Type_All: + obj = (Object *) DoSuperNewTags(cl, obj, NULL, + MUIA_Register_Titles, (IPTR) labels_all, + Child, (IPTR) HCenter((pattern_group = + (Object *) ColGroup(6), End)), + Child, (IPTR) HCenter((vector_group = + (Object *) ColGroup(6), End)), + Child, (IPTR) color_group, + Child, (IPTR) external_group, + Child, (IPTR) bitmap_group, + Child, (IPTR) gradient_group, + TAG_MORE, (IPTR) msg->ops_AttrList); + break; + case MUIV_Imageadjust_Type_Background: + obj = (Object *) DoSuperNewTags(cl, obj, NULL, + MUIA_Register_Titles, (IPTR) labels_bg, + Child, (IPTR) HCenter((pattern_group = + (Object *) ColGroup(6), End)), + Child, (IPTR) color_group, + Child, (IPTR) bitmap_group, + Child, (IPTR) gradient_group, + TAG_MORE, (IPTR) msg->ops_AttrList); + break; + case MUIV_Imageadjust_Type_Image: + obj = (Object *) DoSuperNewTags(cl, obj, NULL, + MUIA_Register_Titles, (IPTR) labels_image, + Child, (IPTR) HCenter((pattern_group = + (Object *) ColGroup(6), End)), + Child, (IPTR) HCenter((vector_group = + (Object *) ColGroup(6), End)), + Child, (IPTR) color_group, + Child, (IPTR) external_group, + TAG_MORE, (IPTR) msg->ops_AttrList); + break; + case MUIV_Imageadjust_Type_Pen: + obj = (Object *) DoSuperNewTags(cl, obj, NULL, + MUIA_Register_Titles, (IPTR) labels_color, + Child, (IPTR) color_group, + TAG_MORE, (IPTR) msg->ops_AttrList); + break; + } + + if (!obj) + return FALSE; + + data = INST_DATA(cl, obj); + data->adjust_type = adjust_type; + data->color_group = color_group; + data->originator = + (APTR) GetTagData(MUIA_Imageadjust_Originator, 0, + msg->ops_AttrList); + + if (adjust_type != MUIV_Imageadjust_Type_Pen) + { + data->last_pattern_selected = -1; + data->pattern_select_hook.h_Data = data; + data->pattern_select_hook.h_Entry = HookEntry; + data->pattern_select_hook.h_SubEntry = + (HOOKFUNC) Pattern_Select_Function; + + for (i = 0; i < 18; i++) + { + data->pattern_image[i] = (Object *) ImageObject, + ButtonFrame, + MUIA_CycleChain, 1, + InnerSpacing(4, 4), + MUIA_Image_Spec, i + MUII_BACKGROUND, + MUIA_InputMode, MUIV_InputMode_Immediate, + MUIA_Image_FreeHoriz, TRUE, + MUIA_Image_FreeVert, TRUE, + MUIA_FixWidth, 16, MUIA_FixHeight, 16, End; + + if (data->pattern_image[i]) + { + DoMethod(pattern_group, OM_ADDMEMBER, + (IPTR) data->pattern_image[i]); + DoMethod(data->pattern_image[i], MUIM_Notify, MUIA_Selected, + TRUE, (IPTR) obj, 3, MUIM_CallHook, + (IPTR) &data->pattern_select_hook, i); + } + } + + if (adjust_type != MUIV_Imageadjust_Type_Background) + { + data->last_vector_selected = -1; + data->vector_select_hook.h_Data = data; + data->vector_select_hook.h_Entry = HookEntry; + data->vector_select_hook.h_SubEntry = + (HOOKFUNC) Vector_Select_Function; + + for (i = 0; i < 24; i++) + { + char spec[10]; + + snprintf(spec, sizeof(spec), "1:%d", (int)i); + data->vector_image[i] = (Object *) ImageObject, + ButtonFrame, + InnerSpacing(4, 4), + MUIA_CycleChain, 1, + MUIA_Image_Spec, (IPTR) spec, + MUIA_InputMode, MUIV_InputMode_Immediate, + MUIA_Weight, 0, End; + + if (data->vector_image[i]) + { + DoMethod(vector_group, OM_ADDMEMBER, + (IPTR) data->vector_image[i]); + DoMethod(data->vector_image[i], MUIM_Notify, + MUIA_Selected, TRUE, (IPTR) obj, 3, MUIM_CallHook, + (IPTR) & data->vector_select_hook, i); + } + } + } + + if (adjust_type != MUIV_Imageadjust_Type_Image) + { + data->bitmap_string = bitmap_string; + data->bitmap_image = bitmap_image; + data->bitmap_hook.h_Entry = HookEntry; + data->bitmap_hook.h_SubEntry = (HOOKFUNC) Bitmap_Function; + DoMethod(bitmap_popasl, MUIM_Notify, MUIA_Popasl_Active, FALSE, + (IPTR) obj, 3, MUIM_CallHook, (IPTR) & data->bitmap_hook, + (IPTR) data); + DoMethod(bitmap_string, MUIM_Notify, MUIA_String_Acknowledge, + MUIV_EveryTime, (IPTR) obj, 3, MUIM_CallHook, + (IPTR) & data->bitmap_hook, (IPTR) data); + } + } + + if (gradient_imagedisplay) + { + data->gradient_imagedisplay = gradient_imagedisplay; + data->gradient_start_poppen = gradient_start_poppen; + data->gradient_end_poppen = gradient_end_poppen; + data->gradient_angle_slider = gradient_angle_slider; + data->gradient_type_cycle = gradient_type_cycle; + data->gradient_vert_button = gradient_vert_button; + data->gradient_horiz_button = gradient_horiz_button; + data->gradient_swap_button = gradient_swap_button; + + DoMethod(gradient_vert_button, MUIM_Notify, MUIA_Pressed, FALSE, + (IPTR) gradient_angle_slider, 3, MUIM_Set, MUIA_Numeric_Value, + 90); + DoMethod(gradient_horiz_button, MUIM_Notify, MUIA_Pressed, FALSE, + (IPTR) gradient_angle_slider, 3, MUIM_Set, MUIA_Numeric_Value, + 0); + + data->gradient_swap_hook.h_Entry = HookEntry; + data->gradient_swap_hook.h_SubEntry = + (HOOKFUNC) GradientSwap_Function; + DoMethod(gradient_swap_button, MUIM_Notify, MUIA_Pressed, FALSE, + (IPTR) obj, 3, MUIM_CallHook, (IPTR) & data->gradient_swap_hook, + (IPTR) data); + + data->gradient_hook.h_Entry = HookEntry; + data->gradient_hook.h_SubEntry = (HOOKFUNC) Gradient_Function; + DoMethod(gradient_start_poppen, MUIM_Notify, MUIA_Pendisplay_Spec, + MUIV_EveryTime, (IPTR) obj, 3, MUIM_CallHook, + (IPTR) & data->gradient_hook, (IPTR) data); + DoMethod(gradient_end_poppen, MUIM_Notify, MUIA_Pendisplay_Spec, + MUIV_EveryTime, (IPTR) obj, 3, MUIM_CallHook, + (IPTR) & data->gradient_hook, (IPTR) data); + DoMethod(gradient_angle_slider, MUIM_Notify, MUIA_Numeric_Value, + MUIV_EveryTime, (IPTR) obj, 3, MUIM_CallHook, + (IPTR) & data->gradient_hook, (IPTR) data); + DoMethod(gradient_type_cycle, MUIM_Notify, MUIA_Cycle_Active, + MUIV_EveryTime, (IPTR) obj, 3, MUIM_CallHook, + (IPTR) & data->gradient_hook, (IPTR) data); + + /* Set the gradient image to correct values */ + Gradient_Function(NULL, obj, &data); + } + + /* parse initial taglist */ + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) + { + switch (tag->ti_Tag) + { + case MUIA_Imageadjust_Spec: + spec = (char *)tag->ti_Data; + break; + } + } + + if (adjust_type != MUIV_Imageadjust_Type_Background && + adjust_type != MUIV_Imageadjust_Type_Pen) + { + data->external_list = external_list; + data->external_display_hook.h_Entry = HookEntry; + data->external_display_hook.h_SubEntry = + (HOOKFUNC) Imageadjust_External_Display; + set(data->external_list, MUIA_List_DisplayHook, + (IPTR) & data->external_display_hook); + + data->external_construct_hook.h_Entry = HookEntry; + data->external_construct_hook.h_SubEntry = + (HOOKFUNC) Imageadjust_External_Construct; + set(data->external_list, MUIA_List_ConstructHook, + (IPTR) & data->external_construct_hook); + + data->external_destruct_hook.h_Entry = HookEntry; + data->external_destruct_hook.h_SubEntry = + (HOOKFUNC) Imageadjust_External_Destruct; + set(data->external_list, MUIA_List_DestructHook, + (IPTR) & data->external_destruct_hook); + + /* Because we have many children, we disable the forwarding of the + * notify method */ + DoMethod(obj, MUIM_Group_DoMethodNoForward, MUIM_Notify, + MUIA_Group_ActivePage, 3, (IPTR) obj, 1, + MUIM_Imageadjust_ReadExternal); + + if (data->originator) + DoMethod(data->external_list, MUIM_Notify, + MUIA_Listview_DoubleClick, TRUE, + MUIV_Notify_Application, 5, MUIM_Application_PushMethod, + (IPTR) data->originator, 2, MUIM_Popimage_CloseWindow, + TRUE); + } + Imageadjust_SetImagespec(obj, data, spec); + return (IPTR) obj; +} + +IPTR Imageadjust__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) +{ + struct Imageadjust_DATA *data = INST_DATA(cl, obj); + + if (data->imagespec) + FreeVec(data->imagespec); + + DoSuperMethodA(cl, obj, msg); + return 0; +} + +IPTR Imageadjust__OM_SET(struct IClass *cl, Object *obj, + struct opSet *msg) +{ + struct TagItem *tags; + struct TagItem *tag; + struct Imageadjust_DATA *data = INST_DATA(cl, obj); + + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) + { + switch (tag->ti_Tag) + { + case MUIA_Imageadjust_Spec: + Imageadjust_SetImagespec(obj, data, (char *)tag->ti_Data); + break; + } + } + + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +IPTR Imageadjust__OM_GET(struct IClass *cl, Object *obj, + struct opGet *msg) +{ + struct Imageadjust_DATA *data = INST_DATA(cl, obj); + struct pages + { + LONG type; + LONG pos[6]; + }; + + const static struct pages pages_per_type[] = + { + {MUIV_Imageadjust_Type_Pen, {2, -1, -1, -1, -1, -1}}, + {MUIV_Imageadjust_Type_Background, {0, 2, 4, 5, -1, -1}}, + {MUIV_Imageadjust_Type_Image, {0, 1, 2, 3, -1, -1}}, + {MUIV_Imageadjust_Type_All, {0, 1, 2, 3, 4, 5}}, + }; + + switch (msg->opg_AttrID) + { + case MUIA_Imageadjust_Spec: + { + int i; + + LONG act = 0; + if (data->imagespec) + { + FreeVec(data->imagespec); + data->imagespec = NULL; + } + + get(obj, MUIA_Group_ActivePage, &act); + + for (i = 0; i < 4; i++) + { + if (pages_per_type[i].type == data->adjust_type) + break; + } + + act = pages_per_type[i].pos[act]; + + switch (act) + { + case 0: /* Pattern */ + if ((data->imagespec = AllocVec(40, 0))) + { + if (data->last_pattern_selected != -1) + snprintf(data->imagespec, 40, "0:%d", + (int)data->last_pattern_selected + 128); + else + strcpy(data->imagespec, "0:128"); + } + break; + + case 1: + if ((data->imagespec = AllocVec(20, 0))) + { + if (data->last_vector_selected != -1) + snprintf(data->imagespec, 20, "1:%d", + (int)data->last_vector_selected); + else + strcpy(data->imagespec, "0:128"); + } + break; + + case 2: + { + struct MUI_PenSpec *penspec = NULL; + + get(data->color_group, MUIA_Penadjust_Spec, &penspec); + if (penspec) + { + LONG len; + D(bug("imageadjust: penspec = %s\n", penspec)); + len = strlen((STRPTR) penspec) + 3; + if ((data->imagespec = AllocVec(len, 0))) + snprintf(data->imagespec, len, "2:%s", + penspec->ps_buf); + } + } + break; + + case 3: /* External */ + { + struct ExternalListEntry *entry; + + DoMethod(data->external_list, MUIM_List_GetEntry, + MUIV_List_GetEntry_Active, (IPTR) & entry); + if (entry != NULL && entry->filename != NULL + && entry->reldir != NULL) + { + LONG len; + len = + 2 + strlen(entry->reldir) + 1 + + strlen(entry->filename) + 1; + if ((data->imagespec = AllocVec(len, 0))) + { + snprintf(data->imagespec, len, "3:%s/%s", + entry->reldir, entry->filename); + D(bug("Imageadjust_OM_GET: imspec=%s\n", + data->imagespec)); + } + } + } + break; + + case 4: /* Bitmap */ + { + char *str = NULL; + get(data->bitmap_string, MUIA_String_Contents, &str); + if (str) + { + LONG len; + len = strlen(str) + 10; + if ((data->imagespec = AllocVec(len, 0))) + snprintf(data->imagespec, len, "5:%s", str); + } + } + break; + + case 5: /* Gradient */ + data->imagespec = StrDup(data->gradient_imagespec); + break; + } + if (data->imagespec) + *msg->opg_Storage = (IPTR) data->imagespec; + else + *msg->opg_Storage = (IPTR) "0:128"; + } + return TRUE; + } + + return (DoSuperMethodA(cl, obj, (Msg) msg)); +} + +IPTR Imageadjust__MUIM_Imageadjust_ReadExternal(struct IClass *cl, + Object *obj, Msg msg) +{ + struct Imageadjust_DATA *data = INST_DATA(cl, obj); + + DoMethod(data->external_list, MUIM_List_Clear); + set(data->external_list, MUIA_List_Quiet, TRUE); + AddDirectory(data->external_list, IMSPEC_EXTERNAL_PREFIX, -1); + set(data->external_list, MUIA_List_Quiet, FALSE); + return 0; +} + +#if 0 +IPTR Imageadjust__MUIM_Imageadjust_ExternalSelected(struct IClass *cl, + Object *obj, Msg msg) +{ + struct Imageadjust_DATA *data = INST_DATA(cl, obj); + + if (data->originator) + DoMethod(_app(obj), MUIM_Application_PushMethod, data->originator, + 2, MUIM_Popimage_CloseWindow, TRUE); + return 0; +} +#endif + +#if ZUNE_BUILTIN_IMAGEADJUST +BOOPSI_DISPATCHER(IPTR, Imageadjust_Dispatcher, cl, obj, msg) +{ + switch (msg->MethodID) + { + case OM_NEW: + return Imageadjust__OM_NEW(cl, obj, (struct opSet *)msg); + + case OM_DISPOSE: + return Imageadjust__OM_DISPOSE(cl, obj, (APTR) msg); + + case OM_SET: + return Imageadjust__OM_SET(cl, obj, (struct opSet *)msg); + + case OM_GET: + return Imageadjust__OM_GET(cl, obj, (APTR) msg); + + case MUIM_Imageadjust_ReadExternal: + return Imageadjust__MUIM_Imageadjust_ReadExternal(cl, obj, + (APTR) msg); + + //case MUIM_Imageadjust_ExternalSelected: + // return Imageadjust__MUIM_Imageadjust_ExternalSelected(cl, obj, + // (APTR)msg); + + default: + return DoSuperMethodA(cl, obj, msg); + } +} +BOOPSI_DISPATCHER_END + +const struct __MUIBuiltinClass _MUI_Imageadjust_desc = +{ + MUIC_Imageadjust, + MUIC_Register, + sizeof(struct Imageadjust_DATA), + (void *)Imageadjust_Dispatcher +}; +#endif /* ZUNE_BUILTIN_IMAGEADJUST */ diff --git a/workbench/libs/muimaster/classes/imageadjust.h b/workbench/libs/muimaster/classes/imageadjust.h index 7e8457f647..b8b87b2476 100644 --- a/workbench/libs/muimaster/classes/imageadjust.h +++ b/workbench/libs/muimaster/classes/imageadjust.h @@ -10,12 +10,15 @@ #define MUIC_Imageadjust "Imageadjust.mui" /*** Identifier base (for AROS extensions) **********************************/ -#define MUIB_Imageadjust (MUIB_ZUNE | 0x00001100) +#define MUIB_Imageadjust (MUIB_ZUNE | 0x00001100) /*** Attributes *************************************************************/ -#define MUIA_Imageadjust_Type (MUIB_MUI|0x00422f2b) /* MUI: V11 i.. LONG */ -#define MUIA_Imageadjust_Spec (MUIB_MUI|0x004279e1) /* MUI: ??? .g. char * */ -#define MUIA_Imageadjust_Originator (MUIB_Imageadjust|0x00000000) /* Zune: i.. Object * */ +#define MUIA_Imageadjust_Type \ + (MUIB_MUI | 0x00422f2b) /* MUI: V11 i.. LONG */ +#define MUIA_Imageadjust_Spec \ + (MUIB_MUI | 0x004279e1) /* MUI: ??? .g. char * */ +#define MUIA_Imageadjust_Originator \ + (MUIB_Imageadjust | 0x00000000) /* Zune: i.. Object * */ enum { @@ -26,8 +29,9 @@ enum }; /*** Methods ****************************************************************/ -#define MUIM_Imageadjust_ReadExternal (MUIB_Imageadjust | 0x00000000) /* PRIV */ +#define MUIM_Imageadjust_ReadExternal \ + (MUIB_Imageadjust | 0x00000000) /* PRIV */ -extern const struct __MUIBuiltinClass _MUI_Imageadjust_desc; /* PRIV */ +extern const struct __MUIBuiltinClass _MUI_Imageadjust_desc; /* PRIV */ #endif /* _MUI_CLASSES_IMAGEADJUST_H */ diff --git a/workbench/libs/muimaster/classes/imagedisplay.c b/workbench/libs/muimaster/classes/imagedisplay.c dissimilarity index 67% index 99376971f6..a4a9041f24 100644 --- a/workbench/libs/muimaster/classes/imagedisplay.c +++ b/workbench/libs/muimaster/classes/imagedisplay.c @@ -1,346 +1,374 @@ -/* - Copyright © 2002-2003, The AROS Development Team. All rights reserved. - $Id$ -*/ - -#define MUIMASTER_YES_INLINE_STDARG - -#include <stdio.h> - -#include <intuition/imageclass.h> -#include <graphics/gfx.h> -#include <graphics/view.h> -#include <clib/alib_protos.h> -#include <proto/exec.h> -#include <proto/graphics.h> -#include <proto/utility.h> -#include <proto/intuition.h> -#include <proto/muimaster.h> - -#include <string.h> - -/* #define MYDEBUG 1 */ -#include "debug.h" -#include "mui.h" -#include "muimaster_intern.h" -#include "support.h" -#include "support_classes.h" -#include "imspec.h" -#include "imagedisplay_private.h" - -extern struct Library *MUIMasterBase; - -#define MIF_FREEVERT (1<<0) -#define MIF_FREEHORIZ (1<<1) - - -IPTR Imagedisplay__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct Imagedisplay_DATA *data; - struct TagItem *tag, *tags; - - D(bug("Imagedisplay_New starts\n")); - - obj = (Object *)DoSuperMethodA(cl, obj, (Msg)msg); - if (!obj) return FALSE; - - data = INST_DATA(cl, obj); - data->flags = MIF_FREEHORIZ | MIF_FREEVERT; - - /* parse initial taglist */ - - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) - { - switch (tag->ti_Tag) - { - case MUIA_Imagedisplay_Spec: - data->spec = zune_image_spec_duplicate(tag->ti_Data); - break; - - case MUIA_Imagedisplay_UseDefSize: - _handle_bool_tag(data->flags, (!tag->ti_Data), (MIF_FREEHORIZ | MIF_FREEVERT)); - break; - - case MUIA_Imagedisplay_FreeHoriz: - /* MUI implements some tag for optionnally prevent rescaling - * of displayed image - without affecting imagedisplay resize - - * see MUIPrefs/Buttons/Checkmarks/Look for nonrescaled image, - * and try a popimage for yourself to see that by default they - * get rescaled. It's not the same effect as MUI_Image_FreeHoriz. - * -dlc 20030323 - */ - _handle_bool_tag(data->flags, tag->ti_Data, MIF_FREEHORIZ); - break; - - case MUIA_Imagedisplay_FreeVert: - _handle_bool_tag(data->flags, tag->ti_Data, MIF_FREEVERT); - break; - } - } - - if (!data->spec) - { - data->spec = StrDup("0:128"); - } - - if (!data->spec) - { - CoerceMethod(cl,obj,OM_DISPOSE); - return 0; - } - - D(bug("Imagedisplay_New(%lx) spec=%lx\n", obj, data->img)); - return (IPTR)obj; -} - -IPTR Imagedisplay__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) -{ - struct Imagedisplay_DATA *data = INST_DATA(cl, obj); - - zune_image_spec_free(data->spec); - DoSuperMethodA(cl,obj,(Msg)msg); - return 0; -} - -IPTR Imagedisplay__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct Imagedisplay_DATA *data = INST_DATA(cl, obj); - struct TagItem *tag, *tags; - - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) - { - switch (tag->ti_Tag) - { - case MUIA_Imagedisplay_Spec: - if (data->spec) - zune_image_spec_free(data->spec); - data->spec = zune_image_spec_duplicate(tag->ti_Data); - - if (_flags(obj) & MADF_CANDRAW) - zune_imspec_hide(data->img); - - if (_flags(obj) & MADF_SETUP) - { - zune_imspec_cleanup(data->img); - data->img = zune_imspec_setup((IPTR)data->spec, muiRenderInfo(obj)); - } - - if (_flags(obj)&MADF_CANDRAW) - zune_imspec_show(data->img, obj); - - MUI_Redraw(obj,MADF_DRAWOBJECT); - break; - } - } - - return (IPTR)DoSuperMethodA(cl,obj,(Msg)msg); -} - -IPTR Imagedisplay__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) -{ - struct Imagedisplay_DATA *data = INST_DATA(cl, obj); - switch (msg->opg_AttrID) - { - case MUIA_Imagedisplay_Spec: - *msg->opg_Storage = (IPTR)data->spec; - return(TRUE); - } - - return (IPTR)DoSuperMethodA(cl,obj,(Msg)msg); -} - -IPTR Imagedisplay__MUIM_Setup(struct IClass *cl, Object *obj, struct MUIP_Setup *msg) -{ - struct Imagedisplay_DATA *data = INST_DATA(cl, obj); - - if (!DoSuperMethodA(cl,obj,(Msg)msg)) - return 0; - - if (data->spec) - data->img = zune_imspec_setup((IPTR)data->spec, muiRenderInfo(obj)); - return 1; -} - -IPTR Imagedisplay__MUIM_Cleanup(struct IClass *cl, Object *obj, struct MUIP_Cleanup *msg) -{ - struct Imagedisplay_DATA *data = INST_DATA(cl, obj); - - if (data->spec) - zune_imspec_cleanup(data->img); - return DoSuperMethodA(cl,obj,(Msg)msg); -} - -IPTR Imagedisplay__MUIM_AskMinMax(struct IClass *cl, Object *obj, struct MUIP_AskMinMax *msg) -{ - DoSuperMethodA(cl,obj,(Msg)msg); - - msg->MinMaxInfo->MinWidth += 3; - msg->MinMaxInfo->MinHeight += 3; - - msg->MinMaxInfo->DefWidth += 16; - msg->MinMaxInfo->DefHeight += 16; - - msg->MinMaxInfo->MaxWidth = MUI_MAXMAX; - msg->MinMaxInfo->MaxHeight = MUI_MAXMAX; - - return 1; -} - -IPTR Imagedisplay__MUIM_Show(struct IClass *cl, Object *obj, struct MUIP_Show *msg) -{ - struct Imagedisplay_DATA *data = INST_DATA(cl, obj); - - DoSuperMethodA(cl,obj,(Msg)msg); - - if (data->img) - zune_imspec_show(data->img, obj); - return 1; -} - -IPTR Imagedisplay__MUIM_Hide(struct IClass *cl, Object *obj,struct MUIP_Hide *msg) -{ - struct Imagedisplay_DATA *data = INST_DATA(cl, obj); - - if (data->img) - zune_imspec_hide(data->img); - - return DoSuperMethodA(cl,obj,(Msg)msg); -} - -IPTR Imagedisplay__MUIM_Draw(struct IClass *cl, Object *obj,struct MUIP_Draw *msg) -{ - struct Imagedisplay_DATA *data = INST_DATA(cl, obj); - - DoSuperMethodA(cl,obj,(Msg)msg); - - if (!(msg->flags & MADF_DRAWOBJECT)) - return 0; - - if (data->img) - { - WORD left, top, width, height; - APTR clip; - - left = _mleft(obj); - top = _mtop(obj); - width = _mwidth(obj); - height = _mheight(obj); - - /* if either horiz or vert is not rescalable, center it at def size */ - if (!(data->flags & MIF_FREEVERT) || !(data->flags & MIF_FREEHORIZ)) - { - struct MUI_MinMax minmax; - - zune_imspec_askminmax(data->img, &minmax); - data->defwidth = minmax.DefWidth; - data->defheight = minmax.DefHeight; - - if (!(data->flags & MIF_FREEVERT) && (height > data->defheight)) - { - WORD freespace = height - data->defheight; - - top += freespace / 2; - height = data->defheight; - } - - if (!(data->flags & MIF_FREEHORIZ) && (width > data->defwidth)) - { - WORD freespace = width - data->defwidth; - - left += freespace / 2; - width = data->defwidth; - } - } - else - { - struct MUI_MinMax minmax; - - zune_imspec_askminmax(data->img, &minmax); - - if (width > minmax.MaxWidth) - { - width = minmax.MaxWidth; - left = _mleft(obj) + (_mwidth(obj) - width) / 2; - } - - if (height > minmax.MaxHeight) - { - height = minmax.MaxHeight; - top = _mtop(obj) + (_mheight(obj) - height) / 2; - } - } - - clip = MUI_AddClipping(muiRenderInfo(obj), _mleft(obj), _mtop(obj), - _mwidth(obj), _mheight(obj)); - zune_imspec_draw(data->img, muiRenderInfo(obj), - left, top, width, height, - 0, 0, IDS_NORMAL); - MUI_RemoveClipping(muiRenderInfo(obj), clip); - } - - return 1; -} - -IPTR Imagedisplay__MUIM_DragQuery(struct IClass *cl, Object *obj, struct MUIP_DragQuery *msg) -{ - IPTR dummy = 0; - - if (msg->obj == obj) - return MUIV_DragQuery_Refuse; - if (get(msg->obj, MUIA_Imagedisplay_Spec, &dummy) - || get(msg->obj, MUIA_Pendisplay_Spec, &dummy)) - return MUIV_DragQuery_Accept; - return MUIV_DragQuery_Refuse; -} - -IPTR Imagedisplay__MUIM_DragDrop(struct IClass *cl, Object *obj, struct MUIP_DragDrop *msg) -{ - IPTR spec = 0; - - if (get(msg->obj, MUIA_Imagedisplay_Spec, &spec)) - { - set(obj, MUIA_Imagedisplay_Spec, spec); - } - else if (get(msg->obj, MUIA_Pendisplay_Spec, &spec)) - { - char buf[67]; - - strcpy(buf, "2:"); - strncpy(buf + 2, (const char *)spec, 64); - buf[66] = 0; - set(obj, MUIA_Imagedisplay_Spec, (IPTR)buf); - } - return 0; -} - - -#if ZUNE_BUILTIN_IMAGEDISPLAY -BOOPSI_DISPATCHER(IPTR, Imagedisplay_Dispatcher, cl, obj, msg) -{ - switch (msg->MethodID) - { - case OM_NEW: return Imagedisplay__OM_NEW(cl, obj, (struct opSet *)msg); - case OM_DISPOSE: return Imagedisplay__OM_DISPOSE(cl, obj, msg); - case OM_SET: return Imagedisplay__OM_SET(cl, obj, (APTR)msg); - case OM_GET: return Imagedisplay__OM_GET(cl, obj, (APTR)msg); - case MUIM_AskMinMax: return Imagedisplay__MUIM_AskMinMax(cl,obj,(APTR)msg); - case MUIM_Setup: return Imagedisplay__MUIM_Setup(cl,obj,(APTR)msg); - case MUIM_Cleanup: return Imagedisplay__MUIM_Cleanup(cl,obj,(APTR)msg); - case MUIM_Show: return Imagedisplay__MUIM_Show(cl,obj,(APTR)msg); - case MUIM_Hide: return Imagedisplay__MUIM_Hide(cl,obj,(APTR)msg); - case MUIM_Draw: return Imagedisplay__MUIM_Draw(cl,obj,(APTR)msg); - case MUIM_DragQuery: return Imagedisplay__MUIM_DragQuery(cl,obj,(APTR)msg); - case MUIM_DragDrop: return Imagedisplay__MUIM_DragDrop(cl,obj,(APTR)msg); - default: return DoSuperMethodA(cl, obj, msg); - } -} -BOOPSI_DISPATCHER_END - -const struct __MUIBuiltinClass _MUI_Imagedisplay_desc = -{ - MUIC_Imagedisplay, - MUIC_Area, - sizeof(struct Imagedisplay_DATA), - (void*)Imagedisplay_Dispatcher -}; -#endif /* ZUNE_BUILTIN_IMAGEDISPLAY */ +/* + Copyright © 2002-2003, The AROS Development Team. All rights reserved. + $Id$ +*/ + +#define MUIMASTER_YES_INLINE_STDARG + +#include <stdio.h> + +#include <intuition/imageclass.h> +#include <graphics/gfx.h> +#include <graphics/view.h> +#include <clib/alib_protos.h> +#include <proto/exec.h> +#include <proto/graphics.h> +#include <proto/utility.h> +#include <proto/intuition.h> +#include <proto/muimaster.h> + +#include <string.h> + +/* #define MYDEBUG 1 */ +#include "debug.h" +#include "mui.h" +#include "muimaster_intern.h" +#include "support.h" +#include "support_classes.h" +#include "imspec.h" +#include "imagedisplay_private.h" + +extern struct Library *MUIMasterBase; + +#define MIF_FREEVERT (1<<0) +#define MIF_FREEHORIZ (1<<1) + + +IPTR Imagedisplay__OM_NEW(struct IClass *cl, Object *obj, + struct opSet *msg) +{ + struct Imagedisplay_DATA *data; + struct TagItem *tag, *tags; + + D(bug("Imagedisplay_New starts\n")); + + obj = (Object *) DoSuperMethodA(cl, obj, (Msg) msg); + if (!obj) + return FALSE; + + data = INST_DATA(cl, obj); + data->flags = MIF_FREEHORIZ | MIF_FREEVERT; + + /* parse initial taglist */ + + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) + { + switch (tag->ti_Tag) + { + case MUIA_Imagedisplay_Spec: + data->spec = zune_image_spec_duplicate(tag->ti_Data); + break; + + case MUIA_Imagedisplay_UseDefSize: + _handle_bool_tag(data->flags, (!tag->ti_Data), + (MIF_FREEHORIZ | MIF_FREEVERT)); + break; + + case MUIA_Imagedisplay_FreeHoriz: + /* MUI implements some tag for optionnally prevent rescaling + * of displayed image - without affecting imagedisplay resize - + * see MUIPrefs/Buttons/Checkmarks/Look for nonrescaled image, + * and try a popimage for yourself to see that by default they + * get rescaled. It's not the same effect as MUI_Image_FreeHoriz. + * -dlc 20030323 + */ + _handle_bool_tag(data->flags, tag->ti_Data, MIF_FREEHORIZ); + break; + + case MUIA_Imagedisplay_FreeVert: + _handle_bool_tag(data->flags, tag->ti_Data, MIF_FREEVERT); + break; + } + } + + if (!data->spec) + { + data->spec = StrDup("0:128"); + } + + if (!data->spec) + { + CoerceMethod(cl, obj, OM_DISPOSE); + return 0; + } + + D(bug("Imagedisplay_New(%lx) spec=%lx\n", obj, data->img)); + return (IPTR) obj; +} + +IPTR Imagedisplay__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) +{ + struct Imagedisplay_DATA *data = INST_DATA(cl, obj); + + zune_image_spec_free(data->spec); + DoSuperMethodA(cl, obj, (Msg) msg); + return 0; +} + +IPTR Imagedisplay__OM_SET(struct IClass *cl, Object *obj, + struct opSet *msg) +{ + struct Imagedisplay_DATA *data = INST_DATA(cl, obj); + struct TagItem *tag, *tags; + + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) + { + switch (tag->ti_Tag) + { + case MUIA_Imagedisplay_Spec: + if (data->spec) + zune_image_spec_free(data->spec); + data->spec = zune_image_spec_duplicate(tag->ti_Data); + + if (_flags(obj) & MADF_CANDRAW) + zune_imspec_hide(data->img); + + if (_flags(obj) & MADF_SETUP) + { + zune_imspec_cleanup(data->img); + data->img = + zune_imspec_setup((IPTR) data->spec, + muiRenderInfo(obj)); + } + + if (_flags(obj) & MADF_CANDRAW) + zune_imspec_show(data->img, obj); + + MUI_Redraw(obj, MADF_DRAWOBJECT); + break; + } + } + + return (IPTR) DoSuperMethodA(cl, obj, (Msg) msg); +} + +IPTR Imagedisplay__OM_GET(struct IClass *cl, Object *obj, + struct opGet *msg) +{ + struct Imagedisplay_DATA *data = INST_DATA(cl, obj); + switch (msg->opg_AttrID) + { + case MUIA_Imagedisplay_Spec: + *msg->opg_Storage = (IPTR) data->spec; + return (TRUE); + } + + return (IPTR) DoSuperMethodA(cl, obj, (Msg) msg); +} + +IPTR Imagedisplay__MUIM_Setup(struct IClass *cl, Object *obj, + struct MUIP_Setup *msg) +{ + struct Imagedisplay_DATA *data = INST_DATA(cl, obj); + + if (!DoSuperMethodA(cl, obj, (Msg) msg)) + return 0; + + if (data->spec) + data->img = + zune_imspec_setup((IPTR) data->spec, muiRenderInfo(obj)); + return 1; +} + +IPTR Imagedisplay__MUIM_Cleanup(struct IClass *cl, Object *obj, + struct MUIP_Cleanup *msg) +{ + struct Imagedisplay_DATA *data = INST_DATA(cl, obj); + + if (data->spec) + zune_imspec_cleanup(data->img); + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +IPTR Imagedisplay__MUIM_AskMinMax(struct IClass *cl, Object *obj, + struct MUIP_AskMinMax *msg) +{ + DoSuperMethodA(cl, obj, (Msg) msg); + + msg->MinMaxInfo->MinWidth += 3; + msg->MinMaxInfo->MinHeight += 3; + + msg->MinMaxInfo->DefWidth += 16; + msg->MinMaxInfo->DefHeight += 16; + + msg->MinMaxInfo->MaxWidth = MUI_MAXMAX; + msg->MinMaxInfo->MaxHeight = MUI_MAXMAX; + + return 1; +} + +IPTR Imagedisplay__MUIM_Show(struct IClass *cl, Object *obj, + struct MUIP_Show *msg) +{ + struct Imagedisplay_DATA *data = INST_DATA(cl, obj); + + DoSuperMethodA(cl, obj, (Msg) msg); + + if (data->img) + zune_imspec_show(data->img, obj); + return 1; +} + +IPTR Imagedisplay__MUIM_Hide(struct IClass *cl, Object *obj, + struct MUIP_Hide *msg) +{ + struct Imagedisplay_DATA *data = INST_DATA(cl, obj); + + if (data->img) + zune_imspec_hide(data->img); + + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +IPTR Imagedisplay__MUIM_Draw(struct IClass *cl, Object *obj, + struct MUIP_Draw *msg) +{ + struct Imagedisplay_DATA *data = INST_DATA(cl, obj); + + DoSuperMethodA(cl, obj, (Msg) msg); + + if (!(msg->flags & MADF_DRAWOBJECT)) + return 0; + + if (data->img) + { + WORD left, top, width, height; + APTR clip; + + left = _mleft(obj); + top = _mtop(obj); + width = _mwidth(obj); + height = _mheight(obj); + + /* if either horiz or vert is not rescalable, center it at def size */ + if (!(data->flags & MIF_FREEVERT) || !(data->flags & MIF_FREEHORIZ)) + { + struct MUI_MinMax minmax; + + zune_imspec_askminmax(data->img, &minmax); + data->defwidth = minmax.DefWidth; + data->defheight = minmax.DefHeight; + + if (!(data->flags & MIF_FREEVERT) && (height > data->defheight)) + { + WORD freespace = height - data->defheight; + + top += freespace / 2; + height = data->defheight; + } + + if (!(data->flags & MIF_FREEHORIZ) && (width > data->defwidth)) + { + WORD freespace = width - data->defwidth; + + left += freespace / 2; + width = data->defwidth; + } + } + else + { + struct MUI_MinMax minmax; + + zune_imspec_askminmax(data->img, &minmax); + + if (width > minmax.MaxWidth) + { + width = minmax.MaxWidth; + left = _mleft(obj) + (_mwidth(obj) - width) / 2; + } + + if (height > minmax.MaxHeight) + { + height = minmax.MaxHeight; + top = _mtop(obj) + (_mheight(obj) - height) / 2; + } + } + + clip = MUI_AddClipping(muiRenderInfo(obj), _mleft(obj), _mtop(obj), + _mwidth(obj), _mheight(obj)); + zune_imspec_draw(data->img, muiRenderInfo(obj), + left, top, width, height, 0, 0, IDS_NORMAL); + MUI_RemoveClipping(muiRenderInfo(obj), clip); + } + + return 1; +} + +IPTR Imagedisplay__MUIM_DragQuery(struct IClass *cl, Object *obj, + struct MUIP_DragQuery *msg) +{ + IPTR dummy = 0; + + if (msg->obj == obj) + return MUIV_DragQuery_Refuse; + if (get(msg->obj, MUIA_Imagedisplay_Spec, &dummy) + || get(msg->obj, MUIA_Pendisplay_Spec, &dummy)) + return MUIV_DragQuery_Accept; + return MUIV_DragQuery_Refuse; +} + +IPTR Imagedisplay__MUIM_DragDrop(struct IClass *cl, Object *obj, + struct MUIP_DragDrop *msg) +{ + IPTR spec = 0; + + if (get(msg->obj, MUIA_Imagedisplay_Spec, &spec)) + { + set(obj, MUIA_Imagedisplay_Spec, spec); + } + else if (get(msg->obj, MUIA_Pendisplay_Spec, &spec)) + { + char buf[67]; + + strcpy(buf, "2:"); + strncpy(buf + 2, (const char *)spec, 64); + buf[66] = 0; + set(obj, MUIA_Imagedisplay_Spec, (IPTR) buf); + } + return 0; +} + + +#if ZUNE_BUILTIN_IMAGEDISPLAY +BOOPSI_DISPATCHER(IPTR, Imagedisplay_Dispatcher, cl, obj, msg) +{ + switch (msg->MethodID) + { + case OM_NEW: + return Imagedisplay__OM_NEW(cl, obj, (struct opSet *)msg); + case OM_DISPOSE: + return Imagedisplay__OM_DISPOSE(cl, obj, msg); + case OM_SET: + return Imagedisplay__OM_SET(cl, obj, (APTR) msg); + case OM_GET: + return Imagedisplay__OM_GET(cl, obj, (APTR) msg); + case MUIM_AskMinMax: + return Imagedisplay__MUIM_AskMinMax(cl, obj, (APTR) msg); + case MUIM_Setup: + return Imagedisplay__MUIM_Setup(cl, obj, (APTR) msg); + case MUIM_Cleanup: + return Imagedisplay__MUIM_Cleanup(cl, obj, (APTR) msg); + case MUIM_Show: + return Imagedisplay__MUIM_Show(cl, obj, (APTR) msg); + case MUIM_Hide: + return Imagedisplay__MUIM_Hide(cl, obj, (APTR) msg); + case MUIM_Draw: + return Imagedisplay__MUIM_Draw(cl, obj, (APTR) msg); + case MUIM_DragQuery: + return Imagedisplay__MUIM_DragQuery(cl, obj, (APTR) msg); + case MUIM_DragDrop: + return Imagedisplay__MUIM_DragDrop(cl, obj, (APTR) msg); + default: + return DoSuperMethodA(cl, obj, msg); + } +} +BOOPSI_DISPATCHER_END + +const struct __MUIBuiltinClass _MUI_Imagedisplay_desc = +{ + MUIC_Imagedisplay, + MUIC_Area, + sizeof(struct Imagedisplay_DATA), + (void *) Imagedisplay_Dispatcher +}; +#endif /* ZUNE_BUILTIN_IMAGEDISPLAY */ diff --git a/workbench/libs/muimaster/classes/imagedisplay.h b/workbench/libs/muimaster/classes/imagedisplay.h index 6d4b86ae8c..262602e4eb 100644 --- a/workbench/libs/muimaster/classes/imagedisplay.h +++ b/workbench/libs/muimaster/classes/imagedisplay.h @@ -13,13 +13,17 @@ #define MUIB_Imagedisplay (MUIB_ZUNE | 0x00001200) /*** Attributes *************************************************************/ -#define MUIA_Imagedisplay_Spec (MUIB_MUI|0x0042a547) /* MUI: V11 isg struct MUI_ImageSpec * */ -#define MUIA_Imagedisplay_UseDefSize (MUIB_MUI|0x0042186d) /* MUI: V11 i.. BOOL (undoc) */ +#define MUIA_Imagedisplay_Spec \ + (MUIB_MUI | 0x0042a547) /* MUI: V11 isg struct MUI_ImageSpec * */ +#define MUIA_Imagedisplay_UseDefSize \ + (MUIB_MUI |0x0042186d) /* MUI: V11 i.. BOOL (undoc) */ -#define MUIA_Imagedisplay_FreeHoriz (MUIB_Imagedisplay | 0x00000000) /* Zune 20030323 i.. BOOL [TRUE] */ -#define MUIA_Imagedisplay_FreeVert (MUIB_Imagedisplay | 0x00000001) /* Zune 20030323 i.. BOOL [TRUE] */ +#define MUIA_Imagedisplay_FreeHoriz \ + (MUIB_Imagedisplay | 0x00000000) /* Zune 20030323 i.. BOOL [TRUE] */ +#define MUIA_Imagedisplay_FreeVert \ + (MUIB_Imagedisplay | 0x00000001) /* Zune 20030323 i.. BOOL [TRUE] */ -extern const struct __MUIBuiltinClass _MUI_Imagedisplay_desc; /* PRIV */ +extern const struct __MUIBuiltinClass _MUI_Imagedisplay_desc; /* PRIV */ #endif /* _MUI_CLASSES_IMAGEDISPLAY_H */ diff --git a/workbench/libs/muimaster/classes/knob.c b/workbench/libs/muimaster/classes/knob.c dissimilarity index 64% index 64341edc74..8c5ba85cf2 100644 --- a/workbench/libs/muimaster/classes/knob.c +++ b/workbench/libs/muimaster/classes/knob.c @@ -1,470 +1,517 @@ -/* - Copyright © 2002-2003, The AROS Development Team. All rights reserved. - $Id$ -*/ - -#define MUIMASTER_YES_INLINE_STDARG - -#include <exec/memory.h> -#include <clib/alib_protos.h> -#include <proto/exec.h> -#include <proto/dos.h> -#include <proto/intuition.h> -#include <proto/graphics.h> -#include <proto/utility.h> -#include <proto/muimaster.h> - -#include <string.h> -#include <stdio.h> -#include <math.h> - -#include "mui.h" -#include "muimaster_intern.h" -#include "support.h" -#include "support_classes.h" -#include "prefs.h" -#include "debug.h" -#include "knob_private.h" - -extern struct Library *MUIMasterBase; - -#define OUTERFRAME_X 2 -#define OUTERFRAME_Y 2 -#define OUTERFRAME_W (OUTERFRAME_X * 2) -#define OUTERFRAME_H (OUTERFRAME_Y * 2) - -#define INNERFRAME_X 2 -#define INNERFRAME_Y 2 -#define INNERFRAME_W (INNERFRAME_X * 2) -#define INNERFRAME_H (INNERFRAME_Y * 2) - -#define BORDERSIZE_X 2 -#define BORDERSIZE_Y 2 -#define BORDERSIZE_W (BORDERSIZE_X * 2) -#define BORDERSIZE_H (BORDERSIZE_Y * 2) - -#define KNOB_LABEL_SPACING 2 - -#define KNOB_WIDTH 25 -#define KNOB_HEIGHT 25 - -#define LABEL_HEIGHT 8 - -#define TOTAL_WIDTH OUTERFRAME_W + BORDERSIZE_W + KNOB_WIDTH -#define TOTAL_HEIGHT OUTERFRAME_H + BORDERSIZE_H + INNERFRAME_H + KNOB_HEIGHT + KNOB_LABEL_SPACING + LABEL_HEIGHT - - -/* 0 halfshine */ -/* 1 halfshadow */ -/* 2 shadow */ -/* 3 shine */ - -#define RLE_REP(count, val) (((count - 1) << 4) | val) - -static const UBYTE knob_rle[] = /* hand-encoded, BTW ;-) */ -{ - RLE_REP(8,0), RLE_REP(9,1), RLE_REP(8,0), - RLE_REP(6,0), RLE_REP(2,1), RLE_REP(9,2), RLE_REP(2,1), RLE_REP(6,0), - RLE_REP(5,0), 1, RLE_REP(2,2), RLE_REP(9,3), RLE_REP(2,2), 1, RLE_REP(5,0), - RLE_REP(4,0), 1, 2, RLE_REP(13,3), 2, 1, RLE_REP(4,0), - RLE_REP(3,0), 1, 2, RLE_REP(3,3), RLE_REP(9,0), RLE_REP(3,3), 2, 3, RLE_REP(3,0), - RLE_REP(2,0), 1, 2, RLE_REP(2,3), RLE_REP(13,0), 3, 1, 2, 3, RLE_REP(2,0), - 0, 1, 2, RLE_REP(2,3), RLE_REP(15,0), RLE_REP(2,1), 2, 3, 0, - 0, 1, 2, RLE_REP(2,3), RLE_REP(15,0), RLE_REP(2,1), 2, 3, 0, - 1, 2, RLE_REP(2,3), 0, RLE_REP(16,0), RLE_REP(2,1), 2, 3, - 1, 2, RLE_REP(2,3), 0, RLE_REP(16,0), RLE_REP(2,1), 2, 3, - 1, 2, RLE_REP(2,3), 0, RLE_REP(16,0), RLE_REP(2,1), 2, 3, - 1, 2, RLE_REP(2,3), 0, RLE_REP(16,0), RLE_REP(2,1), 2, 3, - 1, 2, RLE_REP(2,3), 0, RLE_REP(16,0), RLE_REP(2,1), 2, 3, - 1, 2, RLE_REP(2,3), 0, RLE_REP(16,0), RLE_REP(2,1), 2, 3, - 1, 2, RLE_REP(2,3), 0, RLE_REP(16,0), RLE_REP(2,1), 2, 3, - 1, 2, RLE_REP(2,3), 0, RLE_REP(16,0), RLE_REP(2,1), 2, 3, - 1, 2, RLE_REP(2,3), 0, RLE_REP(16,0), RLE_REP(2,1), 2, 3, - 0, 1, 2, RLE_REP(2,3), RLE_REP(15,0), RLE_REP(2,1), 2, 3, 0, - 0, 1, 2, RLE_REP(2,3), RLE_REP(15,0), RLE_REP(2,1), 2, 3, 0, - RLE_REP(2,0), 1, 2, RLE_REP(2,3), RLE_REP(13,0), RLE_REP(2,1), 2, 3, RLE_REP(2,0), - RLE_REP(3,0), 1, 2, RLE_REP(3,1), RLE_REP(9,0), RLE_REP(3,1), 2, 3, RLE_REP(3,0), - RLE_REP(4,0), 3, 2, RLE_REP(13,1), 2, 3, RLE_REP(4,0), - RLE_REP(5,0), 3, RLE_REP(2,2), RLE_REP(9,1), RLE_REP(2,2), 3, RLE_REP(5,0), - RLE_REP(6,0), RLE_REP(2,3), RLE_REP(9,2), RLE_REP(2,3), RLE_REP(6,0), - RLE_REP(8,0), RLE_REP(9,3), RLE_REP(8,0), - -}; - -IPTR Knob__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) -{ - obj = (Object *)DoSuperNewTags - ( - cl, obj, NULL, - MUIA_FillArea, FALSE, - TAG_MORE, (IPTR) msg->ops_AttrList - ); - - if (obj) - { - struct Knob_DATA *data = INST_DATA(cl, obj); - - data->ehn.ehn_Events = IDCMP_MOUSEBUTTONS; - data->ehn.ehn_Priority = 0; - data->ehn.ehn_Flags = 0; - data->ehn.ehn_Object = obj; - data->ehn.ehn_Class = cl; - - } - - return (IPTR)obj; -} - -IPTR Knob__MUIM_Setup(struct IClass *cl, Object *obj, struct MUIP_Setup *msg) -{ - //struct RastPort rp; - IPTR retval; - - retval = DoSuperMethodA(cl, obj, (Msg)msg); - if (retval) - { - struct Knob_DATA *data = INST_DATA(cl, obj); - #if 0 - InitRastPort(&rp); - SetFont(&rp,_font(obj)); - - DeinitRastPort(&rp); - #endif - - DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR)&data->ehn); - - } - - return retval; -} - -IPTR Knob__MUIM_Cleanup(struct IClass *cl, Object *obj, struct MUIP_Cleanup *msg) -{ - struct Knob_DATA *data = INST_DATA(cl, obj); - - DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR)&data->ehn); - - return DoSuperMethodA(cl, obj, (Msg)msg); -} - -/************************************************************************** - MUIM_AskMinMax -**************************************************************************/ -IPTR Knob__MUIM_AskMinMax(struct IClass *cl, Object *obj, struct MUIP_AskMinMax *msg) -{ - //struct Knob_DATA *data = INST_DATA(cl, obj); - - DoSuperMethodA(cl, obj, (Msg)msg); - - msg->MinMaxInfo->MinWidth += TOTAL_WIDTH; - msg->MinMaxInfo->MinHeight += TOTAL_HEIGHT; - msg->MinMaxInfo->DefWidth += TOTAL_WIDTH; - msg->MinMaxInfo->DefHeight += TOTAL_HEIGHT; - msg->MinMaxInfo->MaxWidth += TOTAL_WIDTH; - msg->MinMaxInfo->MaxHeight += TOTAL_HEIGHT; - - return TRUE; -} - -static void DrawNeedle(Object *obj, struct RastPort *rp, LONG x1, LONG y1, - LONG x2, LONG y2, double angle, BOOL clear) -{ - LONG cx = (x1 + x2) / 2; - LONG cy = (y1 + y2) / 2; - LONG rx = cx - x1 - 4; - LONG ry = cy - y1 - 4; - LONG a, b; - - SetDrMd(rp, JAM1); - - if ((angle < 0.0) | (angle > 270.0)) angle = 0.0; - angle = 270.0 - 45.0 - angle; - - a = cx + (LONG)(cos(angle * 3.14159265358979323846 / 180.0) * rx); - b = cy - (LONG)(sin(angle * 3.14159265358979323846 / 180.0) * ry); - - if (clear) - { - SetAPen(rp, _pens(obj)[MPEN_HALFSHINE]); - RectFill(rp, a - 1, b - 1, a + 1, b + 1); - } - else - { - SetAPen(rp, _pens(obj)[MPEN_SHADOW]); - Move(rp, a, b - 1); Draw(rp, a - 1, b); - SetAPen(rp, _pens(obj)[MPEN_HALFSHADOW]); - Move(rp, a - 1, b - 1); Draw(rp, a, b); - SetAPen(rp, _pens(obj)[MPEN_SHINE]); - Move(rp, a + 1, b); Draw(rp, a, b + 1); - SetAPen(rp, _pens(obj)[MPEN_HALFSHINE]); - WritePixel(rp, a + 1, b - 1); - WritePixel(rp, a + 1, b + 1); - WritePixel(rp, a - 1, b + 1); - } - -} - - -/************************************************************************** - MUIM_Draw -**************************************************************************/ -IPTR Knob__MUIM_Draw(struct IClass *cl, Object *obj, struct MUIP_Draw *msg) -{ - struct Knob_DATA *data = INST_DATA(cl, obj); - struct RastPort *rp; - WORD x1, y1, x2, y2; - - DoSuperMethodA(cl,obj,(Msg)msg); - - if (!(msg->flags & (MADF_DRAWOBJECT | MADF_DRAWUPDATE))) - return FALSE; - - x1 = _mleft(obj); - y1 = _mtop(obj); - x2 = _mright(obj); - y2 = _mbottom(obj); - - rp = _rp(obj); - - if (msg->flags & MADF_DRAWOBJECT) - { - /* Transparent edges */ - - DoMethod(obj, MUIM_DrawParentBackground, x1, y1, 2, 1, x1, y1, 0); - DoMethod(obj, MUIM_DrawParentBackground, x1, y1 + 1, 1, 1, x1, y1 + 1, 0); - - DoMethod(obj, MUIM_DrawParentBackground, x2 - 1, y1, 2, 1, x2 - 1, y1, 0); - DoMethod(obj, MUIM_DrawParentBackground, x2, y1 + 1, 1, 1, x2, y1 + 1, 0); - - DoMethod(obj, MUIM_DrawParentBackground, x1, y2, 2, 1, x1, y2, 0); - DoMethod(obj, MUIM_DrawParentBackground, x1, y2 - 1, 1, 1, x1, y2 - 1, 0); - - DoMethod(obj, MUIM_DrawParentBackground, x2 - 1, y2, 2, 1, x2 - 1, y2, 0); - DoMethod(obj, MUIM_DrawParentBackground, x2, y2 - 1, 1, 1, x2, y2 - 1, 0); - - /* Outer frame */ - - SetABPenDrMd(rp, _pens(obj)[MPEN_SHINE], 0, JAM1); - Move(rp, x1 + 1, y2 - 1); - Draw(rp, x1, y2 - 2); - Draw(rp, x1, y1 + 2); - Draw(rp, x1 + 2, y1); - Draw(rp, x2 - 2, y1); - Draw(rp, x2 - 1, y1 + 1); - - SetAPen(rp, _pens(obj)[MPEN_SHADOW]); - Move(rp, x2, y1 + 2); - Draw(rp, x2, y2 - 2); - Draw(rp, x2 - 2, y2); - Draw(rp, x1 + 2, y2); - - SetAPen(rp, _pens(obj)[MPEN_HALFSHINE]); - Move(rp, x1 + 1, y2 - 2); - Draw(rp, x1 + 1, y1 + 2); - Draw(rp, x1 + 2, y1 + 1); - Draw(rp, x2 - 2, y1 + 1); - - SetAPen(rp, _pens(obj)[MPEN_HALFSHADOW]); - Move(rp, x2 - 1, y1 + 2); - Draw(rp, x2 - 1, y2 - 2); - Draw(rp, x2 - 2, y2 - 1); - Draw(rp, x1 + 2, y2 - 1); - - /* Border */ - - x1 += OUTERFRAME_X; x2 -= OUTERFRAME_X; - y1 += OUTERFRAME_X; y2 -= OUTERFRAME_Y; - - SetAPen(rp, _pens(obj)[MPEN_HALFSHINE]); - RectFill(rp, x1, y1, x2, y1 + BORDERSIZE_Y - 1); - RectFill(rp, x1, y1 + BORDERSIZE_Y, x1 + BORDERSIZE_X - 1, y2); - RectFill(rp, x1 + BORDERSIZE_X - 1, y2 - BORDERSIZE_Y + 1, x2, y2); - RectFill(rp, x2 - BORDERSIZE_X + 1, y1 + BORDERSIZE_Y, x2, y2 - BORDERSIZE_Y); - - /* Inner Frame */ - - x1 += BORDERSIZE_X; x2 -= BORDERSIZE_X; - y1 += BORDERSIZE_Y; y2 = y1 + KNOB_HEIGHT -1; - - /* Knob bg */ - - { - static const UBYTE pen_mapping[] = - { - MPEN_HALFSHINE, MPEN_HALFSHADOW, MPEN_SHADOW, MPEN_SHINE - }; - const UBYTE *rleptr; - UBYTE rle; - WORD x = 0, y = 0, count; - - for(rleptr = knob_rle; ;) - { - rle = *rleptr++; - count = (rle >> 4) + 1; - SetAPen(_rp(obj), _pens(obj)[pen_mapping[rle & 15]]); - RectFill(_rp(obj), x1 + x, y1 + y, x1 + x + count - 1, y1 + y); - x += count; - if (x >= KNOB_WIDTH) - { - x = 0; - y++; - if (y >= KNOB_HEIGHT) break; - } - } - } - - /* Knob-Label spacing */ - - y1 = y2 + 1; - - SetAPen(rp, _pens(obj)[MPEN_HALFSHINE]); - RectFill(rp, x1, y1, x2, y1 + KNOB_LABEL_SPACING - 1); - - /* Label Frame */ - - y1 += KNOB_LABEL_SPACING; - y2 = _mbottom(obj) - OUTERFRAME_Y - BORDERSIZE_Y; - - SetAPen(rp, _pens(obj)[MPEN_HALFSHINE]); - Move(rp, x1, y1); Draw(rp, x1 + 1, y1); Draw(rp, x1, y1 + 1); - Move(rp, x2, y1); Draw(rp, x2 - 1, y1); Draw(rp, x2, y1 + 1); - Move(rp, x1, y2); Draw(rp, x1 + 1, y2); Draw(rp, x1, y2 - 1); - Move(rp, x2, y2); Draw(rp, x2 - 1, y2); Draw(rp, x2, y2 - 1); - - SetAPen(rp, _pens(obj)[MPEN_HALFSHADOW]); - Move(rp, x1 + 1, y2 - 1); - Draw(rp, x1, y2 - 2); - Draw(rp, x1, y1 + 2); - Draw(rp, x1 + 2, y1); - Draw(rp, x2 - 2, y1); - Draw(rp, x2 - 1, y1 + 1); - - SetAPen(rp, _pens(obj)[MPEN_SHINE]); - Move(rp, x2, y1 + 2); - Draw(rp, x2, y2 - 2); - Draw(rp, x2 - 2, y2); - Draw(rp, x1 + 2, y2); - - SetAPen(rp, _pens(obj)[MPEN_SHADOW]); - RectFill(rp, x1 + 1, y1 + 2, x1 + 1, y2 - 2); - RectFill(rp, x2 - 1, y1 + 2, x2 - 1, y2 - 2); - RectFill(rp, x1 + 2, y1 + 1, x2 - 2, y1 + 1); - RectFill(rp, x1 + 2, y2 - 1, x2 - 2, y2 - 1); - - /* Label Bg */ - - RectFill(rp, x1 + 2, y1 +2, x2 - 2, y2 - 2); - - } - - x1 = _mleft(obj) + OUTERFRAME_X + BORDERSIZE_X; - x2 = _mright(obj) - OUTERFRAME_X - BORDERSIZE_X; - y1 = _mtop(obj) + OUTERFRAME_Y + BORDERSIZE_Y; - y2 = y1 + KNOB_HEIGHT - 1; - - if (msg->flags & MADF_DRAWUPDATE) - { - DrawNeedle(obj, rp, x1, y1, x2, y2, data->prevangle, TRUE); - } - - data->prevangle = (double)DoMethod(obj, MUIM_Numeric_ValueToScale, 0, 270); - - DrawNeedle(obj, rp, x1, y1, x2, y2, data->prevangle, FALSE); - - return TRUE; -} - -/************************************************************************** - MUIM_HandleEvent -**************************************************************************/ -IPTR Knob__MUIM_HandleEvent(struct IClass *cl, Object *obj, struct MUIP_HandleEvent *msg) -{ - struct Knob_DATA *data = INST_DATA(cl, obj); - - if (!msg->imsg) - { - return 0; - } - - switch(msg->imsg->Class) - { - case IDCMP_MOUSEBUTTONS: - switch(msg->imsg->Code) - { - case SELECTDOWN: - if (_between(_left(obj), msg->imsg->MouseX, _right(obj)) && - _between(_top(obj), msg->imsg->MouseY, _bottom(obj))) - { - DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR)&data->ehn); - data->ehn.ehn_Events |= IDCMP_MOUSEMOVE; - DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR)&data->ehn); - - } - break; - - case SELECTUP: - case MENUUP: - case MIDDLEUP: - default: - DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR)&data->ehn); - data->ehn.ehn_Events &= ~IDCMP_MOUSEMOVE; - DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR)&data->ehn); - break; - - - } /* switch(msg->imsg->Code) */ - break; - - case IDCMP_MOUSEMOVE: - { - double angle; - WORD x1, y1, x2, y2, cx, cy, dx, dy; - IPTR val; - - x1 = _mleft(obj) + OUTERFRAME_X + BORDERSIZE_X; - x2 = _mright(obj) - OUTERFRAME_X - BORDERSIZE_X; - y1 = _mtop(obj) + OUTERFRAME_Y + BORDERSIZE_Y; - y2 = y1 + KNOB_HEIGHT - 1; - cx = (x1 + x2) / 2; - cy = (y1 + y2) / 2; - dx = msg->imsg->MouseX - cx; - dy = cy - msg->imsg->MouseY; - - angle = 180.0 - 45.0 + 180.0 * atan2((double)dx, (double)dy) / 3.14159265358979323846; - if (angle < 0.0) angle = 0.0; else if (angle > 270.0) angle = 270.0; - - val = DoMethod(obj, MUIM_Numeric_ScaleToValue, 0, 270, (LONG)angle); - set(obj, MUIA_Numeric_Value, val); - - } - break; - - } /* switch(msg->imsg->Class) */ - - return 0; -} - -#if ZUNE_BUILTIN_KNOB -BOOPSI_DISPATCHER(IPTR, Knob_Dispatcher, cl, obj, msg) -{ - switch (msg->MethodID) - { - case OM_NEW: return Knob__OM_NEW(cl, obj, (struct opSet *)msg); - case MUIM_Setup: return Knob__MUIM_Setup(cl, obj, (struct MUIP_Setup *)msg); - case MUIM_Cleanup: return Knob__MUIM_Cleanup(cl, obj, (struct MUIP_Cleanup *)msg); - case MUIM_AskMinMax: return Knob__MUIM_AskMinMax(cl, obj, (struct MUIP_AskMinMax *)msg); - case MUIM_Draw: return Knob__MUIM_Draw(cl, obj, (struct MUIP_Draw *)msg); - case MUIM_HandleEvent: return Knob__MUIM_HandleEvent(cl, obj, (struct MUIP_HandleEvent *)msg); - default: return DoSuperMethodA(cl, obj, msg); - } -} -BOOPSI_DISPATCHER_END - -const struct __MUIBuiltinClass _MUI_Knob_desc = -{ - MUIC_Knob, - MUIC_Numeric, - sizeof(struct Knob_DATA), - (void*)Knob_Dispatcher -}; -#endif /* ZUNE_BUILTIN_KNOB */ +/* + Copyright © 2002-2003, The AROS Development Team. All rights reserved. + $Id$ +*/ + +#define MUIMASTER_YES_INLINE_STDARG + +#include <exec/memory.h> +#include <clib/alib_protos.h> +#include <proto/exec.h> +#include <proto/dos.h> +#include <proto/intuition.h> +#include <proto/graphics.h> +#include <proto/utility.h> +#include <proto/muimaster.h> + +#include <string.h> +#include <stdio.h> +#include <math.h> + +#include "mui.h" +#include "muimaster_intern.h" +#include "support.h" +#include "support_classes.h" +#include "prefs.h" +#include "debug.h" +#include "knob_private.h" + +extern struct Library *MUIMasterBase; + +#define OUTERFRAME_X 2 +#define OUTERFRAME_Y 2 +#define OUTERFRAME_W (OUTERFRAME_X * 2) +#define OUTERFRAME_H (OUTERFRAME_Y * 2) + +#define INNERFRAME_X 2 +#define INNERFRAME_Y 2 +#define INNERFRAME_W (INNERFRAME_X * 2) +#define INNERFRAME_H (INNERFRAME_Y * 2) + +#define BORDERSIZE_X 2 +#define BORDERSIZE_Y 2 +#define BORDERSIZE_W (BORDERSIZE_X * 2) +#define BORDERSIZE_H (BORDERSIZE_Y * 2) + +#define KNOB_LABEL_SPACING 2 + +#define KNOB_WIDTH 25 +#define KNOB_HEIGHT 25 + +#define LABEL_HEIGHT 8 + +#define TOTAL_WIDTH OUTERFRAME_W + BORDERSIZE_W + KNOB_WIDTH +#define TOTAL_HEIGHT OUTERFRAME_H + BORDERSIZE_H + INNERFRAME_H \ ++ KNOB_HEIGHT + KNOB_LABEL_SPACING + LABEL_HEIGHT + + +/* 0 halfshine */ +/* 1 halfshadow */ +/* 2 shadow */ +/* 3 shine */ + +#define RLE_REP(count, val) (((count - 1) << 4) | val) + +static const UBYTE knob_rle[] = /* hand-encoded, BTW ;-) */ +{ + RLE_REP(8,0), RLE_REP(9,1), RLE_REP(8,0), + RLE_REP(6,0), RLE_REP(2,1), RLE_REP(9,2), RLE_REP(2,1), RLE_REP(6,0), + RLE_REP(5,0), 1, RLE_REP(2,2), RLE_REP(9,3), RLE_REP(2,2), 1, RLE_REP(5,0), + RLE_REP(4,0), 1, 2, RLE_REP(13,3), 2, 1, RLE_REP(4,0), + RLE_REP(3,0), 1, 2, RLE_REP(3,3), RLE_REP(9,0), RLE_REP(3,3), 2, 3, RLE_REP(3,0), + RLE_REP(2,0), 1, 2, RLE_REP(2,3), RLE_REP(13,0), 3, 1, 2, 3, RLE_REP(2,0), + 0, 1, 2, RLE_REP(2,3), RLE_REP(15,0), RLE_REP(2,1), 2, 3, 0, + 0, 1, 2, RLE_REP(2,3), RLE_REP(15,0), RLE_REP(2,1), 2, 3, 0, + 1, 2, RLE_REP(2,3), 0, RLE_REP(16,0), RLE_REP(2,1), 2, 3, + 1, 2, RLE_REP(2,3), 0, RLE_REP(16,0), RLE_REP(2,1), 2, 3, + 1, 2, RLE_REP(2,3), 0, RLE_REP(16,0), RLE_REP(2,1), 2, 3, + 1, 2, RLE_REP(2,3), 0, RLE_REP(16,0), RLE_REP(2,1), 2, 3, + 1, 2, RLE_REP(2,3), 0, RLE_REP(16,0), RLE_REP(2,1), 2, 3, + 1, 2, RLE_REP(2,3), 0, RLE_REP(16,0), RLE_REP(2,1), 2, 3, + 1, 2, RLE_REP(2,3), 0, RLE_REP(16,0), RLE_REP(2,1), 2, 3, + 1, 2, RLE_REP(2,3), 0, RLE_REP(16,0), RLE_REP(2,1), 2, 3, + 1, 2, RLE_REP(2,3), 0, RLE_REP(16,0), RLE_REP(2,1), 2, 3, + 0, 1, 2, RLE_REP(2,3), RLE_REP(15,0), RLE_REP(2,1), 2, 3, 0, + 0, 1, 2, RLE_REP(2,3), RLE_REP(15,0), RLE_REP(2,1), 2, 3, 0, + RLE_REP(2,0), 1, 2, RLE_REP(2,3), RLE_REP(13,0), RLE_REP(2,1), 2, 3, RLE_REP(2,0), + RLE_REP(3,0), 1, 2, RLE_REP(3,1), RLE_REP(9,0), RLE_REP(3,1), 2, 3, RLE_REP(3,0), + RLE_REP(4,0), 3, 2, RLE_REP(13,1), 2, 3, RLE_REP(4,0), + RLE_REP(5,0), 3, RLE_REP(2,2), RLE_REP(9,1), RLE_REP(2,2), 3, RLE_REP(5,0), + RLE_REP(6,0), RLE_REP(2,3), RLE_REP(9,2), RLE_REP(2,3), RLE_REP(6,0), + RLE_REP(8,0), RLE_REP(9,3), RLE_REP(8,0), + +}; + +IPTR Knob__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) +{ + obj = (Object *) DoSuperNewTags + (cl, obj, NULL, + MUIA_FillArea, FALSE, TAG_MORE, (IPTR) msg->ops_AttrList); + + if (obj) + { + struct Knob_DATA *data = INST_DATA(cl, obj); + + data->ehn.ehn_Events = IDCMP_MOUSEBUTTONS; + data->ehn.ehn_Priority = 0; + data->ehn.ehn_Flags = 0; + data->ehn.ehn_Object = obj; + data->ehn.ehn_Class = cl; + + } + + return (IPTR) obj; +} + +IPTR Knob__MUIM_Setup(struct IClass *cl, Object *obj, + struct MUIP_Setup *msg) +{ + //struct RastPort rp; + IPTR retval; + + retval = DoSuperMethodA(cl, obj, (Msg) msg); + if (retval) + { + struct Knob_DATA *data = INST_DATA(cl, obj); +#if 0 + InitRastPort(&rp); + SetFont(&rp, _font(obj)); + + DeinitRastPort(&rp); +#endif + + DoMethod(_win(obj), MUIM_Window_AddEventHandler, + (IPTR) & data->ehn); + + } + + return retval; +} + +IPTR Knob__MUIM_Cleanup(struct IClass *cl, Object *obj, + struct MUIP_Cleanup *msg) +{ + struct Knob_DATA *data = INST_DATA(cl, obj); + + DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR) & data->ehn); + + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +/************************************************************************** + MUIM_AskMinMax +**************************************************************************/ +IPTR Knob__MUIM_AskMinMax(struct IClass *cl, Object *obj, + struct MUIP_AskMinMax *msg) +{ + //struct Knob_DATA *data = INST_DATA(cl, obj); + + DoSuperMethodA(cl, obj, (Msg) msg); + + msg->MinMaxInfo->MinWidth += TOTAL_WIDTH; + msg->MinMaxInfo->MinHeight += TOTAL_HEIGHT; + msg->MinMaxInfo->DefWidth += TOTAL_WIDTH; + msg->MinMaxInfo->DefHeight += TOTAL_HEIGHT; + msg->MinMaxInfo->MaxWidth += TOTAL_WIDTH; + msg->MinMaxInfo->MaxHeight += TOTAL_HEIGHT; + + return TRUE; +} + +static void DrawNeedle(Object *obj, struct RastPort *rp, LONG x1, LONG y1, + LONG x2, LONG y2, double angle, BOOL clear) +{ + LONG cx = (x1 + x2) / 2; + LONG cy = (y1 + y2) / 2; + LONG rx = cx - x1 - 4; + LONG ry = cy - y1 - 4; + LONG a, b; + + SetDrMd(rp, JAM1); + + if ((angle < 0.0) | (angle > 270.0)) + angle = 0.0; + angle = 270.0 - 45.0 - angle; + + a = cx + (LONG) (cos(angle * 3.14159265358979323846 / 180.0) * rx); + b = cy - (LONG) (sin(angle * 3.14159265358979323846 / 180.0) * ry); + + if (clear) + { + SetAPen(rp, _pens(obj)[MPEN_HALFSHINE]); + RectFill(rp, a - 1, b - 1, a + 1, b + 1); + } + else + { + SetAPen(rp, _pens(obj)[MPEN_SHADOW]); + Move(rp, a, b - 1); + Draw(rp, a - 1, b); + SetAPen(rp, _pens(obj)[MPEN_HALFSHADOW]); + Move(rp, a - 1, b - 1); + Draw(rp, a, b); + SetAPen(rp, _pens(obj)[MPEN_SHINE]); + Move(rp, a + 1, b); + Draw(rp, a, b + 1); + SetAPen(rp, _pens(obj)[MPEN_HALFSHINE]); + WritePixel(rp, a + 1, b - 1); + WritePixel(rp, a + 1, b + 1); + WritePixel(rp, a - 1, b + 1); + } + +} + + +/************************************************************************** + MUIM_Draw +**************************************************************************/ +IPTR Knob__MUIM_Draw(struct IClass *cl, Object *obj, struct MUIP_Draw *msg) +{ + struct Knob_DATA *data = INST_DATA(cl, obj); + struct RastPort *rp; + WORD x1, y1, x2, y2; + + DoSuperMethodA(cl, obj, (Msg) msg); + + if (!(msg->flags & (MADF_DRAWOBJECT | MADF_DRAWUPDATE))) + return FALSE; + + x1 = _mleft(obj); + y1 = _mtop(obj); + x2 = _mright(obj); + y2 = _mbottom(obj); + + rp = _rp(obj); + + if (msg->flags & MADF_DRAWOBJECT) + { + /* Transparent edges */ + + DoMethod(obj, MUIM_DrawParentBackground, x1, y1, 2, 1, x1, y1, 0); + DoMethod(obj, MUIM_DrawParentBackground, x1, y1 + 1, 1, 1, x1, + y1 + 1, 0); + + DoMethod(obj, MUIM_DrawParentBackground, x2 - 1, y1, 2, 1, x2 - 1, + y1, 0); + DoMethod(obj, MUIM_DrawParentBackground, x2, y1 + 1, 1, 1, x2, + y1 + 1, 0); + + DoMethod(obj, MUIM_DrawParentBackground, x1, y2, 2, 1, x1, y2, 0); + DoMethod(obj, MUIM_DrawParentBackground, x1, y2 - 1, 1, 1, x1, + y2 - 1, 0); + + DoMethod(obj, MUIM_DrawParentBackground, x2 - 1, y2, 2, 1, x2 - 1, + y2, 0); + DoMethod(obj, MUIM_DrawParentBackground, x2, y2 - 1, 1, 1, x2, + y2 - 1, 0); + + /* Outer frame */ + + SetABPenDrMd(rp, _pens(obj)[MPEN_SHINE], 0, JAM1); + Move(rp, x1 + 1, y2 - 1); + Draw(rp, x1, y2 - 2); + Draw(rp, x1, y1 + 2); + Draw(rp, x1 + 2, y1); + Draw(rp, x2 - 2, y1); + Draw(rp, x2 - 1, y1 + 1); + + SetAPen(rp, _pens(obj)[MPEN_SHADOW]); + Move(rp, x2, y1 + 2); + Draw(rp, x2, y2 - 2); + Draw(rp, x2 - 2, y2); + Draw(rp, x1 + 2, y2); + + SetAPen(rp, _pens(obj)[MPEN_HALFSHINE]); + Move(rp, x1 + 1, y2 - 2); + Draw(rp, x1 + 1, y1 + 2); + Draw(rp, x1 + 2, y1 + 1); + Draw(rp, x2 - 2, y1 + 1); + + SetAPen(rp, _pens(obj)[MPEN_HALFSHADOW]); + Move(rp, x2 - 1, y1 + 2); + Draw(rp, x2 - 1, y2 - 2); + Draw(rp, x2 - 2, y2 - 1); + Draw(rp, x1 + 2, y2 - 1); + + /* Border */ + + x1 += OUTERFRAME_X; + x2 -= OUTERFRAME_X; + y1 += OUTERFRAME_X; + y2 -= OUTERFRAME_Y; + + SetAPen(rp, _pens(obj)[MPEN_HALFSHINE]); + RectFill(rp, x1, y1, x2, y1 + BORDERSIZE_Y - 1); + RectFill(rp, x1, y1 + BORDERSIZE_Y, x1 + BORDERSIZE_X - 1, y2); + RectFill(rp, x1 + BORDERSIZE_X - 1, y2 - BORDERSIZE_Y + 1, x2, y2); + RectFill(rp, x2 - BORDERSIZE_X + 1, y1 + BORDERSIZE_Y, x2, + y2 - BORDERSIZE_Y); + + /* Inner Frame */ + + x1 += BORDERSIZE_X; + x2 -= BORDERSIZE_X; + y1 += BORDERSIZE_Y; + y2 = y1 + KNOB_HEIGHT - 1; + + /* Knob bg */ + + { + static const UBYTE pen_mapping[] = { + MPEN_HALFSHINE, MPEN_HALFSHADOW, MPEN_SHADOW, MPEN_SHINE + }; + const UBYTE *rleptr; + UBYTE rle; + WORD x = 0, y = 0, count; + + for (rleptr = knob_rle;;) + { + rle = *rleptr++; + count = (rle >> 4) + 1; + SetAPen(_rp(obj), _pens(obj)[pen_mapping[rle & 15]]); + RectFill(_rp(obj), x1 + x, y1 + y, x1 + x + count - 1, + y1 + y); + x += count; + if (x >= KNOB_WIDTH) + { + x = 0; + y++; + if (y >= KNOB_HEIGHT) + break; + } + } + } + + /* Knob-Label spacing */ + + y1 = y2 + 1; + + SetAPen(rp, _pens(obj)[MPEN_HALFSHINE]); + RectFill(rp, x1, y1, x2, y1 + KNOB_LABEL_SPACING - 1); + + /* Label Frame */ + + y1 += KNOB_LABEL_SPACING; + y2 = _mbottom(obj) - OUTERFRAME_Y - BORDERSIZE_Y; + + SetAPen(rp, _pens(obj)[MPEN_HALFSHINE]); + Move(rp, x1, y1); + Draw(rp, x1 + 1, y1); + Draw(rp, x1, y1 + 1); + Move(rp, x2, y1); + Draw(rp, x2 - 1, y1); + Draw(rp, x2, y1 + 1); + Move(rp, x1, y2); + Draw(rp, x1 + 1, y2); + Draw(rp, x1, y2 - 1); + Move(rp, x2, y2); + Draw(rp, x2 - 1, y2); + Draw(rp, x2, y2 - 1); + + SetAPen(rp, _pens(obj)[MPEN_HALFSHADOW]); + Move(rp, x1 + 1, y2 - 1); + Draw(rp, x1, y2 - 2); + Draw(rp, x1, y1 + 2); + Draw(rp, x1 + 2, y1); + Draw(rp, x2 - 2, y1); + Draw(rp, x2 - 1, y1 + 1); + + SetAPen(rp, _pens(obj)[MPEN_SHINE]); + Move(rp, x2, y1 + 2); + Draw(rp, x2, y2 - 2); + Draw(rp, x2 - 2, y2); + Draw(rp, x1 + 2, y2); + + SetAPen(rp, _pens(obj)[MPEN_SHADOW]); + RectFill(rp, x1 + 1, y1 + 2, x1 + 1, y2 - 2); + RectFill(rp, x2 - 1, y1 + 2, x2 - 1, y2 - 2); + RectFill(rp, x1 + 2, y1 + 1, x2 - 2, y1 + 1); + RectFill(rp, x1 + 2, y2 - 1, x2 - 2, y2 - 1); + + /* Label Bg */ + + RectFill(rp, x1 + 2, y1 + 2, x2 - 2, y2 - 2); + + } + + x1 = _mleft(obj) + OUTERFRAME_X + BORDERSIZE_X; + x2 = _mright(obj) - OUTERFRAME_X - BORDERSIZE_X; + y1 = _mtop(obj) + OUTERFRAME_Y + BORDERSIZE_Y; + y2 = y1 + KNOB_HEIGHT - 1; + + if (msg->flags & MADF_DRAWUPDATE) + { + DrawNeedle(obj, rp, x1, y1, x2, y2, data->prevangle, TRUE); + } + + data->prevangle = + (double)DoMethod(obj, MUIM_Numeric_ValueToScale, 0, 270); + + DrawNeedle(obj, rp, x1, y1, x2, y2, data->prevangle, FALSE); + + return TRUE; +} + +/************************************************************************** + MUIM_HandleEvent +**************************************************************************/ +IPTR Knob__MUIM_HandleEvent(struct IClass *cl, Object *obj, + struct MUIP_HandleEvent *msg) +{ + struct Knob_DATA *data = INST_DATA(cl, obj); + + if (!msg->imsg) + { + return 0; + } + + switch (msg->imsg->Class) + { + case IDCMP_MOUSEBUTTONS: + switch (msg->imsg->Code) + { + case SELECTDOWN: + if (_between(_left(obj), msg->imsg->MouseX, _right(obj)) && + _between(_top(obj), msg->imsg->MouseY, _bottom(obj))) + { + DoMethod(_win(obj), MUIM_Window_RemEventHandler, + (IPTR) & data->ehn); + data->ehn.ehn_Events |= IDCMP_MOUSEMOVE; + DoMethod(_win(obj), MUIM_Window_AddEventHandler, + (IPTR) & data->ehn); + + } + break; + + case SELECTUP: + case MENUUP: + case MIDDLEUP: + default: + DoMethod(_win(obj), MUIM_Window_RemEventHandler, + (IPTR) & data->ehn); + data->ehn.ehn_Events &= ~IDCMP_MOUSEMOVE; + DoMethod(_win(obj), MUIM_Window_AddEventHandler, + (IPTR) & data->ehn); + break; + + + } /* switch(msg->imsg->Code) */ + break; + + case IDCMP_MOUSEMOVE: + { + double angle; + WORD x1, y1, x2, y2, cx, cy, dx, dy; + IPTR val; + + x1 = _mleft(obj) + OUTERFRAME_X + BORDERSIZE_X; + x2 = _mright(obj) - OUTERFRAME_X - BORDERSIZE_X; + y1 = _mtop(obj) + OUTERFRAME_Y + BORDERSIZE_Y; + y2 = y1 + KNOB_HEIGHT - 1; + cx = (x1 + x2) / 2; + cy = (y1 + y2) / 2; + dx = msg->imsg->MouseX - cx; + dy = cy - msg->imsg->MouseY; + + angle = + 180.0 - 45.0 + 180.0 * atan2((double)dx, + (double)dy) / 3.14159265358979323846; + if (angle < 0.0) + angle = 0.0; + else if (angle > 270.0) + angle = 270.0; + + val = + DoMethod(obj, MUIM_Numeric_ScaleToValue, 0, 270, + (LONG) angle); + set(obj, MUIA_Numeric_Value, val); + + } + break; + + } /* switch(msg->imsg->Class) */ + + return 0; +} + +#if ZUNE_BUILTIN_KNOB +BOOPSI_DISPATCHER(IPTR, Knob_Dispatcher, cl, obj, msg) +{ + switch (msg->MethodID) + { + case OM_NEW: + return Knob__OM_NEW(cl, obj, (struct opSet *)msg); + case MUIM_Setup: + return Knob__MUIM_Setup(cl, obj, (struct MUIP_Setup *)msg); + case MUIM_Cleanup: + return Knob__MUIM_Cleanup(cl, obj, (struct MUIP_Cleanup *)msg); + case MUIM_AskMinMax: + return Knob__MUIM_AskMinMax(cl, obj, (struct MUIP_AskMinMax *)msg); + case MUIM_Draw: + return Knob__MUIM_Draw(cl, obj, (struct MUIP_Draw *)msg); + case MUIM_HandleEvent: + return Knob__MUIM_HandleEvent(cl, obj, + (struct MUIP_HandleEvent *)msg); + default: + return DoSuperMethodA(cl, obj, msg); + } +} +BOOPSI_DISPATCHER_END + +const struct __MUIBuiltinClass _MUI_Knob_desc = +{ + MUIC_Knob, + MUIC_Numeric, + sizeof(struct Knob_DATA), + (void *) Knob_Dispatcher +}; +#endif /* ZUNE_BUILTIN_KNOB */ diff --git a/workbench/libs/muimaster/classes/knob.h b/workbench/libs/muimaster/classes/knob.h index e69c9fb8f4..06e089fbb1 100644 --- a/workbench/libs/muimaster/classes/knob.h +++ b/workbench/libs/muimaster/classes/knob.h @@ -7,11 +7,11 @@ */ /*** Name *******************************************************************/ -#define MUIC_Knob "Knob.mui" +#define MUIC_Knob "Knob.mui" /*** Identifier base (for Zune extensions) **********************************/ -//#define MUIB_Knob (MUIB_ZUNE | 0x????) +//#define MUIB_Knob (MUIB_ZUNE | 0x????) -extern const struct __MUIBuiltinClass _MUI_Knob_desc; /* PRIV */ +extern const struct __MUIBuiltinClass _MUI_Knob_desc; /* PRIV */ #endif /* _MUI_CLASSES_KNOB_H */ diff --git a/workbench/libs/muimaster/classes/levelmeter.c b/workbench/libs/muimaster/classes/levelmeter.c dissimilarity index 72% index a585d4ee1e..326439852c 100644 --- a/workbench/libs/muimaster/classes/levelmeter.c +++ b/workbench/libs/muimaster/classes/levelmeter.c @@ -1,421 +1,454 @@ -/* - Copyright © 2002-2003, The AROS Development Team. All rights reserved. - $Id$ -*/ - -#define MUIMASTER_YES_INLINE_STDARG - -#include <exec/memory.h> -#include <clib/alib_protos.h> -#include <proto/exec.h> -#include <proto/dos.h> -#include <proto/intuition.h> -#include <proto/graphics.h> -#include <proto/utility.h> -#include <proto/muimaster.h> - -#include <string.h> -#include <stdio.h> -#include <math.h> - -#include "mui.h" -#include "muimaster_intern.h" -#include "support.h" -#include "support_classes.h" -#include "prefs.h" -#include "debug.h" -#include "levelmeter_private.h" - -extern struct Library *MUIMasterBase; - -#define OUTERFRAME_X 2 -#define OUTERFRAME_Y 2 -#define OUTERFRAME_W (OUTERFRAME_X * 2) -#define OUTERFRAME_H (OUTERFRAME_Y * 2) - -#define INNERFRAME_X 2 -#define INNERFRAME_Y 2 -#define INNERFRAME_W (INNERFRAME_X * 2) -#define INNERFRAME_H (INNERFRAME_Y * 2) - -#define BORDERSIZE_X 3 -#define BORDERSIZE_Y 2 -#define BORDERSIZE_W (BORDERSIZE_X * 2) -#define BORDERSIZE_H (BORDERSIZE_Y * 2) - -#define LEVEL_LABEL_SPACING 2 - -#define LEVEL_WIDTH 39 -#define LEVEL_HEIGHT 20 - -#define LABEL_HEIGHT 8 - -#define TOTAL_WIDTH OUTERFRAME_W + BORDERSIZE_W + INNERFRAME_W + LEVEL_WIDTH -#define TOTAL_HEIGHT OUTERFRAME_H + BORDERSIZE_H + INNERFRAME_H * 2 + LEVEL_HEIGHT + LEVEL_LABEL_SPACING + LABEL_HEIGHT - -IPTR Levelmeter__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) -{ - obj = (Object *)DoSuperNewTags - ( - cl, obj, NULL, - MUIA_FillArea, FALSE, - TAG_MORE, (IPTR) msg->ops_AttrList - ); - - if (obj) - { - struct Levelmeter_DATA *data = INST_DATA(cl, obj); - - data->levelbgpen = -1; - } - - return (IPTR)obj; -} - -IPTR Levelmeter__MUIM_Setup(struct IClass *cl, Object *obj, struct MUIP_Setup *msg) -{ - struct Levelmeter_DATA *data = INST_DATA(cl, obj); - //struct RastPort rp; - IPTR retval; - - retval = DoSuperMethodA(cl, obj, (Msg)msg); - if (retval) - { - #if 0 - InitRastPort(&rp); - SetFont(&rp,_font(obj)); - - DeinitRastPort(&rp); - #endif - data->levelbgpen = ObtainBestPen(_screen(obj)->ViewPort.ColorMap, - 0x4b4b4b4b, - 0x39393939, - 0x93939393, - OBP_FailIfBad, FALSE, - OBP_Precision, PRECISION_GUI, - TAG_DONE); - } - - return retval; -} - -IPTR Levelmeter__MUIM_Cleanup(struct IClass *cl, Object *obj, struct MUIP_Cleanup *msg) -{ - struct Levelmeter_DATA *data = INST_DATA(cl, obj); - - if (data->levelbgpen != -1) - { - ReleasePen(_screen(obj)->ViewPort.ColorMap, data->levelbgpen); - data->levelbgpen = -1; - } - - return DoSuperMethodA(cl, obj, (Msg)msg); -} - -/************************************************************************** - MUIM_AskMinMax -**************************************************************************/ -IPTR Levelmeter__MUIM_AskMinMax(struct IClass *cl, Object *obj, struct MUIP_AskMinMax *msg) -{ - //struct Levelmeter_DATA *data = INST_DATA(cl, obj); - - DoSuperMethodA(cl, obj, (Msg)msg); - - msg->MinMaxInfo->MinWidth += TOTAL_WIDTH; - msg->MinMaxInfo->MinHeight += TOTAL_HEIGHT; - msg->MinMaxInfo->DefWidth += TOTAL_WIDTH; - msg->MinMaxInfo->DefHeight += TOTAL_HEIGHT; - msg->MinMaxInfo->MaxWidth += TOTAL_WIDTH; - msg->MinMaxInfo->MaxHeight += TOTAL_HEIGHT; - - return TRUE; -} - -static void DrawScale(struct RastPort *rp, LONG x1, LONG y1, LONG x2, LONG y2, LONG pen) -{ - LONG cx = (x1 + x2 + 1) / 2; - LONG cy = y2 - 1; - LONG rx = cx - x1 - 1; - LONG ry = cy - y1 - 1; - LONG a, b, g; - - SetABPenDrMd(rp, pen, 0, JAM1); - - for(g = 0; g <= 180; g += 15) - { - double angle = ((double)g) * 3.14159265358979323846 / 180.0; - - a = cx + (LONG)(cos(angle) * rx); - b = cy - (LONG)(sin(angle) * ry); - - WritePixel(rp, a, b); - - if ((g % 45) == 0) - { - static WORD offtable[][2] = - { - {-1,0 }, - {-1,1 }, - {0 ,1 }, - { 1,1 }, - { 1,0 } - }; - - WritePixel(rp, a + offtable[g / 45][0], b + offtable[g / 45][1]); - } - - } - -} - -static void DrawNeedle(struct RastPort *rp, LONG x1, LONG y1, LONG x2, LONG y2, double angle, LONG pen) -{ - LONG cx = (x1 + x2 + 1) / 2; - LONG cy = y2 - 1; - LONG rx = cx - x1 - 4; - LONG ry = cy - y1 - 4; - LONG a, b; - - SetABPenDrMd(rp, pen, 0, JAM1); - Move(rp, cx, cy); - - if ((angle < 0.0) | (angle > 180.0)) angle = 0.0; - angle = 180.0 - angle; - - a = cx + (LONG)(cos(angle * 3.14159265358979323846 / 180.0) * rx); - b = cy - (LONG)(sin(angle * 3.14159265358979323846 / 180.0) * ry); - - Draw(rp, a, b); - -} - -/************************************************************************** - MUIM_Draw -**************************************************************************/ -IPTR Levelmeter__MUIM_Draw(struct IClass *cl, Object *obj, struct MUIP_Draw *msg) -{ - struct Levelmeter_DATA *data = INST_DATA(cl, obj); - struct RastPort *rp; - WORD x1, y1, x2, y2; - - DoSuperMethodA(cl,obj,(Msg)msg); - - if (!(msg->flags & (MADF_DRAWOBJECT | MADF_DRAWUPDATE))) - return FALSE; - - x1 = _mleft(obj); - y1 = _mtop(obj); - x2 = _mright(obj); - y2 = _mbottom(obj); - - rp = _rp(obj); - - if (msg->flags & MADF_DRAWOBJECT) - { - /* Transparent edges */ - - DoMethod(obj, MUIM_DrawParentBackground, x1, y1, 2, 1, x1, y1, 0); - DoMethod(obj, MUIM_DrawParentBackground, x1, y1 + 1, 1, 1, x1, y1 + 1, 0); - - DoMethod(obj, MUIM_DrawParentBackground, x2 - 1, y1, 2, 1, x2 - 1, y1, 0); - DoMethod(obj, MUIM_DrawParentBackground, x2, y1 + 1, 1, 1, x2, y1 + 1, 0); - - DoMethod(obj, MUIM_DrawParentBackground, x1, y2, 2, 1, x1, y2, 0); - DoMethod(obj, MUIM_DrawParentBackground, x1, y2 - 1, 1, 1, x1, y2 - 1, 0); - - DoMethod(obj, MUIM_DrawParentBackground, x2 - 1, y2, 2, 1, x2 - 1, y2, 0); - DoMethod(obj, MUIM_DrawParentBackground, x2, y2 - 1, 1, 1, x2, y2 - 1, 0); - - /* Outer frame */ - - SetABPenDrMd(rp, _pens(obj)[MPEN_SHINE], 0, JAM1); - Move(rp, x1 + 1, y2 - 1); - Draw(rp, x1, y2 - 2); - Draw(rp, x1, y1 + 2); - Draw(rp, x1 + 2, y1); - Draw(rp, x2 - 2, y1); - Draw(rp, x2 - 1, y1 + 1); - - SetAPen(rp, _pens(obj)[MPEN_SHADOW]); - Move(rp, x2, y1 + 2); - Draw(rp, x2, y2 - 2); - Draw(rp, x2 - 2, y2); - Draw(rp, x1 + 2, y2); - - SetAPen(rp, _pens(obj)[MPEN_HALFSHINE]); - Move(rp, x1 + 1, y2 - 2); - Draw(rp, x1 + 1, y1 + 2); - Draw(rp, x1 + 2, y1 + 1); - Draw(rp, x2 - 2, y1 + 1); - - SetAPen(rp, _pens(obj)[MPEN_HALFSHADOW]); - Move(rp, x2 - 1, y1 + 2); - Draw(rp, x2 - 1, y2 - 2); - Draw(rp, x2 - 2, y2 - 1); - Draw(rp, x1 + 2, y2 - 1); - - /* Border */ - - x1 += OUTERFRAME_X; x2 -= OUTERFRAME_X; - y1 += OUTERFRAME_X; y2 -= OUTERFRAME_Y; - - SetAPen(rp, _pens(obj)[MPEN_HALFSHINE]); - RectFill(rp, x1, y1, x2, y1 + BORDERSIZE_Y - 1); - RectFill(rp, x1, y1 + BORDERSIZE_Y, x1 + BORDERSIZE_X - 1, y2); - RectFill(rp, x1 + BORDERSIZE_X - 1, y2 - BORDERSIZE_Y + 1, x2, y2); - RectFill(rp, x2 - BORDERSIZE_X + 1, y1 + BORDERSIZE_Y, x2, y2 - BORDERSIZE_Y); - - /* Inner Frame */ - - x1 += BORDERSIZE_X; x2 -= BORDERSIZE_X; - y1 += BORDERSIZE_Y; y2 = y1 + LEVEL_HEIGHT + INNERFRAME_H - 1; - - Move(rp, x1, y1); - Draw(rp, x1 + 2, y1); - Draw(rp, x1, y1 + 2); - Draw(rp, x1, y1 + 1); - - Move(rp, x2, y1); - Draw(rp, x2 - 2, y1); - Draw(rp, x2, y1 + 2); - Draw(rp, x2, y1 + 1); - - Move(rp, x1, y2); - Draw(rp, x1 + 2, y2); - Draw(rp, x1, y2 - 2); - Draw(rp, x1, y2 - 1); - - Move(rp, x2, y2); - Draw(rp, x2 - 2, y2); - Draw(rp, x2, y2 - 2); - Draw(rp, x2, y2 - 1); - - SetAPen(rp, _pens(obj)[MPEN_HALFSHADOW]); - Move(rp, x1 + 2, y2 - 1); - Draw(rp, x1, y2 - 3); - Draw(rp, x1, y1 + 3); - Draw(rp, x1 + 3, y1); - Draw(rp, x2 - 3, y1); - Draw(rp, x2 - 1, y1 + 2); - - SetAPen(rp, _pens(obj)[MPEN_SHINE]); - Move(rp, x2, y1 + 3); - Draw(rp, x2, y2 - 3); - Draw(rp, x2 - 3, y2); - Draw(rp, x1 + 3, y2); - - SetAPen(rp, _pens(obj)[MPEN_SHADOW]); - Move(rp, x1 + 3, y1 + 1); - Draw(rp, x2 - 3, y1 + 1); - Move(rp, x1 + 1, y1 + 3); - Draw(rp, x1 + 1, y2 - 3); - Move(rp, x1 + 3, y2 - 1); - Draw(rp, x2 - 3, y2 - 1); - Move(rp, x2 - 1, y1 + 3), - Draw(rp, x2 - 1, y2 - 3); - - /* Levelmeter bg */ - - x1 += INNERFRAME_X; x2 -= INNERFRAME_X; - y1 += INNERFRAME_Y; y2 -= INNERFRAME_Y; - - SetAPen(rp, data->levelbgpen); - RectFill(rp, x1 + 1, y1, x2 - 1, y1); - RectFill(rp, x1, y1 + 1, x2, y2 - 1); - RectFill(rp, x1 + 1, y2, x2 - 1, y2); - - SetAPen(rp, _pens(obj)[MPEN_SHADOW]); - WritePixel(rp, x1, y1); - WritePixel(rp, x2, y1); - WritePixel(rp, x1, y2); - WritePixel(rp, x2, y2); - - /* Levelmeter scale */ - - DrawScale(rp, x1, y1, x2, y2, _pens(obj)[MPEN_SHINE]); - - /* Level-Label spacing */ - - x1 -= INNERFRAME_X; x2 += INNERFRAME_X; - y1 = y2 + INNERFRAME_Y + 1; - - SetAPen(rp, _pens(obj)[MPEN_HALFSHINE]); - RectFill(rp, x1, y1, x2, y1 + LEVEL_LABEL_SPACING - 1); - - /* Label Frame */ - - y1 += LEVEL_LABEL_SPACING; - y2 = _mbottom(obj) - OUTERFRAME_Y - BORDERSIZE_Y; - - SetAPen(rp, _pens(obj)[MPEN_HALFSHINE]); - Move(rp, x1, y1); Draw(rp, x1 + 1, y1); Draw(rp, x1, y1 + 1); - Move(rp, x2, y1); Draw(rp, x2 - 1, y1); Draw(rp, x2, y1 + 1); - Move(rp, x1, y2); Draw(rp, x1 + 1, y2); Draw(rp, x1, y2 - 1); - Move(rp, x2, y2); Draw(rp, x2 - 1, y2); Draw(rp, x2, y2 - 1); - - SetAPen(rp, _pens(obj)[MPEN_HALFSHADOW]); - Move(rp, x1 + 1, y2 - 1); - Draw(rp, x1, y2 - 2); - Draw(rp, x1, y1 + 2); - Draw(rp, x1 + 2, y1); - Draw(rp, x2 - 2, y1); - Draw(rp, x2 - 1, y1 + 1); - - SetAPen(rp, _pens(obj)[MPEN_SHINE]); - Move(rp, x2, y1 + 2); - Draw(rp, x2, y2 - 2); - Draw(rp, x2 - 2, y2); - Draw(rp, x1 + 2, y2); - - SetAPen(rp, _pens(obj)[MPEN_SHADOW]); - RectFill(rp, x1 + 1, y1 + 2, x1 + 1, y2 - 2); - RectFill(rp, x2 - 1, y1 + 2, x2 - 1, y2 - 2); - RectFill(rp, x1 + 2, y1 + 1, x2 - 2, y1 + 1); - RectFill(rp, x1 + 2, y2 - 1, x2 - 2, y2 - 1); - - /* Label Bg */ - - RectFill(rp, x1 + 2, y1 +2, x2 - 2, y2 - 2); - - } - - x1 = _mleft(obj) + OUTERFRAME_X + BORDERSIZE_X + INNERFRAME_X; - x2 = _mright(obj) - OUTERFRAME_X - BORDERSIZE_X - INNERFRAME_X; - y1 = _mtop(obj) + OUTERFRAME_Y + BORDERSIZE_Y + INNERFRAME_Y; - y2 = y1 + LEVEL_HEIGHT - 1; - - if (msg->flags & MADF_DRAWUPDATE) - { - DrawNeedle(rp, x1, y1, x2, y2, data->prevangle, data->levelbgpen); - } - - data->prevangle = (double)DoMethod(obj, MUIM_Numeric_ValueToScale, 0, 180); - - DrawNeedle(rp, x1, y1, x2, y2, data->prevangle, _pens(obj)[MPEN_SHINE]); - - return TRUE; -} - -#if ZUNE_BUILTIN_LEVELMETER -BOOPSI_DISPATCHER(IPTR, Levelmeter_Dispatcher, cl, obj, msg) -{ - switch (msg->MethodID) - { - case OM_NEW: return Levelmeter__OM_NEW(cl, obj, (struct opSet *)msg); - case MUIM_Setup: return Levelmeter__MUIM_Setup(cl, obj, (struct MUIP_Setup *)msg); - case MUIM_Cleanup: return Levelmeter__MUIM_Cleanup(cl, obj, (struct MUIP_Cleanup *)msg); - case MUIM_AskMinMax: return Levelmeter__MUIM_AskMinMax(cl, obj, (struct MUIP_AskMinMax *)msg); - case MUIM_Draw: return Levelmeter__MUIM_Draw(cl, obj, (struct MUIP_Draw *)msg); - default: return DoSuperMethodA(cl, obj, msg); - } -} -BOOPSI_DISPATCHER_END - -const struct __MUIBuiltinClass _MUI_Levelmeter_desc = -{ - MUIC_Levelmeter, - MUIC_Numeric, - sizeof(struct Levelmeter_DATA), - (void*)Levelmeter_Dispatcher -}; -#endif /* ZUNE_BUILTIN_LEVELMETER */ +/* + Copyright © 2002-2003, The AROS Development Team. All rights reserved. + $Id$ +*/ + +#define MUIMASTER_YES_INLINE_STDARG + +#include <exec/memory.h> +#include <clib/alib_protos.h> +#include <proto/exec.h> +#include <proto/dos.h> +#include <proto/intuition.h> +#include <proto/graphics.h> +#include <proto/utility.h> +#include <proto/muimaster.h> + +#include <string.h> +#include <stdio.h> +#include <math.h> + +#include "mui.h" +#include "muimaster_intern.h" +#include "support.h" +#include "support_classes.h" +#include "prefs.h" +#include "debug.h" +#include "levelmeter_private.h" + +extern struct Library *MUIMasterBase; + +#define OUTERFRAME_X 2 +#define OUTERFRAME_Y 2 +#define OUTERFRAME_W (OUTERFRAME_X * 2) +#define OUTERFRAME_H (OUTERFRAME_Y * 2) + +#define INNERFRAME_X 2 +#define INNERFRAME_Y 2 +#define INNERFRAME_W (INNERFRAME_X * 2) +#define INNERFRAME_H (INNERFRAME_Y * 2) + +#define BORDERSIZE_X 3 +#define BORDERSIZE_Y 2 +#define BORDERSIZE_W (BORDERSIZE_X * 2) +#define BORDERSIZE_H (BORDERSIZE_Y * 2) + +#define LEVEL_LABEL_SPACING 2 + +#define LEVEL_WIDTH 39 +#define LEVEL_HEIGHT 20 + +#define LABEL_HEIGHT 8 + +#define TOTAL_WIDTH OUTERFRAME_W + BORDERSIZE_W + INNERFRAME_W + LEVEL_WIDTH +#define TOTAL_HEIGHT OUTERFRAME_H + BORDERSIZE_H + INNERFRAME_H * 2 \ ++ LEVEL_HEIGHT + LEVEL_LABEL_SPACING + LABEL_HEIGHT + +IPTR Levelmeter__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) +{ + obj = (Object *) DoSuperNewTags + (cl, obj, NULL, + MUIA_FillArea, FALSE, TAG_MORE, (IPTR) msg->ops_AttrList); + + if (obj) + { + struct Levelmeter_DATA *data = INST_DATA(cl, obj); + + data->levelbgpen = -1; + } + + return (IPTR) obj; +} + +IPTR Levelmeter__MUIM_Setup(struct IClass *cl, Object *obj, + struct MUIP_Setup *msg) +{ + struct Levelmeter_DATA *data = INST_DATA(cl, obj); + //struct RastPort rp; + IPTR retval; + + retval = DoSuperMethodA(cl, obj, (Msg) msg); + if (retval) + { +#if 0 + InitRastPort(&rp); + SetFont(&rp, _font(obj)); + + DeinitRastPort(&rp); +#endif + data->levelbgpen = ObtainBestPen(_screen(obj)->ViewPort.ColorMap, + 0x4b4b4b4b, + 0x39393939, + 0x93939393, + OBP_FailIfBad, FALSE, OBP_Precision, PRECISION_GUI, TAG_DONE); + } + + return retval; +} + +IPTR Levelmeter__MUIM_Cleanup(struct IClass *cl, Object *obj, + struct MUIP_Cleanup *msg) +{ + struct Levelmeter_DATA *data = INST_DATA(cl, obj); + + if (data->levelbgpen != -1) + { + ReleasePen(_screen(obj)->ViewPort.ColorMap, data->levelbgpen); + data->levelbgpen = -1; + } + + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +/************************************************************************** + MUIM_AskMinMax +**************************************************************************/ +IPTR Levelmeter__MUIM_AskMinMax(struct IClass *cl, Object *obj, + struct MUIP_AskMinMax *msg) +{ + //struct Levelmeter_DATA *data = INST_DATA(cl, obj); + + DoSuperMethodA(cl, obj, (Msg) msg); + + msg->MinMaxInfo->MinWidth += TOTAL_WIDTH; + msg->MinMaxInfo->MinHeight += TOTAL_HEIGHT; + msg->MinMaxInfo->DefWidth += TOTAL_WIDTH; + msg->MinMaxInfo->DefHeight += TOTAL_HEIGHT; + msg->MinMaxInfo->MaxWidth += TOTAL_WIDTH; + msg->MinMaxInfo->MaxHeight += TOTAL_HEIGHT; + + return TRUE; +} + +static void DrawScale(struct RastPort *rp, LONG x1, LONG y1, LONG x2, + LONG y2, LONG pen) +{ + LONG cx = (x1 + x2 + 1) / 2; + LONG cy = y2 - 1; + LONG rx = cx - x1 - 1; + LONG ry = cy - y1 - 1; + LONG a, b, g; + + SetABPenDrMd(rp, pen, 0, JAM1); + + for (g = 0; g <= 180; g += 15) + { + double angle = ((double)g) * 3.14159265358979323846 / 180.0; + + a = cx + (LONG) (cos(angle) * rx); + b = cy - (LONG) (sin(angle) * ry); + + WritePixel(rp, a, b); + + if ((g % 45) == 0) + { + static WORD offtable[][2] = { + {-1, 0}, + {-1, 1}, + {0, 1}, + {1, 1}, + {1, 0} + }; + + WritePixel(rp, a + offtable[g / 45][0], + b + offtable[g / 45][1]); + } + + } + +} + +static void DrawNeedle(struct RastPort *rp, LONG x1, LONG y1, LONG x2, + LONG y2, double angle, LONG pen) +{ + LONG cx = (x1 + x2 + 1) / 2; + LONG cy = y2 - 1; + LONG rx = cx - x1 - 4; + LONG ry = cy - y1 - 4; + LONG a, b; + + SetABPenDrMd(rp, pen, 0, JAM1); + Move(rp, cx, cy); + + if ((angle < 0.0) | (angle > 180.0)) + angle = 0.0; + angle = 180.0 - angle; + + a = cx + (LONG) (cos(angle * 3.14159265358979323846 / 180.0) * rx); + b = cy - (LONG) (sin(angle * 3.14159265358979323846 / 180.0) * ry); + + Draw(rp, a, b); + +} + +/************************************************************************** + MUIM_Draw +**************************************************************************/ +IPTR Levelmeter__MUIM_Draw(struct IClass *cl, Object *obj, + struct MUIP_Draw *msg) +{ + struct Levelmeter_DATA *data = INST_DATA(cl, obj); + struct RastPort *rp; + WORD x1, y1, x2, y2; + + DoSuperMethodA(cl, obj, (Msg) msg); + + if (!(msg->flags & (MADF_DRAWOBJECT | MADF_DRAWUPDATE))) + return FALSE; + + x1 = _mleft(obj); + y1 = _mtop(obj); + x2 = _mright(obj); + y2 = _mbottom(obj); + + rp = _rp(obj); + + if (msg->flags & MADF_DRAWOBJECT) + { + /* Transparent edges */ + + DoMethod(obj, MUIM_DrawParentBackground, x1, y1, 2, 1, x1, y1, 0); + DoMethod(obj, MUIM_DrawParentBackground, x1, y1 + 1, 1, 1, x1, + y1 + 1, 0); + + DoMethod(obj, MUIM_DrawParentBackground, x2 - 1, y1, 2, 1, x2 - 1, + y1, 0); + DoMethod(obj, MUIM_DrawParentBackground, x2, y1 + 1, 1, 1, x2, + y1 + 1, 0); + + DoMethod(obj, MUIM_DrawParentBackground, x1, y2, 2, 1, x1, y2, 0); + DoMethod(obj, MUIM_DrawParentBackground, x1, y2 - 1, 1, 1, x1, + y2 - 1, 0); + + DoMethod(obj, MUIM_DrawParentBackground, x2 - 1, y2, 2, 1, x2 - 1, + y2, 0); + DoMethod(obj, MUIM_DrawParentBackground, x2, y2 - 1, 1, 1, x2, + y2 - 1, 0); + + /* Outer frame */ + + SetABPenDrMd(rp, _pens(obj)[MPEN_SHINE], 0, JAM1); + Move(rp, x1 + 1, y2 - 1); + Draw(rp, x1, y2 - 2); + Draw(rp, x1, y1 + 2); + Draw(rp, x1 + 2, y1); + Draw(rp, x2 - 2, y1); + Draw(rp, x2 - 1, y1 + 1); + + SetAPen(rp, _pens(obj)[MPEN_SHADOW]); + Move(rp, x2, y1 + 2); + Draw(rp, x2, y2 - 2); + Draw(rp, x2 - 2, y2); + Draw(rp, x1 + 2, y2); + + SetAPen(rp, _pens(obj)[MPEN_HALFSHINE]); + Move(rp, x1 + 1, y2 - 2); + Draw(rp, x1 + 1, y1 + 2); + Draw(rp, x1 + 2, y1 + 1); + Draw(rp, x2 - 2, y1 + 1); + + SetAPen(rp, _pens(obj)[MPEN_HALFSHADOW]); + Move(rp, x2 - 1, y1 + 2); + Draw(rp, x2 - 1, y2 - 2); + Draw(rp, x2 - 2, y2 - 1); + Draw(rp, x1 + 2, y2 - 1); + + /* Border */ + + x1 += OUTERFRAME_X; + x2 -= OUTERFRAME_X; + y1 += OUTERFRAME_X; + y2 -= OUTERFRAME_Y; + + SetAPen(rp, _pens(obj)[MPEN_HALFSHINE]); + RectFill(rp, x1, y1, x2, y1 + BORDERSIZE_Y - 1); + RectFill(rp, x1, y1 + BORDERSIZE_Y, x1 + BORDERSIZE_X - 1, y2); + RectFill(rp, x1 + BORDERSIZE_X - 1, y2 - BORDERSIZE_Y + 1, x2, y2); + RectFill(rp, x2 - BORDERSIZE_X + 1, y1 + BORDERSIZE_Y, x2, + y2 - BORDERSIZE_Y); + + /* Inner Frame */ + + x1 += BORDERSIZE_X; + x2 -= BORDERSIZE_X; + y1 += BORDERSIZE_Y; + y2 = y1 + LEVEL_HEIGHT + INNERFRAME_H - 1; + + Move(rp, x1, y1); + Draw(rp, x1 + 2, y1); + Draw(rp, x1, y1 + 2); + Draw(rp, x1, y1 + 1); + + Move(rp, x2, y1); + Draw(rp, x2 - 2, y1); + Draw(rp, x2, y1 + 2); + Draw(rp, x2, y1 + 1); + + Move(rp, x1, y2); + Draw(rp, x1 + 2, y2); + Draw(rp, x1, y2 - 2); + Draw(rp, x1, y2 - 1); + + Move(rp, x2, y2); + Draw(rp, x2 - 2, y2); + Draw(rp, x2, y2 - 2); + Draw(rp, x2, y2 - 1); + + SetAPen(rp, _pens(obj)[MPEN_HALFSHADOW]); + Move(rp, x1 + 2, y2 - 1); + Draw(rp, x1, y2 - 3); + Draw(rp, x1, y1 + 3); + Draw(rp, x1 + 3, y1); + Draw(rp, x2 - 3, y1); + Draw(rp, x2 - 1, y1 + 2); + + SetAPen(rp, _pens(obj)[MPEN_SHINE]); + Move(rp, x2, y1 + 3); + Draw(rp, x2, y2 - 3); + Draw(rp, x2 - 3, y2); + Draw(rp, x1 + 3, y2); + + SetAPen(rp, _pens(obj)[MPEN_SHADOW]); + Move(rp, x1 + 3, y1 + 1); + Draw(rp, x2 - 3, y1 + 1); + Move(rp, x1 + 1, y1 + 3); + Draw(rp, x1 + 1, y2 - 3); + Move(rp, x1 + 3, y2 - 1); + Draw(rp, x2 - 3, y2 - 1); + Move(rp, x2 - 1, y1 + 3), Draw(rp, x2 - 1, y2 - 3); + + /* Levelmeter bg */ + + x1 += INNERFRAME_X; + x2 -= INNERFRAME_X; + y1 += INNERFRAME_Y; + y2 -= INNERFRAME_Y; + + SetAPen(rp, data->levelbgpen); + RectFill(rp, x1 + 1, y1, x2 - 1, y1); + RectFill(rp, x1, y1 + 1, x2, y2 - 1); + RectFill(rp, x1 + 1, y2, x2 - 1, y2); + + SetAPen(rp, _pens(obj)[MPEN_SHADOW]); + WritePixel(rp, x1, y1); + WritePixel(rp, x2, y1); + WritePixel(rp, x1, y2); + WritePixel(rp, x2, y2); + + /* Levelmeter scale */ + + DrawScale(rp, x1, y1, x2, y2, _pens(obj)[MPEN_SHINE]); + + /* Level-Label spacing */ + + x1 -= INNERFRAME_X; + x2 += INNERFRAME_X; + y1 = y2 + INNERFRAME_Y + 1; + + SetAPen(rp, _pens(obj)[MPEN_HALFSHINE]); + RectFill(rp, x1, y1, x2, y1 + LEVEL_LABEL_SPACING - 1); + + /* Label Frame */ + + y1 += LEVEL_LABEL_SPACING; + y2 = _mbottom(obj) - OUTERFRAME_Y - BORDERSIZE_Y; + + SetAPen(rp, _pens(obj)[MPEN_HALFSHINE]); + Move(rp, x1, y1); + Draw(rp, x1 + 1, y1); + Draw(rp, x1, y1 + 1); + Move(rp, x2, y1); + Draw(rp, x2 - 1, y1); + Draw(rp, x2, y1 + 1); + Move(rp, x1, y2); + Draw(rp, x1 + 1, y2); + Draw(rp, x1, y2 - 1); + Move(rp, x2, y2); + Draw(rp, x2 - 1, y2); + Draw(rp, x2, y2 - 1); + + SetAPen(rp, _pens(obj)[MPEN_HALFSHADOW]); + Move(rp, x1 + 1, y2 - 1); + Draw(rp, x1, y2 - 2); + Draw(rp, x1, y1 + 2); + Draw(rp, x1 + 2, y1); + Draw(rp, x2 - 2, y1); + Draw(rp, x2 - 1, y1 + 1); + + SetAPen(rp, _pens(obj)[MPEN_SHINE]); + Move(rp, x2, y1 + 2); + Draw(rp, x2, y2 - 2); + Draw(rp, x2 - 2, y2); + Draw(rp, x1 + 2, y2); + + SetAPen(rp, _pens(obj)[MPEN_SHADOW]); + RectFill(rp, x1 + 1, y1 + 2, x1 + 1, y2 - 2); + RectFill(rp, x2 - 1, y1 + 2, x2 - 1, y2 - 2); + RectFill(rp, x1 + 2, y1 + 1, x2 - 2, y1 + 1); + RectFill(rp, x1 + 2, y2 - 1, x2 - 2, y2 - 1); + + /* Label Bg */ + + RectFill(rp, x1 + 2, y1 + 2, x2 - 2, y2 - 2); + + } + + x1 = _mleft(obj) + OUTERFRAME_X + BORDERSIZE_X + INNERFRAME_X; + x2 = _mright(obj) - OUTERFRAME_X - BORDERSIZE_X - INNERFRAME_X; + y1 = _mtop(obj) + OUTERFRAME_Y + BORDERSIZE_Y + INNERFRAME_Y; + y2 = y1 + LEVEL_HEIGHT - 1; + + if (msg->flags & MADF_DRAWUPDATE) + { + DrawNeedle(rp, x1, y1, x2, y2, data->prevangle, data->levelbgpen); + } + + data->prevangle = + (double)DoMethod(obj, MUIM_Numeric_ValueToScale, 0, 180); + + DrawNeedle(rp, x1, y1, x2, y2, data->prevangle, _pens(obj)[MPEN_SHINE]); + + return TRUE; +} + +#if ZUNE_BUILTIN_LEVELMETER +BOOPSI_DISPATCHER(IPTR, Levelmeter_Dispatcher, cl, obj, msg) +{ + switch (msg->MethodID) + { + case OM_NEW: + return Levelmeter__OM_NEW(cl, obj, (struct opSet *)msg); + case MUIM_Setup: + return Levelmeter__MUIM_Setup(cl, obj, (struct MUIP_Setup *)msg); + case MUIM_Cleanup: + return Levelmeter__MUIM_Cleanup(cl, obj, + (struct MUIP_Cleanup *)msg); + case MUIM_AskMinMax: + return Levelmeter__MUIM_AskMinMax(cl, obj, + (struct MUIP_AskMinMax *)msg); + case MUIM_Draw: + return Levelmeter__MUIM_Draw(cl, obj, (struct MUIP_Draw *)msg); + default: + return DoSuperMethodA(cl, obj, msg); + } +} +BOOPSI_DISPATCHER_END + +const struct __MUIBuiltinClass _MUI_Levelmeter_desc = +{ + MUIC_Levelmeter, + MUIC_Numeric, + sizeof(struct Levelmeter_DATA), + (void *) Levelmeter_Dispatcher +}; +#endif /* ZUNE_BUILTIN_LEVELMETER */ diff --git a/workbench/libs/muimaster/classes/levelmeter.h b/workbench/libs/muimaster/classes/levelmeter.h index ae36aef449..07cec5cdce 100644 --- a/workbench/libs/muimaster/classes/levelmeter.h +++ b/workbench/libs/muimaster/classes/levelmeter.h @@ -7,15 +7,15 @@ */ /*** Name *******************************************************************/ -#define MUIC_Levelmeter "Levelmeter.mui" +#define MUIC_Levelmeter "Levelmeter.mui" /*** Identifier base (for Zune extensions) **********************************/ -//#define MUIB_Levelmeter (MUIB_ZUNE | 0x????) +//#define MUIB_Levelmeter (MUIB_ZUNE | 0x????) /*** Attributes *************************************************************/ -#define MUIA_Levelmeter_Label (MUIB_MUI | 0x00420dd5) /* V11 isg STRPTR */ +#define MUIA_Levelmeter_Label (MUIB_MUI | 0x00420dd5) /* V11 isg STRPTR */ -extern const struct __MUIBuiltinClass _MUI_Levelmeter_desc; /* PRIV */ +extern const struct __MUIBuiltinClass _MUI_Levelmeter_desc; /* PRIV */ #endif /* _MUI_CLASSES_LEVELMETER_H */ diff --git a/workbench/libs/muimaster/classes/list.c b/workbench/libs/muimaster/classes/list.c index 02ad122604..99f1538c9a 100644 --- a/workbench/libs/muimaster/classes/list.c +++ b/workbench/libs/muimaster/classes/list.c @@ -32,11 +32,13 @@ extern struct Library *MUIMasterBase; #define ENTRY_TITLE (-1) -#define FORMAT_TEMPLATE "DELTA=D/N,PREPARSE=P/K,WEIGHT=W/N,MINWIDTH=MIW/N,MAXWIDTH=MAW/N,COL=C/N,BAR/S" +#define FORMAT_TEMPLATE "DELTA=D/N,PREPARSE=P/K,WEIGHT=W/N,MINWIDTH=MIW/N," \ + "MAXWIDTH=MAW/N,COL=C/N,BAR/S" #define BAR_WIDTH 2 -enum { +enum +{ ARG_DELTA, ARG_PREPARSE, ARG_WEIGHT, @@ -60,16 +62,15 @@ struct ListEntry struct ColumnInfo { - int colno; /* Column number */ + int colno; /* Column number */ int user_width; /* user set width; -1 if entry width */ - int min_width; /* min width percentage */ - int max_width; /* min width percentage */ + int min_width; /* min width percentage */ + int max_width; /* min width percentage */ int weight; - int delta; /* ignored for the first and last column, defaults to 4 */ + int delta; /* ignored for the first and last column, defaults to 4 */ int bar; STRPTR preparse; - - int entries_width; /* width of the entries (the maximum of the widths of all entries) */ + int entries_width; /* width of the entries (maximum of all widths) */ }; struct MUI_ImageSpec_intern; @@ -77,12 +78,12 @@ struct MUI_ImageSpec_intern; struct MUI_ListData { /* bool attrs */ - ULONG flags; + ULONG flags; - APTR intern_pool; /* The internal pool which the class has allocated */ + APTR intern_pool; /* The internal pool which the class has allocated */ LONG intern_puddle_size; LONG intern_tresh_size; - APTR pool; /* the pool which is used to allocate list entries */ + APTR pool; /* the pool which is used to allocate list entries */ struct Hook *construct_hook; struct Hook *compare_hook; @@ -91,18 +92,20 @@ struct MUI_ListData struct Hook default_compare_hook; - /* List managment, currently we use a simple flat array, which is not good if many entries are inserted/deleted */ - LONG entries_num; /* Number of Entries in the list */ + /* List managment, currently we use a simple flat array, which is not + * good if many entries are inserted/deleted */ + LONG entries_num; /* Number of Entries in the list */ LONG entries_allocated; struct ListEntry **entries; - LONG entries_first; /* first visible entry */ - LONG entries_visible; /* number of visible entries, determined at MUIM_Layout */ + LONG entries_first; /* first visible entry */ + LONG entries_visible; /* number of visible entries, + * determined at MUIM_Layout */ LONG entries_active; - LONG insert_position; /* pos of the last insertion */ + LONG insert_position; /* pos of the last insertion */ - LONG entry_maxheight; /* Maximum height of an entry */ - ULONG entry_minheight; /* from MUIA_List_MinLineHeight */ + LONG entry_maxheight; /* Maximum height of an entry */ + ULONG entry_minheight; /* from MUIA_List_MinLineHeight */ LONG entries_totalheight; LONG entries_maxwidth; @@ -111,23 +114,27 @@ struct MUI_ListData LONG vertprop_visible; LONG vertprop_first; - LONG confirm_entries_num; /* These are the correct entries num, used so you cannot set MUIA_List_Entries to wrong values */ + LONG confirm_entries_num; /* These are the correct entries num, used + * so you cannot set MUIA_List_Entries to + * wrong values */ - LONG entries_top_pixel; /* Where the entries start */ + LONG entries_top_pixel; /* Where the entries start */ - /* Column managment, is allocated by ParseListFormat() and freed by CleanListFormat() */ + /* Column managment, is allocated by ParseListFormat() and freed + * by CleanListFormat() */ STRPTR format; - LONG columns; /* Number of columns the list has */ + LONG columns; /* Number of columns the list has */ struct ColumnInfo *ci; STRPTR *preparses; - STRPTR *strings; /* the strings for the display function, one more as needed (for the entry position) */ + STRPTR *strings; /* the strings for the display function, one + * more than needed (for the entry position) */ /* Titlestuff */ - int title_height; /* The complete height of the title */ - STRPTR title; /* On single comlums this is the title, otherwise 1 */ + int title_height; /* The complete height of the title */ + STRPTR title; /* On single comlums this is the title, otherwise 1 */ struct MUI_EventHandlerNode ehn; - int mouse_click; /* see below if mouse is hold down */ + int mouse_click; /* see below if mouse is hold down */ /* Cursor images */ struct MUI_ImageSpec_intern *list_cursor; @@ -135,7 +142,9 @@ struct MUI_ListData struct MUI_ImageSpec_intern *list_selcur; /* Render optimization */ - int update; /* 1 - update everything, 2 - redraw entry at update_pos, 3 - scroll to current entries_first (old value is is update_pos) */ + int update; /* 1 - update everything, 2 - redraw entry at update_pos, + * 3 - scroll to current entries_first (old value is in + * update_pos) */ int update_pos; /* double click */ @@ -148,17 +157,17 @@ struct MUI_ListData LONG click_column; /* list type */ - ULONG input; /* FALSE - readonly, otherwise TRUE */ + ULONG input; /* FALSE - readonly, otherwise TRUE */ /* list images */ struct MinList images; /* user prefs */ - ListviewMulti prefs_multi; + ListviewMulti prefs_multi; ListviewRefresh prefs_refresh; - UWORD prefs_linespacing; - BOOL prefs_smoothed; - UWORD prefs_smoothval; + UWORD prefs_linespacing; + BOOL prefs_smoothed; + UWORD prefs_smoothval; }; #define LIST_ADJUSTWIDTH (1<<0) @@ -169,8 +178,8 @@ struct MUI_ListData #define LIST_QUIET (1<<5) -#define MOUSE_CLICK_ENTRY 1 /* on entry clicked */ -#define MOUSE_CLICK_TITLE 2 /* on title clicked */ +#define MOUSE_CLICK_ENTRY 1 /* on entry clicked */ +#define MOUSE_CLICK_TITLE 2 /* on title clicked */ /************************************************************************** Allocate a single list entry, does not initialize it (except the pointer) @@ -179,16 +188,18 @@ static struct ListEntry *AllocListEntry(struct MUI_ListData *data) { ULONG *mem; struct ListEntry *le; - int size = sizeof(struct ListEntry) + sizeof(LONG)*data->columns + 4; /* sizeinfo */ + int size = sizeof(struct ListEntry) + sizeof(LONG) * data->columns + 4; + /* sizeinfo */ LONG j; mem = AllocPooled(data->pool, size); - if (!mem) return NULL; + if (!mem) + return NULL; D(bug("List AllocListEntry %p, %ld bytes\n", mem, size)); - mem[0] = size; /* Save the size */ - le = (struct ListEntry*)(mem+1); - le->widths = (LONG*)(le + 1); + mem[0] = size; /* Save the size */ + le = (struct ListEntry *)(mem + 1); + le->widths = (LONG *) (le + 1); /* Initialize fields */ le->height = 0; @@ -202,9 +213,10 @@ static struct ListEntry *AllocListEntry(struct MUI_ListData *data) /************************************************************************** Deallocate a single list entry, does not deinitialize it **************************************************************************/ -static void FreeListEntry(struct MUI_ListData *data, struct ListEntry *entry) +static void FreeListEntry(struct MUI_ListData *data, + struct ListEntry *entry) { - ULONG *mem = ((ULONG*)entry)-1; + ULONG *mem = ((ULONG *) entry) - 1; D(bug("FreeListEntry %p size=%ld\n", mem, mem[0])); FreePooled(data->pool, mem, mem[0]); } @@ -224,17 +236,18 @@ static int SetListSize(struct MUI_ListData *data, LONG size) new_entries_allocated = data->entries_allocated * 2 + 4; if (new_entries_allocated < size + 1) - new_entries_allocated = size + 1 + 10; /* 10 is just random */ + new_entries_allocated = size + 1 + 10; /* 10 is just random */ D(bug("List %p : SetListSize allocating %ld bytes\n", data, - new_entries_allocated * sizeof(struct ListEntry *))); - new_entries = AllocVec(new_entries_allocated * sizeof(struct ListEntry *),0); + new_entries_allocated * sizeof(struct ListEntry *))); + new_entries = + AllocVec(new_entries_allocated * sizeof(struct ListEntry *), 0); if (NULL == new_entries) return 0; if (data->entries) { CopyMem(data->entries - 1, new_entries, - (data->entries_num + 1) * sizeof(struct ListEntry*)); + (data->entries_num + 1) * sizeof(struct ListEntry *)); FreeVec(data->entries - 1); } data->entries = new_entries + 1; @@ -248,9 +261,11 @@ static int SetListSize(struct MUI_ListData *data, LONG size) SetListSize() must be used first. With current implementation, this call will never fail **************************************************************************/ -static int PrepareInsertListEntries(struct MUI_ListData *data, int pos, int count) +static int PrepareInsertListEntries(struct MUI_ListData *data, int pos, + int count) { - memmove(&data->entries[pos+count],&data->entries[pos],(data->entries_num - pos)*sizeof(struct ListEntry*)); + memmove(&data->entries[pos + count], &data->entries[pos], + (data->entries_num - pos) * sizeof(struct ListEntry *)); return 1; } @@ -260,10 +275,12 @@ static int PrepareInsertListEntries(struct MUI_ListData *data, int pos, int coun Returns 1 if something failed (never in current implementation) **************************************************************************/ #if 0 -static int InsertListEntries(struct MUI_ListData *data, int pos, struct ListEntry **array, int count) +static int InsertListEntries(struct MUI_ListData *data, int pos, + struct ListEntry **array, int count) { - memmove(&data->entries[pos+count],&data->entries[pos],data->entries_num - pos); - memcpy(&data->entries[pos],array,count); + memmove(&data->entries[pos + count], &data->entries[pos], + data->entries_num - pos); + memcpy(&data->entries[pos], array, count); return 1; } #endif @@ -275,8 +292,8 @@ static int InsertListEntries(struct MUI_ListData *data, int pos, struct ListEntr static void RemoveListEntries(struct MUI_ListData *data, int pos, int count) { // FIXME: segfault if entries_num = pos = count = 1 - memmove(&data->entries[pos], &data->entries[pos+count], - (data->entries_num - (pos + count)) * sizeof(struct ListEntry *)); + memmove(&data->entries[pos], &data->entries[pos + count], + (data->entries_num - (pos + count)) * sizeof(struct ListEntry *)); } /************************************************************************** @@ -285,7 +302,7 @@ static void RemoveListEntries(struct MUI_ListData *data, int pos, int count) static void FreeListFormat(struct MUI_ListData *data) { int i; - + if (data->ci) { for (i = 0; i < data->columns; i++) @@ -293,18 +310,18 @@ static void FreeListFormat(struct MUI_ListData *data) FreeVec(data->ci[i].preparse); data->ci[i].preparse = NULL; } - FreeVec(data->ci); - data->ci = NULL; + FreeVec(data->ci); + data->ci = NULL; } if (data->preparses) { - FreeVec(data->preparses); - data->preparses = NULL; + FreeVec(data->preparses); + data->preparses = NULL; } if (data->strings) { - FreeVec(data->strings-1); - data->strings = NULL; + FreeVec(data->strings - 1); + data->strings = NULL; } data->columns = 0; } @@ -315,7 +332,7 @@ static void FreeListFormat(struct MUI_ListData *data) **************************************************************************/ static int ParseListFormat(struct MUI_ListData *data, STRPTR format) { - int new_columns,i; + int new_columns, i; STRPTR ptr; STRPTR format_sep; char c; @@ -323,7 +340,8 @@ static int ParseListFormat(struct MUI_ListData *data, STRPTR format) IPTR args[ARG_CNT]; struct RDArgs *rdargs; - if (!format) format = (STRPTR) ""; + if (!format) + format = (STRPTR) ""; ptr = format; @@ -336,10 +354,14 @@ static int ParseListFormat(struct MUI_ListData *data, STRPTR format) if (c == ',') new_columns++; - if (!(data->preparses = AllocVec((new_columns + 10) * sizeof(STRPTR), 0))) + if (!(data->preparses = + AllocVec((new_columns + 10) * sizeof(STRPTR), 0))) return 0; - if (!(data->strings = AllocVec((new_columns + 1 + 10) * sizeof(STRPTR), 0))) /* hold enough space also for the entry pos, used by orginal MUI and also some security space */ + if (!(data->strings = AllocVec((new_columns + 1 + 10) + * sizeof(STRPTR), 0))) /* hold enough space also for the entry pos, + * used by orginal MUI and also some + * security space */ return 0; if (!(data->ci = AllocVec(new_columns * sizeof(struct ColumnInfo), 0))) @@ -348,19 +370,19 @@ static int ParseListFormat(struct MUI_ListData *data, STRPTR format) // set defaults for (i = 0; i < new_columns; i++) { - data->ci[i].colno = -1; // -1 means: use unassigned column - data->ci[i].weight = 100; - data->ci[i].delta = 4; - data->ci[i].min_width = -1; - data->ci[i].max_width = -1; + data->ci[i].colno = -1; // -1 means: use unassigned column + data->ci[i].weight = 100; + data->ci[i].delta = 4; + data->ci[i].min_width = -1; + data->ci[i].max_width = -1; data->ci[i].user_width = -1; - data->ci[i].bar = FALSE; - data->ci[i].preparse = NULL; + data->ci[i].bar = FALSE; + data->ci[i].preparse = NULL; } if ((format_sep = StrDup(format)) != 0) { - for (i = 0 ; format_sep[i] != '\0' ; i++) + for (i = 0; format_sep[i] != '\0'; i++) { if (format_sep[i] == ',') format_sep[i] = '\0'; @@ -375,34 +397,38 @@ static int ParseListFormat(struct MUI_ListData *data, STRPTR format) rdargs->RDA_Source.CS_Buffer = ptr; rdargs->RDA_Source.CS_Length = strlen(ptr); rdargs->RDA_Source.CS_CurChr = 0; - rdargs->RDA_DAList = 0; - rdargs->RDA_Buffer = NULL; - rdargs->RDA_BufSiz = 0; - rdargs->RDA_ExtHelp = NULL; - rdargs->RDA_Flags = 0; + rdargs->RDA_DAList = 0; + rdargs->RDA_Buffer = NULL; + rdargs->RDA_BufSiz = 0; + rdargs->RDA_ExtHelp = NULL; + rdargs->RDA_Flags = 0; memset(args, 0, sizeof args); if (ReadArgs(FORMAT_TEMPLATE, args, rdargs)) { if (args[ARG_COL]) - data->ci[i].colno = *(LONG *)args[ARG_COL]; + data->ci[i].colno = *(LONG *) args[ARG_COL]; if (args[ARG_WEIGHT]) - data->ci[i].weight = *(LONG *)args[ARG_WEIGHT]; + data->ci[i].weight = *(LONG *) args[ARG_WEIGHT]; if (args[ARG_DELTA]) - data->ci[i].delta = *(LONG *)args[ARG_DELTA]; + data->ci[i].delta = *(LONG *) args[ARG_DELTA]; if (args[ARG_MINWIDTH]) - data->ci[i].min_width = *(LONG *)args[ARG_MINWIDTH]; + data->ci[i].min_width = + *(LONG *) args[ARG_MINWIDTH]; if (args[ARG_MAXWIDTH]) - data->ci[i].max_width = *(LONG *)args[ARG_MAXWIDTH]; + data->ci[i].max_width = + *(LONG *) args[ARG_MAXWIDTH]; data->ci[i].bar = args[ARG_BAR]; if (args[ARG_PREPARSE]) - data->ci[i].preparse = StrDup((STRPTR)args[ARG_PREPARSE]); - + data->ci[i].preparse = + StrDup((STRPTR) args[ARG_PREPARSE]); + FreeArgs(rdargs); } ptr += strlen(ptr) + 1; i++; - } while(i < new_columns); + } + while (i < new_columns); FreeDosObject(DOS_RDARGS, rdargs); } FreeVec(format_sep); @@ -411,11 +437,12 @@ static int ParseListFormat(struct MUI_ListData *data, STRPTR format) for (i = 0; i < new_columns; i++) { D(bug("colno %d weight %d delta %d preparse %s\n", - data->ci[i].colno, data->ci[i].weight, data->ci[i].delta, data->ci[i].preparse)); + data->ci[i].colno, data->ci[i].weight, data->ci[i].delta, + data->ci[i].preparse)); } - + data->columns = new_columns; - data->strings++; /* Skip entry pos */ + data->strings++; /* Skip entry pos */ return 1; } @@ -435,19 +462,19 @@ static void DisplayEntry(struct IClass *cl, Object *obj, int entry_pos) if (entry_pos == ENTRY_TITLE) { - if ((data->columns == 1) && (data->title != (STRPTR)1)) - { + if ((data->columns == 1) && (data->title != (STRPTR) 1)) + { *data->strings = data->title; return; - } - entry_data = NULL; /* it's a title request */ + } + entry_data = NULL; /* it's a title request */ } else entry_data = data->entries[entry_pos]->data; /* Get the display formation */ - DoMethod(obj, MUIM_List_Display, (IPTR)entry_data, (IPTR)data->strings, - entry_pos, (IPTR)data->preparses); + DoMethod(obj, MUIM_List_Display, (IPTR) entry_data, + (IPTR) data->strings, entry_pos, (IPTR) data->preparses); } /************************************************************************** @@ -476,11 +503,13 @@ static int CalcDimsOfEntry(struct IClass *cl, Object *obj, int pos) for (j = 0; j < data->columns; j++) { - ZText *text = zune_text_new(data->preparses[j], data->strings[j], ZTEXT_ARG_NONE, 0); + ZText *text = + zune_text_new(data->preparses[j], data->strings[j], + ZTEXT_ARG_NONE, 0); if (text != NULL) { zune_text_get_bounds(text, obj); - + if (text->height > data->entries[pos]->height) { data->entries[pos]->height = text->height; @@ -508,7 +537,7 @@ static int CalcDimsOfEntry(struct IClass *cl, Object *obj, int pos) /* maximum entry height changed, redraw all entries later */ ret = 1; } - + return ret; } @@ -517,7 +546,7 @@ static int CalcDimsOfEntry(struct IClass *cl, Object *obj, int pos) **************************************************************************/ static void CalcWidths(struct IClass *cl, Object *obj) { - int i,j; + int i, j; struct MUI_ListData *data = INST_DATA(cl, obj); if (!(_flags(obj) & MADF_SETUP)) @@ -530,9 +559,9 @@ static void CalcWidths(struct IClass *cl, Object *obj) data->entries_totalheight = 0; data->entries_maxwidth = 0; - for (i= (data->title ? ENTRY_TITLE : 0) ; i < data->entries_num; i++) + for (i = (data->title ? ENTRY_TITLE : 0); i < data->entries_num; i++) { - CalcDimsOfEntry(cl,obj,i); + CalcDimsOfEntry(cl, obj, i); data->entries_totalheight += data->entries[i]->height; } @@ -554,27 +583,30 @@ static int CalcVertVisible(struct IClass *cl, Object *obj) int old_entries_top_pixel = data->entries_top_pixel; data->entries_visible = (_mheight(obj) - data->title_height) - / (data->entry_maxheight /* + data->prefs_linespacing */); + / (data->entry_maxheight /* + data->prefs_linespacing */ ); data->entries_top_pixel = _mtop(obj) + data->title_height + (_mheight(obj) - data->title_height - - data->entries_visible * (data->entry_maxheight /* + data->prefs_linespacing */)) / 2; + - + data->entries_visible * + (data->entry_maxheight /* + data->prefs_linespacing */ )) / 2; - return (old_entries_visible != data->entries_visible) || (old_entries_top_pixel != data->entries_top_pixel); + return (old_entries_visible != data->entries_visible) + || (old_entries_top_pixel != data->entries_top_pixel); } /************************************************************************** Default hook to compare two list entries. Works for strings only. **************************************************************************/ AROS_UFH3S(int, default_compare_func, -AROS_UFHA(struct Hook *, h, A0), -AROS_UFHA(char *, s2, A2), -AROS_UFHA(char *, s1, A1)) + AROS_UFHA(struct Hook *, h, A0), + AROS_UFHA(char *, s2, A2), + AROS_UFHA(char *, s1, A1)) { AROS_USERFUNC_INIT return Stricmp(s1, s2); - + AROS_USERFUNC_EXIT } @@ -583,17 +615,17 @@ AROS_UFHA(char *, s1, A1)) **************************************************************************/ IPTR List__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) { - struct MUI_ListData *data; - struct TagItem *tag; - struct TagItem *tags; + struct MUI_ListData *data; + struct TagItem *tag; + struct TagItem *tags; APTR *array = NULL; LONG new_entries_active = MUIV_List_Active_Off; - obj = (Object *)DoSuperNewTags(cl, obj, NULL, + obj = (Object *) DoSuperNewTags(cl, obj, NULL, MUIA_Font, MUIV_Font_List, - MUIA_Background, MUII_ListBack, - TAG_MORE, (IPTR)msg->ops_AttrList); - if (!obj) return FALSE; + MUIA_Background, MUII_ListBack, TAG_MORE, (IPTR) msg->ops_AttrList); + if (!obj) + return FALSE; data = INST_DATA(cl, obj); @@ -607,92 +639,94 @@ IPTR List__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) data->compare_hook = &(data->default_compare_hook); /* parse initial taglist */ - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) { switch (tag->ti_Tag) { - case MUIA_List_Active: - new_entries_active = tag->ti_Data; - break; + case MUIA_List_Active: + new_entries_active = tag->ti_Data; + break; - case MUIA_List_Pool: - data->pool = (APTR)tag->ti_Data; - break; + case MUIA_List_Pool: + data->pool = (APTR) tag->ti_Data; + break; - case MUIA_List_PoolPuddleSize: - data->intern_puddle_size = tag->ti_Data; - break; + case MUIA_List_PoolPuddleSize: + data->intern_puddle_size = tag->ti_Data; + break; - case MUIA_List_PoolThreshSize: - data->intern_tresh_size = tag->ti_Data; - break; + case MUIA_List_PoolThreshSize: + data->intern_tresh_size = tag->ti_Data; + break; - case MUIA_List_CompareHook: - /* Not tested, if List_CompareHook really works. */ - data->compare_hook = (struct Hook*)tag->ti_Data; - break; + case MUIA_List_CompareHook: + /* Not tested, if List_CompareHook really works. */ + data->compare_hook = (struct Hook *)tag->ti_Data; + break; - case MUIA_List_ConstructHook: - data->construct_hook = (struct Hook*)tag->ti_Data; - break; + case MUIA_List_ConstructHook: + data->construct_hook = (struct Hook *)tag->ti_Data; + break; - case MUIA_List_DestructHook: - data->destruct_hook = (struct Hook*)tag->ti_Data; - break; + case MUIA_List_DestructHook: + data->destruct_hook = (struct Hook *)tag->ti_Data; + break; - case MUIA_List_DisplayHook: - data->display_hook = (struct Hook*)tag->ti_Data; - break; + case MUIA_List_DisplayHook: + data->display_hook = (struct Hook *)tag->ti_Data; + break; - case MUIA_List_SourceArray: - array = (APTR*)tag->ti_Data; - break; + case MUIA_List_SourceArray: + array = (APTR *) tag->ti_Data; + break; - case MUIA_List_Format: - data->format = StrDup((STRPTR)tag->ti_Data); - break; + case MUIA_List_Format: + data->format = StrDup((STRPTR) tag->ti_Data); + break; - case MUIA_List_Title: - data->title = (STRPTR)tag->ti_Data; - break; + case MUIA_List_Title: + data->title = (STRPTR) tag->ti_Data; + break; - case MUIA_List_MinLineHeight: - data->entry_minheight = tag->ti_Data; - break; + case MUIA_List_MinLineHeight: + data->entry_minheight = tag->ti_Data; + break; - case MUIA_List_AdjustHeight: - _handle_bool_tag(data->flags, tag->ti_Data, LIST_ADJUSTHEIGHT); - break; + case MUIA_List_AdjustHeight: + _handle_bool_tag(data->flags, tag->ti_Data, LIST_ADJUSTHEIGHT); + break; - case MUIA_List_AdjustWidth: - _handle_bool_tag(data->flags, tag->ti_Data, LIST_ADJUSTWIDTH); - break; + case MUIA_List_AdjustWidth: + _handle_bool_tag(data->flags, tag->ti_Data, LIST_ADJUSTWIDTH); + break; - } + } } if (!data->pool) { - /* No memory pool given, so we create our own */ - data->pool = data->intern_pool = CreatePool(0,data->intern_puddle_size,data->intern_tresh_size); + /* No memory pool given, so we create our own */ + data->pool = data->intern_pool = + CreatePool(0, data->intern_puddle_size, + data->intern_tresh_size); if (!data->pool) { - CoerceMethod(cl,obj,OM_DISPOSE); + CoerceMethod(cl, obj, OM_DISPOSE); return 0; } } /* parse the list format */ - if (!(ParseListFormat(data,data->format))) + if (!(ParseListFormat(data, data->format))) { - CoerceMethod(cl,obj,OM_DISPOSE); + CoerceMethod(cl, obj, OM_DISPOSE); return 0; } /* This is neccessary for at least the title */ - if (!SetListSize(data,0)) + if (!SetListSize(data, 0)) { - CoerceMethod(cl,obj,OM_DISPOSE); + CoerceMethod(cl, obj, OM_DISPOSE); return 0; } @@ -700,20 +734,23 @@ IPTR List__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) { if (!(data->entries[ENTRY_TITLE] = AllocListEntry(data))) { - CoerceMethod(cl,obj,OM_DISPOSE); + CoerceMethod(cl, obj, OM_DISPOSE); return 0; } - } else data->entries[ENTRY_TITLE] = NULL; + } + else + data->entries[ENTRY_TITLE] = NULL; if (array) { - int i; + int i; /* Count the number of elements */ - for (i = 0; array[i] != NULL; i++) + for (i = 0; array[i] != NULL; i++) ; - /* Insert them */ - DoMethod(obj, MUIM_List_Insert, (IPTR)array, i, MUIV_List_Insert_Top); + /* Insert them */ + DoMethod(obj, MUIM_List_Insert, (IPTR) array, i, + MUIV_List_Insert_Top); } @@ -721,13 +758,13 @@ IPTR List__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) { switch (new_entries_active) { - case MUIV_List_Active_Top: - new_entries_active = 0; - break; + case MUIV_List_Active_Top: + new_entries_active = 0; + break; - case MUIV_List_Active_Bottom: - new_entries_active = data->entries_num - 1; - break; + case MUIV_List_Active_Bottom: + new_entries_active = data->entries_num - 1; + break; } if (new_entries_active < 0) @@ -740,20 +777,18 @@ IPTR List__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) } - data->ehn.ehn_Events = IDCMP_MOUSEBUTTONS | - IDCMP_RAWKEY | - IDCMP_ACTIVEWINDOW | - IDCMP_INACTIVEWINDOW; + data->ehn.ehn_Events = IDCMP_MOUSEBUTTONS | + IDCMP_RAWKEY | IDCMP_ACTIVEWINDOW | IDCMP_INACTIVEWINDOW; data->ehn.ehn_Priority = 0; - data->ehn.ehn_Flags = 0; - data->ehn.ehn_Object = obj; - data->ehn.ehn_Class = cl; + data->ehn.ehn_Flags = 0; + data->ehn.ehn_Object = obj; + data->ehn.ehn_Class = cl; NewList((struct List *)&data->images); D(bug("List_New(%lx)\n", obj)); - return (IPTR)obj; + return (IPTR) obj; } /************************************************************************** @@ -765,23 +800,27 @@ IPTR List__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) D(bug("List Dispose\n")); - /* Call destruct method for every entry and free the entries manual to avoid notification */ + /* Call destruct method for every entry and free the entries manually + * to avoid notification */ while (data->confirm_entries_num) { - struct ListEntry *lentry = data->entries[--data->confirm_entries_num]; - DoMethod(obj, MUIM_List_Destruct, (IPTR)lentry->data, (IPTR)data->pool); + struct ListEntry *lentry = + data->entries[--data->confirm_entries_num]; + DoMethod(obj, MUIM_List_Destruct, (IPTR) lentry->data, + (IPTR) data->pool); FreeListEntry(data, lentry); } if (data->intern_pool) DeletePool(data->intern_pool); if (data->entries) - FreeVec(data->entries - 1); /* title is currently before all other elements */ + FreeVec(data->entries - 1); + /* title is currently before all other elements */ FreeListFormat(data); FreeVec(data->format); - return DoSuperMethodA(cl,obj,msg); + return DoSuperMethodA(cl, obj, msg); } @@ -790,169 +829,184 @@ IPTR List__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) **************************************************************************/ IPTR List__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) { - struct MUI_ListData *data = INST_DATA(cl, obj); - struct TagItem *tag; - struct TagItem *tags; + struct MUI_ListData *data = INST_DATA(cl, obj); + struct TagItem *tag; + struct TagItem *tags; /* parse initial taglist */ - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) { switch (tag->ti_Tag) { - case MUIA_List_CompareHook: - data->compare_hook = (struct Hook*)tag->ti_Data; - break; - - case MUIA_List_ConstructHook: - data->construct_hook = (struct Hook*)tag->ti_Data; - break; - - case MUIA_List_DestructHook: - data->destruct_hook = (struct Hook*)tag->ti_Data; - break; + case MUIA_List_CompareHook: + data->compare_hook = (struct Hook *)tag->ti_Data; + break; - case MUIA_List_DisplayHook: - data->display_hook = (struct Hook*)tag->ti_Data; - break; + case MUIA_List_ConstructHook: + data->construct_hook = (struct Hook *)tag->ti_Data; + break; - case MUIA_List_VertProp_First: - data->vertprop_first = tag->ti_Data; - if (data->entries_first != tag->ti_Data) - { - set(obj,MUIA_List_First,tag->ti_Data); - } - break; + case MUIA_List_DestructHook: + data->destruct_hook = (struct Hook *)tag->ti_Data; + break; - case MUIA_List_Format: - data->format = StrDup((STRPTR)tag->ti_Data); - ParseListFormat(data,data->format); - // FIXME: should we check for errors? - DoMethod(obj, MUIM_List_Redraw, MUIV_List_Redraw_All); - break; + case MUIA_List_DisplayHook: + data->display_hook = (struct Hook *)tag->ti_Data; + break; - case MUIA_List_VertProp_Entries: - data->vertprop_entries = tag->ti_Data; - break; + case MUIA_List_VertProp_First: + data->vertprop_first = tag->ti_Data; + if (data->entries_first != tag->ti_Data) + { + set(obj, MUIA_List_First, tag->ti_Data); + } + break; - case MUIA_List_VertProp_Visible: - data->vertprop_visible = tag->ti_Data; - data->entries_visible = tag->ti_Data; - break; + case MUIA_List_Format: + data->format = StrDup((STRPTR) tag->ti_Data); + ParseListFormat(data, data->format); + // FIXME: should we check for errors? + DoMethod(obj, MUIM_List_Redraw, MUIV_List_Redraw_All); + break; - case MUIA_List_Active: - { - LONG new_entries_active = tag->ti_Data; + case MUIA_List_VertProp_Entries: + data->vertprop_entries = tag->ti_Data; + break; - if ((data->entries_num) && (new_entries_active != MUIV_List_Active_Off)) - { - switch (new_entries_active) - { - case MUIV_List_Active_Top: - new_entries_active = 0; - break; + case MUIA_List_VertProp_Visible: + data->vertprop_visible = tag->ti_Data; + data->entries_visible = tag->ti_Data; + break; - case MUIV_List_Active_Bottom: - new_entries_active = data->entries_num - 1; - break; + case MUIA_List_Active: + { + LONG new_entries_active = tag->ti_Data; - case MUIV_List_Active_Up: - new_entries_active = data->entries_active - 1; - break; + if ((data->entries_num) + && (new_entries_active != MUIV_List_Active_Off)) + { + switch (new_entries_active) + { + case MUIV_List_Active_Top: + new_entries_active = 0; + break; - case MUIV_List_Active_Down: - new_entries_active = data->entries_active + 1; - break; + case MUIV_List_Active_Bottom: + new_entries_active = data->entries_num - 1; + break; - case MUIV_List_Active_PageUp: - new_entries_active = data->entries_active - data->entries_visible; - break; + case MUIV_List_Active_Up: + new_entries_active = data->entries_active - 1; + break; - case MUIV_List_Active_PageDown: - new_entries_active = data->entries_active + data->entries_visible; - break; - } + case MUIV_List_Active_Down: + new_entries_active = data->entries_active + 1; + break; - if (new_entries_active < 0) new_entries_active = 0; - else if (new_entries_active >= data->entries_num) new_entries_active = data->entries_num - 1; - } else new_entries_active = -1; + case MUIV_List_Active_PageUp: + new_entries_active = + data->entries_active - data->entries_visible; + break; - if (data->entries_active != new_entries_active) - { - LONG old = data->entries_active; - data->entries_active = new_entries_active; - - data->update = 2; - data->update_pos = old; - MUI_Redraw(obj,MADF_DRAWUPDATE); - data->update = 2; - data->update_pos = data->entries_active; - MUI_Redraw(obj,MADF_DRAWUPDATE); - - /* Selectchange stuff */ - if (old != -1) - { - DoMethod(obj,MUIM_List_SelectChange,old,MUIV_List_Select_Off,0); - } + case MUIV_List_Active_PageDown: + new_entries_active = + data->entries_active + data->entries_visible; + break; + } - if (new_entries_active != -1) - { - DoMethod(obj,MUIM_List_SelectChange,new_entries_active,MUIV_List_Select_On,0); - DoMethod(obj,MUIM_List_SelectChange,new_entries_active,MUIV_List_Select_Active,0); - } else DoMethod(obj,MUIM_List_SelectChange,MUIV_List_Active_Off,MUIV_List_Select_Off,0); + if (new_entries_active < 0) + new_entries_active = 0; + else if (new_entries_active >= data->entries_num) + new_entries_active = data->entries_num - 1; + } + else + new_entries_active = -1; - set(obj,MUIA_Listview_SelectChange,TRUE); - - if (new_entries_active != -1) - { - DoMethod(obj, MUIM_List_Jump, MUIV_List_Jump_Active); - } - } + if (data->entries_active != new_entries_active) + { + LONG old = data->entries_active; + data->entries_active = new_entries_active; + + data->update = 2; + data->update_pos = old; + MUI_Redraw(obj, MADF_DRAWUPDATE); + data->update = 2; + data->update_pos = data->entries_active; + MUI_Redraw(obj, MADF_DRAWUPDATE); + + /* Selectchange stuff */ + if (old != -1) + { + DoMethod(obj, MUIM_List_SelectChange, old, + MUIV_List_Select_Off, 0); } - break; - case MUIA_List_First: - data->update_pos = data->entries_first; - data->update = 3; - data->entries_first = tag->ti_Data; - - MUI_Redraw(obj,MADF_DRAWUPDATE); - if (data->vertprop_first != tag->ti_Data) + if (new_entries_active != -1) { - set(obj,MUIA_List_VertProp_First,tag->ti_Data); + DoMethod(obj, MUIM_List_SelectChange, + new_entries_active, MUIV_List_Select_On, 0); + DoMethod(obj, MUIM_List_SelectChange, + new_entries_active, MUIV_List_Select_Active, 0); } - break; + else + DoMethod(obj, MUIM_List_SelectChange, + MUIV_List_Active_Off, MUIV_List_Select_Off, 0); - case MUIA_List_Visible: - if (data->vertprop_visible != tag->ti_Data) - set(obj,MUIA_List_VertProp_Visible, tag->ti_Data); - break; + set(obj, MUIA_Listview_SelectChange, TRUE); - case MUIA_List_Entries: - if (data->confirm_entries_num == tag->ti_Data) - { - data->entries_num = tag->ti_Data; - set(obj, MUIA_List_VertProp_Entries, data->entries_num); - } else + if (new_entries_active != -1) { - D(bug("Bug: confirm_entries != MUIA_List_Entries!\n")); + DoMethod(obj, MUIM_List_Jump, + MUIV_List_Jump_Active); } - break; - - case MUIA_List_Quiet: - _handle_bool_tag(data->flags, tag->ti_Data, LIST_QUIET); - if (!tag->ti_Data) - { - DoMethod(obj, MUIM_List_Redraw, MUIV_List_Redraw_All); } - break; + } + break; - case MUIA_Listview_ClickColumn: - data->click_column = tag->ti_Data; - break; + case MUIA_List_First: + data->update_pos = data->entries_first; + data->update = 3; + data->entries_first = tag->ti_Data; + + MUI_Redraw(obj, MADF_DRAWUPDATE); + if (data->vertprop_first != tag->ti_Data) + { + set(obj, MUIA_List_VertProp_First, tag->ti_Data); } + break; + + case MUIA_List_Visible: + if (data->vertprop_visible != tag->ti_Data) + set(obj, MUIA_List_VertProp_Visible, tag->ti_Data); + break; + + case MUIA_List_Entries: + if (data->confirm_entries_num == tag->ti_Data) + { + data->entries_num = tag->ti_Data; + set(obj, MUIA_List_VertProp_Entries, data->entries_num); + } + else + { + D(bug("Bug: confirm_entries != MUIA_List_Entries!\n")); + } + break; + + case MUIA_List_Quiet: + _handle_bool_tag(data->flags, tag->ti_Data, LIST_QUIET); + if (!tag->ti_Data) + { + DoMethod(obj, MUIM_List_Redraw, MUIV_List_Redraw_All); + } + break; + + case MUIA_Listview_ClickColumn: + data->click_column = tag->ti_Data; + break; + } } - return DoSuperMethodA(cl, obj, (Msg)msg); + return DoSuperMethodA(cl, obj, (Msg) msg); } /************************************************************************** @@ -966,22 +1020,47 @@ IPTR List__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) switch (msg->opg_AttrID) { - case MUIA_List_Entries: STORE = data->entries_num; return 1; - case MUIA_List_First: STORE = data->entries_first; return 1; - case MUIA_List_Active: STORE = data->entries_active; return 1; - case MUIA_List_InsertPosition: STORE = data->insert_position; return 1; - case MUIA_List_Title: STORE = (unsigned long)data->title; return 1; - case MUIA_List_VertProp_Entries: STORE = data->vertprop_entries; return 1; - case MUIA_List_VertProp_Visible: STORE = data->vertprop_visible; return 1; - case MUIA_List_VertProp_First: STORE = data->vertprop_first; return 1; - case MUIA_List_Format: STORE = (IPTR)data->format; return 1; + case MUIA_List_Entries: + STORE = data->entries_num; + return 1; + case MUIA_List_First: + STORE = data->entries_first; + return 1; + case MUIA_List_Active: + STORE = data->entries_active; + return 1; + case MUIA_List_InsertPosition: + STORE = data->insert_position; + return 1; + case MUIA_List_Title: + STORE = (unsigned long)data->title; + return 1; + case MUIA_List_VertProp_Entries: + STORE = data->vertprop_entries; + return 1; + case MUIA_List_VertProp_Visible: + STORE = data->vertprop_visible; + return 1; + case MUIA_List_VertProp_First: + STORE = data->vertprop_first; + return 1; + case MUIA_List_Format: + STORE = (IPTR) data->format; + return 1; - case MUIA_Listview_DoubleClick: STORE = 0; return 1; - case MUIA_Listview_ClickColumn: STORE = data->click_column; return 1; - case MUIA_Listview_List: STORE = (IPTR)obj; return 1; /* Validated with 3rd party application */ + case MUIA_Listview_DoubleClick: + STORE = 0; + return 1; + case MUIA_Listview_ClickColumn: + STORE = data->click_column; + return 1; + case MUIA_Listview_List: + STORE = (IPTR) obj; + return 1; /* Validated with 3rd party application */ } - if (DoSuperMethodA(cl, obj, (Msg) msg)) return 1; + if (DoSuperMethodA(cl, obj, (Msg) msg)) + return 1; return 0; #undef STORE } @@ -989,20 +1068,22 @@ IPTR List__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) /************************************************************************** MUIM_Setup **************************************************************************/ -IPTR List__MUIM_Setup(struct IClass *cl, Object *obj, struct MUIP_Setup *msg) +IPTR List__MUIM_Setup(struct IClass *cl, Object *obj, + struct MUIP_Setup *msg) { struct MUI_ListData *data = INST_DATA(cl, obj); if (!DoSuperMethodA(cl, obj, (Msg) msg)) return 0; - data->prefs_multi = muiGlobalInfo(obj)->mgi_Prefs->list_multi; - data->prefs_refresh = muiGlobalInfo(obj)->mgi_Prefs->list_refresh; - data->prefs_linespacing = muiGlobalInfo(obj)->mgi_Prefs->list_linespacing; - data->prefs_smoothed = muiGlobalInfo(obj)->mgi_Prefs->list_smoothed; - data->prefs_smoothval = muiGlobalInfo(obj)->mgi_Prefs->list_smoothval; + data->prefs_multi = muiGlobalInfo(obj)->mgi_Prefs->list_multi; + data->prefs_refresh = muiGlobalInfo(obj)->mgi_Prefs->list_refresh; + data->prefs_linespacing = + muiGlobalInfo(obj)->mgi_Prefs->list_linespacing; + data->prefs_smoothed = muiGlobalInfo(obj)->mgi_Prefs->list_smoothed; + data->prefs_smoothval = muiGlobalInfo(obj)->mgi_Prefs->list_smoothval; - CalcWidths(cl,obj); + CalcWidths(cl, obj); if (data->title) { @@ -1013,11 +1094,14 @@ IPTR List__MUIM_Setup(struct IClass *cl, Object *obj, struct MUIP_Setup *msg) data->title_height = 0; } - DoMethod(_win(obj),MUIM_Window_AddEventHandler, (IPTR)&data->ehn); + DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR) & data->ehn); - data->list_cursor = zune_imspec_setup(MUII_ListCursor, muiRenderInfo(obj)); - data->list_select = zune_imspec_setup(MUII_ListSelect, muiRenderInfo(obj)); - data->list_selcur = zune_imspec_setup(MUII_ListSelCur, muiRenderInfo(obj)); + data->list_cursor = + zune_imspec_setup(MUII_ListCursor, muiRenderInfo(obj)); + data->list_select = + zune_imspec_setup(MUII_ListSelect, muiRenderInfo(obj)); + data->list_selcur = + zune_imspec_setup(MUII_ListSelCur, muiRenderInfo(obj)); return 1; } @@ -1025,7 +1109,8 @@ IPTR List__MUIM_Setup(struct IClass *cl, Object *obj, struct MUIP_Setup *msg) /************************************************************************** MUIM_Cleanup **************************************************************************/ -IPTR List__MUIM_Cleanup(struct IClass *cl, Object *obj, struct MUIP_Cleanup *msg) +IPTR List__MUIM_Cleanup(struct IClass *cl, Object *obj, + struct MUIP_Cleanup *msg) { struct MUI_ListData *data = INST_DATA(cl, obj); struct ListImage *li = List_First(&data->images); @@ -1033,7 +1118,7 @@ IPTR List__MUIM_Cleanup(struct IClass *cl, Object *obj, struct MUIP_Cleanup *msg while (li) { struct ListImage *next = Node_Next(li); - DoMethod(obj, MUIM_List_DeleteImage, (IPTR)li); + DoMethod(obj, MUIM_List_DeleteImage, (IPTR) li); li = next; } @@ -1041,21 +1126,22 @@ IPTR List__MUIM_Cleanup(struct IClass *cl, Object *obj, struct MUIP_Cleanup *msg zune_imspec_cleanup(data->list_select); zune_imspec_cleanup(data->list_selcur); - DoMethod(_win(obj),MUIM_Window_RemEventHandler, (IPTR)&data->ehn); + DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR) & data->ehn); data->ehn.ehn_Events &= ~(IDCMP_MOUSEMOVE | IDCMP_INTUITICKS); data->mouse_click = 0; - + return DoSuperMethodA(cl, obj, (Msg) msg); } /************************************************************************** MUIM_AskMinMax **************************************************************************/ -IPTR List__MUIM_AskMinMax(struct IClass *cl, Object *obj,struct MUIP_AskMinMax *msg) +IPTR List__MUIM_AskMinMax(struct IClass *cl, Object *obj, + struct MUIP_AskMinMax *msg) { struct MUI_ListData *data = INST_DATA(cl, obj); - DoSuperMethodA(cl, obj, (Msg)msg); + DoSuperMethodA(cl, obj, (Msg) msg); if ((data->flags & LIST_ADJUSTWIDTH) && (data->entries_num > 0)) @@ -1091,50 +1177,49 @@ IPTR List__MUIM_AskMinMax(struct IClass *cl, Object *obj,struct MUIP_AskMinMax * { msg->MinMaxInfo->MinHeight += 36; msg->MinMaxInfo->DefHeight += 96; - msg->MinMaxInfo->MaxHeight = MUI_MAXMAX; + msg->MinMaxInfo->MaxHeight = MUI_MAXMAX; } D(bug("List %p minheigh=%d, line maxh=%d\n", - obj, msg->MinMaxInfo->MinHeight, data->entry_maxheight)); + obj, msg->MinMaxInfo->MinHeight, data->entry_maxheight)); return TRUE; } /************************************************************************** MUIM_Layout **************************************************************************/ -IPTR List__MUIM_Layout(struct IClass *cl, Object *obj,struct MUIP_Layout *msg) +IPTR List__MUIM_Layout(struct IClass *cl, Object *obj, + struct MUIP_Layout *msg) { struct MUI_ListData *data = INST_DATA(cl, obj); - ULONG rc = DoSuperMethodA(cl,obj,(Msg)msg); + ULONG rc = DoSuperMethodA(cl, obj, (Msg) msg); LONG new_entries_first = data->entries_first; /* Calc the numbers of entries visible */ - CalcVertVisible(cl,obj); + CalcVertVisible(cl, obj); -#if 0 /* Don't do this! */ +#if 0 /* Don't do this! */ if (data->entries_active < new_entries_first) new_entries_first = data->entries_active; #endif - if (data->entries_active + 1 >= + if (data->entries_active + 1 >= (data->entries_first + data->entries_visible)) new_entries_first = data->entries_active - data->entries_visible + 1; if ((new_entries_first + data->entries_visible >= - data->entries_num) - && - (data->entries_visible <= data->entries_num)) - new_entries_first = - data->entries_num - data->entries_visible; + data->entries_num) + && (data->entries_visible <= data->entries_num)) + new_entries_first = data->entries_num - data->entries_visible; if (data->entries_num <= data->entries_visible) new_entries_first = 0; - if (new_entries_first < 0) new_entries_first = 0; + if (new_entries_first < 0) + new_entries_first = 0; set(obj, new_entries_first != data->entries_first ? - MUIA_List_First : TAG_IGNORE, - new_entries_first); + MUIA_List_First : TAG_IGNORE, new_entries_first); /* So the notify takes happens */ set(obj, MUIA_List_VertProp_Visible, data->entries_visible); @@ -1146,10 +1231,11 @@ IPTR List__MUIM_Layout(struct IClass *cl, Object *obj,struct MUIP_Layout *msg) /************************************************************************** MUIM_Show **************************************************************************/ -IPTR List__MUIM_Show(struct IClass *cl, Object *obj, struct MUIP_Show *msg) +IPTR List__MUIM_Show(struct IClass *cl, Object *obj, + struct MUIP_Show *msg) { struct MUI_ListData *data = INST_DATA(cl, obj); - ULONG rc = DoSuperMethodA(cl, obj, (Msg)msg); + ULONG rc = DoSuperMethodA(cl, obj, (Msg) msg); zune_imspec_show(data->list_cursor, obj); zune_imspec_show(data->list_select, obj); @@ -1161,16 +1247,19 @@ IPTR List__MUIM_Show(struct IClass *cl, Object *obj, struct MUIP_Show *msg) /************************************************************************** MUIM_Hide **************************************************************************/ -IPTR List__MUIM_Hide(struct IClass *cl, Object *obj, struct MUIP_Hide *msg) +IPTR List__MUIM_Hide(struct IClass *cl, Object *obj, + struct MUIP_Hide *msg) { struct MUI_ListData *data = INST_DATA(cl, obj); #if 0 if (data->ehn.ehn_Events & (IDCMP_MOUSEMOVE | IDCMP_INTUITICKS)) { - DoMethod(_win(obj),MUIM_Window_RemEventHandler, (IPTR)&data->ehn); + DoMethod(_win(obj), MUIM_Window_RemEventHandler, + (IPTR) & data->ehn); data->ehn.ehn_Events &= ~(IDCMP_MOUSEMOVE | IDCMP_INTUITICKS); - DoMethod(_win(obj),MUIM_Window_AddEventHandler, (IPTR)&data->ehn); + DoMethod(_win(obj), MUIM_Window_AddEventHandler, + (IPTR) & data->ehn); } data->mouse_click = 0; #endif @@ -1179,7 +1268,7 @@ IPTR List__MUIM_Hide(struct IClass *cl, Object *obj, struct MUIP_Hide *msg) zune_imspec_hide(data->list_select); zune_imspec_hide(data->list_selcur); - return DoSuperMethodA(cl, obj, (Msg)msg); + return DoSuperMethodA(cl, obj, (Msg) msg); } @@ -1187,15 +1276,17 @@ IPTR List__MUIM_Hide(struct IClass *cl, Object *obj, struct MUIP_Hide *msg) Draw an entry at entry_pos at the given y location. To draw the title, set pos to ENTRY_TITLE **************************************************************************/ -static VOID List_DrawEntry(struct IClass *cl, Object *obj, int entry_pos, int y) +static VOID List_DrawEntry(struct IClass *cl, Object *obj, int entry_pos, + int y) { struct MUI_ListData *data = INST_DATA(cl, obj); - int col,x1,x2; + int col, x1, x2; /* To be surem we don't draw anything if there is no title */ - if (entry_pos == ENTRY_TITLE && !data->title) return; + if (entry_pos == ENTRY_TITLE && !data->title) + return; - DisplayEntry(cl,obj,entry_pos); + DisplayEntry(cl, obj, entry_pos); x1 = _mleft(obj); for (col = 0; col < data->columns; col++) @@ -1203,13 +1294,15 @@ static VOID List_DrawEntry(struct IClass *cl, Object *obj, int entry_pos, int y) ZText *text; x2 = x1 + data->ci[col].entries_width; - if ((text = zune_text_new(data->preparses[col], data->strings[col], ZTEXT_ARG_NONE, 0))) + if ((text = + zune_text_new(data->preparses[col], data->strings[col], + ZTEXT_ARG_NONE, 0))) { /* Could be made simpler, as we don't really need the bounds */ zune_text_get_bounds(text, obj); /* Note, this was MPEN_SHADOW before */ SetAPen(_rp(obj), muiRenderInfo(obj)->mri_Pens[MPEN_TEXT]); - zune_text_draw(text, obj, x1, x2, y); /* totally wrong! */ + zune_text_draw(text, obj, x1, x2, y); /* totally wrong! */ zune_text_destroy(text); } x1 = x2 + data->ci[col].delta + (data->ci[col].bar ? BAR_WIDTH : 0); @@ -1222,47 +1315,47 @@ static VOID List_DrawEntry(struct IClass *cl, Object *obj, int entry_pos, int y) IPTR List__MUIM_Draw(struct IClass *cl, Object *obj, struct MUIP_Draw *msg) { struct MUI_ListData *data = INST_DATA(cl, obj); - int entry_pos,y; + int entry_pos, y; APTR clip; int start, end; BOOL scroll_caused_damage = FALSE; - + DoSuperMethodA(cl, obj, (Msg) msg); if (msg->flags & MADF_DRAWUPDATE) { - if (data->update == 1) + if (data->update == 1) DoMethod(obj, MUIM_DrawBackground, _mleft(obj), _mtop(obj), - _mwidth(obj), _mheight(obj), - 0, data->entries_first * data->entry_maxheight, 0); + _mwidth(obj), _mheight(obj), + 0, data->entries_first * data->entry_maxheight, 0); } else { DoMethod(obj, MUIM_DrawBackground, _mleft(obj), _mtop(obj), - _mwidth(obj), _mheight(obj), - 0, data->entries_first * data->entry_maxheight, 0); + _mwidth(obj), _mheight(obj), + 0, data->entries_first * data->entry_maxheight, 0); } clip = MUI_AddClipping(muiRenderInfo(obj), _mleft(obj), _mtop(obj), - _mwidth(obj), _mheight(obj)); + _mwidth(obj), _mheight(obj)); if (!(msg->flags & MADF_DRAWUPDATE) || ((msg->flags & MADF_DRAWUPDATE) && data->update == 1)) { y = _mtop(obj); /* Draw Title - */ + */ if (data->title_height && data->title) { - List_DrawEntry(cl,obj,ENTRY_TITLE,y); + List_DrawEntry(cl, obj, ENTRY_TITLE, y); y += data->entries[ENTRY_TITLE]->height; - SetAPen(_rp(obj),_pens(obj)[MPEN_SHADOW]); - Move(_rp(obj),_mleft(obj), y); - Draw(_rp(obj),_mright(obj), y); - SetAPen(_rp(obj),_pens(obj)[MPEN_SHINE]); + SetAPen(_rp(obj), _pens(obj)[MPEN_SHADOW]); + Move(_rp(obj), _mleft(obj), y); + Draw(_rp(obj), _mright(obj), y); + SetAPen(_rp(obj), _pens(obj)[MPEN_SHINE]); y++; - Move(_rp(obj),_mleft(obj), y); - Draw(_rp(obj),_mright(obj), y); + Move(_rp(obj), _mleft(obj), y); + Draw(_rp(obj), _mright(obj), y); } } @@ -1274,138 +1367,153 @@ IPTR List__MUIM_Draw(struct IClass *cl, Object *obj, struct MUIP_Draw *msg) if ((msg->flags & MADF_DRAWUPDATE) && data->update == 3) { int diffy = data->entries_first - data->update_pos; - int top,bottom; + int top, bottom; if (abs(diffy) < data->entries_visible) { - scroll_caused_damage = (_rp(obj)->Layer->Flags & LAYERREFRESH) ? FALSE : TRUE; - + scroll_caused_damage = + (_rp(obj)->Layer->Flags & LAYERREFRESH) ? FALSE : TRUE; + ScrollRaster(_rp(obj), 0, diffy * data->entry_maxheight, - _mleft(obj), y, - _mright(obj), y + data->entry_maxheight * data->entries_visible); + _mleft(obj), y, + _mright(obj), + y + data->entry_maxheight * data->entries_visible); + + scroll_caused_damage = + scroll_caused_damage + && (_rp(obj)->Layer->Flags & LAYERREFRESH); - scroll_caused_damage = - scroll_caused_damage && (_rp(obj)->Layer->Flags & LAYERREFRESH); - if (diffy > 0) { - start = end - diffy; - y += data->entry_maxheight * (data->entries_visible - diffy); + start = end - diffy; + y += data->entry_maxheight * (data->entries_visible - + diffy); } - else end = start - diffy; + else + end = start - diffy; } top = y; bottom = y + (end - start) * data->entry_maxheight; DoMethod(obj, MUIM_DrawBackground, _mleft(obj), top, - _mwidth(obj), bottom - top + 1, - 0, top - _mtop(obj) + data->entries_first * data->entry_maxheight, 0); - } /* if ((msg->flags & MADF_DRAWUPDATE) && data->update == 3) */ + _mwidth(obj), bottom - top + 1, + 0, + top - _mtop(obj) + data->entries_first * data->entry_maxheight, + 0); + } - for (entry_pos = start; entry_pos < end && entry_pos < data->entries_num; entry_pos++) + for (entry_pos = start; + entry_pos < end && entry_pos < data->entries_num; entry_pos++) { //struct ListEntry *entry = data->entries[entry_pos]; if (!(msg->flags & MADF_DRAWUPDATE) || ((msg->flags & MADF_DRAWUPDATE) && data->update == 1) || ((msg->flags & MADF_DRAWUPDATE) && data->update == 3) || - ((msg->flags & MADF_DRAWUPDATE) && data->update == 2 && data->update_pos == entry_pos)) + ((msg->flags & MADF_DRAWUPDATE) && data->update == 2 + && data->update_pos == entry_pos)) { if (entry_pos == data->entries_active) { - zune_imspec_draw(data->list_cursor, muiRenderInfo(obj), - _mleft(obj),y,_mwidth(obj), data->entry_maxheight, - 0, y - data->entries_top_pixel,0); - } else + zune_imspec_draw(data->list_cursor, muiRenderInfo(obj), + _mleft(obj), y, _mwidth(obj), data->entry_maxheight, + 0, y - data->entries_top_pixel, 0); + } + else { - if ((msg->flags & MADF_DRAWUPDATE) && data->update == 2 && data->update_pos == entry_pos) + if ((msg->flags & MADF_DRAWUPDATE) && data->update == 2 + && data->update_pos == entry_pos) { - DoMethod(obj,MUIM_DrawBackground,_mleft(obj),y,_mwidth(obj), data->entry_maxheight, - 0,y - _mtop(obj) + data->entries_first * data->entry_maxheight,0); + DoMethod(obj, MUIM_DrawBackground, _mleft(obj), y, + _mwidth(obj), data->entry_maxheight, 0, + y - _mtop(obj) + + data->entries_first * data->entry_maxheight, 0); } } - List_DrawEntry(cl,obj,entry_pos,y); + List_DrawEntry(cl, obj, entry_pos, y); } - y += data->entry_maxheight; - } /* for */ + y += data->entry_maxheight; + } /* for */ - MUI_RemoveClipping(muiRenderInfo(obj),clip); + MUI_RemoveClipping(muiRenderInfo(obj), clip); data->update = 0; if (scroll_caused_damage) { - if (MUI_BeginRefresh(muiRenderInfo(obj), 0)) + if (MUI_BeginRefresh(muiRenderInfo(obj), 0)) { /* Theoretically it might happen that more damage is caused after ScrollRaster. By something else, like window movement in front of our window. Therefore refresh root object of window, not just this object */ - + Object *o = NULL; - - get(_win(obj),MUIA_Window_RootObject, &o); + + get(_win(obj), MUIA_Window_RootObject, &o); MUI_Redraw(o, MADF_DRAWOBJECT); - + MUI_EndRefresh(muiRenderInfo(obj), 0); } } - + ULONG x1 = _mleft(obj); ULONG col; y = _mtop(obj); - + if (data->title_height && data->title) { for (col = 0; col < data->columns; col++) { - ULONG halfdelta = data->ci[col].delta / 2; + ULONG halfdelta = data->ci[col].delta / 2; x1 += data->ci[col].entries_width + halfdelta; - if(x1 + (data->ci[col].bar ? BAR_WIDTH : 0) > _mright(obj)) + if (x1 + (data->ci[col].bar ? BAR_WIDTH : 0) > _mright(obj)) break; - if(data->ci[col].bar) - { - SetAPen(_rp(obj),_pens(obj)[MPEN_SHINE]); - Move(_rp(obj),x1, y); - Draw(_rp(obj),x1, y + data->entries[ENTRY_TITLE]->height - 1); - SetAPen(_rp(obj),_pens(obj)[MPEN_SHADOW]); - Move(_rp(obj),x1 + 1, y); - Draw(_rp(obj),x1 + 1, y + data->entries[ENTRY_TITLE]->height - 1); - + if (data->ci[col].bar) + { + SetAPen(_rp(obj), _pens(obj)[MPEN_SHINE]); + Move(_rp(obj), x1, y); + Draw(_rp(obj), x1, + y + data->entries[ENTRY_TITLE]->height - 1); + SetAPen(_rp(obj), _pens(obj)[MPEN_SHADOW]); + Move(_rp(obj), x1 + 1, y); + Draw(_rp(obj), x1 + 1, + y + data->entries[ENTRY_TITLE]->height - 1); + x1 += BAR_WIDTH; - } - x1 += data->ci[col].delta - halfdelta; + } + x1 += data->ci[col].delta - halfdelta; } y += data->entries[ENTRY_TITLE]->height + 1; } - + x1 = _mleft(obj); - + for (col = 0; col < data->columns; col++) { ULONG halfdelta = data->ci[col].delta / 2; x1 += data->ci[col].entries_width + halfdelta; - - if(x1 + (data->ci[col].bar ? BAR_WIDTH : 0) > _mright(obj)) + + if (x1 + (data->ci[col].bar ? BAR_WIDTH : 0) > _mright(obj)) break; - - if(data->ci[col].bar) + + if (data->ci[col].bar) { - SetAPen(_rp(obj),_pens(obj)[MPEN_SHINE]); - Move(_rp(obj),x1, y); - Draw(_rp(obj),x1, _mbottom(obj)); - SetAPen(_rp(obj),_pens(obj)[MPEN_SHADOW]); - Move(_rp(obj),x1 + 1, y); - Draw(_rp(obj),x1 + 1, _mbottom(obj)); - + SetAPen(_rp(obj), _pens(obj)[MPEN_SHINE]); + Move(_rp(obj), x1, y); + Draw(_rp(obj), x1, _mbottom(obj)); + SetAPen(_rp(obj), _pens(obj)[MPEN_SHADOW]); + Move(_rp(obj), x1 + 1, y); + Draw(_rp(obj), x1 + 1, _mbottom(obj)); + x1 += BAR_WIDTH; } - + x1 += data->ci[col].delta - halfdelta; } - + return 0; } @@ -1414,186 +1522,223 @@ IPTR List__MUIM_Draw(struct IClass *cl, Object *obj, struct MUIP_Draw *msg) Relx and Rely are relative mouse coordinates to the upper left of the object **************************************************************************/ -static VOID List_MakeActive(struct IClass *cl, Object *obj, LONG relx, LONG rely) +static VOID List_MakeActive(struct IClass *cl, Object *obj, LONG relx, + LONG rely) { struct MUI_ListData *data = INST_DATA(cl, obj); if (data->entries_num == 0) return; - LONG eclicky = rely + _top(obj) - data->entries_top_pixel; /* y coordinates transfromed to the entries */ + LONG eclicky = rely + _top(obj) - data->entries_top_pixel; + /* y coordinates transformed to the entries */ LONG new_act = eclicky / data->entry_maxheight + data->entries_first; LONG old_act = data->entries_active; if (eclicky < 0) { - new_act = data->entries_first - 1; + new_act = data->entries_first - 1; } else if (new_act > data->entries_first + data->entries_visible) { - new_act = data->entries_first + data->entries_visible; + new_act = data->entries_first + data->entries_visible; } - - if (new_act >= data->entries_num) new_act = data->entries_num - 1; - else if (new_act < 0) new_act = 0; + + if (new_act >= data->entries_num) + new_act = data->entries_num - 1; + else if (new_act < 0) + new_act = 0; /* Notify only when active entry has changed */ if (old_act != new_act) set(obj, MUIA_List_Active, new_act); } -static void DoWheelMove(struct IClass *cl, Object *obj, LONG wheely, UWORD qual) +static void DoWheelMove(struct IClass *cl, Object *obj, LONG wheely, + UWORD qual) { struct MUI_ListData *data = INST_DATA(cl, obj); LONG new = data->entries_first; - + if (qual & IEQUALIFIER_CONTROL) { - if (wheely < 0) new = 0; - if (wheely > 0) new = data->entries_num; + if (wheely < 0) + new = 0; + if (wheely > 0) + new = data->entries_num; } else if (qual & (IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT)) { - new += (wheely * data->entries_visible); + new += (wheely * data->entries_visible); } else { - new += wheely * 3; + new += wheely * 3; } - + if (new > data->entries_num - data->entries_visible) { - new = data->entries_num - data->entries_visible; + new = data->entries_num - data->entries_visible; } - + if (new < 0) { - new = 0; + new = 0; } - + if (new != data->entries_first) { - set(obj, MUIA_List_First, new); + set(obj, MUIA_List_First, new); } - + } /************************************************************************** MUIM_HandleEvent **************************************************************************/ -IPTR List__MUIM_HandleEvent(struct IClass *cl, Object *obj, struct MUIP_HandleEvent *msg) +IPTR List__MUIM_HandleEvent(struct IClass *cl, Object *obj, + struct MUIP_HandleEvent *msg) { struct MUI_ListData *data = INST_DATA(cl, obj); if (msg->imsg) { - LONG mx = msg->imsg->MouseX - _left(obj); - LONG my = msg->imsg->MouseY - _top(obj); + LONG mx = msg->imsg->MouseX - _left(obj); + LONG my = msg->imsg->MouseY - _top(obj); switch (msg->imsg->Class) { - case IDCMP_MOUSEBUTTONS: - if (msg->imsg->Code == SELECTDOWN) + case IDCMP_MOUSEBUTTONS: + if (msg->imsg->Code == SELECTDOWN) + { + if (mx >= 0 && mx < _width(obj) && my >= 0 + && my < _height(obj)) + { + LONG eclicky = my + _top(obj) - data->entries_top_pixel; + /* y coordinates transformed to the entries */ + data->mouse_click = MOUSE_CLICK_ENTRY; + + /* Now check if it was clicked on a title or on entries */ + if (eclicky >= 0 + && eclicky < + data->entries_visible * data->entry_maxheight) { - if (mx >= 0 && mx < _width(obj) && my >= 0 && my < _height(obj)) + List_MakeActive(cl, obj, mx, my); + /* sets data->entries_active */ + + if (data->last_active == data->entries_active + && DoubleClick(data->last_secs, data->last_mics, + msg->imsg->Seconds, msg->imsg->Micros)) { - LONG eclicky = my + _top(obj) - data->entries_top_pixel; /* y coordinates transfromed to the entries */ - data->mouse_click = MOUSE_CLICK_ENTRY; - /* Now check if it was clicked on a title or on the entries */ - if (eclicky >= 0 && eclicky < data->entries_visible * data->entry_maxheight) + /* Handle MUIA_ListView_ClickColumn */ + data->click_column = 0; + if (data->entries_num > 0 && data->columns > 0) { - List_MakeActive(cl, obj, mx, my); /* sets data->entries_active */ - - if (data->last_active == data->entries_active - && DoubleClick(data->last_secs, data->last_mics, msg->imsg->Seconds, msg->imsg->Micros)) + LONG width_sum = 0; + LONG col; + for (col = 0; col < data->columns; col++) { - /* Handle MUIA_ListView_ClickColumn */ - data->click_column = 0; - if (data->entries_num > 0 && data->columns > 0) + width_sum += + data->ci[col].entries_width + + data->ci[col].delta + + (data->ci[col].bar ? BAR_WIDTH : 0); + D(bug + ("[List/MUIM_HandleEvent] col %d " + "width %d width_sum %d mx %d\n", + col, + data->ci[col].entries_width, + width_sum, mx)); + if (mx < width_sum) { - LONG width_sum = 0; - LONG col; - for (col = 0; col < data->columns; col++) - { - width_sum += data->ci[col].entries_width + data->ci[col].delta + (data->ci[col].bar ? BAR_WIDTH : 0); - D(bug("[List/MUIM_HandleEvent] col %d width %d width_sum %d mx %d\n", - col, data->ci[col].entries_width, width_sum, mx)); - if (mx < width_sum) - { - D(bug("[List/MUIM_HandleEvent] Column hit %d\n", col)); - set(obj, MUIA_Listview_ClickColumn, col); - break; - } - } + D(bug + ("[List/MUIM_HandleEvent] " + "Column hit %d\n", + col)); + set(obj, MUIA_Listview_ClickColumn, + col); + break; } - - set(obj, MUIA_Listview_DoubleClick, TRUE); - data->last_active = -1; - data->last_secs = data->last_mics = 0; - } else - { - data->last_active = data->entries_active; - data->last_secs = msg->imsg->Seconds; - data->last_mics = msg->imsg->Micros; } } - DoMethod(_win(obj),MUIM_Window_RemEventHandler, (IPTR)&data->ehn); - data->ehn.ehn_Events |= (IDCMP_MOUSEMOVE | IDCMP_INTUITICKS); - DoMethod(_win(obj),MUIM_Window_AddEventHandler, (IPTR)&data->ehn); - - return MUI_EventHandlerRC_Eat; + set(obj, MUIA_Listview_DoubleClick, TRUE); + data->last_active = -1; + data->last_secs = data->last_mics = 0; } - } else - { - if (msg->imsg->Code == SELECTUP && data->mouse_click) + else { - DoMethod(_win(obj),MUIM_Window_RemEventHandler, (IPTR)&data->ehn); - data->ehn.ehn_Events &= ~(IDCMP_MOUSEMOVE | IDCMP_INTUITICKS); - DoMethod(_win(obj),MUIM_Window_AddEventHandler, (IPTR)&data->ehn); - data->mouse_click = 0; - return 0; + data->last_active = data->entries_active; + data->last_secs = msg->imsg->Seconds; + data->last_mics = msg->imsg->Micros; } } - break; - case IDCMP_INTUITICKS: - case IDCMP_MOUSEMOVE: - if (data->mouse_click) - { - List_MakeActive(cl, obj, mx, my); - } - break; - - case IDCMP_RAWKEY: - switch(msg->imsg->Code) - { - case RAWKEY_NM_WHEEL_UP: - if (_isinobject(msg->imsg->MouseX, msg->imsg->MouseY)) - { - DoWheelMove(cl, obj, -1, msg->imsg->Qualifier); - } - break; - - case RAWKEY_NM_WHEEL_DOWN: - if (_isinobject(msg->imsg->MouseX, msg->imsg->MouseY)) - { - DoWheelMove(cl, obj, 1, msg->imsg->Qualifier); - } - break; - - } - break; - - case IDCMP_ACTIVEWINDOW: - case IDCMP_INACTIVEWINDOW: - if (data->ehn.ehn_Events & (IDCMP_MOUSEMOVE | IDCMP_INTUITICKS)) - { - DoMethod(_win(obj),MUIM_Window_RemEventHandler, (IPTR)&data->ehn); - data->ehn.ehn_Events &= ~(IDCMP_MOUSEMOVE | IDCMP_INTUITICKS); - DoMethod(_win(obj),MUIM_Window_AddEventHandler, (IPTR)&data->ehn); - data->mouse_click = 0; - } - break; + DoMethod(_win(obj), MUIM_Window_RemEventHandler, + (IPTR) & data->ehn); + data->ehn.ehn_Events |= + (IDCMP_MOUSEMOVE | IDCMP_INTUITICKS); + DoMethod(_win(obj), MUIM_Window_AddEventHandler, + (IPTR) & data->ehn); + + return MUI_EventHandlerRC_Eat; + } + } + else + { + if (msg->imsg->Code == SELECTUP && data->mouse_click) + { + DoMethod(_win(obj), MUIM_Window_RemEventHandler, + (IPTR) & data->ehn); + data->ehn.ehn_Events &= + ~(IDCMP_MOUSEMOVE | IDCMP_INTUITICKS); + DoMethod(_win(obj), MUIM_Window_AddEventHandler, + (IPTR) & data->ehn); + data->mouse_click = 0; + return 0; + } + } + break; + + case IDCMP_INTUITICKS: + case IDCMP_MOUSEMOVE: + if (data->mouse_click) + { + List_MakeActive(cl, obj, mx, my); + } + break; + + case IDCMP_RAWKEY: + switch (msg->imsg->Code) + { + case RAWKEY_NM_WHEEL_UP: + if (_isinobject(msg->imsg->MouseX, msg->imsg->MouseY)) + { + DoWheelMove(cl, obj, -1, msg->imsg->Qualifier); + } + break; + + case RAWKEY_NM_WHEEL_DOWN: + if (_isinobject(msg->imsg->MouseX, msg->imsg->MouseY)) + { + DoWheelMove(cl, obj, 1, msg->imsg->Qualifier); + } + break; + + } + break; + + case IDCMP_ACTIVEWINDOW: + case IDCMP_INACTIVEWINDOW: + if (data->ehn.ehn_Events & (IDCMP_MOUSEMOVE | IDCMP_INTUITICKS)) + { + DoMethod(_win(obj), MUIM_Window_RemEventHandler, + (IPTR) & data->ehn); + data->ehn.ehn_Events &= + ~(IDCMP_MOUSEMOVE | IDCMP_INTUITICKS); + DoMethod(_win(obj), MUIM_Window_AddEventHandler, + (IPTR) & data->ehn); + data->mouse_click = 0; + } + break; } } @@ -1603,30 +1748,32 @@ IPTR List__MUIM_HandleEvent(struct IClass *cl, Object *obj, struct MUIP_HandleEv /************************************************************************** MUIM_List_Clear **************************************************************************/ -IPTR List__MUIM_Clear(struct IClass *cl, Object *obj, struct MUIP_List_Clear *msg) +IPTR List__MUIM_Clear(struct IClass *cl, Object *obj, + struct MUIP_List_Clear *msg) { struct MUI_ListData *data = INST_DATA(cl, obj); while (data->confirm_entries_num) { - struct ListEntry *lentry = data->entries[--data->confirm_entries_num]; - DoMethod(obj, MUIM_List_Destruct, (IPTR)lentry->data, (IPTR)data->pool); - FreeListEntry(data,lentry); + struct ListEntry *lentry = + data->entries[--data->confirm_entries_num]; + DoMethod(obj, MUIM_List_Destruct, (IPTR) lentry->data, + (IPTR) data->pool); + FreeListEntry(data, lentry); } /* Should never fail when shrinking */ - SetListSize(data,0); + SetListSize(data, 0); if (data->confirm_entries_num != data->entries_num) { - SetAttrs(obj, - MUIA_List_Entries,0, - MUIA_List_First,0, + SetAttrs(obj, MUIA_List_Entries, 0, MUIA_List_First, 0, /* Notify only when no entry was active */ - data->entries_active != MUIV_List_Active_Off ? MUIA_List_Active : TAG_DONE, MUIV_List_Active_Off, - TAG_DONE); + data->entries_active != + MUIV_List_Active_Off ? MUIA_List_Active : TAG_DONE, + MUIV_List_Active_Off, TAG_DONE); data->update = 1; - MUI_Redraw(obj,MADF_DRAWUPDATE); + MUI_Redraw(obj, MADF_DRAWUPDATE); } return 0; @@ -1635,44 +1782,63 @@ IPTR List__MUIM_Clear(struct IClass *cl, Object *obj, struct MUIP_List_Clear *ms /************************************************************************** MUIM_List_Exchange **************************************************************************/ -IPTR List__MUIM_Exchange(struct IClass *cl, Object *obj, struct MUIP_List_Exchange *msg) +IPTR List__MUIM_Exchange(struct IClass *cl, Object *obj, + struct MUIP_List_Exchange *msg) { struct MUI_ListData *data = INST_DATA(cl, obj); - LONG pos1, - pos2; + LONG pos1, pos2; switch (msg->pos1) { - case MUIV_List_Exchange_Top: pos1 = 0; break; - case MUIV_List_Exchange_Active: pos1 = data->entries_active; break; - case MUIV_List_Exchange_Bottom: pos1 = data->entries_num - 1; break; - default: pos1 = msg->pos1; + case MUIV_List_Exchange_Top: + pos1 = 0; + break; + case MUIV_List_Exchange_Active: + pos1 = data->entries_active; + break; + case MUIV_List_Exchange_Bottom: + pos1 = data->entries_num - 1; + break; + default: + pos1 = msg->pos1; } switch (msg->pos2) { - case MUIV_List_Exchange_Top: pos2 = 0; break; - case MUIV_List_Exchange_Active: pos2 = data->entries_active; break; - case MUIV_List_Exchange_Bottom: pos2 = data->entries_num - 1; break; - case MUIV_List_Exchange_Next: pos2 = pos1 + 1; break; - case MUIV_List_Exchange_Previous: pos2 = pos1 - 1; break; - default: pos2 = msg->pos2; - } + case MUIV_List_Exchange_Top: + pos2 = 0; + break; + case MUIV_List_Exchange_Active: + pos2 = data->entries_active; + break; + case MUIV_List_Exchange_Bottom: + pos2 = data->entries_num - 1; + break; + case MUIV_List_Exchange_Next: + pos2 = pos1 + 1; + break; + case MUIV_List_Exchange_Previous: + pos2 = pos1 - 1; + break; + default: + pos2 = msg->pos2; + } + + if (pos1 >= 0 && pos1 < data->entries_num && pos2 >= 0 + && pos2 < data->entries_num && pos1 != pos2) + { + struct ListEntry *save = data->entries[pos1]; + data->entries[pos1] = data->entries[pos2]; + data->entries[pos2] = save; - if (pos1 >= 0 && pos1 < data->entries_num && pos2 >= 0 && pos2 < data->entries_num && pos1 != pos2) - { - struct ListEntry *save = data->entries[pos1]; - data->entries[pos1] = data->entries[pos2]; - data->entries[pos2] = save; - data->update = 2; data->update_pos = pos1; - MUI_Redraw(obj,MADF_DRAWUPDATE); - + MUI_Redraw(obj, MADF_DRAWUPDATE); + data->update = 2; data->update_pos = pos2; - MUI_Redraw(obj,MADF_DRAWUPDATE); - + MUI_Redraw(obj, MADF_DRAWUPDATE); + return TRUE; } else @@ -1684,20 +1850,22 @@ IPTR List__MUIM_Exchange(struct IClass *cl, Object *obj, struct MUIP_List_Exchan /************************************************************************** MUIM_List_Redraw **************************************************************************/ -IPTR List__MUIM_Redraw(struct IClass *cl, Object *obj, struct MUIP_List_Redraw *msg) +IPTR List__MUIM_Redraw(struct IClass *cl, Object *obj, + struct MUIP_List_Redraw *msg) { struct MUI_ListData *data = INST_DATA(cl, obj); if (msg->pos == MUIV_List_Redraw_All) { data->update = 1; - CalcWidths(cl,obj); - MUI_Redraw(obj,MADF_DRAWUPDATE); + CalcWidths(cl, obj); + MUI_Redraw(obj, MADF_DRAWUPDATE); } else { LONG pos = -1; - if (msg->pos == MUIV_List_Redraw_Active) pos = data->entries_active; + if (msg->pos == MUIV_List_Redraw_Active) + pos = data->entries_active; else if (msg->pos == MUIV_List_Redraw_Entry) { LONG i; @@ -1708,18 +1876,19 @@ IPTR List__MUIM_Redraw(struct IClass *cl, Object *obj, struct MUIP_List_Redraw * break; } } - else pos = msg->pos; + else + pos = msg->pos; if (pos != -1) { - if(CalcDimsOfEntry(cl, obj, pos)) + if (CalcDimsOfEntry(cl, obj, pos)) data->update = 1; else { data->update = 2; data->update_pos = pos; } - MUI_Redraw(obj,MADF_DRAWUPDATE); + MUI_Redraw(obj, MADF_DRAWUPDATE); } } return 0; @@ -1728,38 +1897,40 @@ IPTR List__MUIM_Redraw(struct IClass *cl, Object *obj, struct MUIP_List_Redraw * /************************************************************************** MUIM_List_Remove **************************************************************************/ -IPTR List__MUIM_Remove(struct IClass *cl, Object *obj, struct MUIP_List_Remove *msg) +IPTR List__MUIM_Remove(struct IClass *cl, Object *obj, + struct MUIP_List_Remove *msg) { struct MUI_ListData *data = INST_DATA(cl, obj); - LONG pos,cur; + LONG pos, cur; LONG new_act; struct ListEntry *lentry; //int rem_count = 1; - if (!data->entries_num) return 0; + if (!data->entries_num) + return 0; - switch(msg->pos) + switch (msg->pos) { - case MUIV_List_Remove_First: - pos = 0; - break; + case MUIV_List_Remove_First: + pos = 0; + break; - case MUIV_List_Remove_Active: - pos = data->entries_active; - break; + case MUIV_List_Remove_Active: + pos = data->entries_active; + break; - case MUIV_List_Remove_Last: - pos = data->entries_num - 1; - break; + case MUIV_List_Remove_Last: + pos = data->entries_num - 1; + break; - case MUIV_List_Remove_Selected: - /* TODO: needs special handling */ - pos = data->entries_active; - break; + case MUIV_List_Remove_Selected: + /* TODO: needs special handling */ + pos = data->entries_active; + break; - default: - pos = msg->pos; - break; + default: + pos = msg->pos; + break; } if (pos < 0 || pos >= data->entries_num) @@ -1768,10 +1939,11 @@ IPTR List__MUIM_Remove(struct IClass *cl, Object *obj, struct MUIP_List_Remove * new_act = data->entries_active; if (pos == new_act && new_act == data->entries_num - 1) - new_act--; /* might become MUIV_List_Active_Off */ + new_act--; /* might become MUIV_List_Active_Off */ lentry = data->entries[pos]; - DoMethod(obj, MUIM_List_Destruct, (IPTR)lentry->data, (IPTR)data->pool); + DoMethod(obj, MUIM_List_Destruct, (IPTR) lentry->data, + (IPTR) data->pool); cur = pos + 1; @@ -1779,16 +1951,17 @@ IPTR List__MUIM_Remove(struct IClass *cl, Object *obj, struct MUIP_List_Remove * data->confirm_entries_num -= cur - pos; /* ensure that the active element is in a valid range */ - if (new_act >= data->entries_num) new_act = data->entries_num - 1; + if (new_act >= data->entries_num) + new_act = data->entries_num - 1; - SetAttrs(obj, - MUIA_List_Entries, data->confirm_entries_num, + SetAttrs(obj, MUIA_List_Entries, data->confirm_entries_num, (new_act >= pos) || (new_act != data->entries_active) ? - MUIA_List_Active : TAG_DONE, new_act, /* Inform only if neccessary (for notify) */ + MUIA_List_Active : TAG_DONE, + new_act, /* Inform only if neccessary (for notify) */ TAG_DONE); data->update = 1; - MUI_Redraw(obj,MADF_DRAWUPDATE); + MUI_Redraw(obj, MADF_DRAWUPDATE); return 0; } @@ -1797,18 +1970,19 @@ IPTR List__MUIM_Remove(struct IClass *cl, Object *obj, struct MUIP_List_Remove * MUIM_List_Insert **************************************************************************/ -IPTR List__MUIM_Insert(struct IClass *cl, Object *obj, struct MUIP_List_Insert *msg) +IPTR List__MUIM_Insert(struct IClass *cl, Object *obj, + struct MUIP_List_Insert *msg) { struct MUI_ListData *data = INST_DATA(cl, obj); - LONG pos,count,sort; + LONG pos, count, sort; count = msg->count; - sort=0; + sort = 0; if (count == -1) { - /* Count the number of entries */ - for(count = 0; msg->entries[count] != NULL; count++) + /* Count the number of entries */ + for (count = 0; msg->entries[count] != NULL; count++) ; } @@ -1817,32 +1991,37 @@ IPTR List__MUIM_Insert(struct IClass *cl, Object *obj, struct MUIP_List_Insert * switch (msg->pos) { - case MUIV_List_Insert_Top: - pos = 0; - break; + case MUIV_List_Insert_Top: + pos = 0; + break; - case MUIV_List_Insert_Active: - if (data->entries_active != -1) pos = data->entries_active; - else pos = data->entries_active; - break; + case MUIV_List_Insert_Active: + if (data->entries_active != -1) + pos = data->entries_active; + else + pos = data->entries_active; + break; - case MUIV_List_Insert_Sorted: - pos = data->entries_num; - sort = 1; /* we sort'em later */ - break; + case MUIV_List_Insert_Sorted: + pos = data->entries_num; + sort = 1; /* we sort'em later */ + break; - case MUIV_List_Insert_Bottom: - pos = data->entries_num; - break; + case MUIV_List_Insert_Bottom: + pos = data->entries_num; + break; - default: - if (msg->pos > data->entries_num) pos = data->entries_num; - else if (msg->pos < 0) pos = 0; - else pos = msg->pos; - break; + default: + if (msg->pos > data->entries_num) + pos = data->entries_num; + else if (msg->pos < 0) + pos = 0; + else + pos = msg->pos; + break; } - if (!(SetListSize(data,data->entries_num + count))) + if (!(SetListSize(data, data->entries_num + count))) return ~0; LONG until = pos + count; @@ -1858,24 +2037,24 @@ IPTR List__MUIM_Insert(struct IClass *cl, Object *obj, struct MUIP_List_Insert * if (!(lentry = AllocListEntry(data))) { /* Panic, but we must be in a consistent state, so remove - ** the space where the following list entries should have gone - */ + ** the space where the following list entries should have gone + */ RemoveListEntries(data, pos, until - pos); return ~0; } /* now call the construct method which returns us a pointer which we need to store */ - lentry->data = (APTR)DoMethod(obj, MUIM_List_Construct, - (IPTR)*toinsert, (IPTR)data->pool); + lentry->data = (APTR) DoMethod(obj, MUIM_List_Construct, + (IPTR) * toinsert, (IPTR) data->pool); if (!lentry->data) { - FreeListEntry(data,lentry); + FreeListEntry(data, lentry); RemoveListEntries(data, pos, until - pos); /* TODO: Also check for visible stuff like below */ if (data->entries_num != data->confirm_entries_num) - set(obj,MUIA_List_Entries,data->confirm_entries_num); + set(obj, MUIA_List_Entries, data->confirm_entries_num); return ~0; } @@ -1884,25 +2063,26 @@ IPTR List__MUIM_Insert(struct IClass *cl, Object *obj, struct MUIP_List_Insert * if (_flags(obj) & MADF_SETUP) { - /* We have to calculate the width and height of the newly inserted entry, - this has to be done after inserting the element into the list */ + /* We have to calculate the width and height of the newly + * inserted entry. This has to be done after inserting the + * element into the list */ CalcDimsOfEntry(cl, obj, pos); } toinsert++; pos++; - } // while (pos < until) + } // while (pos < until) - + + /* Recalculate the number of visible entries */ if (_flags(obj) & MADF_SETUP) - CalcVertVisible(cl,obj); /* Recalculate the number of visible entries */ + CalcVertVisible(cl, obj); if (data->entries_num != data->confirm_entries_num) { SetAttrs(obj, MUIA_List_Entries, data->confirm_entries_num, - MUIA_List_Visible, data->entries_visible, - TAG_DONE); + MUIA_List_Visible, data->entries_visible, TAG_DONE); } /* If the array is already sorted, we could do a simple insert @@ -1914,72 +2094,77 @@ IPTR List__MUIM_Insert(struct IClass *cl, Object *obj, struct MUIP_List_Insert * */ if (sort) { - DoMethod(obj,MUIM_List_Sort); + DoMethod(obj, MUIM_List_Sort); /* TODO: which pos to return here !? */ /* MUIM_List_Sort already called MUI_Redraw */ } - else + else { if (!(data->flags & LIST_QUIET)) { data->update = 1; - MUI_Redraw(obj,MADF_DRAWUPDATE); + MUI_Redraw(obj, MADF_DRAWUPDATE); } } data->insert_position = pos; - return (ULONG)pos; + return (ULONG) pos; } /************************************************************************** MUIM_List_InsertSingle **************************************************************************/ -IPTR List__MUIM_InsertSingle(struct IClass *cl, Object *obj, struct MUIP_List_InsertSingle *msg) +IPTR List__MUIM_InsertSingle(struct IClass *cl, Object *obj, + struct MUIP_List_InsertSingle *msg) { - return DoMethod(obj,MUIM_List_Insert, (IPTR)&msg->entry, 1, msg->pos); + return DoMethod(obj, MUIM_List_Insert, (IPTR) & msg->entry, 1, + msg->pos); } /************************************************************************** MUIM_List_GetEntry **************************************************************************/ -IPTR List__MUIM_GetEntry(struct IClass *cl, Object *obj, struct MUIP_List_GetEntry *msg) +IPTR List__MUIM_GetEntry(struct IClass *cl, Object *obj, + struct MUIP_List_GetEntry *msg) { struct MUI_ListData *data = INST_DATA(cl, obj); int pos = msg->pos; - if (pos == MUIV_List_GetEntry_Active) pos = data->entries_active; + if (pos == MUIV_List_GetEntry_Active) + pos = data->entries_active; if (pos < 0 || pos >= data->entries_num) { - *msg->entry = NULL; - return 0; + *msg->entry = NULL; + return 0; } *msg->entry = data->entries[pos]->data; - return (IPTR)*msg->entry; + return (IPTR) *msg->entry; } /************************************************************************** MUIM_List_Construct **************************************************************************/ -IPTR List__MUIM_Construct(struct IClass *cl, Object *obj, struct MUIP_List_Construct *msg) +IPTR List__MUIM_Construct(struct IClass *cl, Object *obj, + struct MUIP_List_Construct *msg) { struct MUI_ListData *data = INST_DATA(cl, obj); if (NULL == data->construct_hook) - return (IPTR)msg->entry; - if ((IPTR)data->construct_hook == MUIV_List_ConstructHook_String) + return (IPTR) msg->entry; + if ((IPTR) data->construct_hook == MUIV_List_ConstructHook_String) { - int len = msg->entry ? strlen((STRPTR)msg->entry) : 0; - ULONG *mem = AllocPooled(msg->pool, len+5); + int len = msg->entry ? strlen((STRPTR) msg->entry) : 0; + ULONG *mem = AllocPooled(msg->pool, len + 5); - if (NULL == mem) + if (NULL == mem) return 0; - mem[0] = len + 5; - if (msg->entry != NULL) - strcpy((STRPTR)(mem+1), (STRPTR)msg->entry); - else - *(STRPTR)(mem+1) = 0; - return (IPTR)(mem+1); + mem[0] = len + 5; + if (msg->entry != NULL) + strcpy((STRPTR) (mem + 1), (STRPTR) msg->entry); + else + *(STRPTR) (mem + 1) = 0; + return (IPTR) (mem + 1); } return CallHookPkt(data->construct_hook, msg->pool, msg->entry); } @@ -1987,16 +2172,17 @@ IPTR List__MUIM_Construct(struct IClass *cl, Object *obj, struct MUIP_List_Const /************************************************************************** MUIM_List_Destruct **************************************************************************/ -IPTR List__MUIM_Destruct(struct IClass *cl, Object *obj, struct MUIP_List_Destruct *msg) +IPTR List__MUIM_Destruct(struct IClass *cl, Object *obj, + struct MUIP_List_Destruct *msg) { struct MUI_ListData *data = INST_DATA(cl, obj); if (NULL == data->destruct_hook) return 0; - if ((IPTR)data->destruct_hook == MUIV_List_DestructHook_String) + if ((IPTR) data->destruct_hook == MUIV_List_DestructHook_String) { - ULONG *mem = ((ULONG*)msg->entry) - 1; + ULONG *mem = ((ULONG *) msg->entry) - 1; FreePooled(msg->pool, mem, mem[0]); } else @@ -2009,7 +2195,8 @@ IPTR List__MUIM_Destruct(struct IClass *cl, Object *obj, struct MUIP_List_Destru /************************************************************************** MUIM_List_Compare **************************************************************************/ -IPTR List__MUIM_Compare(struct IClass *cl, Object *obj, struct MUIP_List_Compare *msg) +IPTR List__MUIM_Compare(struct IClass *cl, Object *obj, + struct MUIP_List_Compare *msg) { struct MUI_ListData *data = INST_DATA(cl, obj); @@ -2019,27 +2206,29 @@ IPTR List__MUIM_Compare(struct IClass *cl, Object *obj, struct MUIP_List_Compare /************************************************************************** MUIM_List_Display **************************************************************************/ -IPTR List__MUIM_Display(struct IClass *cl, Object *obj, struct MUIP_List_Display *msg) +IPTR List__MUIM_Display(struct IClass *cl, Object *obj, + struct MUIP_List_Display *msg) { struct MUI_ListData *data = INST_DATA(cl, obj); if (NULL == data->display_hook) { - if (msg->entry) + if (msg->entry) *msg->array = msg->entry; else *msg->array = 0; - return 1; + return 1; } - *((ULONG*)(msg->array - 1)) = msg->entry_pos; + *((ULONG *) (msg->array - 1)) = msg->entry_pos; return CallHookPkt(data->display_hook, msg->array, msg->entry); } /************************************************************************** MUIM_List_SelectChange **************************************************************************/ -IPTR List__MUIM_SelectChange(struct IClass *cl, Object *obj, struct MUIP_List_SelectChange *msg) +IPTR List__MUIM_SelectChange(struct IClass *cl, Object *obj, + struct MUIP_List_SelectChange *msg) { return 1; } @@ -2053,7 +2242,8 @@ keeps a reference to it (that reference will be returned). Text engine will dereference that pointer and draw the object with its default size. **************************************************************************/ -IPTR List__MUIM_CreateImage(struct IClass *cl, Object *obj, struct MUIP_List_CreateImage *msg) +IPTR List__MUIM_CreateImage(struct IClass *cl, Object *obj, + struct MUIP_List_CreateImage *msg) { struct MUI_ListData *data = INST_DATA(cl, obj); struct ListImage *li; @@ -2067,17 +2257,18 @@ IPTR List__MUIM_CreateImage(struct IClass *cl, Object *obj, struct MUIP_List_Cre li->obj = msg->obj; AddTail((struct List *)&data->images, (struct Node *)li); - DoMethod(li->obj, MUIM_ConnectParent, (IPTR)obj); + DoMethod(li->obj, MUIM_ConnectParent, (IPTR) obj); DoSetupMethod(li->obj, muiRenderInfo(obj)); - return (IPTR)li; + return (IPTR) li; } /************************************************************************** MUIM_List_DeleteImage **************************************************************************/ -IPTR List__MUIM_DeleteImage(struct IClass *cl, Object *obj, struct MUIP_List_DeleteImage *msg) +IPTR List__MUIM_DeleteImage(struct IClass *cl, Object *obj, + struct MUIP_List_DeleteImage *msg) { struct MUI_ListData *data = INST_DATA(cl, obj); struct ListImage *li = (struct ListImage *)msg->listimg; @@ -2096,74 +2287,79 @@ IPTR List__MUIM_DeleteImage(struct IClass *cl, Object *obj, struct MUIP_List_Del /************************************************************************** MUIM_List_Jump **************************************************************************/ -IPTR List__MUIM_Jump(struct IClass *cl, Object *obj, struct MUIP_List_Jump *msg) +IPTR List__MUIM_Jump(struct IClass *cl, Object *obj, + struct MUIP_List_Jump *msg) { struct MUI_ListData *data = INST_DATA(cl, obj); LONG pos = msg->pos; - - switch(pos) + + switch (pos) { - case MUIV_List_Jump_Top: - pos = 0; - break; - - case MUIV_List_Jump_Active: - pos = data->entries_active; - break; - - case MUIV_List_Jump_Bottom: - pos = data->entries_num - 1; - break; - - case MUIV_List_Jump_Down: - pos = data->entries_first + data->entries_visible; - break; - - case MUIV_List_Jump_Up: - pos = data->entries_first - 1; - break; - + case MUIV_List_Jump_Top: + pos = 0; + break; + + case MUIV_List_Jump_Active: + pos = data->entries_active; + break; + + case MUIV_List_Jump_Bottom: + pos = data->entries_num - 1; + break; + + case MUIV_List_Jump_Down: + pos = data->entries_first + data->entries_visible; + break; + + case MUIV_List_Jump_Up: + pos = data->entries_first - 1; + break; + } if (pos > data->entries_num) { - pos = data->entries_num - 1; + pos = data->entries_num - 1; } - if (pos < 0) pos = 0; - + if (pos < 0) + pos = 0; + if (pos < data->entries_first) { - set(obj, MUIA_List_First, pos); + set(obj, MUIA_List_First, pos); } else if (pos >= data->entries_first + data->entries_visible) { - pos -= (data->entries_visible - 1); - if (pos < 0) pos = 0; + pos -= (data->entries_visible - 1); + if (pos < 0) + pos = 0; if (pos != data->entries_first) { set(obj, MUIA_List_First, pos); } } - - + + return TRUE; } /************************************************************************** MUIM_List_Sort **************************************************************************/ -IPTR List__MUIM_Sort(struct IClass *cl, Object *obj, struct MUIP_List_Sort *msg) +IPTR List__MUIM_Sort(struct IClass *cl, Object *obj, + struct MUIP_List_Sort *msg) { struct MUI_ListData *data = INST_DATA(cl, obj); int i, j, max; - struct MUIP_List_Compare cmpmsg = {MUIM_List_Compare, NULL, NULL, 0, 0}; + struct MUIP_List_Compare cmpmsg = + { MUIM_List_Compare, NULL, NULL, 0, 0 }; if (data->entries_num > 1) { /* - Simple sort algorithm. Feel free to improve it. - */ + Simple sort algorithm. Feel free to improve it. + */ for (i = 0; i < data->entries_num - 1; i++) { max = i; @@ -2171,7 +2367,7 @@ IPTR List__MUIM_Sort(struct IClass *cl, Object *obj, struct MUIP_List_Sort *msg) { cmpmsg.entry1 = data->entries[max]->data; cmpmsg.entry2 = data->entries[j]->data; - if ((LONG)DoMethodA(obj, (Msg)&cmpmsg) > 0) + if ((LONG) DoMethodA(obj, (Msg) & cmpmsg) > 0) { max = j; } @@ -2188,7 +2384,7 @@ IPTR List__MUIM_Sort(struct IClass *cl, Object *obj, struct MUIP_List_Sort *msg) if (!(data->flags & LIST_QUIET)) { data->update = 1; - MUI_Redraw(obj,MADF_DRAWUPDATE); + MUI_Redraw(obj, MADF_DRAWUPDATE); } return 0; @@ -2197,52 +2393,71 @@ IPTR List__MUIM_Sort(struct IClass *cl, Object *obj, struct MUIP_List_Sort *msg) /************************************************************************** MUIM_List_Move **************************************************************************/ -IPTR List__MUIM_Move(struct IClass *cl, Object *obj, struct MUIP_List_Move *msg) +IPTR List__MUIM_Move(struct IClass *cl, Object *obj, + struct MUIP_List_Move *msg) { struct MUI_ListData *data = INST_DATA(cl, obj); - LONG from, to; + LONG from, to; int i; switch (msg->from) { - case MUIV_List_Move_Top: from = 0; break; - case MUIV_List_Move_Active: from = data->entries_active; break; - case MUIV_List_Move_Bottom: from = data->entries_num - 1; break; - default: from = msg->from; + case MUIV_List_Move_Top: + from = 0; + break; + case MUIV_List_Move_Active: + from = data->entries_active; + break; + case MUIV_List_Move_Bottom: + from = data->entries_num - 1; + break; + default: + from = msg->from; } switch (msg->to) { - case MUIV_List_Move_Top: to = 0; break; - case MUIV_List_Move_Active: to = data->entries_active; break; - case MUIV_List_Move_Bottom: to = data->entries_num - 1; break; - case MUIV_List_Move_Next: to = from + 1; break; - case MUIV_List_Move_Previous: to = from - 1; break; - default: to = msg->to; - } - - if(from > data->entries_num - 1 || from < 0 || to > data->entries_num - 1 || - to < 0 || from == to) + case MUIV_List_Move_Top: + to = 0; + break; + case MUIV_List_Move_Active: + to = data->entries_active; + break; + case MUIV_List_Move_Bottom: + to = data->entries_num - 1; + break; + case MUIV_List_Move_Next: + to = from + 1; + break; + case MUIV_List_Move_Previous: + to = from - 1; + break; + default: + to = msg->to; + } + + if (from > data->entries_num - 1 || from < 0 + || to > data->entries_num - 1 || to < 0 || from == to) return (IPTR) FALSE; - - if(from < to) + + if (from < to) { struct ListEntry *backup = data->entries[from]; - for(i = from; i < to; i++) + for (i = from; i < to; i++) data->entries[i] = data->entries[i + 1]; data->entries[to] = backup; } else { struct ListEntry *backup = data->entries[from]; - for(i = from; i > to; i--) + for (i = from; i > to; i--) data->entries[i] = data->entries[i - 1]; data->entries[to] = backup; } - + data->update = 1; - MUI_Redraw(obj,MADF_DRAWUPDATE); + MUI_Redraw(obj, MADF_DRAWUPDATE); return TRUE; } @@ -2254,39 +2469,70 @@ BOOPSI_DISPATCHER(IPTR, List_Dispatcher, cl, obj, msg) { switch (msg->MethodID) { - case OM_NEW: return List__OM_NEW(cl, obj, (struct opSet *)msg); - case OM_DISPOSE: return List__OM_DISPOSE(cl,obj, msg); - case OM_SET: return List__OM_SET(cl,obj,(struct opSet *)msg); - case OM_GET: return List__OM_GET(cl,obj,(struct opGet *)msg); - - case MUIM_Setup: return List__MUIM_Setup(cl,obj,(struct MUIP_Setup *)msg); - case MUIM_Cleanup: return List__MUIM_Cleanup(cl,obj,(struct MUIP_Cleanup *)msg); - case MUIM_AskMinMax: return List__MUIM_AskMinMax(cl,obj,(struct MUIP_AskMinMax *)msg); - case MUIM_Show: return List__MUIM_Show(cl,obj,(struct MUIP_Show *)msg); - case MUIM_Hide: return List__MUIM_Hide(cl,obj,(struct MUIP_Hide *)msg); - case MUIM_Draw: return List__MUIM_Draw(cl,obj,(struct MUIP_Draw *)msg); - case MUIM_Layout: return List__MUIM_Layout(cl,obj,(struct MUIP_Layout *)msg); - case MUIM_HandleEvent: return List__MUIM_HandleEvent(cl,obj,(struct MUIP_HandleEvent *)msg); - case MUIM_List_Clear: return List__MUIM_Clear(cl,obj,(struct MUIP_List_Clear *)msg); - case MUIM_List_Sort: return List__MUIM_Sort(cl,obj,(struct MUIP_List_Sort *)msg); - case MUIM_List_Exchange: return List__MUIM_Exchange(cl,obj,(struct MUIP_List_Exchange *)msg); - case MUIM_List_Insert: return List__MUIM_Insert(cl,obj,(APTR)msg); - case MUIM_List_InsertSingle: return List__MUIM_InsertSingle(cl,obj,(APTR)msg); - case MUIM_List_GetEntry: return List__MUIM_GetEntry(cl,obj,(APTR)msg); - case MUIM_List_Redraw: return List__MUIM_Redraw(cl,obj,(APTR)msg); - case MUIM_List_Remove: return List__MUIM_Remove(cl,obj,(APTR)msg); - - case MUIM_List_Construct: return List__MUIM_Construct(cl,obj,(APTR)msg); - case MUIM_List_Destruct: return List__MUIM_Destruct(cl,obj,(APTR)msg); - case MUIM_List_Compare: return List__MUIM_Compare(cl,obj,(APTR)msg); - case MUIM_List_Display: return List__MUIM_Display(cl,obj,(APTR)msg); - case MUIM_List_SelectChange: return List__MUIM_SelectChange(cl,obj,(APTR)msg); - case MUIM_List_CreateImage: return List__MUIM_CreateImage(cl,obj,(APTR)msg); - case MUIM_List_DeleteImage: return List__MUIM_DeleteImage(cl,obj,(APTR)msg); - case MUIM_List_Jump: return List__MUIM_Jump(cl,obj,(APTR)msg); - case MUIM_List_Move: return List__MUIM_Move(cl,obj,(struct MUIP_List_Move *)msg); - } - + case OM_NEW: + return List__OM_NEW(cl, obj, (struct opSet *)msg); + case OM_DISPOSE: + return List__OM_DISPOSE(cl, obj, msg); + case OM_SET: + return List__OM_SET(cl, obj, (struct opSet *)msg); + case OM_GET: + return List__OM_GET(cl, obj, (struct opGet *)msg); + + case MUIM_Setup: + return List__MUIM_Setup(cl, obj, (struct MUIP_Setup *)msg); + case MUIM_Cleanup: + return List__MUIM_Cleanup(cl, obj, (struct MUIP_Cleanup *)msg); + case MUIM_AskMinMax: + return List__MUIM_AskMinMax(cl, obj, (struct MUIP_AskMinMax *)msg); + case MUIM_Show: + return List__MUIM_Show(cl, obj, (struct MUIP_Show *)msg); + case MUIM_Hide: + return List__MUIM_Hide(cl, obj, (struct MUIP_Hide *)msg); + case MUIM_Draw: + return List__MUIM_Draw(cl, obj, (struct MUIP_Draw *)msg); + case MUIM_Layout: + return List__MUIM_Layout(cl, obj, (struct MUIP_Layout *)msg); + case MUIM_HandleEvent: + return List__MUIM_HandleEvent(cl, obj, + (struct MUIP_HandleEvent *)msg); + case MUIM_List_Clear: + return List__MUIM_Clear(cl, obj, (struct MUIP_List_Clear *)msg); + case MUIM_List_Sort: + return List__MUIM_Sort(cl, obj, (struct MUIP_List_Sort *)msg); + case MUIM_List_Exchange: + return List__MUIM_Exchange(cl, obj, + (struct MUIP_List_Exchange *)msg); + case MUIM_List_Insert: + return List__MUIM_Insert(cl, obj, (APTR) msg); + case MUIM_List_InsertSingle: + return List__MUIM_InsertSingle(cl, obj, (APTR) msg); + case MUIM_List_GetEntry: + return List__MUIM_GetEntry(cl, obj, (APTR) msg); + case MUIM_List_Redraw: + return List__MUIM_Redraw(cl, obj, (APTR) msg); + case MUIM_List_Remove: + return List__MUIM_Remove(cl, obj, (APTR) msg); + + case MUIM_List_Construct: + return List__MUIM_Construct(cl, obj, (APTR) msg); + case MUIM_List_Destruct: + return List__MUIM_Destruct(cl, obj, (APTR) msg); + case MUIM_List_Compare: + return List__MUIM_Compare(cl, obj, (APTR) msg); + case MUIM_List_Display: + return List__MUIM_Display(cl, obj, (APTR) msg); + case MUIM_List_SelectChange: + return List__MUIM_SelectChange(cl, obj, (APTR) msg); + case MUIM_List_CreateImage: + return List__MUIM_CreateImage(cl, obj, (APTR) msg); + case MUIM_List_DeleteImage: + return List__MUIM_DeleteImage(cl, obj, (APTR) msg); + case MUIM_List_Jump: + return List__MUIM_Jump(cl, obj, (APTR) msg); + case MUIM_List_Move: + return List__MUIM_Move(cl, obj, (struct MUIP_List_Move *)msg); + } + return DoSuperMethodA(cl, obj, msg); } BOOPSI_DISPATCHER_END @@ -2294,9 +2540,10 @@ BOOPSI_DISPATCHER_END /* * Class descriptor. */ -const struct __MUIBuiltinClass _MUI_List_desc = { - MUIC_List, - MUIC_Area, - sizeof(struct MUI_ListData), - (void*)List_Dispatcher +const struct __MUIBuiltinClass _MUI_List_desc = +{ + MUIC_List, + MUIC_Area, + sizeof(struct MUI_ListData), + (void *) List_Dispatcher }; diff --git a/workbench/libs/muimaster/classes/list.h b/workbench/libs/muimaster/classes/list.h dissimilarity index 78% index 1daca50542..66d82c9396 100644 --- a/workbench/libs/muimaster/classes/list.h +++ b/workbench/libs/muimaster/classes/list.h @@ -1,218 +1,371 @@ -#ifndef _MUI_CLASSES_LIST_H -#define _MUI_CLASSES_LIST_H - -/* - Copyright © 2002-2011, The AROS Development Team. All rights reserved. - $Id$ -*/ - -/****************************************************************************/ -/*** Name *******************************************************************/ -#define MUIC_List "List.mui" - -/*** Identifier base (for Zune extensions) **********************************/ -#define MUIB_List (MUIB_ZUNE | 0x00001400) - -/*** Methods ****************************************************************/ -#define MUIM_List_Clear (MUIB_MUI|0x0042ad89) /* MUI: V4 */ -#define MUIM_List_Compare (MUIB_MUI|0x00421b68) /* MUI: V20 */ -#define MUIM_List_Construct (MUIB_MUI|0x0042d662) /* MUI: V20 */ -#define MUIM_List_CreateImage (MUIB_MUI|0x00429804) /* MUI: V11 */ -#define MUIM_List_DeleteImage (MUIB_MUI|0x00420f58) /* MUI: V11 */ -#define MUIM_List_Destruct (MUIB_MUI|0x00427d51) /* MUI: V20 */ -#define MUIM_List_Display (MUIB_MUI|0x00425377) /* MUI: V20 */ -#define MUIM_List_Exchange (MUIB_MUI|0x0042468c) /* MUI: V4 */ -#define MUIM_List_GetEntry (MUIB_MUI|0x004280ec) /* MUI: V4 */ -#define MUIM_List_Insert (MUIB_MUI|0x00426c87) /* MUI: V4 */ -#define MUIM_List_InsertSingle (MUIB_MUI|0x004254d5) /* MUI: V7 */ -#define MUIM_List_Jump (MUIB_MUI|0x0042baab) /* MUI: V4 */ -#define MUIM_List_Move (MUIB_MUI|0x004253c2) /* MUI: V9 */ -#define MUIM_List_NextSelected (MUIB_MUI|0x00425f17) /* MUI: V6 */ -#define MUIM_List_Redraw (MUIB_MUI|0x00427993) /* MUI: V4 */ -#define MUIM_List_Remove (MUIB_MUI|0x0042647e) /* MUI: V4 */ -#define MUIM_List_Select (MUIB_MUI|0x004252d8) /* MUI: V4 */ -#define MUIM_List_Sort (MUIB_MUI|0x00422275) /* MUI: V4 */ -#define MUIM_List_TestPos (MUIB_MUI|0x00425f48) /* MUI: V11 */ -struct MUIP_List_Clear {STACKED ULONG MethodID;}; -struct MUIP_List_Compare {STACKED ULONG MethodID; STACKED APTR entry1; STACKED APTR entry2; STACKED LONG sort_type1; STACKED LONG sort_type2;}; -struct MUIP_List_Construct {STACKED ULONG MethodID; STACKED APTR entry; STACKED APTR pool;}; -struct MUIP_List_CreateImage {STACKED ULONG MethodID; STACKED Object *obj; STACKED ULONG flags;}; -struct MUIP_List_DeleteImage {STACKED ULONG MethodID; STACKED APTR listimg;}; -struct MUIP_List_Destruct {STACKED ULONG MethodID; STACKED APTR entry; STACKED APTR pool;}; -struct MUIP_List_Display {STACKED ULONG MethodID; STACKED APTR entry; STACKED STRPTR *array; STACKED LONG entry_pos; STACKED STRPTR *preparses;}; -struct MUIP_List_Exchange {STACKED ULONG MethodID; STACKED LONG pos1; STACKED LONG pos2;}; -struct MUIP_List_GetEntry {STACKED ULONG MethodID; STACKED LONG pos; STACKED APTR *entry;}; -struct MUIP_List_Insert {STACKED ULONG MethodID; STACKED APTR *entries; STACKED LONG count; STACKED LONG pos;}; -struct MUIP_List_InsertSingle {STACKED ULONG MethodID; STACKED APTR entry; STACKED LONG pos;}; -struct MUIP_List_Jump {STACKED ULONG MethodID; STACKED LONG pos;}; -struct MUIP_List_Move {STACKED ULONG MethodID; STACKED LONG from; STACKED LONG to;}; -struct MUIP_List_NextSelected {STACKED ULONG MethodID; STACKED LONG *pos;}; -struct MUIP_List_Redraw {STACKED ULONG MethodID; STACKED LONG pos; STACKED APTR entry;}; -struct MUIP_List_Remove {STACKED ULONG MethodID; STACKED LONG pos;}; -struct MUIP_List_Select {STACKED ULONG MethodID; STACKED LONG pos; STACKED LONG seltype; STACKED LONG *state;}; -struct MUIP_List_Sort {STACKED ULONG MethodID;}; -struct MUIP_List_TestPos {STACKED ULONG MethodID; STACKED LONG x; STACKED LONG y; STACKED struct MUI_List_TestPos_Result *res;}; - -#define MUIM_List_SelectChange (MUIB_List | 0x00000004) /* Zune: V1 same like NLIST, PRIV for now! */ -struct MUIP_List_SelectChange {STACKED ULONG MethodID; STACKED LONG pos; STACKED LONG state; STACKED ULONG flags;}; - -/*** Attributes *************************************************************/ -#define MUIA_List_Active (MUIB_MUI|0x0042391c) /* MUI: V4 isg LONG */ -#define MUIA_List_AdjustHeight (MUIB_MUI|0x0042850d) /* MUI: V4 i.. BOOL */ -#define MUIA_List_AdjustWidth (MUIB_MUI|0x0042354a) /* MUI: V4 i.. BOOL */ -#define MUIA_List_AutoVisible (MUIB_MUI|0x0042a445) /* MUI: V11 isg BOOL */ -#define MUIA_List_CompareHook (MUIB_MUI|0x00425c14) /* MUI: V4 is. struct Hook * */ -#define MUIA_List_ConstructHook (MUIB_MUI|0x0042894f) /* MUI: V4 is. struct Hook * */ -#define MUIA_List_DestructHook (MUIB_MUI|0x004297ce) /* MUI: V4 is. struct Hook * */ -#define MUIA_List_DisplayHook (MUIB_MUI|0x0042b4d5) /* MUI: V4 is. struct Hook * */ -#define MUIA_List_DragSortable (MUIB_MUI|0x00426099) /* MUI: V11 isg BOOL */ -#define MUIA_List_DropMark (MUIB_MUI|0x0042aba6) /* MUI: V11 ..g LONG */ -#define MUIA_List_Entries (MUIB_MUI|0x00421654) /* MUI: V4 ..g LONG */ -#define MUIA_List_First (MUIB_MUI|0x004238d4) /* MUI: V4 ..g LONG */ -#define MUIA_List_Format (MUIB_MUI|0x00423c0a) /* MUI: V4 isg STRPTR */ -#define MUIA_List_InsertPosition (MUIB_MUI|0x0042d0cd) /* MUI: V9 ..g LONG */ -#define MUIA_List_MinLineHeight (MUIB_MUI|0x0042d1c3) /* MUI: V4 i.. LONG */ -#define MUIA_List_MultiTestHook (MUIB_MUI|0x0042c2c6) /* MUI: V4 is. struct Hook * */ -#define MUIA_List_Pool (MUIB_MUI|0x00423431) /* MUI: V13 i.. APTR */ -#define MUIA_List_PoolPuddleSize (MUIB_MUI|0x0042a4eb) /* MUI: V13 i.. ULONG */ -#define MUIA_List_PoolThreshSize (MUIB_MUI|0x0042c48c) /* MUI: V13 i.. ULONG */ -#define MUIA_List_Quiet (MUIB_MUI|0x0042d8c7) /* MUI: V4 .s. BOOL */ -#define MUIA_List_ShowDropMarks (MUIB_MUI|0x0042c6f3) /* MUI: V11 isg BOOL */ -#define MUIA_List_SourceArray (MUIB_MUI|0x0042c0a0) /* MUI: V4 i.. APTR */ -#define MUIA_List_Title (MUIB_MUI|0x00423e66) /* MUI: V6 isg char * */ -#define MUIA_List_Visible (MUIB_MUI|0x0042191f) /* MUI: V4 ..g LONG */ -#define MUIA_List_Prop_Entries (MUIB_MUI|0x0042a8f5) /* .sg LONG PRIV */ -#define MUIA_List_Prop_Visible (MUIB_MUI|0x004273e9) /* .sg LONG PRIV */ -#define MUIA_List_Prop_First (MUIB_MUI|0x00429df3) /* .sg LONG PRIV */ - -#define MUIA_List_VertProp_Entries MUIA_List_Prop_Entries /* PRIV */ -#define MUIA_List_VertProp_Visible MUIA_List_Prop_Visible /* PRIV */ -#define MUIA_List_VertProp_First MUIA_List_Prop_First /* PRIV */ -#define MUIA_List_HorizProp_Entries (MUIB_List | 0x00000000) /* ... LONG PRIV */ -#define MUIA_List_HorizProp_Visible (MUIB_List | 0x00000001) /* ... LONG PRIV */ -#define MUIA_List_HorizProp_First (MUIB_List | 0x00000002) /* ... LONG PRIV */ - -/* Structure of the List Position Text (MUIM_List_TestPos) */ -struct MUI_List_TestPos_Result -{ - LONG entry; /* entry number, maybe -1 if testpos is not over valid entry */ - WORD column; /* the number of the column, maybe -1 (unvalid) */ - UWORD flags; /* some flags, see below */ - WORD xoffset; /* x offset (in pixels) of testpos relative to the start of the column */ - WORD yoffset; /* y offset (in pixels) of testpos relative from center of line - ( <0 => testpos was above, >0 => testpos was below center) */ -}; - -#define MUI_LPR_ABOVE (1<<0) -#define MUI_LPR_BELOW (1<<1) -#define MUI_LPR_LEFT (1<<2) -#define MUI_LPR_RIGHT (1<<3) - -enum -{ - MUIV_List_Active_Off = -1, - MUIV_List_Active_Top = -2, - MUIV_List_Active_Bottom = -3, - MUIV_List_Active_Up = -4, - MUIV_List_Active_Down = -5, - MUIV_List_Active_PageUp = -6, - MUIV_List_Active_PageDown = -7, -}; - -#define MUIV_List_ConstructHook_String (IPTR)-1 -#define MUIV_List_CopyHook_String (IPTR)-1 -#define MUIV_List_CursorType_None 0 -#define MUIV_List_CursorType_Bar 1 -#define MUIV_List_CursorType_Rect 2 -#define MUIV_List_DestructHook_String (IPTR)-1 - -enum -{ - MUIV_List_Insert_Top = 0, - MUIV_List_Insert_Active = -1, - MUIV_List_Insert_Sorted = -2, - MUIV_List_Insert_Bottom = -3 -}; - -enum -{ - MUIV_List_Remove_First = 0, - MUIV_List_Remove_Active = -1, - MUIV_List_Remove_Last = -2, - MUIV_List_Remove_Selected = -3, -}; - -enum -{ - MUIV_List_Select_Active = -1, - MUIV_List_Select_All = -2, - - MUIV_List_Select_Off = 0, - MUIV_List_Select_On = 1, - MUIV_List_Select_Toggle = 2, - MUIV_List_Select_Ask = 3, -}; - -enum -{ - MUIV_List_GetEntry_Active = -1, -}; - -enum -{ - MUIV_List_Redraw_Active = -1, - MUIV_List_Redraw_All = -2, - MUIV_List_Redraw_Entry = -3, -}; - -enum -{ - MUIV_List_Move_Top = 0, - MUIV_List_Move_Active = -1, - MUIV_List_Move_Bottom = -2, - MUIV_List_Move_Next = -3, /* for 2nd parameter only */ - MUIV_List_Move_Previous = -4, /* for 2nd parameter only */ -}; - -enum -{ - MUIV_List_Exchange_Top = 0, - MUIV_List_Exchange_Active = -1, - MUIV_List_Exchange_Bottom = -2, - MUIV_List_Exchange_Next = -3, /* for 2nd parameter only */ - MUIV_List_Exchange_Previous = -4, /* for 2nd parameter only */ -}; - -enum -{ - MUIV_List_Jump_Top = 0, - MUIV_List_Jump_Active = -1, - MUIV_List_Jump_Bottom = -2, - MUIV_List_Jump_Down = -3, - MUIV_List_Jump_Up = -4, -}; - -#define MUIV_List_NextSelected_Start (-1) -#define MUIV_List_NextSelected_End (-1) - - -#define MUIV_NList_SelectChange_Flag_Multi (1 << 0) - - -extern const struct __MUIBuiltinClass _MUI_List_desc; /* PRIV */ - - - - -/****************************************************************************/ -/*** Name *******************************************************************/ -#define MUIC_Scrmodelist "Scrmodelist.mui" - -/*** Identifier base (for Zune extensions) **********************************/ -#define MUIB_Scrmodelist (MUIB_ZUNE | 0x00001700) - - - - - -#endif /* _MUI_CLASSES_LIST_H */ +#ifndef _MUI_CLASSES_LIST_H +#define _MUI_CLASSES_LIST_H + +/* + Copyright © 2002-2011, The AROS Development Team. All rights reserved. + $Id$ +*/ + +/****************************************************************************/ +/*** Name *******************************************************************/ +#define MUIC_List "List.mui" + +/*** Identifier base (for Zune extensions) **********************************/ +#define MUIB_List (MUIB_ZUNE | 0x00001400) + +/*** Methods ****************************************************************/ +#define MUIM_List_Clear (MUIB_MUI | 0x0042ad89) /* MUI: V4 */ +#define MUIM_List_Compare (MUIB_MUI | 0x00421b68) /* MUI: V20 */ +#define MUIM_List_Construct (MUIB_MUI | 0x0042d662) /* MUI: V20 */ +#define MUIM_List_CreateImage (MUIB_MUI | 0x00429804) /* MUI: V11 */ +#define MUIM_List_DeleteImage (MUIB_MUI | 0x00420f58) /* MUI: V11 */ +#define MUIM_List_Destruct (MUIB_MUI | 0x00427d51) /* MUI: V20 */ +#define MUIM_List_Display (MUIB_MUI | 0x00425377) /* MUI: V20 */ +#define MUIM_List_Exchange (MUIB_MUI | 0x0042468c) /* MUI: V4 */ +#define MUIM_List_GetEntry (MUIB_MUI | 0x004280ec) /* MUI: V4 */ +#define MUIM_List_Insert (MUIB_MUI | 0x00426c87) /* MUI: V4 */ +#define MUIM_List_InsertSingle (MUIB_MUI | 0x004254d5) /* MUI: V7 */ +#define MUIM_List_Jump (MUIB_MUI | 0x0042baab) /* MUI: V4 */ +#define MUIM_List_Move (MUIB_MUI | 0x004253c2) /* MUI: V9 */ +#define MUIM_List_NextSelected (MUIB_MUI | 0x00425f17) /* MUI: V6 */ +#define MUIM_List_Redraw (MUIB_MUI | 0x00427993) /* MUI: V4 */ +#define MUIM_List_Remove (MUIB_MUI | 0x0042647e) /* MUI: V4 */ +#define MUIM_List_Select (MUIB_MUI | 0x004252d8) /* MUI: V4 */ +#define MUIM_List_Sort (MUIB_MUI | 0x00422275) /* MUI: V4 */ +#define MUIM_List_TestPos (MUIB_MUI | 0x00425f48) /* MUI: V11 */ + +struct MUIP_List_Clear +{ + STACKED ULONG MethodID; +}; + +struct MUIP_List_Compare +{ + STACKED ULONG MethodID; + STACKED APTR entry1; + STACKED APTR entry2; + STACKED LONG sort_type1; + STACKED LONG sort_type2; +}; + +struct MUIP_List_Construct +{ + STACKED ULONG MethodID; + STACKED APTR entry; + STACKED APTR pool; +}; + +struct MUIP_List_CreateImage +{ + STACKED ULONG MethodID; + STACKED Object *obj; + STACKED ULONG flags; +}; + +struct MUIP_List_DeleteImage +{ + STACKED ULONG MethodID; + STACKED APTR listimg; +}; + +struct MUIP_List_Destruct +{ + STACKED ULONG MethodID; + STACKED APTR entry; + STACKED APTR pool; +}; + +struct MUIP_List_Display +{ + STACKED ULONG MethodID; + STACKED APTR entry; + STACKED STRPTR *array; + STACKED LONG entry_pos; + STACKED STRPTR *preparses; +}; + +struct MUIP_List_Exchange +{ + STACKED ULONG MethodID; + STACKED LONG pos1; + STACKED LONG pos2; +}; + +struct MUIP_List_GetEntry +{ + STACKED ULONG MethodID; + STACKED LONG pos; + STACKED APTR *entry; +}; + +struct MUIP_List_Insert +{ + STACKED ULONG MethodID; + STACKED APTR *entries; + STACKED LONG count; + STACKED LONG pos; +}; + +struct MUIP_List_InsertSingle +{ + STACKED ULONG MethodID; + STACKED APTR entry; + STACKED LONG pos; +}; + +struct MUIP_List_Jump +{ + STACKED ULONG MethodID; + STACKED LONG pos; +}; + +struct MUIP_List_Move +{ + STACKED ULONG MethodID; + STACKED LONG from; + STACKED LONG to; +}; + +struct MUIP_List_NextSelected +{ + STACKED ULONG MethodID; + STACKED LONG *pos; +}; + +struct MUIP_List_Redraw +{ + STACKED ULONG MethodID; + STACKED LONG pos; + STACKED APTR entry; +}; + +struct MUIP_List_Remove +{ + STACKED ULONG MethodID; + STACKED LONG pos; +}; + +struct MUIP_List_Select +{ + STACKED ULONG MethodID; + STACKED LONG pos; + STACKED LONG seltype; + STACKED LONG *state; +}; + +struct MUIP_List_Sort +{ + STACKED ULONG MethodID; +}; + +struct MUIP_List_TestPos +{ + STACKED ULONG MethodID; + STACKED LONG x; + STACKED LONG y; + STACKED struct MUI_List_TestPos_Result *res; +}; + +#define MUIM_List_SelectChange \ + (MUIB_List | 0x00000004) /* Zune: V1 same like NLIST, PRIV for now! */ + +struct MUIP_List_SelectChange +{ + STACKED ULONG MethodID; + STACKED LONG pos; + STACKED LONG state; + STACKED ULONG flags; +}; + +/*** Attributes *************************************************************/ +#define MUIA_List_Active \ + (MUIB_MUI | 0x0042391c) /* MUI: V4 isg LONG */ +#define MUIA_List_AdjustHeight \ + (MUIB_MUI | 0x0042850d) /* MUI: V4 i.. BOOL */ +#define MUIA_List_AdjustWidth \ + (MUIB_MUI | 0x0042354a) /* MUI: V4 i.. BOOL */ +#define MUIA_List_AutoVisible \ + (MUIB_MUI | 0x0042a445) /* MUI: V11 isg BOOL */ +#define MUIA_List_CompareHook \ + (MUIB_MUI | 0x00425c14) /* MUI: V4 is. struct Hook * */ +#define MUIA_List_ConstructHook \ + (MUIB_MUI | 0x0042894f) /* MUI: V4 is. struct Hook * */ +#define MUIA_List_DestructHook \ + (MUIB_MUI | 0x004297ce) /* MUI: V4 is. struct Hook * */ +#define MUIA_List_DisplayHook \ + (MUIB_MUI | 0x0042b4d5) /* MUI: V4 is. struct Hook * */ +#define MUIA_List_DragSortable \ + (MUIB_MUI | 0x00426099) /* MUI: V11 isg BOOL */ +#define MUIA_List_DropMark \ + (MUIB_MUI | 0x0042aba6) /* MUI: V11 ..g LONG */ +#define MUIA_List_Entries \ + (MUIB_MUI | 0x00421654) /* MUI: V4 ..g LONG */ +#define MUIA_List_First \ + (MUIB_MUI | 0x004238d4) /* MUI: V4 ..g LONG */ +#define MUIA_List_Format \ + (MUIB_MUI | 0x00423c0a) /* MUI: V4 isg STRPTR */ +#define MUIA_List_InsertPosition \ + (MUIB_MUI | 0x0042d0cd) /* MUI: V9 ..g LONG */ +#define MUIA_List_MinLineHeight \ + (MUIB_MUI | 0x0042d1c3) /* MUI: V4 i.. LONG */ +#define MUIA_List_MultiTestHook \ + (MUIB_MUI | 0x0042c2c6) /* MUI: V4 is. struct Hook * */ +#define MUIA_List_Pool \ + (MUIB_MUI | 0x00423431) /* MUI: V13 i.. APTR */ +#define MUIA_List_PoolPuddleSize \ + (MUIB_MUI | 0x0042a4eb) /* MUI: V13 i.. ULONG */ +#define MUIA_List_PoolThreshSize \ + (MUIB_MUI | 0x0042c48c) /* MUI: V13 i.. ULONG */ +#define MUIA_List_Quiet \ + (MUIB_MUI | 0x0042d8c7) /* MUI: V4 .s. BOOL */ +#define MUIA_List_ShowDropMarks \ + (MUIB_MUI | 0x0042c6f3) /* MUI: V11 isg BOOL */ +#define MUIA_List_SourceArray \ + (MUIB_MUI | 0x0042c0a0) /* MUI: V4 i.. APTR */ +#define MUIA_List_Title \ + (MUIB_MUI | 0x00423e66) /* MUI: V6 isg char * */ +#define MUIA_List_Visible \ + (MUIB_MUI | 0x0042191f) /* MUI: V4 ..g LONG */ +#define MUIA_List_Prop_Entries \ + (MUIB_MUI | 0x0042a8f5) /* .sg LONG PRIV */ +#define MUIA_List_Prop_Visible \ + (MUIB_MUI | 0x004273e9) /* .sg LONG PRIV */ +#define MUIA_List_Prop_First \ + (MUIB_MUI | 0x00429df3) /* .sg LONG PRIV */ + +#define MUIA_List_VertProp_Entries \ + MUIA_List_Prop_Entries /* PRIV */ +#define MUIA_List_VertProp_Visible \ + MUIA_List_Prop_Visible /* PRIV */ +#define MUIA_List_VertProp_First \ + MUIA_List_Prop_First /* PRIV */ +#define MUIA_List_HorizProp_Entries \ + (MUIB_List | 0x00000000) /* ... LONG PRIV */ +#define MUIA_List_HorizProp_Visible \ + (MUIB_List | 0x00000001) /* ... LONG PRIV */ +#define MUIA_List_HorizProp_First \ + (MUIB_List | 0x00000002) /* ... LONG PRIV */ + +/* Structure of the List Position Text (MUIM_List_TestPos) */ +struct MUI_List_TestPos_Result +{ + LONG entry; /* entry number, maybe -1 if testpos is not over valid + * entry */ + WORD column; /* the number of the column, maybe -1 (unvalid) */ + UWORD flags; /* some flags, see below */ + WORD xoffset; /* x offset (in pixels) of testpos relative to the start + * of the column */ + WORD yoffset; /* y offset (in pixels) of testpos relative from center + * of line( <0 => testpos was above, >0 => testpos was + * below center) */ +}; + +#define MUI_LPR_ABOVE (1<<0) +#define MUI_LPR_BELOW (1<<1) +#define MUI_LPR_LEFT (1<<2) +#define MUI_LPR_RIGHT (1<<3) + +enum +{ + MUIV_List_Active_Off = -1, + MUIV_List_Active_Top = -2, + MUIV_List_Active_Bottom = -3, + MUIV_List_Active_Up = -4, + MUIV_List_Active_Down = -5, + MUIV_List_Active_PageUp = -6, + MUIV_List_Active_PageDown = -7, +}; + +#define MUIV_List_ConstructHook_String (IPTR)-1 +#define MUIV_List_CopyHook_String (IPTR)-1 +#define MUIV_List_CursorType_None 0 +#define MUIV_List_CursorType_Bar 1 +#define MUIV_List_CursorType_Rect 2 +#define MUIV_List_DestructHook_String (IPTR)-1 + +enum +{ + MUIV_List_Insert_Top = 0, + MUIV_List_Insert_Active = -1, + MUIV_List_Insert_Sorted = -2, + MUIV_List_Insert_Bottom = -3 +}; + +enum +{ + MUIV_List_Remove_First = 0, + MUIV_List_Remove_Active = -1, + MUIV_List_Remove_Last = -2, + MUIV_List_Remove_Selected = -3, +}; + +enum +{ + MUIV_List_Select_Active = -1, + MUIV_List_Select_All = -2, + + MUIV_List_Select_Off = 0, + MUIV_List_Select_On = 1, + MUIV_List_Select_Toggle = 2, + MUIV_List_Select_Ask = 3, +}; + +enum +{ + MUIV_List_GetEntry_Active = -1, +}; + +enum +{ + MUIV_List_Redraw_Active = -1, + MUIV_List_Redraw_All = -2, + MUIV_List_Redraw_Entry = -3, +}; + +enum +{ + MUIV_List_Move_Top = 0, + MUIV_List_Move_Active = -1, + MUIV_List_Move_Bottom = -2, + MUIV_List_Move_Next = -3, /* for 2nd parameter only */ + MUIV_List_Move_Previous = -4, /* for 2nd parameter only */ +}; + +enum +{ + MUIV_List_Exchange_Top = 0, + MUIV_List_Exchange_Active = -1, + MUIV_List_Exchange_Bottom = -2, + MUIV_List_Exchange_Next = -3, /* for 2nd parameter only */ + MUIV_List_Exchange_Previous = -4, /* for 2nd parameter only */ +}; + +enum +{ + MUIV_List_Jump_Top = 0, + MUIV_List_Jump_Active = -1, + MUIV_List_Jump_Bottom = -2, + MUIV_List_Jump_Down = -3, + MUIV_List_Jump_Up = -4, +}; + +#define MUIV_List_NextSelected_Start (-1) +#define MUIV_List_NextSelected_End (-1) + + +#define MUIV_NList_SelectChange_Flag_Multi (1 << 0) + + +extern const struct __MUIBuiltinClass _MUI_List_desc; /* PRIV */ + + + + +/****************************************************************************/ +/*** Name *******************************************************************/ +#define MUIC_Scrmodelist "Scrmodelist.mui" + +/*** Identifier base (for Zune extensions) **********************************/ +#define MUIB_Scrmodelist (MUIB_ZUNE | 0x00001700) + +#endif /* _MUI_CLASSES_LIST_H */ diff --git a/workbench/libs/muimaster/classes/listview.c b/workbench/libs/muimaster/classes/listview.c index 7cd497d9d7..7ff3b0c1bb 100644 --- a/workbench/libs/muimaster/classes/listview.c +++ b/workbench/libs/muimaster/classes/listview.c @@ -2,6 +2,7 @@ Copyright © 2002-2012, The AROS Development Team. All rights reserved. $Id$ */ + #include <aros/debug.h> #include <graphics/gfx.h> @@ -28,33 +29,43 @@ struct MUI_ListviewData BOOL noforward; }; -ULONG Listview_Layout_Function(struct Hook *hook, Object *obj, struct MUI_LayoutMsg *lm) +ULONG Listview_Layout_Function(struct Hook *hook, Object *obj, + struct MUI_LayoutMsg *lm) { struct MUI_ListviewData *data = (struct MUI_ListviewData *)hook->h_Data; switch (lm->lm_Type) { - case MUILM_MINMAX: + case MUILM_MINMAX: { /* Calculate the minmax dimension of the group, - ** We only have a fixed number of children, so we need no NextObject() - */ - lm->lm_MinMax.MinWidth = _minwidth(data->list) + _minwidth(data->vert); - lm->lm_MinMax.DefWidth = _defwidth(data->list) + _defwidth(data->vert); - lm->lm_MinMax.MaxWidth = _maxwidth(data->list) + _maxwidth(data->vert); - lm->lm_MinMax.MaxWidth = MIN(lm->lm_MinMax.MaxWidth, MUI_MAXMAX); - - lm->lm_MinMax.MinHeight = MAX(_minheight(data->list), _minheight(data->vert)); - lm->lm_MinMax.DefHeight = MAX(_defheight(data->list), lm->lm_MinMax.MinHeight); - lm->lm_MinMax.MaxHeight = MIN(_maxheight(data->list), _maxheight(data->vert)); - lm->lm_MinMax.MaxHeight = MIN(lm->lm_MinMax.MaxHeight, MUI_MAXMAX); + ** We only have a fixed number of children, so we need + ** no NextObject() + */ + lm->lm_MinMax.MinWidth = + _minwidth(data->list) + _minwidth(data->vert); + lm->lm_MinMax.DefWidth = + _defwidth(data->list) + _defwidth(data->vert); + lm->lm_MinMax.MaxWidth = + _maxwidth(data->list) + _maxwidth(data->vert); + lm->lm_MinMax.MaxWidth = + MIN(lm->lm_MinMax.MaxWidth, MUI_MAXMAX); + + lm->lm_MinMax.MinHeight = + MAX(_minheight(data->list), _minheight(data->vert)); + lm->lm_MinMax.DefHeight = + MAX(_defheight(data->list), lm->lm_MinMax.MinHeight); + lm->lm_MinMax.MaxHeight = + MIN(_maxheight(data->list), _maxheight(data->vert)); + lm->lm_MinMax.MaxHeight = + MIN(lm->lm_MinMax.MaxHeight, MUI_MAXMAX); return 0; } - case MUILM_LAYOUT: + case MUILM_LAYOUT: { /* Now place the objects between * (0, 0, lm->lm_Layout.Width - 1, lm->lm_Layout.Height - 1) - */ + */ LONG vert_width = _minwidth(data->vert); LONG lay_width = lm->lm_Layout.Width; @@ -63,11 +74,13 @@ ULONG Listview_Layout_Function(struct Hook *hook, Object *obj, struct MUI_Layout LONG cont_height; /* We need all scrollbars and the button */ - set(data->vert, MUIA_ShowMe, TRUE); /* We could also overload MUIM_Show... */ + set(data->vert, MUIA_ShowMe, TRUE); + /* We could also overload MUIM_Show... */ cont_width = lay_width - vert_width; cont_height = lay_height; - MUI_Layout(data->vert, cont_width, 0, vert_width, cont_height,0); + MUI_Layout(data->vert, cont_width, 0, vert_width, cont_height, + 0); /* Layout the group a second time, note that setting _mwidth() and _mheight() should be enough, or we invent a new flag */ @@ -86,24 +99,28 @@ ULONG Listview_Layout_Function(struct Hook *hook, Object *obj, struct MUI_Layout ULONG Listview_Function(struct Hook *hook, APTR dummyobj, void **msg) { struct MUI_ListviewData *data = (struct MUI_ListviewData *)hook->h_Data; - SIPTR type = (SIPTR)msg[0]; - SIPTR val = (SIPTR)msg[1]; + SIPTR type = (SIPTR) msg[0]; + SIPTR val = (SIPTR) msg[1]; - D(bug("[ListView] List 0x%p, Event %d, value %ld\n", data->list, type, val)); + D(bug("[ListView] List 0x%p, Event %d, value %ld\n", data->list, type, + val)); switch (type) { - case PROP_VERT_FIRST: - get(data->vert,MUIA_Prop_First,&val); - nnset(data->list,MUIA_List_VertProp_First,val); - break; - - case LIST_VERT_FIRST: - nnset(data->vert, MUIA_Prop_First, val); break; - case LIST_VERT_VISIBLE: - nnset(data->vert, MUIA_Prop_Visible, val); break; - case LIST_VERT_ENTRIES: - nnset(data->vert, MUIA_Prop_Entries, val); break; + case PROP_VERT_FIRST: + get(data->vert, MUIA_Prop_First, &val); + nnset(data->list, MUIA_List_VertProp_First, val); + break; + + case LIST_VERT_FIRST: + nnset(data->vert, MUIA_Prop_First, val); + break; + case LIST_VERT_VISIBLE: + nnset(data->vert, MUIA_Prop_Visible, val); + break; + case LIST_VERT_ENTRIES: + nnset(data->vert, MUIA_Prop_Entries, val); + break; } return 0; } @@ -111,8 +128,8 @@ ULONG Listview_Function(struct Hook *hook, APTR dummyobj, void **msg) ULONG SelfNotify_Function(struct Hook *hook, APTR obj, void **msg) { struct MUI_ListviewData *data = (struct MUI_ListviewData *)hook->h_Data; - SIPTR attribute = (SIPTR)msg[0]; - SIPTR value = (SIPTR)msg[1]; + SIPTR attribute = (SIPTR) msg[0]; + SIPTR value = (SIPTR) msg[1]; /* This allows avoiding notify loops */ data->noforward = TRUE; @@ -127,22 +144,27 @@ ULONG SelfNotify_Function(struct Hook *hook, APTR obj, void **msg) **************************************************************************/ IPTR Listview__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) { - struct MUI_ListviewData *data; + struct MUI_ListviewData *data; struct TagItem *tag, *tags; struct Hook *layout_hook; Object *group, *vert; - Object *list = (Object*)GetTagData(MUIA_Listview_List, (IPTR)NULL, msg->ops_AttrList); - IPTR cyclechain = (IPTR)GetTagData(MUIA_CycleChain, (IPTR)0, msg->ops_AttrList); - LONG entries = 0,first = 0,visible = 0; - if (!list) return (IPTR)NULL; + Object *list = + (Object *) GetTagData(MUIA_Listview_List, (IPTR) NULL, + msg->ops_AttrList); + IPTR cyclechain = + (IPTR) GetTagData(MUIA_CycleChain, (IPTR) 0, msg->ops_AttrList); + LONG entries = 0, first = 0, visible = 0; + if (!list) + return (IPTR) NULL; layout_hook = mui_alloc_struct(struct Hook); - if (!layout_hook) return (IPTR)NULL; + if (!layout_hook) + return (IPTR) NULL; layout_hook->h_Entry = HookEntry; - layout_hook->h_SubEntry = (HOOKFUNC)Listview_Layout_Function; + layout_hook->h_SubEntry = (HOOKFUNC) Listview_Layout_Function; - obj = (Object *)DoSuperNewTags(cl, obj, NULL, + obj = (Object *) DoSuperNewTags(cl, obj, NULL, MUIA_Group_Horiz, FALSE, MUIA_CycleChain, cyclechain, MUIA_InnerLeft, 0, @@ -152,14 +174,14 @@ IPTR Listview__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) MUIA_InnerRight, 0, MUIA_Group_LayoutHook, (IPTR) layout_hook, Child, (IPTR) list, - Child, (IPTR) (vert = ScrollbarObject, MUIA_Group_Horiz, FALSE, End), - End), + Child, (IPTR) (vert = + ScrollbarObject, MUIA_Group_Horiz, FALSE, End), End), TAG_DONE); if (!obj) { mui_free(layout_hook); - return (IPTR)NULL; + return (IPTR) NULL; } data = INST_DATA(cl, obj); @@ -170,50 +192,51 @@ IPTR Listview__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) data->layout_hook = layout_hook; data->hook.h_Entry = HookEntry; - data->hook.h_SubEntry = (HOOKFUNC)Listview_Function; + data->hook.h_SubEntry = (HOOKFUNC) Listview_Function; data->hook.h_Data = data; data->selfnofity_hook.h_Entry = HookEntry; - data->selfnofity_hook.h_SubEntry = (HOOKFUNC)SelfNotify_Function; + data->selfnofity_hook.h_SubEntry = (HOOKFUNC) SelfNotify_Function; data->selfnofity_hook.h_Data = data; data->noforward = FALSE; /* parse initial taglist */ - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) { switch (tag->ti_Tag) { - } + } } - get(list,MUIA_List_VertProp_First,&first); - get(list,MUIA_List_VertProp_Visible,&visible); - get(list,MUIA_List_VertProp_Entries,&entries); + get(list, MUIA_List_VertProp_First, &first); + get(list, MUIA_List_VertProp_Visible, &visible); + get(list, MUIA_List_VertProp_Entries, &entries); - D(bug("[ListView 0x%p] List 0x%p, First %ld, Visible %ld, Entries %ld\n", obj, list, first, visible, entries)); + D(bug + ("[ListView 0x%p] List 0x%p, First %ld, Visible %ld, Entries %ld\n", + obj, list, first, visible, entries)); SetAttrs(data->vert, MUIA_Prop_First, first, - MUIA_Prop_Visible, visible, - MUIA_Prop_Entries, entries, - TAG_DONE); + MUIA_Prop_Visible, visible, MUIA_Prop_Entries, entries, TAG_DONE); - DoMethod(vert, MUIM_Notify, MUIA_Prop_First, MUIV_EveryTime, (IPTR)obj, 4, - MUIM_CallHook, (IPTR)&data->hook, PROP_VERT_FIRST, MUIV_TriggerValue); + DoMethod(vert, MUIM_Notify, MUIA_Prop_First, MUIV_EveryTime, (IPTR) obj, + 4, MUIM_CallHook, (IPTR) & data->hook, PROP_VERT_FIRST, + MUIV_TriggerValue); DoMethod(list, MUIM_Notify, MUIA_List_VertProp_First, MUIV_EveryTime, - (IPTR)obj, 4, MUIM_CallHook, (IPTR)&data->hook, LIST_VERT_FIRST, - MUIV_TriggerValue); + (IPTR) obj, 4, MUIM_CallHook, (IPTR) & data->hook, LIST_VERT_FIRST, + MUIV_TriggerValue); DoMethod(list, MUIM_Notify, MUIA_List_VertProp_Visible, MUIV_EveryTime, - (IPTR)obj, 4, MUIM_CallHook, (IPTR)&data->hook, LIST_VERT_VISIBLE, - MUIV_TriggerValue); + (IPTR) obj, 4, MUIM_CallHook, (IPTR) & data->hook, + LIST_VERT_VISIBLE, MUIV_TriggerValue); DoMethod(list, MUIM_Notify, MUIA_List_VertProp_Entries, MUIV_EveryTime, - (IPTR)obj, 4, MUIM_CallHook, (IPTR)&data->hook, LIST_VERT_ENTRIES, - MUIV_TriggerValue); + (IPTR) obj, 4, MUIM_CallHook, (IPTR) & data->hook, + LIST_VERT_ENTRIES, MUIV_TriggerValue); DoMethod(list, MUIM_Notify, MUIA_List_Active, MUIV_EveryTime, - (IPTR)obj, 4, MUIM_CallHook, (IPTR)&data->selfnofity_hook, MUIA_List_Active, - MUIV_TriggerValue); + (IPTR) obj, 4, MUIM_CallHook, (IPTR) & data->selfnofity_hook, + MUIA_List_Active, MUIV_TriggerValue); - return (IPTR)obj; + return (IPTR) obj; } /************************************************************************** @@ -223,7 +246,7 @@ IPTR Listview__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) { struct MUI_ListviewData *data = INST_DATA(cl, obj); - mui_free(data->layout_hook); /* is always here */ + mui_free(data->layout_hook); /* is always here */ return DoSuperMethodA(cl, obj, msg); } @@ -232,37 +255,38 @@ IPTR Listview__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) **************************************************************************/ void ListView__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) { - struct TagItem *tag, *tags; + struct TagItem *tag, *tags; IPTR no_notify = GetTagData(MUIA_NoNotify, FALSE, msg->ops_AttrList); struct MUI_ListviewData *data = INST_DATA(cl, obj); if (data->noforward) { - DoSuperMethodA(cl, obj, (Msg)msg); + DoSuperMethodA(cl, obj, (Msg) msg); return; } - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) { switch (tag->ti_Tag) { - case MUIA_List_CompareHook: - case MUIA_List_ConstructHook: - case MUIA_List_DestructHook: - case MUIA_List_DisplayHook: - case MUIA_List_VertProp_First: - case MUIA_List_Format: - case MUIA_List_VertProp_Entries: - case MUIA_List_VertProp_Visible: - case MUIA_List_Active: - case MUIA_List_First: - case MUIA_List_Visible: - case MUIA_List_Entries: - case MUIA_List_Quiet: + case MUIA_List_CompareHook: + case MUIA_List_ConstructHook: + case MUIA_List_DestructHook: + case MUIA_List_DisplayHook: + case MUIA_List_VertProp_First: + case MUIA_List_Format: + case MUIA_List_VertProp_Entries: + case MUIA_List_VertProp_Visible: + case MUIA_List_Active: + case MUIA_List_First: + case MUIA_List_Visible: + case MUIA_List_Entries: + case MUIA_List_Quiet: { struct MUI_ListviewData *data = INST_DATA(cl, obj); - - SetAttrs(data->list, MUIA_NoNotify, no_notify, tag->ti_Tag, tag->ti_Data, TAG_DONE); + + SetAttrs(data->list, MUIA_NoNotify, no_notify, tag->ti_Tag, + tag->ti_Data, TAG_DONE); } } } @@ -279,25 +303,27 @@ IPTR ListView__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) switch (msg->opg_AttrID) { - case MUIA_List_CompareHook: - case MUIA_List_ConstructHook: - case MUIA_List_DestructHook: - case MUIA_List_DisplayHook: - case MUIA_List_VertProp_First: - case MUIA_List_Format: - case MUIA_List_VertProp_Entries: - case MUIA_List_VertProp_Visible: - case MUIA_List_Active: - case MUIA_List_First: - case MUIA_List_Visible: - case MUIA_List_Entries: - case MUIA_List_Quiet: + case MUIA_List_CompareHook: + case MUIA_List_ConstructHook: + case MUIA_List_DestructHook: + case MUIA_List_DisplayHook: + case MUIA_List_VertProp_First: + case MUIA_List_Format: + case MUIA_List_VertProp_Entries: + case MUIA_List_VertProp_Visible: + case MUIA_List_Active: + case MUIA_List_First: + case MUIA_List_Visible: + case MUIA_List_Entries: + case MUIA_List_Quiet: { struct MUI_ListviewData *data = INST_DATA(cl, obj); - + return GetAttr(msg->opg_AttrID, data->list, msg->opg_Storage); } - case MUIA_Listview_List: STORE = (IPTR)data->list; return 1; + case MUIA_Listview_List: + STORE = (IPTR) data->list; + return 1; } return DoSuperMethodA(cl, obj, (Msg) msg); @@ -308,34 +334,37 @@ BOOPSI_DISPATCHER(IPTR, Listview_Dispatcher, cl, obj, msg) { switch (msg->MethodID) { - case OM_SET: - ListView__OM_SET(cl, obj, (struct opSet *)msg); - break; - case OM_GET: return ListView__OM_GET(cl, obj, (struct opGet *)msg); - case OM_NEW: return Listview__OM_NEW(cl, obj, (struct opSet *)msg); - case OM_DISPOSE: return Listview__OM_DISPOSE(cl,obj,msg); - case MUIM_List_Clear: - case MUIM_List_CreateImage: - case MUIM_List_DeleteImage: - case MUIM_List_Exchange: - case MUIM_List_GetEntry: - case MUIM_List_Insert: - case MUIM_List_InsertSingle: - case MUIM_List_Jump: - case MUIM_List_NextSelected: - case MUIM_List_Redraw: - case MUIM_List_Remove: - case MUIM_List_Select: - case MUIM_List_Sort: - case MUIM_List_TestPos: + case OM_SET: + ListView__OM_SET(cl, obj, (struct opSet *)msg); + break; + case OM_GET: + return ListView__OM_GET(cl, obj, (struct opGet *)msg); + case OM_NEW: + return Listview__OM_NEW(cl, obj, (struct opSet *)msg); + case OM_DISPOSE: + return Listview__OM_DISPOSE(cl, obj, msg); + case MUIM_List_Clear: + case MUIM_List_CreateImage: + case MUIM_List_DeleteImage: + case MUIM_List_Exchange: + case MUIM_List_GetEntry: + case MUIM_List_Insert: + case MUIM_List_InsertSingle: + case MUIM_List_Jump: + case MUIM_List_NextSelected: + case MUIM_List_Redraw: + case MUIM_List_Remove: + case MUIM_List_Select: + case MUIM_List_Sort: + case MUIM_List_TestPos: { struct MUI_ListviewData *data = INST_DATA(cl, obj); - + return DoMethodA(data->list, msg); } - + } - + return DoSuperMethodA(cl, obj, msg); } BOOPSI_DISPATCHER_END @@ -343,10 +372,10 @@ BOOPSI_DISPATCHER_END /* * Class descriptor. */ -const struct __MUIBuiltinClass _MUI_Listview_desc = { - MUIC_Listview, - MUIC_Group, - sizeof(struct MUI_ListviewData), - (void*)Listview_Dispatcher +const struct __MUIBuiltinClass _MUI_Listview_desc = +{ + MUIC_Listview, + MUIC_Group, + sizeof(struct MUI_ListviewData), + (void *) Listview_Dispatcher }; - diff --git a/workbench/libs/muimaster/classes/listview.h b/workbench/libs/muimaster/classes/listview.h index 2c1b49bd29..4cfbdfd041 100644 --- a/workbench/libs/muimaster/classes/listview.h +++ b/workbench/libs/muimaster/classes/listview.h @@ -13,15 +13,24 @@ #define MUIB_Listview (MUIB_ZUNE | 0x00001900) /*** Attributes *************************************************************/ -#define MUIA_Listview_ClickColumn (MUIB_MUI|0x0042d1b3) /* V7 ..g LONG */ -#define MUIA_Listview_DefClickColumn (MUIB_MUI|0x0042b296) /* V7 isg LONG */ -#define MUIA_Listview_DoubleClick (MUIB_MUI|0x00424635) /* V4 i.g BOOL */ -#define MUIA_Listview_DragType (MUIB_MUI|0x00425cd3) /* V11 isg LONG */ -#define MUIA_Listview_Input (MUIB_MUI|0x0042682d) /* V4 i.. BOOL */ -#define MUIA_Listview_List (MUIB_MUI|0x0042bcce) /* V4 i.g Object */ -#define MUIA_Listview_MultiSelect (MUIB_MUI|0x00427e08) /* V7 i.. LONG */ -#define MUIA_Listview_ScrollerPos (MUIB_MUI|0x0042b1b4) /* V10 i.. BOOL */ -#define MUIA_Listview_SelectChange (MUIB_MUI|0x0042178f) /* V4 ..g BOOL */ +#define MUIA_Listview_ClickColumn \ + (MUIB_MUI | 0x0042d1b3) /* V7 ..g LONG */ +#define MUIA_Listview_DefClickColumn \ + (MUIB_MUI | 0x0042b296) /* V7 isg LONG */ +#define MUIA_Listview_DoubleClick \ + (MUIB_MUI | 0x00424635) /* V4 i.g BOOL */ +#define MUIA_Listview_DragType \ + (MUIB_MUI | 0x00425cd3) /* V11 isg LONG */ +#define MUIA_Listview_Input \ + (MUIB_MUI | 0x0042682d) /* V4 i.. BOOL */ +#define MUIA_Listview_List \ + (MUIB_MUI | 0x0042bcce) /* V4 i.g Object */ +#define MUIA_Listview_MultiSelect \ + (MUIB_MUI | 0x00427e08) /* V7 i.. LONG */ +#define MUIA_Listview_ScrollerPos \ + (MUIB_MUI | 0x0042b1b4) /* V10 i.. BOOL */ +#define MUIA_Listview_SelectChange \ + (MUIB_MUI | 0x0042178f) /* V4 ..g BOOL */ enum { @@ -46,6 +55,6 @@ enum }; -extern const struct __MUIBuiltinClass _MUI_Listview_desc; /* PRIV */ +extern const struct __MUIBuiltinClass _MUI_Listview_desc; /* PRIV */ #endif /* _CLASSES_LISTVIEW_H */ diff --git a/workbench/libs/muimaster/classes/mccprefs.c b/workbench/libs/muimaster/classes/mccprefs.c index 530f85e2de..71479d75b9 100644 --- a/workbench/libs/muimaster/classes/mccprefs.c +++ b/workbench/libs/muimaster/classes/mccprefs.c @@ -20,7 +20,7 @@ extern struct Library *MUIMasterBase; struct MUI_MccprefsData { - LONG dummy; + LONG dummy; }; /************************************************************************** @@ -28,22 +28,22 @@ struct MUI_MccprefsData **************************************************************************/ IPTR Mccprefs__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) { - struct TagItem *tag, *tags; + struct TagItem *tag, *tags; - obj = (Object *)DoSuperMethodA(cl, obj, (Msg)msg); + obj = (Object *) DoSuperMethodA(cl, obj, (Msg) msg); if (!obj) - return FALSE; + return FALSE; /* parse initial taglist */ - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) { - switch (tag->ti_Tag) - { - } + switch (tag->ti_Tag) + { + } } - return (IPTR)obj; + return (IPTR) obj; } @@ -51,9 +51,10 @@ BOOPSI_DISPATCHER(IPTR, Mccprefs_Dispatcher, cl, obj, msg) { switch (msg->MethodID) { - case OM_NEW: return Mccprefs__OM_NEW(cl, obj, (struct opSet *)msg); + case OM_NEW: + return Mccprefs__OM_NEW(cl, obj, (struct opSet *)msg); } - + return DoSuperMethodA(cl, obj, msg); } BOOPSI_DISPATCHER_END @@ -61,10 +62,10 @@ BOOPSI_DISPATCHER_END /* * Class descriptor. */ -const struct __MUIBuiltinClass _MUI_Mccprefs_desc = { - MUIC_Mccprefs, +const struct __MUIBuiltinClass _MUI_Mccprefs_desc = +{ + MUIC_Mccprefs, MUIC_Group, - sizeof(struct MUI_MccprefsData), - (void*)Mccprefs_Dispatcher + sizeof(struct MUI_MccprefsData), + (void *) Mccprefs_Dispatcher }; - diff --git a/workbench/libs/muimaster/classes/mccprefs.h b/workbench/libs/muimaster/classes/mccprefs.h index d570dd0302..101efed8b3 100644 --- a/workbench/libs/muimaster/classes/mccprefs.h +++ b/workbench/libs/muimaster/classes/mccprefs.h @@ -8,6 +8,6 @@ #define MUIC_Mccprefs "Mccprefs.mui" -extern const struct __MUIBuiltinClass _MUI_Mccprefs_desc; /* PRIV */ +extern const struct __MUIBuiltinClass _MUI_Mccprefs_desc; /* PRIV */ #endif diff --git a/workbench/libs/muimaster/classes/menuitem.c b/workbench/libs/muimaster/classes/menuitem.c dissimilarity index 63% index 2b2119f808..c49135191e 100644 --- a/workbench/libs/muimaster/classes/menuitem.c +++ b/workbench/libs/muimaster/classes/menuitem.c @@ -1,498 +1,525 @@ -/* - Copyright © 2002-2007, The AROS Development Team. All rights reserved. - $Id$ -*/ - -#include <exec/memory.h> -#include <intuition/icclass.h> -#include <intuition/gadgetclass.h> -#include <libraries/gadtools.h> -#include <clib/alib_protos.h> -#include <proto/exec.h> -#include <proto/intuition.h> -#include <proto/utility.h> -#include <proto/muimaster.h> - -/* #define MYDEBUG 1 */ -#include "debug.h" -#include "mui.h" -#include "muimaster_intern.h" -#include "support.h" - -extern struct Library *MUIMasterBase; - -#define MENUF_CHECKED (1<<0) -#define MENUF_CHECKIT (1<<1) -#define MENUF_COMMANDSTRING (1<<2) -#define MENUF_ENABLED (1<<3) -#define MENUF_TOGGLE (1<<4) - -struct MUI_MenuitemData -{ - ULONG flags; - ULONG exclude; - - char *shortcut; - char *title; - - struct NewMenu *newmenu; - - struct MenuItem *trigger; -}; - -static int Menuitem_GetTotalChildren(Object *obj) -{ - Object *cstate; - Object *child; - struct MinList *ChildList = NULL; - int num = 0; - - get(obj, MUIA_Family_List, &ChildList); - cstate = (Object *)ChildList->mlh_Head; - while ((child = NextObject(&cstate))) - { - num++; - num += Menuitem_GetTotalChildren(child); - } - return num; -} - -static int Menuitem_FillNewMenu(Object *obj, struct NewMenu *menu, int depth) -{ - Object *cstate; - Object *child; - struct MinList *ChildList = NULL; - int num = 0; - - if (depth > 2) return 0; - - get(obj, MUIA_Family_List, &ChildList); - cstate = (Object *)ChildList->mlh_Head; - while ((child = NextObject(&cstate))) - { - int entries; - ULONG checkit = 0, checked = 0, toggle = 0, enabled = 0; - - get(child, MUIA_Menuitem_Title, &menu->nm_Label); - get(child, MUIA_Menuitem_Shortcut, &menu->nm_CommKey); - get(child, MUIA_Menuitem_Checkit, &checkit); - get(child, MUIA_Menuitem_Checked, &checked); - get(child, MUIA_Menuitem_Toggle, &toggle); - get(child, MUIA_Menuitem_Enabled, &enabled); - if (checkit) menu->nm_Flags |= CHECKIT; - if (checked) menu->nm_Flags |= CHECKED; - if (toggle) menu->nm_Flags |= MENUTOGGLE; - get(child, MUIA_Menuitem_Exclude, &menu->nm_MutualExclude); - - if (depth == 0) - { - menu->nm_Type = NM_TITLE; - if ( ! enabled) menu->nm_Flags |= NM_MENUDISABLED; - } - else if (depth == 1) - { - menu->nm_Type = NM_ITEM; - if ( ! enabled) menu->nm_Flags |= NM_ITEMDISABLED; - } - else if (depth == 2) - { - menu->nm_Type = NM_SUB; - if ( ! enabled) menu->nm_Flags |= NM_ITEMDISABLED; - } - - menu->nm_UserData = child; - - menu++; - num++; - entries = Menuitem_FillNewMenu(child,menu,depth+1); - - menu += entries; - num += entries; - } - return num; -} - -/************************************************************************** - ... -**************************************************************************/ -static struct NewMenu *Menuitem_BuildNewMenu(struct MUI_MenuitemData *data, Object *obj) -{ - int entries = Menuitem_GetTotalChildren(obj); - if (data->newmenu) FreeVec(data->newmenu); - data->newmenu = NULL; - if (!entries) return NULL; - - if ((data->newmenu = (struct NewMenu*)AllocVec((entries+1)*sizeof(struct NewMenu),MEMF_CLEAR))) - { - Menuitem_FillNewMenu(obj,data->newmenu,0); - } - return data->newmenu; -} - -/************************************************************************** - OM_NEW -**************************************************************************/ -IPTR Menuitem__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct MUI_MenuitemData *data; - struct TagItem *tags,*tag; - - obj = (Object *)DoSuperMethodA(cl, obj, (Msg)msg); /* We need no tags */ - if (!obj) return 0; - - data = INST_DATA(cl, obj); - - data->flags = MENUF_ENABLED; - - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) - { - switch (tag->ti_Tag) - { - case MUIA_Menuitem_Checked: - _handle_bool_tag(data->flags, tag->ti_Data, MENUF_CHECKED); - break; - - case MUIA_Menuitem_Checkit: - _handle_bool_tag(data->flags, tag->ti_Data, MENUF_CHECKIT); - break; - - case MUIA_Menuitem_CommandString: - _handle_bool_tag(data->flags, tag->ti_Data, MENUF_COMMANDSTRING); - break; - - case MUIA_Menu_Enabled: - case MUIA_Menuitem_Enabled: - _handle_bool_tag(data->flags, tag->ti_Data, MENUF_ENABLED); - break; - - case MUIA_Menuitem_Toggle: - _handle_bool_tag(data->flags, tag->ti_Data, MENUF_TOGGLE); - break; - - case MUIA_Menuitem_Exclude: - data->exclude = tag->ti_Data; - break; - - case MUIA_Menuitem_Shortcut: - data->shortcut = (char*)tag->ti_Data; - break; - - case MUIA_Menu_Title: - case MUIA_Menuitem_Title: - data->title = (char*)tag->ti_Data; - break; - } - } - - return (IPTR)obj; -} - -/************************************************************************** - OM_SET -**************************************************************************/ -IPTR Menuitem__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct MUI_MenuitemData *data; - struct TagItem *tags,*tag; - - data = INST_DATA(cl, obj); - - BOOL rebuild = FALSE; - - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) - { - switch (tag->ti_Tag) - { - case MUIA_Menuitem_Checked: - _handle_bool_tag(data->flags, tag->ti_Data, MENUF_CHECKED); - if (data->exclude && (data->flags & MENUF_CHECKED)) - { - Object *parent = NULL; - get(obj, MUIA_Parent, &parent); - - if (parent) - { - Object *child; - Object *cstate; - struct MinList *ChildList = NULL; - ULONG i = 1; - - get(parent, MUIA_Family_List, &ChildList); - cstate = (Object *)ChildList->mlh_Head; - while ((child = NextObject(&cstate))) - { - if ((i & data->exclude) && (child != obj)) - { - IPTR checkit = 0, checked = 0; - - get(child, MUIA_Menuitem_Checkit, &checkit); - get(child, MUIA_Menuitem_Checked, &checked); - - if (checkit && checked) - { - set(child, MUIA_Menuitem_Checked, FALSE); - } - } - - i <<= 1; - } - } - - } - rebuild = TRUE; - break; - - case MUIA_Menuitem_Checkit: - _handle_bool_tag(data->flags, tag->ti_Data, MENUF_CHECKIT); - rebuild = TRUE; - break; - - case MUIA_Menuitem_CommandString: - _handle_bool_tag(data->flags, tag->ti_Data, MENUF_COMMANDSTRING); - rebuild = TRUE; - break; - - case MUIA_Menu_Enabled: - case MUIA_Menuitem_Enabled: - _handle_bool_tag(data->flags, tag->ti_Data, MENUF_ENABLED); - tag->ti_Tag = TAG_IGNORE; - rebuild = TRUE; - break; - - case MUIA_Menuitem_Toggle: - _handle_bool_tag(data->flags, tag->ti_Data, MENUF_TOGGLE); - rebuild = TRUE; - break; - - case MUIA_Menuitem_Exclude: - data->exclude = tag->ti_Data; - rebuild = TRUE; - break; - - case MUIA_Menuitem_Shortcut: - data->shortcut = (char*)tag->ti_Data; - rebuild = TRUE; - break; - - case MUIA_Menu_Title: - case MUIA_Menuitem_Title: - data->title = (char*)tag->ti_Data; - tag->ti_Tag = TAG_IGNORE; - rebuild = TRUE; - break; - - case MUIA_Menuitem_Trigger: - data->trigger = (struct MenuItem*)tag->ti_Data; - rebuild = TRUE; - break; - } - } - - if (rebuild) - { - if - ( - muiNotifyData(obj) && - muiNotifyData(obj)->mnd_GlobalInfo && - muiNotifyData(obj)->mnd_GlobalInfo->mgi_ApplicationObject - ) - { - DoMethod(_app(obj), MUIM_Application_UpdateMenus); - } - } - - return DoSuperMethodA(cl,obj,(Msg)msg); -} - -/************************************************************************** - OM_GET -**************************************************************************/ -#define STORE *(msg->opg_Storage) -IPTR Menuitem__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) -{ - struct MUI_MenuitemData *data = INST_DATA(cl, obj); - - switch (msg->opg_AttrID) - { - case MUIA_Menuitem_Checked: - STORE = ((data->flags & MENUF_CHECKED) != 0); - return 1; - - case MUIA_Menuitem_Checkit: - STORE = ((data->flags & MENUF_CHECKIT) != 0); - return 1; - - case MUIA_Menuitem_CommandString: - STORE = ((data->flags & MENUF_COMMANDSTRING) != 0); - return 1; - - case MUIA_Menu_Enabled: - case MUIA_Menuitem_Enabled: - STORE = ((data->flags & MENUF_ENABLED) != 0); - return 1; - - case MUIA_Menuitem_Toggle: - STORE = ((data->flags & MENUF_TOGGLE) != 0); - return 1; - - case MUIA_Menuitem_Exclude: - STORE = data->exclude; - return 1; - - case MUIA_Menuitem_Shortcut: - STORE = (IPTR)data->shortcut; - return 1; - - case MUIA_Menu_Title: - case MUIA_Menuitem_Title: - STORE = (IPTR)data->title; - return 1; - - case MUIA_Menuitem_NewMenu: - Menuitem_BuildNewMenu(data,obj); - STORE = (IPTR)data->newmenu; - return 1; - - case MUIA_Menuitem_Trigger: - STORE = (IPTR)data->trigger; - return 1; - } - - return DoSuperMethodA(cl,obj,(Msg)msg); -} -#undef STORE - - -/************************************************************************** - OM_DISPOSE -**************************************************************************/ -IPTR Menuitem__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) -{ - struct MUI_MenuitemData *data = INST_DATA(cl, obj); - - FreeVec(data->newmenu); - - return DoSuperMethodA(cl, obj, msg); -} - - -/************************************************************************** - MUIM_ConnectParent -**************************************************************************/ -IPTR Menuitem__MUIM_ConnectParent(struct IClass *cl, Object *obj, struct MUIP_ConnectParent *msg) -{ - Object *cstate; - Object *child; - struct MinList *ChildList = NULL; - - D(bug("Menuitem_ConnectParent(%p) %s\n", obj, OCLASS(obj)->cl_ID)); - - DoSuperMethodA(cl,obj,(Msg)msg); - - muiNotifyData(obj)->mnd_ParentObject = msg->parent; - - get(obj, MUIA_Family_List, &ChildList); - cstate = (Object *)ChildList->mlh_Head; - while ((child = NextObject(&cstate))) - { - DoMethod(child, MUIM_ConnectParent, (IPTR)obj); - } - return TRUE; -} - -/************************************************************************** - MUIM_DisconnectParent -**************************************************************************/ -IPTR Menuitem__MUIM_DisconnectParent(struct IClass *cl, Object *obj, struct MUIP_ConnectParent *msg) -{ - Object *cstate; - Object *child; - struct MinList *ChildList = NULL; - - D(bug("Menuitem_DisconnectParent(%p) %s\n", obj, OCLASS(obj)->cl_ID)); - - get(obj, MUIA_Family_List, &ChildList); - cstate = (Object *)ChildList->mlh_Head; - while ((child = NextObject(&cstate))) - { - DoMethodA(child, (Msg)msg); - } - muiNotifyData(obj)->mnd_ParentObject = NULL; - DoSuperMethodA(cl,obj,(Msg)msg); - return TRUE; -} - -/************************************************************************** - MUIM_Family_Insert, MUIM_Family_Remove -**************************************************************************/ -IPTR Menuitem__MUIM_Update(struct IClass *cl, Object *obj, Msg msg) -{ - // struct MUI_MenuitemData *data = INST_DATA(cl, obj); - - IPTR retval = DoSuperMethodA(cl, obj, msg); - - if - ( - muiNotifyData(obj) && - muiNotifyData(obj)->mnd_GlobalInfo && - muiNotifyData(obj)->mnd_GlobalInfo->mgi_ApplicationObject - ) - { - DoMethod(_app(obj), MUIM_Application_UpdateMenus); - } - - return retval; -} - - -BOOPSI_DISPATCHER(IPTR, Menuitem_Dispatcher, cl, obj, msg) -{ - switch (msg->MethodID) - { - case OM_NEW: return Menuitem__OM_NEW(cl, obj, (struct opSet *) msg); - case OM_DISPOSE: return Menuitem__OM_DISPOSE(cl, obj, msg); - case OM_SET: return Menuitem__OM_SET(cl, obj, (struct opSet *) msg); - case OM_GET: return Menuitem__OM_GET(cl, obj, (struct opGet *) msg); - case MUIM_ConnectParent: return Menuitem__MUIM_ConnectParent(cl, obj, (APTR)msg); - case MUIM_DisconnectParent: return Menuitem__MUIM_DisconnectParent(cl, obj, (APTR)msg); - case MUIM_Family_Insert: return Menuitem__MUIM_Update(cl, obj, (APTR)msg); - case MUIM_Family_Remove: return Menuitem__MUIM_Update(cl, obj, (APTR)msg); - case MUIM_Family_AddTail: return Menuitem__MUIM_Update(cl, obj, (APTR)msg); - case MUIM_Family_AddHead: return Menuitem__MUIM_Update(cl, obj, (APTR)msg); - case OM_ADDMEMBER: return Menuitem__MUIM_Update(cl, obj, (APTR)msg); - case OM_REMMEMBER: return Menuitem__MUIM_Update(cl, obj, (APTR)msg); - } - return DoSuperMethodA(cl, obj, msg); -} -BOOPSI_DISPATCHER_END - - -/* - * Class descriptor. - */ -const struct __MUIBuiltinClass _MUI_Menuitem_desc = { - MUIC_Menuitem, - MUIC_Family, - sizeof(struct MUI_MenuitemData), - (void*)Menuitem_Dispatcher -}; - -/* - * Class descriptor.- this class is the same like menuitem - */ -const struct __MUIBuiltinClass _MUI_Menu_desc = { - MUIC_Menu, - MUIC_Family, - sizeof(struct MUI_MenuitemData), - (void*)Menuitem_Dispatcher -}; - -/* - * Class descriptor.- this class is the same like menuitem - */ -const struct __MUIBuiltinClass _MUI_Menustrip_desc = { - MUIC_Menustrip, - MUIC_Family, - sizeof(struct MUI_MenuitemData), - (void*)Menuitem_Dispatcher -}; +/* + Copyright © 2002-2007, The AROS Development Team. All rights reserved. + $Id$ +*/ + +#include <exec/memory.h> +#include <intuition/icclass.h> +#include <intuition/gadgetclass.h> +#include <libraries/gadtools.h> +#include <clib/alib_protos.h> +#include <proto/exec.h> +#include <proto/intuition.h> +#include <proto/utility.h> +#include <proto/muimaster.h> + +/* #define MYDEBUG 1 */ +#include "debug.h" +#include "mui.h" +#include "muimaster_intern.h" +#include "support.h" + +extern struct Library *MUIMasterBase; + +#define MENUF_CHECKED (1<<0) +#define MENUF_CHECKIT (1<<1) +#define MENUF_COMMANDSTRING (1<<2) +#define MENUF_ENABLED (1<<3) +#define MENUF_TOGGLE (1<<4) + +struct MUI_MenuitemData +{ + ULONG flags; + ULONG exclude; + + char *shortcut; + char *title; + + struct NewMenu *newmenu; + + struct MenuItem *trigger; +}; + +static int Menuitem_GetTotalChildren(Object *obj) +{ + Object *cstate; + Object *child; + struct MinList *ChildList = NULL; + int num = 0; + + get(obj, MUIA_Family_List, &ChildList); + cstate = (Object *) ChildList->mlh_Head; + while ((child = NextObject(&cstate))) + { + num++; + num += Menuitem_GetTotalChildren(child); + } + return num; +} + +static int Menuitem_FillNewMenu(Object *obj, struct NewMenu *menu, + int depth) +{ + Object *cstate; + Object *child; + struct MinList *ChildList = NULL; + int num = 0; + + if (depth > 2) + return 0; + + get(obj, MUIA_Family_List, &ChildList); + cstate = (Object *) ChildList->mlh_Head; + while ((child = NextObject(&cstate))) + { + int entries; + ULONG checkit = 0, checked = 0, toggle = 0, enabled = 0; + + get(child, MUIA_Menuitem_Title, &menu->nm_Label); + get(child, MUIA_Menuitem_Shortcut, &menu->nm_CommKey); + get(child, MUIA_Menuitem_Checkit, &checkit); + get(child, MUIA_Menuitem_Checked, &checked); + get(child, MUIA_Menuitem_Toggle, &toggle); + get(child, MUIA_Menuitem_Enabled, &enabled); + if (checkit) + menu->nm_Flags |= CHECKIT; + if (checked) + menu->nm_Flags |= CHECKED; + if (toggle) + menu->nm_Flags |= MENUTOGGLE; + get(child, MUIA_Menuitem_Exclude, &menu->nm_MutualExclude); + + if (depth == 0) + { + menu->nm_Type = NM_TITLE; + if (!enabled) + menu->nm_Flags |= NM_MENUDISABLED; + } + else if (depth == 1) + { + menu->nm_Type = NM_ITEM; + if (!enabled) + menu->nm_Flags |= NM_ITEMDISABLED; + } + else if (depth == 2) + { + menu->nm_Type = NM_SUB; + if (!enabled) + menu->nm_Flags |= NM_ITEMDISABLED; + } + + menu->nm_UserData = child; + + menu++; + num++; + entries = Menuitem_FillNewMenu(child, menu, depth + 1); + + menu += entries; + num += entries; + } + return num; +} + +/************************************************************************** + ... +**************************************************************************/ +static struct NewMenu *Menuitem_BuildNewMenu(struct MUI_MenuitemData *data, + Object *obj) +{ + int entries = Menuitem_GetTotalChildren(obj); + if (data->newmenu) + FreeVec(data->newmenu); + data->newmenu = NULL; + if (!entries) + return NULL; + + if ((data->newmenu = + (struct NewMenu *)AllocVec((entries + + 1) * sizeof(struct NewMenu), MEMF_CLEAR))) + { + Menuitem_FillNewMenu(obj, data->newmenu, 0); + } + return data->newmenu; +} + +/************************************************************************** + OM_NEW +**************************************************************************/ +IPTR Menuitem__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) +{ + struct MUI_MenuitemData *data; + struct TagItem *tags, *tag; + + obj = (Object *) DoSuperMethodA(cl, obj, (Msg) msg); + /* We need no tags */ + if (!obj) + return 0; + + data = INST_DATA(cl, obj); + + data->flags = MENUF_ENABLED; + + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) + { + switch (tag->ti_Tag) + { + case MUIA_Menuitem_Checked: + _handle_bool_tag(data->flags, tag->ti_Data, MENUF_CHECKED); + break; + + case MUIA_Menuitem_Checkit: + _handle_bool_tag(data->flags, tag->ti_Data, MENUF_CHECKIT); + break; + + case MUIA_Menuitem_CommandString: + _handle_bool_tag(data->flags, tag->ti_Data, + MENUF_COMMANDSTRING); + break; + + case MUIA_Menu_Enabled: + case MUIA_Menuitem_Enabled: + _handle_bool_tag(data->flags, tag->ti_Data, MENUF_ENABLED); + break; + + case MUIA_Menuitem_Toggle: + _handle_bool_tag(data->flags, tag->ti_Data, MENUF_TOGGLE); + break; + + case MUIA_Menuitem_Exclude: + data->exclude = tag->ti_Data; + break; + + case MUIA_Menuitem_Shortcut: + data->shortcut = (char *)tag->ti_Data; + break; + + case MUIA_Menu_Title: + case MUIA_Menuitem_Title: + data->title = (char *)tag->ti_Data; + break; + } + } + + return (IPTR) obj; +} + +/************************************************************************** + OM_SET +**************************************************************************/ +IPTR Menuitem__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) +{ + struct MUI_MenuitemData *data; + struct TagItem *tags, *tag; + + data = INST_DATA(cl, obj); + + BOOL rebuild = FALSE; + + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) + { + switch (tag->ti_Tag) + { + case MUIA_Menuitem_Checked: + _handle_bool_tag(data->flags, tag->ti_Data, MENUF_CHECKED); + if (data->exclude && (data->flags & MENUF_CHECKED)) + { + Object *parent = NULL; + get(obj, MUIA_Parent, &parent); + + if (parent) + { + Object *child; + Object *cstate; + struct MinList *ChildList = NULL; + ULONG i = 1; + + get(parent, MUIA_Family_List, &ChildList); + cstate = (Object *) ChildList->mlh_Head; + while ((child = NextObject(&cstate))) + { + if ((i & data->exclude) && (child != obj)) + { + IPTR checkit = 0, checked = 0; + + get(child, MUIA_Menuitem_Checkit, &checkit); + get(child, MUIA_Menuitem_Checked, &checked); + + if (checkit && checked) + { + set(child, MUIA_Menuitem_Checked, FALSE); + } + } + + i <<= 1; + } + } + + } + rebuild = TRUE; + break; + + case MUIA_Menuitem_Checkit: + _handle_bool_tag(data->flags, tag->ti_Data, MENUF_CHECKIT); + rebuild = TRUE; + break; + + case MUIA_Menuitem_CommandString: + _handle_bool_tag(data->flags, tag->ti_Data, + MENUF_COMMANDSTRING); + rebuild = TRUE; + break; + + case MUIA_Menu_Enabled: + case MUIA_Menuitem_Enabled: + _handle_bool_tag(data->flags, tag->ti_Data, MENUF_ENABLED); + tag->ti_Tag = TAG_IGNORE; + rebuild = TRUE; + break; + + case MUIA_Menuitem_Toggle: + _handle_bool_tag(data->flags, tag->ti_Data, MENUF_TOGGLE); + rebuild = TRUE; + break; + + case MUIA_Menuitem_Exclude: + data->exclude = tag->ti_Data; + rebuild = TRUE; + break; + + case MUIA_Menuitem_Shortcut: + data->shortcut = (char *)tag->ti_Data; + rebuild = TRUE; + break; + + case MUIA_Menu_Title: + case MUIA_Menuitem_Title: + data->title = (char *)tag->ti_Data; + tag->ti_Tag = TAG_IGNORE; + rebuild = TRUE; + break; + + case MUIA_Menuitem_Trigger: + data->trigger = (struct MenuItem *)tag->ti_Data; + rebuild = TRUE; + break; + } + } + + if (rebuild) + { + if (muiNotifyData(obj) && + muiNotifyData(obj)->mnd_GlobalInfo && + muiNotifyData(obj)->mnd_GlobalInfo->mgi_ApplicationObject) + { + DoMethod(_app(obj), MUIM_Application_UpdateMenus); + } + } + + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +/************************************************************************** + OM_GET +**************************************************************************/ +#define STORE *(msg->opg_Storage) +IPTR Menuitem__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) +{ + struct MUI_MenuitemData *data = INST_DATA(cl, obj); + + switch (msg->opg_AttrID) + { + case MUIA_Menuitem_Checked: + STORE = ((data->flags & MENUF_CHECKED) != 0); + return 1; + + case MUIA_Menuitem_Checkit: + STORE = ((data->flags & MENUF_CHECKIT) != 0); + return 1; + + case MUIA_Menuitem_CommandString: + STORE = ((data->flags & MENUF_COMMANDSTRING) != 0); + return 1; + + case MUIA_Menu_Enabled: + case MUIA_Menuitem_Enabled: + STORE = ((data->flags & MENUF_ENABLED) != 0); + return 1; + + case MUIA_Menuitem_Toggle: + STORE = ((data->flags & MENUF_TOGGLE) != 0); + return 1; + + case MUIA_Menuitem_Exclude: + STORE = data->exclude; + return 1; + + case MUIA_Menuitem_Shortcut: + STORE = (IPTR) data->shortcut; + return 1; + + case MUIA_Menu_Title: + case MUIA_Menuitem_Title: + STORE = (IPTR) data->title; + return 1; + + case MUIA_Menuitem_NewMenu: + Menuitem_BuildNewMenu(data, obj); + STORE = (IPTR) data->newmenu; + return 1; + + case MUIA_Menuitem_Trigger: + STORE = (IPTR) data->trigger; + return 1; + } + + return DoSuperMethodA(cl, obj, (Msg) msg); +} +#undef STORE + + +/************************************************************************** + OM_DISPOSE +**************************************************************************/ +IPTR Menuitem__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) +{ + struct MUI_MenuitemData *data = INST_DATA(cl, obj); + + FreeVec(data->newmenu); + + return DoSuperMethodA(cl, obj, msg); +} + + +/************************************************************************** + MUIM_ConnectParent +**************************************************************************/ +IPTR Menuitem__MUIM_ConnectParent(struct IClass *cl, Object *obj, + struct MUIP_ConnectParent *msg) +{ + Object *cstate; + Object *child; + struct MinList *ChildList = NULL; + + D(bug("Menuitem_ConnectParent(%p) %s\n", obj, OCLASS(obj)->cl_ID)); + + DoSuperMethodA(cl, obj, (Msg) msg); + + muiNotifyData(obj)->mnd_ParentObject = msg->parent; + + get(obj, MUIA_Family_List, &ChildList); + cstate = (Object *) ChildList->mlh_Head; + while ((child = NextObject(&cstate))) + { + DoMethod(child, MUIM_ConnectParent, (IPTR) obj); + } + return TRUE; +} + +/************************************************************************** + MUIM_DisconnectParent +**************************************************************************/ +IPTR Menuitem__MUIM_DisconnectParent(struct IClass *cl, Object *obj, + struct MUIP_ConnectParent *msg) +{ + Object *cstate; + Object *child; + struct MinList *ChildList = NULL; + + D(bug("Menuitem_DisconnectParent(%p) %s\n", obj, OCLASS(obj)->cl_ID)); + + get(obj, MUIA_Family_List, &ChildList); + cstate = (Object *) ChildList->mlh_Head; + while ((child = NextObject(&cstate))) + { + DoMethodA(child, (Msg) msg); + } + muiNotifyData(obj)->mnd_ParentObject = NULL; + DoSuperMethodA(cl, obj, (Msg) msg); + return TRUE; +} + +/************************************************************************** + MUIM_Family_Insert, MUIM_Family_Remove +**************************************************************************/ +IPTR Menuitem__MUIM_Update(struct IClass *cl, Object *obj, Msg msg) +{ + // struct MUI_MenuitemData *data = INST_DATA(cl, obj); + + IPTR retval = DoSuperMethodA(cl, obj, msg); + + if (muiNotifyData(obj) && + muiNotifyData(obj)->mnd_GlobalInfo && + muiNotifyData(obj)->mnd_GlobalInfo->mgi_ApplicationObject) + { + DoMethod(_app(obj), MUIM_Application_UpdateMenus); + } + + return retval; +} + + +BOOPSI_DISPATCHER(IPTR, Menuitem_Dispatcher, cl, obj, msg) +{ + switch (msg->MethodID) + { + case OM_NEW: + return Menuitem__OM_NEW(cl, obj, (struct opSet *)msg); + case OM_DISPOSE: + return Menuitem__OM_DISPOSE(cl, obj, msg); + case OM_SET: + return Menuitem__OM_SET(cl, obj, (struct opSet *)msg); + case OM_GET: + return Menuitem__OM_GET(cl, obj, (struct opGet *)msg); + case MUIM_ConnectParent: + return Menuitem__MUIM_ConnectParent(cl, obj, (APTR) msg); + case MUIM_DisconnectParent: + return Menuitem__MUIM_DisconnectParent(cl, obj, (APTR) msg); + case MUIM_Family_Insert: + return Menuitem__MUIM_Update(cl, obj, (APTR) msg); + case MUIM_Family_Remove: + return Menuitem__MUIM_Update(cl, obj, (APTR) msg); + case MUIM_Family_AddTail: + return Menuitem__MUIM_Update(cl, obj, (APTR) msg); + case MUIM_Family_AddHead: + return Menuitem__MUIM_Update(cl, obj, (APTR) msg); + case OM_ADDMEMBER: + return Menuitem__MUIM_Update(cl, obj, (APTR) msg); + case OM_REMMEMBER: + return Menuitem__MUIM_Update(cl, obj, (APTR) msg); + } + return DoSuperMethodA(cl, obj, msg); +} +BOOPSI_DISPATCHER_END + +/* + * Class descriptor. + */ +const struct __MUIBuiltinClass _MUI_Menuitem_desc = +{ + MUIC_Menuitem, + MUIC_Family, + sizeof(struct MUI_MenuitemData), + (void *) Menuitem_Dispatcher +}; + +/* + * Class descriptor.- this class is the same like menuitem + */ +const struct __MUIBuiltinClass _MUI_Menu_desc = +{ + MUIC_Menu, + MUIC_Family, + sizeof(struct MUI_MenuitemData), + (void *) Menuitem_Dispatcher +}; + +/* + * Class descriptor.- this class is the same like menuitem + */ +const struct __MUIBuiltinClass _MUI_Menustrip_desc = +{ + MUIC_Menustrip, + MUIC_Family, + sizeof(struct MUI_MenuitemData), + (void *) Menuitem_Dispatcher +}; diff --git a/workbench/libs/muimaster/classes/menuitem.h b/workbench/libs/muimaster/classes/menuitem.h index 8af27e1255..8b2b51774f 100644 --- a/workbench/libs/muimaster/classes/menuitem.h +++ b/workbench/libs/muimaster/classes/menuitem.h @@ -14,7 +14,7 @@ #define MUIB_Menustrip (MUIB_ZUNE | 0x00001a00) /*** Attributes *************************************************************/ -#define MUIA_Menustrip_Enabled (MUIB_MUI|0x0042815b) /* MUI: V8 isg BOOL */ +#define MUIA_Menustrip_Enabled (MUIB_MUI | 0x0042815b) /* MUI: V8 isg BOOL */ @@ -23,11 +23,11 @@ #define MUIC_Menu "Menu.mui" /*** Identifier base (for Zune extensions) **********************************/ -#define MUIB_Menu (MUIB_ZUNE | 0x00001b00) +#define MUIB_Menu (MUIB_ZUNE | 0x00001b00) /*** Attributes *************************************************************/ -#define MUIA_Menu_Enabled (MUIB_MUI|0x0042ed48) /* MUI: V8 isg BOOL */ -#define MUIA_Menu_Title (MUIB_MUI|0x0042a0e3) /* MUI: V8 isg STRPTR */ +#define MUIA_Menu_Enabled (MUIB_MUI | 0x0042ed48) /* MUI: V8 isg BOOL */ +#define MUIA_Menu_Title (MUIB_MUI | 0x0042a0e3) /* MUI: V8 isg STRPTR */ @@ -39,24 +39,34 @@ #define MUIB_Menuitem (MUIB_ZUNE | 0x00001c00) /*** Attributes *************************************************************/ -#define MUIA_Menuitem_Checked (MUIB_MUI|0x0042562a) /* MUI: V8 isg BOOL */ -#define MUIA_Menuitem_Checkit (MUIB_MUI|0x00425ace) /* MUI: V8 isg BOOL */ -#define MUIA_Menuitem_CommandString (MUIB_MUI|0x0042b9cc) /* MUI: V16 isg BOOL */ -#define MUIA_Menuitem_Enabled (MUIB_MUI|0x0042ae0f) /* MUI: V8 isg BOOL */ -#define MUIA_Menuitem_Exclude (MUIB_MUI|0x00420bc6) /* MUI: V8 isg LONG */ -#define MUIA_Menuitem_Shortcut (MUIB_MUI|0x00422030) /* MUI: V8 isg STRPTR */ -#define MUIA_Menuitem_Title (MUIB_MUI|0x004218be) /* MUI: V8 isg STRPTR */ -#define MUIA_Menuitem_Toggle (MUIB_MUI|0x00424d5c) /* MUI: V8 isg BOOL */ -#define MUIA_Menuitem_Trigger (MUIB_MUI|0x00426f32) /* MUI: V8 ..g struct MenuItem * */ - -#define MUIA_Menuitem_NewMenu (MUIB_Menuitem | 0x00000000) /* Zune: V1 ..g struct NewMenu * */ +#define MUIA_Menuitem_Checked \ + (MUIB_MUI | 0x0042562a) /* MUI: V8 isg BOOL */ +#define MUIA_Menuitem_Checkit \ + (MUIB_MUI | 0x00425ace) /* MUI: V8 isg BOOL */ +#define MUIA_Menuitem_CommandString \ + (MUIB_MUI | 0x0042b9cc) /* MUI: V16 isg BOOL */ +#define MUIA_Menuitem_Enabled \ + (MUIB_MUI | 0x0042ae0f) /* MUI: V8 isg BOOL */ +#define MUIA_Menuitem_Exclude \ + (MUIB_MUI | 0x00420bc6) /* MUI: V8 isg LONG */ +#define MUIA_Menuitem_Shortcut \ + (MUIB_MUI | 0x00422030) /* MUI: V8 isg STRPTR */ +#define MUIA_Menuitem_Title \ + (MUIB_MUI | 0x004218be) /* MUI: V8 isg STRPTR */ +#define MUIA_Menuitem_Toggle \ + (MUIB_MUI | 0x00424d5c) /* MUI: V8 isg BOOL */ +#define MUIA_Menuitem_Trigger \ + (MUIB_MUI | 0x00426f32) /* MUI: V8 ..g struct MenuItem * */ + +#define MUIA_Menuitem_NewMenu \ + (MUIB_Menuitem | 0x00000000) /* Zune: V1 ..g struct NewMenu * */ #define MUIV_Menuitem_Shortcut_Check (-1) -extern const struct __MUIBuiltinClass _MUI_Menuitem_desc; /* PRIV */ -extern const struct __MUIBuiltinClass _MUI_Menu_desc; /* PRIV */ -extern const struct __MUIBuiltinClass _MUI_Menustrip_desc; /* PRIV */ +extern const struct __MUIBuiltinClass _MUI_Menuitem_desc; /* PRIV */ +extern const struct __MUIBuiltinClass _MUI_Menu_desc; /* PRIV */ +extern const struct __MUIBuiltinClass _MUI_Menustrip_desc; /* PRIV */ #endif /* _MUI_CLASSES_MENUITEM_H */ diff --git a/workbench/libs/muimaster/classes/notify.c b/workbench/libs/muimaster/classes/notify.c index 83490bd2c2..6efbd745f0 100644 --- a/workbench/libs/muimaster/classes/notify.c +++ b/workbench/libs/muimaster/classes/notify.c @@ -31,9 +31,9 @@ AROS_UFH2S(void, cpy_func, AROS_UFHA(STRPTR *, strPtrPtr, A3)) { AROS_USERFUNC_INIT - + *(*strPtrPtr)++ = chr; - + AROS_USERFUNC_EXIT } @@ -42,9 +42,9 @@ AROS_UFH2S(void, len_func, AROS_UFHA(LONG *, lenPtr, A3)) { AROS_USERFUNC_INIT - + (*lenPtr)++; - + AROS_USERFUNC_EXIT } @@ -93,89 +93,95 @@ static const int __revision = 1; typedef struct NotifyNode { struct MinNode nn_Node; - BOOL nn_Active; /* When TRUE, it means that the notification is currently being handled */ - /* It's used to prevent loops */ - ULONG nn_TrigAttr; - IPTR nn_TrigVal; - APTR nn_DestObj; - ULONG nn_NumParams; - IPTR *nn_Params; /* FIXME: use nn_Params[1] and tweak stuff below */ - IPTR *nn_NewParams; /* For MUIV_EveryTime */ + BOOL nn_Active; /* TRUE if notification is currently being handled */ + /* It's used to prevent loops */ + ULONG nn_TrigAttr; + IPTR nn_TrigVal; + APTR nn_DestObj; + ULONG nn_NumParams; + IPTR *nn_Params; /* FIXME: use nn_Params[1] and tweak stuff below */ + IPTR *nn_NewParams; /* For MUIV_EveryTime */ } *NNode; typedef struct NotifyNodeIX { struct NotifyNode nn; - IX ix; + IX ix; } *NNodeIX; -static struct NotifyNode *CreateNNode (struct MUI_NotifyData *data, struct MUIP_Notify *msg) +static struct NotifyNode *CreateNNode(struct MUI_NotifyData *data, + struct MUIP_Notify *msg) { ULONG i, paramsize; struct NotifyNode *nnode; - - if ((msg->TrigAttr == MUIA_Window_InputEvent) && (msg->TrigVal != MUIV_EveryTime)) + + if ((msg->TrigAttr == MUIA_Window_InputEvent) + && (msg->TrigVal != MUIV_EveryTime)) { - IX ix = {IX_VERSION}; + IX ix = { IX_VERSION }; - if (ParseIX((CONST_STRPTR)msg->TrigVal, &ix) != 0) return NULL; + if (ParseIX((CONST_STRPTR) msg->TrigVal, &ix) != 0) + return NULL; - if ((nnode = (struct NotifyNode *)mui_alloc_struct(struct NotifyNodeIX))) - { - ((struct NotifyNodeIX *)nnode)->ix = ix; - } + if ((nnode = + (struct NotifyNode *)mui_alloc_struct(struct NotifyNodeIX))) + { + ((struct NotifyNodeIX *)nnode)->ix = ix; + } } else - { - nnode = mui_alloc_struct(struct NotifyNode); + { + nnode = mui_alloc_struct(struct NotifyNode); } - - if (!nnode) return NULL; - nnode->nn_Active = FALSE; - nnode->nn_TrigAttr = msg->TrigAttr; - nnode->nn_TrigVal = msg->TrigVal; - nnode->nn_DestObj = msg->DestObj; + if (!nnode) + return NULL; + + nnode->nn_Active = FALSE; + nnode->nn_TrigAttr = msg->TrigAttr; + nnode->nn_TrigVal = msg->TrigVal; + nnode->nn_DestObj = msg->DestObj; nnode->nn_NumParams = msg->FollowParams; /* Allocate one more IPTR (FollowParams + 1) as some ext apps/classes forget trailing NULLs in methods like MUIM_MultiSet and MUI seems like it can live with that (without crashing) */ - + paramsize = (msg->FollowParams + 1); if (msg->TrigVal == MUIV_EveryTime) { - paramsize *= 2; + paramsize *= 2; } - - if ((nnode->nn_Params = (IPTR *)mui_alloc(paramsize * sizeof(IPTR)))) + + if ((nnode->nn_Params = (IPTR *) mui_alloc(paramsize * sizeof(IPTR)))) { - IPTR *par = (IPTR *)&msg->FollowParams; - - for (i = 0; i < msg->FollowParams; i++) - { - nnode->nn_Params[i] = *(par + i + 1); - } + IPTR *par = (IPTR *) & msg->FollowParams; + + for (i = 0; i < msg->FollowParams; i++) + { + nnode->nn_Params[i] = *(par + i + 1); + } if (msg->TrigVal == MUIV_EveryTime) { - nnode->nn_NewParams = nnode->nn_Params + msg->FollowParams + 1; - for (i = 0; i < msg->FollowParams; i++) - { - nnode->nn_NewParams[i] = *(par + i + 1); - } + nnode->nn_NewParams = nnode->nn_Params + msg->FollowParams + 1; + for (i = 0; i < msg->FollowParams; i++) + { + nnode->nn_NewParams[i] = *(par + i + 1); + } } - return nnode; + return nnode; } - + mui_free(nnode); return NULL; } -static void DeleteNNode (struct MUI_NotifyData *data, struct NotifyNode *nnode) +static void DeleteNNode(struct MUI_NotifyData *data, + struct NotifyNode *nnode) { mui_free(nnode->nn_Params); mui_free(nnode); @@ -190,37 +196,38 @@ IPTR Notify__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg); IPTR Notify__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) { struct MUI_NotifyData *data; - struct TagItem *tags = msg->ops_AttrList; - struct TagItem *tag; + struct TagItem *tags = msg->ops_AttrList; + struct TagItem *tag; - obj = (Object *)DoSuperMethodA(cl, obj, (Msg)msg); - if (!obj) return FALSE; + obj = (Object *) DoSuperMethodA(cl, obj, (Msg) msg); + if (!obj) + return FALSE; data = INST_DATA(cl, obj); while ((tag = NextTagItem(&tags)) != NULL) { - switch (tag->ti_Tag) - { - case MUIA_HelpLine: - data->mnd_HelpLine = (LONG)tag->ti_Data; - break; - - case MUIA_HelpNode: - data->mnd_HelpNode = (STRPTR)tag->ti_Data; - break; - - case MUIA_ObjectID: - data->mnd_ObjectID = (ULONG)tag->ti_Data; - break; - - case MUIA_UserData: - data->mnd_UserData = (IPTR)tag->ti_Data; - break; - } + switch (tag->ti_Tag) + { + case MUIA_HelpLine: + data->mnd_HelpLine = (LONG) tag->ti_Data; + break; + + case MUIA_HelpNode: + data->mnd_HelpNode = (STRPTR) tag->ti_Data; + break; + + case MUIA_ObjectID: + data->mnd_ObjectID = (ULONG) tag->ti_Data; + break; + + case MUIA_UserData: + data->mnd_UserData = (IPTR) tag->ti_Data; + break; + } } - return (IPTR)obj; + return (IPTR) obj; } @@ -234,132 +241,138 @@ IPTR Notify__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) if (data->mnd_NotifyList) { - for (node = data->mnd_NotifyList->mlh_Head; node->mln_Succ ; node = tmp) - { - tmp = node->mln_Succ; - DeleteNNode(data, (struct NotifyNode *)node); - } - mui_free(data->mnd_NotifyList); + for (node = data->mnd_NotifyList->mlh_Head; node->mln_Succ; + node = tmp) + { + tmp = node->mln_Succ; + DeleteNNode(data, (struct NotifyNode *)node); + } + mui_free(data->mnd_NotifyList); } return DoSuperMethodA(cl, obj, msg); } -static void check_notify (NNode nnode, Object *obj, struct TagItem *tag) +static void check_notify(NNode nnode, Object *obj, struct TagItem *tag) { - IPTR *params; - APTR destobj; - int i; - BOOL donotify = FALSE; - + IPTR *params; + APTR destobj; + int i; + BOOL donotify = FALSE; + /* is it the good attribute ? */ if (tag->ti_Tag != nnode->nn_TrigAttr) - return; + return; /* Is the notification already being performed? */ if (nnode->nn_Active) { - #if DEBUG - static int counter; - - D(bug("Notifyloop detected! (#%d)\n", counter++)); - D(bug(" Source object: 0x%x", obj)); - - switch((IPTR)nnode->nn_DestObj) - { - case MUIV_Notify_Application: - D(bug(" Dest object: 0x%x (MUIV_Notify_Application)\n", _app(obj))); - break; - case MUIV_Notify_Self: - D(bug(" Dest object: 0x%x (MUIV_Notify_Self)\n", obj)); - destobj = obj; - break; - case MUIV_Notify_Window: - if (muiRenderInfo(obj)) /* otherwise _win(obj) does NULL access! */ - { - D(bug(" Dest object: 0x%x (MUIV_Notify_Window)\n", _win(obj))); - } - else - { - D(bug(" Dest object: INVALID (MUIV_Notify_Window, but no muiRenderInfo)\n")); - } - break; - default: - D(bug(" Dest object: 0x%x\n", nnode->nn_DestObj)); - break; - } - D(bug(" Attribute: 0x%x Value: 0x%x\n", tag->ti_Tag, tag->ti_Data)); - - #endif - return; +#if DEBUG + static int counter; + + D(bug("Notifyloop detected! (#%d)\n", counter++)); + D(bug(" Source object: 0x%x", obj)); + + switch ((IPTR) nnode->nn_DestObj) + { + case MUIV_Notify_Application: + D(bug(" Dest object: 0x%x (MUIV_Notify_Application)\n", + _app(obj))); + break; + case MUIV_Notify_Self: + D(bug(" Dest object: 0x%x (MUIV_Notify_Self)\n", obj)); + destobj = obj; + break; + case MUIV_Notify_Window: + if (muiRenderInfo(obj)) /* otherwise _win(obj) does NULL access! */ + { + D(bug(" Dest object: 0x%x (MUIV_Notify_Window)\n", + _win(obj))); + } + else + { + D(bug(" Dest object: INVALID " + "(MUIV_Notify_Window, but no muiRenderInfo)\n")); + } + break; + default: + D(bug(" Dest object: 0x%x\n", nnode->nn_DestObj)); + break; + } + D(bug(" Attribute: 0x%x Value: 0x%x\n", tag->ti_Tag, + tag->ti_Data)); + +#endif + return; } if (nnode->nn_TrigVal == MUIV_EveryTime) { - donotify = TRUE; + donotify = TRUE; } else if (nnode->nn_TrigAttr == MUIA_Window_InputEvent) - { - if (MatchIX((struct InputEvent *)tag->ti_Data, &((struct NotifyNodeIX *)nnode)->ix)) - { - donotify = TRUE; - } + { + if (MatchIX((struct InputEvent *)tag->ti_Data, + &((struct NotifyNodeIX *)nnode)->ix)) + { + donotify = TRUE; + } } else if (nnode->nn_TrigVal == tag->ti_Data) - { - donotify = TRUE; + { + donotify = TRUE; } - + if (donotify) { - switch((IPTR)nnode->nn_DestObj) - { - case MUIV_Notify_Application: - destobj = _app(obj); - break; - case MUIV_Notify_Self: - destobj = obj; - break; - case MUIV_Notify_Window: - if (muiRenderInfo(obj)) /* otherwise _win(obj) does NULL access! */ - { - destobj = _win(obj); - } - else - { - return; - } - break; - default: - destobj = nnode->nn_DestObj; - } - - params = nnode->nn_Params; - if (nnode->nn_TrigVal == MUIV_EveryTime) - { - params = nnode->nn_NewParams; - - for (i = 1; i < nnode->nn_NumParams; i++) - { - switch(nnode->nn_Params[i]) - { - case MUIV_TriggerValue: - params[i] = tag->ti_Data; - break; - - case MUIV_NotTriggerValue: - params[i] = !tag->ti_Data; - break; - } - } - } - - nnode->nn_Active = TRUE; - - /* call method */ - DoMethodA(destobj, (Msg)params); - - nnode->nn_Active = FALSE; + switch ((IPTR) nnode->nn_DestObj) + { + case MUIV_Notify_Application: + destobj = _app(obj); + break; + case MUIV_Notify_Self: + destobj = obj; + break; + case MUIV_Notify_Window: + if (muiRenderInfo(obj)) /* otherwise _win(obj) does NULL access! */ + { + destobj = _win(obj); + } + else + { + return; + } + break; + default: + destobj = nnode->nn_DestObj; + } + + params = nnode->nn_Params; + if (nnode->nn_TrigVal == MUIV_EveryTime) + { + params = nnode->nn_NewParams; + + for (i = 1; i < nnode->nn_NumParams; i++) + { + switch (nnode->nn_Params[i]) + { + case MUIV_TriggerValue: + params[i] = tag->ti_Data; + break; + + case MUIV_NotTriggerValue: + params[i] = !tag->ti_Data; + break; + } + } + } + + nnode->nn_Active = TRUE; + + /* call method */ + DoMethodA(destobj, (Msg) params); + + nnode->nn_Active = FALSE; } } @@ -369,61 +382,57 @@ static void check_notify (NNode nnode, Object *obj, struct TagItem *tag) IPTR Notify__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) { struct MUI_NotifyData *data = INST_DATA(cl, obj); - struct TagItem *tags = msg->ops_AttrList; - BOOL no_notify = FALSE; - struct TagItem *tag; - struct MinNode *node; + struct TagItem *tags = msg->ops_AttrList; + BOOL no_notify = FALSE; + struct TagItem *tag; + struct MinNode *node; /* There are many ways to find out what tag items provided by set() - ** we do know. The best way should be using NextTagItem() and simply - ** browsing through the list. - */ + ** we do know. The best way should be using NextTagItem() and simply + ** browsing through the list. + */ while ((tag = NextTagItem(&tags)) != NULL) { - switch (tag->ti_Tag) - { - case MUIA_HelpLine: - data->mnd_HelpLine = (LONG)tag->ti_Data; - break; - - case MUIA_HelpNode: - data->mnd_HelpNode = (STRPTR)tag->ti_Data; - break; - - case MUIA_NoNotify: - if (tag->ti_Data == TRUE) - no_notify = TRUE; - break; - - case MUIA_ObjectID: - data->mnd_ObjectID = (ULONG)tag->ti_Data; - break; - - case MUIA_UserData: - data->mnd_UserData = tag->ti_Data; - break; - } + switch (tag->ti_Tag) + { + case MUIA_HelpLine: + data->mnd_HelpLine = (LONG) tag->ti_Data; + break; + + case MUIA_HelpNode: + data->mnd_HelpNode = (STRPTR) tag->ti_Data; + break; + + case MUIA_NoNotify: + if (tag->ti_Data == TRUE) + no_notify = TRUE; + break; + + case MUIA_ObjectID: + data->mnd_ObjectID = (ULONG) tag->ti_Data; + break; + + case MUIA_UserData: + data->mnd_UserData = tag->ti_Data; + break; + } } /* * check for notifications */ if (!data->mnd_NotifyList || no_notify) - return 0; + return 0; tags = msg->ops_AttrList; while ((tag = NextTagItem(&tags))) { - for - ( - node = data->mnd_NotifyList->mlh_Head; - node->mln_Succ; - node = node->mln_Succ - ) - { - check_notify((NNode)node, obj, tag); - } - } + for (node = data->mnd_NotifyList->mlh_Head; + node->mln_Succ; node = node->mln_Succ) + { + check_notify((NNode) node, obj, tag); + } + } return 0; } @@ -443,44 +452,46 @@ IPTR Notify__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) switch (msg->opg_AttrID) { case MUIA_ApplicationObject: - if (data->mnd_GlobalInfo) STORE = (IPTR)data->mnd_GlobalInfo->mgi_ApplicationObject; - else STORE = 0; - return TRUE; + if (data->mnd_GlobalInfo) + STORE = (IPTR) data->mnd_GlobalInfo->mgi_ApplicationObject; + else + STORE = 0; + return TRUE; - case MUIA_AppMessage: /* struct AppMessage ? */ - STORE = 0; - return TRUE; + case MUIA_AppMessage: /* struct AppMessage ? */ + STORE = 0; + return TRUE; case MUIA_HelpLine: - STORE = (IPTR)data->mnd_HelpLine; - return TRUE; + STORE = (IPTR) data->mnd_HelpLine; + return TRUE; case MUIA_HelpNode: - STORE = (IPTR)data->mnd_HelpNode; - return TRUE; + STORE = (IPTR) data->mnd_HelpNode; + return TRUE; case MUIA_ObjectID: - STORE = (IPTR)data->mnd_ObjectID; - return TRUE; + STORE = (IPTR) data->mnd_ObjectID; + return TRUE; case MUIA_Parent: - STORE = (IPTR)data->mnd_ParentObject; - return TRUE; + STORE = (IPTR) data->mnd_ParentObject; + return TRUE; case MUIA_Revision: - STORE = __revision; - return TRUE; + STORE = __revision; + return TRUE; case MUIA_UserData: - STORE = data->mnd_UserData; - return TRUE; + STORE = data->mnd_UserData; + return TRUE; case MUIA_Version: - STORE = __version; - return TRUE; + STORE = __version; + return TRUE; } - return DoSuperMethodA(cl,obj,(Msg)msg); + return DoSuperMethodA(cl, obj, (Msg) msg); } @@ -488,11 +499,13 @@ IPTR Notify__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) * MUIM_CallHook : Call a standard amiga callback hook, defined by a Hook * structure. */ -IPTR Notify__MUIM_CallHook(struct IClass *cl, Object *obj, struct MUIP_CallHook *msg) +IPTR Notify__MUIM_CallHook(struct IClass *cl, Object *obj, + struct MUIP_CallHook *msg) { if (msg->Hook->h_Entry) - return CallHookPkt(msg->Hook,obj, &msg->param1); - else return FALSE; + return CallHookPkt(msg->Hook, obj, &msg->param1); + else + return FALSE; } @@ -505,13 +518,14 @@ IPTR Notify__MUIM_CallHook(struct IClass *cl, Object *obj, struct MUIP_CallHook * MUIM_FindUData : tests if the MUIA_UserData of the object * contains the given <udata> and returns the object pointer in this case. */ -IPTR Notify__MUIM_FindUData(struct IClass *cl, Object *obj, struct MUIP_FindUData *msg) +IPTR Notify__MUIM_FindUData(struct IClass *cl, Object *obj, + struct MUIP_FindUData *msg) { struct MUI_NotifyData *data = INST_DATA(cl, obj); if (data->mnd_UserData == msg->udata) { - return (IPTR)obj; + return (IPTR) obj; } return 0L; } @@ -522,14 +536,15 @@ IPTR Notify__MUIM_FindUData(struct IClass *cl, Object *obj, struct MUIP_FindUDat * contains the given <udata> and gets <attr> to <storage> for itself * in this case. */ -IPTR Notify__MUIM_GetUData(struct IClass *cl, Object *obj, struct MUIP_GetUData *msg) +IPTR Notify__MUIM_GetUData(struct IClass *cl, Object *obj, + struct MUIP_GetUData *msg) { struct MUI_NotifyData *data = INST_DATA(cl, obj); if (data->mnd_UserData == msg->udata) { - get(obj, msg->attr, msg->storage); - return TRUE; + get(obj, msg->attr, msg->storage); + return TRUE; } return FALSE; } @@ -543,23 +558,26 @@ IPTR Notify__MUIM_GetUData(struct IClass *cl, Object *obj, struct MUIP_GetUData /* * MUIM_KillNotify : kills previously given notifications on specific attributes. */ -IPTR Notify__MUIM_KillNotify(struct IClass *cl, Object *obj, struct MUIP_KillNotify *msg) +IPTR Notify__MUIM_KillNotify(struct IClass *cl, Object *obj, + struct MUIP_KillNotify *msg) { struct MUI_NotifyData *data = INST_DATA(cl, obj); - struct MinNode *node; - struct NotifyNode *nnode; + struct MinNode *node; + struct NotifyNode *nnode; - if (!data->mnd_NotifyList) return 0; + if (!data->mnd_NotifyList) + return 0; - for (node = data->mnd_NotifyList->mlh_Head; node->mln_Succ; node = node->mln_Succ) + for (node = data->mnd_NotifyList->mlh_Head; node->mln_Succ; + node = node->mln_Succ) { - nnode = (NNode)node; - if (msg->TrigAttr == nnode->nn_TrigAttr) - { - Remove((struct Node *)node); - DeleteNNode(data, nnode); - return 1; - } + nnode = (NNode) node; + if (msg->TrigAttr == nnode->nn_TrigAttr) + { + Remove((struct Node *)node); + DeleteNNode(data, nnode); + return 1; + } } return 0; } @@ -569,24 +587,27 @@ IPTR Notify__MUIM_KillNotify(struct IClass *cl, Object *obj, struct MUIP_KillNot * MUIM_KillNotifyObj : originally undocumented ! * Supposed to kill a notification with a given attr and a given dest. */ -IPTR Notify__MUIM_KillNotifyObj(struct IClass *cl, Object *obj, struct MUIP_KillNotifyObj *msg) +IPTR Notify__MUIM_KillNotifyObj(struct IClass *cl, Object *obj, + struct MUIP_KillNotifyObj *msg) { struct MUI_NotifyData *data = INST_DATA(cl, obj); - struct MinNode *node; - struct NotifyNode *nnode; + struct MinNode *node; + struct NotifyNode *nnode; - if (!data->mnd_NotifyList) return 0; + if (!data->mnd_NotifyList) + return 0; - for (node = data->mnd_NotifyList->mlh_Head; node->mln_Succ; node = node->mln_Succ) + for (node = data->mnd_NotifyList->mlh_Head; node->mln_Succ; + node = node->mln_Succ) { - nnode = (NNode)node; - if ((msg->TrigAttr == nnode->nn_TrigAttr) - && (msg->dest == nnode->nn_DestObj)) - { - Remove((struct Node *)node); - DeleteNNode(data, nnode); - return 1; - } + nnode = (NNode) node; + if ((msg->TrigAttr == nnode->nn_TrigAttr) + && (msg->dest == nnode->nn_DestObj)) + { + Remove((struct Node *)node); + DeleteNNode(data, nnode); + return 1; + } } return 0; } @@ -595,12 +616,13 @@ IPTR Notify__MUIM_KillNotifyObj(struct IClass *cl, Object *obj, struct MUIP_Kill /* * MUIM_MultiSet : Set an attribute for multiple objects. */ -IPTR Notify__MUIM_MultiSet(struct IClass *cl, Object *obj, struct MUIP_MultiSet *msg) +IPTR Notify__MUIM_MultiSet(struct IClass *cl, Object *obj, + struct MUIP_MultiSet *msg) { IPTR *destobj_p; - for (destobj_p = (IPTR*)&msg->obj; (*destobj_p) != 0; destobj_p++) + for (destobj_p = (IPTR *) & msg->obj; (*destobj_p) != 0; destobj_p++) { - set((APTR)*destobj_p, msg->attr, msg->val); + set((APTR) *destobj_p, msg->attr, msg->val); } return TRUE; } @@ -609,33 +631,36 @@ IPTR Notify__MUIM_MultiSet(struct IClass *cl, Object *obj, struct MUIP_MultiSet /* * MUIM_NoNotifySet : Acts like MUIM_Set but doesn't trigger any notification. */ -IPTR Notify__MUIM_NoNotifySet(struct IClass *cl, Object *obj, struct MUIP_NoNotifySet *msg) +IPTR Notify__MUIM_NoNotifySet(struct IClass *cl, Object *obj, + struct MUIP_NoNotifySet *msg) { - return SetAttrs(obj, MUIA_NoNotify, TRUE, msg->attr, msg->val, TAG_DONE); + return SetAttrs(obj, MUIA_NoNotify, TRUE, msg->attr, msg->val, + TAG_DONE); } /* * MUIM_Notify : Add a notification event handler to an object. */ -IPTR Notify__MUIM_Notify(struct IClass *cl, Object *obj, struct MUIP_Notify *msg) +IPTR Notify__MUIM_Notify(struct IClass *cl, Object *obj, + struct MUIP_Notify *msg) { struct MUI_NotifyData *data = INST_DATA(cl, obj); - struct NotifyNode *nnode; + struct NotifyNode *nnode; if (msg->FollowParams < 1) - return FALSE; + return FALSE; if (data->mnd_NotifyList == NULL) { - if (!(data->mnd_NotifyList = mui_alloc_struct(struct MinList))) - return FALSE; - NewList((struct List*)data->mnd_NotifyList); + if (!(data->mnd_NotifyList = mui_alloc_struct(struct MinList))) + return FALSE; + NewList((struct List *)data->mnd_NotifyList); } nnode = CreateNNode(data, msg); if (NULL == nnode) - return FALSE; + return FALSE; AddTail((struct List *)data->mnd_NotifyList, (struct Node *)nnode); return TRUE; @@ -645,7 +670,8 @@ IPTR Notify__MUIM_Notify(struct IClass *cl, Object *obj, struct MUIP_Notify *msg /* * MUIM_Set : Set an attribute to a value, useful within a MUIM_Notify method. */ -IPTR Notify__MUIM_Set(struct IClass *cl, Object *obj, struct MUIP_Set *msg) +IPTR Notify__MUIM_Set(struct IClass *cl, Object *obj, + struct MUIP_Set *msg) { return set(obj, msg->attr, msg->val); } @@ -653,27 +679,28 @@ IPTR Notify__MUIM_Set(struct IClass *cl, Object *obj, struct MUIP_Set *msg) /* * MUIM_SetAsString : Set a (text kind) attribute to a string. */ -IPTR Notify__MUIM_SetAsString(struct IClass *cl, Object *obj, struct MUIP_SetAsString *msg) +IPTR Notify__MUIM_SetAsString(struct IClass *cl, Object *obj, + struct MUIP_SetAsString *msg) { STRPTR txt; LONG txt_len; txt_len = 0; - RawDoFmt(msg->format, (ULONG *)&msg->val, - (VOID_FUNC)AROS_ASMSYMNAME(len_func), &txt_len); + RawDoFmt(msg->format, (ULONG *) & msg->val, + (VOID_FUNC) AROS_ASMSYMNAME(len_func), &txt_len); -/* D(bug("Notify_SetAsString: fmt=%s, txtlen=%d\n", msg->format, txt_len)); */ +/* D(bug("Notify_SetAsString: fmt=%s, txtlen=%d\n", msg->format, txt_len)); */ txt = AllocVec(txt_len + 1, 0); if (NULL == txt) - return FALSE; + return FALSE; { - STRPTR txtptr = txt; - RawDoFmt(msg->format, (ULONG *)&msg->val, - (VOID_FUNC)AROS_ASMSYMNAME(cpy_func), &txtptr); - } + STRPTR txtptr = txt; + RawDoFmt(msg->format, (ULONG *) & msg->val, + (VOID_FUNC) AROS_ASMSYMNAME(cpy_func), &txtptr); + } - set(obj, msg->attr, (IPTR)txt); + set(obj, msg->attr, (IPTR) txt); FreeVec(txt); return TRUE; @@ -684,14 +711,15 @@ IPTR Notify__MUIM_SetAsString(struct IClass *cl, Object *obj, struct MUIP_SetAsS * MUIM_SetUData : This method tests if the MUIA_UserData of the object * contains the given <udata> and sets <attr> to <val> for itself in this case. */ -IPTR Notify__MUIM_SetUData(struct IClass *cl, Object *obj, struct MUIP_SetUData *msg) +IPTR Notify__MUIM_SetUData(struct IClass *cl, Object *obj, + struct MUIP_SetUData *msg) { struct MUI_NotifyData *data = INST_DATA(cl, obj); if (data->mnd_UserData == msg->udata) { - set(obj, msg->attr, msg->val); - return TRUE; + set(obj, msg->attr, msg->val); + return TRUE; } return FALSE; } @@ -700,7 +728,8 @@ IPTR Notify__MUIM_SetUData(struct IClass *cl, Object *obj, struct MUIP_SetUData /* * MUIM_WriteLong : This method simply writes a longword somewhere to memory. */ -IPTR Notify__MUIM_WriteLong(struct IClass *cl, Object *obj, struct MUIP_WriteLong *msg) +IPTR Notify__MUIM_WriteLong(struct IClass *cl, Object *obj, + struct MUIP_WriteLong *msg) { *(msg->memory) = msg->val; return TRUE; @@ -710,7 +739,8 @@ IPTR Notify__MUIM_WriteLong(struct IClass *cl, Object *obj, struct MUIP_WriteLon /* * MUIM_WriteString : This method simply copies a string somewhere to memory. */ -IPTR Notify__MUIM_WriteString(struct IClass *cl, Object *obj, struct MUIP_WriteString *msg) +IPTR Notify__MUIM_WriteString(struct IClass *cl, Object *obj, + struct MUIP_WriteString *msg) { strcpy(msg->memory, msg->str); return TRUE; @@ -719,13 +749,14 @@ IPTR Notify__MUIM_WriteString(struct IClass *cl, Object *obj, struct MUIP_WriteS /************************************************************************** MUIM_ConnectParent **************************************************************************/ -IPTR Notify__MUIM_ConnectParent(struct IClass *cl, Object *obj, struct MUIP_ConnectParent *msg) +IPTR Notify__MUIM_ConnectParent(struct IClass *cl, Object *obj, + struct MUIP_ConnectParent *msg) { //struct MUI_NotifyData *data = INST_DATA(cl, obj); - /* Objects only have parents if they are inside a group or family object, no idea - ** why MUIA_Parent belongs to the notify class then - */ + /* Objects only have parents if they are inside a group or family object; + ** no idea why MUIA_Parent belongs to the notify class then + */ /* data->mnd_ParentObject = msg->parent;*/ muiGlobalInfo(obj) = muiGlobalInfo(msg->parent); return TRUE; @@ -734,11 +765,13 @@ IPTR Notify__MUIM_ConnectParent(struct IClass *cl, Object *obj, struct MUIP_Conn /************************************************************************** MUIM_DisconnectParent **************************************************************************/ -IPTR Notify__MUIM_DisconnectParent(struct IClass *cl, Object *obj, struct MUIP_DisconnectParent *msg) +IPTR Notify__MUIM_DisconnectParent(struct IClass *cl, Object *obj, + struct MUIP_DisconnectParent *msg) { //struct MUI_NotifyData *data = INST_DATA(cl, obj); /* data->mnd_ParentObject = NULL;*/ -#if 0 /* Some apps (YAM) seem to access this even after disconnection (Bernd Roesch) */ +#if 0 + /* Some apps (YAM) seem to access this even after disconnection */ muiGlobalInfo(obj) = NULL; #endif return 0; @@ -747,18 +780,21 @@ IPTR Notify__MUIM_DisconnectParent(struct IClass *cl, Object *obj, struct MUIP_D /************************************************************************** MUIM_GetConfigItem **************************************************************************/ -IPTR Notify__MUIM_GetConfigItem(struct IClass *cl, Object *obj, struct MUIP_GetConfigItem *msg) +IPTR Notify__MUIM_GetConfigItem(struct IClass *cl, Object *obj, + struct MUIP_GetConfigItem *msg) { - IPTR found = DoMethod(muiGlobalInfo(obj)->mgi_Configdata,MUIM_Dataspace_Find,msg->id); - + IPTR found = + DoMethod(muiGlobalInfo(obj)->mgi_Configdata, MUIM_Dataspace_Find, + msg->id); + if (found) { - *msg->storage = found; - return TRUE; + *msg->storage = found; + return TRUE; } else { - return FALSE; + return FALSE; } } @@ -767,43 +803,66 @@ BOOPSI_DISPATCHER(IPTR, Notify_Dispatcher, cl, obj, msg) { switch (msg->MethodID) { - case OM_NEW: return Notify__OM_NEW(cl, obj, (struct opSet *) msg); - case OM_DISPOSE: return Notify__OM_DISPOSE(cl, obj, msg); - case OM_SET: return Notify__OM_SET(cl, obj, (struct opSet *)msg); - case OM_GET: return Notify__OM_GET(cl, obj, (struct opGet *)msg); - - case MUIM_CallHook: return Notify__MUIM_CallHook(cl, obj, (APTR)msg); - case MUIM_Export: return TRUE; - case MUIM_FindUData: return Notify__MUIM_FindUData(cl, obj, (APTR)msg); - case MUIM_GetUData: return Notify__MUIM_GetUData(cl, obj, (APTR)msg); - case MUIM_Import: return TRUE; - case MUIM_KillNotify: return Notify__MUIM_KillNotify(cl, obj, (APTR)msg); - case MUIM_KillNotifyObj: return Notify__MUIM_KillNotifyObj(cl, obj, (APTR)msg); - case MUIM_MultiSet: return Notify__MUIM_MultiSet(cl, obj, (APTR)msg); - case MUIM_NoNotifySet: return Notify__MUIM_NoNotifySet(cl, obj, (APTR)msg); - case MUIM_Notify: return Notify__MUIM_Notify(cl, obj, (APTR)msg); - case MUIM_Set: return Notify__MUIM_Set(cl, obj, (APTR)msg); - case MUIM_SetAsString: return Notify__MUIM_SetAsString(cl, obj, (APTR)msg); - case MUIM_SetUData: return Notify__MUIM_SetUData(cl, obj, (APTR)msg); - case MUIM_SetUDataOnce: return Notify__MUIM_SetUData(cl, obj, (APTR)msg); /* use Notify_SetUData */ - case MUIM_WriteLong: return Notify__MUIM_WriteLong(cl, obj, (APTR)msg); - case MUIM_WriteString: return Notify__MUIM_WriteString(cl, obj, (APTR)msg); - case MUIM_ConnectParent: return Notify__MUIM_ConnectParent(cl,obj,(APTR)msg); - case MUIM_DisconnectParent: return Notify__MUIM_DisconnectParent(cl,obj,(APTR)msg); - case MUIM_GetConfigItem: return Notify__MUIM_GetConfigItem(cl,obj,(APTR)msg); + case OM_NEW: + return Notify__OM_NEW(cl, obj, (struct opSet *)msg); + case OM_DISPOSE: + return Notify__OM_DISPOSE(cl, obj, msg); + case OM_SET: + return Notify__OM_SET(cl, obj, (struct opSet *)msg); + case OM_GET: + return Notify__OM_GET(cl, obj, (struct opGet *)msg); + case MUIM_CallHook: + return Notify__MUIM_CallHook(cl, obj, (APTR) msg); + case MUIM_Export: + return TRUE; + case MUIM_FindUData: + return Notify__MUIM_FindUData(cl, obj, (APTR) msg); + case MUIM_GetUData: + return Notify__MUIM_GetUData(cl, obj, (APTR) msg); + case MUIM_Import: + return TRUE; + case MUIM_KillNotify: + return Notify__MUIM_KillNotify(cl, obj, (APTR) msg); + case MUIM_KillNotifyObj: + return Notify__MUIM_KillNotifyObj(cl, obj, (APTR) msg); + case MUIM_MultiSet: + return Notify__MUIM_MultiSet(cl, obj, (APTR) msg); + case MUIM_NoNotifySet: + return Notify__MUIM_NoNotifySet(cl, obj, (APTR) msg); + case MUIM_Notify: + return Notify__MUIM_Notify(cl, obj, (APTR) msg); + case MUIM_Set: + return Notify__MUIM_Set(cl, obj, (APTR) msg); + case MUIM_SetAsString: + return Notify__MUIM_SetAsString(cl, obj, (APTR) msg); + case MUIM_SetUData: + return Notify__MUIM_SetUData(cl, obj, (APTR) msg); + case MUIM_SetUDataOnce: + return Notify__MUIM_SetUData(cl, obj, (APTR) msg); + /* use Notify_SetUData */ + case MUIM_WriteLong: + return Notify__MUIM_WriteLong(cl, obj, (APTR) msg); + case MUIM_WriteString: + return Notify__MUIM_WriteString(cl, obj, (APTR) msg); + case MUIM_ConnectParent: + return Notify__MUIM_ConnectParent(cl, obj, (APTR) msg); + case MUIM_DisconnectParent: + return Notify__MUIM_DisconnectParent(cl, obj, (APTR) msg); + case MUIM_GetConfigItem: + return Notify__MUIM_GetConfigItem(cl, obj, (APTR) msg); } return DoSuperMethodA(cl, obj, msg); } BOOPSI_DISPATCHER_END - /* * Class descriptor. */ -const struct __MUIBuiltinClass _MUI_Notify_desc = { - MUIC_Notify, /* Class name */ - ROOTCLASS, /* super class name */ +const struct __MUIBuiltinClass _MUI_Notify_desc = +{ + MUIC_Notify, /* Class name */ + ROOTCLASS, /* super class name */ sizeof(struct MUI_NotifyData), /* size of class own datas */ - (void*)Notify_Dispatcher /* class dispatcher */ + (void *) Notify_Dispatcher /* class dispatcher */ }; diff --git a/workbench/libs/muimaster/classes/notify.h b/workbench/libs/muimaster/classes/notify.h dissimilarity index 83% index 2a82e32919..e8644523ed 100644 --- a/workbench/libs/muimaster/classes/notify.h +++ b/workbench/libs/muimaster/classes/notify.h @@ -1,101 +1,225 @@ -#ifndef _MUI_CLASSES_NOTIFY_H -#define _MUI_CLASSES_NOTIFY_H - -/* - Copyright © 2002-2003, The AROS Development Team. All rights reserved. - $Id$ -*/ - -struct MUI_NotifyData -{ - struct MUI_GlobalInfo *mnd_GlobalInfo; - IPTR mnd_UserData; - ULONG mnd_ObjectID; - - /* private starts here */ - struct MinList *mnd_NotifyList; /* priv1 */ - Object *mnd_ParentObject;/* priv2 */ - STRPTR mnd_HelpNode;/* priv3 */ - LONG mnd_HelpLine;/* priv4 */ -}; - -/*** Name *******************************************************************/ -#define MUIC_Notify "Notify.mui" - -/*** Identifier base (for Zune extensions) **********************************/ -#define MUIB_Notify (MUIB_ZUNE | 0x00001d00) - -/*** Methods ****************************************************************/ -#define MUIM_CallHook (MUIB_MUI|0x0042b96b) /* MUI: V4 */ -#define MUIM_Export (MUIB_MUI|0x00420f1c) /* MUI: V12 */ -#define MUIM_FindUData (MUIB_MUI|0x0042c196) /* MUI: V8 */ -#define MUIM_GetConfigItem (MUIB_MUI|0x00423edb) /* MUI: V11 */ -#define MUIM_GetUData (MUIB_MUI|0x0042ed0c) /* MUI: V8 */ -#define MUIM_Import (MUIB_MUI|0x0042d012) /* MUI: V12 */ -#define MUIM_KillNotify (MUIB_MUI|0x0042d240) /* MUI: V4 */ -#define MUIM_KillNotifyObj (MUIB_MUI|0x0042b145) /* MUI: V16 */ -#define MUIM_MultiSet (MUIB_MUI|0x0042d356) /* MUI: V7 */ -#define MUIM_NoNotifySet (MUIB_MUI|0x0042216f) /* MUI: V9 */ -#define MUIM_Notify (MUIB_MUI|0x0042c9cb) /* MUI: V4 */ -#define MUIM_Set (MUIB_MUI|0x0042549a) /* MUI: V4 */ -#define MUIM_SetAsString (MUIB_MUI|0x00422590) /* MUI: V4 */ -#define MUIM_SetUData (MUIB_MUI|0x0042c920) /* MUI: V8 */ -#define MUIM_SetUDataOnce (MUIB_MUI|0x0042ca19) /* MUI: V11 */ -#define MUIM_WriteLong (MUIB_MUI|0x00428d86) /* MUI: V6 */ -#define MUIM_WriteString (MUIB_MUI|0x00424bf4) /* MUI: V6 */ -struct MUIP_CallHook {STACKED ULONG MethodID; STACKED struct Hook *Hook; STACKED IPTR param1; /* more might follow */}; -struct MUIP_Export {STACKED ULONG MethodID; STACKED Object *dataspace;}; -struct MUIP_FindUData {STACKED ULONG MethodID; STACKED IPTR udata;}; -struct MUIP_GetConfigItem {STACKED ULONG MethodID; STACKED ULONG id; STACKED IPTR *storage;}; -struct MUIP_GetUData {STACKED ULONG MethodID; STACKED ULONG udata; STACKED ULONG attr; STACKED IPTR *storage;}; -struct MUIP_Import {STACKED ULONG MethodID; STACKED Object *dataspace;}; -struct MUIP_KillNotify {STACKED ULONG MethodID; STACKED ULONG TrigAttr;}; -struct MUIP_KillNotifyObj {STACKED ULONG MethodID; STACKED ULONG TrigAttr; STACKED Object *dest;}; -struct MUIP_MultiSet {STACKED ULONG MethodID; STACKED ULONG attr; STACKED IPTR val; STACKED APTR obj; /* more might follow */}; -struct MUIP_NoNotifySet {STACKED ULONG MethodID; STACKED ULONG attr; STACKED IPTR val; /* more might follow */}; -struct MUIP_Notify {STACKED ULONG MethodID; STACKED ULONG TrigAttr; STACKED IPTR TrigVal; STACKED APTR DestObj; STACKED ULONG FollowParams; /* more might follow */}; -struct MUIP_Set {STACKED ULONG MethodID; STACKED ULONG attr; STACKED IPTR val;}; -struct MUIP_SetAsString {STACKED ULONG MethodID; STACKED ULONG attr; STACKED char *format; STACKED IPTR val; /* more might follow */}; -struct MUIP_SetUData {STACKED ULONG MethodID; STACKED IPTR udata; STACKED ULONG attr; STACKED IPTR val;}; -struct MUIP_SetUDataOnce {STACKED ULONG MethodID; STACKED IPTR udata; STACKED ULONG attr; STACKED IPTR val;}; -struct MUIP_WriteLong {STACKED ULONG MethodID; STACKED ULONG val; STACKED ULONG *memory;}; -struct MUIP_WriteString {STACKED ULONG MethodID; STACKED char *str; STACKED char *memory;}; - -#define MUIM_ConnectParent (MUIB_Notify | 0x00000000) /* Zune: V1 */ -#define MUIM_DisconnectParent (MUIB_Notify | 0x00000001) /* Zune: V1 */ -struct MUIP_ConnectParent {STACKED ULONG MethodID; STACKED Object *parent;}; -struct MUIP_DisconnectParent {STACKED ULONG MethodID;}; - -/*** Attributes *************************************************************/ -#define MUIA_ApplicationObject (MUIB_MUI|0x0042d3ee) /* MUI: V4 ..g Object * */ -#define MUIA_AppMessage (MUIB_MUI|0x00421955) /* MUI: V5 ..g struct AppMessage * */ -#define MUIA_HelpLine (MUIB_MUI|0x0042a825) /* MUI: V4 isg LONG */ -#define MUIA_HelpNode (MUIB_MUI|0x00420b85) /* MUI: V4 isg STRPTR */ -#define MUIA_NoNotify (MUIB_MUI|0x004237f9) /* MUI: V7 .s. BOOL */ -#define MUIA_ObjectID (MUIB_MUI|0x0042d76e) /* MUI: V11 isg ULONG */ -#define MUIA_Parent (MUIB_MUI|0x0042e35f) /* MUI: V11 ..g Object * */ -#define MUIA_Revision (MUIB_MUI|0x00427eaa) /* MUI: V4 ..g LONG */ -#define MUIA_UserData (MUIB_MUI|0x00420313) /* MUI: V4 isg ULONG */ -#define MUIA_Version (MUIB_MUI|0x00422301) /* MUI: V4 ..g LONG */ - -/* Special values for MUIM_Notify */ -#define MUIV_TriggerValue 0x49893131UL -#define MUIV_NotTriggerValue 0x49893133UL -#define MUIV_EveryTime 0x49893131UL /* as TrigVal */ - -enum -{ - MUIV_Notify_Self = 1, - MUIV_Notify_Window, - MUIV_Notify_Application, - MUIV_Notify_Parent, -}; - -extern const struct __MUIBuiltinClass _MUI_Notify_desc; /* PRIV */ - -/* Private stuff */ - -#define _parent(obj) (muiNotifyData(obj)->mnd_ParentObject) /* Shortcut */ - - -#endif /* _MUI_CLASSES_NOTIFY_H */ +#ifndef _MUI_CLASSES_NOTIFY_H +#define _MUI_CLASSES_NOTIFY_H + +/* + Copyright © 2002-2003, The AROS Development Team. All rights reserved. + $Id$ +*/ + +struct MUI_NotifyData +{ + struct MUI_GlobalInfo *mnd_GlobalInfo; + IPTR mnd_UserData; + ULONG mnd_ObjectID; + + /* private starts here */ + struct MinList *mnd_NotifyList; /* priv1 */ + Object *mnd_ParentObject; /* priv2 */ + STRPTR mnd_HelpNode; /* priv3 */ + LONG mnd_HelpLine; /* priv4 */ +}; + +/*** Name *******************************************************************/ +#define MUIC_Notify "Notify.mui" + +/*** Identifier base (for Zune extensions) **********************************/ +#define MUIB_Notify (MUIB_ZUNE | 0x00001d00) + +/*** Methods ****************************************************************/ +#define MUIM_CallHook (MUIB_MUI | 0x0042b96b) /* MUI: V4 */ +#define MUIM_Export (MUIB_MUI | 0x00420f1c) /* MUI: V12 */ +#define MUIM_FindUData (MUIB_MUI | 0x0042c196) /* MUI: V8 */ +#define MUIM_GetConfigItem (MUIB_MUI | 0x00423edb) /* MUI: V11 */ +#define MUIM_GetUData (MUIB_MUI | 0x0042ed0c) /* MUI: V8 */ +#define MUIM_Import (MUIB_MUI | 0x0042d012) /* MUI: V12 */ +#define MUIM_KillNotify (MUIB_MUI | 0x0042d240) /* MUI: V4 */ +#define MUIM_KillNotifyObj (MUIB_MUI | 0x0042b145) /* MUI: V16 */ +#define MUIM_MultiSet (MUIB_MUI | 0x0042d356) /* MUI: V7 */ +#define MUIM_NoNotifySet (MUIB_MUI | 0x0042216f) /* MUI: V9 */ +#define MUIM_Notify (MUIB_MUI | 0x0042c9cb) /* MUI: V4 */ +#define MUIM_Set (MUIB_MUI | 0x0042549a) /* MUI: V4 */ +#define MUIM_SetAsString (MUIB_MUI | 0x00422590) /* MUI: V4 */ +#define MUIM_SetUData (MUIB_MUI | 0x0042c920) /* MUI: V8 */ +#define MUIM_SetUDataOnce (MUIB_MUI | 0x0042ca19) /* MUI: V11 */ +#define MUIM_WriteLong (MUIB_MUI | 0x00428d86) /* MUI: V6 */ +#define MUIM_WriteString (MUIB_MUI | 0x00424bf4) /* MUI: V6 */ + +struct MUIP_CallHook +{ + STACKED ULONG MethodID; + STACKED struct Hook *Hook; + STACKED IPTR param1; /* more might follow */ +}; + +struct MUIP_Export +{ + STACKED ULONG MethodID; + STACKED Object *dataspace; +}; + +struct MUIP_FindUData +{ + STACKED ULONG MethodID; + STACKED IPTR udata; +}; + +struct MUIP_GetConfigItem +{ + STACKED ULONG MethodID; + STACKED ULONG id; + STACKED IPTR *storage; +}; + +struct MUIP_GetUData +{ + STACKED ULONG MethodID; + STACKED ULONG udata; + STACKED ULONG attr; + STACKED IPTR *storage; +}; + +struct MUIP_Import +{ + STACKED ULONG MethodID; + STACKED Object *dataspace; +}; + +struct MUIP_KillNotify +{ + STACKED ULONG MethodID; + STACKED ULONG TrigAttr; +}; + +struct MUIP_KillNotifyObj +{ + STACKED ULONG MethodID; + STACKED ULONG TrigAttr; + STACKED Object *dest; +}; + +struct MUIP_MultiSet +{ + STACKED ULONG MethodID; + STACKED ULONG attr; + STACKED IPTR val; + STACKED APTR obj; /* more might follow */ +}; + +struct MUIP_NoNotifySet +{ + STACKED ULONG MethodID; + STACKED ULONG attr; + STACKED IPTR val; /* more might follow */ +}; + +struct MUIP_Notify +{ + STACKED ULONG MethodID; + STACKED ULONG TrigAttr; + STACKED IPTR TrigVal; + STACKED APTR DestObj; + STACKED ULONG FollowParams; /* more might follow */ +}; + +struct MUIP_Set +{ + STACKED ULONG MethodID; + STACKED ULONG attr; + STACKED IPTR val; +}; + +struct MUIP_SetAsString +{ + STACKED ULONG MethodID; + STACKED ULONG attr; + STACKED char *format; + STACKED IPTR val; /* more might follow */ +}; + +struct MUIP_SetUData +{ + STACKED ULONG MethodID; + STACKED IPTR udata; + STACKED ULONG attr; + STACKED IPTR val; +}; + +struct MUIP_SetUDataOnce +{ + STACKED ULONG MethodID; + STACKED IPTR udata; + STACKED ULONG attr; + STACKED IPTR val; +}; + +struct MUIP_WriteLong +{ + STACKED ULONG MethodID; + STACKED ULONG val; + STACKED ULONG *memory; +}; + +struct MUIP_WriteString +{ + STACKED ULONG MethodID; + STACKED char *str; + STACKED char *memory; +}; + +#define MUIM_ConnectParent (MUIB_Notify | 0x00000000) /* Zune: V1 */ +#define MUIM_DisconnectParent (MUIB_Notify | 0x00000001) /* Zune: V1 */ + +struct MUIP_ConnectParent +{ + STACKED ULONG MethodID; + STACKED Object *parent; +}; + +struct MUIP_DisconnectParent +{ + STACKED ULONG MethodID; +}; + +/*** Attributes *************************************************************/ +#define MUIA_ApplicationObject \ + (MUIB_MUI | 0x0042d3ee) /* MUI: V4 ..g Object * */ +#define MUIA_AppMessage \ + (MUIB_MUI | 0x00421955) /* MUI: V5 ..g struct AppMessage * */ +#define MUIA_HelpLine \ + (MUIB_MUI | 0x0042a825) /* MUI: V4 isg LONG */ +#define MUIA_HelpNode \ + (MUIB_MUI | 0x00420b85) /* MUI: V4 isg STRPTR */ +#define MUIA_NoNotify \ + (MUIB_MUI | 0x004237f9) /* MUI: V7 .s. BOOL */ +#define MUIA_ObjectID \ + (MUIB_MUI | 0x0042d76e) /* MUI: V11 isg ULONG */ +#define MUIA_Parent \ + (MUIB_MUI | 0x0042e35f) /* MUI: V11 ..g Object * */ +#define MUIA_Revision \ + (MUIB_MUI | 0x00427eaa) /* MUI: V4 ..g LONG */ +#define MUIA_UserData \ + (MUIB_MUI | 0x00420313) /* MUI: V4 isg ULONG */ +#define MUIA_Version \ + (MUIB_MUI | 0x00422301) /* MUI: V4 ..g LONG */ + +/* Special values for MUIM_Notify */ +#define MUIV_TriggerValue 0x49893131UL +#define MUIV_NotTriggerValue 0x49893133UL +#define MUIV_EveryTime 0x49893131UL /* as TrigVal */ + +enum +{ + MUIV_Notify_Self = 1, + MUIV_Notify_Window, + MUIV_Notify_Application, + MUIV_Notify_Parent, +}; + +extern const struct __MUIBuiltinClass _MUI_Notify_desc; /* PRIV */ + +/* Private stuff */ + +#define _parent(obj) (muiNotifyData(obj)->mnd_ParentObject) /* Shortcut */ + + +#endif /* _MUI_CLASSES_NOTIFY_H */ diff --git a/workbench/libs/muimaster/classes/numeric.c b/workbench/libs/muimaster/classes/numeric.c index a088a9ee29..6539f49135 100644 --- a/workbench/libs/muimaster/classes/numeric.c +++ b/workbench/libs/muimaster/classes/numeric.c @@ -20,20 +20,21 @@ struct MUI_NumericData { STRPTR format; - LONG defvalue; - LONG max; - LONG min; - LONG value; - ULONG flags; + LONG defvalue; + LONG max; + LONG min; + LONG value; + ULONG flags; struct MUI_EventHandlerNode ehn; char buf[50]; }; -enum numeric_flags { - NUMERIC_REVERSE = (1<<0), - NUMERIC_REVLEFTRIGHT = (1<<1), - NUMERIC_REVUPDOWN = (1<<2), - NUMERIC_CHECKALLSIZES = (1<<3), +enum numeric_flags +{ + NUMERIC_REVERSE = (1 << 0), + NUMERIC_REVLEFTRIGHT = (1 << 1), + NUMERIC_REVUPDOWN = (1 << 2), + NUMERIC_CHECKALLSIZES = (1 << 3), }; extern struct Library *MUIMasterBase; @@ -41,68 +42,72 @@ extern struct Library *MUIMasterBase; /************************************************************************** OM_NEW **************************************************************************/ -IPTR Numeric__OM_NEW(struct IClass *cl, Object * obj, struct opSet *msg) +IPTR Numeric__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) { struct MUI_NumericData *data; struct TagItem *tags, *tag; - + BOOL value_set = FALSE; - obj = (Object *)DoSuperMethodA(cl, obj, (Msg)msg); + obj = (Object *) DoSuperMethodA(cl, obj, (Msg) msg); if (!obj) - return 0; + return 0; data = INST_DATA(cl, obj); data->format = "%ld"; - data->max = 100; - data->min = 0; - data->flags = 0; + data->max = 100; + data->min = 0; + data->flags = 0; for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) { - switch (tag->ti_Tag) - { - case MUIA_Numeric_CheckAllSizes: - _handle_bool_tag(data->flags, tag->ti_Data, NUMERIC_CHECKALLSIZES); - break; - case MUIA_Numeric_Default: - /* data->defvalue = CLAMP(tag->ti_Data, data->min, data->max); */ - data->defvalue = tag->ti_Data; - break; - case MUIA_Numeric_Format: - data->format = (STRPTR)tag->ti_Data; - break; - case MUIA_Numeric_Max: - data->max = tag->ti_Data; - break; - case MUIA_Numeric_Min: - data->min = tag->ti_Data; - break; - case MUIA_Numeric_Reverse: - _handle_bool_tag(data->flags, tag->ti_Data, NUMERIC_REVERSE); - break; - case MUIA_Numeric_RevLeftRight: - _handle_bool_tag(data->flags, tag->ti_Data, NUMERIC_REVLEFTRIGHT); - break; - case MUIA_Numeric_RevUpDown: - _handle_bool_tag(data->flags, tag->ti_Data, NUMERIC_REVUPDOWN); - break; - case MUIA_Numeric_Value: - value_set = TRUE; - data->value = (LONG)tag->ti_Data; - break; - } + switch (tag->ti_Tag) + { + case MUIA_Numeric_CheckAllSizes: + _handle_bool_tag(data->flags, tag->ti_Data, + NUMERIC_CHECKALLSIZES); + break; + case MUIA_Numeric_Default: + /* data->defvalue = CLAMP(tag->ti_Data, data->min, data->max); */ + data->defvalue = tag->ti_Data; + break; + case MUIA_Numeric_Format: + data->format = (STRPTR) tag->ti_Data; + break; + case MUIA_Numeric_Max: + data->max = tag->ti_Data; + break; + case MUIA_Numeric_Min: + data->min = tag->ti_Data; + break; + case MUIA_Numeric_Reverse: + _handle_bool_tag(data->flags, tag->ti_Data, NUMERIC_REVERSE); + break; + case MUIA_Numeric_RevLeftRight: + _handle_bool_tag(data->flags, tag->ti_Data, + NUMERIC_REVLEFTRIGHT); + break; + case MUIA_Numeric_RevUpDown: + _handle_bool_tag(data->flags, tag->ti_Data, NUMERIC_REVUPDOWN); + break; + case MUIA_Numeric_Value: + value_set = TRUE; + data->value = (LONG) tag->ti_Data; + break; + } } - data->value = CLAMP(value_set ? data->value : data->defvalue, data->min, data->max); + data->value = + CLAMP(value_set ? data->value : data->defvalue, data->min, + data->max); - return (IPTR)obj; + return (IPTR) obj; } /************************************************************************** OM_SET **************************************************************************/ -IPTR Numeric__OM_SET(struct IClass *cl, Object * obj, struct opSet *msg) +IPTR Numeric__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) { struct MUI_NumericData *data = INST_DATA(cl, obj); struct TagItem *tags, *tag; @@ -110,7 +115,7 @@ IPTR Numeric__OM_SET(struct IClass *cl, Object * obj, struct opSet *msg) STRPTR oldfmt; IPTR ret; BOOL values_changed = FALSE; - + oldval = data->value; oldfmt = data->format; oldmin = data->min; @@ -118,55 +123,59 @@ IPTR Numeric__OM_SET(struct IClass *cl, Object * obj, struct opSet *msg) for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) { - switch (tag->ti_Tag) - { - case MUIA_Numeric_CheckAllSizes: - _handle_bool_tag(data->flags, tag->ti_Data, NUMERIC_CHECKALLSIZES); - break; - case MUIA_Numeric_Default: - /* data->defvalue = CLAMP(tag->ti_Data, data->min, data->max); */ - data->defvalue = tag->ti_Data; - break; - case MUIA_Numeric_Format: - data->format = (STRPTR)tag->ti_Data; - break; - case MUIA_Numeric_Max: - data->max = tag->ti_Data; - break; - case MUIA_Numeric_Min: - data->min = tag->ti_Data; - break; - case MUIA_Numeric_Reverse: - _handle_bool_tag(data->flags, tag->ti_Data, NUMERIC_REVERSE); - break; - case MUIA_Numeric_RevLeftRight: - _handle_bool_tag(data->flags, tag->ti_Data, NUMERIC_REVLEFTRIGHT); - break; - case MUIA_Numeric_RevUpDown: - _handle_bool_tag(data->flags, tag->ti_Data, NUMERIC_REVUPDOWN); - break; - case MUIA_Numeric_Value: - tag->ti_Data = CLAMP((LONG)tag->ti_Data, data->min, data->max); - - if (data->value == (LONG)tag->ti_Data) - tag->ti_Tag = TAG_IGNORE; - else - data->value = (LONG)tag->ti_Data; - - break; - } + switch (tag->ti_Tag) + { + case MUIA_Numeric_CheckAllSizes: + _handle_bool_tag(data->flags, tag->ti_Data, + NUMERIC_CHECKALLSIZES); + break; + case MUIA_Numeric_Default: + /* data->defvalue = CLAMP(tag->ti_Data, data->min, data->max); */ + data->defvalue = tag->ti_Data; + break; + case MUIA_Numeric_Format: + data->format = (STRPTR) tag->ti_Data; + break; + case MUIA_Numeric_Max: + data->max = tag->ti_Data; + break; + case MUIA_Numeric_Min: + data->min = tag->ti_Data; + break; + case MUIA_Numeric_Reverse: + _handle_bool_tag(data->flags, tag->ti_Data, NUMERIC_REVERSE); + break; + case MUIA_Numeric_RevLeftRight: + _handle_bool_tag(data->flags, tag->ti_Data, + NUMERIC_REVLEFTRIGHT); + break; + case MUIA_Numeric_RevUpDown: + _handle_bool_tag(data->flags, tag->ti_Data, NUMERIC_REVUPDOWN); + break; + case MUIA_Numeric_Value: + tag->ti_Data = CLAMP((LONG) tag->ti_Data, data->min, data->max); + + if (data->value == (LONG) tag->ti_Data) + tag->ti_Tag = TAG_IGNORE; + else + data->value = (LONG) tag->ti_Data; + + break; + } } - /* If the max, min or format values changed, then the minimum and maximum sizes - of the string output by MUIM_Numeric_Stringify may have changed, so - give the subclass a chance to recalculate them and relayout the group + /* If the max, min or format values changed, then the minimum and maximum + sizes of the string output by MUIM_Numeric_Stringify may have changed, + so give the subclass a chance to recalculate them and relayout the group accordingly. Basically, the subclass will have to react on changes to - these values as well (by setting a notification on them, or by overriding - OM_SET) and then recalculate the minimum and maximum sizes for the object. */ - if (data->format != oldfmt || data->min != oldmin || data->max != oldmax) + these values as well (by setting a notification on them, or by + overriding OM_SET) and then recalculate the minimum and maximum sizes + for the object. */ + if (data->format != oldfmt || data->min != oldmin + || data->max != oldmax) { values_changed = TRUE; - Object* parent = _parent(obj); + Object *parent = _parent(obj); if (parent) { DoMethod(parent, MUIM_Group_InitChange); @@ -174,83 +183,84 @@ IPTR Numeric__OM_SET(struct IClass *cl, Object * obj, struct opSet *msg) } } - ret = DoSuperMethodA(cl, obj, (Msg)msg); + ret = DoSuperMethodA(cl, obj, (Msg) msg); if (data->value != oldval || values_changed) { - MUI_Redraw(obj, MADF_DRAWUPDATE); + MUI_Redraw(obj, MADF_DRAWUPDATE); } - + return ret; } /************************************************************************** OM_GET **************************************************************************/ -IPTR Numeric__OM_GET(struct IClass *cl, Object * obj, struct opGet *msg) +IPTR Numeric__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) { struct MUI_NumericData *data = INST_DATA(cl, obj); IPTR *store = msg->opg_Storage; - ULONG tag = msg->opg_AttrID; + ULONG tag = msg->opg_AttrID; switch (tag) { - case MUIA_Numeric_CheckAllSizes: - *store = ((data->flags & NUMERIC_CHECKALLSIZES) != 0); - return TRUE; + case MUIA_Numeric_CheckAllSizes: + *store = ((data->flags & NUMERIC_CHECKALLSIZES) != 0); + return TRUE; - case MUIA_Numeric_Default: - *store = data->defvalue; - return TRUE; + case MUIA_Numeric_Default: + *store = data->defvalue; + return TRUE; - case MUIA_Numeric_Format: - *store = (IPTR)data->format; - return TRUE; + case MUIA_Numeric_Format: + *store = (IPTR) data->format; + return TRUE; - case MUIA_Numeric_Max: - *store = data->max; - return TRUE; + case MUIA_Numeric_Max: + *store = data->max; + return TRUE; - case MUIA_Numeric_Min: - *store = data->min; - return TRUE; + case MUIA_Numeric_Min: + *store = data->min; + return TRUE; - case MUIA_Numeric_Reverse: - *store = ((data->flags & NUMERIC_REVERSE) != 0); - return TRUE; + case MUIA_Numeric_Reverse: + *store = ((data->flags & NUMERIC_REVERSE) != 0); + return TRUE; - case MUIA_Numeric_RevLeftRight: - *store = ((data->flags & NUMERIC_REVLEFTRIGHT) != 0); - return TRUE; + case MUIA_Numeric_RevLeftRight: + *store = ((data->flags & NUMERIC_REVLEFTRIGHT) != 0); + return TRUE; - case MUIA_Numeric_RevUpDown: - *store = ((data->flags & NUMERIC_REVUPDOWN) != 0); - return TRUE; + case MUIA_Numeric_RevUpDown: + *store = ((data->flags & NUMERIC_REVUPDOWN) != 0); + return TRUE; - case MUIA_Numeric_Value: - *store = data->value; - return TRUE; + case MUIA_Numeric_Value: + *store = data->value; + return TRUE; } - return DoSuperMethodA(cl, obj, (Msg)msg); + return DoSuperMethodA(cl, obj, (Msg) msg); } /************************************************************************** MUIM_Setup **************************************************************************/ -IPTR Numeric__MUIM_Setup(struct IClass *cl, Object *obj, struct MUIP_Setup *msg) +IPTR Numeric__MUIM_Setup(struct IClass *cl, Object *obj, + struct MUIP_Setup *msg) { struct MUI_NumericData *data = INST_DATA(cl, obj); - if (!DoSuperMethodA(cl,obj,(Msg)msg)) - return FALSE; + if (!DoSuperMethodA(cl, obj, (Msg) msg)) + return FALSE; data->ehn.ehn_Events = IDCMP_RAWKEY; data->ehn.ehn_Priority = 0; - data->ehn.ehn_Flags = 0; - data->ehn.ehn_Object = obj; - data->ehn.ehn_Class = cl; - DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR)(&data->ehn)); + data->ehn.ehn_Flags = 0; + data->ehn.ehn_Object = obj; + data->ehn.ehn_Class = cl; + DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR) (&data->ehn)); return TRUE; } @@ -258,105 +268,107 @@ IPTR Numeric__MUIM_Setup(struct IClass *cl, Object *obj, struct MUIP_Setup *msg) /************************************************************************** MUIM_Cleanup **************************************************************************/ -IPTR Numeric__MUIM_Cleanup(struct IClass *cl, Object *obj, struct MUIP_Cleanup *msg) +IPTR Numeric__MUIM_Cleanup(struct IClass *cl, Object *obj, + struct MUIP_Cleanup *msg) { struct MUI_NumericData *data = INST_DATA(cl, obj); - DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR)(&data->ehn)); - return DoSuperMethodA(cl,obj,(Msg)msg); + DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR) (&data->ehn)); + return DoSuperMethodA(cl, obj, (Msg) msg); } /************************************************************************** MUIM_HandleEvent **************************************************************************/ -IPTR Numeric__MUIM_HandleEvent(struct IClass *cl, Object *obj, struct MUIP_HandleEvent *msg) +IPTR Numeric__MUIM_HandleEvent(struct IClass *cl, Object *obj, + struct MUIP_HandleEvent *msg) { struct MUI_NumericData *data = INST_DATA(cl, obj); if (msg->muikey != MUIKEY_NONE) { - LONG step; - - if (data->max - data->min < 10) - step = 1; - else - step = 10; - - switch(msg->muikey) - { - case MUIKEY_PRESS: - return MUI_EventHandlerRC_Eat; - - case MUIKEY_TOGGLE: - DoMethod(obj, MUIM_Numeric_SetDefault); - return MUI_EventHandlerRC_Eat; - - case MUIKEY_RELEASE: - return MUI_EventHandlerRC_Eat; - - case MUIKEY_BOTTOM: - case MUIKEY_LINEEND: - if (data->flags & NUMERIC_REVUPDOWN) - set(obj, MUIA_Numeric_Value, data->min); - else - set(obj, MUIA_Numeric_Value, data->max); - return MUI_EventHandlerRC_Eat; - - case MUIKEY_TOP: - case MUIKEY_LINESTART: - if (data->flags & NUMERIC_REVUPDOWN) - set(obj, MUIA_Numeric_Value, data->max); - else - set(obj, MUIA_Numeric_Value, data->min); - return MUI_EventHandlerRC_Eat; - - case MUIKEY_LEFT: - if (data->flags & NUMERIC_REVLEFTRIGHT) - DoMethod(obj, MUIM_Numeric_Increase, 1); - else - DoMethod(obj, MUIM_Numeric_Decrease, 1); - return MUI_EventHandlerRC_Eat; - - case MUIKEY_RIGHT: - if (data->flags & NUMERIC_REVLEFTRIGHT) - DoMethod(obj, MUIM_Numeric_Decrease, 1); - else - DoMethod(obj, MUIM_Numeric_Increase, 1); - return MUI_EventHandlerRC_Eat; - - case MUIKEY_UP: - if (data->flags & NUMERIC_REVUPDOWN) - DoMethod(obj, MUIM_Numeric_Increase, 1); - else - DoMethod(obj, MUIM_Numeric_Decrease, 1); - return MUI_EventHandlerRC_Eat; - - case MUIKEY_DOWN: - if (data->flags & NUMERIC_REVUPDOWN) - DoMethod(obj, MUIM_Numeric_Decrease, 1); - else - DoMethod(obj, MUIM_Numeric_Increase, 1); - return MUI_EventHandlerRC_Eat; - - case MUIKEY_PAGEDOWN: - case MUIKEY_WORDRIGHT: - if (data->flags & NUMERIC_REVUPDOWN) - DoMethod(obj, MUIM_Numeric_Decrease, step); - else - DoMethod(obj, MUIM_Numeric_Increase, step); - return MUI_EventHandlerRC_Eat; - - case MUIKEY_PAGEUP: - case MUIKEY_WORDLEFT: - if (data->flags & NUMERIC_REVUPDOWN) - DoMethod(obj, MUIM_Numeric_Increase, step); - else - DoMethod(obj, MUIM_Numeric_Decrease, step); - return MUI_EventHandlerRC_Eat; - - default: - return 0; - } + LONG step; + + if (data->max - data->min < 10) + step = 1; + else + step = 10; + + switch (msg->muikey) + { + case MUIKEY_PRESS: + return MUI_EventHandlerRC_Eat; + + case MUIKEY_TOGGLE: + DoMethod(obj, MUIM_Numeric_SetDefault); + return MUI_EventHandlerRC_Eat; + + case MUIKEY_RELEASE: + return MUI_EventHandlerRC_Eat; + + case MUIKEY_BOTTOM: + case MUIKEY_LINEEND: + if (data->flags & NUMERIC_REVUPDOWN) + set(obj, MUIA_Numeric_Value, data->min); + else + set(obj, MUIA_Numeric_Value, data->max); + return MUI_EventHandlerRC_Eat; + + case MUIKEY_TOP: + case MUIKEY_LINESTART: + if (data->flags & NUMERIC_REVUPDOWN) + set(obj, MUIA_Numeric_Value, data->max); + else + set(obj, MUIA_Numeric_Value, data->min); + return MUI_EventHandlerRC_Eat; + + case MUIKEY_LEFT: + if (data->flags & NUMERIC_REVLEFTRIGHT) + DoMethod(obj, MUIM_Numeric_Increase, 1); + else + DoMethod(obj, MUIM_Numeric_Decrease, 1); + return MUI_EventHandlerRC_Eat; + + case MUIKEY_RIGHT: + if (data->flags & NUMERIC_REVLEFTRIGHT) + DoMethod(obj, MUIM_Numeric_Decrease, 1); + else + DoMethod(obj, MUIM_Numeric_Increase, 1); + return MUI_EventHandlerRC_Eat; + + case MUIKEY_UP: + if (data->flags & NUMERIC_REVUPDOWN) + DoMethod(obj, MUIM_Numeric_Increase, 1); + else + DoMethod(obj, MUIM_Numeric_Decrease, 1); + return MUI_EventHandlerRC_Eat; + + case MUIKEY_DOWN: + if (data->flags & NUMERIC_REVUPDOWN) + DoMethod(obj, MUIM_Numeric_Decrease, 1); + else + DoMethod(obj, MUIM_Numeric_Increase, 1); + return MUI_EventHandlerRC_Eat; + + case MUIKEY_PAGEDOWN: + case MUIKEY_WORDRIGHT: + if (data->flags & NUMERIC_REVUPDOWN) + DoMethod(obj, MUIM_Numeric_Decrease, step); + else + DoMethod(obj, MUIM_Numeric_Increase, step); + return MUI_EventHandlerRC_Eat; + + case MUIKEY_PAGEUP: + case MUIKEY_WORDLEFT: + if (data->flags & NUMERIC_REVUPDOWN) + DoMethod(obj, MUIM_Numeric_Increase, step); + else + DoMethod(obj, MUIM_Numeric_Decrease, step); + return MUI_EventHandlerRC_Eat; + + default: + return 0; + } } return 0; @@ -366,23 +378,29 @@ IPTR Numeric__MUIM_HandleEvent(struct IClass *cl, Object *obj, struct MUIP_Handl /************************************************************************** MUIM_Numeric_Decrease **************************************************************************/ -IPTR Numeric__MUIM_Decrease(struct IClass *cl, Object * obj, struct MUIP_Numeric_Decrease *msg) +IPTR Numeric__MUIM_Decrease(struct IClass *cl, Object *obj, + struct MUIP_Numeric_Decrease *msg) { struct MUI_NumericData *data = INST_DATA(cl, obj); LONG newval = CLAMP(data->value - msg->amount, data->min, data->max); - if (newval != data->value) set(obj,MUIA_Numeric_Value, newval); + if (newval != data->value) + set(obj, MUIA_Numeric_Value, newval); + return 1; } /************************************************************************** MUIM_Numeric_Increase **************************************************************************/ -IPTR Numeric__MUIM_Increase(struct IClass *cl, Object * obj, struct MUIP_Numeric_Increase *msg) +IPTR Numeric__MUIM_Increase(struct IClass *cl, Object *obj, + struct MUIP_Numeric_Increase *msg) { struct MUI_NumericData *data = INST_DATA(cl, obj); LONG newval = CLAMP(data->value + msg->amount, data->min, data->max); - if (newval != data->value) set(obj,MUIA_Numeric_Value, newval); + if (newval != data->value) + set(obj, MUIA_Numeric_Value, newval); + return 1; } @@ -390,7 +408,8 @@ IPTR Numeric__MUIM_Increase(struct IClass *cl, Object * obj, struct MUIP_Numeric /************************************************************************** MUIM_Numeric_ScaleToValue **************************************************************************/ -IPTR Numeric__MUIM_ScaleToValue(struct IClass *cl, Object * obj, struct MUIP_Numeric_ScaleToValue *msg) +IPTR Numeric__MUIM_ScaleToValue(struct IClass *cl, Object *obj, + struct MUIP_Numeric_ScaleToValue *msg) { struct MUI_NumericData *data = INST_DATA(cl, obj); LONG min, max; @@ -400,15 +419,15 @@ IPTR Numeric__MUIM_ScaleToValue(struct IClass *cl, Object * obj, struct MUIP_Num min = (data->flags & NUMERIC_REVERSE) ? data->max : data->min; max = (data->flags & NUMERIC_REVERSE) ? data->min : data->max; - val = CLAMP(msg->scale - msg->scalemin, msg->scalemin, msg->scalemax); - d = msg->scalemax - msg->scalemin; + val = CLAMP(msg->scale - msg->scalemin, msg->scalemin, msg->scalemax); + d = msg->scalemax - msg->scalemin; // FIXME: watch out for overflow here. - val = val * (max - min); - + val = val * (max - min); + if (d) val /= d; - + val += min; return val; @@ -417,33 +436,36 @@ IPTR Numeric__MUIM_ScaleToValue(struct IClass *cl, Object * obj, struct MUIP_Num /************************************************************************** MUIM_Numeric_SetDefault **************************************************************************/ -IPTR Numeric__MUIM_SetDefault(struct IClass *cl, Object * obj, Msg msg) +IPTR Numeric__MUIM_SetDefault(struct IClass *cl, Object *obj, Msg msg) { struct MUI_NumericData *data = INST_DATA(cl, obj); - set(obj, MUIA_Numeric_Value, CLAMP(data->defvalue, data->min, data->max)); - + set(obj, MUIA_Numeric_Value, CLAMP(data->defvalue, data->min, + data->max)); + return 0; } /************************************************************************** MUIM_Numeric_Stringify **************************************************************************/ -IPTR Numeric__MUIM_Stringify(struct IClass *cl, Object * obj, struct MUIP_Numeric_Stringify *msg) +IPTR Numeric__MUIM_Stringify(struct IClass *cl, Object *obj, + struct MUIP_Numeric_Stringify *msg) { struct MUI_NumericData *data = INST_DATA(cl, obj); /* TODO: use RawDoFmt() and buffer overrun */ snprintf(data->buf, 49, data->format, (long)msg->value); data->buf[49] = 0; - - return (IPTR)data->buf; + + return (IPTR) data->buf; } /************************************************************************** MUIM_Numeric_ValueToScale **************************************************************************/ -IPTR Numeric__MUIM_ValueToScale(struct IClass *cl, Object * obj, struct MUIP_Numeric_ValueToScale *msg) +IPTR Numeric__MUIM_ValueToScale(struct IClass *cl, Object *obj, + struct MUIP_Numeric_ValueToScale *msg) { LONG val; struct MUI_NumericData *data = INST_DATA(cl, obj); @@ -454,13 +476,15 @@ IPTR Numeric__MUIM_ValueToScale(struct IClass *cl, Object * obj, struct MUIP_Num if (data->max != data->min) { - val = min + ((data->value - data->min) * (max - min) + (data->max - data->min)/2) / (data->max - data->min); + val = + min + ((data->value - data->min) * (max - min) + (data->max - + data->min) / 2) / (data->max - data->min); } else { - val = min; + val = min; } - + val = CLAMP(val, min, max); return val; @@ -469,26 +493,29 @@ IPTR Numeric__MUIM_ValueToScale(struct IClass *cl, Object * obj, struct MUIP_Num /************************************************************************** MUIM_Numeric_ValueToScaleExt **************************************************************************/ -IPTR Numeric__MUIM_ValueToScaleExt(struct IClass *cl, Object * obj, struct MUIP_Numeric_ValueToScaleExt *msg) +IPTR Numeric__MUIM_ValueToScaleExt(struct IClass *cl, Object *obj, + struct MUIP_Numeric_ValueToScaleExt *msg) { LONG scale; LONG value; struct MUI_NumericData *data = INST_DATA(cl, obj); LONG min, max; - value = CLAMP(msg->value,data->min,data->max); + value = CLAMP(msg->value, data->min, data->max); min = (data->flags & NUMERIC_REVERSE) ? msg->scalemax : msg->scalemin; max = (data->flags & NUMERIC_REVERSE) ? msg->scalemin : msg->scalemax; if (data->max != data->min) { - scale = min + ((value - data->min) * (max - min) + (data->max - data->min)/2) / (data->max - data->min); + scale = + min + ((value - data->min) * (max - min) + (data->max - + data->min) / 2) / (data->max - data->min); } else { - scale = min; + scale = min; } - + scale = CLAMP(scale, min, max); return scale; @@ -497,37 +524,39 @@ IPTR Numeric__MUIM_ValueToScaleExt(struct IClass *cl, Object * obj, struct MUIP_ /************************************************************************** MUIM_Export - to export an objects "contents" to a dataspace object. **************************************************************************/ -IPTR Numeric__MUIM_Export(struct IClass *cl, Object *obj, struct MUIP_Export *msg) +IPTR Numeric__MUIM_Export(struct IClass *cl, Object *obj, + struct MUIP_Export *msg) { struct MUI_NumericData *data = INST_DATA(cl, obj); ULONG id; if ((id = muiNotifyData(obj)->mnd_ObjectID)) { - LONG value = data->value; - DoMethod(msg->dataspace, MUIM_Dataspace_Add, - (IPTR) &value, - sizeof(value), - (IPTR) id); + LONG value = data->value; + DoMethod(msg->dataspace, MUIM_Dataspace_Add, + (IPTR) & value, sizeof(value), (IPTR) id); } return 0; } /************************************************************************** - MUIM_Import - to import an objects "contents" from a dataspace object. + MUIM_Import - to import an object's "contents" from a dataspace object. **************************************************************************/ -IPTR Numeric__MUIM_Import(struct IClass *cl, Object *obj, struct MUIP_Import *msg) +IPTR Numeric__MUIM_Import(struct IClass *cl, Object *obj, + struct MUIP_Import *msg) { ULONG id; LONG *s; if ((id = muiNotifyData(obj)->mnd_ObjectID)) { - if ((s = (LONG*) DoMethod(msg->dataspace, MUIM_Dataspace_Find, (IPTR) id))) - { - set(obj, MUIA_Numeric_Value, *s); - } + if ((s = (LONG *) DoMethod(msg->dataspace, MUIM_Dataspace_Find, + (IPTR) id))) + { + set(obj, MUIA_Numeric_Value, *s); + } } + return 0; } @@ -536,36 +565,50 @@ BOOPSI_DISPATCHER(IPTR, Numeric_Dispatcher, cl, obj, msg) { switch (msg->MethodID) { - case OM_NEW: return Numeric__OM_NEW(cl, obj, (APTR)msg); - case OM_SET: return Numeric__OM_SET(cl, obj, (APTR)msg); - case OM_GET: return Numeric__OM_GET(cl, obj, (APTR)msg); - - case MUIM_Setup: return Numeric__MUIM_Setup(cl, obj, (APTR)msg); - case MUIM_Cleanup: return Numeric__MUIM_Cleanup(cl, obj, (APTR)msg); - case MUIM_HandleEvent: return Numeric__MUIM_HandleEvent(cl, obj, (APTR)msg); - case MUIM_Numeric_Decrease: return Numeric__MUIM_Decrease(cl, obj, (APTR)msg); - case MUIM_Numeric_Increase: return Numeric__MUIM_Increase(cl, obj, (APTR)msg); - case MUIM_Numeric_ScaleToValue: return Numeric__MUIM_ScaleToValue(cl, obj, (APTR)msg); - case MUIM_Numeric_SetDefault: return Numeric__MUIM_SetDefault(cl, obj, (APTR)msg); - case MUIM_Numeric_Stringify: return Numeric__MUIM_Stringify(cl, obj, (APTR)msg); - case MUIM_Numeric_ValueToScale: return Numeric__MUIM_ValueToScale(cl, obj, (APTR)msg); - case MUIM_Numeric_ValueToScaleExt: return Numeric__MUIM_ValueToScaleExt(cl, obj, (APTR)msg); - case MUIM_Export: return Numeric__MUIM_Export(cl, obj, (APTR)msg); - case MUIM_Import: return Numeric__MUIM_Import(cl, obj, (APTR)msg); + case OM_NEW: + return Numeric__OM_NEW(cl, obj, (APTR) msg); + case OM_SET: + return Numeric__OM_SET(cl, obj, (APTR) msg); + case OM_GET: + return Numeric__OM_GET(cl, obj, (APTR) msg); + + case MUIM_Setup: + return Numeric__MUIM_Setup(cl, obj, (APTR) msg); + case MUIM_Cleanup: + return Numeric__MUIM_Cleanup(cl, obj, (APTR) msg); + case MUIM_HandleEvent: + return Numeric__MUIM_HandleEvent(cl, obj, (APTR) msg); + case MUIM_Numeric_Decrease: + return Numeric__MUIM_Decrease(cl, obj, (APTR) msg); + case MUIM_Numeric_Increase: + return Numeric__MUIM_Increase(cl, obj, (APTR) msg); + case MUIM_Numeric_ScaleToValue: + return Numeric__MUIM_ScaleToValue(cl, obj, (APTR) msg); + case MUIM_Numeric_SetDefault: + return Numeric__MUIM_SetDefault(cl, obj, (APTR) msg); + case MUIM_Numeric_Stringify: + return Numeric__MUIM_Stringify(cl, obj, (APTR) msg); + case MUIM_Numeric_ValueToScale: + return Numeric__MUIM_ValueToScale(cl, obj, (APTR) msg); + case MUIM_Numeric_ValueToScaleExt: + return Numeric__MUIM_ValueToScaleExt(cl, obj, (APTR) msg); + case MUIM_Export: + return Numeric__MUIM_Export(cl, obj, (APTR) msg); + case MUIM_Import: + return Numeric__MUIM_Import(cl, obj, (APTR) msg); } return DoSuperMethodA(cl, obj, msg); } BOOPSI_DISPATCHER_END - /* * Class descriptor. */ -const struct __MUIBuiltinClass _MUI_Numeric_desc = { - MUIC_Numeric, - MUIC_Area, - sizeof(struct MUI_NumericData), - (void*)Numeric_Dispatcher +const struct __MUIBuiltinClass _MUI_Numeric_desc = +{ + MUIC_Numeric, + MUIC_Area, + sizeof(struct MUI_NumericData), + (void *) Numeric_Dispatcher }; - diff --git a/workbench/libs/muimaster/classes/numeric.h b/workbench/libs/muimaster/classes/numeric.h dissimilarity index 78% index 35a28008d8..3b6db83686 100644 --- a/workbench/libs/muimaster/classes/numeric.h +++ b/workbench/libs/muimaster/classes/numeric.h @@ -1,45 +1,93 @@ -#ifndef _MUI_CLASSES_NUMERIC_H -#define _MUI_CLASSES_NUMERIC_H - -/* - Copyright © 2002-2003, The AROS Development Team. All rights reserved. - $Id$ -*/ - -/*** Name *******************************************************************/ -#define MUIC_Numeric "Numeric.mui" - -/*** Identifier base (for Zune extensions) **********************************/ -#define MUIB_Numeric (MUIB_ZUNE | 0x00001e00) - -/*** Methods ****************************************************************/ -#define MUIM_Numeric_Decrease (MUIB_MUI|0x004243a7) /* MUI: V11 */ -#define MUIM_Numeric_Increase (MUIB_MUI|0x00426ecd) /* MUI: V11 */ -#define MUIM_Numeric_ScaleToValue (MUIB_MUI|0x0042032c) /* MUI: V11 */ -#define MUIM_Numeric_SetDefault (MUIB_MUI|0x0042ab0a) /* MUI: V11 */ -#define MUIM_Numeric_Stringify (MUIB_MUI|0x00424891) /* MUI: V11 */ -#define MUIM_Numeric_ValueToScale (MUIB_MUI|0x00423e4f) /* MUI: V11 */ -struct MUIP_Numeric_Decrease {STACKED ULONG MethodID; STACKED LONG amount;}; -struct MUIP_Numeric_Increase {STACKED ULONG MethodID; STACKED LONG amount;}; -struct MUIP_Numeric_ScaleToValue {STACKED ULONG MethodID; STACKED LONG scalemin; STACKED LONG scalemax; STACKED LONG scale;}; -struct MUIP_Numeric_SetDefault {STACKED ULONG MethodID;}; -struct MUIP_Numeric_Stringify {STACKED ULONG MethodID; STACKED LONG value;}; -struct MUIP_Numeric_ValueToScale {STACKED ULONG MethodID; STACKED LONG scalemin; STACKED LONG scalemax;}; - -/*** Attributes *************************************************************/ -#define MUIA_Numeric_CheckAllSizes (MUIB_MUI|0x00421594) /* MUI: V11 isg BOOL */ -#define MUIA_Numeric_Default (MUIB_MUI|0x004263e8) /* MUI: V11 isg LONG */ -#define MUIA_Numeric_Format (MUIB_MUI|0x004263e9) /* MUI: V11 isg STRPTR */ -#define MUIA_Numeric_Max (MUIB_MUI|0x0042d78a) /* MUI: V11 isg LONG */ -#define MUIA_Numeric_Min (MUIB_MUI|0x0042e404) /* MUI: V11 isg LONG */ -#define MUIA_Numeric_Reverse (MUIB_MUI|0x0042f2a0) /* MUI: V11 isg BOOL */ -#define MUIA_Numeric_RevLeftRight (MUIB_MUI|0x004294a7) /* MUI: V11 isg BOOL */ -#define MUIA_Numeric_RevUpDown (MUIB_MUI|0x004252dd) /* MUI: V11 isg BOOL */ -#define MUIA_Numeric_Value (MUIB_MUI|0x0042ae3a) /* MUI: V11 isg LONG */ - -#define MUIM_Numeric_ValueToScaleExt (MUIB_Numeric | 0x00000000) /* ZUNE only */ -struct MUIP_Numeric_ValueToScaleExt {STACKED ULONG MethodID; STACKED LONG value; STACKED LONG scalemin; STACKED LONG scalemax;}; - -extern const struct __MUIBuiltinClass _MUI_Numeric_desc; /* PRIV */ - -#endif /* _MUI_CLASSES_NUMERIC_H */ +#ifndef _MUI_CLASSES_NUMERIC_H +#define _MUI_CLASSES_NUMERIC_H + +/* + Copyright © 2002-2003, The AROS Development Team. All rights reserved. + $Id$ +*/ + +/*** Name *******************************************************************/ +#define MUIC_Numeric "Numeric.mui" + +/*** Identifier base (for Zune extensions) **********************************/ +#define MUIB_Numeric (MUIB_ZUNE | 0x00001e00) + +/*** Methods ****************************************************************/ +#define MUIM_Numeric_Decrease (MUIB_MUI | 0x004243a7) /* MUI: V11 */ +#define MUIM_Numeric_Increase (MUIB_MUI | 0x00426ecd) /* MUI: V11 */ +#define MUIM_Numeric_ScaleToValue (MUIB_MUI | 0x0042032c) /* MUI: V11 */ +#define MUIM_Numeric_SetDefault (MUIB_MUI | 0x0042ab0a) /* MUI: V11 */ +#define MUIM_Numeric_Stringify (MUIB_MUI | 0x00424891) /* MUI: V11 */ +#define MUIM_Numeric_ValueToScale (MUIB_MUI | 0x00423e4f) /* MUI: V11 */ + +struct MUIP_Numeric_Decrease +{ + STACKED ULONG MethodID; + STACKED LONG amount; +}; + +struct MUIP_Numeric_Increase +{ + STACKED ULONG MethodID; + STACKED LONG amount; +}; + +struct MUIP_Numeric_ScaleToValue +{ + STACKED ULONG MethodID; + STACKED LONG scalemin; + STACKED LONG scalemax; + STACKED LONG scale; +}; + +struct MUIP_Numeric_SetDefault +{ + STACKED ULONG MethodID; +}; + +struct MUIP_Numeric_Stringify +{ + STACKED ULONG MethodID; + STACKED LONG value; +}; + +struct MUIP_Numeric_ValueToScale +{ + STACKED ULONG MethodID; + STACKED LONG scalemin; + STACKED LONG scalemax; +}; + +/*** Attributes *************************************************************/ +#define MUIA_Numeric_CheckAllSizes \ + (MUIB_MUI | 0x00421594) /* MUI: V11 isg BOOL */ +#define MUIA_Numeric_Default \ + (MUIB_MUI | 0x004263e8) /* MUI: V11 isg LONG */ +#define MUIA_Numeric_Format \ + (MUIB_MUI | 0x004263e9) /* MUI: V11 isg STRPTR */ +#define MUIA_Numeric_Max \ + (MUIB_MUI | 0x0042d78a) /* MUI: V11 isg LONG */ +#define MUIA_Numeric_Min \ + (MUIB_MUI | 0x0042e404) /* MUI: V11 isg LONG */ +#define MUIA_Numeric_Reverse \ + (MUIB_MUI | 0x0042f2a0) /* MUI: V11 isg BOOL */ +#define MUIA_Numeric_RevLeftRight \ + (MUIB_MUI | 0x004294a7) /* MUI: V11 isg BOOL */ +#define MUIA_Numeric_RevUpDown \ + (MUIB_MUI | 0x004252dd) /* MUI: V11 isg BOOL */ +#define MUIA_Numeric_Value \ + (MUIB_MUI | 0x0042ae3a) /* MUI: V11 isg LONG */ + +#define MUIM_Numeric_ValueToScaleExt MUIB_Numeric /* ZUNE only */ + +struct MUIP_Numeric_ValueToScaleExt +{ + STACKED ULONG MethodID; + STACKED LONG value; + STACKED LONG scalemin; + STACKED LONG scalemax; +}; + +extern const struct __MUIBuiltinClass _MUI_Numeric_desc; /* PRIV */ + +#endif /* _MUI_CLASSES_NUMERIC_H */ diff --git a/workbench/libs/muimaster/classes/numericbutton.c b/workbench/libs/muimaster/classes/numericbutton.c dissimilarity index 61% index 1091d2b03a..e1abe5cc90 100644 --- a/workbench/libs/muimaster/classes/numericbutton.c +++ b/workbench/libs/muimaster/classes/numericbutton.c @@ -1,545 +1,574 @@ -/* - Copyright 2002-2003, The AROS Development Team. All rights reserved. - $Id$ -*/ - -#define MUIMASTER_YES_INLINE_STDARG - -#include <exec/memory.h> -#include <clib/alib_protos.h> -#include <proto/exec.h> -#include <proto/dos.h> -#include <proto/intuition.h> -#include <proto/graphics.h> -#include <proto/utility.h> -#include <proto/muimaster.h> - -#include <string.h> -#include <stdio.h> - -#include "mui.h" -#include "muimaster_intern.h" -#include "support.h" -#include "frame.h" -#include "support_classes.h" -#include "prefs.h" -#include "imspec.h" -#include "debug.h" -#include "numericbutton_private.h" - -extern struct Library *MUIMasterBase; - -#define longget(obj,attr,var) \ - do \ - { \ - IPTR _iptr_var = *(var); \ - get(obj,attr,&_iptr_var); \ - *var = (LONG)_iptr_var; \ - } while(0) - -IPTR Numericbutton__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) -{ - obj = (Object *)DoSuperNewTags - ( - cl, obj, NULL, - MUIA_Background, MUII_ButtonBack, - MUIA_Frame, MUIV_Frame_Button, - TAG_MORE, (IPTR) msg->ops_AttrList - ); - - if (obj) - { - struct Numericbutton_DATA *data = INST_DATA(cl, obj); - - data->ehn.ehn_Events = IDCMP_MOUSEBUTTONS; - data->ehn.ehn_Priority = 0; - data->ehn.ehn_Flags = 0; - data->ehn.ehn_Object = obj; - data->ehn.ehn_Class = cl; - } - - return (IPTR)obj; -} - -/************************************************************************** - OM_SET -**************************************************************************/ -static ULONG Numericbutton__OM_SET(struct IClass *cl, Object * obj, struct opSet *msg) -{ - struct Numericbutton_DATA *data = INST_DATA(cl, obj); - struct TagItem *tags; - struct TagItem *tag; - - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) - { - switch (tag->ti_Tag) - { - case MUIA_Numeric_Max: - if (tag->ti_Data != XGET(obj, MUIA_Numeric_Max)) - data->needs_to_recalculate_sizes = TRUE; - break; - case MUIA_Numeric_Min: - if (tag->ti_Data != XGET(obj, MUIA_Numeric_Min)) - data->needs_to_recalculate_sizes = TRUE; - break; - case MUIA_Numeric_Format: - if (tag->ti_Data != XGET(obj, MUIA_Numeric_Format)) - data->needs_to_recalculate_sizes = TRUE; - break; - } - } - - return DoSuperMethodA(cl, obj, (Msg)msg); -} - -IPTR Numericbutton__MUIM_Setup(struct IClass *cl, Object *obj, struct MUIP_Setup *msg) -{ - struct Numericbutton_DATA *data = INST_DATA(cl, obj); -// const struct ZuneFrameGfx *knob_frame; - IPTR retval; - - retval = DoSuperMethodA(cl, obj, (Msg)msg); - if (retval) - { - //knob_frame = zune_zframe_get(obj, &muiGlobalInfo(obj)->mgi_Prefs->frames[MUIV_Frame_Knob]); - - data->knob_bg = zune_imspec_setup(MUII_ButtonBack, muiRenderInfo(obj)); - - DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR)&data->ehn); - - data->needs_to_recalculate_sizes = TRUE; - } - - return retval; -} - -IPTR Numericbutton__MUIM_Cleanup(struct IClass *cl, Object *obj, struct MUIP_Cleanup *msg) -{ - struct Numericbutton_DATA *data = INST_DATA(cl, obj); - - if (data->knob_bg) - { - zune_imspec_cleanup(data->knob_bg); - data->knob_bg = NULL; - } - - DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR)&data->ehn); - - return DoSuperMethodA(cl, obj, (Msg)msg); -} - -/************************************************************************** - MUIM_AskMinMax -**************************************************************************/ -IPTR Numericbutton__MUIM_AskMinMax(struct IClass *cl, Object *obj, struct MUIP_AskMinMax *msg) -{ - struct Numericbutton_DATA *data = INST_DATA(cl, obj); - - DoSuperMethodA(cl, obj, (Msg)msg); - - if (data->needs_to_recalculate_sizes) - { - struct RastPort rp; - LONG min = 0, max = 0, val, width; - - InitRastPort(&rp); - SetFont(&rp,_font(obj)); - - width = 0; - - longget(obj, MUIA_Numeric_Min, &min); - longget(obj, MUIA_Numeric_Max, &max); - - /* Determine the width of the knob */ - for (val=min;val<=max;val++) - { - LONG nw; - char *buf; - - buf = (char*)DoMethod(obj, MUIM_Numeric_Stringify, val); - nw = TextLength(&rp, buf, strlen(buf)); - - if (nw > width) - width = nw; - } - - data->max_text_width = width; - data->text_height = _font(obj)->tf_YSize; - - data->needs_to_recalculate_sizes = FALSE; - } - - msg->MinMaxInfo->MinWidth += data->max_text_width; - msg->MinMaxInfo->MinHeight += data->text_height; - msg->MinMaxInfo->DefWidth += data->max_text_width; - msg->MinMaxInfo->DefHeight += data->text_height; - msg->MinMaxInfo->MaxWidth += data->max_text_width; - msg->MinMaxInfo->MaxHeight += data->text_height; - - return TRUE; -} - -static void DrawKnob(Object *obj, struct Numericbutton_DATA *data, BOOL force) -{ - struct RastPort *rp, *saverp; - LONG x, val, pixeloffset, textlen, pixellen; - STRPTR text; - - pixeloffset = data->popwin->MouseX - data->pop_innerx - 2 - data->knob_clickoffset_x; - - val = DoMethod(obj, MUIM_Numeric_ScaleToValue, 0, - data->pop_innerw - data->knob_width, pixeloffset); - - data->knob_left = data->pop_innerx + pixeloffset; - data->knob_top = data->pop_innery; - data->knob_val = val; - - if (!force && (data->knob_left == data->knob_prev_left)) - { - return; - } - data->knob_prev_left = data->knob_left; - - if (data->knob_left < data->pop_innerx) - { - data->knob_left = data->pop_innerx; - } - else if (data->knob_left > data->pop_innerx + data->pop_innerw - data->knob_width) - { - data->knob_left = data->pop_innerx + data->pop_innerw - data->knob_width; - } - - saverp = _rp(obj); - _rp(obj) = rp = data->popwin->RPort; - - SetABPenDrMd(rp, _pens(obj)[MPEN_SHINE], 0, JAM1); - RectFill(rp, data->knob_left, data->knob_top, - data->knob_left, data->knob_top + data->knob_height - 1); - RectFill(rp, data->knob_left + 1, data->knob_top, - data->knob_left + data->knob_width - 1, data->knob_top); - SetAPen(rp, _pens(obj)[MPEN_SHADOW]); - RectFill(rp, data->knob_left + data->knob_width - 1, data->knob_top + 1, - data->knob_left + data->knob_width - 1, data->knob_top + data->knob_height - 1); - RectFill(rp, data->knob_left + 1, data->knob_top + data->knob_height - 1, - data->knob_left + data->knob_width - 2, data->knob_top + data->knob_height - 1); - - if (data->knob_bg) - { - // FIXME: Ugly hack? - - struct IBox old_mad_Box = muiAreaData(obj)->mad_Box; - - muiAreaData(obj)->mad_Box.Left = data->knob_left + 1; - muiAreaData(obj)->mad_Box.Top = data->knob_top + 1; - muiAreaData(obj)->mad_Box.Width = data->knob_width - 2; - muiAreaData(obj)->mad_Box.Height = data->knob_height - 2; - - zune_imspec_draw(data->knob_bg, muiRenderInfo(obj), - data->knob_left + 1, - data->knob_top + 1, - data->knob_width - 2, - data->knob_height - 2, - 0, - 0, - 0); - - muiAreaData(obj)->mad_Box = old_mad_Box; - } - else - { - SetAPen(rp, _pens(obj)[MPEN_BACKGROUND]); - RectFill(rp, data->knob_left + 1, data->knob_top + 1, - data->knob_left + data->knob_width - 2, - data->knob_top + data->knob_height - 2); - } - - SetFont(rp, _font(obj)); - - text = (STRPTR)DoMethod(obj, MUIM_Numeric_Stringify, val); - textlen = strlen(text); - pixellen = TextLength(_rp(obj), text, textlen); - - SetAPen(rp, _pens(obj)[MPEN_TEXT]); - Move(rp, data->knob_left + 2 + (data->knob_width - 4 - pixellen) / 2, - data->knob_top + 1 + rp->TxBaseline); - Text(rp, text, textlen); - - SetAPen(rp, _pens(obj)[MPEN_BACKGROUND]); - - if (data->knob_left - 1 >= data->pop_innerx) - { - RectFill(rp, data->pop_innerx, data->pop_innery, - data->knob_left - 1, data->pop_innery + data->pop_innerh - 1); - } - - x = data->knob_left + data->knob_width; - if (x <= data->pop_innerx + data->pop_innerw - 1) - { - RectFill(rp, x, data->pop_innery, - data->pop_innerx + data->pop_innerw - 1, - data->pop_innery + data->pop_innerh - 1); - } - - _rp(obj) = saverp; -} - -static void KillPopupWin(Object *obj, struct Numericbutton_DATA *data) -{ - if (data->popwin) - { - CloseWindow(data->popwin); - data->popwin = NULL; - } - - if (data->ehn.ehn_Events & IDCMP_MOUSEMOVE) - { - DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR)&data->ehn); - data->ehn.ehn_Events &= ~IDCMP_MOUSEMOVE; - DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR)&data->ehn); - } - -} - -static BOOL MakePopupWin(Object *obj, struct Numericbutton_DATA *data) -{ - const struct ZuneFrameGfx *zframe; - struct RastPort *rp, *saverp; - LONG winx, winy, winw, winh; - LONG framew, frameh; - LONG min = 0, max = 0; - - zframe = zune_zframe_get_with_state(obj, &muiGlobalInfo(obj)->mgi_Prefs->frames[MUIV_Frame_Slider], - muiGlobalInfo(obj)->mgi_Prefs->frames[MUIV_Frame_Slider].state); - - data->pop_innerx = zframe->ileft; - data->pop_innery = zframe->itop; - - data->knob_width = data->max_text_width + 4; - data->knob_height = data->text_height + 2; - - framew = data->pop_innerx + zframe->iright; - frameh = data->pop_innery + zframe->ibottom; - - longget(obj, MUIA_Numeric_Min, &min); - longget(obj, MUIA_Numeric_Max, &max); - - winw = max - min + data->knob_width + framew; - winh = data->knob_height + frameh; - - if (winw > _screen(obj)->Width) - { - winw = _screen(obj)->Width; - } - - if ((winw < data->knob_width + framew) || (winh > _screen(obj)->Height)) - { - return FALSE; - } - - data->pop_innerw = winw - framew; - data->pop_innerh = winh - frameh; - - data->knob_left = DoMethod(obj, MUIM_Numeric_ValueToScale, 0, data->pop_innerw - data->knob_width); - - winx = _window(obj)->LeftEdge + _mleft(obj) - - data->pop_innerx - 2 - - data->knob_left; - winy = _window(obj)->TopEdge + _mtop(obj) - 1- - data->pop_innery; - - data->popwin = OpenWindowTags(NULL, WA_CustomScreen, (IPTR)_screen(obj), - WA_Left, winx, - WA_Top, winy, - WA_Width, winw, - WA_Height, winh, - WA_AutoAdjust, TRUE, - WA_Borderless, TRUE, - WA_Activate, FALSE, - WA_BackFill, (IPTR)LAYERS_NOBACKFILL, - TAG_DONE); - - if (!data->popwin) - { - return FALSE; - } - - rp = data->popwin->RPort; - - saverp = _rp(obj); - _rp(obj) = rp; - zframe->draw(zframe->customframe, muiRenderInfo(obj), 0, 0, winw, winh, 0, 0, winw, winh); - - DrawKnob(obj, data, TRUE); - - - _rp(obj) = saverp; - - return TRUE; - -} - -/************************************************************************** - MUIM_Show -**************************************************************************/ -IPTR Numericbutton__MUIM_Show(struct IClass *cl, Object *obj, struct MUIP_Show *msg) -{ - struct Numericbutton_DATA *data = INST_DATA(cl, obj); - IPTR retval; - - retval = DoSuperMethodA(cl, obj, (Msg)msg); - - if (data->knob_bg) - zune_imspec_show(data->knob_bg, obj); - - return retval; -} - -/************************************************************************** - MUIM_Hide -**************************************************************************/ -IPTR Numericbutton__MUIM_Hide(struct IClass *cl, Object *obj, struct MUIP_Hide *msg) -{ - struct Numericbutton_DATA *data = INST_DATA(cl, obj); - - if (data->popwin) - { - KillPopupWin(obj, data); - } - - if (data->knob_bg) - zune_imspec_hide(data->knob_bg); - - return DoSuperMethodA(cl, obj, (Msg)msg); -} - - -/************************************************************************** - MUIM_Draw -**************************************************************************/ -IPTR Numericbutton__MUIM_Draw(struct IClass *cl, Object *obj, struct MUIP_Draw *msg) -{ - IPTR val = 0; - char *buf; - int width; - - DoSuperMethodA(cl,obj,(Msg)msg); - - if (!(msg->flags & (MADF_DRAWOBJECT | MADF_DRAWUPDATE))) - return FALSE; - - DoMethod(obj,MUIM_DrawBackground,_mleft(obj),_mtop(obj),_mwidth(obj),_mheight(obj), - _mleft(obj),_mtop(obj),0); - - SetFont(_rp(obj),_font(obj)); - SetABPenDrMd(_rp(obj),_pens(obj)[MPEN_TEXT],_pens(obj)[MPEN_BACKGROUND],JAM1); - - get(obj, MUIA_Numeric_Value, &val); - buf = (char*)DoMethod(obj,MUIM_Numeric_Stringify,val); - width = TextLength(_rp(obj),buf,strlen(buf)); - - Move(_rp(obj), _mleft(obj) + (_mwidth(obj) - width) / 2, - _mtop(obj) + _font(obj)->tf_Baseline); - - Text(_rp(obj), buf, strlen(buf)); - - return TRUE; -} - -/************************************************************************** - MUIM_HandleEvent -**************************************************************************/ -IPTR Numericbutton__MUIM_HandleEvent(struct IClass *cl, Object *obj, struct MUIP_HandleEvent *msg) -{ - struct Numericbutton_DATA *data = INST_DATA(cl, obj); - - if (!msg->imsg) - { - return 0; - } - - switch(msg->imsg->Class) - { - case IDCMP_MOUSEBUTTONS: - switch(msg->imsg->Code) - { - case SELECTDOWN: - if (_between(_left(obj), msg->imsg->MouseX, _right(obj)) && - _between(_top(obj), msg->imsg->MouseY, _bottom(obj)) && - (muiAreaData(obj)->mad_Flags & MADF_CANDRAW) && - !data->popwin) - { - data->knob_clickoffset_x = msg->imsg->MouseX - _mleft(obj); - - if (MakePopupWin(obj, data)) - { - DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR)&data->ehn); - data->ehn.ehn_Events |= IDCMP_MOUSEMOVE; - DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR)&data->ehn); - - return 0; - } - } - break; - - case SELECTUP: - case MENUUP: - case MIDDLEUP: - default: - if (data->popwin) - { - KillPopupWin(obj, data); - if ((msg->imsg->Code == SELECTUP)) - { - set(obj, MUIA_Numeric_Value, data->knob_val); - } - return 0; - } - break; - - - } /* switch(msg->imsg->Code) */ - break; - - case IDCMP_MOUSEMOVE: - if (data->popwin) - { - DrawKnob(obj, data, FALSE); - - return 0; - } - break; - - } /* switch(msg->imsg->Class) */ - - return 0; -} - - -#if ZUNE_BUILTIN_NUMERICBUTTON -BOOPSI_DISPATCHER(IPTR, Numericbutton_Dispatcher, cl, obj, msg) -{ - switch (msg->MethodID) - { - case OM_NEW: return Numericbutton__OM_NEW(cl, obj, (struct opSet *)msg); - case OM_SET: return Numericbutton__OM_SET(cl, obj, (struct opSet *)msg); - - case MUIM_Setup: return Numericbutton__MUIM_Setup(cl, obj, (struct MUIP_Setup *)msg); - case MUIM_Cleanup: return Numericbutton__MUIM_Cleanup(cl, obj, (struct MUIP_Cleanup *)msg); - case MUIM_Show: return Numericbutton__MUIM_Show(cl, obj, (struct MUIP_Show *)msg); - case MUIM_Hide: return Numericbutton__MUIM_Hide(cl, obj, (struct MUIP_Hide *)msg); - case MUIM_AskMinMax: return Numericbutton__MUIM_AskMinMax(cl, obj, (struct MUIP_AskMinMax *)msg); - case MUIM_Draw: return Numericbutton__MUIM_Draw(cl, obj, (struct MUIP_Draw *)msg); - case MUIM_HandleEvent: return Numericbutton__MUIM_HandleEvent(cl, obj, (struct MUIP_HandleEvent *)msg); - default: return DoSuperMethodA(cl, obj, msg); - } -} -BOOPSI_DISPATCHER_END - -const struct __MUIBuiltinClass _MUI_Numericbutton_desc = -{ - MUIC_Numericbutton, - MUIC_Numeric, - sizeof(struct Numericbutton_DATA), - (void*)Numericbutton_Dispatcher -}; -#endif /* ZUNE_BUILTIN_NUMERICBUTTON */ +/* + Copyright 2002-2003, The AROS Development Team. All rights reserved. + $Id$ +*/ + +#define MUIMASTER_YES_INLINE_STDARG + +#include <exec/memory.h> +#include <clib/alib_protos.h> +#include <proto/exec.h> +#include <proto/dos.h> +#include <proto/intuition.h> +#include <proto/graphics.h> +#include <proto/utility.h> +#include <proto/muimaster.h> + +#include <string.h> +#include <stdio.h> + +#include "mui.h" +#include "muimaster_intern.h" +#include "support.h" +#include "frame.h" +#include "support_classes.h" +#include "prefs.h" +#include "imspec.h" +#include "debug.h" +#include "numericbutton_private.h" + +extern struct Library *MUIMasterBase; + +#define longget(obj,attr,var) \ + do \ + { \ + IPTR _iptr_var = *(var); \ + get(obj,attr,&_iptr_var); \ + *var = (LONG)_iptr_var; \ + } while(0) + +IPTR Numericbutton__OM_NEW(struct IClass *cl, Object *obj, + struct opSet *msg) +{ + obj = (Object *) DoSuperNewTags(cl, obj, NULL, + MUIA_Background, MUII_ButtonBack, + MUIA_Frame, MUIV_Frame_Button, + TAG_MORE, (IPTR) msg->ops_AttrList); + + if (obj) + { + struct Numericbutton_DATA *data = INST_DATA(cl, obj); + + data->ehn.ehn_Events = IDCMP_MOUSEBUTTONS; + data->ehn.ehn_Priority = 0; + data->ehn.ehn_Flags = 0; + data->ehn.ehn_Object = obj; + data->ehn.ehn_Class = cl; + } + + return (IPTR) obj; +} + +/************************************************************************** + OM_SET +**************************************************************************/ +static ULONG Numericbutton__OM_SET(struct IClass *cl, Object *obj, + struct opSet *msg) +{ + struct Numericbutton_DATA *data = INST_DATA(cl, obj); + struct TagItem *tags; + struct TagItem *tag; + + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) + { + switch (tag->ti_Tag) + { + case MUIA_Numeric_Max: + if (tag->ti_Data != XGET(obj, MUIA_Numeric_Max)) + data->needs_to_recalculate_sizes = TRUE; + break; + case MUIA_Numeric_Min: + if (tag->ti_Data != XGET(obj, MUIA_Numeric_Min)) + data->needs_to_recalculate_sizes = TRUE; + break; + case MUIA_Numeric_Format: + if (tag->ti_Data != XGET(obj, MUIA_Numeric_Format)) + data->needs_to_recalculate_sizes = TRUE; + break; + } + } + + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +IPTR Numericbutton__MUIM_Setup(struct IClass *cl, Object *obj, + struct MUIP_Setup *msg) +{ + struct Numericbutton_DATA *data = INST_DATA(cl, obj); +// const struct ZuneFrameGfx *knob_frame; + IPTR retval; + + retval = DoSuperMethodA(cl, obj, (Msg) msg); + if (retval) + { + //knob_frame = zune_zframe_get(obj, + // &muiGlobalInfo(obj)->mgi_Prefs->frames[MUIV_Frame_Knob]); + + data->knob_bg = + zune_imspec_setup(MUII_ButtonBack, muiRenderInfo(obj)); + + DoMethod(_win(obj), MUIM_Window_AddEventHandler, + (IPTR) & data->ehn); + + data->needs_to_recalculate_sizes = TRUE; + } + + return retval; +} + +IPTR Numericbutton__MUIM_Cleanup(struct IClass *cl, Object *obj, + struct MUIP_Cleanup *msg) +{ + struct Numericbutton_DATA *data = INST_DATA(cl, obj); + + if (data->knob_bg) + { + zune_imspec_cleanup(data->knob_bg); + data->knob_bg = NULL; + } + + DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR) & data->ehn); + + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +/************************************************************************** + MUIM_AskMinMax +**************************************************************************/ +IPTR Numericbutton__MUIM_AskMinMax(struct IClass *cl, Object *obj, + struct MUIP_AskMinMax *msg) +{ + struct Numericbutton_DATA *data = INST_DATA(cl, obj); + + DoSuperMethodA(cl, obj, (Msg) msg); + + if (data->needs_to_recalculate_sizes) + { + struct RastPort rp; + LONG min = 0, max = 0, val, width; + + InitRastPort(&rp); + SetFont(&rp, _font(obj)); + + width = 0; + + longget(obj, MUIA_Numeric_Min, &min); + longget(obj, MUIA_Numeric_Max, &max); + + /* Determine the width of the knob */ + for (val = min; val <= max; val++) + { + LONG nw; + char *buf; + + buf = (char *)DoMethod(obj, MUIM_Numeric_Stringify, val); + nw = TextLength(&rp, buf, strlen(buf)); + + if (nw > width) + width = nw; + } + + data->max_text_width = width; + data->text_height = _font(obj)->tf_YSize; + + data->needs_to_recalculate_sizes = FALSE; + } + + msg->MinMaxInfo->MinWidth += data->max_text_width; + msg->MinMaxInfo->MinHeight += data->text_height; + msg->MinMaxInfo->DefWidth += data->max_text_width; + msg->MinMaxInfo->DefHeight += data->text_height; + msg->MinMaxInfo->MaxWidth += data->max_text_width; + msg->MinMaxInfo->MaxHeight += data->text_height; + + return TRUE; +} + +static void DrawKnob(Object *obj, struct Numericbutton_DATA *data, + BOOL force) +{ + struct RastPort *rp, *saverp; + LONG x, val, pixeloffset, textlen, pixellen; + STRPTR text; + + pixeloffset = + data->popwin->MouseX - data->pop_innerx - 2 - + data->knob_clickoffset_x; + + val = DoMethod(obj, MUIM_Numeric_ScaleToValue, 0, + data->pop_innerw - data->knob_width, pixeloffset); + + data->knob_left = data->pop_innerx + pixeloffset; + data->knob_top = data->pop_innery; + data->knob_val = val; + + if (!force && (data->knob_left == data->knob_prev_left)) + { + return; + } + data->knob_prev_left = data->knob_left; + + if (data->knob_left < data->pop_innerx) + { + data->knob_left = data->pop_innerx; + } + else if (data->knob_left > + data->pop_innerx + data->pop_innerw - data->knob_width) + { + data->knob_left = + data->pop_innerx + data->pop_innerw - data->knob_width; + } + + saverp = _rp(obj); + _rp(obj) = rp = data->popwin->RPort; + + SetABPenDrMd(rp, _pens(obj)[MPEN_SHINE], 0, JAM1); + RectFill(rp, data->knob_left, data->knob_top, + data->knob_left, data->knob_top + data->knob_height - 1); + RectFill(rp, data->knob_left + 1, data->knob_top, + data->knob_left + data->knob_width - 1, data->knob_top); + SetAPen(rp, _pens(obj)[MPEN_SHADOW]); + RectFill(rp, data->knob_left + data->knob_width - 1, data->knob_top + 1, + data->knob_left + data->knob_width - 1, + data->knob_top + data->knob_height - 1); + RectFill(rp, data->knob_left + 1, + data->knob_top + data->knob_height - 1, + data->knob_left + data->knob_width - 2, + data->knob_top + data->knob_height - 1); + + if (data->knob_bg) + { + // FIXME: Ugly hack? + + struct IBox old_mad_Box = muiAreaData(obj)->mad_Box; + + muiAreaData(obj)->mad_Box.Left = data->knob_left + 1; + muiAreaData(obj)->mad_Box.Top = data->knob_top + 1; + muiAreaData(obj)->mad_Box.Width = data->knob_width - 2; + muiAreaData(obj)->mad_Box.Height = data->knob_height - 2; + + zune_imspec_draw(data->knob_bg, muiRenderInfo(obj), + data->knob_left + 1, + data->knob_top + 1, + data->knob_width - 2, data->knob_height - 2, 0, 0, 0); + + muiAreaData(obj)->mad_Box = old_mad_Box; + } + else + { + SetAPen(rp, _pens(obj)[MPEN_BACKGROUND]); + RectFill(rp, data->knob_left + 1, data->knob_top + 1, + data->knob_left + data->knob_width - 2, + data->knob_top + data->knob_height - 2); + } + + SetFont(rp, _font(obj)); + + text = (STRPTR) DoMethod(obj, MUIM_Numeric_Stringify, val); + textlen = strlen(text); + pixellen = TextLength(_rp(obj), text, textlen); + + SetAPen(rp, _pens(obj)[MPEN_TEXT]); + Move(rp, data->knob_left + 2 + (data->knob_width - 4 - pixellen) / 2, + data->knob_top + 1 + rp->TxBaseline); + Text(rp, text, textlen); + + SetAPen(rp, _pens(obj)[MPEN_BACKGROUND]); + + if (data->knob_left - 1 >= data->pop_innerx) + { + RectFill(rp, data->pop_innerx, data->pop_innery, + data->knob_left - 1, data->pop_innery + data->pop_innerh - 1); + } + + x = data->knob_left + data->knob_width; + if (x <= data->pop_innerx + data->pop_innerw - 1) + { + RectFill(rp, x, data->pop_innery, + data->pop_innerx + data->pop_innerw - 1, + data->pop_innery + data->pop_innerh - 1); + } + + _rp(obj) = saverp; +} + +static void KillPopupWin(Object *obj, struct Numericbutton_DATA *data) +{ + if (data->popwin) + { + CloseWindow(data->popwin); + data->popwin = NULL; + } + + if (data->ehn.ehn_Events & IDCMP_MOUSEMOVE) + { + DoMethod(_win(obj), MUIM_Window_RemEventHandler, + (IPTR) & data->ehn); + data->ehn.ehn_Events &= ~IDCMP_MOUSEMOVE; + DoMethod(_win(obj), MUIM_Window_AddEventHandler, + (IPTR) & data->ehn); + } + +} + +static BOOL MakePopupWin(Object *obj, struct Numericbutton_DATA *data) +{ + const struct ZuneFrameGfx *zframe; + struct RastPort *rp, *saverp; + LONG winx, winy, winw, winh; + LONG framew, frameh; + LONG min = 0, max = 0; + + zframe = + zune_zframe_get_with_state(obj, + &muiGlobalInfo(obj)->mgi_Prefs->frames[MUIV_Frame_Slider], + muiGlobalInfo(obj)->mgi_Prefs->frames[MUIV_Frame_Slider].state); + + data->pop_innerx = zframe->ileft; + data->pop_innery = zframe->itop; + + data->knob_width = data->max_text_width + 4; + data->knob_height = data->text_height + 2; + + framew = data->pop_innerx + zframe->iright; + frameh = data->pop_innery + zframe->ibottom; + + longget(obj, MUIA_Numeric_Min, &min); + longget(obj, MUIA_Numeric_Max, &max); + + winw = max - min + data->knob_width + framew; + winh = data->knob_height + frameh; + + if (winw > _screen(obj)->Width) + { + winw = _screen(obj)->Width; + } + + if ((winw < data->knob_width + framew) || (winh > _screen(obj)->Height)) + { + return FALSE; + } + + data->pop_innerw = winw - framew; + data->pop_innerh = winh - frameh; + + data->knob_left = + DoMethod(obj, MUIM_Numeric_ValueToScale, 0, + data->pop_innerw - data->knob_width); + + winx = _window(obj)->LeftEdge + _mleft(obj) - + data->pop_innerx - 2 - data->knob_left; + winy = _window(obj)->TopEdge + _mtop(obj) - 1 - data->pop_innery; + + data->popwin = + OpenWindowTags(NULL, WA_CustomScreen, (IPTR) _screen(obj), WA_Left, + winx, WA_Top, winy, WA_Width, winw, WA_Height, winh, WA_AutoAdjust, + TRUE, WA_Borderless, TRUE, WA_Activate, FALSE, WA_BackFill, + (IPTR) LAYERS_NOBACKFILL, TAG_DONE); + + if (!data->popwin) + { + return FALSE; + } + + rp = data->popwin->RPort; + + saverp = _rp(obj); + _rp(obj) = rp; + zframe->draw(zframe->customframe, muiRenderInfo(obj), 0, 0, winw, winh, + 0, 0, winw, winh); + + DrawKnob(obj, data, TRUE); + + + _rp(obj) = saverp; + + return TRUE; + +} + +/************************************************************************** + MUIM_Show +**************************************************************************/ +IPTR Numericbutton__MUIM_Show(struct IClass *cl, Object *obj, + struct MUIP_Show *msg) +{ + struct Numericbutton_DATA *data = INST_DATA(cl, obj); + IPTR retval; + + retval = DoSuperMethodA(cl, obj, (Msg) msg); + + if (data->knob_bg) + zune_imspec_show(data->knob_bg, obj); + + return retval; +} + +/************************************************************************** + MUIM_Hide +**************************************************************************/ +IPTR Numericbutton__MUIM_Hide(struct IClass *cl, Object *obj, + struct MUIP_Hide *msg) +{ + struct Numericbutton_DATA *data = INST_DATA(cl, obj); + + if (data->popwin) + { + KillPopupWin(obj, data); + } + + if (data->knob_bg) + zune_imspec_hide(data->knob_bg); + + return DoSuperMethodA(cl, obj, (Msg) msg); +} + + +/************************************************************************** + MUIM_Draw +**************************************************************************/ +IPTR Numericbutton__MUIM_Draw(struct IClass *cl, Object *obj, + struct MUIP_Draw *msg) +{ + IPTR val = 0; + char *buf; + int width; + + DoSuperMethodA(cl, obj, (Msg) msg); + + if (!(msg->flags & (MADF_DRAWOBJECT | MADF_DRAWUPDATE))) + return FALSE; + + DoMethod(obj, MUIM_DrawBackground, _mleft(obj), _mtop(obj), + _mwidth(obj), _mheight(obj), _mleft(obj), _mtop(obj), 0); + + SetFont(_rp(obj), _font(obj)); + SetABPenDrMd(_rp(obj), _pens(obj)[MPEN_TEXT], + _pens(obj)[MPEN_BACKGROUND], JAM1); + + get(obj, MUIA_Numeric_Value, &val); + buf = (char *)DoMethod(obj, MUIM_Numeric_Stringify, val); + width = TextLength(_rp(obj), buf, strlen(buf)); + + Move(_rp(obj), _mleft(obj) + (_mwidth(obj) - width) / 2, + _mtop(obj) + _font(obj)->tf_Baseline); + + Text(_rp(obj), buf, strlen(buf)); + + return TRUE; +} + +/************************************************************************** + MUIM_HandleEvent +**************************************************************************/ +IPTR Numericbutton__MUIM_HandleEvent(struct IClass *cl, Object *obj, + struct MUIP_HandleEvent *msg) +{ + struct Numericbutton_DATA *data = INST_DATA(cl, obj); + + if (!msg->imsg) + { + return 0; + } + + switch (msg->imsg->Class) + { + case IDCMP_MOUSEBUTTONS: + switch (msg->imsg->Code) + { + case SELECTDOWN: + if (_between(_left(obj), msg->imsg->MouseX, _right(obj)) && + _between(_top(obj), msg->imsg->MouseY, _bottom(obj)) && + (muiAreaData(obj)->mad_Flags & MADF_CANDRAW) && + !data->popwin) + { + data->knob_clickoffset_x = msg->imsg->MouseX - _mleft(obj); + + if (MakePopupWin(obj, data)) + { + DoMethod(_win(obj), MUIM_Window_RemEventHandler, + (IPTR) & data->ehn); + data->ehn.ehn_Events |= IDCMP_MOUSEMOVE; + DoMethod(_win(obj), MUIM_Window_AddEventHandler, + (IPTR) & data->ehn); + + return 0; + } + } + break; + + case SELECTUP: + case MENUUP: + case MIDDLEUP: + default: + if (data->popwin) + { + KillPopupWin(obj, data); + if ((msg->imsg->Code == SELECTUP)) + { + set(obj, MUIA_Numeric_Value, data->knob_val); + } + return 0; + } + break; + + + } /* switch(msg->imsg->Code) */ + break; + + case IDCMP_MOUSEMOVE: + if (data->popwin) + { + DrawKnob(obj, data, FALSE); + + return 0; + } + break; + + } /* switch(msg->imsg->Class) */ + + return 0; +} + + +#if ZUNE_BUILTIN_NUMERICBUTTON +BOOPSI_DISPATCHER(IPTR, Numericbutton_Dispatcher, cl, obj, msg) +{ + switch (msg->MethodID) + { + case OM_NEW: + return Numericbutton__OM_NEW(cl, obj, (struct opSet *)msg); + case OM_SET: + return Numericbutton__OM_SET(cl, obj, (struct opSet *)msg); + + case MUIM_Setup: + return Numericbutton__MUIM_Setup(cl, obj, (struct MUIP_Setup *)msg); + case MUIM_Cleanup: + return Numericbutton__MUIM_Cleanup(cl, obj, + (struct MUIP_Cleanup *)msg); + case MUIM_Show: + return Numericbutton__MUIM_Show(cl, obj, (struct MUIP_Show *)msg); + case MUIM_Hide: + return Numericbutton__MUIM_Hide(cl, obj, (struct MUIP_Hide *)msg); + case MUIM_AskMinMax: + return Numericbutton__MUIM_AskMinMax(cl, obj, + (struct MUIP_AskMinMax *)msg); + case MUIM_Draw: + return Numericbutton__MUIM_Draw(cl, obj, (struct MUIP_Draw *)msg); + case MUIM_HandleEvent: + return Numericbutton__MUIM_HandleEvent(cl, obj, + (struct MUIP_HandleEvent *)msg); + default: + return DoSuperMethodA(cl, obj, msg); + } +} +BOOPSI_DISPATCHER_END + +const struct __MUIBuiltinClass _MUI_Numericbutton_desc = +{ + MUIC_Numericbutton, + MUIC_Numeric, + sizeof(struct Numericbutton_DATA), + (void *) Numericbutton_Dispatcher +}; +#endif /* ZUNE_BUILTIN_NUMERICBUTTON */ diff --git a/workbench/libs/muimaster/classes/numericbutton_private.h b/workbench/libs/muimaster/classes/numericbutton_private.h dissimilarity index 64% index cc0b683272..68cca4f89f 100644 --- a/workbench/libs/muimaster/classes/numericbutton_private.h +++ b/workbench/libs/muimaster/classes/numericbutton_private.h @@ -1,25 +1,25 @@ -#ifndef _NUMERICBUTTON_PRIVATE_H_ -#define _NUMERICBUTTON_PRIVATE_H_ - -struct Numericbutton_DATA -{ - struct MUI_EventHandlerNode ehn; - struct MUI_ImageSpec_intern *knob_bg; - struct Window *popwin; - LONG pop_innerw; - LONG pop_innerh; - LONG pop_innerx; - LONG pop_innery; - LONG knob_left; - LONG knob_top; - LONG knob_width; - LONG knob_height; - LONG knob_prev_left; - LONG knob_clickoffset_x; - LONG knob_val; - LONG max_text_width; - LONG text_height; - BOOL needs_to_recalculate_sizes; -}; - -#endif /* _NUMERICBUTTON_PRIVATE_H_ */ +#ifndef _NUMERICBUTTON_PRIVATE_H_ +#define _NUMERICBUTTON_PRIVATE_H_ + +struct Numericbutton_DATA +{ + struct MUI_EventHandlerNode ehn; + struct MUI_ImageSpec_intern *knob_bg; + struct Window *popwin; + LONG pop_innerw; + LONG pop_innerh; + LONG pop_innerx; + LONG pop_innery; + LONG knob_left; + LONG knob_top; + LONG knob_width; + LONG knob_height; + LONG knob_prev_left; + LONG knob_clickoffset_x; + LONG knob_val; + LONG max_text_width; + LONG text_height; + BOOL needs_to_recalculate_sizes; +}; + +#endif /* _NUMERICBUTTON_PRIVATE_H_ */ diff --git a/workbench/libs/muimaster/classes/palette.c b/workbench/libs/muimaster/classes/palette.c index c5930b60fd..59a360fd22 100644 --- a/workbench/libs/muimaster/classes/palette.c +++ b/workbench/libs/muimaster/classes/palette.c @@ -34,53 +34,62 @@ extern struct Library *MUIMasterBase; -static LONG display_func(struct Hook *hook, char **array, struct MUI_Palette_Entry *entry) +static LONG display_func(struct Hook *hook, char **array, + struct MUI_Palette_Entry *entry) { struct MUI_PaletteData *data = hook->h_Data; - - if (data->names) { /* does any strings exist */ - *array = (char *)data->names[(SIPTR) array[-1]]; /*then display user names */ - array++; - } else { - sprintf(data->buf,"Color %ld",(long)(array[-1]+1)); /* if nos show default color names */ + + /* do any strings exist? */ + if (data->names) + { + /* then display user names */ + *array = (char *)data->names[(SIPTR) array[-1]]; + array++; + } + else + { + /* if no, show default color names */ + sprintf(data->buf, "Color %ld", (long)(array[-1] + 1)); *array++ = data->buf; } return 0; } -static void NotifyGun(Object *obj, struct MUI_PaletteData *data, LONG gun) +static void NotifyGun(Object * obj, struct MUI_PaletteData *data, LONG gun) { - static Tag guntotag[3] = - { + static Tag guntotag[3] = { MUIA_Coloradjust_Red, MUIA_Coloradjust_Green, MUIA_Coloradjust_Blue }; - - struct TagItem tags[] = - { - {0 , 0}, + + struct TagItem tags[] = { + {0, 0}, {MUIA_Coloradjust_RGB, 0}, - {TAG_DONE } + {TAG_DONE} }; tags[0].ti_Tag = guntotag[gun]; tags[0].ti_Data = data->rgb[gun]; - tags[1].ti_Data = (IPTR)data->rgb; - - CoerceMethod(data->notifyclass, obj, OM_SET, (IPTR)tags, NULL); + tags[1].ti_Data = (IPTR) data->rgb; + + CoerceMethod(data->notifyclass, obj, OM_SET, (IPTR) tags, NULL); } -static LONG setcolor_func(struct Hook *hook, APTR *obj, STACKULONG *notify) +static LONG setcolor_func(struct Hook *hook, APTR * obj, + STACKULONG * notify) { ULONG mode = *notify++; ULONG gun = *notify++; - struct MUI_PaletteData *data = (struct MUI_PaletteData *) *notify++; - + struct MUI_PaletteData *data = (struct MUI_PaletteData *)*notify++; + LONG entrie = XGET(data->list, MUIA_List_Active); - if ((entrie < 0) || (entrie >= data->numentries)) return 0; - if (mode == 1) { - if (data->numentries > 0) { + if ((entrie < 0) || (entrie >= data->numentries)) + return 0; + if (mode == 1) + { + if (data->numentries > 0) + { ULONG r = data->entries[entrie].mpe_Red; ULONG g = data->entries[entrie].mpe_Green; ULONG b = data->entries[entrie].mpe_Blue; @@ -90,12 +99,17 @@ static LONG setcolor_func(struct Hook *hook, APTR *obj, STACKULONG *notify) data->rgb[0] = r; data->rgb[1] = g; data->rgb[2] = b; - NotifyGun((Object*)obj, data, gun); + NotifyGun((Object *) obj, data, gun); } - } else if (mode == 2) { - data->entries[entrie].mpe_Red = XGET(data->coloradjust, MUIA_Coloradjust_Red); - data->entries[entrie].mpe_Green = XGET(data->coloradjust, MUIA_Coloradjust_Green); - data->entries[entrie].mpe_Blue = XGET(data->coloradjust, MUIA_Coloradjust_Blue); + } + else if (mode == 2) + { + data->entries[entrie].mpe_Red = + XGET(data->coloradjust, MUIA_Coloradjust_Red); + data->entries[entrie].mpe_Green = + XGET(data->coloradjust, MUIA_Coloradjust_Green); + data->entries[entrie].mpe_Blue = + XGET(data->coloradjust, MUIA_Coloradjust_Blue); } return 0; } @@ -103,51 +117,56 @@ static LONG setcolor_func(struct Hook *hook, APTR *obj, STACKULONG *notify) /************************************************************************** OM_NEW **************************************************************************/ -IPTR Palette__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) +IPTR Palette__OM_NEW(struct IClass * cl, Object * obj, struct opSet * msg) { - struct MUI_PaletteData *data; - //struct TagItem *tag, *tags; - struct MUI_Palette_Entry *e; + struct MUI_PaletteData *data; + //struct TagItem *tag, *tags; + struct MUI_Palette_Entry *e; Object *list, *coloradjust; int i; obj = (Object *) DoSuperNewTags(cl, obj, NULL, GroupFrame, - MUIA_Background, MUII_ButtonBack, + MUIA_Background, MUII_ButtonBack, MUIA_Group_Horiz, TRUE, Child, list = ListviewObject, - MUIA_Listview_List, ListObject, - End, + MUIA_Listview_List, ListObject, End, - Child, coloradjust = ColoradjustObject, End, - TAG_MORE, (IPTR) msg->ops_AttrList); + Child, coloradjust = ColoradjustObject, + End, TAG_MORE, (IPTR) msg->ops_AttrList); + + if (obj == NULL) + return (IPTR) NULL; - if (obj == NULL) return (IPTR)NULL; - data = INST_DATA(cl, obj); - + data->list = list; data->coloradjust = coloradjust; - - data->display_hook.h_Entry = HookEntry; - data->display_hook.h_SubEntry = (HOOKFUNC)display_func; - data->display_hook.h_Data = data; - data->setcolor_hook.h_Entry = HookEntry; - data->setcolor_hook.h_SubEntry = (HOOKFUNC)setcolor_func; - data->setcolor_hook.h_Data = data; - - nnset(list, MUIA_List_DisplayHook, (IPTR)&data->display_hook); - - data->entries = (struct MUI_Palette_Entry*)GetTagData(MUIA_Palette_Entries, 0, msg->ops_AttrList); - data->names = (const char**)GetTagData(MUIA_Palette_Names, 0, msg->ops_AttrList); + + data->display_hook.h_Entry = HookEntry; + data->display_hook.h_SubEntry = (HOOKFUNC) display_func; + data->display_hook.h_Data = data; + data->setcolor_hook.h_Entry = HookEntry; + data->setcolor_hook.h_SubEntry = (HOOKFUNC) setcolor_func; + data->setcolor_hook.h_Data = data; + + nnset(list, MUIA_List_DisplayHook, (IPTR) & data->display_hook); + + data->entries = + (struct MUI_Palette_Entry *)GetTagData(MUIA_Palette_Entries, 0, + msg->ops_AttrList); + data->names = + (const char **)GetTagData(MUIA_Palette_Names, 0, msg->ops_AttrList); data->group = GetTagData(MUIA_Palette_Groupable, 0, msg->ops_AttrList); data->numentries = 0; e = data->entries; - if (e) { + if (e) + { data->numentries = 0; - while(e->mpe_ID != MUIV_Palette_Entry_End) { + while (e->mpe_ID != MUIV_Palette_Entry_End) + { data->numentries++; e++; } @@ -155,97 +174,110 @@ IPTR Palette__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) data->notifyclass = cl->cl_Super->cl_Super; - if (data->numentries > 0) { - for (i = 0; i < data->numentries; i++) DoMethod(data->list,MUIM_List_InsertSingle,&data->entries[i],MUIV_List_Insert_Bottom); - - nnset(data->coloradjust, MUIA_Coloradjust_Red, data->entries[0].mpe_Red); - nnset(data->coloradjust, MUIA_Coloradjust_Green, data->entries[0].mpe_Green); - nnset(data->coloradjust, MUIA_Coloradjust_Blue, data->entries[0].mpe_Blue); + if (data->numentries > 0) + { + for (i = 0; i < data->numentries; i++) + DoMethod(data->list, MUIM_List_InsertSingle, &data->entries[i], + MUIV_List_Insert_Bottom); + + nnset(data->coloradjust, MUIA_Coloradjust_Red, + data->entries[0].mpe_Red); + nnset(data->coloradjust, MUIA_Coloradjust_Green, + data->entries[0].mpe_Green); + nnset(data->coloradjust, MUIA_Coloradjust_Blue, + data->entries[0].mpe_Blue); nnset(data->list, MUIA_List_Active, 0); data->rgb[0] = data->entries[0].mpe_Red; data->rgb[1] = data->entries[0].mpe_Green; data->rgb[2] = data->entries[0].mpe_Blue; } - - DoMethod(data->list, MUIM_Notify, MUIA_List_Active, MUIV_EveryTime , obj, 5, MUIM_CallHook, &data->setcolor_hook, 1, 0, data); - DoMethod(data->coloradjust, MUIM_Notify, MUIA_Coloradjust_Red, MUIV_EveryTime, obj, 5, MUIM_CallHook, &data->setcolor_hook, 2, 0, data); - DoMethod(data->coloradjust, MUIM_Notify, MUIA_Coloradjust_Green, MUIV_EveryTime, obj, 5, MUIM_CallHook, &data->setcolor_hook, 2, 1, data); - DoMethod(data->coloradjust, MUIM_Notify, MUIA_Coloradjust_Blue, MUIV_EveryTime, obj, 5, MUIM_CallHook, &data->setcolor_hook, 2, 2, data); - return (IPTR)obj; + + DoMethod(data->list, MUIM_Notify, MUIA_List_Active, MUIV_EveryTime, obj, + 5, MUIM_CallHook, &data->setcolor_hook, 1, 0, data); + DoMethod(data->coloradjust, MUIM_Notify, MUIA_Coloradjust_Red, + MUIV_EveryTime, obj, 5, MUIM_CallHook, &data->setcolor_hook, 2, 0, + data); + DoMethod(data->coloradjust, MUIM_Notify, MUIA_Coloradjust_Green, + MUIV_EveryTime, obj, 5, MUIM_CallHook, &data->setcolor_hook, 2, 1, + data); + DoMethod(data->coloradjust, MUIM_Notify, MUIA_Coloradjust_Blue, + MUIV_EveryTime, obj, 5, MUIM_CallHook, &data->setcolor_hook, 2, 2, + data); + return (IPTR) obj; } /************************************************************************** OM_SET **************************************************************************/ -IPTR Palette__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) +IPTR Palette__OM_SET(struct IClass * cl, Object * obj, struct opSet * msg) { - struct MUI_PaletteData *data; - struct TagItem *tag, *tags; + struct MUI_PaletteData *data; + struct TagItem *tag, *tags; data = INST_DATA(cl, obj); - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) { - switch (tag->ti_Tag) - { - case MUIA_Palette_Entries: - data->entries = (struct MUI_Palette_Entry *) tag->ti_Data; - break; - - case MUIA_Palette_Names: - data->names = (const char **) tag->ti_Data; - break; - - case MUIA_Palette_Groupable: - data->group = (ULONG) tag->ti_Data; - break; - } + switch (tag->ti_Tag) + { + case MUIA_Palette_Entries: + data->entries = (struct MUI_Palette_Entry *)tag->ti_Data; + break; + + case MUIA_Palette_Names: + data->names = (const char **)tag->ti_Data; + break; + + case MUIA_Palette_Groupable: + data->group = (ULONG) tag->ti_Data; + break; + } } - return DoSuperMethodA(cl,obj,(Msg)msg); + return DoSuperMethodA(cl, obj, (Msg) msg); } /************************************************************************** OM_GET **************************************************************************/ -IPTR Palette__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) +IPTR Palette__OM_GET(struct IClass * cl, Object * obj, struct opGet * msg) { struct MUI_PaletteData *data = INST_DATA(cl, obj); - - IPTR *store = msg->opg_Storage; - switch(msg->opg_AttrID) + IPTR *store = msg->opg_Storage; + + switch (msg->opg_AttrID) { - case MUIA_Palette_Entries: - *store = (IPTR)&data->entries; - return TRUE; - case MUIA_Palette_Names: - *store = (IPTR)&data->names; - return TRUE; - - case MUIA_Coloradjust_Red: - *store = data->rgb[0]; - return TRUE; - - case MUIA_Coloradjust_Green: - *store = data->rgb[1]; - return TRUE; - - case MUIA_Coloradjust_Blue: - *store = data->rgb[2]; - return TRUE; - - case MUIA_Coloradjust_RGB: - *store = (IPTR)data->rgb; - return TRUE; + case MUIA_Palette_Entries: + *store = (IPTR) & data->entries; + return TRUE; + case MUIA_Palette_Names: + *store = (IPTR) & data->names; + return TRUE; + + case MUIA_Coloradjust_Red: + *store = data->rgb[0]; + return TRUE; + + case MUIA_Coloradjust_Green: + *store = data->rgb[1]; + return TRUE; + + case MUIA_Coloradjust_Blue: + *store = data->rgb[2]; + return TRUE; + + case MUIA_Coloradjust_RGB: + *store = (IPTR) data->rgb; + return TRUE; } - return DoSuperMethodA(cl,obj,(Msg)msg); + return DoSuperMethodA(cl, obj, (Msg) msg); } /************************************************************************** OM_GET **************************************************************************/ -IPTR Palette__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) +IPTR Palette__OM_DISPOSE(struct IClass * cl, Object * obj, Msg msg) { return DoSuperMethodA(cl, obj, msg); } @@ -256,22 +288,28 @@ BOOPSI_DISPATCHER(IPTR, Palette_Dispatcher, cl, obj, msg) { switch (msg->MethodID) { - case OM_NEW: return Palette__OM_NEW(cl, obj, (struct opSet *)msg); - case OM_SET: return Palette__OM_SET(cl, obj, (struct opSet *)msg); - case OM_GET: return Palette__OM_GET(cl, obj, (struct opGet *)msg); - case OM_DISPOSE: return Palette__OM_DISPOSE(cl, obj, (struct opGet *)msg); - default: return DoSuperMethodA(cl, obj, msg); + case OM_NEW: + return Palette__OM_NEW(cl, obj, (struct opSet *)msg); + case OM_SET: + return Palette__OM_SET(cl, obj, (struct opSet *)msg); + case OM_GET: + return Palette__OM_GET(cl, obj, (struct opGet *)msg); + case OM_DISPOSE: + return Palette__OM_DISPOSE(cl, obj, (struct opGet *)msg); + default: + return DoSuperMethodA(cl, obj, msg); } } -BOOPSI_DISPATCHER_END +BOOPSI_DISPATCHER_END /* * Class descriptor. */ -const struct __MUIBuiltinClass _MUI_Palette_desc = { +const struct __MUIBuiltinClass _MUI_Palette_desc = +{ MUIC_Palette, - MUIC_Group, + MUIC_Group, sizeof(struct MUI_PaletteData), - (void*)Palette_Dispatcher + (void *) Palette_Dispatcher }; #endif diff --git a/workbench/libs/muimaster/classes/palette.h b/workbench/libs/muimaster/classes/palette.h index b2b4a6121f..36d1769455 100644 --- a/workbench/libs/muimaster/classes/palette.h +++ b/workbench/libs/muimaster/classes/palette.h @@ -13,21 +13,24 @@ #define MUIB_Palette (MUIB_ZUNE | 0x00008a00) /*** Attributes *************************************************************/ -#define MUIA_Palette_Entries 0x8042a3d8 /* V6 i.g struct MUI_Palette_Entry * */ -#define MUIA_Palette_Groupable 0x80423e67 /* V6 isg BOOL */ -#define MUIA_Palette_Names 0x8042c3a2 /* V6 isg char ** */ +#define MUIA_Palette_Entries \ + 0x8042a3d8 /* V6 i.g struct MUI_Palette_Entry * */ +#define MUIA_Palette_Groupable \ + 0x80423e67 /* V6 isg BOOL */ +#define MUIA_Palette_Names \ + 0x8042c3a2 /* V6 isg char ** */ #define MUIV_Palette_Entry_End -1 struct MUI_Palette_Entry { - LONG mpe_ID; + LONG mpe_ID; ULONG mpe_Red; ULONG mpe_Green; ULONG mpe_Blue; - LONG mpe_Group; + LONG mpe_Group; }; -extern const struct __MUIBuiltinClass _MUI_Palette_desc; /* PRIV */ +extern const struct __MUIBuiltinClass _MUI_Palette_desc; /* PRIV */ #endif /* _MUI_PALETTE_H */ diff --git a/workbench/libs/muimaster/classes/palette_private.h b/workbench/libs/muimaster/classes/palette_private.h index e704f42dd3..5ccfc8a032 100644 --- a/workbench/libs/muimaster/classes/palette_private.h +++ b/workbench/libs/muimaster/classes/palette_private.h @@ -7,7 +7,7 @@ /*** Instance data **********************************************************/ struct MUI_PaletteData { - const char **names; + const char **names; struct MUI_Palette_Entry *entries; struct IClass *notifyclass; Object *list, *coloradjust; @@ -16,6 +16,6 @@ struct MUI_PaletteData ULONG rgb[3]; struct Hook display_hook; struct Hook setcolor_hook; - char buf[20]; + char buf[20]; }; #endif /* _PALETTE_PRIVATE_H_ */ diff --git a/workbench/libs/muimaster/classes/penadjust.c b/workbench/libs/muimaster/classes/penadjust.c index fee3391482..9da4ea17d5 100644 --- a/workbench/libs/muimaster/classes/penadjust.c +++ b/workbench/libs/muimaster/classes/penadjust.c @@ -33,70 +33,71 @@ extern struct Library *MUIMasterBase; static void UpdateState(Object *obj, struct Penadjust_DATA *data) -{ +{ zune_pen_spec_to_intern(&data->penspec, &data->intpenspec); - switch(data->intpenspec.p_type) + switch (data->intpenspec.p_type) { - case PST_MUI: - set(data->listobj, MUIA_List_Active, data->intpenspec.p_mui); - set(obj, MUIA_Group_ActivePage, 0); - break; - - case PST_CMAP: - set(data->sliderobj, MUIA_Numeric_Value, data->intpenspec.p_cmap); - set(obj, MUIA_Group_ActivePage, 1); - break; - - case PST_RGB: - set(data->coloradjobj, MUIA_Coloradjust_RGB, (IPTR) &data->intpenspec.p_rgb); - set(obj, MUIA_Group_ActivePage, 2); - break; - - case PST_SYS: - break; - } + case PST_MUI: + set(data->listobj, MUIA_List_Active, data->intpenspec.p_mui); + set(obj, MUIA_Group_ActivePage, 0); + break; + + case PST_CMAP: + set(data->sliderobj, MUIA_Numeric_Value, data->intpenspec.p_cmap); + set(obj, MUIA_Group_ActivePage, 1); + break; + + case PST_RGB: + set(data->coloradjobj, MUIA_Coloradjust_RGB, + (IPTR) & data->intpenspec.p_rgb); + set(obj, MUIA_Group_ActivePage, 2); + break; + + case PST_SYS: + break; + } } static void UpdatePenspec(Object *obj, struct Penadjust_DATA *data) { - IPTR val; + IPTR val; val = 0; get(obj, MUIA_Group_ActivePage, &val); - switch(val) + switch (val) { - case 0: - data->intpenspec.p_type = PST_MUI; - - val = 0; - get(data->listobj, MUIA_List_Active, &val); - data->intpenspec.p_mui = (LONG)val; - break; - - case 1: - data->intpenspec.p_type = PST_CMAP; - - val = 0; - get(data->sliderobj, MUIA_Numeric_Value, &val); - data->intpenspec.p_cmap = (LONG)val; - break; - - case 2: - data->intpenspec.p_type = PST_RGB; - - val = 0; - get(data->coloradjobj, MUIA_Coloradjust_Red, &val); - data->intpenspec.p_rgb.red = (ULONG)val; - val = 0; - get(data->coloradjobj, MUIA_Coloradjust_Green, &val); - data->intpenspec.p_rgb.green = (ULONG)val; - val = 0; - get(data->coloradjobj, MUIA_Coloradjust_Blue, &val); - data->intpenspec.p_rgb.blue = (ULONG)val; + case 0: + data->intpenspec.p_type = PST_MUI; + + val = 0; + get(data->listobj, MUIA_List_Active, &val); + data->intpenspec.p_mui = (LONG) val; + break; + + case 1: + data->intpenspec.p_type = PST_CMAP; + + val = 0; + get(data->sliderobj, MUIA_Numeric_Value, &val); + data->intpenspec.p_cmap = (LONG) val; + break; + + case 2: + data->intpenspec.p_type = PST_RGB; + + val = 0; + get(data->coloradjobj, MUIA_Coloradjust_Red, &val); + data->intpenspec.p_rgb.red = (ULONG) val; + val = 0; + get(data->coloradjobj, MUIA_Coloradjust_Green, &val); + data->intpenspec.p_rgb.green = (ULONG) val; + val = 0; + get(data->coloradjobj, MUIA_Coloradjust_Blue, &val); + data->intpenspec.p_rgb.blue = (ULONG) val; } - + zune_pen_intern_to_spec(&data->intpenspec, &data->penspec); D(bug(" ## penspec now %s\n", &data->penspec)); @@ -107,9 +108,9 @@ static IPTR MuipenDisplayFunc(struct Hook *hook, char **array, char *entry) LONG line; static char buf[16]; - line = (SIPTR)array[-1]; + line = (SIPTR) array[-1]; if (line < 0 || line > 7) - line = 0; + line = 0; snprintf(buf, sizeof(buf), "\033I[2:m%d]", (int)line); *array++ = buf; @@ -121,104 +122,110 @@ static IPTR MuipenDisplayFunc(struct Hook *hook, char **array, char *entry) IPTR Penadjust__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) { - static const char * const register_labels[] = {"MUI", "Colormap", "RGB", NULL}; - static const char * const lv_labels[] = {"Shine", "Halfshine", "Background", "Halfshadow", "Shadow", "Text", "Fill", "Mark", NULL}; - static const struct Hook muipen_display_hook = { {NULL, NULL}, HookEntry, MuipenDisplayFunc, NULL }; - - struct Penadjust_DATA *data; - struct TagItem *tags; - struct TagItem *tag; - Object *listobj, *sliderobj, *coloradjobj; + static const char *const register_labels[] = + { "MUI", "Colormap", "RGB", NULL }; + static const char *const lv_labels[] = + { "Shine", "Halfshine", "Background", "Halfshadow", "Shadow", + "Text", "Fill", "Mark", NULL }; + static const struct Hook muipen_display_hook = + { {NULL, NULL}, HookEntry, MuipenDisplayFunc, NULL }; + + struct Penadjust_DATA *data; + struct TagItem *tags; + struct TagItem *tag; + Object *listobj, *sliderobj, *coloradjobj; obj = (Object *) DoSuperNewTags ( cl, obj, NULL, - + MUIA_Register_Titles, (IPTR) register_labels, - Child, (IPTR) ListviewObject, + Child, (IPTR) ListviewObject, MUIA_Listview_List, (IPTR) (listobj = (Object *)ListObject, InputListFrame, - MUIA_List_SourceArray, (IPTR) lv_labels, - MUIA_List_Format, (IPTR) ",,", - MUIA_List_DisplayHook, (IPTR) &muipen_display_hook, + MUIA_List_SourceArray, (IPTR) lv_labels, + MUIA_List_Format, (IPTR) ",,", + MUIA_List_DisplayHook, (IPTR) &muipen_display_hook, End), End, - Child, (IPTR) (sliderobj = (Object *)SliderObject, - MUIA_Slider_Horiz, TRUE, - MUIA_Numeric_Min, -128, - MUIA_Numeric_Max, 127, + Child, (IPTR) (sliderobj = (Object *)SliderObject, + MUIA_Slider_Horiz, TRUE, + MUIA_Numeric_Min, -128, + MUIA_Numeric_Max, 127, End), - Child, (IPTR) (coloradjobj = (Object *)ColoradjustObject, End), - + Child, (IPTR) (coloradjobj = (Object *)ColoradjustObject, End), + TAG_MORE, (IPTR) msg->ops_AttrList ); - if (!obj) return FALSE; + if (!obj) + return FALSE; data = INST_DATA(cl, obj); - data->listobj = listobj; - data->sliderobj = sliderobj; - data->coloradjobj = coloradjobj; - + data->listobj = listobj; + data->sliderobj = sliderobj; + data->coloradjobj = coloradjobj; + strcpy(data->penspec.ps_buf, "m5"); - + /* parse initial taglist */ - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) { - switch (tag->ti_Tag) - { - case MUIA_Penadjust_Spec: - data->penspec = *(struct MUI_PenSpec *)tag->ti_Data; - break; - } + switch (tag->ti_Tag) + { + case MUIA_Penadjust_Spec: + data->penspec = *(struct MUI_PenSpec *)tag->ti_Data; + break; + } } - + UpdateState(obj, data); - return (IPTR)obj; + return (IPTR) obj; } IPTR Penadjust__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) { - struct TagItem *tags; - struct TagItem *tag; + struct TagItem *tags; + struct TagItem *tag; struct Penadjust_DATA *data = INST_DATA(cl, obj); - BOOL update = FALSE; - - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) + BOOL update = FALSE; + + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) { - switch (tag->ti_Tag) - { - case MUIA_Penadjust_Spec: - data->penspec = *(struct MUI_PenSpec *)tag->ti_Data; - update = TRUE; - break; - } + switch (tag->ti_Tag) + { + case MUIA_Penadjust_Spec: + data->penspec = *(struct MUI_PenSpec *)tag->ti_Data; + update = TRUE; + break; + } } - if (update) UpdateState(obj, data); - - return DoSuperMethodA(cl,obj,(Msg)msg); + if (update) + UpdateState(obj, data); + + return DoSuperMethodA(cl, obj, (Msg) msg); } IPTR Penadjust__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) { struct Penadjust_DATA *data = INST_DATA(cl, obj); - IPTR *store = msg->opg_Storage; + IPTR *store = msg->opg_Storage; - switch(msg->opg_AttrID) + switch (msg->opg_AttrID) { - case MUIA_Penadjust_Spec: - UpdatePenspec(obj, data); - *store = (IPTR)&data->penspec; - break; - - default: - return DoSuperMethodA(cl, obj, (Msg) msg); - + case MUIA_Penadjust_Spec: + UpdatePenspec(obj, data); + *store = (IPTR) & data->penspec; + break; + + default: + return DoSuperMethodA(cl, obj, (Msg) msg); + } - + return TRUE; } @@ -227,19 +234,23 @@ BOOPSI_DISPATCHER(IPTR, Penadjust_Dispatcher, cl, obj, msg) { switch (msg->MethodID) { - case OM_NEW: return Penadjust__OM_NEW(cl, obj, (struct opSet *)msg); - case OM_SET: return Penadjust__OM_SET(cl, obj, (struct opSet *)msg); - case OM_GET: return Penadjust__OM_GET(cl,obj,(APTR)msg); - default: return DoSuperMethodA(cl, obj, msg); - } + case OM_NEW: + return Penadjust__OM_NEW(cl, obj, (struct opSet *)msg); + case OM_SET: + return Penadjust__OM_SET(cl, obj, (struct opSet *)msg); + case OM_GET: + return Penadjust__OM_GET(cl, obj, (APTR) msg); + default: + return DoSuperMethodA(cl, obj, msg); + } } BOOPSI_DISPATCHER_END const struct __MUIBuiltinClass _MUI_Penadjust_desc = -{ - MUIC_Penadjust, +{ + MUIC_Penadjust, MUIC_Register, - sizeof(struct Penadjust_DATA), - (void*)Penadjust_Dispatcher + sizeof(struct Penadjust_DATA), + (void *) Penadjust_Dispatcher }; #endif /* ZUNE_BUILTIN_PENADJUST */ diff --git a/workbench/libs/muimaster/classes/penadjust.h b/workbench/libs/muimaster/classes/penadjust.h index 9c8aba2ec9..0ed60f8a49 100644 --- a/workbench/libs/muimaster/classes/penadjust.h +++ b/workbench/libs/muimaster/classes/penadjust.h @@ -10,14 +10,16 @@ #define MUIC_Penadjust "Penadjust.mui" /*** Identifier base (for Zune extensions) **********************************/ -#define MUIB_Penadjust (MUIB_ZUNE | 0x00001f00) +#define MUIB_Penadjust (MUIB_ZUNE | 0x00001f00) /*** Attributes *************************************************************/ -#define MUIA_Penadjust_PSIMode (MUIB_MUI|0x00421cbb) /* MUI: V11 i.. BOOL */ +#define MUIA_Penadjust_PSIMode \ + (MUIB_MUI | 0x00421cbb) /* MUI: V11 i.. BOOL */ -#define MUIA_Penadjust_Spec (MUIB_Penadjust | 0x00000000) /* ZUNE isg struct MUI_Penspec * PRIV */ +#define MUIA_Penadjust_Spec \ + (MUIB_Penadjust | 0x00000000) /* ZUNE isg struct MUI_Penspec * PRIV */ -extern const struct __MUIBuiltinClass _MUI_Penadjust_desc; /* PRIV */ +extern const struct __MUIBuiltinClass _MUI_Penadjust_desc; /* PRIV */ #endif /* _MUI_CLASSES_PENADJUST_H */ diff --git a/workbench/libs/muimaster/classes/penadjust_private.h b/workbench/libs/muimaster/classes/penadjust_private.h index 4d2370f44b..4af60d7f95 100644 --- a/workbench/libs/muimaster/classes/penadjust_private.h +++ b/workbench/libs/muimaster/classes/penadjust_private.h @@ -4,11 +4,11 @@ /*** Instance data **********************************************************/ struct Penadjust_DATA { - struct MUI_PenSpec penspec; - struct MUI_PenSpec_intern intpenspec; - Object *listobj; - Object *sliderobj; - Object *coloradjobj; + struct MUI_PenSpec penspec; + struct MUI_PenSpec_intern intpenspec; + Object *listobj; + Object *sliderobj; + Object *coloradjobj; }; #endif /* _PENADJUST_PRIVATE_H_ */ diff --git a/workbench/libs/muimaster/classes/pendisplay.c b/workbench/libs/muimaster/classes/pendisplay.c dissimilarity index 71% index 1351e59169..bbea660dbc 100644 --- a/workbench/libs/muimaster/classes/pendisplay.c +++ b/workbench/libs/muimaster/classes/pendisplay.c @@ -1,385 +1,438 @@ -/* - Copyright © 2002-2003, The AROS Development Team. All rights reserved. - $Id$ -*/ - -#define MUIMASTER_YES_INLINE_STDARG - -#include <stdio.h> - -#include <graphics/gfx.h> -#include <graphics/view.h> -#include <graphics/gfxmacros.h> -#include <clib/alib_protos.h> -#include <proto/exec.h> -#include <proto/graphics.h> -#include <proto/utility.h> -#include <proto/intuition.h> -#include <proto/muimaster.h> - -#include <string.h> - -#include "mui.h" -#include "muimaster_intern.h" -#include "penspec.h" -#include "textengine.h" -#include "support.h" -#include "support_classes.h" -#include "pendisplay_private.h" - -/* #define MYDEBUG 1 */ -#include "debug.h" - -extern struct Library *MUIMasterBase; - - -IPTR Pendisplay__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct Pendisplay_DATA *data; - struct TagItem *tags; - struct TagItem *tag; - - obj = (Object *)DoSuperMethodA(cl, obj, (Msg)msg); - if (!obj) return FALSE; - - data = INST_DATA(cl, obj); - /* Format identifies 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); - data->pen = -1; - - /* parse initial taglist */ - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) - { - switch (tag->ti_Tag) - { - case MUIA_Pendisplay_Reference: - data->refobj = (Object *)tag->ti_Data; - DoMethod(data->refobj, MUIM_Notify, MUIA_Pendisplay_Spec, MUIV_EveryTime, - (IPTR)obj, 3, MUIM_Set, MUIA_Pendisplay_Spec, MUIV_TriggerValue); - break; - - case MUIA_Pendisplay_RGBcolor: - { - struct MUI_RGBcolor *rgb = (struct MUI_RGBcolor *)tag->ti_Data; - snprintf(data->penspec.ps_buf, sizeof(data->penspec.ps_buf), - "%lc%08x,%08x,%08x", (int)PST_RGB, (unsigned int)rgb->red, (unsigned int)rgb->green, (unsigned int)rgb->blue); - } - break; - - case MUIA_Pendisplay_Spec: - data->penspec = *(struct MUI_PenSpec *)tag->ti_Data; - break; - - } - } - - return (IPTR)obj; -} - -IPTR Pendisplay__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) -{ - struct Pendisplay_DATA *data; - - data = INST_DATA(cl, obj); - if (data->refobj) - { - /* hmm ... kill notify here? But refobj might already have been killed :-\ */ - } - - return DoSuperMethodA(cl, obj, msg); -} - -IPTR Pendisplay__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct Pendisplay_DATA *data; - struct TagItem *tags; - struct TagItem *tag; - BOOL newcol = FALSE; - IPTR retval; - - data = INST_DATA(cl, obj); - - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) - { - switch (tag->ti_Tag) - { - case MUIA_Pendisplay_Reference: - if (data->refobj) - { - DoMethod(data->refobj, MUIM_KillNotifyObj, MUIA_Pendisplay_Spec, (IPTR)obj); - } - - data->refobj = (Object *)tag->ti_Data; - - if (data->refobj) - { - DoMethod(data->refobj, MUIM_Notify, MUIA_Pendisplay_Spec, MUIV_EveryTime, - (IPTR)obj, 3, MUIM_Set, MUIA_Pendisplay_Spec, MUIV_TriggerValue); - } - newcol = TRUE; - break; - - case MUIA_Pendisplay_RGBcolor: - { - struct MUI_RGBcolor *rgb = (struct MUI_RGBcolor *)tag->ti_Data; - - snprintf(data->penspec.ps_buf, sizeof(data->penspec.ps_buf), - "%lc%08x,%08x,%08x", (int)PST_RGB, (unsigned int)rgb->red, (unsigned int)rgb->green, (unsigned int)rgb->blue); - } - newcol = TRUE; - break; - - case MUIA_Pendisplay_Spec: - if (tag->ti_Data) - { - data->penspec = *(struct MUI_PenSpec *)tag->ti_Data; - newcol = TRUE; - } - break; - - - } - } - - retval = DoSuperMethodA(cl, obj, (Msg)msg); - - if (newcol && (_flags(obj) & MADF_SETUP)) - { - if (data->pen != -1) - { - MUI_ReleasePen(muiRenderInfo(obj), data->pen); - data->pen = -1; - } - - if (!data->refobj) - { - data->pen = MUI_ObtainPen(muiRenderInfo(obj), &data->penspec, 0); - } - - MUI_Redraw(obj, MADF_DRAWUPDATE); - } - - return retval; -} - -IPTR Pendisplay__OM_GET(struct IClass *cl, Object * obj, struct opGet *msg) -{ - struct Pendisplay_DATA *data = INST_DATA(cl, obj); - IPTR *store = msg->opg_Storage; - - switch (msg->opg_AttrID) - { - case MUIA_Pendisplay_Pen: - *store = (IPTR)data->pen; - break; - - case MUIA_Pendisplay_Reference: - *store = (IPTR)data->refobj; - break; - - 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); - - switch(intpenspec.p_type) - { - case PST_MUI: - case PST_CMAP: - case PST_SYS: - break; - case PST_RGB: - data->rgb = intpenspec.p_rgb; - break; - } - - *store = (IPTR)&data->rgb; - } - break; - - case MUIA_Pendisplay_Spec: - *store = (IPTR)&data->penspec; - break; - - default: - return DoSuperMethodA(cl, obj, (Msg)msg); - } - - return TRUE; -} - -IPTR Pendisplay__MUIM_Setup(struct IClass *cl, Object *obj, struct MUIP_Setup *msg) -{ - struct Pendisplay_DATA *data = INST_DATA(cl,obj); - - if (!(DoSuperMethodA(cl, obj, (Msg)msg))) return 0; - - if (!data->refobj) - { - data->pen = MUI_ObtainPen(muiRenderInfo(obj), &data->penspec, 0); - } - - return 1; -} - -IPTR Pendisplay__MUIM_Cleanup(struct IClass *cl, Object *obj, struct MUIP_Cleanup *msg) -{ - struct Pendisplay_DATA *data = INST_DATA(cl,obj); - - if (data->pen != -1) - { - MUI_ReleasePen(muiRenderInfo(obj), data->pen); - data->pen = -1; - } - - return DoSuperMethodA(cl, obj, (Msg)msg); -} - -IPTR Pendisplay__MUIM_AskMinMax(struct IClass *cl, Object *obj, struct MUIP_AskMinMax *msg) -{ - DoSuperMethodA(cl,obj,(Msg)msg); - - msg->MinMaxInfo->MinWidth += 3; - msg->MinMaxInfo->MinHeight += 3; - msg->MinMaxInfo->DefWidth += 16; - msg->MinMaxInfo->DefHeight += 16; - msg->MinMaxInfo->MaxWidth = MUI_MAXMAX; - msg->MinMaxInfo->MaxHeight = MUI_MAXMAX; - - return 0; -} - -IPTR Pendisplay__MUIM_Draw(struct IClass *cl, Object *obj, struct MUIP_Draw *msg) -{ - struct Pendisplay_DATA *data = INST_DATA(cl,obj); - LONG color; - - DoSuperMethodA(cl,obj,(Msg)msg); - - if (!(msg->flags & (MADF_DRAWOBJECT | MADF_DRAWUPDATE))) - return FALSE; - - if (data->refobj) - { - IPTR val = 0; - - get(data->refobj, MUIA_Pendisplay_Pen, &val); - color = (LONG)val; - } - else - { - color = data->pen; - } - - if (color == -1) - { - static UWORD pat[] = {0x1111,0x2222,0x4444,0x8888}; - - SetAfPt(_rp(obj), pat, 2); - SetABPenDrMd(_rp(obj), _pens(obj)[MPEN_SHADOW], _pens(obj)[MPEN_BACKGROUND],JAM2); - - } - else - { - SetABPenDrMd(_rp(obj), MUIPEN(color), 0,JAM1); - } - - RectFill(_rp(obj), _mleft(obj), _mtop(obj), _mright(obj), _mbottom(obj)); - - SetAfPt(_rp(obj), NULL, 0); - - return 0; -} - -IPTR Pendisplay__MUIM_Pendisplay_SetColormap(struct IClass *cl, Object *obj, struct MUIP_Pendisplay_SetColormap *msg) -{ - struct MUI_PenSpec penspec; - - snprintf(penspec.ps_buf, sizeof(penspec.ps_buf), "%lc%d", (int)PST_CMAP, (int)msg->colormap); - set(obj, MUIA_Pendisplay_Spec, (IPTR)&penspec); - - return 0; -} - -IPTR Pendisplay__MUIM_Pendisplay_SetRGB(struct IClass *cl, Object *obj, struct MUIP_Pendisplay_SetRGB *msg) -{ - struct MUI_PenSpec penspec; - - 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); - - return 0; -} - -IPTR Pendisplay__MUIM_Pendisplay_SetMUIPen(struct IClass *cl, Object *obj, struct MUIP_Pendisplay_SetMUIPen *msg) -{ - struct MUI_PenSpec penspec; - - snprintf(penspec.ps_buf, sizeof(penspec.ps_buf), "%lc%d", (int)PST_MUI, (int)msg->muipen); - set(obj, MUIA_Pendisplay_Spec, (IPTR)&penspec); - - return 0; -} - -IPTR Pendisplay__MUIM_DragQuery(struct IClass *cl, Object *obj, struct MUIP_DragQuery *msg) -{ - STRPTR spec = NULL; - - if (msg->obj == obj) - return MUIV_DragQuery_Refuse; - - if (get(msg->obj, MUIA_Pendisplay_Spec, &spec)) - return MUIV_DragQuery_Accept; - - if (get(msg->obj, MUIA_Imagedisplay_Spec, &spec)) - { - if ((NULL != spec) && (strlen(spec) > 2) && (spec[0] == '2') && (spec[1] == ':')) - return MUIV_DragQuery_Accept; - } - - return MUIV_DragQuery_Refuse; -} - -IPTR Pendisplay__MUIM_DragDrop(struct IClass *cl, Object *obj, struct MUIP_DragDrop *msg) -{ - STRPTR spec = NULL; - - if (get(msg->obj, MUIA_Pendisplay_Spec, &spec)) - set(obj, MUIA_Pendisplay_Spec, spec); - else if (get(msg->obj, MUIA_Imagedisplay_Spec, &spec)) - set(obj, MUIA_Pendisplay_Spec, spec+2); - return 0; -} - -#if ZUNE_BUILTIN_PENDISPLAY -BOOPSI_DISPATCHER(IPTR, Pendisplay_Dispatcher, cl, obj, msg) -{ - switch (msg->MethodID) - { - case OM_NEW: return Pendisplay__OM_NEW(cl, obj, (struct opSet *)msg); - case OM_DISPOSE: return Pendisplay__OM_DISPOSE(cl, obj, msg); - case OM_SET: return Pendisplay__OM_SET(cl, obj, (struct opSet *)msg); - case OM_GET: return Pendisplay__OM_GET(cl, obj, (struct opGet *)msg); - case MUIM_Setup: return Pendisplay__MUIM_Setup(cl, obj, (struct MUIP_Setup *)msg); - case MUIM_Cleanup: return Pendisplay__MUIM_Cleanup(cl, obj, (struct MUIP_Cleanup *)msg); - case MUIM_AskMinMax: return Pendisplay__MUIM_AskMinMax(cl, obj, (struct MUIP_AskMinMax*)msg); - case MUIM_Draw: return Pendisplay__MUIM_Draw(cl, obj, (struct MUIP_Draw*)msg); - case MUIM_Pendisplay_SetColormap: return Pendisplay__MUIM_Pendisplay_SetColormap(cl, obj, (struct MUIP_Pendisplay_SetColormap *)msg); - case MUIM_Pendisplay_SetMUIPen: return Pendisplay__MUIM_Pendisplay_SetMUIPen(cl, obj, (struct MUIP_Pendisplay_SetMUIPen *)msg); - case MUIM_Pendisplay_SetRGB: return Pendisplay__MUIM_Pendisplay_SetRGB(cl, obj, (struct MUIP_Pendisplay_SetRGB *)msg); - case MUIM_DragQuery: return Pendisplay__MUIM_DragQuery(cl, obj, (struct MUIP_DragQuery *)msg); - case MUIM_DragDrop: return Pendisplay__MUIM_DragDrop(cl, obj, (struct MUIP_DragDrop *)msg); - default: return DoSuperMethodA(cl, obj, msg); - } -} -BOOPSI_DISPATCHER_END - -const struct __MUIBuiltinClass _MUI_Pendisplay_desc = -{ - MUIC_Pendisplay, - MUIC_Area, - sizeof(struct Pendisplay_DATA), - (void*)Pendisplay_Dispatcher -}; -#endif /* ZUNE_BUILTIN_PENDISPLAY */ +/* + Copyright © 2002-2003, The AROS Development Team. All rights reserved. + $Id$ +*/ + +#define MUIMASTER_YES_INLINE_STDARG + +#include <stdio.h> + +#include <graphics/gfx.h> +#include <graphics/view.h> +#include <graphics/gfxmacros.h> +#include <clib/alib_protos.h> +#include <proto/exec.h> +#include <proto/graphics.h> +#include <proto/utility.h> +#include <proto/intuition.h> +#include <proto/muimaster.h> + +#include <string.h> + +#include "mui.h" +#include "muimaster_intern.h" +#include "penspec.h" +#include "textengine.h" +#include "support.h" +#include "support_classes.h" +#include "pendisplay_private.h" + +/* #define MYDEBUG 1 */ +#include "debug.h" + +extern struct Library *MUIMasterBase; + + +IPTR Pendisplay__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) +{ + struct Pendisplay_DATA *data; + struct TagItem *tags; + struct TagItem *tag; + + obj = (Object *) DoSuperMethodA(cl, obj, (Msg) msg); + if (!obj) + return FALSE; + + data = INST_DATA(cl, obj); + /* Format identifies 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); + data->pen = -1; + + /* parse initial taglist */ + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) + { + switch (tag->ti_Tag) + { + case MUIA_Pendisplay_Reference: + data->refobj = (Object *) tag->ti_Data; + DoMethod(data->refobj, MUIM_Notify, MUIA_Pendisplay_Spec, + MUIV_EveryTime, (IPTR) obj, 3, MUIM_Set, + MUIA_Pendisplay_Spec, MUIV_TriggerValue); + break; + + case MUIA_Pendisplay_RGBcolor: + { + struct MUI_RGBcolor *rgb = + (struct MUI_RGBcolor *)tag->ti_Data; + snprintf(data->penspec.ps_buf, sizeof(data->penspec.ps_buf), + "%lc%08x,%08x,%08x", (int)PST_RGB, + (unsigned int)rgb->red, (unsigned int)rgb->green, + (unsigned int)rgb->blue); + } + break; + + case MUIA_Pendisplay_Spec: + data->penspec = *(struct MUI_PenSpec *)tag->ti_Data; + break; + + } + } + + return (IPTR) obj; +} + +IPTR Pendisplay__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) +{ + struct Pendisplay_DATA *data; + + data = INST_DATA(cl, obj); + if (data->refobj) + { + /* kill notify here? But refobj might already have been killed :-\ */ + } + + return DoSuperMethodA(cl, obj, msg); +} + +IPTR Pendisplay__OM_SET(struct IClass *cl, Object *obj, + struct opSet *msg) +{ + struct Pendisplay_DATA *data; + struct TagItem *tags; + struct TagItem *tag; + BOOL newcol = FALSE; + IPTR retval; + + data = INST_DATA(cl, obj); + + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) + { + switch (tag->ti_Tag) + { + case MUIA_Pendisplay_Reference: + if (data->refobj) + { + DoMethod(data->refobj, MUIM_KillNotifyObj, + MUIA_Pendisplay_Spec, (IPTR) obj); + } + + data->refobj = (Object *) tag->ti_Data; + + if (data->refobj) + { + DoMethod(data->refobj, MUIM_Notify, MUIA_Pendisplay_Spec, + MUIV_EveryTime, (IPTR) obj, 3, MUIM_Set, + MUIA_Pendisplay_Spec, MUIV_TriggerValue); + } + newcol = TRUE; + break; + + case MUIA_Pendisplay_RGBcolor: + { + struct MUI_RGBcolor *rgb = + (struct MUI_RGBcolor *)tag->ti_Data; + + snprintf(data->penspec.ps_buf, sizeof(data->penspec.ps_buf), + "%lc%08x,%08x,%08x", (int)PST_RGB, + (unsigned int)rgb->red, (unsigned int)rgb->green, + (unsigned int)rgb->blue); + } + newcol = TRUE; + break; + + case MUIA_Pendisplay_Spec: + if (tag->ti_Data) + { + data->penspec = *(struct MUI_PenSpec *)tag->ti_Data; + newcol = TRUE; + } + break; + + + } + } + + retval = DoSuperMethodA(cl, obj, (Msg) msg); + + if (newcol && (_flags(obj) & MADF_SETUP)) + { + if (data->pen != -1) + { + MUI_ReleasePen(muiRenderInfo(obj), data->pen); + data->pen = -1; + } + + if (!data->refobj) + { + data->pen = + MUI_ObtainPen(muiRenderInfo(obj), &data->penspec, 0); + } + + MUI_Redraw(obj, MADF_DRAWUPDATE); + } + + return retval; +} + +IPTR Pendisplay__OM_GET(struct IClass *cl, Object *obj, + struct opGet *msg) +{ + struct Pendisplay_DATA *data = INST_DATA(cl, obj); + IPTR *store = msg->opg_Storage; + + switch (msg->opg_AttrID) + { + case MUIA_Pendisplay_Pen: + *store = (IPTR) data->pen; + break; + + case MUIA_Pendisplay_Reference: + *store = (IPTR) data->refobj; + break; + + 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); + + switch (intpenspec.p_type) + { + case PST_MUI: + case PST_CMAP: + case PST_SYS: + break; + case PST_RGB: + data->rgb = intpenspec.p_rgb; + break; + } + + *store = (IPTR) & data->rgb; + } + break; + + case MUIA_Pendisplay_Spec: + *store = (IPTR) & data->penspec; + break; + + default: + return DoSuperMethodA(cl, obj, (Msg) msg); + } + + return TRUE; +} + +IPTR Pendisplay__MUIM_Setup(struct IClass *cl, Object *obj, + struct MUIP_Setup *msg) +{ + struct Pendisplay_DATA *data = INST_DATA(cl, obj); + + if (!(DoSuperMethodA(cl, obj, (Msg) msg))) + return 0; + + if (!data->refobj) + { + data->pen = MUI_ObtainPen(muiRenderInfo(obj), &data->penspec, 0); + } + + return 1; +} + +IPTR Pendisplay__MUIM_Cleanup(struct IClass *cl, Object *obj, + struct MUIP_Cleanup *msg) +{ + struct Pendisplay_DATA *data = INST_DATA(cl, obj); + + if (data->pen != -1) + { + MUI_ReleasePen(muiRenderInfo(obj), data->pen); + data->pen = -1; + } + + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +IPTR Pendisplay__MUIM_AskMinMax(struct IClass *cl, Object *obj, + struct MUIP_AskMinMax *msg) +{ + DoSuperMethodA(cl, obj, (Msg) msg); + + msg->MinMaxInfo->MinWidth += 3; + msg->MinMaxInfo->MinHeight += 3; + msg->MinMaxInfo->DefWidth += 16; + msg->MinMaxInfo->DefHeight += 16; + msg->MinMaxInfo->MaxWidth = MUI_MAXMAX; + msg->MinMaxInfo->MaxHeight = MUI_MAXMAX; + + return 0; +} + +IPTR Pendisplay__MUIM_Draw(struct IClass *cl, Object *obj, + struct MUIP_Draw *msg) +{ + struct Pendisplay_DATA *data = INST_DATA(cl, obj); + LONG color; + + DoSuperMethodA(cl, obj, (Msg) msg); + + if (!(msg->flags & (MADF_DRAWOBJECT | MADF_DRAWUPDATE))) + return FALSE; + + if (data->refobj) + { + IPTR val = 0; + + get(data->refobj, MUIA_Pendisplay_Pen, &val); + color = (LONG) val; + } + else + { + color = data->pen; + } + + if (color == -1) + { + static UWORD pat[] = { 0x1111, 0x2222, 0x4444, 0x8888 }; + + SetAfPt(_rp(obj), pat, 2); + SetABPenDrMd(_rp(obj), _pens(obj)[MPEN_SHADOW], + _pens(obj)[MPEN_BACKGROUND], JAM2); + + } + else + { + SetABPenDrMd(_rp(obj), MUIPEN(color), 0, JAM1); + } + + RectFill(_rp(obj), _mleft(obj), _mtop(obj), _mright(obj), + _mbottom(obj)); + + SetAfPt(_rp(obj), NULL, 0); + + return 0; +} + +IPTR Pendisplay__MUIM_Pendisplay_SetColormap(struct IClass *cl, + Object *obj, struct MUIP_Pendisplay_SetColormap *msg) +{ + struct MUI_PenSpec penspec; + + snprintf(penspec.ps_buf, sizeof(penspec.ps_buf), "%lc%d", (int)PST_CMAP, + (int)msg->colormap); + set(obj, MUIA_Pendisplay_Spec, (IPTR) & penspec); + + return 0; +} + +IPTR Pendisplay__MUIM_Pendisplay_SetRGB(struct IClass *cl, Object *obj, + struct MUIP_Pendisplay_SetRGB *msg) +{ + struct MUI_PenSpec penspec; + + 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); + + return 0; +} + +IPTR Pendisplay__MUIM_Pendisplay_SetMUIPen(struct IClass *cl, Object *obj, + struct MUIP_Pendisplay_SetMUIPen *msg) +{ + struct MUI_PenSpec penspec; + + snprintf(penspec.ps_buf, sizeof(penspec.ps_buf), "%lc%d", (int)PST_MUI, + (int)msg->muipen); + set(obj, MUIA_Pendisplay_Spec, (IPTR) & penspec); + + return 0; +} + +IPTR Pendisplay__MUIM_DragQuery(struct IClass *cl, Object *obj, + struct MUIP_DragQuery *msg) +{ + STRPTR spec = NULL; + + if (msg->obj == obj) + return MUIV_DragQuery_Refuse; + + if (get(msg->obj, MUIA_Pendisplay_Spec, &spec)) + return MUIV_DragQuery_Accept; + + if (get(msg->obj, MUIA_Imagedisplay_Spec, &spec)) + { + if ((NULL != spec) && (strlen(spec) > 2) && (spec[0] == '2') + && (spec[1] == ':')) + return MUIV_DragQuery_Accept; + } + + return MUIV_DragQuery_Refuse; +} + +IPTR Pendisplay__MUIM_DragDrop(struct IClass *cl, Object *obj, + struct MUIP_DragDrop *msg) +{ + STRPTR spec = NULL; + + if (get(msg->obj, MUIA_Pendisplay_Spec, &spec)) + set(obj, MUIA_Pendisplay_Spec, spec); + else if (get(msg->obj, MUIA_Imagedisplay_Spec, &spec)) + set(obj, MUIA_Pendisplay_Spec, spec + 2); + return 0; +} + +#if ZUNE_BUILTIN_PENDISPLAY +BOOPSI_DISPATCHER(IPTR, Pendisplay_Dispatcher, cl, obj, msg) +{ + switch (msg->MethodID) + { + case OM_NEW: + return Pendisplay__OM_NEW(cl, obj, (struct opSet *)msg); + case OM_DISPOSE: + return Pendisplay__OM_DISPOSE(cl, obj, msg); + case OM_SET: + return Pendisplay__OM_SET(cl, obj, (struct opSet *)msg); + case OM_GET: + return Pendisplay__OM_GET(cl, obj, (struct opGet *)msg); + case MUIM_Setup: + return Pendisplay__MUIM_Setup(cl, obj, (struct MUIP_Setup *)msg); + case MUIM_Cleanup: + return Pendisplay__MUIM_Cleanup(cl, obj, + (struct MUIP_Cleanup *)msg); + case MUIM_AskMinMax: + return Pendisplay__MUIM_AskMinMax(cl, obj, + (struct MUIP_AskMinMax *)msg); + case MUIM_Draw: + return Pendisplay__MUIM_Draw(cl, obj, (struct MUIP_Draw *)msg); + case MUIM_Pendisplay_SetColormap: + return Pendisplay__MUIM_Pendisplay_SetColormap(cl, obj, + (struct MUIP_Pendisplay_SetColormap *)msg); + case MUIM_Pendisplay_SetMUIPen: + return Pendisplay__MUIM_Pendisplay_SetMUIPen(cl, obj, + (struct MUIP_Pendisplay_SetMUIPen *)msg); + case MUIM_Pendisplay_SetRGB: + return Pendisplay__MUIM_Pendisplay_SetRGB(cl, obj, + (struct MUIP_Pendisplay_SetRGB *)msg); + case MUIM_DragQuery: + return Pendisplay__MUIM_DragQuery(cl, obj, + (struct MUIP_DragQuery *)msg); + case MUIM_DragDrop: + return Pendisplay__MUIM_DragDrop(cl, obj, + (struct MUIP_DragDrop *)msg); + default: + return DoSuperMethodA(cl, obj, msg); + } +} +BOOPSI_DISPATCHER_END + +const struct __MUIBuiltinClass _MUI_Pendisplay_desc = +{ + MUIC_Pendisplay, + MUIC_Area, + sizeof(struct Pendisplay_DATA), + (void *) Pendisplay_Dispatcher +}; +#endif /* ZUNE_BUILTIN_PENDISPLAY */ diff --git a/workbench/libs/muimaster/classes/pendisplay.h b/workbench/libs/muimaster/classes/pendisplay.h dissimilarity index 64% index a724832bf8..f479ac6df8 100644 --- a/workbench/libs/muimaster/classes/pendisplay.h +++ b/workbench/libs/muimaster/classes/pendisplay.h @@ -1,32 +1,53 @@ -#ifndef _MUI_CLASSES_PENDISPLAY_H -#define _MUI_CLASSES_PENDISPLAY_H - -/* - Copyright © 2002-2003, The AROS Development Team. All rights reserved. - $Id$ -*/ - -/*** Name *******************************************************************/ -#define MUIC_Pendisplay "Pendisplay.mui" - -/*** Identifier base (for Zune extensions) **********************************/ -#define MUIB_Pendisplay (MUIB_ZUNE | 0x00002000) - -/*** Methods ****************************************************************/ -#define MUIM_Pendisplay_SetColormap (MUIB_MUI|0x004243a7) /* MUI: V13 */ -#define MUIM_Pendisplay_SetMUIPen (MUIB_MUI|0x00426ecd) /* MUI: V13 */ -#define MUIM_Pendisplay_SetRGB (MUIB_MUI|0x0042032c) /* MUI: V13 */ -struct MUIP_Pendisplay_SetColormap {STACKED ULONG MethodID; STACKED LONG colormap;}; -struct MUIP_Pendisplay_SetMUIPen {STACKED ULONG MethodID; STACKED LONG muipen;}; -struct MUIP_Pendisplay_SetRGB {STACKED ULONG MethodID; STACKED ULONG r; STACKED ULONG g; STACKED ULONG b;}; - -/*** Attributes *************************************************************/ -#define MUIA_Pendisplay_Pen (MUIB_MUI|0x0042a748) /* MUI: V13 ..g Object * */ -#define MUIA_Pendisplay_Reference (MUIB_MUI|0x0042dc24) /* MUI: V13 isg Object * */ -#define MUIA_Pendisplay_RGBcolor (MUIB_MUI|0x0042a1a9) /* MUI: V11 isg struct MUI_RGBcolor * */ -#define MUIA_Pendisplay_Spec (MUIB_MUI|0x0042a204) /* MUI: V11 isg struct MUI_PenSpec * */ - - -extern const struct __MUIBuiltinClass _MUI_Pendisplay_desc; /* PRIV */ - -#endif /* _MUI_CLASSES_PENDISPLAY_H */ +#ifndef _MUI_CLASSES_PENDISPLAY_H +#define _MUI_CLASSES_PENDISPLAY_H + +/* + Copyright © 2002-2003, The AROS Development Team. All rights reserved. + $Id$ +*/ + +/*** Name *******************************************************************/ +#define MUIC_Pendisplay "Pendisplay.mui" + +/*** Identifier base (for Zune extensions) **********************************/ +#define MUIB_Pendisplay (MUIB_ZUNE | 0x00002000) + +/*** Methods ****************************************************************/ +#define MUIM_Pendisplay_SetColormap (MUIB_MUI | 0x004243a7) /* MUI: V13 */ +#define MUIM_Pendisplay_SetMUIPen (MUIB_MUI | 0x00426ecd) /* MUI: V13 */ +#define MUIM_Pendisplay_SetRGB (MUIB_MUI | 0x0042032c) /* MUI: V13 */ + +struct MUIP_Pendisplay_SetColormap +{ + STACKED ULONG MethodID; + STACKED LONG colormap; +}; + +struct MUIP_Pendisplay_SetMUIPen +{ + STACKED ULONG MethodID; + STACKED LONG muipen; +}; + +struct MUIP_Pendisplay_SetRGB +{ + STACKED ULONG MethodID; + STACKED ULONG r; + STACKED ULONG g; + STACKED ULONG b; +}; + +/*** Attributes *************************************************************/ +#define MUIA_Pendisplay_Pen \ + (MUIB_MUI | 0x0042a748) /* MUI: V13 ..g Object * */ +#define MUIA_Pendisplay_Reference \ + (MUIB_MUI | 0x0042dc24) /* MUI: V13 isg Object * */ +#define MUIA_Pendisplay_RGBcolor \ + (MUIB_MUI | 0x0042a1a9) /* MUI: V11 isg struct MUI_RGBcolor * */ +#define MUIA_Pendisplay_Spec \ + (MUIB_MUI | 0x0042a204) /* MUI: V11 isg struct MUI_PenSpec * */ + + +extern const struct __MUIBuiltinClass _MUI_Pendisplay_desc; /* PRIV */ + +#endif /* _MUI_CLASSES_PENDISPLAY_H */ diff --git a/workbench/libs/muimaster/classes/pendisplay_private.h b/workbench/libs/muimaster/classes/pendisplay_private.h index ff18285404..46397ffd47 100644 --- a/workbench/libs/muimaster/classes/pendisplay_private.h +++ b/workbench/libs/muimaster/classes/pendisplay_private.h @@ -4,10 +4,10 @@ /*** Instance data **********************************************************/ struct Pendisplay_DATA { - struct MUI_PenSpec penspec; + struct MUI_PenSpec penspec; struct MUI_RGBcolor rgb; - Object *refobj; - LONG pen; + Object *refobj; + LONG pen; }; #endif /* _PENDISPLAY_PRIVATE_H_ */ diff --git a/workbench/libs/muimaster/classes/pixmap.c b/workbench/libs/muimaster/classes/pixmap.c index faf8b192db..940057dba6 100644 --- a/workbench/libs/muimaster/classes/pixmap.c +++ b/workbench/libs/muimaster/classes/pixmap.c @@ -31,7 +31,7 @@ #define MIN(a,b) ((a)<(b)?(a):(b)) #endif -// woraround for missing Zune functionality +// workaround for missing Zune functionality static BOOL _isfloating(Object *obj) { return FALSE; @@ -42,13 +42,14 @@ static BOOL _isdisabled(Object *obj) return FALSE; } -static void MUIP_DrawDisablePattern(struct MUI_RenderInfo *mri, LONG left, LONG top, LONG width, LONG height) +static void MUIP_DrawDisablePattern(struct MUI_RenderInfo *mri, LONG left, + LONG top, LONG width, LONG height) { } // libbz2_nostdio needs this -void free(void *memory) +void free(void *memory) { FreeVec(memory); } @@ -66,24 +67,71 @@ void bz_internal_error(int errcode) /* ------------------------------------------------------------------------- */ /// default color map -const ULONG defaultColorMap[256] = -{ - 0x00000000, 0x00000055, 0x000000aa, 0x000000ff, 0x00002400, 0x00002455, 0x000024aa, 0x000024ff, 0x00004900, 0x00004955, 0x000049aa, 0x000049ff, 0x00006d00, 0x00006d55, 0x00006daa, 0x00006dff, - 0x00009200, 0x00009255, 0x000092aa, 0x000092ff, 0x0000b600, 0x0000b655, 0x0000b6aa, 0x0000b6ff, 0x0000db00, 0x0000db55, 0x0000dbaa, 0x0000dbff, 0x0000ff00, 0x0000ff55, 0x0000ffaa, 0x0000ffff, - 0x00240000, 0x00240055, 0x002400aa, 0x002400ff, 0x00242400, 0x00242455, 0x002424aa, 0x002424ff, 0x00244900, 0x00244955, 0x002449aa, 0x002449ff, 0x00246d00, 0x00246d55, 0x00246daa, 0x00246dff, - 0x00249200, 0x00249255, 0x002492aa, 0x002492ff, 0x0024b600, 0x0024b655, 0x0024b6aa, 0x0024b6ff, 0x0024db00, 0x0024db55, 0x0024dbaa, 0x0024dbff, 0x0024ff00, 0x0024ff55, 0x0024ffaa, 0x0024ffff, - 0x00490000, 0x00490055, 0x004900aa, 0x004900ff, 0x00492400, 0x00492455, 0x004924aa, 0x004924ff, 0x00494900, 0x00494955, 0x004949aa, 0x004949ff, 0x00496d00, 0x00496d55, 0x00496daa, 0x00496dff, - 0x00499200, 0x00499255, 0x004992aa, 0x004992ff, 0x0049b600, 0x0049b655, 0x0049b6aa, 0x0049b6ff, 0x0049db00, 0x0049db55, 0x0049dbaa, 0x0049dbff, 0x0049ff00, 0x0049ff55, 0x0049ffaa, 0x0049ffff, - 0x006d0000, 0x006d0055, 0x006d00aa, 0x006d00ff, 0x006d2400, 0x006d2455, 0x006d24aa, 0x006d24ff, 0x006d4900, 0x006d4955, 0x006d49aa, 0x006d49ff, 0x006d6d00, 0x006d6d55, 0x006d6daa, 0x006d6dff, - 0x006d9200, 0x006d9255, 0x006d92aa, 0x006d92ff, 0x006db600, 0x006db655, 0x006db6aa, 0x006db6ff, 0x006ddb00, 0x006ddb55, 0x006ddbaa, 0x006ddbff, 0x006dff00, 0x006dff55, 0x006dffaa, 0x006dffff, - 0x00920000, 0x00920055, 0x009200aa, 0x009200ff, 0x00922400, 0x00922455, 0x009224aa, 0x009224ff, 0x00924900, 0x00924955, 0x009249aa, 0x009249ff, 0x00926d00, 0x00926d55, 0x00926daa, 0x00926dff, - 0x00929200, 0x00929255, 0x009292aa, 0x009292ff, 0x0092b600, 0x0092b655, 0x0092b6aa, 0x0092b6ff, 0x0092db00, 0x0092db55, 0x0092dbaa, 0x0092dbff, 0x0092ff00, 0x0092ff55, 0x0092ffaa, 0x0092ffff, - 0x00b60000, 0x00b60055, 0x00b600aa, 0x00b600ff, 0x00b62400, 0x00b62455, 0x00b624aa, 0x00b624ff, 0x00b64900, 0x00b64955, 0x00b649aa, 0x00b649ff, 0x00b66d00, 0x00b66d55, 0x00b66daa, 0x00b66dff, - 0x00b69200, 0x00b69255, 0x00b692aa, 0x00b692ff, 0x00b6b600, 0x00b6b655, 0x00b6b6aa, 0x00b6b6ff, 0x00b6db00, 0x00b6db55, 0x00b6dbaa, 0x00b6dbff, 0x00b6ff00, 0x00b6ff55, 0x00b6ffaa, 0x00b6ffff, - 0x00db0000, 0x00db0055, 0x00db00aa, 0x00db00ff, 0x00db2400, 0x00db2455, 0x00db24aa, 0x00db24ff, 0x00db4900, 0x00db4955, 0x00db49aa, 0x00db49ff, 0x00db6d00, 0x00db6d55, 0x00db6daa, 0x00db6dff, - 0x00db9200, 0x00db9255, 0x00db92aa, 0x00db92ff, 0x00dbb600, 0x00dbb655, 0x00dbb6aa, 0x00dbb6ff, 0x00dbdb00, 0x00dbdb55, 0x00dbdbaa, 0x00dbdbff, 0x00dbff00, 0x00dbff55, 0x00dbffaa, 0x00dbffff, - 0x00ff0000, 0x00ff0055, 0x00ff00aa, 0x00ff00ff, 0x00ff2400, 0x00ff2455, 0x00ff24aa, 0x00ff24ff, 0x00ff4900, 0x00ff4955, 0x00ff49aa, 0x00ff49ff, 0x00ff6d00, 0x00ff6d55, 0x00ff6daa, 0x00ff6dff, - 0x00ff9200, 0x00ff9255, 0x00ff92aa, 0x00ff92ff, 0x00ffb600, 0x00ffb655, 0x00ffb6aa, 0x00ffb6ff, 0x00ffdb00, 0x00ffdb55, 0x00ffdbaa, 0x00ffdbff, 0x00ffff00, 0x00ffff55, 0x00ffffaa, 0x00ffffff +const ULONG defaultColorMap[256] = { + 0x00000000, 0x00000055, 0x000000aa, 0x000000ff, + 0x00002400, 0x00002455, 0x000024aa, 0x000024ff, + 0x00004900, 0x00004955, 0x000049aa, 0x000049ff, + 0x00006d00, 0x00006d55, 0x00006daa, 0x00006dff, + 0x00009200, 0x00009255, 0x000092aa, 0x000092ff, + 0x0000b600, 0x0000b655, 0x0000b6aa, 0x0000b6ff, + 0x0000db00, 0x0000db55, 0x0000dbaa, 0x0000dbff, + 0x0000ff00, 0x0000ff55, 0x0000ffaa, 0x0000ffff, + 0x00240000, 0x00240055, 0x002400aa, 0x002400ff, + 0x00242400, 0x00242455, 0x002424aa, 0x002424ff, + 0x00244900, 0x00244955, 0x002449aa, 0x002449ff, + 0x00246d00, 0x00246d55, 0x00246daa, 0x00246dff, + 0x00249200, 0x00249255, 0x002492aa, 0x002492ff, + 0x0024b600, 0x0024b655, 0x0024b6aa, 0x0024b6ff, + 0x0024db00, 0x0024db55, 0x0024dbaa, 0x0024dbff, + 0x0024ff00, 0x0024ff55, 0x0024ffaa, 0x0024ffff, + 0x00490000, 0x00490055, 0x004900aa, 0x004900ff, + 0x00492400, 0x00492455, 0x004924aa, 0x004924ff, + 0x00494900, 0x00494955, 0x004949aa, 0x004949ff, + 0x00496d00, 0x00496d55, 0x00496daa, 0x00496dff, + 0x00499200, 0x00499255, 0x004992aa, 0x004992ff, + 0x0049b600, 0x0049b655, 0x0049b6aa, 0x0049b6ff, + 0x0049db00, 0x0049db55, 0x0049dbaa, 0x0049dbff, + 0x0049ff00, 0x0049ff55, 0x0049ffaa, 0x0049ffff, + 0x006d0000, 0x006d0055, 0x006d00aa, 0x006d00ff, + 0x006d2400, 0x006d2455, 0x006d24aa, 0x006d24ff, + 0x006d4900, 0x006d4955, 0x006d49aa, 0x006d49ff, + 0x006d6d00, 0x006d6d55, 0x006d6daa, 0x006d6dff, + 0x006d9200, 0x006d9255, 0x006d92aa, 0x006d92ff, + 0x006db600, 0x006db655, 0x006db6aa, 0x006db6ff, + 0x006ddb00, 0x006ddb55, 0x006ddbaa, 0x006ddbff, + 0x006dff00, 0x006dff55, 0x006dffaa, 0x006dffff, + 0x00920000, 0x00920055, 0x009200aa, 0x009200ff, + 0x00922400, 0x00922455, 0x009224aa, 0x009224ff, + 0x00924900, 0x00924955, 0x009249aa, 0x009249ff, + 0x00926d00, 0x00926d55, 0x00926daa, 0x00926dff, + 0x00929200, 0x00929255, 0x009292aa, 0x009292ff, + 0x0092b600, 0x0092b655, 0x0092b6aa, 0x0092b6ff, + 0x0092db00, 0x0092db55, 0x0092dbaa, 0x0092dbff, + 0x0092ff00, 0x0092ff55, 0x0092ffaa, 0x0092ffff, + 0x00b60000, 0x00b60055, 0x00b600aa, 0x00b600ff, + 0x00b62400, 0x00b62455, 0x00b624aa, 0x00b624ff, + 0x00b64900, 0x00b64955, 0x00b649aa, 0x00b649ff, + 0x00b66d00, 0x00b66d55, 0x00b66daa, 0x00b66dff, + 0x00b69200, 0x00b69255, 0x00b692aa, 0x00b692ff, + 0x00b6b600, 0x00b6b655, 0x00b6b6aa, 0x00b6b6ff, + 0x00b6db00, 0x00b6db55, 0x00b6dbaa, 0x00b6dbff, + 0x00b6ff00, 0x00b6ff55, 0x00b6ffaa, 0x00b6ffff, + 0x00db0000, 0x00db0055, 0x00db00aa, 0x00db00ff, + 0x00db2400, 0x00db2455, 0x00db24aa, 0x00db24ff, + 0x00db4900, 0x00db4955, 0x00db49aa, 0x00db49ff, + 0x00db6d00, 0x00db6d55, 0x00db6daa, 0x00db6dff, + 0x00db9200, 0x00db9255, 0x00db92aa, 0x00db92ff, + 0x00dbb600, 0x00dbb655, 0x00dbb6aa, 0x00dbb6ff, + 0x00dbdb00, 0x00dbdb55, 0x00dbdbaa, 0x00dbdbff, + 0x00dbff00, 0x00dbff55, 0x00dbffaa, 0x00dbffff, + 0x00ff0000, 0x00ff0055, 0x00ff00aa, 0x00ff00ff, + 0x00ff2400, 0x00ff2455, 0x00ff24aa, 0x00ff24ff, + 0x00ff4900, 0x00ff4955, 0x00ff49aa, 0x00ff49ff, + 0x00ff6d00, 0x00ff6d55, 0x00ff6daa, 0x00ff6dff, + 0x00ff9200, 0x00ff9255, 0x00ff92aa, 0x00ff92ff, + 0x00ffb600, 0x00ffb655, 0x00ffb6aa, 0x00ffb6ff, + 0x00ffdb00, 0x00ffdb55, 0x00ffdbaa, 0x00ffdbff, + 0x00ffff00, 0x00ffff55, 0x00ffffaa, 0x00ffffff }; /// @@ -92,7 +140,7 @@ IPTR Pixmap__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) { struct TagItem *tag, *tags; - if((obj = (Object *)DoSuperMethodA(cl, obj, (Msg)msg)) != NULL) + if ((obj = (Object *) DoSuperMethodA(cl, obj, (Msg) msg)) != NULL) { struct Pixmap_DATA *data = INST_DATA(cl, obj); @@ -100,25 +148,45 @@ IPTR Pixmap__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) data->alpha = 0xffffffffUL; data->compression = MUIV_Pixmap_Compression_None; - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) { switch (tag->ti_Tag) { - case MUIA_LeftEdge: data->leftOffset = tag->ti_Data; break; - case MUIA_TopEdge: data->topOffset = tag->ti_Data; break; - case MUIA_Pixmap_Data: data->data = (APTR)tag->ti_Data; break; - case MUIA_Pixmap_Format: data->format = tag->ti_Data; break; - case MUIA_Pixmap_Width: data->width = tag->ti_Data; break; - case MUIA_Pixmap_Height: data->height = tag->ti_Data; break; - case MUIA_Pixmap_CLUT: data->clut = (APTR)tag->ti_Data; break; - case MUIA_Pixmap_Alpha: data->alpha = tag->ti_Data; break; - case MUIA_Pixmap_Compression: data->compression = tag->ti_Data; break; - case MUIA_Pixmap_CompressedSize: data->compressedSize = tag->ti_Data; break; + case MUIA_LeftEdge: + data->leftOffset = tag->ti_Data; + break; + case MUIA_TopEdge: + data->topOffset = tag->ti_Data; + break; + case MUIA_Pixmap_Data: + data->data = (APTR) tag->ti_Data; + break; + case MUIA_Pixmap_Format: + data->format = tag->ti_Data; + break; + case MUIA_Pixmap_Width: + data->width = tag->ti_Data; + break; + case MUIA_Pixmap_Height: + data->height = tag->ti_Data; + break; + case MUIA_Pixmap_CLUT: + data->clut = (APTR) tag->ti_Data; + break; + case MUIA_Pixmap_Alpha: + data->alpha = tag->ti_Data; + break; + case MUIA_Pixmap_Compression: + data->compression = tag->ti_Data; + break; + case MUIA_Pixmap_CompressedSize: + data->compressedSize = tag->ti_Data; + break; } } } - return (IPTR)obj; + return (IPTR) obj; } @@ -126,7 +194,8 @@ static void FreeImage(struct IClass *cl, Object *obj) { struct Pixmap_DATA *data = INST_DATA(cl, obj); - if (data->uncompressedData != NULL && data->uncompressedData != data->data) + if (data->uncompressedData != NULL + && data->uncompressedData != data->data) { FreeVec(data->uncompressedData); data->uncompressedData = NULL; @@ -140,26 +209,30 @@ IPTR Pixmap__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) } -#define RAWIDTH(w) ((((UWORD)(w))+15)>>3 & 0xFFFE) +#define RAWIDTH(w) ((((UWORD)(w))+15)>>3 & 0xFFFE) static void DitherImage(struct IClass *cl, Object *obj) { struct Pixmap_DATA *data = INST_DATA(cl, obj); - if ((data->ditheredData = AllocVec(data->width * data->height, MEMF_SHARED)) != NULL) + if ((data->ditheredData = + AllocVec(data->width * data->height, MEMF_SHARED)) != NULL) { UBYTE *mask = NULL; UBYTE *mPtr = NULL; LONG y; - UBYTE *dataPtr = (UBYTE *)data->uncompressedData; - UBYTE *ditheredPtr = (UBYTE *)data->ditheredData; - const ULONG *colorMap = (data->clut != NULL) ? data->clut : defaultColorMap; + UBYTE *dataPtr = (UBYTE *) data->uncompressedData; + UBYTE *ditheredPtr = (UBYTE *) data->ditheredData; + const ULONG *colorMap = + (data->clut != NULL) ? data->clut : defaultColorMap; // only ARGB raw data contain transparency data, hence we need to // allocate a mask plane only for these if (data->format == MUIV_Pixmap_Format_ARGB32) { - mask = AllocVec(RAWIDTH(data->width) * data->height, MEMF_SHARED|MEMF_CLEAR|MEMF_CHIP); + mask = + AllocVec(RAWIDTH(data->width) * data->height, + MEMF_SHARED | MEMF_CLEAR | MEMF_CHIP); data->ditheredMask = mask; mPtr = mask; } @@ -168,12 +241,12 @@ static void DitherImage(struct IClass *cl, Object *obj) data->ditheredMask = NULL; } - for(y = 0; y < data->height; y++) + for (y = 0; y < data->height; y++) { LONG x; UBYTE bitMask = 0x80; - for(x = 0; x < data->width; x++) + for (x = 0; x < data->width; x++) { UBYTE a, r, g, b; ULONG i; @@ -181,41 +254,42 @@ static void DitherImage(struct IClass *cl, Object *obj) ULONG bestError; // obtain the pixel's A, R, G and B values from the raw data - switch(data->format) + switch (data->format) { - case MUIV_Pixmap_Format_CLUT8: - a = (colorMap[dataPtr[0]] >> 24) & 0xff; - r = (colorMap[dataPtr[0]] >> 16) & 0xff; - g = (colorMap[dataPtr[0]] >> 8) & 0xff; - b = (colorMap[dataPtr[0]] >> 0) & 0xff; - dataPtr += 1; - break; - - case MUIV_Pixmap_Format_RGB24: - a = 0xff; - r = dataPtr[0]; - g = dataPtr[1]; - b = dataPtr[2]; - dataPtr += 3; - break; - - case MUIV_Pixmap_Format_ARGB32: - a = dataPtr[0]; - r = dataPtr[1]; - g = dataPtr[2]; - b = dataPtr[3]; - dataPtr += 4; - break; - - default: - a = 0x00; - r = 0x00; - g = 0x00; - b = 0x00; - break; + case MUIV_Pixmap_Format_CLUT8: + a = (colorMap[dataPtr[0]] >> 24) & 0xff; + r = (colorMap[dataPtr[0]] >> 16) & 0xff; + g = (colorMap[dataPtr[0]] >> 8) & 0xff; + b = (colorMap[dataPtr[0]] >> 0) & 0xff; + dataPtr += 1; + break; + + case MUIV_Pixmap_Format_RGB24: + a = 0xff; + r = dataPtr[0]; + g = dataPtr[1]; + b = dataPtr[2]; + dataPtr += 3; + break; + + case MUIV_Pixmap_Format_ARGB32: + a = dataPtr[0]; + r = dataPtr[1]; + g = dataPtr[2]; + b = dataPtr[3]; + dataPtr += 4; + break; + + default: + a = 0x00; + r = 0x00; + g = 0x00; + b = 0x00; + break; } - // now calculate the best matching color from the given color map + // now calculate the best matching color from the given + // color map bestIndex = 0; bestError = 0xffffffffUL; @@ -225,9 +299,9 @@ static void DitherImage(struct IClass *cl, Object *obj) ULONG error; // calculate the geometric difference to the current color - dr = (LONG)((colorMap[i] >> 16) & 0xff) - (LONG)r; - dg = (LONG)((colorMap[i] >> 8) & 0xff) - (LONG)g; - db = (LONG)((colorMap[i] >> 0) & 0xff) - (LONG)b; + dr = (LONG) ((colorMap[i] >> 16) & 0xff) - (LONG) r; + dg = (LONG) ((colorMap[i] >> 8) & 0xff) - (LONG) g; + db = (LONG) ((colorMap[i] >> 0) & 0xff) - (LONG) b; error = dr * dr + dg * dg + db * db; if (bestError > error) @@ -242,8 +316,8 @@ static void DitherImage(struct IClass *cl, Object *obj) } } - // put the calculated color number into the destination LUT8 image - // using the additional pen map + // put the calculated color number into the destination LUT8 + // image using the additional pen map *ditheredPtr++ = data->ditheredPenMap[bestIndex]; if (mPtr != NULL) @@ -251,7 +325,7 @@ static void DitherImage(struct IClass *cl, Object *obj) // if we have a mask and the alpha value is >= 0x80 the // pixel is treated as non-transparent if (a >= 0x80) - mPtr[x/8] |= bitMask; + mPtr[x / 8] |= bitMask; bitMask >>= 1; if (bitMask == 0x00) @@ -259,34 +333,40 @@ static void DitherImage(struct IClass *cl, Object *obj) } } - // advance the mask pointer by one line - if (mPtr != NULL) - mPtr += RAWIDTH(data->width); + // advance the mask pointer by one line + if (mPtr != NULL) + mPtr += RAWIDTH(data->width); } - // CyberGraphics cannot blit raw data through a mask, thus we have to - // take this ugly workaround and take the detour using a bitmap. - if((data->ditheredBitmap = AllocBitMap(data->width, data->height, 8, BMF_MINPLANES, NULL)) != NULL) + // CyberGraphics cannot blit raw data through a mask, therefore we + // have to take this ugly workaround and take the detour using a + // bitmap. + if ((data->ditheredBitmap = + AllocBitMap(data->width, data->height, 8, BMF_MINPLANES, + NULL)) != NULL) { struct RastPort tempRP; InitRastPort(&tempRP); tempRP.BitMap = data->ditheredBitmap; - WritePixelArray(data->ditheredData, 0, 0, data->width, &tempRP, 0, 0, data->width, data->height, RECTFMT_LUT8); + WritePixelArray(data->ditheredData, 0, 0, data->width, &tempRP, + 0, 0, data->width, data->height, RECTFMT_LUT8); } } } -static BOOL DecompressRLE(struct IClass *cl, Object *obj, ULONG uncompressedSize) +static BOOL DecompressRLE(struct IClass *cl, Object *obj, + ULONG uncompressedSize) { struct Pixmap_DATA *data = INST_DATA(cl, obj); BOOL success = FALSE; - if ((data->uncompressedData = AllocVec(uncompressedSize, MEMF_SHARED)) != NULL) + if ((data->uncompressedData = + AllocVec(uncompressedSize, MEMF_SHARED)) != NULL) { - LONG rleLen = (LONG)data->compressedSize; + LONG rleLen = (LONG) data->compressedSize; unsigned char *rleData = (unsigned char *)data->data; unsigned char *dest = (unsigned char *)data->uncompressedData; @@ -324,14 +404,16 @@ static BOOL DecompressRLE(struct IClass *cl, Object *obj, ULONG uncompressedSize } -static BOOL DecompressBZip2(struct IClass *cl, Object *obj, ULONG uncompressedSize) +static BOOL DecompressBZip2(struct IClass *cl, Object *obj, + ULONG uncompressedSize) { BOOL success = FALSE; { APTR uncompressedData; - if ((uncompressedData = AllocVec(uncompressedSize, MEMF_SHARED)) != NULL) + if ((uncompressedData = + AllocVec(uncompressedSize, MEMF_SHARED)) != NULL) { bz_stream bzip2_stream; @@ -347,7 +429,8 @@ static BOOL DecompressBZip2(struct IClass *cl, Object *obj, ULONG uncompressedSi bzip2_stream.avail_out = uncompressedSize; err = BZ2_bzDecompress(&bzip2_stream); - if ((err != BZ_OK && err != BZ_STREAM_END) || bzip2_stream.total_out_lo32 != uncompressedSize) + if ((err != BZ_OK && err != BZ_STREAM_END) + || bzip2_stream.total_out_lo32 != uncompressedSize) { FreeVec(uncompressedData); uncompressedData = NULL; @@ -377,45 +460,46 @@ static BOOL DecompressImage(struct IClass *cl, Object *obj) // the image has been uncompressed before, return immediate success success = TRUE; } - else if(data->compression != MUIV_Pixmap_Compression_None && data->data != NULL && data->compressedSize != 0) + else if (data->compression != MUIV_Pixmap_Compression_None + && data->data != NULL && data->compressedSize != 0) { ULONG uncompressedSize; - switch(data->format) + switch (data->format) { - case MUIV_Pixmap_Format_CLUT8: - uncompressedSize = data->width * data->height; - break; + case MUIV_Pixmap_Format_CLUT8: + uncompressedSize = data->width * data->height; + break; - case MUIV_Pixmap_Format_RGB24: - uncompressedSize = data->width * data->height * 3; - break; + case MUIV_Pixmap_Format_RGB24: + uncompressedSize = data->width * data->height * 3; + break; - case MUIV_Pixmap_Format_ARGB32: - uncompressedSize = data->width * data->height * 4; - break; + case MUIV_Pixmap_Format_ARGB32: + uncompressedSize = data->width * data->height * 4; + break; - default: - uncompressedSize = 0; - break; + default: + uncompressedSize = 0; + break; } // uncompress the image data switch (data->compression) { - case MUIV_Pixmap_Compression_RLE: + case MUIV_Pixmap_Compression_RLE: { success = DecompressRLE(cl, obj, uncompressedSize); } break; - case MUIV_Pixmap_Compression_BZip2: + case MUIV_Pixmap_Compression_BZip2: { success = DecompressBZip2(cl, obj, uncompressedSize); } break; - default: + default: { success = FALSE; } @@ -433,26 +517,28 @@ static BOOL DecompressImage(struct IClass *cl, Object *obj) } -IPTR Pixmap__MUIM_Setup(struct IClass *cl, Object *obj, struct MUIP_Setup *msg) +IPTR Pixmap__MUIM_Setup(struct IClass *cl, Object *obj, + struct MUIP_Setup *msg) { struct Pixmap_DATA *data = INST_DATA(cl, obj); // just try to decompress the image, but don't fail DecompressImage(cl, obj); - if (!DoSuperMethodA(cl, obj, (Msg)msg)) + if (!DoSuperMethodA(cl, obj, (Msg) msg)) return FALSE; // in case we are to be displayed on a colormapped screen we have to create // dithered copies of the images - if (data->uncompressedData != NULL && (data->screenDepth = GetBitMapAttr(_screen(obj)->RastPort.BitMap, BMA_DEPTH)) <= 8) + if (data->uncompressedData != NULL + && (data->screenDepth = + GetBitMapAttr(_screen(obj)->RastPort.BitMap, BMA_DEPTH)) <= 8) { ULONG i; const ULONG *colorMap; - struct TagItem obpTags[] = - { - {OBP_Precision, PRECISION_IMAGE }, - {TAG_DONE, 0 } + struct TagItem obpTags[] = { + {OBP_Precision, PRECISION_IMAGE}, + {TAG_DONE, 0} }; // use a user definable colormap or the default color map @@ -462,11 +548,12 @@ IPTR Pixmap__MUIM_Setup(struct IClass *cl, Object *obj, struct MUIP_Setup *msg) colorMap = defaultColorMap; // allocate all pens - for(i = 0; i < 256; i++) - data->ditheredPenMap[i] = ObtainBestPenA(_screen(obj)->ViewPort.ColorMap, ((colorMap[i] >> 16) & 0xff) * 0x01010101UL, - ((colorMap[i] >> 8) & 0xff) * 0x01010101UL, - ((colorMap[i] >> 0) & 0xff) * 0x01010101UL, - obpTags); + for (i = 0; i < 256; i++) + data->ditheredPenMap[i] = + ObtainBestPenA(_screen(obj)->ViewPort.ColorMap, + ((colorMap[i] >> 16) & 0xff) * 0x01010101UL, + ((colorMap[i] >> 8) & 0xff) * 0x01010101UL, + ((colorMap[i] >> 0) & 0xff) * 0x01010101UL, obpTags); // create a dithered copy of the raw image DitherImage(cl, obj); @@ -478,16 +565,20 @@ IPTR Pixmap__MUIM_Setup(struct IClass *cl, Object *obj, struct MUIP_Setup *msg) if (!_isfloating(obj)) { - // if there is a change that anything of the parent's imagery may be visible below ourselves - // then we must make sure that our background is drawn accordingly before we draw ourselves. + // if there is a chance that anything of the parent's imagery may + // be visible below ourselves then we must make sure that our + // background is drawn accordingly before we draw ourselves. // The background is visible if we either: // - have an own alphachannel // - are drawn with an additional transparency // - have a transparent mask - if(data->format == MUIV_Pixmap_Format_ARGB32 || data->alpha != 0xffffffffUL || data->ditheredMask != NULL) - SetSuperAttrs(cl, obj, MUIA_DoubleBuffer, TRUE, MUIA_FillArea, TRUE, TAG_DONE); + if (data->format == MUIV_Pixmap_Format_ARGB32 + || data->alpha != 0xffffffffUL || data->ditheredMask != NULL) + SetSuperAttrs(cl, obj, MUIA_DoubleBuffer, TRUE, MUIA_FillArea, + TRUE, TAG_DONE); else - SetSuperAttrs(cl, obj, MUIA_DoubleBuffer, FALSE, MUIA_FillArea, FALSE, TAG_DONE); + SetSuperAttrs(cl, obj, MUIA_DoubleBuffer, FALSE, MUIA_FillArea, + FALSE, TAG_DONE); } return TRUE; @@ -522,8 +613,9 @@ IPTR Pixmap__MUIM_Cleanup(struct IClass *cl, Object *obj, Msg msg) for (i = 0; i < 256; i++) { - if(data->ditheredPenMap[i] != -1) - ReleasePen(_screen(obj)->ViewPort.ColorMap, data->ditheredPenMap[i]); + if (data->ditheredPenMap[i] != -1) + ReleasePen(_screen(obj)->ViewPort.ColorMap, + data->ditheredPenMap[i]); } } @@ -531,56 +623,64 @@ IPTR Pixmap__MUIM_Cleanup(struct IClass *cl, Object *obj, Msg msg) } -IPTR Pixmap__MUIM_AskMinMax(struct IClass *cl, Object *obj, struct MUIP_AskMinMax *msg) +IPTR Pixmap__MUIM_AskMinMax(struct IClass *cl, Object *obj, + struct MUIP_AskMinMax *msg) { struct Pixmap_DATA *data = INST_DATA(cl, obj); - DoSuperMethodA(cl, obj, (Msg)msg); + DoSuperMethodA(cl, obj, (Msg) msg); - msg->MinMaxInfo->MinWidth += data->width; + msg->MinMaxInfo->MinWidth += data->width; msg->MinMaxInfo->MinHeight += data->height; - msg->MinMaxInfo->DefWidth += data->width; + msg->MinMaxInfo->DefWidth += data->width; msg->MinMaxInfo->DefHeight += data->height; - msg->MinMaxInfo->MaxWidth += data->width; + msg->MinMaxInfo->MaxWidth += data->width; msg->MinMaxInfo->MaxHeight += data->height; return 0; } -static void DrawPixmapSection(struct IClass *cl, Object *obj, LONG sx, LONG sy, LONG sw, LONG sh, struct MUI_RenderInfo *mri, LONG dx, LONG dy) +static void DrawPixmapSection(struct IClass *cl, Object *obj, LONG sx, + LONG sy, LONG sw, LONG sh, struct MUI_RenderInfo *mri, LONG dx, LONG dy) { struct Pixmap_DATA *data = INST_DATA(cl, obj); struct RastPort *rp = mri->mri_RastPort; if (data->screenDepth <= 8 && data->ditheredBitmap != NULL) { - // CyberGraphics cannot blit raw data through a mask, thus we have to - // take this ugly workaround and take the detour using a bitmap. - if(data->ditheredMask != NULL) + // CyberGraphics cannot blit raw data through a mask, therefore we + // have to take this ugly workaround and take the detour using a + // bitmap. + if (data->ditheredMask != NULL) { - BltMaskBitMapRastPort(data->ditheredBitmap, sx, sy, rp, dx, dy, sw, sh, (ABC|ABNC|ANBC), data->ditheredMask); + BltMaskBitMapRastPort(data->ditheredBitmap, sx, sy, rp, dx, dy, + sw, sh, (ABC | ABNC | ANBC), data->ditheredMask); } else { - BltBitMapRastPort(data->ditheredBitmap, sx, sy, rp, dx, dy, sw, sh, (ABC|ABNC)); + BltBitMapRastPort(data->ditheredBitmap, sx, sy, rp, dx, dy, sw, + sh, (ABC | ABNC)); } } - else if(data->uncompressedData != NULL) + else if (data->uncompressedData != NULL) { - switch(data->format) + switch (data->format) { - case MUIV_Pixmap_Format_CLUT8: - WriteLUTPixelArray(data->uncompressedData, sx, sy, data->width, rp, data->clut, dx, dy, sw, sh, CTABFMT_XRGB8); - break; + case MUIV_Pixmap_Format_CLUT8: + WriteLUTPixelArray(data->uncompressedData, sx, sy, data->width, + rp, data->clut, dx, dy, sw, sh, CTABFMT_XRGB8); + break; - case MUIV_Pixmap_Format_RGB24: - WritePixelArray(data->uncompressedData, sx, sy, data->width*3, rp, dx, dy, sw, sh, RECTFMT_RGB); - break; + case MUIV_Pixmap_Format_RGB24: + WritePixelArray(data->uncompressedData, sx, sy, data->width * 3, + rp, dx, dy, sw, sh, RECTFMT_RGB); + break; - case MUIV_Pixmap_Format_ARGB32: - WritePixelArrayAlpha(data->uncompressedData, sx, sy, data->width*4, rp, dx, dy, sw, sh, data->alpha); - break; + case MUIV_Pixmap_Format_ARGB32: + WritePixelArrayAlpha(data->uncompressedData, sx, sy, + data->width * 4, rp, dx, dy, sw, sh, data->alpha); + break; } } else @@ -594,25 +694,28 @@ static void DrawPixmapSection(struct IClass *cl, Object *obj, LONG sx, LONG sy, } } -IPTR Pixmap__MUIM_Draw(struct IClass *cl, Object *obj, struct MUIP_Draw *msg) +IPTR Pixmap__MUIM_Draw(struct IClass *cl, Object *obj, + struct MUIP_Draw *msg) { struct Pixmap_DATA *data = INST_DATA(cl, obj); - DoSuperMethodA(cl, obj, (Msg)msg); + DoSuperMethodA(cl, obj, (Msg) msg); if (msg->flags & MADF_DRAWOBJECT) { - if(data->data != NULL) + if (data->data != NULL) { - int w = MIN(_mwidth (obj), data->width ); + int w = MIN(_mwidth(obj), data->width); int h = MIN(_mheight(obj), data->height); if (w > 0 && h > 0) - DrawPixmapSection(cl, obj, 0, 0, w, h, muiRenderInfo(obj), _mleft(obj), _mtop(obj)); + DrawPixmapSection(cl, obj, 0, 0, w, h, muiRenderInfo(obj), + _mleft(obj), _mtop(obj)); } - if(_isdisabled(obj)) - MUIP_DrawDisablePattern(muiRenderInfo(obj), _left(obj), _top(obj), _width(obj), _height(obj)); + if (_isdisabled(obj)) + MUIP_DrawDisablePattern(muiRenderInfo(obj), _left(obj), + _top(obj), _width(obj), _height(obj)); } return 0; @@ -626,18 +729,45 @@ IPTR Pixmap__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) BOOL refresh = FALSE; struct TagItem *tag, *tags; - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) { switch (tag->ti_Tag) { - case MUIA_Pixmap_Data: data->data = (APTR)tag->ti_Data; refresh = TRUE; decompress = TRUE; break; - case MUIA_Pixmap_Format: data->format = tag->ti_Data; refresh = TRUE; break; - case MUIA_Pixmap_Width: data->width = tag->ti_Data; refresh = TRUE; break; - case MUIA_Pixmap_Height: data->height = tag->ti_Data; refresh = TRUE; break; - case MUIA_Pixmap_CLUT: data->clut = (APTR)tag->ti_Data; refresh = TRUE; break; - case MUIA_Pixmap_Alpha: data->alpha = tag->ti_Data; refresh = TRUE; break; - case MUIA_Pixmap_Compression: data->compression = tag->ti_Data; refresh = TRUE; decompress = TRUE; break; - case MUIA_Pixmap_CompressedSize: data->compressedSize = tag->ti_Data; refresh = TRUE; decompress = TRUE; break; + case MUIA_Pixmap_Data: + data->data = (APTR) tag->ti_Data; + refresh = TRUE; + decompress = TRUE; + break; + case MUIA_Pixmap_Format: + data->format = tag->ti_Data; + refresh = TRUE; + break; + case MUIA_Pixmap_Width: + data->width = tag->ti_Data; + refresh = TRUE; + break; + case MUIA_Pixmap_Height: + data->height = tag->ti_Data; + refresh = TRUE; + break; + case MUIA_Pixmap_CLUT: + data->clut = (APTR) tag->ti_Data; + refresh = TRUE; + break; + case MUIA_Pixmap_Alpha: + data->alpha = tag->ti_Data; + refresh = TRUE; + break; + case MUIA_Pixmap_Compression: + data->compression = tag->ti_Data; + refresh = TRUE; + decompress = TRUE; + break; + case MUIA_Pixmap_CompressedSize: + data->compressedSize = tag->ti_Data; + refresh = TRUE; + decompress = TRUE; + break; } } @@ -654,7 +784,7 @@ IPTR Pixmap__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) MUI_Redraw(obj, MADF_DRAWOBJECT); } - DoSuperMethodA(cl, obj, (Msg)msg); + DoSuperMethodA(cl, obj, (Msg) msg); // signal success, this is checked by Rawimage.mcc return TRUE; @@ -668,74 +798,78 @@ IPTR Pixmap__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) switch (((struct opGet *)msg)->opg_AttrID) { - case MUIA_Pixmap_Data: - *store = (IPTR)data->data; - return TRUE; - - case MUIA_Pixmap_Format: - *store = data->format; - return TRUE; - - case MUIA_Pixmap_Width: - *store = (IPTR)data->width; - return TRUE; - - case MUIA_Pixmap_Height: - *store = (IPTR)data->height; - return TRUE; - - case MUIA_Pixmap_CLUT: - *store = (IPTR)data->clut; - return TRUE; - - case MUIA_Pixmap_Alpha: - *store = data->alpha; - return TRUE; - - case MUIA_Pixmap_Compression: - *store = data->compression; - return TRUE; - - case MUIA_Pixmap_CompressedSize: - *store = data->compressedSize; - return TRUE; - - case MUIA_Pixmap_UncompressedData: - DecompressImage(cl, obj); - *store = (IPTR)data->uncompressedData; - return TRUE; + case MUIA_Pixmap_Data: + *store = (IPTR) data->data; + return TRUE; + + case MUIA_Pixmap_Format: + *store = data->format; + return TRUE; + + case MUIA_Pixmap_Width: + *store = (IPTR) data->width; + return TRUE; + + case MUIA_Pixmap_Height: + *store = (IPTR) data->height; + return TRUE; + + case MUIA_Pixmap_CLUT: + *store = (IPTR) data->clut; + return TRUE; + + case MUIA_Pixmap_Alpha: + *store = data->alpha; + return TRUE; + + case MUIA_Pixmap_Compression: + *store = data->compression; + return TRUE; + + case MUIA_Pixmap_CompressedSize: + *store = data->compressedSize; + return TRUE; + + case MUIA_Pixmap_UncompressedData: + DecompressImage(cl, obj); + *store = (IPTR) data->uncompressedData; + return TRUE; } - return DoSuperMethodA(cl, obj, (Msg)msg); + return DoSuperMethodA(cl, obj, (Msg) msg); } -IPTR Pixmap__MUIM_Layout(struct IClass *cl, Object *obj,Msg msg) +IPTR Pixmap__MUIM_Layout(struct IClass *cl, Object *obj, Msg msg) { struct Pixmap_DATA *data = INST_DATA(cl, obj); - ULONG rc = DoSuperMethodA(cl, obj, (Msg)msg); + ULONG rc = DoSuperMethodA(cl, obj, (Msg) msg); if (data->leftOffset < 0) - _left(obj) = _right(_parent(obj))-_width(obj)+1+1+data->leftOffset; + _left(obj) = + _right(_parent(obj)) - _width(obj) + 1 + 1 + data->leftOffset; else _left(obj) += data->leftOffset; if (data->topOffset < 0) - _top(obj) = _bottom(_parent(obj))-_height(obj)+1+1+data->topOffset; + _top(obj) = + _bottom(_parent(obj)) - _height(obj) + 1 + 1 + data->topOffset; else - _top(obj) += data->topOffset; + _top(obj) += data->topOffset; return rc; } -IPTR Pixmap__MUIM_Pixmap_DrawSection(struct IClass *cl, Object *obj, struct MUIP_Pixmap_DrawSection *msg) +IPTR Pixmap__MUIM_Pixmap_DrawSection(struct IClass *cl, Object *obj, + struct MUIP_Pixmap_DrawSection *msg) { BOOL success; if ((success = DecompressImage(cl, obj)) == TRUE) { - DrawPixmapSection(cl, obj, msg->sx, msg->sy, msg->sw, msg->sh, msg->mri, msg->dx, msg->dy); + DrawPixmapSection(cl, obj, msg->sx, msg->sy, msg->sw, msg->sh, + msg->mri, msg->dx, msg->dy); } return 0; @@ -745,28 +879,39 @@ IPTR Pixmap__MUIM_Pixmap_DrawSection(struct IClass *cl, Object *obj, struct MUIP #if ZUNE_BUILTIN_PIXMAP BOOPSI_DISPATCHER(IPTR, Pixmap_Dispatcher, cl, obj, msg) { - switch(msg->MethodID) + switch (msg->MethodID) { - case OM_NEW : return Pixmap__OM_NEW(cl,obj,(APTR)msg)); - case OM_DISPOSE : return Pixmap__OM_DISPOSE(cl,obj,(APTR)msg)); - case OM_SET : return Pixmap__OM_SET(cl,obj,(APTR)msg)); - case OM_GET : return Pixmap__OM_GET(cl,obj,(APTR)msg)); - case MUIM_Draw : return Pixmap__MUIM_Draw(cl,obj,(APTR)msg)); - case MUIM_Setup : return Pixmap__MUIM_Setup(cl,obj,(APTR)msg)); - case MUIM_Cleanup : return Pixmap__MUIM_Cleanup(cl,obj,(APTR)msg)); - case MUIM_AskMinMax : return Pixmap__MUIM_AskMinMax(cl,obj,(APTR)msg)); - case MUIM_Layout : return Pixmap__MUIM_Layout(cl,obj,(APTR)msg)); - case MUIM_Pixmap_DrawSection: return Pixmap__MUIM_Pixmap_DrawSection(cl,obj,(APTR)msg)); + case OM_NEW: + return Pixmap__OM_NEW(cl, obj, (APTR) msg)); + case OM_DISPOSE: + return Pixmap__OM_DISPOSE(cl, obj, (APTR) msg)); + case OM_SET: + return Pixmap__OM_SET(cl, obj, (APTR) msg)); + case OM_GET: + return Pixmap__OM_GET(cl, obj, (APTR) msg)); + case MUIM_Draw: + return Pixmap__MUIM_Draw(cl, obj, (APTR) msg)); + case MUIM_Setup: + return Pixmap__MUIM_Setup(cl, obj, (APTR) msg)); + case MUIM_Cleanup: + return Pixmap__MUIM_Cleanup(cl, obj, (APTR) msg)); + case MUIM_AskMinMax: + return Pixmap__MUIM_AskMinMax(cl, obj, (APTR) msg)); + case MUIM_Layout: + return Pixmap__MUIM_Layout(cl, obj, (APTR) msg)); + case MUIM_Pixmap_DrawSection: + return Pixmap__MUIM_Pixmap_DrawSection(cl, obj, (APTR) msg)); } - return DoSuperMethodA(cl, obj, (APTR)msg); + return DoSuperMethodA(cl, obj, (APTR) msg); } BOOPSI_DISPATCHER_END -const struct __MUIBuiltinClass _MUI_Pixmap_desc = { +const struct __MUIBuiltinClass _MUI_Pixmap_desc = +{ MUIC_Pixmap, MUIC_Area, sizeof(struct MUI_Pixmap_DATA), - (void*)Pixmap_Dispatcher + (void *)Pixmap_Dispatcher }; #endif diff --git a/workbench/libs/muimaster/classes/pixmap.h b/workbench/libs/muimaster/classes/pixmap.h index 971696cdbd..f349d43b1e 100644 --- a/workbench/libs/muimaster/classes/pixmap.h +++ b/workbench/libs/muimaster/classes/pixmap.h @@ -11,23 +11,42 @@ #define MUIC_Pixmap "Pixmap.mui" /*** Identifier base (for Zune extensions) **********************************/ -#define MUIB_Pixmap (MUIB_ZUNE|0x00003600) +#define MUIB_Pixmap (MUIB_ZUNE | 0x00003600) /*** Methods ****************************************************************/ -#define MUIM_Pixmap_DrawSection (MUIB_MUI|0x0042ce0f) /* private */ /* V20 */ -struct MUIP_Pixmap_DrawSection {STACKED ULONG MethodID; STACKED LONG sx; STACKED LONG sy; STACKED LONG sw; STACKED LONG sh; - STACKED struct MUI_RenderInfo *mri; STACKED LONG dx; STACKED LONG dy; }; /* private */ +#define MUIM_Pixmap_DrawSection (MUIB_MUI | 0x0042ce0f) /* private, V20 */ + +struct MUIP_Pixmap_DrawSection +{ + STACKED ULONG MethodID; + STACKED LONG sx; + STACKED LONG sy; + STACKED LONG sw; + STACKED LONG sh; + STACKED struct MUI_RenderInfo *mri; + STACKED LONG dx; + STACKED LONG dy; +}; /* private */ /*** Attributes *************************************************************/ -#define MUIA_Pixmap_Alpha (MUIB_MUI|0x00421fef) /* V20 isg ULONG */ -#define MUIA_Pixmap_CLUT (MUIB_MUI|0x0042042a) /* V20 isg ULONG * */ -#define MUIA_Pixmap_CompressedSize (MUIB_MUI|0x0042e7e4) /* V20 isg ULONG */ -#define MUIA_Pixmap_Compression (MUIB_MUI|0x0042ce74) /* V20 isg ULONG */ -#define MUIA_Pixmap_Data (MUIB_MUI|0x00429ea0) /* V20 isg APTR */ -#define MUIA_Pixmap_Format (MUIB_MUI|0x0042ab14) /* V20 isg ULONG */ -#define MUIA_Pixmap_Height (MUIB_MUI|0x004288be) /* V20 isg LONG */ -#define MUIA_Pixmap_UncompressedData (MUIB_MUI|0x0042b085) /* V20 ..g APTR */ -#define MUIA_Pixmap_Width (MUIB_MUI|0x0042ccb8) /* V20 isg LONG */ +#define MUIA_Pixmap_Alpha \ + (MUIB_MUI | 0x00421fef) /* V20 isg ULONG */ +#define MUIA_Pixmap_CLUT \ + (MUIB_MUI | 0x0042042a) /* V20 isg ULONG * */ +#define MUIA_Pixmap_CompressedSize \ + (MUIB_MUI | 0x0042e7e4) /* V20 isg ULONG */ +#define MUIA_Pixmap_Compression \ + (MUIB_MUI | 0x0042ce74) /* V20 isg ULONG */ +#define MUIA_Pixmap_Data \ + (MUIB_MUI | 0x00429ea0) /* V20 isg APTR */ +#define MUIA_Pixmap_Format \ + (MUIB_MUI | 0x0042ab14) /* V20 isg ULONG */ +#define MUIA_Pixmap_Height \ + (MUIB_MUI | 0x004288be) /* V20 isg LONG */ +#define MUIA_Pixmap_UncompressedData \ + (MUIB_MUI | 0x0042b085) /* V20 ..g APTR */ +#define MUIA_Pixmap_Width \ + (MUIB_MUI | 0x0042ccb8) /* V20 isg LONG */ #define MUIV_Pixmap_Compression_None 0 #define MUIV_Pixmap_Compression_RLE 1 diff --git a/workbench/libs/muimaster/classes/popasl.c b/workbench/libs/muimaster/classes/popasl.c dissimilarity index 61% index c16f26911c..ddeeb834e8 100644 --- a/workbench/libs/muimaster/classes/popasl.c +++ b/workbench/libs/muimaster/classes/popasl.c @@ -1,393 +1,423 @@ -/* - Copyright © 2002-2011, The AROS Development Team. All rights reserved. - $Id$ -*/ - -#define MUIMASTER_YES_INLINE_STDARG - -#include <string.h> -#include <stdio.h> - -#include <graphics/gfx.h> -#include <graphics/view.h> -#include <dos/dostags.h> -#include <libraries/asl.h> -#include <clib/alib_protos.h> -#include <proto/exec.h> -#include <proto/graphics.h> -#include <proto/utility.h> -#include <proto/intuition.h> -#include <proto/asl.h> -#include <proto/dos.h> -#include <proto/muimaster.h> - -#include "mui.h" -#include "muimaster_intern.h" -#include "support.h" -#include "support_classes.h" -#include "popasl_private.h" - -extern struct Library *MUIMasterBase; - -struct Asl_Startup -{ - struct Message msg; - APTR asl_req; - struct TagItem *tags; - Object *app; /* the application */ - Object *pop; - STRPTR buf; /* asl_entry must FreeVec() this before exiting!!! */ -}; - -SAVEDS static LONG Asl_Entry(void) -{ - struct Process *proc; - struct Asl_Startup *msg; - - APTR asl_req; - struct TagItem *tags; - Object *app; - Object *pop; - STRPTR buf; - - proc = (struct Process *) FindTask(NULL); - WaitPort(&proc->pr_MsgPort); /* Wait for the startup message */ - msg = (struct Asl_Startup*)GetMsg(&proc->pr_MsgPort); - - asl_req = msg->asl_req; - tags = msg->tags; - app = msg->app; - pop = msg->pop; - buf = msg->buf; - - ReplyMsg(&msg->msg); - - if (AslRequest(asl_req, tags)) - DoMethod(app,MUIM_Application_PushMethod, (IPTR)pop, 2, MUIM_Popstring_Close, TRUE); - else DoMethod(app,MUIM_Application_PushMethod, (IPTR)pop, 2, MUIM_Popstring_Close, FALSE); - - if (buf != NULL) FreeVec(buf); - - return 0; -} - -static ULONG Popasl_Open_Function(struct Hook *hook, Object *obj, void **msg) -{ - char *buf = NULL; - struct Popasl_DATA *data = (struct Popasl_DATA *)hook->h_Data; - struct Asl_Startup *startup; - Object *string = (Object*)msg[0]; - struct MsgPort *msg_port; - - if (data->asl_proc) return 0; - - data->tag_list[0].ti_Tag = ASLFR_Screen; - data->tag_list[0].ti_Data = (IPTR)_screen(obj); - data->tag_list[1].ti_Tag = ASLFR_PrivateIDCMP; - data->tag_list[1].ti_Data = 1; - data->tag_list[2].ti_Tag = ASLFR_InitialLeftEdge; - data->tag_list[2].ti_Data = _left(obj); - data->tag_list[3].ti_Tag = ASLFR_InitialTopEdge; - data->tag_list[3].ti_Data = _top(obj); - data->tag_list[4].ti_Tag = ASLFR_InitialWidth; - data->tag_list[4].ti_Data = _width(obj); - data->tag_list[5].ti_Tag = TAG_DONE; - data->tag_list[5].ti_Data = 0; - - if (data->start_hook) - { - if (!(CallHookPkt(data->start_hook,obj,data->tag_list))) - return 0; - } else - { - if (data->type == ASL_FileRequest) - { - char *str = NULL; - char *path_end; - - get(string,MUIA_String_Contents,&str); - - path_end = PathPart(str); - buf = (char*)AllocVec(path_end - str + 10, MEMF_PUBLIC); - if (!buf) return 0; - - strncpy(buf,str,path_end - str); - buf[path_end - str] = 0; - - data->tag_list[5].ti_Tag = ASLFR_InitialFile; - data->tag_list[5].ti_Data = (IPTR)FilePart(str); - data->tag_list[6].ti_Tag = ASLFR_InitialDrawer; - data->tag_list[6].ti_Data = (IPTR)buf; - data->tag_list[7].ti_Tag = TAG_DONE; - data->tag_list[7].ti_Data = 0; - } - - if (data->type == ASL_FontRequest) - { - char *str = NULL; - char *name_end; - LONG size; - - get(string,MUIA_String_Contents,&str); - - if (str) - { - name_end = PathPart(str); - buf = (char*)AllocVec(name_end - str + 10, MEMF_PUBLIC); - if (!buf) return 0; - - strncpy(buf,str,name_end - str); - strcpy(buf + (name_end - str),".font"); - StrToLong(FilePart(str),&size); - - data->tag_list[5].ti_Tag = ASLFO_InitialName; - data->tag_list[5].ti_Data = (IPTR)buf; - data->tag_list[6].ti_Tag = ASLFO_InitialSize; - data->tag_list[6].ti_Data = size; - data->tag_list[7].ti_Tag = TAG_DONE; - data->tag_list[7].ti_Data = 0; - } - } - } - - if (!(msg_port = CreateMsgPort())) return 0; - if (!(startup = (struct Asl_Startup*)AllocVec(sizeof(struct Asl_Startup),MEMF_PUBLIC))) - { - DeleteMsgPort(msg_port); - return 0; - } - - { - const struct TagItem processTags[2] = - { - { NP_Entry, (IPTR)Asl_Entry }, - { TAG_DONE, 0 } - }; - - if (!(data->asl_proc = CreateNewProc( processTags ))) - { - FreeVec(startup); - DeleteMsgPort(msg_port); - return 0; - } - } - - startup->msg.mn_ReplyPort = msg_port; - startup->msg.mn_Length = sizeof(struct Asl_Startup); - startup->tags = data->tag_list; - startup->app = _app(obj); - startup->asl_req = data->asl_req; - startup->pop = obj; - startup->buf = buf; - PutMsg(&data->asl_proc->pr_MsgPort,&startup->msg); - WaitPort(msg_port); - - FreeVec(startup); - DeleteMsgPort(msg_port); - - return 1; -} - - -static ULONG Popasl_Close_Function(struct Hook *hook, Object *obj, void **msg) -{ - struct Popasl_DATA *data= (struct Popasl_DATA *)hook->h_Data; - Object *string = (Object*)msg[0]; - IPTR suc = (IPTR)msg[1]; - - if (suc) - { - if (data->stop_hook) - { - CallHookPkt(data->stop_hook,obj,data->asl_req); - } - else - { - char *buf = NULL; - - if (data->type == ASL_FileRequest) - { - struct FileRequester *file_req = (struct FileRequester*)data->asl_req; - char *file = (char*)file_req->fr_File?(char*)file_req->fr_File:(char*)""; - char *drawer = (char*)file_req->fr_Drawer?(char*)file_req->fr_Drawer:(char*)""; - int len = strlen(file)+strlen(drawer)+10; - - buf = (char*)AllocVec(len,MEMF_CLEAR); - if (buf) - { - strcpy(buf, drawer); - AddPart(buf, file, len); - } - } - else if (data->type == ASL_FontRequest) - { - struct FontRequester *font_req = (struct FontRequester*)data->asl_req; - char *name = font_req->fo_Attr.ta_Name; - - if (name) - { - LONG size = font_req->fo_Attr.ta_YSize; - int len = strlen(name)+20; - - buf = AllocVec(len,MEMF_CLEAR); - if (buf) - { - char num_buf[20]; - char *font_ext; - - strcpy(buf,name); - - /* Remove the .font extension */ - if ((font_ext = strstr(buf,".font"))) - *font_ext = 0; - - snprintf(num_buf, 20, "%ld", (long)size); - AddPart(buf,num_buf,len); - } - } - } - - if (buf) - { - IPTR contents = 0; - - set(string, MUIA_String_Contents, (IPTR)buf); - get(string, MUIA_String_Contents, &contents); - /* trigger string notification */ - set(string, MUIA_String_Acknowledge, contents); - - FreeVec(buf); - } - } - } - - data->asl_proc = NULL; - nfset(obj, MUIA_Popasl_Active, FALSE); - - return 0; -} - -IPTR Popasl__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct Popasl_DATA *data; - struct TagItem *tags; - struct TagItem *tag; - ULONG asl_type = GetTagData(MUIA_Popasl_Type,ASL_FileRequest,msg->ops_AttrList); - APTR asl_req; - - if (!(asl_req = AllocAslRequest(asl_type,msg->ops_AttrList))) return 0; - - obj = (Object *)DoSuperNewTags(cl, obj, NULL, - MUIA_Popstring_Toggle, FALSE, - TAG_MORE, (IPTR) msg->ops_AttrList); - if (!obj) return FALSE; - - data = INST_DATA(cl, obj); - - /* parse initial taglist */ - - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) - { - switch (tag->ti_Tag) - { - case MUIA_Popasl_StartHook: - data->start_hook = (struct Hook*)tag->ti_Data; - break; - - case MUIA_Popasl_StopHook: - data->stop_hook = (struct Hook*)tag->ti_Data; - break; - } - } - - data->open_hook.h_Entry = HookEntry; - data->open_hook.h_SubEntry = (HOOKFUNC)Popasl_Open_Function; - data->open_hook.h_Data = data; - data->close_hook.h_Entry = HookEntry; - data->close_hook.h_SubEntry = (HOOKFUNC)Popasl_Close_Function; - data->close_hook.h_Data = data; - data->asl_req = asl_req; - data->type = asl_type; - - SetAttrs(obj, - MUIA_Popstring_OpenHook, (IPTR)&data->open_hook, - MUIA_Popstring_CloseHook, (IPTR)&data->close_hook, - MUIA_Popstring_Toggle, FALSE, - TAG_DONE); - - return (IPTR)obj; -} - -IPTR Popasl__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) -{ - struct Popasl_DATA *data = INST_DATA(cl, obj); - if (data->asl_req) FreeAslRequest(data->asl_req); - return DoSuperMethodA(cl,obj,(Msg)msg); -} - -#define STORE *(msg->opg_Storage) -IPTR Popasl__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) -{ - struct Popasl_DATA *data = INST_DATA(cl, obj); - - switch(msg->opg_AttrID) - { - case MUIA_Popasl_Active: STORE = !!data->asl_proc; return 1; - } - return DoSuperMethodA(cl, obj, (Msg) msg); -} -#undef STORE - -IPTR Popasl__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct Popasl_DATA *data = INST_DATA(cl, obj); - struct TagItem *tags = msg->ops_AttrList; - struct TagItem *tag; - - while ((tag = NextTagItem(&tags)) != NULL) - { - switch(tag->ti_Tag) - { - case MUIA_Popasl_StartHook: - data->start_hook = (struct Hook*) tag->ti_Data; - break; - case MUIA_Popasl_StopHook: - data->stop_hook = (struct Hook*) tag->ti_Data; - break; - } /* switch(tag->ti_Tag) */ - - } /* while ((tag = NextTagItem(&tags)) != NULL) */ - - return DoSuperMethodA(cl, obj, (Msg)msg); -} - -IPTR Popasl__MUIM_Cleanup(struct IClass *cl, Object *obj, struct MUIP_Cleanup *msg) -{ - struct Popasl_DATA *data = INST_DATA(cl, obj); - if (data->asl_proc) AbortAslRequest(data->asl_req); - return DoSuperMethodA(cl, obj, (Msg) msg); -} - -#if ZUNE_BUILTIN_POPASL -BOOPSI_DISPATCHER(IPTR, Popasl_Dispatcher, cl, obj, msg) -{ - switch (msg->MethodID) - { - case OM_NEW: return Popasl__OM_NEW(cl, obj, (struct opSet *)msg); - case OM_DISPOSE: return Popasl__OM_DISPOSE(cl, obj, msg); - case OM_GET: return Popasl__OM_GET(cl, obj, (struct opGet *)msg); - case OM_SET: return Popasl__OM_SET(cl, obj, (struct opSet *)msg); - case MUIM_Cleanup: return Popasl__MUIM_Cleanup(cl, obj, (struct MUIP_Cleanup*)msg); - default: return DoSuperMethodA(cl, obj, msg); - } -} -BOOPSI_DISPATCHER_END - -const struct __MUIBuiltinClass _MUI_Popasl_desc = -{ - MUIC_Popasl, - MUIC_Popstring, - sizeof(struct Popasl_DATA), - (void*)Popasl_Dispatcher -}; -#endif /* ZUNE_BUILTIN_POPASL */ +/* + Copyright © 2002-2011, The AROS Development Team. All rights reserved. + $Id$ +*/ + +#define MUIMASTER_YES_INLINE_STDARG + +#include <string.h> +#include <stdio.h> + +#include <graphics/gfx.h> +#include <graphics/view.h> +#include <dos/dostags.h> +#include <libraries/asl.h> +#include <clib/alib_protos.h> +#include <proto/exec.h> +#include <proto/graphics.h> +#include <proto/utility.h> +#include <proto/intuition.h> +#include <proto/asl.h> +#include <proto/dos.h> +#include <proto/muimaster.h> + +#include "mui.h" +#include "muimaster_intern.h" +#include "support.h" +#include "support_classes.h" +#include "popasl_private.h" + +extern struct Library *MUIMasterBase; + +struct Asl_Startup +{ + struct Message msg; + APTR asl_req; + struct TagItem *tags; + Object *app; /* the application */ + Object *pop; + STRPTR buf; /* asl_entry must FreeVec() this before exiting!!! */ +}; + +SAVEDS static LONG Asl_Entry(void) +{ + struct Process *proc; + struct Asl_Startup *msg; + + APTR asl_req; + struct TagItem *tags; + Object *app; + Object *pop; + STRPTR buf; + + proc = (struct Process *)FindTask(NULL); + WaitPort(&proc->pr_MsgPort); /* Wait for the startup message */ + msg = (struct Asl_Startup *)GetMsg(&proc->pr_MsgPort); + + asl_req = msg->asl_req; + tags = msg->tags; + app = msg->app; + pop = msg->pop; + buf = msg->buf; + + ReplyMsg(&msg->msg); + + if (AslRequest(asl_req, tags)) + DoMethod(app, MUIM_Application_PushMethod, (IPTR) pop, 2, + MUIM_Popstring_Close, TRUE); + else + DoMethod(app, MUIM_Application_PushMethod, (IPTR) pop, 2, + MUIM_Popstring_Close, FALSE); + + if (buf != NULL) + FreeVec(buf); + + return 0; +} + +static ULONG Popasl_Open_Function(struct Hook *hook, Object *obj, + void **msg) +{ + char *buf = NULL; + struct Popasl_DATA *data = (struct Popasl_DATA *)hook->h_Data; + struct Asl_Startup *startup; + Object *string = (Object *) msg[0]; + struct MsgPort *msg_port; + + if (data->asl_proc) + return 0; + + data->tag_list[0].ti_Tag = ASLFR_Screen; + data->tag_list[0].ti_Data = (IPTR) _screen(obj); + data->tag_list[1].ti_Tag = ASLFR_PrivateIDCMP; + data->tag_list[1].ti_Data = 1; + data->tag_list[2].ti_Tag = ASLFR_InitialLeftEdge; + data->tag_list[2].ti_Data = _left(obj); + data->tag_list[3].ti_Tag = ASLFR_InitialTopEdge; + data->tag_list[3].ti_Data = _top(obj); + data->tag_list[4].ti_Tag = ASLFR_InitialWidth; + data->tag_list[4].ti_Data = _width(obj); + data->tag_list[5].ti_Tag = TAG_DONE; + data->tag_list[5].ti_Data = 0; + + if (data->start_hook) + { + if (!(CallHookPkt(data->start_hook, obj, data->tag_list))) + return 0; + } + else + { + if (data->type == ASL_FileRequest) + { + char *str = NULL; + char *path_end; + + get(string, MUIA_String_Contents, &str); + + path_end = PathPart(str); + buf = (char *)AllocVec(path_end - str + 10, MEMF_PUBLIC); + if (!buf) + return 0; + + strncpy(buf, str, path_end - str); + buf[path_end - str] = 0; + + data->tag_list[5].ti_Tag = ASLFR_InitialFile; + data->tag_list[5].ti_Data = (IPTR) FilePart(str); + data->tag_list[6].ti_Tag = ASLFR_InitialDrawer; + data->tag_list[6].ti_Data = (IPTR) buf; + data->tag_list[7].ti_Tag = TAG_DONE; + data->tag_list[7].ti_Data = 0; + } + + if (data->type == ASL_FontRequest) + { + char *str = NULL; + char *name_end; + LONG size; + + get(string, MUIA_String_Contents, &str); + + if (str) + { + name_end = PathPart(str); + buf = (char *)AllocVec(name_end - str + 10, MEMF_PUBLIC); + if (!buf) + return 0; + + strncpy(buf, str, name_end - str); + strcpy(buf + (name_end - str), ".font"); + StrToLong(FilePart(str), &size); + + data->tag_list[5].ti_Tag = ASLFO_InitialName; + data->tag_list[5].ti_Data = (IPTR) buf; + data->tag_list[6].ti_Tag = ASLFO_InitialSize; + data->tag_list[6].ti_Data = size; + data->tag_list[7].ti_Tag = TAG_DONE; + data->tag_list[7].ti_Data = 0; + } + } + } + + if (!(msg_port = CreateMsgPort())) + return 0; + if (!(startup = + (struct Asl_Startup *)AllocVec(sizeof(struct Asl_Startup), + MEMF_PUBLIC))) + { + DeleteMsgPort(msg_port); + return 0; + } + + { + const struct TagItem processTags[2] = { + {NP_Entry, (IPTR) Asl_Entry}, + {TAG_DONE, 0} + }; + + if (!(data->asl_proc = CreateNewProc(processTags))) + { + FreeVec(startup); + DeleteMsgPort(msg_port); + return 0; + } + } + + startup->msg.mn_ReplyPort = msg_port; + startup->msg.mn_Length = sizeof(struct Asl_Startup); + startup->tags = data->tag_list; + startup->app = _app(obj); + startup->asl_req = data->asl_req; + startup->pop = obj; + startup->buf = buf; + PutMsg(&data->asl_proc->pr_MsgPort, &startup->msg); + WaitPort(msg_port); + + FreeVec(startup); + DeleteMsgPort(msg_port); + + return 1; +} + + +static ULONG Popasl_Close_Function(struct Hook *hook, Object *obj, + void **msg) +{ + struct Popasl_DATA *data = (struct Popasl_DATA *)hook->h_Data; + Object *string = (Object *) msg[0]; + IPTR suc = (IPTR) msg[1]; + + if (suc) + { + if (data->stop_hook) + { + CallHookPkt(data->stop_hook, obj, data->asl_req); + } + else + { + char *buf = NULL; + + if (data->type == ASL_FileRequest) + { + struct FileRequester *file_req = + (struct FileRequester *)data->asl_req; + char *file = + (char *)file_req->fr_File ? (char *)file_req-> + fr_File : (char *)""; + char *drawer = + (char *)file_req->fr_Drawer ? (char *)file_req-> + fr_Drawer : (char *)""; + int len = strlen(file) + strlen(drawer) + 10; + + buf = (char *)AllocVec(len, MEMF_CLEAR); + if (buf) + { + strcpy(buf, drawer); + AddPart(buf, file, len); + } + } + else if (data->type == ASL_FontRequest) + { + struct FontRequester *font_req = + (struct FontRequester *)data->asl_req; + char *name = font_req->fo_Attr.ta_Name; + + if (name) + { + LONG size = font_req->fo_Attr.ta_YSize; + int len = strlen(name) + 20; + + buf = AllocVec(len, MEMF_CLEAR); + if (buf) + { + char num_buf[20]; + char *font_ext; + + strcpy(buf, name); + + /* Remove the .font extension */ + if ((font_ext = strstr(buf, ".font"))) + *font_ext = 0; + + snprintf(num_buf, 20, "%ld", (long)size); + AddPart(buf, num_buf, len); + } + } + } + + if (buf) + { + IPTR contents = 0; + + set(string, MUIA_String_Contents, (IPTR) buf); + get(string, MUIA_String_Contents, &contents); + + /* trigger string notification */ + set(string, MUIA_String_Acknowledge, contents); + + FreeVec(buf); + } + } + } + + data->asl_proc = NULL; + nfset(obj, MUIA_Popasl_Active, FALSE); + + return 0; +} + +IPTR Popasl__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) +{ + struct Popasl_DATA *data; + struct TagItem *tags; + struct TagItem *tag; + ULONG asl_type = + GetTagData(MUIA_Popasl_Type, ASL_FileRequest, msg->ops_AttrList); + APTR asl_req; + + if (!(asl_req = AllocAslRequest(asl_type, msg->ops_AttrList))) + return 0; + + obj = (Object *) DoSuperNewTags(cl, obj, NULL, + MUIA_Popstring_Toggle, FALSE, TAG_MORE, (IPTR) msg->ops_AttrList); + if (!obj) + return FALSE; + + data = INST_DATA(cl, obj); + + /* parse initial taglist */ + + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) + { + switch (tag->ti_Tag) + { + case MUIA_Popasl_StartHook: + data->start_hook = (struct Hook *)tag->ti_Data; + break; + + case MUIA_Popasl_StopHook: + data->stop_hook = (struct Hook *)tag->ti_Data; + break; + } + } + + data->open_hook.h_Entry = HookEntry; + data->open_hook.h_SubEntry = (HOOKFUNC) Popasl_Open_Function; + data->open_hook.h_Data = data; + data->close_hook.h_Entry = HookEntry; + data->close_hook.h_SubEntry = (HOOKFUNC) Popasl_Close_Function; + data->close_hook.h_Data = data; + data->asl_req = asl_req; + data->type = asl_type; + + SetAttrs(obj, + MUIA_Popstring_OpenHook, (IPTR) & data->open_hook, + MUIA_Popstring_CloseHook, (IPTR) & data->close_hook, + MUIA_Popstring_Toggle, FALSE, TAG_DONE); + + return (IPTR) obj; +} + +IPTR Popasl__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) +{ + struct Popasl_DATA *data = INST_DATA(cl, obj); + if (data->asl_req) + FreeAslRequest(data->asl_req); + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +#define STORE *(msg->opg_Storage) +IPTR Popasl__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) +{ + struct Popasl_DATA *data = INST_DATA(cl, obj); + + switch (msg->opg_AttrID) + { + case MUIA_Popasl_Active: + STORE = ! !data->asl_proc; + return 1; + } + return DoSuperMethodA(cl, obj, (Msg) msg); +} +#undef STORE + +IPTR Popasl__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) +{ + struct Popasl_DATA *data = INST_DATA(cl, obj); + struct TagItem *tags = msg->ops_AttrList; + struct TagItem *tag; + + while ((tag = NextTagItem(&tags)) != NULL) + { + switch (tag->ti_Tag) + { + case MUIA_Popasl_StartHook: + data->start_hook = (struct Hook *)tag->ti_Data; + break; + case MUIA_Popasl_StopHook: + data->stop_hook = (struct Hook *)tag->ti_Data; + break; + } + } + + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +IPTR Popasl__MUIM_Cleanup(struct IClass *cl, Object *obj, + struct MUIP_Cleanup *msg) +{ + struct Popasl_DATA *data = INST_DATA(cl, obj); + if (data->asl_proc) + AbortAslRequest(data->asl_req); + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +#if ZUNE_BUILTIN_POPASL +BOOPSI_DISPATCHER(IPTR, Popasl_Dispatcher, cl, obj, msg) +{ + switch (msg->MethodID) + { + case OM_NEW: + return Popasl__OM_NEW(cl, obj, (struct opSet *)msg); + case OM_DISPOSE: + return Popasl__OM_DISPOSE(cl, obj, msg); + case OM_GET: + return Popasl__OM_GET(cl, obj, (struct opGet *)msg); + case OM_SET: + return Popasl__OM_SET(cl, obj, (struct opSet *)msg); + case MUIM_Cleanup: + return Popasl__MUIM_Cleanup(cl, obj, (struct MUIP_Cleanup *)msg); + default: + return DoSuperMethodA(cl, obj, msg); + } +} +BOOPSI_DISPATCHER_END + +const struct __MUIBuiltinClass _MUI_Popasl_desc = +{ + MUIC_Popasl, + MUIC_Popstring, + sizeof(struct Popasl_DATA), + (void *) Popasl_Dispatcher +}; +#endif /* ZUNE_BUILTIN_POPASL */ diff --git a/workbench/libs/muimaster/classes/popasl.h b/workbench/libs/muimaster/classes/popasl.h index da9f9792e7..999f4557f1 100644 --- a/workbench/libs/muimaster/classes/popasl.h +++ b/workbench/libs/muimaster/classes/popasl.h @@ -14,10 +14,14 @@ /*** Attributes *************************************************************/ -#define MUIA_Popasl_Active (MUIB_MUI|0x00421b37) /* MUI: V7 ..g BOOL */ -#define MUIA_Popasl_StartHook (MUIB_MUI|0x0042b703) /* MUI: V7 isg struct Hook * */ -#define MUIA_Popasl_StopHook (MUIB_MUI|0x0042d8d2) /* MUI: V7 isg struct Hook * */ -#define MUIA_Popasl_Type (MUIB_MUI|0x0042df3d) /* MUI: V7 i.g ULONG */ +#define MUIA_Popasl_Active \ + (MUIB_MUI | 0x00421b37) /* MUI: V7 ..g BOOL */ +#define MUIA_Popasl_StartHook \ + (MUIB_MUI | 0x0042b703) /* MUI: V7 isg struct Hook * */ +#define MUIA_Popasl_StopHook \ + (MUIB_MUI | 0x0042d8d2) /* MUI: V7 isg struct Hook * */ +#define MUIA_Popasl_Type \ + (MUIB_MUI | 0x0042df3d) /* MUI: V7 i.g ULONG */ extern const struct __MUIBuiltinClass _MUI_Popasl_desc; /* PRIV */ diff --git a/workbench/libs/muimaster/classes/popframe.c b/workbench/libs/muimaster/classes/popframe.c dissimilarity index 67% index b7903c9c68..8f482d3ccd 100644 --- a/workbench/libs/muimaster/classes/popframe.c +++ b/workbench/libs/muimaster/classes/popframe.c @@ -1,222 +1,234 @@ -/* - Copyright © 2002-2006, The AROS Development Team. All rights reserved. - $Id$ -*/ - -#define MUIMASTER_YES_INLINE_STDARG - -#include <clib/alib_protos.h> -#include <proto/exec.h> -#include <proto/graphics.h> -#include <proto/utility.h> -#include <proto/intuition.h> -#include <proto/muimaster.h> - -/* #define MYDEBUG 1 */ -#include "debug.h" -#include "mui.h" -#include "muimaster_intern.h" -#include "support.h" -#include "support_classes.h" -#include "popframe_private.h" - -extern struct Library *MUIMasterBase; - -IPTR Popframe__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct Popframe_DATA *data; - struct TagItem *tag, *tags; - - obj = (Object *) DoSuperNewTags - ( - cl, obj, NULL, - - ButtonFrame, - InnerSpacing(4,4), - MUIA_Background, MUII_ButtonBack, - MUIA_InputMode, MUIV_InputMode_RelVerify, - MUIA_Draggable, TRUE, - - TAG_MORE, (IPTR) msg->ops_AttrList - ); - - if (!obj) return FALSE; - - data = INST_DATA(cl, obj); - data->wintitle = NULL; - - /* parse initial taglist */ - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) - { - switch (tag->ti_Tag) - { - case MUIA_Window_Title: - data->wintitle = (CONST_STRPTR)tag->ti_Data; - break; - } - } - - DoMethod(obj, MUIM_Notify, MUIA_Pressed, FALSE, (IPTR)obj, 1, - MUIM_Popframe_OpenWindow); - - return (IPTR)obj; -} - -IPTR Popframe__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) -{ - struct Popframe_DATA *data = INST_DATA(cl, obj); - - if (data->wnd) - { - D(bug("Popframe_Dispose(%p) : MUI_DisposeObject(%p)\n", obj, data->wnd)); - MUI_DisposeObject(data->wnd); - data->wnd = NULL; - } - return DoSuperMethodA(cl,obj,(Msg)msg); -} - -IPTR Popframe__MUIM_Hide(struct IClass *cl, Object *obj, struct opGet *msg) -{ -#if 0 - struct Popframe_DATA *data = INST_DATA(cl, obj); - if (data->wnd) - { - D(bug("Popframe_Hide(%p) : closing window %p\n", obj, data->wnd)); - set(data->wnd,MUIA_Window_Open,FALSE); - D(bug("Popframe_Hide(%p) : app REMMEMBER win (%p)\n", obj, data->wnd)); - DoMethod(_app(obj),OM_REMMEMBER,(IPTR)data->wnd); - D(bug("Popframe_Hide(%p) : MUI_DisposeObject(%p)\n", obj, data->wnd)); - MUI_DisposeObject(data->wnd); - data->wnd = NULL; - } -#endif - return DoSuperMethodA(cl,obj,(Msg)msg); -} - -IPTR Popframe__MUIM_Popframe_OpenWindow(struct IClass *cl, Object *obj, Msg msg) -{ - struct Popframe_DATA *data = INST_DATA(cl, obj); - - if (!data->wnd) - { - Object *ok_button, *cancel_button; - struct MUI_Frame_Spec *frame_spec = NULL; - ULONG x = 0, y = 0; - - get(_win(obj), MUIA_Window_LeftEdge, &x); - get(_win(obj), MUIA_Window_TopEdge, &y); - - get(obj, MUIA_Framedisplay_Spec, &frame_spec); - - data->wnd = (Object *)(WindowObject, - MUIA_Window_Title, (IPTR)data->wintitle, - MUIA_Window_Activate, TRUE, - MUIA_Window_IsSubWindow, TRUE, - MUIA_Window_LeftEdge, _left(obj) + x, - MUIA_Window_TopEdge, _bottom(obj) + y + 1, - WindowContents, (IPTR)VGroup, - Child, (IPTR)(data->frameadjust = MUI_NewObject( - MUIC_Frameadjust, - MUIA_CycleChain, 1, - MUIA_Frameadjust_Spec, (IPTR)frame_spec, - TAG_DONE)), - Child, (IPTR)HGroup, - MUIA_Group_SameWidth, TRUE, - Child, (IPTR)(ok_button = MUI_MakeObject(MUIO_Button, (IPTR)"_Ok")), - Child, (IPTR)HVSpace, - Child, (IPTR)HVSpace, - Child, (IPTR)(cancel_button = MUI_MakeObject(MUIO_Button, (IPTR)"_Cancel")), - End, - End, - End); - - if (data->wnd) - { - set(ok_button, MUIA_CycleChain, 1); - set(cancel_button, MUIA_CycleChain, 1); - - DoMethod(_app(obj),OM_ADDMEMBER,(IPTR)data->wnd); - - DoMethod(ok_button, MUIM_Notify, MUIA_Pressed, FALSE, (IPTR)_app(obj), 5, - MUIM_Application_PushMethod, (IPTR)obj, 2, - MUIM_Popframe_CloseWindow, TRUE); - DoMethod(cancel_button, MUIM_Notify, MUIA_Pressed, FALSE, (IPTR)_app(obj), 5, - MUIM_Application_PushMethod, (IPTR)obj, 2, - MUIM_Popframe_CloseWindow, FALSE); - DoMethod(data->wnd, MUIM_Notify, MUIA_Window_CloseRequest, TRUE, (IPTR)_app(obj), 5, - MUIM_Application_PushMethod, (IPTR)obj, 2, - MUIM_Popframe_CloseWindow, FALSE); - } - } - - if (data->wnd) - { - ULONG opened = FALSE; - - set(data->wnd, MUIA_Window_Open,TRUE); - get(data->wnd, MUIA_Window_Open, &opened); - if (!opened) - { - DoMethod(obj, MUIM_Popframe_CloseWindow, FALSE); - } - } - - return 1; -} - -IPTR Popframe__MUIM_Popframe_CloseWindow(struct IClass *cl, Object *obj, - struct MUIP_Popframe_CloseWindow *msg) -{ - struct Popframe_DATA *data = INST_DATA(cl, obj); - int ok = msg->ok; - - set(data->wnd, MUIA_Window_Open, FALSE); - - if (ok) - { - STRPTR spec = NULL; - get(data->frameadjust, MUIA_Frameadjust_Spec, &spec); -/* D(bug("popframe: got %s\n", spec)); */ - set(obj, MUIA_Framedisplay_Spec, (IPTR)spec); - } - - DoMethod(_app(obj), OM_REMMEMBER, (IPTR)data->wnd); - MUI_DisposeObject(data->wnd); - data->wnd = NULL; - data->frameadjust = NULL; - return 1; -} - -IPTR Popframe__MUIM_DisconnectParent(struct IClass *cl, Object *obj, - struct MUIP_DisconnectParent *msg) -{ - struct Popframe_DATA *data = INST_DATA(cl, obj); - - if (data->wnd) DoMethod(obj, MUIM_Popframe_CloseWindow, FALSE); - return DoSuperMethodA(cl, obj, (Msg)msg); -} - -#if ZUNE_BUILTIN_POPFRAME -BOOPSI_DISPATCHER(IPTR, Popframe_Dispatcher, cl, obj, msg) -{ - switch (msg->MethodID) - { - case OM_NEW: return Popframe__OM_NEW(cl, obj, (struct opSet *)msg); - case OM_DISPOSE: return Popframe__OM_DISPOSE(cl, obj, msg); - case MUIM_Hide: return Popframe__MUIM_Hide(cl, obj, (APTR)msg); - case MUIM_Popframe_OpenWindow: return Popframe__MUIM_Popframe_OpenWindow(cl, obj, (APTR)msg); - case MUIM_Popframe_CloseWindow: return Popframe__MUIM_Popframe_CloseWindow(cl, obj, (APTR)msg); - case MUIM_DisconnectParent: return Popframe__MUIM_DisconnectParent(cl, obj, (APTR)msg); - default: return DoSuperMethodA(cl, obj, msg); - } -} -BOOPSI_DISPATCHER_END - -const struct __MUIBuiltinClass _MUI_Popframe_desc = -{ - MUIC_Popframe, - MUIC_Framedisplay, - sizeof(struct Popframe_DATA), - (void*)Popframe_Dispatcher -}; -#endif /* ZUNE_BUILTIN_POPFRAME */ +/* + Copyright © 2002-2006, The AROS Development Team. All rights reserved. + $Id$ +*/ + +#define MUIMASTER_YES_INLINE_STDARG + +#include <clib/alib_protos.h> +#include <proto/exec.h> +#include <proto/graphics.h> +#include <proto/utility.h> +#include <proto/intuition.h> +#include <proto/muimaster.h> + +/* #define MYDEBUG 1 */ +#include "debug.h" +#include "mui.h" +#include "muimaster_intern.h" +#include "support.h" +#include "support_classes.h" +#include "popframe_private.h" + +extern struct Library *MUIMasterBase; + +IPTR Popframe__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) +{ + struct Popframe_DATA *data; + struct TagItem *tag, *tags; + + obj = (Object *) DoSuperNewTags( + cl, obj, NULL, + ButtonFrame, + InnerSpacing(4, 4), + MUIA_Background, MUII_ButtonBack, + MUIA_InputMode, MUIV_InputMode_RelVerify, + MUIA_Draggable, TRUE, + TAG_MORE, (IPTR) msg->ops_AttrList); + + if (!obj) + return FALSE; + + data = INST_DATA(cl, obj); + data->wintitle = NULL; + + /* parse initial taglist */ + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) + { + switch (tag->ti_Tag) + { + case MUIA_Window_Title: + data->wintitle = (CONST_STRPTR) tag->ti_Data; + break; + } + } + + DoMethod(obj, MUIM_Notify, MUIA_Pressed, FALSE, (IPTR) obj, 1, + MUIM_Popframe_OpenWindow); + + return (IPTR) obj; +} + +IPTR Popframe__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) +{ + struct Popframe_DATA *data = INST_DATA(cl, obj); + + if (data->wnd) + { + D(bug("Popframe_Dispose(%p) : MUI_DisposeObject(%p)\n", obj, + data->wnd)); + MUI_DisposeObject(data->wnd); + data->wnd = NULL; + } + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +IPTR Popframe__MUIM_Hide(struct IClass *cl, Object *obj, + struct opGet *msg) +{ +#if 0 + struct Popframe_DATA *data = INST_DATA(cl, obj); + if (data->wnd) + { + D(bug("Popframe_Hide(%p) : closing window %p\n", obj, data->wnd)); + set(data->wnd, MUIA_Window_Open, FALSE); + D(bug("Popframe_Hide(%p) : app REMMEMBER win (%p)\n", obj, + data->wnd)); + DoMethod(_app(obj), OM_REMMEMBER, (IPTR) data->wnd); + D(bug("Popframe_Hide(%p) : MUI_DisposeObject(%p)\n", obj, + data->wnd)); + MUI_DisposeObject(data->wnd); + data->wnd = NULL; + } +#endif + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +IPTR Popframe__MUIM_Popframe_OpenWindow(struct IClass *cl, Object *obj, + Msg msg) +{ + struct Popframe_DATA *data = INST_DATA(cl, obj); + + if (!data->wnd) + { + Object *ok_button, *cancel_button; + struct MUI_Frame_Spec *frame_spec = NULL; + ULONG x = 0, y = 0; + + get(_win(obj), MUIA_Window_LeftEdge, &x); + get(_win(obj), MUIA_Window_TopEdge, &y); + + get(obj, MUIA_Framedisplay_Spec, &frame_spec); + + data->wnd = (Object *)(WindowObject, + MUIA_Window_Title, (IPTR)data->wintitle, + MUIA_Window_Activate, TRUE, + MUIA_Window_IsSubWindow, TRUE, + MUIA_Window_LeftEdge, _left(obj) + x, + MUIA_Window_TopEdge, _bottom(obj) + y + 1, + WindowContents, (IPTR)VGroup, + Child, (IPTR)(data->frameadjust = MUI_NewObject( + MUIC_Frameadjust, + MUIA_CycleChain, 1, + MUIA_Frameadjust_Spec, (IPTR)frame_spec, + TAG_DONE)), + Child, (IPTR)HGroup, + MUIA_Group_SameWidth, TRUE, + Child, (IPTR)(ok_button = + MUI_MakeObject(MUIO_Button, (IPTR)"_Ok")), + Child, (IPTR)HVSpace, + Child, (IPTR)HVSpace, + Child, (IPTR)(cancel_button = + MUI_MakeObject(MUIO_Button, (IPTR)"_Cancel")), + End, + End, + End); + + if (data->wnd) + { + set(ok_button, MUIA_CycleChain, 1); + set(cancel_button, MUIA_CycleChain, 1); + + DoMethod(_app(obj), OM_ADDMEMBER, (IPTR) data->wnd); + + DoMethod(ok_button, MUIM_Notify, MUIA_Pressed, FALSE, + (IPTR) _app(obj), 5, MUIM_Application_PushMethod, + (IPTR) obj, 2, MUIM_Popframe_CloseWindow, TRUE); + DoMethod(cancel_button, MUIM_Notify, MUIA_Pressed, FALSE, + (IPTR) _app(obj), 5, MUIM_Application_PushMethod, + (IPTR) obj, 2, MUIM_Popframe_CloseWindow, FALSE); + DoMethod(data->wnd, MUIM_Notify, MUIA_Window_CloseRequest, TRUE, + (IPTR) _app(obj), 5, MUIM_Application_PushMethod, + (IPTR) obj, 2, MUIM_Popframe_CloseWindow, FALSE); + } + } + + if (data->wnd) + { + ULONG opened = FALSE; + + set(data->wnd, MUIA_Window_Open, TRUE); + get(data->wnd, MUIA_Window_Open, &opened); + if (!opened) + { + DoMethod(obj, MUIM_Popframe_CloseWindow, FALSE); + } + } + + return 1; +} + +IPTR Popframe__MUIM_Popframe_CloseWindow(struct IClass *cl, Object *obj, + struct MUIP_Popframe_CloseWindow *msg) +{ + struct Popframe_DATA *data = INST_DATA(cl, obj); + int ok = msg->ok; + + set(data->wnd, MUIA_Window_Open, FALSE); + + if (ok) + { + STRPTR spec = NULL; + get(data->frameadjust, MUIA_Frameadjust_Spec, &spec); +/* D(bug("popframe: got %s\n", spec)); */ + set(obj, MUIA_Framedisplay_Spec, (IPTR) spec); + } + + DoMethod(_app(obj), OM_REMMEMBER, (IPTR) data->wnd); + MUI_DisposeObject(data->wnd); + data->wnd = NULL; + data->frameadjust = NULL; + return 1; +} + +IPTR Popframe__MUIM_DisconnectParent(struct IClass *cl, Object *obj, + struct MUIP_DisconnectParent *msg) +{ + struct Popframe_DATA *data = INST_DATA(cl, obj); + + if (data->wnd) + DoMethod(obj, MUIM_Popframe_CloseWindow, FALSE); + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +#if ZUNE_BUILTIN_POPFRAME +BOOPSI_DISPATCHER(IPTR, Popframe_Dispatcher, cl, obj, msg) +{ + switch (msg->MethodID) + { + case OM_NEW: + return Popframe__OM_NEW(cl, obj, (struct opSet *)msg); + case OM_DISPOSE: + return Popframe__OM_DISPOSE(cl, obj, msg); + case MUIM_Hide: + return Popframe__MUIM_Hide(cl, obj, (APTR) msg); + case MUIM_Popframe_OpenWindow: + return Popframe__MUIM_Popframe_OpenWindow(cl, obj, (APTR) msg); + case MUIM_Popframe_CloseWindow: + return Popframe__MUIM_Popframe_CloseWindow(cl, obj, (APTR) msg); + case MUIM_DisconnectParent: + return Popframe__MUIM_DisconnectParent(cl, obj, (APTR) msg); + default: + return DoSuperMethodA(cl, obj, msg); + } +} +BOOPSI_DISPATCHER_END + +const struct __MUIBuiltinClass _MUI_Popframe_desc = +{ + MUIC_Popframe, + MUIC_Framedisplay, + sizeof(struct Popframe_DATA), + (void *) Popframe_Dispatcher +}; +#endif /* ZUNE_BUILTIN_POPFRAME */ diff --git a/workbench/libs/muimaster/classes/popframe.h b/workbench/libs/muimaster/classes/popframe.h index f40f2b9ab8..25c9427aa1 100644 --- a/workbench/libs/muimaster/classes/popframe.h +++ b/workbench/libs/muimaster/classes/popframe.h @@ -13,12 +13,21 @@ #define MUIB_Popframe (MUIB_ZUNE | 0x00002200) /*** Methods ****************************************************************/ -#define MUIM_Popframe_OpenWindow (MUIB_Popframe | 0x00000000) /* PRIV */ -#define MUIM_Popframe_CloseWindow (MUIB_Popframe | 0x00000001) /* PRIV */ -struct MUIP_Popframe_OpenWindow {STACKED ULONG MethodID;}; /* PRIV */ -struct MUIP_Popframe_CloseWindow {STACKED ULONG MethodID; STACKED LONG ok;}; /* PRIV */ +#define MUIM_Popframe_OpenWindow (MUIB_Popframe | 0x00000000) /* PRIV */ +#define MUIM_Popframe_CloseWindow (MUIB_Popframe | 0x00000001) /* PRIV */ +struct MUIP_Popframe_OpenWindow +{ + STACKED ULONG MethodID; +}; /* PRIV */ -extern const struct __MUIBuiltinClass _MUI_Popframe_desc; /* PRIV */ +struct MUIP_Popframe_CloseWindow +{ + STACKED ULONG MethodID; + STACKED LONG ok; +}; /* PRIV */ + + +extern const struct __MUIBuiltinClass _MUI_Popframe_desc; /* PRIV */ #endif /* _MUI_CLASSES_POPFRAME_H */ diff --git a/workbench/libs/muimaster/classes/popimage.c b/workbench/libs/muimaster/classes/popimage.c dissimilarity index 64% index 66c0d0cbcb..8b0970bd1c 100644 --- a/workbench/libs/muimaster/classes/popimage.c +++ b/workbench/libs/muimaster/classes/popimage.c @@ -1,246 +1,243 @@ -/* - Copyright © 2002-2003, The AROS Development Team. All rights reserved. - $Id$ -*/ - -#define MUIMASTER_YES_INLINE_STDARG - -#include <clib/alib_protos.h> -#include <proto/exec.h> -#include <proto/graphics.h> -#include <proto/utility.h> -#include <proto/intuition.h> -#include <proto/muimaster.h> - -/* #define MYDEBUG 1 */ -#include "debug.h" -#include "mui.h" -#include "muimaster_intern.h" -#include "support.h" -#include "support_classes.h" -#include "popimage_private.h" - -extern struct Library *MUIMasterBase; - -IPTR Popimage__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct Popimage_DATA *data; - struct TagItem *tag, *tags; - - obj = (Object *) DoSuperNewTags - ( - cl, obj, NULL, - - ButtonFrame, - InnerSpacing(4,4), - MUIA_Background, MUII_ButtonBack, - MUIA_InputMode, MUIV_InputMode_RelVerify, - MUIA_Draggable, TRUE, - - TAG_MORE, (IPTR) msg->ops_AttrList - ); - - if (!obj) return FALSE; - data = INST_DATA(cl, obj); - data->wintitle = NULL; - data->adjust_type = MUIV_Imageadjust_Type_All; - - /* parse initial taglist */ - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) - { - switch (tag->ti_Tag) - { - case MUIA_Window_Title: - data->wintitle = (CONST_STRPTR)tag->ti_Data; - break; - - case MUIA_Imageadjust_Type: - data->adjust_type = tag->ti_Data; - break; - } - } - - DoMethod(obj, MUIM_Notify, MUIA_Pressed, FALSE, (IPTR)obj, 1, - MUIM_Popimage_OpenWindow); - - return (IPTR)obj; -} - -IPTR Popimage__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) -{ - struct Popimage_DATA *data = INST_DATA(cl, obj); - - if (data->wnd) - { - D(bug("Popimage_Dispose(%p) : MUI_DisposeObject(%p)\n", obj, data->wnd)); - MUI_DisposeObject(data->wnd); - data->wnd = NULL; - } - return DoSuperMethodA(cl,obj,(Msg)msg); -} - -IPTR Popimage__MUIM_Hide(struct IClass *cl, Object *obj, struct opGet *msg) -{ -#if 0 - struct Popimage_DATA *data = INST_DATA(cl, obj); - if (data->wnd) - { - D(bug("Popimage_Hide(%p) : closing window %p\n", obj, data->wnd)); - set(data->wnd,MUIA_Window_Open,FALSE); - D(bug("Popimage_Hide(%p) : app REMMEMBER win (%p)\n", obj, data->wnd)); - DoMethod(_app(obj),OM_REMMEMBER,(IPTR)data->wnd); - D(bug("Popimage_Hide(%p) : MUI_DisposeObject(%p)\n", obj, data->wnd)); - MUI_DisposeObject(data->wnd); - data->wnd = NULL; - } -#endif - return DoSuperMethodA(cl,obj,(Msg)msg); -} - -IPTR Popimage__MUIM_Popimage_OpenWindow(struct IClass *cl, Object *obj, Msg msg) -{ - struct Popimage_DATA *data = INST_DATA(cl, obj); - - if (!data->wnd) - { - Object *ok_button, *cancel_button; - char *img_spec = NULL; - ULONG x = 0, y = 0; - - get(_win(obj), MUIA_Window_LeftEdge, &x); - get(_win(obj), MUIA_Window_TopEdge, &y); - - get(obj,MUIA_Imagedisplay_Spec, &img_spec); - - data->wnd = (Object *)WindowObject, - MUIA_Window_Title, (IPTR) data->wintitle, - MUIA_Window_Activate, TRUE, - MUIA_Window_IsSubWindow, TRUE, - MUIA_Window_LeftEdge, _left(obj) + x, - MUIA_Window_TopEdge, _bottom(obj) + y + 1, - - WindowContents, (IPTR) VGroup, - Child, (IPTR) (data->imageadjust = MUI_NewObject - ( - MUIC_Imageadjust, - MUIA_CycleChain, 1, - MUIA_Imageadjust_Spec, (IPTR) img_spec, - MUIA_Imageadjust_Type, data->adjust_type, - MUIA_Imageadjust_Originator, (IPTR) obj, - TAG_DONE - )), - Child, (IPTR) HGroup, - MUIA_Group_SameWidth, TRUE, - Child, (IPTR) (ok_button = MUI_MakeObject - ( - MUIO_Button, (IPTR) "_Ok" - )), - Child, (IPTR) HVSpace, - Child, (IPTR) HVSpace, - Child, (IPTR) (cancel_button = MUI_MakeObject - ( - MUIO_Button, (IPTR) "_Cancel" - )), - End, - End, - End; - - if (data->wnd) - { - set(ok_button, MUIA_CycleChain, 1); - set(cancel_button, MUIA_CycleChain, 1); - - DoMethod(_app(obj),OM_ADDMEMBER,(IPTR)data->wnd); - - DoMethod - ( - ok_button, MUIM_Notify, MUIA_Pressed, FALSE, - (IPTR) _app(obj), 5, MUIM_Application_PushMethod, - (IPTR) obj, 2, MUIM_Popimage_CloseWindow, TRUE - ); - DoMethod - ( - cancel_button, MUIM_Notify, MUIA_Pressed, FALSE, - (IPTR) _app(obj), 5, MUIM_Application_PushMethod, - (IPTR) obj, 2, MUIM_Popimage_CloseWindow, FALSE - ); - DoMethod - ( - data->wnd, MUIM_Notify, MUIA_Window_CloseRequest, TRUE, - (IPTR) _app(obj), 5, MUIM_Application_PushMethod, - (IPTR) obj, 2, MUIM_Popimage_CloseWindow, FALSE - ); - } - } - - if (data->wnd) - { - ULONG opened = FALSE; - - set(data->wnd, MUIA_Window_Open,TRUE); - get(data->wnd, MUIA_Window_Open, &opened); - if (!opened) - { - DoMethod(obj, MUIM_Popimage_CloseWindow, FALSE); - } - } - - return 1; -} - -IPTR Popimage__MUIM_Popimage_CloseWindow(struct IClass *cl, Object *obj, - struct MUIP_Popimage_CloseWindow *msg) -{ - struct Popimage_DATA *data = INST_DATA(cl, obj); - int ok = msg->ok; - - set(data->wnd, MUIA_Window_Open, FALSE); - - if (ok) - { - char *spec = NULL; - get(data->imageadjust, MUIA_Imageadjust_Spec, &spec); -/* D(bug("popimage: got %s\n", spec)); */ - set(obj, MUIA_Imagedisplay_Spec, (IPTR)spec); - } - - DoMethod(_app(obj), OM_REMMEMBER, (IPTR)data->wnd); - MUI_DisposeObject(data->wnd); - data->wnd = NULL; - data->imageadjust = NULL; - return 1; -} - -IPTR Popimage__MUIM_DisconnectParent(struct IClass *cl, Object *obj, - struct MUIP_DisconnectParent *msg) -{ - struct Popimage_DATA *data = INST_DATA(cl, obj); - - if (data->wnd) DoMethod(obj, MUIM_Popimage_CloseWindow, FALSE); - return DoSuperMethodA(cl, obj, (Msg)msg); -} - -#if ZUNE_BUILTIN_POPIMAGE -BOOPSI_DISPATCHER(IPTR, Popimage_Dispatcher, cl, obj, msg) -{ - switch (msg->MethodID) - { - case OM_NEW: return Popimage__OM_NEW(cl, obj, (struct opSet *)msg); - case OM_DISPOSE: return Popimage__OM_DISPOSE(cl, obj, msg); - case MUIM_Hide: return Popimage__MUIM_Hide(cl, obj, (APTR)msg); - case MUIM_Popimage_OpenWindow: return Popimage__MUIM_Popimage_OpenWindow(cl, obj, (APTR)msg); - case MUIM_Popimage_CloseWindow: return Popimage__MUIM_Popimage_CloseWindow(cl, obj, (APTR)msg); - case MUIM_DisconnectParent: return Popimage__MUIM_DisconnectParent(cl, obj, (APTR)msg); - default: return DoSuperMethodA(cl, obj, msg); - } -} -BOOPSI_DISPATCHER_END - -const struct __MUIBuiltinClass _MUI_Popimage_desc = -{ - MUIC_Popimage, - MUIC_Imagedisplay, - sizeof(struct Popimage_DATA), - (void*)Popimage_Dispatcher -}; -#endif /* ZUNE_BUILTIN_POPIMAGE */ +/* + Copyright © 2002-2003, The AROS Development Team. All rights reserved. + $Id$ +*/ + +#define MUIMASTER_YES_INLINE_STDARG + +#include <clib/alib_protos.h> +#include <proto/exec.h> +#include <proto/graphics.h> +#include <proto/utility.h> +#include <proto/intuition.h> +#include <proto/muimaster.h> + +/* #define MYDEBUG 1 */ +#include "debug.h" +#include "mui.h" +#include "muimaster_intern.h" +#include "support.h" +#include "support_classes.h" +#include "popimage_private.h" + +extern struct Library *MUIMasterBase; + +IPTR Popimage__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) +{ + struct Popimage_DATA *data; + struct TagItem *tag, *tags; + + obj = (Object *) DoSuperNewTags( + cl, obj, NULL, + ButtonFrame, + InnerSpacing(4, 4), + MUIA_Background, MUII_ButtonBack, + MUIA_InputMode, MUIV_InputMode_RelVerify, + MUIA_Draggable, TRUE, + TAG_MORE, (IPTR) msg->ops_AttrList); + + if (!obj) + return FALSE; + data = INST_DATA(cl, obj); + data->wintitle = NULL; + data->adjust_type = MUIV_Imageadjust_Type_All; + + /* parse initial taglist */ + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) + { + switch (tag->ti_Tag) + { + case MUIA_Window_Title: + data->wintitle = (CONST_STRPTR) tag->ti_Data; + break; + + case MUIA_Imageadjust_Type: + data->adjust_type = tag->ti_Data; + break; + } + } + + DoMethod(obj, MUIM_Notify, MUIA_Pressed, FALSE, (IPTR) obj, 1, + MUIM_Popimage_OpenWindow); + + return (IPTR) obj; +} + +IPTR Popimage__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) +{ + struct Popimage_DATA *data = INST_DATA(cl, obj); + + if (data->wnd) + { + D(bug("Popimage_Dispose(%p) : MUI_DisposeObject(%p)\n", obj, + data->wnd)); + MUI_DisposeObject(data->wnd); + data->wnd = NULL; + } + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +IPTR Popimage__MUIM_Hide(struct IClass *cl, Object *obj, + struct opGet *msg) +{ +#if 0 + struct Popimage_DATA *data = INST_DATA(cl, obj); + if (data->wnd) + { + D(bug("Popimage_Hide(%p) : closing window %p\n", obj, data->wnd)); + set(data->wnd, MUIA_Window_Open, FALSE); + D(bug("Popimage_Hide(%p) : app REMMEMBER win (%p)\n", obj, + data->wnd)); + DoMethod(_app(obj), OM_REMMEMBER, (IPTR) data->wnd); + D(bug("Popimage_Hide(%p) : MUI_DisposeObject(%p)\n", obj, + data->wnd)); + MUI_DisposeObject(data->wnd); + data->wnd = NULL; + } +#endif + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +IPTR Popimage__MUIM_Popimage_OpenWindow(struct IClass *cl, Object *obj, + Msg msg) +{ + struct Popimage_DATA *data = INST_DATA(cl, obj); + + if (!data->wnd) + { + Object *ok_button, *cancel_button; + char *img_spec = NULL; + ULONG x = 0, y = 0; + + get(_win(obj), MUIA_Window_LeftEdge, &x); + get(_win(obj), MUIA_Window_TopEdge, &y); + + get(obj, MUIA_Imagedisplay_Spec, &img_spec); + + data->wnd = (Object *) WindowObject, + MUIA_Window_Title, (IPTR) data->wintitle, + MUIA_Window_Activate, TRUE, + MUIA_Window_IsSubWindow, TRUE, + MUIA_Window_LeftEdge, _left(obj) + x, + MUIA_Window_TopEdge, _bottom(obj) + y + 1, + WindowContents, (IPTR) VGroup, + Child, (IPTR) (data->imageadjust = + MUI_NewObject(MUIC_Imageadjust, + MUIA_CycleChain, 1, + MUIA_Imageadjust_Spec, (IPTR) img_spec, + MUIA_Imageadjust_Type, data->adjust_type, + MUIA_Imageadjust_Originator, (IPTR) obj, + TAG_DONE)), + Child, (IPTR) HGroup, + MUIA_Group_SameWidth, TRUE, + Child, (IPTR) (ok_button = MUI_MakeObject(MUIO_Button, + (IPTR) "_Ok")), + Child, (IPTR) HVSpace, + Child, (IPTR) HVSpace, + Child, (IPTR) (cancel_button = MUI_MakeObject(MUIO_Button, + (IPTR) "_Cancel")), + End, + End, + End; + + if (data->wnd) + { + set(ok_button, MUIA_CycleChain, 1); + set(cancel_button, MUIA_CycleChain, 1); + + DoMethod(_app(obj), OM_ADDMEMBER, (IPTR) data->wnd); + + DoMethod + (ok_button, MUIM_Notify, MUIA_Pressed, FALSE, + (IPTR) _app(obj), 5, MUIM_Application_PushMethod, + (IPTR) obj, 2, MUIM_Popimage_CloseWindow, TRUE); + DoMethod + (cancel_button, MUIM_Notify, MUIA_Pressed, FALSE, + (IPTR) _app(obj), 5, MUIM_Application_PushMethod, + (IPTR) obj, 2, MUIM_Popimage_CloseWindow, FALSE); + DoMethod + (data->wnd, MUIM_Notify, MUIA_Window_CloseRequest, TRUE, + (IPTR) _app(obj), 5, MUIM_Application_PushMethod, + (IPTR) obj, 2, MUIM_Popimage_CloseWindow, FALSE); + } + } + + if (data->wnd) + { + ULONG opened = FALSE; + + set(data->wnd, MUIA_Window_Open, TRUE); + get(data->wnd, MUIA_Window_Open, &opened); + if (!opened) + { + DoMethod(obj, MUIM_Popimage_CloseWindow, FALSE); + } + } + + return 1; +} + +IPTR Popimage__MUIM_Popimage_CloseWindow(struct IClass *cl, Object *obj, + struct MUIP_Popimage_CloseWindow *msg) +{ + struct Popimage_DATA *data = INST_DATA(cl, obj); + int ok = msg->ok; + + set(data->wnd, MUIA_Window_Open, FALSE); + + if (ok) + { + char *spec = NULL; + get(data->imageadjust, MUIA_Imageadjust_Spec, &spec); +/* D(bug("popimage: got %s\n", spec)); */ + set(obj, MUIA_Imagedisplay_Spec, (IPTR) spec); + } + + DoMethod(_app(obj), OM_REMMEMBER, (IPTR) data->wnd); + MUI_DisposeObject(data->wnd); + data->wnd = NULL; + data->imageadjust = NULL; + return 1; +} + +IPTR Popimage__MUIM_DisconnectParent(struct IClass *cl, Object *obj, + struct MUIP_DisconnectParent *msg) +{ + struct Popimage_DATA *data = INST_DATA(cl, obj); + + if (data->wnd) + DoMethod(obj, MUIM_Popimage_CloseWindow, FALSE); + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +#if ZUNE_BUILTIN_POPIMAGE +BOOPSI_DISPATCHER(IPTR, Popimage_Dispatcher, cl, obj, msg) +{ + switch (msg->MethodID) + { + case OM_NEW: + return Popimage__OM_NEW(cl, obj, (struct opSet *)msg); + case OM_DISPOSE: + return Popimage__OM_DISPOSE(cl, obj, msg); + case MUIM_Hide: + return Popimage__MUIM_Hide(cl, obj, (APTR) msg); + case MUIM_Popimage_OpenWindow: + return Popimage__MUIM_Popimage_OpenWindow(cl, obj, (APTR) msg); + case MUIM_Popimage_CloseWindow: + return Popimage__MUIM_Popimage_CloseWindow(cl, obj, (APTR) msg); + case MUIM_DisconnectParent: + return Popimage__MUIM_DisconnectParent(cl, obj, (APTR) msg); + default: + return DoSuperMethodA(cl, obj, msg); + } +} +BOOPSI_DISPATCHER_END + +const struct __MUIBuiltinClass _MUI_Popimage_desc = +{ + MUIC_Popimage, + MUIC_Imagedisplay, + sizeof(struct Popimage_DATA), + (void *) Popimage_Dispatcher +}; +#endif /* ZUNE_BUILTIN_POPIMAGE */ diff --git a/workbench/libs/muimaster/classes/popimage.h b/workbench/libs/muimaster/classes/popimage.h index c60955684d..316e2fa77c 100644 --- a/workbench/libs/muimaster/classes/popimage.h +++ b/workbench/libs/muimaster/classes/popimage.h @@ -10,15 +10,24 @@ #define MUIC_Popimage "Popimage.mui" /*** Identifier base (for Zune extensions) **********************************/ -#define MUIB_Popimage (MUIB_ZUNE | 0x00002300) +#define MUIB_Popimage (MUIB_ZUNE | 0x00002300) /*** Methods ****************************************************************/ -#define MUIM_Popimage_OpenWindow (MUIB_Popimage | 0x00000000) /* PRIV */ -#define MUIM_Popimage_CloseWindow (MUIB_Popimage | 0x00000001) /* PRIV */ -struct MUIP_Popimage_OpenWindow {STACKED ULONG MethodID;}; /* PRIV */ -struct MUIP_Popimage_CloseWindow {STACKED ULONG MethodID; STACKED LONG ok;}; /* PRIV */ +#define MUIM_Popimage_OpenWindow (MUIB_Popimage | 0x00000000) /* PRIV */ +#define MUIM_Popimage_CloseWindow (MUIB_Popimage | 0x00000001) /* PRIV */ +struct MUIP_Popimage_OpenWindow +{ + STACKED ULONG MethodID; +}; /* PRIV */ -extern const struct __MUIBuiltinClass _MUI_Popimage_desc; /* PRIV */ +struct MUIP_Popimage_CloseWindow +{ + STACKED ULONG MethodID; + STACKED LONG ok; +}; /* PRIV */ + + +extern const struct __MUIBuiltinClass _MUI_Popimage_desc; /* PRIV */ #endif /* _MUI_CLASSES_POPIMAGE_H */ diff --git a/workbench/libs/muimaster/classes/poplist.c b/workbench/libs/muimaster/classes/poplist.c index dd9644c9a2..73207420a1 100644 --- a/workbench/libs/muimaster/classes/poplist.c +++ b/workbench/libs/muimaster/classes/poplist.c @@ -28,83 +28,82 @@ extern struct Library *MUIMasterBase; LONG PoplistStrObjFunc(struct Hook *hook, Object *popup, Object *str) { struct Poplist_DATA *data = (struct Poplist_DATA *)hook->h_Data; - STRPTR strtext = NULL, listentry; - LONG index; - + STRPTR strtext = NULL, listentry; + LONG index; + get(str, MUIA_String_Contents, &strtext); - - for(index = 0; ; index++) + + for (index = 0;; index++) { - DoMethod(data->list, MUIM_List_GetEntry, index, (IPTR)&listentry); - - if (!listentry) - { - set(data->list, MUIA_List_Active, MUIV_List_Active_Off); - break; - } - - if (stricmp(strtext, listentry) == 0) - { - set(data->list, MUIA_List_Active, index); - break; - } + DoMethod(data->list, MUIM_List_GetEntry, index, (IPTR) & listentry); + + if (!listentry) + { + set(data->list, MUIA_List_Active, MUIV_List_Active_Off); + break; + } + + if (stricmp(strtext, listentry) == 0) + { + set(data->list, MUIA_List_Active, index); + break; + } } - + return TRUE; } void PoplistObjStrFunc(struct Hook *hook, Object *popup, Object *str) { STRPTR listentry; - - DoMethod(popup, MUIM_List_GetEntry, MUIV_List_GetEntry_Active, (IPTR)&listentry); + + DoMethod(popup, MUIM_List_GetEntry, MUIV_List_GetEntry_Active, + (IPTR) & listentry); if (listentry) { - set(str, MUIA_String_Contents, listentry); - } + set(str, MUIA_String_Contents, listentry); + } } IPTR Poplist__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) { - STRPTR array = (STRPTR)GetTagData(MUIA_Poplist_Array, 0, msg->ops_AttrList); + STRPTR array = + (STRPTR) GetTagData(MUIA_Poplist_Array, 0, msg->ops_AttrList); Object *lv, *list; - - obj = (Object *)DoSuperNewTags - ( - cl, obj, NULL, - MUIA_Popobject_Object, (IPTR)(lv = (Object *)ListviewObject, - MUIA_Listview_List, (IPTR)(list = (Object *)ListObject, - InputListFrame, - array ? MUIA_List_SourceArray : TAG_IGNORE, (IPTR)array, - End), - End), - TAG_MORE, (IPTR) msg->ops_AttrList - ); - + + obj = (Object *) DoSuperNewTags(cl, obj, NULL, + MUIA_Popobject_Object, (IPTR) (lv = (Object *) ListviewObject, + MUIA_Listview_List, (IPTR) (list = (Object *) ListObject, + InputListFrame, + array ? MUIA_List_SourceArray : TAG_IGNORE, (IPTR) array, + End), + End), + TAG_MORE, (IPTR) msg->ops_AttrList); + if (obj) { - struct Poplist_DATA *data = INST_DATA(cl, obj); - - data->list = list; - - data->strobj_hook.h_Entry = HookEntry; - data->strobj_hook.h_SubEntry = (HOOKFUNC)PoplistStrObjFunc; - data->strobj_hook.h_Data = data; - - data->objstr_hook.h_Entry = HookEntry; - data->objstr_hook.h_SubEntry = (HOOKFUNC)PoplistObjStrFunc; - data->objstr_hook.h_Data = data; - - SetAttrs(obj, MUIA_Popobject_StrObjHook, (IPTR)&data->strobj_hook, - MUIA_Popobject_ObjStrHook, (IPTR)&data->objstr_hook, - TAG_DONE); - - DoMethod(lv, MUIM_Notify, MUIA_Listview_DoubleClick, TRUE, - (IPTR)obj, 2, MUIM_Popstring_Close, TRUE); + struct Poplist_DATA *data = INST_DATA(cl, obj); + + data->list = list; + + data->strobj_hook.h_Entry = HookEntry; + data->strobj_hook.h_SubEntry = (HOOKFUNC) PoplistStrObjFunc; + data->strobj_hook.h_Data = data; + + data->objstr_hook.h_Entry = HookEntry; + data->objstr_hook.h_SubEntry = (HOOKFUNC) PoplistObjStrFunc; + data->objstr_hook.h_Data = data; + + SetAttrs(obj, MUIA_Popobject_StrObjHook, (IPTR) & data->strobj_hook, + MUIA_Popobject_ObjStrHook, (IPTR) & data->objstr_hook, + TAG_DONE); + + DoMethod(lv, MUIM_Notify, MUIA_Listview_DoubleClick, TRUE, + (IPTR) obj, 2, MUIM_Popstring_Close, TRUE); } - - return (IPTR)obj; + + return (IPTR) obj; } #if ZUNE_BUILTIN_POPLIST @@ -112,17 +111,19 @@ BOOPSI_DISPATCHER(IPTR, Poplist_Dispatcher, cl, obj, msg) { switch (msg->MethodID) { - case OM_NEW: return Poplist__OM_NEW(cl, obj, (struct opSet *)msg); - default: return DoSuperMethodA(cl, obj, msg); + case OM_NEW: + return Poplist__OM_NEW(cl, obj, (struct opSet *)msg); + default: + return DoSuperMethodA(cl, obj, msg); } } BOOPSI_DISPATCHER_END const struct __MUIBuiltinClass _MUI_Poplist_desc = -{ - MUIC_Poplist, - MUIC_Popobject, - sizeof(struct Poplist_DATA), - (void*)Poplist_Dispatcher +{ + MUIC_Poplist, + MUIC_Popobject, + sizeof(struct Poplist_DATA), + (void *) Poplist_Dispatcher }; #endif /* ZUNE_BUILTIN_POPLIST */ diff --git a/workbench/libs/muimaster/classes/poplist.h b/workbench/libs/muimaster/classes/poplist.h index 0d71d45464..f6fc848c56 100644 --- a/workbench/libs/muimaster/classes/poplist.h +++ b/workbench/libs/muimaster/classes/poplist.h @@ -14,8 +14,9 @@ #define MUIB_Poplist (MUIB_ZUNE | 0x00002500) /*** Attributes *************************************************************/ -#define MUIA_Poplist_Array (MUIB_MUI|0x0042084c) /* MUI: V8 i.. char ** */ +#define MUIA_Poplist_Array \ + (MUIB_MUI | 0x0042084c) /* MUI: V8 i.. char ** */ -extern const struct __MUIBuiltinClass _MUI_Poplist_desc; /* PRIV */ +extern const struct __MUIBuiltinClass _MUI_Poplist_desc; /* PRIV */ #endif /* _MUI_CLASSES_POPLIST_H */ diff --git a/workbench/libs/muimaster/classes/popobject.c b/workbench/libs/muimaster/classes/popobject.c dissimilarity index 76% index 0af435b6e1..52cd70e99e 100644 --- a/workbench/libs/muimaster/classes/popobject.c +++ b/workbench/libs/muimaster/classes/popobject.c @@ -1,363 +1,379 @@ -/* - Copyright © 2002-2003, The AROS Development Team. All rights reserved. - $Id$ -*/ - -#include <graphics/gfx.h> -#include <graphics/view.h> -#include <clib/alib_protos.h> -#include <proto/exec.h> -#include <proto/graphics.h> -#include <proto/utility.h> -#include <proto/intuition.h> -#include <proto/muimaster.h> - -#include "mui.h" -#include "muimaster_intern.h" -#include "support.h" -#include "debug.h" - -extern struct Library *MUIMasterBase; - -struct Popobject_DATA -{ - struct MUI_EventHandlerNode ehn; - int light; - int vol; - int follow; - struct Hook *strobj_hook; - struct Hook *objstr_hook; - struct Hook *window_hook; - struct Hook open_hook; - struct Hook close_hook; - Object *object; - Object *wnd; -}; - -AROS_UFH3(ULONG,Popobject_Open_Function, - AROS_UFHA(struct Hook *, hook, A0), - AROS_UFHA(Object *, obj, A2), - AROS_UFHA(void **, msg, A1)) -{ - AROS_USERFUNC_INIT - - struct Popobject_DATA *data = (struct Popobject_DATA *)hook->h_Data; - Object *string = (Object*)msg[0]; - - if (!data->wnd) - { - static struct TagItem light_tags[] = - { - {MUIA_Window_Borderless , TRUE }, - {MUIA_Window_CloseGadget, FALSE }, - {MUIA_Window_SizeGadget , FALSE }, - {MUIA_Window_DepthGadget, FALSE }, - {MUIA_Window_DragBar , FALSE }, - {TAG_DONE } - }; - - data->wnd = WindowObject, - WindowContents,data->object, - data->light ? TAG_MORE : TAG_IGNORE, (IPTR)light_tags, - End; - - if (!data->wnd) return 0; - - DoMethod(_app(obj),OM_ADDMEMBER,(IPTR)data->wnd); - - DoMethod(data->wnd, MUIM_Notify, MUIA_Window_CloseRequest, TRUE, - (IPTR)obj, 2, MUIM_Popstring_Close, FALSE); - } - - if (data->strobj_hook) - { - if (!(CallHookPkt(data->strobj_hook,data->object,string))) - return 0; - } - - if (data->window_hook) - { - CallHookPkt(data->window_hook,data->object,data->wnd); - } - - SetAttrs(data->wnd, - MUIA_Window_LeftEdge, _left(obj) + _window(obj)->LeftEdge, - MUIA_Window_TopEdge, _bottom(obj)+1 + _window(obj)->TopEdge, - MUIA_Window_Width, _width(obj), - MUIA_Window_Open, TRUE, - TAG_DONE); - - if (!(data->ehn.ehn_Events & IDCMP_CHANGEWINDOW)) - { - data->ehn.ehn_Events |= IDCMP_CHANGEWINDOW; - DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR)&data->ehn); - } - - return 1; - - AROS_USERFUNC_EXIT -} - - -AROS_UFH3(ULONG,Popobject_Close_Function, - AROS_UFHA(struct Hook *, hook, A0), - AROS_UFHA(Object *, obj, A2), - AROS_UFHA(void **, msg, A1)) -{ - AROS_USERFUNC_INIT - - struct Popobject_DATA *data= (struct Popobject_DATA *)hook->h_Data; - Object *string = (Object*)msg[0]; - SIPTR suc = (SIPTR)msg[1]; - - if (data->wnd) - { - set(data->wnd,MUIA_Window_Open,FALSE); - - if (data->objstr_hook && suc) - CallHookPkt(data->objstr_hook,data->object,string); - - if (data->ehn.ehn_Events & IDCMP_CHANGEWINDOW) - { - DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR)&data->ehn); - data->ehn.ehn_Events &= ~IDCMP_CHANGEWINDOW; - } - - } - return 0; - - AROS_USERFUNC_EXIT -} - -IPTR Popobject__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct Popobject_DATA *data; - struct TagItem *tags; - struct TagItem *tag; - - obj = (Object *)DoSuperMethodA(cl, obj, (Msg)msg); - if (!obj) return FALSE; - - data = INST_DATA(cl, obj); - data->follow = 1; - data->vol = 1; - data->light = 1; - - data->ehn.ehn_Events = 0; - data->ehn.ehn_Priority = 0; - data->ehn.ehn_Flags = 0; - data->ehn.ehn_Object = obj; - data->ehn.ehn_Class = cl; - - data->open_hook.h_Entry = (HOOKFUNC)Popobject_Open_Function; - data->open_hook.h_Data = data; - data->close_hook.h_Entry = (HOOKFUNC)Popobject_Close_Function; - data->close_hook.h_Data = data; - - /* parse initial taglist */ - - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) - { - switch (tag->ti_Tag) - { - case MUIA_Popobject_Follow: - data->follow = tag->ti_Data; - break; - - case MUIA_Popobject_Light: - data->light = tag->ti_Data; - break; - - case MUIA_Popobject_Object: - data->object = (Object*)tag->ti_Data; - break; - - case MUIA_Popobject_ObjStrHook: - data->objstr_hook = (struct Hook*)tag->ti_Data; - break; - - case MUIA_Popobject_StrObjHook: - data->strobj_hook = (struct Hook*)tag->ti_Data; - break; - - case MUIA_Popobject_Volatile: - data->vol = tag->ti_Data; - break; - - case MUIA_Popobject_WindowHook: - data->window_hook = (struct Hook*)tag->ti_Data; - break; - } - } - - SetAttrs(obj, - MUIA_Popstring_OpenHook, (IPTR)&data->open_hook, - MUIA_Popstring_CloseHook, (IPTR)&data->close_hook, - MUIA_Popstring_Toggle, TRUE, - TAG_DONE); - - return (IPTR)obj; -} - -IPTR Popobject__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) -{ - struct Popobject_DATA *data = INST_DATA(cl, obj); - - if (!data->wnd && data->object) - MUI_DisposeObject(data->object); - - return DoSuperMethodA(cl, obj, msg); -} - -IPTR Popobject__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct Popobject_DATA *data = INST_DATA(cl, obj); - struct TagItem *tags; - struct TagItem *tag; - - /* parse initial taglist */ - - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) - { - switch (tag->ti_Tag) - { - case MUIA_Popobject_Follow: - data->follow = tag->ti_Data; - break; - - case MUIA_Popobject_ObjStrHook: - data->objstr_hook = (struct Hook*)tag->ti_Data; - break; - - case MUIA_Popobject_StrObjHook: - data->strobj_hook = (struct Hook*)tag->ti_Data; - break; - - case MUIA_Popobject_Volatile: - data->vol = tag->ti_Data; - break; - - case MUIA_Popobject_WindowHook: - data->window_hook = (struct Hook*)tag->ti_Data; - break; - } - } - return DoSuperMethodA(cl,obj,(Msg)msg); -} - - -IPTR Popobject__MUIM_Get(struct IClass *cl, Object *obj, struct opGet *msg) -{ - struct Popobject_DATA *data = INST_DATA(cl, obj); - - switch (msg->opg_AttrID) - { - case MUIA_Popobject_Follow: - *msg->opg_Storage = data->follow; - return TRUE; - - case MUIA_Popobject_Light: - *msg->opg_Storage = data->light; - return TRUE; - - case MUIA_Popobject_Object: - *msg->opg_Storage = (IPTR)data->object; - return TRUE; - - case MUIA_Popobject_ObjStrHook: - *msg->opg_Storage = (IPTR)data->objstr_hook; - return TRUE; - - case MUIA_Popobject_StrObjHook: - *msg->opg_Storage = (IPTR)data->strobj_hook; - return TRUE; - - case MUIA_Popobject_Volatile: - *msg->opg_Storage = data->vol; - return TRUE; - - case MUIA_Popobject_WindowHook: - *msg->opg_Storage = (IPTR)data->window_hook; - return TRUE; - } - - return DoSuperMethodA(cl, obj, (Msg)msg); -} - - -IPTR Popobject__MUIM_Cleanup(struct IClass *cl, Object *obj, struct MUIP_Cleanup *msg) -{ - struct Popobject_DATA *data = INST_DATA(cl, obj); - - if (data->ehn.ehn_Events & IDCMP_CHANGEWINDOW) - { - DoMethod(_win(obj),MUIM_Window_RemEventHandler, (IPTR)&data->ehn); - data->ehn.ehn_Events &= ~IDCMP_CHANGEWINDOW; - } - - return DoSuperMethodA(cl,obj,(Msg)msg); -} - -IPTR Popobject__MUIM_Show(struct IClass *cl, Object *obj, struct MUIP_Show *msg) -{ - IPTR rc = DoSuperMethodA(cl,obj,(Msg)msg); - if (!rc) return 0; - return rc; -} - -IPTR Popobject__MUIM_Hide(struct IClass *cl, Object *obj, struct MUIP_Hide *msg) -{ - return DoSuperMethodA(cl,obj,(Msg)msg); -} - -IPTR Popobject__MUIM_HandleEvent(struct IClass *cl, Object *obj, struct MUIP_HandleEvent *msg) -{ - struct Popobject_DATA *data = INST_DATA(cl, obj); - - if (data->follow && msg->imsg && data->wnd) - { - if (msg->imsg->Class == IDCMP_CHANGEWINDOW) - { - struct Window *popwin = NULL; - struct Window *parentwin = _window(obj); - - get(data->wnd, MUIA_Window_Window, &popwin); - - if (popwin && parentwin) - { - ChangeWindowBox(popwin, _left(obj) + parentwin->LeftEdge, - _bottom(obj) + parentwin->TopEdge + 1, - popwin->Width, - popwin->Height); - } - } - } - - return DoSuperMethodA(cl,obj,(Msg)msg); -} - -BOOPSI_DISPATCHER(IPTR, Popobject_Dispatcher, cl, obj, msg) -{ - switch (msg->MethodID) - { - case OM_NEW: return Popobject__OM_NEW(cl, obj, (struct opSet *)msg); - case OM_DISPOSE: return Popobject__OM_DISPOSE(cl, obj, msg); - case OM_SET: return Popobject__OM_SET(cl, obj, (struct opSet *)msg); - case OM_GET: return Popobject__MUIM_Get(cl, obj, (struct opGet *)msg); - case MUIM_Cleanup: return Popobject__MUIM_Cleanup(cl, obj, (struct MUIP_Cleanup *)msg); - case MUIM_Show: return Popobject__MUIM_Show(cl, obj, (struct MUIP_Show*)msg); - case MUIM_Hide: return Popobject__MUIM_Hide(cl, obj, (struct MUIP_Hide*)msg); - case MUIM_HandleEvent: return Popobject__MUIM_HandleEvent(cl, obj, (struct MUIP_HandleEvent *)msg); - } - - return DoSuperMethodA(cl, obj, msg); -} -BOOPSI_DISPATCHER_END - -const struct __MUIBuiltinClass _MUI_Popobject_desc = -{ - MUIC_Popobject, - MUIC_Popstring, - sizeof(struct Popobject_DATA), - (void*)Popobject_Dispatcher -}; +/* + Copyright © 2002-2003, The AROS Development Team. All rights reserved. + $Id$ +*/ + +#include <graphics/gfx.h> +#include <graphics/view.h> +#include <clib/alib_protos.h> +#include <proto/exec.h> +#include <proto/graphics.h> +#include <proto/utility.h> +#include <proto/intuition.h> +#include <proto/muimaster.h> + +#include "mui.h" +#include "muimaster_intern.h" +#include "support.h" +#include "debug.h" + +extern struct Library *MUIMasterBase; + +struct Popobject_DATA +{ + struct MUI_EventHandlerNode ehn; + int light; + int vol; + int follow; + struct Hook *strobj_hook; + struct Hook *objstr_hook; + struct Hook *window_hook; + struct Hook open_hook; + struct Hook close_hook; + Object *object; + Object *wnd; +}; + +AROS_UFH3(ULONG, Popobject_Open_Function, + AROS_UFHA(struct Hook *, hook, A0), + AROS_UFHA(Object *, obj, A2), + AROS_UFHA(void **, msg, A1)) +{ + AROS_USERFUNC_INIT + + struct Popobject_DATA *data = (struct Popobject_DATA *)hook->h_Data; + Object *string = (Object *) msg[0]; + + if (!data->wnd) + { + static struct TagItem light_tags[] = + { + {MUIA_Window_Borderless, TRUE}, + {MUIA_Window_CloseGadget, FALSE}, + {MUIA_Window_SizeGadget, FALSE}, + {MUIA_Window_DepthGadget, FALSE}, + {MUIA_Window_DragBar, FALSE}, + {TAG_DONE} + }; + + data->wnd = WindowObject, + WindowContents, data->object, + data->light ? TAG_MORE : TAG_IGNORE, (IPTR) light_tags, End; + + if (!data->wnd) + return 0; + + DoMethod(_app(obj), OM_ADDMEMBER, (IPTR) data->wnd); + + DoMethod(data->wnd, MUIM_Notify, MUIA_Window_CloseRequest, TRUE, + (IPTR) obj, 2, MUIM_Popstring_Close, FALSE); + } + + if (data->strobj_hook) + { + if (!(CallHookPkt(data->strobj_hook, data->object, string))) + return 0; + } + + if (data->window_hook) + { + CallHookPkt(data->window_hook, data->object, data->wnd); + } + + SetAttrs(data->wnd, + MUIA_Window_LeftEdge, _left(obj) + _window(obj)->LeftEdge, + MUIA_Window_TopEdge, _bottom(obj) + 1 + _window(obj)->TopEdge, + MUIA_Window_Width, _width(obj), MUIA_Window_Open, TRUE, TAG_DONE); + + if (!(data->ehn.ehn_Events & IDCMP_CHANGEWINDOW)) + { + data->ehn.ehn_Events |= IDCMP_CHANGEWINDOW; + DoMethod(_win(obj), MUIM_Window_AddEventHandler, + (IPTR) & data->ehn); + } + + return 1; + + AROS_USERFUNC_EXIT +} + + +AROS_UFH3(ULONG, Popobject_Close_Function, + AROS_UFHA(struct Hook *, hook, A0), + AROS_UFHA(Object *, obj, A2), + AROS_UFHA(void **, msg, A1)) +{ + AROS_USERFUNC_INIT + + struct Popobject_DATA *data = (struct Popobject_DATA *)hook->h_Data; + Object *string = (Object *) msg[0]; + SIPTR suc = (SIPTR) msg[1]; + + if (data->wnd) + { + set(data->wnd, MUIA_Window_Open, FALSE); + + if (data->objstr_hook && suc) + CallHookPkt(data->objstr_hook, data->object, string); + + if (data->ehn.ehn_Events & IDCMP_CHANGEWINDOW) + { + DoMethod(_win(obj), MUIM_Window_RemEventHandler, + (IPTR) & data->ehn); + data->ehn.ehn_Events &= ~IDCMP_CHANGEWINDOW; + } + + } + return 0; + + AROS_USERFUNC_EXIT +} + +IPTR Popobject__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) +{ + struct Popobject_DATA *data; + struct TagItem *tags; + struct TagItem *tag; + + obj = (Object *) DoSuperMethodA(cl, obj, (Msg) msg); + if (!obj) + return FALSE; + + data = INST_DATA(cl, obj); + data->follow = 1; + data->vol = 1; + data->light = 1; + + data->ehn.ehn_Events = 0; + data->ehn.ehn_Priority = 0; + data->ehn.ehn_Flags = 0; + data->ehn.ehn_Object = obj; + data->ehn.ehn_Class = cl; + + data->open_hook.h_Entry = (HOOKFUNC) Popobject_Open_Function; + data->open_hook.h_Data = data; + data->close_hook.h_Entry = (HOOKFUNC) Popobject_Close_Function; + data->close_hook.h_Data = data; + + /* parse initial taglist */ + + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) + { + switch (tag->ti_Tag) + { + case MUIA_Popobject_Follow: + data->follow = tag->ti_Data; + break; + + case MUIA_Popobject_Light: + data->light = tag->ti_Data; + break; + + case MUIA_Popobject_Object: + data->object = (Object *) tag->ti_Data; + break; + + case MUIA_Popobject_ObjStrHook: + data->objstr_hook = (struct Hook *)tag->ti_Data; + break; + + case MUIA_Popobject_StrObjHook: + data->strobj_hook = (struct Hook *)tag->ti_Data; + break; + + case MUIA_Popobject_Volatile: + data->vol = tag->ti_Data; + break; + + case MUIA_Popobject_WindowHook: + data->window_hook = (struct Hook *)tag->ti_Data; + break; + } + } + + SetAttrs(obj, + MUIA_Popstring_OpenHook, (IPTR) & data->open_hook, + MUIA_Popstring_CloseHook, (IPTR) & data->close_hook, + MUIA_Popstring_Toggle, TRUE, + TAG_DONE); + + return (IPTR) obj; +} + +IPTR Popobject__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) +{ + struct Popobject_DATA *data = INST_DATA(cl, obj); + + if (!data->wnd && data->object) + MUI_DisposeObject(data->object); + + return DoSuperMethodA(cl, obj, msg); +} + +IPTR Popobject__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) +{ + struct Popobject_DATA *data = INST_DATA(cl, obj); + struct TagItem *tags; + struct TagItem *tag; + + /* parse initial taglist */ + + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) + { + switch (tag->ti_Tag) + { + case MUIA_Popobject_Follow: + data->follow = tag->ti_Data; + break; + + case MUIA_Popobject_ObjStrHook: + data->objstr_hook = (struct Hook *)tag->ti_Data; + break; + + case MUIA_Popobject_StrObjHook: + data->strobj_hook = (struct Hook *)tag->ti_Data; + break; + + case MUIA_Popobject_Volatile: + data->vol = tag->ti_Data; + break; + + case MUIA_Popobject_WindowHook: + data->window_hook = (struct Hook *)tag->ti_Data; + break; + } + } + return DoSuperMethodA(cl, obj, (Msg) msg); +} + + +IPTR Popobject__MUIM_Get(struct IClass *cl, Object *obj, + struct opGet *msg) +{ + struct Popobject_DATA *data = INST_DATA(cl, obj); + + switch (msg->opg_AttrID) + { + case MUIA_Popobject_Follow: + *msg->opg_Storage = data->follow; + return TRUE; + + case MUIA_Popobject_Light: + *msg->opg_Storage = data->light; + return TRUE; + + case MUIA_Popobject_Object: + *msg->opg_Storage = (IPTR) data->object; + return TRUE; + + case MUIA_Popobject_ObjStrHook: + *msg->opg_Storage = (IPTR) data->objstr_hook; + return TRUE; + + case MUIA_Popobject_StrObjHook: + *msg->opg_Storage = (IPTR) data->strobj_hook; + return TRUE; + + case MUIA_Popobject_Volatile: + *msg->opg_Storage = data->vol; + return TRUE; + + case MUIA_Popobject_WindowHook: + *msg->opg_Storage = (IPTR) data->window_hook; + return TRUE; + } + + return DoSuperMethodA(cl, obj, (Msg) msg); +} + + +IPTR Popobject__MUIM_Cleanup(struct IClass *cl, Object *obj, + struct MUIP_Cleanup *msg) +{ + struct Popobject_DATA *data = INST_DATA(cl, obj); + + if (data->ehn.ehn_Events & IDCMP_CHANGEWINDOW) + { + DoMethod(_win(obj), MUIM_Window_RemEventHandler, + (IPTR) & data->ehn); + data->ehn.ehn_Events &= ~IDCMP_CHANGEWINDOW; + } + + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +IPTR Popobject__MUIM_Show(struct IClass *cl, Object *obj, + struct MUIP_Show *msg) +{ + IPTR rc = DoSuperMethodA(cl, obj, (Msg) msg); + if (!rc) + return 0; + return rc; +} + +IPTR Popobject__MUIM_Hide(struct IClass *cl, Object *obj, + struct MUIP_Hide *msg) +{ + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +IPTR Popobject__MUIM_HandleEvent(struct IClass *cl, Object *obj, + struct MUIP_HandleEvent *msg) +{ + struct Popobject_DATA *data = INST_DATA(cl, obj); + + if (data->follow && msg->imsg && data->wnd) + { + if (msg->imsg->Class == IDCMP_CHANGEWINDOW) + { + struct Window *popwin = NULL; + struct Window *parentwin = _window(obj); + + get(data->wnd, MUIA_Window_Window, &popwin); + + if (popwin && parentwin) + { + ChangeWindowBox(popwin, _left(obj) + parentwin->LeftEdge, + _bottom(obj) + parentwin->TopEdge + 1, + popwin->Width, popwin->Height); + } + } + } + + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +BOOPSI_DISPATCHER(IPTR, Popobject_Dispatcher, cl, obj, msg) +{ + switch (msg->MethodID) + { + case OM_NEW: + return Popobject__OM_NEW(cl, obj, (struct opSet *)msg); + case OM_DISPOSE: + return Popobject__OM_DISPOSE(cl, obj, msg); + case OM_SET: + return Popobject__OM_SET(cl, obj, (struct opSet *)msg); + case OM_GET: + return Popobject__MUIM_Get(cl, obj, (struct opGet *)msg); + case MUIM_Cleanup: + return Popobject__MUIM_Cleanup(cl, obj, (struct MUIP_Cleanup *)msg); + case MUIM_Show: + return Popobject__MUIM_Show(cl, obj, (struct MUIP_Show *)msg); + case MUIM_Hide: + return Popobject__MUIM_Hide(cl, obj, (struct MUIP_Hide *)msg); + case MUIM_HandleEvent: + return Popobject__MUIM_HandleEvent(cl, obj, + (struct MUIP_HandleEvent *)msg); + } + + return DoSuperMethodA(cl, obj, msg); +} +BOOPSI_DISPATCHER_END + +const struct __MUIBuiltinClass _MUI_Popobject_desc = +{ + MUIC_Popobject, + MUIC_Popstring, + sizeof(struct Popobject_DATA), + (void *) Popobject_Dispatcher +}; diff --git a/workbench/libs/muimaster/classes/popobject.h b/workbench/libs/muimaster/classes/popobject.h index 754069d23c..c803578036 100644 --- a/workbench/libs/muimaster/classes/popobject.h +++ b/workbench/libs/muimaster/classes/popobject.h @@ -14,15 +14,22 @@ #define MUIB_Popobject (MUIB_ZUNE | 0x00002400) /*** Attributes *************************************************************/ -#define MUIA_Popobject_Follow (MUIB_MUI|0x00424cb5) /* MUI: V7 isg BOOL */ -#define MUIA_Popobject_Light (MUIB_MUI|0x0042a5a3) /* MUI: V7 isg BOOL */ -#define MUIA_Popobject_Object (MUIB_MUI|0x004293e3) /* MUI: V7 i.g Object * */ -#define MUIA_Popobject_ObjStrHook (MUIB_MUI|0x0042db44) /* MUI: V7 isg struct Hook * */ -#define MUIA_Popobject_StrObjHook (MUIB_MUI|0x0042fbe1) /* MUI: V7 isg struct Hook * */ -#define MUIA_Popobject_Volatile (MUIB_MUI|0x004252ec) /* MUI: V7 isg BOOL */ -#define MUIA_Popobject_WindowHook (MUIB_MUI|0x0042f194) /* MUI: V9 isg struct Hook * */ +#define MUIA_Popobject_Follow \ + (MUIB_MUI | 0x00424cb5) /* MUI: V7 isg BOOL */ +#define MUIA_Popobject_Light \ + (MUIB_MUI | 0x0042a5a3) /* MUI: V7 isg BOOL */ +#define MUIA_Popobject_Object \ + (MUIB_MUI | 0x004293e3) /* MUI: V7 i.g Object * */ +#define MUIA_Popobject_ObjStrHook \ + (MUIB_MUI | 0x0042db44) /* MUI: V7 isg struct Hook * */ +#define MUIA_Popobject_StrObjHook \ + (MUIB_MUI | 0x0042fbe1) /* MUI: V7 isg struct Hook * */ +#define MUIA_Popobject_Volatile \ + (MUIB_MUI | 0x004252ec) /* MUI: V7 isg BOOL */ +#define MUIA_Popobject_WindowHook \ + (MUIB_MUI | 0x0042f194) /* MUI: V9 isg struct Hook * */ -extern const struct __MUIBuiltinClass _MUI_Popobject_desc; /* PRIV */ +extern const struct __MUIBuiltinClass _MUI_Popobject_desc; /* PRIV */ #endif /*_MUI_CLASSES_POPOBJECT_H */ diff --git a/workbench/libs/muimaster/classes/poppen.c b/workbench/libs/muimaster/classes/poppen.c dissimilarity index 66% index 4709713077..5b0b8cfe8d 100644 --- a/workbench/libs/muimaster/classes/poppen.c +++ b/workbench/libs/muimaster/classes/poppen.c @@ -1,191 +1,201 @@ -/* - Copyright © 2002-2003, The AROS Development Team. All rights reserved. - $Id$ -*/ - -#define MUIMASTER_YES_INLINE_STDARG - -#include <clib/alib_protos.h> -#include <proto/exec.h> -#include <proto/graphics.h> -#include <proto/utility.h> -#include <proto/intuition.h> -#include <proto/muimaster.h> - -#include "mui.h" -#include "muimaster_intern.h" -#include "support.h" -#include "support_classes.h" -#include "poppen_private.h" - -extern struct Library *MUIMasterBase; - - -IPTR Poppen__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct Poppen_DATA *data; - struct TagItem *tag, *tags; - //Object *image; - - obj = (Object *)DoSuperNewTags(cl, obj, NULL, - ButtonFrame, - InnerSpacing(4,4), - MUIA_Background, MUII_ButtonBack, - MUIA_InputMode, MUIV_InputMode_RelVerify, - MUIA_Draggable, TRUE, - TAG_MORE, (IPTR)msg->ops_AttrList); - - if (!obj) return FALSE; - - data = INST_DATA(cl, obj); - data->wintitle = NULL; - - /* parse initial taglist */ - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) - { - switch (tag->ti_Tag) - { - case MUIA_Window_Title: - data->wintitle = (CONST_STRPTR)tag->ti_Data; - break; - - } - } - - DoMethod(obj, MUIM_Notify, MUIA_Pressed, FALSE, (IPTR)obj, 1, - MUIM_Poppen_OpenWindow); - - return (IPTR)obj; -} - -IPTR Poppen__MUIM_Hide(struct IClass *cl, Object *obj, struct opGet *msg) -{ - struct Poppen_DATA *data = INST_DATA(cl, obj); - - if (data->wnd) - { - set(data->wnd,MUIA_Window_Open,FALSE); - DoMethod(_app(obj),OM_REMMEMBER,(IPTR)data->wnd); - MUI_DisposeObject(data->wnd); - data->wnd = NULL; - } - return DoSuperMethodA(cl,obj,(Msg)msg); -} - -IPTR Poppen__MUIM_Poppen_OpenWindow(struct IClass *cl, Object *obj, Msg msg) -{ - struct Poppen_DATA *data = INST_DATA(cl, obj); - - if (!data->wnd) - { - Object *ok_button, *cancel_button; - char *penspec = NULL; - - get(obj,MUIA_Pendisplay_Spec, &penspec); - - data->wnd = (Object *)(WindowObject, - MUIA_Window_Title, (IPTR)data->wintitle, - MUIA_Window_Activate, TRUE, - WindowContents, (IPTR)VGroup, - Child, (IPTR)(data->penadjust = (Object *)PenadjustObject, - MUIA_CycleChain, 1, - MUIA_Penadjust_Spec, (IPTR)penspec, - End), - Child, (IPTR)HGroup, - Child, (IPTR)(ok_button = MUI_MakeObject(MUIO_Button,(IPTR)"_Ok")), - Child, (IPTR)(cancel_button = MUI_MakeObject(MUIO_Button,(IPTR)"_Cancel")), - End, - End, - End); - - if (data->wnd) - { - set(ok_button, MUIA_CycleChain, 1); - set(cancel_button, MUIA_CycleChain, 1); - - DoMethod(_app(obj),OM_ADDMEMBER,(IPTR)data->wnd); - - DoMethod(ok_button, MUIM_Notify, MUIA_Pressed, FALSE, (IPTR)_app(obj), 5, - MUIM_Application_PushMethod, (IPTR)obj, 2, - MUIM_Poppen_CloseWindow, TRUE); - DoMethod(cancel_button, MUIM_Notify, MUIA_Pressed, FALSE, (IPTR)_app(obj), 5, - MUIM_Application_PushMethod, (IPTR)obj, 2, - MUIM_Poppen_CloseWindow, FALSE); - DoMethod(data->wnd, MUIM_Notify, MUIA_Window_CloseRequest, TRUE, (IPTR)_app(obj), 5, - MUIM_Application_PushMethod, (IPTR)obj, 2, - MUIM_Poppen_CloseWindow, FALSE); - } - } - - if (data->wnd) - { - IPTR opened = FALSE; - - set(data->wnd, MUIA_Window_Open,TRUE); - get(data->wnd, MUIA_Window_Open, &opened); - - if (!opened) - { - DoMethod(obj, MUIM_Poppen_CloseWindow, FALSE); - } - } - - return 1; -} - -IPTR Poppen__MUIM_Poppen_CloseWindow(struct IClass *cl, Object *obj, - struct MUIP_Poppen_CloseWindow *msg) -{ - struct Poppen_DATA *data = INST_DATA(cl, obj); - int ok = msg->ok; - - set(data->wnd, MUIA_Window_Open, FALSE); - - if (ok) - { - char *spec = NULL; - - get(data->penadjust, MUIA_Penadjust_Spec, &spec); - - set(obj, MUIA_Pendisplay_Spec, (IPTR)spec); - } - - DoMethod(_app(obj), OM_REMMEMBER, (IPTR)data->wnd); - MUI_DisposeObject(data->wnd); - data->wnd = NULL; - data->penadjust = NULL; - return 1; -} - -IPTR Poppen__MUIM_DisconnectParent(struct IClass *cl, Object *obj, - struct MUIP_DisconnectParent *msg) -{ - struct Poppen_DATA *data = INST_DATA(cl, obj); - - if (data->wnd) DoMethod(obj, MUIM_Poppen_CloseWindow, FALSE); - return DoSuperMethodA(cl, obj, (Msg)msg); -} - -#if ZUNE_BUILTIN_POPPEN -BOOPSI_DISPATCHER(IPTR, Poppen_Dispatcher, cl, obj, msg) -{ - switch (msg->MethodID) - { - case OM_NEW: return Poppen__OM_NEW(cl, obj, (struct opSet *)msg); - case MUIM_Hide: return Poppen__MUIM_Hide(cl, obj, (APTR)msg); - case MUIM_Poppen_OpenWindow: return Poppen__MUIM_Poppen_OpenWindow(cl, obj, (APTR)msg); - case MUIM_Poppen_CloseWindow: return Poppen__MUIM_Poppen_CloseWindow(cl, obj, (APTR)msg); - case MUIM_DisconnectParent: return Poppen__MUIM_DisconnectParent(cl, obj, (APTR)msg); - default: return DoSuperMethodA(cl, obj, msg); - } -} -BOOPSI_DISPATCHER_END - -const struct __MUIBuiltinClass _MUI_Poppen_desc = -{ - MUIC_Poppen, - MUIC_Pendisplay, - sizeof(struct Poppen_DATA), - (void*)Poppen_Dispatcher -}; -#endif /* ZUNE_BUILTIN_POPPEN */ +/* + Copyright © 2002-2003, The AROS Development Team. All rights reserved. + $Id$ +*/ + +#define MUIMASTER_YES_INLINE_STDARG + +#include <clib/alib_protos.h> +#include <proto/exec.h> +#include <proto/graphics.h> +#include <proto/utility.h> +#include <proto/intuition.h> +#include <proto/muimaster.h> + +#include "mui.h" +#include "muimaster_intern.h" +#include "support.h" +#include "support_classes.h" +#include "poppen_private.h" + +extern struct Library *MUIMasterBase; + + +IPTR Poppen__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) +{ + struct Poppen_DATA *data; + struct TagItem *tag, *tags; + //Object *image; + + obj = (Object *) DoSuperNewTags(cl, obj, NULL, + ButtonFrame, + InnerSpacing(4, 4), + MUIA_Background, MUII_ButtonBack, + MUIA_InputMode, MUIV_InputMode_RelVerify, + MUIA_Draggable, TRUE, TAG_MORE, (IPTR) msg->ops_AttrList); + + if (!obj) + return FALSE; + + data = INST_DATA(cl, obj); + data->wintitle = NULL; + + /* parse initial taglist */ + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) + { + switch (tag->ti_Tag) + { + case MUIA_Window_Title: + data->wintitle = (CONST_STRPTR) tag->ti_Data; + break; + + } + } + + DoMethod(obj, MUIM_Notify, MUIA_Pressed, FALSE, (IPTR) obj, 1, + MUIM_Poppen_OpenWindow); + + return (IPTR) obj; +} + +IPTR Poppen__MUIM_Hide(struct IClass *cl, Object *obj, struct opGet *msg) +{ + struct Poppen_DATA *data = INST_DATA(cl, obj); + + if (data->wnd) + { + set(data->wnd, MUIA_Window_Open, FALSE); + DoMethod(_app(obj), OM_REMMEMBER, (IPTR) data->wnd); + MUI_DisposeObject(data->wnd); + data->wnd = NULL; + } + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +IPTR Poppen__MUIM_Poppen_OpenWindow(struct IClass *cl, Object *obj, + Msg msg) +{ + struct Poppen_DATA *data = INST_DATA(cl, obj); + + if (!data->wnd) + { + Object *ok_button, *cancel_button; + char *penspec = NULL; + + get(obj, MUIA_Pendisplay_Spec, &penspec); + + data->wnd = (Object *)(WindowObject, + MUIA_Window_Title, (IPTR)data->wintitle, + MUIA_Window_Activate, TRUE, + WindowContents, (IPTR)VGroup, + Child, (IPTR)(data->penadjust = (Object *)PenadjustObject, + MUIA_CycleChain, 1, + MUIA_Penadjust_Spec, (IPTR)penspec, + End), + Child, (IPTR)HGroup, + Child, (IPTR)(ok_button = + MUI_MakeObject(MUIO_Button,(IPTR)"_Ok")), + Child, (IPTR)(cancel_button = + MUI_MakeObject(MUIO_Button,(IPTR)"_Cancel")), + End, + End, + End); + + if (data->wnd) + { + set(ok_button, MUIA_CycleChain, 1); + set(cancel_button, MUIA_CycleChain, 1); + + DoMethod(_app(obj), OM_ADDMEMBER, (IPTR) data->wnd); + + DoMethod(ok_button, MUIM_Notify, MUIA_Pressed, FALSE, + (IPTR) _app(obj), 5, MUIM_Application_PushMethod, + (IPTR) obj, 2, MUIM_Poppen_CloseWindow, TRUE); + DoMethod(cancel_button, MUIM_Notify, MUIA_Pressed, FALSE, + (IPTR) _app(obj), 5, MUIM_Application_PushMethod, + (IPTR) obj, 2, MUIM_Poppen_CloseWindow, FALSE); + DoMethod(data->wnd, MUIM_Notify, MUIA_Window_CloseRequest, TRUE, + (IPTR) _app(obj), 5, MUIM_Application_PushMethod, + (IPTR) obj, 2, MUIM_Poppen_CloseWindow, FALSE); + } + } + + if (data->wnd) + { + IPTR opened = FALSE; + + set(data->wnd, MUIA_Window_Open, TRUE); + get(data->wnd, MUIA_Window_Open, &opened); + + if (!opened) + { + DoMethod(obj, MUIM_Poppen_CloseWindow, FALSE); + } + } + + return 1; +} + +IPTR Poppen__MUIM_Poppen_CloseWindow(struct IClass *cl, Object *obj, + struct MUIP_Poppen_CloseWindow *msg) +{ + struct Poppen_DATA *data = INST_DATA(cl, obj); + int ok = msg->ok; + + set(data->wnd, MUIA_Window_Open, FALSE); + + if (ok) + { + char *spec = NULL; + + get(data->penadjust, MUIA_Penadjust_Spec, &spec); + + set(obj, MUIA_Pendisplay_Spec, (IPTR) spec); + } + + DoMethod(_app(obj), OM_REMMEMBER, (IPTR) data->wnd); + MUI_DisposeObject(data->wnd); + data->wnd = NULL; + data->penadjust = NULL; + return 1; +} + +IPTR Poppen__MUIM_DisconnectParent(struct IClass *cl, Object *obj, + struct MUIP_DisconnectParent *msg) +{ + struct Poppen_DATA *data = INST_DATA(cl, obj); + + if (data->wnd) + DoMethod(obj, MUIM_Poppen_CloseWindow, FALSE); + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +#if ZUNE_BUILTIN_POPPEN +BOOPSI_DISPATCHER(IPTR, Poppen_Dispatcher, cl, obj, msg) +{ + switch (msg->MethodID) + { + case OM_NEW: + return Poppen__OM_NEW(cl, obj, (struct opSet *)msg); + case MUIM_Hide: + return Poppen__MUIM_Hide(cl, obj, (APTR) msg); + case MUIM_Poppen_OpenWindow: + return Poppen__MUIM_Poppen_OpenWindow(cl, obj, (APTR) msg); + case MUIM_Poppen_CloseWindow: + return Poppen__MUIM_Poppen_CloseWindow(cl, obj, (APTR) msg); + case MUIM_DisconnectParent: + return Poppen__MUIM_DisconnectParent(cl, obj, (APTR) msg); + default: + return DoSuperMethodA(cl, obj, msg); + } +} +BOOPSI_DISPATCHER_END + +const struct __MUIBuiltinClass _MUI_Poppen_desc = +{ + MUIC_Poppen, + MUIC_Pendisplay, + sizeof(struct Poppen_DATA), + (void *) Poppen_Dispatcher +}; +#endif /* ZUNE_BUILTIN_POPPEN */ diff --git a/workbench/libs/muimaster/classes/poppen.h b/workbench/libs/muimaster/classes/poppen.h index ff75129326..84a64312f7 100644 --- a/workbench/libs/muimaster/classes/poppen.h +++ b/workbench/libs/muimaster/classes/poppen.h @@ -15,8 +15,17 @@ /*** Methods ****************************************************************/ #define MUIM_Poppen_OpenWindow (MUIB_Poppen | 0x00000000) /* PRIV */ #define MUIM_Poppen_CloseWindow (MUIB_Poppen | 0x00000001) /* PRIV */ -struct MUIP_Poppen_OpenWindow {STACKED ULONG MethodID;}; /* PRIV */ -struct MUIP_Poppen_CloseWindow {STACKED ULONG MethodID; STACKED LONG ok;}; /* PRIV */ + +struct MUIP_Poppen_OpenWindow +{ + STACKED ULONG MethodID; +}; /* PRIV */ + +struct MUIP_Poppen_CloseWindow +{ + STACKED ULONG MethodID; + STACKED LONG ok; +}; /* PRIV */ extern const struct __MUIBuiltinClass _MUI_Poppen_desc; /* PRIV */ diff --git a/workbench/libs/muimaster/classes/popscreen.c b/workbench/libs/muimaster/classes/popscreen.c index db3978e46b..46d26d3230 100644 --- a/workbench/libs/muimaster/classes/popscreen.c +++ b/workbench/libs/muimaster/classes/popscreen.c @@ -27,94 +27,94 @@ extern struct Library *MUIMasterBase; LONG PopscreenStrObjFunc(struct Hook *hook, Object *popup, Object *str) { - struct Popscreen_DATA *data = (struct Popscreen_DATA *)hook->h_Data; - struct List *pubscrlist; - struct PubScreenNode *pubscrnode; - STRPTR strtext = NULL, listentry; - LONG index; - + struct Popscreen_DATA *data = (struct Popscreen_DATA *)hook->h_Data; + struct List *pubscrlist; + struct PubScreenNode *pubscrnode; + STRPTR strtext = NULL, listentry; + LONG index; + DoMethod(data->list, MUIM_List_Clear); pubscrlist = LockPubScreenList(); ForeachNode(pubscrlist, pubscrnode) { - DoMethod(data->list, MUIM_List_InsertSingle, (IPTR)pubscrnode->psn_Node.ln_Name, MUIV_List_Insert_Bottom); - } + DoMethod(data->list, MUIM_List_InsertSingle, + (IPTR) pubscrnode->psn_Node.ln_Name, MUIV_List_Insert_Bottom); + } UnlockPubScreenList(); get(str, MUIA_String_Contents, &strtext); - - for(index = 0; ; index++) + + for (index = 0;; index++) { - DoMethod(data->list, MUIM_List_GetEntry, index, (IPTR)&listentry); - - if (!listentry) - { - set(data->list, MUIA_List_Active, strtext[0] ? MUIV_List_Active_Off : 0); - break; - } - - if (stricmp(strtext, listentry) == 0) - { - set(data->list, MUIA_List_Active, index); - break; - } + DoMethod(data->list, MUIM_List_GetEntry, index, (IPTR) & listentry); + + if (!listentry) + { + set(data->list, MUIA_List_Active, + strtext[0] ? MUIV_List_Active_Off : 0); + break; + } + + if (stricmp(strtext, listentry) == 0) + { + set(data->list, MUIA_List_Active, index); + break; + } } - + return TRUE; } void PopscreenObjStrFunc(struct Hook *hook, Object *popup, Object *str) { STRPTR listentry; - - DoMethod(popup, MUIM_List_GetEntry, MUIV_List_GetEntry_Active, (IPTR)&listentry); + + DoMethod(popup, MUIM_List_GetEntry, MUIV_List_GetEntry_Active, + (IPTR) & listentry); if (listentry) { - set(str, MUIA_String_Contents, listentry); - } + set(str, MUIA_String_Contents, listentry); + } } IPTR Popscreen__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) { Object *lv, *list; - - obj = (Object *)DoSuperNewTags - ( - cl, obj, NULL, - MUIA_Popobject_Object, (IPTR)(lv = (Object *)ListviewObject, - MUIA_Listview_List, (IPTR)(list = (Object *)ListObject, - InputListFrame, - End), - End), - TAG_MORE, (IPTR) msg->ops_AttrList - ); - + + obj = (Object *) DoSuperNewTags + (cl, obj, NULL, + MUIA_Popobject_Object, (IPTR) (lv = (Object *) ListviewObject, + MUIA_Listview_List, (IPTR) (list = (Object *) ListObject, + InputListFrame, + End), + End), + TAG_MORE, (IPTR) msg->ops_AttrList); + if (obj) { - struct Popscreen_DATA *data = INST_DATA(cl, obj); - - data->list = list; - - data->strobj_hook.h_Entry = HookEntry; - data->strobj_hook.h_SubEntry = (HOOKFUNC)PopscreenStrObjFunc; - data->strobj_hook.h_Data = data; - - data->objstr_hook.h_Entry = HookEntry; - data->objstr_hook.h_SubEntry = (HOOKFUNC)PopscreenObjStrFunc; - data->objstr_hook.h_Data = data; - - SetAttrs(obj, MUIA_Popobject_StrObjHook, (IPTR)&data->strobj_hook, - MUIA_Popobject_ObjStrHook, (IPTR)&data->objstr_hook, - TAG_DONE); - - - DoMethod(lv, MUIM_Notify, MUIA_Listview_DoubleClick, TRUE, - (IPTR)obj, 2, MUIM_Popstring_Close, TRUE); + struct Popscreen_DATA *data = INST_DATA(cl, obj); + + data->list = list; + + data->strobj_hook.h_Entry = HookEntry; + data->strobj_hook.h_SubEntry = (HOOKFUNC) PopscreenStrObjFunc; + data->strobj_hook.h_Data = data; + + data->objstr_hook.h_Entry = HookEntry; + data->objstr_hook.h_SubEntry = (HOOKFUNC) PopscreenObjStrFunc; + data->objstr_hook.h_Data = data; + + SetAttrs(obj, MUIA_Popobject_StrObjHook, (IPTR) & data->strobj_hook, + MUIA_Popobject_ObjStrHook, (IPTR) & data->objstr_hook, + TAG_DONE); + + DoMethod(lv, MUIM_Notify, MUIA_Listview_DoubleClick, TRUE, + (IPTR) obj, 2, MUIM_Popstring_Close, TRUE); } - - return (IPTR)obj; + + return (IPTR) obj; } #if ZUNE_BUILTIN_POPSCREEN @@ -122,17 +122,19 @@ BOOPSI_DISPATCHER(IPTR, Popscreen_Dispatcher, cl, obj, msg) { switch (msg->MethodID) { - case OM_NEW: return Popscreen__OM_NEW(cl, obj, (struct opSet *)msg); - default: return DoSuperMethodA(cl, obj, msg); + case OM_NEW: + return Popscreen__OM_NEW(cl, obj, (struct opSet *)msg); + default: + return DoSuperMethodA(cl, obj, msg); } } BOOPSI_DISPATCHER_END const struct __MUIBuiltinClass _MUI_Popscreen_desc = -{ - MUIC_Popscreen, - MUIC_Popobject, - sizeof(struct Popscreen_DATA), - (void*)Popscreen_Dispatcher +{ + MUIC_Popscreen, + MUIC_Popobject, + sizeof(struct Popscreen_DATA), + (void *) Popscreen_Dispatcher }; #endif /* ZUNE_BUILTIN_POPSCREEN */ diff --git a/workbench/libs/muimaster/classes/popscreen.h b/workbench/libs/muimaster/classes/popscreen.h index de0bda523b..7fcdcc13d3 100644 --- a/workbench/libs/muimaster/classes/popscreen.h +++ b/workbench/libs/muimaster/classes/popscreen.h @@ -14,6 +14,6 @@ #define MUIB_Popscreen (MUIB_ZUNE | 0x00002600) -extern const struct __MUIBuiltinClass _MUI_Popscreen_desc; /* PRIV */ +extern const struct __MUIBuiltinClass _MUI_Popscreen_desc; /* PRIV */ #endif /* _MUI_CLASSES_POPSCREEN_H */ diff --git a/workbench/libs/muimaster/classes/popstring.c b/workbench/libs/muimaster/classes/popstring.c index 4d34aef6e6..41f671313a 100644 --- a/workbench/libs/muimaster/classes/popstring.c +++ b/workbench/libs/muimaster/classes/popstring.c @@ -35,69 +35,80 @@ struct Popstring_DATA IPTR Popstring__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) { - struct Popstring_DATA *data; - struct TagItem *tag, *tags; + struct Popstring_DATA *data; + struct TagItem *tag, *tags; Object *string, *button; - button = (Object*)GetTagData(MUIA_Popstring_Button,0,msg->ops_AttrList); - string = (Object*)GetTagData(MUIA_Popstring_String,0,msg->ops_AttrList); - - obj = (Object *) DoSuperNewTags - ( - cl, obj, 0, - - MUIA_Group_Horiz, TRUE, - MUIA_Group_Spacing, 0, + button = + (Object *) GetTagData(MUIA_Popstring_Button, 0, msg->ops_AttrList); + string = + (Object *) GetTagData(MUIA_Popstring_String, 0, msg->ops_AttrList); + + obj = (Object *) DoSuperNewTags(cl, obj, 0, + MUIA_Group_Horiz, TRUE, + MUIA_Group_Spacing, 0, (string ? Child : TAG_IGNORE), (IPTR) string, - Child, (IPTR) button, - - TAG_MORE, (IPTR) msg->ops_AttrList - ); - if (!obj) return FALSE; - + Child, (IPTR) button, + TAG_MORE, (IPTR) msg->ops_AttrList); + if (!obj) + return FALSE; + data = INST_DATA(cl, obj); data->button = button; data->string = string; - data->ehn.ehn_Events = IDCMP_RAWKEY; + data->ehn.ehn_Events = IDCMP_RAWKEY; data->ehn.ehn_Priority = 0; - data->ehn.ehn_Flags = 0; - data->ehn.ehn_Object = obj; - data->ehn.ehn_Class = cl; + data->ehn.ehn_Flags = 0; + data->ehn.ehn_Object = obj; + data->ehn.ehn_Class = cl; /* parse initial taglist */ - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) { - switch (tag->ti_Tag) - { - case MUIA_Popstring_Toggle: data->toggle = tag->ti_Data; break; - case MUIA_Popstring_CloseHook: data->close_hook = (struct Hook*)tag->ti_Data;break; - case MUIA_Popstring_OpenHook: data->open_hook = (struct Hook*)tag->ti_Data;break; - } + switch (tag->ti_Tag) + { + case MUIA_Popstring_Toggle: + data->toggle = tag->ti_Data; + break; + case MUIA_Popstring_CloseHook: + data->close_hook = (struct Hook *)tag->ti_Data; + break; + case MUIA_Popstring_OpenHook: + data->open_hook = (struct Hook *)tag->ti_Data; + break; + } } - DoMethod(button,MUIM_Notify,MUIA_Pressed,FALSE,(IPTR)obj,1,MUIM_Popstring_Open); + DoMethod(button, MUIM_Notify, MUIA_Pressed, FALSE, (IPTR) obj, 1, + MUIM_Popstring_Open); - return (IPTR)obj; + return (IPTR) obj; } IPTR Popstring__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) { - struct TagItem *tags,*tag; + struct TagItem *tags, *tag; struct Popstring_DATA *data = INST_DATA(cl, obj); - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) { - switch (tag->ti_Tag) - { - case MUIA_Popstring_Toggle: data->toggle = tag->ti_Data; break; - case MUIA_Popstring_CloseHook: data->close_hook = (struct Hook*)tag->ti_Data;break; - case MUIA_Popstring_OpenHook: data->open_hook = (struct Hook*)tag->ti_Data;break; - } + switch (tag->ti_Tag) + { + case MUIA_Popstring_Toggle: + data->toggle = tag->ti_Data; + break; + case MUIA_Popstring_CloseHook: + data->close_hook = (struct Hook *)tag->ti_Data; + break; + case MUIA_Popstring_OpenHook: + data->open_hook = (struct Hook *)tag->ti_Data; + break; + } } - return DoSuperMethodA(cl,obj,(Msg)msg); + return DoSuperMethodA(cl, obj, (Msg) msg); } #define STORE *(msg->opg_Storage) @@ -105,78 +116,89 @@ IPTR Popstring__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) { struct Popstring_DATA *data = INST_DATA(cl, obj); - switch(msg->opg_AttrID) + switch (msg->opg_AttrID) { - case MUIA_Popstring_String: STORE = (IPTR)data->string; return 1; + case MUIA_Popstring_String: + STORE = (IPTR) data->string; + return 1; } return DoSuperMethodA(cl, obj, (Msg) msg); } #undef STORE -IPTR Popstring__MUIM_Setup(struct IClass *cl, Object *obj, struct MUIP_Setup *msg) +IPTR Popstring__MUIM_Setup(struct IClass *cl, Object *obj, + struct MUIP_Setup *msg) { struct Popstring_DATA *data = INST_DATA(cl, obj); if (!(DoSuperMethodA(cl, obj, (Msg) msg))) - return FALSE; + return FALSE; - DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR)&data->ehn); + DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR) & data->ehn); return TRUE; } -IPTR Popstring__MUIM_Cleanup(struct IClass *cl, Object *obj, struct MUIP_Cleanup *msg) +IPTR Popstring__MUIM_Cleanup(struct IClass *cl, Object *obj, + struct MUIP_Cleanup *msg) { struct Popstring_DATA *data = INST_DATA(cl, obj); - DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR)&data->ehn); + DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR) & data->ehn); return DoSuperMethodA(cl, obj, (Msg) msg); } -IPTR Popstring__MUIM_HandleEvent(struct IClass *cl, Object *obj, struct MUIP_HandleEvent *msg) +IPTR Popstring__MUIM_HandleEvent(struct IClass *cl, Object *obj, + struct MUIP_HandleEvent *msg) { if (msg->muikey == MUIKEY_POPUP) { - D(bug("Popstring__MUIM_HandleEvent %p got MUIKEY_POPUP\n", obj)); - DoMethod(obj, MUIM_Popstring_Open); - return MUI_EventHandlerRC_Eat; + D(bug("Popstring__MUIM_HandleEvent %p got MUIKEY_POPUP\n", obj)); + DoMethod(obj, MUIM_Popstring_Open); + return MUI_EventHandlerRC_Eat; } return 0; } -IPTR Popstring__MUIM_Popstring_Close(struct IClass *cl, Object *obj, struct MUIP_Popstring_Close *msg) +IPTR Popstring__MUIM_Popstring_Close(struct IClass *cl, Object *obj, + struct MUIP_Popstring_Close *msg) { struct Popstring_DATA *data = INST_DATA(cl, obj); if (data->close_hook && data->open) { - DoMethod(_app(obj), MUIM_Application_PushMethod, (IPTR)obj, 4, MUIM_CallHook, (IPTR)data->close_hook, (IPTR)data->string, msg->result); - data->open = 0; - set(data->button,MUIA_Disabled, FALSE); + DoMethod(_app(obj), MUIM_Application_PushMethod, (IPTR) obj, 4, + MUIM_CallHook, (IPTR) data->close_hook, (IPTR) data->string, + msg->result); + data->open = 0; + set(data->button, MUIA_Disabled, FALSE); } return 0; } -IPTR Popstring__MUIM_Popstring_Open(struct IClass *cl, Object *obj, struct MUIP_Popstring_Open *msg) +IPTR Popstring__MUIM_Popstring_Open(struct IClass *cl, Object *obj, + struct MUIP_Popstring_Open *msg) { struct Popstring_DATA *data = INST_DATA(cl, obj); if (data->open_hook) { - if (data->open && data->toggle) - { - DoMethod(obj,MUIM_Popstring_Close,FALSE); - return 0; - } - - if (!data->open) - { - if (DoMethod(obj, MUIM_CallHook, (IPTR)data->open_hook, (IPTR)data->string)) - { - /* Opening the popup window was successful */ - data->open = 1; - if (!data->toggle) set(data->button,MUIA_Disabled, TRUE); - } - } + if (data->open && data->toggle) + { + DoMethod(obj, MUIM_Popstring_Close, FALSE); + return 0; + } + + if (!data->open) + { + if (DoMethod(obj, MUIM_CallHook, (IPTR) data->open_hook, + (IPTR) data->string)) + { + /* Opening the popup window was successful */ + data->open = 1; + if (!data->toggle) + set(data->button, MUIA_Disabled, TRUE); + } + } } return 0; } @@ -186,32 +208,32 @@ BOOPSI_DISPATCHER(IPTR, Popstring_Dispatcher, cl, obj, msg) { switch (msg->MethodID) { - case OM_NEW: - return Popstring__OM_NEW(cl, obj, (APTR)msg); - case OM_SET: - return Popstring__OM_SET(cl, obj, (APTR)msg); - case OM_GET: - return Popstring__OM_GET(cl, obj, (APTR)msg); - case MUIM_Setup: - return Popstring__MUIM_Setup(cl, obj, (APTR)msg); - case MUIM_Cleanup: - return Popstring__MUIM_Cleanup(cl, obj, (APTR)msg); - case MUIM_HandleEvent: - return Popstring__MUIM_HandleEvent(cl, obj, (APTR)msg); - case MUIM_Popstring_Close: - return Popstring__MUIM_Popstring_Close(cl, obj, (APTR)msg); - case MUIM_Popstring_Open: - return Popstring__MUIM_Popstring_Open(cl, obj, (APTR)msg); + case OM_NEW: + return Popstring__OM_NEW(cl, obj, (APTR) msg); + case OM_SET: + return Popstring__OM_SET(cl, obj, (APTR) msg); + case OM_GET: + return Popstring__OM_GET(cl, obj, (APTR) msg); + case MUIM_Setup: + return Popstring__MUIM_Setup(cl, obj, (APTR) msg); + case MUIM_Cleanup: + return Popstring__MUIM_Cleanup(cl, obj, (APTR) msg); + case MUIM_HandleEvent: + return Popstring__MUIM_HandleEvent(cl, obj, (APTR) msg); + case MUIM_Popstring_Close: + return Popstring__MUIM_Popstring_Close(cl, obj, (APTR) msg); + case MUIM_Popstring_Open: + return Popstring__MUIM_Popstring_Open(cl, obj, (APTR) msg); } - + return DoSuperMethodA(cl, obj, msg); } BOOPSI_DISPATCHER_END const struct __MUIBuiltinClass _MUI_Popstring_desc = -{ - MUIC_Popstring, - MUIC_Group, - sizeof(struct Popstring_DATA), - (void*)Popstring_Dispatcher +{ + MUIC_Popstring, + MUIC_Group, + sizeof(struct Popstring_DATA), + (void *) Popstring_Dispatcher }; diff --git a/workbench/libs/muimaster/classes/popstring.h b/workbench/libs/muimaster/classes/popstring.h index 725d27c6cb..41b919d4a7 100644 --- a/workbench/libs/muimaster/classes/popstring.h +++ b/workbench/libs/muimaster/classes/popstring.h @@ -10,22 +10,36 @@ #define MUIC_Popstring "Popstring.mui" /*** Identifier base (for Zune extensions) **********************************/ -#define MUIB_Popstring (MUIB_ZUNE | 0x00002800) +#define MUIB_Popstring (MUIB_ZUNE | 0x00002800) /*** Methods ****************************************************************/ -#define MUIM_Popstring_Close (MUIB_MUI|0x0042dc52) /* MUI: V7 */ -#define MUIM_Popstring_Open (MUIB_MUI|0x004258ba) /* MUI: V7 */ -struct MUIP_Popstring_Close {STACKED ULONG MethodID; STACKED LONG result;}; -struct MUIP_Popstring_Open {STACKED ULONG MethodID; }; +#define MUIM_Popstring_Close (MUIB_MUI | 0x0042dc52) /* MUI: V7 */ +#define MUIM_Popstring_Open (MUIB_MUI | 0x004258ba) /* MUI: V7 */ -/*** Attributes *************************************************************/ -#define MUIA_Popstring_Button (MUIB_MUI|0x0042d0b9) /* MUI: V7 i.g Object * */ -#define MUIA_Popstring_CloseHook (MUIB_MUI|0x004256bf) /* MUI: V7 isg struct Hook * */ -#define MUIA_Popstring_OpenHook (MUIB_MUI|0x00429d00) /* MUI: V7 isg struct Hook * */ -#define MUIA_Popstring_String (MUIB_MUI|0x004239ea) /* MUI: V7 i.g Object * */ -#define MUIA_Popstring_Toggle (MUIB_MUI|0x00422b7a) /* MUI: V7 isg BOOL */ +struct MUIP_Popstring_Close +{ + STACKED ULONG MethodID; + STACKED LONG result; +}; +struct MUIP_Popstring_Open +{ + STACKED ULONG MethodID; +}; -extern const struct __MUIBuiltinClass _MUI_Popstring_desc; /* PRIV */ +/*** Attributes *************************************************************/ +#define MUIA_Popstring_Button \ + (MUIB_MUI | 0x0042d0b9) /* MUI: V7 i.g Object * */ +#define MUIA_Popstring_CloseHook \ + (MUIB_MUI | 0x004256bf) /* MUI: V7 isg struct Hook * */ +#define MUIA_Popstring_OpenHook \ + (MUIB_MUI | 0x00429d00) /* MUI: V7 isg struct Hook * */ +#define MUIA_Popstring_String \ + (MUIB_MUI | 0x004239ea) /* MUI: V7 i.g Object * */ +#define MUIA_Popstring_Toggle \ + (MUIB_MUI | 0x00422b7a) /* MUI: V7 isg BOOL */ + + +extern const struct __MUIBuiltinClass _MUI_Popstring_desc; /* PRIV */ #endif /* _MUI_CLASSES_POPSTRING_H */ diff --git a/workbench/libs/muimaster/classes/process.c b/workbench/libs/muimaster/classes/process.c index 09c1deafdb..6bd45da191 100644 --- a/workbench/libs/muimaster/classes/process.c +++ b/workbench/libs/muimaster/classes/process.c @@ -37,15 +37,17 @@ static void my_process(void) struct Process_DATA *data = thistask->tc_UserData; if (data->sourceclass) - { - CoerceMethod(data->sourceclass, data->sourceobject, MUIM_Process_Process, &data->kill, data->self); + { + CoerceMethod(data->sourceclass, data->sourceobject, + MUIM_Process_Process, &data->kill, data->self); } else { - DoMethod(data->sourceobject, MUIM_Process_Process, &data->kill, data->self); + DoMethod(data->sourceobject, MUIM_Process_Process, &data->kill, + data->self); } - data->task = NULL; // show MUIM_Process_Kill that we're done + data->task = NULL; // show MUIM_Process_Kill that we're done D(bug("[Process.mui] my_process terminated\n")); } @@ -57,7 +59,7 @@ IPTR Process__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) struct TagItem *tag, *tags; struct Task *thistask; - obj = (Object *)DoSuperMethodA(cl, obj, (Msg)msg); + obj = (Object *) DoSuperMethodA(cl, obj, (Msg) msg); if (!obj) return FALSE; @@ -71,44 +73,45 @@ IPTR Process__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) thistask = FindTask(NULL); data->priority = thistask->tc_Node.ln_Pri; - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) { switch (tag->ti_Tag) { - case MUIA_Process_AutoLaunch: - data->autolaunch = tag->ti_Data; - break; + case MUIA_Process_AutoLaunch: + data->autolaunch = tag->ti_Data; + break; - case MUIA_Process_Name: - data->name = (STRPTR)tag->ti_Data; - break; + case MUIA_Process_Name: + data->name = (STRPTR) tag->ti_Data; + break; - case MUIA_Process_Priority: - data->priority = tag->ti_Data; - break; + case MUIA_Process_Priority: + data->priority = tag->ti_Data; + break; - case MUIA_Process_SourceClass: - data->sourceclass = (struct IClass *)tag->ti_Data; - break; + case MUIA_Process_SourceClass: + data->sourceclass = (struct IClass *)tag->ti_Data; + break; - case MUIA_Process_SourceObject: - data->sourceobject = (Object *)tag->ti_Data; - break; + case MUIA_Process_SourceObject: + data->sourceobject = (Object *) tag->ti_Data; + break; - case MUIA_Process_StackSize: - data->stacksize = tag->ti_Data; - break; + case MUIA_Process_StackSize: + data->stacksize = tag->ti_Data; + break; } } - D(bug("muimaster.library/process.c: Process Object created at 0x%lx\n",obj)); + D(bug("muimaster.library/process.c: Process Object created at 0x%lx\n", + obj)); if (data->autolaunch) { DoMethod(obj, MUIM_Process_Launch); } - return (IPTR)obj; + return (IPTR) obj; } @@ -120,11 +123,11 @@ IPTR Process__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) STORE = 0; - switch(msg->opg_AttrID) + switch (msg->opg_AttrID) { - case MUIA_Process_Task: - STORE = (IPTR)data->task; - return TRUE; + case MUIA_Process_Task: + STORE = (IPTR) data->task; + return TRUE; } return DoSuperMethodA(cl, obj, (Msg) msg); @@ -144,7 +147,8 @@ IPTR Process__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) } -IPTR Process__MUIM_Process_Kill(struct IClass *cl, Object *obj, struct MUIP_Process_Kill *msg) +IPTR Process__MUIM_Process_Kill(struct IClass *cl, Object *obj, + struct MUIP_Process_Kill *msg) { D(bug("[MUIM_Process_Kill] maxdelay %d\n", msg->maxdelay)); @@ -160,7 +164,7 @@ IPTR Process__MUIM_Process_Kill(struct IClass *cl, Object *obj, struct MUIP_Proc // msg->maxdelay == 0 means "wait forever" - data->kill = 1; // stops the loop in Class4.c demo + data->kill = 1; // stops the loop in Class4.c demo // the spawned task sets data->task to NULL on exit while (data->task != NULL) @@ -168,7 +172,8 @@ IPTR Process__MUIM_Process_Kill(struct IClass *cl, Object *obj, struct MUIP_Proc Signal((struct Task *)data->task, SIGBREAKF_CTRL_C); Delay(DELAYTICKS); delay += DELAYTICKS; - D(bug("[MUIM_Process_Kill] delay %d maxdelay %d\n", delay, msg->maxdelay)); + D(bug("[MUIM_Process_Kill] delay %d maxdelay %d\n", delay, + msg->maxdelay)); if ((msg->maxdelay != 0) && (delay > msg->maxdelay)) { D(bug("[MUIM_Process_Kill] timeout\n")); @@ -183,38 +188,40 @@ IPTR Process__MUIM_Process_Kill(struct IClass *cl, Object *obj, struct MUIP_Proc } -IPTR Process__MUIM_Process_Launch(struct IClass *cl, Object *obj, struct MUIP_Process_Launch *msg) +IPTR Process__MUIM_Process_Launch(struct IClass *cl, Object *obj, + struct MUIP_Process_Launch *msg) { D(bug("[MUIM_Process_Launch]\n")); struct Process_DATA *data = INST_DATA(cl, obj); - // Starts process' loop (MUIM_Process_Process). If the loop + // Starts process's loop (MUIM_Process_Process). If the loop // is already running does nothing. if (data->task == NULL) { - struct TagItem tags[] = - { - {NP_Entry, (IPTR)my_process}, - {NP_StackSize, data->stacksize}, + struct TagItem tags[] = { + {NP_Entry, (IPTR) my_process}, + {NP_StackSize, data->stacksize}, {data->name ? NP_Name : TAG_IGNORE, - (IPTR)data->name}, - {NP_Priority, data->priority}, - {NP_UserData, (IPTR)data}, + (IPTR) data->name}, + {NP_Priority, data->priority}, + {NP_UserData, (IPTR) data}, {TAG_DONE} }; data->task = CreateNewProc(tags); } - return (IPTR)TRUE; + return (IPTR) TRUE; } -IPTR Process__MUIM_Process_Process(struct IClass *cl, Object *obj, struct MUIP_Process_Process *msg) +IPTR Process__MUIM_Process_Process(struct IClass *cl, Object *obj, + struct MUIP_Process_Process *msg) { - D(bug("[MUIM_Process_Process] kill %p proc %p\n", msg->kill, msg->proc)); + D(bug("[MUIM_Process_Process] kill %p proc %p\n", msg->kill, + msg->proc)); // struct Process_DATA *data = INST_DATA(cl, obj); @@ -223,18 +230,18 @@ IPTR Process__MUIM_Process_Process(struct IClass *cl, Object *obj, struct MUIP_P // This is some kind of a virtual function. Sub-class implementators // must overwrite it. - return DoSuperMethodA(cl, obj, (Msg)msg); + return DoSuperMethodA(cl, obj, (Msg) msg); } -IPTR Process__MUIM_Process_Signal(struct IClass *cl, Object *obj, struct MUIP_Process_Signal *msg) +IPTR Process__MUIM_Process_Signal(struct IClass *cl, Object *obj, + struct MUIP_Process_Signal *msg) { D(bug("[MUIM_Process_Signal] sigs %u\n", msg->sigs)); struct Process_DATA *data = INST_DATA(cl, obj); - // MUIM_Process_Signal just sends an arbitrary signal to the spawned process. - + // just send an arbitrary signal to the spawned process. if (data->task) { Signal((struct Task *)data->task, msg->sigs); @@ -249,14 +256,26 @@ BOOPSI_DISPATCHER(IPTR, Process_Dispatcher, cl, obj, msg) { switch (msg->MethodID) { - case OM_NEW: return Process__OM_NEW(cl, obj, (struct opSet *)msg); - case OM_GET: return Process__OM_SET(cl, obj, (struct opSet *)msg); - case OM_DISPOSE: return Process__OM_DISPOSE(cl, obj, msg); - case MUIM_Process_Kill: return Process__MUIM_Process_Kill(cl, obj, (struct MUIP_Process_Kill *)msg); - case MUIM_Process_Launch: return Process__MUIM_Process_Launch(cl, obj, (struct MUIP_Process_Launch *)msg); - case MUIM_Process_Process: return Process__MUIM_Process_Process(cl, obj, (struct MUIP_Process_Process *)msg); - case MUIM_Process_Signal: return Process__MUIM_Process_Signal(cl, obj, (struct MUIP_Process_Signal *)msg); - default: return DoSuperMethodA(cl, obj, msg); + case OM_NEW: + return Process__OM_NEW(cl, obj, (struct opSet *)msg); + case OM_GET: + return Process__OM_SET(cl, obj, (struct opSet *)msg); + case OM_DISPOSE: + return Process__OM_DISPOSE(cl, obj, msg); + case MUIM_Process_Kill: + return Process__MUIM_Process_Kill(cl, obj, + (struct MUIP_Process_Kill *)msg); + case MUIM_Process_Launch: + return Process__MUIM_Process_Launch(cl, obj, + (struct MUIP_Process_Launch *)msg); + case MUIM_Process_Process: + return Process__MUIM_Process_Process(cl, obj, + (struct MUIP_Process_Process *)msg); + case MUIM_Process_Signal: + return Process__MUIM_Process_Signal(cl, obj, + (struct MUIP_Process_Signal *)msg); + default: + return DoSuperMethodA(cl, obj, msg); } } BOOPSI_DISPATCHER_END @@ -266,6 +285,6 @@ const struct __MUIBuiltinClass _MUI_Process_desc = MUIC_Process, MUIC_Semaphore, sizeof(struct Process_DATA), - (void*)Process_Dispatcher + (void *) Process_Dispatcher }; #endif /* ZUNE_BUILTIN_PROCESS */ diff --git a/workbench/libs/muimaster/classes/process.h b/workbench/libs/muimaster/classes/process.h dissimilarity index 71% index 475f549b73..123c6b52e5 100644 --- a/workbench/libs/muimaster/classes/process.h +++ b/workbench/libs/muimaster/classes/process.h @@ -1,36 +1,63 @@ -#ifndef _MUI_CLASSES_PROCESS_H -#define _MUI_CLASSES_PROCESS_H - -/* - Copyright © 2012, The AROS Development Team. All rights reserved. - $Id$ -*/ - -/*** Name *******************************************************************/ -#define MUIC_Process "Process.mui" - -/*** Identifier base (for Zune extensions) **********************************/ - -/*** Methods ****************************************************************/ -#define MUIM_Process_Kill (MUIB_MUI|0x004264cf) /* V20 */ -#define MUIM_Process_Launch (MUIB_MUI|0x00425df7) /* V20 */ -#define MUIM_Process_Process (MUIB_MUI|0x004230aa) /* V20 */ -#define MUIM_Process_Signal (MUIB_MUI|0x0042e791) /* V20 */ -struct MUIP_Process_Kill {STACKED ULONG MethodID; STACKED LONG maxdelay;}; -struct MUIP_Process_Launch {STACKED ULONG MethodID;}; -struct MUIP_Process_Process {STACKED ULONG MethodID; STACKED ULONG *kill; STACKED Object *proc;}; -struct MUIP_Process_Signal {STACKED ULONG MethodID; STACKED ULONG sigs;}; - -/*** Attributes *************************************************************/ -#define MUIA_Process_AutoLaunch (MUIB_MUI|0x00428855) /* V20 i.. ULONG */ -#define MUIA_Process_Name (MUIB_MUI|0x0042732b) /* V20 i.. ULONG */ -#define MUIA_Process_Priority (MUIB_MUI|0x00422a54) /* V20 i.. ULONG */ -#define MUIA_Process_SourceClass (MUIB_MUI|0x0042cf8b) /* V20 i.. ULONG */ -#define MUIA_Process_SourceObject (MUIB_MUI|0x004212a2) /* V20 i.. ULONG */ -#define MUIA_Process_StackSize (MUIB_MUI|0x004230d0) /* V20 i.. ULONG */ -#define MUIA_Process_Task (MUIB_MUI|0x0042b123) /* V20 ..g ULONG */ - - -extern const struct __MUIBuiltinClass _MUI_Process_desc; /* PRIV */ - -#endif /* _MUI_CLASSES_PROCESS_H */ +#ifndef _MUI_CLASSES_PROCESS_H +#define _MUI_CLASSES_PROCESS_H + +/* + Copyright © 2012, The AROS Development Team. All rights reserved. + $Id$ +*/ + +/*** Name *******************************************************************/ +#define MUIC_Process "Process.mui" + +/*** Identifier base (for Zune extensions) **********************************/ + +/*** Methods ****************************************************************/ +#define MUIM_Process_Kill (MUIB_MUI | 0x004264cf) /* V20 */ +#define MUIM_Process_Launch (MUIB_MUI | 0x00425df7) /* V20 */ +#define MUIM_Process_Process (MUIB_MUI | 0x004230aa) /* V20 */ +#define MUIM_Process_Signal (MUIB_MUI | 0x0042e791) /* V20 */ + +struct MUIP_Process_Kill +{ + STACKED ULONG MethodID; + STACKED LONG maxdelay; +}; + +struct MUIP_Process_Launch +{ + STACKED ULONG MethodID; +}; + +struct MUIP_Process_Process +{ + STACKED ULONG MethodID; + STACKED ULONG *kill; + STACKED Object *proc; +}; + +struct MUIP_Process_Signal +{ + STACKED ULONG MethodID; + STACKED ULONG sigs; +}; + +/*** Attributes *************************************************************/ +#define MUIA_Process_AutoLaunch \ + (MUIB_MUI | 0x00428855) /* V20 i.. ULONG */ +#define MUIA_Process_Name \ + (MUIB_MUI | 0x0042732b) /* V20 i.. ULONG */ +#define MUIA_Process_Priority \ + (MUIB_MUI | 0x00422a54) /* V20 i.. ULONG */ +#define MUIA_Process_SourceClass \ + (MUIB_MUI | 0x0042cf8b) /* V20 i.. ULONG */ +#define MUIA_Process_SourceObject \ + (MUIB_MUI | 0x004212a2) /* V20 i.. ULONG */ +#define MUIA_Process_StackSize \ + (MUIB_MUI | 0x004230d0) /* V20 i.. ULONG */ +#define MUIA_Process_Task \ + (MUIB_MUI | 0x0042b123) /* V20 ..g ULONG */ + + +extern const struct __MUIBuiltinClass _MUI_Process_desc; /* PRIV */ + +#endif /* _MUI_CLASSES_PROCESS_H */ diff --git a/workbench/libs/muimaster/classes/prop.c b/workbench/libs/muimaster/classes/prop.c dissimilarity index 66% index 7d891f83ca..28b7d936d4 100644 --- a/workbench/libs/muimaster/classes/prop.c +++ b/workbench/libs/muimaster/classes/prop.c @@ -1,1012 +1,1225 @@ -/* - Copyright 2002-2003, The AROS Development Team. All rights reserved. - $Id$ -*/ - -#include <exec/memory.h> -#include <intuition/icclass.h> -#include <intuition/gadgetclass.h> -#include <clib/alib_protos.h> -#include <proto/exec.h> -#include <proto/graphics.h> -#include <proto/intuition.h> -#include <proto/utility.h> -#include <proto/muimaster.h> -#include <proto/cybergraphics.h> - -#ifdef __AROS__ -#include <intuition/windecorclass.h> -#endif -#include <cybergraphx/cybergraphics.h> -#include <graphics/rpattr.h> - -#include "../datatypescache.h" -#include "../imspec_intern.h" - -#include "mui.h" -#include "muimaster_intern.h" -#include "support.h" -#include "prefs.h" - -/* #define MYDEBUG 1 */ -#include "debug.h" - -extern struct Library *MUIMasterBase; - -#define SCALE16_METHOD 2 /* 1 or 2 */ - -#if SCALE16_METHOD != 1 -#define calcscale16(x) -#endif - -struct Prop_DATA -{ - ULONG entries; - LONG first; - ULONG visible; - LONG deltafactor; -#if SCALE16_METHOD == 1 - ULONG scale16; -#endif - LONG gadgetid; - - int horiz; - int usewinborder; - int sb_type; - UWORD minwidth, minheight; - UWORD maxwidth, maxheight; - UWORD defwidth, defheight; - UWORD propwidth, propheight; - - Object *prop_object; - struct MUI_EventHandlerNode ehn; - struct Hook dhook; - struct dt_node *node; - Object *obj; - struct NewImage *buffer; - struct NewImage *temp; - struct BitMap *mapbuffer; - struct BitMap *maptemp; - struct RastPort *tmprp; -}; - -#if SCALE16_METHOD == 1 -static void calcscale16(struct Prop_DATA *data) -{ - if (data->entries < 65535) - { - data->scale16 = 0x10000; - } - else - { - unsigned long long v = ((unsigned long long)data->entries) * 0x10000 / 65535; - - data->scale16 = (ULONG)v; - } -} -#endif - -static ULONG downscale(struct Prop_DATA *data, ULONG val) -{ -#if SCALE16_METHOD == 1 - if (data->scale16 != 0x10000) - { - unsigned long long v = ((unsigned long long)val) * 0x10000 / data->scale16; - val = (ULONG)v; - } -#else - if (data->entries >= 0x10000) - { - unsigned long long v = ((unsigned long long)val) * 65535 / data->entries; - val = (ULONG)v; - } - -#endif - return val; -} - -static ULONG upscale(struct Prop_DATA *data, ULONG val) -{ -#if SCALE16_METHOD == 1 - if (data->scale16 != 0x10000) - { - unsigned long long v = ((unsigned long long)val) * data->scale16 / 0x10000; - val = (ULONG)v; - } -#else - if (data->entries >= 0x10000) - { - unsigned long long v = ((unsigned long long)val) * data->entries / 65535; - val = (ULONG)v; - } -#endif - return val; -} - -IPTR Prop__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct Prop_DATA *data; - struct TagItem *tags,*tag; - - obj = (Object *)DoSuperNewTags(cl, obj, NULL, - MUIA_Background, MUII_PropBack, - TAG_MORE, (IPTR) msg->ops_AttrList); - - if (!obj) - return FALSE; - - data = INST_DATA(cl, obj); - data->deltafactor = 1; - - /* parse initial taglist */ - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) - { - switch (tag->ti_Tag) - { - case MUIA_Prop_Entries: - data->entries = tag->ti_Data; - break; - case MUIA_Prop_First: - data->first = tag->ti_Data; - break; - case MUIA_Prop_Horiz: - data->horiz = tag->ti_Data; - break; - case MUIA_Prop_Slider: - break; - case MUIA_Prop_UseWinBorder: - data->usewinborder = tag->ti_Data; - break; - case MUIA_Prop_Visible: - data->visible = tag->ti_Data; - break; - - case MUIA_Prop_DeltaFactor: - data->deltafactor = tag->ti_Data; - break; - } - } - - if (data->horiz == TRUE) - { - data->minwidth = 6; - data->minheight = 6; - data->maxwidth = MUI_MAXMAX; - data->maxheight = MUI_MAXMAX; - data->defwidth = 50; - data->defheight = 6; - } - else - { - data->minwidth = 6; - data->minheight = 6; - data->maxwidth = MUI_MAXMAX; - data->maxheight = MUI_MAXMAX; - data->defwidth = 6; - data->defheight = 50; - } - - if (data->first < 0) - data->first = 0; - - data->ehn.ehn_Events = IDCMP_IDCMPUPDATE; - data->ehn.ehn_Priority = 0; - data->ehn.ehn_Flags = 0; - data->ehn.ehn_Object = obj; - data->ehn.ehn_Class = cl; - - if (data->usewinborder) - _flags(obj) |= MADF_BORDERGADGET; - - calcscale16(data); - - return (IPTR)obj; -} - -IPTR Prop__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) -{ - struct Prop_DATA *data = INST_DATA(cl, obj); - - if (data->prop_object && !data->usewinborder) { - RemoveGadget(_window(obj), (struct Gadget *) data->prop_object); - DisposeObject(data->prop_object); - } - - DisposeImageContainer(data->buffer); - DisposeImageContainer(data->temp); - if (data->mapbuffer != NULL) FreeBitMap(data->mapbuffer); - if (data->maptemp != NULL) FreeBitMap(data->maptemp); - if (data->tmprp != NULL) FreeRastPort(data->tmprp); - - data->buffer = NULL; - data->temp = NULL; - data->mapbuffer = NULL; - data->maptemp = NULL; - data->tmprp = NULL; - - return DoSuperMethodA(cl, obj, msg); -} - -IPTR Prop__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct TagItem *tags,*tag; - struct Prop_DATA *data = INST_DATA(cl, obj); - int refresh = 0; - int only_trigger = 0; - - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) - { - switch (tag->ti_Tag) - { - case MUIA_Prop_Entries: - if ((IPTR)data->entries != tag->ti_Data) - { - data->entries = tag->ti_Data; - refresh = 1; - } - else - { - tag->ti_Tag = TAG_IGNORE; - } - break; - - case MUIA_Prop_First: - if ((IPTR)data->first != tag->ti_Data) - { - data->first = tag->ti_Data; - refresh = 1; - } - else - { - tag->ti_Tag = TAG_IGNORE; - } - break; - - case MUIA_Prop_Slider: - break; - - case MUIA_Prop_Visible: - if ((IPTR)data->visible != tag->ti_Data) - { - data->visible = tag->ti_Data; - refresh = 1; - } - else - { - tag->ti_Tag = TAG_IGNORE; - } - break; - - case MUIA_Prop_OnlyTrigger: - only_trigger = tag->ti_Data; - break; - - case MUIA_Prop_DeltaFactor: - data->deltafactor = tag->ti_Data; - break; - } - } - - if (data->first < 0) - data->first = 0; - - if (data->prop_object && refresh && !only_trigger) - { - calcscale16(data); - - /* Rendering will happen here!! This could make problems with virtual groups, forward this to MUIM_Draw??? */ - SetAttrs(data->prop_object, ICA_TARGET, NULL, TAG_DONE); - if (SetGadgetAttrs((struct Gadget*)data->prop_object,_window(obj),NULL, - PGA_Top,downscale(data, data->first), - PGA_Visible,downscale(data, data->visible), - PGA_Total,downscale(data, data->entries), - TAG_DONE)) - RefreshGList((struct Gadget*)data->prop_object, _window(obj), NULL, 1); - SetAttrs(data->prop_object, ICA_TARGET, ICTARGET_IDCMP, TAG_DONE); - } - - return DoSuperMethodA(cl,obj,(Msg)msg); -} - -#define STORE *(msg->opg_Storage) -IPTR Prop__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) -{ - struct Prop_DATA *data = INST_DATA(cl, obj); - switch (msg->opg_AttrID) - { - case MUIA_Prop_First: - { - if (data->prop_object) - { - IPTR v; - /* So we can get a more current value */ - GetAttr(PGA_Top,data->prop_object,&v); - data->first = upscale(data, v); - } - STORE = data->first; - return 1; - } - case MUIA_Prop_Entries: STORE = data->entries; return 1; - case MUIA_Prop_Visible: STORE = data->visible; return 1; - - /* CHECKME: MUIA_Prop_Release - - TextEditor.mcc sets up notification on slider obj which is subclass - of group and notification on group children (the prop object) will be - dropped if the child does not return TRUE on OM_GET. - - It may be that MUI handles this differently, because a quick check - with UAE/MUI showed that a GetAttr() of MUIA_Prop_Release on alider - object does not work (returns FALSE). Maybe MUI slider class is - similiar to for exampe NListview.mcc which overrides MUIM_Notify where - it checks for known attributes and forwards the Method to the correct child - of the group. - */ - case MUIA_Prop_Release: STORE = 0; return 1; - default: - return DoSuperMethodA(cl,obj,(Msg)msg); - } - - return 1; -} -#undef STORE - -IPTR Prop__MUIM_AskMinMax(struct IClass *cl, Object *obj, struct MUIP_AskMinMax *msg) -{ - struct Prop_DATA *data = INST_DATA(cl, obj); - - /* - ** let our superclass first fill in what it thinks about sizes. - ** this will e.g. add the size of frame and inner spacing. - */ - DoSuperMethodA(cl, obj, (Msg)msg); - - msg->MinMaxInfo->MinWidth += data->minwidth; - msg->MinMaxInfo->DefWidth += data->defwidth; - msg->MinMaxInfo->MaxWidth = data->maxwidth; - - msg->MinMaxInfo->MinHeight += data->minheight; - msg->MinMaxInfo->DefHeight += data->defheight; - msg->MinMaxInfo->MaxHeight = data->maxheight; - - D(bug("Prop %p minheigh=%d\n", - obj, msg->MinMaxInfo->MinHeight)); - - return TRUE; -} - -IPTR Prop__MUIM_Setup(struct IClass *cl, Object *obj, struct MUIP_Setup *msg) -{ - struct Prop_DATA *data = INST_DATA(cl, obj); - ULONG rc = DoSuperMethodA(cl, obj, (Msg)msg); - if (!rc) return 0; - - DoMethod(_win(obj),MUIM_Window_AddEventHandler,(IPTR)&data->ehn); - - data->buffer = NULL; - data->temp = NULL; - data->mapbuffer = NULL; - data->maptemp = NULL; - data->tmprp = NULL; - - if (!data->usewinborder) - { - data->gadgetid = DoMethod(_win(obj),MUIM_Window_AllocGadgetID); - if (data->horiz == TRUE) - { - data->minwidth = 6; - data->minheight = 6; - data->maxwidth = MUI_MAXMAX; - data->maxheight = MUI_MAXMAX; - data->defwidth = 50; - data->defheight = 6; - } - else - { - data->minwidth = 6; - data->minheight = 6; - data->maxwidth = MUI_MAXMAX; - data->maxheight = MUI_MAXMAX; - data->defwidth = 6; - data->defheight = 50; - } - - struct MUI_AreaData *adata = muiAreaData(obj); - struct MUI_ImageSpec_intern *spec = adata->mad_Background; - - if (spec) - { - if (spec->type == IST_BITMAP) - { - struct dt_node *node = spec->u.bitmap.dt; - if (node) - { - if (node->mode == MODE_PROP) - { - set(obj, MUIA_Frame, MUIV_Frame_None); - - if (data->horiz == TRUE) - { - data->minheight = node->img_horizontalcontainer->h >> 1; - data->defheight = data->minheight; - data->maxheight = data->minheight; - } - else - { - data->minwidth = node->img_verticalcontainer->w >> 1; - data->defwidth = data->minwidth; - data->maxwidth = data->minwidth; - } - } - } - } - } - } - - return 1; -} - -IPTR Prop__MUIM_Cleanup(struct IClass *cl, Object *obj, struct MUIP_Cleanup *msg) -{ - struct Prop_DATA *data = INST_DATA(cl, obj); - if (!data->usewinborder) - { - DoMethod(_win(obj),MUIM_Window_FreeGadgetID,data->gadgetid); - } - else - { - data->prop_object = NULL; - data->gadgetid = 0; - } - - DoMethod(_win(obj),MUIM_Window_RemEventHandler,(IPTR)&data->ehn); - return DoSuperMethodA(cl, obj, (Msg)msg); -} - -void WritePixelArrayAlphaToImage(struct NewImage *in, UWORD sx, UWORD sy, struct NewImage *out, UWORD xp, UWORD yp, UWORD w, UWORD h) -{ - ULONG argb, rgb; - UBYTE rs, gs, bs, as, rd, gd, bd; - UWORD r, g, b; - UWORD x, y; - for (y = 0; y < h; y++) - { - for (x = 0; x < w; x++) - { - argb = in->data[x + sx + (y + sy) * in->w]; - - as = GET_A(argb); - rs = GET_R(argb); - gs = GET_G(argb); - bs = GET_B(argb); - // as = 255; - rgb = out->data[x+xp+(y+yp)*out->w]; - - rd = GET_R(rgb); - gd = GET_G(rgb); - bd = GET_B(rgb); - - - r = ((rs * as) >> 8) + ((rd * (255 - as)) >> 8); - g = ((gs * as) >> 8) + ((gd * (255 - as)) >> 8); - b = ((bs * as) >> 8) + ((bd * (255 - as)) >> 8); - - out->data[x+xp+(y+yp)*out->w] = SET_ARGB(255, r, g, b); - - } - } -} - -int WriteTiledImageHorizontal(struct NewImage *dst, struct RastPort *maprp, struct NewImage *ni, int sx, int sy, int sw, int sh, int xp, int yp, int dw, int dh) { - int w = dw; - int x = xp; - int ddw; - if ((sw == 0) || (dw == 0)) return xp; - - while (w > 0) { - ddw = sw; - if (w < ddw) ddw = w; - - if (dst != NULL) WritePixelArrayAlphaToImage(ni, sx , sy, dst, x, yp, ddw, dh); - if ((maprp != NULL) && (ni->bitmap != NULL)) - { - if (ni->mask) - { - BltMaskBitMapRastPort(ni->bitmap, sx, sy, maprp, x, yp, ddw, dh, 0xe0, (PLANEPTR) ni->mask); - } - else BltBitMapRastPort(ni->bitmap, sx, sy, maprp, x, yp, ddw, dh, 0xc0); - } - w -= ddw; - x += ddw; - } - return x; -} - -int WriteTiledImageVertical(struct NewImage *dst, struct RastPort *maprp, struct NewImage *ni, int sx, int sy, int sw, int sh, int xp, int yp, int dw, int dh) { - int h = dh; - int y = yp; - int ddh; - if ((sh == 0) || (dh == 0)) return yp; - while (h > 0) { - ddh = sh; - if (h < ddh) ddh = h; - - if (dst != NULL) WritePixelArrayAlphaToImage(ni, sx , sy, dst, xp, y, dw, ddh); - if ((maprp != NULL) && (ni->bitmap != NULL)) - { - if (ni->mask) - { - BltMaskBitMapRastPort(ni->bitmap, sx, sy, maprp, xp, y, dw, ddh, 0xe0, (PLANEPTR) ni->mask); - } - else BltBitMapRastPort(ni->bitmap, sx, sy, maprp, xp, y, dw, ddh, 0xc0); - } - h -= ddh; - y += ddh; - } - return y; -} - -#ifdef __AROS__ -AROS_UFH3 -( - void, CustomPropRenderFunc, - AROS_UFHA(struct Hook *, h, A0), - AROS_UFHA(Object *, obj, A2), - AROS_UFHA(struct wdpDrawBorderPropKnob *, msg, A1) -) -{ - AROS_USERFUNC_INIT - - struct Prop_DATA *node = h->h_Data; - - struct dt_node *data = node->node; - - if (msg->MethodID == WDM_DRAW_BORDERPROPKNOB) - { - struct Window *window = msg->wdp_Window; - struct NewImage *temp; - struct RastPort *winrp = msg->wdp_RPort; - struct RastPort *maprp; - struct Gadget *gadget = msg->wdp_Gadget; - struct Rectangle *r = msg->wdp_RenderRect; - struct PropInfo *pi = ((struct PropInfo *)gadget->SpecialInfo); - BOOL hit = (msg->wdp_Flags & WDF_DBPK_HIT) ? TRUE : FALSE; - ULONG y, x; - int size, is, pos; - UWORD MinX, MinY, MaxX, MaxY, StartX, StartY; - - - int i; - - temp = node->temp; - maprp = node->tmprp; - - if (node->buffer) for (i = 0; i < (node->buffer->w * node->buffer->h); i++) node->temp->data[i] = node->buffer->data[i]; - if (node->mapbuffer) BltBitMap(node->mapbuffer, 0, 0, node->maptemp, 0, 0, node->propwidth, node->propheight, 0xc0, 0xff, NULL); - - - r = msg->wdp_PropRect; - StartX = r->MinX; - StartY = r->MinY; - MinX = 0; - MinY = 0; - MaxX = r->MaxX - r->MinX; - MaxY = r->MaxY - r->MinY; - - if ((pi->Flags & FREEVERT) != 0) - { - is = data->img_verticalcontainer->w >> 1; - if (window->Flags & WFLG_WINDOWACTIVE) pos = 0; else pos = is; - y = MinY; - size = MaxY - MinY - data->ContainerTop_s - data->ContainerBottom_s + 1; - y = WriteTiledImageVertical(temp, maprp, data->img_verticalcontainer, pos, data->ContainerTop_o, is, data->ContainerTop_s, MinX, y, is, data->ContainerTop_s); - if (size > 0) y = WriteTiledImageVertical(temp, maprp, data->img_verticalcontainer, pos, data->ContainerVertTile_o, is, data->ContainerVertTile_s, MinX, y, is, size); - y = WriteTiledImageVertical(temp, maprp, data->img_verticalcontainer, pos, data->ContainerBottom_o, is, data->ContainerBottom_s, MinX, y, is, data->ContainerBottom_s); - } - else if ((pi->Flags & FREEHORIZ) != 0) - { - is = data->img_horizontalcontainer->h >> 1; - if (window->Flags & WFLG_WINDOWACTIVE) pos = 0; else pos = is; - x = MinX; - size = MaxX - MinX - data->ContainerLeft_s - data->ContainerRight_s + 1; - x = WriteTiledImageHorizontal(temp, maprp, data->img_horizontalcontainer, data->ContainerLeft_o, pos, data->ContainerLeft_s, is, x, MinY, data->ContainerLeft_s, is); - if (size > 0) x = WriteTiledImageHorizontal(temp, maprp, data->img_horizontalcontainer, data->ContainerHorTile_o, pos, data->ContainerHorTile_s, is, x, MinY, size, is); - x = WriteTiledImageHorizontal(temp, maprp, data->img_horizontalcontainer, data->ContainerRight_o, pos, data->ContainerRight_s, is, x, MinY, data->ContainerRight_s, is); - } - - r = msg->wdp_RenderRect; - MinX = r->MinX - StartX; - MinY = r->MinY - StartY; - MaxX = r->MaxX - StartX; - MaxY = r->MaxY - StartY; - - if ((pi->Flags & FREEVERT) != 0) - { - is = data->img_verticalknob->w / 3; - if (hit) pos = is; else if (window->Flags & WFLG_WINDOWACTIVE) pos = 0; else pos = is * 2; - y = MinY; - size = MaxY - MinY - data->KnobTop_s - data->KnobBottom_s + 1; - y = WriteTiledImageVertical(temp, maprp, data->img_verticalknob, pos, data->KnobTop_o, is, data->KnobTop_s, MinX, y, is, data->KnobTop_s); - if (size > 0) { - if (size > data->KnobVertGripper_s) { - size = size - data->KnobVertGripper_s; - int size_bak = size; - size = size / 2; - if (size > 0) y = WriteTiledImageVertical(temp, maprp, data->img_verticalknob, pos, data->KnobTileTop_o, is, data->KnobTileTop_s, MinX, y, is, size); - y = WriteTiledImageVertical(temp, maprp, data->img_verticalknob, pos, data->KnobVertGripper_o, is, data->KnobVertGripper_s, MinX, y, is, data->KnobVertGripper_s); - size = size_bak - size; - if (size > 0) y = WriteTiledImageVertical(temp, maprp, data->img_verticalknob, pos, data->KnobTileBottom_o, is, data->KnobTileBottom_s, MinX, y, is, size); - } else { - y = WriteTiledImageVertical(temp, maprp, data->img_verticalknob, pos, data->KnobTileTop_o, is, data->KnobTileTop_s, MinX, y, is, size); - } - } - y = WriteTiledImageVertical(temp, maprp, data->img_verticalknob, pos, data->KnobBottom_o, is, data->KnobBottom_s, MinX, y, is, data->KnobBottom_s); - } - else if ((pi->Flags & FREEHORIZ) != 0) - { - is = data->img_horizontalknob->h / 3; - if (hit) pos = is; else if (window->Flags & WFLG_WINDOWACTIVE) pos = 0; else pos = is * 2; - x = MinX; - size = MaxX - MinX - data->KnobLeft_s - data->KnobRight_s + 1; - x = WriteTiledImageHorizontal(temp, maprp, data->img_horizontalknob, data->KnobLeft_o, pos, data->KnobLeft_s, is, x, MinY, data->KnobLeft_s, is); - if (size > 0) { - if (size > data->KnobHorGripper_s) { - size = size - data->KnobHorGripper_s; - int size_bak = size; - size = size / 2; - if (size > 0) x = WriteTiledImageHorizontal(temp, maprp, data->img_horizontalknob, data->KnobTileLeft_o, pos, data->KnobTileLeft_s, is, x, MinY, size, is); - x = WriteTiledImageHorizontal(temp, maprp, data->img_horizontalknob, data->KnobHorGripper_o, pos, data->KnobHorGripper_s, is, x, MinY, data->KnobHorGripper_s, is); - size = size_bak - size; - if (size > 0) x = WriteTiledImageHorizontal(temp, maprp, data->img_horizontalknob, data->KnobTileRight_o, pos, data->KnobTileRight_s, is, x, MinY, size, is); - } else { - x = WriteTiledImageHorizontal(temp, maprp, data->img_horizontalknob, data->KnobTileRight_o, pos, data->KnobTileRight_s, is, x, MinY, size, is); - } - } - x = WriteTiledImageHorizontal(temp, maprp, data->img_horizontalknob, data->KnobRight_o, pos, data->KnobRight_s, is, x, MinY, data->KnobRight_s, is); - } - - if (node->temp) WritePixelArray(node->temp->data, 0, 0, node->temp->w*4, winrp, _left(node->obj), _top(node->obj), node->temp->w, node->temp->h, RECTFMT_ARGB); - if (node->maptemp) BltBitMapRastPort(node->maptemp, 0, 0, winrp, _left(node->obj), _top(node->obj), node->propwidth, node->propheight, 0xc0); - - } - - AROS_USERFUNC_EXIT -} -#endif - -IPTR Prop__MUIM_Show(struct IClass *cl, Object *obj, struct MUIP_Show *msg) -{ - struct Prop_DATA *data = INST_DATA(cl, obj); - struct MUI_AreaData *adata = muiAreaData(obj); - struct MUI_ImageSpec_intern *spec = adata->mad_Background; - - ULONG rc = DoSuperMethodA(cl, obj, (Msg)msg); -#ifdef __AROS__ - data->dhook.h_Entry = (HOOKFUNC) CustomPropRenderFunc; -#endif - if (!data->usewinborder) - { - BOOL isnewlook, completely_visible = TRUE;; - - if (_flags(obj) & MADF_INVIRTUALGROUP) - { - Object *wnd = NULL, *parent; - - get(obj, MUIA_WindowObject,&wnd); - parent = obj; - while (get(parent,MUIA_Parent,&parent)) - { - if (!parent) break; - if (parent == wnd) break; - - if (_flags(parent) & MADF_ISVIRTUALGROUP) - { - if ((_mleft(obj) < _mleft(parent)) || - (_mright(obj) > _mright(parent)) || - (_mtop(obj) < _mtop(parent)) || - (_mbottom(obj) > _mbottom(parent))) - { - completely_visible = FALSE; - D(bug("=== prop object: completely visible FALSE for obj %x at %d,%d - %d,%d\n", - obj, _mleft(obj), _mtop(obj), _mright(obj), _mbottom(obj))); - break; - } - } - } - } - - if (completely_visible) - { - if (muiGlobalInfo(obj)->mgi_Prefs->scrollbar_type == SCROLLBAR_TYPE_NEWLOOK) - isnewlook = TRUE; - else - isnewlook = FALSE; - - ULONG width = _mwidth(obj); - ULONG height = _mheight(obj); -#ifdef __AROS__ - struct Hook *dhook = NULL; - - ULONG depth = (ULONG) GetBitMapAttr(_window(obj)->RPort->BitMap, BMA_DEPTH); - if (muiGlobalInfo(obj)->mgi_Prefs->scrollbar_type == SCROLLBAR_TYPE_CUSTOM) - { - if (spec) - { - if (spec->type == IST_BITMAP) - { - struct dt_node *node = spec->u.bitmap.dt; - if (node) - { - if (node->mode == MODE_PROP) - { - data->dhook.h_Entry = (HOOKFUNC) CustomPropRenderFunc; - data->node = node; - data->dhook.h_Data = data; - data->obj = obj; - dhook = &data->dhook; - - if (data->horiz == TRUE) height = node->img_horizontalcontainer->h >> 1; else width = node->img_verticalcontainer->w >> 1; - DisposeImageContainer(data->buffer); - DisposeImageContainer(data->temp); - data->propwidth = width; - data->propheight = height; - if (data->mapbuffer) FreeBitMap(data->mapbuffer); - if (data->maptemp) FreeBitMap(data->maptemp); - if (depth >= 15) - { - data->buffer = NewImageContainer(width, height); - data->temp = NewImageContainer(width, height); - data->mapbuffer = NULL; - data->maptemp = NULL; - if ((data->buffer == NULL) || (data->temp == NULL)) - { - dhook = NULL; - DisposeImageContainer(data->buffer); - DisposeImageContainer(data->temp); - data->buffer = NULL; - data->temp = NULL; - } - } - else - { - data->temp = NULL; - data->buffer = NULL; - data->tmprp = NULL; - data->mapbuffer = AllocBitMap(width, height, 1, BMF_MINPLANES, _window(obj)->RPort->BitMap); - data->maptemp = AllocBitMap(width, height, 1, BMF_MINPLANES, _window(obj)->RPort->BitMap); - data->tmprp = CreateRastPort(); - if ((data->mapbuffer == NULL) || (data->maptemp == NULL) || (data->tmprp == NULL)) - { - dhook = NULL; - if (data->mapbuffer) FreeBitMap(data->mapbuffer); - if (data->maptemp) FreeBitMap(data->maptemp); - if (data->tmprp) FreeRastPort(data->tmprp); - data->mapbuffer = NULL; - data->maptemp = NULL; - data->tmprp = NULL; - } else data->tmprp->BitMap = data->maptemp; - } - } - } - } - } - } -#endif - - if (data->prop_object) { - RemoveGadget(_window(obj), (struct Gadget *) data->prop_object); - DisposeObject(data->prop_object); - } - - if ((data->prop_object = NewObject(NULL, "propgclass", - GA_Left, _mleft(obj), - GA_Top, _mtop(obj), - GA_Width, width, - GA_Height, height, - GA_ID, data->gadgetid, -#ifdef __AROS__ - PGA_DisplayHook, dhook, /* custom prop gadget impementation (not yet finished) */ -#endif - PGA_Freedom, data->horiz?FREEHORIZ:FREEVERT, - PGA_Total, downscale(data, data->entries), - PGA_Visible, downscale(data, data->visible), - PGA_Top, downscale(data, data->first), - PGA_NewLook, isnewlook, - PGA_Borderless, TRUE, - ICA_TARGET , ICTARGET_IDCMP, /* needed for notification */ - TAG_DONE))) - { - AddGadget(_window(obj),(struct Gadget*)data->prop_object,~0); - } - } - } else if (!data->prop_object) - { - switch (data->usewinborder) - { - case MUIV_Prop_UseWinBorder_Right: - data->prop_object = muiRenderInfo(obj)->mri_VertProp; - if (data->prop_object) - { - /* Store pointer to this propclass object in propgadget->UserData, - so that window class when receiving IDCMP_IDCMUPDATE from - arrow gadgets can notify propclass object */ - - ((struct Gadget *)data->prop_object)->UserData = obj; - } - break; - - case MUIV_Prop_UseWinBorder_Bottom: - data->prop_object = muiRenderInfo(obj)->mri_HorizProp; - if (data->prop_object) - { - /* Store pointer to this propclass object in propgadget->UserData, - so that window class when receiving IDCMP_IDCMUPDATE from - arrow gadgets can notify propclass object */ - - ((struct Gadget *)data->prop_object)->UserData = obj; - } - break; - } - if (data->prop_object) - { - data->gadgetid = ((struct Gadget*)data->prop_object)->GadgetID; - - SetAttrs(data->prop_object, ICA_TARGET, NULL, TAG_DONE); - if (SetGadgetAttrs((struct Gadget*)data->prop_object,_window(obj),NULL, - PGA_Top,downscale(data, data->first), - PGA_Visible,downscale(data, data->visible), - PGA_Total,downscale(data, data->entries), - TAG_DONE)) - { - RefreshGList((struct Gadget*)data->prop_object, _window(obj), NULL, 1); - } - SetAttrs(data->prop_object, ICA_TARGET, ICTARGET_IDCMP, TAG_DONE); - } - } - - return rc; -} - -IPTR Prop__MUIM_Draw(struct IClass *cl, Object *obj, struct MUIP_Draw *msg) -{ - struct Prop_DATA *data = INST_DATA(cl, obj); - - /* No drawings if own border */ - if (data->usewinborder) return 0; - - DoSuperMethodA(cl, obj, (Msg)msg); - - if (!(msg->flags & MADF_DRAWOBJECT)) return 1; - - if (data->buffer || data->mapbuffer) - { -// Object *p = NULL; -// get(obj, MUIA_Parent, &p); - //if (p) DoMethod(p, MUIM_DrawParentBackground, _left(obj), _top(obj), _width(obj), _height(obj), _left(obj), _top(obj), 0); - //else - DoMethod(obj, MUIM_DrawParentBackground, _left(obj), _top(obj), _width(obj), _height(obj), _left(obj), _top(obj), 0); - - if (data->buffer) ReadPixelArray(data->buffer->data, 0, 0, data->buffer->w*4, _rp(data->obj), _mleft(data->obj), _mtop(data->obj), data->buffer->w, data->buffer->h, RECTFMT_ARGB); - if (data->mapbuffer) BltBitMap(_window(data->obj)->RPort->BitMap, _window(data->obj)->LeftEdge + _mleft(data->obj), _window(data->obj)->TopEdge + _mtop(data->obj), data->mapbuffer, 0, 0, data->propwidth, data->propheight, 0xc0, 0xff, NULL); - } - - if (data->prop_object) RefreshGList((struct Gadget*)data->prop_object, _window(obj), NULL, 1); - return 1; -} - -IPTR Prop__MUIM_Hide(struct IClass *cl, Object *obj, struct MUIP_Hide *msg) -{ - struct Prop_DATA *data = INST_DATA(cl, obj); - - if (data->prop_object) - { - if (!data->usewinborder) - { - RemoveGadget(_window(obj),(struct Gadget*)data->prop_object); - DisposeObject(data->prop_object); - data->prop_object = NULL; - } - } - - return DoSuperMethodA(cl, obj, (Msg)msg); -} - -IPTR Prop__MUIM_HandleEvent(struct IClass *cl, Object *obj, struct MUIP_HandleEvent *msg) -{ - struct Prop_DATA *data = INST_DATA(cl, obj); - - if (msg->imsg) - { - if (msg->imsg->Class == IDCMP_IDCMPUPDATE) - { - struct TagItem *tag; - ULONG v; - - /* Check if we are meant */ - tag = FindTagItem(GA_ID,(struct TagItem*)msg->imsg->IAddress); - if (!tag) return 0; - if (tag->ti_Data != data->gadgetid) return 0; - - /* Check if we PGA_Top has really changed */ - tag = FindTagItem(PGA_Top,(struct TagItem*)msg->imsg->IAddress); - if (!tag) return 0; - v = upscale(data, tag->ti_Data); - - //kprintf("PROP_HandleEvent: PGA_Top %d upscaled %d entries %d\n", tag->ti_Data, v, data->entries); - - if ((v == data->first) && (msg->imsg->Qualifier & IEQUALIFIER_REPEAT)) return 0; - - if ((LONG)v < 0) v = 0; - - SetAttrs(obj, MUIA_Prop_First, v, MUIA_Prop_OnlyTrigger, TRUE, - MUIA_Prop_Release, ((msg->imsg->Qualifier & IEQUALIFIER_REPEAT) ? FALSE : TRUE), - TAG_DONE); - } - } - - return 0; -} - -IPTR Prop__MUIM_Prop_Increase(struct IClass *cl, Object *obj, struct MUIP_Prop_Increase *msg) -{ - struct Prop_DATA *data = INST_DATA(cl, obj); - LONG newfirst; - - newfirst = data->first + msg->amount * data->deltafactor; - - if (newfirst + data->visible > data->entries) - newfirst = data->entries - data->visible; - if (newfirst != data->first) - set(obj, MUIA_Prop_First, newfirst); - return 1; -} - -IPTR Prop__MUIM_Prop_Decrease(struct IClass *cl, Object *obj, struct MUIP_Prop_Decrease *msg) -{ - struct Prop_DATA *data = INST_DATA(cl, obj); - LONG newfirst; - - /* We cannot decrease if if are on the top */ - if (data->first <= 0) - return 1; - - newfirst = data->first - msg->amount * data->deltafactor; - - if (newfirst < 0) - set(obj, MUIA_Prop_First, 0); - else if (newfirst != data->first) - set(obj, MUIA_Prop_First, newfirst); - return 1; -} - - -BOOPSI_DISPATCHER(IPTR, Prop_Dispatcher, cl, obj, msg) -{ - switch (msg->MethodID) - { - case OM_NEW: return Prop__OM_NEW(cl, obj, (struct opSet *) msg); - case OM_DISPOSE: return Prop__OM_DISPOSE(cl, obj, msg); - case OM_GET: return Prop__OM_GET(cl, obj, (struct opGet *)msg); - case OM_SET: return Prop__OM_SET(cl, obj, (struct opSet *)msg); - case MUIM_Setup: return Prop__MUIM_Setup(cl, obj, (APTR)msg); - case MUIM_Cleanup: return Prop__MUIM_Cleanup(cl, obj, (APTR)msg); - case MUIM_Show: return Prop__MUIM_Show(cl, obj, (APTR)msg); - case MUIM_Hide: return Prop__MUIM_Hide(cl, obj, (APTR)msg); - case MUIM_AskMinMax: return Prop__MUIM_AskMinMax(cl, obj, (APTR)msg); - case MUIM_Draw: return Prop__MUIM_Draw(cl, obj, (APTR)msg); - case MUIM_HandleEvent: return Prop__MUIM_HandleEvent(cl, obj, (APTR)msg); - case MUIM_Prop_Decrease: return Prop__MUIM_Prop_Decrease(cl, obj, (APTR)msg); - case MUIM_Prop_Increase: return Prop__MUIM_Prop_Increase(cl, obj, (APTR)msg); - default: return DoSuperMethodA(cl, obj, msg); - - } -} -BOOPSI_DISPATCHER_END - -const struct __MUIBuiltinClass _MUI_Prop_desc = -{ - MUIC_Prop, - MUIC_Area, - sizeof(struct Prop_DATA), - (void*)Prop_Dispatcher -}; +/* + Copyright 2002-2003, The AROS Development Team. All rights reserved. + $Id$ +*/ + +#include <exec/memory.h> +#include <intuition/icclass.h> +#include <intuition/gadgetclass.h> +#include <clib/alib_protos.h> +#include <proto/exec.h> +#include <proto/graphics.h> +#include <proto/intuition.h> +#include <proto/utility.h> +#include <proto/muimaster.h> +#include <proto/cybergraphics.h> + +#ifdef __AROS__ +#include <intuition/windecorclass.h> +#endif +#include <cybergraphx/cybergraphics.h> +#include <graphics/rpattr.h> + +#include "../datatypescache.h" +#include "../imspec_intern.h" + +#include "mui.h" +#include "muimaster_intern.h" +#include "support.h" +#include "prefs.h" + +/* #define MYDEBUG 1 */ +#include "debug.h" + +extern struct Library *MUIMasterBase; + +#define SCALE16_METHOD 2 /* 1 or 2 */ + +#if SCALE16_METHOD != 1 +#define calcscale16(x) +#endif + +struct Prop_DATA +{ + ULONG entries; + LONG first; + ULONG visible; + LONG deltafactor; +#if SCALE16_METHOD == 1 + ULONG scale16; +#endif + LONG gadgetid; + + int horiz; + int usewinborder; + int sb_type; + UWORD minwidth, minheight; + UWORD maxwidth, maxheight; + UWORD defwidth, defheight; + UWORD propwidth, propheight; + + Object *prop_object; + struct MUI_EventHandlerNode ehn; + struct Hook dhook; + struct dt_node *node; + Object *obj; + struct NewImage *buffer; + struct NewImage *temp; + struct BitMap *mapbuffer; + struct BitMap *maptemp; + struct RastPort *tmprp; +}; + +#if SCALE16_METHOD == 1 +static void calcscale16(struct Prop_DATA *data) +{ + if (data->entries < 65535) + { + data->scale16 = 0x10000; + } + else + { + unsigned long long v = + ((unsigned long long)data->entries) * 0x10000 / 65535; + + data->scale16 = (ULONG) v; + } +} +#endif + +static ULONG downscale(struct Prop_DATA *data, ULONG val) +{ +#if SCALE16_METHOD == 1 + if (data->scale16 != 0x10000) + { + unsigned long long v = + ((unsigned long long)val) * 0x10000 / data->scale16; + val = (ULONG) v; + } +#else + if (data->entries >= 0x10000) + { + unsigned long long v = + ((unsigned long long)val) * 65535 / data->entries; + val = (ULONG) v; + } + +#endif + return val; +} + +static ULONG upscale(struct Prop_DATA *data, ULONG val) +{ +#if SCALE16_METHOD == 1 + if (data->scale16 != 0x10000) + { + unsigned long long v = + ((unsigned long long)val) * data->scale16 / 0x10000; + val = (ULONG) v; + } +#else + if (data->entries >= 0x10000) + { + unsigned long long v = + ((unsigned long long)val) * data->entries / 65535; + val = (ULONG) v; + } +#endif + return val; +} + +IPTR Prop__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) +{ + struct Prop_DATA *data; + struct TagItem *tags, *tag; + + obj = (Object *) DoSuperNewTags(cl, obj, NULL, + MUIA_Background, MUII_PropBack, TAG_MORE, (IPTR) msg->ops_AttrList); + + if (!obj) + return FALSE; + + data = INST_DATA(cl, obj); + data->deltafactor = 1; + + /* parse initial taglist */ + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) + { + switch (tag->ti_Tag) + { + case MUIA_Prop_Entries: + data->entries = tag->ti_Data; + break; + case MUIA_Prop_First: + data->first = tag->ti_Data; + break; + case MUIA_Prop_Horiz: + data->horiz = tag->ti_Data; + break; + case MUIA_Prop_Slider: + break; + case MUIA_Prop_UseWinBorder: + data->usewinborder = tag->ti_Data; + break; + case MUIA_Prop_Visible: + data->visible = tag->ti_Data; + break; + + case MUIA_Prop_DeltaFactor: + data->deltafactor = tag->ti_Data; + break; + } + } + + if (data->horiz == TRUE) + { + data->minwidth = 6; + data->minheight = 6; + data->maxwidth = MUI_MAXMAX; + data->maxheight = MUI_MAXMAX; + data->defwidth = 50; + data->defheight = 6; + } + else + { + data->minwidth = 6; + data->minheight = 6; + data->maxwidth = MUI_MAXMAX; + data->maxheight = MUI_MAXMAX; + data->defwidth = 6; + data->defheight = 50; + } + + if (data->first < 0) + data->first = 0; + + data->ehn.ehn_Events = IDCMP_IDCMPUPDATE; + data->ehn.ehn_Priority = 0; + data->ehn.ehn_Flags = 0; + data->ehn.ehn_Object = obj; + data->ehn.ehn_Class = cl; + + if (data->usewinborder) + _flags(obj) |= MADF_BORDERGADGET; + + calcscale16(data); + + return (IPTR) obj; +} + +IPTR Prop__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) +{ + struct Prop_DATA *data = INST_DATA(cl, obj); + + if (data->prop_object && !data->usewinborder) + { + RemoveGadget(_window(obj), (struct Gadget *)data->prop_object); + DisposeObject(data->prop_object); + } + + DisposeImageContainer(data->buffer); + DisposeImageContainer(data->temp); + if (data->mapbuffer != NULL) + FreeBitMap(data->mapbuffer); + if (data->maptemp != NULL) + FreeBitMap(data->maptemp); + if (data->tmprp != NULL) + FreeRastPort(data->tmprp); + + data->buffer = NULL; + data->temp = NULL; + data->mapbuffer = NULL; + data->maptemp = NULL; + data->tmprp = NULL; + + return DoSuperMethodA(cl, obj, msg); +} + +IPTR Prop__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) +{ + struct TagItem *tags, *tag; + struct Prop_DATA *data = INST_DATA(cl, obj); + int refresh = 0; + int only_trigger = 0; + + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) + { + switch (tag->ti_Tag) + { + case MUIA_Prop_Entries: + if ((IPTR) data->entries != tag->ti_Data) + { + data->entries = tag->ti_Data; + refresh = 1; + } + else + { + tag->ti_Tag = TAG_IGNORE; + } + break; + + case MUIA_Prop_First: + if ((IPTR) data->first != tag->ti_Data) + { + data->first = tag->ti_Data; + refresh = 1; + } + else + { + tag->ti_Tag = TAG_IGNORE; + } + break; + + case MUIA_Prop_Slider: + break; + + case MUIA_Prop_Visible: + if ((IPTR) data->visible != tag->ti_Data) + { + data->visible = tag->ti_Data; + refresh = 1; + } + else + { + tag->ti_Tag = TAG_IGNORE; + } + break; + + case MUIA_Prop_OnlyTrigger: + only_trigger = tag->ti_Data; + break; + + case MUIA_Prop_DeltaFactor: + data->deltafactor = tag->ti_Data; + break; + } + } + + if (data->first < 0) + data->first = 0; + + if (data->prop_object && refresh && !only_trigger) + { + calcscale16(data); + + /* Rendering will happen here! This could make problems with + * virtual groups, forward this to MUIM_Draw??? */ + SetAttrs(data->prop_object, ICA_TARGET, NULL, TAG_DONE); + if (SetGadgetAttrs((struct Gadget *)data->prop_object, _window(obj), + NULL, PGA_Top, downscale(data, data->first), PGA_Visible, + downscale(data, data->visible), PGA_Total, downscale(data, + data->entries), TAG_DONE)) + RefreshGList((struct Gadget *)data->prop_object, _window(obj), + NULL, 1); + SetAttrs(data->prop_object, ICA_TARGET, ICTARGET_IDCMP, TAG_DONE); + } + + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +#define STORE *(msg->opg_Storage) +IPTR Prop__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) +{ + struct Prop_DATA *data = INST_DATA(cl, obj); + switch (msg->opg_AttrID) + { + case MUIA_Prop_First: + { + if (data->prop_object) + { + IPTR v; + /* So we can get a more current value */ + GetAttr(PGA_Top, data->prop_object, &v); + data->first = upscale(data, v); + } + STORE = data->first; + return 1; + } + case MUIA_Prop_Entries: + STORE = data->entries; + return 1; + case MUIA_Prop_Visible: + STORE = data->visible; + return 1; + + /* CHECKME: MUIA_Prop_Release + + TextEditor.mcc sets up notification on slider obj which is subclass + of group and notification on group children (the prop object) will + be dropped if the child does not return TRUE on OM_GET. + + It may be that MUI handles this differently, because a quick check + with UAE/MUI showed that a GetAttr() of MUIA_Prop_Release on alider + object does not work (returns FALSE). Maybe MUI slider class is + similiar to for exampe NListview.mcc which overrides MUIM_Notify + where it checks for known attributes and forwards the Method to + the correct child of the group. + */ + case MUIA_Prop_Release: + STORE = 0; + return 1; + default: + return DoSuperMethodA(cl, obj, (Msg) msg); + } + + return 1; +} +#undef STORE + +IPTR Prop__MUIM_AskMinMax(struct IClass *cl, Object *obj, + struct MUIP_AskMinMax *msg) +{ + struct Prop_DATA *data = INST_DATA(cl, obj); + + /* + ** let our superclass first fill in what it thinks about sizes. + ** this will e.g. add the size of frame and inner spacing. + */ + DoSuperMethodA(cl, obj, (Msg) msg); + + msg->MinMaxInfo->MinWidth += data->minwidth; + msg->MinMaxInfo->DefWidth += data->defwidth; + msg->MinMaxInfo->MaxWidth = data->maxwidth; + + msg->MinMaxInfo->MinHeight += data->minheight; + msg->MinMaxInfo->DefHeight += data->defheight; + msg->MinMaxInfo->MaxHeight = data->maxheight; + + D(bug("Prop %p minheigh=%d\n", obj, msg->MinMaxInfo->MinHeight)); + + return TRUE; +} + +IPTR Prop__MUIM_Setup(struct IClass *cl, Object *obj, + struct MUIP_Setup *msg) +{ + struct Prop_DATA *data = INST_DATA(cl, obj); + ULONG rc = DoSuperMethodA(cl, obj, (Msg) msg); + if (!rc) + return 0; + + DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR) & data->ehn); + + data->buffer = NULL; + data->temp = NULL; + data->mapbuffer = NULL; + data->maptemp = NULL; + data->tmprp = NULL; + + if (!data->usewinborder) + { + data->gadgetid = DoMethod(_win(obj), MUIM_Window_AllocGadgetID); + if (data->horiz == TRUE) + { + data->minwidth = 6; + data->minheight = 6; + data->maxwidth = MUI_MAXMAX; + data->maxheight = MUI_MAXMAX; + data->defwidth = 50; + data->defheight = 6; + } + else + { + data->minwidth = 6; + data->minheight = 6; + data->maxwidth = MUI_MAXMAX; + data->maxheight = MUI_MAXMAX; + data->defwidth = 6; + data->defheight = 50; + } + + struct MUI_AreaData *adata = muiAreaData(obj); + struct MUI_ImageSpec_intern *spec = adata->mad_Background; + + if (spec) + { + if (spec->type == IST_BITMAP) + { + struct dt_node *node = spec->u.bitmap.dt; + if (node) + { + if (node->mode == MODE_PROP) + { + set(obj, MUIA_Frame, MUIV_Frame_None); + + if (data->horiz == TRUE) + { + data->minheight = + node->img_horizontalcontainer->h >> 1; + data->defheight = data->minheight; + data->maxheight = data->minheight; + } + else + { + data->minwidth = + node->img_verticalcontainer->w >> 1; + data->defwidth = data->minwidth; + data->maxwidth = data->minwidth; + } + } + } + } + } + } + + return 1; +} + +IPTR Prop__MUIM_Cleanup(struct IClass *cl, Object *obj, + struct MUIP_Cleanup *msg) +{ + struct Prop_DATA *data = INST_DATA(cl, obj); + if (!data->usewinborder) + { + DoMethod(_win(obj), MUIM_Window_FreeGadgetID, data->gadgetid); + } + else + { + data->prop_object = NULL; + data->gadgetid = 0; + } + + DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR) & data->ehn); + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +void WritePixelArrayAlphaToImage(struct NewImage *in, UWORD sx, UWORD sy, + struct NewImage *out, UWORD xp, UWORD yp, UWORD w, UWORD h) +{ + ULONG argb, rgb; + UBYTE rs, gs, bs, as, rd, gd, bd; + UWORD r, g, b; + UWORD x, y; + for (y = 0; y < h; y++) + { + for (x = 0; x < w; x++) + { + argb = in->data[x + sx + (y + sy) * in->w]; + + as = GET_A(argb); + rs = GET_R(argb); + gs = GET_G(argb); + bs = GET_B(argb); + // as = 255; + rgb = out->data[x + xp + (y + yp) * out->w]; + + rd = GET_R(rgb); + gd = GET_G(rgb); + bd = GET_B(rgb); + + + r = ((rs * as) >> 8) + ((rd * (255 - as)) >> 8); + g = ((gs * as) >> 8) + ((gd * (255 - as)) >> 8); + b = ((bs * as) >> 8) + ((bd * (255 - as)) >> 8); + + out->data[x + xp + (y + yp) * out->w] = SET_ARGB(255, r, g, b); + + } + } +} + +int WriteTiledImageHorizontal(struct NewImage *dst, struct RastPort *maprp, + struct NewImage *ni, int sx, int sy, int sw, int sh, int xp, int yp, + int dw, int dh) +{ + int w = dw; + int x = xp; + int ddw; + if ((sw == 0) || (dw == 0)) + return xp; + + while (w > 0) + { + ddw = sw; + if (w < ddw) + ddw = w; + + if (dst != NULL) + WritePixelArrayAlphaToImage(ni, sx, sy, dst, x, yp, ddw, dh); + if ((maprp != NULL) && (ni->bitmap != NULL)) + { + if (ni->mask) + { + BltMaskBitMapRastPort(ni->bitmap, sx, sy, maprp, x, yp, ddw, + dh, 0xe0, (PLANEPTR) ni->mask); + } + else + BltBitMapRastPort(ni->bitmap, sx, sy, maprp, x, yp, ddw, dh, + 0xc0); + } + w -= ddw; + x += ddw; + } + return x; +} + +int WriteTiledImageVertical(struct NewImage *dst, struct RastPort *maprp, + struct NewImage *ni, int sx, int sy, int sw, int sh, int xp, int yp, + int dw, int dh) +{ + int h = dh; + int y = yp; + int ddh; + if ((sh == 0) || (dh == 0)) + return yp; + while (h > 0) + { + ddh = sh; + if (h < ddh) + ddh = h; + + if (dst != NULL) + WritePixelArrayAlphaToImage(ni, sx, sy, dst, xp, y, dw, ddh); + if ((maprp != NULL) && (ni->bitmap != NULL)) + { + if (ni->mask) + { + BltMaskBitMapRastPort(ni->bitmap, sx, sy, maprp, xp, y, dw, + ddh, 0xe0, (PLANEPTR) ni->mask); + } + else + BltBitMapRastPort(ni->bitmap, sx, sy, maprp, xp, y, dw, ddh, + 0xc0); + } + h -= ddh; + y += ddh; + } + return y; +} + +#ifdef __AROS__ +AROS_UFH3 + (void, CustomPropRenderFunc, + AROS_UFHA(struct Hook *, h, A0), + AROS_UFHA(Object *, obj, A2), + AROS_UFHA(struct wdpDrawBorderPropKnob *, msg, A1)) +{ + AROS_USERFUNC_INIT + + struct Prop_DATA *node = h->h_Data; + struct dt_node *data = node->node; + + if (msg->MethodID == WDM_DRAW_BORDERPROPKNOB) + { + struct Window *window = msg->wdp_Window; + struct NewImage *temp; + struct RastPort *winrp = msg->wdp_RPort; + struct RastPort *maprp; + struct Gadget *gadget = msg->wdp_Gadget; + struct Rectangle *r = msg->wdp_RenderRect; + struct PropInfo *pi = ((struct PropInfo *)gadget->SpecialInfo); + BOOL hit = (msg->wdp_Flags & WDF_DBPK_HIT) ? TRUE : FALSE; + ULONG y, x; + int size, is, pos; + UWORD MinX, MinY, MaxX, MaxY, StartX, StartY; + + + int i; + + temp = node->temp; + maprp = node->tmprp; + + if (node->buffer) + for (i = 0; i < (node->buffer->w * node->buffer->h); i++) + node->temp->data[i] = node->buffer->data[i]; + if (node->mapbuffer) + BltBitMap(node->mapbuffer, 0, 0, node->maptemp, 0, 0, + node->propwidth, node->propheight, 0xc0, 0xff, NULL); + + + r = msg->wdp_PropRect; + StartX = r->MinX; + StartY = r->MinY; + MinX = 0; + MinY = 0; + MaxX = r->MaxX - r->MinX; + MaxY = r->MaxY - r->MinY; + + if ((pi->Flags & FREEVERT) != 0) + { + is = data->img_verticalcontainer->w >> 1; + if (window->Flags & WFLG_WINDOWACTIVE) + pos = 0; + else + pos = is; + y = MinY; + size = + MaxY - MinY - data->ContainerTop_s - + data->ContainerBottom_s + 1; + y = WriteTiledImageVertical(temp, maprp, + data->img_verticalcontainer, pos, data->ContainerTop_o, is, + data->ContainerTop_s, MinX, y, is, data->ContainerTop_s); + if (size > 0) + y = WriteTiledImageVertical(temp, maprp, + data->img_verticalcontainer, pos, + data->ContainerVertTile_o, is, + data->ContainerVertTile_s, MinX, y, is, size); + y = WriteTiledImageVertical(temp, maprp, + data->img_verticalcontainer, pos, data->ContainerBottom_o, + is, data->ContainerBottom_s, MinX, y, is, + data->ContainerBottom_s); + } + else if ((pi->Flags & FREEHORIZ) != 0) + { + is = data->img_horizontalcontainer->h >> 1; + if (window->Flags & WFLG_WINDOWACTIVE) + pos = 0; + else + pos = is; + x = MinX; + size = + MaxX - MinX - data->ContainerLeft_s - + data->ContainerRight_s + 1; + x = WriteTiledImageHorizontal(temp, maprp, + data->img_horizontalcontainer, data->ContainerLeft_o, pos, + data->ContainerLeft_s, is, x, MinY, data->ContainerLeft_s, + is); + if (size > 0) + x = WriteTiledImageHorizontal(temp, maprp, + data->img_horizontalcontainer, data->ContainerHorTile_o, + pos, data->ContainerHorTile_s, is, x, MinY, size, is); + x = WriteTiledImageHorizontal(temp, maprp, + data->img_horizontalcontainer, data->ContainerRight_o, pos, + data->ContainerRight_s, is, x, MinY, data->ContainerRight_s, + is); + } + + r = msg->wdp_RenderRect; + MinX = r->MinX - StartX; + MinY = r->MinY - StartY; + MaxX = r->MaxX - StartX; + MaxY = r->MaxY - StartY; + + if ((pi->Flags & FREEVERT) != 0) + { + is = data->img_verticalknob->w / 3; + if (hit) + pos = is; + else if (window->Flags & WFLG_WINDOWACTIVE) + pos = 0; + else + pos = is * 2; + y = MinY; + size = MaxY - MinY - data->KnobTop_s - data->KnobBottom_s + 1; + y = WriteTiledImageVertical(temp, maprp, data->img_verticalknob, + pos, data->KnobTop_o, is, data->KnobTop_s, MinX, y, is, + data->KnobTop_s); + if (size > 0) + { + if (size > data->KnobVertGripper_s) + { + size = size - data->KnobVertGripper_s; + int size_bak = size; + size = size / 2; + if (size > 0) + y = WriteTiledImageVertical(temp, maprp, + data->img_verticalknob, pos, + data->KnobTileTop_o, is, data->KnobTileTop_s, + MinX, y, is, size); + y = WriteTiledImageVertical(temp, maprp, + data->img_verticalknob, pos, + data->KnobVertGripper_o, is, + data->KnobVertGripper_s, MinX, y, is, + data->KnobVertGripper_s); + size = size_bak - size; + if (size > 0) + y = WriteTiledImageVertical(temp, maprp, + data->img_verticalknob, pos, + data->KnobTileBottom_o, is, + data->KnobTileBottom_s, MinX, y, is, size); + } + else + { + y = WriteTiledImageVertical(temp, maprp, + data->img_verticalknob, pos, data->KnobTileTop_o, + is, data->KnobTileTop_s, MinX, y, is, size); + } + } + y = WriteTiledImageVertical(temp, maprp, data->img_verticalknob, + pos, data->KnobBottom_o, is, data->KnobBottom_s, MinX, y, + is, data->KnobBottom_s); + } + else if ((pi->Flags & FREEHORIZ) != 0) + { + is = data->img_horizontalknob->h / 3; + if (hit) + pos = is; + else if (window->Flags & WFLG_WINDOWACTIVE) + pos = 0; + else + pos = is * 2; + x = MinX; + size = MaxX - MinX - data->KnobLeft_s - data->KnobRight_s + 1; + x = WriteTiledImageHorizontal(temp, maprp, + data->img_horizontalknob, data->KnobLeft_o, pos, + data->KnobLeft_s, is, x, MinY, data->KnobLeft_s, is); + if (size > 0) + { + if (size > data->KnobHorGripper_s) + { + size = size - data->KnobHorGripper_s; + int size_bak = size; + size = size / 2; + if (size > 0) + x = WriteTiledImageHorizontal(temp, maprp, + data->img_horizontalknob, data->KnobTileLeft_o, + pos, data->KnobTileLeft_s, is, x, MinY, size, + is); + x = WriteTiledImageHorizontal(temp, maprp, + data->img_horizontalknob, data->KnobHorGripper_o, + pos, data->KnobHorGripper_s, is, x, MinY, + data->KnobHorGripper_s, is); + size = size_bak - size; + if (size > 0) + x = WriteTiledImageHorizontal(temp, maprp, + data->img_horizontalknob, data->KnobTileRight_o, + pos, data->KnobTileRight_s, is, x, MinY, size, + is); + } + else + { + x = WriteTiledImageHorizontal(temp, maprp, + data->img_horizontalknob, data->KnobTileRight_o, + pos, data->KnobTileRight_s, is, x, MinY, size, is); + } + } + x = WriteTiledImageHorizontal(temp, maprp, + data->img_horizontalknob, data->KnobRight_o, pos, + data->KnobRight_s, is, x, MinY, data->KnobRight_s, is); + } + + if (node->temp) + WritePixelArray(node->temp->data, 0, 0, node->temp->w * 4, + winrp, _left(node->obj), _top(node->obj), node->temp->w, + node->temp->h, RECTFMT_ARGB); + if (node->maptemp) + BltBitMapRastPort(node->maptemp, 0, 0, winrp, _left(node->obj), + _top(node->obj), node->propwidth, node->propheight, 0xc0); + + } + + AROS_USERFUNC_EXIT +} +#endif + +IPTR Prop__MUIM_Show(struct IClass *cl, Object *obj, struct MUIP_Show *msg) +{ + struct Prop_DATA *data = INST_DATA(cl, obj); + struct MUI_AreaData *adata = muiAreaData(obj); + struct MUI_ImageSpec_intern *spec = adata->mad_Background; + + ULONG rc = DoSuperMethodA(cl, obj, (Msg) msg); +#ifdef __AROS__ + data->dhook.h_Entry = (HOOKFUNC) CustomPropRenderFunc; +#endif + if (!data->usewinborder) + { + BOOL isnewlook, completely_visible = TRUE;; + + if (_flags(obj) & MADF_INVIRTUALGROUP) + { + Object *wnd = NULL, *parent; + + get(obj, MUIA_WindowObject, &wnd); + parent = obj; + while (get(parent, MUIA_Parent, &parent)) + { + if (!parent) + break; + if (parent == wnd) + break; + + if (_flags(parent) & MADF_ISVIRTUALGROUP) + { + if ((_mleft(obj) < _mleft(parent)) || + (_mright(obj) > _mright(parent)) || + (_mtop(obj) < _mtop(parent)) || + (_mbottom(obj) > _mbottom(parent))) + { + completely_visible = FALSE; + D(bug("=== prop object: completely visible FALSE " + "for obj %x at %d,%d - %d,%d\n", + obj, _mleft(obj), _mtop(obj), _mright(obj), + _mbottom(obj))); + break; + } + } + } + } + + if (completely_visible) + { + if (muiGlobalInfo(obj)->mgi_Prefs->scrollbar_type == + SCROLLBAR_TYPE_NEWLOOK) + isnewlook = TRUE; + else + isnewlook = FALSE; + + ULONG width = _mwidth(obj); + ULONG height = _mheight(obj); +#ifdef __AROS__ + struct Hook *dhook = NULL; + + ULONG depth = + (ULONG) GetBitMapAttr(_window(obj)->RPort->BitMap, + BMA_DEPTH); + if (muiGlobalInfo(obj)->mgi_Prefs->scrollbar_type == + SCROLLBAR_TYPE_CUSTOM) + { + if (spec) + { + if (spec->type == IST_BITMAP) + { + struct dt_node *node = spec->u.bitmap.dt; + if (node) + { + if (node->mode == MODE_PROP) + { + data->dhook.h_Entry = + (HOOKFUNC) CustomPropRenderFunc; + data->node = node; + data->dhook.h_Data = data; + data->obj = obj; + dhook = &data->dhook; + + if (data->horiz == TRUE) + height = + node->img_horizontalcontainer-> + h >> 1; + else + width = + node->img_verticalcontainer->w >> 1; + DisposeImageContainer(data->buffer); + DisposeImageContainer(data->temp); + data->propwidth = width; + data->propheight = height; + if (data->mapbuffer) + FreeBitMap(data->mapbuffer); + if (data->maptemp) + FreeBitMap(data->maptemp); + if (depth >= 15) + { + data->buffer = + NewImageContainer(width, height); + data->temp = + NewImageContainer(width, height); + data->mapbuffer = NULL; + data->maptemp = NULL; + if ((data->buffer == NULL) + || (data->temp == NULL)) + { + dhook = NULL; + DisposeImageContainer(data->buffer); + DisposeImageContainer(data->temp); + data->buffer = NULL; + data->temp = NULL; + } + } + else + { + data->temp = NULL; + data->buffer = NULL; + data->tmprp = NULL; + data->mapbuffer = + AllocBitMap(width, height, 1, + BMF_MINPLANES, + _window(obj)->RPort->BitMap); + data->maptemp = + AllocBitMap(width, height, 1, + BMF_MINPLANES, + _window(obj)->RPort->BitMap); + data->tmprp = CreateRastPort(); + if ((data->mapbuffer == NULL) + || (data->maptemp == NULL) + || (data->tmprp == NULL)) + { + dhook = NULL; + if (data->mapbuffer) + FreeBitMap(data->mapbuffer); + if (data->maptemp) + FreeBitMap(data->maptemp); + if (data->tmprp) + FreeRastPort(data->tmprp); + data->mapbuffer = NULL; + data->maptemp = NULL; + data->tmprp = NULL; + } + else + data->tmprp->BitMap = data->maptemp; + } + } + } + } + } + } +#endif + + if (data->prop_object) + { + RemoveGadget(_window(obj), + (struct Gadget *)data->prop_object); + DisposeObject(data->prop_object); + } + + if ((data->prop_object = NewObject(NULL, "propgclass", + GA_Left, _mleft(obj), + GA_Top, _mtop(obj), + GA_Width, width, + GA_Height, height, GA_ID, data->gadgetid, +#ifdef __AROS__ + /* custom prop gadget implementation (not finished) */ + PGA_DisplayHook, dhook, +#endif + PGA_Freedom, data->horiz ? FREEHORIZ : FREEVERT, + PGA_Total, downscale(data, data->entries), + PGA_Visible, downscale(data, data->visible), + PGA_Top, downscale(data, data->first), + PGA_NewLook, isnewlook, + PGA_Borderless, TRUE, + ICA_TARGET, ICTARGET_IDCMP, /* for notification */ + TAG_DONE))) + { + AddGadget(_window(obj), (struct Gadget *)data->prop_object, + ~0); + } + } + } + else if (!data->prop_object) + { + switch (data->usewinborder) + { + case MUIV_Prop_UseWinBorder_Right: + data->prop_object = muiRenderInfo(obj)->mri_VertProp; + if (data->prop_object) + { + /* Store pointer to this propclass object in + propgadget->UserData, + so that window class when receiving IDCMP_IDCMUPDATE from + arrow gadgets can notify propclass object */ + + ((struct Gadget *)data->prop_object)->UserData = obj; + } + break; + + case MUIV_Prop_UseWinBorder_Bottom: + data->prop_object = muiRenderInfo(obj)->mri_HorizProp; + if (data->prop_object) + { + /* Store pointer to this propclass object in + propgadget->UserData, + so that window class when receiving IDCMP_IDCMUPDATE from + arrow gadgets can notify propclass object */ + + ((struct Gadget *)data->prop_object)->UserData = obj; + } + break; + } + if (data->prop_object) + { + data->gadgetid = ((struct Gadget *)data->prop_object)->GadgetID; + + SetAttrs(data->prop_object, ICA_TARGET, NULL, TAG_DONE); + if (SetGadgetAttrs((struct Gadget *)data->prop_object, + _window(obj), NULL, PGA_Top, downscale(data, + data->first), PGA_Visible, downscale(data, + data->visible), PGA_Total, downscale(data, + data->entries), TAG_DONE)) + { + RefreshGList((struct Gadget *)data->prop_object, + _window(obj), NULL, 1); + } + SetAttrs(data->prop_object, ICA_TARGET, ICTARGET_IDCMP, + TAG_DONE); + } + } + + return rc; +} + +IPTR Prop__MUIM_Draw(struct IClass *cl, Object *obj, + struct MUIP_Draw *msg) +{ + struct Prop_DATA *data = INST_DATA(cl, obj); + + /* No drawings if own border */ + if (data->usewinborder) + return 0; + + DoSuperMethodA(cl, obj, (Msg) msg); + + if (!(msg->flags & MADF_DRAWOBJECT)) + return 1; + + if (data->buffer || data->mapbuffer) + { +// Object *p = NULL; +// get(obj, MUIA_Parent, &p); + //if (p) + // DoMethod(p, MUIM_DrawParentBackground, _left(obj), _top(obj), + // _width(obj), _height(obj), _left(obj), _top(obj), 0); + //else + DoMethod(obj, MUIM_DrawParentBackground, _left(obj), _top(obj), + _width(obj), _height(obj), _left(obj), _top(obj), 0); + + if (data->buffer) + ReadPixelArray(data->buffer->data, 0, 0, data->buffer->w * 4, + _rp(data->obj), _mleft(data->obj), _mtop(data->obj), + data->buffer->w, data->buffer->h, RECTFMT_ARGB); + if (data->mapbuffer) + BltBitMap(_window(data->obj)->RPort->BitMap, + _window(data->obj)->LeftEdge + _mleft(data->obj), + _window(data->obj)->TopEdge + _mtop(data->obj), + data->mapbuffer, 0, 0, data->propwidth, data->propheight, + 0xc0, 0xff, NULL); + } + + if (data->prop_object) + RefreshGList((struct Gadget *)data->prop_object, _window(obj), NULL, + 1); + return 1; +} + +IPTR Prop__MUIM_Hide(struct IClass *cl, Object *obj, + struct MUIP_Hide *msg) +{ + struct Prop_DATA *data = INST_DATA(cl, obj); + + if (data->prop_object) + { + if (!data->usewinborder) + { + RemoveGadget(_window(obj), (struct Gadget *)data->prop_object); + DisposeObject(data->prop_object); + data->prop_object = NULL; + } + } + + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +IPTR Prop__MUIM_HandleEvent(struct IClass *cl, Object *obj, + struct MUIP_HandleEvent *msg) +{ + struct Prop_DATA *data = INST_DATA(cl, obj); + + if (msg->imsg) + { + if (msg->imsg->Class == IDCMP_IDCMPUPDATE) + { + struct TagItem *tag; + ULONG v; + + /* Check if we are meant */ + tag = FindTagItem(GA_ID, (struct TagItem *)msg->imsg->IAddress); + if (!tag) + return 0; + if (tag->ti_Data != data->gadgetid) + return 0; + + /* Check if we PGA_Top has really changed */ + tag = + FindTagItem(PGA_Top, (struct TagItem *)msg->imsg->IAddress); + if (!tag) + return 0; + v = upscale(data, tag->ti_Data); + + //kprintf("PROP_HandleEvent: PGA_Top %d upscaled %d entries %d\n", + // tag->ti_Data, v, data->entries); + + if ((v == data->first) + && (msg->imsg->Qualifier & IEQUALIFIER_REPEAT)) + return 0; + + if ((LONG) v < 0) + v = 0; + + SetAttrs(obj, MUIA_Prop_First, v, MUIA_Prop_OnlyTrigger, TRUE, + MUIA_Prop_Release, + ((msg->imsg-> + Qualifier & IEQUALIFIER_REPEAT) ? FALSE : TRUE), + TAG_DONE); + } + } + + return 0; +} + +IPTR Prop__MUIM_Prop_Increase(struct IClass *cl, Object *obj, + struct MUIP_Prop_Increase *msg) +{ + struct Prop_DATA *data = INST_DATA(cl, obj); + LONG newfirst; + + newfirst = data->first + msg->amount * data->deltafactor; + + if (newfirst + data->visible > data->entries) + newfirst = data->entries - data->visible; + if (newfirst != data->first) + set(obj, MUIA_Prop_First, newfirst); + return 1; +} + +IPTR Prop__MUIM_Prop_Decrease(struct IClass *cl, Object *obj, + struct MUIP_Prop_Decrease *msg) +{ + struct Prop_DATA *data = INST_DATA(cl, obj); + LONG newfirst; + + /* We cannot decrease if if are on the top */ + if (data->first <= 0) + return 1; + + newfirst = data->first - msg->amount * data->deltafactor; + + if (newfirst < 0) + set(obj, MUIA_Prop_First, 0); + else if (newfirst != data->first) + set(obj, MUIA_Prop_First, newfirst); + return 1; +} + + +BOOPSI_DISPATCHER(IPTR, Prop_Dispatcher, cl, obj, msg) +{ + switch (msg->MethodID) + { + case OM_NEW: + return Prop__OM_NEW(cl, obj, (struct opSet *)msg); + case OM_DISPOSE: + return Prop__OM_DISPOSE(cl, obj, msg); + case OM_GET: + return Prop__OM_GET(cl, obj, (struct opGet *)msg); + case OM_SET: + return Prop__OM_SET(cl, obj, (struct opSet *)msg); + case MUIM_Setup: + return Prop__MUIM_Setup(cl, obj, (APTR) msg); + case MUIM_Cleanup: + return Prop__MUIM_Cleanup(cl, obj, (APTR) msg); + case MUIM_Show: + return Prop__MUIM_Show(cl, obj, (APTR) msg); + case MUIM_Hide: + return Prop__MUIM_Hide(cl, obj, (APTR) msg); + case MUIM_AskMinMax: + return Prop__MUIM_AskMinMax(cl, obj, (APTR) msg); + case MUIM_Draw: + return Prop__MUIM_Draw(cl, obj, (APTR) msg); + case MUIM_HandleEvent: + return Prop__MUIM_HandleEvent(cl, obj, (APTR) msg); + case MUIM_Prop_Decrease: + return Prop__MUIM_Prop_Decrease(cl, obj, (APTR) msg); + case MUIM_Prop_Increase: + return Prop__MUIM_Prop_Increase(cl, obj, (APTR) msg); + default: + return DoSuperMethodA(cl, obj, msg); + + } +} +BOOPSI_DISPATCHER_END + +const struct __MUIBuiltinClass _MUI_Prop_desc = +{ + MUIC_Prop, + MUIC_Area, + sizeof(struct Prop_DATA), + (void *) Prop_Dispatcher +}; diff --git a/workbench/libs/muimaster/classes/prop.h b/workbench/libs/muimaster/classes/prop.h dissimilarity index 63% index 881165f6bf..f82cd1517b 100644 --- a/workbench/libs/muimaster/classes/prop.h +++ b/workbench/libs/muimaster/classes/prop.h @@ -1,46 +1,66 @@ -#ifndef _MUI_CLASSES_PROP_H -#define _MUI_CLASSES_PROP_H - -/* - Copyright © 2002-2003, The AROS Development Team. All rights reserved. - $Id$ -*/ - -/*** Name *******************************************************************/ -#define MUIC_Prop "Prop.mui" - -/*** Identifier base (for Zune extensions) **********************************/ -#define MUIB_Prop (MUIB_ZUNE | 0x00002900) - -/*** Methods ****************************************************************/ -#define MUIM_Prop_Decrease (MUIB_MUI|0x00420dd1) /* MUI: V16 */ -#define MUIM_Prop_Increase (MUIB_MUI|0x0042cac0) /* MUI: V16 */ -struct MUIP_Prop_Decrease {STACKED ULONG MethodID; STACKED LONG amount;}; -struct MUIP_Prop_Increase {STACKED ULONG MethodID; STACKED LONG amount;}; - -/*** Attributes *************************************************************/ -#define MUIA_Prop_Entries (MUIB_MUI|0x0042fbdb) /* MUI: V4 isg LONG */ -#define MUIA_Prop_First (MUIB_MUI|0x0042d4b2) /* MUI: V4 isg LONG */ -#define MUIA_Prop_Horiz (MUIB_MUI|0x0042f4f3) /* MUI: V4 i.g BOOL */ -#define MUIA_Prop_Slider (MUIB_MUI|0x00429c3a) /* MUI: V4 isg BOOL */ -#define MUIA_Prop_UseWinBorder (MUIB_MUI|0x0042deee) /* MUI: V13 i.. LONG */ -#define MUIA_Prop_Visible (MUIB_MUI|0x0042fea6) /* MUI: V4 isg LONG */ - -#define MUIA_Prop_OnlyTrigger (MUIB_Prop | 0x00000000) /* Zune: PRIV .s. BOOL */ - -enum -{ - MUIV_Prop_UseWinBorder_None = 0, - MUIV_Prop_UseWinBorder_Left, - MUIV_Prop_UseWinBorder_Right, - MUIV_Prop_UseWinBorder_Bottom, -}; - -#define MUIA_Prop_Release (MUIB_MUI|0x00429839) /* MUI: ..g BOOL PRIV */ -#define MUIA_Prop_DeltaFactor (MUIB_MUI|0x00427c5e) /* MUI: is. LONG */ -#define MUIA_Prop_DoSmooth (MUIB_MUI|0x004236ce) /* MUI: V4 i.. LONG */ - - -extern const struct __MUIBuiltinClass _MUI_Prop_desc; /* PRIV */ - -#endif /* _MUI_CLASSES_PROP_H */ +#ifndef _MUI_CLASSES_PROP_H +#define _MUI_CLASSES_PROP_H + +/* + Copyright © 2002-2003, The AROS Development Team. All rights reserved. + $Id$ +*/ + +/*** Name *******************************************************************/ +#define MUIC_Prop "Prop.mui" + +/*** Identifier base (for Zune extensions) **********************************/ +#define MUIB_Prop (MUIB_ZUNE | 0x00002900) + +/*** Methods ****************************************************************/ +#define MUIM_Prop_Decrease (MUIB_MUI | 0x00420dd1) /* MUI: V16 */ +#define MUIM_Prop_Increase (MUIB_MUI | 0x0042cac0) /* MUI: V16 */ + +struct MUIP_Prop_Decrease +{ + STACKED ULONG MethodID; + STACKED LONG amount; +}; + +struct MUIP_Prop_Increase +{ + STACKED ULONG MethodID; + STACKED LONG amount; +}; + +/*** Attributes *************************************************************/ +#define MUIA_Prop_Entries \ + (MUIB_MUI | 0x0042fbdb) /* MUI: V4 isg LONG */ +#define MUIA_Prop_First \ + (MUIB_MUI | 0x0042d4b2) /* MUI: V4 isg LONG */ +#define MUIA_Prop_Horiz \ + (MUIB_MUI | 0x0042f4f3) /* MUI: V4 i.g BOOL */ +#define MUIA_Prop_Slider \ + (MUIB_MUI | 0x00429c3a) /* MUI: V4 isg BOOL */ +#define MUIA_Prop_UseWinBorder \ + (MUIB_MUI | 0x0042deee) /* MUI: V13 i.. LONG */ +#define MUIA_Prop_Visible \ + (MUIB_MUI | 0x0042fea6) /* MUI: V4 isg LONG */ + +#define MUIA_Prop_OnlyTrigger \ + (MUIB_Prop | 0x00000000) /* Zune: PRIV .s. BOOL */ + +enum +{ + MUIV_Prop_UseWinBorder_None = 0, + MUIV_Prop_UseWinBorder_Left, + MUIV_Prop_UseWinBorder_Right, + MUIV_Prop_UseWinBorder_Bottom, +}; + +#define MUIA_Prop_Release \ + (MUIB_MUI | 0x00429839) /* MUI: ..g BOOL PRIV */ +#define MUIA_Prop_DeltaFactor \ + (MUIB_MUI | 0x00427c5e) /* MUI: is. LONG */ +#define MUIA_Prop_DoSmooth \ + (MUIB_MUI | 0x004236ce) /* MUI: V4 i.. LONG */ + + +extern const struct __MUIBuiltinClass _MUI_Prop_desc; /* PRIV */ + +#endif /* _MUI_CLASSES_PROP_H */ diff --git a/workbench/libs/muimaster/classes/radio.c b/workbench/libs/muimaster/classes/radio.c index 1163e8f519..d2b7272703 100644 --- a/workbench/libs/muimaster/classes/radio.c +++ b/workbench/libs/muimaster/classes/radio.c @@ -25,9 +25,9 @@ extern struct Library *MUIMasterBase; IPTR Radio__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) { - struct Radio_DATA *data; - struct TagItem *tags; - struct TagItem *tag; + struct Radio_DATA *data; + struct TagItem *tags; + struct TagItem *tag; int i; const char **entries = NULL; int entries_active = 0; @@ -38,83 +38,83 @@ IPTR Radio__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) /* parse initial taglist */ - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) { - switch (tag->ti_Tag) - { - case MUIA_Radio_Entries: - entries = (const char**)tag->ti_Data; - break; - case MUIA_Radio_Active: - entries_active = tag->ti_Data; - break; - } + switch (tag->ti_Tag) + { + case MUIA_Radio_Entries: + entries = (const char **)tag->ti_Data; + break; + case MUIA_Radio_Active: + entries_active = tag->ti_Data; + break; + } } if (!entries) { - D(bug("Radio_New: No Entries specified!\n")); - CoerceMethod(cl,obj,OM_DISPOSE); - return 0; + D(bug("Radio_New: No Entries specified!\n")); + CoerceMethod(cl, obj, OM_DISPOSE); + return 0; } /* Count the number of entries */ - for (i=0;entries[i];i++); + for (i = 0; entries[i]; i++); entries_num = i; if ((entries_active < 0) || (entries_active > entries_num - 1)) - entries_active = 0; + entries_active = 0; grouptags = AllocateTagItems(entries_num + 1); if (!grouptags) - return FALSE; + return FALSE; buttons = AllocVec(i * sizeof(Object *) * 3, MEMF_PUBLIC); if (!buttons) { - FreeVec(grouptags); - return FALSE; + FreeVec(grouptags); + return FALSE; } imgobjs = buttons + i; textobjs = imgobjs + i; - + for (i = 0; i < entries_num; i++) { - state = (entries_active == i) ? TRUE : FALSE; - - buttons[i] = HGroup, - Child, (IPTR)(imgobjs[i] = ImageObject, - MUIA_Image_FontMatch, TRUE, - MUIA_InputMode, MUIV_InputMode_Immediate, - MUIA_Selected, state, - MUIA_ShowSelState, FALSE, - MUIA_Image_Spec, MUII_RadioButton, - MUIA_Frame, MUIV_Frame_None, - End), - Child, (IPTR)(textobjs[i] = TextObject, - MUIA_InputMode, MUIV_InputMode_Immediate, + state = (entries_active == i) ? TRUE : FALSE; + + buttons[i] = HGroup, + Child, (IPTR)(imgobjs[i] = ImageObject, + MUIA_Image_FontMatch, TRUE, + MUIA_InputMode, MUIV_InputMode_Immediate, + MUIA_Selected, state, + MUIA_ShowSelState, FALSE, + MUIA_Image_Spec, MUII_RadioButton, + MUIA_Frame, MUIV_Frame_None, + End), + Child, (IPTR)(textobjs[i] = TextObject, + MUIA_InputMode, MUIV_InputMode_Immediate, MUIA_ShowSelState, FALSE, - MUIA_Selected, state, - MUIA_Text_Contents, entries[i], - MUIA_Frame, MUIV_Frame_None, - MUIA_Text_PreParse, (IPTR)"\33l", - End), - End; - - grouptags[i].ti_Tag = MUIA_Group_Child; - grouptags[i].ti_Data = (IPTR)buttons[i]; + MUIA_Selected, state, + MUIA_Text_Contents, entries[i], + MUIA_Frame, MUIV_Frame_None, + MUIA_Text_PreParse, (IPTR)"\33l", + End), + End; + + grouptags[i].ti_Tag = MUIA_Group_Child; + grouptags[i].ti_Data = (IPTR) buttons[i]; } grouptags[i].ti_Tag = TAG_MORE; - grouptags[i].ti_Data = (IPTR)msg->ops_AttrList; + grouptags[i].ti_Data = (IPTR) msg->ops_AttrList; - obj = (Object *)DoSuperNewTags(cl, obj, NULL, - TAG_MORE, (IPTR)grouptags); + obj = (Object *) DoSuperNewTags(cl, obj, NULL, + TAG_MORE, (IPTR) grouptags); FreeTagItems(grouptags); if (!obj) { - FreeVec(buttons); - return FALSE; + FreeVec(buttons); + return FALSE; } data = INST_DATA(cl, obj); data->entries_active = entries_active; @@ -123,50 +123,51 @@ IPTR Radio__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) for (i = 0; i < entries_num; i++) { - DoMethod(imgobjs[i], MUIM_Notify, MUIA_Selected, MUIV_EveryTime, - (IPTR)obj, 3, MUIM_Set, MUIA_Radio_Active, i); - DoMethod(textobjs[i], MUIM_Notify, MUIA_Selected, MUIV_EveryTime, - (IPTR)obj, 3, MUIM_Set, MUIA_Radio_Active, i); + DoMethod(imgobjs[i], MUIM_Notify, MUIA_Selected, MUIV_EveryTime, + (IPTR) obj, 3, MUIM_Set, MUIA_Radio_Active, i); + DoMethod(textobjs[i], MUIM_Notify, MUIA_Selected, MUIV_EveryTime, + (IPTR) obj, 3, MUIM_Set, MUIA_Radio_Active, i); } - return (IPTR)obj; + return (IPTR) obj; } IPTR Radio__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) { - struct Radio_DATA *data = INST_DATA(cl,obj); - if (data->buttons) FreeVec(data->buttons); - return DoSuperMethodA(cl,obj,msg); + struct Radio_DATA *data = INST_DATA(cl, obj); + if (data->buttons) + FreeVec(data->buttons); + return DoSuperMethodA(cl, obj, msg); } IPTR Radio__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) { struct Radio_DATA *data; - struct TagItem *tags; - struct TagItem *tag; + struct TagItem *tags; + struct TagItem *tag; data = INST_DATA(cl, obj); - - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) + + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) { - switch (tag->ti_Tag) - { - case MUIA_Radio_Active: - D(bug("Radio_Set(%p) MUIA_Radio_Active %ld\n", - obj, tag->ti_Data)); - if (tag->ti_Data >= 0 && tag->ti_Data < data->entries_num && - tag->ti_Data != data->entries_active) - { - DoMethod(data->buttons[data->entries_active], - MUIM_NoNotifySet, MUIA_Selected, FALSE); - DoMethod(data->buttons[tag->ti_Data], - MUIM_NoNotifySet, MUIA_Selected, TRUE); - data->entries_active = tag->ti_Data; - } - break; - } + switch (tag->ti_Tag) + { + case MUIA_Radio_Active: + D(bug("Radio_Set(%p) MUIA_Radio_Active %ld\n", + obj, tag->ti_Data)); + if (tag->ti_Data >= 0 && tag->ti_Data < data->entries_num && + tag->ti_Data != data->entries_active) + { + DoMethod(data->buttons[data->entries_active], + MUIM_NoNotifySet, MUIA_Selected, FALSE); + DoMethod(data->buttons[tag->ti_Data], + MUIM_NoNotifySet, MUIA_Selected, TRUE); + data->entries_active = tag->ti_Data; + } + break; + } } - return DoSuperMethodA(cl,obj,(Msg)msg); + return DoSuperMethodA(cl, obj, (Msg) msg); } IPTR Radio__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) @@ -174,23 +175,25 @@ IPTR Radio__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) struct Radio_DATA *data = INST_DATA(cl, obj); #define STORE *(msg->opg_Storage) - switch(msg->opg_AttrID) + switch (msg->opg_AttrID) { - case MUIA_Radio_Active: - STORE = data->entries_active; - return 1; + case MUIA_Radio_Active: + STORE = data->entries_active; + return 1; } - return DoSuperMethodA(cl,obj,(Msg)msg); + return DoSuperMethodA(cl, obj, (Msg) msg); } IPTR Radio__MUIM_Setup(struct IClass *cl, Object *obj, Msg msg) { if (!DoSuperMethodA(cl, obj, msg)) - return FALSE; + return FALSE; - set(obj, MUIA_Group_HorizSpacing, muiGlobalInfo(obj)->mgi_Prefs->radiobutton_hspacing); - set(obj, MUIA_Group_VertSpacing, muiGlobalInfo(obj)->mgi_Prefs->radiobutton_vspacing); + set(obj, MUIA_Group_HorizSpacing, + muiGlobalInfo(obj)->mgi_Prefs->radiobutton_hspacing); + set(obj, MUIA_Group_VertSpacing, + muiGlobalInfo(obj)->mgi_Prefs->radiobutton_vspacing); return TRUE; } @@ -198,18 +201,17 @@ IPTR Radio__MUIM_Setup(struct IClass *cl, Object *obj, Msg msg) /************************************************************************** MUIM_Export - to export an objects "contents" to a dataspace object. **************************************************************************/ -IPTR Radio__MUIM_Export(struct IClass *cl, Object *obj, struct MUIP_Export *msg) +IPTR Radio__MUIM_Export(struct IClass *cl, Object *obj, + struct MUIP_Export *msg) { struct Radio_DATA *data = INST_DATA(cl, obj); ULONG id; if ((id = muiNotifyData(obj)->mnd_ObjectID)) { - LONG value = data->entries_active; - DoMethod(msg->dataspace, MUIM_Dataspace_Add, - (IPTR) &value, - sizeof(value), - (IPTR) id); + LONG value = data->entries_active; + DoMethod(msg->dataspace, MUIM_Dataspace_Add, + (IPTR) & value, sizeof(value), (IPTR) id); } return 0; } @@ -217,17 +219,19 @@ IPTR Radio__MUIM_Export(struct IClass *cl, Object *obj, struct MUIP_Export *msg) /************************************************************************** MUIM_Import - to import an objects "contents" from a dataspace object. **************************************************************************/ -IPTR Radio__MUIM_Import(struct IClass *cl, Object *obj, struct MUIP_Import *msg) +IPTR Radio__MUIM_Import(struct IClass *cl, Object *obj, + struct MUIP_Import *msg) { ULONG id; LONG *s; if ((id = muiNotifyData(obj)->mnd_ObjectID)) { - if ((s = (LONG*) DoMethod(msg->dataspace, MUIM_Dataspace_Find, (IPTR) id))) - { - set(obj, MUIA_Radio_Active, *s); - } + if ((s = (LONG *) DoMethod(msg->dataspace, MUIM_Dataspace_Find, + (IPTR) id))) + { + set(obj, MUIA_Radio_Active, *s); + } } return 0; } @@ -237,22 +241,31 @@ BOOPSI_DISPATCHER(IPTR, Radio_Dispatcher, cl, obj, msg) { switch (msg->MethodID) { - case OM_NEW: return Radio__OM_NEW(cl, obj, (struct opSet *) msg); - case OM_DISPOSE: return Radio__OM_DISPOSE(cl, obj, (Msg) msg); - case OM_SET: return Radio__OM_SET(cl, obj, (struct opSet *) msg); - case OM_GET: return Radio__OM_GET(cl, obj, (struct opGet *) msg); - case MUIM_Setup: return Radio__MUIM_Setup(cl, obj, msg); - case MUIM_Export: return Radio__MUIM_Export(cl, obj, (Msg) msg); - case MUIM_Import: return Radio__MUIM_Import(cl, obj, (Msg) msg); - default: return DoSuperMethodA(cl, obj, msg); + case OM_NEW: + return Radio__OM_NEW(cl, obj, (struct opSet *)msg); + case OM_DISPOSE: + return Radio__OM_DISPOSE(cl, obj, (Msg) msg); + case OM_SET: + return Radio__OM_SET(cl, obj, (struct opSet *)msg); + case OM_GET: + return Radio__OM_GET(cl, obj, (struct opGet *)msg); + case MUIM_Setup: + return Radio__MUIM_Setup(cl, obj, msg); + case MUIM_Export: + return Radio__MUIM_Export(cl, obj, (Msg) msg); + case MUIM_Import: + return Radio__MUIM_Import(cl, obj, (Msg) msg); + default: + return DoSuperMethodA(cl, obj, msg); } } BOOPSI_DISPATCHER_END -const struct __MUIBuiltinClass _MUI_Radio_desc = { +const struct __MUIBuiltinClass _MUI_Radio_desc = +{ MUIC_Radio, - MUIC_Group, - sizeof(struct Radio_DATA), - (void*)Radio_Dispatcher + MUIC_Group, + sizeof(struct Radio_DATA), + (void *) Radio_Dispatcher }; #endif /* ZUNE_BUILTIN_RADIO */ diff --git a/workbench/libs/muimaster/classes/radio.h b/workbench/libs/muimaster/classes/radio.h index 818e705cff..4a73623d10 100644 --- a/workbench/libs/muimaster/classes/radio.h +++ b/workbench/libs/muimaster/classes/radio.h @@ -10,13 +10,15 @@ #define MUIC_Radio "Radio.mui" /*** Identifier base (for Zune extensions) **********************************/ -#define MUIB_Radio (MUIB_ZUNE | 0x00002a00) +#define MUIB_Radio (MUIB_ZUNE | 0x00002a00) /*** Attributes *************************************************************/ -#define MUIA_Radio_Active (MUIB_MUI|0x00429b41) /* MUI:V4 isg LONG */ -#define MUIA_Radio_Entries (MUIB_MUI|0x0042b6a1) /* MUI:V4 i.. STRPTR * */ +#define MUIA_Radio_Active \ + (MUIB_MUI | 0x00429b41) /* MUI:V4 isg LONG */ +#define MUIA_Radio_Entries \ + (MUIB_MUI | 0x0042b6a1) /* MUI:V4 i.. STRPTR * */ -extern const struct __MUIBuiltinClass _MUI_Radio_desc; /* PRIV */ +extern const struct __MUIBuiltinClass _MUI_Radio_desc; /* PRIV */ #endif /* _MUI_CLASSES_RADIO_H */ diff --git a/workbench/libs/muimaster/classes/rectangle.c b/workbench/libs/muimaster/classes/rectangle.c dissimilarity index 63% index d55dfeb6d0..eed05ce11c 100644 --- a/workbench/libs/muimaster/classes/rectangle.c +++ b/workbench/libs/muimaster/classes/rectangle.c @@ -1,396 +1,417 @@ -/* - Copyright © 1999, David Le Corfec. - Copyright © 2002-2006, The AROS Development Team. - All rights reserved. - - $Id$ -*/ - -#include <string.h> - -#include <exec/types.h> - -#include <clib/alib_protos.h> -#include <proto/intuition.h> -#include <proto/graphics.h> -#include <proto/utility.h> -#include <proto/exec.h> -#include <proto/muimaster.h> - -#include "mui.h" -#include "muimaster_intern.h" -#include "support.h" -#include "textengine.h" -#include "prefs.h" - -/* #define MYDEBUG 1 */ -#include "debug.h" - -extern struct Library *MUIMasterBase; - -static const int __version = 1; -static const int __revision = 1; - -struct Rectangle_DATA -{ - STRPTR BarTitle; - ULONG Type; - ZText *ztext; -}; - -#define RECTANGLE_TYPE_NORMAL 0 -#define RECTANGLE_TYPE_HBAR 1 -#define RECTANGLE_TYPE_VBAR 2 - -static void draw_line(struct RastPort *rp, int xa, int ya, int xb, int yb) -{ - Move(rp,xa,ya); - Draw(rp,xb,yb); -} - - -IPTR Rectangle__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct Rectangle_DATA *data; - struct TagItem *tags,*tag; - - obj = (Object *)DoSuperNewTags(cl, obj, NULL, - MUIA_Font, MUIV_Font_Title, - TAG_MORE, (IPTR) msg->ops_AttrList); - - if (!obj) - return 0; - - /* Initial local instance data */ - data = INST_DATA(cl, obj); - - data->Type = RECTANGLE_TYPE_NORMAL; - - /* parse initial taglist */ - - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) - { - switch (tag->ti_Tag) - { - case MUIA_Rectangle_BarTitle: - data->BarTitle = StrDup((STRPTR)tag->ti_Data); - break; - case MUIA_Rectangle_HBar: - data->Type = RECTANGLE_TYPE_HBAR; - break; - case MUIA_Rectangle_VBar: - data->Type = RECTANGLE_TYPE_VBAR; - break; - } - } - - D(bug("muimaster.library/rectangle.c: New Rectangle Object at 0x%lx\n",obj)); - - return (IPTR)obj; -} - -IPTR Rectangle__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) -{ - struct Rectangle_DATA *data = INST_DATA(cl, obj); - - if (data->BarTitle) mui_free(data->BarTitle); - - return DoSuperMethodA(cl, obj, msg); -} - - -IPTR Rectangle__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) -{ -/*----------------------------------------------------------------------------*/ -/* small macro to simplify return value storage */ -/*----------------------------------------------------------------------------*/ -#define STORE *(msg->opg_Storage) - - struct Rectangle_DATA *data = INST_DATA(cl, obj); - - switch(msg->opg_AttrID) - { - case MUIA_Version: - STORE = __version; - return TRUE; - - case MUIA_Revision: - STORE = __revision; - return TRUE; - - case MUIA_Rectangle_BarTitle: - STORE = (IPTR)data->BarTitle; - return TRUE; - - case MUIA_Rectangle_HBar: - STORE = (data->Type == RECTANGLE_TYPE_HBAR); - return TRUE; - - case MUIA_Rectangle_VBar: - STORE = (data->Type == RECTANGLE_TYPE_VBAR); - return TRUE; - } - -/* our handler didn't understand the attribute, we simply pass -** it to our superclass now -*/ - return DoSuperMethodA(cl, obj, (Msg) msg); -#undef STORE -} - -IPTR Rectangle__MUIM_Setup(struct IClass *cl, Object *obj, struct MUIP_Setup *msg) -{ - struct Rectangle_DATA *data = INST_DATA(cl, obj); - - if (!(DoSuperMethodA(cl, obj, (Msg) msg))) - return FALSE; - - if (data->BarTitle) - { - data->ztext = zune_text_new(NULL, data->BarTitle, - ZTEXT_ARG_NONE, 0); - } - - return TRUE; -} - -IPTR Rectangle__MUIM_Cleanup(struct IClass *cl, Object *obj, struct MUIP_Cleanup *msg) -{ - struct Rectangle_DATA *data = INST_DATA(cl, obj); - - if (data->ztext) - zune_text_destroy(data->ztext); - - return DoSuperMethodA(cl, obj, (Msg) msg); -} - -/************************************************************************** - MUIM_AskMinMax - - AskMinMax method will be called before the window is opened - and before layout takes place. We need to tell MUI the - minimum, maximum and default size of our object. -**************************************************************************/ -IPTR Rectangle__MUIM_AskMinMax(struct IClass *cl, Object *obj, struct MUIP_AskMinMax *msg) -{ - struct Rectangle_DATA *data = INST_DATA(cl, obj); - - /* - ** let our superclass first fill in what it thinks about sizes. - ** this will e.g. add the size of frame and inner spacing. - */ - DoSuperMethodA(cl, obj, (Msg)msg); - - /* - ** now add the values specific to our object. note that we - ** indeed need to *add* these values, not just set them! - */ - - if (!data->BarTitle) - { -/* msg->MinMaxInfo->MinWidth += 1; */ -/* msg->MinMaxInfo->MinHeight += 1; */ - if (data->Type == RECTANGLE_TYPE_HBAR) - { - msg->MinMaxInfo->MinHeight += 2; - } - else if (data->Type == RECTANGLE_TYPE_VBAR) - { - msg->MinMaxInfo->MinWidth += 2; - } - } - else - { - zune_text_get_bounds(data->ztext, obj); - msg->MinMaxInfo->MinWidth += data->ztext->width; - msg->MinMaxInfo->MinHeight += data->ztext->height; - D(bug("rect: minheight %ld\n",data->ztext->height)); - if (muiGlobalInfo(obj)->mgi_Prefs->group_title_color == GROUP_TITLE_COLOR_3D) - { - msg->MinMaxInfo->MinWidth += 1; - msg->MinMaxInfo->MinHeight += 1; - } - } - - msg->MinMaxInfo->DefWidth = msg->MinMaxInfo->MinWidth; - msg->MinMaxInfo->DefHeight = msg->MinMaxInfo->MinHeight; - - msg->MinMaxInfo->MaxWidth = MUI_MAXMAX; - msg->MinMaxInfo->MaxHeight = MUI_MAXMAX; - - return TRUE; -} - - -/************************************************************************** - MUIM_Draw - - Draw method is called whenever MUI feels we should render - our object. This usually happens after layout is finished - or when we need to refresh in a simplerefresh window. - Note: You may only render within the rectangle - _mleft(obj), _mtop(obj), _mwidth(obj), _mheight(obj). -**************************************************************************/ -IPTR Rectangle__MUIM_Draw(struct IClass *cl, Object *obj, struct MUIP_Draw *msg) -{ - struct Rectangle_DATA *data = INST_DATA(cl, obj); - - /* - ** let our superclass draw itself first, area class would - ** e.g. draw the frame and clear the whole region. What - ** it does exactly depends on msg->flags. - */ - - DoSuperMethodA(cl, obj, (Msg)msg); - - /* - ** if MADF_DRAWOBJECT isn't set, we shouldn't draw anything. - ** MUI just wanted to update the frame or something like that. - */ - - if (!(msg->flags & MADF_DRAWOBJECT)) - return 0; - - -D(bug("Draw Rectangle(0x%lx) %ldx%ldx%ldx%ld mw=%ld mh=%ld\n",obj,_left(obj),_top(obj),_right(obj),_bottom(obj), _mwidth(obj), _mheight(obj))); - - if (_mwidth(obj) < 1 || _mheight(obj) < 1) - return TRUE; - - /* - * ok, everything ready to render... - */ - if (data->BarTitle) - { - /* - * Rewrite me, I'm ugly ! (but right :) - */ - int tw; - int th; - int x1; - int x2; - int yt; - - /* D(bug("muimaster.library/rectangle.c: Draw Rectangle Object at 0x%lx %ldx%ldx%ldx%ld\n mw=%ld mh=%ld\n",obj,_left(obj),_top(obj),_right(obj),_bottom(obj), _mwidth(obj), _mheight(obj))); */ - - SetAPen(_rp(obj), _pens(obj)[MPEN_SHADOW]); - if (muiGlobalInfo(obj)->mgi_Prefs->group_title_color == GROUP_TITLE_COLOR_3D) - { - tw = data->ztext->width + 1; - th = data->ztext->height + 1; - x1 = _mleft(obj) + (_mwidth(obj) - tw) / 2; - x1 -= 1; - x2 = x1 + tw; - yt = _mtop(obj) + (_mheight(obj) - th) / 2; - zune_text_draw(data->ztext, obj, x1 + 1, x2, yt + 1); - SetAPen(_rp(obj), _pens(obj)[MPEN_SHINE]); - zune_text_draw(data->ztext, obj, x1, x2 - 1, yt); - - if (data->Type == RECTANGLE_TYPE_HBAR) - { - int y = yt + data->ztext->height / 2; - - if ((x1 - 2) > _mleft(obj) - && (x2 + 2) < _mright(obj)) - { - SetAPen(_rp(obj), _pens(obj)[MPEN_SHADOW]); - draw_line(_rp(obj), _mleft(obj), y, x1 - 2, y); - draw_line(_rp(obj), x2 + 3, y, _mright(obj), y); - - SetAPen(_rp(obj), _pens(obj)[MPEN_SHINE]); - draw_line(_rp(obj), _mleft(obj), y+1, x1 - 2, y+1); - draw_line(_rp(obj), x2 + 3, y+1, _mright(obj), y+1); - } - } - } - else /* black or white */ - { - if (muiGlobalInfo(obj)->mgi_Prefs->group_title_color == GROUP_TITLE_COLOR_HILITE) - SetAPen(_rp(obj), _pens(obj)[MPEN_SHINE]); - - tw = data->ztext->width; - th = data->ztext->height; - x1 = _mleft(obj) + (_mwidth(obj) - tw) / 2; - x2 = x1 + tw; - yt = _mtop(obj) + (_mheight(obj) - th) / 2; - - zune_text_draw(data->ztext, obj, x1, x2 - 1, yt); - - if (data->Type == RECTANGLE_TYPE_HBAR) - { - int y = yt + data->ztext->height / 2; - - if ((x1 - 2) > _mleft(obj) - && (x2 + 2) < _mright(obj)) - { - SetAPen(_rp(obj), _pens(obj)[MPEN_SHADOW]); - draw_line(_rp(obj), _mleft(obj), y, x1 - 3, y); - draw_line(_rp(obj), x2 + 2, y, _mright(obj), y); - - SetAPen(_rp(obj), _pens(obj)[MPEN_SHINE]); - draw_line(_rp(obj), _mleft(obj), y+1, x1 - 3, y+1); - draw_line(_rp(obj), x2 + 2, y+1, _mright(obj), y+1); - } - } - } - } - else /* no bar title */ - { - if (data->Type == RECTANGLE_TYPE_HBAR) - { - int y = _mtop(obj) + _mheight(obj) / 2 - 1; - - SetAPen(_rp(obj), _pens(obj)[MPEN_SHADOW]); - draw_line(_rp(obj), _mleft(obj), y, _mright(obj), y); - - SetAPen(_rp(obj), _pens(obj)[MPEN_SHINE]); - draw_line(_rp(obj), _mleft(obj), y+1, _mright(obj), y+1); - } - else if (data->Type == RECTANGLE_TYPE_VBAR) - { - int x = _mleft(obj) + _mwidth(obj) / 2 - 1; - - SetAPen(_rp(obj), _pens(obj)[MPEN_SHADOW]); - draw_line(_rp(obj), x, _mtop(obj), x, _mbottom(obj)); - - SetAPen(_rp(obj), _pens(obj)[MPEN_SHINE]); - draw_line(_rp(obj), x+1, _mtop(obj), x+1, _mbottom(obj)); - } - else - { -#ifdef MYDEBUG - WORD pnts[] = { _mleft(obj), _mtop(obj), _mleft(obj), _mbottom(obj), - _mright(obj), _mbottom(obj), _mright(obj), _mtop(obj) }; - SetAPen(_rp(obj), _pens(obj)[MPEN_SHADOW]); - Move(_rp(obj), _mright(obj), _mtop(obj)); - PolyDraw(_rp(obj), 4, pnts); -#endif - } - } - return TRUE; -} - - -BOOPSI_DISPATCHER(IPTR, Rectangle_Dispatcher, cl, obj, msg) -{ - switch (msg->MethodID) - { - case OM_NEW: return Rectangle__OM_NEW(cl, obj, (struct opSet *) msg); - case OM_DISPOSE: return Rectangle__OM_DISPOSE(cl, obj, msg); - case OM_GET: return Rectangle__OM_GET(cl, obj, (struct opGet *)msg); - case MUIM_Setup: return Rectangle__MUIM_Setup(cl, obj, (APTR)msg); - case MUIM_Cleanup: return Rectangle__MUIM_Cleanup(cl, obj, (APTR)msg); - case MUIM_AskMinMax: return Rectangle__MUIM_AskMinMax(cl, obj, (APTR)msg); - case MUIM_Draw: return Rectangle__MUIM_Draw(cl, obj, (APTR)msg); - default: return DoSuperMethodA(cl, obj, msg); - } -} -BOOPSI_DISPATCHER_END - -const struct __MUIBuiltinClass _MUI_Rectangle_desc = -{ - MUIC_Rectangle, - MUIC_Area, - sizeof(struct Rectangle_DATA), - (void*)Rectangle_Dispatcher -}; +/* + Copyright © 1999, David Le Corfec. + Copyright © 2002-2006, The AROS Development Team. + All rights reserved. + + $Id$ +*/ + +#include <string.h> + +#include <exec/types.h> + +#include <clib/alib_protos.h> +#include <proto/intuition.h> +#include <proto/graphics.h> +#include <proto/utility.h> +#include <proto/exec.h> +#include <proto/muimaster.h> + +#include "mui.h" +#include "muimaster_intern.h" +#include "support.h" +#include "textengine.h" +#include "prefs.h" + +/* #define MYDEBUG 1 */ +#include "debug.h" + +extern struct Library *MUIMasterBase; + +static const int __version = 1; +static const int __revision = 1; + +struct Rectangle_DATA +{ + STRPTR BarTitle; + ULONG Type; + ZText *ztext; +}; + +#define RECTANGLE_TYPE_NORMAL 0 +#define RECTANGLE_TYPE_HBAR 1 +#define RECTANGLE_TYPE_VBAR 2 + +static void draw_line(struct RastPort *rp, int xa, int ya, int xb, int yb) +{ + Move(rp, xa, ya); + Draw(rp, xb, yb); +} + + +IPTR Rectangle__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) +{ + struct Rectangle_DATA *data; + struct TagItem *tags, *tag; + + obj = (Object *) DoSuperNewTags(cl, obj, NULL, + MUIA_Font, MUIV_Font_Title, TAG_MORE, (IPTR) msg->ops_AttrList); + + if (!obj) + return 0; + + /* Initial local instance data */ + data = INST_DATA(cl, obj); + + data->Type = RECTANGLE_TYPE_NORMAL; + + /* parse initial taglist */ + + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) + { + switch (tag->ti_Tag) + { + case MUIA_Rectangle_BarTitle: + data->BarTitle = StrDup((STRPTR) tag->ti_Data); + break; + case MUIA_Rectangle_HBar: + data->Type = RECTANGLE_TYPE_HBAR; + break; + case MUIA_Rectangle_VBar: + data->Type = RECTANGLE_TYPE_VBAR; + break; + } + } + + D(bug("muimaster.library/rectangle.c: New Rectangle Object at 0x%lx\n", + obj)); + + return (IPTR) obj; +} + +IPTR Rectangle__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) +{ + struct Rectangle_DATA *data = INST_DATA(cl, obj); + + if (data->BarTitle) + mui_free(data->BarTitle); + + return DoSuperMethodA(cl, obj, msg); +} + + +IPTR Rectangle__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) +{ +/*---------------------------------------------------------------------------*/ +/* small macro to simplify return value storage */ +/*---------------------------------------------------------------------------*/ +#define STORE *(msg->opg_Storage) + + struct Rectangle_DATA *data = INST_DATA(cl, obj); + + switch (msg->opg_AttrID) + { + case MUIA_Version: + STORE = __version; + return TRUE; + + case MUIA_Revision: + STORE = __revision; + return TRUE; + + case MUIA_Rectangle_BarTitle: + STORE = (IPTR) data->BarTitle; + return TRUE; + + case MUIA_Rectangle_HBar: + STORE = (data->Type == RECTANGLE_TYPE_HBAR); + return TRUE; + + case MUIA_Rectangle_VBar: + STORE = (data->Type == RECTANGLE_TYPE_VBAR); + return TRUE; + } + +/* our handler didn't understand the attribute, we simply pass +** it to our superclass now +*/ + return DoSuperMethodA(cl, obj, (Msg) msg); +#undef STORE +} + +IPTR Rectangle__MUIM_Setup(struct IClass *cl, Object *obj, + struct MUIP_Setup *msg) +{ + struct Rectangle_DATA *data = INST_DATA(cl, obj); + + if (!(DoSuperMethodA(cl, obj, (Msg) msg))) + return FALSE; + + if (data->BarTitle) + { + data->ztext = zune_text_new(NULL, data->BarTitle, + ZTEXT_ARG_NONE, 0); + } + + return TRUE; +} + +IPTR Rectangle__MUIM_Cleanup(struct IClass *cl, Object *obj, + struct MUIP_Cleanup *msg) +{ + struct Rectangle_DATA *data = INST_DATA(cl, obj); + + if (data->ztext) + zune_text_destroy(data->ztext); + + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +/************************************************************************** + MUIM_AskMinMax + + AskMinMax method will be called before the window is opened + and before layout takes place. We need to tell MUI the + minimum, maximum and default size of our object. +**************************************************************************/ +IPTR Rectangle__MUIM_AskMinMax(struct IClass *cl, Object *obj, + struct MUIP_AskMinMax *msg) +{ + struct Rectangle_DATA *data = INST_DATA(cl, obj); + + /* + ** let our superclass first fill in what it thinks about sizes. + ** this will e.g. add the size of frame and inner spacing. + */ + DoSuperMethodA(cl, obj, (Msg) msg); + + /* + ** now add the values specific to our object. note that we + ** indeed need to *add* these values, not just set them! + */ + + if (!data->BarTitle) + { +/* msg->MinMaxInfo->MinWidth += 1; */ +/* msg->MinMaxInfo->MinHeight += 1; */ + if (data->Type == RECTANGLE_TYPE_HBAR) + { + msg->MinMaxInfo->MinHeight += 2; + } + else if (data->Type == RECTANGLE_TYPE_VBAR) + { + msg->MinMaxInfo->MinWidth += 2; + } + } + else + { + zune_text_get_bounds(data->ztext, obj); + msg->MinMaxInfo->MinWidth += data->ztext->width; + msg->MinMaxInfo->MinHeight += data->ztext->height; + D(bug("rect: minheight %ld\n", data->ztext->height)); + if (muiGlobalInfo(obj)->mgi_Prefs->group_title_color == + GROUP_TITLE_COLOR_3D) + { + msg->MinMaxInfo->MinWidth += 1; + msg->MinMaxInfo->MinHeight += 1; + } + } + + msg->MinMaxInfo->DefWidth = msg->MinMaxInfo->MinWidth; + msg->MinMaxInfo->DefHeight = msg->MinMaxInfo->MinHeight; + + msg->MinMaxInfo->MaxWidth = MUI_MAXMAX; + msg->MinMaxInfo->MaxHeight = MUI_MAXMAX; + + return TRUE; +} + + +/************************************************************************** + MUIM_Draw + + Draw method is called whenever MUI feels we should render + our object. This usually happens after layout is finished + or when we need to refresh in a simplerefresh window. + Note: You may only render within the rectangle + _mleft(obj), _mtop(obj), _mwidth(obj), _mheight(obj). +**************************************************************************/ +IPTR Rectangle__MUIM_Draw(struct IClass *cl, Object *obj, + struct MUIP_Draw *msg) +{ + struct Rectangle_DATA *data = INST_DATA(cl, obj); + + /* + ** let our superclass draw itself first, area class would + ** e.g. draw the frame and clear the whole region. What + ** it does exactly depends on msg->flags. + */ + + DoSuperMethodA(cl, obj, (Msg) msg); + + /* + ** if MADF_DRAWOBJECT isn't set, we shouldn't draw anything. + ** MUI just wanted to update the frame or something like that. + */ + + if (!(msg->flags & MADF_DRAWOBJECT)) + return 0; + + + D(bug("Draw Rectangle(0x%lx) %ldx%ldx%ldx%ld mw=%ld mh=%ld\n", obj, + _left(obj), _top(obj), _right(obj), _bottom(obj), _mwidth(obj), + _mheight(obj))); + + if (_mwidth(obj) < 1 || _mheight(obj) < 1) + return TRUE; + + /* + * ok, everything ready to render... + */ + if (data->BarTitle) + { + /* + * Rewrite me, I'm ugly ! (but right :) + */ + int tw; + int th; + int x1; + int x2; + int yt; + + /* D(bug("muimaster.library/rectangle.c: Draw Rectangle Object " + "at 0x%lx %ldx%ldx%ldx%ld\n mw=%ld mh=%ld\n", + obj, _left(obj), _top(obj), _right(obj), _bottom(obj), + _mwidth(obj), _mheight(obj))); */ + + SetAPen(_rp(obj), _pens(obj)[MPEN_SHADOW]); + if (muiGlobalInfo(obj)->mgi_Prefs->group_title_color == + GROUP_TITLE_COLOR_3D) + { + tw = data->ztext->width + 1; + th = data->ztext->height + 1; + x1 = _mleft(obj) + (_mwidth(obj) - tw) / 2; + x1 -= 1; + x2 = x1 + tw; + yt = _mtop(obj) + (_mheight(obj) - th) / 2; + zune_text_draw(data->ztext, obj, x1 + 1, x2, yt + 1); + SetAPen(_rp(obj), _pens(obj)[MPEN_SHINE]); + zune_text_draw(data->ztext, obj, x1, x2 - 1, yt); + + if (data->Type == RECTANGLE_TYPE_HBAR) + { + int y = yt + data->ztext->height / 2; + + if ((x1 - 2) > _mleft(obj) && (x2 + 2) < _mright(obj)) + { + SetAPen(_rp(obj), _pens(obj)[MPEN_SHADOW]); + draw_line(_rp(obj), _mleft(obj), y, x1 - 2, y); + draw_line(_rp(obj), x2 + 3, y, _mright(obj), y); + + SetAPen(_rp(obj), _pens(obj)[MPEN_SHINE]); + draw_line(_rp(obj), _mleft(obj), y + 1, x1 - 2, y + 1); + draw_line(_rp(obj), x2 + 3, y + 1, _mright(obj), y + 1); + } + } + } + else /* black or white */ + { + if (muiGlobalInfo(obj)->mgi_Prefs->group_title_color == + GROUP_TITLE_COLOR_HILITE) + SetAPen(_rp(obj), _pens(obj)[MPEN_SHINE]); + + tw = data->ztext->width; + th = data->ztext->height; + x1 = _mleft(obj) + (_mwidth(obj) - tw) / 2; + x2 = x1 + tw; + yt = _mtop(obj) + (_mheight(obj) - th) / 2; + + zune_text_draw(data->ztext, obj, x1, x2 - 1, yt); + + if (data->Type == RECTANGLE_TYPE_HBAR) + { + int y = yt + data->ztext->height / 2; + + if ((x1 - 2) > _mleft(obj) && (x2 + 2) < _mright(obj)) + { + SetAPen(_rp(obj), _pens(obj)[MPEN_SHADOW]); + draw_line(_rp(obj), _mleft(obj), y, x1 - 3, y); + draw_line(_rp(obj), x2 + 2, y, _mright(obj), y); + + SetAPen(_rp(obj), _pens(obj)[MPEN_SHINE]); + draw_line(_rp(obj), _mleft(obj), y + 1, x1 - 3, y + 1); + draw_line(_rp(obj), x2 + 2, y + 1, _mright(obj), y + 1); + } + } + } + } + else /* no bar title */ + { + if (data->Type == RECTANGLE_TYPE_HBAR) + { + int y = _mtop(obj) + _mheight(obj) / 2 - 1; + + SetAPen(_rp(obj), _pens(obj)[MPEN_SHADOW]); + draw_line(_rp(obj), _mleft(obj), y, _mright(obj), y); + + SetAPen(_rp(obj), _pens(obj)[MPEN_SHINE]); + draw_line(_rp(obj), _mleft(obj), y + 1, _mright(obj), y + 1); + } + else if (data->Type == RECTANGLE_TYPE_VBAR) + { + int x = _mleft(obj) + _mwidth(obj) / 2 - 1; + + SetAPen(_rp(obj), _pens(obj)[MPEN_SHADOW]); + draw_line(_rp(obj), x, _mtop(obj), x, _mbottom(obj)); + + SetAPen(_rp(obj), _pens(obj)[MPEN_SHINE]); + draw_line(_rp(obj), x + 1, _mtop(obj), x + 1, _mbottom(obj)); + } + else + { +#ifdef MYDEBUG + WORD pnts[] = + { _mleft(obj), _mtop(obj), _mleft(obj), _mbottom(obj), + _mright(obj), _mbottom(obj), _mright(obj), _mtop(obj) + }; + SetAPen(_rp(obj), _pens(obj)[MPEN_SHADOW]); + Move(_rp(obj), _mright(obj), _mtop(obj)); + PolyDraw(_rp(obj), 4, pnts); +#endif + } + } + return TRUE; +} + + +BOOPSI_DISPATCHER(IPTR, Rectangle_Dispatcher, cl, obj, msg) +{ + switch (msg->MethodID) + { + case OM_NEW: + return Rectangle__OM_NEW(cl, obj, (struct opSet *)msg); + case OM_DISPOSE: + return Rectangle__OM_DISPOSE(cl, obj, msg); + case OM_GET: + return Rectangle__OM_GET(cl, obj, (struct opGet *)msg); + case MUIM_Setup: + return Rectangle__MUIM_Setup(cl, obj, (APTR) msg); + case MUIM_Cleanup: + return Rectangle__MUIM_Cleanup(cl, obj, (APTR) msg); + case MUIM_AskMinMax: + return Rectangle__MUIM_AskMinMax(cl, obj, (APTR) msg); + case MUIM_Draw: + return Rectangle__MUIM_Draw(cl, obj, (APTR) msg); + default: + return DoSuperMethodA(cl, obj, msg); + } +} +BOOPSI_DISPATCHER_END + +const struct __MUIBuiltinClass _MUI_Rectangle_desc = +{ + MUIC_Rectangle, + MUIC_Area, + sizeof(struct Rectangle_DATA), + (void *) Rectangle_Dispatcher +}; diff --git a/workbench/libs/muimaster/classes/rectangle.h b/workbench/libs/muimaster/classes/rectangle.h index 3e3ea8bd7f..a59dce8e3c 100644 --- a/workbench/libs/muimaster/classes/rectangle.h +++ b/workbench/libs/muimaster/classes/rectangle.h @@ -13,13 +13,13 @@ #define MUIC_Rectangle "Rectangle.mui" /*** Identifier base (for Zune extensions) **********************************/ -#define MUIB_Rectangle (MUIB_ZUNE | 0x00002b00) +#define MUIB_Rectangle (MUIB_ZUNE | 0x00002b00) /*** Attributes *************************************************************/ -#define MUIA_Rectangle_BarTitle (MUIB_MUI|0x00426689) /* V11 i.g STRPTR */ -#define MUIA_Rectangle_HBar (MUIB_MUI|0x0042c943) /* V7 i.g BOOL */ -#define MUIA_Rectangle_VBar (MUIB_MUI|0x00422204) /* V7 i.g BOOL */ +#define MUIA_Rectangle_BarTitle (MUIB_MUI | 0x00426689) /* V11 i.g STRPTR */ +#define MUIA_Rectangle_HBar (MUIB_MUI | 0x0042c943) /* V7 i.g BOOL */ +#define MUIA_Rectangle_VBar (MUIB_MUI | 0x00422204) /* V7 i.g BOOL */ -extern const struct __MUIBuiltinClass _MUI_Rectangle_desc; /* PRIV */ +extern const struct __MUIBuiltinClass _MUI_Rectangle_desc; /* PRIV */ #endif /* _MUI_CLASSES_RECTANGLE_H */ diff --git a/workbench/libs/muimaster/classes/register.c b/workbench/libs/muimaster/classes/register.c dissimilarity index 65% index 6cdc323dab..004caa4652 100644 --- a/workbench/libs/muimaster/classes/register.c +++ b/workbench/libs/muimaster/classes/register.c @@ -1,735 +1,813 @@ -/* - Copyright © 2002-2011, The AROS Development Team. All rights reserved. - $Id$ -*/ - -#include <string.h> -#include <exec/memory.h> -#include <intuition/icclass.h> -#include <intuition/gadgetclass.h> -#include <intuition/imageclass.h> -#include <clib/alib_protos.h> -#include <proto/exec.h> -#include <proto/intuition.h> -#include <proto/utility.h> -#include <proto/graphics.h> -#include <proto/muimaster.h> - -#include "mui.h" -#include "muimaster_intern.h" -#include "support.h" -#include "prefs.h" -#include "font.h" - -/* #define MYDEBUG 1 */ -#include "debug.h" - -extern struct Library *MUIMasterBase; - -#define INTERTAB 4 -#define TEXTSPACING 4 -#define REGISTERTAB_EXTRA_HEIGHT 7 -#define REGISTER_FRAMEX 7 -#define REGISTER_FRAMEBOTTOM 5 -#define REGISTER_FRAMETOP 4 - -struct RegisterTabItem -{ - STRPTR text; /* strlen(text) - valide between new/delete */ - WORD textlen; /* strlen(text) - valide between setup/cleanup */ - WORD x1, x2; /* tab x input sensitive interval, relative to object's origin - valid between show/hide */ - WORD y1, y2; /* tab y input sensitive interval - valid between setup/cleanup */ -}; - -struct Register_DATA -{ - struct MUI_EventHandlerNode ehn; - struct RegisterTabItem *items; - char **labels; - BOOL frame; - WORD active; - WORD numitems; - WORD oldactive; - WORD left; - WORD top; - WORD min_width; /* object min width required */ - WORD def_width; /* object def width required */ - WORD tab_height; /* title height */ - WORD framewidth; - WORD frameheight; - WORD fontw; - WORD fonth; - WORD fontb; - WORD total_hspacing; - WORD ty; /* text y origin - valid between setup/cleanup */ - WORD columns; /* Number of register columns */ - WORD rows; /* Number of register rows */ -}; - - -/************************************************************************** - Layout Tab Items -**************************************************************************/ -static void LayoutTabItems(Object *obj, struct Register_DATA *data) -{ - WORD extra_space; - WORD fitwidth; - WORD x = 0; - WORD y = - data->tab_height; - WORD item_width; /* from vertical line left to v l right */ - int i; - int tabs_on_bottom = 0; - - item_width = (_width(obj) - data->total_hspacing) / data->columns;//data->numitems; - extra_space = (_width(obj) - data->total_hspacing) % data->columns;//data->numitems; - - D(bug("LayoutTabItems(%lx) : width = %d, mwidth = %d, max item width = %d, remainder = %d\n", - obj, _width(obj), _mwidth(obj), item_width, extra_space)); - - for (i = 0; i < data->numitems; i++) - { - struct RegisterTabItem *ri = &data->items[i]; - - if (i % data->columns == 0) - { - x = INTERTAB - 1; - if (i > data->active && !tabs_on_bottom) - { - y = _height(obj) - muiAreaData(obj)->mad_InnerBottom; - tabs_on_bottom = 1; - } else y += data->tab_height; - } - - ri->x1 = x; - ri->x2 = ri->x1 + item_width - 1; - if (extra_space > 0) - { - ri->x2++; - extra_space--; - } - fitwidth = ri->x2 - ri->x1 + 1 - TEXTSPACING; - x += fitwidth + TEXTSPACING + INTERTAB; - - ri->y1 = y; - ri->y2 = y + data->tab_height - 1; - } -} - -/************************************************************************** - Render one item -**************************************************************************/ -static void RenderRegisterTabItem(struct IClass *cl, Object *obj, WORD item) -{ - struct Register_DATA *data = INST_DATA(cl, obj); - struct RegisterTabItem *ri = &data->items[item]; - struct TextExtent extent; - WORD fitlen; /* text len fitting in alloted space */ - WORD fitpix; /* text pixels fitting in alloted space */ - WORD x, y; - WORD top_item_bar_y; - WORD bottom_item_bar_y; - WORD left_item_bar_x; - WORD right_item_bar_x; - WORD item_bar_width; - WORD text_y; - WORD item_bg_height; - WORD fitwidth; - - if ((item < 0) || (item >= data->numitems)) return; - - y = data->top + ri->y1; - - if (data->active == item) - { - top_item_bar_y = _top(obj) + ri->y1; - bottom_item_bar_y = _top(obj) + ri->y2 - 2; - left_item_bar_x = _left(obj) + ri->x1 - 1; - right_item_bar_x = _left(obj) + ri->x2 + 1; - item_bg_height = data->tab_height; - text_y = y + data->ty; - item_bar_width = right_item_bar_x - left_item_bar_x + 1; - /* fill tab with register background */ - DoMethod(obj,MUIM_DrawBackground, left_item_bar_x, top_item_bar_y + 4, - item_bar_width, item_bg_height - 4, - left_item_bar_x, top_item_bar_y + 4, 0); - DoMethod(obj,MUIM_DrawBackground, left_item_bar_x + 2, top_item_bar_y + 2, - item_bar_width - (2 * 2), 2, - left_item_bar_x + 2, top_item_bar_y + 2, 0); - DoMethod(obj,MUIM_DrawBackground, left_item_bar_x + 4, top_item_bar_y + 1, - item_bar_width - (2 * 4), 1, - left_item_bar_x + 4, top_item_bar_y + 1, 0); - } - else - { - top_item_bar_y = _top(obj) + ri->y1 + 2; - bottom_item_bar_y = _top(obj) + ri->y2 - 1; - left_item_bar_x = _left(obj) + ri->x1; - right_item_bar_x = _left(obj) + ri->x2; - item_bg_height = data->tab_height - 3; - text_y = y + data->ty + 1; - item_bar_width = right_item_bar_x - left_item_bar_x + 1; - SetAPen(_rp(obj), _pens(obj)[MPEN_BACKGROUND]); - RectFill(_rp(obj), left_item_bar_x, top_item_bar_y + 4, - right_item_bar_x, bottom_item_bar_y); - RectFill(_rp(obj), left_item_bar_x + 2, top_item_bar_y + 2, - right_item_bar_x - 2, top_item_bar_y + 3); - RectFill(_rp(obj), left_item_bar_x + 4, top_item_bar_y + 1, - right_item_bar_x - 4, top_item_bar_y + 1); - } - - /* top horiz bar */ - SetAPen(_rp(obj), _pens(obj)[MPEN_SHINE]); - RectFill(_rp(obj), left_item_bar_x + 4, top_item_bar_y, right_item_bar_x - 4, top_item_bar_y); - /* left vert bar */ - RectFill(_rp(obj), left_item_bar_x, top_item_bar_y + 4, left_item_bar_x, bottom_item_bar_y); - WritePixel(_rp(obj), left_item_bar_x + 1, top_item_bar_y + 3); - WritePixel(_rp(obj), left_item_bar_x + 1, top_item_bar_y + 2); - WritePixel(_rp(obj), left_item_bar_x + 2, top_item_bar_y + 1); - WritePixel(_rp(obj), left_item_bar_x + 3, top_item_bar_y + 1); - SetAPen(_rp(obj), _pens(obj)[MPEN_HALFSHINE]); - WritePixel(_rp(obj), left_item_bar_x + 3, top_item_bar_y); - WritePixel(_rp(obj), left_item_bar_x + 4, top_item_bar_y + 1); - WritePixel(_rp(obj), left_item_bar_x + 2, top_item_bar_y + 2); - WritePixel(_rp(obj), left_item_bar_x + 3, top_item_bar_y + 2); - WritePixel(_rp(obj), left_item_bar_x + 2, top_item_bar_y + 3); - WritePixel(_rp(obj), left_item_bar_x, top_item_bar_y + 3); - WritePixel(_rp(obj), left_item_bar_x + 1, top_item_bar_y + 4); - - if (data->active == item) - { - /* bottom horiz bar */ - SetAPen(_rp(obj), _pens(obj)[MPEN_SHINE]); - WritePixel(_rp(obj), left_item_bar_x - 1, bottom_item_bar_y + 1); - SetAPen(_rp(obj), _pens(obj)[MPEN_SHADOW]); - WritePixel(_rp(obj), right_item_bar_x + 1, bottom_item_bar_y + 1); - DoMethod(obj,MUIM_DrawBackground, left_item_bar_x - 1, bottom_item_bar_y + 2, - item_bar_width + (2 * 1), 1, - left_item_bar_x - 1, bottom_item_bar_y + 2, 0); - - } - /* right vert bar */ - SetAPen(_rp(obj), _pens(obj)[MPEN_SHADOW]); - WritePixel(_rp(obj), right_item_bar_x - 1, top_item_bar_y + 2); - RectFill(_rp(obj), right_item_bar_x, top_item_bar_y + 4, right_item_bar_x, bottom_item_bar_y); - SetAPen(_rp(obj), _pens(obj)[MPEN_HALFSHADOW]); - WritePixel(_rp(obj), right_item_bar_x - 2, top_item_bar_y + 1); - WritePixel(_rp(obj), right_item_bar_x - 1, top_item_bar_y + 3); - WritePixel(_rp(obj), right_item_bar_x, top_item_bar_y + 3); - SetAPen(_rp(obj), _pens(obj)[MPEN_BACKGROUND]); - WritePixel(_rp(obj), right_item_bar_x - 3, top_item_bar_y + 1); - - /* text */ - fitwidth = item_bar_width - TEXTSPACING; - fitlen = TextFit(_rp(obj), ri->text, ri->textlen, &extent, NULL, 1, fitwidth, data->tab_height); - fitpix = extent.te_Width; -/* D(bug("extent for %s (len=%d) in %d pix = %d chars, %d pix [%x,%x,%x]\n", */ -/* ri->text, ri->textlen, fitwidth, fitlen, fitpix, _rp(obj), _rp(obj)->Font, _font(obj))); */ - x = left_item_bar_x + (item_bar_width - fitpix) / 2; - SetDrMd(_rp(obj), JAM1); - SetAPen(_rp(obj), _pens(obj)[MPEN_TEXT]); - Move(_rp(obj), x, text_y); - Text(_rp(obj), ri->text, fitlen); -} - -/************************************************************************** - Render tab bar -**************************************************************************/ -static void RenderRegisterTab(struct IClass *cl, Object *obj, ULONG flags) -{ - struct Register_DATA *data = INST_DATA(cl, obj); - -/* - * Erase / prepare for drawing - */ - if (flags & MADF_DRAWOBJECT) - { - DoMethod(obj, MUIM_DrawParentBackground, data->left, data->top, - data->framewidth, data->tab_height - 1, data->left, data->top, 0); - } - else - { - /* draw parent bg over oldactive */ - IPTR method; - WORD old_left, old_top, old_width, old_height; - struct RegisterTabItem *ri = &data->items[data->oldactive]; - if (data->oldactive >= data->columns) method = MUIM_DrawBackground; - else method = MUIM_DrawParentBackground; - - old_left = _left(obj) + ri->x1 - 2; - old_top = _top(obj) + ri->y1; - old_width = ri->x2 - ri->x1 + 5; - old_height = data->tab_height - 1; - DoMethod(obj, method, old_left, old_top, - old_width, old_height, old_left, old_top, 0); - SetDrMd(_rp(obj), JAM1); - SetAPen(_rp(obj), _pens(obj)[MPEN_SHINE]); - RectFill(_rp(obj), old_left, old_top + old_height, old_left + old_width, old_top + old_height); - } - - SetDrMd(_rp(obj), JAM1); - SetAPen(_rp(obj), _pens(obj)[MPEN_SHINE]); - SetFont(_rp(obj), _font(obj)); - SetSoftStyle(_rp(obj), FS_NORMAL, AskSoftStyle(_rp(obj))); - - -/* - * Draw new graphics - */ - /* register frame */ - if (flags & MADF_DRAWOBJECT || (data->active / data->columns != data->oldactive / data->columns)) - { - int i,y,tabs_on_bottom = 0; - - SetAPen(_rp(obj), _pens(obj)[MPEN_SHINE]); - - RectFill(_rp(obj), data->left, - data->top + data->tab_height - 1, - data->left, - data->top + data->tab_height + data->frameheight - 1); - - y = data->top + data->tab_height - 1; - - for (i=0;i<data->rows;i++) - { - if (!tabs_on_bottom && (i > data->active/data->columns)) - { - y = _bottom(obj) - muiAreaData(obj)->mad_InnerBottom + data->tab_height; - tabs_on_bottom = 1; - } - - RectFill(_rp(obj), data->left + 1, y, data->left + data->framewidth - 2, y); - y += data->tab_height; - } - - SetAPen(_rp(obj), _pens(obj)[MPEN_SHADOW]); - - RectFill(_rp(obj), data->left + data->framewidth - 1, - data->top + data->tab_height - 1, - data->left + data->framewidth - 1, - data->top + data->tab_height + data->frameheight - 1); - - RectFill(_rp(obj), data->left + 1, - data->top + data->tab_height + data->frameheight - 1, - data->left + data->framewidth - 2, - data->top + data->tab_height + data->frameheight - 1); - for(i = 0; i < data->numitems; i++) - { - RenderRegisterTabItem(cl, obj, i); - } - } - else - { - /* If active register has been changed and is on same row we simply draw both registers only */ - RenderRegisterTabItem(cl, obj, data->active); - RenderRegisterTabItem(cl, obj, data->oldactive); - } - -} - -/************************************************************************** - Set the coordinates -**************************************************************************/ -static void SetHardCoord(Object *obj, struct Register_DATA *data) -{ - struct MUI_AreaData *adata = muiAreaData(obj); - const struct MUI_FrameSpec_intern *frame; - - //adata->mad_InnerLeft = REGISTER_FRAMEX; - //adata->mad_InnerTop = data->tab_height * (1 + data->active/data->columns) + REGISTER_FRAMETOP; - //adata->mad_InnerRight = REGISTER_FRAMEX; - //adata->mad_InnerBottom = data->tab_height * (data->rows - 1 - data->active/data->columns) + REGISTER_FRAMEBOTTOM; - - frame = &muiGlobalInfo(obj)->mgi_Prefs->frames[MUIV_Frame_Group]; - - adata->mad_InnerLeft = frame->innerLeft + 1; - adata->mad_InnerTop = data->tab_height * (1 + data->active/data->columns) - + frame->innerTop; - adata->mad_InnerRight = frame->innerRight + 1; - adata->mad_InnerBottom = - data->tab_height * (data->rows - 1 - data->active/data->columns) - + frame->innerBottom + 1; -/* D(bug("Hardcoord %p top=%ld bottom=%ld\n", obj, adata->mad_HardITop, adata->mad_HardIBottom)); */ -} - -IPTR Register__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct Register_DATA *data; - int i; - IPTR tmp = 0; - - obj = (Object *)DoSuperNewTags(cl, obj, NULL, MUIA_Group_PageMode, TRUE, - MUIA_Background, MUII_RegisterBack, - TAG_MORE, (IPTR) msg->ops_AttrList); - if (!obj) return (IPTR)NULL; - - data = INST_DATA(cl, obj); - - data->frame = GetTagData(MUIA_Register_Frame, 0, msg->ops_AttrList); - - data->labels = (char**)GetTagData(MUIA_Register_Titles, 0, msg->ops_AttrList); - - if (!data->labels) - { - CoerceMethod(cl, obj, OM_DISPOSE); - return (IPTR)NULL; - } - - for(data->numitems = 0; data->labels[data->numitems]; data->numitems++) - ; - - if (data->numitems <= 0) - { - CoerceMethod(cl, obj, OM_DISPOSE); - return (IPTR)NULL; - } - - data->columns = (WORD)GetTagData(MUIA_Register_Columns, data->numitems, msg->ops_AttrList); - if (data->columns <= 0) data->columns = 1; - data->rows = (data->numitems + data->columns - 1)/data->columns; - - get(obj, MUIA_Group_ActivePage, &tmp); - data->active = (WORD)tmp; - - if (data->active < 0 || data->active >= data->numitems) - { - data->active = 0; - } - data->oldactive = data->active; - - data->items = (struct RegisterTabItem *)AllocVec(data->numitems * sizeof(struct RegisterTabItem), - MEMF_PUBLIC | MEMF_CLEAR); - - if (!data->items) - { - CoerceMethod(cl, obj, OM_DISPOSE); - return (IPTR)NULL; - } - - for(i = 0; i < data->numitems; i++) - { - data->items[i].text = data->labels[i]; - } - - data->ehn.ehn_Events = IDCMP_MOUSEBUTTONS | IDCMP_RAWKEY; - data->ehn.ehn_Priority = 0; - data->ehn.ehn_Flags = 0; - data->ehn.ehn_Object = obj; - data->ehn.ehn_Class = cl; - - return (IPTR)obj; -} - - -IPTR Register__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) -{ - struct Register_DATA *data = INST_DATA(cl, obj); - - #define STORE *(msg->opg_Storage) - - switch(msg->opg_AttrID) - { - case MUIA_Register_Frame: - STORE = (IPTR)data->frame; - return 1; - - case MUIA_Register_Titles: - STORE = (IPTR)data->labels; - return 1; - } - - return DoSuperMethodA(cl, obj, (Msg)msg); -} - - -IPTR Register__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) -{ - struct Register_DATA *data = INST_DATA(cl, obj); - - if (data->items) FreeVec(data->items); - - return DoSuperMethodA(cl, obj, msg); -} - -IPTR Register__MUIM_Setup(struct IClass *cl, Object *obj, struct MUIP_Setup *msg) -{ - struct Register_DATA *data = INST_DATA(cl, obj); - WORD i, h = 0; - - if (!DoSuperMethodA(cl, obj, (Msg)msg)) - { - return FALSE; - } - - _font(obj) = zune_font_get(obj, MUIV_Font_Title); - data->fonth = _font(obj)->tf_YSize; - data->fontb = _font(obj)->tf_Baseline; - - h = 0; - - i = data->fonth + REGISTERTAB_EXTRA_HEIGHT; - h = (i > h) ? i : h; - - data->tab_height = h; - data->ty = data->fontb + 1 + (data->tab_height - data->fonth) / 2; - -/* D(bug("Register_Setup : data->height=%d\n", data->tab_height)); */ - - for(i = 0; i < data->numitems; i++) - { - data->items[i].textlen = strlen(data->items[i].text); - } - - data->total_hspacing = (data->columns + 1) * INTERTAB - 2; -/* D(bug("Register_AskMinMax : data->total_hspacing = %d\n", data->total_hspacing)); */ - - data->min_width = data->total_hspacing * 3; - data->def_width = data->total_hspacing; - - if (!(muiGlobalInfo(obj)->mgi_Prefs->register_truncate_titles)) - { - struct RastPort temprp; - int i; - WORD textpixmax; - - InitRastPort(&temprp); - SetFont(&temprp, _font(obj)); - - textpixmax = 0; - for(i = 0; i < data->numitems; i++) - { - WORD textpix = TextLength(&temprp, data->items[i].text, data->items[i].textlen); - textpixmax = MAX(textpix, textpixmax); - } - data->def_width += (textpixmax + TEXTSPACING + 1) * data->numitems; - data->def_width = MAX(data->min_width, data->def_width); - } - - SetHardCoord(obj,data); - muiAreaData(obj)->mad_Flags |= (MADF_INNERLEFT | MADF_INNERTOP | MADF_INNERRIGHT | MADF_INNERBOTTOM); - - DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR)&data->ehn); - - return TRUE; -} - -IPTR Register__MUIM_Cleanup(struct IClass *cl, Object *obj, struct MUIP_Cleanup *msg) -{ - struct Register_DATA *data = INST_DATA(cl, obj); - - DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR)&data->ehn); - - return DoSuperMethodA(cl,obj,(Msg)msg); -} - -IPTR Register__MUIM_AskMinMax(struct IClass *cl, Object *obj, struct MUIP_AskMinMax *msg) -{ - struct Register_DATA *data = INST_DATA(cl, obj); - - DoSuperMethodA(cl, obj, (Msg)msg); -/* D(bug("Register_AskMinMax1 : %ld, %ld, %ld\n", */ -/* msg->MinMaxInfo->MinWidth, msg->MinMaxInfo->DefWidth, msg->MinMaxInfo->MaxWidth)); */ - - -/* D(bug("Register_AskMinMax : spacings = %d, minw=%d, defw=%d, mymin=%d, mydef=%d\n", */ -/* data->total_hspacing, msg->MinMaxInfo->MinWidth, msg->MinMaxInfo->DefWidth, */ -/* data->min_width, data->def_width)); */ - - msg->MinMaxInfo->MinWidth = MAX(msg->MinMaxInfo->MinWidth, data->min_width); - msg->MinMaxInfo->MaxWidth = MAX(msg->MinMaxInfo->MaxWidth, data->def_width); - msg->MinMaxInfo->DefWidth = MAX(msg->MinMaxInfo->DefWidth, data->def_width); - -/* msg->MinMaxInfo->MinHeight += data->tab_height; */ -/* msg->MinMaxInfo->DefHeight += data->tab_height; */ - msg->MinMaxInfo->MaxHeight = MUI_MAXMAX; - -/* D(bug("Register_AskMinMax %p : tabheight=%d, minh=%d\n", obj, data->tab_height, */ -/* msg->MinMaxInfo->MinHeight)); */ - -/* D(bug("Register_AskMinMax2 : %ld, %ld, %ld\n", */ -/* msg->MinMaxInfo->MinWidth, msg->MinMaxInfo->DefWidth, msg->MinMaxInfo->MaxWidth)); */ - return TRUE; -} - -IPTR Register__MUIM_Layout(struct IClass *cl, Object *obj, struct MUIP_Layout *msg) -{ - struct Register_DATA *data = INST_DATA(cl, obj); - ULONG retval = 1; - IPTR active = 0; - - get(obj, MUIA_Group_ActivePage, &active); - - if (active != data->active) - { - data->oldactive = data->active; - data->active = active; - } - SetHardCoord(obj,data); - DoMethod(obj, MUIM_UpdateInnerSizes); - - DoSuperMethodA(cl, obj, (Msg)msg); - - data->left = _left(obj); - data->top = _top(obj); - data->framewidth = _width(obj); - data->frameheight = _height(obj) - data->tab_height; - - LayoutTabItems(obj,data); - -/* D(bug("Register_Layout : left=%d, top=%d / framewidth=%d, frameheight=%d\n", */ -/* data->left, data->top, data->framewidth, data->frameheight)); */ - - return retval; -} - -IPTR Register__MUIM_Show(struct IClass *cl, Object *obj, struct MUIP_Show *msg) -{ -/* struct Register_DATA *data = INST_DATA(cl, obj);*/ - - DoSuperMethodA(cl,obj,(Msg)msg); - -/* D(bug("Register_Show : left = %d, _left = %d, mleft = %d, \n", data->left, _left(obj), _mleft(obj))) */ - - return TRUE; -} - -IPTR Register__MUIM_Draw(struct IClass *cl, Object *obj, struct MUIP_Draw *msg) -{ - struct Register_DATA *data = INST_DATA(cl, obj); - - /* Before all the current page is drawn erase the part of the area covered - * by tabs which is not erased (between _left(obj) and _mleft(obj) and so on */ - if (data->oldactive != data->active && (msg->flags & MADF_DRAWUPDATE) && (data->active/data->columns != data->oldactive/data->columns)) - { - int left,top,width,height; - - left = _mright(obj)+1; - top = _mtop(obj); - width = _right(obj) - left; /* +1 - 1*/ - height = _mheight(obj); - - DoMethod(obj, MUIM_DrawBackground, left, top, width, height, left, top, 0); - - left = _left(obj)+1; /* +1 because the register frame shouldn't be ereased */ - width = _mleft(obj) - left; /* + 1 - 1 */ - - DoMethod(obj, MUIM_DrawBackground, left, top, width, height, left, top, 0); - - top = _top(obj) + data->tab_height; - height = _mtop(obj) - top; /* + 1 - 1 */ - width = _width(obj)-2; - - if (height > 0 && width > 0) - DoMethod(obj, MUIM_DrawBackground, left, top, width, height, left, top, 0); - - top = _mbottom(obj); - height = _bottom(obj) - top; /* + 1 - 1 */ - - if (height > 0 && width > 0) - DoMethod(obj, MUIM_DrawBackground, left, top, width, height, left, top, 0); - } - - DoSuperMethodA(cl,obj,(Msg)msg); - -/* D(bug("Register_Draw : flags = %d\n", msg->flags)); */ - if (!(msg->flags & (MADF_DRAWOBJECT | MADF_DRAWUPDATE))) - return(0); - - RenderRegisterTab(cl, obj, msg->flags); - - data->oldactive = data->active; - return TRUE; -} - -IPTR Register__MUIM_HandleEvent(struct IClass *cl, Object *obj, struct MUIP_HandleEvent *msg) -{ - struct Register_DATA *data = INST_DATA(cl, obj); - WORD i, x, y; - - if (msg->muikey != MUIKEY_NONE) - { - switch (msg->muikey) - { - case MUIKEY_PRESS: - case MUIKEY_RIGHT: - case MUIKEY_TOGGLE: - nfset(obj, MUIA_Group_ActivePage, MUIV_Group_ActivePage_Next); - return MUI_EventHandlerRC_Eat; - - case MUIKEY_LEFT: - nfset(obj, MUIA_Group_ActivePage, MUIV_Group_ActivePage_Prev); - return MUI_EventHandlerRC_Eat; - - case MUIKEY_WORDLEFT: - case MUIKEY_LINESTART: - nfset(obj, MUIA_Group_ActivePage, MUIV_Group_ActivePage_First); - return MUI_EventHandlerRC_Eat; - - case MUIKEY_WORDRIGHT: - case MUIKEY_LINEEND: - nfset(obj, MUIA_Group_ActivePage, MUIV_Group_ActivePage_Last); - return MUI_EventHandlerRC_Eat; - - } - } - - if (msg->imsg) - { - if ((msg->imsg->Class == IDCMP_MOUSEBUTTONS) && - (msg->imsg->Code == SELECTDOWN)) - { - x = msg->imsg->MouseX - data->left; - y = msg->imsg->MouseY - data->top; - -/* D(bug("Register_HandleEvent : %d,%d,%d -- %d,%d,%d\n", 0, x, _width(obj), 0, y, data->tab_height)); */ - if (_between(0, x, _width(obj))) - { -/* D(bug("Register_HandleEvent : in tab, %d,%d\n", x, y)); */ - for(i = 0; i < data->numitems; i++) - { - if (_between(data->items[i].x1, x, data->items[i].x2) && - _between(data->items[i].y1, y, data->items[i].y2)) - { - if (data->active != i) - { - nfset(obj, MUIA_Group_ActivePage, i); - return MUI_EventHandlerRC_Eat; - } - break; - } - - } - } - - } - } - - return 0; -} - - -BOOPSI_DISPATCHER(IPTR, Register_Dispatcher, cl, obj, msg) -{ - switch (msg->MethodID) - { - case OM_NEW: return Register__OM_NEW(cl, obj, (struct opSet *)msg); - case OM_GET: return Register__OM_GET(cl, obj, (struct opGet *)msg); - case OM_DISPOSE: return Register__OM_DISPOSE(cl, obj, msg); - case MUIM_Setup: return Register__MUIM_Setup(cl, obj, (struct MUIP_Setup *)msg); - case MUIM_Cleanup: return Register__MUIM_Cleanup(cl, obj, (struct MUIP_Cleanup *)msg); - case MUIM_AskMinMax: return Register__MUIM_AskMinMax(cl, obj, (struct MUIP_AskMinMax *)msg); - case MUIM_Layout: return Register__MUIM_Layout(cl, obj, (struct MUIP_Layout *)msg); - case MUIM_Show: return Register__MUIM_Show(cl, obj, (struct MUIP_Show *)msg); - case MUIM_Draw: return Register__MUIM_Draw(cl, obj, (struct MUIP_Draw *)msg); - case MUIM_HandleEvent: return Register__MUIM_HandleEvent(cl, obj, (struct MUIP_HandleEvent *)msg); - default: return DoSuperMethodA(cl, obj, msg); - } -} -BOOPSI_DISPATCHER_END - -const struct __MUIBuiltinClass _MUI_Register_desc = -{ - MUIC_Register, - MUIC_Group, - sizeof(struct Register_DATA), - (void*)Register_Dispatcher -}; +/* + Copyright © 2002-2011, The AROS Development Team. All rights reserved. + $Id$ +*/ + +#include <string.h> +#include <exec/memory.h> +#include <intuition/icclass.h> +#include <intuition/gadgetclass.h> +#include <intuition/imageclass.h> +#include <clib/alib_protos.h> +#include <proto/exec.h> +#include <proto/intuition.h> +#include <proto/utility.h> +#include <proto/graphics.h> +#include <proto/muimaster.h> + +#include "mui.h" +#include "muimaster_intern.h" +#include "support.h" +#include "prefs.h" +#include "font.h" + +/* #define MYDEBUG 1 */ +#include "debug.h" + +extern struct Library *MUIMasterBase; + +#define INTERTAB 4 +#define TEXTSPACING 4 +#define REGISTERTAB_EXTRA_HEIGHT 7 +#define REGISTER_FRAMEX 7 +#define REGISTER_FRAMEBOTTOM 5 +#define REGISTER_FRAMETOP 4 + +struct RegisterTabItem +{ + STRPTR text; /* strlen(text) - valide between new/delete */ + WORD textlen; /* strlen(text) - valide between setup/cleanup */ + WORD x1, x2; /* tab x input sensitive interval, relative to + * object's origin - valid between show/hide */ + WORD y1, y2; /* tab y input sensitive interval - + * valid between setup/cleanup */ +}; + +struct Register_DATA +{ + struct MUI_EventHandlerNode ehn; + struct RegisterTabItem *items; + char **labels; + BOOL frame; + WORD active; + WORD numitems; + WORD oldactive; + WORD left; + WORD top; + WORD min_width; /* object min width required */ + WORD def_width; /* object def width required */ + WORD tab_height; /* title height */ + WORD framewidth; + WORD frameheight; + WORD fontw; + WORD fonth; + WORD fontb; + WORD total_hspacing; + WORD ty; /* text y origin - valid between setup/cleanup */ + WORD columns; /* Number of register columns */ + WORD rows; /* Number of register rows */ +}; + + +/************************************************************************** + Layout Tab Items +**************************************************************************/ +static void LayoutTabItems(Object *obj, struct Register_DATA *data) +{ + WORD extra_space; + WORD fitwidth; + WORD x = 0; + WORD y = -data->tab_height; + WORD item_width; /* from vertical line left to v l right */ + int i; + int tabs_on_bottom = 0; + + item_width = (_width(obj) - data->total_hspacing) / data->columns; + //data->numitems; + extra_space = (_width(obj) - data->total_hspacing) % data->columns; + //data->numitems; + + D(bug("LayoutTabItems(%lx) : width = %d, mwidth = %d, " + "max item width = %d, remainder = %d\n", + obj, _width(obj), _mwidth(obj), item_width, extra_space)); + + for (i = 0; i < data->numitems; i++) + { + struct RegisterTabItem *ri = &data->items[i]; + + if (i % data->columns == 0) + { + x = INTERTAB - 1; + if (i > data->active && !tabs_on_bottom) + { + y = _height(obj) - muiAreaData(obj)->mad_InnerBottom; + tabs_on_bottom = 1; + } + else + y += data->tab_height; + } + + ri->x1 = x; + ri->x2 = ri->x1 + item_width - 1; + if (extra_space > 0) + { + ri->x2++; + extra_space--; + } + fitwidth = ri->x2 - ri->x1 + 1 - TEXTSPACING; + x += fitwidth + TEXTSPACING + INTERTAB; + + ri->y1 = y; + ri->y2 = y + data->tab_height - 1; + } +} + +/************************************************************************** + Render one item +**************************************************************************/ +static void RenderRegisterTabItem(struct IClass *cl, Object *obj, + WORD item) +{ + struct Register_DATA *data = INST_DATA(cl, obj); + struct RegisterTabItem *ri = &data->items[item]; + struct TextExtent extent; + WORD fitlen; /* text len fitting in alloted space */ + WORD fitpix; /* text pixels fitting in alloted space */ + WORD x, y; + WORD top_item_bar_y; + WORD bottom_item_bar_y; + WORD left_item_bar_x; + WORD right_item_bar_x; + WORD item_bar_width; + WORD text_y; + WORD item_bg_height; + WORD fitwidth; + + if ((item < 0) || (item >= data->numitems)) + return; + + y = data->top + ri->y1; + + if (data->active == item) + { + top_item_bar_y = _top(obj) + ri->y1; + bottom_item_bar_y = _top(obj) + ri->y2 - 2; + left_item_bar_x = _left(obj) + ri->x1 - 1; + right_item_bar_x = _left(obj) + ri->x2 + 1; + item_bg_height = data->tab_height; + text_y = y + data->ty; + item_bar_width = right_item_bar_x - left_item_bar_x + 1; + /* fill tab with register background */ + DoMethod(obj, MUIM_DrawBackground, left_item_bar_x, + top_item_bar_y + 4, item_bar_width, item_bg_height - 4, + left_item_bar_x, top_item_bar_y + 4, 0); + DoMethod(obj, MUIM_DrawBackground, left_item_bar_x + 2, + top_item_bar_y + 2, item_bar_width - (2 * 2), 2, + left_item_bar_x + 2, top_item_bar_y + 2, 0); + DoMethod(obj, MUIM_DrawBackground, left_item_bar_x + 4, + top_item_bar_y + 1, item_bar_width - (2 * 4), 1, + left_item_bar_x + 4, top_item_bar_y + 1, 0); + } + else + { + top_item_bar_y = _top(obj) + ri->y1 + 2; + bottom_item_bar_y = _top(obj) + ri->y2 - 1; + left_item_bar_x = _left(obj) + ri->x1; + right_item_bar_x = _left(obj) + ri->x2; + item_bg_height = data->tab_height - 3; + text_y = y + data->ty + 1; + item_bar_width = right_item_bar_x - left_item_bar_x + 1; + SetAPen(_rp(obj), _pens(obj)[MPEN_BACKGROUND]); + RectFill(_rp(obj), left_item_bar_x, top_item_bar_y + 4, + right_item_bar_x, bottom_item_bar_y); + RectFill(_rp(obj), left_item_bar_x + 2, top_item_bar_y + 2, + right_item_bar_x - 2, top_item_bar_y + 3); + RectFill(_rp(obj), left_item_bar_x + 4, top_item_bar_y + 1, + right_item_bar_x - 4, top_item_bar_y + 1); + } + + /* top horiz bar */ + SetAPen(_rp(obj), _pens(obj)[MPEN_SHINE]); + RectFill(_rp(obj), left_item_bar_x + 4, top_item_bar_y, + right_item_bar_x - 4, top_item_bar_y); + /* left vert bar */ + RectFill(_rp(obj), left_item_bar_x, top_item_bar_y + 4, left_item_bar_x, + bottom_item_bar_y); + WritePixel(_rp(obj), left_item_bar_x + 1, top_item_bar_y + 3); + WritePixel(_rp(obj), left_item_bar_x + 1, top_item_bar_y + 2); + WritePixel(_rp(obj), left_item_bar_x + 2, top_item_bar_y + 1); + WritePixel(_rp(obj), left_item_bar_x + 3, top_item_bar_y + 1); + SetAPen(_rp(obj), _pens(obj)[MPEN_HALFSHINE]); + WritePixel(_rp(obj), left_item_bar_x + 3, top_item_bar_y); + WritePixel(_rp(obj), left_item_bar_x + 4, top_item_bar_y + 1); + WritePixel(_rp(obj), left_item_bar_x + 2, top_item_bar_y + 2); + WritePixel(_rp(obj), left_item_bar_x + 3, top_item_bar_y + 2); + WritePixel(_rp(obj), left_item_bar_x + 2, top_item_bar_y + 3); + WritePixel(_rp(obj), left_item_bar_x, top_item_bar_y + 3); + WritePixel(_rp(obj), left_item_bar_x + 1, top_item_bar_y + 4); + + if (data->active == item) + { + /* bottom horiz bar */ + SetAPen(_rp(obj), _pens(obj)[MPEN_SHINE]); + WritePixel(_rp(obj), left_item_bar_x - 1, bottom_item_bar_y + 1); + SetAPen(_rp(obj), _pens(obj)[MPEN_SHADOW]); + WritePixel(_rp(obj), right_item_bar_x + 1, bottom_item_bar_y + 1); + DoMethod(obj, MUIM_DrawBackground, left_item_bar_x - 1, + bottom_item_bar_y + 2, item_bar_width + (2 * 1), 1, + left_item_bar_x - 1, bottom_item_bar_y + 2, 0); + + } + /* right vert bar */ + SetAPen(_rp(obj), _pens(obj)[MPEN_SHADOW]); + WritePixel(_rp(obj), right_item_bar_x - 1, top_item_bar_y + 2); + RectFill(_rp(obj), right_item_bar_x, top_item_bar_y + 4, + right_item_bar_x, bottom_item_bar_y); + SetAPen(_rp(obj), _pens(obj)[MPEN_HALFSHADOW]); + WritePixel(_rp(obj), right_item_bar_x - 2, top_item_bar_y + 1); + WritePixel(_rp(obj), right_item_bar_x - 1, top_item_bar_y + 3); + WritePixel(_rp(obj), right_item_bar_x, top_item_bar_y + 3); + SetAPen(_rp(obj), _pens(obj)[MPEN_BACKGROUND]); + WritePixel(_rp(obj), right_item_bar_x - 3, top_item_bar_y + 1); + + /* text */ + fitwidth = item_bar_width - TEXTSPACING; + fitlen = + TextFit(_rp(obj), ri->text, ri->textlen, &extent, NULL, 1, fitwidth, + data->tab_height); + fitpix = extent.te_Width; +// D(bug("extent for %s (len=%d) in %d pix = %d chars, %d pix [%x,%x,%x]\n", +// ri->text, ri->textlen, fitwidth, fitlen, fitpix, _rp(obj), +// _rp(obj)->Font, _font(obj))); + x = left_item_bar_x + (item_bar_width - fitpix) / 2; + SetDrMd(_rp(obj), JAM1); + SetAPen(_rp(obj), _pens(obj)[MPEN_TEXT]); + Move(_rp(obj), x, text_y); + Text(_rp(obj), ri->text, fitlen); +} + +/************************************************************************** + Render tab bar +**************************************************************************/ +static void RenderRegisterTab(struct IClass *cl, Object *obj, ULONG flags) +{ + struct Register_DATA *data = INST_DATA(cl, obj); + +/* + * Erase / prepare for drawing + */ + if (flags & MADF_DRAWOBJECT) + { + DoMethod(obj, MUIM_DrawParentBackground, data->left, data->top, + data->framewidth, data->tab_height - 1, data->left, data->top, + 0); + } + else + { + /* draw parent bg over oldactive */ + IPTR method; + WORD old_left, old_top, old_width, old_height; + struct RegisterTabItem *ri = &data->items[data->oldactive]; + if (data->oldactive >= data->columns) + method = MUIM_DrawBackground; + else + method = MUIM_DrawParentBackground; + + old_left = _left(obj) + ri->x1 - 2; + old_top = _top(obj) + ri->y1; + old_width = ri->x2 - ri->x1 + 5; + old_height = data->tab_height - 1; + DoMethod(obj, method, old_left, old_top, + old_width, old_height, old_left, old_top, 0); + SetDrMd(_rp(obj), JAM1); + SetAPen(_rp(obj), _pens(obj)[MPEN_SHINE]); + RectFill(_rp(obj), old_left, old_top + old_height, + old_left + old_width, old_top + old_height); + } + + SetDrMd(_rp(obj), JAM1); + SetAPen(_rp(obj), _pens(obj)[MPEN_SHINE]); + SetFont(_rp(obj), _font(obj)); + SetSoftStyle(_rp(obj), FS_NORMAL, AskSoftStyle(_rp(obj))); + + +/* + * Draw new graphics + */ + /* register frame */ + if (flags & MADF_DRAWOBJECT + || (data->active / data->columns != + data->oldactive / data->columns)) + { + int i, y, tabs_on_bottom = 0; + + SetAPen(_rp(obj), _pens(obj)[MPEN_SHINE]); + + RectFill(_rp(obj), data->left, + data->top + data->tab_height - 1, + data->left, + data->top + data->tab_height + data->frameheight - 1); + + y = data->top + data->tab_height - 1; + + for (i = 0; i < data->rows; i++) + { + if (!tabs_on_bottom && (i > data->active / data->columns)) + { + y = _bottom(obj) - muiAreaData(obj)->mad_InnerBottom + + data->tab_height; + tabs_on_bottom = 1; + } + + RectFill(_rp(obj), data->left + 1, y, + data->left + data->framewidth - 2, y); + y += data->tab_height; + } + + SetAPen(_rp(obj), _pens(obj)[MPEN_SHADOW]); + + RectFill(_rp(obj), data->left + data->framewidth - 1, + data->top + data->tab_height - 1, + data->left + data->framewidth - 1, + data->top + data->tab_height + data->frameheight - 1); + + RectFill(_rp(obj), data->left + 1, + data->top + data->tab_height + data->frameheight - 1, + data->left + data->framewidth - 2, + data->top + data->tab_height + data->frameheight - 1); + for (i = 0; i < data->numitems; i++) + { + RenderRegisterTabItem(cl, obj, i); + } + } + else + { + /* If active register has been changed and is on same row we simply draw both registers only */ + RenderRegisterTabItem(cl, obj, data->active); + RenderRegisterTabItem(cl, obj, data->oldactive); + } + +} + +/************************************************************************** + Set the coordinates +**************************************************************************/ +static void SetHardCoord(Object *obj, struct Register_DATA *data) +{ + struct MUI_AreaData *adata = muiAreaData(obj); + const struct MUI_FrameSpec_intern *frame; + + //adata->mad_InnerLeft = REGISTER_FRAMEX; + //adata->mad_InnerTop = data->tab_height + // * (1 + data->active/data->columns) + REGISTER_FRAMETOP; + //adata->mad_InnerRight = REGISTER_FRAMEX; + //adata->mad_InnerBottom = data->tab_height + // * (data->rows - 1 - data->active/data->columns) + // + REGISTER_FRAMEBOTTOM; + + frame = &muiGlobalInfo(obj)->mgi_Prefs->frames[MUIV_Frame_Group]; + + adata->mad_InnerLeft = frame->innerLeft + 1; + adata->mad_InnerTop = + data->tab_height * (1 + data->active / data->columns) + + frame->innerTop; + adata->mad_InnerRight = frame->innerRight + 1; + adata->mad_InnerBottom = + data->tab_height * (data->rows - 1 - data->active / data->columns) + + frame->innerBottom + 1; +/* D(bug("Hardcoord %p top=%ld bottom=%ld\n", + obj, adata->mad_HardITop, adata->mad_HardIBottom)); */ +} + +IPTR Register__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) +{ + struct Register_DATA *data; + int i; + IPTR tmp = 0; + + obj = + (Object *) DoSuperNewTags(cl, obj, NULL, MUIA_Group_PageMode, TRUE, + MUIA_Background, MUII_RegisterBack, TAG_MORE, + (IPTR) msg->ops_AttrList); + if (!obj) + return (IPTR) NULL; + + data = INST_DATA(cl, obj); + + data->frame = GetTagData(MUIA_Register_Frame, 0, msg->ops_AttrList); + + data->labels = + (char **)GetTagData(MUIA_Register_Titles, 0, msg->ops_AttrList); + + if (!data->labels) + { + CoerceMethod(cl, obj, OM_DISPOSE); + return (IPTR) NULL; + } + + for (data->numitems = 0; data->labels[data->numitems]; data->numitems++) + ; + + if (data->numitems <= 0) + { + CoerceMethod(cl, obj, OM_DISPOSE); + return (IPTR) NULL; + } + + data->columns = + (WORD) GetTagData(MUIA_Register_Columns, data->numitems, + msg->ops_AttrList); + if (data->columns <= 0) + data->columns = 1; + data->rows = (data->numitems + data->columns - 1) / data->columns; + + get(obj, MUIA_Group_ActivePage, &tmp); + data->active = (WORD) tmp; + + if (data->active < 0 || data->active >= data->numitems) + { + data->active = 0; + } + data->oldactive = data->active; + + data->items = + (struct RegisterTabItem *)AllocVec(data->numitems * + sizeof(struct RegisterTabItem), MEMF_PUBLIC | MEMF_CLEAR); + + if (!data->items) + { + CoerceMethod(cl, obj, OM_DISPOSE); + return (IPTR) NULL; + } + + for (i = 0; i < data->numitems; i++) + { + data->items[i].text = data->labels[i]; + } + + data->ehn.ehn_Events = IDCMP_MOUSEBUTTONS | IDCMP_RAWKEY; + data->ehn.ehn_Priority = 0; + data->ehn.ehn_Flags = 0; + data->ehn.ehn_Object = obj; + data->ehn.ehn_Class = cl; + + return (IPTR) obj; +} + + +IPTR Register__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) +{ + struct Register_DATA *data = INST_DATA(cl, obj); + +#define STORE *(msg->opg_Storage) + + switch (msg->opg_AttrID) + { + case MUIA_Register_Frame: + STORE = (IPTR) data->frame; + return 1; + + case MUIA_Register_Titles: + STORE = (IPTR) data->labels; + return 1; + } + + return DoSuperMethodA(cl, obj, (Msg) msg); +} + + +IPTR Register__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) +{ + struct Register_DATA *data = INST_DATA(cl, obj); + + if (data->items) + FreeVec(data->items); + + return DoSuperMethodA(cl, obj, msg); +} + +IPTR Register__MUIM_Setup(struct IClass *cl, Object *obj, + struct MUIP_Setup *msg) +{ + struct Register_DATA *data = INST_DATA(cl, obj); + WORD i, h = 0; + + if (!DoSuperMethodA(cl, obj, (Msg) msg)) + { + return FALSE; + } + + _font(obj) = zune_font_get(obj, MUIV_Font_Title); + data->fonth = _font(obj)->tf_YSize; + data->fontb = _font(obj)->tf_Baseline; + + h = 0; + + i = data->fonth + REGISTERTAB_EXTRA_HEIGHT; + h = (i > h) ? i : h; + + data->tab_height = h; + data->ty = data->fontb + 1 + (data->tab_height - data->fonth) / 2; + +/* D(bug("Register_Setup : data->height=%d\n", data->tab_height)); */ + + for (i = 0; i < data->numitems; i++) + { + data->items[i].textlen = strlen(data->items[i].text); + } + + data->total_hspacing = (data->columns + 1) * INTERTAB - 2; +/* D(bug("Register_AskMinMax : data->total_hspacing = %d\n", + data->total_hspacing)); */ + + data->min_width = data->total_hspacing * 3; + data->def_width = data->total_hspacing; + + if (!(muiGlobalInfo(obj)->mgi_Prefs->register_truncate_titles)) + { + struct RastPort temprp; + int i; + WORD textpixmax; + + InitRastPort(&temprp); + SetFont(&temprp, _font(obj)); + + textpixmax = 0; + for (i = 0; i < data->numitems; i++) + { + WORD textpix = + TextLength(&temprp, data->items[i].text, + data->items[i].textlen); + textpixmax = MAX(textpix, textpixmax); + } + data->def_width += (textpixmax + TEXTSPACING + 1) * data->numitems; + data->def_width = MAX(data->min_width, data->def_width); + } + + SetHardCoord(obj, data); + muiAreaData(obj)->mad_Flags |= + (MADF_INNERLEFT | MADF_INNERTOP | MADF_INNERRIGHT | + MADF_INNERBOTTOM); + + DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR) & data->ehn); + + return TRUE; +} + +IPTR Register__MUIM_Cleanup(struct IClass *cl, Object *obj, + struct MUIP_Cleanup *msg) +{ + struct Register_DATA *data = INST_DATA(cl, obj); + + DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR) & data->ehn); + + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +IPTR Register__MUIM_AskMinMax(struct IClass *cl, Object *obj, + struct MUIP_AskMinMax *msg) +{ + struct Register_DATA *data = INST_DATA(cl, obj); + + DoSuperMethodA(cl, obj, (Msg) msg); +/* D(bug("Register_AskMinMax1 : %ld, %ld, %ld\n", */ +/* msg->MinMaxInfo->MinWidth, msg->MinMaxInfo->DefWidth, */ +/* msg->MinMaxInfo->MaxWidth)); */ + + +/* D(bug("Register_AskMinMax : spacings = %d, minw=%d, defw=%d, " */ +/* "mymin=%d, mydef=%d\n", */ +/* data->total_hspacing, msg->MinMaxInfo->MinWidth, */ +/* msg->MinMaxInfo->DefWidth, */ +/* data->min_width, data->def_width)); */ + + msg->MinMaxInfo->MinWidth = + MAX(msg->MinMaxInfo->MinWidth, data->min_width); + msg->MinMaxInfo->MaxWidth = + MAX(msg->MinMaxInfo->MaxWidth, data->def_width); + msg->MinMaxInfo->DefWidth = + MAX(msg->MinMaxInfo->DefWidth, data->def_width); + +/* msg->MinMaxInfo->MinHeight += data->tab_height; */ +/* msg->MinMaxInfo->DefHeight += data->tab_height; */ + msg->MinMaxInfo->MaxHeight = MUI_MAXMAX; + +/* D(bug("Register_AskMinMax %p : tabheight=%d, minh=%d\n", obj, */ +/* data->tab_height, */ +/* msg->MinMaxInfo->MinHeight)); */ + +/* D(bug("Register_AskMinMax2 : %ld, %ld, %ld\n", */ +/* msg->MinMaxInfo->MinWidth, msg->MinMaxInfo->DefWidth, */ +/* msg->MinMaxInfo->MaxWidth)); */ + return TRUE; +} + +IPTR Register__MUIM_Layout(struct IClass *cl, Object *obj, + struct MUIP_Layout *msg) +{ + struct Register_DATA *data = INST_DATA(cl, obj); + ULONG retval = 1; + IPTR active = 0; + + get(obj, MUIA_Group_ActivePage, &active); + + if (active != data->active) + { + data->oldactive = data->active; + data->active = active; + } + SetHardCoord(obj, data); + DoMethod(obj, MUIM_UpdateInnerSizes); + + DoSuperMethodA(cl, obj, (Msg) msg); + + data->left = _left(obj); + data->top = _top(obj); + data->framewidth = _width(obj); + data->frameheight = _height(obj) - data->tab_height; + + LayoutTabItems(obj, data); + +/* D(bug( */ +/* "Register_Layout : left=%d, top=%d / framewidth=%d, frameheight=%d\n", */ +/* data->left, data->top, data->framewidth, data->frameheight)); */ + + return retval; +} + +IPTR Register__MUIM_Show(struct IClass *cl, Object *obj, + struct MUIP_Show *msg) +{ +/* struct Register_DATA *data = INST_DATA(cl, obj);*/ + + DoSuperMethodA(cl, obj, (Msg) msg); + +/* D(bug("Register_Show : left = %d, _left = %d, mleft = %d, \n", */ +/* data->left, _left(obj), _mleft(obj))) */ + + return TRUE; +} + +IPTR Register__MUIM_Draw(struct IClass *cl, Object *obj, + struct MUIP_Draw *msg) +{ + struct Register_DATA *data = INST_DATA(cl, obj); + + /* Before all the current page is drawn erase the part of the area covered + * by tabs which is not erased (between _left(obj) and _mleft(obj) and + * so on */ + if (data->oldactive != data->active && (msg->flags & MADF_DRAWUPDATE) + && (data->active / data->columns != + data->oldactive / data->columns)) + { + int left, top, width, height; + + left = _mright(obj) + 1; + top = _mtop(obj); + width = _right(obj) - left; /* +1 - 1 */ + height = _mheight(obj); + + DoMethod(obj, MUIM_DrawBackground, left, top, width, height, left, + top, 0); + + left = _left(obj) + 1; + /* +1 because the register frame shouldn't be ereased */ + width = _mleft(obj) - left; /* + 1 - 1 */ + + DoMethod(obj, MUIM_DrawBackground, left, top, width, height, left, + top, 0); + + top = _top(obj) + data->tab_height; + height = _mtop(obj) - top; /* + 1 - 1 */ + width = _width(obj) - 2; + + if (height > 0 && width > 0) + DoMethod(obj, MUIM_DrawBackground, left, top, width, height, + left, top, 0); + + top = _mbottom(obj); + height = _bottom(obj) - top; /* + 1 - 1 */ + + if (height > 0 && width > 0) + DoMethod(obj, MUIM_DrawBackground, left, top, width, height, + left, top, 0); + } + + DoSuperMethodA(cl, obj, (Msg) msg); + +/* D(bug("Register_Draw : flags = %d\n", msg->flags)); */ + if (!(msg->flags & (MADF_DRAWOBJECT | MADF_DRAWUPDATE))) + return (0); + + RenderRegisterTab(cl, obj, msg->flags); + + data->oldactive = data->active; + return TRUE; +} + +IPTR Register__MUIM_HandleEvent(struct IClass *cl, Object *obj, + struct MUIP_HandleEvent *msg) +{ + struct Register_DATA *data = INST_DATA(cl, obj); + WORD i, x, y; + + if (msg->muikey != MUIKEY_NONE) + { + switch (msg->muikey) + { + case MUIKEY_PRESS: + case MUIKEY_RIGHT: + case MUIKEY_TOGGLE: + nfset(obj, MUIA_Group_ActivePage, MUIV_Group_ActivePage_Next); + return MUI_EventHandlerRC_Eat; + + case MUIKEY_LEFT: + nfset(obj, MUIA_Group_ActivePage, MUIV_Group_ActivePage_Prev); + return MUI_EventHandlerRC_Eat; + + case MUIKEY_WORDLEFT: + case MUIKEY_LINESTART: + nfset(obj, MUIA_Group_ActivePage, MUIV_Group_ActivePage_First); + return MUI_EventHandlerRC_Eat; + + case MUIKEY_WORDRIGHT: + case MUIKEY_LINEEND: + nfset(obj, MUIA_Group_ActivePage, MUIV_Group_ActivePage_Last); + return MUI_EventHandlerRC_Eat; + + } + } + + if (msg->imsg) + { + if ((msg->imsg->Class == IDCMP_MOUSEBUTTONS) && + (msg->imsg->Code == SELECTDOWN)) + { + x = msg->imsg->MouseX - data->left; + y = msg->imsg->MouseY - data->top; + +/* D(bug("Register_HandleEvent : %d,%d,%d -- %d,%d,%d\n", */ +/* 0, x, _width(obj), 0, y, data->tab_height)); */ + if (_between(0, x, _width(obj))) + { +/* D(bug("Register_HandleEvent : in tab, %d,%d\n", x, y)); */ + for (i = 0; i < data->numitems; i++) + { + if (_between(data->items[i].x1, x, data->items[i].x2) && + _between(data->items[i].y1, y, data->items[i].y2)) + { + if (data->active != i) + { + nfset(obj, MUIA_Group_ActivePage, i); + return MUI_EventHandlerRC_Eat; + } + break; + } + } + } + } + } + + return 0; +} + + +BOOPSI_DISPATCHER(IPTR, Register_Dispatcher, cl, obj, msg) +{ + switch (msg->MethodID) + { + case OM_NEW: + return Register__OM_NEW(cl, obj, (struct opSet *)msg); + case OM_GET: + return Register__OM_GET(cl, obj, (struct opGet *)msg); + case OM_DISPOSE: + return Register__OM_DISPOSE(cl, obj, msg); + case MUIM_Setup: + return Register__MUIM_Setup(cl, obj, (struct MUIP_Setup *)msg); + case MUIM_Cleanup: + return Register__MUIM_Cleanup(cl, obj, (struct MUIP_Cleanup *)msg); + case MUIM_AskMinMax: + return Register__MUIM_AskMinMax(cl, obj, + (struct MUIP_AskMinMax *)msg); + case MUIM_Layout: + return Register__MUIM_Layout(cl, obj, (struct MUIP_Layout *)msg); + case MUIM_Show: + return Register__MUIM_Show(cl, obj, (struct MUIP_Show *)msg); + case MUIM_Draw: + return Register__MUIM_Draw(cl, obj, (struct MUIP_Draw *)msg); + case MUIM_HandleEvent: + return Register__MUIM_HandleEvent(cl, obj, + (struct MUIP_HandleEvent *)msg); + default: + return DoSuperMethodA(cl, obj, msg); + } +} +BOOPSI_DISPATCHER_END + +const struct __MUIBuiltinClass _MUI_Register_desc = +{ + MUIC_Register, + MUIC_Group, + sizeof(struct Register_DATA), + (void *) Register_Dispatcher +}; diff --git a/workbench/libs/muimaster/classes/register.h b/workbench/libs/muimaster/classes/register.h index c33e3855d6..4a1512c112 100644 --- a/workbench/libs/muimaster/classes/register.h +++ b/workbench/libs/muimaster/classes/register.h @@ -13,12 +13,12 @@ #define MUIB_Register (MUIB_ZUNE | 0x00002c00) /*** Attributes *************************************************************/ -#define MUIA_Register_Frame (MUIB_MUI|0x0042349b) /* V7 i.g BOOL */ -#define MUIA_Register_Titles (MUIB_MUI|0x004297ec) /* V7 i.g STRPTR * */ +#define MUIA_Register_Frame (MUIB_MUI | 0x0042349b) /* V7 i.g BOOL */ +#define MUIA_Register_Titles (MUIB_MUI | 0x004297ec) /* V7 i.g STRPTR * */ -#define MUIA_Register_Columns (MUIB_Register | 0x0000) /* Zune V1 i.. */ +#define MUIA_Register_Columns (MUIB_Register | 0x0000) /* Zune V1 i.. */ -extern const struct __MUIBuiltinClass _MUI_Register_desc; /* PRIV */ +extern const struct __MUIBuiltinClass _MUI_Register_desc; /* PRIV */ #endif /* _MUI_CLASSES_REGISTER_H */ diff --git a/workbench/libs/muimaster/classes/scale.c b/workbench/libs/muimaster/classes/scale.c dissimilarity index 75% index 8909b1781d..b6ef19c021 100644 --- a/workbench/libs/muimaster/classes/scale.c +++ b/workbench/libs/muimaster/classes/scale.c @@ -1,275 +1,299 @@ -/* - Copyright © 2002-2011, The AROS Development Team. All rights reserved. - $Id$ -*/ - -#define MUIMASTER_YES_INLINE_STDARG - -#include <stdio.h> - -#include <graphics/gfx.h> -#include <graphics/view.h> -#include <clib/alib_protos.h> -#include <proto/exec.h> -#include <proto/graphics.h> -#include <proto/utility.h> -#include <proto/intuition.h> -#include <proto/muimaster.h> - -#include <string.h> - -#include "mui.h" -#include "muimaster_intern.h" -#include "textengine.h" -#include "support.h" -#include "support_classes.h" -#include "scale_private.h" - -/* #define MYDEBUG 1 */ -#include "debug.h" - -extern struct Library *MUIMasterBase; - - -IPTR Scale__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct Scale_DATA *data; - struct TagItem *tag, *tags; - - obj = (Object *)DoSuperMethodA(cl, obj, (Msg)msg); - if (!obj) return FALSE; - - data = INST_DATA(cl, obj); - - data->horiz = TRUE; - - /* parse initial taglist */ - - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) - { - switch (tag->ti_Tag) - { - case MUIA_Scale_Horiz: - data->horiz = tag->ti_Data; - break; - } - } - - D(bug("muimaster.library/scale.c: Scale Object created at 0x%lx\n",obj)); - - return (IPTR)obj; -} - -IPTR Scale__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct Scale_DATA *data; - struct TagItem *tag, *tags; - int need_redraw = 0; - - data = INST_DATA(cl, obj); - - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) - { - switch (tag->ti_Tag) - { - case MUIA_Scale_Horiz: - if (data->horiz != tag->ti_Data) - need_redraw = 1; - data->horiz = tag->ti_Data; - break; - } - } - - if (need_redraw) - { - MUI_Redraw(obj,MADF_DRAWOBJECT); - } - return DoSuperMethodA(cl, obj, (Msg)msg); -} - -IPTR Scale__OM_GET(struct IClass *cl, Object * obj, struct opGet *msg) -{ - struct Scale_DATA *data = INST_DATA(cl, obj); - IPTR *store = msg->opg_Storage; - IPTR tag = msg->opg_AttrID; - - switch (tag) - { - case MUIA_Scale_Horiz: - *store = (IPTR)data->horiz; - return TRUE; - } - - return DoSuperMethodA(cl, obj, (Msg)msg); -} - -IPTR Scale__MUIM_Setup(struct IClass *cl, Object *obj, struct MUIP_Setup *msg) -{ - struct Scale_DATA *data = INST_DATA(cl,obj); - - if (!(DoSuperMethodA(cl, obj, (Msg)msg))) return 0; - - { - char *minlabel = "0% 100%"; - struct RastPort rp; - - InitRastPort(&rp); - SetFont(&rp,_font(obj)); - - data->label_minwidth = TextLength(&rp,minlabel,strlen(minlabel)); - data->label_height = _font(obj)->tf_YSize; - } - - return 1; -} - -IPTR Scale__MUIM_AskMinMax(struct IClass *cl, Object *obj, struct MUIP_AskMinMax *msg) -{ - struct Scale_DATA *data = INST_DATA(cl,obj); - DoSuperMethodA(cl,obj,(Msg)msg); - - if (data->horiz) - { - msg->MinMaxInfo->MinWidth += data->label_minwidth; - msg->MinMaxInfo->MinHeight += data->label_height + 4; - msg->MinMaxInfo->DefWidth += data->label_minwidth; - msg->MinMaxInfo->DefHeight += data->label_height + 4; - msg->MinMaxInfo->MaxWidth = MUI_MAXMAX; - msg->MinMaxInfo->MaxHeight += data->label_height + 4; - } - else - { - } - return 0; -} - -IPTR Scale__MUIM_Draw(struct IClass *cl, Object *obj, struct MUIP_Draw *msg) -{ - struct Scale_DATA *data = INST_DATA(cl,obj); - //ULONG val; - - DoSuperMethodA(cl,obj,(Msg)msg); - D(bug("muimaster.library/scale.c: Draw Scale Object at 0x%lx %ldx%ldx%ldx%ld\n",obj,_left(obj),_top(obj),_right(obj),_bottom(obj))); - - if (data->horiz) - { - int i; - //int subdiv; - char buf[255]; - int k; - BOOL drawpct; - - /* main horizontal bar */ - SetAPen(_rp(obj),_pens(obj)[MPEN_TEXT]); - Move(_rp(obj), _mleft(obj), _mtop(obj) + 3); - Draw(_rp(obj), _mright(obj), _mtop(obj) + 3); - - /* testing possible layouts: 1 = 0...100 ; 2 = 0...50..100 ; etc ... */ - for (i = 2; i < _mwidth(obj); i *= 2) - { - int j; - int total_width = 0; - int too_big = 0; - - for (j = 0; j <= i; j++) - { - //int pct = j * 100 / i; - - snprintf(buf, 255, "%d%%", (int)j); - total_width += TextLength(_rp(obj),buf,strlen(buf)); - if (total_width > (3 * _mwidth(obj) / 8)) - { - too_big = 1; - break; - } - } - if (too_big) - break; - } - - for (k = 0, drawpct = TRUE; k <= i; k++) - { - /* draw 0% */ - if (k == 0) - { - ZText *ztext = zune_text_new(NULL,"0%",ZTEXT_ARG_NONE,0); - if (ztext) - { - zune_text_get_bounds(ztext, obj); - zune_text_draw(ztext, obj, _mleft(obj),_mright(obj),_mtop(obj) + 4); - zune_text_destroy(ztext); - } - Move(_rp(obj), _mleft(obj), _mtop(obj)); - Draw(_rp(obj), _mleft(obj), _mtop(obj) + 3); - drawpct = FALSE; - } - else if (k == i) /* draw 100% */ - { - ZText *ztext = zune_text_new("\33r","100%",ZTEXT_ARG_NONE,0); - if (ztext) - { - zune_text_get_bounds(ztext, obj); - zune_text_draw(ztext, obj, _mleft(obj),_mright(obj),_mtop(obj) + 4); - zune_text_destroy(ztext); - } - Move(_rp(obj), _mright(obj), _mtop(obj)); - Draw(_rp(obj), _mright(obj), _mtop(obj) + 3); - drawpct = FALSE; - } - else if (drawpct == TRUE) /* draw intermediate values and lines */ - { - ZText *ztext; - int val = k * 100 / i; - - snprintf(buf, 255, "%d%%", (int)val); - ztext = zune_text_new(NULL,buf,ZTEXT_ARG_NONE,0); - if (ztext) - { - int width; - zune_text_get_bounds(ztext, obj); - width = TextLength(_rp(obj),buf,strlen(buf)); - zune_text_draw(ztext, obj, _mleft(obj) + _mwidth(obj) * k / i - width / 2,_mright(obj),_mtop(obj) + 4); - zune_text_destroy(ztext); - } - Move(_rp(obj), _mleft(obj) + _mwidth(obj) * k / i, _mtop(obj)); - Draw(_rp(obj), _mleft(obj) + _mwidth(obj) * k / i, _mtop(obj) + 3); - drawpct = FALSE; - } - else /* draw intermediate lines */ - { - Move(_rp(obj), _mleft(obj) + _mwidth(obj) * k / i, _mtop(obj) + 1); - Draw(_rp(obj), _mleft(obj) + _mwidth(obj) * k / i, _mtop(obj) + 3); - drawpct = TRUE; - } - } - } - else - { - } - return 0; -} - -#if ZUNE_BUILTIN_SCALE -BOOPSI_DISPATCHER(IPTR, Scale_Dispatcher, cl, obj, msg) -{ - switch (msg->MethodID) - { - case OM_NEW: return Scale__OM_NEW(cl, obj, (struct opSet *)msg); - case OM_SET: return Scale__OM_SET(cl, obj, (struct opSet *)msg); - case OM_GET: return Scale__OM_GET(cl, obj, (struct opGet *)msg); - case MUIM_Setup: return Scale__MUIM_Setup(cl, obj, (struct MUIP_Setup *)msg); - case MUIM_AskMinMax: return Scale__MUIM_AskMinMax(cl, obj, (struct MUIP_AskMinMax*)msg); - case MUIM_Draw: return Scale__MUIM_Draw(cl, obj, (struct MUIP_Draw*)msg); - default: return DoSuperMethodA(cl, obj, msg); - } -} -BOOPSI_DISPATCHER_END - -const struct __MUIBuiltinClass _MUI_Scale_desc = -{ - MUIC_Scale, - MUIC_Area, - sizeof(struct Scale_DATA), - (void*)Scale_Dispatcher -}; -#endif /* ZUNE_BUILTIN_SCALE */ +/* + Copyright © 2002-2011, The AROS Development Team. All rights reserved. + $Id$ +*/ + +#define MUIMASTER_YES_INLINE_STDARG + +#include <stdio.h> + +#include <graphics/gfx.h> +#include <graphics/view.h> +#include <clib/alib_protos.h> +#include <proto/exec.h> +#include <proto/graphics.h> +#include <proto/utility.h> +#include <proto/intuition.h> +#include <proto/muimaster.h> + +#include <string.h> + +#include "mui.h" +#include "muimaster_intern.h" +#include "textengine.h" +#include "support.h" +#include "support_classes.h" +#include "scale_private.h" + +/* #define MYDEBUG 1 */ +#include "debug.h" + +extern struct Library *MUIMasterBase; + + +IPTR Scale__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) +{ + struct Scale_DATA *data; + struct TagItem *tag, *tags; + + obj = (Object *) DoSuperMethodA(cl, obj, (Msg) msg); + if (!obj) + return FALSE; + + data = INST_DATA(cl, obj); + + data->horiz = TRUE; + + /* parse initial taglist */ + + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) + { + switch (tag->ti_Tag) + { + case MUIA_Scale_Horiz: + data->horiz = tag->ti_Data; + break; + } + } + + D(bug("muimaster.library/scale.c: Scale Object created at 0x%lx\n", + obj)); + + return (IPTR) obj; +} + +IPTR Scale__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) +{ + struct Scale_DATA *data; + struct TagItem *tag, *tags; + int need_redraw = 0; + + data = INST_DATA(cl, obj); + + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) + { + switch (tag->ti_Tag) + { + case MUIA_Scale_Horiz: + if (data->horiz != tag->ti_Data) + need_redraw = 1; + data->horiz = tag->ti_Data; + break; + } + } + + if (need_redraw) + { + MUI_Redraw(obj, MADF_DRAWOBJECT); + } + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +IPTR Scale__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) +{ + struct Scale_DATA *data = INST_DATA(cl, obj); + IPTR *store = msg->opg_Storage; + IPTR tag = msg->opg_AttrID; + + switch (tag) + { + case MUIA_Scale_Horiz: + *store = (IPTR) data->horiz; + return TRUE; + } + + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +IPTR Scale__MUIM_Setup(struct IClass *cl, Object *obj, + struct MUIP_Setup *msg) +{ + struct Scale_DATA *data = INST_DATA(cl, obj); + + if (!(DoSuperMethodA(cl, obj, (Msg) msg))) + return 0; + + { + char *minlabel = "0% 100%"; + struct RastPort rp; + + InitRastPort(&rp); + SetFont(&rp, _font(obj)); + + data->label_minwidth = TextLength(&rp, minlabel, strlen(minlabel)); + data->label_height = _font(obj)->tf_YSize; + } + + return 1; +} + +IPTR Scale__MUIM_AskMinMax(struct IClass *cl, Object *obj, + struct MUIP_AskMinMax *msg) +{ + struct Scale_DATA *data = INST_DATA(cl, obj); + DoSuperMethodA(cl, obj, (Msg) msg); + + if (data->horiz) + { + msg->MinMaxInfo->MinWidth += data->label_minwidth; + msg->MinMaxInfo->MinHeight += data->label_height + 4; + msg->MinMaxInfo->DefWidth += data->label_minwidth; + msg->MinMaxInfo->DefHeight += data->label_height + 4; + msg->MinMaxInfo->MaxWidth = MUI_MAXMAX; + msg->MinMaxInfo->MaxHeight += data->label_height + 4; + } + else + { + } + return 0; +} + +IPTR Scale__MUIM_Draw(struct IClass *cl, Object *obj, + struct MUIP_Draw *msg) +{ + struct Scale_DATA *data = INST_DATA(cl, obj); + //ULONG val; + + DoSuperMethodA(cl, obj, (Msg) msg); + D(bug("muimaster.library/scale.c: Draw Scale Object " + "at 0x%lx %ldx%ldx%ldx%ld\n", + obj, _left(obj), _top(obj), _right(obj), _bottom(obj))); + + if (data->horiz) + { + int i; + //int subdiv; + char buf[255]; + int k; + BOOL drawpct; + + /* main horizontal bar */ + SetAPen(_rp(obj), _pens(obj)[MPEN_TEXT]); + Move(_rp(obj), _mleft(obj), _mtop(obj) + 3); + Draw(_rp(obj), _mright(obj), _mtop(obj) + 3); + + /* testing possible layouts: 1 = 0...100 ; 2 = 0...50..100 ; etc ... */ + for (i = 2; i < _mwidth(obj); i *= 2) + { + int j; + int total_width = 0; + int too_big = 0; + + for (j = 0; j <= i; j++) + { + //int pct = j * 100 / i; + + snprintf(buf, 255, "%d%%", (int)j); + total_width += TextLength(_rp(obj), buf, strlen(buf)); + if (total_width > (3 * _mwidth(obj) / 8)) + { + too_big = 1; + break; + } + } + if (too_big) + break; + } + + for (k = 0, drawpct = TRUE; k <= i; k++) + { + /* draw 0% */ + if (k == 0) + { + ZText *ztext = zune_text_new(NULL, "0%", ZTEXT_ARG_NONE, 0); + if (ztext) + { + zune_text_get_bounds(ztext, obj); + zune_text_draw(ztext, obj, _mleft(obj), _mright(obj), + _mtop(obj) + 4); + zune_text_destroy(ztext); + } + Move(_rp(obj), _mleft(obj), _mtop(obj)); + Draw(_rp(obj), _mleft(obj), _mtop(obj) + 3); + drawpct = FALSE; + } + else if (k == i) /* draw 100% */ + { + ZText *ztext = + zune_text_new("\33r", "100%", ZTEXT_ARG_NONE, 0); + if (ztext) + { + zune_text_get_bounds(ztext, obj); + zune_text_draw(ztext, obj, _mleft(obj), _mright(obj), + _mtop(obj) + 4); + zune_text_destroy(ztext); + } + Move(_rp(obj), _mright(obj), _mtop(obj)); + Draw(_rp(obj), _mright(obj), _mtop(obj) + 3); + drawpct = FALSE; + } + else if (drawpct == TRUE) /* draw intermediate values and lines */ + { + ZText *ztext; + int val = k * 100 / i; + + snprintf(buf, 255, "%d%%", (int)val); + ztext = zune_text_new(NULL, buf, ZTEXT_ARG_NONE, 0); + if (ztext) + { + int width; + zune_text_get_bounds(ztext, obj); + width = TextLength(_rp(obj), buf, strlen(buf)); + zune_text_draw(ztext, obj, + _mleft(obj) + _mwidth(obj) * k / i - width / 2, + _mright(obj), _mtop(obj) + 4); + zune_text_destroy(ztext); + } + Move(_rp(obj), _mleft(obj) + _mwidth(obj) * k / i, + _mtop(obj)); + Draw(_rp(obj), _mleft(obj) + _mwidth(obj) * k / i, + _mtop(obj) + 3); + drawpct = FALSE; + } + else /* draw intermediate lines */ + { + Move(_rp(obj), _mleft(obj) + _mwidth(obj) * k / i, + _mtop(obj) + 1); + Draw(_rp(obj), _mleft(obj) + _mwidth(obj) * k / i, + _mtop(obj) + 3); + drawpct = TRUE; + } + } + } + else + { + } + return 0; +} + +#if ZUNE_BUILTIN_SCALE +BOOPSI_DISPATCHER(IPTR, Scale_Dispatcher, cl, obj, msg) +{ + switch (msg->MethodID) + { + case OM_NEW: + return Scale__OM_NEW(cl, obj, (struct opSet *)msg); + case OM_SET: + return Scale__OM_SET(cl, obj, (struct opSet *)msg); + case OM_GET: + return Scale__OM_GET(cl, obj, (struct opGet *)msg); + case MUIM_Setup: + return Scale__MUIM_Setup(cl, obj, (struct MUIP_Setup *)msg); + case MUIM_AskMinMax: + return Scale__MUIM_AskMinMax(cl, obj, (struct MUIP_AskMinMax *)msg); + case MUIM_Draw: + return Scale__MUIM_Draw(cl, obj, (struct MUIP_Draw *)msg); + default: + return DoSuperMethodA(cl, obj, msg); + } +} +BOOPSI_DISPATCHER_END + +const struct __MUIBuiltinClass _MUI_Scale_desc = +{ + MUIC_Scale, + MUIC_Area, + sizeof(struct Scale_DATA), + (void *) Scale_Dispatcher +}; +#endif /* ZUNE_BUILTIN_SCALE */ diff --git a/workbench/libs/muimaster/classes/scale.h b/workbench/libs/muimaster/classes/scale.h index d9bc7fb0be..118d178c93 100644 --- a/workbench/libs/muimaster/classes/scale.h +++ b/workbench/libs/muimaster/classes/scale.h @@ -10,12 +10,12 @@ #define MUIC_Scale "Scale.mui" /*** Identifier base (for Zune extensions) **********************************/ -#define MUIB_Scale (MUIB_ZUNE | 0x00002d00) +#define MUIB_Scale (MUIB_ZUNE | 0x00002d00) /*** Attributes *************************************************************/ -#define MUIA_Scale_Horiz (MUIB_MUI|0x0042919a) /* MUI: V4 isg BOOL */ +#define MUIA_Scale_Horiz (MUIB_MUI | 0x0042919a) /* MUI: V4 isg BOOL */ -extern const struct __MUIBuiltinClass _MUI_Scale_desc; /* PRIV */ +extern const struct __MUIBuiltinClass _MUI_Scale_desc; /* PRIV */ #endif /* _MUI_CLASSES_SCALE_H */ diff --git a/workbench/libs/muimaster/classes/scrollbar.c b/workbench/libs/muimaster/classes/scrollbar.c dissimilarity index 66% index cb5d9ba374..c8c0c204cb 100644 --- a/workbench/libs/muimaster/classes/scrollbar.c +++ b/workbench/libs/muimaster/classes/scrollbar.c @@ -1,177 +1,180 @@ -/* - Copyright 2002-2006, The AROS Development Team. All rights reserved. - $Id$ -*/ - -#include <exec/memory.h> -#include <intuition/icclass.h> -#include <intuition/gadgetclass.h> -#include <clib/alib_protos.h> -#include <proto/exec.h> -#include <proto/intuition.h> -#include <proto/utility.h> -#include <proto/muimaster.h> - -#include "../datatypescache.h" -#include "../imspec_intern.h" - -#include "mui.h" -#include "muimaster_intern.h" -#include "support.h" -#include "prefs.h" - -#define MYDEBUG 1 -#include "debug.h" - -extern struct Library *MUIMasterBase; - -struct Scrollbar_DATA -{ - Object *prop; - Object *up_arrow; - Object *down_arrow; - int sb_pos; -}; - - -IPTR Scrollbar__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct Scrollbar_DATA *data; - //struct TagItem *tags,*tag; - int horiz = GetTagData(MUIA_Group_Horiz, 0, msg->ops_AttrList); - int usewinborder = GetTagData(MUIA_Prop_UseWinBorder, 0, msg->ops_AttrList); - int sb_pos = GetTagData(MUIA_Scrollbar_Type, 0, msg->ops_AttrList); - - Object *prop = MUI_NewObject(MUIC_Prop, PropFrame, MUIA_Prop_Horiz, horiz, - TAG_MORE, msg->ops_AttrList); - - obj = (Object *)DoSuperNewTags(cl, obj, NULL, - MUIA_Group_Spacing, 0, - MUIA_Background, MUII_GroupBack, - - TAG_MORE, (IPTR) msg->ops_AttrList); - if (!obj) - return FALSE; - - data = INST_DATA(cl, obj); - data->prop = prop; - data->sb_pos = sb_pos; - - if (!usewinborder) - { - data->up_arrow = ImageObject, - MUIA_Background, MUII_ButtonBack, - MUIA_Weight, 0, - ImageButtonFrame, - MUIA_InputMode, MUIV_InputMode_RelVerify, - MUIA_Image_Spec, horiz ? MUII_ArrowLeft : MUII_ArrowUp, - MUIA_Image_Prop, prop, - End; - if (data->up_arrow) - { - DoMethod(data->up_arrow, MUIM_Notify, MUIA_Timer, MUIV_EveryTime, - (IPTR)prop, 2, MUIM_Prop_Decrease, 1); - } - - data->down_arrow = ImageObject, - MUIA_Background, MUII_ButtonBack, - MUIA_Weight, 0, - ImageButtonFrame, - MUIA_InputMode, MUIV_InputMode_RelVerify, - MUIA_Image_Spec, horiz ? MUII_ArrowRight : MUII_ArrowDown, - MUIA_Image_Prop, prop, - End; - if (data->down_arrow) - { - DoMethod(data->down_arrow, MUIM_Notify, MUIA_Timer, MUIV_EveryTime, - (IPTR)prop, 2, MUIM_Prop_Increase, 1); - } - - switch (sb_pos) - { - case MUIV_Scrollbar_Type_Default: - case MUIV_Scrollbar_Type_Top: - DoMethod(obj, OM_ADDMEMBER, (IPTR)data->prop); - DoMethod(obj, OM_ADDMEMBER, (IPTR)data->up_arrow); - DoMethod(obj, OM_ADDMEMBER, (IPTR)data->down_arrow); - break; - case MUIV_Scrollbar_Type_Bottom: - DoMethod(obj, OM_ADDMEMBER, (IPTR)data->up_arrow); - DoMethod(obj, OM_ADDMEMBER, (IPTR)data->down_arrow); - DoMethod(obj, OM_ADDMEMBER, (IPTR)data->prop); - break; - case MUIV_Scrollbar_Type_Sym: - DoMethod(obj, OM_ADDMEMBER, (IPTR)data->up_arrow); - DoMethod(obj, OM_ADDMEMBER, (IPTR)data->prop); - DoMethod(obj, OM_ADDMEMBER, (IPTR)data->down_arrow); - break; - } - } - else - { - _flags(obj) |= MADF_BORDERGADGET; - DoMethod(obj, OM_ADDMEMBER, (IPTR)data->prop); - } - - return (IPTR)obj; -} - - -IPTR Scrollbar__MUIM_Setup(struct IClass *cl, Object *obj, Msg msg) -{ - struct Scrollbar_DATA *data = INST_DATA(cl, obj); - - if (!DoSuperMethodA(cl, obj, msg)) - return FALSE; - - if (!(_flags(obj) & MADF_BORDERGADGET) && !data->sb_pos) - { - switch (muiGlobalInfo(obj)->mgi_Prefs->scrollbar_arrangement) - { - case SCROLLBAR_ARRANGEMENT_TOP: - DoMethod(obj, MUIM_Group_Sort, (IPTR)data->prop, - (IPTR)data->up_arrow, (IPTR)data->down_arrow, (IPTR)NULL); - break; - case SCROLLBAR_ARRANGEMENT_MIDDLE: - DoMethod(obj, MUIM_Group_Sort, (IPTR)data->up_arrow, - (IPTR)data->prop, (IPTR)data->down_arrow, (IPTR)NULL); - break; - case SCROLLBAR_ARRANGEMENT_BOTTOM: - DoMethod(obj, MUIM_Group_Sort, (IPTR)data->up_arrow, - (IPTR)data->down_arrow, (IPTR)data->prop, (IPTR)NULL); - break; - } - - switch (muiGlobalInfo(obj)->mgi_Prefs->scrollbar_type) - { - case SCROLLBAR_TYPE_STANDARD: - break; - case SCROLLBAR_TYPE_NEWLOOK: - break; - case SCROLLBAR_TYPE_CUSTOM: - break; - } - } - - return TRUE; -} - - -BOOPSI_DISPATCHER(IPTR, Scrollbar_Dispatcher, cl, obj, msg) -{ - switch (msg->MethodID) - { - case OM_NEW: return Scrollbar__OM_NEW(cl, obj, (struct opSet *) msg); - case MUIM_Setup: return Scrollbar__MUIM_Setup(cl, obj, msg); - default: return DoSuperMethodA(cl, obj, msg); - } -} -BOOPSI_DISPATCHER_END - -const struct __MUIBuiltinClass _MUI_Scrollbar_desc = -{ - MUIC_Scrollbar, - MUIC_Group, - sizeof(struct Scrollbar_DATA), - (void*)Scrollbar_Dispatcher -}; +/* + Copyright 2002-2006, The AROS Development Team. All rights reserved. + $Id$ +*/ + +#include <exec/memory.h> +#include <intuition/icclass.h> +#include <intuition/gadgetclass.h> +#include <clib/alib_protos.h> +#include <proto/exec.h> +#include <proto/intuition.h> +#include <proto/utility.h> +#include <proto/muimaster.h> + +#include "../datatypescache.h" +#include "../imspec_intern.h" + +#include "mui.h" +#include "muimaster_intern.h" +#include "support.h" +#include "prefs.h" + +#define MYDEBUG 1 +#include "debug.h" + +extern struct Library *MUIMasterBase; + +struct Scrollbar_DATA +{ + Object *prop; + Object *up_arrow; + Object *down_arrow; + int sb_pos; +}; + + +IPTR Scrollbar__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) +{ + struct Scrollbar_DATA *data; + //struct TagItem *tags,*tag; + int horiz = GetTagData(MUIA_Group_Horiz, 0, msg->ops_AttrList); + int usewinborder = + GetTagData(MUIA_Prop_UseWinBorder, 0, msg->ops_AttrList); + int sb_pos = GetTagData(MUIA_Scrollbar_Type, 0, msg->ops_AttrList); + + Object *prop = + MUI_NewObject(MUIC_Prop, PropFrame, MUIA_Prop_Horiz, horiz, + TAG_MORE, msg->ops_AttrList); + + obj = (Object *) DoSuperNewTags(cl, obj, NULL, + MUIA_Group_Spacing, 0, + MUIA_Background, MUII_GroupBack, + TAG_MORE, (IPTR) msg->ops_AttrList); + if (!obj) + return FALSE; + + data = INST_DATA(cl, obj); + data->prop = prop; + data->sb_pos = sb_pos; + + if (!usewinborder) + { + data->up_arrow = ImageObject, + MUIA_Background, MUII_ButtonBack, + MUIA_Weight, 0, + ImageButtonFrame, + MUIA_InputMode, MUIV_InputMode_RelVerify, + MUIA_Image_Spec, horiz ? MUII_ArrowLeft : MUII_ArrowUp, + MUIA_Image_Prop, prop, End; + if (data->up_arrow) + { + DoMethod(data->up_arrow, MUIM_Notify, MUIA_Timer, + MUIV_EveryTime, (IPTR) prop, 2, MUIM_Prop_Decrease, 1); + } + + data->down_arrow = ImageObject, + MUIA_Background, MUII_ButtonBack, + MUIA_Weight, 0, + ImageButtonFrame, + MUIA_InputMode, MUIV_InputMode_RelVerify, + MUIA_Image_Spec, horiz ? MUII_ArrowRight : MUII_ArrowDown, + MUIA_Image_Prop, prop, End; + if (data->down_arrow) + { + DoMethod(data->down_arrow, MUIM_Notify, MUIA_Timer, + MUIV_EveryTime, (IPTR) prop, 2, MUIM_Prop_Increase, 1); + } + + switch (sb_pos) + { + case MUIV_Scrollbar_Type_Default: + case MUIV_Scrollbar_Type_Top: + DoMethod(obj, OM_ADDMEMBER, (IPTR) data->prop); + DoMethod(obj, OM_ADDMEMBER, (IPTR) data->up_arrow); + DoMethod(obj, OM_ADDMEMBER, (IPTR) data->down_arrow); + break; + case MUIV_Scrollbar_Type_Bottom: + DoMethod(obj, OM_ADDMEMBER, (IPTR) data->up_arrow); + DoMethod(obj, OM_ADDMEMBER, (IPTR) data->down_arrow); + DoMethod(obj, OM_ADDMEMBER, (IPTR) data->prop); + break; + case MUIV_Scrollbar_Type_Sym: + DoMethod(obj, OM_ADDMEMBER, (IPTR) data->up_arrow); + DoMethod(obj, OM_ADDMEMBER, (IPTR) data->prop); + DoMethod(obj, OM_ADDMEMBER, (IPTR) data->down_arrow); + break; + } + } + else + { + _flags(obj) |= MADF_BORDERGADGET; + DoMethod(obj, OM_ADDMEMBER, (IPTR) data->prop); + } + + return (IPTR) obj; +} + + +IPTR Scrollbar__MUIM_Setup(struct IClass *cl, Object *obj, Msg msg) +{ + struct Scrollbar_DATA *data = INST_DATA(cl, obj); + + if (!DoSuperMethodA(cl, obj, msg)) + return FALSE; + + if (!(_flags(obj) & MADF_BORDERGADGET) && !data->sb_pos) + { + switch (muiGlobalInfo(obj)->mgi_Prefs->scrollbar_arrangement) + { + case SCROLLBAR_ARRANGEMENT_TOP: + DoMethod(obj, MUIM_Group_Sort, (IPTR) data->prop, + (IPTR) data->up_arrow, (IPTR) data->down_arrow, + (IPTR) NULL); + break; + case SCROLLBAR_ARRANGEMENT_MIDDLE: + DoMethod(obj, MUIM_Group_Sort, (IPTR) data->up_arrow, + (IPTR) data->prop, (IPTR) data->down_arrow, (IPTR) NULL); + break; + case SCROLLBAR_ARRANGEMENT_BOTTOM: + DoMethod(obj, MUIM_Group_Sort, (IPTR) data->up_arrow, + (IPTR) data->down_arrow, (IPTR) data->prop, (IPTR) NULL); + break; + } + + switch (muiGlobalInfo(obj)->mgi_Prefs->scrollbar_type) + { + case SCROLLBAR_TYPE_STANDARD: + break; + case SCROLLBAR_TYPE_NEWLOOK: + break; + case SCROLLBAR_TYPE_CUSTOM: + break; + } + } + + return TRUE; +} + + +BOOPSI_DISPATCHER(IPTR, Scrollbar_Dispatcher, cl, obj, msg) +{ + switch (msg->MethodID) + { + case OM_NEW: + return Scrollbar__OM_NEW(cl, obj, (struct opSet *)msg); + case MUIM_Setup: + return Scrollbar__MUIM_Setup(cl, obj, msg); + default: + return DoSuperMethodA(cl, obj, msg); + } +} +BOOPSI_DISPATCHER_END + +const struct __MUIBuiltinClass _MUI_Scrollbar_desc = +{ + MUIC_Scrollbar, + MUIC_Group, + sizeof(struct Scrollbar_DATA), + (void *)Scrollbar_Dispatcher +}; diff --git a/workbench/libs/muimaster/classes/scrollbar.h b/workbench/libs/muimaster/classes/scrollbar.h index bb95b5f9d3..12644146a8 100644 --- a/workbench/libs/muimaster/classes/scrollbar.h +++ b/workbench/libs/muimaster/classes/scrollbar.h @@ -13,7 +13,7 @@ #define MUIB_Scrollbar (MUIB_ZUNE | 0x00002e00) /*** Attributes *************************************************************/ -#define MUIA_Scrollbar_Type (MUIB_MUI|0x0042fb6b) /* V11 i.. LONG */ +#define MUIA_Scrollbar_Type (MUIB_MUI | 0x0042fb6b) /* V11 i.. LONG */ enum { @@ -24,6 +24,6 @@ enum }; -extern const struct __MUIBuiltinClass _MUI_Scrollbar_desc; /* PRIV */ +extern const struct __MUIBuiltinClass _MUI_Scrollbar_desc; /* PRIV */ #endif /* _MUI_CLASSES_SCROLLBAR_H */ diff --git a/workbench/libs/muimaster/classes/scrollbutton.c b/workbench/libs/muimaster/classes/scrollbutton.c dissimilarity index 74% index 212204a563..7b2ac49f77 100644 --- a/workbench/libs/muimaster/classes/scrollbutton.c +++ b/workbench/libs/muimaster/classes/scrollbutton.c @@ -1,205 +1,232 @@ -/* - Copyright © 2002-2011, The AROS Development Team. All rights reserved. - $Id$ -*/ - -#include <string.h> -#include <stdlib.h> -#include <stdio.h> - -#include <intuition/intuitionbase.h> - -#include <clib/alib_protos.h> -#include <proto/exec.h> -#include <proto/utility.h> -#include <proto/intuition.h> -#include <proto/muimaster.h> - -#include "mui.h" -#include "muimaster_intern.h" -#include "support.h" - -extern struct Library *MUIMasterBase; - -struct Scrollbutton_DATA -{ - WORD mx,my; - WORD cx,cy; - ULONG pos; - Object *horiz_prop; - Object *vert_prop; - struct MUI_EventHandlerNode ehn; -}; - - -IPTR Scrollbutton__OM_NEW(struct IClass * cl, Object * o, struct opSet * msg) -{ - return DoSuperNewTags(cl, o, NULL, - ButtonFrame, - MUIA_InputMode, MUIV_InputMode_RelVerify, - MUIA_Background, MUII_ButtonBack, - TAG_MORE, (IPTR) msg->ops_AttrList); -} - -IPTR Scrollbutton__OM_GET(struct IClass * cl, Object * o, struct opGet * msg) -{ - struct Scrollbutton_DATA *data = (struct Scrollbutton_DATA *) INST_DATA(cl, o); - switch (msg->opg_AttrID) - { - case MUIA_Scrollbutton_NewPosition: - *msg->opg_Storage = data->pos; - return TRUE; - - case MUIA_Scrollbutton_HorizProp: - *msg->opg_Storage = (IPTR)data->horiz_prop; - return TRUE; - - case MUIA_Scrollbutton_VertProp: - *msg->opg_Storage = (IPTR)data->horiz_prop; - return TRUE; - - default: - return DoSuperMethodA(cl, o, (Msg) msg); - } -} - -IPTR Scrollbutton__OM_SET(struct IClass * cl, Object * o, struct opSet * msg) -{ - struct Scrollbutton_DATA *data = (struct Scrollbutton_DATA *) INST_DATA(cl, o); - struct TagItem *tl = msg->ops_AttrList; - struct TagItem *ti; - - while ((ti = NextTagItem(&tl))) - { - switch (ti->ti_Tag) - { - case MUIA_Scrollbutton_Horiz: - data->cx = ti->ti_Data; - break; - - case MUIA_Scrollbutton_Vert: - data->cy = ti->ti_Data; - break; - } - } - return DoSuperMethodA(cl, o, (Msg) msg); -} - -IPTR Scrollbutton__MUIM_AskMinMax(struct IClass *cl, Object *o, struct MUIP_AskMinMax *msg) -{ - DoSuperMethodA(cl, o, (Msg) msg); - - msg->MinMaxInfo->MinWidth += 2; - msg->MinMaxInfo->DefWidth += 2; - msg->MinMaxInfo->MaxWidth += MUI_MAXMAX; - - msg->MinMaxInfo->MinHeight += 2; - msg->MinMaxInfo->DefHeight += 2; - msg->MinMaxInfo->MaxHeight += MUI_MAXMAX; - return 0; -} - -IPTR Scrollbutton__MUIM_Setup(struct IClass * cl, Object * o, Msg msg) -{ - struct Scrollbutton_DATA *data = (struct Scrollbutton_DATA *) INST_DATA(cl, o); - if (!DoSuperMethodA(cl, o, msg)) - return FALSE; - - data->ehn.ehn_Events = IDCMP_MOUSEBUTTONS; - data->ehn.ehn_Priority = 0; - data->ehn.ehn_Flags = 0; - data->ehn.ehn_Object = o; - data->ehn.ehn_Class = cl; - - DoMethod(_win(o), MUIM_Window_AddEventHandler, (IPTR)&data->ehn); - - return TRUE; -} - -IPTR Scrollbutton__MUIM_Cleanup(struct IClass * cl, Object * o, Msg msg) -{ - struct Scrollbutton_DATA *data = (struct Scrollbutton_DATA *) INST_DATA(cl, o); - DoMethod(_win(o), MUIM_Window_RemEventHandler, (IPTR)&data->ehn); - DoSuperMethodA(cl, o, msg); - return 0; -} - -IPTR Scrollbutton__MUIM_HandleEvent(struct IClass * cl, Object * o, struct MUIP_HandleEvent * msg) -{ - struct Scrollbutton_DATA *data = (struct Scrollbutton_DATA *) INST_DATA(cl, o); - if (msg->imsg) - { - switch (msg->imsg->Class) - { - case IDCMP_MOUSEBUTTONS: - if (msg->imsg->Code == SELECTDOWN) - { - if (msg->imsg->MouseX >= _left(o) && msg->imsg->MouseX <= _right(o) && msg->imsg->MouseY >= _top(o) && msg->imsg->MouseY <= _bottom(o)) - { - DoMethod(_win(o), MUIM_Window_RemEventHandler, (IPTR)&data->ehn); - data->ehn.ehn_Events |= IDCMP_MOUSEMOVE; - DoMethod(_win(o), MUIM_Window_AddEventHandler, (IPTR)&data->ehn); - - set(o,MUIA_Selected, TRUE); - data->mx = msg->imsg->MouseX; - data->my = msg->imsg->MouseY; - - } - } else - { - if (data->ehn.ehn_Events & IDCMP_MOUSEMOVE) - { - DoMethod(_win(o), MUIM_Window_RemEventHandler, (IPTR)&data->ehn); - data->ehn.ehn_Events &= ~IDCMP_MOUSEMOVE; - DoMethod(_win(o), MUIM_Window_AddEventHandler, (IPTR)&data->ehn); - - set(o,MUIA_Selected, FALSE); - } - } - break; - - case IDCMP_MOUSEMOVE: - { - IPTR sel = 0; - - get(o,MUIA_Selected, &sel); - if (sel) - { - UWORD x = (msg->imsg->MouseX - data->mx) + data->cx; - UWORD y = (msg->imsg->MouseY - data->my) + data->cy; - ULONG pos = x << 16 | y; - - data->pos = pos; - set(o,MUIA_Scrollbutton_NewPosition,pos); - } - break; - } - } - } - return 0; -} - - -BOOPSI_DISPATCHER(IPTR, Scrollbutton_Dispatcher, cl, obj, msg) -{ - switch (msg->MethodID) - { - case OM_NEW: return Scrollbutton__OM_NEW(cl, obj, (struct opSet *) msg); - case OM_GET: return Scrollbutton__OM_GET(cl, obj, (struct opGet *) msg); - case OM_SET: return Scrollbutton__OM_SET(cl, obj, (struct opSet *) msg); - case MUIM_AskMinMax: return Scrollbutton__MUIM_AskMinMax(cl, obj, (struct MUIP_AskMinMax *) msg); - case MUIM_Setup: return Scrollbutton__MUIM_Setup(cl, obj, msg); - case MUIM_Cleanup: return Scrollbutton__MUIM_Cleanup(cl, obj, msg); - case MUIM_HandleEvent: return Scrollbutton__MUIM_HandleEvent(cl, obj, (struct MUIP_HandleEvent *) msg); - default: return DoSuperMethodA(cl, obj, msg); - } -} -BOOPSI_DISPATCHER_END - -const struct __MUIBuiltinClass _MUI_Scrollbutton_desc = -{ - MUIC_Scrollbutton, - MUIC_Area, - sizeof(struct Scrollbutton_DATA), - (void*)Scrollbutton_Dispatcher -}; +/* + Copyright © 2002-2011, The AROS Development Team. All rights reserved. + $Id$ +*/ + +#include <string.h> +#include <stdlib.h> +#include <stdio.h> + +#include <intuition/intuitionbase.h> + +#include <clib/alib_protos.h> +#include <proto/exec.h> +#include <proto/utility.h> +#include <proto/intuition.h> +#include <proto/muimaster.h> + +#include "mui.h" +#include "muimaster_intern.h" +#include "support.h" + +extern struct Library *MUIMasterBase; + +struct Scrollbutton_DATA +{ + WORD mx, my; + WORD cx, cy; + ULONG pos; + Object *horiz_prop; + Object *vert_prop; + struct MUI_EventHandlerNode ehn; +}; + + +IPTR Scrollbutton__OM_NEW(struct IClass *cl, Object *o, struct opSet *msg) +{ + return DoSuperNewTags(cl, o, NULL, + ButtonFrame, + MUIA_InputMode, MUIV_InputMode_RelVerify, + MUIA_Background, MUII_ButtonBack, + TAG_MORE, (IPTR) msg->ops_AttrList); +} + +IPTR Scrollbutton__OM_GET(struct IClass *cl, Object *o, + struct opGet *msg) +{ + struct Scrollbutton_DATA *data = + (struct Scrollbutton_DATA *)INST_DATA(cl, o); + switch (msg->opg_AttrID) + { + case MUIA_Scrollbutton_NewPosition: + *msg->opg_Storage = data->pos; + return TRUE; + + case MUIA_Scrollbutton_HorizProp: + *msg->opg_Storage = (IPTR) data->horiz_prop; + return TRUE; + + case MUIA_Scrollbutton_VertProp: + *msg->opg_Storage = (IPTR) data->horiz_prop; + return TRUE; + + default: + return DoSuperMethodA(cl, o, (Msg) msg); + } +} + +IPTR Scrollbutton__OM_SET(struct IClass *cl, Object *o, + struct opSet *msg) +{ + struct Scrollbutton_DATA *data = + (struct Scrollbutton_DATA *)INST_DATA(cl, o); + struct TagItem *tl = msg->ops_AttrList; + struct TagItem *ti; + + while ((ti = NextTagItem(&tl))) + { + switch (ti->ti_Tag) + { + case MUIA_Scrollbutton_Horiz: + data->cx = ti->ti_Data; + break; + + case MUIA_Scrollbutton_Vert: + data->cy = ti->ti_Data; + break; + } + } + return DoSuperMethodA(cl, o, (Msg) msg); +} + +IPTR Scrollbutton__MUIM_AskMinMax(struct IClass *cl, Object *o, + struct MUIP_AskMinMax *msg) +{ + DoSuperMethodA(cl, o, (Msg) msg); + + msg->MinMaxInfo->MinWidth += 2; + msg->MinMaxInfo->DefWidth += 2; + msg->MinMaxInfo->MaxWidth += MUI_MAXMAX; + + msg->MinMaxInfo->MinHeight += 2; + msg->MinMaxInfo->DefHeight += 2; + msg->MinMaxInfo->MaxHeight += MUI_MAXMAX; + return 0; +} + +IPTR Scrollbutton__MUIM_Setup(struct IClass *cl, Object *o, Msg msg) +{ + struct Scrollbutton_DATA *data = + (struct Scrollbutton_DATA *)INST_DATA(cl, o); + if (!DoSuperMethodA(cl, o, msg)) + return FALSE; + + data->ehn.ehn_Events = IDCMP_MOUSEBUTTONS; + data->ehn.ehn_Priority = 0; + data->ehn.ehn_Flags = 0; + data->ehn.ehn_Object = o; + data->ehn.ehn_Class = cl; + + DoMethod(_win(o), MUIM_Window_AddEventHandler, (IPTR) & data->ehn); + + return TRUE; +} + +IPTR Scrollbutton__MUIM_Cleanup(struct IClass *cl, Object *o, Msg msg) +{ + struct Scrollbutton_DATA *data = + (struct Scrollbutton_DATA *)INST_DATA(cl, o); + DoMethod(_win(o), MUIM_Window_RemEventHandler, (IPTR) & data->ehn); + DoSuperMethodA(cl, o, msg); + return 0; +} + +IPTR Scrollbutton__MUIM_HandleEvent(struct IClass *cl, Object *o, + struct MUIP_HandleEvent *msg) +{ + struct Scrollbutton_DATA *data = + (struct Scrollbutton_DATA *)INST_DATA(cl, o); + if (msg->imsg) + { + switch (msg->imsg->Class) + { + case IDCMP_MOUSEBUTTONS: + if (msg->imsg->Code == SELECTDOWN) + { + if (msg->imsg->MouseX >= _left(o) + && msg->imsg->MouseX <= _right(o) + && msg->imsg->MouseY >= _top(o) + && msg->imsg->MouseY <= _bottom(o)) + { + DoMethod(_win(o), MUIM_Window_RemEventHandler, + (IPTR) & data->ehn); + data->ehn.ehn_Events |= IDCMP_MOUSEMOVE; + DoMethod(_win(o), MUIM_Window_AddEventHandler, + (IPTR) & data->ehn); + + set(o, MUIA_Selected, TRUE); + data->mx = msg->imsg->MouseX; + data->my = msg->imsg->MouseY; + + } + } + else + { + if (data->ehn.ehn_Events & IDCMP_MOUSEMOVE) + { + DoMethod(_win(o), MUIM_Window_RemEventHandler, + (IPTR) & data->ehn); + data->ehn.ehn_Events &= ~IDCMP_MOUSEMOVE; + DoMethod(_win(o), MUIM_Window_AddEventHandler, + (IPTR) & data->ehn); + + set(o, MUIA_Selected, FALSE); + } + } + break; + + case IDCMP_MOUSEMOVE: + { + IPTR sel = 0; + + get(o, MUIA_Selected, &sel); + if (sel) + { + UWORD x = (msg->imsg->MouseX - data->mx) + data->cx; + UWORD y = (msg->imsg->MouseY - data->my) + data->cy; + ULONG pos = x << 16 | y; + + data->pos = pos; + set(o, MUIA_Scrollbutton_NewPosition, pos); + } + break; + } + } + } + return 0; +} + + +BOOPSI_DISPATCHER(IPTR, Scrollbutton_Dispatcher, cl, obj, msg) +{ + switch (msg->MethodID) + { + case OM_NEW: + return Scrollbutton__OM_NEW(cl, obj, (struct opSet *)msg); + case OM_GET: + return Scrollbutton__OM_GET(cl, obj, (struct opGet *)msg); + case OM_SET: + return Scrollbutton__OM_SET(cl, obj, (struct opSet *)msg); + case MUIM_AskMinMax: + return Scrollbutton__MUIM_AskMinMax(cl, obj, + (struct MUIP_AskMinMax *)msg); + case MUIM_Setup: + return Scrollbutton__MUIM_Setup(cl, obj, msg); + case MUIM_Cleanup: + return Scrollbutton__MUIM_Cleanup(cl, obj, msg); + case MUIM_HandleEvent: + return Scrollbutton__MUIM_HandleEvent(cl, obj, + (struct MUIP_HandleEvent *)msg); + default: + return DoSuperMethodA(cl, obj, msg); + } +} +BOOPSI_DISPATCHER_END + +const struct __MUIBuiltinClass _MUI_Scrollbutton_desc = +{ + MUIC_Scrollbutton, + MUIC_Area, + sizeof(struct Scrollbutton_DATA), + (void *) Scrollbutton_Dispatcher +}; diff --git a/workbench/libs/muimaster/classes/scrollbutton.h b/workbench/libs/muimaster/classes/scrollbutton.h index 4884ba4605..988804b545 100644 --- a/workbench/libs/muimaster/classes/scrollbutton.h +++ b/workbench/libs/muimaster/classes/scrollbutton.h @@ -10,18 +10,23 @@ #define MUIC_Scrollbutton "Scrollbutton.mui" /*** Identifier base ********************************************************/ -#define MUIB_Scrollbutton (MUIB_ZUNE | 0x00004100) +#define MUIB_Scrollbutton (MUIB_ZUNE | 0x00004100) /*** Attributes *************************************************************/ -#define MUIA_Scrollbutton_NewPosition (MUIB_Scrollbutton | 0x00000000) /* --G ULONG (2 x WORD) */ -#define MUIA_Scrollbutton_Horiz (MUIB_Scrollbutton | 0x00000001) /* -SG WORD */ -#define MUIA_Scrollbutton_Vert (MUIB_Scrollbutton | 0x00000002) /* -SG WORD */ -#define MUIA_Scrollbutton_HorizProp (MUIB_Scrollbutton | 0x00000003) /* --G Object * */ -#define MUIA_Scrollbutton_VertProp (MUIB_Scrollbutton | 0x00000004) /* --G Object * */ +#define MUIA_Scrollbutton_NewPosition \ + (MUIB_Scrollbutton | 0x00000000) /* --G ULONG (2 x WORD) */ +#define MUIA_Scrollbutton_Horiz \ + (MUIB_Scrollbutton | 0x00000001) /* -SG WORD */ +#define MUIA_Scrollbutton_Vert \ + (MUIB_Scrollbutton | 0x00000002) /* -SG WORD */ +#define MUIA_Scrollbutton_HorizProp \ + (MUIB_Scrollbutton | 0x00000003) /* --G Object * */ +#define MUIA_Scrollbutton_VertProp \ + (MUIB_Scrollbutton | 0x00000004) /* --G Object * */ /*** Macros *****************************************************************/ #define ScrollbuttonObject MUIOBJMACRO_START(MUIC_Scrollbutton) -extern const struct __MUIBuiltinClass _MUI_Scrollbutton_desc; /* PRIV */ +extern const struct __MUIBuiltinClass _MUI_Scrollbutton_desc; /* PRIV */ -#endif /* _MUI_CLASSES_SCROLLBUTTON_H */ +#endif /* _MUI_CLASSES_SCROLLBUTTON_H */ diff --git a/workbench/libs/muimaster/classes/scrollgroup.c b/workbench/libs/muimaster/classes/scrollgroup.c dissimilarity index 79% index ca51e8f003..3154888c90 100644 --- a/workbench/libs/muimaster/classes/scrollgroup.c +++ b/workbench/libs/muimaster/classes/scrollgroup.c @@ -1,363 +1,422 @@ -/* - Copyright © 2002-2006, The AROS Development Team. All rights reserved. - $Id$ -*/ - -#define MUIMASTER_YES_INLINE_STDARG - -#include <exec/memory.h> -#include <intuition/icclass.h> -#include <intuition/gadgetclass.h> -#include <clib/alib_protos.h> -#include <proto/exec.h> -#include <proto/intuition.h> -#include <proto/utility.h> -#include <proto/muimaster.h> - -/* #define MYDEBUG 1 */ -#include "debug.h" -#include "mui.h" -#include "muimaster_intern.h" -#include "support.h" -#include "support_classes.h" -#include "scrollgroup_private.h" - -extern struct Library *MUIMasterBase; - - -AROS_UFH3(ULONG,Scrollgroup_Layout_Function, - AROS_UFHA(struct Hook *, hook, A0), - AROS_UFHA(Object *, obj, A2), - AROS_UFHA(struct MUI_LayoutMsg *, lm, A1)) -{ - AROS_USERFUNC_INIT - - struct Scrollgroup_DATA *data = (struct Scrollgroup_DATA *)hook->h_Data; - switch (lm->lm_Type) - { - case MUILM_MINMAX: - { - /* Calulate the minmax dimension of the group, - ** We only have a fixed number of children, so we need no NextObject() - */ - - if (data->usewinborder) - { - lm->lm_MinMax.MinWidth = _minwidth(data->contents); - lm->lm_MinMax.MinHeight = _minheight(data->contents); - lm->lm_MinMax.DefWidth = _defwidth(data->contents); - lm->lm_MinMax.DefHeight = _defheight(data->contents); - lm->lm_MinMax.MaxWidth = _maxwidth(data->contents); - lm->lm_MinMax.MaxHeight = _maxheight(data->contents); - - } - else - { - WORD maxxxxwidth = 0; - WORD maxxxxheight = 0; - - maxxxxwidth = _minwidth(data->contents); - if (_minwidth(data->horiz) > maxxxxwidth) maxxxxwidth = _minwidth(data->horiz); - maxxxxwidth += _minwidth(data->vert); - lm->lm_MinMax.MinWidth = maxxxxwidth; - - maxxxxheight = _minheight(data->contents); - if (_minheight(data->vert) > maxxxxheight) maxxxxheight = _minheight(data->vert); - maxxxxheight += _minheight(data->horiz); - lm->lm_MinMax.MinHeight = maxxxxheight; - - maxxxxwidth = _defwidth(data->contents); - if (_defwidth(data->horiz) > maxxxxwidth) maxxxxwidth = _defwidth(data->horiz); - if (maxxxxwidth < lm->lm_MinMax.MinWidth) maxxxxwidth = lm->lm_MinMax.MinWidth; - lm->lm_MinMax.DefWidth = maxxxxwidth; - - maxxxxheight = _defheight(data->contents); - if (_defheight(data->vert) > maxxxxheight) maxxxxheight = _defheight(data->vert); - if (maxxxxheight < lm->lm_MinMax.MinHeight) maxxxxheight = lm->lm_MinMax.MinHeight; - lm->lm_MinMax.DefHeight = maxxxxheight; - - lm->lm_MinMax.MaxWidth = MUI_MAXMAX; - lm->lm_MinMax.MaxHeight = MUI_MAXMAX; - } - - //kprintf("scrollgroup minmax: min %d x %d def %d x %d\n", - // lm->lm_MinMax.MinWidth, lm->lm_MinMax.MinHeight, - // lm->lm_MinMax.DefWidth, lm->lm_MinMax.DefHeight); - - //kprintf("contents minmax: min %d x %d def %d x %d\n", - // _minwidth(data->contents), _minheight(data->contents), - // _defwidth(data->contents), _defheight(data->contents)); - - return 0; - } - - case MUILM_LAYOUT: - { - /* Now place the objects between (0,0,lm->lm_Layout.Width-1,lm->lm_Layout.Height-1) - */ - - LONG virt_width; - LONG virt_height; - LONG virt_minwidth = 0; - LONG virt_minheight = 0; - LONG virt_maxwidth; - LONG virt_maxheight; - LONG vert_width = _minwidth(data->vert); - LONG horiz_height = _minheight(data->horiz); - LONG lay_width = lm->lm_Layout.Width; - LONG lay_height = lm->lm_Layout.Height; - LONG cont_width = lay_width - _subwidth(data->contents); - LONG cont_height = lay_height - _subheight(data->contents); - BOOL vbar = FALSE, hbar = FALSE; - - if (!data->usewinborder) - { - //kprintf("scrollgroup layout: %d x %d sub contents size %d,%d\n", - // lay_width, lay_height, _subwidth(data->contents), _subheight(data->contents)); - - /* layout the virtual group a first time, to determine the virtual width/height */ - //MUI_Layout(data->contents,0,0,lay_width,lay_height,0); - - get(data->contents, MUIA_Virtgroup_MinWidth, &virt_minwidth); - get(data->contents, MUIA_Virtgroup_MinHeight, &virt_minheight); - virt_minwidth -= _subwidth(data->contents); - virt_minheight -= _subheight(data->contents); - - virt_maxwidth = _maxwidth(data->contents) - _subwidth(data->contents); - virt_maxheight = _maxheight(data->contents) - _subheight(data->contents); - - virt_width = CLAMP(cont_width, virt_minwidth, virt_maxwidth); - virt_height = CLAMP(cont_height, virt_minheight, virt_maxheight); - - if (virt_width > cont_width) - { - cont_height -= horiz_height; - virt_height = CLAMP(cont_height, virt_minheight, virt_maxheight); - hbar = TRUE; - } - //kprintf(" 1: %d x %d hbar %d vbar %d\n", cont_width, cont_height, hbar, vbar); - - if (virt_height > cont_height) - { - cont_width -= vert_width; - virt_width = CLAMP(cont_width, virt_minwidth, virt_maxheight); - vbar = TRUE; - } - //kprintf(" 2: %d x %d hbar %d vbar %d\n", cont_width, cont_height, hbar, vbar); - - /* We need to check this a 2nd time!! */ - if (!hbar && (virt_width > cont_width)) - { - cont_height -= horiz_height; - virt_height = CLAMP(cont_height, virt_minheight, virt_maxheight); - hbar = TRUE; - } - //kprintf(" 3: %d x %d hbar %d vbar %d\n", cont_width, cont_height, hbar, vbar); - - } /* if (!data->usewinborder) */ - - cont_width += _subwidth(data->contents); - cont_height += _subheight(data->contents); - - //kprintf("cont_size layouted to %d,%d\n", cont_width, cont_height); - - if (hbar && vbar) - { - /* We need all scrollbars and the button */ - set(data->vert, MUIA_ShowMe, TRUE); /* We could also overload MUIM_Show... */ - set(data->horiz, MUIA_ShowMe, TRUE); - set(data->button, MUIA_ShowMe, TRUE); - MUI_Layout(data->vert, cont_width, 0, vert_width, cont_height,0); - MUI_Layout(data->horiz, 0, cont_height, cont_width, horiz_height, 0); - MUI_Layout(data->button, cont_width, cont_height, vert_width, horiz_height, 0); - } - else if (vbar) - { - set(data->vert, MUIA_ShowMe, TRUE); - set(data->horiz, MUIA_ShowMe, FALSE); - set(data->button, MUIA_ShowMe, FALSE); - - MUI_Layout(data->vert, cont_width, 0, vert_width, cont_height,0); - } - else if (hbar) - { - set(data->vert, MUIA_ShowMe, FALSE); - set(data->horiz, MUIA_ShowMe, TRUE); - set(data->button, MUIA_ShowMe, FALSE); - - MUI_Layout(data->horiz, 0, cont_height, cont_width, horiz_height, 0); - } - else if (!data->usewinborder) - { - set(data->vert, MUIA_ShowMe, FALSE); - set(data->horiz, MUIA_ShowMe, FALSE); - set(data->button, MUIA_ShowMe, FALSE); - } - - /* Layout the group a second time, note that setting _mwidth() and _mheight() should be enough, or we invent a new flag */ - MUI_Layout(data->contents,0,0,cont_width,cont_height,0); - - //kprintf(" contents size after layout: %d x %d inner %d x %d\n", - // _width(data->contents), _height(data->contents), - // _mwidth(data->contents), _mheight(data->contents)); - return 1; - } - } - return 0; - - AROS_USERFUNC_EXIT -} - - -AROS_UFH3(ULONG,Scrollgroup_Function, - AROS_UFHA(struct Hook *, hook, A0), - AROS_UFHA(APTR, dummy, A2), - AROS_UFHA(void **, msg, A1)) -{ - AROS_USERFUNC_INIT - - struct Scrollgroup_DATA *data = (struct Scrollgroup_DATA *)hook->h_Data; - SIPTR type = (SIPTR)msg[0]; - SIPTR val = (SIPTR)msg[1]; - - switch (type) - { - case 1: - { - get(data->vert,MUIA_Prop_First,&val); - SetAttrs(data->contents,MUIA_Virtgroup_Top, val, MUIA_NoNotify, TRUE, MUIA_Group_Forward, FALSE, TAG_DONE); - break; - } - - case 2: - { - get(data->horiz,MUIA_Prop_First,&val); - SetAttrs(data->contents,MUIA_Virtgroup_Left, val, MUIA_NoNotify, TRUE, MUIA_Group_Forward, FALSE, TAG_DONE); - break; - } - case 3: nnset(data->horiz, MUIA_Prop_First, val); break; - case 4: nnset(data->vert, MUIA_Prop_First, val); break; - } - return 0; - - AROS_USERFUNC_EXIT -} - -IPTR Scrollgroup__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct Scrollgroup_DATA *data; - //struct TagItem *tags,*tag; - Object *contents = (Object*)GetTagData(MUIA_Scrollgroup_Contents, 0, msg->ops_AttrList); - Object *vert,*horiz,*button,*group; - BOOL usewinborder; - Tag hbordertag = TAG_IGNORE; - Tag vbordertag = TAG_IGNORE; - - struct Hook *layout_hook = mui_alloc_struct(struct Hook); - if (!layout_hook) return 0; - - layout_hook->h_Entry = (HOOKFUNC)Scrollgroup_Layout_Function; - - usewinborder = GetTagData(MUIA_Scrollgroup_UseWinBorder, FALSE, msg->ops_AttrList); - if (usewinborder) - { - hbordertag = MUIA_Prop_UseWinBorder; - vbordertag = MUIA_Prop_UseWinBorder; - } - - obj = (Object *) DoSuperNewTags - ( - cl, obj, NULL, - - MUIA_Group_Horiz, FALSE, - Child, (IPTR) (group = (Object *)GroupObject, - MUIA_Group_LayoutHook, (IPTR) layout_hook, - Child, (IPTR) contents, - Child, (IPTR) (vert = (Object *)ScrollbarObject, MUIA_Group_Horiz, FALSE, vbordertag, MUIV_Prop_UseWinBorder_Right, End), - Child, (IPTR) (horiz = (Object *)ScrollbarObject, MUIA_Group_Horiz, TRUE, hbordertag, MUIV_Prop_UseWinBorder_Bottom, End), - Child, (IPTR) (button = (Object *)ScrollbuttonObject, End), - End), - - TAG_MORE, msg->ops_AttrList - ); - - if (!obj) - { - mui_free(layout_hook); - return 0; - } - - data = INST_DATA(cl, obj); - data->vert = vert; - data->horiz = horiz; - data->button = button; - data->contents = contents; - data->usewinborder = usewinborder; - - data->hook.h_Entry = (HOOKFUNC)Scrollgroup_Function; - data->hook.h_Data = data; - data->layout_hook = layout_hook; - layout_hook->h_Data = data; - - DoMethod(vert, MUIM_Notify, MUIA_Prop_First, MUIV_EveryTime, (IPTR)obj, 4, MUIM_CallHook, (IPTR)&data->hook, 1, MUIV_TriggerValue); - DoMethod(horiz, MUIM_Notify, MUIA_Prop_First, MUIV_EveryTime, (IPTR)obj, 4, MUIM_CallHook, (IPTR)&data->hook, 2, MUIV_TriggerValue); - DoMethod(contents, MUIM_Group_DoMethodNoForward, MUIM_Notify, MUIA_Virtgroup_Left, MUIV_EveryTime, (IPTR)obj, 4, MUIM_CallHook, (IPTR)&data->hook, 3, MUIV_TriggerValue); - DoMethod(contents, MUIM_Group_DoMethodNoForward, MUIM_Notify, MUIA_Virtgroup_Top, MUIV_EveryTime, (IPTR)obj, 4, MUIM_CallHook, (IPTR)&data->hook, 4, MUIV_TriggerValue); - - D(bug("Scrollgroup_New(%lx)\n", obj)); - D(bug(" vert = %lx, horiz = %lx, button = %lx\n", vert, horiz, button)); - return (IPTR)obj; -} - -IPTR Scrollgroup__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) -{ - struct Scrollgroup_DATA *data = INST_DATA(cl, obj); - mui_free(data->layout_hook); - return DoSuperMethodA(cl,obj,msg); -} - -IPTR Scrollgroup__MUIM_Show(struct IClass *cl, Object *obj, struct MUIP_Show *msg) -{ - struct Scrollgroup_DATA *data = INST_DATA(cl, obj); - LONG top = 0,left = 0,width = 0,height = 0; - - get(data->contents, MUIA_Virtgroup_Left, &left); - get(data->contents, MUIA_Virtgroup_Top, &top); - get(data->contents, MUIA_Virtgroup_Width, &width); - get(data->contents, MUIA_Virtgroup_Height, &height); - - SetAttrs(data->horiz, MUIA_Prop_First, left, - MUIA_Prop_Entries, width, - MUIA_Prop_Visible, _mwidth(data->contents), - TAG_DONE); - - - SetAttrs(data->vert, MUIA_Prop_First, top, - MUIA_Prop_Entries, height, - MUIA_Prop_Visible, _mheight(data->contents), - TAG_DONE); - - return DoSuperMethodA(cl,obj,(Msg)msg); -} - -#if ZUNE_BUILTIN_SCROLLGROUP -BOOPSI_DISPATCHER(IPTR, Scrollgroup_Dispatcher, cl, obj, msg) -{ - switch (msg->MethodID) - { - case OM_NEW: return Scrollgroup__OM_NEW(cl, obj, (struct opSet *) msg); - case OM_DISPOSE: return Scrollgroup__OM_DISPOSE(cl, obj, msg); - case MUIM_Show: return Scrollgroup__MUIM_Show(cl, obj, (struct MUIP_Show*)msg); - default: return DoSuperMethodA(cl, obj, msg); - } -} -BOOPSI_DISPATCHER_END - -const struct __MUIBuiltinClass _MUI_Scrollgroup_desc = -{ - MUIC_Scrollgroup, - MUIC_Group, - sizeof(struct Scrollgroup_DATA), - (void*)Scrollgroup_Dispatcher -}; -#endif /* ZUNE_BUILTIN_SCROLLGROUP */ +/* + Copyright © 2002-2006, The AROS Development Team. All rights reserved. + $Id$ +*/ + +#define MUIMASTER_YES_INLINE_STDARG + +#include <exec/memory.h> +#include <intuition/icclass.h> +#include <intuition/gadgetclass.h> +#include <clib/alib_protos.h> +#include <proto/exec.h> +#include <proto/intuition.h> +#include <proto/utility.h> +#include <proto/muimaster.h> + +/* #define MYDEBUG 1 */ +#include "debug.h" +#include "mui.h" +#include "muimaster_intern.h" +#include "support.h" +#include "support_classes.h" +#include "scrollgroup_private.h" + +extern struct Library *MUIMasterBase; + + +AROS_UFH3(ULONG, Scrollgroup_Layout_Function, + AROS_UFHA(struct Hook *, hook, A0), + AROS_UFHA(Object *, obj, A2), + AROS_UFHA(struct MUI_LayoutMsg *, lm, A1)) +{ + AROS_USERFUNC_INIT + + struct Scrollgroup_DATA *data = + (struct Scrollgroup_DATA *)hook->h_Data; + + switch (lm->lm_Type) + { + case MUILM_MINMAX: + { + /* Calulate the minmax dimension of the group, + ** We only have a fixed number of children, so we need + ** no NextObject() + */ + + if (data->usewinborder) + { + lm->lm_MinMax.MinWidth = _minwidth(data->contents); + lm->lm_MinMax.MinHeight = _minheight(data->contents); + lm->lm_MinMax.DefWidth = _defwidth(data->contents); + lm->lm_MinMax.DefHeight = _defheight(data->contents); + lm->lm_MinMax.MaxWidth = _maxwidth(data->contents); + lm->lm_MinMax.MaxHeight = _maxheight(data->contents); + + } + else + { + WORD maxxxxwidth = 0; + WORD maxxxxheight = 0; + + maxxxxwidth = _minwidth(data->contents); + if (_minwidth(data->horiz) > maxxxxwidth) + maxxxxwidth = _minwidth(data->horiz); + maxxxxwidth += _minwidth(data->vert); + lm->lm_MinMax.MinWidth = maxxxxwidth; + + maxxxxheight = _minheight(data->contents); + if (_minheight(data->vert) > maxxxxheight) + maxxxxheight = _minheight(data->vert); + maxxxxheight += _minheight(data->horiz); + lm->lm_MinMax.MinHeight = maxxxxheight; + + maxxxxwidth = _defwidth(data->contents); + if (_defwidth(data->horiz) > maxxxxwidth) + maxxxxwidth = _defwidth(data->horiz); + if (maxxxxwidth < lm->lm_MinMax.MinWidth) + maxxxxwidth = lm->lm_MinMax.MinWidth; + lm->lm_MinMax.DefWidth = maxxxxwidth; + + maxxxxheight = _defheight(data->contents); + if (_defheight(data->vert) > maxxxxheight) + maxxxxheight = _defheight(data->vert); + if (maxxxxheight < lm->lm_MinMax.MinHeight) + maxxxxheight = lm->lm_MinMax.MinHeight; + lm->lm_MinMax.DefHeight = maxxxxheight; + + lm->lm_MinMax.MaxWidth = MUI_MAXMAX; + lm->lm_MinMax.MaxHeight = MUI_MAXMAX; + } + + //kprintf("scrollgroup minmax: min %d x %d def %d x %d\n", + // lm->lm_MinMax.MinWidth, lm->lm_MinMax.MinHeight, + // lm->lm_MinMax.DefWidth, lm->lm_MinMax.DefHeight); + + //kprintf("contents minmax: min %d x %d def %d x %d\n", + // _minwidth(data->contents), _minheight(data->contents), + // _defwidth(data->contents), _defheight(data->contents)); + + return 0; + } + + case MUILM_LAYOUT: + { + /* Now place the objects between + * (0,0,lm->lm_Layout.Width-1,lm->lm_Layout.Height-1) + */ + + LONG virt_width; + LONG virt_height; + LONG virt_minwidth = 0; + LONG virt_minheight = 0; + LONG virt_maxwidth; + LONG virt_maxheight; + LONG vert_width = _minwidth(data->vert); + LONG horiz_height = _minheight(data->horiz); + LONG lay_width = lm->lm_Layout.Width; + LONG lay_height = lm->lm_Layout.Height; + LONG cont_width = lay_width - _subwidth(data->contents); + LONG cont_height = lay_height - _subheight(data->contents); + BOOL vbar = FALSE, hbar = FALSE; + + if (!data->usewinborder) + { + //kprintf("scrollgroup layout: " + // "%d x %d sub contents size %d,%d\n", + // lay_width, lay_height, _subwidth(data->contents), + // _subheight(data->contents)); + + /* layout the virtual group a first time, to determine + * the virtual width/height */ + //MUI_Layout(data->contents,0,0,lay_width,lay_height,0); + + get(data->contents, MUIA_Virtgroup_MinWidth, + &virt_minwidth); + get(data->contents, MUIA_Virtgroup_MinHeight, + &virt_minheight); + virt_minwidth -= _subwidth(data->contents); + virt_minheight -= _subheight(data->contents); + + virt_maxwidth = + _maxwidth(data->contents) - _subwidth(data->contents); + virt_maxheight = + _maxheight(data->contents) - _subheight(data->contents); + + virt_width = + CLAMP(cont_width, virt_minwidth, virt_maxwidth); + virt_height = + CLAMP(cont_height, virt_minheight, virt_maxheight); + + if (virt_width > cont_width) + { + cont_height -= horiz_height; + virt_height = + CLAMP(cont_height, virt_minheight, virt_maxheight); + hbar = TRUE; + } + //kprintf(" 1: %d x %d hbar %d vbar %d\n", + // cont_width, cont_height, hbar, vbar); + + if (virt_height > cont_height) + { + cont_width -= vert_width; + virt_width = + CLAMP(cont_width, virt_minwidth, virt_maxheight); + vbar = TRUE; + } + //kprintf(" 2: %d x %d hbar %d vbar %d\n", + // cont_width, cont_height, hbar, vbar); + + /* We need to check this a 2nd time!! */ + if (!hbar && (virt_width > cont_width)) + { + cont_height -= horiz_height; + virt_height = + CLAMP(cont_height, virt_minheight, virt_maxheight); + hbar = TRUE; + } + //kprintf(" 3: %d x %d hbar %d vbar %d\n", + // cont_width, cont_height, hbar, vbar); + } + + cont_width += _subwidth(data->contents); + cont_height += _subheight(data->contents); + + //kprintf("cont_size layouted to %d,%d\n", + // cont_width, cont_height); + + if (hbar && vbar) + { + /* We need all scrollbars and the button */ + set(data->vert, MUIA_ShowMe, TRUE); + /* We could also overload MUIM_Show... */ + set(data->horiz, MUIA_ShowMe, TRUE); + set(data->button, MUIA_ShowMe, TRUE); + MUI_Layout(data->vert, cont_width, 0, vert_width, + cont_height, 0); + MUI_Layout(data->horiz, 0, cont_height, cont_width, + horiz_height, 0); + MUI_Layout(data->button, cont_width, cont_height, + vert_width, horiz_height, 0); + } + else if (vbar) + { + set(data->vert, MUIA_ShowMe, TRUE); + set(data->horiz, MUIA_ShowMe, FALSE); + set(data->button, MUIA_ShowMe, FALSE); + + MUI_Layout(data->vert, cont_width, 0, vert_width, + cont_height, 0); + } + else if (hbar) + { + set(data->vert, MUIA_ShowMe, FALSE); + set(data->horiz, MUIA_ShowMe, TRUE); + set(data->button, MUIA_ShowMe, FALSE); + + MUI_Layout(data->horiz, 0, cont_height, cont_width, + horiz_height, 0); + } + else if (!data->usewinborder) + { + set(data->vert, MUIA_ShowMe, FALSE); + set(data->horiz, MUIA_ShowMe, FALSE); + set(data->button, MUIA_ShowMe, FALSE); + } + + /* Layout the group a second time, note that setting _mwidth() + * and _mheight() should be enough, or we invent a new flag */ + MUI_Layout(data->contents, 0, 0, cont_width, cont_height, 0); + + //kprintf(" contents size after layout: %d x %d inner %d x %d\n", + // _width(data->contents), _height(data->contents), + // _mwidth(data->contents), _mheight(data->contents)); + return 1; + } + } + return 0; + + AROS_USERFUNC_EXIT +} + + +AROS_UFH3(ULONG, Scrollgroup_Function, + AROS_UFHA(struct Hook *, hook, A0), + AROS_UFHA(APTR, dummy, A2), + AROS_UFHA(void **, msg, A1)) +{ + AROS_USERFUNC_INIT + + struct Scrollgroup_DATA *data = + (struct Scrollgroup_DATA *)hook->h_Data; + + SIPTR type = (SIPTR) msg[0]; + SIPTR val = (SIPTR) msg[1]; + + switch (type) + { + case 1: + { + get(data->vert, MUIA_Prop_First, &val); + SetAttrs(data->contents, MUIA_Virtgroup_Top, val, MUIA_NoNotify, + TRUE, MUIA_Group_Forward, FALSE, TAG_DONE); + break; + } + + case 2: + { + get(data->horiz, MUIA_Prop_First, &val); + SetAttrs(data->contents, MUIA_Virtgroup_Left, val, + MUIA_NoNotify, TRUE, MUIA_Group_Forward, FALSE, TAG_DONE); + break; + } + case 3: + nnset(data->horiz, MUIA_Prop_First, val); + break; + case 4: + nnset(data->vert, MUIA_Prop_First, val); + break; + } + return 0; + + AROS_USERFUNC_EXIT +} + +IPTR Scrollgroup__OM_NEW(struct IClass *cl, Object *obj, + struct opSet *msg) +{ + struct Scrollgroup_DATA *data; + //struct TagItem *tags,*tag; + Object *contents = + (Object *) GetTagData(MUIA_Scrollgroup_Contents, 0, + msg->ops_AttrList); + Object *vert, *horiz, *button, *group; + BOOL usewinborder; + Tag hbordertag = TAG_IGNORE; + Tag vbordertag = TAG_IGNORE; + + struct Hook *layout_hook = mui_alloc_struct(struct Hook); + if (!layout_hook) + return 0; + + layout_hook->h_Entry = (HOOKFUNC) Scrollgroup_Layout_Function; + + usewinborder = + GetTagData(MUIA_Scrollgroup_UseWinBorder, FALSE, msg->ops_AttrList); + if (usewinborder) + { + hbordertag = MUIA_Prop_UseWinBorder; + vbordertag = MUIA_Prop_UseWinBorder; + } + + obj = (Object *) DoSuperNewTags + (cl, obj, NULL, + MUIA_Group_Horiz, FALSE, + Child, (IPTR) (group = (Object *) GroupObject, + MUIA_Group_LayoutHook, (IPTR) layout_hook, + Child, (IPTR) contents, + Child, (IPTR) (vert = + (Object *) ScrollbarObject, MUIA_Group_Horiz, FALSE, + vbordertag, MUIV_Prop_UseWinBorder_Right, + End), + Child, (IPTR) (horiz = + (Object *) ScrollbarObject, MUIA_Group_Horiz, TRUE, + hbordertag, MUIV_Prop_UseWinBorder_Bottom, + End), + Child, (IPTR) (button = + (Object *) ScrollbuttonObject, + End), + End), + TAG_MORE, msg->ops_AttrList); + + if (!obj) + { + mui_free(layout_hook); + return 0; + } + + data = INST_DATA(cl, obj); + data->vert = vert; + data->horiz = horiz; + data->button = button; + data->contents = contents; + data->usewinborder = usewinborder; + + data->hook.h_Entry = (HOOKFUNC) Scrollgroup_Function; + data->hook.h_Data = data; + data->layout_hook = layout_hook; + layout_hook->h_Data = data; + + DoMethod(vert, MUIM_Notify, MUIA_Prop_First, MUIV_EveryTime, (IPTR) obj, + 4, MUIM_CallHook, (IPTR) & data->hook, 1, MUIV_TriggerValue); + DoMethod(horiz, MUIM_Notify, MUIA_Prop_First, MUIV_EveryTime, + (IPTR) obj, 4, MUIM_CallHook, (IPTR) & data->hook, 2, + MUIV_TriggerValue); + DoMethod(contents, MUIM_Group_DoMethodNoForward, MUIM_Notify, + MUIA_Virtgroup_Left, MUIV_EveryTime, (IPTR) obj, 4, MUIM_CallHook, + (IPTR) & data->hook, 3, MUIV_TriggerValue); + DoMethod(contents, MUIM_Group_DoMethodNoForward, MUIM_Notify, + MUIA_Virtgroup_Top, MUIV_EveryTime, (IPTR) obj, 4, MUIM_CallHook, + (IPTR) & data->hook, 4, MUIV_TriggerValue); + + D(bug("Scrollgroup_New(%lx)\n", obj)); + D(bug(" vert = %lx, horiz = %lx, button = %lx\n", vert, horiz, button)); + return (IPTR) obj; +} + +IPTR Scrollgroup__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) +{ + struct Scrollgroup_DATA *data = INST_DATA(cl, obj); + mui_free(data->layout_hook); + return DoSuperMethodA(cl, obj, msg); +} + +IPTR Scrollgroup__MUIM_Show(struct IClass *cl, Object *obj, + struct MUIP_Show *msg) +{ + struct Scrollgroup_DATA *data = INST_DATA(cl, obj); + LONG top = 0, left = 0, width = 0, height = 0; + + get(data->contents, MUIA_Virtgroup_Left, &left); + get(data->contents, MUIA_Virtgroup_Top, &top); + get(data->contents, MUIA_Virtgroup_Width, &width); + get(data->contents, MUIA_Virtgroup_Height, &height); + + SetAttrs(data->horiz, MUIA_Prop_First, left, + MUIA_Prop_Entries, width, + MUIA_Prop_Visible, _mwidth(data->contents), TAG_DONE); + + + SetAttrs(data->vert, MUIA_Prop_First, top, + MUIA_Prop_Entries, height, + MUIA_Prop_Visible, _mheight(data->contents), TAG_DONE); + + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +#if ZUNE_BUILTIN_SCROLLGROUP +BOOPSI_DISPATCHER(IPTR, Scrollgroup_Dispatcher, cl, obj, msg) +{ + switch (msg->MethodID) + { + case OM_NEW: + return Scrollgroup__OM_NEW(cl, obj, (struct opSet *)msg); + case OM_DISPOSE: + return Scrollgroup__OM_DISPOSE(cl, obj, msg); + case MUIM_Show: + return Scrollgroup__MUIM_Show(cl, obj, (struct MUIP_Show *)msg); + default: + return DoSuperMethodA(cl, obj, msg); + } +} +BOOPSI_DISPATCHER_END + +const struct __MUIBuiltinClass _MUI_Scrollgroup_desc = +{ + MUIC_Scrollgroup, + MUIC_Group, + sizeof(struct Scrollgroup_DATA), + (void *) Scrollgroup_Dispatcher +}; +#endif /* ZUNE_BUILTIN_SCROLLGROUP */ diff --git a/workbench/libs/muimaster/classes/scrollgroup.h b/workbench/libs/muimaster/classes/scrollgroup.h index 21180fb91d..d8449f20d2 100644 --- a/workbench/libs/muimaster/classes/scrollgroup.h +++ b/workbench/libs/muimaster/classes/scrollgroup.h @@ -13,14 +13,20 @@ #define MUIB_Scrollgroup (MUIB_ZUNE | 0x00002f00) /*** Attributes *************************************************************/ -#define MUIA_Scrollgroup_Contents (MUIB_MUI|0x00421261) /* V4 i.g Object * */ -#define MUIA_Scrollgroup_FreeHoriz (MUIB_MUI|0x004292f3) /* V9 i.. BOOL */ -#define MUIA_Scrollgroup_FreeVert (MUIB_MUI|0x004224f2) /* V9 i.. BOOL */ -#define MUIA_Scrollgroup_HorizBar (MUIB_MUI|0x0042b63d) /* V16 ..g Object * */ -#define MUIA_Scrollgroup_UseWinBorder (MUIB_MUI|0x004284c1) /* V13 i.. BOOL */ -#define MUIA_Scrollgroup_VertBar (MUIB_MUI|0x0042cdc0) /* V16 ..g Object * */ +#define MUIA_Scrollgroup_Contents \ + (MUIB_MUI | 0x00421261) /* V4 i.g Object * */ +#define MUIA_Scrollgroup_FreeHoriz \ + (MUIB_MUI | 0x004292f3) /* V9 i.. BOOL */ +#define MUIA_Scrollgroup_FreeVert \ + (MUIB_MUI | 0x004224f2) /* V9 i.. BOOL */ +#define MUIA_Scrollgroup_HorizBar \ + (MUIB_MUI | 0x0042b63d) /* V16 ..g Object * */ +#define MUIA_Scrollgroup_UseWinBorder \ + (MUIB_MUI | 0x004284c1) /* V13 i.. BOOL */ +#define MUIA_Scrollgroup_VertBar \ + (MUIB_MUI | 0x0042cdc0) /* V16 ..g Object * */ -extern const struct __MUIBuiltinClass _MUI_Scrollgroup_desc; /* PRIV */ +extern const struct __MUIBuiltinClass _MUI_Scrollgroup_desc; /* PRIV */ #endif /* _MUI_CLASSES_SCROLLGROUP_H */ diff --git a/workbench/libs/muimaster/classes/semaphore.c b/workbench/libs/muimaster/classes/semaphore.c index 79bbd2c1a0..123ef46de9 100644 --- a/workbench/libs/muimaster/classes/semaphore.c +++ b/workbench/libs/muimaster/classes/semaphore.c @@ -27,70 +27,75 @@ IPTR Semaphore__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) { struct MUI_SemaphoreData *data; - obj = (Object *)DoSuperMethodA(cl, obj, (Msg)msg); + obj = (Object *) DoSuperMethodA(cl, obj, (Msg) msg); if (obj) { - data = INST_DATA(cl, obj); - - InitSemaphore(&data->sem); + data = INST_DATA(cl, obj); + + InitSemaphore(&data->sem); } - - return (IPTR)obj; + + return (IPTR) obj; } /************************************************************************** MUIM_Semaphore_Attempt **************************************************************************/ -IPTR Semaphore__MUIM_Attempt(struct IClass *cl, Object *obj, struct MUIP_Semaphore_Attempt *msg) +IPTR Semaphore__MUIM_Attempt(struct IClass *cl, Object *obj, + struct MUIP_Semaphore_Attempt *msg) { struct MUI_SemaphoreData *data = INST_DATA(cl, obj); - - return (IPTR)AttemptSemaphore(&data->sem); + + return (IPTR) AttemptSemaphore(&data->sem); } /************************************************************************** MUIM_Semaphore_AttemptShared **************************************************************************/ -IPTR Semaphore__MUIM_AttemptShared(struct IClass *cl, Object *obj, struct MUIP_Semaphore_AttemptShared *msg) +IPTR Semaphore__MUIM_AttemptShared(struct IClass *cl, Object *obj, + struct MUIP_Semaphore_AttemptShared *msg) { struct MUI_SemaphoreData *data = INST_DATA(cl, obj); - - return (IPTR)AttemptSemaphoreShared(&data->sem); + + return (IPTR) AttemptSemaphoreShared(&data->sem); } /************************************************************************** MUIM_Semaphore_Obtain **************************************************************************/ -IPTR Semaphore__MUIM_Obtain(struct IClass *cl, Object *obj, struct MUIP_Semaphore_Obtain *msg) +IPTR Semaphore__MUIM_Obtain(struct IClass *cl, Object *obj, + struct MUIP_Semaphore_Obtain *msg) { struct MUI_SemaphoreData *data = INST_DATA(cl, obj); - + ObtainSemaphore(&data->sem); - + return 0; } /************************************************************************** MUIM_Semaphore_ObtainShared **************************************************************************/ -IPTR Semaphore__MUIM_ObtainShared(struct IClass *cl, Object *obj, struct MUIP_Semaphore_ObtainShared *msg) +IPTR Semaphore__MUIM_ObtainShared(struct IClass *cl, Object *obj, + struct MUIP_Semaphore_ObtainShared *msg) { struct MUI_SemaphoreData *data = INST_DATA(cl, obj); - + ObtainSemaphoreShared(&data->sem); - + return 0; } /************************************************************************** MUIM_Semaphore_Release **************************************************************************/ -IPTR Semaphore__MUIM_Release(struct IClass *cl, Object *obj, struct MUIP_Semaphore_Release *msg) +IPTR Semaphore__MUIM_Release(struct IClass *cl, Object *obj, + struct MUIP_Semaphore_Release *msg) { struct MUI_SemaphoreData *data = INST_DATA(cl, obj); - + ReleaseSemaphore(&data->sem); - + return 0; } @@ -99,14 +104,25 @@ BOOPSI_DISPATCHER(IPTR, Semaphore_Dispatcher, cl, obj, msg) { switch (msg->MethodID) { - case OM_NEW: return Semaphore__OM_NEW(cl, obj, (struct opSet *)msg); - case MUIM_Semaphore_Attempt: return Semaphore__MUIM_Attempt(cl, obj, (struct MUIP_Semaphore_Attempt *)msg); - case MUIM_Semaphore_AttemptShared: return Semaphore__MUIM_AttemptShared(cl, obj, (struct MUIP_Semaphore_AttemptShared *)msg); - case MUIM_Semaphore_Obtain: return Semaphore__MUIM_Obtain(cl, obj, (struct MUIP_Semaphore_Obtain *)msg); - case MUIM_Semaphore_ObtainShared: return Semaphore__MUIM_ObtainShared(cl, obj, (struct MUIP_Semaphore_ObtainShared *)msg); - case MUIM_Semaphore_Release: return Semaphore__MUIM_Release(cl, obj, (struct MUIP_Semaphore_Release *)msg); + case OM_NEW: + return Semaphore__OM_NEW(cl, obj, (struct opSet *)msg); + case MUIM_Semaphore_Attempt: + return Semaphore__MUIM_Attempt(cl, obj, + (struct MUIP_Semaphore_Attempt *)msg); + case MUIM_Semaphore_AttemptShared: + return Semaphore__MUIM_AttemptShared(cl, obj, + (struct MUIP_Semaphore_AttemptShared *)msg); + case MUIM_Semaphore_Obtain: + return Semaphore__MUIM_Obtain(cl, obj, + (struct MUIP_Semaphore_Obtain *)msg); + case MUIM_Semaphore_ObtainShared: + return Semaphore__MUIM_ObtainShared(cl, obj, + (struct MUIP_Semaphore_ObtainShared *)msg); + case MUIM_Semaphore_Release: + return Semaphore__MUIM_Release(cl, obj, + (struct MUIP_Semaphore_Release *)msg); } - + return DoSuperMethodA(cl, obj, msg); } BOOPSI_DISPATCHER_END @@ -114,9 +130,10 @@ BOOPSI_DISPATCHER_END /* * Class descriptor. */ -const struct __MUIBuiltinClass _MUI_Semaphore_desc = { - MUIC_Semaphore, - ROOTCLASS, - sizeof(struct MUI_SemaphoreData), - (void*)Semaphore_Dispatcher +const struct __MUIBuiltinClass _MUI_Semaphore_desc = +{ + MUIC_Semaphore, + ROOTCLASS, + sizeof(struct MUI_SemaphoreData), + (void *) Semaphore_Dispatcher }; diff --git a/workbench/libs/muimaster/classes/semaphore.h b/workbench/libs/muimaster/classes/semaphore.h index a0442c7dd4..09da8cbc34 100644 --- a/workbench/libs/muimaster/classes/semaphore.h +++ b/workbench/libs/muimaster/classes/semaphore.h @@ -13,18 +13,38 @@ #define MUIB_Semaphore (MUIB_ZUNE | 0x00003000) /*** Methods ****************************************************************/ -#define MUIM_Semaphore_Attempt (MUIB_MUI|0x00426ce2) /* MUI: V11 */ -#define MUIM_Semaphore_AttemptShared (MUIB_MUI|0x00422551) /* MUI: V11 */ -#define MUIM_Semaphore_Obtain (MUIB_MUI|0x004276f0) /* MUI: V11 */ -#define MUIM_Semaphore_ObtainShared (MUIB_MUI|0x0042ea02) /* MUI: V11 */ -#define MUIM_Semaphore_Release (MUIB_MUI|0x00421f2d) /* MUI: V11 */ -struct MUIP_Semaphore_Attempt {STACKED ULONG MethodID;}; -struct MUIP_Semaphore_AttemptShared {STACKED ULONG MethodID;}; -struct MUIP_Semaphore_Obtain {STACKED ULONG MethodID;}; -struct MUIP_Semaphore_ObtainShared {STACKED ULONG MethodID;}; -struct MUIP_Semaphore_Release {STACKED ULONG MethodID;}; - - -extern const struct __MUIBuiltinClass _MUI_Semaphore_desc; /* PRIV */ +#define MUIM_Semaphore_Attempt (MUIB_MUI | 0x00426ce2) /* MUI: V11 */ +#define MUIM_Semaphore_AttemptShared (MUIB_MUI | 0x00422551) /* MUI: V11 */ +#define MUIM_Semaphore_Obtain (MUIB_MUI | 0x004276f0) /* MUI: V11 */ +#define MUIM_Semaphore_ObtainShared (MUIB_MUI | 0x0042ea02) /* MUI: V11 */ +#define MUIM_Semaphore_Release (MUIB_MUI | 0x00421f2d) /* MUI: V11 */ + +struct MUIP_Semaphore_Attempt +{ + STACKED ULONG MethodID; +}; + +struct MUIP_Semaphore_AttemptShared +{ + STACKED ULONG MethodID; +}; + +struct MUIP_Semaphore_Obtain +{ + STACKED ULONG MethodID; +}; + +struct MUIP_Semaphore_ObtainShared +{ + STACKED ULONG MethodID; +}; + +struct MUIP_Semaphore_Release +{ + STACKED ULONG MethodID; +}; + + +extern const struct __MUIBuiltinClass _MUI_Semaphore_desc; /* PRIV */ #endif /* _MUI_CLASSES_SEMAPHORE_H */ diff --git a/workbench/libs/muimaster/classes/settings.c b/workbench/libs/muimaster/classes/settings.c index 9729fa9471..ef8462e643 100644 --- a/workbench/libs/muimaster/classes/settings.c +++ b/workbench/libs/muimaster/classes/settings.c @@ -35,63 +35,67 @@ static IPTR ListDisplayFunc(struct Hook *hook, char **array, char *entry) /************************************************************************** OM_NEW **************************************************************************/ -IPTR Settings__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) +IPTR Settings__OM_NEW(struct IClass * cl, Object * obj, struct opSet * msg) { struct MUI_Settings *data; - struct TagItem *tag, *tags; + struct TagItem *tag, *tags; Object *listobj; - static const struct Hook list_display_hook = { {NULL, NULL}, HookEntry, - ListDisplayFunc, NULL }; + static const struct Hook list_display_hook = + { + {NULL, NULL}, HookEntry, ListDisplayFunc, NULL + }; + obj = (Object *)DoSuperNewTags(cl, obj, NULL, - Child, HGroup, - Child, VGroup, - Child, ListviewObject, - MUIA_Listview_List, listobj = ListObject, - InputListFrame, - MUIA_List_AdjustWidth, TRUE, - MUIA_List_Format, "DELTA=2,DELTA=5,", - MUIA_List_DisplayHook, &list_display_hook, - End, /* ListObject */ - End, /* ListviewObject */ - Child, HGroup, - Child, MUI_NewObject(MUIC_Popimage, - MUIA_FixHeight, 20, - MUIA_Imageadjust_Type, MUIV_Imageadjust_Type_All, - TAG_DONE), /* Popframe really */ - Child, MUI_NewObject(MUIC_Popimage, - MUIA_FixHeight, 20, - MUIA_Imageadjust_Type, MUIV_Imageadjust_Type_All, - TAG_DONE), - End, /* HGroup */ - End, /* VGroup */ - Child, MUI_NewObject(MUIC_Settingsgroup, - TAG_DONE), - End, /* HGroup */ - - TAG_MORE, msg->ops_AttrList); - if (!obj) return FALSE; - + Child, HGroup, + Child, VGroup, + Child, ListviewObject, + MUIA_Listview_List, listobj = ListObject, + InputListFrame, + MUIA_List_AdjustWidth, TRUE, + MUIA_List_Format, "DELTA=2,DELTA=5,", + MUIA_List_DisplayHook, &list_display_hook, + End, /* ListObject */ + End, /* ListviewObject */ + Child, HGroup, + Child, MUI_NewObject(MUIC_Popimage, + MUIA_FixHeight, 20, + MUIA_Imageadjust_Type, MUIV_Imageadjust_Type_All, + TAG_DONE), /* Popframe really */ + Child, MUI_NewObject(MUIC_Popimage, + MUIA_FixHeight, 20, + MUIA_Imageadjust_Type, MUIV_Imageadjust_Type_All, + TAG_DONE), + End, /* HGroup */ + End, /* VGroup */ + Child, MUI_NewObject(MUIC_Settingsgroup, + TAG_DONE), + End, /* HGroup */ + TAG_MORE, msg->ops_AttrList); + if (!obj) + return FALSE; + data = INST_DATA(cl, obj); /* parse initial taglist */ - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) { - switch (tag->ti_Tag) - { - } + switch (tag->ti_Tag) + { + } } - return (IPTR)obj; + return (IPTR) obj; } BOOPSI_DISPATCHER(IPTR, Settings_Dispatcher, cl, obj, msg) { switch (msg->MethodID) { - case OM_NEW: return Settings__OM_NEW(cl, obj, (struct opSet *)msg); + case OM_NEW: + return Settings__OM_NEW(cl, obj, (struct opSet *)msg); } - + return DoSuperMethodA(cl, obj, msg); } BOOPSI_DISPATCHER_END @@ -99,10 +103,10 @@ BOOPSI_DISPATCHER_END /* * Class descriptor. */ -const struct __MUIBuiltinClass _MUI_Settings_desc = { +const struct __MUIBuiltinClass _MUI_Settings_desc = +{ MUIC_Settings, - MUIC_Group, - sizeof(struct MUI_SettingsData), - (void*)Settings_Dispatcher + MUIC_Group, + sizeof(struct MUI_SettingsData), + (void *) Settings_Dispatcher }; - diff --git a/workbench/libs/muimaster/classes/settings.h b/workbench/libs/muimaster/classes/settings.h index 13a762436b..ef61f7fba3 100644 --- a/workbench/libs/muimaster/classes/settings.h +++ b/workbench/libs/muimaster/classes/settings.h @@ -13,6 +13,6 @@ #define MUIB_Settings (MUIB_ZUNE | 0x00003200) -extern const struct __MUIBuiltinClass _MUI_Settings_desc; /* PRIV */ +extern const struct __MUIBuiltinClass _MUI_Settings_desc; /* PRIV */ #endif /* _MUI_CLASSES_SETTINGS_H */ diff --git a/workbench/libs/muimaster/classes/settingsgroup.c b/workbench/libs/muimaster/classes/settingsgroup.c index 0c1de62266..01611ed0fc 100644 --- a/workbench/libs/muimaster/classes/settingsgroup.c +++ b/workbench/libs/muimaster/classes/settingsgroup.c @@ -23,37 +23,38 @@ extern struct Library *MUIMasterBase; -IPTR Settingsgroup__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) +IPTR Settingsgroup__OM_NEW(struct IClass *cl, Object *obj, + struct opSet *msg) { - struct TagItem *tags; - struct TagItem *tag; + struct TagItem *tags; + struct TagItem *tag; obj = (Object *) DoSuperNewTags - ( - cl, obj, NULL, - TAG_MORE, (IPTR) msg->ops_AttrList - ); - if (!obj) return FALSE; - + (cl, obj, NULL, TAG_MORE, (IPTR) msg->ops_AttrList); + if (!obj) + return FALSE; + /* parse initial taglist */ - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) { - switch (tag->ti_Tag) - { - } + switch (tag->ti_Tag) + { + } } - return (IPTR)obj; + return (IPTR) obj; } -IPTR Settingsgroup__MUIM_Settingsgroup_ConfigToGadgets(struct IClass *cl, Object *obj, struct MUIP_Settingsgroup_ConfigToGadgets *msg) +IPTR Settingsgroup__MUIM_Settingsgroup_ConfigToGadgets(struct IClass *cl, + Object *obj, struct MUIP_Settingsgroup_ConfigToGadgets *msg) { //struct MUI_Settingsgroup *data = INST_DATA(cl, obj); return 0; } -IPTR Settingsgroup__MUIM_Settingsgroup_GadgetsToConfig(struct IClass *cl, Object *obj, struct MUIP_Settingsgroup_GadgetsToConfig *msg) +IPTR Settingsgroup__MUIM_Settingsgroup_GadgetsToConfig(struct IClass *cl, + Object *obj, struct MUIP_Settingsgroup_GadgetsToConfig *msg) { //struct MUI_Settingsgroup *data = INST_DATA(cl, obj); return 0; @@ -64,26 +65,28 @@ BOOPSI_DISPATCHER(IPTR, Settingsgroup_Dispatcher, cl, obj, msg) { switch (msg->MethodID) { - case OM_NEW: - return Settingsgroup__OM_NEW(cl, obj, (struct opSet *)msg); - - case MUIM_Settingsgroup_ConfigToGadgets: - return Settingsgroup__MUIM_Settingsgroup_ConfigToGadgets(cl,obj,(APTR)msg); - - case MUIM_Settingsgroup_GadgetsToConfig: - return Settingsgroup__MUIM_Settingsgroup_GadgetsToConfig(cl,obj,(APTR)msg); - - default: - return DoSuperMethodA(cl, obj, msg); + case OM_NEW: + return Settingsgroup__OM_NEW(cl, obj, (struct opSet *)msg); + + case MUIM_Settingsgroup_ConfigToGadgets: + return Settingsgroup__MUIM_Settingsgroup_ConfigToGadgets(cl, obj, + (APTR) msg); + + case MUIM_Settingsgroup_GadgetsToConfig: + return Settingsgroup__MUIM_Settingsgroup_GadgetsToConfig(cl, obj, + (APTR) msg); + + default: + return DoSuperMethodA(cl, obj, msg); } } BOOPSI_DISPATCHER_END const struct __MUIBuiltinClass _MUI_Settingsgroup_desc = -{ +{ MUIC_Settingsgroup, - MUIC_Group, - sizeof(struct Settingsgroup_DATA), - (void*)Settingsgroup_Dispatcher + MUIC_Group, + sizeof(struct Settingsgroup_DATA), + (void *) Settingsgroup_Dispatcher }; #endif /* ZUNE_BUILTIN_SETTINGSGROUP */ diff --git a/workbench/libs/muimaster/classes/settingsgroup.h b/workbench/libs/muimaster/classes/settingsgroup.h index 228a7d635c..d171ea7c72 100644 --- a/workbench/libs/muimaster/classes/settingsgroup.h +++ b/workbench/libs/muimaster/classes/settingsgroup.h @@ -10,15 +10,27 @@ #define MUIC_Settingsgroup "Settingsgroup.mui" /*** Identifier base (for Zune extensions) **********************************/ -#define MUIB_Settingsgroup (MUIB_ZUNE | 0x00003100) +#define MUIB_Settingsgroup (MUIB_ZUNE | 0x00003100) /*** Methods ****************************************************************/ -#define MUIM_Settingsgroup_ConfigToGadgets (MUIB_MUI|0x00427043) /* MUI: V11 */ -#define MUIM_Settingsgroup_GadgetsToConfig (MUIB_MUI|0x00425242) /* MUI: V11 */ -struct MUIP_Settingsgroup_ConfigToGadgets {STACKED ULONG MethodID; STACKED Object *configdata; }; -struct MUIP_Settingsgroup_GadgetsToConfig {STACKED ULONG MethodID; STACKED Object *configdata; }; +#define MUIM_Settingsgroup_ConfigToGadgets \ + (MUIB_MUI | 0x00427043) /* MUI: V11 */ +#define MUIM_Settingsgroup_GadgetsToConfig \ + (MUIB_MUI | 0x00425242) /* MUI: V11 */ +struct MUIP_Settingsgroup_ConfigToGadgets +{ + STACKED ULONG MethodID; + STACKED Object *configdata; +}; -extern const struct __MUIBuiltinClass _MUI_Settingsgroup_desc; /* PRIV */ +struct MUIP_Settingsgroup_GadgetsToConfig +{ + STACKED ULONG MethodID; + STACKED Object *configdata; +}; + + +extern const struct __MUIBuiltinClass _MUI_Settingsgroup_desc; /* PRIV */ #endif /* _MUI_CLASSES_SETTINGSGROUP_H */ diff --git a/workbench/libs/muimaster/classes/slider.c b/workbench/libs/muimaster/classes/slider.c dissimilarity index 65% index 17e279100d..727cde2f42 100644 --- a/workbench/libs/muimaster/classes/slider.c +++ b/workbench/libs/muimaster/classes/slider.c @@ -1,509 +1,570 @@ -/* - Copyright © 1999, David Le Corfec. - Copyright © 2002-2011, The AROS Development Team. - All rights reserved. - - $Id$ -*/ - -#include <string.h> - -#include <clib/alib_protos.h> -#include <clib/macros.h> - -#include <proto/exec.h> -#include <proto/intuition.h> -#include <proto/graphics.h> -#include <proto/utility.h> -#include <proto/muimaster.h> - -/*#define MYDEBUG 1*/ -#include "debug.h" - -#include "support.h" -#include "mui.h" -#include "muimaster_intern.h" -#include "prefs.h" -#include "imspec.h" - -extern struct Library *MUIMasterBase; - -struct MUI_SliderData -{ - ULONG flags; - struct MUI_EventHandlerNode ehn; - struct MUI_ImageSpec_intern *knob_bg; - LONG knob_offset; /* current pixel offest for fine algiment */ - LONG knob_left; - LONG knob_top; - LONG knob_width; - LONG knob_height; - LONG knob_click; - LONG last_val; - LONG max_text_width; - LONG state; /* When using mouse */ - int keep_knob_offset; - - int same_knop_value; /* 1 if the knob value didn't change in since last call of MUIM_Draw */ -}; - - -enum slider_flags { - SLIDER_HORIZ = (1<<0), - SLIDER_QUIET = (1<<1), -}; - -#define longget(obj,attr,var) \ - do \ - { \ - IPTR _iptr_var = *(var); \ - get(obj,attr,&_iptr_var); \ - *var = (LONG)_iptr_var; \ - } while(0) - -/* -Slider.mui/MUIA_Slider_Horiz -Slider.mui/MUIA_Slider_Level -Slider.mui/MUIA_Slider_Max -Slider.mui/MUIA_Slider_Min -Slider.mui/MUIA_Slider_Quiet -Slider.mui/MUIA_Slider_Reverse d -*/ - -/************************************************************************** - OM_NEW -**************************************************************************/ -IPTR Slider__OM_NEW(struct IClass *cl, Object * obj, struct opSet *msg) -{ - struct MUI_SliderData *data; - struct TagItem *tags, *tag; - ULONG flags = SLIDER_HORIZ; - - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) - { - switch (tag->ti_Tag) - { - case MUIA_Group_Horiz: - case MUIA_Slider_Horiz: - _handle_bool_tag(flags, tag->ti_Data, SLIDER_HORIZ); - break; - case MUIA_Slider_Quiet: - _handle_bool_tag(flags, tag->ti_Data, SLIDER_QUIET); - break; - } - } - - obj = (Object *) DoSuperNewTags - ( - cl, obj, NULL, - - MUIA_Background, MUII_SliderBack, - MUIA_Font, MUIV_Font_Knob, - MUIA_Frame, MUIV_Frame_Slider, - - TAG_MORE, (IPTR) msg->ops_AttrList - ); - - if (!obj) - { - return 0; - } - - data = INST_DATA(cl, obj); - data->flags = flags; - - data->ehn.ehn_Events = IDCMP_MOUSEBUTTONS; - data->ehn.ehn_Priority = 0; - data->ehn.ehn_Flags = 0; - data->ehn.ehn_Object = obj; - data->ehn.ehn_Class = cl; - - return (IPTR)obj; -} - -/************************************************************************** - MUIM_Show -**************************************************************************/ -IPTR Slider__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct MUI_SliderData *data = INST_DATA(cl, obj); - struct TagItem *tags, *tag; - - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) - { - switch (tag->ti_Tag) - { - case MUIA_Numeric_Value: - if (!data->keep_knob_offset) - { - /* reset the offset */ - data->knob_offset = 0; - } - break; - } - } - return DoSuperMethodA(cl,obj,(Msg)msg); -} - -/************************************************************************** - MUIM_Setup -**************************************************************************/ -IPTR Slider__MUIM_Setup(struct IClass *cl, Object *obj, struct MUIP_Setup *msg) -{ - struct MUI_SliderData *data = INST_DATA(cl, obj); - const struct ZuneFrameGfx *knob_frame; - LONG min = 0; - LONG max = 0; - LONG val; - LONG width; - struct RastPort rp; - - if (!DoSuperMethodA(cl,obj,(Msg)msg)) - return FALSE; - - knob_frame = zune_zframe_get(obj, &muiGlobalInfo(obj)->mgi_Prefs->frames[MUIV_Frame_Knob]); - data->knob_bg = zune_imspec_setup(MUII_SliderKnob, muiRenderInfo(obj)); - - InitRastPort(&rp); - SetFont(&rp,_font(obj)); - - width = 0; - - longget(obj,MUIA_Numeric_Min,&min); - longget(obj,MUIA_Numeric_Max,&max); - - if ((max - min) > MUI_MAXMAX) - { - min = 0; - max = MUI_MAXMAX; - } - - /* Determine the width of the knob */ - for (val=min;val<=max;val++) - { - LONG nw; - char *buf; - - buf = (char*)DoMethod(obj,MUIM_Numeric_Stringify,val); - nw = TextLength(&rp,buf,strlen(buf)); - if (nw > width) width = nw; - } - data->max_text_width = width; - data->knob_width = width + - knob_frame->ileft + - knob_frame->iright + - muiGlobalInfo(obj)->mgi_Prefs->frames[MUIV_Frame_Knob].innerLeft + - muiGlobalInfo(obj)->mgi_Prefs->frames[MUIV_Frame_Knob].innerRight; - - data->knob_height = _font(obj)->tf_YSize + - knob_frame->itop + - knob_frame->ibottom + - muiGlobalInfo(obj)->mgi_Prefs->frames[MUIV_Frame_Knob].innerTop + - muiGlobalInfo(obj)->mgi_Prefs->frames[MUIV_Frame_Knob].innerBottom; - - DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR)&data->ehn); - - return TRUE; -} - -/************************************************************************** - MUIM_Cleanup -**************************************************************************/ -IPTR Slider__MUIM_Cleanup(struct IClass *cl, Object *obj, struct MUIP_Cleanup *msg) -{ - struct MUI_SliderData *data = INST_DATA(cl, obj); - - if (data->knob_bg) - { - zune_imspec_cleanup(data->knob_bg); - data->knob_bg = NULL; - } - DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR)&data->ehn); - return DoSuperMethodA(cl,obj,(Msg)msg); -} - -/************************************************************************** - MUIM_AskMinMax -**************************************************************************/ -IPTR Slider__MUIM_AskMinMax(struct IClass *cl, Object *obj, struct MUIP_AskMinMax *msg) -{ - struct MUI_SliderData *data = INST_DATA(cl, obj); - LONG min = 0,max = 0; - - DoSuperMethodA(cl, obj, (Msg)msg); - - longget(obj,MUIA_Numeric_Min,&min); - longget(obj,MUIA_Numeric_Max,&max); - - if (data->flags & SLIDER_HORIZ) - { - msg->MinMaxInfo->MinWidth += data->knob_width + 1; - msg->MinMaxInfo->MinHeight += data->knob_height; - msg->MinMaxInfo->DefWidth += data->knob_width * 4 + 2; - msg->MinMaxInfo->DefHeight += data->knob_height; - msg->MinMaxInfo->MaxWidth = MUI_MAXMAX; - msg->MinMaxInfo->MaxHeight += data->knob_height; - } - else - { - msg->MinMaxInfo->MinWidth += data->knob_width; - msg->MinMaxInfo->MinHeight += data->knob_height + 1; - msg->MinMaxInfo->DefWidth += data->knob_width; - msg->MinMaxInfo->DefHeight += data->knob_height * 4 + 2; - msg->MinMaxInfo->MaxWidth += data->knob_width; - msg->MinMaxInfo->MaxHeight = MUI_MAXMAX; - } - - return TRUE; -} - -/************************************************************************** - MUIM_Show -**************************************************************************/ -IPTR Slider__MUIM_Show(struct IClass *cl, Object *obj, struct MUIP_Show *msg) -{ - struct MUI_SliderData *data = INST_DATA(cl, obj); - - DoSuperMethodA(cl,obj,(Msg)msg); - if (data->knob_bg) - zune_imspec_show(data->knob_bg, obj); - return 1; -} - -/************************************************************************** - MUIM_Hide -**************************************************************************/ -IPTR Slider__MUIM_Hide(struct IClass *cl, Object *obj,struct MUIP_Hide *msg) -{ - struct MUI_SliderData *data = INST_DATA(cl, obj); - - if (data->knob_bg) - zune_imspec_hide(data->knob_bg); - - /* This may look ugly when window is resized but it is easier than recalculating - * the knob offset in Slider_Show */ - data->knob_offset = 0; - - return DoSuperMethodA(cl,obj,(Msg)msg); -} - - -/************************************************************************** - MUIM_Draw -**************************************************************************/ -IPTR Slider__MUIM_Draw(struct IClass *cl, Object *obj, struct MUIP_Draw *msg) -{ - struct MUI_SliderData *data = INST_DATA(cl, obj); - const struct ZuneFrameGfx *knob_frame; - int knob_frame_state; - LONG val = 0; - char *buf; - int width; - - DoSuperMethodA(cl,obj,(Msg)msg); - - if (!(msg->flags & (MADF_DRAWOBJECT | MADF_DRAWUPDATE))) - return FALSE; - - if (data->flags & SLIDER_HORIZ) - { - data->knob_top = _mtop(obj); - data->knob_left = DoSuperMethod(cl, obj,MUIM_Numeric_ValueToScale, 0, _mwidth(obj) - data->knob_width) + data->knob_offset + _mleft(obj); - - if (data->knob_left < _mleft(obj)) data->knob_left = _mleft(obj); - else - { - if (data->knob_left + data->knob_width > _mright(obj)) - data->knob_left = _mright(obj) - data->knob_width; - } - } - else - { - data->knob_top = (_mheight(obj) - data->knob_height - DoSuperMethod(cl, obj,MUIM_Numeric_ValueToScale, 0, _mheight(obj) - data->knob_height)) + data->knob_offset + _mtop(obj); - data->knob_left = _mleft(obj); - - if (data->knob_top < _mtop(obj)) data->knob_top = _mtop(obj); - else - { - if (data->knob_top + data->knob_height > _mbottom(obj)) - data->knob_top = _mbottom(obj) - data->knob_height; - } - } - - DoMethod(obj,MUIM_DrawBackground,_mleft(obj),_mtop(obj),_mwidth(obj),_mheight(obj),0,0,0); - - zune_imspec_draw(data->knob_bg, muiRenderInfo(obj), - data->knob_left, data->knob_top, data->knob_width, data->knob_height, - 0, 0, 0); - - knob_frame_state = muiGlobalInfo(obj)->mgi_Prefs->frames[MUIV_Frame_Knob].state; - if (data->state) - knob_frame_state ^= 1; - knob_frame = zune_zframe_get_with_state(obj, - &muiGlobalInfo(obj)->mgi_Prefs->frames[MUIV_Frame_Knob], knob_frame_state); - knob_frame->draw(knob_frame->customframe, muiRenderInfo(obj), data->knob_left, data->knob_top, data->knob_width, - data->knob_height, data->knob_left, data->knob_top, data->knob_width, - data->knob_height); - - if ( ! (data->flags & SLIDER_QUIET)) - { - SetFont(_rp(obj),_font(obj)); - SetABPenDrMd(_rp(obj),_pens(obj)[MPEN_TEXT],_pens(obj)[MPEN_BACKGROUND],JAM1); - longget(obj, MUIA_Numeric_Value, &val); - buf = (char*)DoMethod(obj,MUIM_Numeric_Stringify,val); - width = TextLength(_rp(obj),buf,strlen(buf)); - - Move(_rp(obj), - data->knob_left + knob_frame->ileft + - muiGlobalInfo(obj)->mgi_Prefs->frames[MUIV_Frame_Knob].innerLeft + - (data->max_text_width - width) / 2, - data->knob_top + _font(obj)->tf_Baseline + knob_frame->itop + - muiGlobalInfo(obj)->mgi_Prefs->frames[MUIV_Frame_Knob].innerTop); - Text(_rp(obj), buf, strlen(buf)); - } - - data->same_knop_value = 0; - return TRUE; -} - -/************************************************************************** - MUIM_HandleEvent -**************************************************************************/ -IPTR Slider__MUIM_HandleEvent(struct IClass *cl, Object *obj, struct MUIP_HandleEvent *msg) -{ - struct MUI_SliderData *data = INST_DATA(cl, obj); - - if (!msg->imsg) - return 0; - switch (msg->imsg->Class) - { - case IDCMP_MOUSEBUTTONS: - if (msg->imsg->Code == SELECTDOWN) - { - if (_isinobject(msg->imsg->MouseX, msg->imsg->MouseY)) - { - if (data->flags & SLIDER_HORIZ) - { - data->knob_click = msg->imsg->MouseX - data->knob_left + _mleft(obj); - } - else - { - data->knob_click = msg->imsg->MouseY - data->knob_top + _mtop(obj) ; - D(bug("%p: Y=%ld, mtop=%ld mheight=%ld ktop=%ld kheight=%ld knob_click=%ld\n", - obj, msg->imsg->MouseY, _mtop(obj), _mheight(obj), - data->knob_top, data->knob_height, data->knob_click)); - } - - if (_between(data->knob_left, msg->imsg->MouseX, data->knob_left + data->knob_width) - && _between(data->knob_top, msg->imsg->MouseY, data->knob_top + data->knob_height)) - { - DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR)&data->ehn); - data->ehn.ehn_Events |= IDCMP_MOUSEMOVE; - DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR)&data->ehn); - data->state = 1; - MUI_Redraw(obj,MADF_DRAWUPDATE); - } - else if (((data->flags & SLIDER_HORIZ) - && msg->imsg->MouseX < data->knob_left) - || (!(data->flags & SLIDER_HORIZ) - && msg->imsg->MouseY > data->knob_top + data->knob_height)) - { - DoSuperMethod(cl, obj, MUIM_Numeric_Decrease, 1); - } - else - { - DoSuperMethod(cl, obj, MUIM_Numeric_Increase, 1); - } - } - } - else /* msg->imsg->Code != SELECTDOWN */ - { - if (data->state) - { - DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR)&data->ehn); - data->ehn.ehn_Events &= ~IDCMP_MOUSEMOVE; - DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR)&data->ehn); - data->state = 0; - MUI_Redraw(obj,MADF_DRAWUPDATE); - } - } /* if (msg->imsg->Code == SELECTDOWN) */ - break; - - case IDCMP_MOUSEMOVE: - { - IPTR oldval = 0; - LONG newval; - LONG pixel; - LONG oldko = data->knob_offset; - - if (data->flags & SLIDER_HORIZ) - { - newval = DoSuperMethod(cl, obj, MUIM_Numeric_ScaleToValue, - 0, _mwidth(obj) - data->knob_width, - msg->imsg->MouseX - data->knob_click); - - pixel = DoSuperMethod(cl, obj,MUIM_Numeric_ValueToScaleExt, newval, 0, _mwidth(obj) - data->knob_width) + data->knob_click; - if (data->knob_offset < 0) data->knob_offset = 0; - data->knob_offset = msg->imsg->MouseX - pixel; - data->keep_knob_offset = 1; -// D(bug("%ld %ld %ld %ld %ld\n",data->knob_offset, pixel, msg->imsg->MouseX, _mleft(obj), data->knob_click)); - } - else - { - LONG scale; - - scale = _mheight(obj) - data->knob_height + data->knob_click - msg->imsg->MouseY; - newval = DoSuperMethod(cl, obj, MUIM_Numeric_ScaleToValue, - 0, _mheight(obj) - data->knob_height, - scale); - pixel = (_mheight(obj) - data->knob_height - DoSuperMethod(cl, obj, MUIM_Numeric_ValueToScaleExt, newval, 0, _mheight(obj) - data->knob_height)) + data->knob_click; - data->knob_offset = msg->imsg->MouseY - pixel; - data->keep_knob_offset = 1; -// D(bug("%0lx: Y=%ld scale=%ld val=%ld pixel: %ld koff: %ld\n", obj, msg->imsg->MouseY, scale, newval, pixel, data->knob_offset)); - } - - get(obj, MUIA_Numeric_Value, &oldval); - if ((LONG)oldval != newval) - { - set(obj, MUIA_Numeric_Value, newval); - } else if (oldko != data->knob_offset) - { - data->same_knop_value = 1; - MUI_Redraw(obj, MADF_DRAWUPDATE); - } - data->keep_knob_offset = 0; - } - break; - } - - return 0; -} - -BOOPSI_DISPATCHER(IPTR, Slider_Dispatcher, cl, obj, msg) -{ - switch (msg->MethodID) - { - case OM_NEW: return Slider__OM_NEW(cl, obj, (struct opSet *)msg); - case OM_SET: return Slider__OM_SET(cl, obj, (struct opSet *)msg); - case MUIM_Setup: return Slider__MUIM_Setup(cl, obj, (APTR)msg); - case MUIM_Cleanup: return Slider__MUIM_Cleanup(cl, obj, (APTR)msg); - case MUIM_Show: return Slider__MUIM_Show(cl, obj, (APTR)msg); - case MUIM_Hide: return Slider__MUIM_Hide(cl, obj, (APTR)msg); - case MUIM_AskMinMax: return Slider__MUIM_AskMinMax(cl, obj, (APTR)msg); - case MUIM_Draw: return Slider__MUIM_Draw(cl, obj, (APTR)msg); - case MUIM_HandleEvent: return Slider__MUIM_HandleEvent(cl, obj, (APTR)msg); - } - return DoSuperMethodA(cl, obj, msg); -} -BOOPSI_DISPATCHER_END - - -/* - * Class descriptor. - */ -const struct __MUIBuiltinClass _MUI_Slider_desc = { - MUIC_Slider, - MUIC_Numeric, - sizeof(struct MUI_SliderData), - (void*)Slider_Dispatcher -}; +/* + Copyright © 1999, David Le Corfec. + Copyright © 2002-2011, The AROS Development Team. + All rights reserved. + + $Id$ +*/ + +#include <string.h> + +#include <clib/alib_protos.h> +#include <clib/macros.h> + +#include <proto/exec.h> +#include <proto/intuition.h> +#include <proto/graphics.h> +#include <proto/utility.h> +#include <proto/muimaster.h> + +/*#define MYDEBUG 1*/ +#include "debug.h" + +#include "support.h" +#include "mui.h" +#include "muimaster_intern.h" +#include "prefs.h" +#include "imspec.h" + +extern struct Library *MUIMasterBase; + +struct MUI_SliderData +{ + ULONG flags; + struct MUI_EventHandlerNode ehn; + struct MUI_ImageSpec_intern *knob_bg; + LONG knob_offset; /* current pixel offest for fine alignment */ + LONG knob_left; + LONG knob_top; + LONG knob_width; + LONG knob_height; + LONG knob_click; + LONG last_val; + LONG max_text_width; + LONG state; /* When using mouse */ + int keep_knob_offset; + + int same_knop_value; /* 1 if the knob value didn't change + * since last call of MUIM_Draw */ +}; + + +enum slider_flags +{ + SLIDER_HORIZ = (1 << 0), + SLIDER_QUIET = (1 << 1), +}; + +#define longget(obj,attr,var) \ + do \ + { \ + IPTR _iptr_var = *(var); \ + get(obj,attr,&_iptr_var); \ + *var = (LONG)_iptr_var; \ + } while(0) + +/* +Slider.mui/MUIA_Slider_Horiz +Slider.mui/MUIA_Slider_Level +Slider.mui/MUIA_Slider_Max +Slider.mui/MUIA_Slider_Min +Slider.mui/MUIA_Slider_Quiet +Slider.mui/MUIA_Slider_Reverse d +*/ + +/************************************************************************** + OM_NEW +**************************************************************************/ +IPTR Slider__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) +{ + struct MUI_SliderData *data; + struct TagItem *tags, *tag; + ULONG flags = SLIDER_HORIZ; + + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) + { + switch (tag->ti_Tag) + { + case MUIA_Group_Horiz: + case MUIA_Slider_Horiz: + _handle_bool_tag(flags, tag->ti_Data, SLIDER_HORIZ); + break; + case MUIA_Slider_Quiet: + _handle_bool_tag(flags, tag->ti_Data, SLIDER_QUIET); + break; + } + } + + obj = (Object *) DoSuperNewTags + ( + cl, obj, NULL, + + MUIA_Background, MUII_SliderBack, + MUIA_Font, MUIV_Font_Knob, + MUIA_Frame, MUIV_Frame_Slider, + + TAG_MORE, (IPTR) msg->ops_AttrList + ); + + if (!obj) + { + return 0; + } + + data = INST_DATA(cl, obj); + data->flags = flags; + + data->ehn.ehn_Events = IDCMP_MOUSEBUTTONS; + data->ehn.ehn_Priority = 0; + data->ehn.ehn_Flags = 0; + data->ehn.ehn_Object = obj; + data->ehn.ehn_Class = cl; + + return (IPTR) obj; +} + +/************************************************************************** + MUIM_Show +**************************************************************************/ +IPTR Slider__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) +{ + struct MUI_SliderData *data = INST_DATA(cl, obj); + struct TagItem *tags, *tag; + + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) + { + switch (tag->ti_Tag) + { + case MUIA_Numeric_Value: + if (!data->keep_knob_offset) + { + /* reset the offset */ + data->knob_offset = 0; + } + break; + } + } + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +/************************************************************************** + MUIM_Setup +**************************************************************************/ +IPTR Slider__MUIM_Setup(struct IClass *cl, Object *obj, + struct MUIP_Setup *msg) +{ + struct MUI_SliderData *data = INST_DATA(cl, obj); + const struct ZuneFrameGfx *knob_frame; + LONG min = 0; + LONG max = 0; + LONG val; + LONG width; + struct RastPort rp; + + if (!DoSuperMethodA(cl, obj, (Msg) msg)) + return FALSE; + + knob_frame = + zune_zframe_get(obj, + &muiGlobalInfo(obj)->mgi_Prefs->frames[MUIV_Frame_Knob]); + data->knob_bg = zune_imspec_setup(MUII_SliderKnob, muiRenderInfo(obj)); + + InitRastPort(&rp); + SetFont(&rp, _font(obj)); + + width = 0; + + longget(obj, MUIA_Numeric_Min, &min); + longget(obj, MUIA_Numeric_Max, &max); + + if ((max - min) > MUI_MAXMAX) + { + min = 0; + max = MUI_MAXMAX; + } + + /* Determine the width of the knob */ + for (val = min; val <= max; val++) + { + LONG nw; + char *buf; + + buf = (char *)DoMethod(obj, MUIM_Numeric_Stringify, val); + nw = TextLength(&rp, buf, strlen(buf)); + if (nw > width) + width = nw; + } + data->max_text_width = width; + data->knob_width = width + + knob_frame->ileft + + knob_frame->iright + + muiGlobalInfo(obj)->mgi_Prefs->frames[MUIV_Frame_Knob].innerLeft + + muiGlobalInfo(obj)->mgi_Prefs->frames[MUIV_Frame_Knob].innerRight; + + data->knob_height = _font(obj)->tf_YSize + + knob_frame->itop + + knob_frame->ibottom + + muiGlobalInfo(obj)->mgi_Prefs->frames[MUIV_Frame_Knob].innerTop + + muiGlobalInfo(obj)->mgi_Prefs->frames[MUIV_Frame_Knob].innerBottom; + + DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR) & data->ehn); + + return TRUE; +} + +/************************************************************************** + MUIM_Cleanup +**************************************************************************/ +IPTR Slider__MUIM_Cleanup(struct IClass *cl, Object *obj, + struct MUIP_Cleanup *msg) +{ + struct MUI_SliderData *data = INST_DATA(cl, obj); + + if (data->knob_bg) + { + zune_imspec_cleanup(data->knob_bg); + data->knob_bg = NULL; + } + DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR) & data->ehn); + return DoSuperMethodA(cl, obj, (Msg) msg); +} + +/************************************************************************** + MUIM_AskMinMax +**************************************************************************/ +IPTR Slider__MUIM_AskMinMax(struct IClass *cl, Object *obj, + struct MUIP_AskMinMax *msg) +{ + struct MUI_SliderData *data = INST_DATA(cl, obj); + LONG min = 0, max = 0; + + DoSuperMethodA(cl, obj, (Msg) msg); + + longget(obj, MUIA_Numeric_Min, &min); + longget(obj, MUIA_Numeric_Max, &max); + + if (data->flags & SLIDER_HORIZ) + { + msg->MinMaxInfo->MinWidth += data->knob_width + 1; + msg->MinMaxInfo->MinHeight += data->knob_height; + msg->MinMaxInfo->DefWidth += data->knob_width * 4 + 2; + msg->MinMaxInfo->DefHeight += data->knob_height; + msg->MinMaxInfo->MaxWidth = MUI_MAXMAX; + msg->MinMaxInfo->MaxHeight += data->knob_height; + } + else + { + msg->MinMaxInfo->MinWidth += data->knob_width; + msg->MinMaxInfo->MinHeight += data->knob_height + 1; + msg->MinMaxInfo->DefWidth += data->knob_width; + msg->MinMaxInfo->DefHeight += data->knob_height * 4 + 2; + msg->MinMaxInfo->MaxWidth += data->knob_width; + msg->MinMaxInfo->MaxHeight = MUI_MAXMAX; + } + + return TRUE; +} + +/************************************************************************** + MUIM_Show +**************************************************************************/ +IPTR Slider__MUIM_Show(struct IClass *cl, Object *obj, + struct MUIP_Show *msg) +{ + struct MUI_SliderData *data = INST_DATA(cl, obj); + + DoSuperMethodA(cl, obj, (Msg) msg); + if (data->knob_bg) + zune_imspec_show(data->knob_bg, obj); + return 1; +} + +/************************************************************************** + MUIM_Hide +**************************************************************************/ +IPTR Slider__MUIM_Hide(struct IClass *cl, Object *obj, + struct MUIP_Hide *msg) +{ + struct MUI_SliderData *data = INST_DATA(cl, obj); + + if (data->knob_bg) + zune_imspec_hide(data->knob_bg); + + /* This may look ugly when window is resized but it is easier than + * recalculating the knob offset in Slider_Show */ + data->knob_offset = 0; + + return DoSuperMethodA(cl, obj, (Msg) msg); +} + + +/************************************************************************** + MUIM_Draw +**************************************************************************/ +IPTR Slider__MUIM_Draw(struct IClass *cl, Object *obj, + struct MUIP_Draw *msg) +{ + struct MUI_SliderData *data = INST_DATA(cl, obj); + const struct ZuneFrameGfx *knob_frame; + int knob_frame_state; + LONG val = 0; + char *buf; + int width; + + DoSuperMethodA(cl, obj, (Msg) msg); + + if (!(msg->flags & (MADF_DRAWOBJECT | MADF_DRAWUPDATE))) + return FALSE; + + if (data->flags & SLIDER_HORIZ) + { + data->knob_top = _mtop(obj); + data->knob_left = + DoSuperMethod(cl, obj, MUIM_Numeric_ValueToScale, 0, + _mwidth(obj) - data->knob_width) + data->knob_offset + + _mleft(obj); + + if (data->knob_left < _mleft(obj)) + data->knob_left = _mleft(obj); + else + { + if (data->knob_left + data->knob_width > _mright(obj)) + data->knob_left = _mright(obj) - data->knob_width; + } + } + else + { + data->knob_top = + (_mheight(obj) - data->knob_height - DoSuperMethod(cl, obj, + MUIM_Numeric_ValueToScale, 0, + _mheight(obj) - data->knob_height)) + data->knob_offset + + _mtop(obj); + data->knob_left = _mleft(obj); + + if (data->knob_top < _mtop(obj)) + data->knob_top = _mtop(obj); + else + { + if (data->knob_top + data->knob_height > _mbottom(obj)) + data->knob_top = _mbottom(obj) - data->knob_height; + } + } + + DoMethod(obj, MUIM_DrawBackground, _mleft(obj), _mtop(obj), + _mwidth(obj), _mheight(obj), 0, 0, 0); + + zune_imspec_draw(data->knob_bg, muiRenderInfo(obj), + data->knob_left, data->knob_top, data->knob_width, + data->knob_height, 0, 0, 0); + + knob_frame_state = + muiGlobalInfo(obj)->mgi_Prefs->frames[MUIV_Frame_Knob].state; + if (data->state) + knob_frame_state ^= 1; + knob_frame = zune_zframe_get_with_state(obj, + &muiGlobalInfo(obj)->mgi_Prefs->frames[MUIV_Frame_Knob], + knob_frame_state); + knob_frame->draw(knob_frame->customframe, muiRenderInfo(obj), + data->knob_left, data->knob_top, data->knob_width, + data->knob_height, data->knob_left, data->knob_top, + data->knob_width, data->knob_height); + + if (!(data->flags & SLIDER_QUIET)) + { + SetFont(_rp(obj), _font(obj)); + SetABPenDrMd(_rp(obj), _pens(obj)[MPEN_TEXT], + _pens(obj)[MPEN_BACKGROUND], JAM1); + longget(obj, MUIA_Numeric_Value, &val); + buf = (char *)DoMethod(obj, MUIM_Numeric_Stringify, val); + width = TextLength(_rp(obj), buf, strlen(buf)); + + Move(_rp(obj), + data->knob_left + knob_frame->ileft + + muiGlobalInfo(obj)->mgi_Prefs->frames[MUIV_Frame_Knob]. + innerLeft + (data->max_text_width - width) / 2, + data->knob_top + _font(obj)->tf_Baseline + knob_frame->itop + + muiGlobalInfo(obj)->mgi_Prefs->frames[MUIV_Frame_Knob]. + innerTop); + Text(_rp(obj), buf, strlen(buf)); + } + + data->same_knop_value = 0; + return TRUE; +} + +/************************************************************************** + MUIM_HandleEvent +**************************************************************************/ +IPTR Slider__MUIM_HandleEvent(struct IClass *cl, Object *obj, + struct MUIP_HandleEvent *msg) +{ + struct MUI_SliderData *data = INST_DATA(cl, obj); + + if (!msg->imsg) + return 0; + switch (msg->imsg->Class) + { + case IDCMP_MOUSEBUTTONS: + if (msg->imsg->Code == SELECTDOWN) + { + if (_isinobject(msg->imsg->MouseX, msg->imsg->MouseY)) + { + if (data->flags & SLIDER_HORIZ) + { + data->knob_click = + msg->imsg->MouseX - data->knob_left + _mleft(obj); + } + else + { + data->knob_click = + msg->imsg->MouseY - data->knob_top + _mtop(obj); + D(bug("%p: Y=%ld, mtop=%ld mheight=%ld ktop=%ld " + "kheight=%ld knob_click=%ld\n", + obj, msg->imsg->MouseY, _mtop(obj), + _mheight(obj), data->knob_top, + data->knob_height, data->knob_click)); + } + + if (_between(data->knob_left, msg->imsg->MouseX, + data->knob_left + data->knob_width) + && _between(data->knob_top, msg->imsg->MouseY, + data->knob_top + data->knob_height)) + { + DoMethod(_win(obj), MUIM_Window_RemEventHandler, + (IPTR) & data->ehn); + data->ehn.ehn_Events |= IDCMP_MOUSEMOVE; + DoMethod(_win(obj), MUIM_Window_AddEventHandler, + (IPTR) & data->ehn); + data->state = 1; + MUI_Redraw(obj, MADF_DRAWUPDATE); + } + else if (((data->flags & SLIDER_HORIZ) + && msg->imsg->MouseX < data->knob_left) + || (!(data->flags & SLIDER_HORIZ) + && msg->imsg->MouseY > + data->knob_top + data->knob_height)) + { + DoSuperMethod(cl, obj, MUIM_Numeric_Decrease, 1); + } + else + { + DoSuperMethod(cl, obj, MUIM_Numeric_Increase, 1); + } + } + } + else + { + if (data->state) + { + DoMethod(_win(obj), MUIM_Window_RemEventHandler, + (IPTR) & data->ehn); + data->ehn.ehn_Events &= ~IDCMP_MOUSEMOVE; + DoMethod(_win(obj), MUIM_Window_AddEventHandler, + (IPTR) & data->ehn); + data->state = 0; + MUI_Redraw(obj, MADF_DRAWUPDATE); + } + } + break; + + case IDCMP_MOUSEMOVE: + { + IPTR oldval = 0; + LONG newval; + LONG pixel; + LONG oldko = data->knob_offset; + + if (data->flags & SLIDER_HORIZ) + { + newval = DoSuperMethod(cl, obj, MUIM_Numeric_ScaleToValue, + 0, _mwidth(obj) - data->knob_width, + msg->imsg->MouseX - data->knob_click); + + pixel = + DoSuperMethod(cl, obj, MUIM_Numeric_ValueToScaleExt, + newval, 0, + _mwidth(obj) - data->knob_width) + data->knob_click; + if (data->knob_offset < 0) + data->knob_offset = 0; + data->knob_offset = msg->imsg->MouseX - pixel; + data->keep_knob_offset = 1; +// D(bug("%ld %ld %ld %ld %ld\n", data->knob_offset, pixel, +// msg->imsg->MouseX, _mleft(obj), data->knob_click)); + } + else + { + LONG scale; + + scale = + _mheight(obj) - data->knob_height + data->knob_click - + msg->imsg->MouseY; + newval = + DoSuperMethod(cl, obj, MUIM_Numeric_ScaleToValue, 0, + _mheight(obj) - data->knob_height, scale); + pixel = + (_mheight(obj) - data->knob_height - DoSuperMethod(cl, + obj, MUIM_Numeric_ValueToScaleExt, newval, 0, + _mheight(obj) - data->knob_height)) + + data->knob_click; + data->knob_offset = msg->imsg->MouseY - pixel; + data->keep_knob_offset = 1; +// D(bug("%0lx: Y=%ld scale=%ld val=%ld pixel: %ld koff: %ld\n", +// obj, msg->imsg->MouseY, scale, newval, pixel, +// data->knob_offset)); + } + + get(obj, MUIA_Numeric_Value, &oldval); + if ((LONG) oldval != newval) + { + set(obj, MUIA_Numeric_Value, newval); + } + else if (oldko != data->knob_offset) + { + data->same_knop_value = 1; + MUI_Redraw(obj, MADF_DRAWUPDATE); + } + data->keep_knob_offset = 0; + } + break; + } + + return 0; +} + +BOOPSI_DISPATCHER(IPTR, Slider_Dispatcher, cl, obj, msg) +{ + switch (msg->MethodID) + { + case OM_NEW: + return Slider__OM_NEW(cl, obj, (struct opSet *)msg); + case OM_SET: + return Slider__OM_SET(cl, obj, (struct opSet *)msg); + case MUIM_Setup: + return Slider__MUIM_Setup(cl, obj, (APTR) msg); + case MUIM_Cleanup: + return Slider__MUIM_Cleanup(cl, obj, (APTR) msg); + case MUIM_Show: + return Slider__MUIM_Show(cl, obj, (APTR) msg); + case MUIM_Hide: + return Slider__MUIM_Hide(cl, obj, (APTR) msg); + case MUIM_AskMinMax: + return Slider__MUIM_AskMinMax(cl, obj, (APTR) msg); + case MUIM_Draw: + return Slider__MUIM_Draw(cl, obj, (APTR) msg); + case MUIM_HandleEvent: + return Slider__MUIM_HandleEvent(cl, obj, (APTR) msg); + } + return DoSuperMethodA(cl, obj, msg); +} +BOOPSI_DISPATCHER_END + +/* + * Class descriptor. + */ +const struct __MUIBuiltinClass _MUI_Slider_desc = +{ + MUIC_Slider, + MUIC_Numeric, + sizeof(struct MUI_SliderData), + (void *) Slider_Dispatcher +}; diff --git a/workbench/libs/muimaster/classes/slider.h b/workbench/libs/muimaster/classes/slider.h index c1a9ebf7e3..8a7e65ce86 100644 --- a/workbench/libs/muimaster/classes/slider.h +++ b/workbench/libs/muimaster/classes/slider.h @@ -16,14 +16,14 @@ #define MUIB_Slider (MUIB_ZUNE | 0x00003300) /*** Attributes *************************************************************/ -#define MUIA_Slider_Horiz (MUIB_MUI|0x0042fad1) /* V11 isg BOOL */ -#define MUIA_Slider_Quiet (MUIB_MUI|0x00420b26) /* V6 i.. BOOL */ +#define MUIA_Slider_Horiz (MUIB_MUI | 0x0042fad1) /* V11 isg BOOL */ +#define MUIA_Slider_Quiet (MUIB_MUI | 0x00420b26) /* V6 i.. BOOL */ #ifdef MUI_OBSOLETE -#define MUIA_Slider_Level (MUIB_MUI|0x0042ae3a) /* V4 isg LONG */ -#define MUIA_Slider_Max (MUIB_MUI|0x0042d78a) /* V4 isg LONG */ -#define MUIA_Slider_Min (MUIB_MUI|0x0042e404) /* V4 isg LONG */ -#define MUIA_Slider_Reverse (MUIB_MUI|0x0042f2a0) /* V4 isg BOOL */ +#define MUIA_Slider_Level (MUIB_MUI | 0x0042ae3a) /* V4 isg LONG */ +#define MUIA_Slider_Max (MUIB_MUI | 0x0042d78a) /* V4 isg LONG */ +#define MUIA_Slider_Min (MUIB_MUI | 0x0042e404) /* V4 isg LONG */ +#define MUIA_Slider_Reverse (MUIB_MUI | 0x0042f2a0) /* V4 isg BOOL */ #endif /* MUI_OBSOLETE */ diff --git a/workbench/libs/muimaster/classes/string.c b/workbench/libs/muimaster/classes/string.c dissimilarity index 68% index 0b28732523..161584e458 100644 --- a/workbench/libs/muimaster/classes/string.c +++ b/workbench/libs/muimaster/classes/string.c @@ -1,2075 +1,2196 @@ -/* - Copyright © 2003-2006, The AROS Development Team. All rights reserved. - $Id$ -*/ - -/* This is based on muimaster/class/text.c (first string version) - * and on rom/intuition/str*.c - */ - -#define MUIMASTER_YES_INLINE_STDARG - -#include <string.h> -#include <stdlib.h> -#include <stdio.h> -#include <ctype.h> - -#include <exec/types.h> -#include <clib/alib_protos.h> - -#include <proto/exec.h> -#include <proto/dos.h> -#include <proto/graphics.h> -#include <proto/intuition.h> -#include <proto/utility.h> -#include <proto/muimaster.h> -#include <proto/locale.h> - -#ifdef __AROS__ -#include <devices/rawkeycodes.h> -#endif - -#include "mui.h" -#include "muimaster_intern.h" -#include "support.h" -#include "prefs.h" -#include "penspec.h" -#include "imspec.h" -#include "clipboard.h" -#include "string.h" - -//#define MYDEBUG 1 -#include "debug.h" - -extern struct Library *MUIMasterBase; - -struct MUI_StringData { - ULONG msd_Flags; - CONST_STRPTR msd_Accept; /* MUIA_String_Accept */ - CONST_STRPTR msd_Reject; /* MUIA_String_Reject */ - LONG msd_Align; - struct Hook *msd_EditHook; - Object *msd_AttachedList; - LONG msd_RedrawReason; - - ULONG msd_useSecret; - /* Fields mostly ripped from rom/intuition/strgadgets.c */ - STRPTR Buffer; /* char container */ - ULONG BufferSize; /* memory allocated */ - STRPTR SecBuffer; /* Buffer for secret string */ - ULONG NumChars; /* string length */ - ULONG BufferPos; /* cursor (insert/delete) position */ - ULONG MarkPos; /* cursor text marking start pos */ - LONG DispPos; /* leftmost visible char */ - ULONG DispCount; /* number of visible chars */ - - ULONG OldClick_Sec; - ULONG OldClick_Micro; - ULONG NewClick_Sec; - ULONG NewClick_Micro; - WORD MultiClick; - - WORD Columns; - - struct MUI_EventHandlerNode ehn; - struct MUI_PenSpec_intern inactive_text; - struct MUI_PenSpec_intern active_text; - struct MUI_PenSpec_intern marked_text; - struct MUI_PenSpec_intern marked_bg; - struct MUI_PenSpec_intern cursor; - - BOOL is_active; -}; - -#define MSDF_ADVANCEONCR (1<<0) -#define MSDF_LONELYEDITHOOK (1<<1) -#define MSDF_MARKING (1<<2) -#define MSDF_KEYMARKING (1<<3) -#define MSDF_NOINPUT (1<<4) -#define MSDF_STAYACTIVE (1<<5) - -enum { - NO_REASON = 0, - WENT_ACTIVE = 1, - WENT_INACTIVE, - DO_CURSOR_LEFT = 3, - DO_CURSOR_RIGHT, - DO_DELETE = 5, - DO_BACKSPACE, - DO_ADDCHAR = 7, - NEW_CONTENTS, - MOVE_CURSOR, - DO_UNKNOWN, -}; - - -/************************************************************************** - Buffer_SetNewContents - Allocate memory for buffer -**************************************************************************/ -static BOOL Buffer_Alloc (struct MUI_StringData *data) -{ - data->Buffer = (STRPTR)AllocVec(data->BufferSize * sizeof(char), MEMF_ANY); - if (NULL == data->Buffer) - { - bug("MUIC_String: Can't allocate %ld bytes for buffer1\n", - data->BufferSize * sizeof(char)); - return FALSE; - } - if (data->msd_useSecret) - { - data->SecBuffer = (STRPTR)AllocVec(data->BufferSize * sizeof(char), MEMF_ANY); - if (NULL == data->SecBuffer) - { - bug("MUIC_String: Can't allocate %ld bytes for buffer2\n", - data->BufferSize * sizeof(char)); - FreeVec(data->Buffer); - data->Buffer = NULL; - return FALSE; - } - } - return TRUE; -} - -/************************************************************************** - Buffer_SetNewContents - Initialize buffer with a string, replace former content if any -**************************************************************************/ -static BOOL Buffer_SetNewContents (struct MUI_StringData *data, CONST_STRPTR str) -{ - if (NULL == data->Buffer) - return FALSE; - - if (NULL == str) - { - data->Buffer[0] = 0; - if (data->msd_useSecret) data->SecBuffer[0] = 0; - data->NumChars = 0; - } - else - { - data->NumChars = strlen(str); - if (data->NumChars >= data->BufferSize) - data->NumChars = data->BufferSize - 1; - - if (data->msd_useSecret) - { - strncpy(data->SecBuffer, str, data->BufferSize); - data->SecBuffer[data->BufferSize - 1] = 0; - int i; - for (i=0; i < data->NumChars; i++) data->Buffer[i]=0x78; - data->Buffer[data->NumChars] = 0; - } - else - { - strncpy(data->Buffer, str, data->BufferSize); - data->Buffer[data->BufferSize - 1] = 0; - } - - } - - // avoid to BufferPos jumps to end of string if characters are inserted in string - if (data->BufferPos > data->NumChars) - data->BufferPos = data->NumChars; - data->DispPos = 0; - return TRUE; -} - -/************************************************************************** - Buffer_AddChar - Add a char on cursor position -**************************************************************************/ -static BOOL Buffer_AddChar (struct MUI_StringData *data, unsigned char code) -{ - STRPTR dst; - - if (data->Buffer == NULL) - return FALSE; - - if (data->NumChars + 1 >= data->BufferSize) - return FALSE; - - if (data->msd_useSecret) - { - dst = &data->SecBuffer[data->BufferPos + 1]; - - memmove(dst, &data->SecBuffer[data->BufferPos], - data->NumChars - data->BufferPos); - - data->Buffer[data->NumChars]=0x78; - data->Buffer[data->NumChars + 1]=0; - } - else - { - dst = &data->Buffer[data->BufferPos + 1]; - - memmove(dst, &data->Buffer[data->BufferPos], - data->NumChars - data->BufferPos); - - } - - dst[data->NumChars - data->BufferPos] = 0; - dst[-1] = code; - - data->BufferPos++; - data->NumChars++; - return TRUE; -} - -static WORD Buffer_GetWordStartIndex(struct MUI_StringData *data, WORD startindex) -{ - WORD index = startindex; - - while(index > 0) - { - if (data->Buffer[index - 1] == ' ') - { - break; - } - index--; - } - - return index; -} - -static WORD Buffer_GetWordEndIndex(struct MUI_StringData *data, WORD startindex) -{ - WORD index = startindex; - - while(index < data->NumChars) - { - if (data->Buffer[index] == ' ') - { - break; - } - index++; - } - - return index; -} - -static WORD Buffer_GetPrevWordIndex(struct MUI_StringData *data, WORD startindex) -{ - WORD index = startindex; - - while(index > 0) - { - index--; - - if ((index == 0) || - ((data->Buffer[index - 1] == ' ') && - (data->Buffer[index] != ' '))) - { - break; - } - - } - - return index; -} - -static WORD Buffer_GetSuccWordIndex(struct MUI_StringData *data, WORD startindex) -{ - WORD index = startindex; - - while(index < data->NumChars) - { - index++; - - if ((index == data->NumChars) || - ((data->Buffer[index - 1] == ' ') && - (data->Buffer[index] != ' '))) - { - break; - } - } - - return index; -} - -static BOOL Buffer_GetMarkedRange(struct MUI_StringData *data, WORD *start, WORD *stop) -{ - WORD markstart = data->MarkPos; - WORD markstop = data->BufferPos; - - markstart = MIN(markstart, data->NumChars); - markstart = MAX(markstart, 0); - - markstop = MIN(markstop, data->NumChars); - markstop = MAX(markstop, 0); - - if (markstart > markstop) - { - markstart ^= markstop; - markstop ^= markstart; - markstart ^= markstop; - } - - switch(data->MultiClick) - { - case 0: - /* char select */ - break; - - case 1: - /* word select */ - markstart = Buffer_GetWordStartIndex(data, markstart); - markstop = Buffer_GetWordEndIndex(data, markstop); - break; - - default: - /* select all */ - markstart = 0; - markstop = data->NumChars; - break; - - } - - if (markstart == markstop) return FALSE; - - if (start) *start = markstart; - if (stop) *stop = markstop; - - //kprintf("Buffer_GetMarkedRange: returning %d .. %d\n", markstart, markstop); - - return TRUE; -} - -static BOOL Buffer_AnythingMarked(struct MUI_StringData *data) -{ - if (!(data->msd_Flags & MSDF_MARKING)) return FALSE; - - return Buffer_GetMarkedRange(data, NULL, NULL); -} - -static BOOL Buffer_KillMarked(struct MUI_StringData *data) -{ - WORD markstart = data->MarkPos; - WORD markstop = data->BufferPos; - WORD marklen; - - //kprintf("\nBuffer_KillMarked 1 markpos %d bufferpos %d numchars %d\n", markstart, markstop, data->NumChars); - - if (!(data->msd_Flags & MSDF_MARKING)) return FALSE; - - data->msd_Flags &= ~MSDF_MARKING; - - if (!Buffer_GetMarkedRange(data, &markstart, &markstop)) return FALSE; - - //kprintf("Buffer_KillMarked 2 markstart %d markstop %d\n", markstart, markstop); - - if (markstart > markstop) - { - markstart ^= markstop; - markstop ^= markstart; - markstart ^= markstop; - } - - marklen = markstop - markstart; - - //kprintf("Buffer_KillMarked: markstart %d markstop %d\n", markstart, markstop); - - memmove(&data->Buffer[markstart], - &data->Buffer[markstart + marklen], data->NumChars - markstart - marklen + 1); - - data->NumChars -= marklen; - data->BufferPos = markstart; - - return TRUE; -} - -/************************************************************************** - OM_NEW -**************************************************************************/ -IPTR String__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct MUI_StringData *data; - struct TagItem *tags,*tag; - CONST_STRPTR str = NULL; - char integerbuf[20]; - - obj = (Object *)DoSuperNewTags(cl, obj, NULL, - /* MUIA_FillArea, TRUE, */ - TAG_MORE, (IPTR) msg->ops_AttrList); - if (!obj) - return FALSE; - - data = INST_DATA(cl, obj); - data->msd_useSecret = FALSE; - data->msd_Align = MUIV_String_Format_Left; - data->BufferSize = 80; - data->Columns = -1; - - Buffer_SetNewContents(data, ""); /* <-- isnt this pointless? */ - - /* parse initial taglist */ - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) - { - switch (tag->ti_Tag) - { - case MUIA_String_Accept: - data->msd_Accept = (CONST_STRPTR)tag->ti_Data; - break; - - case MUIA_String_Reject: - data->msd_Reject = (CONST_STRPTR)tag->ti_Data; - break; - - case MUIA_String_AdvanceOnCR: - _handle_bool_tag(data->msd_Flags, tag->ti_Data, MSDF_ADVANCEONCR); - break; - - case MUIA_String_AttachedList: - data->msd_AttachedList = (Object *)tag->ti_Data; - break; - - case MUIA_String_Secret: - data->msd_useSecret = (BOOL)tag->ti_Data; - break; - - case MUIA_String_Contents: - str = (CONST_STRPTR)tag->ti_Data; - break; - - case MUIA_String_EditHook: - data->msd_EditHook = (struct Hook *)tag->ti_Data; - break; - - case MUIA_String_Format: - data->msd_Align = (LONG)tag->ti_Data; - break; - - case MUIA_String_Integer: - snprintf(integerbuf, 19, "%ld", tag->ti_Data); - str = integerbuf; - break; - - case MUIA_String_LonelyEditHook: - _handle_bool_tag(data->msd_Flags, tag->ti_Data, MSDF_LONELYEDITHOOK); - break; - - case MUIA_String_MaxLen: - data->BufferSize = tag->ti_Data; - if (data->BufferSize < 1) - data->BufferSize = 1; - break; - - case MUIA_String_Columns: /* BetterString */ - data->Columns = (WORD)tag->ti_Data; - break; - - case MUIA_String_NoInput: /* BetterString */ - _handle_bool_tag(data->msd_Flags, tag->ti_Data, MSDF_NOINPUT); - break; - - case MUIA_String_StayActive: /* BetterString */ - _handle_bool_tag(data->msd_Flags, tag->ti_Data, MSDF_STAYACTIVE); - break; - - } - } - - if (Buffer_Alloc(data)) - { - Buffer_SetNewContents(data, str); - } - - if (NULL == data->Buffer) - { - CoerceMethod(cl, obj, OM_DISPOSE); - return 0; - } - - D(bug("String_New(%p)\n",obj)); - - data->ehn.ehn_Events = IDCMP_MOUSEBUTTONS; - data->ehn.ehn_Priority = 0; - data->ehn.ehn_Flags = 0; - data->ehn.ehn_Object = obj; - data->ehn.ehn_Class = cl; - - CurrentTime(&data->OldClick_Sec, &data->OldClick_Micro); - - return (IPTR)obj; -} - -/************************************************************************** - OM_DISPOSE -**************************************************************************/ -IPTR String__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) -{ - struct MUI_StringData *data = INST_DATA(cl, obj); - - FreeVec(data->Buffer); - FreeVec(data->SecBuffer); - - D(bug("String_Dispose %p\n", obj)); - - return DoSuperMethodA(cl, obj, msg); -} - -/************************************************************************** - OM_SET -**************************************************************************/ -IPTR String__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct MUI_StringData *data = INST_DATA(cl, obj); - struct TagItem *tags = msg->ops_AttrList; - struct TagItem *tag; - - while ((tag = NextTagItem(&tags)) != NULL) - { - switch (tag->ti_Tag) - { - case MUIA_String_Contents: - Buffer_SetNewContents(data, (STRPTR)tag->ti_Data); - data->msd_RedrawReason = NEW_CONTENTS; - data->msd_Flags &= ~(MSDF_MARKING | MSDF_KEYMARKING); - MUI_Redraw(obj, MADF_DRAWOBJECT); - break; - - case MUIA_String_Accept: - data->msd_Accept = (CONST_STRPTR)tag->ti_Data; - break; - - case MUIA_String_Reject: - data->msd_Reject = (CONST_STRPTR)tag->ti_Data; - break; - - case MUIA_String_AttachedList: - data->msd_AttachedList = (Object *)tag->ti_Data; - break; - - case MUIA_String_Integer: - { - char buf[20]; - - snprintf(buf, 19, "%ld", tag->ti_Data); - set(obj, MUIA_String_Contents, buf); - } - break; - - case MUIA_String_AdvanceOnCR: - _handle_bool_tag(data->msd_Flags, tag->ti_Data, MSDF_ADVANCEONCR); - break; - - case MUIA_String_BufferPos: - data->BufferPos = (ULONG)tag->ti_Data; - data->msd_Flags &= ~MSDF_MARKING; - data->msd_RedrawReason = MOVE_CURSOR; - MUI_Redraw(obj, MADF_DRAWUPDATE); - break; - - case MUIA_String_DisplayPos: - data->BufferPos = (ULONG)tag->ti_Data; - data->DispPos = data->BufferPos; // move both pos - data->msd_Flags &= ~MSDF_MARKING; - data->msd_RedrawReason = MOVE_CURSOR; - MUI_Redraw(obj, MADF_DRAWUPDATE); - break; - - case MUIA_String_NoInput: /* BetterString */ - _handle_bool_tag(data->msd_Flags, tag->ti_Data, MSDF_NOINPUT); - break; - - case MUIA_String_StayActive: /* BetterString */ - _handle_bool_tag(data->msd_Flags, tag->ti_Data, MSDF_STAYACTIVE); - break; - - case MUIA_String_SelectSize: /* BetterString */ - // TODO: Implement OM_SET(MUIA_String_SelectSize)! - break; - - } - } - - return DoSuperMethodA(cl, obj, (Msg)msg); -} - - -/************************************************************************** - OM_GET -**************************************************************************/ -IPTR String__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) -{ - struct MUI_StringData *data = INST_DATA(cl, obj); - -#define STORE *(msg->opg_Storage) - switch(msg->opg_AttrID) - { - case MUIA_String_Contents: - if (data->msd_useSecret) STORE = (IPTR) data->SecBuffer; - else STORE = (IPTR) data->Buffer; - return TRUE; - - case MUIA_String_Secret: - STORE = (IPTR) data->msd_useSecret; - return TRUE; - - case MUIA_String_Accept: - STORE = (IPTR) data->msd_Accept; - return TRUE; - - case MUIA_String_Reject: - STORE = (IPTR) data->msd_Reject; - return TRUE; - - case MUIA_String_AttachedList: - STORE = (IPTR) data->msd_AttachedList; - return TRUE; - - case MUIA_String_Integer: - { - STRPTR buf = NULL; - STORE = 0; - get(obj, MUIA_String_Contents, &buf); - if (NULL != buf) - { - LONG val = 0; - StrToLong(buf, &val); - STORE = val; - } - return TRUE; - } - - case MUIA_String_MaxLen: - STORE = (IPTR) data->BufferSize; - return TRUE; - - case MUIA_String_AdvanceOnCR: - STORE = (data->msd_Flags & MSDF_ADVANCEONCR) ? TRUE : FALSE; - return TRUE; - - case MUIA_String_BufferPos: - STORE = data->BufferPos; - return TRUE; - - case MUIA_String_DisplayPos: - STORE = data->DispPos; - return TRUE; - - case MUIA_String_NoInput: /* BetterString */ - STORE = (data->msd_Flags & MSDF_NOINPUT) ? TRUE : FALSE; - return TRUE; - - case MUIA_String_StayActive: /* BetterString */ - STORE = (data->msd_Flags & MSDF_STAYACTIVE) ? TRUE : FALSE; - return TRUE; - - case MUIA_String_SelectSize: /* BetterString */ - if (data->msd_Flags & MSDF_MARKING) - { - WORD markstart, markstop; - - if (Buffer_GetMarkedRange(data, &markstart, &markstop)) - { - LONG size = markstop - markstart; - - if (data->MarkPos < data->BufferPos) size = -size; - - STORE = (IPTR)size; - - return 1; - } - - } - - STORE = 0; - return TRUE; - - } - - return DoSuperMethodA(cl, obj, (Msg) msg); -#undef STORE -} - -/************************************************************************** - MUIM_Setup -**************************************************************************/ -IPTR String__MUIM_Setup(struct IClass *cl, Object *obj, struct MUIP_Setup *msg) -{ - struct MUI_StringData *data = INST_DATA(cl, obj); - - if (0 == DoSuperMethodA(cl, obj, (Msg) msg)) - return FALSE; - - data->is_active = FALSE; - set(obj, MUIA_Background, - (IPTR)muiGlobalInfo(obj)->mgi_Prefs->string_bg_inactive); - - zune_pen_spec_to_intern( - (const struct MUI_PenSpec *)muiGlobalInfo(obj)->mgi_Prefs->string_text_inactive, - &data->inactive_text); - zune_penspec_setup(&data->inactive_text, muiRenderInfo(obj)); - - zune_pen_spec_to_intern( - (const struct MUI_PenSpec *)muiGlobalInfo(obj)->mgi_Prefs->string_text_active, - &data->active_text); - zune_penspec_setup(&data->active_text, muiRenderInfo(obj)); - - zune_pen_spec_to_intern( - (const struct MUI_PenSpec *)muiGlobalInfo(obj)->mgi_Prefs->string_text_marked, - &data->marked_text); - zune_penspec_setup(&data->marked_text, muiRenderInfo(obj)); - - zune_pen_spec_to_intern( - (const struct MUI_PenSpec *)muiGlobalInfo(obj)->mgi_Prefs->string_bg_marked, - &data->marked_bg); - zune_penspec_setup(&data->marked_bg, muiRenderInfo(obj)); - - zune_pen_spec_to_intern( - (const struct MUI_PenSpec *)muiGlobalInfo(obj)->mgi_Prefs->string_cursor, - &data->cursor); - zune_penspec_setup(&data->cursor, muiRenderInfo(obj)); - - DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR)&data->ehn); - return TRUE; -} - -/************************************************************************** - MUIM_Cleanup -**************************************************************************/ -IPTR String__MUIM_Cleanup(struct IClass *cl, Object *obj, struct MUIP_Cleanup *msg) -{ - struct MUI_StringData *data = INST_DATA(cl, obj); - - D(bug("String_Cleanup %p\n", obj)); - DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR)&data->ehn); - - zune_penspec_cleanup(&data->inactive_text); - zune_penspec_cleanup(&data->active_text); - zune_penspec_cleanup(&data->marked_text); - zune_penspec_cleanup(&data->marked_bg); - zune_penspec_cleanup(&data->cursor); - - return (DoSuperMethodA(cl, obj, (Msg) msg)); -} - -/************************************************************************** - MUIM_AskMinMax -**************************************************************************/ -IPTR String__MUIM_AskMinMax(struct IClass *cl, Object *obj, struct MUIP_AskMinMax *msg) -{ - struct MUI_StringData *data = INST_DATA(cl, obj); - - DoSuperMethodA(cl, obj, (Msg)msg); - - if (data->Columns >= 0) - { - msg->MinMaxInfo->MinWidth += _font(obj)->tf_XSize * data->Columns; - msg->MinMaxInfo->DefWidth += _font(obj)->tf_XSize * data->Columns; - msg->MinMaxInfo->MaxWidth += _font(obj)->tf_XSize * data->Columns; - } - else - { - msg->MinMaxInfo->MinWidth += _font(obj)->tf_XSize * 4; - msg->MinMaxInfo->DefWidth += _font(obj)->tf_XSize * 12; - msg->MinMaxInfo->MaxWidth = MUI_MAXMAX; - } - - msg->MinMaxInfo->MinHeight += _font(obj)->tf_YSize; - msg->MinMaxInfo->DefHeight += _font(obj)->tf_YSize; - msg->MinMaxInfo->MaxHeight += _font(obj)->tf_YSize; - -/* D(bug("String_AskMinMax(%p): Min=%ldx%ld Max=%ldx%ld Def=%ldx%ld\n", obj, */ -/* msg->MinMaxInfo->MinWidth, msg->MinMaxInfo->MinHeight, */ -/* msg->MinMaxInfo->MaxWidth, msg->MinMaxInfo->MaxHeight, */ -/* msg->MinMaxInfo->DefWidth, msg->MinMaxInfo->DefHeight)); */ - - return TRUE; -} - - -static WORD MaxDispPos(struct IClass *cl, Object *obj) -{ - struct MUI_StringData *data = INST_DATA(cl, obj); - WORD numfit, max_disppos, numchars; - struct TextExtent te; - BOOL cursor_at_end; - - cursor_at_end = (data->BufferPos == data->NumChars); - -/* D(bug("MaxDispPos(current length: %d, bufferpos=%d)\n", */ -/* data->NumChars, data->BufferPos)); */ - -/* D(bug("cursor_at_end: %d\n", cursor_at_end)); */ - - if (cursor_at_end) /* Cursor at end of string ? */ - { -/* D(bug("Making cursor last char\n")); */ - numchars = data->NumChars + 1; /* Take cursor into account */ - -/* This has already been done by UpdateDisp() which called us - strinfo->Buffer[strinfo->NumChars] = 0x20; - -*/ - } - else - { - numchars = data->NumChars; - } - - /* Find the amount of characters that fit into the bbox, counting - ** from the last character in the buffer and forward, - */ - numfit = TextFit(_rp(obj), - &(data->Buffer[numchars - 1]), - numchars, &te, NULL, - -1, _mwidth(obj), _mheight(obj)); - - max_disppos = numchars - numfit; - -/* if ((max_disppos > 0) && (!cursor_at_end)) - max_disppos --; - */ - -/* D(bug("Numchars w/cursor: %d, Numfit: %d, maxdisppos=%d " */ -/* "bbox->Width = %d te->te_Width = %d\n", */ -/* numchars, numfit, max_disppos, _mwidth(obj), te.te_Width)); */ - - return max_disppos; -} - - -static void UpdateDisp(struct IClass *cl, Object *obj) -{ - struct MUI_StringData *data = INST_DATA(cl, obj); - struct TextExtent te; - STRPTR dispstr; - - /* If the cursor is at the trailing \0, insert a SPACE instead */ - if (data->BufferPos == data->NumChars) - data->Buffer[data->NumChars] = 0x20; - - /* In this function we check if the cursor has gone outside - ** of the visible area (because of application setting - ** strinfo->BufferPos or strinfo->DispPos to a different value, or - ** because of user input). - ** This is made a bit difficult by the rule (R), that there - ** should NOT be available space on the right, and characters - ** scrolled out at the left, at the same time. - ** We have 3 possible scenarios: - ** 1) Cursor to the left of DispPos: - ** Set DispPos to the lowest of BufferPos and the - ** maximum allowed disppos (according to (R) ). - ** 2) Cursor to the right of visible area: - ** Set dispose sou that the cursor is the last visible character. - ** This afheres to (R). - ** 3) Cursor inside visible area. Do a check on rule (R), - ** and if DispPos > max allowed, then adjust it down, - ** so that the last character in the buffer becomes last character - ** displayed. (The cursor will still be visible after adjustion) - */ - - /* 1) Cursor to the left of visible area */ - if (data->BufferPos < data->DispPos) - { - WORD max_disppos; - - max_disppos = MaxDispPos(cl, obj); - data->DispPos = MIN(data->BufferPos, max_disppos); - } - else /* Cursor equal to the right of disppos [ 2) or 3) ] */ - { - UWORD strsize; - - /* How many pixels are there from current 1st displayed to the cursor ? */ - strsize = TextLength(_rp(obj), - data->Buffer + data->DispPos, - data->BufferPos - data->DispPos + 1); - - /* 2) More than fits into the gadget ? */ - if (strsize > _mwidth(obj)) - { - /* Compute new DispPos such that the cursor is at the right */ - data->DispPos = data->BufferPos - - TextFit(_rp(obj), - &(data->Buffer[data->BufferPos]), - data->NumChars, &te, NULL, -1, - _mwidth(obj), _mheight(obj)) - + 1; - -/* D(bug("cursor right of visible area, new disppos: %d\n", data->DispPos)); */ - } - else /* 3). Cursor inside gadget */ - { - WORD max_disppos; - - max_disppos = MaxDispPos(cl, obj); - if (data->DispPos > max_disppos) - data->DispPos = max_disppos; - - } /* if (cursor inside or to the right of visible area )*/ - - } - - /* Update the DispCount */ - /* It might be necessary with special handling for centre aligned gads */ - dispstr = &(data->Buffer[data->DispPos]); -/* D(bug("DispCount before = %d\n", data->DispCount)); */ - data->DispCount = TextFit(_rp(obj), dispstr, - data->NumChars - data->DispPos, - &te, NULL, 1, - _mwidth(obj), - _mheight(obj)); -/* D(bug("DispCount after = %d\n", data->DispCount)); */ - - /* 0-terminate string */ - data->Buffer[data->NumChars] = 0x00; -} - - -/* Gets left position of text in the string gadget */ -static UWORD GetTextLeft(struct IClass *cl, Object *obj) -{ - struct MUI_StringData *data = INST_DATA(cl, obj); - UWORD text_left = 0; - STRPTR dispstr = &(data->Buffer[data->DispPos]); - UWORD dispstrlen; - BOOL cursor_at_end; - - cursor_at_end = (data->BufferPos == data->NumChars); - dispstrlen = MIN(data->DispCount, data->NumChars - data->DispPos); - - switch (data->msd_Align) - { - case MUIV_String_Format_Left: - text_left = _mleft(obj); - break; - - case MUIV_String_Format_Center: { - WORD textwidth = TextLength(_rp(obj), dispstr, dispstrlen); - if (cursor_at_end) textwidth += TextLength(_rp(obj), " ", 1); - text_left = _mleft(obj) + ((_mwidth(obj) - textwidth) / 2); -/* D(bug("GetTextLeft: dispstr=%s, dispstrlen=%d, textw=%d, textl=%d\n", */ -/* dispstr, dispstrlen, textwidth, text_left)); */ - } break; - - case MUIV_String_Format_Right: { - WORD textwidth = TextLength(_rp(obj), dispstr, dispstrlen); - - if (cursor_at_end) textwidth += TextLength(_rp(obj), " ", 1); - text_left = _mleft(obj) + (_mwidth(obj) - 1 - textwidth); - } break; - } - return (text_left); -} - -/* Gets right offset of text in the string gadget */ -static UWORD GetTextRight(struct IClass *cl, Object *obj) -{ - struct MUI_StringData *data = INST_DATA(cl, obj); - UWORD text_right = 0; - STRPTR dispstr = &(data->Buffer[data->DispPos]); - UWORD dispstrlen; - BOOL cursor_at_end; - - cursor_at_end = (data->BufferPos == data->NumChars); - dispstrlen = MIN(data->DispCount, data->NumChars - data->DispPos); - - switch (data->msd_Align) - { - case MUIV_String_Format_Left: - text_right = _mleft(obj) + TextLength(_rp(obj), dispstr, dispstrlen); - break; - - case MUIV_String_Format_Center: { - WORD textwidth = TextLength(_rp(obj), dispstr, dispstrlen); - - if (cursor_at_end) textwidth += TextLength(_rp(obj), " ", 1); - text_right = _mright(obj) - ((_mwidth(obj) - textwidth) / 2); - } break; - - case MUIV_String_Format_Right: - text_right = _mright(obj); - break; - } - return (text_right); -} - - -/* Updates the stringdata in case user has set some fields */ -static VOID UpdateStringData(struct IClass *cl, Object *obj) -{ - struct MUI_StringData *data = INST_DATA(cl, obj); - - data->NumChars = strlen(data->Buffer); - - if (data->BufferPos > data->NumChars) - { - data->BufferPos = data->NumChars; - } -} - -static VOID TextM(Object *obj, struct MUI_StringData *data, - STRPTR text, WORD textlen, WORD markstart, WORD markend) -{ - struct RastPort *rp = _rp(obj); - ULONG textpen; - WORD len; - - if (data->is_active) - textpen = data->active_text.p_pen; - else - textpen = data->inactive_text.p_pen; - - //kprintf("TextM: textlen %d markstart %d markend %d ... \n", textlen, markstart, markend); - - /* <unmarked><marked><unmarked> */ - - /* <unmarked> */ - - len = MIN(markstart, textlen); - len = MAX(len, 0); - - if (len) - { - //kprintf("A: %d ", len); - - SetABPenDrMd(rp, textpen, _pens(obj)[MPEN_BACKGROUND], JAM1); - Text(rp, text, len); - - text += len; textlen -= len; - - } - - len = MIN(markend - len, textlen); - len = MAX(len, 0); - - if (len) - { - //kprintf("B: %d ", len); - SetABPenDrMd(_rp(obj), data->marked_text.p_pen, data->marked_bg.p_pen, JAM2); - Text(rp, text, len); - - text += len; textlen -= len; - } - - if (textlen) - { - //kprintf("C: %d ", textlen); - - SetABPenDrMd(rp, textpen, _pens(obj)[MPEN_BACKGROUND], JAM1); - Text(rp, text, textlen); - } - //kprintf("\n"); -} - -/************************************************************************** - MUIM_Draw -**************************************************************************/ -IPTR String__MUIM_Draw(struct IClass *cl, Object *obj, struct MUIP_Draw *msg) -{ - struct MUI_StringData *data = INST_DATA(cl, obj); - UWORD text_left; - UWORD text_top; - STRPTR dispstr; - UWORD dispstrlen; - ULONG textpen; - UWORD textleft_save; - WORD markstart = 0, markstop = 0; - - /* D(bug("\nString_Draw(%p) %ldx%ldx%ldx%ld reason=%ld msgflgs=%ld curs=%d " */ -/* "displ=%ld len=%ld buf='%s'\n",obj,_mleft(obj),_mtop(obj), */ -/* _mwidth(obj),_mheight(obj), data->msd_RedrawReason, msg->flags, */ -/* data->BufferPos, data->DispPos, data->NumChars, data->Buffer)); */ - - DoSuperMethodA(cl,obj,(Msg)msg); - - if (!(msg->flags & MADF_DRAWUPDATE) && !(msg->flags & MADF_DRAWOBJECT)) - return 0; - - SetFont(_rp(obj), _font(obj)); - if (data->is_active) - textpen = data->active_text.p_pen; - else - textpen = data->inactive_text.p_pen; - - /* Update the stringdata in case of user change */ - UpdateStringData(cl, obj); - /* Update the DispPos and DispCount fields so that the gadget renders properly */ - UpdateDisp(cl, obj); - - text_top = _mtop(obj) - + ((_mheight(obj) - _rp(obj)->Font->tf_YSize) >> 1) - + _rp(obj)->Font->tf_Baseline; - - dispstr = data->Buffer + data->DispPos; - dispstrlen = MIN(data->DispCount, data->NumChars - data->DispPos); - textleft_save = text_left = GetTextLeft(cl, obj); - - // little flicker improvement, dont redraw first part of string - // when adding a char - if (msg->flags & MADF_DRAWUPDATE && - data->msd_RedrawReason == DO_ADDCHAR && - data->msd_Align == MUIV_String_Format_Left && - data->DispPos == 0) - { - text_left += TextLength(_rp(obj), dispstr, data->BufferPos - 1); - dispstr += data->BufferPos - 1; - dispstrlen -= data->BufferPos - 1; - DoMethod(obj, MUIM_DrawBackground, text_left, _mtop(obj), - _mwidth(obj) - text_left + _mleft(obj), _mheight(obj), - text_left, _mtop(obj), 0); - } - else if (msg->flags & MADF_DRAWUPDATE) - { - DoMethod(obj, MUIM_DrawBackground, _mleft(obj), _mtop(obj), - _mwidth(obj), _mheight(obj), _mleft(obj), _mtop(obj), 0); - } - - SetABPenDrMd(_rp(obj), textpen, _pens(obj)[MPEN_BACKGROUND], JAM1); - Move(_rp(obj), text_left, text_top); - - if ((data->msd_Flags & MSDF_MARKING) && Buffer_GetMarkedRange(data, &markstart, &markstop)) - { - TextM(obj, data, dispstr, dispstrlen, markstart - data->DispPos, - markstop - data->DispPos); - - } - else - { - Text(_rp(obj), dispstr, dispstrlen); - - if (data->is_active) // active, draw cursor - { - UWORD cursoroffset = data->BufferPos - data->DispPos; - - dispstr = data->Buffer + data->DispPos; - text_left = textleft_save; - - SetABPenDrMd(_rp(obj), data->active_text.p_pen, data->cursor.p_pen, JAM2); - text_left += TextLength(_rp(obj), dispstr, cursoroffset); - - - Move(_rp(obj), text_left, text_top); - Text(_rp(obj), - ((data->BufferPos < data->NumChars) - ? dispstr + cursoroffset - : (STRPTR)" "), - 1 ); - } - } - - data->msd_RedrawReason = NO_REASON; - return TRUE; -} - -/************************************************************************** - Returns whether object needs redrawing -**************************************************************************/ -static int String_HandleVanillakey(struct IClass *cl, Object * obj, - unsigned char code, UWORD qual) -{ - struct MUI_StringData *data = (struct MUI_StringData*)INST_DATA(cl, obj); - BOOL doinput; - - D(bug("String_HandleVanillakey: code=%d qual=%d\n", code, qual)); - - if (0 == code) - return 0; - - doinput = (data->msd_Flags & MSDF_NOINPUT) ? FALSE : TRUE; - - if (doinput && (code == '\b')) /* backspace */ - { - if (Buffer_KillMarked(data)) - { - return 1; - } - - if (data->BufferPos > 0) - { - LONG shift; - - if ((qual & IEQUALIFIER_LSHIFT) || (qual & IEQUALIFIER_RSHIFT)) - { - shift = data->BufferPos; - data->msd_RedrawReason = NEW_CONTENTS; - } - else - { - shift = 1; - data->msd_RedrawReason = DO_BACKSPACE; - } - - strcpy(&data->Buffer[data->BufferPos - shift], - &data->Buffer[data->BufferPos]); - data->BufferPos -= shift; - data->NumChars -= shift; - return 1; - } - return 0; - } - - if (doinput && (code == 21)) // ctrl-u == NAK (like shift-bs) - { - if (Buffer_KillMarked(data)) - { - return 1; - } - - if (data->BufferPos > 0) - { - strcpy(&data->Buffer[0], - &data->Buffer[data->BufferPos]); - data->NumChars -= data->BufferPos; - data->BufferPos = 0; - data->msd_RedrawReason = NEW_CONTENTS; - return 1; - } - return 0; - } - - if (doinput && (code == 127)) /* del */ - { - if (!Buffer_KillMarked(data)) - { - if ((qual & IEQUALIFIER_LSHIFT) || (qual & IEQUALIFIER_RSHIFT)) - { - data->Buffer[data->BufferPos] = 0; - data->NumChars = data->BufferPos; - data->msd_RedrawReason = NEW_CONTENTS; - } - else - { - if (data->BufferPos < data->NumChars) - { - strcpy(&data->Buffer[data->BufferPos], - &data->Buffer[data->BufferPos+1]); - data->NumChars--; - } - - data->msd_RedrawReason = DO_DELETE; - } - } - return 1; - } - - if (doinput && (code == 11)) // ctrl-k == VT == \v (like shift-del) - { - if (!Buffer_KillMarked(data)) - { - data->Buffer[data->BufferPos] = 0; - data->NumChars = data->BufferPos; - data->msd_RedrawReason = NEW_CONTENTS; - } - return 1; - } - - if (doinput && (code == 24)) /* ctrl x == ascii cancel */ - { - if (!Buffer_KillMarked(data)) - { - data->Buffer[0] = 0; - data->BufferPos = 0; - data->NumChars = 0; - data->msd_RedrawReason = NEW_CONTENTS; - } - return 1; - } - - if (code == 1) // ctrl-a, linestart - { - data->BufferPos = 0; - data->msd_Flags &= ~(MSDF_MARKING | MSDF_KEYMARKING); - return 1; - } - - if (code == 26) // ctrl-z, lineend - { - data->BufferPos = data->NumChars; - data->msd_Flags &= ~(MSDF_MARKING | MSDF_KEYMARKING); - return 1; - } - - if (((ToLower(code) == 'c') || (ToLower(code) == 'x')) && - (qual & IEQUALIFIER_RCOMMAND)) - { - WORD markstart, markstop; - - if ((data->msd_Flags & MSDF_MARKING) && Buffer_GetMarkedRange(data, &markstart, &markstop)) - { - clipboard_write_text(&data->Buffer[markstart], markstop - markstart); - - if (doinput && (ToLower(code) == 'x')) - { - Buffer_KillMarked(data); - } - else - { - data->BufferPos = markstop; - data->msd_Flags &= ~MSDF_MARKING; - } - return 1; - } - return 0; - } - - if (doinput && (ToLower(code) == 'v') && (qual & IEQUALIFIER_RCOMMAND)) - { - STRPTR text; - int retval; - struct Locale *locale = OpenLocale(NULL); - - retval = Buffer_KillMarked(data); - if ((text = clipboard_read_text())) - { - STRPTR text2 = text; - UBYTE c; - - while((c = *text2++)) - { - if (!IsPrint(locale, c)) break; - if (!(Buffer_AddChar(data, c))) break; - if (!retval) retval = 1; - } - - clipboard_free_text(text); - } - - CloseLocale(locale); - - return retval; - } - - if (data->msd_Accept != NULL) - { - /* Check if character is accepted */ - if (NULL == strchr(data->msd_Accept, code)) - return 0; - } - - if (data->msd_Reject != NULL) - { - /* Check if character is rejected */ - if (NULL != strchr(data->msd_Reject, code)) - { - DisplayBeep(NULL); - return 0; - } - } - - if (doinput) - { - struct Locale *locale = OpenLocale(NULL); - - if(!(code >= 0x09 && code <= 0x0D) && IsPrint(locale, code)) - { - Buffer_KillMarked(data); - if (Buffer_AddChar(data, code)) - { - data->msd_RedrawReason = DO_ADDCHAR; - return 2; - } - } - - CloseLocale(locale); - } - - data->msd_RedrawReason = DO_UNKNOWN; - return 0; -} - - -/************************************************************************** - MUIM_HandleEvent -**************************************************************************/ -IPTR String__MUIM_HandleEvent(struct IClass *cl, Object * obj, - struct MUIP_HandleEvent *msg) -{ - struct MUI_StringData *data = (struct MUI_StringData*) INST_DATA(cl, obj); - ULONG retval = 0; - int update = 0; - BOOL edited = FALSE; - LONG muikey = msg->muikey; - BOOL cursor_kills_marking = FALSE; - - if ((data->msd_Flags & MSDF_MARKING) && !(data->msd_Flags & MSDF_KEYMARKING)) - { - cursor_kills_marking = TRUE; - } - - if (muikey == MUIKEY_NONE) - { - if (msg->imsg->Class == IDCMP_RAWKEY) - { - static LONG muikeytable[3][2] = - { - {MUIKEY_LEFT , MUIKEY_RIGHT }, - {MUIKEY_WORDLEFT , MUIKEY_WORDRIGHT }, - {MUIKEY_LINESTART , MUIKEY_LINEEND } - }; - WORD dirindex = -1, amountindex = 0; - - switch(msg->imsg->Code) - { - case 0x4F: - dirindex = 0; - break; - - case 0x4E: - dirindex = 1; - break; - - #ifdef __AROS__ - case RAWKEY_HOME: - muikey = MUIKEY_LINESTART; - break; - - case RAWKEY_END: - muikey = MUIKEY_LINEEND; - break; - #endif - - } - - if ((dirindex != -1) && (muikey == MUIKEY_NONE)) - { - if (msg->imsg->Qualifier & (IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT)) - { - amountindex = 2; - } - else if (msg->imsg->Qualifier & IEQUALIFIER_CONTROL) - { - amountindex = 1; - } - - muikey = muikeytable[amountindex][dirindex]; - } - - } - } - - D(bug("String_HandleEvent: muikey %d, imsg %p is_active=%d\n", muikey, - msg->imsg, data->is_active)); - if (muikey != MUIKEY_NONE && data->is_active) - { - retval = MUI_EventHandlerRC_Eat; - - switch (muikey) - { - case MUIKEY_LEFT: - if (cursor_kills_marking) - { - update = 1; - data->BufferPos = MIN(data->BufferPos, data->MarkPos); - if (data->BufferPos > 0) data->BufferPos--; - - data->msd_Flags &= ~MSDF_MARKING; - } - else if (data->BufferPos > 0) - { - update = 1; - - data->BufferPos--; - data->msd_RedrawReason = DO_CURSOR_LEFT; - } - break; - case MUIKEY_RIGHT: - if (cursor_kills_marking) - { - update = 1; - data->BufferPos = MAX(data->BufferPos, data->MarkPos); - data->msd_Flags &= ~MSDF_MARKING; - } - else if (data->BufferPos < data->NumChars) - { - update = 1; - data->BufferPos++; - data->msd_RedrawReason = DO_CURSOR_RIGHT; - } - break; - case MUIKEY_WORDLEFT: - if (data->BufferPos > 0) - { - data->BufferPos = Buffer_GetPrevWordIndex(data, data->BufferPos); - update = 1; - data->msd_RedrawReason = DO_CURSOR_LEFT; - } - if (cursor_kills_marking) - { - data->msd_Flags &= ~MSDF_MARKING; - update = 1; - } - break; - case MUIKEY_WORDRIGHT: - if (data->BufferPos < data->NumChars) - { - data->BufferPos = Buffer_GetSuccWordIndex(data, data->BufferPos); - update = 1; - data->msd_RedrawReason = DO_CURSOR_RIGHT; - } - if (cursor_kills_marking) - { - data->msd_Flags &= ~MSDF_MARKING; - update = 1; - } - break; - case MUIKEY_LINESTART: - data->BufferPos = 0; - update = 1; - if (cursor_kills_marking) - { - data->msd_Flags &= ~MSDF_MARKING; - } - break; - - case MUIKEY_LINEEND: - data->BufferPos = data->NumChars; - update = 1; - if (cursor_kills_marking) - { - data->msd_Flags &= ~MSDF_MARKING; - } - break; - - case MUIKEY_UP: - if (data->msd_AttachedList) - set(data->msd_AttachedList, - MUIA_List_Active, MUIV_List_Active_Up); - break; - case MUIKEY_DOWN: - if (data->msd_AttachedList) - set(data->msd_AttachedList, - MUIA_List_Active, MUIV_List_Active_Down); - break; - case MUIKEY_PAGEUP: - if (data->msd_AttachedList) - set(data->msd_AttachedList, - MUIA_List_Active, MUIV_List_Active_PageUp); - break; - case MUIKEY_PAGEDOWN: - if (data->msd_AttachedList) - set(data->msd_AttachedList, - MUIA_List_Active, MUIV_List_Active_PageDown); - break; - case MUIKEY_TOP: - if (data->msd_AttachedList) - set(data->msd_AttachedList, - MUIA_List_Active, MUIV_List_Active_Top); - break; - case MUIKEY_BOTTOM: - if (data->msd_AttachedList) - set(data->msd_AttachedList, - MUIA_List_Active, MUIV_List_Active_Bottom); - break; - case MUIKEY_PRESS: { - UBYTE *buf = NULL; - - get(obj, MUIA_String_Contents, &buf); - - if (data->msd_Flags & MSDF_STAYACTIVE) - { - /* Do not change active object */ - } - else if (data->msd_Flags & MSDF_ADVANCEONCR) - { - set(_win(obj), MUIA_Window_ActiveObject, MUIV_Window_ActiveObject_Next); - } - else if (!(data->msd_Flags & MSDF_STAYACTIVE)) - { - set(_win(obj), MUIA_Window_ActiveObject, MUIV_Window_ActiveObject_None); - } - - set(obj, MUIA_String_Acknowledge, buf); - } break; - - case MUIKEY_WINDOW_CLOSE: - data->is_active = FALSE; - set(obj, MUIA_Background, - (IPTR)muiGlobalInfo(obj)->mgi_Prefs->string_bg_inactive); - DoMethod(obj, MUIM_GoInactive); - retval = 0; - break; - - default: - retval = 0; - } // switch(muikey) - } // if (muikey != MUIKEY_NONE) - - if (msg->imsg) - { - UWORD code = msg->imsg->Code; - //UWORD qual = msg->imsg->Qualifier; - WORD x = msg->imsg->MouseX; - WORD y = msg->imsg->MouseY; - - //bug("String_HandleEvent: parsing imsg %p, class=%ld\n", msg->imsg, msg->imsg->Class); - - switch (msg->imsg->Class) - { - case IDCMP_MOUSEBUTTONS: /* set cursor and activate it */ - if (code == SELECTDOWN) - { - //bug("String_HandleEvent: code == SELECTDOWN, x=%d y=%d\n", x, y); - - if (_isinobject(x, y)) - { - UWORD text_left, text_right; - - retval = MUI_EventHandlerRC_Eat; - - CurrentTime(&data->NewClick_Sec, &data->NewClick_Micro); - if (DoubleClick(data->OldClick_Sec, data->OldClick_Micro, - data->NewClick_Sec, data->NewClick_Micro)) - { - data->MultiClick++; - } - else - { - data->MultiClick = 0; - } - data->OldClick_Sec = data->NewClick_Sec; - data->OldClick_Micro = data->NewClick_Micro; - - //kprintf("multiclick %d\n", data->MultiClick); - - if (!data->is_active) - { - //bug("String got button, lets activate\n"); - data->is_active = TRUE; - data->msd_RedrawReason = WENT_ACTIVE; - // redraw - set(obj, MUIA_Background, - (IPTR)muiGlobalInfo(obj)->mgi_Prefs->string_bg_active); - - //DoMethod(obj, MUIM_GoActive); - set(_win(obj), MUIA_Window_ActiveObject, obj); - // let other objects a chance to get desactivated - //retval = 0; - } - - if (!(data->ehn.ehn_Events & IDCMP_MOUSEMOVE)) - { - DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR)&data->ehn); - data->ehn.ehn_Events |= IDCMP_MOUSEMOVE; - DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR)&data->ehn); - } - - text_left = GetTextLeft (cl, obj); - text_right = GetTextRight(cl, obj); - - /* Check if mouseclick is inside displayed text */ - if ((x >= text_left) && (x <= text_right)) - { - /* Find new cursor pos. */ - struct TextExtent te; - ULONG newpos; - STRPTR dispstr = data->Buffer + data->DispPos; - - newpos = data->DispPos - + TextFit(_rp(obj), dispstr, data->NumChars - data->DispPos, - &te, NULL, 1, - x - text_left, _rp(obj)->Font->tf_YSize); - - if (data->BufferPos != newpos) - { - data->BufferPos = newpos; - update = 1; - } - } - else if (x < text_left) - { - /* Click on empty space at left. Set cursor to first visible */ - if (data->BufferPos != data->DispPos) - { - data->BufferPos = data->DispPos; - update = 1; - } - } - else - { - /* Click on empty space at right. Set cursor to last visible */ - if (data->BufferPos != data->DispPos + data->DispCount) - { - data->BufferPos = data->DispPos + data->DispCount; - update = 1; - } - } /* if (click is on text or not) */ - - data->MarkPos = data->BufferPos; - - if (data->MultiClick == 0) - { - if (data->msd_Flags & MSDF_MARKING) - { - data->msd_Flags &= ~MSDF_MARKING; - update = 1; - } - } - else if (data->MultiClick && Buffer_GetMarkedRange(data, NULL, NULL)) - { - data->msd_Flags |= MSDF_MARKING; - update = 1; - } - - - } /* is in object */ - else if (data->is_active && !(data->msd_Flags & MSDF_STAYACTIVE)) /* and click not on object */ - { - data->is_active = FALSE; - set(obj, MUIA_Background, - (IPTR)muiGlobalInfo(obj)->mgi_Prefs->string_bg_inactive); - //DoMethod(obj, MUIM_GoInactive); - // let other objects a chance to get activated - //retval = 0; - } - } /* if (code == SELECTDOWN) */ - else if (code == SELECTUP) - { - if (data->ehn.ehn_Events & IDCMP_MOUSEMOVE) - { - DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR)&data->ehn); - data->ehn.ehn_Events &= ~IDCMP_MOUSEMOVE; - DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR)&data->ehn); - } - } - break; - - case IDCMP_MOUSEMOVE: - if (data->is_active) - { - UWORD text_left, text_right; - - if (!(data->msd_Flags & MSDF_MARKING)) - { - data->msd_Flags |= MSDF_MARKING; - } - - text_left = GetTextLeft (cl, obj); - text_right = GetTextRight(cl, obj); - - /* Check if mouseclick is inside displayed text */ - if ((x >= text_left) && (x <= text_right)) - { - /* Find new cursor pos. */ - struct TextExtent te; - ULONG newpos; - STRPTR dispstr = data->Buffer + data->DispPos; - - newpos = data->DispPos - + TextFit(_rp(obj), dispstr, data->NumChars - data->DispPos, - &te, NULL, 1, - x - text_left, _rp(obj)->Font->tf_YSize); - - if (data->BufferPos != newpos) - { - WORD old_markstart = 0, old_markstop = 0; - WORD markstart = 0, markstop = 0; - BOOL was_marked, is_marked; - - was_marked = Buffer_AnythingMarked(data) && - Buffer_GetMarkedRange(data, &old_markstart, &old_markstop); - - data->BufferPos = newpos; - - is_marked = Buffer_AnythingMarked(data) && - Buffer_GetMarkedRange(data, &markstart, &markstop); - - if ((was_marked != is_marked) || - (old_markstart != markstart) || - (old_markstop != markstop)) - { - update = 1; - } - } - } - else if ((x < text_left) && (data->BufferPos > 0)) - { - data->BufferPos--; - update = 1; - data->msd_RedrawReason = DO_CURSOR_LEFT; - } - else if ((x > text_right) && (data->BufferPos < data->NumChars)) - { - data->BufferPos++; - update = 1; - data->msd_RedrawReason = DO_CURSOR_RIGHT; - } - //kprintf(" ---- bp: %d\n", data->BufferPos); - } - break; - - case IDCMP_RAWKEY: - { - unsigned char code; - - //bug("String_HandleEvent: idcmp_rawkey\n"); - - if (!data->is_active) - break; - - code = ConvertKey(msg->imsg); - if (!code) - { - switch(msg->imsg->Code) - { - case 0x64: /* LALT */ - case 0x65: /* RALT */ - case 0x64 | IECODE_UP_PREFIX: - case 0x65 | IECODE_UP_PREFIX: - if (msg->imsg->Qualifier & (IEQUALIFIER_LALT | IEQUALIFIER_RALT)) - { - data->MarkPos = data->BufferPos; - data->msd_Flags |= (MSDF_MARKING | MSDF_KEYMARKING); - } - else - { - data->msd_Flags &= ~MSDF_KEYMARKING; - } - break; - - } - } - - if (code) - { - update = String_HandleVanillakey(cl, obj, code, msg->imsg->Qualifier); - if (update) - { - retval = MUI_EventHandlerRC_Eat; - edited = TRUE; - } - } - } - break; - } - } - - if (edited) - set(obj, MUIA_String_Contents, data->Buffer); // trigger notification - - if (update) - { - MUI_Redraw(obj, MADF_DRAWUPDATE); - } - //D(bug("String eh return %ld\n", retval)); - return retval; -} - - -/************************************************************************** - MUIM_Export : to export an object's "contents" to a dataspace object. -**************************************************************************/ -IPTR String__MUIM_Export(struct IClass *cl, Object *obj, struct MUIP_Export *msg) -{ - struct MUI_StringData *data = INST_DATA(cl, obj); - ULONG id; - STRPTR buf = NULL; - - if (data->msd_useSecret) - buf = data->SecBuffer; - else - buf = data->Buffer; - - if ((id = muiNotifyData(obj)->mnd_ObjectID)) - { - if (buf != NULL) - DoMethod(msg->dataspace, MUIM_Dataspace_Add, - (IPTR)buf, - data->NumChars + 1, - (IPTR)id); - else - DoMethod(msg->dataspace, MUIM_Dataspace_Remove, - (IPTR)id); - } - return 0; -} - - -/************************************************************************** - MUIM_Import : to import an object's "contents" from a dataspace object. -**************************************************************************/ -IPTR String__MUIM_Import(struct IClass *cl, Object *obj, struct MUIP_Import *msg) -{ - ULONG id; - STRPTR s; - - if ((id = muiNotifyData(obj)->mnd_ObjectID)) - { - if ((s = (STRPTR)DoMethod(msg->dataspace, MUIM_Dataspace_Find, (IPTR)id))) - { - set(obj, MUIA_String_Contents, s); - } - } - return 0; -} - -/************************************************************************** - MUIM_GoActive -**************************************************************************/ -IPTR String__MUIM_GoActive(struct IClass * cl, Object * obj, Msg msg) -{ - struct MUI_StringData *data = (struct MUI_StringData*) INST_DATA(cl, obj); - - //D(bug("String_GoActive %p\n", obj)); - DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR)&data->ehn); - data->ehn.ehn_Events = IDCMP_MOUSEBUTTONS | IDCMP_RAWKEY; - DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR)&data->ehn); - data->is_active = TRUE; - data->msd_Flags &= ~MSDF_KEYMARKING; - data->msd_RedrawReason = WENT_ACTIVE; - // redraw - set(obj, MUIA_Background, - (IPTR)muiGlobalInfo(obj)->mgi_Prefs->string_bg_active); - return 0; -} - -/************************************************************************** - MUIM_GoInactive -**************************************************************************/ -IPTR String__MUIM_GoInactive(struct IClass * cl, Object * obj, Msg msg) -{ - struct MUI_StringData *data = (struct MUI_StringData*) INST_DATA(cl, obj); - - //D(bug("String_GoInactive %p\n", obj)); - - DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR)&data->ehn); - data->ehn.ehn_Events = IDCMP_MOUSEBUTTONS; - DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR)&data->ehn); - data->is_active = FALSE; - data->msd_RedrawReason = WENT_INACTIVE; - data->MultiClick = 0; - - // redraw - set(obj, MUIA_Background, - (IPTR)muiGlobalInfo(obj)->mgi_Prefs->string_bg_inactive); - return 0; -} - -/************************************************************************** - MUIM_String_ClearSelected (BetterString) -**************************************************************************/ -IPTR String__MUIM_ClearSelected(struct IClass * cl, Object * obj, struct MUIP_String_ClearSelected *msg) -{ - struct MUI_StringData *data = (struct MUI_StringData*) INST_DATA(cl, obj); - - //D(bug("String_ClearSelected %p\n", obj)); - - if (Buffer_KillMarked(data)) - { - MUI_Redraw(obj, MADF_DRAWUPDATE); - } - - return 0; -} - -/************************************************************************** - MUIM_String_Insert (BetterString) -**************************************************************************/ -IPTR String__MUIM_Insert(struct IClass * cl, Object * obj, struct MUIP_String_Insert *msg) -{ - struct MUI_StringData *data = (struct MUI_StringData*) INST_DATA(cl, obj); - LONG pos; - ULONG old_bufferpos; - ULONG num_inserted = 0; - - //D(bug("String_Insert %p\n", obj)); - - switch((ULONG)msg->pos) - { - case MUIV_String_Insert_StartOfString: - pos = 0; - break; - - case MUIV_String_Insert_EndOfString: - pos = data->NumChars; - break; - - case MUIV_String_Insert_BufferPos: - pos = data->BufferPos; - break; - - default: - pos = msg->pos; - break; - } - - if ((pos < 0) || (pos > data->NumChars)) return 0; - - old_bufferpos = data->BufferPos; - data->BufferPos = pos; - - while(msg->text[num_inserted] && Buffer_AddChar(data, msg->text[num_inserted])) - { - num_inserted++; - } - - if (num_inserted) - { - if (old_bufferpos >= pos) - { - data->BufferPos = old_bufferpos + num_inserted; - } - else - { - data->BufferPos = old_bufferpos; - } - - MUI_Redraw(obj, MADF_DRAWUPDATE); - } - - return 0; -} - -/************************************************************************** - MUIM_String_FileNameStart (BetterString) -**************************************************************************/ -IPTR String__MUIM_FileNameStart(struct IClass * cl, Object * obj, struct MUIP_String_FileNameStart *msg) -{ - struct MUI_StringData *data = (struct MUI_StringData*) INST_DATA(cl, obj); - STRPTR buf; - - //D(bug("String_FileNameStart %p\n", obj)); - - if (data->msd_useSecret) - { - buf = data->SecBuffer; - } - else - { - buf = data->Buffer; - } - // TODO: Implement String_FileNameStart correctly! - - return (IPTR)buf; -} - -BOOPSI_DISPATCHER(IPTR, String_Dispatcher, cl, obj, msg) -{ - switch (msg->MethodID) - { - case OM_NEW: return String__OM_NEW(cl, obj, (struct opSet *) msg); - case OM_DISPOSE: return String__OM_DISPOSE(cl, obj, msg); - case OM_SET: return String__OM_SET(cl, obj, (struct opSet *)msg); - case OM_GET: return String__OM_GET(cl, obj, (struct opGet *)msg); - - case MUIM_Setup: return String__MUIM_Setup(cl, obj, (APTR)msg); - case MUIM_Cleanup: return String__MUIM_Cleanup(cl, obj, (APTR)msg); - case MUIM_AskMinMax: return String__MUIM_AskMinMax(cl, obj, (APTR)msg); - case MUIM_Draw: return String__MUIM_Draw(cl, obj, (APTR)msg); - case MUIM_Export: return String__MUIM_Export(cl, obj, (APTR)msg); - case MUIM_Import: return String__MUIM_Import(cl, obj, (APTR)msg); - case MUIM_GoActive: return String__MUIM_GoActive(cl, obj, (APTR)msg); - case MUIM_GoInactive: return String__MUIM_GoInactive(cl,obj,(APTR)msg); - case MUIM_HandleEvent: return String__MUIM_HandleEvent(cl,obj,(APTR)msg); - case MUIM_String_ClearSelected: return String__MUIM_ClearSelected(cl,obj,(APTR)msg); /* BetterString */ - case MUIM_String_Insert: return String__MUIM_Insert(cl,obj,(APTR)msg); /* BetterString */ - case MUIM_String_FileNameStart: return String__MUIM_FileNameStart(cl,obj,(APTR)msg); /* BetterString */ - } - - return DoSuperMethodA(cl, obj, msg); -} -BOOPSI_DISPATCHER_END - - -/* - * Class descriptor. - */ -const struct __MUIBuiltinClass _MUI_String_desc = { - MUIC_String, - MUIC_Area, - sizeof(struct MUI_StringData), - (void*)String_Dispatcher -}; +/* + Copyright © 2003-2006, The AROS Development Team. All rights reserved. + $Id$ +*/ + +/* This is based on muimaster/class/text.c (first string version) + * and on rom/intuition/str*.c + */ + +#define MUIMASTER_YES_INLINE_STDARG + +#include <string.h> +#include <stdlib.h> +#include <stdio.h> +#include <ctype.h> + +#include <exec/types.h> +#include <clib/alib_protos.h> + +#include <proto/exec.h> +#include <proto/dos.h> +#include <proto/graphics.h> +#include <proto/intuition.h> +#include <proto/utility.h> +#include <proto/muimaster.h> +#include <proto/locale.h> + +#ifdef __AROS__ +#include <devices/rawkeycodes.h> +#endif + +#include "mui.h" +#include "muimaster_intern.h" +#include "support.h" +#include "prefs.h" +#include "penspec.h" +#include "imspec.h" +#include "clipboard.h" +#include "string.h" + +//#define MYDEBUG 1 +#include "debug.h" + +extern struct Library *MUIMasterBase; + +struct MUI_StringData +{ + ULONG msd_Flags; + CONST_STRPTR msd_Accept; /* MUIA_String_Accept */ + CONST_STRPTR msd_Reject; /* MUIA_String_Reject */ + LONG msd_Align; + struct Hook *msd_EditHook; + Object *msd_AttachedList; + LONG msd_RedrawReason; + + ULONG msd_useSecret; + /* Fields mostly ripped from rom/intuition/strgadgets.c */ + STRPTR Buffer; /* char container */ + ULONG BufferSize; /* memory allocated */ + STRPTR SecBuffer; /* Buffer for secret string */ + ULONG NumChars; /* string length */ + ULONG BufferPos; /* cursor (insert/delete) position */ + ULONG MarkPos; /* cursor text marking start pos */ + LONG DispPos; /* leftmost visible char */ + ULONG DispCount; /* number of visible chars */ + + ULONG OldClick_Sec; + ULONG OldClick_Micro; + ULONG NewClick_Sec; + ULONG NewClick_Micro; + WORD MultiClick; + + WORD Columns; + + struct MUI_EventHandlerNode ehn; + struct MUI_PenSpec_intern inactive_text; + struct MUI_PenSpec_intern active_text; + struct MUI_PenSpec_intern marked_text; + struct MUI_PenSpec_intern marked_bg; + struct MUI_PenSpec_intern cursor; + + BOOL is_active; +}; + +#define MSDF_ADVANCEONCR (1<<0) +#define MSDF_LONELYEDITHOOK (1<<1) +#define MSDF_MARKING (1<<2) +#define MSDF_KEYMARKING (1<<3) +#define MSDF_NOINPUT (1<<4) +#define MSDF_STAYACTIVE (1<<5) + +enum +{ + NO_REASON = 0, + WENT_ACTIVE = 1, + WENT_INACTIVE, + DO_CURSOR_LEFT = 3, + DO_CURSOR_RIGHT, + DO_DELETE = 5, + DO_BACKSPACE, + DO_ADDCHAR = 7, + NEW_CONTENTS, + MOVE_CURSOR, + DO_UNKNOWN, +}; + + +/************************************************************************** + Buffer_SetNewContents + Allocate memory for buffer +**************************************************************************/ +static BOOL Buffer_Alloc(struct MUI_StringData *data) +{ + data->Buffer = + (STRPTR) AllocVec(data->BufferSize * sizeof(char), MEMF_ANY); + if (NULL == data->Buffer) + { + bug("MUIC_String: Can't allocate %ld bytes for buffer1\n", + data->BufferSize * sizeof(char)); + return FALSE; + } + if (data->msd_useSecret) + { + data->SecBuffer = + (STRPTR) AllocVec(data->BufferSize * sizeof(char), MEMF_ANY); + if (NULL == data->SecBuffer) + { + bug("MUIC_String: Can't allocate %ld bytes for buffer2\n", + data->BufferSize * sizeof(char)); + FreeVec(data->Buffer); + data->Buffer = NULL; + return FALSE; + } + } + return TRUE; +} + +/************************************************************************** + Buffer_SetNewContents + Initialize buffer with a string, replace former content if any +**************************************************************************/ +static BOOL Buffer_SetNewContents(struct MUI_StringData *data, + CONST_STRPTR str) +{ + if (NULL == data->Buffer) + return FALSE; + + if (NULL == str) + { + data->Buffer[0] = 0; + if (data->msd_useSecret) + data->SecBuffer[0] = 0; + data->NumChars = 0; + } + else + { + data->NumChars = strlen(str); + if (data->NumChars >= data->BufferSize) + data->NumChars = data->BufferSize - 1; + + if (data->msd_useSecret) + { + strncpy(data->SecBuffer, str, data->BufferSize); + data->SecBuffer[data->BufferSize - 1] = 0; + int i; + for (i = 0; i < data->NumChars; i++) + data->Buffer[i] = 0x78; + data->Buffer[data->NumChars] = 0; + } + else + { + strncpy(data->Buffer, str, data->BufferSize); + data->Buffer[data->BufferSize - 1] = 0; + } + + } + + // avoid to BufferPos jumps to end of string if characters are inserted + // in string + if (data->BufferPos > data->NumChars) + data->BufferPos = data->NumChars; + data->DispPos = 0; + return TRUE; +} + +/************************************************************************** + Buffer_AddChar + Add a char on cursor position +**************************************************************************/ +static BOOL Buffer_AddChar(struct MUI_StringData *data, unsigned char code) +{ + STRPTR dst; + + if (data->Buffer == NULL) + return FALSE; + + if (data->NumChars + 1 >= data->BufferSize) + return FALSE; + + if (data->msd_useSecret) + { + dst = &data->SecBuffer[data->BufferPos + 1]; + + memmove(dst, &data->SecBuffer[data->BufferPos], + data->NumChars - data->BufferPos); + + data->Buffer[data->NumChars] = 0x78; + data->Buffer[data->NumChars + 1] = 0; + } + else + { + dst = &data->Buffer[data->BufferPos + 1]; + + memmove(dst, &data->Buffer[data->BufferPos], + data->NumChars - data->BufferPos); + + } + + dst[data->NumChars - data->BufferPos] = 0; + dst[-1] = code; + + data->BufferPos++; + data->NumChars++; + return TRUE; +} + +static WORD Buffer_GetWordStartIndex(struct MUI_StringData *data, + WORD startindex) +{ + WORD index = startindex; + + while (index > 0) + { + if (data->Buffer[index - 1] == ' ') + { + break; + } + index--; + } + + return index; +} + +static WORD Buffer_GetWordEndIndex(struct MUI_StringData *data, + WORD startindex) +{ + WORD index = startindex; + + while (index < data->NumChars) + { + if (data->Buffer[index] == ' ') + { + break; + } + index++; + } + + return index; +} + +static WORD Buffer_GetPrevWordIndex(struct MUI_StringData *data, + WORD startindex) +{ + WORD index = startindex; + + while (index > 0) + { + index--; + + if ((index == 0) || + ((data->Buffer[index - 1] == ' ') && + (data->Buffer[index] != ' '))) + { + break; + } + + } + + return index; +} + +static WORD Buffer_GetSuccWordIndex(struct MUI_StringData *data, + WORD startindex) +{ + WORD index = startindex; + + while (index < data->NumChars) + { + index++; + + if ((index == data->NumChars) || + ((data->Buffer[index - 1] == ' ') && + (data->Buffer[index] != ' '))) + { + break; + } + } + + return index; +} + +static BOOL Buffer_GetMarkedRange(struct MUI_StringData *data, WORD *start, + WORD *stop) +{ + WORD markstart = data->MarkPos; + WORD markstop = data->BufferPos; + + markstart = MIN(markstart, data->NumChars); + markstart = MAX(markstart, 0); + + markstop = MIN(markstop, data->NumChars); + markstop = MAX(markstop, 0); + + if (markstart > markstop) + { + markstart ^= markstop; + markstop ^= markstart; + markstart ^= markstop; + } + + switch (data->MultiClick) + { + case 0: + /* char select */ + break; + + case 1: + /* word select */ + markstart = Buffer_GetWordStartIndex(data, markstart); + markstop = Buffer_GetWordEndIndex(data, markstop); + break; + + default: + /* select all */ + markstart = 0; + markstop = data->NumChars; + break; + + } + + if (markstart == markstop) + return FALSE; + + if (start) + *start = markstart; + if (stop) + *stop = markstop; + + //kprintf("Buffer_GetMarkedRange: returning %d .. %d\n", + // markstart, markstop); + + return TRUE; +} + +static BOOL Buffer_AnythingMarked(struct MUI_StringData *data) +{ + if (!(data->msd_Flags & MSDF_MARKING)) + return FALSE; + + return Buffer_GetMarkedRange(data, NULL, NULL); +} + +static BOOL Buffer_KillMarked(struct MUI_StringData *data) +{ + WORD markstart = data->MarkPos; + WORD markstop = data->BufferPos; + WORD marklen; + + //kprintf("\nBuffer_KillMarked 1 markpos %d bufferpos %d numchars %d\n", + // markstart, markstop, data->NumChars); + + if (!(data->msd_Flags & MSDF_MARKING)) + return FALSE; + + data->msd_Flags &= ~MSDF_MARKING; + + if (!Buffer_GetMarkedRange(data, &markstart, &markstop)) + return FALSE; + + //kprintf("Buffer_KillMarked 2 markstart %d markstop %d\n", + // markstart, markstop); + + if (markstart > markstop) + { + markstart ^= markstop; + markstop ^= markstart; + markstart ^= markstop; + } + + marklen = markstop - markstart; + + //kprintf("Buffer_KillMarked: markstart %d markstop %d\n", + // markstart, markstop); + + memmove(&data->Buffer[markstart], + &data->Buffer[markstart + marklen], + data->NumChars - markstart - marklen + 1); + + data->NumChars -= marklen; + data->BufferPos = markstart; + + return TRUE; +} + +/************************************************************************** + OM_NEW +**************************************************************************/ +IPTR String__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) +{ + struct MUI_StringData *data; + struct TagItem *tags, *tag; + CONST_STRPTR str = NULL; + char integerbuf[20]; + + obj = (Object *) DoSuperNewTags(cl, obj, NULL, + /* MUIA_FillArea, TRUE, */ + TAG_MORE, (IPTR) msg->ops_AttrList); + if (!obj) + return FALSE; + + data = INST_DATA(cl, obj); + data->msd_useSecret = FALSE; + data->msd_Align = MUIV_String_Format_Left; + data->BufferSize = 80; + data->Columns = -1; + + Buffer_SetNewContents(data, ""); /* <-- isnt this pointless? */ + + /* parse initial taglist */ + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) + { + switch (tag->ti_Tag) + { + case MUIA_String_Accept: + data->msd_Accept = (CONST_STRPTR) tag->ti_Data; + break; + + case MUIA_String_Reject: + data->msd_Reject = (CONST_STRPTR) tag->ti_Data; + break; + + case MUIA_String_AdvanceOnCR: + _handle_bool_tag(data->msd_Flags, tag->ti_Data, + MSDF_ADVANCEONCR); + break; + + case MUIA_String_AttachedList: + data->msd_AttachedList = (Object *) tag->ti_Data; + break; + + case MUIA_String_Secret: + data->msd_useSecret = (BOOL) tag->ti_Data; + break; + + case MUIA_String_Contents: + str = (CONST_STRPTR) tag->ti_Data; + break; + + case MUIA_String_EditHook: + data->msd_EditHook = (struct Hook *)tag->ti_Data; + break; + + case MUIA_String_Format: + data->msd_Align = (LONG) tag->ti_Data; + break; + + case MUIA_String_Integer: + snprintf(integerbuf, 19, "%ld", tag->ti_Data); + str = integerbuf; + break; + + case MUIA_String_LonelyEditHook: + _handle_bool_tag(data->msd_Flags, tag->ti_Data, + MSDF_LONELYEDITHOOK); + break; + + case MUIA_String_MaxLen: + data->BufferSize = tag->ti_Data; + if (data->BufferSize < 1) + data->BufferSize = 1; + break; + + case MUIA_String_Columns: /* BetterString */ + data->Columns = (WORD) tag->ti_Data; + break; + + case MUIA_String_NoInput: /* BetterString */ + _handle_bool_tag(data->msd_Flags, tag->ti_Data, MSDF_NOINPUT); + break; + + case MUIA_String_StayActive: /* BetterString */ + _handle_bool_tag(data->msd_Flags, tag->ti_Data, + MSDF_STAYACTIVE); + break; + + } + } + + if (Buffer_Alloc(data)) + { + Buffer_SetNewContents(data, str); + } + + if (NULL == data->Buffer) + { + CoerceMethod(cl, obj, OM_DISPOSE); + return 0; + } + + D(bug("String_New(%p)\n", obj)); + + data->ehn.ehn_Events = IDCMP_MOUSEBUTTONS; + data->ehn.ehn_Priority = 0; + data->ehn.ehn_Flags = 0; + data->ehn.ehn_Object = obj; + data->ehn.ehn_Class = cl; + + CurrentTime(&data->OldClick_Sec, &data->OldClick_Micro); + + return (IPTR) obj; +} + +/************************************************************************** + OM_DISPOSE +**************************************************************************/ +IPTR String__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) +{ + struct MUI_StringData *data = INST_DATA(cl, obj); + + FreeVec(data->Buffer); + FreeVec(data->SecBuffer); + + D(bug("String_Dispose %p\n", obj)); + + return DoSuperMethodA(cl, obj, msg); +} + +/************************************************************************** + OM_SET +**************************************************************************/ +IPTR String__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) +{ + struct MUI_StringData *data = INST_DATA(cl, obj); + struct TagItem *tags = msg->ops_AttrList; + struct TagItem *tag; + + while ((tag = NextTagItem(&tags)) != NULL) + { + switch (tag->ti_Tag) + { + case MUIA_String_Contents: + Buffer_SetNewContents(data, (STRPTR) tag->ti_Data); + data->msd_RedrawReason = NEW_CONTENTS; + data->msd_Flags &= ~(MSDF_MARKING | MSDF_KEYMARKING); + MUI_Redraw(obj, MADF_DRAWOBJECT); + break; + + case MUIA_String_Accept: + data->msd_Accept = (CONST_STRPTR) tag->ti_Data; + break; + + case MUIA_String_Reject: + data->msd_Reject = (CONST_STRPTR) tag->ti_Data; + break; + + case MUIA_String_AttachedList: + data->msd_AttachedList = (Object *) tag->ti_Data; + break; + + case MUIA_String_Integer: + { + char buf[20]; + + snprintf(buf, 19, "%ld", tag->ti_Data); + set(obj, MUIA_String_Contents, buf); + } + break; + + case MUIA_String_AdvanceOnCR: + _handle_bool_tag(data->msd_Flags, tag->ti_Data, + MSDF_ADVANCEONCR); + break; + + case MUIA_String_BufferPos: + data->BufferPos = (ULONG) tag->ti_Data; + data->msd_Flags &= ~MSDF_MARKING; + data->msd_RedrawReason = MOVE_CURSOR; + MUI_Redraw(obj, MADF_DRAWUPDATE); + break; + + case MUIA_String_DisplayPos: + data->BufferPos = (ULONG) tag->ti_Data; + data->DispPos = data->BufferPos; // move both pos + data->msd_Flags &= ~MSDF_MARKING; + data->msd_RedrawReason = MOVE_CURSOR; + MUI_Redraw(obj, MADF_DRAWUPDATE); + break; + + case MUIA_String_NoInput: /* BetterString */ + _handle_bool_tag(data->msd_Flags, tag->ti_Data, MSDF_NOINPUT); + break; + + case MUIA_String_StayActive: /* BetterString */ + _handle_bool_tag(data->msd_Flags, tag->ti_Data, + MSDF_STAYACTIVE); + break; + + case MUIA_String_SelectSize: /* BetterString */ + // TODO: Implement OM_SET(MUIA_String_SelectSize)! + break; + + } + } + + return DoSuperMethodA(cl, obj, (Msg) msg); +} + + +/************************************************************************** + OM_GET +**************************************************************************/ +IPTR String__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) +{ + struct MUI_StringData *data = INST_DATA(cl, obj); + +#define STORE *(msg->opg_Storage) + switch (msg->opg_AttrID) + { + case MUIA_String_Contents: + if (data->msd_useSecret) + STORE = (IPTR) data->SecBuffer; + else + STORE = (IPTR) data->Buffer; + return TRUE; + + case MUIA_String_Secret: + STORE = (IPTR) data->msd_useSecret; + return TRUE; + + case MUIA_String_Accept: + STORE = (IPTR) data->msd_Accept; + return TRUE; + + case MUIA_String_Reject: + STORE = (IPTR) data->msd_Reject; + return TRUE; + + case MUIA_String_AttachedList: + STORE = (IPTR) data->msd_AttachedList; + return TRUE; + + case MUIA_String_Integer: + { + STRPTR buf = NULL; + STORE = 0; + get(obj, MUIA_String_Contents, &buf); + if (NULL != buf) + { + LONG val = 0; + StrToLong(buf, &val); + STORE = val; + } + return TRUE; + } + + case MUIA_String_MaxLen: + STORE = (IPTR) data->BufferSize; + return TRUE; + + case MUIA_String_AdvanceOnCR: + STORE = (data->msd_Flags & MSDF_ADVANCEONCR) ? TRUE : FALSE; + return TRUE; + + case MUIA_String_BufferPos: + STORE = data->BufferPos; + return TRUE; + + case MUIA_String_DisplayPos: + STORE = data->DispPos; + return TRUE; + + case MUIA_String_NoInput: /* BetterString */ + STORE = (data->msd_Flags & MSDF_NOINPUT) ? TRUE : FALSE; + return TRUE; + + case MUIA_String_StayActive: /* BetterString */ + STORE = (data->msd_Flags & MSDF_STAYACTIVE) ? TRUE : FALSE; + return TRUE; + + case MUIA_String_SelectSize: /* BetterString */ + if (data->msd_Flags & MSDF_MARKING) + { + WORD markstart, markstop; + + if (Buffer_GetMarkedRange(data, &markstart, &markstop)) + { + LONG size = markstop - markstart; + + if (data->MarkPos < data->BufferPos) + size = -size; + + STORE = (IPTR) size; + + return 1; + } + + } + + STORE = 0; + return TRUE; + + } + + return DoSuperMethodA(cl, obj, (Msg) msg); +#undef STORE +} + +/************************************************************************** + MUIM_Setup +**************************************************************************/ +IPTR String__MUIM_Setup(struct IClass *cl, Object *obj, + struct MUIP_Setup *msg) +{ + struct MUI_StringData *data = INST_DATA(cl, obj); + + if (0 == DoSuperMethodA(cl, obj, (Msg) msg)) + return FALSE; + + data->is_active = FALSE; + set(obj, MUIA_Background, + (IPTR) muiGlobalInfo(obj)->mgi_Prefs->string_bg_inactive); + + zune_pen_spec_to_intern( + (const struct MUI_PenSpec *)muiGlobalInfo(obj)->mgi_Prefs-> + string_text_inactive, &data->inactive_text); + zune_penspec_setup(&data->inactive_text, muiRenderInfo(obj)); + + zune_pen_spec_to_intern( + (const struct MUI_PenSpec *)muiGlobalInfo(obj)->mgi_Prefs-> + string_text_active, &data->active_text); + zune_penspec_setup(&data->active_text, muiRenderInfo(obj)); + + zune_pen_spec_to_intern( + (const struct MUI_PenSpec *)muiGlobalInfo(obj)->mgi_Prefs-> + string_text_marked, &data->marked_text); + zune_penspec_setup(&data->marked_text, muiRenderInfo(obj)); + + zune_pen_spec_to_intern( + (const struct MUI_PenSpec *)muiGlobalInfo(obj)->mgi_Prefs-> + string_bg_marked, &data->marked_bg); + zune_penspec_setup(&data->marked_bg, muiRenderInfo(obj)); + + zune_pen_spec_to_intern( + (const struct MUI_PenSpec *)muiGlobalInfo(obj)->mgi_Prefs-> + string_cursor, &data->cursor); + zune_penspec_setup(&data->cursor, muiRenderInfo(obj)); + + DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR) & data->ehn); + return TRUE; +} + +/************************************************************************** + MUIM_Cleanup +**************************************************************************/ +IPTR String__MUIM_Cleanup(struct IClass *cl, Object *obj, + struct MUIP_Cleanup *msg) +{ + struct MUI_StringData *data = INST_DATA(cl, obj); + + D(bug("String_Cleanup %p\n", obj)); + DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR) & data->ehn); + + zune_penspec_cleanup(&data->inactive_text); + zune_penspec_cleanup(&data->active_text); + zune_penspec_cleanup(&data->marked_text); + zune_penspec_cleanup(&data->marked_bg); + zune_penspec_cleanup(&data->cursor); + + return (DoSuperMethodA(cl, obj, (Msg) msg)); +} + +/************************************************************************** + MUIM_AskMinMax +**************************************************************************/ +IPTR String__MUIM_AskMinMax(struct IClass *cl, Object *obj, + struct MUIP_AskMinMax *msg) +{ + struct MUI_StringData *data = INST_DATA(cl, obj); + + DoSuperMethodA(cl, obj, (Msg) msg); + + if (data->Columns >= 0) + { + msg->MinMaxInfo->MinWidth += _font(obj)->tf_XSize * data->Columns; + msg->MinMaxInfo->DefWidth += _font(obj)->tf_XSize * data->Columns; + msg->MinMaxInfo->MaxWidth += _font(obj)->tf_XSize * data->Columns; + } + else + { + msg->MinMaxInfo->MinWidth += _font(obj)->tf_XSize * 4; + msg->MinMaxInfo->DefWidth += _font(obj)->tf_XSize * 12; + msg->MinMaxInfo->MaxWidth = MUI_MAXMAX; + } + + msg->MinMaxInfo->MinHeight += _font(obj)->tf_YSize; + msg->MinMaxInfo->DefHeight += _font(obj)->tf_YSize; + msg->MinMaxInfo->MaxHeight += _font(obj)->tf_YSize; + +/* D(bug("String_AskMinMax(%p): Min=%ldx%ld Max=%ldx%ld Def=%ldx%ld\n", */ +/* obj, msg->MinMaxInfo->MinWidth, msg->MinMaxInfo->MinHeight, */ +/* msg->MinMaxInfo->MaxWidth, msg->MinMaxInfo->MaxHeight, */ +/* msg->MinMaxInfo->DefWidth, msg->MinMaxInfo->DefHeight)); */ + + return TRUE; +} + + +static WORD MaxDispPos(struct IClass *cl, Object *obj) +{ + struct MUI_StringData *data = INST_DATA(cl, obj); + WORD numfit, max_disppos, numchars; + struct TextExtent te; + BOOL cursor_at_end; + + cursor_at_end = (data->BufferPos == data->NumChars); + +/* D(bug("MaxDispPos(current length: %d, bufferpos=%d)\n", */ +/* data->NumChars, data->BufferPos)); */ + +/* D(bug("cursor_at_end: %d\n", cursor_at_end)); */ + + if (cursor_at_end) /* Cursor at end of string ? */ + { +/* D(bug("Making cursor last char\n")); */ + numchars = data->NumChars + 1; /* Take cursor into account */ + +/* This has already been done by UpdateDisp() which called us + strinfo->Buffer[strinfo->NumChars] = 0x20; + +*/ + } + else + { + numchars = data->NumChars; + } + + /* Find the amount of characters that fit into the bbox, counting + ** from the last character in the buffer and forward, + */ + numfit = TextFit(_rp(obj), + &(data->Buffer[numchars - 1]), + numchars, &te, NULL, -1, _mwidth(obj), _mheight(obj)); + + max_disppos = numchars - numfit; + +/* if ((max_disppos > 0) && (!cursor_at_end)) + max_disppos --; + */ + +/* D(bug("Numchars w/cursor: %d, Numfit: %d, maxdisppos=%d " */ +/* "bbox->Width = %d te->te_Width = %d\n", */ +/* numchars, numfit, max_disppos, _mwidth(obj), te.te_Width)); */ + + return max_disppos; +} + + +static void UpdateDisp(struct IClass *cl, Object *obj) +{ + struct MUI_StringData *data = INST_DATA(cl, obj); + struct TextExtent te; + STRPTR dispstr; + + /* If the cursor is at the trailing \0, insert a SPACE instead */ + if (data->BufferPos == data->NumChars) + data->Buffer[data->NumChars] = 0x20; + + /* In this function we check if the cursor has gone outside + ** of the visible area (because of application setting + ** strinfo->BufferPos or strinfo->DispPos to a different value, or + ** because of user input). + ** This is made a bit difficult by the rule (R), that there + ** should NOT be available space on the right, and characters + ** scrolled out at the left, at the same time. + ** We have 3 possible scenarios: + ** 1) Cursor to the left of DispPos: + ** Set DispPos to the lowest of BufferPos and the + ** maximum allowed disppos (according to (R) ). + ** 2) Cursor to the right of visible area: + ** Set dispose sou that the cursor is the last visible character. + ** This afheres to (R). + ** 3) Cursor inside visible area. Do a check on rule (R), + ** and if DispPos > max allowed, then adjust it down, + ** so that the last character in the buffer becomes last character + ** displayed. (The cursor will still be visible after adjustion) + */ + + /* 1) Cursor to the left of visible area */ + if (data->BufferPos < data->DispPos) + { + WORD max_disppos; + + max_disppos = MaxDispPos(cl, obj); + data->DispPos = MIN(data->BufferPos, max_disppos); + } + else /* Cursor equal to the right of disppos [ 2) or 3) ] */ + { + UWORD strsize; + + /* How many pixels are there from current 1st displayed to cursor? */ + strsize = TextLength(_rp(obj), + data->Buffer + data->DispPos, + data->BufferPos - data->DispPos + 1); + + /* 2) More than fits into the gadget ? */ + if (strsize > _mwidth(obj)) + { + /* Compute new DispPos such that the cursor is at the right */ + data->DispPos = data->BufferPos + - TextFit(_rp(obj), + &(data->Buffer[data->BufferPos]), + data->NumChars, &te, NULL, -1, + _mwidth(obj), _mheight(obj)) + 1; + +/* D(bug("cursor right of visible area, new disppos: %d\n", */ +/* data->DispPos)); */ + } + else /* 3). Cursor inside gadget */ + { + WORD max_disppos; + + max_disppos = MaxDispPos(cl, obj); + if (data->DispPos > max_disppos) + data->DispPos = max_disppos; + + } /* if (cursor inside or to the right of visible area ) */ + + } + + /* Update the DispCount */ + /* It might be necessary with special handling for centre aligned gads */ + dispstr = &(data->Buffer[data->DispPos]); +/* D(bug("DispCount before = %d\n", data->DispCount)); */ + data->DispCount = TextFit(_rp(obj), dispstr, + data->NumChars - data->DispPos, + &te, NULL, 1, _mwidth(obj), _mheight(obj)); +/* D(bug("DispCount after = %d\n", data->DispCount)); */ + + /* 0-terminate string */ + data->Buffer[data->NumChars] = 0x00; +} + + +/* Gets left position of text in the string gadget */ +static UWORD GetTextLeft(struct IClass *cl, Object *obj) +{ + struct MUI_StringData *data = INST_DATA(cl, obj); + UWORD text_left = 0; + STRPTR dispstr = &(data->Buffer[data->DispPos]); + UWORD dispstrlen; + BOOL cursor_at_end; + + cursor_at_end = (data->BufferPos == data->NumChars); + dispstrlen = MIN(data->DispCount, data->NumChars - data->DispPos); + + switch (data->msd_Align) + { + case MUIV_String_Format_Left: + text_left = _mleft(obj); + break; + + case MUIV_String_Format_Center: + { + WORD textwidth = TextLength(_rp(obj), dispstr, dispstrlen); + if (cursor_at_end) + textwidth += TextLength(_rp(obj), " ", 1); + text_left = _mleft(obj) + ((_mwidth(obj) - textwidth) / 2); +/* D(bug("GetTextLeft: dispstr=%s, dispstrlen=%d, textw=%d, " */ +/* "textl=%d\n", */ +/* dispstr, dispstrlen, textwidth, text_left)); */ + } + break; + + case MUIV_String_Format_Right: + { + WORD textwidth = TextLength(_rp(obj), dispstr, dispstrlen); + + if (cursor_at_end) + textwidth += TextLength(_rp(obj), " ", 1); + text_left = _mleft(obj) + (_mwidth(obj) - 1 - textwidth); + } + break; + } + return (text_left); +} + +/* Gets right offset of text in the string gadget */ +static UWORD GetTextRight(struct IClass *cl, Object *obj) +{ + struct MUI_StringData *data = INST_DATA(cl, obj); + UWORD text_right = 0; + STRPTR dispstr = &(data->Buffer[data->DispPos]); + UWORD dispstrlen; + BOOL cursor_at_end; + + cursor_at_end = (data->BufferPos == data->NumChars); + dispstrlen = MIN(data->DispCount, data->NumChars - data->DispPos); + + switch (data->msd_Align) + { + case MUIV_String_Format_Left: + text_right = + _mleft(obj) + TextLength(_rp(obj), dispstr, dispstrlen); + break; + + case MUIV_String_Format_Center: + { + WORD textwidth = TextLength(_rp(obj), dispstr, dispstrlen); + + if (cursor_at_end) + textwidth += TextLength(_rp(obj), " ", 1); + text_right = _mright(obj) - ((_mwidth(obj) - textwidth) / 2); + } + break; + + case MUIV_String_Format_Right: + text_right = _mright(obj); + break; + } + return (text_right); +} + + +/* Updates the stringdata in case user has set some fields */ +static VOID UpdateStringData(struct IClass *cl, Object *obj) +{ + struct MUI_StringData *data = INST_DATA(cl, obj); + + data->NumChars = strlen(data->Buffer); + + if (data->BufferPos > data->NumChars) + { + data->BufferPos = data->NumChars; + } +} + +static VOID TextM(Object *obj, struct MUI_StringData *data, + STRPTR text, WORD textlen, WORD markstart, WORD markend) +{ + struct RastPort *rp = _rp(obj); + ULONG textpen; + WORD len; + + if (data->is_active) + textpen = data->active_text.p_pen; + else + textpen = data->inactive_text.p_pen; + + //kprintf("TextM: textlen %d markstart %d markend %d ... \n", + // textlen, markstart, markend); + + /* <unmarked><marked><unmarked> */ + + /* <unmarked> */ + + len = MIN(markstart, textlen); + len = MAX(len, 0); + + if (len) + { + //kprintf("A: %d ", len); + + SetABPenDrMd(rp, textpen, _pens(obj)[MPEN_BACKGROUND], JAM1); + Text(rp, text, len); + + text += len; + textlen -= len; + + } + + len = MIN(markend - len, textlen); + len = MAX(len, 0); + + if (len) + { + //kprintf("B: %d ", len); + SetABPenDrMd(_rp(obj), data->marked_text.p_pen, + data->marked_bg.p_pen, JAM2); + Text(rp, text, len); + + text += len; + textlen -= len; + } + + if (textlen) + { + //kprintf("C: %d ", textlen); + + SetABPenDrMd(rp, textpen, _pens(obj)[MPEN_BACKGROUND], JAM1); + Text(rp, text, textlen); + } + //kprintf("\n"); +} + +/************************************************************************** + MUIM_Draw +**************************************************************************/ +IPTR String__MUIM_Draw(struct IClass *cl, Object *obj, + struct MUIP_Draw *msg) +{ + struct MUI_StringData *data = INST_DATA(cl, obj); + UWORD text_left; + UWORD text_top; + STRPTR dispstr; + UWORD dispstrlen; + ULONG textpen; + UWORD textleft_save; + WORD markstart = 0, markstop = 0; + + /* D(bug("\nString_Draw(%p) %ldx%ldx%ldx%ld reason=%ld msgflgs=%ld " */ +/* "curs=%d " */ +/* "displ=%ld len=%ld buf='%s'\n",obj,_mleft(obj),_mtop(obj), */ +/* _mwidth(obj),_mheight(obj), data->msd_RedrawReason, msg->flags, */ +/* data->BufferPos, data->DispPos, data->NumChars, data->Buffer)); */ + + DoSuperMethodA(cl, obj, (Msg) msg); + + if (!(msg->flags & MADF_DRAWUPDATE) && !(msg->flags & MADF_DRAWOBJECT)) + return 0; + + SetFont(_rp(obj), _font(obj)); + if (data->is_active) + textpen = data->active_text.p_pen; + else + textpen = data->inactive_text.p_pen; + + /* Update the stringdata in case of user change */ + UpdateStringData(cl, obj); + + /* Update the DispPos and DispCount fields so that the gadget renders + * properly */ + UpdateDisp(cl, obj); + + text_top = _mtop(obj) + + ((_mheight(obj) - _rp(obj)->Font->tf_YSize) >> 1) + + _rp(obj)->Font->tf_Baseline; + + dispstr = data->Buffer + data->DispPos; + dispstrlen = MIN(data->DispCount, data->NumChars - data->DispPos); + textleft_save = text_left = GetTextLeft(cl, obj); + + // little flicker improvement, don't redraw first part of string + // when adding a char + if (msg->flags & MADF_DRAWUPDATE && + data->msd_RedrawReason == DO_ADDCHAR && + data->msd_Align == MUIV_String_Format_Left && data->DispPos == 0) + { + text_left += TextLength(_rp(obj), dispstr, data->BufferPos - 1); + dispstr += data->BufferPos - 1; + dispstrlen -= data->BufferPos - 1; + DoMethod(obj, MUIM_DrawBackground, text_left, _mtop(obj), + _mwidth(obj) - text_left + _mleft(obj), _mheight(obj), + text_left, _mtop(obj), 0); + } + else if (msg->flags & MADF_DRAWUPDATE) + { + DoMethod(obj, MUIM_DrawBackground, _mleft(obj), _mtop(obj), + _mwidth(obj), _mheight(obj), _mleft(obj), _mtop(obj), 0); + } + + SetABPenDrMd(_rp(obj), textpen, _pens(obj)[MPEN_BACKGROUND], JAM1); + Move(_rp(obj), text_left, text_top); + + if ((data->msd_Flags & MSDF_MARKING) + && Buffer_GetMarkedRange(data, &markstart, &markstop)) + { + TextM(obj, data, dispstr, dispstrlen, markstart - data->DispPos, + markstop - data->DispPos); + + } + else + { + Text(_rp(obj), dispstr, dispstrlen); + + if (data->is_active) // active, draw cursor + { + UWORD cursoroffset = data->BufferPos - data->DispPos; + + dispstr = data->Buffer + data->DispPos; + text_left = textleft_save; + + SetABPenDrMd(_rp(obj), data->active_text.p_pen, + data->cursor.p_pen, JAM2); + text_left += TextLength(_rp(obj), dispstr, cursoroffset); + + + Move(_rp(obj), text_left, text_top); + Text(_rp(obj), + ((data->BufferPos < data->NumChars) + ? dispstr + cursoroffset : (STRPTR) " "), 1); + } + } + + data->msd_RedrawReason = NO_REASON; + return TRUE; +} + +/************************************************************************** + Returns whether object needs redrawing +**************************************************************************/ +static int String_HandleVanillakey(struct IClass *cl, Object *obj, + unsigned char code, UWORD qual) +{ + struct MUI_StringData *data = + (struct MUI_StringData *)INST_DATA(cl, obj); + BOOL doinput; + + D(bug("String_HandleVanillakey: code=%d qual=%d\n", code, qual)); + + if (0 == code) + return 0; + + doinput = (data->msd_Flags & MSDF_NOINPUT) ? FALSE : TRUE; + + if (doinput && (code == '\b')) /* backspace */ + { + if (Buffer_KillMarked(data)) + { + return 1; + } + + if (data->BufferPos > 0) + { + LONG shift; + + if ((qual & IEQUALIFIER_LSHIFT) || (qual & IEQUALIFIER_RSHIFT)) + { + shift = data->BufferPos; + data->msd_RedrawReason = NEW_CONTENTS; + } + else + { + shift = 1; + data->msd_RedrawReason = DO_BACKSPACE; + } + + strcpy(&data->Buffer[data->BufferPos - shift], + &data->Buffer[data->BufferPos]); + data->BufferPos -= shift; + data->NumChars -= shift; + return 1; + } + return 0; + } + + if (doinput && (code == 21)) // ctrl-u == NAK (like shift-bs) + { + if (Buffer_KillMarked(data)) + { + return 1; + } + + if (data->BufferPos > 0) + { + strcpy(&data->Buffer[0], &data->Buffer[data->BufferPos]); + data->NumChars -= data->BufferPos; + data->BufferPos = 0; + data->msd_RedrawReason = NEW_CONTENTS; + return 1; + } + return 0; + } + + if (doinput && (code == 127)) /* del */ + { + if (!Buffer_KillMarked(data)) + { + if ((qual & IEQUALIFIER_LSHIFT) || (qual & IEQUALIFIER_RSHIFT)) + { + data->Buffer[data->BufferPos] = 0; + data->NumChars = data->BufferPos; + data->msd_RedrawReason = NEW_CONTENTS; + } + else + { + if (data->BufferPos < data->NumChars) + { + strcpy(&data->Buffer[data->BufferPos], + &data->Buffer[data->BufferPos + 1]); + data->NumChars--; + } + + data->msd_RedrawReason = DO_DELETE; + } + } + return 1; + } + + if (doinput && (code == 11)) // ctrl-k == VT == \v (like shift-del) + { + if (!Buffer_KillMarked(data)) + { + data->Buffer[data->BufferPos] = 0; + data->NumChars = data->BufferPos; + data->msd_RedrawReason = NEW_CONTENTS; + } + return 1; + } + + if (doinput && (code == 24)) /* ctrl x == ascii cancel */ + { + if (!Buffer_KillMarked(data)) + { + data->Buffer[0] = 0; + data->BufferPos = 0; + data->NumChars = 0; + data->msd_RedrawReason = NEW_CONTENTS; + } + return 1; + } + + if (code == 1) // ctrl-a, linestart + { + data->BufferPos = 0; + data->msd_Flags &= ~(MSDF_MARKING | MSDF_KEYMARKING); + return 1; + } + + if (code == 26) // ctrl-z, lineend + { + data->BufferPos = data->NumChars; + data->msd_Flags &= ~(MSDF_MARKING | MSDF_KEYMARKING); + return 1; + } + + if (((ToLower(code) == 'c') || (ToLower(code) == 'x')) && + (qual & IEQUALIFIER_RCOMMAND)) + { + WORD markstart, markstop; + + if ((data->msd_Flags & MSDF_MARKING) + && Buffer_GetMarkedRange(data, &markstart, &markstop)) + { + clipboard_write_text(&data->Buffer[markstart], + markstop - markstart); + + if (doinput && (ToLower(code) == 'x')) + { + Buffer_KillMarked(data); + } + else + { + data->BufferPos = markstop; + data->msd_Flags &= ~MSDF_MARKING; + } + return 1; + } + return 0; + } + + if (doinput && (ToLower(code) == 'v') && (qual & IEQUALIFIER_RCOMMAND)) + { + STRPTR text; + int retval; + struct Locale *locale = OpenLocale(NULL); + + retval = Buffer_KillMarked(data); + if ((text = clipboard_read_text())) + { + STRPTR text2 = text; + UBYTE c; + + while ((c = *text2++)) + { + if (!IsPrint(locale, c)) + break; + if (!(Buffer_AddChar(data, c))) + break; + if (!retval) + retval = 1; + } + + clipboard_free_text(text); + } + + CloseLocale(locale); + + return retval; + } + + if (data->msd_Accept != NULL) + { + /* Check if character is accepted */ + if (NULL == strchr(data->msd_Accept, code)) + return 0; + } + + if (data->msd_Reject != NULL) + { + /* Check if character is rejected */ + if (NULL != strchr(data->msd_Reject, code)) + { + DisplayBeep(NULL); + return 0; + } + } + + if (doinput) + { + struct Locale *locale = OpenLocale(NULL); + + if (!(code >= 0x09 && code <= 0x0D) && IsPrint(locale, code)) + { + Buffer_KillMarked(data); + if (Buffer_AddChar(data, code)) + { + data->msd_RedrawReason = DO_ADDCHAR; + return 2; + } + } + + CloseLocale(locale); + } + + data->msd_RedrawReason = DO_UNKNOWN; + return 0; +} + + +/************************************************************************** + MUIM_HandleEvent +**************************************************************************/ +IPTR String__MUIM_HandleEvent(struct IClass *cl, Object *obj, + struct MUIP_HandleEvent *msg) +{ + struct MUI_StringData *data = + (struct MUI_StringData *)INST_DATA(cl, obj); + ULONG retval = 0; + int update = 0; + BOOL edited = FALSE; + LONG muikey = msg->muikey; + BOOL cursor_kills_marking = FALSE; + + if ((data->msd_Flags & MSDF_MARKING) + && !(data->msd_Flags & MSDF_KEYMARKING)) + { + cursor_kills_marking = TRUE; + } + + if (muikey == MUIKEY_NONE) + { + if (msg->imsg->Class == IDCMP_RAWKEY) + { + static LONG muikeytable[3][2] = { + {MUIKEY_LEFT, MUIKEY_RIGHT}, + {MUIKEY_WORDLEFT, MUIKEY_WORDRIGHT}, + {MUIKEY_LINESTART, MUIKEY_LINEEND} + }; + WORD dirindex = -1, amountindex = 0; + + switch (msg->imsg->Code) + { + case 0x4F: + dirindex = 0; + break; + + case 0x4E: + dirindex = 1; + break; + +#ifdef __AROS__ + case RAWKEY_HOME: + muikey = MUIKEY_LINESTART; + break; + + case RAWKEY_END: + muikey = MUIKEY_LINEEND; + break; +#endif + + } + + if ((dirindex != -1) && (muikey == MUIKEY_NONE)) + { + if (msg->imsg-> + Qualifier & (IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT)) + { + amountindex = 2; + } + else if (msg->imsg->Qualifier & IEQUALIFIER_CONTROL) + { + amountindex = 1; + } + + muikey = muikeytable[amountindex][dirindex]; + } + + } + } + + D(bug("String_HandleEvent: muikey %d, imsg %p is_active=%d\n", muikey, + msg->imsg, data->is_active)); + if (muikey != MUIKEY_NONE && data->is_active) + { + retval = MUI_EventHandlerRC_Eat; + + switch (muikey) + { + case MUIKEY_LEFT: + if (cursor_kills_marking) + { + update = 1; + data->BufferPos = MIN(data->BufferPos, data->MarkPos); + if (data->BufferPos > 0) + data->BufferPos--; + + data->msd_Flags &= ~MSDF_MARKING; + } + else if (data->BufferPos > 0) + { + update = 1; + + data->BufferPos--; + data->msd_RedrawReason = DO_CURSOR_LEFT; + } + break; + case MUIKEY_RIGHT: + if (cursor_kills_marking) + { + update = 1; + data->BufferPos = MAX(data->BufferPos, data->MarkPos); + data->msd_Flags &= ~MSDF_MARKING; + } + else if (data->BufferPos < data->NumChars) + { + update = 1; + data->BufferPos++; + data->msd_RedrawReason = DO_CURSOR_RIGHT; + } + break; + case MUIKEY_WORDLEFT: + if (data->BufferPos > 0) + { + data->BufferPos = + Buffer_GetPrevWordIndex(data, data->BufferPos); + update = 1; + data->msd_RedrawReason = DO_CURSOR_LEFT; + } + if (cursor_kills_marking) + { + data->msd_Flags &= ~MSDF_MARKING; + update = 1; + } + break; + case MUIKEY_WORDRIGHT: + if (data->BufferPos < data->NumChars) + { + data->BufferPos = + Buffer_GetSuccWordIndex(data, data->BufferPos); + update = 1; + data->msd_RedrawReason = DO_CURSOR_RIGHT; + } + if (cursor_kills_marking) + { + data->msd_Flags &= ~MSDF_MARKING; + update = 1; + } + break; + case MUIKEY_LINESTART: + data->BufferPos = 0; + update = 1; + if (cursor_kills_marking) + { + data->msd_Flags &= ~MSDF_MARKING; + } + break; + + case MUIKEY_LINEEND: + data->BufferPos = data->NumChars; + update = 1; + if (cursor_kills_marking) + { + data->msd_Flags &= ~MSDF_MARKING; + } + break; + + case MUIKEY_UP: + if (data->msd_AttachedList) + set(data->msd_AttachedList, + MUIA_List_Active, MUIV_List_Active_Up); + break; + case MUIKEY_DOWN: + if (data->msd_AttachedList) + set(data->msd_AttachedList, + MUIA_List_Active, MUIV_List_Active_Down); + break; + case MUIKEY_PAGEUP: + if (data->msd_AttachedList) + set(data->msd_AttachedList, + MUIA_List_Active, MUIV_List_Active_PageUp); + break; + case MUIKEY_PAGEDOWN: + if (data->msd_AttachedList) + set(data->msd_AttachedList, + MUIA_List_Active, MUIV_List_Active_PageDown); + break; + case MUIKEY_TOP: + if (data->msd_AttachedList) + set(data->msd_AttachedList, + MUIA_List_Active, MUIV_List_Active_Top); + break; + case MUIKEY_BOTTOM: + if (data->msd_AttachedList) + set(data->msd_AttachedList, + MUIA_List_Active, MUIV_List_Active_Bottom); + break; + case MUIKEY_PRESS: + { + UBYTE *buf = NULL; + + get(obj, MUIA_String_Contents, &buf); + + if (data->msd_Flags & MSDF_STAYACTIVE) + { + /* Do not change active object */ + } + else if (data->msd_Flags & MSDF_ADVANCEONCR) + { + set(_win(obj), MUIA_Window_ActiveObject, + MUIV_Window_ActiveObject_Next); + } + else if (!(data->msd_Flags & MSDF_STAYACTIVE)) + { + set(_win(obj), MUIA_Window_ActiveObject, + MUIV_Window_ActiveObject_None); + } + + set(obj, MUIA_String_Acknowledge, buf); + } + break; + + case MUIKEY_WINDOW_CLOSE: + data->is_active = FALSE; + set(obj, MUIA_Background, + (IPTR) muiGlobalInfo(obj)->mgi_Prefs->string_bg_inactive); + DoMethod(obj, MUIM_GoInactive); + retval = 0; + break; + + default: + retval = 0; + } // switch(muikey) + } // if (muikey != MUIKEY_NONE) + + if (msg->imsg) + { + UWORD code = msg->imsg->Code; + //UWORD qual = msg->imsg->Qualifier; + WORD x = msg->imsg->MouseX; + WORD y = msg->imsg->MouseY; + + //bug("String_HandleEvent: parsing imsg %p, class=%ld\n", + // msg->imsg, msg->imsg->Class); + + switch (msg->imsg->Class) + { + case IDCMP_MOUSEBUTTONS: /* set cursor and activate it */ + if (code == SELECTDOWN) + { + //bug("String_HandleEvent: code == SELECTDOWN, x=%d y=%d\n", + // x, y); + + if (_isinobject(x, y)) + { + UWORD text_left, text_right; + + retval = MUI_EventHandlerRC_Eat; + + CurrentTime(&data->NewClick_Sec, &data->NewClick_Micro); + if (DoubleClick(data->OldClick_Sec, + data->OldClick_Micro, data->NewClick_Sec, + data->NewClick_Micro)) + { + data->MultiClick++; + } + else + { + data->MultiClick = 0; + } + data->OldClick_Sec = data->NewClick_Sec; + data->OldClick_Micro = data->NewClick_Micro; + + //kprintf("multiclick %d\n", data->MultiClick); + + if (!data->is_active) + { + //bug("String got button, lets activate\n"); + data->is_active = TRUE; + data->msd_RedrawReason = WENT_ACTIVE; + // redraw + set(obj, MUIA_Background, + (IPTR) muiGlobalInfo(obj)->mgi_Prefs-> + string_bg_active); + + //DoMethod(obj, MUIM_GoActive); + set(_win(obj), MUIA_Window_ActiveObject, obj); + // let other objects a chance to get desactivated + //retval = 0; + } + + if (!(data->ehn.ehn_Events & IDCMP_MOUSEMOVE)) + { + DoMethod(_win(obj), MUIM_Window_RemEventHandler, + (IPTR) & data->ehn); + data->ehn.ehn_Events |= IDCMP_MOUSEMOVE; + DoMethod(_win(obj), MUIM_Window_AddEventHandler, + (IPTR) & data->ehn); + } + + text_left = GetTextLeft(cl, obj); + text_right = GetTextRight(cl, obj); + + /* Check if mouseclick is inside displayed text */ + if ((x >= text_left) && (x <= text_right)) + { + /* Find new cursor pos. */ + struct TextExtent te; + ULONG newpos; + STRPTR dispstr = data->Buffer + data->DispPos; + + newpos = data->DispPos + + TextFit(_rp(obj), dispstr, + data->NumChars - data->DispPos, &te, NULL, 1, + x - text_left, _rp(obj)->Font->tf_YSize); + + if (data->BufferPos != newpos) + { + data->BufferPos = newpos; + update = 1; + } + } + else if (x < text_left) + { + /* Click on empty space at left. Set cursor to first + * visible */ + if (data->BufferPos != data->DispPos) + { + data->BufferPos = data->DispPos; + update = 1; + } + } + else + { + /* Click on empty space at right. Set cursor to last + * visible */ + if (data->BufferPos != + data->DispPos + data->DispCount) + { + data->BufferPos = + data->DispPos + data->DispCount; + update = 1; + } + } /* if (click is on text or not) */ + + data->MarkPos = data->BufferPos; + + if (data->MultiClick == 0) + { + if (data->msd_Flags & MSDF_MARKING) + { + data->msd_Flags &= ~MSDF_MARKING; + update = 1; + } + } + else if (data->MultiClick + && Buffer_GetMarkedRange(data, NULL, NULL)) + { + data->msd_Flags |= MSDF_MARKING; + update = 1; + } + + + } /* is in object */ + else if (data->is_active + && !(data->msd_Flags & MSDF_STAYACTIVE)) + /* and click not on object */ + { + data->is_active = FALSE; + set(obj, MUIA_Background, + (IPTR) muiGlobalInfo(obj)->mgi_Prefs-> + string_bg_inactive); + //DoMethod(obj, MUIM_GoInactive); + // let other objects a chance to get activated + //retval = 0; + } + } /* if (code == SELECTDOWN) */ + else if (code == SELECTUP) + { + if (data->ehn.ehn_Events & IDCMP_MOUSEMOVE) + { + DoMethod(_win(obj), MUIM_Window_RemEventHandler, + (IPTR) & data->ehn); + data->ehn.ehn_Events &= ~IDCMP_MOUSEMOVE; + DoMethod(_win(obj), MUIM_Window_AddEventHandler, + (IPTR) & data->ehn); + } + } + break; + + case IDCMP_MOUSEMOVE: + if (data->is_active) + { + UWORD text_left, text_right; + + if (!(data->msd_Flags & MSDF_MARKING)) + { + data->msd_Flags |= MSDF_MARKING; + } + + text_left = GetTextLeft(cl, obj); + text_right = GetTextRight(cl, obj); + + /* Check if mouseclick is inside displayed text */ + if ((x >= text_left) && (x <= text_right)) + { + /* Find new cursor pos. */ + struct TextExtent te; + ULONG newpos; + STRPTR dispstr = data->Buffer + data->DispPos; + + newpos = data->DispPos + + TextFit(_rp(obj), dispstr, + data->NumChars - data->DispPos, &te, NULL, 1, + x - text_left, _rp(obj)->Font->tf_YSize); + + if (data->BufferPos != newpos) + { + WORD old_markstart = 0, old_markstop = 0; + WORD markstart = 0, markstop = 0; + BOOL was_marked, is_marked; + + was_marked = Buffer_AnythingMarked(data) && + Buffer_GetMarkedRange(data, &old_markstart, + &old_markstop); + + data->BufferPos = newpos; + + is_marked = Buffer_AnythingMarked(data) && + Buffer_GetMarkedRange(data, &markstart, + &markstop); + + if ((was_marked != is_marked) || + (old_markstart != markstart) || + (old_markstop != markstop)) + { + update = 1; + } + } + } + else if ((x < text_left) && (data->BufferPos > 0)) + { + data->BufferPos--; + update = 1; + data->msd_RedrawReason = DO_CURSOR_LEFT; + } + else if ((x > text_right) + && (data->BufferPos < data->NumChars)) + { + data->BufferPos++; + update = 1; + data->msd_RedrawReason = DO_CURSOR_RIGHT; + } + //kprintf(" ---- bp: %d\n", data->BufferPos); + } + break; + + case IDCMP_RAWKEY: + { + unsigned char code; + + //bug("String_HandleEvent: idcmp_rawkey\n"); + + if (!data->is_active) + break; + + code = ConvertKey(msg->imsg); + if (!code) + { + switch (msg->imsg->Code) + { + case 0x64: /* LALT */ + case 0x65: /* RALT */ + case 0x64 | IECODE_UP_PREFIX: + case 0x65 | IECODE_UP_PREFIX: + if (msg->imsg-> + Qualifier & (IEQUALIFIER_LALT | + IEQUALIFIER_RALT)) + { + data->MarkPos = data->BufferPos; + data->msd_Flags |= + (MSDF_MARKING | MSDF_KEYMARKING); + } + else + { + data->msd_Flags &= ~MSDF_KEYMARKING; + } + break; + + } + } + + if (code) + { + update = + String_HandleVanillakey(cl, obj, code, + msg->imsg->Qualifier); + if (update) + { + retval = MUI_EventHandlerRC_Eat; + edited = TRUE; + } + } + } + break; + } + } + + if (edited) + set(obj, MUIA_String_Contents, data->Buffer); // trigger notification + + if (update) + { + MUI_Redraw(obj, MADF_DRAWUPDATE); + } + //D(bug("String eh return %ld\n", retval)); + + return retval; +} + + +/************************************************************************** + MUIM_Export : to export an object's "contents" to a dataspace object. +**************************************************************************/ +IPTR String__MUIM_Export(struct IClass *cl, Object *obj, + struct MUIP_Export *msg) +{ + struct MUI_StringData *data = INST_DATA(cl, obj); + ULONG id; + STRPTR buf = NULL; + + if (data->msd_useSecret) + buf = data->SecBuffer; + else + buf = data->Buffer; + + if ((id = muiNotifyData(obj)->mnd_ObjectID)) + { + if (buf != NULL) + DoMethod(msg->dataspace, MUIM_Dataspace_Add, + (IPTR) buf, data->NumChars + 1, (IPTR) id); + else + DoMethod(msg->dataspace, MUIM_Dataspace_Remove, (IPTR) id); + } + + return 0; +} + + +/************************************************************************** + MUIM_Import : to import an object's "contents" from a dataspace object. +**************************************************************************/ +IPTR String__MUIM_Import(struct IClass *cl, Object *obj, + struct MUIP_Import *msg) +{ + ULONG id; + STRPTR s; + + if ((id = muiNotifyData(obj)->mnd_ObjectID)) + { + if ((s = (STRPTR) DoMethod(msg->dataspace, MUIM_Dataspace_Find, + (IPTR) id))) + { + set(obj, MUIA_String_Contents, s); + } + } + + return 0; +} + +/************************************************************************** + MUIM_GoActive +**************************************************************************/ +IPTR String__MUIM_GoActive(struct IClass *cl, Object *obj, Msg msg) +{ + struct MUI_StringData *data = + (struct MUI_StringData *)INST_DATA(cl, obj); + + //D(bug("String_GoActive %p\n", obj)); + DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR) & data->ehn); + data->ehn.ehn_Events = IDCMP_MOUSEBUTTONS | IDCMP_RAWKEY; + DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR) & data->ehn); + data->is_active = TRUE; + data->msd_Flags &= ~MSDF_KEYMARKING; + data->msd_RedrawReason = WENT_ACTIVE; + // redraw + set(obj, MUIA_Background, + (IPTR) muiGlobalInfo(obj)->mgi_Prefs->string_bg_active); + + return 0; +} + +/************************************************************************** + MUIM_GoInactive +**************************************************************************/ +IPTR String__MUIM_GoInactive(struct IClass *cl, Object *obj, Msg msg) +{ + struct MUI_StringData *data = + (struct MUI_StringData *)INST_DATA(cl, obj); + + //D(bug("String_GoInactive %p\n", obj)); + + DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR) & data->ehn); + data->ehn.ehn_Events = IDCMP_MOUSEBUTTONS; + DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR) & data->ehn); + data->is_active = FALSE; + data->msd_RedrawReason = WENT_INACTIVE; + data->MultiClick = 0; + + // redraw + set(obj, MUIA_Background, + (IPTR) muiGlobalInfo(obj)->mgi_Prefs->string_bg_inactive); + + return 0; +} + +/************************************************************************** + MUIM_String_ClearSelected (BetterString) +**************************************************************************/ +IPTR String__MUIM_ClearSelected(struct IClass *cl, Object *obj, + struct MUIP_String_ClearSelected *msg) +{ + struct MUI_StringData *data = + (struct MUI_StringData *)INST_DATA(cl, obj); + + //D(bug("String_ClearSelected %p\n", obj)); + + if (Buffer_KillMarked(data)) + { + MUI_Redraw(obj, MADF_DRAWUPDATE); + } + + return 0; +} + +/************************************************************************** + MUIM_String_Insert (BetterString) +**************************************************************************/ +IPTR String__MUIM_Insert(struct IClass *cl, Object *obj, + struct MUIP_String_Insert *msg) +{ + struct MUI_StringData *data = + (struct MUI_StringData *)INST_DATA(cl, obj); + LONG pos; + ULONG old_bufferpos; + ULONG num_inserted = 0; + + //D(bug("String_Insert %p\n", obj)); + + switch ((ULONG) msg->pos) + { + case MUIV_String_Insert_StartOfString: + pos = 0; + break; + + case MUIV_String_Insert_EndOfString: + pos = data->NumChars; + break; + + case MUIV_String_Insert_BufferPos: + pos = data->BufferPos; + break; + + default: + pos = msg->pos; + break; + } + + if ((pos < 0) || (pos > data->NumChars)) + return 0; + + old_bufferpos = data->BufferPos; + data->BufferPos = pos; + + while (msg->text[num_inserted] + && Buffer_AddChar(data, msg->text[num_inserted])) + { + num_inserted++; + } + + if (num_inserted) + { + if (old_bufferpos >= pos) + { + data->BufferPos = old_bufferpos + num_inserted; + } + else + { + data->BufferPos = old_bufferpos; + } + + MUI_Redraw(obj, MADF_DRAWUPDATE); + } + + return 0; +} + +/************************************************************************** + MUIM_String_FileNameStart (BetterString) +**************************************************************************/ +IPTR String__MUIM_FileNameStart(struct IClass *cl, Object *obj, + struct MUIP_String_FileNameStart *msg) +{ + struct MUI_StringData *data = + (struct MUI_StringData *)INST_DATA(cl, obj); + STRPTR buf; + + //D(bug("String_FileNameStart %p\n", obj)); + + if (data->msd_useSecret) + { + buf = data->SecBuffer; + } + else + { + buf = data->Buffer; + } + // TODO: Implement String_FileNameStart correctly! + + return (IPTR) buf; +} + +BOOPSI_DISPATCHER(IPTR, String_Dispatcher, cl, obj, msg) +{ + switch (msg->MethodID) + { + case OM_NEW: + return String__OM_NEW(cl, obj, (struct opSet *)msg); + case OM_DISPOSE: + return String__OM_DISPOSE(cl, obj, msg); + case OM_SET: + return String__OM_SET(cl, obj, (struct opSet *)msg); + case OM_GET: + return String__OM_GET(cl, obj, (struct opGet *)msg); + + case MUIM_Setup: + return String__MUIM_Setup(cl, obj, (APTR) msg); + case MUIM_Cleanup: + return String__MUIM_Cleanup(cl, obj, (APTR) msg); + case MUIM_AskMinMax: + return String__MUIM_AskMinMax(cl, obj, (APTR) msg); + case MUIM_Draw: + return String__MUIM_Draw(cl, obj, (APTR) msg); + case MUIM_Export: + return String__MUIM_Export(cl, obj, (APTR) msg); + case MUIM_Import: + return String__MUIM_Import(cl, obj, (APTR) msg); + case MUIM_GoActive: + return String__MUIM_GoActive(cl, obj, (APTR) msg); + case MUIM_GoInactive: + return String__MUIM_GoInactive(cl, obj, (APTR) msg); + case MUIM_HandleEvent: + return String__MUIM_HandleEvent(cl, obj, (APTR) msg); + + /* BetterString */ + case MUIM_String_ClearSelected: + return String__MUIM_ClearSelected(cl, obj, (APTR) msg); + case MUIM_String_Insert: + return String__MUIM_Insert(cl, obj, (APTR) msg); + case MUIM_String_FileNameStart: + return String__MUIM_FileNameStart(cl, obj, (APTR) msg); + } + + return DoSuperMethodA(cl, obj, msg); +} +BOOPSI_DISPATCHER_END + +/* + * Class descriptor. + */ +const struct __MUIBuiltinClass _MUI_String_desc = +{ + MUIC_String, + MUIC_Area, + sizeof(struct MUI_StringData), + (void *)String_Dispatcher +}; diff --git a/workbench/libs/muimaster/classes/string.h b/workbench/libs/muimaster/classes/string.h dissimilarity index 63% index 9ea66b284a..c7aef0695e 100644 --- a/workbench/libs/muimaster/classes/string.h +++ b/workbench/libs/muimaster/classes/string.h @@ -1,64 +1,94 @@ -#ifndef _MUI_CLASSES_STRING_H -#define _MUI_CLASSES_STRING_H - -/* - Copyright © 2002-2003, The AROS Development Team. All rights reserved. - $Id$ -*/ - -/*** Name *******************************************************************/ -#define MUIC_String "String.mui" - -/*** Identifier base (for Zune extensions) **********************************/ -#define MUIB_String (MUIB_ZUNE | 0x00003400) - -/*** Attributes *************************************************************/ -#define MUIA_String_Accept (MUIB_MUI|0x0042e3e1) /* V4 isg STRPTR */ -#define MUIA_String_Acknowledge (MUIB_MUI|0x0042026c) /* V4 ..g STRPTR */ -#define MUIA_String_AdvanceOnCR (MUIB_MUI|0x004226de) /* V11 isg BOOL */ -#define MUIA_String_AttachedList (MUIB_MUI|0x00420fd2) /* V4 isg Object * */ -#define MUIA_String_BufferPos (MUIB_MUI|0x00428b6c) /* V4 .sg LONG */ -#define MUIA_String_Contents (MUIB_MUI|0x00428ffd) /* V4 isg STRPTR */ -#define MUIA_String_DisplayPos (MUIB_MUI|0x0042ccbf) /* V4 .sg LONG */ -#define MUIA_String_EditHook (MUIB_MUI|0x00424c33) /* V7 isg struct Hook * */ -#define MUIA_String_Format (MUIB_MUI|0x00427484) /* V4 i.g LONG */ -#define MUIA_String_Integer (MUIB_MUI|0x00426e8a) /* V4 isg ULONG */ -#define MUIA_String_LonelyEditHook (MUIB_MUI|0x00421569) /* V11 isg BOOL */ -#define MUIA_String_MaxLen (MUIB_MUI|0x00424984) /* V4 i.g LONG */ -#define MUIA_String_Reject (MUIB_MUI|0x0042179c) /* V4 isg STRPTR */ -#define MUIA_String_Secret (MUIB_MUI|0x00428769) /* V4 i.g BOOL */ - -enum { - MUIV_String_Format_Left = 0, - MUIV_String_Format_Center, - MUIV_String_Format_Right, -}; - -/* Extended features taken over from Alan Odgaard's BetterString MCC. - Attribute and method IDs match those of BetterString class. */ - -#define MUIA_String_Columns 0xad001005 -#define MUIA_String_NoInput 0xad001007 -#define MUIA_String_SelectSize 0xad001001 -#define MUIA_String_StayActive 0xad001003 -#define MUIA_String_KeyUpFocus 0xad001008 -#define MUIA_String_KeyDownFocus 0xad001009 - -#define MUIM_String_ClearSelected 0xad001004 -#define MUIM_String_FileNameStart 0xad001006 -#define MUIM_String_Insert 0xad001002 - -#define MUIV_String_Insert_StartOfString 0x00000000 -#define MUIV_String_Insert_EndOfString 0xfffffffe -#define MUIV_String_Insert_BufferPos 0xffffffff -#define MUIV_String_BufferPos_End 0xffffffff - -#define MUIR_String_FileNameStart_Volume 0xffffffff - -struct MUIP_String_ClearSelected {STACKED ULONG MethodID;}; -struct MUIP_String_FileNameStart {STACKED ULONG MethodID; STACKED STRPTR buffer; STACKED LONG pos;}; -struct MUIP_String_Insert {STACKED ULONG MethodID; STACKED STRPTR text; STACKED LONG pos;}; - -extern const struct __MUIBuiltinClass _MUI_String_desc; /* PRIV */ - -#endif /* _MUI_CLASSES_STRING_H */ +#ifndef _MUI_CLASSES_STRING_H +#define _MUI_CLASSES_STRING_H + +/* + Copyright © 2002-2003, The AROS Development Team. All rights reserved. + $Id$ +*/ + +/*** Name *******************************************************************/ +#define MUIC_String "String.mui" + +/*** Identifier base (for Zune extensions) **********************************/ +#define MUIB_String (MUIB_ZUNE | 0x00003400) + +/*** Attributes *************************************************************/ +#define MUIA_String_Accept \ + (MUIB_MUI | 0x0042e3e1) /* V4 isg STRPTR */ +#define MUIA_String_Acknowledge \ + (MUIB_MUI | 0x0042026c) /* V4 ..g STRPTR */ +#define MUIA_String_AdvanceOnCR \ + (MUIB_MUI | 0x004226de) /* V11 isg BOOL */ +#define MUIA_String_AttachedList \ + (MUIB_MUI | 0x00420fd2) /* V4 isg Object * */ +#define MUIA_String_BufferPos \ + (MUIB_MUI | 0x00428b6c) /* V4 .sg LONG */ +#define MUIA_String_Contents \ + (MUIB_MUI | 0x00428ffd) /* V4 isg STRPTR */ +#define MUIA_String_DisplayPos \ + (MUIB_MUI | 0x0042ccbf) /* V4 .sg LONG */ +#define MUIA_String_EditHook \ + (MUIB_MUI | 0x00424c33) /* V7 isg struct Hook * */ +#define MUIA_String_Format \ + (MUIB_MUI | 0x00427484) /* V4 i.g LONG */ +#define MUIA_String_Integer \ + (MUIB_MUI | 0x00426e8a) /* V4 isg ULONG */ +#define MUIA_String_LonelyEditHook \ + (MUIB_MUI | 0x00421569) /* V11 isg BOOL */ +#define MUIA_String_MaxLen \ + (MUIB_MUI | 0x00424984) /* V4 i.g LONG */ +#define MUIA_String_Reject \ + (MUIB_MUI | 0x0042179c) /* V4 isg STRPTR */ +#define MUIA_String_Secret \ + (MUIB_MUI | 0x00428769) /* V4 i.g BOOL */ + +enum +{ + MUIV_String_Format_Left = 0, + MUIV_String_Format_Center, + MUIV_String_Format_Right, +}; + +/* Extended features taken over from Alan Odgaard's BetterString MCC. + Attribute and method IDs match those of BetterString class. */ + +#define MUIA_String_Columns 0xad001005 +#define MUIA_String_NoInput 0xad001007 +#define MUIA_String_SelectSize 0xad001001 +#define MUIA_String_StayActive 0xad001003 +#define MUIA_String_KeyUpFocus 0xad001008 +#define MUIA_String_KeyDownFocus 0xad001009 + +#define MUIM_String_ClearSelected 0xad001004 +#define MUIM_String_FileNameStart 0xad001006 +#define MUIM_String_Insert 0xad001002 + +#define MUIV_String_Insert_StartOfString 0x00000000 +#define MUIV_String_Insert_EndOfString 0xfffffffe +#define MUIV_String_Insert_BufferPos 0xffffffff +#define MUIV_String_BufferPos_End 0xffffffff + +#define MUIR_String_FileNameStart_Volume 0xffffffff + +struct MUIP_String_ClearSelected +{ + STACKED ULONG MethodID; +}; + +struct MUIP_String_FileNameStart +{ + STACKED ULONG MethodID; + STACKED STRPTR buffer; + STACKED LONG pos; +}; + +struct MUIP_String_Insert +{ + STACKED ULONG MethodID; + STACKED STRPTR text; + STACKED LONG pos; +}; + +extern const struct __MUIBuiltinClass _MUI_String_desc; /* PRIV */ + +#endif /* _MUI_CLASSES_STRING_H */ diff --git a/workbench/libs/muimaster/classes/text.c b/workbench/libs/muimaster/classes/text.c index 9c5b06411e..c65a7acf0f 100644 --- a/workbench/libs/muimaster/classes/text.c +++ b/workbench/libs/muimaster/classes/text.c @@ -30,18 +30,20 @@ extern struct Library *MUIMasterBase; #include "debug.h" -struct MUI_TextData { - ULONG mtd_Flags; +struct MUI_TextData +{ + ULONG mtd_Flags; STRPTR contents; CONST_STRPTR preparse; - TEXT hichar; + TEXT hichar; ZText *ztext; - LONG xpixel; /* needed for cursor up/down movements, can be -1 */ + LONG xpixel; /* needed for cursor up/down movements, can be -1 */ LONG xpos; LONG ypos; struct MUI_EventHandlerNode ehn; - LONG update; /* type of update 1 - everything, 2 - insert char, no scroll */ + LONG update; /* type of update: 1 - everything, + * 2 - insert char, no scroll */ LONG update_arg1; LONG update_arg2; }; @@ -60,7 +62,7 @@ struct MUI_TextData { static const int __version = 1; static const int __revision = 1; -static void setup_text (struct MUI_TextData *data, Object *obj); +static void setup_text(struct MUI_TextData *data, Object *obj); /************************************************************************** OM_NEW @@ -68,83 +70,86 @@ OM_NEW IPTR Text__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) { struct MUI_TextData *data; - struct TagItem *tags,*tag; + struct TagItem *tags, *tag; - obj = (Object *)DoSuperMethodA(cl, obj, (Msg)msg); + obj = (Object *) DoSuperMethodA(cl, obj, (Msg) msg); if (!obj) - return FALSE; + return FALSE; data = INST_DATA(cl, obj); data->mtd_Flags = MTDF_SETMIN | MTDF_SETVMAX; /* parse initial taglist */ - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) { switch (tag->ti_Tag) { - case MUIA_Text_Contents: - if (tag->ti_Data) data->contents = StrDup((STRPTR)tag->ti_Data); - break; - - case MUIA_Text_HiChar: - data->hichar = tag->ti_Data; - _handle_bool_tag(data->mtd_Flags, tag->ti_Data, MTDF_HICHAR); - break; - - case MUIA_Text_HiCharIdx: - data->hichar = tag->ti_Data; - _handle_bool_tag(data->mtd_Flags, tag->ti_Data, MTDF_HICHARIDX); - break; - - case MUIA_Text_PreParse: - data->preparse = StrDup((STRPTR)tag->ti_Data); - break; - - case MUIA_Text_SetMin: - _handle_bool_tag(data->mtd_Flags, tag->ti_Data, MTDF_SETMIN); - break; - - case MUIA_Text_SetMax: - _handle_bool_tag(data->mtd_Flags, tag->ti_Data, MTDF_SETMAX); - break; - - case MUIA_Text_SetVMax: - _handle_bool_tag(data->mtd_Flags, tag->ti_Data, MTDF_SETVMAX); - break; - + case MUIA_Text_Contents: + if (tag->ti_Data) + data->contents = StrDup((STRPTR) tag->ti_Data); + break; + + case MUIA_Text_HiChar: + data->hichar = tag->ti_Data; + _handle_bool_tag(data->mtd_Flags, tag->ti_Data, MTDF_HICHAR); + break; + + case MUIA_Text_HiCharIdx: + data->hichar = tag->ti_Data; + _handle_bool_tag(data->mtd_Flags, tag->ti_Data, MTDF_HICHARIDX); + break; + + case MUIA_Text_PreParse: + data->preparse = StrDup((STRPTR) tag->ti_Data); + break; + + case MUIA_Text_SetMin: + _handle_bool_tag(data->mtd_Flags, tag->ti_Data, MTDF_SETMIN); + break; + + case MUIA_Text_SetMax: + _handle_bool_tag(data->mtd_Flags, tag->ti_Data, MTDF_SETMAX); + break; + + case MUIA_Text_SetVMax: + _handle_bool_tag(data->mtd_Flags, tag->ti_Data, MTDF_SETVMAX); + break; + #if 0 - case MUIA_Text_Editable: - _handle_bool_tag(data->mtd_Flags, tag->ti_Data, MTDF_EDITABLE); - break; - - case MUIA_Text_Multiline: - _handle_bool_tag(data->mtd_Flags, tag->ti_Data, MTDF_MULTILINE); - break; + case MUIA_Text_Editable: + _handle_bool_tag(data->mtd_Flags, tag->ti_Data, MTDF_EDITABLE); + break; + + case MUIA_Text_Multiline: + _handle_bool_tag(data->mtd_Flags, tag->ti_Data, MTDF_MULTILINE); + break; #endif } } - if (!data->preparse) data->preparse = StrDup(""); - if (!data->contents) data->contents = StrDup(""); + if (!data->preparse) + data->preparse = StrDup(""); + if (!data->contents) + data->contents = StrDup(""); if (!data->contents || !data->preparse) { CoerceMethod(cl, obj, OM_DISPOSE); - return (IPTR)NULL; + return (IPTR) NULL; } /* D(bug("Text_New(0x%lx)\n", obj)); */ - data->ehn.ehn_Events = IDCMP_MOUSEBUTTONS; + data->ehn.ehn_Events = IDCMP_MOUSEBUTTONS; data->ehn.ehn_Priority = 0; - data->ehn.ehn_Flags = 0; - data->ehn.ehn_Object = obj; - data->ehn.ehn_Class = cl; + data->ehn.ehn_Flags = 0; + data->ehn.ehn_Object = obj; + data->ehn.ehn_Class = cl; data->xpixel = -1; - return (IPTR)obj; + return (IPTR) obj; } /************************************************************************** @@ -155,7 +160,7 @@ IPTR Text__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) struct MUI_TextData *data = INST_DATA(cl, obj); FreeVec(data->contents); - FreeVec((APTR)data->preparse); + FreeVec((APTR) data->preparse); return DoSuperMethodA(cl, obj, msg); } @@ -166,16 +171,18 @@ OM_SET IPTR Text__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) { struct MUI_TextData *data = INST_DATA(cl, obj); - struct TagItem *tags = msg->ops_AttrList; - struct TagItem *tag; + struct TagItem *tags = msg->ops_AttrList; + struct TagItem *tag; while ((tag = NextTagItem(&tags)) != NULL) { switch (tag->ti_Tag) { - case MUIA_Text_Contents: + case MUIA_Text_Contents: { - char *new_contents = StrDup(((char*)tag->ti_Data)?(char*)tag->ti_Data:""); + char *new_contents = + StrDup(((char *)tag->ti_Data) ? (char *)tag-> + ti_Data : ""); if (new_contents) { if (data->ztext) @@ -185,15 +192,18 @@ IPTR Text__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) } FreeVec(data->contents); data->contents = new_contents; - if (_flags(obj) & MADF_SETUP) setup_text(data, obj); - MUI_Redraw(obj,MADF_DRAWOBJECT); /* should be optimized */ + if (_flags(obj) & MADF_SETUP) + setup_text(data, obj); + MUI_Redraw(obj, MADF_DRAWOBJECT); /* should be optimized */ } } break; - - case MUIA_Text_PreParse: + + case MUIA_Text_PreParse: { - char *new_preparse = StrDup(((char*)tag->ti_Data)?(char*)tag->ti_Data:""); + char *new_preparse = + StrDup(((char *)tag->ti_Data) ? (char *)tag-> + ti_Data : ""); if (new_preparse) { if (data->ztext) @@ -201,21 +211,23 @@ IPTR Text__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) zune_text_destroy(data->ztext); data->ztext = NULL; } - FreeVec((APTR)data->preparse); + FreeVec((APTR) data->preparse); data->preparse = new_preparse; - if (_flags(obj) & MADF_SETUP) setup_text(data, obj); - MUI_Redraw(obj,MADF_DRAWOBJECT); /* should be opimized */ + if (_flags(obj) & MADF_SETUP) + setup_text(data, obj); + MUI_Redraw(obj, MADF_DRAWOBJECT); /* should be optimized */ } } break; - - case MUIA_Selected: - D(bug("Text_Set(%p) : MUIA_Selected val=%ld sss=%d\n", obj, tag->ti_Data, !!(_flags(obj) & MADF_SHOWSELSTATE))); - break; + + case MUIA_Selected: + D(bug("Text_Set(%p) : MUIA_Selected val=%ld sss=%d\n", obj, + tag->ti_Data, ! !(_flags(obj) & MADF_SHOWSELSTATE))); + break; } } - return DoSuperMethodA(cl, obj, (Msg)msg); + return DoSuperMethodA(cl, obj, (Msg) msg); } @@ -227,23 +239,23 @@ IPTR Text__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) struct MUI_TextData *data = INST_DATA(cl, obj); #define STORE *(msg->opg_Storage) - switch(msg->opg_AttrID) + switch (msg->opg_AttrID) { - case MUIA_Text_Contents: - STORE = (IPTR)data->contents; - return TRUE; - - case MUIA_Text_PreParse: - STORE = (IPTR)data->preparse; - return TRUE; - - case MUIA_Version: - STORE = __version; - return TRUE; - - case MUIA_Revision: - STORE = __revision; - return TRUE; + case MUIA_Text_Contents: + STORE = (IPTR) data->contents; + return TRUE; + + case MUIA_Text_PreParse: + STORE = (IPTR) data->preparse; + return TRUE; + + case MUIA_Version: + STORE = __version; + return TRUE; + + case MUIA_Revision: + STORE = __revision; + return TRUE; } return DoSuperMethodA(cl, obj, (Msg) msg); #undef STORE @@ -252,32 +264,34 @@ IPTR Text__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) /************************************************************************** ... **************************************************************************/ -static void setup_text (struct MUI_TextData *data, Object *obj) +static void setup_text(struct MUI_TextData *data, Object *obj) { if (data->mtd_Flags & MTDF_HICHAR) { data->ztext = zune_text_new(data->preparse, data->contents, - ZTEXT_ARG_HICHAR, data->hichar); + ZTEXT_ARG_HICHAR, data->hichar); } else if (data->mtd_Flags & MTDF_HICHARIDX) { data->ztext = zune_text_new(data->preparse, data->contents, - ZTEXT_ARG_HICHARIDX, data->hichar); + ZTEXT_ARG_HICHARIDX, data->hichar); } else { data->ztext = zune_text_new(data->preparse, data->contents, - ZTEXT_ARG_NONE, 0); + ZTEXT_ARG_NONE, 0); } zune_text_get_bounds(data->ztext, obj); -/* D(bug("muimaster.library/text.c: ZText of 0x%lx at 0x%lx\n",obj,data->ztext)); */ +/* D(bug("muimaster.library/text.c: ZText of 0x%lx at 0x%lx\n", */ +/* obj, data->ztext)); */ } /************************************************************************** MUIM_Setup **************************************************************************/ -IPTR Text__MUIM_Setup(struct IClass *cl, Object *obj, struct MUIP_Setup *msg) +IPTR Text__MUIM_Setup(struct IClass *cl, Object *obj, + struct MUIP_Setup *msg) { struct MUI_TextData *data = INST_DATA(cl, obj); @@ -286,18 +300,19 @@ IPTR Text__MUIM_Setup(struct IClass *cl, Object *obj, struct MUIP_Setup *msg) setup_text(data, obj); - DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR)&data->ehn); + DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR) & data->ehn); return TRUE; } /************************************************************************** MUIM_Cleanup **************************************************************************/ -IPTR Text__MUIM_Cleanup(struct IClass *cl, Object *obj, struct MUIP_Cleanup *msg) +IPTR Text__MUIM_Cleanup(struct IClass *cl, Object *obj, + struct MUIP_Cleanup *msg) { struct MUI_TextData *data = INST_DATA(cl, obj); - DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR)&data->ehn); + DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR) & data->ehn); if (data->ztext) { @@ -311,7 +326,8 @@ IPTR Text__MUIM_Cleanup(struct IClass *cl, Object *obj, struct MUIP_Cleanup *msg /************************************************************************** MUIM_Show **************************************************************************/ -IPTR Text__MUIM_Show(struct IClass *cl, Object *obj, struct MUIP_Show *msg) +IPTR Text__MUIM_Show(struct IClass *cl, Object *obj, + struct MUIP_Show *msg) { //struct MUI_TextData *data = INST_DATA(cl, obj); @@ -324,7 +340,8 @@ IPTR Text__MUIM_Show(struct IClass *cl, Object *obj, struct MUIP_Show *msg) /************************************************************************** MUIM_Hide **************************************************************************/ -IPTR Text__MUIM_Hide(struct IClass *cl, Object *obj, struct MUIP_Hide *msg) +IPTR Text__MUIM_Hide(struct IClass *cl, Object *obj, + struct MUIP_Hide *msg) { //struct MUI_TextData *data = INST_DATA(cl, obj); return DoSuperMethodA(cl, obj, (Msg) msg); @@ -333,21 +350,23 @@ IPTR Text__MUIM_Hide(struct IClass *cl, Object *obj, struct MUIP_Hide *msg) /************************************************************************** MUIM_AskMinMax **************************************************************************/ -IPTR Text__MUIM_AskMinMax(struct IClass *cl, Object *obj, struct MUIP_AskMinMax *msg) +IPTR Text__MUIM_AskMinMax(struct IClass *cl, Object *obj, + struct MUIP_AskMinMax *msg) { int height; struct MUI_TextData *data = INST_DATA(cl, obj); - DoSuperMethodA(cl, obj, (Msg)msg); + DoSuperMethodA(cl, obj, (Msg) msg); height = data->ztext->height; - if (_font(obj)->tf_YSize > height) height = _font(obj)->tf_YSize; + if (_font(obj)->tf_YSize > height) + height = _font(obj)->tf_YSize; /* D(bug("YSize=%ld\n", _font(obj)->tf_YSize)); */ #if 0 if (!(data->mtd_Flags & MTDF_EDITABLE)) #endif - { + { msg->MinMaxInfo->MinWidth += data->ztext->width; msg->MinMaxInfo->DefWidth += data->ztext->width; msg->MinMaxInfo->MaxWidth += data->ztext->width; @@ -355,8 +374,8 @@ IPTR Text__MUIM_AskMinMax(struct IClass *cl, Object *obj, struct MUIP_AskMinMax #if 0 else { - msg->MinMaxInfo->MinWidth += _font(obj)->tf_XSize*4; - msg->MinMaxInfo->DefWidth += _font(obj)->tf_XSize*12; + msg->MinMaxInfo->MinWidth += _font(obj)->tf_XSize * 4; + msg->MinMaxInfo->DefWidth += _font(obj)->tf_XSize * 12; msg->MinMaxInfo->MaxWidth += MUI_MAXMAX; } #endif @@ -376,7 +395,7 @@ IPTR Text__MUIM_AskMinMax(struct IClass *cl, Object *obj, struct MUIP_AskMinMax else { msg->MinMaxInfo->MinHeight += _font(obj)->tf_YSize; - msg->MinMaxInfo->DefHeight += _font(obj)->tf_YSize*10; + msg->MinMaxInfo->DefHeight += _font(obj)->tf_YSize * 10; msg->MinMaxInfo->MaxHeight += MUI_MAXMAX; } #endif @@ -387,10 +406,12 @@ IPTR Text__MUIM_AskMinMax(struct IClass *cl, Object *obj, struct MUIP_AskMinMax if (!(data->mtd_Flags & MTDF_SETMIN)) msg->MinMaxInfo->MinWidth = 0; - D(bug("Text_AskMinMax 0x%lx (%s): Min=%ldx%ld Max=%ldx%ld Def=%ldx%ld\n", obj, data->contents, - msg->MinMaxInfo->MinWidth, msg->MinMaxInfo->MinHeight, - msg->MinMaxInfo->MaxWidth, msg->MinMaxInfo->MaxHeight, - msg->MinMaxInfo->DefWidth, msg->MinMaxInfo->DefHeight)); + D(bug + ("Text_AskMinMax 0x%lx (%s): Min=%ldx%ld Max=%ldx%ld Def=%ldx%ld\n", + obj, data->contents, msg->MinMaxInfo->MinWidth, + msg->MinMaxInfo->MinHeight, msg->MinMaxInfo->MaxWidth, + msg->MinMaxInfo->MaxHeight, msg->MinMaxInfo->DefWidth, + msg->MinMaxInfo->DefHeight)); return TRUE; } @@ -398,38 +419,42 @@ IPTR Text__MUIM_AskMinMax(struct IClass *cl, Object *obj, struct MUIP_AskMinMax /************************************************************************** MUIM_Draw **************************************************************************/ -IPTR Text__MUIM_Draw(struct IClass *cl, Object *obj, struct MUIP_Draw *msg) +IPTR Text__MUIM_Draw(struct IClass *cl, Object *obj, + struct MUIP_Draw *msg) { struct MUI_TextData *data = INST_DATA(cl, obj); Object *act = NULL; APTR clip; -/* D(bug("muimaster.library/text.c: Draw Text Object at 0x%lx %ldx%ldx%ldx%ld\n",obj,_left(obj),_top(obj),_right(obj),_bottom(obj))); */ +/* D(bug("muimaster.library/text.c: Draw Text Object at " */ +/* "0x%lx %ldx%ldx%ldx%ld\n", obj, _left(obj), _top(obj), */ +/* _right(obj), _bottom(obj))); */ - DoSuperMethodA(cl,obj,(Msg)msg); + DoSuperMethodA(cl, obj, (Msg) msg); if ((msg->flags & MADF_DRAWUPDATE) && !data->update) return 0; - if (!(msg->flags & MADF_DRAWUPDATE)) data->update = 0; + if (!(msg->flags & MADF_DRAWUPDATE)) + data->update = 0; if (msg->flags & MADF_DRAWUPDATE && data->update == 1) { - DoMethod(obj,MUIM_DrawBackground, _mleft(obj),_mtop(obj),_mwidth(obj),_mheight(obj), _mleft(obj), _mtop(obj), 0); + DoMethod(obj, MUIM_DrawBackground, _mleft(obj), _mtop(obj), + _mwidth(obj), _mheight(obj), _mleft(obj), _mtop(obj), 0); } clip = MUI_AddClipping(muiRenderInfo(obj), _mleft(obj), _mtop(obj), - _mwidth(obj), _mheight(obj)); + _mwidth(obj), _mheight(obj)); SetAPen(_rp(obj), _pens(obj)[MPEN_TEXT]); { - get(_win(obj),MUIA_Window_ActiveObject,&act); + get(_win(obj), MUIA_Window_ActiveObject, &act); { int y = (_mheight(obj) - data->ztext->height) / 2; zune_text_draw(data->ztext, obj, - _mleft(obj), _mright(obj), - _mtop(obj) + y); + _mleft(obj), _mright(obj), _mtop(obj) + y); } } @@ -441,7 +466,8 @@ IPTR Text__MUIM_Draw(struct IClass *cl, Object *obj, struct MUIP_Draw *msg) /************************************************************************** MUIM_Export : to export an objects "contents" to a dataspace object. **************************************************************************/ -IPTR Text__MUIM_Export(struct IClass *cl, Object *obj, struct MUIP_Export *msg) +IPTR Text__MUIM_Export(struct IClass *cl, Object *obj, + struct MUIP_Export *msg) { //struct MUI_TextData *data = INST_DATA(cl, obj); //STRPTR id; @@ -449,8 +475,8 @@ IPTR Text__MUIM_Export(struct IClass *cl, Object *obj, struct MUIP_Export *msg) #if 0 if ((id = muiNotifyData(obj)->mnd_ObjectID)) { - DoMethod(msg->dataspace, MUIM_Dataspace_AddString, - _U(id), _U("contents"), _U(data->contents)); + DoMethod(msg->dataspace, MUIM_Dataspace_AddString, + _U(id), _U("contents"), _U(data->contents)); } #endif return 0; @@ -460,7 +486,8 @@ IPTR Text__MUIM_Export(struct IClass *cl, Object *obj, struct MUIP_Export *msg) /************************************************************************** MUIM_Import : to import an objects "contents" from a dataspace object. **************************************************************************/ -IPTR Text__MUIM_Import(struct IClass *cl, Object *obj, struct MUIP_Import *msg) +IPTR Text__MUIM_Import(struct IClass *cl, Object *obj, + struct MUIP_Import *msg) { //STRPTR id; //STRPTR s; @@ -468,11 +495,11 @@ IPTR Text__MUIM_Import(struct IClass *cl, Object *obj, struct MUIP_Import *msg) #if 0 if ((id = muiNotifyData(obj)->mnd_ObjectID)) { - if ((s = (STRPTR)DoMethod(msg->dataspace, MUIM_Dataspace_FindString, - _U(id), _U("contents")))) - { - set(obj, MUIA_Text_Contents, _U(s)); - } + if ((s = (STRPTR) DoMethod(msg->dataspace, + MUIM_Dataspace_FindString, _U(id), _U("contents")))) + { + set(obj, MUIA_Text_Contents, _U(s)); + } } #endif return 0; @@ -483,33 +510,44 @@ BOOPSI_DISPATCHER(IPTR, Text_Dispatcher, cl, obj, msg) { switch (msg->MethodID) { - case OM_NEW: return Text__OM_NEW(cl, obj, (struct opSet *) msg); - case OM_DISPOSE: return Text__OM_DISPOSE(cl, obj, msg); - case OM_SET: return Text__OM_SET(cl, obj, (struct opSet *)msg); - case OM_GET: return Text__OM_GET(cl, obj, (struct opGet *)msg); - - case MUIM_AskMinMax: return Text__MUIM_AskMinMax(cl, obj, (APTR)msg); - case MUIM_Draw: return Text__MUIM_Draw(cl, obj, (APTR)msg); - case MUIM_Setup: return Text__MUIM_Setup(cl, obj, (APTR)msg); - case MUIM_Cleanup: return Text__MUIM_Cleanup(cl, obj, (APTR)msg); - case MUIM_Show: return Text__MUIM_Show(cl, obj, (APTR)msg); - case MUIM_Hide: return Text__MUIM_Hide(cl, obj, (APTR)msg); - case MUIM_Export: return Text__MUIM_Export(cl, obj, (APTR)msg); - case MUIM_Import: return Text__MUIM_Import(cl, obj, (APTR)msg); + case OM_NEW: + return Text__OM_NEW(cl, obj, (struct opSet *)msg); + case OM_DISPOSE: + return Text__OM_DISPOSE(cl, obj, msg); + case OM_SET: + return Text__OM_SET(cl, obj, (struct opSet *)msg); + case OM_GET: + return Text__OM_GET(cl, obj, (struct opGet *)msg); + + case MUIM_AskMinMax: + return Text__MUIM_AskMinMax(cl, obj, (APTR) msg); + case MUIM_Draw: + return Text__MUIM_Draw(cl, obj, (APTR) msg); + case MUIM_Setup: + return Text__MUIM_Setup(cl, obj, (APTR) msg); + case MUIM_Cleanup: + return Text__MUIM_Cleanup(cl, obj, (APTR) msg); + case MUIM_Show: + return Text__MUIM_Show(cl, obj, (APTR) msg); + case MUIM_Hide: + return Text__MUIM_Hide(cl, obj, (APTR) msg); + case MUIM_Export: + return Text__MUIM_Export(cl, obj, (APTR) msg); + case MUIM_Import: + return Text__MUIM_Import(cl, obj, (APTR) msg); } return DoSuperMethodA(cl, obj, msg); } BOOPSI_DISPATCHER_END - - /* * Class descriptor. */ -const struct __MUIBuiltinClass _MUI_Text_desc = { +const struct __MUIBuiltinClass _MUI_Text_desc = +{ MUIC_Text, - MUIC_Area, - sizeof(struct MUI_TextData), - (void*)Text_Dispatcher + MUIC_Area, + sizeof(struct MUI_TextData), + (void *) Text_Dispatcher }; diff --git a/workbench/libs/muimaster/classes/text.h b/workbench/libs/muimaster/classes/text.h dissimilarity index 68% index a8cc32343d..fd2f681185 100644 --- a/workbench/libs/muimaster/classes/text.h +++ b/workbench/libs/muimaster/classes/text.h @@ -1,46 +1,55 @@ -#ifndef _MUI_CLASSES_TEXT_H -#define _MUI_CLASSES_TEXT_H - -/* - Copyright © 1999, David Le Corfec. - Copyright © 2002-2003, The AROS Development Team. - All rights reserved. - - $Id$ -*/ - -/*** Name *******************************************************************/ -#define MUIC_Text "Text.mui" - -/*** Identifier base (for Zune extensions) **********************************/ -#define MUIB_Text (MUIB_ZUNE | 0x00003500) - -/*** Attributes *************************************************************/ -#define MUIA_Text_Contents (MUIB_MUI|0x0042f8dc) /* MUI: V4 isg STRPTR */ -#define MUIA_Text_HiChar (MUIB_MUI|0x004218ff) /* MUI: V4 i.. char */ -#define MUIA_Text_HiCharIdx (MUIB_MUI|0x004214f5) /* i.. char */ -#define MUIA_Text_PreParse (MUIB_MUI|0x0042566d) /* MUI: V4 isg STRPTR */ -#define MUIA_Text_SetMax (MUIB_MUI|0x00424d0a) /* MUI: V4 i.. BOOL */ -#define MUIA_Text_SetMin (MUIB_MUI|0x00424e10) /* MUI: V4 i.. BOOL */ -#define MUIA_Text_SetVMax (MUIB_MUI|0x00420d8b) /* MUI: V11 i.. BOOL */ - -#define MUIA_Text_Editable (MUIB_Text | 0x00000000) /* DEPRECATED */ -#define MUIA_Text_Multiline (MUIB_Text | 0x00000001) /* DEPRECATED */ - -/* Codes which can be used in text strings */ -#define MUIX_L "\033l" /* justify left */ -#define MUIX_C "\033c" /* justify centered */ -#define MUIX_R "\033r" /* justify right */ - -#define MUIX_N "\033n" /* normal style */ -#define MUIX_B "\033b" /* bold style */ -#define MUIX_I "\033i" /* italic style */ -#define MUIX_U "\033u" /* underlined style */ - -#define MUIX_PT "\0332" /* use text pen */ -#define MUIX_PH "\0338" /* use highlight text pen */ - - -extern const struct __MUIBuiltinClass _MUI_Text_desc; /* PRIV */ - -#endif /* _MUI_CLASSES_TEXT_H */ +#ifndef _MUI_CLASSES_TEXT_H +#define _MUI_CLASSES_TEXT_H + +/* + Copyright © 1999, David Le Corfec. + Copyright © 2002-2003, The AROS Development Team. + All rights reserved. + + $Id$ +*/ + +/*** Name *******************************************************************/ +#define MUIC_Text "Text.mui" + +/*** Identifier base (for Zune extensions) **********************************/ +#define MUIB_Text (MUIB_ZUNE | 0x00003500) + +/*** Attributes *************************************************************/ +#define MUIA_Text_Contents \ + (MUIB_MUI | 0x0042f8dc) /* MUI: V4 isg STRPTR */ +#define MUIA_Text_HiChar \ + (MUIB_MUI | 0x004218ff) /* MUI: V4 i.. char */ +#define MUIA_Text_HiCharIdx \ + (MUIB_MUI | 0x004214f5) /* i.. char */ +#define MUIA_Text_PreParse \ + (MUIB_MUI | 0x0042566d) /* MUI: V4 isg STRPTR */ +#define MUIA_Text_SetMax \ + (MUIB_MUI | 0x00424d0a) /* MUI: V4 i.. BOOL */ +#define MUIA_Text_SetMin \ + (MUIB_MUI | 0x00424e10) /* MUI: V4 i.. BOOL */ +#define MUIA_Text_SetVMax \ + (MUIB_MUI | 0x00420d8b) /* MUI: V11 i.. BOOL */ + +#define MUIA_Text_Editable \ + (MUIB_Text | 0x00000000) /* DEPRECATED */ +#define MUIA_Text_Multiline \ + (MUIB_Text | 0x00000001) /* DEPRECATED */ + +/* Codes which can be used in text strings */ +#define MUIX_L "\033l" /* justify left */ +#define MUIX_C "\033c" /* justify centered */ +#define MUIX_R "\033r" /* justify right */ + +#define MUIX_N "\033n" /* normal style */ +#define MUIX_B "\033b" /* bold style */ +#define MUIX_I "\033i" /* italic style */ +#define MUIX_U "\033u" /* underlined style */ + +#define MUIX_PT "\0332" /* use text pen */ +#define MUIX_PH "\0338" /* use highlight text pen */ + + +extern const struct __MUIBuiltinClass _MUI_Text_desc; /* PRIV */ + +#endif /* _MUI_CLASSES_TEXT_H */ diff --git a/workbench/libs/muimaster/classes/title.c b/workbench/libs/muimaster/classes/title.c index 8b6a7927b3..cbbecc343f 100644 --- a/workbench/libs/muimaster/classes/title.c +++ b/workbench/libs/muimaster/classes/title.c @@ -32,17 +32,18 @@ extern struct Library *MUIMasterBase; && _between(_top(obj) ,(y),_bottom(obj))) -ULONG Tabs_Layout_Function(struct Hook *hook, Object *obj, struct MUI_LayoutMsg *lm) +ULONG Tabs_Layout_Function(struct Hook *hook, Object *obj, + struct MUI_LayoutMsg *lm) { - struct Title_DATA *data = (struct Title_DATA *) hook->h_Data; + struct Title_DATA *data = (struct Title_DATA *)hook->h_Data; switch (lm->lm_Type) { - case MUILM_MINMAX: + case MUILM_MINMAX: { - Object *cstate = (Object *)lm->lm_Children->mlh_Head; + Object *cstate = (Object *) lm->lm_Children->mlh_Head; Object *child; - WORD maxminwidth = 0; + WORD maxminwidth = 0; WORD maxminheight = 0; WORD mintotalwidth = 0; WORD mintotalheight = 0; @@ -50,12 +51,14 @@ ULONG Tabs_Layout_Function(struct Hook *hook, Object *obj, struct MUI_LayoutMsg /* find out biggest widths & heights of our children */ - while((child = NextObject(&cstate))) + while ((child = NextObject(&cstate))) { - if(maxminwidth < MUI_MAXMAX && _minwidth(child) > maxminwidth) - maxminwidth = _minwidth(child); + if (maxminwidth < MUI_MAXMAX + && _minwidth(child) > maxminwidth) + maxminwidth = _minwidth(child); - if(maxminheight < MUI_MAXMAX && _minheight(child) > maxminheight) + if (maxminheight < MUI_MAXMAX + && _minheight(child) > maxminheight) maxminheight = _minheight(child); mintotalheight += _minheight(child); @@ -63,67 +66,84 @@ ULONG Tabs_Layout_Function(struct Hook *hook, Object *obj, struct MUI_LayoutMsg number_of_children++; } - if(data->location == MUIV_Tabs_Top) + if (data->location == MUIV_Tabs_Top) { - mintotalwidth = number_of_children * maxminwidth + (number_of_children - 1) * XGET(obj, MUIA_Group_HorizSpacing); - lm->lm_MinMax.MinWidth = lm->lm_MinMax.DefWidth = mintotalwidth; - lm->lm_MinMax.MinHeight = lm->lm_MinMax.DefHeight = maxminheight + 10; - lm->lm_MinMax.MaxWidth = MUI_MAXMAX; - lm->lm_MinMax.MaxHeight = lm->lm_MinMax.DefHeight = maxminheight + 10; + mintotalwidth = + number_of_children * maxminwidth + (number_of_children - + 1) * XGET(obj, MUIA_Group_HorizSpacing); + lm->lm_MinMax.MinWidth = lm->lm_MinMax.DefWidth = + mintotalwidth; + lm->lm_MinMax.MinHeight = lm->lm_MinMax.DefHeight = + maxminheight + 10; + lm->lm_MinMax.MaxWidth = MUI_MAXMAX; + lm->lm_MinMax.MaxHeight = lm->lm_MinMax.DefHeight = + maxminheight + 10; } - else if(data->location == MUIV_Tabs_Left) + else if (data->location == MUIV_Tabs_Left) { - mintotalheight += (number_of_children - 1) * XGET(obj, MUIA_Group_VertSpacing); - lm->lm_MinMax.MinWidth = lm->lm_MinMax.DefWidth = maxminwidth; - lm->lm_MinMax.MinHeight = lm->lm_MinMax.DefHeight = mintotalheight; - lm->lm_MinMax.MaxWidth = lm->lm_MinMax.DefWidth = maxminwidth; + mintotalheight += + (number_of_children - 1) * XGET(obj, + MUIA_Group_VertSpacing); + lm->lm_MinMax.MinWidth = lm->lm_MinMax.DefWidth = + maxminwidth; + lm->lm_MinMax.MinHeight = lm->lm_MinMax.DefHeight = + mintotalheight; + lm->lm_MinMax.MaxWidth = lm->lm_MinMax.DefWidth = + maxminwidth; lm->lm_MinMax.MaxHeight = MUI_MAXMAX; } return 0; } - case MUILM_LAYOUT: + case MUILM_LAYOUT: { APTR cstate; Object *child; LONG number_of_children = 0; cstate = lm->lm_Children->mlh_Head; - while((child = NextObject(&cstate))) + while ((child = NextObject(&cstate))) { number_of_children++; } - if(data->location == MUIV_Tabs_Top) + if (data->location == MUIV_Tabs_Top) { WORD horiz_spacing = XGET(obj, MUIA_Group_HorizSpacing); - WORD childwidth = (lm->lm_Layout.Width - (number_of_children - 1) * horiz_spacing) / number_of_children; - WORD leftovers = lm->lm_Layout.Width - (number_of_children - 1) * horiz_spacing - number_of_children * childwidth; + WORD childwidth = + (lm->lm_Layout.Width - (number_of_children - + 1) * horiz_spacing) / number_of_children; + WORD leftovers = + lm->lm_Layout.Width - (number_of_children - + 1) * horiz_spacing - number_of_children * childwidth; WORD left = 0; cstate = lm->lm_Children->mlh_Head; - while((child = NextObject(&cstate))) + while ((child = NextObject(&cstate))) { WORD cwidth = childwidth; WORD cheight = _height(obj); - if(leftovers-- > 0) + if (leftovers-- > 0) cwidth++; - if(!MUI_Layout(child, left, lm->lm_Layout.Height - cheight, cwidth, cheight - 10, 0)) - return(FALSE); + if (!MUI_Layout(child, left, + lm->lm_Layout.Height - cheight, cwidth, + cheight - 10, 0)) + return (FALSE); left += cwidth + horiz_spacing; } } - else if(data->location == MUIV_Tabs_Left) + else if (data->location == MUIV_Tabs_Left) { WORD vert_spacing = XGET(obj, MUIA_Group_VertSpacing); WORD top = 0; cstate = lm->lm_Children->mlh_Head; - while((child = NextObject(&cstate))) + while ((child = NextObject(&cstate))) { WORD cheight = _minheight(child); - if(!MUI_Layout(child, 0, top, lm->lm_Layout.Width, cheight, 0)) - return(FALSE); + if (!MUI_Layout(child, 0, top, lm->lm_Layout.Width, + cheight, 0)) + return (FALSE); top += cheight + vert_spacing; } @@ -147,20 +167,19 @@ IPTR Title__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) LONG location = MUIV_Tabs_Top; layout_hook = AllocVec(sizeof(struct Hook), MEMF_ANY | MEMF_CLEAR); - if (!layout_hook) return (IPTR) NULL; + if (!layout_hook) + return (IPTR) NULL; layout_hook->h_Entry = HookEntry; - layout_hook->h_SubEntry = (HOOKFUNC)Tabs_Layout_Function; + layout_hook->h_SubEntry = (HOOKFUNC) Tabs_Layout_Function; obj = (Object *) DoSuperNewTags - ( - cl, obj, NULL, + (cl, obj, NULL, MUIA_Group_Horiz, TRUE, MUIA_Group_LayoutHook, (IPTR) layout_hook, - MUIA_ShowSelState, FALSE, - TAG_MORE, (IPTR) msg->ops_AttrList - ); - if (!obj) return FALSE; + MUIA_ShowSelState, FALSE, TAG_MORE, (IPTR) msg->ops_AttrList); + if (!obj) + return FALSE; data = INST_DATA(cl, obj); @@ -174,13 +193,14 @@ IPTR Title__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) like for example close button, hence the low priority value */ data->ehn.ehn_Events = IDCMP_MOUSEBUTTONS; data->ehn.ehn_Priority = -7; - data->ehn.ehn_Flags = 0; - data->ehn.ehn_Object = obj; - data->ehn.ehn_Class = cl; + data->ehn.ehn_Flags = 0; + data->ehn.ehn_Object = obj; + data->ehn.ehn_Class = cl; - D(bug("muimaster.library/title.c: Title Object created at 0x%lx\n",obj)); + D(bug("muimaster.library/title.c: Title Object created at 0x%lx\n", + obj)); - return (IPTR)obj; + return (IPTR) obj; } IPTR Title__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) @@ -194,62 +214,60 @@ IPTR Title__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) IPTR Title__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) { struct Title_DATA *data = INST_DATA(cl, obj); - struct TagItem *tags = msg->ops_AttrList; + struct TagItem *tags = msg->ops_AttrList; struct TagItem *tag; while ((tag = NextTagItem(&tags)) != NULL) { - switch(tag->ti_Tag) + switch (tag->ti_Tag) { - case MUIA_Group_ActivePage: + case MUIA_Group_ActivePage: { if (data->activetab != tag->ti_Data) { data->oldactivetab = data->activetab; data->activetab = tag->ti_Data; MUI_Redraw(obj, MADF_DRAWUPDATE); - set(_parent(obj), MUIA_Group_ActivePage, data->activetab); + set(_parent(obj), MUIA_Group_ActivePage, + data->activetab); } break; } } } - return DoSuperMethodA(cl, obj, (Msg)msg); + return DoSuperMethodA(cl, obj, (Msg) msg); } /* MUIM_Draw helpers */ /* Similar like in Register class */ -static void DrawTopTab(Object *obj, struct Title_DATA *data, BOOL active, WORD x1, WORD y1, WORD x2, WORD y2) +static void DrawTopTab(Object *obj, struct Title_DATA *data, BOOL active, + WORD x1, WORD y1, WORD x2, WORD y2) { if (!active) { - /* Clear the rounded edges of an unactive tab with default background */ - - DoMethod(obj,MUIM_DrawParentBackground, (IPTR) x1, (IPTR) y1, - (IPTR) 1, (IPTR) 3, - (IPTR) x1, (IPTR) y1, (IPTR) 0); - DoMethod(obj,MUIM_DrawParentBackground, (IPTR) x1 + 1, (IPTR) y1, - (IPTR) 1, (IPTR) 2, - (IPTR) x1 + 1, (IPTR) y1, (IPTR) 0); - DoMethod(obj,MUIM_DrawParentBackground, (IPTR) x1 + 2, (IPTR) y1, - (IPTR) 1, (IPTR) 1, - (IPTR) x1 + 2, (IPTR) y1, (IPTR) 0); - DoMethod(obj,MUIM_DrawParentBackground, (IPTR) x2 - 3, (IPTR) y1, - (IPTR) 3, (IPTR) 1, - (IPTR) x2 - 3, (IPTR) y1, (IPTR) 0); - DoMethod(obj,MUIM_DrawParentBackground, (IPTR) x2 - 1, (IPTR) y1, - (IPTR) 1, (IPTR) 2, - (IPTR) x2 - 1, (IPTR) y1, (IPTR) 0); - DoMethod(obj,MUIM_DrawParentBackground, (IPTR) x2, (IPTR) y1, - (IPTR) 1, (IPTR) 3, - (IPTR) x2, (IPTR) y1, (IPTR) 0); + /* Clear the rounded edges of an inactive tab with default + * background */ + + DoMethod(obj, MUIM_DrawParentBackground, (IPTR) x1, (IPTR) y1, + (IPTR) 1, (IPTR) 3, (IPTR) x1, (IPTR) y1, (IPTR) 0); + DoMethod(obj, MUIM_DrawParentBackground, (IPTR) x1 + 1, (IPTR) y1, + (IPTR) 1, (IPTR) 2, (IPTR) x1 + 1, (IPTR) y1, (IPTR) 0); + DoMethod(obj, MUIM_DrawParentBackground, (IPTR) x1 + 2, (IPTR) y1, + (IPTR) 1, (IPTR) 1, (IPTR) x1 + 2, (IPTR) y1, (IPTR) 0); + DoMethod(obj, MUIM_DrawParentBackground, (IPTR) x2 - 3, (IPTR) y1, + (IPTR) 3, (IPTR) 1, (IPTR) x2 - 3, (IPTR) y1, (IPTR) 0); + DoMethod(obj, MUIM_DrawParentBackground, (IPTR) x2 - 1, (IPTR) y1, + (IPTR) 1, (IPTR) 2, (IPTR) x2 - 1, (IPTR) y1, (IPTR) 0); + DoMethod(obj, MUIM_DrawParentBackground, (IPTR) x2, (IPTR) y1, + (IPTR) 1, (IPTR) 3, (IPTR) x2, (IPTR) y1, (IPTR) 0); } /* top horiz bar */ SetAPen(_rp(obj), _pens(obj)[MPEN_SHINE]); RectFill(_rp(obj), x1 + 4, y1, x2 - 4, y1); + /* left vert bar */ RectFill(_rp(obj), x1, y1 + 4, x1, y2 - (active ? 2 : 1)); WritePixel(_rp(obj), x1 + 1, y1 + 3); @@ -295,36 +313,33 @@ static void DrawTopTab(Object *obj, struct Title_DATA *data, BOOL active, WORD x } /* Like above, just symetrically flipped */ -static void DrawLeftTab(Object *obj, struct Title_DATA *data, BOOL active, WORD x1, WORD y1, WORD x2, WORD y2) +static void DrawLeftTab(Object *obj, struct Title_DATA *data, BOOL active, + WORD x1, WORD y1, WORD x2, WORD y2) { if (!active) { - /* Clear the rounded edges of an unactive tab with default background */ - - DoMethod(obj,MUIM_DrawParentBackground, (IPTR) x1, (IPTR) y1, - (IPTR) 3, (IPTR) 1, - (IPTR) x1, (IPTR) y1, (IPTR) 0); - DoMethod(obj,MUIM_DrawParentBackground, (IPTR) x1, (IPTR) y1 + 1, - (IPTR) 2, (IPTR) 1, - (IPTR) x1, (IPTR) y1 + 1, (IPTR) 0); - DoMethod(obj,MUIM_DrawParentBackground, (IPTR) x1, (IPTR) y1 + 2, - (IPTR) 1, (IPTR) 1, - (IPTR) x1, (IPTR) y1 + 2, (IPTR) 0); - DoMethod(obj,MUIM_DrawParentBackground, (IPTR) x1, (IPTR) y2 - 2, - (IPTR) 1, (IPTR) 1, - (IPTR) x1, (IPTR) y2 - 2, (IPTR) 0); - DoMethod(obj,MUIM_DrawParentBackground, (IPTR) x1, (IPTR) y2 - 1, - (IPTR) 2, (IPTR) 1, - (IPTR) x1, (IPTR) y2 - 1, (IPTR) 0); - DoMethod(obj,MUIM_DrawParentBackground, (IPTR) x1, (IPTR) y2, - (IPTR) 3, (IPTR) 1, - (IPTR) x1, (IPTR) y2, (IPTR) 0); + /* Clear the rounded edges of an inactive tab with default + * background */ + + DoMethod(obj, MUIM_DrawParentBackground, (IPTR) x1, (IPTR) y1, + (IPTR) 3, (IPTR) 1, (IPTR) x1, (IPTR) y1, (IPTR) 0); + DoMethod(obj, MUIM_DrawParentBackground, (IPTR) x1, (IPTR) y1 + 1, + (IPTR) 2, (IPTR) 1, (IPTR) x1, (IPTR) y1 + 1, (IPTR) 0); + DoMethod(obj, MUIM_DrawParentBackground, (IPTR) x1, (IPTR) y1 + 2, + (IPTR) 1, (IPTR) 1, (IPTR) x1, (IPTR) y1 + 2, (IPTR) 0); + DoMethod(obj, MUIM_DrawParentBackground, (IPTR) x1, (IPTR) y2 - 2, + (IPTR) 1, (IPTR) 1, (IPTR) x1, (IPTR) y2 - 2, (IPTR) 0); + DoMethod(obj, MUIM_DrawParentBackground, (IPTR) x1, (IPTR) y2 - 1, + (IPTR) 2, (IPTR) 1, (IPTR) x1, (IPTR) y2 - 1, (IPTR) 0); + DoMethod(obj, MUIM_DrawParentBackground, (IPTR) x1, (IPTR) y2, + (IPTR) 3, (IPTR) 1, (IPTR) x1, (IPTR) y2, (IPTR) 0); } /* left vert bar */ SetAPen(_rp(obj), _pens(obj)[MPEN_SHINE]); RectFill(_rp(obj), x1, y1 + 4, x1, y2 - 4); + /* top horiz bar */ RectFill(_rp(obj), x1 + 4, y1, x2 - (active ? 2 : 1), y1); WritePixel(_rp(obj), x1 + 1, y1 + 3); @@ -370,7 +385,7 @@ static void DrawLeftTab(Object *obj, struct Title_DATA *data, BOOL active, WORD } /* Drawing code */ -IPTR Tab__MUIM_Draw(Object * child, struct Title_DATA * data, LONG active) +IPTR Tab__MUIM_Draw(Object *child, struct Title_DATA *data, LONG active) { WORD x1 = _left(child); WORD y1 = _top(child); @@ -388,16 +403,17 @@ IPTR Tab__MUIM_Draw(Object * child, struct Title_DATA * data, LONG active) } /* Draw tab frame */ - if(data->location == MUIV_Tabs_Top) + if (data->location == MUIV_Tabs_Top) DrawTopTab(child, data, (active == 1), x1, y1, x2, y2); - else if(data->location == MUIV_Tabs_Left) + else if (data->location == MUIV_Tabs_Left) DrawLeftTab(child, data, (active == 1), x1, y1, x2, y2); return TRUE; } /* MUIM_Draw helpers */ -IPTR Title__MUIM_Draw(struct IClass *cl, Object *obj, struct MUIP_Draw *msg) +IPTR Title__MUIM_Draw(struct IClass *cl, Object *obj, + struct MUIP_Draw *msg) { struct Title_DATA *data = INST_DATA(cl, obj); struct List *children = NULL; @@ -408,10 +424,10 @@ IPTR Title__MUIM_Draw(struct IClass *cl, Object *obj, struct MUIP_Draw *msg) LONG tab = 0; /* Draw all the children */ - DoSuperMethodA(cl,obj,(Msg)msg); + DoSuperMethodA(cl, obj, (Msg) msg); if (!(msg->flags & (MADF_DRAWOBJECT | MADF_DRAWUPDATE))) - return(0); + return (0); /* Now draw missing TabbedGroup border between the spaces */ @@ -435,23 +451,26 @@ IPTR Title__MUIM_Draw(struct IClass *cl, Object *obj, struct MUIP_Draw *msg) child = NextObject(&cstate); SetAPen(_rp(obj), _pens(obj)[MPEN_SHINE]); - if(data->location == MUIV_Tabs_Top) + if (data->location == MUIV_Tabs_Top) { - while(child && (child = NextObject(&cstate))) + while (child && (child = NextObject(&cstate))) { - RectFill(_rp(obj), _left(child) - horiz_spacing, _bottom(child), _left(child) - 1, _bottom(child)); + RectFill(_rp(obj), _left(child) - horiz_spacing, _bottom(child), + _left(child) - 1, _bottom(child)); } } - else if(data->location == MUIV_Tabs_Left) + else if (data->location == MUIV_Tabs_Left) { WORD lasty = -1; - while(child && (child = NextObject(&cstate))) + while (child && (child = NextObject(&cstate))) { - RectFill(_rp(obj), _right(child), _top(child) - vert_spacing, _right(child), _top(child) - 1); + RectFill(_rp(obj), _right(child), _top(child) - vert_spacing, + _right(child), _top(child) - 1); lasty = _bottom(child); } if (lasty > -1) - RectFill(_rp(obj), _right(obj), lasty + 1, _right(obj), _bottom(obj)); + RectFill(_rp(obj), _right(obj), lasty + 1, _right(obj), + _bottom(obj)); } else return FALSE; @@ -462,56 +481,61 @@ IPTR Title__MUIM_Draw(struct IClass *cl, Object *obj, struct MUIP_Draw *msg) return TRUE; } -IPTR Title__MUIM_Setup(struct IClass *cl, Object *obj, struct MUIP_Setup *msg) +IPTR Title__MUIM_Setup(struct IClass *cl, Object *obj, + struct MUIP_Setup *msg) { struct Title_DATA *data = INST_DATA(cl, obj); - if(!DoSuperMethodA(cl, obj, (Msg) msg)) + if (!DoSuperMethodA(cl, obj, (Msg) msg)) return FALSE; get(_parent(obj), MUIA_Background, &data->background); - DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR)&data->ehn); + DoMethod(_win(obj), MUIM_Window_AddEventHandler, (IPTR) & data->ehn); return TRUE; } -IPTR Title__MUIM_Cleanup(struct IClass *cl, Object *obj, struct MUIP_Cleanup *msg) +IPTR Title__MUIM_Cleanup(struct IClass *cl, Object *obj, + struct MUIP_Cleanup *msg) { struct Title_DATA *data = INST_DATA(cl, obj); - DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR)&data->ehn); + DoMethod(_win(obj), MUIM_Window_RemEventHandler, (IPTR) & data->ehn); return DoSuperMethodA(cl, obj, (Msg) msg); } -IPTR Title__MUIM_HandleEvent(struct IClass *cl, Object *obj, struct MUIP_HandleEvent *msg) +IPTR Title__MUIM_HandleEvent(struct IClass *cl, Object *obj, + struct MUIP_HandleEvent *msg) { if (!msg->imsg) return 0; switch (msg->imsg->Class) { - case IDCMP_MOUSEBUTTONS: - if (msg->imsg->Code == SELECTDOWN && _isinobj(msg->imsg->MouseX, msg->imsg->MouseY,obj)) - { - struct List *children = (struct List*) XGET(obj, MUIA_Group_ChildList); - APTR cstate = children->lh_Head; - Object *child; - int i; + case IDCMP_MOUSEBUTTONS: + if (msg->imsg->Code == SELECTDOWN + && _isinobj(msg->imsg->MouseX, msg->imsg->MouseY, obj)) + { + struct List *children = + (struct List *)XGET(obj, MUIA_Group_ChildList); + APTR cstate = children->lh_Head; + Object *child; + int i; - /* Find previous and next tab */ - for(i = 0; (child = NextObject(&cstate)); i++) + /* Find previous and next tab */ + for (i = 0; (child = NextObject(&cstate)); i++) + { + if (_isinobj(msg->imsg->MouseX, msg->imsg->MouseY, child)) { - if(_isinobj(msg->imsg->MouseX, msg->imsg->MouseY,child)) - { - /* Activate this tab */ - set(obj, MUIA_Group_ActivePage, i); - break; - } + /* Activate this tab */ + set(obj, MUIA_Group_ActivePage, i); + break; } } - break; + } + break; } return 0; } @@ -521,14 +545,23 @@ BOOPSI_DISPATCHER(IPTR, Title_Dispatcher, cl, obj, msg) { switch (msg->MethodID) { - case OM_NEW: return Title__OM_NEW(cl, obj, (struct opSet *)msg); - case OM_SET: return Title__OM_SET(cl, obj, (struct opSet *)msg); - case OM_DISPOSE: return Title_OM_DISPOSE(cl, obj, msg); - case MUIM_Draw: return Title__MUIM_Draw(cl, obj, (struct MUIP_Draw *)msg); - case MUIM_Setup: return Title__MUIM_Setup(cl, obj, (struct MUIP_Setup *)msg); - case MUIM_Cleanup: return Title__MUIM_Cleanup(cl, obj, (struct MUIP_Cleanup *)msg); - case MUIM_HandleEvent: return Title__MUIM_HandleEvent(cl, obj, (struct MUIP_HandleEvent *)msg); - default: return DoSuperMethodA(cl, obj, msg); + case OM_NEW: + return Title__OM_NEW(cl, obj, (struct opSet *)msg); + case OM_SET: + return Title__OM_SET(cl, obj, (struct opSet *)msg); + case OM_DISPOSE: + return Title_OM_DISPOSE(cl, obj, msg); + case MUIM_Draw: + return Title__MUIM_Draw(cl, obj, (struct MUIP_Draw *)msg); + case MUIM_Setup: + return Title__MUIM_Setup(cl, obj, (struct MUIP_Setup *)msg); + case MUIM_Cleanup: + return Title__MUIM_Cleanup(cl, obj, (struct MUIP_Cleanup *)msg); + case MUIM_HandleEvent: + return Title__MUIM_HandleEvent(cl, obj, + (struct MUIP_HandleEvent *)msg); + default: + return DoSuperMethodA(cl, obj, msg); } } BOOPSI_DISPATCHER_END @@ -538,6 +571,6 @@ const struct __MUIBuiltinClass _MUI_Title_desc = MUIC_Title, MUIC_Group, sizeof(struct Title_DATA), - (void*)Title_Dispatcher + (void *) Title_Dispatcher }; #endif /* ZUNE_BUILTIN_TITLE */ diff --git a/workbench/libs/muimaster/classes/title.h b/workbench/libs/muimaster/classes/title.h index 2c9e871045..fe9724b914 100644 --- a/workbench/libs/muimaster/classes/title.h +++ b/workbench/libs/muimaster/classes/title.h @@ -15,6 +15,6 @@ /*** Attributes *************************************************************/ -extern const struct __MUIBuiltinClass _MUI_Title_desc; /* PRIV */ +extern const struct __MUIBuiltinClass _MUI_Title_desc; /* PRIV */ #endif /* _MUI_CLASSES_TITLE_H */ diff --git a/workbench/libs/muimaster/classes/virtgroup.c b/workbench/libs/muimaster/classes/virtgroup.c index 27e5e12c4e..a5fde8756d 100644 --- a/workbench/libs/muimaster/classes/virtgroup.c +++ b/workbench/libs/muimaster/classes/virtgroup.c @@ -26,11 +26,8 @@ extern struct Library *MUIMasterBase; IPTR Virtgroup__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) { return DoSuperNewTags - ( - cl, obj, NULL, - MUIA_Group_Virtual, TRUE, - TAG_MORE, (IPTR) msg->ops_AttrList - ); + (cl, obj, NULL, + MUIA_Group_Virtual, TRUE, TAG_MORE, (IPTR) msg->ops_AttrList); } #if ZUNE_BUILTIN_VIRTGROUP @@ -38,17 +35,19 @@ BOOPSI_DISPATCHER(IPTR, Virtgroup_Dispatcher, cl, obj, msg) { switch (msg->MethodID) { - case OM_NEW: return Virtgroup__OM_NEW(cl, obj, (struct opSet *)msg); - default: return DoSuperMethodA(cl, obj, msg); + case OM_NEW: + return Virtgroup__OM_NEW(cl, obj, (struct opSet *)msg); + default: + return DoSuperMethodA(cl, obj, msg); } } BOOPSI_DISPATCHER_END const struct __MUIBuiltinClass _MUI_Virtgroup_desc = -{ - MUIC_Virtgroup, - MUIC_Group, - 0, - (void*)Virtgroup_Dispatcher +{ + MUIC_Virtgroup, + MUIC_Group, + 0, + (void *) Virtgroup_Dispatcher }; #endif /* ZUNE_BUILTIN_VIRTGROUP */ diff --git a/workbench/libs/muimaster/classes/virtgroup.h b/workbench/libs/muimaster/classes/virtgroup.h index 5fe73d8321..92012f07ab 100644 --- a/workbench/libs/muimaster/classes/virtgroup.h +++ b/workbench/libs/muimaster/classes/virtgroup.h @@ -10,19 +10,21 @@ #define MUIC_Virtgroup "Virtgroup.mui" /*** Identifier base (for Zune extensions) **********************************/ -#define MUIB_Virtgroup (MUIB_ZUNE | 0x00003700) +#define MUIB_Virtgroup (MUIB_ZUNE | 0x00003700) /*** Attributes *************************************************************/ -#define MUIA_Virtgroup_Height (MUIB_MUI|0x00423038) /* V6 ..g LONG */ -#define MUIA_Virtgroup_Input (MUIB_MUI|0x00427f7e) /* V11 i.. BOOL */ -#define MUIA_Virtgroup_Left (MUIB_MUI|0x00429371) /* V6 isg LONG */ -#define MUIA_Virtgroup_Top (MUIB_MUI|0x00425200) /* V6 isg LONG */ -#define MUIA_Virtgroup_Width (MUIB_MUI|0x00427c49) /* V6 ..g LONG */ +#define MUIA_Virtgroup_Height (MUIB_MUI | 0x00423038) /* V6 ..g LONG */ +#define MUIA_Virtgroup_Input (MUIB_MUI | 0x00427f7e) /* V11 i.. BOOL */ +#define MUIA_Virtgroup_Left (MUIB_MUI | 0x00429371) /* V6 isg LONG */ +#define MUIA_Virtgroup_Top (MUIB_MUI | 0x00425200) /* V6 isg LONG */ +#define MUIA_Virtgroup_Width (MUIB_MUI | 0x00427c49) /* V6 ..g LONG */ -#define MUIA_Virtgroup_MinWidth (MUIB_Virtgroup | 0x00000001) /* Zune: V1 ..g BOOL PRIV */ -#define MUIA_Virtgroup_MinHeight (MUIB_Virtgroup | 0x00000002) /* Zune: V1 ..g BOOL PRIV */ +#define MUIA_Virtgroup_MinWidth \ + (MUIB_Virtgroup | 0x00000001) /* Zune: V1 ..g BOOL PRIV */ +#define MUIA_Virtgroup_MinHeight \ + (MUIB_Virtgroup | 0x00000002) /* Zune: V1 ..g BOOL PRIV */ -extern const struct __MUIBuiltinClass _MUI_Virtgroup_desc; /* PRIV */ +extern const struct __MUIBuiltinClass _MUI_Virtgroup_desc; /* PRIV */ #endif /* _MUI_CLASSES_VIRTGROUP_H */ diff --git a/workbench/libs/muimaster/classes/volumelist.c b/workbench/libs/muimaster/classes/volumelist.c dissimilarity index 68% index cc056fd14a..1477f7846b 100644 --- a/workbench/libs/muimaster/classes/volumelist.c +++ b/workbench/libs/muimaster/classes/volumelist.c @@ -1,261 +1,275 @@ -/* - Copyright © 2002-2011, The AROS Development Team. All rights reserved. - $Id$ -*/ - -#define MUIMASTER_YES_INLINE_STDARG - -#include <exec/memory.h> -#include <clib/alib_protos.h> -#include <proto/exec.h> -#include <proto/dos.h> -#include <proto/intuition.h> -#include <proto/utility.h> -#include <proto/muimaster.h> - -#include <string.h> -#include <stdio.h> - -#include "mui.h" -#include "muimaster_intern.h" -#include "support.h" -#include "support_classes.h" -#include "volumelist_private.h" - -extern struct Library *MUIMasterBase; - - -static void printSize(STRPTR string, size_t bufsize, UQUAD size) -{ - char unit = 'B'; - - if (size >= 9999999999ULL) - { - size = size >> 30; - unit = 'G'; - } - else if (size >= 9999999UL) - { - size = size >> 20; - unit = 'M'; - } - else if (size > 9999) - { - size = size >> 10; - unit = 'K'; - } - - snprintf(string, bufsize, "%u%c", (unsigned int)size, unit); - string[bufsize - 1] = '\0'; -} - -AROS_UFH3S(APTR, construct_func, -AROS_UFHA(struct Hook *, hook, A0), -AROS_UFHA(APTR, pool, A2), -AROS_UFHA(struct Volumelist_Entry *, entry, A1)) -{ - AROS_USERFUNC_INIT - - struct Volumelist_Entry *new; - - if ((new = AllocPooled(pool, sizeof(*new)))) - { - *new = *entry; - } - return new; - - AROS_USERFUNC_EXIT -} - -AROS_UFH3S(void, destruct_func, -AROS_UFHA(struct Hook *, hook, A0), -AROS_UFHA(APTR, pool, A2), -AROS_UFHA(struct Volumelist_Entry *, entry, A1)) -{ - AROS_USERFUNC_INIT - - FreePooled(pool, entry, sizeof(struct Volumelist_Entry)); - - AROS_USERFUNC_EXIT -} - -AROS_UFH3S(LONG, display_func, -AROS_UFHA(struct Hook *, hook, A0), -AROS_UFHA(char **, array, A2), -AROS_UFHA(struct Volumelist_Entry *, entry, A1)) -{ - AROS_USERFUNC_INIT - - /* MUI: logo | devicename | %-used | bytes free | bytes used */ - - if (entry) - { - if (entry->type == DLT_DEVICE) - { - *array++ = "\33I[6:24]"; - } - else if (entry->type == DLT_VOLUME) - { - *array++ = "\33I[6:26]"; - } - else - { - *array++ = "\33I[6:29]"; - } - - *array++ = entry->name; - *array++ = entry->full; - *array++ = entry->free; - *array = entry->used; - } - else - { - *array++ = ""; - *array++ = "Name"; - *array++ = "full"; - *array++ = "free"; - *array = "used"; - } - - return 0; - - AROS_USERFUNC_EXIT -} - - -IPTR Volumelist__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) -{ - struct DosList *dl, *actdl; - - STRPTR format = (STRPTR)GetTagData(MUIA_List_Format, 0, msg->ops_AttrList); - - obj = (Object *)DoSuperNewTags - ( - cl, obj, NULL, - MUIA_List_Format, format - ? TAG_IGNORE - : (IPTR)",,P=\33r,P=\33r,P=\33r", - TAG_MORE, (IPTR) msg->ops_AttrList - ); - - if (obj) - { - struct Volumelist_DATA *data = INST_DATA(cl, obj); - - data->construct_hook.h_Entry = (HOOKFUNC)construct_func; - data->destruct_hook.h_Entry = (HOOKFUNC)destruct_func; - data->display_hook.h_Entry = (HOOKFUNC)display_func; - - SetAttrs(obj, MUIA_List_ConstructHook, (IPTR)&data->construct_hook, - MUIA_List_DestructHook, (IPTR)&data->destruct_hook, - MUIA_List_DisplayHook, (IPTR)&data->display_hook, - TAG_DONE); - - dl = LockDosList(LDF_READ | LDF_VOLUMES | LDF_ASSIGNS | LDF_DEVICES); - - actdl = dl; - while((actdl = NextDosEntry(actdl, LDF_DEVICES))) - { - struct Volumelist_Entry entry; - - entry.full[0] = '\0'; - entry.free[0] = '\0'; - entry.used[0] = '\0'; - - entry.type = DLT_DEVICE; - - strncpy(entry.name, AROS_BSTR_ADDR(actdl->dol_Name), sizeof(entry.name)); - entry.name[sizeof(entry.name) - 2] = '\0'; - strcat(entry.name, ":"); - - DoMethod(obj, MUIM_List_InsertSingle, (IPTR)&entry, MUIV_List_Insert_Bottom); - } - - actdl = dl; - while((actdl = NextDosEntry(actdl, LDF_VOLUMES))) - { - struct Volumelist_Entry entry; - struct InfoData diskinfo; - BPTR lock; - UQUAD free; - UQUAD used; - - entry.full[0] = '\0'; - entry.free[0] = '\0'; - entry.used[0] = '\0'; - - entry.type = DLT_VOLUME; - - strncpy(entry.name, AROS_BSTR_ADDR(actdl->dol_Name), sizeof(entry.name)); - entry.name[sizeof(entry.name) - 2] = '\0'; - strcat(entry.name, ":"); - - if ((lock = Lock(entry.name, SHARED_LOCK)) != BNULL) - { - if (Info(lock, &diskinfo) != DOSFALSE) - { - snprintf - ( - entry.full, - sizeof(entry.full), - "%ld%%", - (long)(100 * diskinfo.id_NumBlocksUsed / diskinfo.id_NumBlocks) - ); - entry.full[sizeof(entry.full) - 1] = '\0'; - - used = (UQUAD)diskinfo.id_NumBlocksUsed * diskinfo.id_BytesPerBlock; - free = (UQUAD)diskinfo.id_NumBlocks * diskinfo.id_BytesPerBlock - used; - printSize(entry.free, sizeof entry.free, free); - printSize(entry.used, sizeof entry.used, used); - } - UnLock(lock); - } - - DoMethod(obj, MUIM_List_InsertSingle, (IPTR)&entry, MUIV_List_Insert_Bottom); - } - - actdl = dl; - while((actdl = NextDosEntry(actdl, LDF_ASSIGNS))) - { - struct Volumelist_Entry entry; - - entry.full[0] = '\0'; - entry.free[0] = '\0'; - entry.used[0] = '\0'; - - entry.type = DLT_DIRECTORY; - - strncpy(entry.name, AROS_BSTR_ADDR(actdl->dol_Name), sizeof(entry.name)); - entry.name[sizeof(entry.name) - 2] = '\0'; - strcat(entry.name, ":"); - - DoMethod(obj, MUIM_List_InsertSingle, (IPTR)&entry, MUIV_List_Insert_Bottom); - } - - UnLockDosList(LDF_READ | LDF_VOLUMES | LDF_ASSIGNS | LDF_DEVICES); - } - - return (IPTR)obj; -} - - -#if ZUNE_BUILTIN_VOLUMELIST -BOOPSI_DISPATCHER(IPTR, Volumelist_Dispatcher, cl, obj, msg) -{ - switch (msg->MethodID) - { - case OM_NEW: return Volumelist__OM_NEW(cl, obj, (struct opSet *)msg); - - default: return DoSuperMethodA(cl, obj, msg); - } -} -BOOPSI_DISPATCHER_END - -const struct __MUIBuiltinClass _MUI_Volumelist_desc = -{ - MUIC_Volumelist, - MUIC_List, - sizeof(struct Volumelist_DATA), - (void*)Volumelist_Dispatcher -}; -#endif /* ZUNE_BUILTIN_VOLUMELIST */ +/* + Copyright © 2002-2011, The AROS Development Team. All rights reserved. + $Id$ +*/ + +#define MUIMASTER_YES_INLINE_STDARG + +#include <exec/memory.h> +#include <clib/alib_protos.h> +#include <proto/exec.h> +#include <proto/dos.h> +#include <proto/intuition.h> +#include <proto/utility.h> +#include <proto/muimaster.h> + +#include <string.h> +#include <stdio.h> + +#include "mui.h" +#include "muimaster_intern.h" +#include "support.h" +#include "support_classes.h" +#include "volumelist_private.h" + +extern struct Library *MUIMasterBase; + + +static void printSize(STRPTR string, size_t bufsize, UQUAD size) +{ + char unit = 'B'; + + if (size >= 9999999999ULL) + { + size = size >> 30; + unit = 'G'; + } + else if (size >= 9999999UL) + { + size = size >> 20; + unit = 'M'; + } + else if (size > 9999) + { + size = size >> 10; + unit = 'K'; + } + + snprintf(string, bufsize, "%u%c", (unsigned int)size, unit); + string[bufsize - 1] = '\0'; +} + +AROS_UFH3S(APTR, construct_func, + AROS_UFHA(struct Hook *, hook, A0), + AROS_UFHA(APTR, pool, A2), + AROS_UFHA(struct Volumelist_Entry *, entry, A1)) +{ + AROS_USERFUNC_INIT + + struct Volumelist_Entry *new; + + if ((new = AllocPooled(pool, sizeof(*new)))) + { + *new = *entry; + } + return new; + + AROS_USERFUNC_EXIT +} + +AROS_UFH3S(void, destruct_func, + AROS_UFHA(struct Hook *, hook, A0), + AROS_UFHA(APTR, pool, A2), + AROS_UFHA(struct Volumelist_Entry *, entry, A1)) +{ + AROS_USERFUNC_INIT + + FreePooled(pool, entry, sizeof(struct Volumelist_Entry)); + + AROS_USERFUNC_EXIT +} + +AROS_UFH3S(LONG, display_func, + AROS_UFHA(struct Hook *, hook, A0), + AROS_UFHA(char **, array, A2), + AROS_UFHA(struct Volumelist_Entry *, entry, A1)) +{ + AROS_USERFUNC_INIT + + /* MUI: logo | devicename | %-used | bytes free | bytes used */ + + if (entry) + { + if (entry->type == DLT_DEVICE) + { + *array++ = "\33I[6:24]"; + } + else if (entry->type == DLT_VOLUME) + { + *array++ = "\33I[6:26]"; + } + else + { + *array++ = "\33I[6:29]"; + } + + *array++ = entry->name; + *array++ = entry->full; + *array++ = entry->free; + *array = entry->used; + } + else + { + *array++ = ""; + *array++ = "Name"; + *array++ = "full"; + *array++ = "free"; + *array = "used"; + } + + return 0; + + AROS_USERFUNC_EXIT +} + + +IPTR Volumelist__OM_NEW(struct IClass *cl, Object *obj, + struct opSet *msg) +{ + struct DosList *dl, *actdl; + + STRPTR format = + (STRPTR) GetTagData(MUIA_List_Format, 0, msg->ops_AttrList); + + obj = (Object *)DoSuperNewTags + ( + cl, obj, NULL, + MUIA_List_Format, format + ? TAG_IGNORE + : (IPTR)",,P=\33r,P=\33r,P=\33r", + TAG_MORE, (IPTR) msg->ops_AttrList + ); + + if (obj) + { + struct Volumelist_DATA *data = INST_DATA(cl, obj); + + data->construct_hook.h_Entry = (HOOKFUNC) construct_func; + data->destruct_hook.h_Entry = (HOOKFUNC) destruct_func; + data->display_hook.h_Entry = (HOOKFUNC) display_func; + + SetAttrs(obj, MUIA_List_ConstructHook, + (IPTR) & data->construct_hook, MUIA_List_DestructHook, + (IPTR) & data->destruct_hook, MUIA_List_DisplayHook, + (IPTR) & data->display_hook, TAG_DONE); + + dl = LockDosList(LDF_READ | LDF_VOLUMES | LDF_ASSIGNS | + LDF_DEVICES); + + actdl = dl; + while ((actdl = NextDosEntry(actdl, LDF_DEVICES))) + { + struct Volumelist_Entry entry; + + entry.full[0] = '\0'; + entry.free[0] = '\0'; + entry.used[0] = '\0'; + + entry.type = DLT_DEVICE; + + strncpy(entry.name, AROS_BSTR_ADDR(actdl->dol_Name), + sizeof(entry.name)); + entry.name[sizeof(entry.name) - 2] = '\0'; + strcat(entry.name, ":"); + + DoMethod(obj, MUIM_List_InsertSingle, (IPTR) & entry, + MUIV_List_Insert_Bottom); + } + + actdl = dl; + while ((actdl = NextDosEntry(actdl, LDF_VOLUMES))) + { + struct Volumelist_Entry entry; + struct InfoData diskinfo; + BPTR lock; + UQUAD free; + UQUAD used; + + entry.full[0] = '\0'; + entry.free[0] = '\0'; + entry.used[0] = '\0'; + + entry.type = DLT_VOLUME; + + strncpy(entry.name, AROS_BSTR_ADDR(actdl->dol_Name), + sizeof(entry.name)); + entry.name[sizeof(entry.name) - 2] = '\0'; + strcat(entry.name, ":"); + + if ((lock = Lock(entry.name, SHARED_LOCK)) != BNULL) + { + if (Info(lock, &diskinfo) != DOSFALSE) + { + snprintf + (entry.full, + sizeof(entry.full), + "%ld%%", + (long)(100 * diskinfo.id_NumBlocksUsed / + diskinfo.id_NumBlocks)); + entry.full[sizeof(entry.full) - 1] = '\0'; + + used = + (UQUAD) diskinfo.id_NumBlocksUsed * + diskinfo.id_BytesPerBlock; + free = + (UQUAD) diskinfo.id_NumBlocks * + diskinfo.id_BytesPerBlock - used; + printSize(entry.free, sizeof entry.free, free); + printSize(entry.used, sizeof entry.used, used); + } + UnLock(lock); + } + + DoMethod(obj, MUIM_List_InsertSingle, (IPTR) & entry, + MUIV_List_Insert_Bottom); + } + + actdl = dl; + while ((actdl = NextDosEntry(actdl, LDF_ASSIGNS))) + { + struct Volumelist_Entry entry; + + entry.full[0] = '\0'; + entry.free[0] = '\0'; + entry.used[0] = '\0'; + + entry.type = DLT_DIRECTORY; + + strncpy(entry.name, AROS_BSTR_ADDR(actdl->dol_Name), + sizeof(entry.name)); + entry.name[sizeof(entry.name) - 2] = '\0'; + strcat(entry.name, ":"); + + DoMethod(obj, MUIM_List_InsertSingle, (IPTR) & entry, + MUIV_List_Insert_Bottom); + } + + UnLockDosList(LDF_READ | LDF_VOLUMES | LDF_ASSIGNS | LDF_DEVICES); + } + + return (IPTR) obj; +} + + +#if ZUNE_BUILTIN_VOLUMELIST +BOOPSI_DISPATCHER(IPTR, Volumelist_Dispatcher, cl, obj, msg) +{ + switch (msg->MethodID) + { + case OM_NEW: + return Volumelist__OM_NEW(cl, obj, (struct opSet *)msg); + + default: + return DoSuperMethodA(cl, obj, msg); + } +} +BOOPSI_DISPATCHER_END + +const struct __MUIBuiltinClass _MUI_Volumelist_desc = +{ + MUIC_Volumelist, + MUIC_List, + sizeof(struct Volumelist_DATA), + (void *) Volumelist_Dispatcher +}; +#endif /* ZUNE_BUILTIN_VOLUMELIST */ diff --git a/workbench/libs/muimaster/classes/volumelist.h b/workbench/libs/muimaster/classes/volumelist.h index 413beb006d..14da073699 100644 --- a/workbench/libs/muimaster/classes/volumelist.h +++ b/workbench/libs/muimaster/classes/volumelist.h @@ -10,8 +10,8 @@ #define MUIC_Volumelist "Volumelist.mui" /*** Identifier base (for Zune extensions) **********************************/ -#define MUIB_Volumelist (MUIB_ZUNE | 0x1600) +#define MUIB_Volumelist (MUIB_ZUNE | 0x1600) -extern const struct __MUIBuiltinClass _MUI_Volumelist_desc; /* PRIV */ +extern const struct __MUIBuiltinClass _MUI_Volumelist_desc; /* PRIV */ #endif /* _MUI_CLASSES_VOLUMELIST_H */ diff --git a/workbench/libs/muimaster/classes/window.c b/workbench/libs/muimaster/classes/window.c index 7efab459eb..dfd33e0021 100644 --- a/workbench/libs/muimaster/classes/window.c +++ b/workbench/libs/muimaster/classes/window.c @@ -27,7 +27,7 @@ #include <proto/gadtools.h> #include <proto/muimaster.h> -#define MUI_OBSOLETE /* for the obsolete menu stuff */ +#define MUI_OBSOLETE /* for the obsolete menu stuff */ #include "mui.h" #include "support.h" @@ -71,43 +71,46 @@ struct MUI_ImageSpec_intern; struct MUI_WindowData { struct MUI_RenderInfo wd_RenderInfo; - struct MUI_MinMax wd_MinMax; - struct IBox wd_AltDim; /* zoomed dimensions */ - BOOL wd_ZoomGadget; /* enable/disable zoomgadget (altdim stuff) */ - APTR wd_MemoryPool; /* for nodes and stuff to deallocate at OM_DISPOSE */ - struct MinList wd_CycleChain; /* objects activated with tab */ - struct MinList wd_EHList; /* event handlers */ - struct MinList wd_CCList; /* control chars */ - struct MinList wd_IDList; /* gadget ids */ - ULONG wd_Events; /* events received */ - ULONG wd_CrtFlags; /* window creation flags, see below */ - Object *wd_ActiveObject; /* the active object */ - Object *wd_OldActive; /* active object before window was closed */ - APTR wd_DefaultObject; - ULONG wd_ID; - STRPTR wd_Title; - STRPTR wd_ScreenTitle; - LONG wd_Height; /* Current dimensions */ - LONG wd_Width; - LONG wd_X; - LONG wd_Y; - LONG wd_ReqHeight; /* given by programmer */ - LONG wd_ReqWidth; - APTR wd_RootObject; /* unique child */ - ULONG wd_Flags; /* various status flags */ + struct MUI_MinMax wd_MinMax; + struct IBox wd_AltDim; /* zoomed dimensions */ + BOOL wd_ZoomGadget; /* enable/disable zoomgadget (altdim stuff) */ + APTR wd_MemoryPool; /* for nodes and stuff to deallocate at + * OM_DISPOSE */ + struct MinList wd_CycleChain; /* objects activated with tab */ + struct MinList wd_EHList; /* event handlers */ + struct MinList wd_CCList; /* control chars */ + struct MinList wd_IDList; /* gadget ids */ + ULONG wd_Events; /* events received */ + ULONG wd_CrtFlags; /* window creation flags, see below */ + Object *wd_ActiveObject; /* the active object */ + Object *wd_OldActive; /* active object before window was closed */ + APTR wd_DefaultObject; + ULONG wd_ID; + STRPTR wd_Title; + STRPTR wd_ScreenTitle; + LONG wd_Height; /* Current dimensions */ + LONG wd_Width; + LONG wd_X; + LONG wd_Y; + LONG wd_ReqHeight; /* given by programmer */ + LONG wd_ReqWidth; + APTR wd_RootObject; /* unique child */ + ULONG wd_Flags; /* various status flags */ struct MUI_ImageSpec_intern *wd_Background; - ULONG wd_DisabledKeys; - BOOL wd_NoMenus; /* MUIA_Window_NoMenus */ - - Object *wd_DragObject; /* the object which is being dragged */ - struct Window *wd_DropWindow; /* the destination window, for faster access */ - Object *wd_DropObject; /* the destination object */ - struct DragNDrop *wd_dnd; + ULONG wd_DisabledKeys; + BOOL wd_NoMenus; /* MUIA_Window_NoMenus */ + + Object *wd_DragObject; /* the object which is being dragged */ + struct Window *wd_DropWindow; /* the destination window, for faster + * access */ + Object *wd_DropObject; /* the destination object */ + struct DragNDrop *wd_dnd; struct MUI_DragImage *wd_DragImage; - Object *wd_Menustrip; /* The menustrip object which is actually is used (either apps or windows or NULL) */ - Object * wd_ChildMenustrip; /* If window has an own Menustrip */ - struct Menu *wd_Menu; /* the intuition menustrip */ + Object *wd_Menustrip; /* The menustrip object which is actually + * used (either apps or windows or NULL) */ + Object *wd_ChildMenustrip; /* If window has an own Menustrip */ + struct Menu *wd_Menu; /* the intuition menustrip */ Object *wd_VertProp; Object *wd_UpButton; @@ -121,18 +124,18 @@ struct MUI_WindowData Object *wd_MUIGadget; Object *wd_HelpObject; - APTR wd_HelpBubble; - WORD wd_HelpTicker; + APTR wd_HelpBubble; + WORD wd_HelpTicker; struct Screen *wd_UserScreen; - STRPTR wd_UserPublicScreen; - LONG wd_XStore; /*store MUIV_Window_LeftEdge_Centered Tags etc - because wd_X is overwritten by a value in CalcDimension - Popup windows work ok on AmiGG when main window is move - */ - LONG wd_YStore; - - WORD wd_SleepCount; /* MUIA_Window_Sleep nests */ + STRPTR wd_UserPublicScreen; + LONG wd_XStore; /* store MUIV_Window_LeftEdge_Centered Tags + * etc. because wd_X is overwritten by a + * value in CalcDimension. Popup windows work + * OK on AmiGG when main window is moved */ + LONG wd_YStore; + + WORD wd_SleepCount; /* MUIA_Window_Sleep nests */ }; #ifndef WFLG_SIZEGADGET @@ -148,21 +151,29 @@ struct MUI_WindowData #endif /* wd_Flags */ -#define MUIWF_OPENED (1<<0) /* window currently opened */ -#define MUIWF_HIDDEN (1<<1) /* window currently iconified */ -#define MUIWF_ACTIVE (1<<2) /* window currently active */ -#define MUIWF_RESIZING (1<<4) /* window currently resizing, for simple refresh */ -#define MUIWF_DONTACTIVATE (1<<7) /* do not activate the window when opening */ -#define MUIWF_USERIGHTSCROLLER (1<<8) /* window should have a right scroller */ -#define MUIWF_USEBOTTOMSCROLLER (1<<9) /* window should have a bottom scroller */ +#define MUIWF_OPENED (1<<0) /* window currently opened */ +#define MUIWF_HIDDEN (1<<1) /* window currently iconified */ +#define MUIWF_ACTIVE (1<<2) /* window currently active */ +#define MUIWF_RESIZING (1<<4) /* window currently resizing, + * for simple refresh */ +#define MUIWF_DONTACTIVATE (1<<7) /* do not activate the window when + * opening */ +#define MUIWF_USERIGHTSCROLLER (1<<8) /* should have right scroller */ +#define MUIWF_USEBOTTOMSCROLLER (1<<9) /* should have bottom scroller */ #define MUIWF_ERASEAREA (1<<10) /* Erase area after a window resize */ -#define MUIWF_ISAPPWINDOW (1<<11) /* Is an app window (user can drop icons on it) */ -#define MUIWF_ISSUBWINDOW (1<<12) /* Dont get automatically disposed with app */ -#define MUIWF_BUBBLEMODE (1<<13) /* Quick bubble mode. Bubbles appear quick when moving */ +#define MUIWF_ISAPPWINDOW (1<<11) /* Is an AppWindow */ +#define MUIWF_ISSUBWINDOW (1<<12) /* Don't get automatically disposed + * with app */ +#define MUIWF_BUBBLEMODE (1<<13) /* Quick bubble mode. Bubbles appear + * quick when moving */ #define MUIWF_OPENONUNHIDE (1<<14) /* Open the window when unhiding */ -#define MUIWF_SCREENLOCKED (1<<15) /* A pub screen was locked in SetupRenderInfo. Unlock it in CleanupRenderInfo! */ -#define MUIWF_OBJECTGOACTIVESENT (1<<16) /* A MUIM_GoActive msg was sent to window's active object */ -#define MUIWF_TOOLBOX (1<<17) /* Window should be opened as ToolBox */ +#define MUIWF_SCREENLOCKED (1<<15) /* A pub screen was locked in + * SetupRenderInfo. Unlock it in + * CleanupRenderInfo! */ +#define MUIWF_OBJECTGOACTIVESENT (1<<16) /* A MUIM_GoActive msg was sent to + * window's active object */ +#define MUIWF_TOOLBOX (1<<17) /* Window should be opened as + * ToolBox */ #define BUBBLEHELP_TICKER_FIRST 10 #define BUBBLEHELP_TICKER_LATER 3 @@ -177,24 +188,22 @@ struct __dummyXFC3__ static ULONG DoHalfshineGun(ULONG a, ULONG b) { - ULONG val = ((((a)>>24) + 3 * ((b)>>24)) / 4); - val = val + (val<<8) + (val<<16) + (val<<24); + ULONG val = ((((a) >> 24) + 3 * ((b) >> 24)) / 4); + val = val + (val << 8) + (val << 16) + (val << 24); return val; } static ULONG DoHalfshadowGun(ULONG a, ULONG b) { - ULONG val = ((((a)>>24) + 5 * ((b)>>24)) / 6); - val = val + (val<<8) + (val<<16) + (val<<24); + ULONG val = ((((a) >> 24) + 5 * ((b) >> 24)) / 6); + val = val + (val << 8) + (val << 16) + (val << 24); return val; } static Object *CreateSysimage(struct DrawInfo *dri, ULONG which) { return NewObject(NULL, "sysiclass", - SYSIA_DrawInfo, (IPTR)dri, - SYSIA_Which, which, - TAG_DONE); + SYSIA_DrawInfo, (IPTR) dri, SYSIA_Which, which, TAG_DONE); } static void EnqueueByPriAndAddress(struct List *list, struct Node *node) @@ -205,14 +214,13 @@ static void EnqueueByPriAndAddress(struct List *list, struct Node *node) "remove - modify - enqueue" sequence will re-add the node at the same place in the list it was initially */ - ForeachNode(list, scannode) { if (((struct Node *)node)->ln_Pri > scannode->ln_Pri) break; if (((struct Node *)node)->ln_Pri == scannode->ln_Pri) { - if ((IPTR)node > (IPTR)scannode) + if ((IPTR) node > (IPTR) scannode) break; } } @@ -229,22 +237,54 @@ static BOOL InitCustomFrames(Object *obj, struct MUI_RenderInfo *mri) mri->mri_FrameImage[i] = NULL; } - mri->mri_FrameImage[0] = load_custom_frame(muiGlobalInfo(obj)->mgi_Prefs->customframe_config_1, mri->mri_Screen); - mri->mri_FrameImage[1] = load_custom_frame(muiGlobalInfo(obj)->mgi_Prefs->customframe_config_2, mri->mri_Screen); - mri->mri_FrameImage[2] = load_custom_frame(muiGlobalInfo(obj)->mgi_Prefs->customframe_config_3, mri->mri_Screen); - mri->mri_FrameImage[3] = load_custom_frame(muiGlobalInfo(obj)->mgi_Prefs->customframe_config_4, mri->mri_Screen); - mri->mri_FrameImage[4] = load_custom_frame(muiGlobalInfo(obj)->mgi_Prefs->customframe_config_5, mri->mri_Screen); - mri->mri_FrameImage[5] = load_custom_frame(muiGlobalInfo(obj)->mgi_Prefs->customframe_config_6, mri->mri_Screen); - mri->mri_FrameImage[6] = load_custom_frame(muiGlobalInfo(obj)->mgi_Prefs->customframe_config_7, mri->mri_Screen); - mri->mri_FrameImage[7] = load_custom_frame(muiGlobalInfo(obj)->mgi_Prefs->customframe_config_8, mri->mri_Screen); - mri->mri_FrameImage[8] = load_custom_frame(muiGlobalInfo(obj)->mgi_Prefs->customframe_config_9, mri->mri_Screen); - mri->mri_FrameImage[9] = load_custom_frame(muiGlobalInfo(obj)->mgi_Prefs->customframe_config_10, mri->mri_Screen); - mri->mri_FrameImage[10] = load_custom_frame(muiGlobalInfo(obj)->mgi_Prefs->customframe_config_11, mri->mri_Screen); - mri->mri_FrameImage[11] = load_custom_frame(muiGlobalInfo(obj)->mgi_Prefs->customframe_config_12, mri->mri_Screen); - mri->mri_FrameImage[12] = load_custom_frame(muiGlobalInfo(obj)->mgi_Prefs->customframe_config_13, mri->mri_Screen); - mri->mri_FrameImage[13] = load_custom_frame(muiGlobalInfo(obj)->mgi_Prefs->customframe_config_14, mri->mri_Screen); - mri->mri_FrameImage[14] = load_custom_frame(muiGlobalInfo(obj)->mgi_Prefs->customframe_config_15, mri->mri_Screen); - mri->mri_FrameImage[15] = load_custom_frame(muiGlobalInfo(obj)->mgi_Prefs->customframe_config_16, mri->mri_Screen); + mri->mri_FrameImage[0] = + load_custom_frame(muiGlobalInfo(obj)->mgi_Prefs-> + customframe_config_1, mri->mri_Screen); + mri->mri_FrameImage[1] = + load_custom_frame(muiGlobalInfo(obj)->mgi_Prefs-> + customframe_config_2, mri->mri_Screen); + mri->mri_FrameImage[2] = + load_custom_frame(muiGlobalInfo(obj)->mgi_Prefs-> + customframe_config_3, mri->mri_Screen); + mri->mri_FrameImage[3] = + load_custom_frame(muiGlobalInfo(obj)->mgi_Prefs-> + customframe_config_4, mri->mri_Screen); + mri->mri_FrameImage[4] = + load_custom_frame(muiGlobalInfo(obj)->mgi_Prefs-> + customframe_config_5, mri->mri_Screen); + mri->mri_FrameImage[5] = + load_custom_frame(muiGlobalInfo(obj)->mgi_Prefs-> + customframe_config_6, mri->mri_Screen); + mri->mri_FrameImage[6] = + load_custom_frame(muiGlobalInfo(obj)->mgi_Prefs-> + customframe_config_7, mri->mri_Screen); + mri->mri_FrameImage[7] = + load_custom_frame(muiGlobalInfo(obj)->mgi_Prefs-> + customframe_config_8, mri->mri_Screen); + mri->mri_FrameImage[8] = + load_custom_frame(muiGlobalInfo(obj)->mgi_Prefs-> + customframe_config_9, mri->mri_Screen); + mri->mri_FrameImage[9] = + load_custom_frame(muiGlobalInfo(obj)->mgi_Prefs-> + customframe_config_10, mri->mri_Screen); + mri->mri_FrameImage[10] = + load_custom_frame(muiGlobalInfo(obj)->mgi_Prefs-> + customframe_config_11, mri->mri_Screen); + mri->mri_FrameImage[11] = + load_custom_frame(muiGlobalInfo(obj)->mgi_Prefs-> + customframe_config_12, mri->mri_Screen); + mri->mri_FrameImage[12] = + load_custom_frame(muiGlobalInfo(obj)->mgi_Prefs-> + customframe_config_13, mri->mri_Screen); + mri->mri_FrameImage[13] = + load_custom_frame(muiGlobalInfo(obj)->mgi_Prefs-> + customframe_config_14, mri->mri_Screen); + mri->mri_FrameImage[14] = + load_custom_frame(muiGlobalInfo(obj)->mgi_Prefs-> + customframe_config_15, mri->mri_Screen); + mri->mri_FrameImage[15] = + load_custom_frame(muiGlobalInfo(obj)->mgi_Prefs-> + customframe_config_16, mri->mri_Screen); return TRUE; } @@ -261,35 +301,33 @@ static void DisposeCustomFrames(struct MUI_RenderInfo *mri) } } -static BOOL SetupRenderInfo(Object *obj, struct MUI_WindowData *data, struct MUI_RenderInfo *mri) +static BOOL SetupRenderInfo(Object *obj, struct MUI_WindowData *data, + struct MUI_RenderInfo *mri) { ULONG rgbtable[3 * 3]; Object *temp_obj; IPTR val; int i; - /* TODO: Move this whole screen locking/opening stuff into the application class - * by creating methods for this purpose */ + /* TODO: Move this whole screen locking/opening stuff into the + * application class by creating methods for this purpose */ - /* If no user screen has been specified try to open the application specifc screen */ + /* If no user screen has been specified try to open the application + * specific screen */ if (!data->wd_UserScreen) { ULONG screenmodeid = muiGlobalInfo(obj)->mgi_Prefs->screenmodeid; if (screenmodeid != ~0) { - if (!muiGlobalInfo(obj)->mgi_CustomScreen) - { - muiGlobalInfo(obj)->mgi_CustomScreen = OpenScreenTags - ( - NULL, - SA_DisplayID, screenmodeid, - SA_SharePens, TRUE, - SA_FullPalette, TRUE, - SA_LikeWorkbench,TRUE, - TAG_DONE - ); - /* It's fine if this fails as there is a back fall case below */ + if (!muiGlobalInfo(obj)->mgi_CustomScreen) + { + muiGlobalInfo(obj)->mgi_CustomScreen = OpenScreenTags + (NULL, + SA_DisplayID, screenmodeid, + SA_SharePens, TRUE, + SA_FullPalette, TRUE, SA_LikeWorkbench, TRUE, TAG_DONE); + /* It's fine if this fails as there is a fallback case below */ } data->wd_UserScreen = muiGlobalInfo(obj)->mgi_CustomScreen; @@ -305,9 +343,12 @@ static BOOL SetupRenderInfo(Object *obj, struct MUI_WindowData *data, struct MUI { mri->mri_Screen = LockPubScreen(data->wd_UserPublicScreen); } - else if (muiGlobalInfo(obj)->mgi_Prefs->publicscreen_name && muiGlobalInfo(obj)->mgi_Prefs->publicscreen_name[0]) + else if (muiGlobalInfo(obj)->mgi_Prefs->publicscreen_name + && muiGlobalInfo(obj)->mgi_Prefs->publicscreen_name[0]) { - mri->mri_Screen = LockPubScreen(muiGlobalInfo(obj)->mgi_Prefs->publicscreen_name); + mri->mri_Screen = + LockPubScreen(muiGlobalInfo(obj)->mgi_Prefs-> + publicscreen_name); // FIXME: open the public screen if necessary } @@ -321,7 +362,8 @@ static BOOL SetupRenderInfo(Object *obj, struct MUI_WindowData *data, struct MUI } // FIXME: is this the right place for this action? - if (mri->mri_Screen && muiGlobalInfo(obj)->mgi_Prefs->publicscreen_pop_to_front) + if (mri->mri_Screen + && muiGlobalInfo(obj)->mgi_Prefs->publicscreen_pop_to_front) { ScreenToFront(mri->mri_Screen); } @@ -333,7 +375,7 @@ static BOOL SetupRenderInfo(Object *obj, struct MUI_WindowData *data, struct MUI { if (data->wd_Flags & MUIWF_SCREENLOCKED) { - UnlockPubScreen(NULL,mri->mri_Screen); + UnlockPubScreen(NULL, mri->mri_Screen); data->wd_Flags &= ~MUIWF_SCREENLOCKED; } return FALSE; @@ -343,14 +385,14 @@ static BOOL SetupRenderInfo(Object *obj, struct MUI_WindowData *data, struct MUI { if (data->wd_Flags & MUIWF_SCREENLOCKED) { - UnlockPubScreen(NULL,mri->mri_Screen); + UnlockPubScreen(NULL, mri->mri_Screen); data->wd_Flags &= ~MUIWF_SCREENLOCKED; } return FALSE; } - mri->mri_Colormap = mri->mri_Screen->ViewPort.ColorMap; - mri->mri_ScreenWidth = mri->mri_Screen->Width; + mri->mri_Colormap = mri->mri_Screen->ViewPort.ColorMap; + mri->mri_ScreenWidth = mri->mri_Screen->Width; mri->mri_ScreenHeight = mri->mri_Screen->Height; if (mri->mri_ScreenWidth / mri->mri_ScreenHeight < 2) @@ -363,37 +405,38 @@ static BOOL SetupRenderInfo(Object *obj, struct MUI_WindowData *data, struct MUI mri->mri_Flags |= MUIMRI_TRUECOLOR; } - mri->mri_PensStorage[MPEN_SHINE] = mri->mri_DrawInfo->dri_Pens[SHINEPEN]; - mri->mri_PensStorage[MPEN_BACKGROUND] = mri->mri_DrawInfo->dri_Pens[BACKGROUNDPEN]; - mri->mri_PensStorage[MPEN_SHADOW] = mri->mri_DrawInfo->dri_Pens[SHADOWPEN]; + mri->mri_PensStorage[MPEN_SHINE] = + mri->mri_DrawInfo->dri_Pens[SHINEPEN]; + mri->mri_PensStorage[MPEN_BACKGROUND] = + mri->mri_DrawInfo->dri_Pens[BACKGROUNDPEN]; + mri->mri_PensStorage[MPEN_SHADOW] = + mri->mri_DrawInfo->dri_Pens[SHADOWPEN]; mri->mri_PensStorage[MPEN_TEXT] = mri->mri_DrawInfo->dri_Pens[TEXTPEN]; mri->mri_PensStorage[MPEN_FILL] = mri->mri_DrawInfo->dri_Pens[FILLPEN]; - GetRGB32(mri->mri_Colormap, mri->mri_DrawInfo->dri_Pens[SHINEPEN], 1, rgbtable); - GetRGB32(mri->mri_Colormap, mri->mri_DrawInfo->dri_Pens[BACKGROUNDPEN], 1, rgbtable+3); - GetRGB32(mri->mri_Colormap, mri->mri_DrawInfo->dri_Pens[SHADOWPEN], 1, rgbtable+6); + GetRGB32(mri->mri_Colormap, mri->mri_DrawInfo->dri_Pens[SHINEPEN], 1, + rgbtable); + GetRGB32(mri->mri_Colormap, mri->mri_DrawInfo->dri_Pens[BACKGROUNDPEN], + 1, rgbtable + 3); + GetRGB32(mri->mri_Colormap, mri->mri_DrawInfo->dri_Pens[SHADOWPEN], 1, + rgbtable + 6); mri->mri_PensStorage[MPEN_HALFSHINE] = ObtainBestPenA - ( - mri->mri_Colormap, + (mri->mri_Colormap, DoHalfshineGun(rgbtable[0], rgbtable[3]), DoHalfshineGun(rgbtable[1], rgbtable[4]), - DoHalfshineGun(rgbtable[2], rgbtable[5]), NULL - ); + DoHalfshineGun(rgbtable[2], rgbtable[5]), NULL); mri->mri_PensStorage[MPEN_HALFSHADOW] = ObtainBestPenA - ( - mri->mri_Colormap, + (mri->mri_Colormap, DoHalfshadowGun(rgbtable[6], rgbtable[3]), DoHalfshadowGun(rgbtable[7], rgbtable[4]), - DoHalfshadowGun(rgbtable[8], rgbtable[5]), NULL - ); + DoHalfshadowGun(rgbtable[8], rgbtable[5]), NULL); -/* I'm really not sure that MUI does this for MPEN_MARK, but it seems mostly acceptable -dlc */ +/* I'm really not sure that MUI does this for MPEN_MARK, but it seems + * mostly acceptable -dlc */ mri->mri_PensStorage[MPEN_MARK] = ObtainBestPenA - ( - mri->mri_Colormap, 0xf4f4f4f4, 0xb5b5b5b5, 0x8b8b8b8b, NULL - ); + (mri->mri_Colormap, 0xf4f4f4f4, 0xb5b5b5b5, 0x8b8b8b8b, NULL); mri->mri_Pens = mri->mri_PensStorage; @@ -404,7 +447,7 @@ static BOOL SetupRenderInfo(Object *obj, struct MUI_WindowData *data, struct MUI if (data->wd_Flags & MUIWF_USEBOTTOMSCROLLER) { - mri->mri_LeftImage = CreateSysimage(mri->mri_DrawInfo, LEFTIMAGE); + mri->mri_LeftImage = CreateSysimage(mri->mri_DrawInfo, LEFTIMAGE); mri->mri_RightImage = CreateSysimage(mri->mri_DrawInfo, RIGHTIMAGE); } else @@ -414,7 +457,7 @@ static BOOL SetupRenderInfo(Object *obj, struct MUI_WindowData *data, struct MUI if (data->wd_Flags & MUIWF_USERIGHTSCROLLER) { - mri->mri_UpImage = CreateSysimage(mri->mri_DrawInfo, UPIMAGE); + mri->mri_UpImage = CreateSysimage(mri->mri_DrawInfo, UPIMAGE); mri->mri_DownImage = CreateSysimage(mri->mri_DrawInfo, DOWNIMAGE); } else @@ -430,8 +473,9 @@ static BOOL SetupRenderInfo(Object *obj, struct MUI_WindowData *data, struct MUI if (data->wd_CrtFlags & WFLG_BORDERLESS) { - /* Infact borderless windows could also have borders (if they have a window title e.g. but - since they look ugly anywhy we ignore it for now */ + /* Infact borderless windows could also have borders (if they have + * a window title e.g. but since they look ugly anyway we ignore it + * for now */ mri->mri_BorderLeft = 0; mri->mri_BorderRight = 0; mri->mri_BorderTop = 0; @@ -440,17 +484,14 @@ static BOOL SetupRenderInfo(Object *obj, struct MUI_WindowData *data, struct MUI else { mri->mri_BorderLeft = mri->mri_Screen->WBorLeft; - mri->mri_BorderTop = mri->mri_Screen->WBorTop + mri->mri_Screen->Font->ta_YSize+ 1; - temp_obj = NewObject - ( - NULL, "sysiclass", - SYSIA_DrawInfo, (IPTR)mri->mri_DrawInfo, - SYSIA_Which, SIZEIMAGE, - TAG_DONE - ); + mri->mri_BorderTop = + mri->mri_Screen->WBorTop + mri->mri_Screen->Font->ta_YSize + 1; + temp_obj = + NewObject(NULL, "sysiclass", SYSIA_DrawInfo, + (IPTR) mri->mri_DrawInfo, SYSIA_Which, SIZEIMAGE, TAG_DONE); if (temp_obj) { - GetAttr(IA_Height,temp_obj,&val); + GetAttr(IA_Height, temp_obj, &val); DisposeObject(temp_obj); mri->mri_BorderBottom = val; } @@ -461,17 +502,38 @@ static BOOL SetupRenderInfo(Object *obj, struct MUI_WindowData *data, struct MUI return TRUE; } -static void CleanupRenderInfo(Object *obj, struct MUI_WindowData *data, struct MUI_RenderInfo *mri) +static void CleanupRenderInfo(Object *obj, struct MUI_WindowData *data, + struct MUI_RenderInfo *mri) { int i; DisposeCustomFrames(mri); - if (mri->mri_LeftImage) {DisposeObject(mri->mri_LeftImage);mri->mri_LeftImage=NULL;}; - if (mri->mri_RightImage){DisposeObject(mri->mri_RightImage);mri->mri_RightImage=NULL;}; - if (mri->mri_UpImage) {DisposeObject(mri->mri_UpImage);mri->mri_UpImage=NULL;}; - if (mri->mri_DownImage) {DisposeObject(mri->mri_DownImage);mri->mri_DownImage=NULL;}; - if (mri->mri_SizeImage) {DisposeObject(mri->mri_SizeImage);mri->mri_SizeImage=NULL;}; + if (mri->mri_LeftImage) + { + DisposeObject(mri->mri_LeftImage); + mri->mri_LeftImage = NULL; + }; + if (mri->mri_RightImage) + { + DisposeObject(mri->mri_RightImage); + mri->mri_RightImage = NULL; + }; + if (mri->mri_UpImage) + { + DisposeObject(mri->mri_UpImage); + mri->mri_UpImage = NULL; + }; + if (mri->mri_DownImage) + { + DisposeObject(mri->mri_DownImage); + mri->mri_DownImage = NULL; + }; + if (mri->mri_SizeImage) + { + DisposeObject(mri->mri_SizeImage); + mri->mri_SizeImage = NULL; + }; /* bug("CleanupRenderInfo\n"); */ for (i = 0; i < -MUIV_Font_NegCount; i++) @@ -479,7 +541,8 @@ static void CleanupRenderInfo(Object *obj, struct MUI_WindowData *data, struct M if (mri->mri_Fonts[i]) { /* bug("CleanupRenderInfo: closing font %p (%s/%d)\n", */ - /* mri->mri_Fonts[i], mri->mri_Fonts[i]->tf_Message.mn_Node.ln_Name, */ + /* mri->mri_Fonts[i], */ + /* mri->mri_Fonts[i]->tf_Message.mn_Node.ln_Name, */ /* mri->mri_Fonts[i]->tf_YSize); */ CloseFont(mri->mri_Fonts[i]); mri->mri_Fonts[i] = NULL; @@ -491,8 +554,8 @@ static void CleanupRenderInfo(Object *obj, struct MUI_WindowData *data, struct M FreeScreenDrawInfo(mri->mri_Screen, mri->mri_DrawInfo); mri->mri_DrawInfo = NULL; - /* If a custom screen has been opened by zune, close it as soon as - * zero windows are opened. See above for comments about refactorization. */ + /* If a custom screen has been opened by zune, close it as soon as zero + * windows are opened. See above for comments about refactorization. */ if (muiGlobalInfo(obj)->mgi_CustomScreen) { BOOL screenclose = TRUE; @@ -503,21 +566,22 @@ static void CleanupRenderInfo(Object *obj, struct MUI_WindowData *data, struct M get(_app, MUIA_Application_WindowList, &store); if (store != NULL) { - if (!IsListEmpty(store)) screenclose = FALSE; + if (!IsListEmpty(store)) + screenclose = FALSE; } } if (screenclose) { - /* If the window's user screen really was the custom screen, clear the reference */ + /* If the window's user screen really was the custom screen, + * clear the reference */ if (data->wd_UserScreen == muiGlobalInfo(obj)->mgi_CustomScreen) - data->wd_UserScreen = NULL; + data->wd_UserScreen = NULL; CloseScreen(muiGlobalInfo(obj)->mgi_CustomScreen); muiGlobalInfo(obj)->mgi_CustomScreen = NULL; } } - if (data->wd_Flags & MUIWF_SCREENLOCKED) { UnlockPubScreen(NULL, mri->mri_Screen); @@ -543,15 +607,15 @@ static void HideRenderInfo(struct MUI_RenderInfo *mri) mri->mri_RastPort = NULL; } -static ULONG GetDefaultEvents (void) +static ULONG GetDefaultEvents(void) { - return IDCMP_NEWSIZE | IDCMP_REFRESHWINDOW - | IDCMP_MOUSEBUTTONS | IDCMP_MOUSEMOVE | IDCMP_MENUPICK - | IDCMP_CLOSEWINDOW | IDCMP_RAWKEY | IDCMP_INTUITICKS - | IDCMP_ACTIVEWINDOW | IDCMP_INACTIVEWINDOW | IDCMP_GADGETUP; + return IDCMP_NEWSIZE | IDCMP_REFRESHWINDOW + | IDCMP_MOUSEBUTTONS | IDCMP_MOUSEMOVE | IDCMP_MENUPICK + | IDCMP_CLOSEWINDOW | IDCMP_RAWKEY | IDCMP_INTUITICKS + | IDCMP_ACTIVEWINDOW | IDCMP_INACTIVEWINDOW | IDCMP_GADGETUP; } -static void ChangeEvents (struct MUI_WindowData *data, ULONG new_events) +static void ChangeEvents(struct MUI_WindowData *data, ULONG new_events) { struct MinNode *mn; struct MUI_EventHandlerNode *ehn; @@ -564,9 +628,9 @@ static void ChangeEvents (struct MUI_WindowData *data, ULONG new_events) } /* sba: kill the IDCMP_VANILLAKEY flag. MUI doesn't do this but programs - ** which use this will behave different if they request for this flag - ** (also on MUI) - */ + ** which use this will behave different if they request for this flag + ** (also on MUI) + */ new_events &= ~IDCMP_VANILLAKEY; data->wd_Events = new_events; @@ -577,7 +641,8 @@ static void ChangeEvents (struct MUI_WindowData *data, ULONG new_events) } static void CalcWindowPosition(Object *obj, struct MUI_WindowData *data); -static void CreateWindowScrollbars(Object *obj, struct MUI_WindowData *data); +static void CreateWindowScrollbars(Object *obj, + struct MUI_WindowData *data); static void CalcAltDimensions(Object *obj, struct MUI_WindowData *data); static void UndisplayWindow(Object *obj, struct MUI_WindowData *data); static struct ObjNode *FindObjNode(struct MinList *list, Object *obj); @@ -606,11 +671,8 @@ static BOOL DisplayWindow(Object *obj, struct MUI_WindowData *data) flags |= WFLG_TOOLBOX; #endif - if - ( - data->wd_MinMax.MinHeight == data->wd_MinMax.MaxHeight - && data->wd_MinMax.MinWidth == data->wd_MinMax.MaxWidth - ) + if (data->wd_MinMax.MinHeight == data->wd_MinMax.MaxHeight + && data->wd_MinMax.MinWidth == data->wd_MinMax.MaxWidth) flags &= ~WFLG_SIZEGADGET; if (!(flags & WFLG_SIZEBRIGHT)) @@ -618,19 +680,18 @@ static BOOL DisplayWindow(Object *obj, struct MUI_WindowData *data) CalcWindowPosition(obj, data); - if ((visinfo = GetVisualInfoA(data->wd_RenderInfo.mri_Screen,NULL))) + if ((visinfo = GetVisualInfoA(data->wd_RenderInfo.mri_Screen, NULL))) { if (data->wd_Menustrip) { - get(data->wd_Menustrip,MUIA_Menuitem_NewMenu,&newmenu); + get(data->wd_Menustrip, MUIA_Menuitem_NewMenu, &newmenu); if (newmenu) { - if ((menu = CreateMenusA(newmenu,NULL))) + if ((menu = CreateMenusA(newmenu, NULL))) { - struct TagItem tags[] = - { - { GTMN_NewLookMenus, TRUE }, - { TAG_DONE, (IPTR)NULL } + struct TagItem tags[] = { + {GTMN_NewLookMenus, TRUE}, + {TAG_DONE, (IPTR) NULL} }; LayoutMenusA(menu, visinfo, tags); } @@ -642,112 +703,123 @@ static BOOL DisplayWindow(Object *obj, struct MUI_WindowData *data) CreateWindowScrollbars(obj, data); CalcAltDimensions(obj, data); altdims = data->wd_AltDim; - /* hack to account for border size, as we only know the innersize and must give - * the total size. + + /* hack to account for border size, as we only know the innersize and + * must give the total size. */ - altdims.Width += data->wd_RenderInfo.mri_Screen->WBorLeft + data->wd_RenderInfo.mri_Screen->WBorRight; - altdims.Height += data->wd_RenderInfo.mri_Screen->WBorTop + data->wd_RenderInfo.mri_Screen->WBorBottom + + altdims.Width += + data->wd_RenderInfo.mri_Screen->WBorLeft + + data->wd_RenderInfo.mri_Screen->WBorRight; + altdims.Height += + data->wd_RenderInfo.mri_Screen->WBorTop + + data->wd_RenderInfo.mri_Screen->WBorBottom + data->wd_RenderInfo.mri_DrawInfo->dri_Font->tf_YSize + 1; - if (muiGlobalInfo(obj)->mgi_Prefs->window_redraw == WINDOW_REDRAW_WITHOUT_CLEAR) + if (muiGlobalInfo(obj)->mgi_Prefs->window_redraw == + WINDOW_REDRAW_WITHOUT_CLEAR) backfill = WA_BackFill; else backfill = TAG_IGNORE; - if (muiGlobalInfo(obj)->mgi_Prefs->window_refresh == WINDOW_REFRESH_SMART) + if (muiGlobalInfo(obj)->mgi_Prefs->window_refresh == + WINDOW_REFRESH_SMART) flags &= ~WFLG_SIMPLE_REFRESH; - set(_app(obj),MUIA_Application_SearchWinId,data->wd_ID); - struct windowpos *winp=0; - get(_app(obj),MUIA_Application_GetWinPos,&winp); + set(_app(obj), MUIA_Application_SearchWinId, data->wd_ID); + struct windowpos *winp = 0; + get(_app(obj), MUIA_Application_GetWinPos, &winp); if (winp) { - if (data->wd_RenderInfo.mri_ScreenWidth > (data->wd_X + data->wd_Width)) + if (data->wd_RenderInfo.mri_ScreenWidth > + (data->wd_X + data->wd_Width)) { - data->wd_X=winp->x1; - data->wd_Width=winp->w1; + data->wd_X = winp->x1; + data->wd_Width = winp->w1; } - if (data->wd_RenderInfo.mri_ScreenHeight > (data->wd_Y + data->wd_Height)) + if (data->wd_RenderInfo.mri_ScreenHeight > + (data->wd_Y + data->wd_Height)) { - data->wd_Y=winp->y1; - data->wd_Height=winp->h1; + data->wd_Y = winp->y1; + data->wd_Height = winp->h1; } } - gadgets = (data->wd_VertProp != NULL) ? data->wd_VertProp : data->wd_HorizProp; + gadgets = + (data->wd_VertProp != + NULL) ? data->wd_VertProp : data->wd_HorizProp; buttons = muiGlobalInfo(obj)->mgi_Prefs->window_buttons; win = OpenWindowTags - ( - NULL, - - WA_Left, (IPTR) data->wd_X, - WA_Top, (IPTR) data->wd_Y, - WA_Flags, (IPTR) flags, + (NULL, + WA_Left, (IPTR) data->wd_X, + WA_Top, (IPTR) data->wd_Y, + WA_Flags, (IPTR) flags, data->wd_Title ? - WA_Title : - TAG_IGNORE, (IPTR) data->wd_Title, + WA_Title : + TAG_IGNORE, (IPTR) data->wd_Title, data->wd_ScreenTitle ? - WA_ScreenTitle : - TAG_IGNORE, (IPTR) data->wd_ScreenTitle, - WA_CustomScreen, (IPTR) data->wd_RenderInfo.mri_Screen, - WA_InnerWidth, (IPTR) data->wd_Width, - WA_InnerHeight, (IPTR) data->wd_Height, - WA_AutoAdjust, (IPTR) TRUE, - WA_NewLookMenus, (IPTR) TRUE, + WA_ScreenTitle : + TAG_IGNORE, (IPTR) data->wd_ScreenTitle, + WA_CustomScreen, (IPTR) data->wd_RenderInfo.mri_Screen, + WA_InnerWidth, (IPTR) data->wd_Width, + WA_InnerHeight, (IPTR) data->wd_Height, + WA_AutoAdjust, (IPTR) TRUE, WA_NewLookMenus, (IPTR) TRUE, /* AmigaOS v4 extension */ #ifdef WA_ToolBox - WA_ToolBox, (IPTR) !!(data->wd_Flags & MUIWF_TOOLBOX), + WA_ToolBox, (IPTR) ! !(data->wd_Flags & MUIWF_TOOLBOX), #endif /* MorphOS extensions */ #ifdef WA_ExtraGadget_MUI - WA_ExtraGadget_MUI, (IPTR) ((buttons & MUIV_Window_Button_MUI) != 0) ? TRUE : FALSE, - WA_ExtraGadget_PopUp, (IPTR) ((buttons & MUIV_Window_Button_Popup) != 0) ? TRUE : FALSE, - WA_ExtraGadget_Snapshot,(IPTR) ((buttons & MUIV_Window_Button_Snapshot) != 0) ? TRUE : FALSE, - WA_ExtraGadget_Iconify, (IPTR) ((buttons & MUIV_Window_Button_Iconify) != 0) ? TRUE : FALSE, + WA_ExtraGadget_MUI, + (IPTR) ((buttons & MUIV_Window_Button_MUI) != 0) ? TRUE : FALSE, + WA_ExtraGadget_PopUp, + (IPTR) ((buttons & MUIV_Window_Button_Popup) != 0) ? TRUE : FALSE, + WA_ExtraGadget_Snapshot, + (IPTR) ((buttons & MUIV_Window_Button_Snapshot) != + 0) ? TRUE : FALSE, WA_ExtraGadget_Iconify, + (IPTR) ((buttons & MUIV_Window_Button_Iconify) != 0) ? TRUE : FALSE, #endif data->wd_NoMenus ? - WA_RMBTrap : - TAG_IGNORE, (IPTR) TRUE, - WA_Gadgets, (IPTR) gadgets, + WA_RMBTrap : + TAG_IGNORE, (IPTR) TRUE, + WA_Gadgets, (IPTR) gadgets, data->wd_ZoomGadget ? - WA_Zoom : - TAG_IGNORE, (IPTR) &altdims, - backfill, (IPTR) LAYERS_NOBACKFILL, - TAG_DONE - ); + WA_Zoom : + TAG_IGNORE, (IPTR) & altdims, + backfill, (IPTR) LAYERS_NOBACKFILL, TAG_DONE); if (win) { int hborders = win->BorderLeft + win->BorderRight; - int vborders = win->BorderTop + win->BorderBottom; + int vborders = win->BorderTop + win->BorderBottom; - /* recalc window size (which will hopefully equal our requested size) */ - data->wd_Width = win->GZZWidth; + /* recalc window size (which will hopefully equal our requested + * size) */ + data->wd_Width = win->GZZWidth; data->wd_Height = win->GZZHeight; /* set window limits according to window contents */ WindowLimits - ( - win, data->wd_MinMax.MinWidth + hborders, + (win, data->wd_MinMax.MinWidth + hborders, data->wd_MinMax.MinHeight + vborders, - data->wd_MinMax.MaxWidth + hborders, - data->wd_MinMax.MaxHeight + vborders - ); + data->wd_MinMax.MaxWidth + hborders, + data->wd_MinMax.MaxHeight + vborders); - win->UserData = (BYTE*)data->wd_RenderInfo.mri_WindowObject; - win->UserPort = muiGlobalInfo(obj)->mgi_WindowsPort; /* Same port for all windows */ + win->UserData = (BYTE *) data->wd_RenderInfo.mri_WindowObject; + win->UserPort = muiGlobalInfo(obj)->mgi_WindowsPort; + /* Same port for all windows */ ModifyIDCMP(win, data->wd_Events); data->wd_RenderInfo.mri_Window = win; data->wd_RenderInfo.mri_VertProp = data->wd_VertProp; data->wd_RenderInfo.mri_HorizProp = data->wd_HorizProp; - SetDrMd(win->RPort,JAM1); //text is draw wrong in toolbarclass if not set + SetDrMd(win->RPort, JAM1); + //text is draw wrong in toolbarclass if not set if (menu) { data->wd_Menu = menu; - SetMenuStrip(win,menu); + SetMenuStrip(win, menu); } if (flags & WFLG_ACTIVATE) @@ -758,7 +830,8 @@ static BOOL DisplayWindow(Object *obj, struct MUI_WindowData *data) return TRUE; } - if (menu) FreeMenus(menu); + if (menu) + FreeMenus(menu); UndisplayWindow(obj, data); return FALSE; @@ -768,12 +841,15 @@ static BOOL DisplayWindow(Object *obj, struct MUI_WindowData *data) static void UndisplayWindow(Object *obj, struct MUI_WindowData *data) { struct Window *win = data->wd_RenderInfo.mri_Window; - BOOL prefssnap = ((muiGlobalInfo(obj)->mgi_Prefs->window_position == WINDOW_POSITION_REMEMBER_ON_EXIT) || - (muiGlobalInfo(obj)->mgi_Prefs->window_position == WINDOW_POSITION_SAVE_ON_EXIT)); + BOOL prefssnap = + ((muiGlobalInfo(obj)->mgi_Prefs->window_position == + WINDOW_POSITION_REMEMBER_ON_EXIT) + || (muiGlobalInfo(obj)->mgi_Prefs->window_position == + WINDOW_POSITION_SAVE_ON_EXIT)); if (((data->wd_XStore >= 0) && (data->wd_YStore >= 0)) || prefssnap) { - DoMethod(obj,MUIM_Window_Snapshot,0); + DoMethod(obj, MUIM_Window_Snapshot, 0); } data->wd_RenderInfo.mri_Window = NULL; @@ -785,15 +861,15 @@ static void UndisplayWindow(Object *obj, struct MUI_WindowData *data) if (win != NULL) { /* store position and size */ - if (data->wd_XStore >=0) - data->wd_X = win->LeftEdge; + if (data->wd_XStore >= 0) + data->wd_X = win->LeftEdge; else - data->wd_X = data->wd_XStore; - if (data->wd_YStore >=0) - data->wd_Y = win->TopEdge; + data->wd_X = data->wd_XStore; + if (data->wd_YStore >= 0) + data->wd_Y = win->TopEdge; else - data->wd_Y = data->wd_YStore; - data->wd_Width = win->GZZWidth; + data->wd_Y = data->wd_YStore; + data->wd_Width = win->GZZWidth; data->wd_Height = win->GZZHeight; ClearMenuStrip(win); @@ -809,12 +885,11 @@ static void UndisplayWindow(Object *obj, struct MUI_WindowData *data) /* remove all messages pending for this window */ Forbid(); - for - ( - msg = (struct IntuiMessage *)win->UserPort->mp_MsgList.lh_Head; - (succ = (struct IntuiMessage *)msg->ExecMessage.mn_Node.ln_Succ); - msg = succ - ) + for (msg = + (struct IntuiMessage *)win->UserPort->mp_MsgList.lh_Head; + (succ = + (struct IntuiMessage *)msg->ExecMessage.mn_Node. + ln_Succ); msg = succ) { if (msg->IDCMPWindow == win) { @@ -835,7 +910,8 @@ static void UndisplayWindow(Object *obj, struct MUI_WindowData *data) #define DISPOSEGADGET(x) \ if (x)\ {\ - DoMethod(obj, MUIM_Window_FreeGadgetID, ((struct Gadget*)x)->GadgetID);\ + DoMethod(obj, MUIM_Window_FreeGadgetID,\ + ((struct Gadget*)x)->GadgetID);\ DisposeObject(x);\ x = NULL;\ } @@ -858,12 +934,14 @@ static void CalcWindowPosition(Object *obj, struct MUI_WindowData *data) data->wd_YStore = data->wd_Y; if (NULL == data->wd_RefWindow) { - /* The following calculations are not very correct, the size and dragbar - ** are ignored also the current overscan view */ + /* The following calculations are not very correct, the size and + * dragbar are ignored also the current overscan view */ if (data->wd_X == MUIV_Window_LeftEdge_Centered) { - data->wd_X = (data->wd_RenderInfo.mri_Screen->ViewPort.DWidth - data->wd_Width)/2 - - data->wd_RenderInfo.mri_Screen->LeftEdge; + data->wd_X = + (data->wd_RenderInfo.mri_Screen->ViewPort.DWidth - + data->wd_Width) / 2 - + data->wd_RenderInfo.mri_Screen->LeftEdge; } else if (data->wd_X == MUIV_Window_LeftEdge_Moused) { @@ -872,8 +950,10 @@ static void CalcWindowPosition(Object *obj, struct MUI_WindowData *data) if (data->wd_Y == MUIV_Window_TopEdge_Centered) { - data->wd_Y = (data->wd_RenderInfo.mri_Screen->ViewPort.DHeight - data->wd_Height)/2 - - data->wd_RenderInfo.mri_Screen->TopEdge; + data->wd_Y = + (data->wd_RenderInfo.mri_Screen->ViewPort.DHeight - + data->wd_Height) / 2 - + data->wd_RenderInfo.mri_Screen->TopEdge; } else if (data->wd_Y == MUIV_Window_TopEdge_Moused) { @@ -895,7 +975,7 @@ static void CalcWindowPosition(Object *obj, struct MUI_WindowData *data) if (data->wd_X == MUIV_Window_LeftEdge_Centered) { - data->wd_X = x + (w - data->wd_Width)/2; + data->wd_X = x + (w - data->wd_Width) / 2; } else { @@ -908,7 +988,7 @@ static void CalcWindowPosition(Object *obj, struct MUI_WindowData *data) if (data->wd_Y == MUIV_Window_TopEdge_Centered) { /* D(bug("y=%ld, h=%ld, wdh=%ld\n", y, h, data->wd_Height)); */ - data->wd_Y = y + (h - data->wd_Height)/2; + data->wd_Y = y + (h - data->wd_Height) / 2; } else if (data->wd_Y <= MUIV_Window_TopEdge_Delta(0)) { @@ -930,114 +1010,81 @@ static void CalcAltDimensions(Object *obj, struct MUI_WindowData *data) if (data->wd_AltDim.Top == MUIV_Window_AltTopEdge_NoChange) data->wd_AltDim.Top = ~0; else if (data->wd_AltDim.Top == MUIV_Window_AltTopEdge_Centered) - data->wd_AltDim.Top = (data->wd_RenderInfo.mri_Screen->Height - data->wd_Height)/2; + data->wd_AltDim.Top = + (data->wd_RenderInfo.mri_Screen->Height - data->wd_Height) / 2; else if (data->wd_AltDim.Top == MUIV_Window_AltTopEdge_Moused) /* ? */ data->wd_AltDim.Top = ~0; if (data->wd_AltDim.Left == MUIV_Window_AltLeftEdge_NoChange) data->wd_AltDim.Left = ~0; else if (data->wd_AltDim.Left == MUIV_Window_AltLeftEdge_Centered) - data->wd_AltDim.Left = (data->wd_RenderInfo.mri_Screen->Width - data->wd_Width)/2; + data->wd_AltDim.Left = + (data->wd_RenderInfo.mri_Screen->Width - data->wd_Width) / 2; else if (data->wd_AltDim.Left == MUIV_Window_AltLeftEdge_Moused) /* ? */ data->wd_AltDim.Left = ~0; - if - ( - _between - ( - MUIV_Window_AltWidth_MinMax(100), - data->wd_AltDim.Width, - MUIV_Window_AltWidth_MinMax(0) - ) - ) + if (_between + (MUIV_Window_AltWidth_MinMax(100), + data->wd_AltDim.Width, MUIV_Window_AltWidth_MinMax(0))) { data->wd_AltDim.Width = data->wd_MinMax.MinWidth - data->wd_AltDim.Width * (data->wd_MinMax.MaxWidth - data->wd_MinMax.MinWidth); } else if - ( - _between - ( - MUIV_Window_AltWidth_Screen(100), - data->wd_AltDim.Width, - MUIV_Window_AltWidth_Screen(0) - ) - ) + (_between + (MUIV_Window_AltWidth_Screen(100), + data->wd_AltDim.Width, MUIV_Window_AltWidth_Screen(0))) { data->wd_AltDim.Width = data->wd_RenderInfo.mri_ScreenWidth - * (- (data->wd_AltDim.Width + 200)) / 100; + * (-(data->wd_AltDim.Width + 200)) / 100; } else if - ( - _between - ( - MUIV_Window_AltWidth_Visible(100), - data->wd_AltDim.Width, - MUIV_Window_AltWidth_Visible(0) - ) - ) + (_between + (MUIV_Window_AltWidth_Visible(100), + data->wd_AltDim.Width, MUIV_Window_AltWidth_Visible(0))) { data->wd_AltDim.Width = data->wd_RenderInfo.mri_ScreenWidth - * (- (data->wd_AltDim.Width + 100)) / 100; + * (-(data->wd_AltDim.Width + 100)) / 100; } - if - ( - _between - ( - MUIV_Window_AltHeight_MinMax(100), - data->wd_AltDim.Height, - MUIV_Window_AltHeight_MinMax(0) - ) - ) + if (_between + (MUIV_Window_AltHeight_MinMax(100), + data->wd_AltDim.Height, MUIV_Window_AltHeight_MinMax(0))) { data->wd_AltDim.Height = data->wd_MinMax.MinHeight - data->wd_AltDim.Height * (data->wd_MinMax.MaxHeight - data->wd_MinMax.MinHeight); } else if - ( - _between - ( - MUIV_Window_AltHeight_Screen(100), - data->wd_AltDim.Height, - MUIV_Window_AltHeight_Screen(0) - ) - ) + (_between + (MUIV_Window_AltHeight_Screen(100), + data->wd_AltDim.Height, MUIV_Window_AltHeight_Screen(0))) { data->wd_AltDim.Height = data->wd_RenderInfo.mri_ScreenHeight - * (- (data->wd_AltDim.Height + 200)) / 100; + * (-(data->wd_AltDim.Height + 200)) / 100; } else if - ( - _between - ( - MUIV_Window_AltHeight_Visible(100), - data->wd_AltDim.Height, - MUIV_Window_AltHeight_Visible(0) - ) - ) + (_between + (MUIV_Window_AltHeight_Visible(100), + data->wd_AltDim.Height, MUIV_Window_AltHeight_Visible(0))) { data->wd_AltDim.Height = data->wd_RenderInfo.mri_ScreenHeight - * (- (data->wd_AltDim.Height + 100)) / 100; + * (-(data->wd_AltDim.Height + 100)) / 100; } data->wd_AltDim.Width = CLAMP - ( - data->wd_AltDim.Width, data->wd_MinMax.MinWidth, - data->wd_MinMax.MaxWidth - ); + (data->wd_AltDim.Width, data->wd_MinMax.MinWidth, + data->wd_MinMax.MaxWidth); data->wd_AltDim.Height = CLAMP - ( - data->wd_AltDim.Height, data->wd_MinMax.MinHeight, - data->wd_MinMax.MaxHeight - ); + (data->wd_AltDim.Height, data->wd_MinMax.MinHeight, + data->wd_MinMax.MaxHeight); } /* Create horiz/vert window scrollbars for DisplayWindow */ -static void CreateWindowScrollbars(Object *obj, struct MUI_WindowData *data) +static void CreateWindowScrollbars(Object *obj, + struct MUI_WindowData *data) { struct MUI_RenderInfo *mri = &data->wd_RenderInfo; Object *firstgad = NULL; @@ -1053,61 +1100,46 @@ static void CreateWindowScrollbars(Object *obj, struct MUI_WindowData *data) id = DoMethod(obj, MUIM_Window_AllocGadgetID); firstgad = prevgad = data->wd_VertProp = NewObject - ( - NULL, "propgclass", - - GA_RelRight, 1 - (IM(mri->mri_UpImage)->Width - voffset), - GA_Top, mri->mri_BorderTop + 2, - GA_Width, IM(mri->mri_UpImage)->Width - voffset * 2, - GA_RelHeight, - (mri->mri_BorderTop + 2) - - IM(mri->mri_UpImage)->Height - - IM(mri->mri_DownImage)->Height - - IM(mri->mri_SizeImage)->Height - 2, + (NULL, "propgclass", + GA_RelRight, 1 - (IM(mri->mri_UpImage)->Width - voffset), + GA_Top, mri->mri_BorderTop + 2, + GA_Width, IM(mri->mri_UpImage)->Width - voffset * 2, + GA_RelHeight, -(mri->mri_BorderTop + 2) + - IM(mri->mri_UpImage)->Height + - IM(mri->mri_DownImage)->Height + - IM(mri->mri_SizeImage)->Height - 2, GA_RightBorder, TRUE, - GA_ID, id, + GA_ID, id, PGA_Borderless, TRUE, - PGA_NewLook, TRUE, - PGA_Freedom, FREEVERT, - PGA_Top, 0, - PGA_Total, 2, - PGA_Visible, 1, - ICA_TARGET, ICTARGET_IDCMP, - TAG_DONE - ); + PGA_NewLook, TRUE, + PGA_Freedom, FREEVERT, + PGA_Top, 0, + PGA_Total, 2, + PGA_Visible, 1, ICA_TARGET, ICTARGET_IDCMP, TAG_DONE); id = DoMethod(obj, MUIM_Window_AllocGadgetID); prevgad = data->wd_UpButton = NewObject - ( - NULL, "buttongclass", - - GA_Image, (IPTR)mri->mri_UpImage, - GA_RelRight, 1 - IM(mri->mri_UpImage)->Width, - GA_RelBottom, 1 - IM(mri->mri_UpImage)->Height - - IM(mri->mri_DownImage)->Height - - IM(mri->mri_SizeImage)->Height, + (NULL, "buttongclass", + GA_Image, (IPTR) mri->mri_UpImage, + GA_RelRight, 1 - IM(mri->mri_UpImage)->Width, + GA_RelBottom, 1 - IM(mri->mri_UpImage)->Height + - IM(mri->mri_DownImage)->Height + - IM(mri->mri_SizeImage)->Height, GA_RightBorder, TRUE, - GA_Previous, (IPTR)prevgad, - GA_ID, id, - ICA_TARGET, ICTARGET_IDCMP, - TAG_DONE - ); + GA_Previous, (IPTR) prevgad, + GA_ID, id, ICA_TARGET, ICTARGET_IDCMP, TAG_DONE); id = DoMethod(obj, MUIM_Window_AllocGadgetID); prevgad = data->wd_DownButton = NewObject - ( - NULL, "buttongclass", - - GA_Image, (IPTR)mri->mri_DownImage, - GA_RelRight, 1 - IM(mri->mri_DownImage)->Width, - GA_RelBottom, 1 - IM(mri->mri_DownImage)->Height - - IM(mri->mri_SizeImage)->Height, + (NULL, "buttongclass", + GA_Image, (IPTR) mri->mri_DownImage, + GA_RelRight, 1 - IM(mri->mri_DownImage)->Width, + GA_RelBottom, 1 - IM(mri->mri_DownImage)->Height + - IM(mri->mri_SizeImage)->Height, GA_RightBorder, TRUE, - GA_Previous, (IPTR)prevgad, - GA_ID, id, - ICA_TARGET, ICTARGET_IDCMP, - TAG_DONE - ); - } // if (data->wd_Flags & MUIWF_USERIGHTSCROLLER) + GA_Previous, (IPTR) prevgad, + GA_ID, id, ICA_TARGET, ICTARGET_IDCMP, TAG_DONE); + } /* Create the bottom border scrollers now if requested */ if (data->wd_Flags & MUIWF_USEBOTTOMSCROLLER) @@ -1118,74 +1150,61 @@ static void CreateWindowScrollbars(Object *obj, struct MUI_WindowData *data) id = DoMethod(obj, MUIM_Window_AllocGadgetID); prevgad = data->wd_HorizProp = NewObject - ( - NULL, "propgclass", - - GA_RelBottom, 1 - (IM(mri->mri_LeftImage)->Height - hoffset), - GA_Left, mri->mri_BorderLeft, - GA_Height, IM(mri->mri_LeftImage)->Height - - hoffset * 2, - GA_RelWidth, - (mri->mri_BorderLeft) - - IM(mri->mri_LeftImage)->Width - - IM(mri->mri_RightImage)->Width - - IM(mri->mri_SizeImage)->Width - - 2, - GA_BottomBorder, TRUE, - GA_ID, id, - prevgad ? GA_Previous : TAG_IGNORE, (IPTR)prevgad, - PGA_Borderless, TRUE, - PGA_NewLook, TRUE, - PGA_Freedom, FREEHORIZ, - PGA_Top, 0, - PGA_Total, 2, - PGA_Visible, 1, - ICA_TARGET, ICTARGET_IDCMP, - TAG_DONE - ); - - if (!firstgad) firstgad = prevgad; + (NULL, "propgclass", + GA_RelBottom, 1 - (IM(mri->mri_LeftImage)->Height - hoffset), + GA_Left, mri->mri_BorderLeft, + GA_Height, IM(mri->mri_LeftImage)->Height + - hoffset * 2, + GA_RelWidth, -(mri->mri_BorderLeft) + - IM(mri->mri_LeftImage)->Width + - IM(mri->mri_RightImage)->Width + - IM(mri->mri_SizeImage)->Width + - 2, + GA_BottomBorder, TRUE, + GA_ID, id, + prevgad ? GA_Previous : TAG_IGNORE, (IPTR) prevgad, + PGA_Borderless, TRUE, + PGA_NewLook, TRUE, + PGA_Freedom, FREEHORIZ, + PGA_Top, 0, + PGA_Total, 2, + PGA_Visible, 1, ICA_TARGET, ICTARGET_IDCMP, TAG_DONE); + + if (!firstgad) + firstgad = prevgad; id = DoMethod(obj, MUIM_Window_AllocGadgetID); prevgad = data->wd_LeftButton = NewObject - ( - NULL, "buttongclass", - - GA_Image, (IPTR)mri->mri_LeftImage, - GA_RelRight, 1 - IM(mri->mri_LeftImage)->Width - - IM(mri->mri_RightImage)->Width - - IM(mri->mri_SizeImage)->Width, - GA_RelBottom, 1 - IM(mri->mri_LeftImage)->Height, + (NULL, "buttongclass", + GA_Image, (IPTR) mri->mri_LeftImage, + GA_RelRight, 1 - IM(mri->mri_LeftImage)->Width + - IM(mri->mri_RightImage)->Width + - IM(mri->mri_SizeImage)->Width, + GA_RelBottom, 1 - IM(mri->mri_LeftImage)->Height, GA_BottomBorder, TRUE, - GA_Previous, (IPTR)prevgad, - GA_ID, id, - ICA_TARGET, ICTARGET_IDCMP, - TAG_DONE - ); + GA_Previous, (IPTR) prevgad, + GA_ID, id, ICA_TARGET, ICTARGET_IDCMP, TAG_DONE); id = DoMethod(obj, MUIM_Window_AllocGadgetID); prevgad = data->wd_RightButton = NewObject - ( - NULL, "buttongclass", - - GA_Image, (IPTR)mri->mri_RightImage, - GA_RelRight, 1 - IM(mri->mri_RightImage)->Width - - IM(mri->mri_SizeImage)->Width, - GA_RelBottom, 1 - IM(mri->mri_RightImage)->Height, + (NULL, "buttongclass", + GA_Image, (IPTR) mri->mri_RightImage, + GA_RelRight, 1 - IM(mri->mri_RightImage)->Width + - IM(mri->mri_SizeImage)->Width, + GA_RelBottom, 1 - IM(mri->mri_RightImage)->Height, GA_BottomBorder, TRUE, - GA_Previous, (IPTR)prevgad, - GA_ID, id, - ICA_TARGET, ICTARGET_IDCMP, - TAG_DONE); - } // if (data->wd_Flags & MUIWF_USEBOTTOMSCROLLER) + GA_Previous, (IPTR) prevgad, + GA_ID, id, ICA_TARGET, ICTARGET_IDCMP, TAG_DONE); + } } /* return FALSE only if no resize (dx=dy=0) occured */ -static BOOL WindowResize (struct MUI_WindowData *data) +static BOOL WindowResize(struct MUI_WindowData *data) { struct Window *win = data->wd_RenderInfo.mri_Window; int hborders = win->BorderLeft + win->BorderRight; - int vborders = win->BorderTop + win->BorderBottom; - WORD dx = data->wd_Width - win->Width + hborders; + int vborders = win->BorderTop + win->BorderBottom; + WORD dx = data->wd_Width - win->Width + hborders; WORD dy = data->wd_Height - win->Height + vborders; /* Temporarily disable window limits to let SizeWindow below work @@ -1196,26 +1215,27 @@ static BOOL WindowResize (struct MUI_WindowData *data) /* Set new window limits */ WindowLimits - ( - win, data->wd_MinMax.MinWidth + hborders, + (win, data->wd_MinMax.MinWidth + hborders, data->wd_MinMax.MinHeight + vborders, data->wd_MinMax.MaxWidth + hborders, - data->wd_MinMax.MaxHeight + vborders - ); + data->wd_MinMax.MaxHeight + vborders); return dx || dy; } -static void KillHelpBubble(struct MUI_WindowData *data, Object *obj, BOOL kill_bubblemode) +static void KillHelpBubble(struct MUI_WindowData *data, Object *obj, + BOOL kill_bubblemode) { if (data->wd_HelpObject) { - DoMethod(data->wd_HelpObject, MUIM_DeleteBubble, (IPTR)data->wd_HelpBubble); + DoMethod(data->wd_HelpObject, MUIM_DeleteBubble, + (IPTR) data->wd_HelpBubble); data->wd_HelpObject = NULL; data->wd_HelpBubble = NULL; } - if (kill_bubblemode) data->wd_Flags &= ~MUIWF_BUBBLEMODE; + if (kill_bubblemode) + data->wd_Flags &= ~MUIWF_BUBBLEMODE; if (data->wd_Flags & MUIWF_BUBBLEMODE) { @@ -1230,7 +1250,7 @@ static void KillHelpBubble(struct MUI_WindowData *data, Object *obj, BOOL kill_b /**************/ -typedef BOOL (*UNDERCHECK_FUNC)(Object *obj); +typedef BOOL(*UNDERCHECK_FUNC) (Object *obj); static BOOL ShortHelpUnderPointerCheck(Object *obj) { @@ -1238,67 +1258,69 @@ static BOOL ShortHelpUnderPointerCheck(Object *obj) } static Object *ObjectUnderPointer(struct MUI_WindowData *data, Object *obj, - LONG x, LONG y, UNDERCHECK_FUNC func) + LONG x, LONG y, UNDERCHECK_FUNC func) { - Object *cstate; - Object *child; - struct MinList *ChildList = NULL; + Object *cstate; + Object *child; + struct MinList *ChildList = NULL; if (!(muiAreaData(obj)->mad_Flags & MADF_CANDRAW)) return NULL; if (!(x >= _left(obj) && x <= _right(obj) - && y >= _top(obj) && y <= _bottom(obj))) + && y >= _top(obj) && y <= _bottom(obj))) { return NULL; } - if ((get(obj, MUIA_Group_ChildList, &(ChildList))) && (ChildList != NULL)) + if ((get(obj, MUIA_Group_ChildList, &(ChildList))) + && (ChildList != NULL)) { - cstate = (Object *)ChildList->mlh_Head; + cstate = (Object *) ChildList->mlh_Head; while ((child = NextObject(&cstate))) { Object *ret; if ((x >= _left(child) && x <= _right(child) - && - y >= _top(child) && y <= _bottom(child)) - && - (ret = ObjectUnderPointer(data, child, x, y, func))) + && + y >= _top(child) && y <= _bottom(child)) + && (ret = ObjectUnderPointer(data, child, x, y, func))) { return ret; } } } - if (!(*func)(obj)) return NULL; + if (!(*func) (obj)) + return NULL; return obj; } -static BOOL ContextMenuUnderPointer(struct MUI_WindowData *data, Object *obj, LONG x, LONG y) +static BOOL ContextMenuUnderPointer(struct MUI_WindowData *data, + Object *obj, LONG x, LONG y) { - Object *cstate; - Object *child; - struct MinList *ChildList = NULL; + Object *cstate; + Object *child; + struct MinList *ChildList = NULL; if (!(x >= _left(obj) && x <= _right(obj) - && y >= _top(obj) && y <= _bottom(obj))) + && y >= _top(obj) && y <= _bottom(obj))) { return FALSE; } - if ((get(obj, MUIA_Group_ChildList, &(ChildList))) && (ChildList != NULL)) + if ((get(obj, MUIA_Group_ChildList, &(ChildList))) + && (ChildList != NULL)) { - cstate = (Object *)ChildList->mlh_Head; + cstate = (Object *) ChildList->mlh_Head; while ((child = NextObject(&cstate))) { if ((x >= _left(child) && x <= _right(child) - && - y >= _top(child) && y <= _bottom(child)) - && - (ContextMenuUnderPointer(data,child,x,y))) + && + y >= _top(child) && y <= _bottom(child)) + && (ContextMenuUnderPointer(data, child, x, y))) return TRUE; } } @@ -1313,7 +1335,7 @@ static BOOL ContextMenuUnderPointer(struct MUI_WindowData *data, Object *obj, LO /**************/ -static void ActivateObject (struct MUI_WindowData *data) +static void ActivateObject(struct MUI_WindowData *data) { //bug("Window::ActivateObject (dummy) %08lx\n", data->wd_ActiveObject); // if (FindObjNode(&data->wd_CycleChain, data->wd_ActiveObject)) @@ -1337,13 +1359,13 @@ static void ActivateObject (struct MUI_WindowData *data) /**************/ static void HandleInputEvent(Object *win, struct MUI_WindowData *data, - struct IntuiMessage *event); + struct IntuiMessage *event); /* handle intuimessage while an object is being dragged * (reply imsg before returning) */ -void HandleDragging (Object *oWin, struct MUI_WindowData *data, - struct IntuiMessage *imsg) +void HandleDragging(Object *oWin, struct MUI_WindowData *data, + struct IntuiMessage *imsg) { struct Window *iWin; int finish_drag = 0; @@ -1353,30 +1375,33 @@ void HandleDragging (Object *oWin, struct MUI_WindowData *data, if (imsg->Class == IDCMP_MOUSEMOVE) { struct Layer *layer; - layer = WhichLayer(&iWin->WScreen->LayerInfo, iWin->LeftEdge + imsg->MouseX, iWin->TopEdge + imsg->MouseY); + layer = + WhichLayer(&iWin->WScreen->LayerInfo, + iWin->LeftEdge + imsg->MouseX, iWin->TopEdge + imsg->MouseY); if (data->wd_DropObject) { struct Window *wnd; - WORD mousex = imsg->MouseX + iWin->LeftEdge - data->wd_DropWindow->LeftEdge; - WORD mousey = imsg->MouseY + iWin->TopEdge - data->wd_DropWindow->TopEdge; + WORD mousex = + imsg->MouseX + iWin->LeftEdge - + data->wd_DropWindow->LeftEdge; + WORD mousey = + imsg->MouseY + iWin->TopEdge - data->wd_DropWindow->TopEdge; wnd = _window(data->wd_DropObject); - if - ( - mousex < _left(data->wd_DropObject) - || mousex > _right(data->wd_DropObject) - || mousey < _top(data->wd_DropObject) - || mousey > _bottom(data->wd_DropObject) - || layer != wnd->WLayer - ) + if (mousex < _left(data->wd_DropObject) + || mousex > _right(data->wd_DropObject) + || mousey < _top(data->wd_DropObject) + || mousey > _bottom(data->wd_DropObject) + || layer != wnd->WLayer) { /* We have left the object */ UndrawDragNDrop(data->wd_dnd); - DoMethod(data->wd_DropObject, MUIM_DragFinish,(IPTR)data->wd_DragObject); + DoMethod(data->wd_DropObject, MUIM_DragFinish, + (IPTR) data->wd_DragObject); data->wd_DropObject = NULL; } - } /* if (data->wd_DropObject) */ + } /* if (data->wd_DropObject) */ if (!data->wd_DropObject) { @@ -1385,17 +1410,18 @@ void HandleDragging (Object *oWin, struct MUI_WindowData *data, /* Find out if app has an openend window at this position */ if (layer) { - Object *cstate; - Object *child; - struct MinList *ChildList = 0; + Object *cstate; + Object *child; + struct MinList *ChildList = 0; get(_app(oWin), MUIA_Application_WindowList, &(ChildList)); - cstate = (Object *)ChildList->mlh_Head; + cstate = (Object *) ChildList->mlh_Head; while ((child = NextObject(&cstate))) { struct Window *wnd = NULL; - get(child, MUIA_Window_Window,&wnd); - if (!wnd) continue; + get(child, MUIA_Window_Window, &wnd); + if (!wnd) + continue; if (wnd->WLayer == layer) { @@ -1404,7 +1430,7 @@ void HandleDragging (Object *oWin, struct MUI_WindowData *data, break; } } - } /* if (layer) */ + } /* if (layer) */ if (dest_wnd) { @@ -1413,79 +1439,80 @@ void HandleDragging (Object *oWin, struct MUI_WindowData *data, if (root) { - if - ( - ( - data->wd_DropObject = (Object*) DoMethod - ( - root, MUIM_DragQueryExtended, - (IPTR) data->wd_DragObject, - imsg->MouseX + iWin->LeftEdge - data->wd_DropWindow->LeftEdge, - imsg->MouseY + iWin->TopEdge - data->wd_DropWindow->TopEdge - ) - ) - ) + if ((data->wd_DropObject = (Object *) DoMethod + (root, MUIM_DragQueryExtended, + (IPTR) data->wd_DragObject, + imsg->MouseX + iWin->LeftEdge - + data->wd_DropWindow->LeftEdge, + imsg->MouseY + iWin->TopEdge - + data->wd_DropWindow->TopEdge))) { UndrawDragNDrop(data->wd_dnd); - DoMethod(data->wd_DropObject, MUIM_DragBegin,(IPTR)data->wd_DragObject); + DoMethod(data->wd_DropObject, MUIM_DragBegin, + (IPTR) data->wd_DragObject); } } - } /* if (dest_wnd) */ - } /* if (!data->wd_DropObject) */ + } + } if (data->wd_DropObject) { LONG update = 0; LONG i; - for (i=0;i<2;i++) + for (i = 0; i < 2; i++) { - LONG res = DoMethod - ( - data->wd_DropObject, MUIM_DragReport, + LONG res = DoMethod(data->wd_DropObject, MUIM_DragReport, (IPTR) data->wd_DragObject, - imsg->MouseX + iWin->LeftEdge - data->wd_DropWindow->LeftEdge, - imsg->MouseY + iWin->TopEdge - data->wd_DropWindow->TopEdge,update - ); + imsg->MouseX + iWin->LeftEdge - + data->wd_DropWindow->LeftEdge, + imsg->MouseY + iWin->TopEdge - + data->wd_DropWindow->TopEdge, update); switch (res) { - case MUIV_DragReport_Abort: - UndrawDragNDrop(data->wd_dnd); - DoMethod(data->wd_DropObject, MUIM_DragFinish,(IPTR)data->wd_DragObject); - data->wd_DropObject = NULL; - i = 1; - break; + case MUIV_DragReport_Abort: + UndrawDragNDrop(data->wd_dnd); + DoMethod(data->wd_DropObject, MUIM_DragFinish, + (IPTR) data->wd_DragObject); + data->wd_DropObject = NULL; + i = 1; + break; - case MUIV_DragReport_Continue: break; - case MUIV_DragReport_Lock: break; /* NYI */ - case MUIV_DragReport_Refresh: - UndrawDragNDrop(data->wd_dnd); - update = 1; - break; + case MUIV_DragReport_Continue: + break; + case MUIV_DragReport_Lock: + break; /* NYI */ + case MUIV_DragReport_Refresh: + UndrawDragNDrop(data->wd_dnd); + update = 1; + break; } } - } /* if (data->wd_DropObject) */ - DrawDragNDrop(data->wd_dnd, imsg->MouseX + iWin->LeftEdge , imsg->MouseY + iWin->TopEdge); - } /* if (imsg->Class == IDCMP_MOUSEMOVE) */ + } + DrawDragNDrop(data->wd_dnd, imsg->MouseX + iWin->LeftEdge, + imsg->MouseY + iWin->TopEdge); + } if (imsg->Class == IDCMP_MOUSEBUTTONS) { - if ((imsg->Code == MENUDOWN) || (imsg->Code == SELECTUP)) + if ((imsg->Code == MENUDOWN) || (imsg->Code == SELECTUP)) { if (imsg->Code == SELECTUP && data->wd_DropObject) { UndrawDragNDrop(data->wd_dnd); - DoMethod(data->wd_DropObject, MUIM_DragFinish, (IPTR)data->wd_DragObject); - DoMethod - ( - data->wd_DropObject, MUIM_DragDrop, (IPTR)data->wd_DragObject, - imsg->MouseX + iWin->LeftEdge - data->wd_DropWindow->LeftEdge, - imsg->MouseY + iWin->TopEdge - data->wd_DropWindow->TopEdge - ); + DoMethod(data->wd_DropObject, MUIM_DragFinish, + (IPTR) data->wd_DragObject); + DoMethod(data->wd_DropObject, MUIM_DragDrop, + (IPTR) data->wd_DragObject, + imsg->MouseX + iWin->LeftEdge - + data->wd_DropWindow->LeftEdge, + imsg->MouseY + iWin->TopEdge - + data->wd_DropWindow->TopEdge); data->wd_DropObject = NULL; } else if (imsg->Code == SELECTUP) { - DoMethod(data->wd_DragObject, MUIM_UnknownDropDestination, imsg); + DoMethod(data->wd_DragObject, MUIM_UnknownDropDestination, + imsg); } finish_drag = 1; } @@ -1499,25 +1526,28 @@ void HandleDragging (Object *oWin, struct MUI_WindowData *data, UndrawDragNDrop(data->wd_dnd); if (data->wd_DropObject) { - DoMethod(data->wd_DropObject, MUIM_DragFinish, (IPTR)data->wd_DragObject); + DoMethod(data->wd_DropObject, MUIM_DragFinish, + (IPTR) data->wd_DragObject); data->wd_DropObject = NULL; } DeleteDragNDrop(data->wd_dnd); - DoMethod(data->wd_DragObject, MUIM_DeleteDragImage, (IPTR)data->wd_DragImage); + DoMethod(data->wd_DragObject, MUIM_DeleteDragImage, + (IPTR) data->wd_DragImage); muiAreaData(data->wd_DragObject)->mad_Flags &= ~MADF_DRAGGING; data->wd_DragImage = NULL; data->wd_DragObject = NULL; data->wd_DropWindow = NULL; data->wd_dnd = NULL; + /* stop listening to IDCMP_MOUSEMOVE */ ChangeEvents(data, GetDefaultEvents()); } - ReplyMsg((struct Message*)imsg); + ReplyMsg((struct Message *)imsg); } /* Reply to imsg if handled */ -BOOL HandleWindowEvent (Object *oWin, struct MUI_WindowData *data, - struct IntuiMessage *imsg) +BOOL HandleWindowEvent(Object *oWin, struct MUI_WindowData *data, + struct IntuiMessage *imsg) { struct Window *iWin; BOOL is_handled = TRUE; @@ -1526,347 +1556,375 @@ BOOL HandleWindowEvent (Object *oWin, struct MUI_WindowData *data, iWin = imsg->IDCMPWindow; switch (imsg->Class) { - case IDCMP_ACTIVEWINDOW: - data->wd_Flags |= MUIWF_ACTIVE; - if (data->wd_OldActive) + case IDCMP_ACTIVEWINDOW: + data->wd_Flags |= MUIWF_ACTIVE; + if (data->wd_OldActive) set(oWin, MUIA_Window_ActiveObject, data->wd_OldActive); - set(oWin, MUIA_Window_Activate, TRUE); - is_handled = FALSE; /* forwardable to area event handlers */ - break; + set(oWin, MUIA_Window_Activate, TRUE); + is_handled = FALSE; /* forwardable to area event handlers */ + break; - case IDCMP_INACTIVEWINDOW: - KillHelpBubble(data, oWin, TRUE); - if (data->wd_ActiveObject) - { - data->wd_OldActive = data->wd_ActiveObject; - set(oWin, MUIA_Window_ActiveObject, MUIV_Window_ActiveObject_None); - } - data->wd_Flags &= ~MUIWF_ACTIVE; - set(oWin, MUIA_Window_Activate, FALSE); - is_handled = FALSE; /* forwardable to area event handlers */ - break; + case IDCMP_INACTIVEWINDOW: + KillHelpBubble(data, oWin, TRUE); + if (data->wd_ActiveObject) + { + data->wd_OldActive = data->wd_ActiveObject; + set(oWin, MUIA_Window_ActiveObject, + MUIV_Window_ActiveObject_None); + } + data->wd_Flags &= ~MUIWF_ACTIVE; + set(oWin, MUIA_Window_Activate, FALSE); + is_handled = FALSE; /* forwardable to area event handlers */ + break; - case IDCMP_NEWSIZE: - ReplyMsg((struct Message*)imsg); - replied = TRUE; + case IDCMP_NEWSIZE: + ReplyMsg((struct Message *)imsg); + replied = TRUE; - { - int hborders = iWin->BorderLeft + iWin->BorderRight; - int vborders = iWin->BorderTop + iWin->BorderBottom; - - /* set window limits according to window contents */ - WindowLimits - ( - iWin, - data->wd_MinMax.MinWidth + hborders, - data->wd_MinMax.MinHeight + vborders, - data->wd_MinMax.MaxWidth + hborders, - data->wd_MinMax.MaxHeight + vborders - ); - } + { + int hborders = iWin->BorderLeft + iWin->BorderRight; + int vborders = iWin->BorderTop + iWin->BorderBottom; + + /* set window limits according to window contents */ + WindowLimits + (iWin, + data->wd_MinMax.MinWidth + hborders, + data->wd_MinMax.MinHeight + vborders, + data->wd_MinMax.MaxWidth + hborders, + data->wd_MinMax.MaxHeight + vborders); + } - if ((iWin->GZZWidth != data->wd_Width) || (iWin->GZZHeight != data->wd_Height)) - { - data->wd_Width = iWin->GZZWidth; - data->wd_Height = iWin->GZZHeight; - DoHideMethod(data->wd_RootObject); + if ((iWin->GZZWidth != data->wd_Width) + || (iWin->GZZHeight != data->wd_Height)) + { + data->wd_Width = iWin->GZZWidth; + data->wd_Height = iWin->GZZHeight; + DoHideMethod(data->wd_RootObject); - if (1) // why only simple refresh? was: if (data->wd_RenderInfo.mri_Window->Flags & WFLG_SIMPLE_REFRESH) - { - data->wd_Flags |= MUIWF_RESIZING; - } - else - { - _width(data->wd_RootObject) = data->wd_Width; - _height(data->wd_RootObject) = data->wd_Height; - DoMethod(data->wd_RootObject, MUIM_Layout); - DoShowMethod(data->wd_RootObject); - { - LONG left,top,width,height; - - left = data->wd_RenderInfo.mri_Window->BorderLeft; - top = data->wd_RenderInfo.mri_Window->BorderTop, - width = data->wd_RenderInfo.mri_Window->Width - - data->wd_RenderInfo.mri_Window->BorderRight - left; - height = data->wd_RenderInfo.mri_Window->Height - - data->wd_RenderInfo.mri_Window->BorderBottom - top; - - // D(bug("%d:zune_imspec_draw(%p) l=%d t=%d w=%d h=%d xo=%d yo=%d\n", - // __LINE__, data->wd_Background, left, top, width, - // height, left, top)); - zune_imspec_draw(data->wd_Background, &data->wd_RenderInfo, - left, top, width, height, left, top, 0); - } - if (muiGlobalInfo(oWin)->mgi_Prefs->window_redraw == WINDOW_REDRAW_WITHOUT_CLEAR) - MUI_Redraw(data->wd_RootObject, MADF_DRAWOBJECT); - else - MUI_Redraw(data->wd_RootObject, MADF_DRAWALL); - // but should only draw focus without using MUIM_GoActive ! - ActivateObject(data); - } + if (1) + // why only simple refresh? was: if ( + // data->wd_RenderInfo.mri_Window->Flags & WFLG_SIMPLE_REFRESH) + { + data->wd_Flags |= MUIWF_RESIZING; } - break; - - case IDCMP_REFRESHWINDOW: - ReplyMsg((struct Message*)imsg); - replied = TRUE; - if (data->wd_Flags & MUIWF_RESIZING) + else { - //LONG left,top,right,bottom; - if (MUI_BeginRefresh(&data->wd_RenderInfo, 0)) - { - MUI_EndRefresh(&data->wd_RenderInfo, 0); - } - RefreshWindowFrame(data->wd_RenderInfo.mri_Window); - - data->wd_Flags &= ~MUIWF_RESIZING; _width(data->wd_RootObject) = data->wd_Width; _height(data->wd_RootObject) = data->wd_Height; DoMethod(data->wd_RootObject, MUIM_Layout); DoShowMethod(data->wd_RootObject); - - if (muiGlobalInfo(oWin)->mgi_Prefs->window_redraw == WINDOW_REDRAW_WITH_CLEAR) { - LONG left,top,width,height; + LONG left, top, width, height; left = data->wd_RenderInfo.mri_Window->BorderLeft; - top = data->wd_RenderInfo.mri_Window->BorderTop; - width = data->wd_RenderInfo.mri_Window->Width - data->wd_RenderInfo.mri_Window->BorderRight - left; - height = data->wd_RenderInfo.mri_Window->Height - data->wd_RenderInfo.mri_Window->BorderBottom - top; - - if(data->wd_Flags & MUIWF_ERASEAREA) - { - // D(bug("%d:zune_imspec_draw(%p) l=%d t=%d w=%d h=%d xo=%d yo=%d\n", - // __LINE__, data->wd_Background, left, top, width, - // height, left, top)); - zune_imspec_draw(data->wd_Background, &data->wd_RenderInfo, - left, top, width, height, left, top, 0); - } - MUI_Redraw(data->wd_RootObject, MADF_DRAWALL); + top = data->wd_RenderInfo.mri_Window->BorderTop, + width = data->wd_RenderInfo.mri_Window->Width + - data->wd_RenderInfo.mri_Window->BorderRight - + left; + height = + data->wd_RenderInfo.mri_Window->Height - + data->wd_RenderInfo.mri_Window->BorderBottom - top; + + //D(bug("%d:zune_imspec_draw(%p) " + // "l=%d t=%d w=%d h=%d xo=%d yo=%d\n", + // __LINE__, data->wd_Background, left, top, width, + // height, left, top)); + zune_imspec_draw(data->wd_Background, + &data->wd_RenderInfo, left, top, width, height, + left, top, 0); } - else + if (muiGlobalInfo(oWin)->mgi_Prefs->window_redraw == + WINDOW_REDRAW_WITHOUT_CLEAR) MUI_Redraw(data->wd_RootObject, MADF_DRAWOBJECT); + else + MUI_Redraw(data->wd_RootObject, MADF_DRAWALL); // but should only draw focus without using MUIM_GoActive ! ActivateObject(data); } - else + } + break; + + case IDCMP_REFRESHWINDOW: + ReplyMsg((struct Message *)imsg); + replied = TRUE; + if (data->wd_Flags & MUIWF_RESIZING) + { + //LONG left,top,right,bottom; + if (MUI_BeginRefresh(&data->wd_RenderInfo, 0)) + { + MUI_EndRefresh(&data->wd_RenderInfo, 0); + } + RefreshWindowFrame(data->wd_RenderInfo.mri_Window); + + data->wd_Flags &= ~MUIWF_RESIZING; + _width(data->wd_RootObject) = data->wd_Width; + _height(data->wd_RootObject) = data->wd_Height; + DoMethod(data->wd_RootObject, MUIM_Layout); + DoShowMethod(data->wd_RootObject); + + if (muiGlobalInfo(oWin)->mgi_Prefs->window_redraw == + WINDOW_REDRAW_WITH_CLEAR) { - if (MUI_BeginRefresh(&data->wd_RenderInfo, 0)) + LONG left, top, width, height; + + left = data->wd_RenderInfo.mri_Window->BorderLeft; + top = data->wd_RenderInfo.mri_Window->BorderTop; + width = + data->wd_RenderInfo.mri_Window->Width - + data->wd_RenderInfo.mri_Window->BorderRight - left; + height = + data->wd_RenderInfo.mri_Window->Height - + data->wd_RenderInfo.mri_Window->BorderBottom - top; + + if (data->wd_Flags & MUIWF_ERASEAREA) { - MUI_Redraw(data->wd_RootObject, MADF_DRAWALL); - // but should only draw focus without using MUIM_GoActive ! - ActivateObject(data); - MUI_EndRefresh(&data->wd_RenderInfo, 0); + //D(bug("%d:zune_imspec_draw(%p) " + // "l=%d t=%d w=%d h=%d xo=%d yo=%d\n", + // __LINE__, data->wd_Background, left, top, width, + // height, left, top)); + zune_imspec_draw(data->wd_Background, + &data->wd_RenderInfo, left, top, width, height, + left, top, 0); } + MUI_Redraw(data->wd_RootObject, MADF_DRAWALL); } - break; + else + MUI_Redraw(data->wd_RootObject, MADF_DRAWOBJECT); + // but should only draw focus without using MUIM_GoActive ! + ActivateObject(data); + } + else + { + if (MUI_BeginRefresh(&data->wd_RenderInfo, 0)) + { + MUI_Redraw(data->wd_RootObject, MADF_DRAWALL); + // but should only draw focus without using MUIM_GoActive ! + ActivateObject(data); + MUI_EndRefresh(&data->wd_RenderInfo, 0); + } + } + break; - case IDCMP_CLOSEWINDOW: - ReplyMsg((struct Message*)imsg); - replied = TRUE; - set(oWin, MUIA_Window_CloseRequest, TRUE); - break; + case IDCMP_CLOSEWINDOW: + ReplyMsg((struct Message *)imsg); + replied = TRUE; + set(oWin, MUIA_Window_CloseRequest, TRUE); + break; - case IDCMP_MENUPICK: - ReplyMsg((struct Message*)imsg); - replied = TRUE; + case IDCMP_MENUPICK: + ReplyMsg((struct Message *)imsg); + replied = TRUE; - if (data->wd_Menu) + if (data->wd_Menu) + { + if (MENUNUM(imsg->Code) != NOMENU + && ITEMNUM(imsg->Code) != NOITEM) { - if (MENUNUM(imsg->Code) != NOMENU && ITEMNUM(imsg->Code) != NOITEM) + struct MenuItem *item = + ItemAddress(data->wd_Menu, imsg->Code); + if (item) { - struct MenuItem *item = ItemAddress(data->wd_Menu,imsg->Code); - if (item) + Object *item_obj = (Object *) GTMENUITEM_USERDATA(item); + if (item_obj) { - Object *item_obj = (Object*)GTMENUITEM_USERDATA(item); - if (item_obj) - { - Object *app = NULL; - IPTR udata = 0; + Object *app = NULL; + IPTR udata = 0; - if (item->Flags & CHECKIT) - set(item_obj, MUIA_Menuitem_Checked, !!(item->Flags & CHECKED)); + if (item->Flags & CHECKIT) + set(item_obj, MUIA_Menuitem_Checked, + ! !(item->Flags & CHECKED)); - set(item_obj, MUIA_Menuitem_Trigger, (IPTR)item); + set(item_obj, MUIA_Menuitem_Trigger, (IPTR) item); - get(oWin, MUIA_ApplicationObject, &app); - get(item_obj, MUIA_UserData, &udata); + get(oWin, MUIA_ApplicationObject, &app); + get(item_obj, MUIA_UserData, &udata); - set(app, MUIA_Application_MenuAction, udata); - set(oWin, MUIA_Window_MenuAction, udata); - DoMethod(app, MUIM_Application_ReturnID, udata); - } + set(app, MUIA_Application_MenuAction, udata); + set(oWin, MUIA_Window_MenuAction, udata); + DoMethod(app, MUIM_Application_ReturnID, udata); } } } - break; + } + break; - case IDCMP_IDCMPUPDATE: - is_handled = FALSE; /* forwardable to area event handlers */ - if (data->wd_VertProp || data->wd_HorizProp) + case IDCMP_IDCMPUPDATE: + is_handled = FALSE; /* forwardable to area event handlers */ + if (data->wd_VertProp || data->wd_HorizProp) + { + struct TagItem *tag; + tag = FindTagItem(GA_ID, (struct TagItem *)imsg->IAddress); + if (tag) { - struct TagItem *tag; - tag = FindTagItem(GA_ID,(struct TagItem*)imsg->IAddress); - if (tag) + /* If there's a propclass object connected to the prop + gadget, the prop gadget's userdata will point to + that propclass object. See classes/prop.c */ + + if (data->wd_VertProp) { - /* If there's a propclass object connected to the prop - gadget, the prop gadget's userdata will point to - that propclass object. See classes/prop.c */ + if (tag->ti_Data == GADGETID(data->wd_VertProp)) + ; - if (data->wd_VertProp) + if (tag->ti_Data == GADGETID(data->wd_UpButton)) { - if (tag->ti_Data == GADGETID(data->wd_VertProp)) - ; - - if (tag->ti_Data == GADGETID(data->wd_UpButton)) - { - Object *prop = (Object *)((struct Gadget *)data->wd_VertProp)->UserData; - is_handled = TRUE; - if (prop) DoMethod(prop, MUIM_Prop_Decrease, 1); - } - - if (tag->ti_Data == GADGETID(data->wd_DownButton)) - { - Object *prop = (Object *)((struct Gadget *)data->wd_VertProp)->UserData; - is_handled = TRUE; - if (prop) DoMethod(prop, MUIM_Prop_Increase, 1); - } - + Object *prop = + (Object *) ((struct Gadget *)data-> + wd_VertProp)->UserData; + is_handled = TRUE; + if (prop) + DoMethod(prop, MUIM_Prop_Decrease, 1); } - if (data->wd_HorizProp) + if (tag->ti_Data == GADGETID(data->wd_DownButton)) { - if (tag->ti_Data == GADGETID(data->wd_HorizProp)) - ; + Object *prop = + (Object *) ((struct Gadget *)data-> + wd_VertProp)->UserData; + is_handled = TRUE; + if (prop) + DoMethod(prop, MUIM_Prop_Increase, 1); + } - if (tag->ti_Data == GADGETID(data->wd_LeftButton)) - { - Object *prop = (Object *)((struct Gadget *)data->wd_HorizProp)->UserData; - is_handled = TRUE; - if (prop) DoMethod(prop, MUIM_Prop_Decrease, 1); - } + } - if (tag->ti_Data == GADGETID(data->wd_RightButton)) - { - Object *prop = (Object *)((struct Gadget *)data->wd_HorizProp)->UserData; - is_handled = TRUE; - if (prop) DoMethod(prop, MUIM_Prop_Increase, 1); - } + if (data->wd_HorizProp) + { + if (tag->ti_Data == GADGETID(data->wd_HorizProp)) + ; + if (tag->ti_Data == GADGETID(data->wd_LeftButton)) + { + Object *prop = + (Object *) ((struct Gadget *)data-> + wd_HorizProp)->UserData; + is_handled = TRUE; + if (prop) + DoMethod(prop, MUIM_Prop_Decrease, 1); } + + if (tag->ti_Data == GADGETID(data->wd_RightButton)) + { + Object *prop = + (Object *) ((struct Gadget *)data-> + wd_HorizProp)->UserData; + is_handled = TRUE; + if (prop) + DoMethod(prop, MUIM_Prop_Increase, 1); + } + } } - break; + } + break; - case IDCMP_INTUITICKS: - if (data->wd_HelpTicker) + case IDCMP_INTUITICKS: + if (data->wd_HelpTicker) + { + data->wd_HelpTicker--; + + if (data->wd_HelpTicker == 0) { - data->wd_HelpTicker--; + Object *underobj = + ObjectUnderPointer(data, data->wd_RootObject, + imsg->MouseX, imsg->MouseY, + ShortHelpUnderPointerCheck); - if (data->wd_HelpTicker == 0) + if (underobj != data->wd_HelpObject) { - Object *underobj = ObjectUnderPointer(data, data->wd_RootObject, imsg->MouseX, imsg->MouseY, - ShortHelpUnderPointerCheck); - - if (underobj != data->wd_HelpObject) + if (data->wd_HelpObject) { - if (data->wd_HelpObject) - { - DoMethod(data->wd_HelpObject, MUIM_DeleteBubble, (IPTR)data->wd_HelpBubble); - - data->wd_HelpObject = NULL; - data->wd_HelpBubble = NULL; - } + DoMethod(data->wd_HelpObject, MUIM_DeleteBubble, + (IPTR) data->wd_HelpBubble); - if (underobj) - { - data->wd_HelpBubble = (APTR)DoMethod(underobj, MUIM_CreateBubble, - imsg->MouseX, imsg->MouseY, - 0, 0); - if (data->wd_HelpBubble) - { - data->wd_HelpObject = underobj; - data->wd_Flags |= MUIWF_BUBBLEMODE; - } - } + data->wd_HelpObject = NULL; + data->wd_HelpBubble = NULL; } - if (data->wd_Flags & MUIWF_BUBBLEMODE) - { - data->wd_HelpTicker = BUBBLEHELP_TICKER_LATER; - } - else + if (underobj) { - data->wd_HelpTicker = BUBBLEHELP_TICKER_FIRST; + data->wd_HelpBubble = + (APTR) DoMethod(underobj, MUIM_CreateBubble, + imsg->MouseX, imsg->MouseY, 0, 0); + if (data->wd_HelpBubble) + { + data->wd_HelpObject = underobj; + data->wd_Flags |= MUIWF_BUBBLEMODE; + } } + } - } /* if (data->wd_HelpTicker == 0) */ - - } /* if (data->wd_HelpTicker) */ + if (data->wd_Flags & MUIWF_BUBBLEMODE) + { + data->wd_HelpTicker = BUBBLEHELP_TICKER_LATER; + } + else + { + data->wd_HelpTicker = BUBBLEHELP_TICKER_FIRST; + } + } + } - is_handled = FALSE; /* forwardable to area event handlers */ - break; + is_handled = FALSE; /* forwardable to area event handlers */ + break; - case IDCMP_MOUSEBUTTONS: - DoMethod(oWin,MUIM_Window_Snapshot,0); - KillHelpBubble(data, oWin, TRUE); - is_handled = FALSE; - break; + case IDCMP_MOUSEBUTTONS: + DoMethod(oWin, MUIM_Window_Snapshot, 0); + KillHelpBubble(data, oWin, TRUE); + is_handled = FALSE; + break; - case IDCMP_MOUSEMOVE: - KillHelpBubble(data, oWin, FALSE); - is_handled = FALSE; - break; + case IDCMP_MOUSEMOVE: + KillHelpBubble(data, oWin, FALSE); + is_handled = FALSE; + break; - default: - is_handled = FALSE; - break; - } /* switch (imsg->Class) */ + default: + is_handled = FALSE; + break; + } if (is_handled && !replied) - ReplyMsg((struct Message*)imsg); + ReplyMsg((struct Message *)imsg); return is_handled; } -static ULONG InvokeEventHandler (struct MUI_EventHandlerNode *ehn, - struct IntuiMessage *event, ULONG muikey) +static ULONG InvokeEventHandler(struct MUI_EventHandlerNode *ehn, + struct IntuiMessage *event, ULONG muikey) { ULONG res; - if (!(_flags(ehn->ehn_Object) & MADF_CANDRAW)) return 0; - if (!(_flags(ehn->ehn_Object) & MADF_SHOWME)) return 0; + if (!(_flags(ehn->ehn_Object) & MADF_CANDRAW)) + return 0; + if (!(_flags(ehn->ehn_Object) & MADF_SHOWME)) + return 0; - if - ( - event != NULL + if (event != NULL && event->Class == IDCMP_MOUSEBUTTONS && event->Code == SELECTDOWN - && (_flags(ehn->ehn_Object) & MADF_INVIRTUALGROUP) - ) + && (_flags(ehn->ehn_Object) & MADF_INVIRTUALGROUP)) { /* - Here we filter out SELECTDOWN messages if objects is in a virtual - group but the click went out of the virtual group - */ + Here we filter out SELECTDOWN messages if objects is in a virtual + group but the click went out of the virtual group + */ Object *obj = ehn->ehn_Object; Object *parent = obj; Object *wnd = _win(obj); - while (get(parent,MUIA_Parent,&parent)) + while (get(parent, MUIA_Parent, &parent)) { - if (!parent) break; - if (wnd == parent) break; + if (!parent) + break; + if (wnd == parent) + break; if (_flags(parent) & MADF_ISVIRTUALGROUP) { - if - ( - event->MouseX < _mleft(parent) + if (event->MouseX < _mleft(parent) || event->MouseX > _mright(parent) || event->MouseY < _mtop(parent) - || event->MouseY > _mbottom(parent) - ) + || event->MouseY > _mbottom(parent)) { return 0; } @@ -1877,59 +1935,60 @@ static ULONG InvokeEventHandler (struct MUI_EventHandlerNode *ehn, if (ehn->ehn_Flags & MUI_EHF_HANDLEINPUT) { - DoMethod(ehn->ehn_Object, MUIM_HandleInput, (IPTR)event, muikey); + DoMethod(ehn->ehn_Object, MUIM_HandleInput, (IPTR) event, muikey); res = 0; } else { if (ehn->ehn_Class) res = CoerceMethod - ( - ehn->ehn_Class, ehn->ehn_Object, MUIM_HandleEvent, - (IPTR)event, muikey - ); + (ehn->ehn_Class, ehn->ehn_Object, MUIM_HandleEvent, + (IPTR) event, muikey); else - res = DoMethod(ehn->ehn_Object, MUIM_HandleEvent, (IPTR)event, muikey); + res = + DoMethod(ehn->ehn_Object, MUIM_HandleEvent, (IPTR) event, + muikey); } return res; } static void HandleRawkey(Object *win, struct MUI_WindowData *data, - struct IntuiMessage *event) + struct IntuiMessage *event) { - struct MinNode *mn; + struct MinNode *mn; struct MUI_EventHandlerNode *ehn; - struct IntuiMessage imsg_copy; - struct InputEvent ie = {0}; - ULONG res; - LONG muikey = MUIKEY_NONE; - Object *active_object = NULL; - IPTR disabled = 0; - ULONG key; - ULONG deadkey; + struct IntuiMessage imsg_copy; + struct InputEvent ie = { 0 }; + ULONG res; + LONG muikey = MUIKEY_NONE; + Object *active_object = NULL; + IPTR disabled = 0; + ULONG key; + ULONG deadkey; KillHelpBubble(data, win, BUBBLEHELP_TICKER_FIRST); - ie.ie_NextEvent = NULL; - ie.ie_Class = IECLASS_RAWKEY; - ie.ie_SubClass = 0; - ie.ie_Code = event->Code; - ie.ie_Qualifier = event->Qualifier; - ie.ie_EventAddress = (APTR)*(IPTR *)event->IAddress; + ie.ie_NextEvent = NULL; + ie.ie_Class = IECLASS_RAWKEY; + ie.ie_SubClass = 0; + ie.ie_Code = event->Code; + ie.ie_Qualifier = event->Qualifier; + ie.ie_EventAddress = (APTR) * (IPTR *) event->IAddress; #ifdef __AMIGAOS4__ - ie.ie_TimeStamp.Seconds = event->Seconds; + ie.ie_TimeStamp.Seconds = event->Seconds; ie.ie_TimeStamp.Microseconds = event->Micros; #else - ie.ie_TimeStamp.tv_secs = event->Seconds; - ie.ie_TimeStamp.tv_micro = event->Micros; + ie.ie_TimeStamp.tv_secs = event->Seconds; + ie.ie_TimeStamp.tv_micro = event->Micros; #endif - set(win, MUIA_Window_InputEvent, (IPTR)&ie); + set(win, MUIA_Window_InputEvent, (IPTR) & ie); /* get the vanilla key for control char */ { UWORD msg_code; - /* Remove the up prefix as convert key does not convert a upkey event */ + + /* Remove the up prefix as convert key does not convert upkey event */ msg_code = event->Code; event->Code &= ~IECODE_UP_PREFIX; key = ConvertKey(event); @@ -1937,9 +1996,9 @@ static void HandleRawkey(Object *win, struct MUI_WindowData *data, } imsg_copy = *event; - deadkey = *(ULONG *)event->IAddress; + deadkey = *(ULONG *) event->IAddress; imsg_copy.IAddress = &deadkey; - ReplyMsg((struct Message*)event); + ReplyMsg((struct Message *)event); event = &imsg_copy; //bug("rawkey: code=%lx, qual=%lx\n", event->Code, event->Qualifier); @@ -1949,11 +2008,11 @@ static void HandleRawkey(Object *win, struct MUI_WindowData *data, struct InputEvent ievent; BOOL matched = FALSE; - ievent.ie_NextEvent = NULL; - ievent.ie_Class = IECLASS_RAWKEY; - ievent.ie_SubClass = 0; - ievent.ie_Code = event->Code; - ievent.ie_Qualifier = event->Qualifier; + ievent.ie_NextEvent = NULL; + ievent.ie_Class = IECLASS_RAWKEY; + ievent.ie_SubClass = 0; + ievent.ie_Code = event->Code; + ievent.ie_Qualifier = event->Qualifier; /* ie_EventAddress is not used by MatchIX. If needed, it should be * ensured that it is still a valid adress because of the shallow * IntuiMessage copy currently done in _zune_window_message before @@ -1965,7 +2024,8 @@ static void HandleRawkey(Object *win, struct MUI_WindowData *data, for (muikey = MUIKEY_COUNT - 1; muikey >= MUIKEY_PRESS; muikey--) { if (muiGlobalInfo(win)->mgi_Prefs->muikeys[muikey].ix_well != 0 - && MatchIX(&ievent, &muiGlobalInfo(win)->mgi_Prefs->muikeys[muikey].ix)) + && MatchIX(&ievent, + &muiGlobalInfo(win)->mgi_Prefs->muikeys[muikey].ix)) { matched = TRUE; break; @@ -1981,52 +2041,74 @@ static void HandleRawkey(Object *win, struct MUI_WindowData *data, { muikey = MUIKEY_NONE; } - } /* check if imsg translate to predefined keystroke */ + } /* check if imsg translate to predefined keystroke */ - if ((muikey != MUIKEY_NONE) - && !(data->wd_DisabledKeys & (1<<muikey))) + if ((muikey != MUIKEY_NONE) && !(data->wd_DisabledKeys & (1 << muikey))) { - D(bug("HandleRawkey: try MUIKEY %ld on window %0x08lx\n", muikey, win)); + D(bug("HandleRawkey: try MUIKEY %ld on window %0x08lx\n", muikey, + win)); switch (muikey) { - case MUIKEY_PRESS: break; - case MUIKEY_TOGGLE: break; - case MUIKEY_UP: break; - case MUIKEY_DOWN: break; - case MUIKEY_PAGEUP: break; - case MUIKEY_PAGEDOWN: break; - case MUIKEY_TOP: break; - case MUIKEY_BOTTOM: break; - case MUIKEY_LEFT: break; - case MUIKEY_RIGHT: break; - case MUIKEY_WORDLEFT: break; - case MUIKEY_WORDRIGHT: break; - case MUIKEY_LINESTART: break; - case MUIKEY_LINEEND: break; - case MUIKEY_GADGET_NEXT: - set(win, MUIA_Window_ActiveObject, MUIV_Window_ActiveObject_Next); - break; - case MUIKEY_GADGET_PREV: - set(win, MUIA_Window_ActiveObject, MUIV_Window_ActiveObject_Prev); - break; - case MUIKEY_GADGET_OFF: - set(win, MUIA_Window_ActiveObject, MUIV_Window_ActiveObject_None); - break; - case MUIKEY_WINDOW_CLOSE: - set(win, MUIA_Window_CloseRequest, TRUE); - break; - case MUIKEY_WINDOW_NEXT: break; - case MUIKEY_WINDOW_PREV: break; - case MUIKEY_HELP: break; - case MUIKEY_POPUP: break; - default: break; + case MUIKEY_PRESS: + break; + case MUIKEY_TOGGLE: + break; + case MUIKEY_UP: + break; + case MUIKEY_DOWN: + break; + case MUIKEY_PAGEUP: + break; + case MUIKEY_PAGEDOWN: + break; + case MUIKEY_TOP: + break; + case MUIKEY_BOTTOM: + break; + case MUIKEY_LEFT: + break; + case MUIKEY_RIGHT: + break; + case MUIKEY_WORDLEFT: + break; + case MUIKEY_WORDRIGHT: + break; + case MUIKEY_LINESTART: + break; + case MUIKEY_LINEEND: + break; + case MUIKEY_GADGET_NEXT: + set(win, MUIA_Window_ActiveObject, + MUIV_Window_ActiveObject_Next); + break; + case MUIKEY_GADGET_PREV: + set(win, MUIA_Window_ActiveObject, + MUIV_Window_ActiveObject_Prev); + break; + case MUIKEY_GADGET_OFF: + set(win, MUIA_Window_ActiveObject, + MUIV_Window_ActiveObject_None); + break; + case MUIKEY_WINDOW_CLOSE: + set(win, MUIA_Window_CloseRequest, TRUE); + break; + case MUIKEY_WINDOW_NEXT: + break; + case MUIKEY_WINDOW_PREV: + break; + case MUIKEY_HELP: + break; + case MUIKEY_POPUP: + break; + default: + break; } } active_object = NULL; if ((data->wd_ActiveObject != NULL) && (DoMethod(data->wd_RootObject, MUIM_FindAreaObject, - (IPTR)data->wd_ActiveObject) != (IPTR)NULL)) + (IPTR) data->wd_ActiveObject) != (IPTR) NULL)) { active_object = data->wd_ActiveObject; get(active_object, MUIA_Disabled, &disabled); @@ -2039,21 +2121,25 @@ static void HandleRawkey(Object *win, struct MUI_WindowData *data, { #if 0 /* sba: - ** Which method should be used for muikeys? MUIM_HandleInput or - ** MUIM_HandleEvent. Also note that there is a flag MUI_EHF_ALWAYSKEYS - ** which probably means that all keys events are requested?? - ** For now MUIM_HandleEvent is used as this is currently implemented - ** in Area class ;) although I guess it should be MUIM_HandleInput as this - ** was earlier - */ + ** Which method should be used for muikeys? MUIM_HandleInput or + ** MUIM_HandleEvent. Also note that there is a flag MUI_EHF_ALWAYSKEYS + ** which probably means that all keys events are requested?? + ** For now MUIM_HandleEvent is used as this is currently implemented + ** in Area class ;) although I guess it should be MUIM_HandleInput as + ** this was earlier + */ if (muikey != MUIKEY_NONE) { - res = DoMethod(active_object, MUIM_HandleEvent, (IPTR)event, muikey); - if (res & MUI_EventHandlerRC_Eat) return; + res = + DoMethod(active_object, MUIM_HandleEvent, (IPTR) event, + muikey); + if (res & MUI_EventHandlerRC_Eat) + return; } #endif - D(bug("HandleRawkey: try active object (%08lx) handlers\n", active_object)); + D(bug("HandleRawkey: try active object (%08lx) handlers\n", + active_object)); for (mn = data->wd_EHList.mlh_Head; mn->mln_Succ; mn = mn->mln_Succ) { @@ -2063,8 +2149,9 @@ static void HandleRawkey(Object *win, struct MUI_WindowData *data, && ((ehn->ehn_Events & IDCMP_RAWKEY) || (ehn->ehn_Flags & MUI_EHF_ALWAYSKEYS))) { - D(bug("HandleRawkey: (active) invoking on %p (ehn=%p) event=%p muikey=%p\n", - ehn->ehn_Object, ehn, event, muikey)); + D(bug("HandleRawkey: (active) invoking on %p (ehn=%p) " + "event=%p muikey=%p\n", + ehn->ehn_Object, ehn, event, muikey)); res = InvokeEventHandler(ehn, event, muikey); D(bug("HandleRawkey: (active) got res=%d\n", res)); if (res & MUI_EventHandlerRC_Eat) @@ -2074,7 +2161,7 @@ static void HandleRawkey(Object *win, struct MUI_WindowData *data, if (active_object != data->wd_ActiveObject) break; } - } /* for (mn = data->wd_EHList.mlh_Head; mn->mln_Succ; mn = mn->mln_Succ) */ + } // event not eaten by active object, try its parents // this is to implement popup key in Popstring @@ -2085,31 +2172,34 @@ static void HandleRawkey(Object *win, struct MUI_WindowData *data, D(bug("HandleRawkey: try active object parents handlers\n")); while (current_obj != NULL) { - for (mn = data->wd_EHList.mlh_Head; mn->mln_Succ; mn = mn->mln_Succ) + for (mn = data->wd_EHList.mlh_Head; mn->mln_Succ; + mn = mn->mln_Succ) { ehn = (struct MUI_EventHandlerNode *)mn; if ((ehn->ehn_Object == current_obj) - && ((ehn->ehn_Events & IDCMP_RAWKEY) - || (ehn->ehn_Flags & MUI_EHF_ALWAYSKEYS))) + && ((ehn->ehn_Events & IDCMP_RAWKEY) + || (ehn->ehn_Flags & MUI_EHF_ALWAYSKEYS))) { - //D(bug("HandleRawkey: (active parents) invoking on %p (ehn=%p) " - //"event=%p muikey=%p\n", - //ehn->ehn_Object, ehn, event, muikey)); + //D(bug("HandleRawkey: (active parents) invoking on " + // "%p (ehn=%p) event=%p muikey=%p\n", + // ehn->ehn_Object, ehn, event, muikey)); res = InvokeEventHandler(ehn, event, muikey); - //D(bug("HandleRawkey: (active parents) got res=%d\n", res)); + //D(bug("HandleRawkey: (active parents) got res=%d\n", + // res)); if (res & MUI_EventHandlerRC_Eat) return; - /* Leave the loop if a different object has been activated */ + /* Leave the loop if a different object has been + * activated */ if (active_object != data->wd_ActiveObject) break; } } - current_obj = (Object *)XGET(current_obj, MUIA_Parent); - } // while (current_obj != NULL) + current_obj = (Object *) XGET(current_obj, MUIA_Parent); + } } - } /* if (active_object && !disabled) */ + } D(bug("HandleRawkey: try default object handlers\n")); @@ -2120,8 +2210,10 @@ static void HandleRawkey(Object *win, struct MUI_WindowData *data, if ((data->wd_DefaultObject != NULL) && !disabled && (active_object != data->wd_DefaultObject)) { - /* No, we only should do this if the object actually has requested this via RequestIDCMP()! */ -// if (muikey != MUIKEY_NONE && (_flags(data->wd_DefaultObject) & MADF_CANDRAW)) + /* No, we only should do this if the object actually has requested + * this via RequestIDCMP()! */ +// if (muikey != MUIKEY_NONE +// && (_flags(data->wd_DefaultObject) & MADF_CANDRAW)) // { // DoMethod(data->wd_DefaultObject, MUIM_HandleInput, event, muikey); // return; @@ -2135,7 +2227,8 @@ static void HandleRawkey(Object *win, struct MUI_WindowData *data, && ((ehn->ehn_Events & IDCMP_RAWKEY) || (ehn->ehn_Flags & MUI_EHF_ALWAYSKEYS))) { - //D(bug("HandleRawkey: (default) invoking on %p (ehn=%p) event=%p muikey=%p\n", + //D(bug("HandleRawkey: (default) invoking on %p (ehn=%p) " + //"event=%p muikey=%p\n", //ehn->ehn_Object, ehn, event, muikey)); res = InvokeEventHandler(ehn, event, muikey); //D(bug("HandleRawkey: (default) got res=%d\n", res)); @@ -2144,7 +2237,7 @@ static void HandleRawkey(Object *win, struct MUI_WindowData *data, } } - } /* if ... default object */ + } D(bug("HandleRawkey: try other handlers\n")); @@ -2155,19 +2248,21 @@ static void HandleRawkey(Object *win, struct MUI_WindowData *data, // skip Active and Default object as they have already been // handled - if (ehn->ehn_Object == data->wd_ActiveObject || ehn->ehn_Object == data->wd_DefaultObject) + if (ehn->ehn_Object == data->wd_ActiveObject + || ehn->ehn_Object == data->wd_DefaultObject) continue; if (ehn->ehn_Events & IDCMP_RAWKEY) { - //D(bug("HandleRawkey: (others) invoking on %p (ehn=%p) event=%p muikey=%p\n", + //D(bug("HandleRawkey: (others) invoking on %p (ehn=%p) " + //"event=%p muikey=%p\n", //ehn->ehn_Object, ehn, event, muikey)); res = InvokeEventHandler(ehn, event, MUIKEY_NONE); //D(bug("HandleRawkey: (others) got res=%d\n", res)); if (res & MUI_EventHandlerRC_Eat) return; } - } /* for (mn = data->wd_EHList.mlh_Head; mn->mln_Succ; mn = mn->mln_Succ) */ + } D(bug("HandleRawkey: try control chars handlers\n")); @@ -2188,7 +2283,7 @@ static void HandleRawkey(Object *win, struct MUI_WindowData *data, if (disabled) continue; - //bug("control char\n"); + //bug("control char\n"); if (event->Code & IECODE_UP_PREFIX) { /* simulate a release */ @@ -2203,33 +2298,31 @@ static void HandleRawkey(Object *win, struct MUI_WindowData *data, && (_flags(ehn->ehn_Object) & MADF_SHOWME)) { res = CoerceMethod - ( - ehn->ehn_Class, ehn->ehn_Object, MUIM_HandleEvent, - (IPTR)NULL, muikey2 - ); + (ehn->ehn_Class, ehn->ehn_Object, MUIM_HandleEvent, + (IPTR) NULL, muikey2); if (res & MUI_EventHandlerRC_Eat) return; } } } - } /* try control chars */ + } } /* forward non-keystroke events to event handlers */ static void HandleInputEvent(Object *win, struct MUI_WindowData *data, - struct IntuiMessage *event) + struct IntuiMessage *event) { - struct MinNode *mn; + struct MinNode *mn; struct MUI_EventHandlerNode *ehn; - struct IntuiMessage imsg_copy; - ULONG res; - ULONG mask = event->Class; + struct IntuiMessage imsg_copy; + ULONG res; + ULONG mask = event->Class; if (mask != IDCMP_IDCMPUPDATE) { imsg_copy = *event; - imsg_copy.IAddress = NULL; /* be sure to trap access to that */ - ReplyMsg((struct Message*)event); + imsg_copy.IAddress = NULL; /* be sure to trap access to that */ + ReplyMsg((struct Message *)event); event = &imsg_copy; } @@ -2238,8 +2331,8 @@ static void HandleInputEvent(Object *win, struct MUI_WindowData *data, struct Window *iWin; iWin = event->IDCMPWindow; - if (ContextMenuUnderPointer (data, data->wd_RootObject, - event->MouseX, event->MouseY)) + if (ContextMenuUnderPointer(data, data->wd_RootObject, + event->MouseX, event->MouseY)) { iWin->Flags |= WFLG_RMBTRAP; } @@ -2269,7 +2362,7 @@ static void HandleInputEvent(Object *win, struct MUI_WindowData *data, } if (mask == IDCMP_IDCMPUPDATE) - ReplyMsg((struct Message*)event); + ReplyMsg((struct Message *)event); } @@ -2278,12 +2371,12 @@ static void HandleInputEvent(Object *win, struct MUI_WindowData *data, void _zune_window_message(struct IntuiMessage *imsg) { struct Window *iWin; - Object *oWin; + Object *oWin; struct MUI_WindowData *data; BOOL handled; iWin = imsg->IDCMPWindow; - oWin = (Object *)iWin->UserData; + oWin = (Object *) iWin->UserData; data = muiWindowData(oWin); if (data->wd_DragObject) @@ -2300,7 +2393,7 @@ void _zune_window_message(struct IntuiMessage *imsg) else if (IDCMP_GADGETUP == imsg->Class) { #ifdef __AROS__ - if (ETI_MUI == ((struct Gadget *) imsg->IAddress)->GadgetID) + if (ETI_MUI == ((struct Gadget *)imsg->IAddress)->GadgetID) { DoMethod(_app(oWin), MUIM_Application_OpenConfigWindow); } @@ -2317,12 +2410,12 @@ void _zune_window_message(struct IntuiMessage *imsg) } } -/******************************************************************************/ -/******************************************************************************/ +/**************************************************************************/ +/**************************************************************************/ /* code for setting MUIA_Window_RootObject */ -static void ChangeRootObject (struct MUI_WindowData *data, Object *obj, - Object *newRoot) +static void ChangeRootObject(struct MUI_WindowData *data, Object *obj, + Object *newRoot) { Object *oldRoot; @@ -2335,7 +2428,8 @@ static void ChangeRootObject (struct MUI_WindowData *data, Object *obj, if (oldRoot) { if (data->wd_ActiveObject == oldRoot) - set(obj, MUIA_Window_ActiveObject, MUIV_Window_ActiveObject_None); + set(obj, MUIA_Window_ActiveObject, + MUIV_Window_ActiveObject_None); DoMethod(oldRoot, MUIM_DisconnectParent); } @@ -2344,7 +2438,7 @@ static void ChangeRootObject (struct MUI_WindowData *data, Object *obj, { /* if window is in App tree, inform child */ if (muiNotifyData(obj)->mnd_GlobalInfo) - DoMethod(newRoot, MUIM_ConnectParent, (IPTR)obj); + DoMethod(newRoot, MUIM_ConnectParent, (IPTR) obj); } } } @@ -2362,9 +2456,8 @@ static struct ObjNode *FindObjNode(struct MinList *list, Object *obj) ASSERT_VALID_PTR(obj); - for (node = (struct ObjNode*)list->mlh_Head; - node->node.mln_Succ; - node = (struct ObjNode*)node->node.mln_Succ) + for (node = (struct ObjNode *)list->mlh_Head; + node->node.mln_Succ; node = (struct ObjNode *)node->node.mln_Succ) { if (node->obj == obj) { @@ -2374,22 +2467,22 @@ static struct ObjNode *FindObjNode(struct MinList *list, Object *obj) return NULL; } -static Object *GetFirstActiveObject (struct MUI_WindowData *data) +static Object *GetFirstActiveObject(struct MUI_WindowData *data) { ASSERT_VALID_PTR(data); - if (!IsListEmpty((struct List*)&data->wd_CycleChain)) - return ((struct ObjNode*)data->wd_CycleChain.mlh_Head)->obj; + if (!IsListEmpty((struct List *)&data->wd_CycleChain)) + return ((struct ObjNode *)data->wd_CycleChain.mlh_Head)->obj; else return NULL; } -static Object *GetLastActiveObject (struct MUI_WindowData *data) +static Object *GetLastActiveObject(struct MUI_WindowData *data) { ASSERT_VALID_PTR(data); - if (!IsListEmpty((struct List*)&data->wd_CycleChain)) - return ((struct ObjNode*)data->wd_CycleChain.mlh_TailPred)->obj; + if (!IsListEmpty((struct List *)&data->wd_CycleChain)) + return ((struct ObjNode *)data->wd_CycleChain.mlh_TailPred)->obj; else return NULL; } @@ -2399,23 +2492,24 @@ typedef struct ObjNode *objnode_iterator_t(struct ObjNode *curr_node); static objnode_iterator_t NextObjNodeIterator; static objnode_iterator_t PrevObjNodeIterator; -static struct ObjNode *NextObjNodeIterator (struct ObjNode *curr_node) +static struct ObjNode *NextObjNodeIterator(struct ObjNode *curr_node) { if (curr_node->node.mln_Succ->mln_Succ) - return (struct ObjNode*)curr_node->node.mln_Succ; + return (struct ObjNode *)curr_node->node.mln_Succ; else return NULL; } -static struct ObjNode *PrevObjNodeIterator (struct ObjNode *curr_node) +static struct ObjNode *PrevObjNodeIterator(struct ObjNode *curr_node) { if (curr_node->node.mln_Pred->mln_Pred) - return (struct ObjNode*)curr_node->node.mln_Pred; + return (struct ObjNode *)curr_node->node.mln_Pred; else return NULL; } -static Object *GetPrevNextActiveObject (struct ObjNode *old_activenode, objnode_iterator_t node_iterator) +static Object *GetPrevNextActiveObject(struct ObjNode *old_activenode, + objnode_iterator_t node_iterator) { struct ObjNode *curr_node; struct ObjNode *node; @@ -2434,7 +2528,8 @@ static Object *GetPrevNextActiveObject (struct ObjNode *old_activenode, objnode_ if (node) obj = node->obj; - /* let's see if this obj meets cycle requirements (enabled & visible) */ + /* let's see if this object meets cycle requirements + * (enabled & visible) */ if (obj) { IPTR is_disabled = 0; @@ -2463,7 +2558,8 @@ Basically, it will: - set data->wd_ActiveObject to the new object - draw focus around the new active object **************************************************************************/ -static void SetActiveObject (struct MUI_WindowData *data, Object *obj, IPTR newval) +static void SetActiveObject(struct MUI_WindowData *data, Object *obj, + IPTR newval) { struct ObjNode *old_activenode = NULL; @@ -2471,15 +2567,16 @@ static void SetActiveObject (struct MUI_WindowData *data, Object *obj, IPTR newv ASSERT_VALID_PTR(obj); D(bug("MUIC_Window:SetActiveObject(data, obj, %08lx) Active=%p\n", - newval, data->wd_ActiveObject)); + newval, data->wd_ActiveObject)); if ((data->wd_ActiveObject != NULL) && (DoMethod(data->wd_RootObject, MUIM_FindAreaObject, - (IPTR)data->wd_ActiveObject) != (IPTR)NULL)) + (IPTR) data->wd_ActiveObject) != (IPTR) NULL)) { - if ((IPTR)data->wd_ActiveObject != newval) + if ((IPTR) data->wd_ActiveObject != newval) { - old_activenode = FindObjNode(&data->wd_CycleChain, data->wd_ActiveObject); + old_activenode = + FindObjNode(&data->wd_CycleChain, data->wd_ActiveObject); //if (_flags(data->wd_ActiveObject) & MADF_CANDRAW) if (data->wd_Flags & MUIWF_OBJECTGOACTIVESENT) { @@ -2494,34 +2591,34 @@ static void SetActiveObject (struct MUI_WindowData *data, Object *obj, IPTR newv switch (newval) { - case MUIV_Window_ActiveObject_None: - break; + case MUIV_Window_ActiveObject_None: + break; - case MUIV_Window_ActiveObject_Next: - if (old_activenode != NULL) + case MUIV_Window_ActiveObject_Next: + if (old_activenode != NULL) data->wd_ActiveObject = GetPrevNextActiveObject(old_activenode, - NextObjNodeIterator); - if (NULL == data->wd_ActiveObject) - data->wd_ActiveObject = GetFirstActiveObject(data); - break; - - case MUIV_Window_ActiveObject_Prev: - if (old_activenode) - data->wd_ActiveObject = GetPrevNextActiveObject(old_activenode, - PrevObjNodeIterator); - if (NULL == data->wd_ActiveObject) - data->wd_ActiveObject = GetLastActiveObject(data); - break; + NextObjNodeIterator); + if (NULL == data->wd_ActiveObject) + data->wd_ActiveObject = GetFirstActiveObject(data); + break; - default: - data->wd_ActiveObject = (Object*)newval; - break; + case MUIV_Window_ActiveObject_Prev: + if (old_activenode) + data->wd_ActiveObject = GetPrevNextActiveObject(old_activenode, + PrevObjNodeIterator); + if (NULL == data->wd_ActiveObject) + data->wd_ActiveObject = GetLastActiveObject(data); + break; + + default: + data->wd_ActiveObject = (Object *) newval; + break; } if (data->wd_ActiveObject != NULL && DoMethod(data->wd_RootObject, MUIM_FindAreaObject, - (IPTR) data->wd_ActiveObject) + (IPTR) data->wd_ActiveObject) && (_flags(data->wd_ActiveObject) & MADF_CANDRAW)) { D(bug("Activate=%p\n", data->wd_ActiveObject)); @@ -2538,7 +2635,7 @@ static void SetActiveObject (struct MUI_WindowData *data, Object *obj, IPTR newv /* MUIV_Window_Height_Screen and MUIV_Window_Height_Visible * are not handled yet, as their Width couterparts. */ -static void WindowSelectDimensions (struct MUI_WindowData *data) +static void WindowSelectDimensions(struct MUI_WindowData *data) { if (!data->wd_Width) { @@ -2547,26 +2644,23 @@ static void WindowSelectDimensions (struct MUI_WindowData *data) else if (data->wd_ReqWidth == MUIV_Window_Width_Default) data->wd_Width = data->wd_MinMax.DefWidth; else if (_between(MUIV_Window_Width_MinMax(100), - data->wd_ReqWidth, - MUIV_Window_Width_MinMax(0))) + data->wd_ReqWidth, MUIV_Window_Width_MinMax(0))) { data->wd_Width = data->wd_MinMax.MinWidth - data->wd_ReqWidth * (data->wd_MinMax.MaxWidth - data->wd_MinMax.MinWidth); } else if (_between(MUIV_Window_Width_Screen(100), - data->wd_ReqWidth, - MUIV_Window_Width_Screen(0))) + data->wd_ReqWidth, MUIV_Window_Width_Screen(0))) { data->wd_Width = data->wd_RenderInfo.mri_ScreenWidth - * (- (data->wd_ReqWidth + 200)) / 100; + * (-(data->wd_ReqWidth + 200)) / 100; } else if (_between(MUIV_Window_Width_Visible(100), - data->wd_ReqWidth, - MUIV_Window_Width_Visible(0))) + data->wd_ReqWidth, MUIV_Window_Width_Visible(0))) { data->wd_Width = data->wd_RenderInfo.mri_ScreenWidth - * (- (data->wd_ReqWidth + 100)) / 100; + * (-(data->wd_ReqWidth + 100)) / 100; } if (data->wd_ReqHeight > 0) @@ -2574,37 +2668,36 @@ static void WindowSelectDimensions (struct MUI_WindowData *data) else if (data->wd_ReqHeight == MUIV_Window_Height_Default) data->wd_Height = data->wd_MinMax.DefHeight; else if (_between(MUIV_Window_Height_MinMax(100), - data->wd_ReqHeight, - MUIV_Window_Height_MinMax(0))) + data->wd_ReqHeight, MUIV_Window_Height_MinMax(0))) { data->wd_Height = data->wd_MinMax.MinHeight - data->wd_ReqHeight * (data->wd_MinMax.MaxHeight - data->wd_MinMax.MinHeight); } else if (_between(MUIV_Window_Height_Screen(100), - data->wd_ReqHeight, - MUIV_Window_Height_Screen(0))) + data->wd_ReqHeight, MUIV_Window_Height_Screen(0))) { struct Screen *scr; int height; scr = data->wd_RenderInfo.mri_Screen; - height = scr->Height - data->wd_RenderInfo.mri_BorderTop - data->wd_RenderInfo.mri_BorderBottom; + height = + scr->Height - data->wd_RenderInfo.mri_BorderTop - + data->wd_RenderInfo.mri_BorderBottom; /* This is new to Zune: If TopEdge Delta is requested * the screenheight doesn't cover the barlayer */ if (data->wd_Y <= MUIV_Window_TopEdge_Delta(0)) height -= scr->BarHeight + 1; - data->wd_Height = height * (- (data->wd_ReqHeight + 200)) / 100; + data->wd_Height = height * (-(data->wd_ReqHeight + 200)) / 100; } else if (_between(MUIV_Window_Height_Visible(100), - data->wd_ReqHeight, - MUIV_Window_Height_Visible(0))) + data->wd_ReqHeight, MUIV_Window_Height_Visible(0))) { data->wd_Height = data->wd_RenderInfo.mri_ScreenHeight - * (- (data->wd_ReqHeight + 100)) / 100; + * (-(data->wd_ReqHeight + 100)) / 100; } /* scaled */ @@ -2616,9 +2709,9 @@ static void WindowSelectDimensions (struct MUI_WindowData *data) / data->wd_MinMax.MinWidth; } data->wd_Width = CLAMP(data->wd_Width, data->wd_MinMax.MinWidth, - data->wd_MinMax.MaxWidth); + data->wd_MinMax.MaxWidth); data->wd_Height = CLAMP(data->wd_Height, data->wd_MinMax.MinHeight, - data->wd_MinMax.MaxHeight); + data->wd_MinMax.MaxHeight); } @@ -2631,7 +2724,7 @@ IPTR Window__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) struct TagItem *tags; struct TagItem *tag; - obj = (Object *)DoSuperMethodA(cl, obj, (Msg)msg); + obj = (Object *) DoSuperMethodA(cl, obj, (Msg) msg); if (!obj) return FALSE; @@ -2642,19 +2735,19 @@ IPTR Window__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) if (NULL == data->wd_MemoryPool) { CoerceMethod(cl, obj, OM_DISPOSE); - return (IPTR)NULL; + return (IPTR) NULL; } data->wd_RenderInfo.mri_WindowObject = obj; - NewList((struct List*)&(data->wd_EHList)); - NewList((struct List*)&(data->wd_CCList)); - NewList((struct List*)&(data->wd_CycleChain)); - NewList((struct List*)&(data->wd_IDList)); + NewList((struct List *)&(data->wd_EHList)); + NewList((struct List *)&(data->wd_CCList)); + NewList((struct List *)&(data->wd_CycleChain)); + NewList((struct List *)&(data->wd_IDList)); data->wd_CrtFlags = WFLG_SIZEGADGET | WFLG_DRAGBAR | WFLG_DEPTHGADGET - | WFLG_CLOSEGADGET | WFLG_SIMPLE_REFRESH - | WFLG_REPORTMOUSE | WFLG_NEWLOOKMENUS; + | WFLG_CLOSEGADGET | WFLG_SIMPLE_REFRESH + | WFLG_REPORTMOUSE | WFLG_NEWLOOKMENUS; data->wd_ZoomGadget = TRUE; data->wd_Events = GetDefaultEvents(); data->wd_ActiveObject = NULL; @@ -2678,157 +2771,169 @@ IPTR Window__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg) /* parse initial taglist */ - for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags)); ) + for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));) { switch (tag->ti_Tag) { - case MUIA_Window_EraseArea: - _handle_bool_tag(data->wd_Flags, tag->ti_Data, MUIWF_ERASEAREA); - break; + case MUIA_Window_EraseArea: + _handle_bool_tag(data->wd_Flags, tag->ti_Data, MUIWF_ERASEAREA); + break; - case MUIA_Window_ToolBox: - _handle_bool_tag(data->wd_Flags, tag->ti_Data, MUIWF_TOOLBOX); - break; + case MUIA_Window_ToolBox: + _handle_bool_tag(data->wd_Flags, tag->ti_Data, MUIWF_TOOLBOX); + break; - case MUIA_Window_CloseGadget: - _handle_bool_tag(data->wd_CrtFlags, tag->ti_Data, WFLG_CLOSEGADGET); - break; + case MUIA_Window_CloseGadget: + _handle_bool_tag(data->wd_CrtFlags, tag->ti_Data, + WFLG_CLOSEGADGET); + break; - case MUIA_Window_SizeGadget: - _handle_bool_tag(data->wd_CrtFlags, tag->ti_Data, WFLG_SIZEGADGET); - break; + case MUIA_Window_SizeGadget: + _handle_bool_tag(data->wd_CrtFlags, tag->ti_Data, + WFLG_SIZEGADGET); + break; - case MUIA_Window_ZoomGadget: - data->wd_ZoomGadget = tag->ti_Data; - break; + case MUIA_Window_ZoomGadget: + data->wd_ZoomGadget = tag->ti_Data; + break; - case MUIA_Window_Backdrop: - _handle_bool_tag(data->wd_CrtFlags, tag->ti_Data, WFLG_BACKDROP); - break; + case MUIA_Window_Backdrop: + _handle_bool_tag(data->wd_CrtFlags, tag->ti_Data, + WFLG_BACKDROP); + break; - case MUIA_Window_Borderless: - _handle_bool_tag(data->wd_CrtFlags, tag->ti_Data, WFLG_BORDERLESS); - break; + case MUIA_Window_Borderless: + _handle_bool_tag(data->wd_CrtFlags, tag->ti_Data, + WFLG_BORDERLESS); + break; - case MUIA_Window_DepthGadget: - _handle_bool_tag(data->wd_CrtFlags, tag->ti_Data, WFLG_DEPTHGADGET); - break; + case MUIA_Window_DepthGadget: + _handle_bool_tag(data->wd_CrtFlags, tag->ti_Data, + WFLG_DEPTHGADGET); + break; - case MUIA_Window_DragBar: - _handle_bool_tag(data->wd_CrtFlags, tag->ti_Data, WFLG_DRAGBAR); - break; + case MUIA_Window_DragBar: + _handle_bool_tag(data->wd_CrtFlags, tag->ti_Data, WFLG_DRAGBAR); + break; - case MUIA_Window_SizeRight: - _handle_bool_tag(data->wd_CrtFlags, tag->ti_Data, WFLG_SIZEBRIGHT); - break; + case MUIA_Window_SizeRight: + _handle_bool_tag(data->wd_CrtFlags, tag->ti_Data, + WFLG_SIZEBRIGHT); + break; - case MUIA_Window_Height: - data->wd_ReqHeight = (LONG)tag->ti_Data; - break; + case MUIA_Window_Height: + data->wd_ReqHeight = (LONG) tag->ti_Data; + break; - case MUIA_Window_Width: - data->wd_ReqWidth = (LONG)tag->ti_Data; - break; + case MUIA_Window_Width: + data->wd_ReqWidth = (LONG) tag->ti_Data; + break; - case MUIA_Window_ID: - set(obj, MUIA_Window_ID, tag->ti_Data); - break; + case MUIA_Window_ID: + set(obj, MUIA_Window_ID, tag->ti_Data); + break; - case MUIA_Window_IsSubWindow: - _handle_bool_tag(data->wd_Flags, tag->ti_Data, MUIWF_ISSUBWINDOW); - break; + case MUIA_Window_IsSubWindow: + _handle_bool_tag(data->wd_Flags, tag->ti_Data, + MUIWF_ISSUBWINDOW); + break; - case MUIA_Window_Title: - set(obj, MUIA_Window_Title, tag->ti_Data); - break; + case MUIA_Window_Title: + set(obj, MUIA_Window_Title, tag->ti_Data); + break; - case MUIA_Window_ScreenTitle: - set(obj, MUIA_Window_ScreenTitle, tag->ti_Data); - break; + case MUIA_Window_ScreenTitle: + set(obj, MUIA_Window_ScreenTitle, tag->ti_Data); + break; - case MUIA_Window_Activate: - _handle_bool_tag(data->wd_Flags, !tag->ti_Data, MUIWF_DONTACTIVATE); - break; + case MUIA_Window_Activate: + _handle_bool_tag(data->wd_Flags, !tag->ti_Data, + MUIWF_DONTACTIVATE); + break; - case MUIA_Window_DefaultObject: - set(obj, MUIA_Window_DefaultObject, tag->ti_Data); - break; + case MUIA_Window_DefaultObject: + set(obj, MUIA_Window_DefaultObject, tag->ti_Data); + break; - case MUIA_Window_Menustrip: - data->wd_ChildMenustrip = (Object*)tag->ti_Data; - break; + case MUIA_Window_Menustrip: + data->wd_ChildMenustrip = (Object *) tag->ti_Data; + break; - case MUIA_Window_NoMenus: - data->wd_NoMenus = (BOOL) tag->ti_Data; - break; + case MUIA_Window_NoMenus: + data->wd_NoMenus = (BOOL) tag->ti_Data; + break; - case MUIA_Window_RootObject: - if (!tag->ti_Data) - { - CoerceMethod(cl, obj, OM_DISPOSE); - return 0; - } - set(obj, MUIA_Window_RootObject, tag->ti_Data); - break; + case MUIA_Window_RootObject: + if (!tag->ti_Data) + { + CoerceMethod(cl, obj, OM_DISPOSE); + return 0; + } + set(obj, MUIA_Window_RootObject, tag->ti_Data); + break; - case MUIA_Window_AltHeight: - data->wd_AltDim.Height = (WORD)tag->ti_Data; - break; + case MUIA_Window_AltHeight: + data->wd_AltDim.Height = (WORD) tag->ti_Data; + break; - case MUIA_Window_AltWidth: - data->wd_AltDim.Width = (WORD)tag->ti_Data; - break; + case MUIA_Window_AltWidth: + data->wd_AltDim.Width = (WORD) tag->ti_Data; + break; - case MUIA_Window_AltLeftEdge: - data->wd_AltDim.Left = (WORD)tag->ti_Data; - break; + case MUIA_Window_AltLeftEdge: + data->wd_AltDim.Left = (WORD) tag->ti_Data; + break; - case MUIA_Window_AltTopEdge: - data->wd_AltDim.Top = (WORD)tag->ti_Data; - break; + case MUIA_Window_AltTopEdge: + data->wd_AltDim.Top = (WORD) tag->ti_Data; + break; - case MUIA_Window_AppWindow: - _handle_bool_tag(data->wd_Flags, tag->ti_Data, MUIWF_ISAPPWINDOW); - break; + case MUIA_Window_AppWindow: + _handle_bool_tag(data->wd_Flags, tag->ti_Data, + MUIWF_ISAPPWINDOW); + break; - case MUIA_Window_LeftEdge: - data->wd_X = tag->ti_Data; - break; + case MUIA_Window_LeftEdge: + data->wd_X = tag->ti_Data; + break; - case MUIA_Window_TopEdge: - data->wd_Y = tag->ti_Data; - break; + case MUIA_Window_TopEdge: + data->wd_Y = tag->ti_Data; + break; - case MUIA_Window_UseBottomBorderScroller: - _handle_bool_tag(data->wd_Flags, tag->ti_Data, MUIWF_USEBOTTOMSCROLLER); - break; + case MUIA_Window_UseBottomBorderScroller: + _handle_bool_tag(data->wd_Flags, tag->ti_Data, + MUIWF_USEBOTTOMSCROLLER); + break; - case MUIA_Window_UseRightBorderScroller: - _handle_bool_tag(data->wd_Flags, tag->ti_Data, MUIWF_USERIGHTSCROLLER); - break; + case MUIA_Window_UseRightBorderScroller: + _handle_bool_tag(data->wd_Flags, tag->ti_Data, + MUIWF_USERIGHTSCROLLER); + break; - case MUIA_Window_DisableKeys: - data->wd_DisabledKeys = tag->ti_Data; - break; + case MUIA_Window_DisableKeys: + data->wd_DisabledKeys = tag->ti_Data; + break; - case MUIA_Window_RefWindow: - data->wd_RefWindow = (Object *)tag->ti_Data; - break; + case MUIA_Window_RefWindow: + data->wd_RefWindow = (Object *) tag->ti_Data; + break; - case MUIA_Window_Screen: - data->wd_UserScreen = (struct Screen *)tag->ti_Data; - break; + case MUIA_Window_Screen: + data->wd_UserScreen = (struct Screen *)tag->ti_Data; + break; - case MUIA_Window_PublicScreen: - data->wd_UserPublicScreen = (STRPTR)tag->ti_Data; - break; + case MUIA_Window_PublicScreen: + data->wd_UserPublicScreen = (STRPTR) tag->ti_Data; + break; } } -/* D(bug("muimaster.library/window.c: Window Object created at 0x%lx back=%lx\n", */ +/* D(bug("muimaster.library/window.c: Window Object created at " */ +/* "0x%lx back=%lx\n", */ /* obj,data->wd_Background)); */ - return (IPTR)obj; + return (IPTR) obj; } /************************************************************************** @@ -2840,15 +2945,16 @@ IPTR Window__OM_DISPOSE(struct IClass *cl, Object *obj, Msg msg) /* D(bug("Window_Dispose(%p)\n", obj)); */ -#if 0 /* We no longer clear muiGlobalInfo() during disconnections, so - this can cause problems (remove object which is already removed). - Furthermore AFAIK it is not legal to dispose a window object - which is still ocnnected to the application object, anyway. */ +#if 0 + /* We no longer clear muiGlobalInfo() during disconnections, so + this can cause problems (remove object which is already removed). + Furthermore AFAIK it is not legal to dispose a window object + which is still ocnnected to the application object, anyway. */ if (muiGlobalInfo(obj) && _app(obj)) { /* D(bug(" Window_Dispose(%p) : calling app->OM_REMMEMBER\n", obj)); */ - DoMethod(_app(obj), OM_REMMEMBER, (IPTR)obj); + DoMethod(_app(obj), OM_REMMEMBER, (IPTR) obj); } #endif @@ -2879,200 +2985,204 @@ static ULONG WindowClose(struct IClass *cl, Object *obj); IPTR Window__OM_SET(struct IClass *cl, Object *obj, struct opSet *msg) { struct MUI_WindowData *data = INST_DATA(cl, obj); - struct TagItem *tags = msg->ops_AttrList; - struct TagItem *tag; + struct TagItem *tags = msg->ops_AttrList; + struct TagItem *tag; while ((tag = NextTagItem(&tags)) != NULL) { switch (tag->ti_Tag) { - case MUIA_Window_Activate: - if (data->wd_RenderInfo.mri_Window) + case MUIA_Window_Activate: + if (data->wd_RenderInfo.mri_Window) + { + if (tag->ti_Data && !(data->wd_Flags & MUIWF_ACTIVE)) { - if (tag->ti_Data && !(data->wd_Flags & MUIWF_ACTIVE)) - { - ActivateWindow(data->wd_RenderInfo.mri_Window); - _handle_bool_tag(data->wd_Flags, tag->ti_Data, MUIWF_ACTIVE); - } + ActivateWindow(data->wd_RenderInfo.mri_Window); + _handle_bool_tag(data->wd_Flags, tag->ti_Data, + MUIWF_ACTIVE); } - else - _handle_bool_tag(data->wd_Flags, !tag->ti_Data, MUIWF_DONTACTIVATE); - break; + } + else + _handle_bool_tag(data->wd_Flags, !tag->ti_Data, + MUIWF_DONTACTIVATE); + break; - case MUIA_Window_ActiveObject: -/* D(bug("MUIA_Window_ActiveObject %ld (%p)\n", tag->ti_Data, tag->ti_Data)); */ - SetActiveObject(data, obj, tag->ti_Data); - break; + case MUIA_Window_ActiveObject: +/* D(bug("MUIA_Window_ActiveObject %ld (%p)\n", */ +/* tag->ti_Data, tag->ti_Data)); */ + SetActiveObject(data, obj, tag->ti_Data); + break; - case MUIA_Window_DefaultObject: - data->wd_DefaultObject = (APTR)tag->ti_Data; - break; + case MUIA_Window_DefaultObject: + data->wd_DefaultObject = (APTR) tag->ti_Data; + break; - case MUIA_Window_ID: - data->wd_ID = tag->ti_Data; - break; + case MUIA_Window_ID: + data->wd_ID = tag->ti_Data; + break; - case MUIA_Window_IsSubWindow: - _handle_bool_tag(data->wd_Flags, tag->ti_Data, MUIWF_ISSUBWINDOW); - break; + case MUIA_Window_IsSubWindow: + _handle_bool_tag(data->wd_Flags, tag->ti_Data, + MUIWF_ISSUBWINDOW); + break; - case MUIA_Window_Open: - if (tag->ti_Data) + case MUIA_Window_Open: + if (tag->ti_Data) + { + if (data->wd_Flags & MUIWF_HIDDEN) + data->wd_Flags |= MUIWF_OPENONUNHIDE; + else if (!(data->wd_Flags & MUIWF_OPENED)) + WindowOpen(cl, obj); + else { - if (data->wd_Flags & MUIWF_HIDDEN) - data->wd_Flags |= MUIWF_OPENONUNHIDE; - else - if (!(data->wd_Flags & MUIWF_OPENED)) - WindowOpen(cl, obj); - else - { - DoMethod(obj, MUIM_Window_ToFront); - set(obj, MUIA_Window_Activate, TRUE); - } + DoMethod(obj, MUIM_Window_ToFront); + set(obj, MUIA_Window_Activate, TRUE); } - else - if (data->wd_Flags & MUIWF_HIDDEN) - data->wd_Flags &= ~MUIWF_OPENONUNHIDE; - else - if (data->wd_Flags & MUIWF_OPENED) - WindowClose(cl, obj); - break; + } + else if (data->wd_Flags & MUIWF_HIDDEN) + data->wd_Flags &= ~MUIWF_OPENONUNHIDE; + else if (data->wd_Flags & MUIWF_OPENED) + WindowClose(cl, obj); + break; + + case MUIA_ShowMe: /* PRIVATE *abuse* of the Area's ShowMe attr */ + if (tag->ti_Data) + { + /* Deiconify */ - case MUIA_ShowMe: /* PRIVATE *abuse* of the Area's ShowMe attr */ - if (tag->ti_Data) + if (data->wd_Flags & MUIWF_HIDDEN) { - /* Deiconify */ + data->wd_Flags &= ~MUIWF_HIDDEN; - if (data->wd_Flags & MUIWF_HIDDEN) + if (data->wd_Flags & MUIWF_OPENONUNHIDE) { - data->wd_Flags &= ~MUIWF_HIDDEN; - - if (data->wd_Flags & MUIWF_OPENONUNHIDE) - { - data->wd_Flags &= ~MUIWF_OPENONUNHIDE; - set(obj, MUIA_Window_Open, TRUE); - } + data->wd_Flags &= ~MUIWF_OPENONUNHIDE; + set(obj, MUIA_Window_Open, TRUE); } } - else - { - /* Iconify */ - - if (data->wd_Flags & MUIWF_OPENED) - { - data->wd_Flags |= MUIWF_OPENONUNHIDE; + } + else + { + /* Iconify */ - set(obj, MUIA_Window_Open, FALSE); - } + if (data->wd_Flags & MUIWF_OPENED) + { + data->wd_Flags |= MUIWF_OPENONUNHIDE; - data->wd_Flags |= MUIWF_HIDDEN; + set(obj, MUIA_Window_Open, FALSE); } - break; - case MUIA_Window_RootObject: - ChangeRootObject(data, obj, (Object *)tag->ti_Data); - break; + data->wd_Flags |= MUIWF_HIDDEN; + } + break; - case MUIA_Window_Title: - if (data->wd_Title) - FreeVec(data->wd_Title); - data->wd_Title = StrDup((STRPTR)tag->ti_Data); - if (data->wd_RenderInfo.mri_Window) - SetWindowTitles(data->wd_RenderInfo.mri_Window,data->wd_Title, (CONST_STRPTR)~0); - break; + case MUIA_Window_RootObject: + ChangeRootObject(data, obj, (Object *) tag->ti_Data); + break; - case MUIA_Window_ScreenTitle: - if (data->wd_ScreenTitle) - FreeVec(data->wd_ScreenTitle); - data->wd_ScreenTitle = StrDup((STRPTR)tag->ti_Data); - if (data->wd_RenderInfo.mri_Window) - SetWindowTitles(data->wd_RenderInfo.mri_Window, - (CONST_STRPTR)~0, data->wd_ScreenTitle); - break; + case MUIA_Window_Title: + if (data->wd_Title) + FreeVec(data->wd_Title); + data->wd_Title = StrDup((STRPTR) tag->ti_Data); + if (data->wd_RenderInfo.mri_Window) + SetWindowTitles(data->wd_RenderInfo.mri_Window, + data->wd_Title, (CONST_STRPTR) ~ 0); + break; - case MUIA_Window_NoMenus: - data->wd_NoMenus = (BOOL) tag->ti_Data; - if (data->wd_RenderInfo.mri_Window) - { - if (data->wd_NoMenus) - data->wd_RenderInfo.mri_Window->Flags |= WFLG_RMBTRAP; - else - data->wd_RenderInfo.mri_Window->Flags &= ~WFLG_RMBTRAP; - } - break; + case MUIA_Window_ScreenTitle: + if (data->wd_ScreenTitle) + FreeVec(data->wd_ScreenTitle); + data->wd_ScreenTitle = StrDup((STRPTR) tag->ti_Data); + if (data->wd_RenderInfo.mri_Window) + SetWindowTitles(data->wd_RenderInfo.mri_Window, + (CONST_STRPTR) ~ 0, data->wd_ScreenTitle); + break; - case MUIA_Window_UseBottomBorderScroller: - _handle_bool_tag(data->wd_Flags, tag->ti_Data, MUIWF_USEBOTTOMSCROLLER); - break; + case MUIA_Window_NoMenus: + data->wd_NoMenus = (BOOL) tag->ti_Data; + if (data->wd_RenderInfo.mri_Window) + { + if (data->wd_NoMenus) + data->wd_RenderInfo.mri_Window->Flags |= WFLG_RMBTRAP; + else + data->wd_RenderInfo.mri_Window->Flags &= ~WFLG_RMBTRAP; + } + break; - case MUIA_Window_UseRightBorderScroller: - _handle_bool_tag(data->wd_Flags, tag->ti_Data, MUIWF_USERIGHTSCROLLER); - break; + case MUIA_Window_UseBottomBorderScroller: + _handle_bool_tag(data->wd_Flags, tag->ti_Data, + MUIWF_USEBOTTOMSCROLLER); + break; - case MUIA_Window_DisableKeys: - data->wd_DisabledKeys = tag->ti_Data; - break; + case MUIA_Window_UseRightBorderScroller: + _handle_bool_tag(data->wd_Flags, tag->ti_Data, + MUIWF_USERIGHTSCROLLER); + break; - case MUIA_Window_RefWindow: - data->wd_RefWindow = (Object *)tag->ti_Data; - break; + case MUIA_Window_DisableKeys: + data->wd_DisabledKeys = tag->ti_Data; + break; - case MUIA_Window_LeftEdge: - data->wd_X = tag->ti_Data; - break; + case MUIA_Window_RefWindow: + data->wd_RefWindow = (Object *) tag->ti_Data; + break; - case MUIA_Window_TopEdge: - data->wd_Y = tag->ti_Data; - break; + case MUIA_Window_LeftEdge: + data->wd_X = tag->ti_Data; + break; - case MUIA_Window_Width: - data->wd_ReqWidth = (LONG)tag->ti_Data; - data->wd_Width = 0; /* otherwise windowselectdimensions() ignores ReqWidth */ - break; + case MUIA_Window_TopEdge: + data->wd_Y = tag->ti_Data; + break; - case MUIA_Window_Height: - data->wd_ReqHeight = (LONG)tag->ti_Data; - data->wd_Height = 0; - break; + case MUIA_Window_Width: + data->wd_ReqWidth = (LONG) tag->ti_Data; + data->wd_Width = 0; /* otherwise windowselectdimensions() + * ignores ReqWidth */ + break; - case MUIA_Window_Screen: - data->wd_UserScreen = (struct Screen *)tag->ti_Data; - break; + case MUIA_Window_Height: + data->wd_ReqHeight = (LONG) tag->ti_Data; + data->wd_Height = 0; + break; - case MUIA_Window_PublicScreen: - data->wd_UserPublicScreen = (STRPTR)tag->ti_Data; - break; + case MUIA_Window_Screen: + data->wd_UserScreen = (struct Screen *)tag->ti_Data; + break; + + case MUIA_Window_PublicScreen: + data->wd_UserPublicScreen = (STRPTR) tag->ti_Data; + break; - case MUIA_Window_Sleep: - if (tag->ti_Data) + case MUIA_Window_Sleep: + if (tag->ti_Data) + { + data->wd_SleepCount++; + if (data->wd_RenderInfo.mri_Window + && (data->wd_SleepCount == 1)) { - data->wd_SleepCount++; - if (data->wd_RenderInfo.mri_Window && (data->wd_SleepCount == 1)) - { - SetWindowPointer - ( - data->wd_RenderInfo.mri_Window, - WA_BusyPointer, TRUE, - WA_PointerDelay, TRUE, - TAG_DONE - ); - // FIXME: how to disable event handling? - } + SetWindowPointer + (data->wd_RenderInfo.mri_Window, + WA_BusyPointer, TRUE, + WA_PointerDelay, TRUE, TAG_DONE); + // FIXME: how to disable event handling? } - else + } + else + { + data->wd_SleepCount--; + if (data->wd_RenderInfo.mri_Window + && (data->wd_SleepCount == 0)) { - data->wd_SleepCount--; - if (data->wd_RenderInfo.mri_Window && (data->wd_SleepCount == 0)) - { - SetWindowPointerA(data->wd_RenderInfo.mri_Window, NULL); - } + SetWindowPointerA(data->wd_RenderInfo.mri_Window, NULL); } - break; + } + break; } } - return DoSuperMethodA(cl, obj, (Msg)msg); + return DoSuperMethodA(cl, obj, (Msg) msg); } /************************************************************************** @@ -3084,108 +3194,110 @@ IPTR Window__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) struct MUI_WindowData *data = INST_DATA(cl, obj); - STORE = (IPTR)0; + STORE = (IPTR) 0; - switch(msg->opg_AttrID) + switch (msg->opg_AttrID) { - case MUIA_Window_Activate: - STORE = (data->wd_Flags & (MUIWF_ACTIVE | MUIWF_OPENED)) == (MUIWF_ACTIVE | MUIWF_OPENED); - return TRUE ; + case MUIA_Window_Activate: + STORE = + (data->wd_Flags & (MUIWF_ACTIVE | MUIWF_OPENED)) == + (MUIWF_ACTIVE | MUIWF_OPENED); + return TRUE; - case MUIA_Window_Window: - STORE = (IPTR)data->wd_RenderInfo.mri_Window; - return TRUE; + case MUIA_Window_Window: + STORE = (IPTR) data->wd_RenderInfo.mri_Window; + return TRUE; - case MUIA_Window_Screen: - STORE = (IPTR)data->wd_RenderInfo.mri_Screen; - return TRUE; + case MUIA_Window_Screen: + STORE = (IPTR) data->wd_RenderInfo.mri_Screen; + return TRUE; - case MUIA_Window_PublicScreen: - STORE = (IPTR)data->wd_UserPublicScreen; - return TRUE; + case MUIA_Window_PublicScreen: + STORE = (IPTR) data->wd_UserPublicScreen; + return TRUE; - case MUIA_Window_ActiveObject: - if ((data->wd_ActiveObject != NULL) - && (DoMethod(data->wd_RootObject, MUIM_FindAreaObject, - (IPTR)data->wd_ActiveObject) != (IPTR)NULL)) - STORE = (IPTR)data->wd_ActiveObject; - else - STORE = (IPTR)NULL; - return TRUE; + case MUIA_Window_ActiveObject: + if ((data->wd_ActiveObject != NULL) + && (DoMethod(data->wd_RootObject, MUIM_FindAreaObject, + (IPTR) data->wd_ActiveObject) != (IPTR) NULL)) + STORE = (IPTR) data->wd_ActiveObject; + else + STORE = (IPTR) NULL; + return TRUE; - case MUIA_Window_CloseRequest: - STORE = FALSE; - return TRUE; + case MUIA_Window_CloseRequest: + STORE = FALSE; + return TRUE; - case MUIA_Window_DefaultObject: - STORE = (IPTR)data->wd_DefaultObject; - return TRUE; + case MUIA_Window_DefaultObject: + STORE = (IPTR) data->wd_DefaultObject; + return TRUE; - case MUIA_Window_DisableKeys: - STORE = data->wd_DisabledKeys; - return TRUE; + case MUIA_Window_DisableKeys: + STORE = data->wd_DisabledKeys; + return TRUE; - case MUIA_Window_Height: - STORE = (IPTR)data->wd_Height; - return TRUE; + case MUIA_Window_Height: + STORE = (IPTR) data->wd_Height; + return TRUE; - case MUIA_Window_ID: - STORE = data->wd_ID; - return TRUE; + case MUIA_Window_ID: + STORE = data->wd_ID; + return TRUE; - case MUIA_Window_IsSubWindow: - STORE = (data->wd_Flags & MUIWF_ISSUBWINDOW) == MUIWF_ISSUBWINDOW; - return TRUE; + case MUIA_Window_IsSubWindow: + STORE = (data->wd_Flags & MUIWF_ISSUBWINDOW) == MUIWF_ISSUBWINDOW; + return TRUE; - case MUIA_Window_LeftEdge: - if (data->wd_RenderInfo.mri_Window) - STORE = (IPTR)data->wd_RenderInfo.mri_Window->LeftEdge; - else - STORE = 0; - return TRUE; + case MUIA_Window_LeftEdge: + if (data->wd_RenderInfo.mri_Window) + STORE = (IPTR) data->wd_RenderInfo.mri_Window->LeftEdge; + else + STORE = 0; + return TRUE; - case MUIA_Window_Open: - STORE = (data->wd_Flags & MUIWF_OPENED) == MUIWF_OPENED; - return TRUE; + case MUIA_Window_Open: + STORE = (data->wd_Flags & MUIWF_OPENED) == MUIWF_OPENED; + return TRUE; - case MUIA_Window_RootObject: - STORE = (IPTR)data->wd_RootObject; - return TRUE; + case MUIA_Window_RootObject: + STORE = (IPTR) data->wd_RootObject; + return TRUE; - case MUIA_Window_ScreenTitle: - STORE = (IPTR)data->wd_ScreenTitle; - return TRUE; + case MUIA_Window_ScreenTitle: + STORE = (IPTR) data->wd_ScreenTitle; + return TRUE; - case MUIA_Window_Title: - STORE = (IPTR)data->wd_Title; - return TRUE; + case MUIA_Window_Title: + STORE = (IPTR) data->wd_Title; + return TRUE; - case MUIA_Window_TopEdge: - if (data->wd_RenderInfo.mri_Window) - STORE = (IPTR)data->wd_RenderInfo.mri_Window->TopEdge; - else - STORE = (IPTR)0; - return(TRUE); + case MUIA_Window_TopEdge: + if (data->wd_RenderInfo.mri_Window) + STORE = (IPTR) data->wd_RenderInfo.mri_Window->TopEdge; + else + STORE = (IPTR) 0; + return (TRUE); - case MUIA_Window_Width: - STORE = (IPTR)data->wd_Width; - return TRUE; + case MUIA_Window_Width: + STORE = (IPTR) data->wd_Width; + return TRUE; - case MUIA_Window_Menustrip: - STORE = (IPTR)data->wd_ChildMenustrip; - return TRUE; + case MUIA_Window_Menustrip: + STORE = (IPTR) data->wd_ChildMenustrip; + return TRUE; - case MUIA_Window_Sleep: - STORE = data->wd_SleepCount ? TRUE : FALSE; - return TRUE; + case MUIA_Window_Sleep: + STORE = data->wd_SleepCount ? TRUE : FALSE; + return TRUE; - case MUIA_Version: - STORE = __version; - return TRUE; + case MUIA_Version: + STORE = __version; + return TRUE; - case MUIA_Revision: - STORE = __revision; - return TRUE; + case MUIA_Revision: + STORE = __revision; + return TRUE; } return DoSuperMethodA(cl, obj, (Msg) msg); @@ -3196,15 +3308,16 @@ IPTR Window__OM_GET(struct IClass *cl, Object *obj, struct opGet *msg) * MUIM_FindUData : tests if the MUIA_UserData of the object * contains the given <udata> and returns the object pointer in this case. */ -IPTR Window__MUIM_FindUData(struct IClass *cl, Object *obj, struct MUIP_FindUData *msg) +IPTR Window__MUIM_FindUData(struct IClass *cl, Object *obj, + struct MUIP_FindUData *msg) { struct MUI_WindowData *data = INST_DATA(cl, obj); if (muiNotifyData(obj)->mnd_UserData == msg->udata) - return (IPTR)obj; + return (IPTR) obj; if (data->wd_RootObject) - return DoMethodA(data->wd_RootObject, (Msg)msg); + return DoMethodA(data->wd_RootObject, (Msg) msg); return 0; } @@ -3215,7 +3328,8 @@ IPTR Window__MUIM_FindUData(struct IClass *cl, Object *obj, struct MUIP_FindUDat * contains the given <udata> and gets <attr> to <storage> for itself * in this case. */ -IPTR Window__MUIM_GetUData(struct IClass *cl, Object *obj, struct MUIP_GetUData *msg) +IPTR Window__MUIM_GetUData(struct IClass *cl, Object *obj, + struct MUIP_GetUData *msg) { struct MUI_WindowData *data = INST_DATA(cl, obj); @@ -3226,7 +3340,7 @@ IPTR Window__MUIM_GetUData(struct IClass *cl, Object *obj, struct MUIP_GetUData } if (data->wd_RootObject) - return DoMethodA(data->wd_RootObject, (Msg)msg); + return DoMethodA(data->wd_RootObject, (Msg) msg); return FALSE; } @@ -3236,7 +3350,8 @@ IPTR Window__MUIM_GetUData(struct IClass *cl, Object *obj, struct MUIP_GetUData * MUIM_SetUData : This method tests if the MUIA_UserData of the object * contains the given <udata> and sets <attr> to <val> for itself in this case. */ -IPTR Window__MUIM_SetUData(struct IClass *cl, Object *obj, struct MUIP_SetUData *msg) +IPTR Window__MUIM_SetUData(struct IClass *cl, Object *obj, + struct MUIP_SetUData *msg) { struct MUI_WindowData *data = INST_DATA(cl, obj); @@ -3244,7 +3359,7 @@ IPTR Window__MUIM_SetUData(struct IClass *cl, Object *obj, struct MUIP_SetUData set(obj, msg->attr, msg->val); if (data->wd_RootObject) - DoMethodA(data->wd_RootObject, (Msg)msg); + DoMethodA(data->wd_RootObject, (Msg) msg); return TRUE; } @@ -3254,7 +3369,8 @@ IPTR Window__MUIM_SetUData(struct IClass *cl, Object *obj, struct MUIP_SetUData * MUIM_SetUDataOnce : This method tests if the MUIA_UserData of the object * contains the given <udata> and sets <attr> to <val> for itself in this case. */ -IPTR Window__MUIM_SetUDataOnce(struct IClass *cl, Object *obj, struct MUIP_SetUDataOnce *msg) +IPTR Window__MUIM_SetUDataOnce(struct IClass *cl, Object *obj, + struct MUIP_SetUDataOnce *msg) { struct MUI_WindowData *data = INST_DATA(cl, obj); @@ -3265,7 +3381,7 @@ IPTR Window__MUIM_SetUDataOnce(struct IClass *cl, Object *obj, struct MUIP_SetUD } if (data->wd_RootObject) - return DoMethodA(data->wd_RootObject, (Msg)msg); + return DoMethodA(data->wd_RootObject, (Msg) msg); return FALSE; } @@ -3275,18 +3391,18 @@ IPTR Window__MUIM_SetUDataOnce(struct IClass *cl, Object *obj, struct MUIP_SetUD init GlobalInfo **************************************************************************/ IPTR Window__MUIM_ConnectParent(struct IClass *cl, Object *obj, - struct MUIP_ConnectParent *msg) + struct MUIP_ConnectParent *msg) { struct MUI_WindowData *data = INST_DATA(cl, obj); - if (!DoSuperMethodA(cl,obj,(Msg)msg)) + if (!DoSuperMethodA(cl, obj, (Msg) msg)) return 0; if (data->wd_RootObject) - DoMethod(data->wd_RootObject, MUIM_ConnectParent, (IPTR)obj); + DoMethod(data->wd_RootObject, MUIM_ConnectParent, (IPTR) obj); if (data->wd_ChildMenustrip) - DoMethod(data->wd_ChildMenustrip, MUIM_ConnectParent, (IPTR)obj); + DoMethod(data->wd_ChildMenustrip, MUIM_ConnectParent, (IPTR) obj); return TRUE; } @@ -3295,27 +3411,32 @@ IPTR Window__MUIM_ConnectParent(struct IClass *cl, Object *obj, /************************************************************************** called by parent object **************************************************************************/ -IPTR Window__MUIM_DisconnectParent(struct IClass *cl, Object *obj, struct MUIP_DisconnectParent *msg) +IPTR Window__MUIM_DisconnectParent(struct IClass *cl, Object *obj, + struct MUIP_DisconnectParent *msg) { struct MUI_WindowData *data = INST_DATA(cl, obj); -/* D(bug("Window_DisconnectParent(%p) : muiGlobalInfo=%p\n", muiGlobalInfo(obj))); */ +/* D(bug("Window_DisconnectParent(%p) : muiGlobalInfo=%p\n", */ +/* muiGlobalInfo(obj))); */ if (muiGlobalInfo(obj)) { /* Close the window before disconnecting all the childs */ if ((data->wd_Flags & MUIWF_OPENED)) { -/* D(bug(" Window_DisconnectParent(%p) : closing window\n", muiGlobalInfo(obj))); */ +/* D(bug(" Window_DisconnectParent(%p) : closing window\n", */ +/* muiGlobalInfo(obj))); */ set(obj, MUIA_Window_Open, FALSE); } if (data->wd_ChildMenustrip) - DoMethod(data->wd_ChildMenustrip, MUIM_DisconnectParent, (IPTR)obj); + DoMethod(data->wd_ChildMenustrip, MUIM_DisconnectParent, + (IPTR) obj); if (data->wd_RootObject) - DoMethodA(data->wd_RootObject, (Msg)msg); + DoMethodA(data->wd_RootObject, (Msg) msg); -/* D(bug(" Window_DisconnectParent(%p) : calling supermethod\n", muiGlobalInfo(obj))); */ - return DoSuperMethodA(cl,obj,(Msg)msg); +/* D(bug(" Window_DisconnectParent(%p) : calling supermethod\n", */ +/* muiGlobalInfo(obj))); */ + return DoSuperMethodA(cl, obj, (Msg) msg); } else { @@ -3323,22 +3444,23 @@ IPTR Window__MUIM_DisconnectParent(struct IClass *cl, Object *obj, struct MUIP_D } } -static void SetRootObjInnerSpacing(Object *obj, struct MUI_WindowData *data) +static void SetRootObjInnerSpacing(Object *obj, + struct MUI_WindowData *data) { UWORD wd_innerLeft, wd_innerRight, wd_innerTop, wd_innerBottom; if (data->wd_CrtFlags & WFLG_BORDERLESS) { - wd_innerLeft = 0; - wd_innerRight = 0; - wd_innerTop = 0; + wd_innerLeft = 0; + wd_innerRight = 0; + wd_innerTop = 0; wd_innerBottom = 0; } else { - wd_innerLeft = muiGlobalInfo(obj)->mgi_Prefs->window_inner_left; - wd_innerRight = muiGlobalInfo(obj)->mgi_Prefs->window_inner_right; - wd_innerTop = muiGlobalInfo(obj)->mgi_Prefs->window_inner_top; + wd_innerLeft = muiGlobalInfo(obj)->mgi_Prefs->window_inner_left; + wd_innerRight = muiGlobalInfo(obj)->mgi_Prefs->window_inner_right; + wd_innerTop = muiGlobalInfo(obj)->mgi_Prefs->window_inner_top; wd_innerBottom = muiGlobalInfo(obj)->mgi_Prefs->window_inner_bottom; } @@ -3371,18 +3493,20 @@ static void WindowMinMax(Object *obj, struct MUI_WindowData *data) { SetRootObjInnerSpacing(obj, data); /* inquire about sizes */ - DoMethod(data->wd_RootObject, MUIM_AskMinMax, (IPTR)&data->wd_MinMax); -/* D(bug("*** root minmax = %ld,%ld => %ld,%ld\n", data->wd_MinMax.MinWidth, */ + DoMethod(data->wd_RootObject, MUIM_AskMinMax, (IPTR) & data->wd_MinMax); +/* D(bug("*** root minmax = %ld,%ld => %ld,%ld\n", */ +/* data->wd_MinMax.MinWidth, */ /* data->wd_MinMax.MinHeight, */ /* data->wd_MinMax.MaxWidth, data->wd_MinMax.MaxHeight)); */ __area_finish_minmax(data->wd_RootObject, &data->wd_MinMax); -/* D(bug("*** root minmax2 = %ld,%ld => %ld,%ld\n", data->wd_MinMax.MinWidth, */ +/* D(bug("*** root minmax2 = %ld,%ld => %ld,%ld\n", */ +/* data->wd_MinMax.MinWidth, */ /* data->wd_MinMax.MinHeight, */ /* data->wd_MinMax.MaxWidth, data->wd_MinMax.MaxHeight)); */ } -static void InstallBackbuffer (struct IClass *cl, Object *obj) +static void InstallBackbuffer(struct IClass *cl, Object *obj) { struct MUI_WindowData *data = INST_DATA(cl, obj); #if 0 @@ -3390,18 +3514,21 @@ static void InstallBackbuffer (struct IClass *cl, Object *obj) data->wd_RenderInfo.mri_BufferBM = AllocBitMap(win->Width, win->Height, win->RPort->BitMap->Depth, - 0, win->RPort->BitMap); + 0, win->RPort->BitMap); #endif if (data->wd_RenderInfo.mri_BufferBM) { -/* D(bug("install_backbuffer : allocated bitmap %dx%dx%d with friend %p\n", */ -/* win->Width, win->Height, win->RPort->BitMap->Depth, win->RPort->BitMap)); */ +/* D(bug("install_backbuffer : allocated bitmap %dx%dx%d " */ +/* "with friend %p\n", */ +/* win->Width, win->Height, win->RPort->BitMap->Depth, */ +/* win->RPort->BitMap)); */ InitRastPort(&data->wd_RenderInfo.mri_BufferRP); - data->wd_RenderInfo.mri_BufferRP.BitMap = data->wd_RenderInfo.mri_BufferBM; + data->wd_RenderInfo.mri_BufferRP.BitMap = + data->wd_RenderInfo.mri_BufferBM; } } -static void DeinstallBackbuffer (struct IClass *cl, Object *obj) +static void DeinstallBackbuffer(struct IClass *cl, Object *obj) { struct MUI_WindowData *data = INST_DATA(cl, obj); @@ -3418,14 +3545,14 @@ static void DeinstallBackbuffer (struct IClass *cl, Object *obj) * An expose event is already queued, it will trigger * MUIM_Draw for us when going back to main loop. */ -static void WindowShow (struct IClass *cl, Object *obj) +static void WindowShow(struct IClass *cl, Object *obj) { struct MUI_WindowData *data = INST_DATA(cl, obj); struct Window *win = data->wd_RenderInfo.mri_Window; /* D(bug("window_show %s %d\n", __FILE__, __LINE__)); */ _left(data->wd_RootObject) = win->BorderLeft; - _top(data->wd_RootObject) = win->BorderTop; + _top(data->wd_RootObject) = win->BorderTop; _width(data->wd_RootObject) = data->wd_Width; _height(data->wd_RootObject) = data->wd_Height; @@ -3455,7 +3582,7 @@ static ULONG WindowOpen(struct IClass *cl, Object *obj) } /* inquire about sizes */ - WindowMinMax(obj,data); + WindowMinMax(obj, data); WindowSelectDimensions(data); /* Decide which menustrip should be used */ @@ -3465,7 +3592,7 @@ static ULONG WindowOpen(struct IClass *cl, Object *obj) data->wd_Menustrip = data->wd_ChildMenustrip; /* open window here ... */ - if (!DisplayWindow(obj,data)) + if (!DisplayWindow(obj, data)) { /* free display dependant data */ data->wd_Menustrip = NULL; @@ -3481,11 +3608,11 @@ static ULONG WindowOpen(struct IClass *cl, Object *obj) WindowShow(cl, obj); { - LONG left,top,width,height; + LONG left, top, width, height; left = data->wd_RenderInfo.mri_Window->BorderLeft; top = data->wd_RenderInfo.mri_Window->BorderTop, - width = data->wd_RenderInfo.mri_Window->Width + width = data->wd_RenderInfo.mri_Window->Width - data->wd_RenderInfo.mri_Window->BorderRight - left; height = data->wd_RenderInfo.mri_Window->Height - data->wd_RenderInfo.mri_Window->BorderBottom - top; @@ -3496,12 +3623,13 @@ static ULONG WindowOpen(struct IClass *cl, Object *obj) // height, left, top)); zune_imspec_draw(data->wd_Background, &data->wd_RenderInfo, - left, top, width, height, left, top, 0); + left, top, width, height, left, top, 0); } MUI_Redraw(data->wd_RootObject, MADF_DRAWOBJECT); - D(bug("MUIC_Window:windowOpen() ActiveObject=%p\n", data->wd_ActiveObject)); + D(bug("MUIC_Window:windowOpen() ActiveObject=%p\n", + data->wd_ActiveObject)); if (data->wd_OldActive != NULL) { set(obj, MUIA_Window_ActiveObject, data->wd_OldActive); @@ -3510,8 +3638,8 @@ static ULONG WindowOpen(struct IClass *cl, Object *obj) return TRUE; } -/******************************************************************************/ -/******************************************************************************/ +/**************************************************************************/ +/**************************************************************************/ static ULONG WindowClose(struct IClass *cl, Object *obj) { @@ -3534,7 +3662,7 @@ static ULONG WindowClose(struct IClass *cl, Object *obj) HideRenderInfo(&data->wd_RenderInfo); /* close here ... */ - UndisplayWindow(obj,data); + UndisplayWindow(obj, data); data->wd_Flags &= ~MUIWF_OPENED; data->wd_Menustrip = NULL; @@ -3551,10 +3679,11 @@ static ULONG WindowClose(struct IClass *cl, Object *obj) * see Group_Columns * see Group_Rows */ -IPTR Window__MUIM_RecalcDisplay(struct IClass *cl, Object *obj, struct MUIP_Window_RecalcDisplay *msg) +IPTR Window__MUIM_RecalcDisplay(struct IClass *cl, Object *obj, + struct MUIP_Window_RecalcDisplay *msg) { struct MUI_WindowData *data = INST_DATA(cl, obj); - LONG left,top,width,height; + LONG left, top, width, height; BOOL resized, reshow = FALSE; Object *current_obj; @@ -3574,15 +3703,21 @@ IPTR Window__MUIM_RecalcDisplay(struct IClass *cl, Object *obj, struct MUIP_Wind D(bug("RecalcDisplay on %p\n", current_obj)); while (current_obj != NULL) { - DoMethod(current_obj, MUIM_AskMinMax, (IPTR)&muiAreaData(current_obj)->mad_MinMax); - __area_finish_minmax(current_obj, &muiAreaData(current_obj)->mad_MinMax); - - D(bug("size w = %d, h = %d\n", _width(current_obj), _height(current_obj))); - D(bug("new w = %d-%d, h = %d-%d\n", _minwidth(current_obj), _maxwidth(current_obj), - _minheight(current_obj), _maxheight(current_obj))); - - if (!_between(_minwidth(current_obj), _width(current_obj), _maxwidth(current_obj)) - || !_between(_minheight(current_obj), _height(current_obj), _maxheight(current_obj))) + DoMethod(current_obj, MUIM_AskMinMax, + (IPTR) & muiAreaData(current_obj)->mad_MinMax); + __area_finish_minmax(current_obj, + &muiAreaData(current_obj)->mad_MinMax); + + D(bug("size w = %d, h = %d\n", _width(current_obj), + _height(current_obj))); + D(bug("new w = %d-%d, h = %d-%d\n", _minwidth(current_obj), + _maxwidth(current_obj), _minheight(current_obj), + _maxheight(current_obj))); + + if (!_between(_minwidth(current_obj), _width(current_obj), + _maxwidth(current_obj)) + || !_between(_minheight(current_obj), _height(current_obj), + _maxheight(current_obj))) { current_obj = _parent(current_obj); D(bug("RecalcDisplay, try parent %p\n", current_obj)); @@ -3598,20 +3733,22 @@ IPTR Window__MUIM_RecalcDisplay(struct IClass *cl, Object *obj, struct MUIP_Wind current_obj = data->wd_RootObject; WindowMinMax(obj, data); - + /* Important: current_obj could be hidden, like in an inactive page! */ if (_flags(current_obj) & MADF_CANDRAW) { reshow = TRUE; } - - if (reshow) DoHideMethod(current_obj); - + + if (reshow) + DoHideMethod(current_obj); + /* resize window ? */ WindowSelectDimensions(data); resized = WindowResize(data); - if (!resized) { + if (!resized) + { /* FIXME: Should we short circuit the following * if the window size didn't change? */ @@ -3620,17 +3757,20 @@ IPTR Window__MUIM_RecalcDisplay(struct IClass *cl, Object *obj, struct MUIP_Wind { struct Window *win = data->wd_RenderInfo.mri_Window; _left(data->wd_RootObject) = win->BorderLeft; - _top(data->wd_RootObject) = win->BorderTop; + _top(data->wd_RootObject) = win->BorderTop; _width(data->wd_RootObject) = data->wd_Width; _height(data->wd_RootObject) = data->wd_Height; } DoMethod(current_obj, MUIM_Layout); - - if (reshow) DoShowMethod(current_obj); - if (muiGlobalInfo(obj)->mgi_Prefs->window_redraw == WINDOW_REDRAW_WITHOUT_CLEAR) + if (reshow) + DoShowMethod(current_obj); + + if (muiGlobalInfo(obj)->mgi_Prefs->window_redraw == + WINDOW_REDRAW_WITHOUT_CLEAR) { - if (reshow) MUI_Redraw(current_obj, MADF_DRAWOBJECT); + if (reshow) + MUI_Redraw(current_obj, MADF_DRAWOBJECT); } else { @@ -3642,7 +3782,7 @@ IPTR Window__MUIM_RecalcDisplay(struct IClass *cl, Object *obj, struct MUIP_Wind - data->wd_RenderInfo.mri_Window->BorderBottom - top; zune_imspec_draw(data->wd_Background, &data->wd_RenderInfo, - left, top, width, height, left, top, 0); + left, top, width, height, left, top, 0); MUI_Redraw(data->wd_RootObject, MADF_DRAWALL); } @@ -3656,14 +3796,15 @@ IPTR Window__MUIM_RecalcDisplay(struct IClass *cl, Object *obj, struct MUIP_Wind MUIM_AddEventHandler **************************************************************************/ IPTR Window__MUIM_AddEventHandler(struct IClass *cl, Object *obj, - struct MUIP_Window_AddEventHandler *msg) + struct MUIP_Window_AddEventHandler *msg) { struct MUI_WindowData *data = INST_DATA(cl, obj); //D(bug("muimaster.library/window.c: Add Eventhandler %p\n", msg->ehnode)); msg->ehnode->ehn_Priority = msg->ehnode->ehn_Priority; - EnqueueByPriAndAddress((struct List *)&data->wd_EHList, (struct Node *)msg->ehnode); + EnqueueByPriAndAddress((struct List *)&data->wd_EHList, + (struct Node *)msg->ehnode); ChangeEvents(data, GetDefaultEvents()); return TRUE; } @@ -3672,7 +3813,7 @@ IPTR Window__MUIM_AddEventHandler(struct IClass *cl, Object *obj, MUIM_RemEventHandler **************************************************************************/ IPTR Window__MUIM_RemEventHandler(struct IClass *cl, Object *obj, - struct MUIP_Window_RemEventHandler *msg) + struct MUIP_Window_RemEventHandler *msg) { struct MUI_WindowData *data = INST_DATA(cl, obj); @@ -3693,9 +3834,11 @@ IPTR Window__MUIM_Setup(struct IClass *cl, Object *obj, Msg msg) if (!SetupRenderInfo(obj, data, &data->wd_RenderInfo)) return FALSE; - data->wd_Background = zune_imspec_setup(MUII_WindowBack, &data->wd_RenderInfo); + data->wd_Background = + zune_imspec_setup(MUII_WindowBack, &data->wd_RenderInfo); - if (muiGlobalInfo(obj)->mgi_Prefs->window_redraw == WINDOW_REDRAW_WITH_CLEAR) + if (muiGlobalInfo(obj)->mgi_Prefs->window_redraw == + WINDOW_REDRAW_WITH_CLEAR) data->wd_Flags |= MUIWF_ERASEAREA; return TRUE; @@ -3726,7 +3869,7 @@ IPTR Window__MUIM_Cleanup(struct IClass *cl, Object *obj, Msg msg) stuff. Orginal MUI does this in an other way. **************************************************************************/ IPTR Window__MUIM_AddControlCharHandler(struct IClass *cl, Object *obj, - struct MUIP_Window_AddControlCharHandler *msg) + struct MUIP_Window_AddControlCharHandler *msg) { struct MUI_WindowData *data = INST_DATA(cl, obj); struct ObjNode *node; @@ -3734,7 +3877,8 @@ IPTR Window__MUIM_AddControlCharHandler(struct IClass *cl, Object *obj, if (msg->ccnode->ehn_Events) { msg->ccnode->ehn_Priority = msg->ccnode->ehn_Priority; - Enqueue((struct List *)&data->wd_CCList, (struct Node *)msg->ccnode); + Enqueue((struct List *)&data->wd_CCList, + (struct Node *)msg->ccnode); } /* Due to the lack of a better idea ... */ if (muiAreaData(msg->ccnode->ehn_Object)->mad_Flags & MADF_CYCLECHAIN) @@ -3743,7 +3887,8 @@ IPTR Window__MUIM_AddControlCharHandler(struct IClass *cl, Object *obj, if (node) { node->obj = msg->ccnode->ehn_Object; - AddTail((struct List *)&data->wd_CycleChain,(struct Node*)node); + AddTail((struct List *)&data->wd_CycleChain, + (struct Node *)node); } } return TRUE; @@ -3753,10 +3898,11 @@ IPTR Window__MUIM_AddControlCharHandler(struct IClass *cl, Object *obj, MUIM_RemControlCharHandler **************************************************************************/ IPTR Window__MUIM_RemControlCharHandler(struct IClass *cl, Object *obj, - struct MUIP_Window_RemControlCharHandler *msg) + struct MUIP_Window_RemControlCharHandler *msg) { struct MUI_WindowData *data = INST_DATA(cl, obj); - struct ObjNode *node = FindObjNode(&data->wd_CycleChain,msg->ccnode->ehn_Object); + struct ObjNode *node = + FindObjNode(&data->wd_CycleChain, msg->ccnode->ehn_Object); if (msg->ccnode->ehn_Events) Remove((struct Node *)msg->ccnode); @@ -3774,58 +3920,62 @@ IPTR Window__MUIM_RemControlCharHandler(struct IClass *cl, Object *obj, /************************************************************************** MUIM_DragObject **************************************************************************/ -IPTR Window__MUIM_DragObject(struct IClass *cl, Object *obj, struct MUIP_Window_DragObject *msg) +IPTR Window__MUIM_DragObject(struct IClass *cl, Object *obj, + struct MUIP_Window_DragObject *msg) { struct MUI_WindowData *data = INST_DATA(cl, obj); if (msg->obj) { - struct DragNDrop *dnd; - struct MUI_DragImage *di; - struct BitMapNode *bmn; + struct DragNDrop *dnd; + struct MUI_DragImage *di; + struct BitMapNode *bmn; - if (!(dnd = CreateDragNDropA(NULL))) - return 0; + if (!(dnd = CreateDragNDropA(NULL))) + return 0; - if (!(di = (struct MUI_DragImage*)DoMethod(msg->obj,MUIM_CreateDragImage,-msg->touchx,-msg->touchy,msg->flags))) - { - DeleteDragNDrop(dnd); - return 0; - } - if (!di->bm) - { - DoMethod(msg->obj,MUIM_DeleteDragImage, (IPTR)di); - DeleteDragNDrop(dnd); - return 0; - } + if (!(di = + (struct MUI_DragImage *)DoMethod(msg->obj, + MUIM_CreateDragImage, -msg->touchx, -msg->touchy, + msg->flags))) + { + DeleteDragNDrop(dnd); + return 0; + } + if (!di->bm) + { + DoMethod(msg->obj, MUIM_DeleteDragImage, (IPTR) di); + DeleteDragNDrop(dnd); + return 0; + } - if (!(bmn = CreateBitMapNodeA(TAGLIST( - GUI_BitMap, (IPTR)di->bm, - GUI_LeftOffset, di->touchx, - GUI_TopOffset, di->touchy, - GUI_Width, di->width, - GUI_Height, di->height, - GUI_SourceAlpha, !!(di->flags & MUIF_DRAGIMAGE_SOURCEALPHA))))) - { - DoMethod(msg->obj, MUIM_DeleteDragImage, (IPTR)di); - DeleteDragNDrop(dnd); - return 0; - } + if (!(bmn = CreateBitMapNodeA(TAGLIST( + GUI_BitMap, (IPTR)di->bm, + GUI_LeftOffset, di->touchx, + GUI_TopOffset, di->touchy, + GUI_Width, di->width, + GUI_Height, di->height, + GUI_SourceAlpha, !!(di->flags & MUIF_DRAGIMAGE_SOURCEALPHA))))) + { + DoMethod(msg->obj, MUIM_DeleteDragImage, (IPTR) di); + DeleteDragNDrop(dnd); + return 0; + } - AttachBitMapNode(dnd,bmn); + AttachBitMapNode(dnd, bmn); - if (!PrepareDragNDrop(dnd, data->wd_RenderInfo.mri_Screen)) - { - DoMethod(msg->obj,MUIM_DeleteDragImage, (IPTR)di); - DeleteDragNDrop(dnd); - return 0; - } + if (!PrepareDragNDrop(dnd, data->wd_RenderInfo.mri_Screen)) + { + DoMethod(msg->obj, MUIM_DeleteDragImage, (IPTR) di); + DeleteDragNDrop(dnd); + return 0; + } - muiAreaData(msg->obj)->mad_Flags |= MADF_DRAGGING; + muiAreaData(msg->obj)->mad_Flags |= MADF_DRAGGING; - data->wd_DragObject = msg->obj; - data->wd_dnd = dnd; - data->wd_DragImage = di; - return 1; + data->wd_DragObject = msg->obj; + data->wd_dnd = dnd; + data->wd_DragImage = di; + return 1; } return 0; } @@ -3833,7 +3983,8 @@ IPTR Window__MUIM_DragObject(struct IClass *cl, Object *obj, struct MUIP_Window_ /************************************************************************** MUIM_AllocGadgetID **************************************************************************/ -IPTR Window__MUIM_AllocGadgetID(struct IClass *cl, Object *obj, struct MUIP_Window_AllocGadgetID *msg) +IPTR Window__MUIM_AllocGadgetID(struct IClass *cl, Object *obj, + struct MUIP_Window_AllocGadgetID *msg) { struct MUI_WindowData *data = INST_DATA(cl, obj); struct IDNode *newnode; @@ -3841,28 +3992,30 @@ IPTR Window__MUIM_AllocGadgetID(struct IClass *cl, Object *obj, struct MUIP_Wind newnode = AllocPooled(data->wd_MemoryPool, sizeof(struct IDNode)); if (newnode) { - int id; - struct MinNode *mn; - - if (IsListEmpty((struct List*)&data->wd_IDList)) - { - newnode->id = 1; - AddHead((struct List*)&data->wd_IDList, (struct Node*)&newnode->node); - return (IPTR)1; - } - - id = 1; - - for (mn = data->wd_IDList.mlh_Head; mn->mln_Succ; mn = mn->mln_Succ) - { - struct IDNode *idn = (struct IDNode *)mn; - if (id < idn->id) - break; - id++; - } - newnode->id = id; - Insert((struct List*)&data->wd_IDList, (struct Node*)&newnode->node, (struct Node*)mn); - return (IPTR)id; + int id; + struct MinNode *mn; + + if (IsListEmpty((struct List *)&data->wd_IDList)) + { + newnode->id = 1; + AddHead((struct List *)&data->wd_IDList, + (struct Node *)&newnode->node); + return (IPTR) 1; + } + + id = 1; + + for (mn = data->wd_IDList.mlh_Head; mn->mln_Succ; mn = mn->mln_Succ) + { + struct IDNode *idn = (struct IDNode *)mn; + if (id < idn->id) + break; + id++; + } + newnode->id = id; + Insert((struct List *)&data->wd_IDList, + (struct Node *)&newnode->node, (struct Node *)mn); + return (IPTR) id; } return 0; @@ -3871,20 +4024,21 @@ IPTR Window__MUIM_AllocGadgetID(struct IClass *cl, Object *obj, struct MUIP_Wind /************************************************************************** MUIM_FreeGadgetID **************************************************************************/ -IPTR Window__MUIM_FreeGadgetID(struct IClass *cl, Object *obj, struct MUIP_Window_FreeGadgetID *msg) +IPTR Window__MUIM_FreeGadgetID(struct IClass *cl, Object *obj, + struct MUIP_Window_FreeGadgetID *msg) { struct MUI_WindowData *data = INST_DATA(cl, obj); struct MinNode *mn; for (mn = data->wd_IDList.mlh_Head; mn->mln_Succ; mn = mn->mln_Succ) { - struct IDNode *idn = (struct IDNode *)mn; - if (msg->gadgetid == idn->id) - { - Remove((struct Node*)idn); - FreePooled(data->wd_MemoryPool, idn, sizeof(struct IDNode)); - return 0; - } + struct IDNode *idn = (struct IDNode *)mn; + if (msg->gadgetid == idn->id) + { + Remove((struct Node *)idn); + FreePooled(data->wd_MemoryPool, idn, sizeof(struct IDNode)); + return 0; + } } return 0; @@ -3894,7 +4048,8 @@ IPTR Window__MUIM_FreeGadgetID(struct IClass *cl, Object *obj, struct MUIP_Windo /************************************************************************** MUIM_Window_GetMenuCheck **************************************************************************/ -IPTR Window__MUIM_GetMenuCheck(struct IClass *cl, Object *obj, struct MUIP_Window_GetMenuCheck *msg) +IPTR Window__MUIM_GetMenuCheck(struct IClass *cl, Object *obj, + struct MUIP_Window_GetMenuCheck *msg) { IPTR stat = 0; struct MUI_WindowData *data = INST_DATA(cl, obj); @@ -3904,16 +4059,17 @@ IPTR Window__MUIM_GetMenuCheck(struct IClass *cl, Object *obj, struct MUIP_Windo strip = data->wd_Menustrip; if (!strip) return 0; - if (!(item = (Object*)DoMethod(strip, MUIM_FindUData, msg->MenuID))) + if (!(item = (Object *) DoMethod(strip, MUIM_FindUData, msg->MenuID))) return 0; - get(item,MUIA_Menuitem_Checked, &stat); + get(item, MUIA_Menuitem_Checked, &stat); return stat; } /************************************************************************** MUIM_Window_SetMenuCheck **************************************************************************/ -IPTR Window__MUIM_SetMenuCheck(struct IClass *cl, Object *obj, struct MUIP_Window_SetMenuCheck *msg) +IPTR Window__MUIM_SetMenuCheck(struct IClass *cl, Object *obj, + struct MUIP_Window_SetMenuCheck *msg) { struct MUI_WindowData *data = INST_DATA(cl, obj); Object *item; @@ -3922,34 +4078,37 @@ IPTR Window__MUIM_SetMenuCheck(struct IClass *cl, Object *obj, struct MUIP_Windo strip = data->wd_Menustrip; if (!strip) return 0; - if (!(item = (Object*)DoMethod(strip, MUIM_FindUData, msg->MenuID))) + if (!(item = (Object *) DoMethod(strip, MUIM_FindUData, msg->MenuID))) return 0; - set(item,MUIA_Menuitem_Checked,msg->stat); + set(item, MUIA_Menuitem_Checked, msg->stat); return 0; } /************************************************************************** MUIM_Window_GetMenuState **************************************************************************/ -IPTR Window__MUIM_GetMenuState(struct IClass *cl, Object *obj, struct MUIP_Window_GetMenuState *msg) +IPTR Window__MUIM_GetMenuState(struct IClass *cl, Object *obj, + struct MUIP_Window_GetMenuState *msg) { IPTR stat = 0; struct MUI_WindowData *data = INST_DATA(cl, obj); Object *item; Object *strip = data->wd_ChildMenustrip; - if (!strip) strip = data->wd_Menustrip; + if (!strip) + strip = data->wd_Menustrip; if (!strip) return 0; - if (!(item = (Object*)DoMethod(strip, MUIM_FindUData, msg->MenuID))) + if (!(item = (Object *) DoMethod(strip, MUIM_FindUData, msg->MenuID))) return 0; - get(item,MUIA_Menuitem_Enabled, &stat); + get(item, MUIA_Menuitem_Enabled, &stat); return stat; } /************************************************************************** MUIM_Window_SetMenuState **************************************************************************/ -IPTR Window__MUIM_SetMenuState(struct IClass *cl, Object *obj, struct MUIP_Window_SetMenuState *msg) +IPTR Window__MUIM_SetMenuState(struct IClass *cl, Object *obj, + struct MUIP_Window_SetMenuState *msg) { struct MUI_WindowData *data = INST_DATA(cl, obj); Object *item; @@ -3958,27 +4117,28 @@ IPTR Window__MUIM_SetMenuState(struct IClass *cl, Object *obj, struct MUIP_Windo strip = data->wd_Menustrip; if (!strip) return 0; - if (!(item = (Object*)DoMethod(strip, MUIM_FindUData, msg->MenuID))) + if (!(item = (Object *) DoMethod(strip, MUIM_FindUData, msg->MenuID))) return 0; - set(item,MUIA_Menuitem_Enabled,msg->stat); + set(item, MUIA_Menuitem_Enabled, msg->stat); return 0; } /************************************************************************** MUIM_Window_DrawBackground **************************************************************************/ -IPTR Window__MUIM_DrawBackground(struct IClass *cl, Object *obj, struct MUIP_Window_DrawBackground *msg) +IPTR Window__MUIM_DrawBackground(struct IClass *cl, Object *obj, + struct MUIP_Window_DrawBackground *msg) { struct MUI_WindowData *data = INST_DATA(cl, obj); - if (!(data->wd_RenderInfo.mri_Window)) /* not between show/hide */ + if (!(data->wd_RenderInfo.mri_Window)) /* not between show/hide */ return FALSE; // D(bug("%d:zune_imspec_draw(%p) l=%d t=%d w=%d h=%d xo=%d yo=%d\n", // __LINE__, data->wd_Background, msg->left, msg->top, msg->width, // msg->height, msg->xoffset, msg->yoffset)); zune_imspec_draw(data->wd_Background, &data->wd_RenderInfo, - msg->left, msg->top, msg->width, msg->height, - msg->xoffset, msg->yoffset, 0); + msg->left, msg->top, msg->width, msg->height, + msg->xoffset, msg->yoffset, 0); return 0; } @@ -3988,7 +4148,7 @@ IPTR Window__MUIM_DrawBackground(struct IClass *cl, Object *obj, struct MUIP_Win IPTR Window__MUIM_ToFront(struct IClass *cl, Object *obj, Msg msg) { struct MUI_WindowData *data = INST_DATA(cl, obj); - if (!(data->wd_RenderInfo.mri_Window)) /* not between show/hide */ + if (!(data->wd_RenderInfo.mri_Window)) /* not between show/hide */ return 0; WindowToFront(data->wd_RenderInfo.mri_Window); @@ -4001,7 +4161,7 @@ IPTR Window__MUIM_ToFront(struct IClass *cl, Object *obj, Msg msg) IPTR Window__MUIM_ToBack(struct IClass *cl, Object *obj, Msg msg) { struct MUI_WindowData *data = INST_DATA(cl, obj); - if (!(data->wd_RenderInfo.mri_Window)) /* not between show/hide */ + if (!(data->wd_RenderInfo.mri_Window)) /* not between show/hide */ return 0; WindowToBack(data->wd_RenderInfo.mri_Window); @@ -4014,7 +4174,7 @@ IPTR Window__MUIM_ToBack(struct IClass *cl, Object *obj, Msg msg) IPTR Window__MUIM_ScreenToBack(struct IClass *cl, Object *obj, Msg msg) { struct MUI_WindowData *data = INST_DATA(cl, obj); - if (!(data->wd_RenderInfo.mri_Window)) /* not between show/hide */ + if (!(data->wd_RenderInfo.mri_Window)) /* not between show/hide */ return 0; ScreenToBack(data->wd_RenderInfo.mri_Screen); @@ -4027,7 +4187,7 @@ IPTR Window__MUIM_ScreenToBack(struct IClass *cl, Object *obj, Msg msg) IPTR Window__MUIM_ScreenToFront(struct IClass *cl, Object *obj, Msg msg) { struct MUI_WindowData *data = INST_DATA(cl, obj); - if (!(data->wd_RenderInfo.mri_Window)) /* not between show/hide */ + if (!(data->wd_RenderInfo.mri_Window)) /* not between show/hide */ return 0; ScreenToFront(data->wd_RenderInfo.mri_Screen); @@ -4070,9 +4230,10 @@ static void RememberWindowPosition(Object *winobj, ULONG id) return; } -/* Loads ENV: prefs, remove our Window_ID chunk from the MUIW chunk, save prefs. +/* Loads ENV: prefs, remove our Window_ID chunk from the MUIW chunk, + * save prefs. * Do the same for ENVARC: - * This function shouldnt really be in window.c, but rather in a file dealing + * This function shouldn't really be in window.c, but rather in a file dealing * with prefs file stuff. */ static void ForgetWindowPosition(Object *winobj, ULONG id) @@ -4084,10 +4245,11 @@ static void ForgetWindowPosition(Object *winobj, ULONG id) /************************************************************************** MUIM_Window_Snapshot **************************************************************************/ -IPTR Window__MUIM_Snapshot(struct IClass *cl, Object *obj, struct MUIP_Window_Snapshot *msg) +IPTR Window__MUIM_Snapshot(struct IClass *cl, Object *obj, + struct MUIP_Window_Snapshot *msg) { struct MUI_WindowData *data = INST_DATA(cl, obj); - struct windowpos winp; + struct windowpos winp; struct Window *w; winp.id = data->wd_ID; w = data->wd_RenderInfo.mri_Window; @@ -4100,9 +4262,9 @@ IPTR Window__MUIM_Snapshot(struct IClass *cl, Object *obj, struct MUIP_Window_Sn winp.x2 = 0; winp.x2 = 0; winp.w2 = 0; - winp.h2 = 0; //to do save alt dims + winp.h2 = 0; //to do save alt dims - set(_app(obj),MUIA_Application_SetWinPos,&winp); + set(_app(obj), MUIA_Application_SetWinPos, &winp); } if (msg->flags) @@ -4122,11 +4284,12 @@ IPTR Window__MUIM_UpdateMenu(struct IClass *cl, Object *obj, Msg msg) struct Menu *menu = NULL; struct NewMenu *newmenu = NULL; APTR visinfo = NULL; - struct Window *win =NULL; + struct Window *win = NULL; - if (data->wd_Menustrip) // only open windows can have a menustrip + if (data->wd_Menustrip) // only open windows can have a menustrip { - if ((visinfo = GetVisualInfoA(data->wd_RenderInfo.mri_Screen, NULL))) + if ((visinfo = + GetVisualInfoA(data->wd_RenderInfo.mri_Screen, NULL))) { win = data->wd_RenderInfo.mri_Window; ClearMenuStrip(win); @@ -4141,10 +4304,9 @@ IPTR Window__MUIM_UpdateMenu(struct IClass *cl, Object *obj, Msg msg) { if ((menu = CreateMenusA(newmenu, NULL))) { - struct TagItem tags[] = - { - { GTMN_NewLookMenus, TRUE }, - { TAG_DONE, 0 } + struct TagItem tags[] = { + {GTMN_NewLookMenus, TRUE}, + {TAG_DONE, 0} }; LayoutMenusA(menu, visinfo, tags); data->wd_Menu = menu; @@ -4161,10 +4323,11 @@ IPTR Window__MUIM_UpdateMenu(struct IClass *cl, Object *obj, Msg msg) /************************************************************************** MUIM_Export : to export an objects "contents" to a dataspace object. **************************************************************************/ -static IPTR Window__MUIM_Export(struct IClass *cl, Object *obj, struct MUIP_Export *msg) +static IPTR Window__MUIM_Export(struct IClass *cl, Object *obj, + struct MUIP_Export *msg) { struct MUI_WindowData *data = INST_DATA(cl, obj); - DoMethodA(data->wd_RootObject, (Msg)msg); + DoMethodA(data->wd_RootObject, (Msg) msg); return 0; } @@ -4172,10 +4335,11 @@ static IPTR Window__MUIM_Export(struct IClass *cl, Object *obj, struct MUIP_Expo /************************************************************************** MUIM_Import : to import an objects "contents" from a dataspace object. **************************************************************************/ -static IPTR Window__MUIM_Import(struct IClass *cl, Object *obj, struct MUIP_Import *msg) +static IPTR Window__MUIM_Import(struct IClass *cl, Object *obj, + struct MUIP_Import *msg) { struct MUI_WindowData *data = INST_DATA(cl, obj); - DoMethodA(data->wd_RootObject, (Msg)msg); + DoMethodA(data->wd_RootObject, (Msg) msg); return 0; } @@ -4183,54 +4347,89 @@ BOOPSI_DISPATCHER(IPTR, Window_Dispatcher, cl, obj, msg) { switch (msg->MethodID) { - case OM_NEW: return Window__OM_NEW(cl, obj, (struct opSet *) msg); - case OM_DISPOSE: return Window__OM_DISPOSE(cl, obj, msg); - case OM_SET: return Window__OM_SET(cl, obj, (struct opSet *)msg); - case OM_GET: return Window__OM_GET(cl, obj, (struct opGet *)msg); - case MUIM_FindUData: return Window__MUIM_FindUData(cl, obj, (struct MUIP_FindUData *)msg); - case MUIM_GetUData: return Window__MUIM_GetUData(cl, obj, (struct MUIP_GetUData *)msg); - case MUIM_SetUData: return Window__MUIM_SetUData(cl, obj, (struct MUIP_SetUData *)msg); - case MUIM_SetUDataOnce: return Window__MUIM_SetUDataOnce(cl, obj, (struct MUIP_SetUDataOnce *)msg); - case MUIM_Window_AddEventHandler: return Window__MUIM_AddEventHandler(cl, obj, (APTR)msg); - case MUIM_Window_RemEventHandler: return Window__MUIM_RemEventHandler(cl, obj, (APTR)msg); - case MUIM_ConnectParent: return Window__MUIM_ConnectParent(cl, obj, (APTR)msg); - case MUIM_DisconnectParent: return Window__MUIM_DisconnectParent(cl, obj, (APTR)msg); - case MUIM_Window_RecalcDisplay: return Window__MUIM_RecalcDisplay(cl, obj, (APTR)msg); - case MUIM_Window_Setup: return Window__MUIM_Setup(cl, obj, (APTR)msg); - case MUIM_Window_Cleanup: return Window__MUIM_Cleanup(cl, obj, (APTR)msg); - case MUIM_Window_AddControlCharHandler: return Window__MUIM_AddControlCharHandler(cl, obj, (APTR)msg); - case MUIM_Window_RemControlCharHandler: return Window__MUIM_RemControlCharHandler(cl, obj, (APTR)msg); - case MUIM_Window_DragObject: return Window__MUIM_DragObject(cl, obj, (APTR)msg); - case MUIM_Window_AllocGadgetID: return Window__MUIM_AllocGadgetID(cl, obj, (APTR)msg); - case MUIM_Window_FreeGadgetID: return Window__MUIM_FreeGadgetID(cl, obj, (APTR)msg); - case MUIM_Window_GetMenuCheck: return Window__MUIM_GetMenuCheck(cl, obj, (APTR)msg); - case MUIM_Window_SetMenuCheck: return Window__MUIM_SetMenuCheck(cl, obj, (APTR)msg); - case MUIM_Window_GetMenuState: return Window__MUIM_GetMenuState(cl, obj, (APTR)msg); - case MUIM_Window_SetMenuState: return Window__MUIM_SetMenuState(cl, obj, (APTR)msg); - case MUIM_Window_DrawBackground: return Window__MUIM_DrawBackground(cl, obj, (APTR)msg); - case MUIM_Window_ToFront: return Window__MUIM_ToFront(cl, obj, (APTR)msg); - case MUIM_Window_ToBack: return Window__MUIM_ToBack(cl, obj, (APTR)msg); - case MUIM_Window_ScreenToFront: return Window__MUIM_ScreenToFront(cl, obj, (APTR)msg); - case MUIM_Window_ScreenToBack: return Window__MUIM_ScreenToBack(cl, obj, (APTR)msg); - case MUIM_Window_ActionIconify: return Window__MUIM_ActionIconify(cl, obj, (APTR)msg); - case MUIM_Window_Snapshot: return Window__MUIM_Snapshot(cl, obj, (APTR)msg); - case MUIM_Window_UpdateMenu: return Window__MUIM_UpdateMenu(cl, obj, (APTR)msg); - case MUIM_Export: return Window__MUIM_Export(cl, obj, (APTR)msg); - case MUIM_Import: return Window__MUIM_Import(cl, obj, (APTR)msg); + case OM_NEW: + return Window__OM_NEW(cl, obj, (struct opSet *)msg); + case OM_DISPOSE: + return Window__OM_DISPOSE(cl, obj, msg); + case OM_SET: + return Window__OM_SET(cl, obj, (struct opSet *)msg); + case OM_GET: + return Window__OM_GET(cl, obj, (struct opGet *)msg); + case MUIM_FindUData: + return Window__MUIM_FindUData(cl, obj, + (struct MUIP_FindUData *)msg); + case MUIM_GetUData: + return Window__MUIM_GetUData(cl, obj, (struct MUIP_GetUData *)msg); + case MUIM_SetUData: + return Window__MUIM_SetUData(cl, obj, (struct MUIP_SetUData *)msg); + case MUIM_SetUDataOnce: + return Window__MUIM_SetUDataOnce(cl, obj, + (struct MUIP_SetUDataOnce *)msg); + case MUIM_Window_AddEventHandler: + return Window__MUIM_AddEventHandler(cl, obj, (APTR) msg); + case MUIM_Window_RemEventHandler: + return Window__MUIM_RemEventHandler(cl, obj, (APTR) msg); + case MUIM_ConnectParent: + return Window__MUIM_ConnectParent(cl, obj, (APTR) msg); + case MUIM_DisconnectParent: + return Window__MUIM_DisconnectParent(cl, obj, (APTR) msg); + case MUIM_Window_RecalcDisplay: + return Window__MUIM_RecalcDisplay(cl, obj, (APTR) msg); + case MUIM_Window_Setup: + return Window__MUIM_Setup(cl, obj, (APTR) msg); + case MUIM_Window_Cleanup: + return Window__MUIM_Cleanup(cl, obj, (APTR) msg); + case MUIM_Window_AddControlCharHandler: + return Window__MUIM_AddControlCharHandler(cl, obj, (APTR) msg); + case MUIM_Window_RemControlCharHandler: + return Window__MUIM_RemControlCharHandler(cl, obj, (APTR) msg); + case MUIM_Window_DragObject: + return Window__MUIM_DragObject(cl, obj, (APTR) msg); + case MUIM_Window_AllocGadgetID: + return Window__MUIM_AllocGadgetID(cl, obj, (APTR) msg); + case MUIM_Window_FreeGadgetID: + return Window__MUIM_FreeGadgetID(cl, obj, (APTR) msg); + case MUIM_Window_GetMenuCheck: + return Window__MUIM_GetMenuCheck(cl, obj, (APTR) msg); + case MUIM_Window_SetMenuCheck: + return Window__MUIM_SetMenuCheck(cl, obj, (APTR) msg); + case MUIM_Window_GetMenuState: + return Window__MUIM_GetMenuState(cl, obj, (APTR) msg); + case MUIM_Window_SetMenuState: + return Window__MUIM_SetMenuState(cl, obj, (APTR) msg); + case MUIM_Window_DrawBackground: + return Window__MUIM_DrawBackground(cl, obj, (APTR) msg); + case MUIM_Window_ToFront: + return Window__MUIM_ToFront(cl, obj, (APTR) msg); + case MUIM_Window_ToBack: + return Window__MUIM_ToBack(cl, obj, (APTR) msg); + case MUIM_Window_ScreenToFront: + return Window__MUIM_ScreenToFront(cl, obj, (APTR) msg); + case MUIM_Window_ScreenToBack: + return Window__MUIM_ScreenToBack(cl, obj, (APTR) msg); + case MUIM_Window_ActionIconify: + return Window__MUIM_ActionIconify(cl, obj, (APTR) msg); + case MUIM_Window_Snapshot: + return Window__MUIM_Snapshot(cl, obj, (APTR) msg); + case MUIM_Window_UpdateMenu: + return Window__MUIM_UpdateMenu(cl, obj, (APTR) msg); + case MUIM_Export: + return Window__MUIM_Export(cl, obj, (APTR) msg); + case MUIM_Import: + return Window__MUIM_Import(cl, obj, (APTR) msg); } return DoSuperMethodA(cl, obj, msg); } BOOPSI_DISPATCHER_END - /* * Class descriptor. */ -const struct __MUIBuiltinClass _MUI_Window_desc = { +const struct __MUIBuiltinClass _MUI_Window_desc = +{ MUIC_Window, MUIC_Notify, sizeof(struct MUI_WindowData), - (void*)Window_Dispatcher + (void *) Window_Dispatcher }; - diff --git a/workbench/libs/muimaster/classes/window.h b/workbench/libs/muimaster/classes/window.h dissimilarity index 73% index da763e803d..89274d2e9e 100644 --- a/workbench/libs/muimaster/classes/window.h +++ b/workbench/libs/muimaster/classes/window.h @@ -1,251 +1,450 @@ -#ifndef _MUI_CLASSES_WINDOW_H -#define _MUI_CLASSES_WINDOW_H - -/* - Copyright 1999, David Le Corfec. - Copyright 2002-2003, The AROS Development Team. - All rights reserved. - - $Id$ -*/ - -/*** Name *******************************************************************/ -#define MUIC_Window "Window.mui" - -/*** Identifier base (for Zune extensions) **********************************/ -#define MUIB_Window (MUIB_ZUNE | 0x00003600) - -/*** Methods ****************************************************************/ -#define MUIM_Window_ActionIconify (MUIB_MUI|0x00422cc0) /* MUI: V18 undoc*/ -#define MUIM_Window_AddEventHandler (MUIB_MUI|0x004203b7) /* MUI: V16 */ -#define MUIM_Window_Cleanup (MUIB_MUI|0x0042ab26) /* MUI: V18 undoc */ /* For custom classes only */ -#define MUIM_Window_RemEventHandler (MUIB_MUI|0x0042679e) /* MUI: V16 */ -#define MUIM_Window_ScreenToBack (MUIB_MUI|0x0042913d) /* MUI: V4 */ -#define MUIM_Window_ScreenToFront (MUIB_MUI|0x004227a4) /* MUI: V4 */ -#define MUIM_Window_Setup (MUIB_MUI|0x0042c34c) /* MUI: V18 undoc */ /* For custom Classes only */ -#define MUIM_Window_Snapshot (MUIB_MUI|0x0042945e) /* MUI: V11 */ -#define MUIM_Window_ToBack (MUIB_MUI|0x0042152e) /* MUI: V4 */ -#define MUIM_Window_ToFront (MUIB_MUI|0x0042554f) /* MUI: V4 */ -struct MUIP_Window_ActionIconify {STACKED ULONG MethodID;}; -struct MUIP_Window_AddEventHandler {STACKED ULONG MethodID; STACKED struct MUI_EventHandlerNode *ehnode;}; -struct MUIP_Window_Cleanup {STACKED ULONG MethodID;}; -struct MUIP_Window_RemEventHandler {STACKED ULONG MethodID; STACKED struct MUI_EventHandlerNode *ehnode;}; -struct MUIP_Window_ScreenToBack {STACKED ULONG MethodID;}; -struct MUIP_Window_ScreenToFront {STACKED ULONG MethodID;}; -struct MUIP_Window_Setup {STACKED ULONG MethodID;}; -struct MUIP_Window_Snapshot {STACKED ULONG MethodID; STACKED LONG flags;}; -struct MUIP_Window_ToBack {STACKED ULONG MethodID;}; -struct MUIP_Window_ToFront {STACKED ULONG MethodID;}; - -#define MUIM_Window_AddControlCharHandler (MUIB_Window | 0x00000000) /* Zune: V1, PRIV don't use it! */ -#define MUIM_Window_AllocGadgetID (MUIB_Window | 0x00000001) /* Zune: V1 - allocate a GadgetID for BOOPSI gadgets */ -#define MUIM_Window_DrawBackground (MUIB_Window | 0x00000002) /* Zune: V1 - like MUIM_DrawBackground but PRIV */ -#define MUIM_Window_DragObject (MUIB_Window | 0x00000003) /* Zune: V1, PRIV don't use it! */ -#define MUIM_Window_FreeGadgetID (MUIB_Window | 0x00000004) /* Zune: V1 - free the GadgetID for BOOPSI gadgets */ -#define MUIM_Window_RecalcDisplay (MUIB_Window | 0x00000005) /* Zune: V1, PRIV don't use it! */ -#define MUIM_Window_RemControlCharHandler (MUIB_Window | 0x00000006) /* Zune: V1, PRIV don't use it! */ -#define MUIM_Window_UpdateMenu (MUIB_Window | 0x00000007) /* Zune: V1, PRIV dont' use it! */ -struct MUIP_Window_AddControlCharHandler { STACKED ULONG MethodID; STACKED struct MUI_EventHandlerNode *ccnode; }; -struct MUIP_Window_AllocGadgetID { STACKED ULONG MethodID; }; /* Custom Class - returns the Gadget ID */ -struct MUIP_Window_DrawBackground { STACKED ULONG MethodID; STACKED LONG left; STACKED LONG top; STACKED LONG width; STACKED LONG height; STACKED LONG xoffset; STACKED LONG yoffset; STACKED LONG flags;}; -struct MUIP_Window_DragObject { STACKED ULONG MethodID; STACKED Object *obj; STACKED LONG touchx; STACKED LONG touchy; STACKED ULONG flags; }; -struct MUIP_Window_FreeGadgetID { STACKED ULONG MethodID; STACKED LONG gadgetid; }; /* Custom Class */ -struct MUIP_Window_RecalcDisplay { STACKED ULONG MethodID; STACKED Object *originator; }; -struct MUIP_Window_RemControlCharHandler { STACKED ULONG MethodID; STACKED struct MUI_EventHandlerNode *ccnode; }; -struct MUIP_Window_UpdateMenu { STACKED ULONG MethodID; }; - -#ifdef MUI_OBSOLETE -#define MUIM_Window_GetMenuCheck (MUIB_MUI|0x00420414) /* MUI: V4 */ -#define MUIM_Window_GetMenuState (MUIB_MUI|0x00420d2f) /* MUI: V4 */ -#define MUIM_Window_SetCycleChain (MUIB_MUI|0x00426510) /* MUI: V4 */ -#define MUIM_Window_SetMenuCheck (MUIB_MUI|0x00422243) /* MUI: V4 */ -#define MUIM_Window_SetMenuState (MUIB_MUI|0x00422b5e) /* MUI: V4 */ -struct MUIP_Window_GetMenuCheck {STACKULONG MethodID; STACKED ULONG MenuID;}; -struct MUIP_Window_GetMenuState {STACKULONG MethodID; STACKED ULONG MenuID;}; -struct MUIP_Window_SetCycleChain {STACKULONG MethodID; STACKED Object *obj[1];}; -struct MUIP_Window_SetMenuCheck {STACKULONG MethodID; STACKED ULONG MenuID; STACKED LONG stat;}; -struct MUIP_Window_SetMenuState {STACKULONG MethodID; STACKED ULONG MenuID; STACKED LONG stat;}; -#endif /* MUI_OBSOLETE */ - -/*** Attributes *************************************************************/ -#define MUIA_Window_Activate (MUIB_MUI|0x00428d2f) /* MUI: V4 isg BOOL */ -#define MUIA_Window_ActiveObject (MUIB_MUI|0x00427925) /* MUI: V4 .sg Object * */ -#define MUIA_Window_AltHeight (MUIB_MUI|0x0042cce3) /* MUI: V4 i.g LONG */ -#define MUIA_Window_AltLeftEdge (MUIB_MUI|0x00422d65) /* MUI: V4 i.g LONG */ -#define MUIA_Window_AltTopEdge (MUIB_MUI|0x0042e99b) /* MUI: V4 i.g LONG */ -#define MUIA_Window_AltWidth (MUIB_MUI|0x004260f4) /* MUI: V4 i.g LONG */ -#define MUIA_Window_AppWindow (MUIB_MUI|0x004280cf) /* MUI: V5 i.. BOOL */ -#define MUIA_Window_Backdrop (MUIB_MUI|0x0042c0bb) /* MUI: V4 i.. BOOL */ -#define MUIA_Window_Borderless (MUIB_MUI|0x00429b79) /* MUI: V4 i.. BOOL */ -#define MUIA_Window_CloseGadget (MUIB_MUI|0x0042a110) /* MUI: V4 i.. BOOL */ -#define MUIA_Window_CloseRequest (MUIB_MUI|0x0042e86e) /* MUI: V4 ..g BOOL */ -#define MUIA_Window_DefaultObject (MUIB_MUI|0x004294d7) /* MUI: V4 isg Object * */ -#define MUIA_Window_DepthGadget (MUIB_MUI|0x00421923) /* MUI: V4 i.. BOOL */ -#define MUIA_Window_DisableKeys (MUIB_MUI|0x00424c36) /* MUI: V15 isg ULONG */ /* undoc */ -#define MUIA_Window_DragBar (MUIB_MUI|0x0042045d) /* MUI: V4 i.. BOOL */ -#define MUIA_Window_FancyDrawing (MUIB_MUI|0x0042bd0e) /* MUI: V8 isg BOOL */ -#define MUIA_Window_Height (MUIB_MUI|0x00425846) /* MUI: V4 i.g LONG */ -#define MUIA_Window_ID (MUIB_MUI|0x004201bd) /* MUI: V4 isg ULONG */ -#define MUIA_Window_InputEvent (MUIB_MUI|0x004247d8) /* MUI: V4 ..g struct InputEvent * */ -#define MUIA_Window_IsSubWindow (MUIB_MUI|0x0042b5aa) /* MUI: V4 isg BOOL */ -#define MUIA_Window_LeftEdge (MUIB_MUI|0x00426c65) /* MUI: V4 i.g LONG */ -#define MUIA_Window_MenuAction (MUIB_MUI|0x00427521) /* MUI: V8 isg ULONG */ -#define MUIA_Window_Menustrip (MUIB_MUI|0x0042855e) /* MUI: V8 i.g Object * */ -#define MUIA_Window_MouseObject (MUIB_MUI|0x0042bf9b) /* MUI: V10 ..g Object * */ -#define MUIA_Window_NeedsMouseObject (MUIB_MUI|0x0042372a) /* MUI: V10 i.. BOOL */ -#define MUIA_Window_NoMenus (MUIB_MUI|0x00429df5) /* MUI: V4 is. BOOL */ -#define MUIA_Window_Open (MUIB_MUI|0x00428aa0) /* MUI: V4 .sg BOOL */ -#define MUIA_Window_PublicScreen (MUIB_MUI|0x004278e4) /* MUI: V6 isg STRPTR */ -#define MUIA_Window_RefWindow (MUIB_MUI|0x004201f4) /* MUI: V4 is. Object * */ -#define MUIA_Window_RootObject (MUIB_MUI|0x0042cba5) /* MUI: V4 isg Object * */ -#define MUIA_Window_Screen (MUIB_MUI|0x0042df4f) /* MUI: V4 isg struct Screen * */ -#define MUIA_Window_ScreenTitle (MUIB_MUI|0x004234b0) /* MUI: V5 isg STRPTR */ -#define MUIA_Window_SizeGadget (MUIB_MUI|0x0042e33d) /* MUI: V4 i.. BOOL */ -#define MUIA_Window_SizeRight (MUIB_MUI|0x00424780) /* MUI: V4 i.. BOOL */ -#define MUIA_Window_Sleep (MUIB_MUI|0x0042e7db) /* MUI: V4 .sg BOOL */ -#define MUIA_Window_Title (MUIB_MUI|0x0042ad3d) /* MUI: V4 isg STRPTR */ -#define MUIA_Window_TopEdge (MUIB_MUI|0x00427c66) /* MUI: V4 i.g LONG */ -#define MUIA_Window_UseBottomBorderScroller (MUIB_MUI|0x00424e79) /* MUI: V13 isg BOOL */ -#define MUIA_Window_UseLeftBorderScroller (MUIB_MUI|0x0042433e) /* MUI: V13 isg BOOL */ -#define MUIA_Window_UseRightBorderScroller (MUIB_MUI|0x0042c05e) /* MUI: V13 isg BOOL */ -#define MUIA_Window_Width (MUIB_MUI|0x0042dcae) /* MUI: V4 i.g LONG */ -#define MUIA_Window_Window (MUIB_MUI|0x00426a42) /* MUI: V4 ..g struct Window * */ - -#define MUIA_Window_EraseArea (MUIB_Window | 0x00000000) /* Zune only i.. BOOL (default: TRUE) */ -#define MUIA_Window_ZoomGadget (MUIB_Window | 0x00000002) -#define MUIA_Window_ToolBox (MUIB_Window | 0x00000003) - -#define MUIV_Window_ActiveObject_None 0 -#define MUIV_Window_ActiveObject_Next (-1) -#define MUIV_Window_ActiveObject_Prev (-2) -#define MUIV_Window_AltHeight_MinMax(p) (0-(p)) -#define MUIV_Window_AltHeight_Visible(p) (-100-(p)) -#define MUIV_Window_AltHeight_Screen(p) (-200-(p)) -#define MUIV_Window_AltHeight_Scaled (-1000) -#define MUIV_Window_AltLeftEdge_Centered (-1) -#define MUIV_Window_AltLeftEdge_Moused (-2) -#define MUIV_Window_AltLeftEdge_NoChange (-1000) -#define MUIV_Window_AltTopEdge_Centered (-1) -#define MUIV_Window_AltTopEdge_Moused (-2) -#define MUIV_Window_AltTopEdge_Delta(p) (-3-(p)) -#define MUIV_Window_AltTopEdge_NoChange (-1000) -#define MUIV_Window_AltWidth_MinMax(p) (0-(p)) -#define MUIV_Window_AltWidth_Visible(p) (-100-(p)) -#define MUIV_Window_AltWidth_Screen(p) (-200-(p)) -#define MUIV_Window_AltWidth_Scaled (-1000) -#define MUIV_Window_Height_MinMax(p) (0-(p)) -#define MUIV_Window_Height_Visible(p) (-100-(p)) -#define MUIV_Window_Height_Screen(p) (-200-(p)) -#define MUIV_Window_Height_Scaled (-1000) -#define MUIV_Window_Height_Default (-1001) -#define MUIV_Window_LeftEdge_Centered (-1) -#define MUIV_Window_LeftEdge_Moused (-2) -#define MUIV_Window_TopEdge_Centered (-1) -#define MUIV_Window_TopEdge_Moused (-2) -#define MUIV_Window_TopEdge_Delta(p) (-3-(p)) -#define MUIV_Window_Width_MinMax(p) (0-(p)) -#define MUIV_Window_Width_Visible(p) (-100-(p)) -#define MUIV_Window_Width_Screen(p) (-200-(p)) -#define MUIV_Window_Width_Scaled (-1000) -#define MUIV_Window_Width_Default (-1001) - -#define MUIV_Window_Button_MUI 1 -#define MUIV_Window_Button_Snapshot 2 -#define MUIV_Window_Button_Iconify 4 -#define MUIV_Window_Button_Popup 8 - - -#ifdef MUI_OBSOLETE -#define MUIA_Window_Menu (MUIB_MUI|0x0042db94) /* MUI: V4 i.. struct NewMenu * */ -#define MUIV_Window_Menu_NoMenu (-1) -#endif /* MUI_OBSOLETE */ - -/* Forward declaration for application opaque custom frame specification */ -struct dt_frame_image; - -/************************************************************************** - Info about the display environment on which all Area Objects have a - reference to it. -**************************************************************************/ - -#define MRI_RARRAY_SIZE 20 - -struct MUI_RenderInfo -{ - Object *mri_WindowObject; /* accessable inbetween MUIM_Setup/MUIM_Cleanup */ - struct Screen *mri_Screen; /* accessable inbetween MUIM_Setup/MUIM_Cleanup */ - struct DrawInfo *mri_DrawInfo; /* accessable inbetween MUIM_Setup/MUIM_Cleanup */ - UWORD *mri_Pens; /* accessable inbetween MUIM_Setup/MUIM_Cleanup */ - struct Window *mri_Window; /* accessable inbetween MUIM_Show/MUIM_Hide */ - struct RastPort *mri_RastPort; /* accessable inbetween MUIM_Show/MUIM_Hide */ - ULONG mri_Flags; /* accessable inbetween MUIM_Setup/MUIM_Cleanup */ - - /* the following stuff is private */ - struct ColorMap *mri_Colormap; - UWORD mri_ScreenWidth; - UWORD mri_ScreenHeight; - UWORD mri_PensStorage[MPEN_COUNT]; /* storage for pens, mri_Pens point to here */ - - struct TextFont *mri_Fonts[-MUIV_Font_NegCount]; /* Opened text fonts, done by zune_get_font() */ - - /* this is for AddClipping/AddClipRegion */ - struct Region *mri_rArray[MRI_RARRAY_SIZE]; - int mri_rCount; - - struct Rectangle mri_ClipRect; - - UWORD mri_BorderTop; /* The height of the windows top border (the title) */ - UWORD mri_BorderBottom; /* The height of the windows bottom bodder */ - UWORD mri_BorderLeft; /* The width of the windows left border */ - UWORD mri_BorderRight; /* The width of the windows right border */ - - /* Stuff for Borderscrollers */ - Object *mri_LeftImage; /* Valid between MUIM_Setup/MUIM_Cleanup */ - Object *mri_RightImage; - Object *mri_UpImage; - Object *mri_DownImage; - Object *mri_SizeImage; - - Object *mri_VertProp; /* Valid between MUIM_Show/MUIM_Hide */ - Object *mri_HorizProp; - - /* buffering */ - struct RastPort mri_BufferRP; - struct BitMap *mri_BufferBM; - - struct dt_frame_image *mri_FrameImage[16]; -}; - -#define MUIMRI_RECTFILL (1<<0) -#define MUIMRI_TRUECOLOR (1<<1) -#define MUIMRI_THINFRAMES (1<<2) -#define MUIMRI_REFRESHMODE (1<<3) - -/************************************************************************** - MUI_EventHandlerNode as used by - MUIM_Window_AddEventHandler/RemoveEventHandler -**************************************************************************/ - -struct MUI_EventHandlerNode -{ - struct MinNode ehn_Node; /* embedded node structure, private! */ - BYTE ehn_Reserved; /* private! */ - BYTE ehn_Priority; /* sorted by priority. */ - UWORD ehn_Flags; /* some flags, see below */ - Object *ehn_Object; /* object which should receive MUIM_HandleEvent. */ - struct IClass *ehn_Class; /* Class for CoerceMethod(). If NULL DoMethod() is used */ - ULONG ehn_Events; /* the IDCMP flags the handler should be invoked. */ -}; - -/* here are the flags for ehn_Flags */ -#define MUI_EHF_ALWAYSKEYS (1<<0) -#define MUI_EHF_GUIMODE (1<<1) /* handler will not be called if object is not visible or disabled */ -#define MUI_EHF_HANDLEINPUT (1<<15) /* ZUNEPRIV: Send MUIM_HandleInput instead of MUIM_HandleEvent */ - -/* MUIM_HandleEvent must return a bitmask where following bit's can be set (all other must be 0) */ -#define MUI_EventHandlerRC_Eat (1<<0) /* do not invoke more handlers ers */ - - -extern const struct __MUIBuiltinClass _MUI_Window_desc; /* PRIV */ - -#endif /* _MUI_CLASSES_WINDOW_H */ +#ifndef _MUI_CLASSES_WINDOW_H +#define _MUI_CLASSES_WINDOW_H + +/* + Copyright 1999, David Le Corfec. + Copyright 2002-2003, The AROS Development Team. + All rights reserved. + + $Id$ +*/ + +/*** Name *******************************************************************/ +#define MUIC_Window "Window.mui" + +/*** Identifier base (for Zune extensions) **********************************/ +#define MUIB_Window (MUIB_ZUNE | 0x00003600) + +/*** Methods ****************************************************************/ +#define MUIM_Window_ActionIconify \ + (MUIB_MUI | 0x00422cc0) /* MUI: V18 undoc */ +#define MUIM_Window_AddEventHandler \ + (MUIB_MUI | 0x004203b7) /* MUI: V16 */ +#define MUIM_Window_Cleanup \ + (MUIB_MUI | 0x0042ab26) /* MUI: V18 undoc */ /* For custom classes only */ +#define MUIM_Window_RemEventHandler \ + (MUIB_MUI | 0x0042679e) /* MUI: V16 */ +#define MUIM_Window_ScreenToBack \ + (MUIB_MUI | 0x0042913d) /* MUI: V4 */ +#define MUIM_Window_ScreenToFront \ + (MUIB_MUI | 0x004227a4) /* MUI: V4 */ +#define MUIM_Window_Setup \ + (MUIB_MUI | 0x0042c34c) /* MUI: V18 undoc */ /* For custom Classes only */ +#define MUIM_Window_Snapshot \ + (MUIB_MUI | 0x0042945e) /* MUI: V11 */ +#define MUIM_Window_ToBack \ + (MUIB_MUI | 0x0042152e) /* MUI: V4 */ +#define MUIM_Window_ToFront \ + (MUIB_MUI | 0x0042554f) /* MUI: V4 */ + +struct MUIP_Window_ActionIconify +{ + STACKED ULONG MethodID; +}; + +struct MUIP_Window_AddEventHandler +{ + STACKED ULONG MethodID; + STACKED struct MUI_EventHandlerNode *ehnode; +}; + +struct MUIP_Window_Cleanup +{ + STACKED ULONG MethodID; +}; + +struct MUIP_Window_RemEventHandler +{ + STACKED ULONG MethodID; + STACKED struct MUI_EventHandlerNode *ehnode; +}; + +struct MUIP_Window_ScreenToBack +{ + STACKED ULONG MethodID; +}; + +struct MUIP_Window_ScreenToFront +{ + STACKED ULONG MethodID; +}; + +struct MUIP_Window_Setup +{ + STACKED ULONG MethodID; +}; + +struct MUIP_Window_Snapshot +{ + STACKED ULONG MethodID; + STACKED LONG flags; +}; + +struct MUIP_Window_ToBack +{ + STACKED ULONG MethodID; +}; + +struct MUIP_Window_ToFront +{ + STACKED ULONG MethodID; +}; + +#define MUIM_Window_AddControlCharHandler \ + (MUIB_Window | 0x00000000) /* Zune: V1, PRIV don't use it! */ +#define MUIM_Window_AllocGadgetID \ + (MUIB_Window | 0x00000001) /* Zune: V1 - allocate a GadgetID for + * BOOPSI gadgets */ +#define MUIM_Window_DrawBackground \ + (MUIB_Window | 0x00000002) /* Zune: V1 - like MUIM_DrawBackground + * but PRIV */ +#define MUIM_Window_DragObject \ + (MUIB_Window | 0x00000003) /* Zune: V1, PRIV don't use it! */ +#define MUIM_Window_FreeGadgetID \ + (MUIB_Window | 0x00000004) /* Zune: V1 - free the GadgetID for + * BOOPSI gadgets */ +#define MUIM_Window_RecalcDisplay \ + (MUIB_Window | 0x00000005) /* Zune: V1, PRIV don't use it! */ +#define MUIM_Window_RemControlCharHandler \ + (MUIB_Window | 0x00000006) /* Zune: V1, PRIV don't use it! */ +#define MUIM_Window_UpdateMenu \ + (MUIB_Window | 0x00000007) /* Zune: V1, PRIV dont' use it! */ + +struct MUIP_Window_AddControlCharHandler +{ + STACKED ULONG MethodID; + STACKED struct MUI_EventHandlerNode *ccnode; +}; + +struct MUIP_Window_AllocGadgetID +{ + STACKED ULONG MethodID; +}; /* Custom Class - returns the Gadget ID */ + +struct MUIP_Window_DrawBackground +{ + STACKED ULONG MethodID; + STACKED LONG left; + STACKED LONG top; + STACKED LONG width; + STACKED LONG height; + STACKED LONG xoffset; + STACKED LONG yoffset; + STACKED LONG flags; +}; + +struct MUIP_Window_DragObject +{ + STACKED ULONG MethodID; + STACKED Object *obj; + STACKED LONG touchx; + STACKED LONG touchy; + STACKED ULONG flags; +}; + +struct MUIP_Window_FreeGadgetID +{ + STACKED ULONG MethodID; + STACKED LONG gadgetid; +}; /* Custom Class */ + +struct MUIP_Window_RecalcDisplay +{ + STACKED ULONG MethodID; + STACKED Object *originator; +}; + +struct MUIP_Window_RemControlCharHandler +{ + STACKED ULONG MethodID; + STACKED struct MUI_EventHandlerNode *ccnode; +}; + +struct MUIP_Window_UpdateMenu +{ + STACKED ULONG MethodID; +}; + +#ifdef MUI_OBSOLETE +#define MUIM_Window_GetMenuCheck (MUIB_MUI | 0x00420414) /* MUI: V4 */ +#define MUIM_Window_GetMenuState (MUIB_MUI | 0x00420d2f) /* MUI: V4 */ +#define MUIM_Window_SetCycleChain (MUIB_MUI | 0x00426510) /* MUI: V4 */ +#define MUIM_Window_SetMenuCheck (MUIB_MUI | 0x00422243) /* MUI: V4 */ +#define MUIM_Window_SetMenuState (MUIB_MUI | 0x00422b5e) /* MUI: V4 */ + +struct MUIP_Window_GetMenuCheck +{ + STACKULONG MethodID; + STACKED ULONG MenuID; +}; + +struct MUIP_Window_GetMenuState +{ + STACKULONG MethodID; + STACKED ULONG MenuID; +}; + +struct MUIP_Window_SetCycleChain +{ + STACKULONG MethodID; + STACKED Object *obj[1]; +}; + +struct MUIP_Window_SetMenuCheck +{ + STACKULONG MethodID; + STACKED ULONG MenuID; + STACKED LONG stat; +}; + +struct MUIP_Window_SetMenuState +{ + STACKULONG MethodID; + STACKED ULONG MenuID; + STACKED LONG stat; +}; +#endif /* MUI_OBSOLETE */ + +/*** Attributes *************************************************************/ +#define MUIA_Window_Activate \ + (MUIB_MUI | 0x00428d2f) /* MUI: V4 isg BOOL */ +#define MUIA_Window_ActiveObject \ + (MUIB_MUI | 0x00427925) /* MUI: V4 .sg Object * */ +#define MUIA_Window_AltHeight \ + (MUIB_MUI | 0x0042cce3) /* MUI: V4 i.g LONG */ +#define MUIA_Window_AltLeftEdge \ + (MUIB_MUI | 0x00422d65) /* MUI: V4 i.g LONG */ +#define MUIA_Window_AltTopEdge \ + (MUIB_MUI | 0x0042e99b) /* MUI: V4 i.g LONG */ +#define MUIA_Window_AltWidth \ + (MUIB_MUI | 0x004260f4) /* MUI: V4 i.g LONG */ +#define MUIA_Window_AppWindow \ + (MUIB_MUI | 0x004280cf) /* MUI: V5 i.. BOOL */ +#define MUIA_Window_Backdrop \ + (MUIB_MUI | 0x0042c0bb) /* MUI: V4 i.. BOOL */ +#define MUIA_Window_Borderless \ + (MUIB_MUI | 0x00429b79) /* MUI: V4 i.. BOOL */ +#define MUIA_Window_CloseGadget \ + (MUIB_MUI | 0x0042a110) /* MUI: V4 i.. BOOL */ +#define MUIA_Window_CloseRequest \ + (MUIB_MUI | 0x0042e86e) /* MUI: V4 ..g BOOL */ +#define MUIA_Window_DefaultObject \ + (MUIB_MUI | 0x004294d7) /* MUI: V4 isg Object * */ +#define MUIA_Window_DepthGadget \ + (MUIB_MUI | 0x00421923) /* MUI: V4 i.. BOOL */ +#define MUIA_Window_DisableKeys \ + (MUIB_MUI | 0x00424c36) /* MUI: V15 isg ULONG */ /* undoc */ +#define MUIA_Window_DragBar \ + (MUIB_MUI | 0x0042045d) /* MUI: V4 i.. BOOL */ +#define MUIA_Window_FancyDrawing \ + (MUIB_MUI | 0x0042bd0e) /* MUI: V8 isg BOOL */ +#define MUIA_Window_Height \ + (MUIB_MUI | 0x00425846) /* MUI: V4 i.g LONG */ +#define MUIA_Window_ID \ + (MUIB_MUI | 0x004201bd) /* MUI: V4 isg ULONG */ +#define MUIA_Window_InputEvent \ + (MUIB_MUI | 0x004247d8) /* MUI: V4 ..g struct InputEvent * */ +#define MUIA_Window_IsSubWindow \ + (MUIB_MUI | 0x0042b5aa) /* MUI: V4 isg BOOL */ +#define MUIA_Window_LeftEdge \ + (MUIB_MUI | 0x00426c65) /* MUI: V4 i.g LONG */ +#define MUIA_Window_MenuAction \ + (MUIB_MUI | 0x00427521) /* MUI: V8 isg ULONG */ +#define MUIA_Window_Menustrip \ + (MUIB_MUI | 0x0042855e) /* MUI: V8 i.g Object * */ +#define MUIA_Window_MouseObject \ + (MUIB_MUI | 0x0042bf9b) /* MUI: V10 ..g Object * */ +#define MUIA_Window_NeedsMouseObject \ + (MUIB_MUI | 0x0042372a) /* MUI: V10 i.. BOOL */ +#define MUIA_Window_NoMenus \ + (MUIB_MUI | 0x00429df5) /* MUI: V4 is. BOOL */ +#define MUIA_Window_Open \ + (MUIB_MUI | 0x00428aa0) /* MUI: V4 .sg BOOL */ +#define MUIA_Window_PublicScreen \ + (MUIB_MUI | 0x004278e4) /* MUI: V6 isg STRPTR */ +#define MUIA_Window_RefWindow \ + (MUIB_MUI | 0x004201f4) /* MUI: V4 is. Object * */ +#define MUIA_Window_RootObject \ + (MUIB_MUI | 0x0042cba5) /* MUI: V4 isg Object * */ +#define MUIA_Window_Screen \ + (MUIB_MUI | 0x0042df4f) /* MUI: V4 isg struct Screen * */ +#define MUIA_Window_ScreenTitle \ + (MUIB_MUI | 0x004234b0) /* MUI: V5 isg STRPTR */ +#define MUIA_Window_SizeGadget \ + (MUIB_MUI | 0x0042e33d) /* MUI: V4 i.. BOOL */ +#define MUIA_Window_SizeRight \ + (MUIB_MUI | 0x00424780) /* MUI: V4 i.. BOOL */ +#define MUIA_Window_Sleep \ + (MUIB_MUI | 0x0042e7db) /* MUI: V4 .sg BOOL */ +#define MUIA_Window_Title \ + (MUIB_MUI | 0x0042ad3d) /* MUI: V4 isg STRPTR */ +#define MUIA_Window_TopEdge \ + (MUIB_MUI | 0x00427c66) /* MUI: V4 i.g LONG */ +#define MUIA_Window_UseBottomBorderScroller \ + (MUIB_MUI | 0x00424e79) /* MUI: V13 isg BOOL */ +#define MUIA_Window_UseLeftBorderScroller \ + (MUIB_MUI | 0x0042433e) /* MUI: V13 isg BOOL */ +#define MUIA_Window_UseRightBorderScroller \ + (MUIB_MUI | 0x0042c05e) /* MUI: V13 isg BOOL */ +#define MUIA_Window_Width \ + (MUIB_MUI | 0x0042dcae) /* MUI: V4 i.g LONG */ +#define MUIA_Window_Window \ + (MUIB_MUI | 0x00426a42) /* MUI: V4 ..g struct Window * */ + +#define MUIA_Window_EraseArea \ + (MUIB_Window | 0x00000000) /* Zune only i.. BOOL (default: TRUE) */ +#define MUIA_Window_ZoomGadget \ + (MUIB_Window | 0x00000002) +#define MUIA_Window_ToolBox \ + (MUIB_Window | 0x00000003) + +#define MUIV_Window_ActiveObject_None 0 +#define MUIV_Window_ActiveObject_Next (-1) +#define MUIV_Window_ActiveObject_Prev (-2) +#define MUIV_Window_AltHeight_MinMax(p) (0-(p)) +#define MUIV_Window_AltHeight_Visible(p) (-100-(p)) +#define MUIV_Window_AltHeight_Screen(p) (-200-(p)) +#define MUIV_Window_AltHeight_Scaled (-1000) +#define MUIV_Window_AltLeftEdge_Centered (-1) +#define MUIV_Window_AltLeftEdge_Moused (-2) +#define MUIV_Window_AltLeftEdge_NoChange (-1000) +#define MUIV_Window_AltTopEdge_Centered (-1) +#define MUIV_Window_AltTopEdge_Moused (-2) +#define MUIV_Window_AltTopEdge_Delta(p) (-3-(p)) +#define MUIV_Window_AltTopEdge_NoChange (-1000) +#define MUIV_Window_AltWidth_MinMax(p) (0-(p)) +#define MUIV_Window_AltWidth_Visible(p) (-100-(p)) +#define MUIV_Window_AltWidth_Screen(p) (-200-(p)) +#define MUIV_Window_AltWidth_Scaled (-1000) +#define MUIV_Window_Height_MinMax(p) (0-(p)) +#define MUIV_Window_Height_Visible(p) (-100-(p)) +#define MUIV_Window_Height_Screen(p) (-200-(p)) +#define MUIV_Window_Height_Scaled (-1000) +#define MUIV_Window_Height_Default (-1001) +#define MUIV_Window_LeftEdge_Centered (-1) +#define MUIV_Window_LeftEdge_Moused (-2) +#define MUIV_Window_TopEdge_Centered (-1) +#define MUIV_Window_TopEdge_Moused (-2) +#define MUIV_Window_TopEdge_Delta(p) (-3-(p)) +#define MUIV_Window_Width_MinMax(p) (0-(p)) +#define MUIV_Window_Width_Visible(p) (-100-(p)) +#define MUIV_Window_Width_Screen(p) (-200-(p)) +#define MUIV_Window_Width_Scaled (-1000) +#define MUIV_Window_Width_Default (-1001) + +#define MUIV_Window_Button_MUI 1 +#define MUIV_Window_Button_Snapshot 2 +#define MUIV_Window_Button_Iconify 4 +#define MUIV_Window_Button_Popup 8 + + +#ifdef MUI_OBSOLETE +#define MUIA_Window_Menu \ + (MUIB_MUI | 0x0042db94) /* MUI: V4 i.. struct NewMenu * */ + +#define MUIV_Window_Menu_NoMenu (-1) +#endif /* MUI_OBSOLETE */ + +/* Forward declaration for application opaque custom frame specification */ +struct dt_frame_image; + +/************************************************************************** + Info about the display environment on which all Area Objects have a + reference to it. +**************************************************************************/ + +#define MRI_RARRAY_SIZE 20 + +struct MUI_RenderInfo +{ + Object *mri_WindowObject; /* accessable in-between + * MUIM_Setup/MUIM_Cleanup */ + struct Screen *mri_Screen; /* accessable in-between + * MUIM_Setup/MUIM_Cleanup */ + struct DrawInfo *mri_DrawInfo; /* accessable in-between + * MUIM_Setup/MUIM_Cleanup */ + UWORD *mri_Pens; /* accessable in-between + * MUIM_Setup/MUIM_Cleanup */ + struct Window *mri_Window; /* accessable in-between + * MUIM_Show/MUIM_Hide */ + struct RastPort *mri_RastPort; /* accessable in-between + * MUIM_Show/MUIM_Hide */ + ULONG mri_Flags; /* accessable in-between + * MUIM_Setup/MUIM_Cleanup */ + + /* the following stuff is private */ + struct ColorMap *mri_Colormap; + UWORD mri_ScreenWidth; + UWORD mri_ScreenHeight; + UWORD mri_PensStorage[MPEN_COUNT]; /* storage for pens, mri_Pens points + * to here */ + + /* Opened text fonts, done by zune_get_font() */ + struct TextFont *mri_Fonts[-MUIV_Font_NegCount]; + + /* this is for AddClipping/AddClipRegion */ + struct Region *mri_rArray[MRI_RARRAY_SIZE]; + int mri_rCount; + + struct Rectangle mri_ClipRect; + + UWORD mri_BorderTop; /* The height of the window's top border (title) */ + UWORD mri_BorderBottom; /* The height of the window's bottom bodder */ + UWORD mri_BorderLeft; /* The width of the window's left border */ + UWORD mri_BorderRight; /* The width of the window's right border */ + + /* Stuff for Borderscrollers */ + Object *mri_LeftImage; /* Valid between MUIM_Setup/MUIM_Cleanup */ + Object *mri_RightImage; + Object *mri_UpImage; + Object *mri_DownImage; + Object *mri_SizeImage; + + Object *mri_VertProp; /* Valid between MUIM_Show/MUIM_Hide */ + Object *mri_HorizProp; + + /* buffering */ + struct RastPort mri_BufferRP; + struct BitMap *mri_BufferBM; + + struct dt_frame_image *mri_FrameImage[16]; +}; + +#define MUIMRI_RECTFILL (1<<0) +#define MUIMRI_TRUECOLOR (1<<1) +#define MUIMRI_THINFRAMES (1<<2) +#define MUIMRI_REFRESHMODE (1<<3) + +/************************************************************************** + MUI_EventHandlerNode as used by + MUIM_Window_AddEventHandler/RemoveEventHandler +**************************************************************************/ + +struct MUI_EventHandlerNode +{ + struct MinNode ehn_Node; /* embedded node structure, private! */ + BYTE ehn_Reserved; /* private! */ + BYTE ehn_Priority; /* sorted by priority. */ + UWORD ehn_Flags; /* some flags, see below */ + Object *ehn_Object; /* object which should receive MUIM_HandleEvent. */ + struct IClass *ehn_Class; /* Class for CoerceMethod(). If NULL, + * DoMethod() is used */ + ULONG ehn_Events; /* the IDCMP flags the handler should be + * invoked with */ +}; + +/* here are the flags for ehn_Flags */ +#define MUI_EHF_ALWAYSKEYS (1<<0) +#define MUI_EHF_GUIMODE (1<<1) /* handler will not be called if object + * is not visible or disabled */ +#define MUI_EHF_HANDLEINPUT (1<<15) /* ZUNEPRIV: Send MUIM_HandleInput + * instead of MUIM_HandleEvent */ + +/* MUIM_HandleEvent must return a bitmask where following bits can be set + * (all others must be 0) */ +#define MUI_EventHandlerRC_Eat (1<<0) /* do not invoke more handlers ers */ + + +extern const struct __MUIBuiltinClass _MUI_Window_desc; /* PRIV */ + +#endif /* _MUI_CLASSES_WINDOW_H */ -- 2.11.4.GIT