From: Kristian Høgsberg <[email protected]> Useful for XWayland and other hosted compositors.
Signed-off-by: Kristian Høgsberg <[email protected]> --- dix/selection.c | 44 ++++++++++++++++++++++++++++---------------- include/selection.h | 3 +++ 2 files changed, 31 insertions(+), 16 deletions(-) diff --git a/dix/selection.c b/dix/selection.c index e905b1e..fca89ee 100644 --- a/dix/selection.c +++ b/dix/selection.c @@ -86,6 +86,33 @@ dixLookupSelection(Selection ** result, Atom selectionName, return rc; } +int +AddSelection(Selection ** result, Atom name, ClientPtr client) +{ + Selection *pSel; + int rc; + + pSel = dixAllocateObjectWithPrivates(Selection, PRIVATE_SELECTION); + if (!pSel) + return BadAlloc; + + pSel->selection = name; + + /* security creation/labeling check */ + rc = XaceHookSelectionAccess(client, &pSel, + DixCreateAccess | DixSetAttrAccess); + if (rc != Success) { + dixFreeObjectWithPrivates(pSel, PRIVATE_SELECTION); + return rc; + } + + pSel->next = CurrentSelections; + CurrentSelections = pSel; + *result = pSel; + + return Success; +} + void InitSelections(void) { @@ -194,22 +221,7 @@ ProcSetSelectionOwner(ClientPtr client) /* * It doesn't exist, so add it... */ - pSel = dixAllocateObjectWithPrivates(Selection, PRIVATE_SELECTION); - if (!pSel) - return BadAlloc; - - pSel->selection = stuff->selection; - - /* security creation/labeling check */ - rc = XaceHookSelectionAccess(client, &pSel, - DixCreateAccess | DixSetAttrAccess); - if (rc != Success) { - free(pSel); - return rc; - } - - pSel->next = CurrentSelections; - CurrentSelections = pSel; + rc = AddSelection(&pSel, stuff->selection, client); } else return rc; diff --git a/include/selection.h b/include/selection.h index 37e4f5e..2e11c4f 100644 --- a/include/selection.h +++ b/include/selection.h @@ -71,6 +71,9 @@ typedef struct _Selection { extern _X_EXPORT int dixLookupSelection(Selection ** result, Atom name, ClientPtr client, Mask access_mode); +extern _X_EXPORT int AddSelection(Selection ** result, + Atom name, ClientPtr client); + extern _X_EXPORT Selection *CurrentSelections; extern _X_EXPORT CallbackListPtr SelectionCallback; -- 1.7.10.4 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
