diff options
author | Aaron Plattner <aplattner@nvidia.com> | 2013-02-04 16:05:11 -0800 |
---|---|---|
committer | Aaron Plattner <aplattner@nvidia.com> | 2013-02-06 09:58:40 -0800 |
commit | a93b77b15fa2463c7fd06c6898b9c9f737c3ae8a (patch) | |
tree | 88370d06cbb5dc070570ed9fd231ef7affae1da0 | |
parent | 8ce9d1fa48a7556e9aee090e5d72566dbb9a32f8 (diff) |
xrandr: make providers a first-class citizen
Create a struct _provider to match the existing output, crtc, etc. objects.
Build that from a new get_providers() function. Use that to populate the list
when querying the providers.
Signed-off-by: Aaron Plattner <aplattner@nvidia.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
-rw-r--r-- | xrandr.c | 62 |
1 files changed, 51 insertions, 11 deletions
@@ -2,6 +2,7 @@ * Copyright © 2001 Keith Packard, member of The XFree86 Project, Inc. * Copyright © 2002 Hewlett Packard Company, Inc. * Copyright © 2006 Intel Corporation + * Copyright © 2013 NVIDIA Corporation * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -49,7 +50,6 @@ static int screen = -1; static Bool verbose = False; static Bool automatic = False; static Bool properties = False; -static Bool providers = False; static Bool grab_server = True; static Bool no_primary = False; @@ -289,6 +289,7 @@ typedef struct _output output_t; typedef struct _transform transform_t; typedef struct _umode umode_t; typedef struct _output_prop output_prop_t; +typedef struct _provider provider_t; struct _transform { XTransform transform; @@ -377,6 +378,11 @@ struct _umode { name_t name; }; +struct _provider { + name_t provider; + XRRProviderInfo *info; +}; + static const char *connection[3] = { "connected", "disconnected", @@ -398,8 +404,9 @@ static const char *connection[3] = { static output_t *outputs = NULL; static output_t **outputs_tail = &outputs; static crtc_t *crtcs; +static provider_t *providers; static umode_t *umodes; -static int num_crtcs; +static int num_crtcs, num_providers; static XRRScreenResources *res; static int fb_width = 0, fb_height = 0; static int fb_width_mm = 0, fb_height_mm = 0; @@ -409,6 +416,7 @@ static Bool dryrun = False; static int minWidth, maxWidth, minHeight, maxHeight; static Bool has_1_2 = False; static Bool has_1_3 = False; +static Bool has_1_4 = False; static int provider_xid, output_source_provider_xid, offload_sink_provider_xid; static int @@ -2367,6 +2375,34 @@ print_output_property_value(Bool is_edid, printf ("?"); } +static void +get_providers (void) +{ + XRRProviderResources *pr; + int i; + + if (!has_1_4) + return; + + pr = XRRGetProviderResources(dpy, root); + num_providers = pr->nproviders; + providers = calloc (num_providers, sizeof (provider_t)); + if (!providers) + fatal ("out of memory\n"); + + for (i = 0; i < num_providers; i++) { + provider_t *provider = &providers[i]; + name_t *name = &provider->provider; + XRRProviderInfo *info = XRRGetProviderInfo(dpy, res, pr->providers[i]); + + provider->info = info; + set_name_xid (name, pr->providers[i]); + set_name_index (name, i); + set_name_string (name, info->name); + } + + XRRFreeProviderResources(pr); +} int @@ -2404,6 +2440,7 @@ main (int argc, char **argv) Bool modeit = False; Bool propit = False; Bool query_1 = False; + Bool list_providers = False; Bool provsetoutsource = False; Bool provsetoffsink = False; int major, minor; @@ -2912,7 +2949,7 @@ main (int argc, char **argv) } if (!strcmp ("--listproviders", argv[i])) { - providers = True; + list_providers = True; action_requested = True; continue; } @@ -2986,6 +3023,8 @@ main (int argc, char **argv) has_1_2 = True; if (major > 1 || (major == 1 && minor >= 3)) has_1_3 = True; + if (major > 1 || (major == 1 && minor >= 4)) + has_1_4 = True; if (has_1_2 && modeit) { @@ -3543,23 +3582,24 @@ main (int argc, char **argv) } exit (0); } - if (providers) { - XRRProviderResources *providers; + if (list_providers) { int k; get_screen (current); - providers = XRRGetProviderResources(dpy, root); + get_providers (); + if (providers) { - printf("Providers: number : %d\n", providers->nproviders); + printf("Providers: number : %d\n", num_providers); + + for (j = 0; j < num_providers; j++) { + provider_t *provider = &providers[j]; + XRRProviderInfo *info = provider->info; - for (j = 0; j < providers->nproviders; j++) { - XRRProviderInfo *info = XRRGetProviderInfo(dpy, res, providers->providers[j]); - printf("Provider %d: id: %d cap: 0x%x", j, (int)providers->providers[j], info->capabilities); + printf("Provider %d: id: %d cap: 0x%x", j, (int)provider->provider.xid, info->capabilities); for (k = 0; k < 4; k++) if (info->capabilities & (1 << k)) printf(", %s", capability_name(1<<k)); printf(" crtcs: %d outputs: %d associated providers: %d name:%s\n", info->ncrtcs, info->noutputs, info->nassociatedproviders, info->name); - XRRFreeProviderInfo(info); } } } |