/* * V36 Lock public screen list example * * Compiled with SAS/C 6.56: sc NMINC STRMERGE NOSTKCHK LINK lockpub.c * Use V36 include files. * * Copyright (c) 1990-1999 Amiga, Inc. * * This example is provided in electronic form by Amiga, * Inc. for use with the Amiga Mail Volume II technical publication. * Amiga Mail Volume II contains additional information on the correct * usage of the techniques and operating system functions presented in * these examples. The source and executable code of these examples may * only be distributed in free electronic form, via bulletin board or * as part of a fully non-commercial and freely redistributable * diskette. Both the source and executable code (including comments) * must be included, without modification, in any copy. This example * may not be published in printed form or distributed with any * commercial product. However, the programming techniques and support * routines set forth in these examples may be used in the development * of original executable software products for Amiga * computers. * * All other rights reserved. * * This example is provided "as-is" and is subject to change; no * warranties are made. All use is at your own risk. No liability or * responsibility is assumed. * */ #include <string.h> #include <intuition/intuition.h> #include <intuition/screens.h> #include <exec/memory.h> #include <exec/lists.h> #include <clib/intuition_protos.h> #include <clib/exec_protos.h> #include <clib/alib_protos.h> void main (void); struct IntuitionBase *IntuitionBase; void main(void) { struct List *publist; struct List *copy_publist; struct PubScreenNode *psnode; struct PubScreenNode *copy_psnode; /* fails silently if not V36 */ if (IntuitionBase = OpenLibrary("intuition.library", 36)) { if (copy_publist = AllocMem(sizeof(struct List), MEMF_CLEAR)) { NewList(copy_publist); /* Lock the public screen list */ publist = LockPubScreenList(); /* and copy it */ for (psnode = (struct PubScreenNode *)publist->lh_Head; psnode->psn_Node.ln_Succ; psnode = (struct PubScreenNode *)psnode->psn_Node.ln_Succ) { if (copy_psnode = AllocMem(sizeof(struct PubScreenNode), MEMF_CLEAR)) { /* Copy the structure */ *copy_psnode = *psnode; /* ln_Name points to the public screen name, make your own copy */ if (copy_psnode->psn_Node.ln_Name = AllocMem(strlen(psnode->psn_Node.ln_Name) + 1, MEMF_CLEAR)) strcpy(copy_psnode->psn_Node.ln_Name, psnode->psn_Node.ln_Name); else printf("Not enough memory to copy screen name\n"); AddTail(copy_publist, (struct Node *)copy_psnode); } else { printf("out of memory\n"); break; } } UnlockPubScreenList(); psnode = (struct PubScreenNode *)copy_publist->lh_Head; while (copy_psnode = (struct PubScreenNode *)psnode->psn_Node.ln_Succ) { printf("%s\n", psnode->psn_Node.ln_Name); printf("psn_Screen 0x%lx\n", psnode->psn_Screen); /* a pointer to the public screen */ printf("psn_Flags 0x%lx\n", psnode->psn_Flags); /* the flags */ printf("psn_VisitorCount %ld\n", psnode->psn_VisitorCount); /* the number of visitorwindows */ printf("psn_SigTask 0x%lx\n", psnode->psn_SigTask); /* The task to signal when the */ /* visitor is gone */ printf("psn_SigBit %ld\n\n", psnode->psn_SigBit); /* The signalbit number to use */ /* to signal the task */ if (psnode->psn_Node.ln_Name) FreeMem(psnode->psn_Node.ln_Name, strlen(psnode->psn_Node.ln_Name) + 1); Remove((struct Node *)psnode); FreeMem(psnode, sizeof(struct PubScreenNode)); psnode = copy_psnode; } FreeMem(copy_publist, sizeof(struct List)); } CloseLibrary(IntuitionBase); } }