diff options
author | Robert Bragg <robert@linux.intel.com> | 2013-01-21 01:18:25 +0000 |
---|---|---|
committer | Robert Bragg <robert@linux.intel.com> | 2013-01-30 19:57:22 +0000 |
commit | 013548c10915928f22cc3def1a63d3aed29f9075 (patch) | |
tree | ae8a22e6120edad2717e3c0c86ab67e5641a853f | |
parent | 88d8bd84f2baa121584304977a80d42eb79330e3 (diff) | |
download | cogl-013548c10915928f22cc3def1a63d3aed29f9075.tar.gz |
renderer: expose CoglOutputs
This adds a cogl_renderer_foreach_output() function that can be used to
iterate the display outputs for a particular renderer.
This also updates cogl-info to use this new api so it can dump out all
the output information.
Reviewed-by: Owen W. Taylor <otaylor@fishsoup.net>
(cherry picked from commit a2abf4c4c1fd5aeafd761f965d07a0fe9a362afc)
-rw-r--r-- | cogl/cogl-renderer.c | 14 | ||||
-rw-r--r-- | cogl/cogl-renderer.h | 34 | ||||
-rw-r--r-- | cogl/cogl.h | 1 | ||||
-rw-r--r-- | examples/cogl-info.c | 59 |
4 files changed, 108 insertions, 0 deletions
diff --git a/cogl/cogl-renderer.c b/cogl/cogl-renderer.c index 1518a176..401cfd50 100644 --- a/cogl/cogl-renderer.c +++ b/cogl/cogl-renderer.c @@ -631,3 +631,17 @@ cogl_renderer_get_driver (CoglRenderer *renderer) return renderer->driver; } + +void +cogl_renderer_foreach_output (CoglRenderer *renderer, + CoglOutputCallback callback, + void *user_data) +{ + GList *l; + + _COGL_RETURN_IF_FAIL (renderer->connected); + _COGL_RETURN_IF_FAIL (callback != NULL); + + for (l = renderer->outputs; l; l = l->next) + callback (l->data, user_data); +} diff --git a/cogl/cogl-renderer.h b/cogl/cogl-renderer.h index c7933250..45a8d742 100644 --- a/cogl/cogl-renderer.h +++ b/cogl/cogl-renderer.h @@ -31,6 +31,7 @@ #include <cogl/cogl-types.h> #include <cogl/cogl-onscreen-template.h> #include <cogl/cogl-error.h> +#include <cogl/cogl-output.h> COGL_BEGIN_DECLS @@ -383,6 +384,39 @@ cogl_renderer_set_driver (CoglRenderer *renderer, CoglDriver cogl_renderer_get_driver (CoglRenderer *renderer); +/** + * CoglOutputCallback: + * @output: The current display output being iterated + * @user_data: The user pointer passed to + * cogl_renderer_foreach_output() + * + * A callback type that can be passed to + * cogl_renderer_foreach_output() for iterating display outputs for a + * given renderer. + * + * Since: 1.14 + * Stability: Unstable + */ +typedef void (*CoglOutputCallback) (CoglOutput *output, void *user_data); + +/** + * cogl_renderer_foreach_output: + * @renderer: A connected #CoglRenderer + * @callback: A #CoglOutputCallback to be called for each display output + * @user_data: A user pointer to be passed to @callback + * + * Iterates all known display outputs for the given @renderer and + * passes a corresponding #CoglOutput pointer to the given @callback + * for each one, along with the given @user_data. + * + * Since: 1.14 + * Stability: Unstable + */ +void +cogl_renderer_foreach_output (CoglRenderer *renderer, + CoglOutputCallback callback, + void *user_data); + COGL_END_DECLS #endif /* __COGL_RENDERER_H__ */ diff --git a/cogl/cogl.h b/cogl/cogl.h index 075345ad..f8b010c7 100644 --- a/cogl/cogl.h +++ b/cogl/cogl.h @@ -77,6 +77,7 @@ #if defined (COGL_ENABLE_EXPERIMENTAL_API) #include <cogl/cogl-swap-chain.h> #include <cogl/cogl-renderer.h> +#include <cogl/cogl-output.h> #include <cogl/cogl-display.h> #include <cogl/cogl-context.h> #include <cogl/cogl-buffer.h> diff --git a/examples/cogl-info.c b/examples/cogl-info.c index 3eacdc39..736f42e5 100644 --- a/examples/cogl-info.c +++ b/examples/cogl-info.c @@ -164,6 +164,58 @@ feature_cb (CoglFeatureID feature, void *user_data) printf (" » Unknown feature %d\n", feature); } +typedef struct _OutputState +{ + int id; +} OutputState; + +static void +output_cb (CoglOutput *output, void *user_data) +{ + OutputState *state = user_data; + const char *order; + float refresh; + + printf (" Output%d:\n", state->id++); + printf (" » position = (%d, %d)\n", + cogl_output_get_x (output), + cogl_output_get_y (output)); + printf (" » resolution = %d x %d\n", + cogl_output_get_width (output), + cogl_output_get_height (output)); + printf (" » physical size = %dmm x %dmm\n", + cogl_output_get_mm_width (output), + cogl_output_get_mm_height (output)); + switch (cogl_output_get_subpixel_order (output)) + { + case COGL_SUBPIXEL_ORDER_UNKNOWN: + order = "unknown"; + break; + case COGL_SUBPIXEL_ORDER_NONE: + order = "non-standard"; + break; + case COGL_SUBPIXEL_ORDER_HORIZONTAL_RGB: + order = "horizontal,rgb"; + break; + case COGL_SUBPIXEL_ORDER_HORIZONTAL_BGR: + order = "horizontal,bgr"; + break; + case COGL_SUBPIXEL_ORDER_VERTICAL_RGB: + order = "vertical,rgb"; + break; + case COGL_SUBPIXEL_ORDER_VERTICAL_BGR: + order = "vertical,bgr"; + break; + } + printf (" » sub pixel order = %s\n", order); + + refresh = cogl_output_get_refresh_rate (output); + if (refresh) + printf (" » refresh = %f Hz\n", refresh); + else + printf (" » refresh = unknown\n"); +} + int main (int argc, char **argv) { @@ -173,6 +225,7 @@ main (int argc, char **argv) CoglError *error = NULL; CoglWinsysID winsys_id; const char *winsys_name; + OutputState output_state; ctx = cogl_context_new (NULL, &error); if (!ctx) { @@ -189,5 +242,11 @@ main (int argc, char **argv) g_print ("Features:\n"); cogl_foreach_feature (ctx, feature_cb, NULL); + g_print ("Outputs:\n"); + output_state.id = 0; + cogl_renderer_foreach_output (renderer, output_cb, &output_state); + if (output_state.id == 0) + printf (" Unknown\n"); + return 0; } |