diff options
| -rw-r--r-- | utils/CMakeLists.txt | 3 | ||||
| -rw-r--r-- | utils/kmsblank.cpp | 104 | 
2 files changed, 107 insertions, 0 deletions
| diff --git a/utils/CMakeLists.txt b/utils/CMakeLists.txt index 232c674..27e4bec 100644 --- a/utils/CMakeLists.txt +++ b/utils/CMakeLists.txt @@ -15,3 +15,6 @@ target_link_libraries(fbtestpat kms++util)  add_executable (kmscapture kmscapture.cpp)  target_link_libraries(kmscapture kms++ kms++util ${LIBDRM_LIBRARIES}) + +add_executable (kmsblank kmsblank.cpp) +target_link_libraries(kmsblank kms++ kms++util ${LIBDRM_LIBRARIES}) diff --git a/utils/kmsblank.cpp b/utils/kmsblank.cpp new file mode 100644 index 0000000..8b883bb --- /dev/null +++ b/utils/kmsblank.cpp @@ -0,0 +1,104 @@ +#include <stdio.h> +#include <unistd.h> +#include <algorithm> + +#include <kms++.h> +#include <kms++util.h> +#include "opts.h" + +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 <connector>\n" +		"  -t, --time=TIME           blank/unblank in TIME intervals\n" +		"\n" +		"<connector> can be given by index (<idx>) or id (@<id>).\n" +		"<connector> 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<string> 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<Connector*> 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(); +} | 
