Windows Terminal 背景圖片切換工具
說在前面
使用 Windows Terminal 有一段時間了,但是安裝之后一直沒有動過配置,做了點兒簡單的修改,希望有一個比較舒服的終端背景。實現了一個終端背景圖片變化的功能,每一次開機都會隨機幾張圖片,作為不同終端的背景,也可以通過調用命令實時更換背景。也支持對於不同背景的打分功能,對於喜歡的圖片增加它出現的機率,不喜歡的圖片可以讓它不再出現。是在做畢設之余完成的,非常簡單的一個工具,但是我挺喜歡的,就拿來更一下(好久沒更了呀,詐屍一波。。。)
思路說明
-
首先,我們需要一個背景圖庫,我們叫他 WhiteAlbum 🐶🐶🐶
里面包含了一些平時收的圖。這里我的圖挺多的就用本地的圖了,后面有空考慮做個爬壁紙的工具,再搞一個評價壁紙質量的工具,有緣再說。 -
接下來就是修改終端的背景,這個很容易通過修改settings.json對應的參數做到,我們簡單實現個代碼完成。changeWindowsTerminalBackground.cpp 實現圖片的隨機抽取,並修改對應的json文件參數。為了方便后面的步驟,准備一個文件candidatesList.txt存下所有候選的圖片的路徑,隨機抽取時,直接在候選的列表里隨機出來。
-
再之后就是評價機制,用一個最簡單的思路:用一個圖片在候選列表里出現的次數越多,就表示用戶越喜歡這張圖,如果用戶不喜歡某一張圖,直接將這張圖從列表里刪除。由於,一般來說常用的終端就是powershell,cmd 和 wsl,需要具體指向特定的窗口。這部分在like.cpp和dislike.cpp中實現。
-
開機自啟和方便調用很容易就可以在系統里設置。
背景圖片修改
打開Windows Terminal后,'Ctrl + ,'打開settings.json文件。其中"profiles"中的"list"部分,每一個大括號中添加:
"acrylicOpacity": 0.85,
"useAcrylic": true,
"backgroundImage": "Background Image Path", // D://A.jpg
"backgroundImageOpacity": 0.25,
"backgroundImageStretchMode": "fill"
我本地的 settings.json 路徑為:
C:\Users\Username\AppData\Local\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json
只需要通過,修改settings.json中"backgroundImage"的路徑即可實現修改背景。
candidatesList初始化
為了方便, candidatesList.txt 的格式如下:
"backgroundImage": "C:\\WhiteAlbum\\1.jpg",
"backgroundImage": "C:\\WhiteAlbum\\2.jpg",
"backgroundImage": "C:\\WhiteAlbum\\3.jpg",
...
"backgroundImage": "C:\\WhiteAlbum\\223.jpg",
每一行是對應的圖片文件路徑,可以不編號為數字。可以手動添加,也可使用一些方法遍歷目錄下的所有文件,來初始化 candidatesList.txt,這里不多贅述。
背景圖片更新實現
實現 changeWindowsTerminalBackground.cpp
#include <bits/stdc++.h>
using namespace std;
#define MAX_VSTR 223
string vstr[MAX_VSTR];
string randBackgroundImage() { // 隨機一張圖片
// candidatesList.txt 絕對路徑
ifstream fin("D:\\changeWindowsTerminalBackground\\candidatesList.txt");
string str;
int cnt = 0, sum = -1;
while(getline(fin,str)) {
vstr[cnt++] = str;
if(cnt >= MAX_VSTR) cnt = 0, sum = MAX_VSTR;
}
fin.close();
if(sum == -1) sum = cnt;
return vstr[rand()%sum];
}
int main(int argv, char * argc[]) {
srand(time(0));
if(argv == 1) {
// settings.json 絕對路徑
ifstream fin("C:\\Users\\Username\\AppData\\Local\\Packages\\Microsoft.WindowsTerminal_8wekyb3d8bbwe\\LocalState\\settings.json");
string str, res;
while(getline(fin,str)) {
if( str.find("\"backgroundImage\": ") != str.npos ) {
str = randBackgroundImage();
}
res += str;
res += "\n";
}
fin.close();
ofstream fout("C:\\Users\\Username\\AppData\\Local\\Packages\\Microsoft.WindowsTerminal_8wekyb3d8bbwe\\LocalState\\settings.json");
fout << res;
fout.close();
}
else {
for(int i = 1; i < argv; ++ i) {
string block = argc[i];
ifstream fin("C:\\Users\\Username\\AppData\\Local\\Packages\\Microsoft.WindowsTerminal_8wekyb3d8bbwe\\LocalState\\settings.json");
string str, res;
int inBlock = 0, isChanged = 0;
while(getline(fin,str)) {
if( str.find(block) != str.npos ) inBlock = 1;
if( !isChanged && inBlock && str.find("\"backgroundImage\": ") != str.npos ) {
str = randBackgroundImage();
isChanged = 1;
}
res += str;
res += "\n";
}
fin.close();
ofstream fout("C:\\Users\\Username\\AppData\\Local\\Packages\\Microsoft.WindowsTerminal_8wekyb3d8bbwe\\LocalState\\settings.json");
fout << res;
fout.close();
}
}
}
編譯及使用方法為:
g++ -o changeWTBK .\changeWindowsTerminalBackground.cpp -std=c++11
changeWTBK // 更新3個終端的圖片
changeWTBK cmd // 更新cmd終端的圖片
changeWTBK cmd powershell // 更新cmd和powershell終端的圖片
changeWTBK cmd powershell wsl // 更新wsl,cmd和powershell終端的圖片
其余組合方法類似
評價機制實現
like.cpp 實現將對應終端中當前的圖片加入candidateList.txt
#include <bits/stdc++.h>
using namespace std;
int main(int argv, char * argc[]) {
if(argv == 1) {
ifstream fin("C:\\Users\\Username\\AppData\\Local\\Packages\\Microsoft.WindowsTerminal_8wekyb3d8bbwe\\LocalState\\settings.json");
ofstream fout("D:\\changeWindowsTerminalBackground\\candidatesList.txt",ios::app);
string str, res;
while(getline(fin,str)) {
if( str.find("\"backgroundImage\": ") != str.npos ) {
fout << str << endl;
}
}
fin.close();
fout.close();
}
else {
for(int i = 1; i < argv; ++ i) {
string block = argc[i];
ifstream fin("C:\\Users\\Username\\AppData\\Local\\Packages\\Microsoft.WindowsTerminal_8wekyb3d8bbwe\\LocalState\\settings.json");
ofstream fout("D:\\changeWindowsTerminalBackground\\candidatesList.txt",ios::app);
string str;
int inBlock = 0, isChanged = 0;
while(getline(fin,str)) {
if( str.find(block) != str.npos ) inBlock = 1;
if( !isChanged && inBlock && str.find("\"backgroundImage\": ") != str.npos ) {
fout << str << endl;
isChanged = 1;
}
}
fin.close();
fout.close();
}
}
}
編譯及使用方法為:
g++ -o LIKE .\like.cpp -std=c++11
LIKE // 3個終端的圖片都加入candidateList.txt
LIKE cmd // cmd終端的圖片加入candidateList.txt
LIKE cmd powershell // cmd和powershell終端的圖片加入candidateList.txt
LIKE cmd powershell wsl // wsl,cmd和powershell終端的圖片加入candidateList.txt
其余組合方法類似
dislike.cpp 實現將對應終端中當前的圖片從candidateList.txt中刪除
#include <bits/stdc++.h>
using namespace std;
vector<string> del;
int main(int argv, char * argc[]) {
if(argv == 1) {
ifstream fin("C:\\Users\\Username\\AppData\\Local\\Packages\\Microsoft.WindowsTerminal_8wekyb3d8bbwe\\LocalState\\settings.json");
string str, res;
while(getline(fin,str)) {
if( str.find("\"backgroundImage\": ") != str.npos ) {
del.push_back(str);
}
}
fin.close();
}
else {
for(int i = 1; i < argv; ++ i) {
string block = argc[i];
ifstream fin("C:\\Users\\Username\\AppData\\Local\\Packages\\Microsoft.WindowsTerminal_8wekyb3d8bbwe\\LocalState\\settings.json");
string str;
int inBlock = 0, isChanged = 0;
while(getline(fin,str)) {
if( str.find(block) != str.npos ) inBlock = 1;
if( !isChanged && inBlock && str.find("\"backgroundImage\": ") != str.npos ) {
del.push_back(str);
isChanged = 1;
}
}
fin.close();
}
}
ifstream fin("D:\\changeWindowsTerminalBackground\\candidatesList.txt",ios::app);
string str,res;
while(getline(fin,str)) {
int flag = 0;
for(auto A: del) if(str.find(A) != str.npos) flag = 1;
if(!flag) res += str, res += "\n";
}
fin.close();
ofstream fout("D:\\changeWindowsTerminalBackground\\candidatesList.txt");
fout << res;
fout.close();
}
編譯及使用方法為:
g++ -o DISLIKE .\dislike.cpp -std=c++11
DISLIKE // 3個終端的圖片都從candidateList.txt刪去
DISLIKE cmd // cmd終端的圖片從candidateList.txt刪去
DISLIKE cmd powershell // cmd和powershell終端的圖片從candidateList.txt刪去
DISLIKE cmd powershell wsl // wsl,cmd和powershell終端的圖片從candidateList.txt刪去
其余組合方法類似
其他設置
我們希望每次開機,都會有不同的背景。因此將changeWTBK設為開機啟動項,具體方法是:
將 changeWTBK的快捷方式移到 USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 中。
同時我們希望調用更加方便,因此可以將changeWTBK,LIKE,DISLIKE所在的目錄加入環境變量。
效果實現
以powershell為例,當前界面如下:
運行changeWTBK后,界面更新為:
改進思路
如果有下一版的話,一方面,考慮實現爬取圖片,進一步擴大圖片的規模,不用本地提供Album;另一方面,針對用戶的喜好的圖片的推薦功能,更加智能一些。