Changeset View
Changeset View
Standalone View
Standalone View
colorcorrection/manager.cpp
Show First 20 Lines • Show All 365 Lines • ▼ Show 20 Line(s) | 353 | { | |||
---|---|---|---|---|---|
366 | } | 366 | } | ||
367 | 367 | | |||
368 | // set up the next slow update | 368 | // set up the next slow update | ||
369 | m_slowUpdateStartTimer = new QTimer(this); | 369 | m_slowUpdateStartTimer = new QTimer(this); | ||
370 | m_slowUpdateStartTimer->setSingleShot(true); | 370 | m_slowUpdateStartTimer->setSingleShot(true); | ||
371 | connect(m_slowUpdateStartTimer, &QTimer::timeout, this, &Manager::resetSlowUpdateStartTimer); | 371 | connect(m_slowUpdateStartTimer, &QTimer::timeout, this, &Manager::resetSlowUpdateStartTimer); | ||
372 | 372 | | |||
373 | updateSunTimings(false); | 373 | updateSunTimings(false); | ||
374 | int diff; | 374 | const int diff = QDateTime::currentDateTime().msecsTo(m_next.first); | ||
375 | if (m_mode == NightColorMode::Timings) { | | |||
376 | // Timings mode is in local time | | |||
377 | diff = QDateTime::currentDateTime().msecsTo(m_next.first); | | |||
378 | } else { | | |||
379 | diff = QDateTime::currentDateTimeUtc().msecsTo(m_next.first); | | |||
380 | } | | |||
381 | if (diff <= 0) { | 375 | if (diff <= 0) { | ||
382 | qCCritical(KWIN_COLORCORRECTION) << "Error in time calculation. Deactivating Night Color."; | 376 | qCCritical(KWIN_COLORCORRECTION) << "Error in time calculation. Deactivating Night Color."; | ||
383 | return; | 377 | return; | ||
384 | } | 378 | } | ||
385 | m_slowUpdateStartTimer->start(diff); | 379 | m_slowUpdateStartTimer->start(diff); | ||
386 | 380 | | |||
387 | // start the current slow update | 381 | // start the current slow update | ||
388 | resetSlowUpdateTimer(); | 382 | resetSlowUpdateTimer(); | ||
389 | } | 383 | } | ||
390 | 384 | | |||
391 | void Manager::resetSlowUpdateTimer() | 385 | void Manager::resetSlowUpdateTimer() | ||
392 | { | 386 | { | ||
393 | delete m_slowUpdateTimer; | 387 | delete m_slowUpdateTimer; | ||
394 | m_slowUpdateTimer = nullptr; | 388 | m_slowUpdateTimer = nullptr; | ||
395 | 389 | | |||
396 | QDateTime now = QDateTime::currentDateTimeUtc(); | 390 | QDateTime now = QDateTime::currentDateTime(); | ||
397 | bool isDay = daylight(); | 391 | bool isDay = daylight(); | ||
398 | int targetTemp = isDay ? m_dayTargetTemp : m_nightTargetTemp; | 392 | int targetTemp = isDay ? m_dayTargetTemp : m_nightTargetTemp; | ||
399 | 393 | | |||
400 | // We've reached the target color temperature or the transition time is zero. | 394 | // We've reached the target color temperature or the transition time is zero. | ||
401 | if (m_prev.first == m_prev.second || m_currentTemp == targetTemp) { | 395 | if (m_prev.first == m_prev.second || m_currentTemp == targetTemp) { | ||
402 | commitGammaRamps(targetTemp); | 396 | commitGammaRamps(targetTemp); | ||
403 | return; | 397 | return; | ||
404 | } | 398 | } | ||
Show All 33 Lines | 431 | if (nextTemp == targetTemp) { | |||
438 | // stop timer, we reached the target temp | 432 | // stop timer, we reached the target temp | ||
439 | delete m_slowUpdateTimer; | 433 | delete m_slowUpdateTimer; | ||
440 | m_slowUpdateTimer = nullptr; | 434 | m_slowUpdateTimer = nullptr; | ||
441 | } | 435 | } | ||
442 | } | 436 | } | ||
443 | 437 | | |||
444 | void Manager::updateSunTimings(bool force) | 438 | void Manager::updateSunTimings(bool force) | ||
445 | { | 439 | { | ||
446 | QDateTime todayNow = QDateTime::currentDateTimeUtc(); | 440 | QDateTime todayNow = QDateTime::currentDateTime(); | ||
447 | 441 | | |||
448 | if (m_mode == NightColorMode::Timings) { | 442 | if (m_mode == NightColorMode::Timings) { | ||
449 | 443 | QDateTime morB = QDateTime(todayNow.date(), m_morning); | |||
450 | QDateTime todayNowLocal = QDateTime::currentDateTime(); | | |||
451 | | ||||
452 | QDateTime morB = QDateTime(todayNowLocal.date(), m_morning); | | |||
453 | QDateTime morE = morB.addSecs(m_trTime * 60); | 444 | QDateTime morE = morB.addSecs(m_trTime * 60); | ||
454 | QDateTime eveB = QDateTime(todayNowLocal.date(), m_evening); | 445 | QDateTime eveB = QDateTime(todayNow.date(), m_evening); | ||
455 | QDateTime eveE = eveB.addSecs(m_trTime * 60); | 446 | QDateTime eveE = eveB.addSecs(m_trTime * 60); | ||
456 | 447 | | |||
457 | if (morB <= todayNowLocal && todayNowLocal < eveB) { | 448 | if (morB <= todayNow && todayNow < eveB) { | ||
458 | m_next = DateTimes(eveB, eveE); | 449 | m_next = DateTimes(eveB, eveE); | ||
459 | m_prev = DateTimes(morB, morE); | 450 | m_prev = DateTimes(morB, morE); | ||
460 | } else if (todayNowLocal < morB) { | 451 | } else if (todayNow < morB) { | ||
461 | m_next = DateTimes(morB, morE); | 452 | m_next = DateTimes(morB, morE); | ||
462 | m_prev = DateTimes(eveB.addDays(-1), eveE.addDays(-1)); | 453 | m_prev = DateTimes(eveB.addDays(-1), eveE.addDays(-1)); | ||
463 | } else { | 454 | } else { | ||
464 | m_next = DateTimes(morB.addDays(1), morE.addDays(1)); | 455 | m_next = DateTimes(morB.addDays(1), morE.addDays(1)); | ||
465 | m_prev = DateTimes(eveB, eveE); | 456 | m_prev = DateTimes(eveB, eveE); | ||
466 | } | 457 | } | ||
467 | return; | 458 | return; | ||
468 | } | 459 | } | ||
469 | 460 | | |||
470 | double lat, lng; | 461 | double lat, lng; | ||
471 | if (m_mode == NightColorMode::Automatic) { | 462 | if (m_mode == NightColorMode::Automatic) { | ||
472 | lat = m_latAuto; | 463 | lat = m_latAuto; | ||
473 | lng = m_lngAuto; | 464 | lng = m_lngAuto; | ||
474 | } else { | 465 | } else { | ||
475 | lat = m_latFixed; | 466 | lat = m_latFixed; | ||
476 | lng = m_lngFixed; | 467 | lng = m_lngFixed; | ||
477 | } | 468 | } | ||
478 | 469 | | |||
479 | if (!force) { | 470 | if (!force) { | ||
480 | // first try by only switching the timings | 471 | // first try by only switching the timings | ||
481 | if (daylight()) { | 472 | if (daylight()) { | ||
482 | // next is morning | 473 | // next is morning | ||
483 | m_prev = m_next; | 474 | m_prev = m_next; | ||
484 | m_next = getSunTimings(todayNow.date().addDays(1), lat, lng, true); | 475 | m_next = getSunTimings(todayNow.addDays(1), lat, lng, true); | ||
485 | } else { | 476 | } else { | ||
486 | // next is evening | 477 | // next is evening | ||
487 | m_prev = m_next; | 478 | m_prev = m_next; | ||
488 | m_next = getSunTimings(todayNow.date(), lat, lng, false); | 479 | m_next = getSunTimings(todayNow, lat, lng, false); | ||
489 | } | 480 | } | ||
490 | } | 481 | } | ||
491 | 482 | | |||
492 | if (force || !checkAutomaticSunTimings()) { | 483 | if (force || !checkAutomaticSunTimings()) { | ||
493 | // in case this fails, reset them | 484 | // in case this fails, reset them | ||
494 | DateTimes morning = getSunTimings(todayNow.date(), lat, lng, true); | 485 | DateTimes morning = getSunTimings(todayNow, lat, lng, true); | ||
495 | if (todayNow < morning.first) { | 486 | if (todayNow < morning.first) { | ||
496 | m_prev = getSunTimings(todayNow.date().addDays(-1), lat, lng, false); | 487 | m_prev = getSunTimings(todayNow.addDays(-1), lat, lng, false); | ||
497 | m_next = morning; | 488 | m_next = morning; | ||
498 | } else { | 489 | } else { | ||
499 | DateTimes evening = getSunTimings(todayNow.date(), lat, lng, false); | 490 | DateTimes evening = getSunTimings(todayNow, lat, lng, false); | ||
500 | if (todayNow < evening.first) { | 491 | if (todayNow < evening.first) { | ||
501 | m_prev = morning; | 492 | m_prev = morning; | ||
502 | m_next = evening; | 493 | m_next = evening; | ||
503 | } else { | 494 | } else { | ||
504 | m_prev = evening; | 495 | m_prev = evening; | ||
505 | m_next = getSunTimings(todayNow.date().addDays(1), lat, lng, true); | 496 | m_next = getSunTimings(todayNow.addDays(1), lat, lng, true); | ||
506 | } | 497 | } | ||
507 | } | 498 | } | ||
508 | } | 499 | } | ||
509 | } | 500 | } | ||
510 | 501 | | |||
511 | DateTimes Manager::getSunTimings(QDate date, double latitude, double longitude, bool morning) const | 502 | DateTimes Manager::getSunTimings(const QDateTime &dateTime, double latitude, double longitude, bool morning) const | ||
512 | { | 503 | { | ||
513 | Times times = calculateSunTimings(date, latitude, longitude, morning); | 504 | DateTimes dateTimes = calculateSunTimings(dateTime, latitude, longitude, morning); | ||
514 | // At locations near the poles it is possible, that we can't | 505 | // At locations near the poles it is possible, that we can't | ||
515 | // calculate some or all sun timings (midnight sun). | 506 | // calculate some or all sun timings (midnight sun). | ||
516 | // In this case try to fallback to sensible default values. | 507 | // In this case try to fallback to sensible default values. | ||
517 | bool beginDefined = !times.first.isNull(); | 508 | bool beginDefined = !dateTimes.first.isNull(); | ||
518 | bool endDefined = !times.second.isNull(); | 509 | bool endDefined = !dateTimes.second.isNull(); | ||
519 | if (!beginDefined || !endDefined) { | 510 | if (!beginDefined || !endDefined) { | ||
520 | if (beginDefined) { | 511 | if (beginDefined) { | ||
521 | times.second = times.first.addMSecs( FALLBACK_SLOW_UPDATE_TIME ); | 512 | dateTimes.second = dateTimes.first.addMSecs( FALLBACK_SLOW_UPDATE_TIME ); | ||
522 | } else if (endDefined) { | 513 | } else if (endDefined) { | ||
523 | times.first = times.second.addMSecs( - FALLBACK_SLOW_UPDATE_TIME); | 514 | dateTimes.first = dateTimes.second.addMSecs( - FALLBACK_SLOW_UPDATE_TIME ); | ||
524 | } else { | 515 | } else { | ||
525 | // Just use default values for morning and evening, but the user | 516 | // Just use default values for morning and evening, but the user | ||
526 | // will probably deactivate Night Color anyway if he is living | 517 | // will probably deactivate Night Color anyway if he is living | ||
527 | // in a region without clear sun rise and set. | 518 | // in a region without clear sun rise and set. | ||
528 | times.first = morning ? QTime(6,0,0) : QTime(18,0,0); | 519 | const QTime referenceTime = morning ? QTime(6, 0) : QTime(18, 0); | ||
529 | times.second = times.first.addMSecs( FALLBACK_SLOW_UPDATE_TIME ); | 520 | dateTimes.first = QDateTime(dateTime.date(), referenceTime); | ||
521 | dateTimes.second = dateTimes.first.addMSecs( FALLBACK_SLOW_UPDATE_TIME ); | ||||
530 | } | 522 | } | ||
531 | } | 523 | } | ||
532 | return DateTimes(QDateTime(date, times.first, Qt::UTC), QDateTime(date, times.second, Qt::UTC)); | 524 | return dateTimes; | ||
533 | } | 525 | } | ||
534 | 526 | | |||
535 | bool Manager::checkAutomaticSunTimings() const | 527 | bool Manager::checkAutomaticSunTimings() const | ||
536 | { | 528 | { | ||
537 | if (m_prev.first.isValid() && m_prev.second.isValid() && | 529 | if (m_prev.first.isValid() && m_prev.second.isValid() && | ||
538 | m_next.first.isValid() && m_next.second.isValid()) { | 530 | m_next.first.isValid() && m_next.second.isValid()) { | ||
539 | QDateTime todayNow = QDateTime::currentDateTimeUtc(); | 531 | QDateTime todayNow = QDateTime::currentDateTime(); | ||
540 | return m_prev.first <= todayNow && todayNow < m_next.first && | 532 | return m_prev.first <= todayNow && todayNow < m_next.first && | ||
541 | m_prev.first.msecsTo(m_next.first) < MSC_DAY * 23./24; | 533 | m_prev.first.msecsTo(m_next.first) < MSC_DAY * 23./24; | ||
542 | } | 534 | } | ||
543 | return false; | 535 | return false; | ||
544 | } | 536 | } | ||
545 | 537 | | |||
546 | bool Manager::daylight() const | 538 | bool Manager::daylight() const | ||
547 | { | 539 | { | ||
548 | return m_prev.first.date() == m_next.first.date(); | 540 | return m_prev.first.date() == m_next.first.date(); | ||
549 | } | 541 | } | ||
550 | 542 | | |||
551 | int Manager::currentTargetTemp() const | 543 | int Manager::currentTargetTemp() const | ||
552 | { | 544 | { | ||
553 | if (!m_active) { | 545 | if (!m_active) { | ||
554 | return NEUTRAL_TEMPERATURE; | 546 | return NEUTRAL_TEMPERATURE; | ||
555 | } | 547 | } | ||
556 | 548 | | |||
557 | if (m_mode == NightColorMode::Constant) { | 549 | if (m_mode == NightColorMode::Constant) { | ||
558 | return m_nightTargetTemp; | 550 | return m_nightTargetTemp; | ||
559 | } | 551 | } | ||
560 | 552 | | |||
561 | QDateTime todayNow = QDateTime::currentDateTimeUtc(); | 553 | QDateTime todayNow = QDateTime::currentDateTime(); | ||
562 | 554 | | |||
563 | auto f = [this, todayNow](int target1, int target2) { | 555 | auto f = [this, todayNow](int target1, int target2) { | ||
564 | if (todayNow <= m_prev.second) { | 556 | if (todayNow <= m_prev.second) { | ||
565 | double residueQuota = todayNow.msecsTo(m_prev.second) / (double)m_prev.first.msecsTo(m_prev.second); | 557 | double residueQuota = todayNow.msecsTo(m_prev.second) / (double)m_prev.first.msecsTo(m_prev.second); | ||
566 | 558 | | |||
567 | double ret = (int)((1. - residueQuota) * (double)target2 + residueQuota * (double)target1); | 559 | double ret = (int)((1. - residueQuota) * (double)target2 + residueQuota * (double)target1); | ||
568 | // remove single digits | 560 | // remove single digits | ||
569 | ret = ((int)(0.1 * ret)) * 10; | 561 | ret = ((int)(0.1 * ret)) * 10; | ||
▲ Show 20 Lines • Show All 289 Lines • Show Last 20 Lines |