#include #include #include #include #include using namespace std; using namespace kms; static const char* usage_str = "Usage: kmsblank [OPTION]...\n\n" "Blank screen(s)\n\n" "Options:\n" " --device=DEVICE DEVICE is the path to DRM card to open\n" " -c, --connector=CONN CONN is \n" " -t, --time=TIME blank/unblank in TIME intervals\n" "\n" " can be given by index () or id (@).\n" " can also be given by name.\n" ; static void usage() { puts(usage_str); } int main(int argc, char **argv) { string dev_path = "/dev/dri/card0"; vector conn_strs; uint32_t time = 0; OptionSet optionset = { Option("|device=", [&dev_path](string s) { dev_path = s; }), Option("c|connector=", [&conn_strs](string str) { conn_strs.push_back(str); }), Option("t|time=", [&time](string str) { time = stoul(str); }), Option("h|help", []() { usage(); exit(-1); }), }; optionset.parse(argc, argv); if (optionset.params().size() > 0) { usage(); exit(-1); } Card card(dev_path); vector conns; if (conn_strs.size() > 0) { for (string s : conn_strs) { auto c = resolve_connector(card, s); if (!c) EXIT("Failed to resolve connector '%s'", s.c_str()); conns.push_back(c); } } else { conns = card.get_connectors(); } bool blank = true; while (true) { for (Connector* conn : conns) { if (!conn->connected()) { printf("Connector %u not connected\n", conn->idx()); continue; } printf("Connector %u: %sblank\n", conn->idx(), blank ? "" : "un"); int r = conn->set_prop_value("DPMS", blank ? 3 : 0); if (r) EXIT("Failed to set DPMS: %d", r); } if (time == 0) break; usleep(1000 * time); blank = !blank; } printf("press enter to exit\n"); getchar(); }