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;
for (PortList::const_iterator it = windowList.begin(); it != windowList.end(); ++it) {
// FIXME: We also store Port objects in the window list.
// We should add a check that we really only pass windows here...
Window *wnd = ((Window *)*it);
wm.push(wnd->hSaved1);
wm.push(wnd->hSaved2);
if ((*it)->isWindow()) {
Window *wnd = ((Window *)*it);
wm.push(wnd->hSaved1);
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;
#define PORTS_FIRSTWINDOWID 2
#define PORTS_FIRSTSCRIPTWINDOWID 3
struct Port {
uint16 id;
int16 top, left;
@ -62,6 +66,8 @@ struct Port {
fontHeight(0), fontId(0), greyedOutput(false),
penClr(0), backClr(0xFF), penMode(0), counterTillFree(0) {
}
bool isWindow() const { return id >= PORTS_FIRSTWINDOWID && id != 0xFFFF; }
};
struct Window : public Port, public Common::Serializable {

View file

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

View file

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