static void stubCBCheckWindowsInfo(unsigned long key, void *data1, void *data2) { WindowInfo *winInfo = (WindowInfo *) data1; CWPRETSTRUCT *pMsgInfo = (PCWPRETSTRUCT) data2; (void) key; if (winInfo && pMsgInfo && winInfo->type == CHROMIUM) { switch (pMsgInfo->message) { case WM_MOVING: case WM_SIZING: case WM_MOVE: case WM_CREATE: case WM_SIZE: { GLboolean changed = stub.trackWindowVisibleRgn && stubUpdateWindowVisibileRegions(winInfo); if (stubUpdateWindowGeometry(winInfo, GL_FALSE) || changed) { crForcedFlush(); } break; } case WM_SHOWWINDOW: case WM_ACTIVATEAPP: case WM_PAINT: case WM_NCPAINT: case WM_NCACTIVATE: case WM_ERASEBKGND: { if (stub.trackWindowVisibleRgn && stubUpdateWindowVisibileRegions(winInfo)) { crForcedFlush(); } break; } default: { if (stub.trackWindowVisibleRgn && stubUpdateWindowVisibileRegions(winInfo)) { crDebug("Visibility info updated due to unknown hooked message (%d)", pMsgInfo->message); crForcedFlush(); } break; } } } }
void APIENTRY crWindowDestroy( GLint window ) { WindowInfo *winInfo = (WindowInfo *) crHashtableSearch(stub.windowTable, (unsigned int) window); if (winInfo && winInfo->type == CHROMIUM && stub.spu) { crHashtableLock(stub.windowTable); stub.spu->dispatch_table.WindowDestroy( winInfo->spuWindow ); #ifdef WINDOWS if (winInfo->hVisibleRegion != INVALID_HANDLE_VALUE) { DeleteObject(winInfo->hVisibleRegion); } #elif defined(GLX) if (winInfo->pVisibleRegions) { XFree(winInfo->pVisibleRegions); } # ifdef CR_NEWWINTRACK if (winInfo->syncDpy) { XCloseDisplay(winInfo->syncDpy); } # endif #endif crForcedFlush(); crHashtableDelete(stub.windowTable, window, crFree); crHashtableUnlock(stub.windowTable); } }