summaryrefslogtreecommitdiff
path: root/randr/rrlease.c
diff options
context:
space:
mode:
Diffstat (limited to 'randr/rrlease.c')
-rw-r--r--randr/rrlease.c27
1 files changed, 23 insertions, 4 deletions
diff --git a/randr/rrlease.c b/randr/rrlease.c
index 11ba96f24..cb366e767 100644
--- a/randr/rrlease.c
+++ b/randr/rrlease.c
@@ -239,9 +239,19 @@ ProcRRCreateLease(ClientPtr client)
if (!scr_priv)
return BadMatch;
- if (!scr_priv->rrCreateLease)
+ if (!scr_priv->rrCreateLease && !scr_priv->rrRequestLease)
return BadMatch;
+ if (scr_priv->rrGetLease) {
+ scr_priv->rrGetLease(client, screen, &lease, &fd);
+ if (lease) {
+ if (fd >= 0)
+ goto leaseReturned;
+ else
+ goto bail_lease;
+ }
+ }
+
/* Allocate a structure to hold all of the lease information */
lease = RRLeaseAlloc(screen, stuff->lid, stuff->nCrtcs, stuff->nOutputs);
@@ -291,10 +301,19 @@ ProcRRCreateLease(ClientPtr client)
lease->outputs[o] = output;
}
- rc = scr_priv->rrCreateLease(screen, lease, &fd);
- if (rc != Success)
- goto bail_lease;
+ if (scr_priv->rrRequestLease) {
+ rc = scr_priv->rrRequestLease(client, screen, lease);
+ if (rc == Success)
+ return Success;
+ else
+ goto bail_lease;
+ } else {
+ rc = scr_priv->rrCreateLease(screen, lease, &fd);
+ if (rc != Success)
+ goto bail_lease;
+ }
+leaseReturned:
xorg_list_add(&lease->list, &scr_priv->leases);
if (!AddResource(stuff->lid, RRLeaseType, lease)) {