void KDecorationPreview::setPreviewMask( const QRegion& reg, int mode, bool active ) { QWidget *widget = active ? deco[Active]->widget() : deco[Inactive]->widget(); // FRAME duped from client.cpp if( mode == Unsorted ) { XShapeCombineRegion( qt_xdisplay(), widget->winId(), ShapeBounding, 0, 0, reg.handle(), ShapeSet ); } else { QMemArray< QRect > rects = reg.rects(); XRectangle* xrects = new XRectangle[ rects.count() ]; for( unsigned int i = 0; i < rects.count(); ++i ) { xrects[ i ].x = rects[ i ].x(); xrects[ i ].y = rects[ i ].y(); xrects[ i ].width = rects[ i ].width(); xrects[ i ].height = rects[ i ].height(); } XShapeCombineRectangles( qt_xdisplay(), widget->winId(), ShapeBounding, 0, 0, xrects, rects.count(), ShapeSet, mode ); delete[] xrects; } if( active ) mask = reg; // keep shape of the active window for unobscuredRegion() }
void UIMachineWindowSeamless::setMask(const QRegion &constRegion) { QRegion region = constRegion; /* Shift region if left spacer width is NOT zero or top spacer height is NOT zero: */ if (m_pLeftSpacer->geometry().width() || m_pTopSpacer->geometry().height()) region.translate(m_pLeftSpacer->geometry().width(), m_pTopSpacer->geometry().height()); #if 0 // TODO: Is it really needed now? /* The global mask shift cause of toolbars and such things. */ region.translate(mMaskShift.width(), mMaskShift.height()); #endif /* Mini tool-bar: */ #ifndef Q_WS_MAC if (m_pMiniToolBar) { /* Get mini-toolbar mask: */ QRegion toolBarRegion(m_pMiniToolBar->mask()); /* Move mini-toolbar mask to mini-toolbar position: */ toolBarRegion.translate(QPoint(m_pMiniToolBar->x(), m_pMiniToolBar->y())); /* Including mini tool-bar mask: */ region += toolBarRegion; } #endif /* Q_WS_MAC */ #if 0 // TODO: Is it really needed now? /* Restrict the drawing to the available space on the screen. * (The &operator is better than the previous used -operator, * because this excludes space around the real screen also. * This is necessary for the mac.) */ region &= mStrictedRegion; #endif #ifdef Q_WS_WIN QRegion difference = m_prevRegion.subtract(region); /* Region offset calculation */ int fleft = 0, ftop = 0; /* Visible region calculation */ HRGN newReg = CreateRectRgn(0, 0, 0, 0); CombineRgn(newReg, region.handle(), 0, RGN_COPY); OffsetRgn(newReg, fleft, ftop); /* Invisible region calculation */ HRGN diffReg = CreateRectRgn(0, 0, 0, 0); CombineRgn(diffReg, difference.handle(), 0, RGN_COPY); OffsetRgn(diffReg, fleft, ftop); /* Set the current visible region and clean the previous */ SetWindowRgn(winId(), newReg, FALSE); RedrawWindow(0, 0, diffReg, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ALLCHILDREN); RedrawWindow(machineView()->viewport()->winId(), 0, 0, RDW_INVALIDATE); m_prevRegion = region; #elif defined (Q_WS_MAC) # if defined (VBOX_GUI_USE_QUARTZ2D) if (vboxGlobal().vmRenderMode() == VBoxDefs::Quartz2DMode) { /* If we are using the Quartz2D backend we have to trigger * an repaint only. All the magic clipping stuff is done * in the paint engine. */ ::darwinWindowInvalidateShape(m_pMachineView->viewport()); } else # endif { /* This is necessary to avoid the flicker by an mask update. * See http://lists.apple.com/archives/Carbon-development/2001/Apr/msg01651.html * for the hint. * There *must* be a better solution. */ if (!region.isEmpty()) region |= QRect (0, 0, 1, 1); // /* Save the current region for later processing in the darwin event handler. */ // mCurrRegion = region; // /* We repaint the screen before the ReshapeCustomWindow command. Unfortunately // * this command flushes a copy of the backbuffer to the screen after the new // * mask is set. This leads into a misplaced drawing of the content. Currently // * no alternative to this and also this is not 100% perfect. */ // repaint(); // qApp->processEvents(); // /* Now force the reshaping of the window. This is definitely necessary. */ // ReshapeCustomWindow (reinterpret_cast <WindowPtr> (winId())); QMainWindow::setMask(region); // HIWindowInvalidateShadow (::darwinToWindowRef (mConsole->viewport())); } #else QMainWindow::setMask(region); #endif }
void UIMachineWindowSeamless::setMask(const QRegion &constRegion) { /* Could be unused under Mac: */ Q_UNUSED(constRegion); #ifndef Q_WS_MAC /* Copy mask: */ QRegion region = constRegion; /* Shift region if left spacer width is NOT zero or top spacer height is NOT zero: */ if (m_pLeftSpacer->geometry().width() || m_pTopSpacer->geometry().height()) region.translate(m_pLeftSpacer->geometry().width(), m_pTopSpacer->geometry().height()); /* Take into account mini tool-bar region: */ if (m_pMiniToolBar) { /* Move mini-toolbar region to mini-toolbar position: */ QRegion toolBarRegion(m_pMiniToolBar->rect()); toolBarRegion.translate(QPoint(m_pMiniToolBar->x(), m_pMiniToolBar->y())); /* Include mini-toolbar region into common one: */ region += toolBarRegion; } #endif /* !Q_WS_MAC */ #if defined (Q_WS_WIN) # if 0 /* This code is disabled for a long time already, need analisys... */ QRegion difference = m_prevRegion.subtract(region); /* Region offset calculation */ int fleft = 0, ftop = 0; /* Visible region calculation */ HRGN newReg = CreateRectRgn(0, 0, 0, 0); CombineRgn(newReg, region.handle(), 0, RGN_COPY); OffsetRgn(newReg, fleft, ftop); /* Invisible region calculation */ HRGN diffReg = CreateRectRgn(0, 0, 0, 0); CombineRgn(diffReg, difference.handle(), 0, RGN_COPY); OffsetRgn(diffReg, fleft, ftop); /* Set the current visible region and clean the previous */ SetWindowRgn(winId(), newReg, FALSE); RedrawWindow(0, 0, diffReg, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ALLCHILDREN); if (machineView()) RedrawWindow(machineView()->viewport()->winId(), 0, 0, RDW_INVALIDATE); m_prevRegion = region; # endif /* This code is disabled for a long time already, need analisys... */ UIMachineWindow::setMask(region); #elif defined (Q_WS_MAC) # if defined (VBOX_GUI_USE_QUARTZ2D) if (vboxGlobal().vmRenderMode() == Quartz2DMode) { /* If we are using the Quartz2D backend we have to trigger a repaint only. * All the magic clipping stuff is done in the paint engine. */ ::darwinWindowInvalidateShape(m_pMachineView->viewport()); } # endif /* VBOX_GUI_USE_QUARTZ2D */ # if 0 /* This code is disabled for a long time already, need analisys... */ /* This is necessary to avoid the flicker by an mask update. * See http://lists.apple.com/archives/Carbon-development/2001/Apr/msg01651.html for the hint. * There *must* be a better solution. */ // if (!region.isEmpty()) // region |= QRect(0, 0, 1, 1); // /* Save the current region for later processing in the darwin event handler. */ // mCurrRegion = region; // /* We repaint the screen before the ReshapeCustomWindow command. Unfortunately // * this command flushes a copy of the backbuffer to the screen after the new // * mask is set. This leads into a misplaced drawing of the content. Currently // * no alternative to this and also this is not 100% perfect. */ // repaint(); // qApp->processEvents(); // /* Now force the reshaping of the window. This is definitely necessary. */ // ReshapeCustomWindow(reinterpret_cast<WindowPtr>(winId())); // UIMachineWindow::setMask(region); // HIWindowInvalidateShadow(::darwinToWindowRef(mConsole->viewport())); # endif /* This code is disabled for a long time already, need analisys... */ #else /* !Q_WS_MAC */ UIMachineWindow::setMask(region); #endif }
void QGLContext::updatePaintDevice() { Q_D(QGLContext); d->update = false; #if 0 //(MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5) if (QSysInfo::MacintoshVersion >= QSysInfo::MV_10_5) { if(d->paintDevice->devType() == QInternal::Widget) { QWidget *w = (QWidget *)d->paintDevice; aglSetHIViewRef((AGLContext)d->cx, (HIViewRef)w->winId()); } else if(d->paintDevice->devType() == QInternal::Pixmap) { QPixmap *pm = (QPixmap *)d->paintDevice; aglSetOffScreen((AGLContext)d->cx, pm->width(), pm->height(), qt_mac_pixmap_get_bytes_per_line(pm), qt_mac_pixmap_get_base(pm)); } else { qWarning("QGLContext::updatePaintDevice(): Not sure how to render OpenGL on this device!"); } } else #endif { #ifndef Q_OS_MAC64 if(d->paintDevice->devType() == QInternal::Widget) { //get control information QWidget *w = (QWidget *)d->paintDevice; HIViewRef hiview = (HIViewRef)w->winId(); WindowPtr window = qt_mac_window_for(hiview); #ifdef DEBUG_OPENGL_REGION_UPDATE static int serial_no_gl = 0; qDebug("[%d] %p setting on %s::%s %p/%p [%s]", ++serial_no_gl, w, w->metaObject()->className(), w->objectName().toLatin1().constData(), hiview, window, w->handle() ? "Inside" : "Outside"); #endif //update drawable if(0 && w->isWindow() && w->isFullScreen()) { aglSetDrawable((AGLContext)d->cx, 0); aglSetFullScreen((AGLContext)d->cx, w->width(), w->height(), 0, QApplication::desktop()->screenNumber(w)); w->hide(); } else { AGLDrawable old_draw = aglGetDrawable((AGLContext)d->cx), new_draw = GetWindowPort(window); if(old_draw != new_draw) aglSetDrawable((AGLContext)d->cx, new_draw); } if(!w->isWindow()) { QRegion clp = qt_mac_get_widget_rgn(w); //get drawable area #ifdef DEBUG_OPENGL_REGION_UPDATE if(clp.isEmpty()) { qDebug(" Empty area!"); } else { QVector<QRect> rs = clp.rects(); for(int i = 0; i < rs.count(); i++) qDebug(" %d %d %d %d", rs[i].x(), rs[i].y(), rs[i].width(), rs[i].height()); } #endif //update the clip if(!aglIsEnabled((AGLContext)d->cx, AGL_BUFFER_RECT)) aglEnable((AGLContext)d->cx, AGL_BUFFER_RECT); if(clp.isEmpty()) { GLint offs[4] = { 0, 0, 0, 0 }; aglSetInteger((AGLContext)d->cx, AGL_BUFFER_RECT, offs); if(aglIsEnabled((AGLContext)d->cx, AGL_CLIP_REGION)) aglDisable((AGLContext)d->cx, AGL_CLIP_REGION); } else { HIPoint origin = { 0., 0. }; HIViewConvertPoint(&origin, HIViewRef(w->winId()), 0); const GLint offs[4] = { qRound(origin.x), w->window()->frameGeometry().height() - (qRound(origin.y) + w->height()), w->width(), w->height() }; aglSetInteger((AGLContext)d->cx, AGL_BUFFER_RECT, offs); aglSetInteger((AGLContext)d->cx, AGL_CLIP_REGION, (const GLint *)clp.handle(true)); if(!aglIsEnabled((AGLContext)d->cx, AGL_CLIP_REGION)) aglEnable((AGLContext)d->cx, AGL_CLIP_REGION); } } } else if(d->paintDevice->devType() == QInternal::Pixmap) { QPixmap *pm = (QPixmap *)d->paintDevice; PixMapHandle mac_pm = GetGWorldPixMap((GWorldPtr)pm->macQDHandle()); aglSetOffScreen((AGLContext)d->cx, pm->width(), pm->height(), GetPixRowBytes(mac_pm), GetPixBaseAddr(mac_pm)); } else { qWarning("QGLContext::updatePaintDevice(): Not sure how to render OpenGL on this device!"); } #endif // Q_OS_MAC64 } aglUpdateContext((AGLContext)d->cx); }