2 Copyright 1995-2010, The AROS Development Team. All rights reserved.
3 Copyright 2001-2003, The MorphOS Development Team. All Rights Reserved.
7 #include "intuition_intern.h"
9 static struct PubScreenNode
*findcasename(struct List
*list
, const UBYTE
*name
);
11 /*****************************************************************************
14 #include <proto/intuition.h>
16 AROS_LH2(void, UnlockPubScreen
,
19 AROS_LHA(UBYTE
*, name
, A0
),
20 AROS_LHA(struct Screen
*, screen
, A1
),
23 struct IntuitionBase
*, IntuitionBase
, 86, Intuition
)
26 Release a lock to a screen locked by LockPubScreen().
27 Identify screen by the pointer returned from LockPubScreen()
28 and pass NULL name in normal cases.
29 Sometimes it might be useful to specify the name string. In
30 this case the screen pointer will be ignored.
33 name - Name of the public screen to unlock. The name is case insensitive.
34 screen - Pointer to the screen to unlock
39 The screen parameter will be ignored if name is non-NULL
52 *****************************************************************************/
58 DEBUG_UNLOCKPUBSCREEN(dprintf("UnlockPubScreen: name <%s> screen %p\n",
59 name
? (const char *)name
: "NULL", screen
));
60 DEBUG_UNLOCKPUBSCREEN(dprintf("LockPubScreen: task %p <%s>\n",
62 SysBase
->ThisTask
->tc_Node
.ln_Name
? SysBase
->ThisTask
->tc_Node
.ln_Name
: "NULL"));
64 publist
= LockPubScreenList();
68 struct PubScreenNode
*psn
;
70 /* Get screen by its name */
71 if ((psn
= findcasename(publist
, name
)))
72 screen
= psn
->psn_Screen
;
76 DEBUG_UNLOCKPUBSCREEN(dprintf("UnlockPubScreen: found screen %p\n",
82 struct PubScreenNode
*ps
= GetPrivScreen(screen
)->pubScrNode
;
84 //ASSERT(GetPrivScreen(screen)->pubScrNode != NULL);
85 //ASSERT(GetPrivScreen(screen)->pubScrNode->psn_VisitorCount > 0);
88 ps
->psn_VisitorCount
--;
90 DEBUG_VISITOR(dprintf("UnlockPubScreen: count %d <%s>\n",
92 FindTask(NULL
)->tc_Node
.ln_Name
));
95 DEBUG_UNLOCKPUBSCREEN(dprintf("UnlockPubScreen: count %d\n",
96 ps
->psn_VisitorCount
));
98 /* Notify screen owner if this is (was) the last window on the
100 if(ps
->psn_VisitorCount
== 0)
102 if(ps
->psn_SigTask
!= NULL
)
103 Signal(ps
->psn_SigTask
, 1 << ps
->psn_SigBit
);
108 UnlockPubScreenList();
110 FireScreenNotifyMessage((IPTR
) name
, SNOTIFY_UNLOCKPUBSCREEN
, IntuitionBase
);
113 } /* UnlockPubScreen */
116 /* case insensitive FindName() */
117 static struct PubScreenNode
*findcasename(struct List
*list
, const UBYTE
*name
)
121 for (node
= GetHead(list
); node
; node
= GetSucc(node
))
125 if (!strcasecmp (node
->ln_Name
, name
))
129 return (struct PubScreenNode
*)node
;