void KBImageLoader::run() { QMutexLocker locker(&d->condLock); // we enter the loop with d->needImage==true, so we will immediately // try to load an image while (true) { if (d->quitRequested) break; if (d->needImage) { if ( d->fileIndex == (int)d->fileList.count() ) { if ( d->loop ) { d->fileIndex = 0; } else { d->needImage = false; emit(signalEndOfShow()); continue; } } d->needImage = false; d->condLock.unlock(); bool ok; do { ok = loadImage(); if ( !ok) invalidateCurrentImageName(); } while ( !ok && d->fileIndex < (int)d->fileList.count()); if ( d->fileIndex == (int)d->fileList.count() ) { emit(signalEndOfShow()); d->condLock.lock(); continue; } if ( !ok) { // generate a black dummy image d->texture = QImage(128, 128, QImage::Format_ARGB32); d->texture.fill(Qt::black); } d->condLock.lock(); d->fileIndex++; if ( !d->initialized) { d->haveImages = ok; d->initialized = true; } } else { // wait for new requests from the consumer d->imageRequest.wait(&d->condLock); } } }
PresentationKB::PresentationKB(PresentationContainer* const sharedData) : QGLWidget(), d(new Private) { setAttribute(Qt::WA_DeleteOnClose); setWindowFlags(Qt::X11BypassWindowManagerHint | Qt::WindowStaysOnTopHint | Qt::Popup); QRect deskRect = QApplication::desktop()->screenGeometry( QApplication::activeWindow() ); d->deskX = deskRect.x(); d->deskY = deskRect.y(); d->deskWidth = deskRect.width(); d->deskHeight = deskRect.height(); move(d->deskX, d->deskY); resize(d->deskWidth, d->deskHeight); d->sharedData = sharedData; srand(QTime::currentTime().msec()); readSettings(); unsigned frameRate; if (d->forceFrameRate == 0) { int rate = 25; QWindow* const handle = windowHandle(); if (handle) { QScreen* const screen = handle->screen(); if (screen) { rate = (int)screen->refreshRate(); } } frameRate = rate * 2; } else { frameRate = d->forceFrameRate; } qCDebug(DIGIKAM_GENERAL_LOG) << "Frame Rate : " << frameRate; d->image[0] = new KBImage(0); d->image[1] = new KBImage(0); d->step = 1.0 / ((float) (d->delay * frameRate)); d->imageLoadThread = new KBImageLoader(d->sharedData, width(), height()); d->timer = new QTimer; connect(d->timer, SIGNAL(timeout()), this, SLOT(moveSlot())); connect(d->imageLoadThread, SIGNAL(signalEndOfShow()), this, SLOT(slotEndOfShow())); // -- hide cursor when not moved -------------------- d->mouseMoveTimer = new QTimer; connect(d->mouseMoveTimer, SIGNAL(timeout()), this, SLOT(slotMouseMoveTimeOut())); setMouseTracking(true); slotMouseMoveTimeOut(); // -- playback widget ------------------------------- #ifdef HAVE_MEDIAPLAYER d->playbackWidget = new PresentationAudioWidget(this, d->sharedData->soundtrackUrls, d->sharedData); d->playbackWidget->hide(); d->playbackWidget->move(d->deskX, d->deskY); #endif // -- load image and let's start d->imageLoadThread->start(); d->timer->start(1000 / frameRate); }