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

Reply via email to