diff options
Diffstat (limited to 'randr')
-rw-r--r-- | randr/randrstr.h | 12 | ||||
-rw-r--r-- | randr/rrlease.c | 27 |
2 files changed, 35 insertions, 4 deletions
diff --git a/randr/randrstr.h b/randr/randrstr.h index b23390575..173ecdf4e 100644 --- a/randr/randrstr.h +++ b/randr/randrstr.h @@ -280,6 +280,15 @@ typedef int (*RRCreateLeaseProcPtr)(ScreenPtr screen, typedef void (*RRTerminateLeaseProcPtr)(ScreenPtr screen, RRLeasePtr lease); +typedef int (*RRRequestLeaseProcPtr)(ClientPtr client, + ScreenPtr screen, + RRLeasePtr lease); + +typedef void (*RRGetLeaseProcPtr)(ClientPtr client, + ScreenPtr screen, + RRLeasePtr *lease, + int *fd); + /* These are for 1.0 compatibility */ typedef struct _rrRefresh { @@ -408,6 +417,9 @@ typedef struct _rrScrPriv { RRMonitorPtr *monitors; struct xorg_list leases; + + RRRequestLeaseProcPtr rrRequestLease; + RRGetLeaseProcPtr rrGetLease; } rrScrPrivRec, *rrScrPrivPtr; extern _X_EXPORT DevPrivateKeyRec rrPrivKeyRec; 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)) { |