Enable VFP unit as early as possible. This has to be so since e.g. gcc9 uses vfp...
[AROS.git] / rom / intuition / unlockpubscreen.c
blob3fdce960e91e1a4726d0b0fed6a66c840ed4aa96
1 /*
2 Copyright © 1995-2013, The AROS Development Team. All rights reserved.
3 Copyright © 2001-2003, The MorphOS Development Team. All Rights Reserved.
4 $Id$
5 */
7 #include "intuition_intern.h"
9 static struct PubScreenNode *findcasename(struct List *list, const UBYTE *name);
11 /*****************************************************************************
13 NAME */
14 #include <proto/intuition.h>
16 AROS_LH2(void, UnlockPubScreen,
18 /* SYNOPSIS */
19 AROS_LHA(UBYTE *, name, A0),
20 AROS_LHA(struct Screen *, screen, A1),
22 /* LOCATION */
23 struct IntuitionBase *, IntuitionBase, 86, Intuition)
25 /* FUNCTION
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.
30 Sometimes it might be useful to specify the name string. In
31 this case the screen pointer will be ignored.
33 INPUTS
34 name - Name of the public screen to unlock. The name is case
35 insensitive.
36 screen - Pointer to the screen to unlock.
38 RESULT
39 None.
41 NOTES
42 The screen parameter will be ignored if name is non-NULL.
44 EXAMPLE
46 BUGS
48 SEE ALSO
49 LockPubScreen()
51 INTERNALS
53 *****************************************************************************/
55 AROS_LIBFUNC_INIT
57 struct List *publist;
59 DEBUG_UNLOCKPUBSCREEN(dprintf("UnlockPubScreen: name <%s> screen %p\n",
60 name ? (const char *)name : "NULL", screen));
61 DEBUG_UNLOCKPUBSCREEN({struct Task *t = FindTask(NULL);
62 dprintf("LockPubScreen: task %p <%s>\n",
64 t->tc_Node.ln_Name ? t->tc_Node.ln_Name : "NULL"));
66 publist = LockPubScreenList();
68 if (name != NULL)
70 struct PubScreenNode *psn;
72 /* Get screen by its name */
73 if ((psn = findcasename(publist, name)))
74 screen = psn->psn_Screen;
75 else
76 screen = NULL;
78 DEBUG_UNLOCKPUBSCREEN(dprintf("UnlockPubScreen: found screen %p\n",
79 screen));
82 if (screen != NULL)
84 struct PubScreenNode *ps = GetPrivScreen(screen)->pubScrNode;
86 //ASSERT(GetPrivScreen(screen)->pubScrNode != NULL);
87 //ASSERT(GetPrivScreen(screen)->pubScrNode->psn_VisitorCount > 0);
89 /* Unlock screen */
90 ps->psn_VisitorCount--;
92 DEBUG_VISITOR(dprintf("UnlockPubScreen: count %d <%s>\n",
93 ps->psn_VisitorCount,
94 FindTask(NULL)->tc_Node.ln_Name));
97 DEBUG_UNLOCKPUBSCREEN(dprintf("UnlockPubScreen: count %d\n",
98 ps->psn_VisitorCount));
100 /* Notify screen owner if this is (was) the last window on the
101 screen */
102 if(ps->psn_VisitorCount == 0)
104 if(ps->psn_SigTask != NULL)
105 Signal(ps->psn_SigTask, 1 << ps->psn_SigBit);
110 UnlockPubScreenList();
112 FireScreenNotifyMessage((IPTR) name, SNOTIFY_UNLOCKPUBSCREEN, IntuitionBase);
114 AROS_LIBFUNC_EXIT
115 } /* UnlockPubScreen */
118 /* case insensitive FindName() */
119 static struct PubScreenNode *findcasename(struct List *list, const UBYTE *name)
121 struct Node *node;
123 for (node = GetHead(list); node; node = GetSucc(node))
125 if(node->ln_Name)
127 if (!strcasecmp (node->ln_Name, name))
128 break;
131 return (struct PubScreenNode *)node;