On 2015-02-10 12:09:05, Chad Versace wrote:
> > On Sun, Feb 08, 2015 at 07:50:15PM -0500, Frank Henigman wrote:
> >> I'd like to extend wflinfo so it can print platform-specific
> >> information and eventually be able to replace glxinfo, eglinfo and the
> >> like (I only know what's on linux). There would be a new flag to
> >> request the platform-specific output in addition to the existing
> >> output. For example on glx you'd see glx extensions, on egl you'd see
> >> egl extensions.
> >> I've started two different implementations and I'd like to know which
> >> is preferred before I go any farther. Or if there's a better idea
> >> than either of my approaches. I've dubbed the two approaches "native"
> >> and "core."
> >>
> >> native
> >> - all the work is done in wflinfo, no changes to waffle api
> >> - use waffle_display_get_native() to access platform-specific stuff
> >> - pro: changes limited to wflinfo, doesn't clutter up the rest of waffle
> >> - con: some duplicate code to open libraries and lookup symbols
> >> - https://github.com/fjhenigman/waffle/tree/ps_native
> >>
> >> core
> >> - add waffle_display_print_info() to waffle api
> >> - add print_info() method to each platform
> >> - pro: less code, no duplication
> >> - con (perhaps): some wflinfo functionality is now in core waffle
> >> - https://github.com/fjhenigman/waffle/tree/ps_core
> >>
> >> I'm leaning toward "core" because there is less code. We get to
> >> leverage the platform libraries and functions already stored in waffle
> >> platform structs. But if the consensus is it's cleaner to keep this
> >> stuff in wflinfo I'm ok with that too.
>
> I prefer "core" too. Not for the sake of less code, but because I like
> the idea of it being available as core API.
This surprised me a bit. I wouldn't think of the waffle library
wanting to embed a bunch of strings to fulfill such an API.
Anyway... how about this:
char**
waffle_display_info_strings(struct waffle_display *self, bool verbose);
The returned array of strings could have this property:
First look for a key string pointer. If it is NULL, then you are done.
If you find non-NULL key string pointer then search for 0 or more
non-NULL value string pointers. When a NULL pointer is seen, go back
to looking for a key string pointer.
I've attached an example program that sort of emulates wflinfo...
This would allow the consumer to use comma separation and/or line
breaks as desired.
-Jordan
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
/* Prints:
*
* key0:
* key1: value1
* key2: value2.0 value2.1
*/
struct waffle_display {
void *for_example_purposes;
};
char**
waffle_display_info_strings(struct waffle_display *self, bool verbose)
{
static char *strings[] = {
"key0",
NULL, /* No value items */
"key1",
"value1",
NULL, /* One value item */
"key2",
"value2.0",
"value2.1",
NULL, /* Two value items */
NULL /* End of strings */
};
char **retval = malloc(sizeof strings);
memcpy(retval, strings, sizeof strings);
return retval;
}
void
emulate_wflinfo(struct waffle_display *dpy)
{
char **strings, **pos;
strings = waffle_display_info_strings(dpy, true);
/* maybe this indicates an error? */
if (strings == NULL)
return;
for (pos = strings; *pos != NULL;) {
/* first string pointer is a key */
printf("%s:", *pos++);
/* followed by 0 or more value strings associated with the key */
for (;;) {
char *value = *pos++;
if (value == NULL) {
printf("\n");
break;
} else {
printf(" %s", value);
}
}
}
/* the entire set of string pointers and string data can be
* freed together
*/
free(strings);
}
int
main(int argc, char **argv)
{
emulate_wflinfo(NULL);
}
_______________________________________________
waffle mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/waffle