aboutsummaryrefslogtreecommitdiffstats
path: root/monitor-get-edid.c
diff options
context:
space:
mode:
Diffstat (limited to 'monitor-get-edid.c')
-rw-r--r--monitor-get-edid.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/monitor-get-edid.c b/monitor-get-edid.c
index 41e0e5d..5e4a549 100644
--- a/monitor-get-edid.c
+++ b/monitor-get-edid.c
@@ -7,6 +7,8 @@
#include <fcntl.h>
#include <errno.h>
#include <stdarg.h>
+#include <sys/ioctl.h>
+#include <sys/vt.h>
#include "get-edid.h"
int verbose = 0;
@@ -14,17 +16,39 @@ int verbose = 0;
int main(int argc, char **argv)
{
char edid[256];
+ int try_in_console = 0;
int i;
for (i = 1; i < argc; i++)
if (strcmp(argv[i], "-v") == 0) verbose = 1;
+ else if (strcmp(argv[i], "--try-in-console") == 0) try_in_console = 1;
else if (strcmp(argv[i], "-h") == 0 ||
strcmp(argv[i], "--help") == 0) {
printf("usage: monitor-get-edid [-v]\n");
exit(1);
}
- int size = get_edid(edid);
+ int size = 0 && get_edid(edid);
+
+ if (!size && try_in_console) {
+ int non_X_console = 1;
+ int first_X_console = 7;
+ struct vt_stat current;
+ int fd = open("/dev/console", O_RDWR);
+
+ if (ioctl(fd, VT_GETSTATE, &current) == 0 &&
+ current.v_state >= first_X_console &&
+ ioctl(fd, VT_ACTIVATE, non_X_console) == 0 &&
+ ioctl(fd, VT_WAITACTIVE, non_X_console) == 0) {
+ /* retrying */
+ size = get_edid(edid);
+
+ /* restore */
+ ioctl(fd, VT_ACTIVATE, current.v_active) == 0 &&
+ ioctl(fd, VT_WAITACTIVE, current.v_active) == 0;
+ }
+ close(fd);
+ }
if (size) write(1, edid, size);