Release v0.6.57: multi-PC input, shared clipboard and resilient Settings Save

This commit is contained in:
agrynco committed 2026-11-06 21:33:37 +02:00
1 parent 82292c8a7e
commit 5de010ee44
39 files changed
+1707 -312

No files matched your search

+48
View File
@@ -114,6 +114,54 @@ int main(int argc,char **argv)
check(request(restored,{{"action","status"}})["peers"].empty(),"forget removes offline pair");
check(!request(restored,{{"action","status"}}).at("shareInput").get<bool>(),"forgetting the input peer revokes persisted input permission");
}
if(argc>1&&std::string(argv[1])=="--network")
{
auto saved=Json::parse(unprotect(readFile(root/L"lan-pairing.bin",256*1024)));
saved["trusted"][b]={{"name","Restart peer"},{"key",left.derived}};
saved["enabled"]=true;saved["shareInput"]=true;saved["inputPeer"]=b;saved["inputEdge"]=3;
auto text=saved.dump();atomicWrite(root/L"lan-pairing.bin",protect(Bytes(text.begin(),text.end())));
for(int restart=0;restart<2;++restart)
{
LanService restored(root);Sleep(100);
auto state=request(restored,{{"action","status"}});
check(restored.inputEnabled()&&state.at("enabled")==true&&state.at("inputPeer")==b&&state.at("inputEdge")==3,
"restart restores discovery, pairing, input permission and screen edge without opening settings");
}
}
{
auto folder=root/L"layout";std::filesystem::create_directories(folder);
auto saved=Json::parse(unprotect(readFile(root/L"lan-pairing.bin",256*1024)));
saved["enabled"]=false;saved["shareInput"]=false;saved["inputPeer"]=b;saved["inputEdge"]=1;saved.erase("positions");
saved["trusted"]={{b,{{"name","Right PC"},{"key",left.derived}}},{c,{{"name","Third PC"},{"key",left.derived}}}};
auto text=saved.dump();atomicWrite(folder/L"lan-pairing.bin",protect(Bytes(text.begin(),text.end())));
{
LanService layout(folder);auto state=request(layout,{{"action","status"}});
check(state["positions"][b]==Json::array({1,0}),"legacy side migrates to monitor grid");
check(state["positions"].size()==2&&state["positions"][c]!=state["positions"][b],"three-PC layout has unique cells");
request(layout,{{"action","position"},{"peer",c},{"x",-1},{"y",0}});
request(layout,{{"action","position"},{"peer",b},{"x",0},{"y",-1}});
rejects([&]{request(layout,{{"action","position"},{"peer",c},{"x",0},{"y",-1}});},"occupied cell rejected");
rejects([&]{request(layout,{{"action","position"},{"peer",c},{"x",0},{"y",0}});},"local monitor cell protected");
rejects([&]{request(layout,{{"action","position"},{"peer",c},{"x",9},{"y",0}});},"out-of-grid position rejected");
check(request(layout,{{"action","status"}})["positions"][c]==Json::array({-1,0}),"failed drops preserve previous position");
}
{
LanService layout(folder);auto state=request(layout,{{"action","status"}});
check(state["positions"][b]==Json::array({0,-1})&&state["positions"][c]==Json::array({-1,0}),"all monitor positions survive restart");
check(state["inputEdge"]==2,"active peer direction follows monitor position");
if(argc>1&&std::string(argv[1])=="--network"){
request(layout,{{"action","enable"},{"enabled",true}});
request(layout,{{"action","input"},{"enabled",true}});
request(layout,{{"action","position"},{"peer",c},{"x",0},{"y",-2}});
auto multi=request(layout,{{"action","status"}});
check(multi["shareInput"]==true&&multi["positions"][c]==Json::array({0,-2}),"multi-PC sharing remains enabled for a chained nonadjacent destination");
request(layout,{{"action","forget"},{"peer",b}});
check(request(layout,{{"action","status"}})["shareInput"]==true,"forgetting legacy selected pair keeps remaining pairs enabled");
}
request(layout,{{"action","forget"},{"peer",c}});
check(!request(layout,{{"action","status"}})["positions"].contains(c),"forgetting pair removes its monitor");
}
}
std::cout<<"Passed "<<passed<<" LAN discovery/pairing checks\n";
}
catch(const std::exception &e){std::cerr<<"FAIL: "<<e.what()<<'\n';return 1;}