void CommonManage(vout_display_t *vd) { vout_display_sys_t *sys = vd->sys; /* We used to call the Win32 PeekMessage function here to read the window * messages. But since window can stay blocked into this function for a * long time (for example when you move your window on the screen), I * decided to isolate PeekMessage in another thread. */ /* If we do not control our window, we check for geometry changes * ourselves because the parent might not send us its events. */ if (sys->hparent) { RECT rect_parent; POINT point; GetClientRect(sys->hparent, &rect_parent); point.x = point.y = 0; ClientToScreen(sys->hparent, &point); OffsetRect(&rect_parent, point.x, point.y); if (!EqualRect(&rect_parent, &sys->rect_parent)) { sys->rect_parent = rect_parent; /* FIXME I find such #ifdef quite weirds. Are they really needed ? */ #if defined(MODULE_NAME_IS_direct3d) || defined(MODULE_NAME_IS_wingdi) || defined(MODULE_NAME_IS_wingapi) SetWindowPos(sys->hwnd, 0, 0, 0, rect_parent.right - rect_parent.left, rect_parent.bottom - rect_parent.top, SWP_NOZORDER); UpdateRects(vd, NULL, NULL, true); #else /* This one is to force the update even if only * the position has changed */ SetWindowPos(sys->hwnd, 0, 1, 1, rect_parent.right - rect_parent.left, rect_parent.bottom - rect_parent.top, 0); SetWindowPos(sys->hwnd, 0, 0, 0, rect_parent.right - rect_parent.left, rect_parent.bottom - rect_parent.top, 0); #endif } } /* */ if (EventThreadGetAndResetHasMoved(sys->event)) UpdateRects(vd, NULL, NULL, false); }
void CommonManage(vout_display_t *vd) { vout_display_sys_t *sys = vd->sys; /* We used to call the Win32 PeekMessage function here to read the window * messages. But since window can stay blocked into this function for a * long time (for example when you move your window on the screen), I * decided to isolate PeekMessage in another thread. */ /* If we do not control our window, we check for geometry changes * ourselves because the parent might not send us its events. */ if (sys->hparent) { RECT rect_parent; POINT point; /* Check if the parent window has resized or moved */ GetClientRect(sys->hparent, &rect_parent); point.x = point.y = 0; ClientToScreen(sys->hparent, &point); OffsetRect(&rect_parent, point.x, point.y); if (!EqualRect(&rect_parent, &sys->rect_parent)) { sys->rect_parent = rect_parent; /* This code deals with both resize and move * * For most drivers(direct3d, gdi, opengl), move is never * an issue. The surface automatically gets moved together * with the associated window (hvideownd) * * For directx, it is still important to call UpdateRects * on a move of the parent window, even if no resize occurred */ SetWindowPos(sys->hwnd, 0, 0, 0, rect_parent.right - rect_parent.left, rect_parent.bottom - rect_parent.top, SWP_NOZORDER); UpdateRects(vd, NULL, NULL, true); } } /* HasMoved means here resize or move */ if (EventThreadGetAndResetHasMoved(sys->event)) UpdateRects(vd, NULL, NULL, false); }