// Find (and lock) a public screen struct PubScreenNode *LIBFUNC L_FindPubScreen( REG(a0, struct Screen *screen), REG(d0, BOOL lock)) { struct List *pubscreenlist; struct PubScreenNode *node; char *name=0; // Lock the public screen list pubscreenlist=LockPubScreenList(); // Scan it for (node=(struct PubScreenNode *)pubscreenlist->lh_Head; node->psn_Node.ln_Succ; node=(struct PubScreenNode *)node->psn_Node.ln_Succ) { // See if this node is what we're looking for if (node->psn_Screen==screen) { // Get name pointer name=node->psn_Node.ln_Name; // Lock screen? if (lock && !(LockPubScreen(name))) name=0; break; } } // Unlock list UnlockPubScreenList(); // Return node pointer return (name)?node:0; }
static void RefreshScreens() { struct List *list; struct PubScreenNode *psn; DoMethod(ScreenList, MUIM_List_Clear); list = LockPubScreenList(); ForeachNode(list, psn) { DoMethod(ScreenList, MUIM_List_InsertSingle, (IPTR)psn, MUIV_List_Insert_Bottom); }
INTERNALS ******************************************************************************/ { AROS_LIBFUNC_INIT struct List *pubscrlist; struct PubScreenNode *pubscrnode; BOOL found = FALSE; BOOL retval = FALSE; D(bug("MUIS_ClosePubScreen(%s)\n", name)); pubscrlist = LockPubScreenList(); ForeachNode(pubscrlist, pubscrnode) { if(strcmp(pubscrnode->psn_Node.ln_Name, name) == 0) { found = TRUE; break; } } UnlockPubScreenList(); if(found) { CloseScreen(pubscrnode->psn_Screen); struct Node *node;
INTERNALS Maybe we should correct the + 1 stupidity. *****************************************************************************/ #define GPB(x) GetPrivIBase(x) { AROS_LIBFUNC_INIT struct PubScreenNode *ps; struct IntScreen *scr = (struct IntScreen *)screen; struct List *list; list = LockPubScreenList(); if(scr == NULL) { ps = (struct PubScreenNode *)list->lh_Head; ASSERT(ps != NULL); } else { ps = scr->pubScrNode; if (ps != NULL) { ps = (struct PubScreenNode *)ps->psn_Node.ln_Succ; ASSERT(ps != NULL); } else