SCI: Skip Ports when iterating over Windows in GC

This commit is contained in:
Willem Jan Palenstijn 2011-02-28 20:32:46 +01:00
parent ce288024b4
commit db536da8d3
4 changed files with 19 additions and 12 deletions

View file

@ -89,11 +89,11 @@ static void processEngineHunkList(WorklistManager &wm) {
PortList windowList = g_sci->_gfxPorts->_windowList; PortList windowList = g_sci->_gfxPorts->_windowList;
for (PortList::const_iterator it = windowList.begin(); it != windowList.end(); ++it) { for (PortList::const_iterator it = windowList.begin(); it != windowList.end(); ++it) {
// FIXME: We also store Port objects in the window list. if ((*it)->isWindow()) {
// We should add a check that we really only pass windows here... Window *wnd = ((Window *)*it);
Window *wnd = ((Window *)*it); wm.push(wnd->hSaved1);
wm.push(wnd->hSaved1); wm.push(wnd->hSaved2);
wm.push(wnd->hSaved2); }
} }
} }

View file

@ -45,6 +45,10 @@ typedef int GuiResourceId; // is a resource-number and -1 means no parameter giv
typedef int16 TextAlignment; typedef int16 TextAlignment;
#define PORTS_FIRSTWINDOWID 2
#define PORTS_FIRSTSCRIPTWINDOWID 3
struct Port { struct Port {
uint16 id; uint16 id;
int16 top, left; int16 top, left;
@ -62,6 +66,8 @@ struct Port {
fontHeight(0), fontId(0), greyedOutput(false), fontHeight(0), fontId(0), greyedOutput(false),
penClr(0), backClr(0xFF), penMode(0), counterTillFree(0) { penClr(0), backClr(0xFF), penMode(0), counterTillFree(0) {
} }
bool isWindow() const { return id >= PORTS_FIRSTWINDOWID && id != 0xFFFF; }
}; };
struct Window : public Port, public Common::Serializable { struct Window : public Port, public Common::Serializable {

View file

@ -246,8 +246,10 @@ void GfxPorts::beginUpdate(Window *wnd) {
PortList::iterator it = _windowList.reverse_begin(); PortList::iterator it = _windowList.reverse_begin();
const PortList::iterator end = Common::find(_windowList.begin(), _windowList.end(), wnd); const PortList::iterator end = Common::find(_windowList.begin(), _windowList.end(), wnd);
while (it != end) { while (it != end) {
// FIXME: We also store Port objects in the window list. // We also store Port objects in the window list, but they
// We should add a check that we really only pass windows here... // shouldn't be encountered during this iteration.
assert((*it)->isWindow());
updateWindow((Window *)*it); updateWindow((Window *)*it);
--it; --it;
} }
@ -263,8 +265,10 @@ void GfxPorts::endUpdate(Window *wnd) {
assert(it != end); assert(it != end);
while (++it != end) { while (++it != end) {
// FIXME: We also store Port objects in the window list. // We also store Port objects in the window list, but they
// We should add a check that we really only pass windows here... // shouldn't be encountered during this iteration.
assert((*it)->isWindow());
updateWindow((Window *)*it); updateWindow((Window *)*it);
} }

View file

@ -37,9 +37,6 @@ class GfxPaint16;
class GfxScreen; class GfxScreen;
class GfxText16; class GfxText16;
#define PORTS_FIRSTWINDOWID 2
#define PORTS_FIRSTSCRIPTWINDOWID 3
// window styles // window styles
enum { enum {
SCI_WINDOWMGR_STYLE_TRANSPARENT = (1 << 0), SCI_WINDOWMGR_STYLE_TRANSPARENT = (1 << 0),