2 Copyright © 1995-2011, The AROS Development Team. All rights reserved.
3 Copyright © 2001-2003, The MorphOS Development Team. All Rights Reserved.
7 #include <intuition/pointerclass.h>
8 #include <proto/graphics.h>
9 #include "intuition_intern.h"
10 #include "inputhandler.h"
12 /*****************************************************************************
15 #include <proto/intuition.h>
17 AROS_LH0(LONG
, RethinkDisplay
,
22 struct IntuitionBase
*, IntuitionBase
, 65, Intuition
)
25 Check and update, ie. redisplay the whole Intuition display.
31 Zero for success, non-zero for failure.
40 RemakeDisplay(), MakeScreen(), graphics.library/MakeVPort(),
41 graphics.library/MrgCop(), graphics.library/LoadView()
47 *****************************************************************************/
51 struct GfxBase
*GfxBase
= GetPrivIBase(IntuitionBase
)->GfxBase
;
52 struct Screen
*screen
;
53 struct ViewPort
*viewport
;
54 struct ViewPort
**viewportptr
;
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
));
67 DEBUG_RETHINKDISPLAY(dprintf("RethinkDisplay: LoadView(NULL)\n"));
68 IntuitionBase
->ViewLord
.ViewPort
= NULL
;
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
;
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 */
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"));
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
;
125 IntuitionBase
->ViewLord
.DxOffset
= 0; /***/
126 IntuitionBase
->ViewLord
.DyOffset
= 0; /***/
127 IntuitionBase
->ViewLord
.Modes
= modes
;
128 screen
= IntuitionBase
->FirstScreen
;
130 GetPrivIBase(IntuitionBase
)->ViewLordExtra
->Monitor
= GetPrivScreen(screen
)->Monitor
;
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
)
141 viewport
->Modes
= (viewport
->Modes
& ~LACE
) | (modes
& LACE
);
142 error
= MakeVPort(&IntuitionBase
->ViewLord
, viewport
);
151 failure
= MrgCop(&IntuitionBase
->ViewLord
);
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
));
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
;
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
;
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
);
204 DEBUG_RETHINKDISPLAY(dprintf("RethinkDisplay: failure 0x%lx\n",failure
));
209 } /* RethinkDisplay */