Updated debug output.
[AROS.git] / rom / intuition / rethinkdisplay.c
blobf5d8582713f5d3440f25a3e65d086322402a9b4d
1 /*
2 Copyright © 1995-2011, The AROS Development Team. All rights reserved.
3 Copyright © 2001-2003, The MorphOS Development Team. All Rights Reserved.
4 $Id$
5 */
7 #include <intuition/pointerclass.h>
8 #include <proto/graphics.h>
9 #include "intuition_intern.h"
10 #include "inputhandler.h"
12 /*****************************************************************************
14 NAME */
15 #include <proto/intuition.h>
17 AROS_LH0(LONG, RethinkDisplay,
19 /* SYNOPSIS */
21 /* LOCATION */
22 struct IntuitionBase *, IntuitionBase, 65, Intuition)
24 /* FUNCTION
25 Check and update, ie. redisplay the whole Intuition display.
27 INPUTS
28 None.
30 RESULT
31 Zero for success, non-zero for failure.
33 NOTES
35 EXAMPLE
37 BUGS
39 SEE ALSO
40 RemakeDisplay(), MakeScreen(), graphics.library/MakeVPort(),
41 graphics.library/MrgCop(), graphics.library/LoadView()
43 INTERNALS
45 HISTORY
47 *****************************************************************************/
49 AROS_LIBFUNC_INIT
51 struct GfxBase *GfxBase = GetPrivIBase(IntuitionBase)->GfxBase;
52 struct Screen *screen;
53 struct ViewPort *viewport;
54 struct ViewPort **viewportptr;
55 UWORD modes;
56 LONG failure = 0;
57 ULONG ilock = LockIBase(0);
59 DEBUG_RETHINKDISPLAY(dprintf("RethinkDisplay:\n"));
61 screen = IntuitionBase->FirstScreen;
63 DEBUG_RETHINKDISPLAY(dprintf("RethinkDisplay: screen 0x%lx\n",screen));
65 if (screen == NULL)
67 DEBUG_RETHINKDISPLAY(dprintf("RethinkDisplay: LoadView(NULL)\n"));
68 IntuitionBase->ViewLord.ViewPort = NULL;
69 LoadView(NULL);
71 else
73 /* Find visible screens */
74 DEBUG_RETHINKDISPLAY(dprintf("RethinkDisplay: Find visible screens\n"));
76 screen->ViewPort.Modes |= SPRITES;
78 screen->ViewPort.Modes &= ~VP_HIDE;
80 /* Not needed. Perhaps... Pavel Fedin <pavel_fedin@mail.ru>
81 if (!(GetPrivScreen(screen)->SpecialFlags & SF_Compose)) {
82 while ((screen = screen->NextScreen))
83 screen->ViewPort.Modes |= VP_HIDE;
86 /* Build the list of viewports in the view */
87 DEBUG_RETHINKDISPLAY(dprintf("RethinkDisplay: Building viewports list\n"));
88 viewportptr = &IntuitionBase->ViewLord.ViewPort;
89 for (screen = IntuitionBase->FirstScreen; screen; screen = screen->NextScreen)
91 if ((screen->ViewPort.Modes & VP_HIDE) == 0)
93 DEBUG_RETHINKDISPLAY(bug("RethinkDisplay: Adding ViewPort 0x%p for screen 0x%p\n", &screen->ViewPort, screen));
94 *viewportptr = &screen->ViewPort;
95 viewportptr = &screen->ViewPort.Next;
98 *viewportptr = NULL;
100 /* Find view mode */
101 DEBUG_RETHINKDISPLAY(dprintf("RethinkDisplay: Find view mode\n"));
102 modes = (IntuitionBase->ViewLord.Modes & ~LACE) | SPRITES;
103 for (viewport = IntuitionBase->ViewLord.ViewPort; viewport; viewport = viewport->Next) {
104 modes |= viewport->Modes & LACE;
107 /* Reinitialize the view */
108 #ifdef __MORPHOS__
109 /* Under AROS this will cause unneeded screen flicker and even significant slowdown */
110 FreeSprite(GetPrivIBase(IntuitionBase)->SpriteNum);
111 GetPrivIBase(IntuitionBase)->SpriteNum = -1;
112 DEBUG_RETHINKDISPLAY(dprintf("RethinkDisplay: LoadView(NULL)\n"));
114 LoadView(NULL);
116 if (IntuitionBase->ViewLord.LOFCprList)
117 FreeCprList(IntuitionBase->ViewLord.LOFCprList);
119 if (IntuitionBase->ViewLord.SHFCprList)
120 FreeCprList(IntuitionBase->ViewLord.SHFCprList);
122 IntuitionBase->ViewLord.LOFCprList = NULL;
123 IntuitionBase->ViewLord.SHFCprList = NULL;
124 #endif
125 IntuitionBase->ViewLord.DxOffset = 0; /***/
126 IntuitionBase->ViewLord.DyOffset = 0; /***/
127 IntuitionBase->ViewLord.Modes = modes;
128 screen = IntuitionBase->FirstScreen;
129 #ifdef __MORPHOS__
130 GetPrivIBase(IntuitionBase)->ViewLordExtra->Monitor = GetPrivScreen(screen)->Monitor;
131 #endif
132 /* Rebuild copper lists for screens needing a mode change */
134 DEBUG_RETHINKDISPLAY(dprintf("RethinkDisplay: Making viewports\n"));
135 for (viewport = IntuitionBase->ViewLord.ViewPort; viewport; viewport = viewport->Next)
137 if ((viewport->Modes ^ modes) & LACE)
139 LONG error;
141 viewport->Modes = (viewport->Modes & ~LACE) | (modes & LACE);
142 error = MakeVPort(&IntuitionBase->ViewLord, viewport);
144 if (error)
145 failure = error;
149 if (!failure)
151 failure = MrgCop(&IntuitionBase->ViewLord);
153 if (!failure)
155 DEBUG_RETHINKDISPLAY(dprintf("RethinkDisplay: LoadView ViewLord 0x%lx\n",&IntuitionBase->ViewLord));
156 LoadView(&IntuitionBase->ViewLord);
158 DEBUG_INIT(dprintf("RethinkDisplay: ActiveScreen %p Pointer %p Sprite %p\n",
159 IntuitionBase->ActiveScreen,
160 GetPrivScreen(IntuitionBase->ActiveScreen)->Pointer,
161 GetPrivScreen(IntuitionBase->ActiveScreen)->Pointer->sprite));
162 #ifdef __MORPHOS__
163 if (GetPrivIBase(IntuitionBase)->SpriteNum == -1 &&
164 IntuitionBase->FirstScreen &&
165 GetPrivScreen(IntuitionBase->FirstScreen)->Pointer &&
166 GetPrivScreen(IntuitionBase->FirstScreen)->Pointer->sprite)
168 struct IIHData *iihd = (struct IIHData *)GetPrivIBase(IntuitionBase)->InputHandler->is_Data;
169 WORD xpos,ypos;
171 xpos = iihd->LastMouseX; ypos = iihd->LastMouseY;
172 GetPrivIBase(IntuitionBase)->SpriteNum = GetExtSpriteA(GetPrivScreen(IntuitionBase->FirstScreen)->Pointer->sprite, NULL);
174 DEBUG_INIT(dprintf("RethinkDisplay: Sprite num %ld\n", GetPrivIBase(IntuitionBase)->SpriteNum));
176 if (xpos >= IntuitionBase->FirstScreen->Width) xpos = IntuitionBase->FirstScreen->Width - 1;
177 if (ypos >= IntuitionBase->FirstScreen->Height) ypos = IntuitionBase->FirstScreen->Height - 1;
179 MySetPointerPos(IntuitionBase, xpos, ypos);
180 IntuitionBase->FirstScreen->MouseX = xpos;
181 IntuitionBase->FirstScreen->MouseY = ypos;
183 #endif
188 if (!failure)
190 /* validate screen positions, scrolling limits are not necessarily same anymore. */
191 for (screen = IntuitionBase->FirstScreen; screen; screen = screen->NextScreen)
193 if ((screen->ViewPort.Modes & VP_HIDE) == 0)
195 ScreenPosition( screen, SPOS_RELATIVE, 0,0,0,0 );
198 /* Ensure that empty displays get normal pointer */
199 ResetPointer(IntuitionBase);
202 UnlockIBase(ilock);
204 DEBUG_RETHINKDISPLAY(dprintf("RethinkDisplay: failure 0x%lx\n",failure));
206 return failure;
208 AROS_LIBFUNC_EXIT
209 } /* RethinkDisplay */