前言

從比較久以前開始,「夜間模式」就成了國內手機的標配功能之一。當時我還是不屑的,咋一看不就是把屏幕變成了黃色麼。直到 Android 7.0 官方支持了夜間模式,我親自用上了才發現它的好。

確實,對於手機而言這是個硬需求,因為大晚上還在用手機太常見了。而手機靠近眼睛很近,並且通常手機屏幕的亮度無法調到很低,導致晚上真的很刺眼。

(所以我的手機必開夜間模式)

當然,PC 操作系統廠商們也不能忽略電腦用戶的這個需求,就像標題圖片上的截圖那樣,Windows10 不知道從什麼時候起也支持這個功能了。

並且效果體驗非常好,系統原生支持定時開關任務。

那麼,我們 Linux 用戶不能享受這個功能麼?/*至於現在的桌面環境好像沒聽說那個支持的*/。那我這種經常晚上仍然在使用 Linux 的人,眼睛豈不是要瞎掉啊!

(當然,我不會那麼蠢,我會將顯示器亮度調到很低)

注意:評論提醒,Gnome3 已經有了夜間模式,經過確認的確如此。所以 Gnome3 用戶不需要使用本文的方案了~

本文適合桌面不帶 Night light 功能的系統環境,例如我所使用的 Ubuntu-Budgie 16.04。

解決方案

這裡我們要使用一款叫 Redshift 的軟體 + 通常發行版都自帶的 Cron 實現相同的功能。

  • Redshift 是一個能智能調節顯示器色溫的開源軟體,倉庫地址:jonls/redshift
  • Cron 是 *nix 上常見的週期性執行任務的一個組件(雖然它的地位正嚴重受到 Systemd/Timers 的威脅)

首先我們安裝 redshift,使用包含最新版本的 PPA(添加完別忘記 update):

sudo add-apt-repository ppa:dobey/redshift-daily

其它發行版通常默認源已經存在:

sudo apt install redshift

然後去查看你所在的位置的緯度和經度,當做參數(LAT:LON)啟動 redshift:

redshift -l 31:121

緯度:31 和經度:121 的地理位置是上海,你自己的位置自己去獲取一下:)

此時屏幕色溫會逐漸的調節,從感官上感覺效果跟 Windows10 上的基本一樣

最後就是用 cron 實現定時開啟和關閉 redshift 的「夜間模式」了(添加兩個任務):

DISPLAY=:0.0# 開啟 redshift30 22 * * * redshift -l 31:121# 關閉 redshift30 06 * * * killall redshift

上面的時間是 22:30 開啟,6:30 關閉,有需要的自行調整。注意:DISPLAY 變數必須要有:)

Redshift 在收到 Kill 信號以後,會將色溫「漸變」回去然後關閉。

看起來不會很突兀好像一下子就變過來了,畢竟你的眼睛可能經受不了這麼突然的變化 ??????

附加

有人評論說 Redshift 本身就可以設置白天和晚上的亮度(應該說色溫),不需要 Cron:

這個確實是的,如果你寫一份配置文件,設置好指定調節策略(太陽高度或時間)和溫度值就行。但是我並不想讓 Redshift 隨著系統啟動常駐(因為我只有在晚上使用它),所以我直接在白天的時候關掉,晚上再開啟。

當然你也可以完全按照它的方式運行它,只不過你得細心配置幾個地方,否則你將永遠看不到顯示器正常的顯示效果

—— 再次更新

思來想去我還是把 Redshift 在系統啟動後全程接管色溫等參數的控制方案寫出來的,這也是 redshift 本身的運作方式(雖然我一直是以 corntab 任務作為開關使用過來的)。

Redshift 在這裡將作為一個常駐的守護進程,無論是白天還是晚上都根據配置進行調節。

注意:如果你不想在白天的時候讓 Redshift 調整你顯示器的任何參數的話,那你就得搞清楚你顯示器的默認色溫。

首先創建配置文件 redshift.conf(存放位置看你個人喜好):

[redshift]# 白天色溫temp-day=6500# 夜晚色溫temp-night=3500# 平滑過渡fade=1# 夜晚 gamma 值gamma-night=0.8# 手動設置位置location-provider=manual# 新校準方法 APIadjustment-method=randr[manual]# 緯度lat=31# 經度lon=121[randr]screen=0

需要注意的是上面兩個地方:

  • temp-day: 這個值需要用你顯示器的默認色溫,例如上面配置的是我的顯示器 6500K 的色溫。如果你不設置成顯示器該有的色溫的話,你將永遠看不到顯示器原本的效果。我認為這是有大問題的,至少在某些場景對顏色的要求很苛刻(例如設計師的專業顯示器),而白天一般又不需要所謂的「護眼模式」
  • gamma: 在上面的配置中沒有 gamma 這個配置項,因為被我刪掉了(Sample 配置是有的)。我使用了 gamma-night 這個僅配置夜晚 gamma 值的配置項。原因跟上面相同,如果你不指定為夜晚的話,全時間段都調整 gamma 會造成顯示器無法顯示原本的效果。

另外還有其它配置項和注釋請參考 Sample 配置文件,但是同樣的如果你不想在白天應用任何顯示器調整的話配置就要細心點。

接著編輯 Systemd 腳本:

sudo vi /usr/lib/systemd/user/redshift.service

主要是添加一個 DISPLAY 的環境變數和添加一個執行文件的參數,完整內容為:

[Unit]Description=Redshift display colour temperature adjustmentDocumentation=http://jonls.dk/redshift/After=display-manager.service[Service]# 新增的環境變數Environment=DISPLAY=:0# 在這裡添加了一個 -c 參數ExecStart=/usr/bin/redshift -c /etc/redshift.confRestart=always[Install]WantedBy=default.target

注意:上面的 -c 參數後面的路徑就是上面的配置文件,這個路徑要改成你存放的位置。

重載配置:

systemctl --user daemon-reload

最後讓服務開機啟動:

systemctl --user enable redshift

PS:如果決定用這種方式請刪掉 crontab 的相關任務。

效果就是 Redshift 守護進程會無時無刻的運行,在白天的時候不做顯示器的任何調整,晚上根據配置進行變化。

其實這樣做更好一些,但是我當初覺得既然我不想在白天使用,那麼我直接白天 Kill 掉進程,晚上再啟動不就行了,所以我一直用的是 Cron 定時跑任務作為開關。

結束語

總算不用老是調顯示器亮度了。 Over~


推薦閱讀:
相关文章