diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2015-02-02 02:58:59 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2015-02-02 02:58:59 +0100 |
commit | 8067368e10330a67550f9e3ee353da858266a6eb (patch) | |
tree | da29460c6810b48ee67b2d330c04a22a3ab35379 /sys/src/cmd/aux/vga/db.c | |
parent | e34fa15921cd76d78e7adc28e471204de036d66a (diff) |
aux/vga: use optional edid information to determine mode when vgadb fails
igfx and vesa can determine monitor timing information from ddc
and store the edid info for connected monitors in vga->edid[].
when monitor type cannot be found in vgadb, we consult the edid
information and make a mode based on the edid info.
this avoids having to maintain a vgadb entry for each monitor.
monitor can be set to "[width]x[height]@[freq]Hz" for a specific
edid setting. when not found, a mode is searched based on the
size.
so the following should work:
aux/vga -m 1366x768@60Hz -l 1366x768x32
aux/vga -m auto -l 1366x768x32
Diffstat (limited to 'sys/src/cmd/aux/vga/db.c')
-rw-r--r-- | sys/src/cmd/aux/vga/db.c | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/sys/src/cmd/aux/vga/db.c b/sys/src/cmd/aux/vga/db.c index e8227443e..2602001bf 100644 --- a/sys/src/cmd/aux/vga/db.c +++ b/sys/src/cmd/aux/vga/db.c @@ -16,20 +16,35 @@ dbopen(char* dbname) return db; } +Attr* +mkattr(Attr *tail, char *attr, char *fmt, ...) +{ + char val[1024]; + va_list list; + Attr *a; + + va_start(list, fmt); + snprint(val, sizeof(val), fmt, list); + va_end(list); + + a = alloc(sizeof(Attr)); + a->attr = alloc(strlen(attr)+1); + strcpy(a->attr, attr); + a->val = alloc(strlen(val)+1); + strcpy(a->val, val); + a->next = tail; + + return a; +} + static void addattr(Attr** app, Ndbtuple* t) { - Attr *attr, *l; - - attr = alloc(sizeof(Attr)); - attr->attr = alloc(strlen(t->attr)+1); - strcpy(attr->attr, t->attr); - attr->val = alloc(strlen(t->val)+1); - strcpy(attr->val, t->val); + Attr *l; for(l = *app; l; l = l->next) app = &l->next; - *app = attr; + *app = mkattr(nil, t->attr, "%s", t->val); } char* @@ -40,7 +55,6 @@ dbattr(Attr* ap, char* attr) return ap->val; ap = ap->next; } - return 0; } |