aboutsummaryrefslogtreecommitdiff
path: root/nx-X11/programs/Xserver/randr/rrproperty.c
diff options
context:
space:
mode:
Diffstat (limited to 'nx-X11/programs/Xserver/randr/rrproperty.c')
-rw-r--r--nx-X11/programs/Xserver/randr/rrproperty.c387
1 files changed, 217 insertions, 170 deletions
diff --git a/nx-X11/programs/Xserver/randr/rrproperty.c b/nx-X11/programs/Xserver/randr/rrproperty.c
index 0bccb0c68..741d0310e 100644
--- a/nx-X11/programs/Xserver/randr/rrproperty.c
+++ b/nx-X11/programs/Xserver/randr/rrproperty.c
@@ -24,33 +24,76 @@
#include "propertyst.h"
#include "swaprep.h"
+static int
+DeliverPropertyEvent(WindowPtr pWin, void *value)
+{
+ xRROutputPropertyNotifyEvent *event = value;
+ RREventPtr *pHead, pRREvent;
+
+#ifndef NXAGENT_SERVER
+ dixLookupResourceByType((void **) &pHead, pWin->drawable.id,
+ RREventType, serverClient, DixReadAccess);
+#else /* !defined(NXAGENT_SERVER) */
+ pHead = (RREventPtr *) LookupIDByType(pWin->drawable.id, RREventType);
+#endif /* !defined(NXAGENT_SERVER) */
+ if (!pHead)
+ return WT_WALKCHILDREN;
+
+ for (pRREvent = *pHead; pRREvent; pRREvent = pRREvent->next) {
+ if (!(pRREvent->mask & RROutputPropertyNotifyMask))
+ continue;
+
+#ifdef NXAGENT_SERVER
+ event->sequenceNumber = pRREvent->client->sequence;
+#endif
+ event->window = pRREvent->window->drawable.id;
+ WriteEventsToClient(pRREvent->client, 1, (xEvent *) event);
+ }
+
+ return WT_WALKCHILDREN;
+}
+
static void
-RRDeliverEvent(ScreenPtr pScreen, xEvent *event, CARD32 mask)
+RRDeliverPropertyEvent(ScreenPtr pScreen, xEvent *event)
{
+ if (!(dispatchException & (DE_RESET | DE_TERMINATE)))
+ WalkTree(pScreen, DeliverPropertyEvent, event);
+}
+static void
+RRDestroyOutputProperty(RRPropertyPtr prop)
+{
+ xfree(prop->valid_values);
+ xfree(prop->current.data);
+ xfree(prop->pending.data);
+ xfree(prop);
+}
+
+static void
+RRDeleteProperty(RROutputRec * output, RRPropertyRec * prop)
+{
+ xRROutputPropertyNotifyEvent event = {
+ .type = RREventBase + RRNotify,
+ .subCode = RRNotify_OutputProperty,
+ .output = output->id,
+ .state = PropertyDelete,
+ .atom = prop->propertyName,
+ .timestamp = currentTime.milliseconds
+ };
+
+ RRDeliverPropertyEvent(output->pScreen, (xEvent *) &event);
+
+ RRDestroyOutputProperty(prop);
}
void
RRDeleteAllOutputProperties(RROutputPtr output)
{
RRPropertyPtr prop, next;
- xRROutputPropertyNotifyEvent event;
for (prop = output->properties; prop; prop = next) {
next = prop->next;
- event.type = RREventBase + RRNotify;
- event.subCode = RRNotify_OutputProperty;
- event.output = output->id;
- event.state = PropertyDelete;
- event.atom = prop->propertyName;
- event.timestamp = currentTime.milliseconds;
- RRDeliverEvent(output->pScreen, (xEvent *) &event,
- RROutputPropertyNotifyMask);
- if (prop->current.data)
- xfree(prop->current.data);
- if (prop->pending.data)
- xfree(prop->pending.data);
- xfree(prop);
+ RRDeleteProperty(output, prop);
}
}
@@ -83,39 +126,17 @@ RRCreateOutputProperty(Atom property)
return prop;
}
-static void
-RRDestroyOutputProperty(RRPropertyPtr prop)
-{
- if (prop->valid_values)
- xfree(prop->valid_values);
- if (prop->current.data)
- xfree(prop->current.data);
- if (prop->pending.data)
- xfree(prop->pending.data);
- xfree(prop);
-}
-
void
RRDeleteOutputProperty(RROutputPtr output, Atom property)
{
- RRPropertyPtr prop, *prev;
- xRROutputPropertyNotifyEvent event;
+ RRPropertyRec *prop, **prev;
for (prev = &output->properties; (prop = *prev); prev = &(prop->next))
- if (prop->propertyName == property)
- break;
- if (prop) {
- *prev = prop->next;
- event.type = RREventBase + RRNotify;
- event.subCode = RRNotify_OutputProperty;
- event.output = output->id;
- event.state = PropertyDelete;
- event.atom = prop->propertyName;
- event.timestamp = currentTime.milliseconds;
- RRDeliverEvent(output->pScreen, (xEvent *) &event,
- RROutputPropertyNotifyMask);
- RRDestroyOutputProperty(prop);
- }
+ if (prop->propertyName == property) {
+ *prev = prop->next;
+ RRDeleteProperty(output, prop);
+ return;
+ }
}
int
@@ -124,10 +145,8 @@ RRChangeOutputProperty(RROutputPtr output, Atom property, Atom type,
void *value, Bool sendevent, Bool pending)
{
RRPropertyPtr prop;
- xRROutputPropertyNotifyEvent event;
rrScrPrivPtr pScrPriv = rrGetScrPriv(output->pScreen);
int size_in_bytes;
- int total_size;
unsigned long total_len;
RRPropertyValuePtr prop_value;
RRPropertyValueRec new_value;
@@ -140,7 +159,7 @@ RRChangeOutputProperty(RROutputPtr output, Atom property, Atom type,
if (!prop) { /* just add to list */
prop = RRCreateOutputProperty(property);
if (!prop)
- return (BadAlloc);
+ return BadAlloc;
add = TRUE;
mode = PropModeReplace;
}
@@ -155,9 +174,9 @@ RRChangeOutputProperty(RROutputPtr output, Atom property, Atom type,
"PropModeReplace" since they will be written over. */
if ((format != prop_value->format) && (mode != PropModeReplace))
- return (BadMatch);
+ return BadMatch;
if ((prop_value->type != type) && (mode != PropModeReplace))
- return (BadMatch);
+ return BadMatch;
new_value = *prop_value;
if (mode == PropModeReplace)
total_len = len;
@@ -167,9 +186,12 @@ RRChangeOutputProperty(RROutputPtr output, Atom property, Atom type,
if (mode == PropModeReplace || len > 0) {
void *new_data = NULL, *old_data = NULL;
- total_size = total_len * size_in_bytes;
- new_value.data = (void *) xalloc(total_size);
- if (!new_value.data && total_size) {
+#ifndef NXAGENT_SERVER
+ new_value.data = xallocarray(total_len, size_in_bytes);
+#else /* !defined(NXAGENT_SERVER) */
+ new_value.data = xalloc(total_len * size_in_bytes);
+#endif /* !defined(NXAGENT_SERVER) */
+ if (!new_value.data && total_len && size_in_bytes) {
if (add)
RRDestroyOutputProperty(prop);
return BadAlloc;
@@ -203,12 +225,12 @@ RRChangeOutputProperty(RROutputPtr output, Atom property, Atom type,
if (pending && pScrPriv->rrOutputSetProperty &&
!pScrPriv->rrOutputSetProperty(output->pScreen, output,
prop->propertyName, &new_value)) {
- if (new_value.data)
- xfree(new_value.data);
- return (BadValue);
+ xfree(new_value.data);
+ if (add)
+ RRDestroyOutputProperty(prop);
+ return BadValue;
}
- if (prop_value->data)
- xfree(prop_value->data);
+ xfree(prop_value->data);
*prop_value = new_value;
}
@@ -225,16 +247,17 @@ RRChangeOutputProperty(RROutputPtr output, Atom property, Atom type,
output->pendingProperties = TRUE;
if (sendevent) {
- event.type = RREventBase + RRNotify;
- event.subCode = RRNotify_OutputProperty;
- event.output = output->id;
- event.state = PropertyNewValue;
- event.atom = prop->propertyName;
- event.timestamp = currentTime.milliseconds;
- RRDeliverEvent(output->pScreen, (xEvent *) &event,
- RROutputPropertyNotifyMask);
- }
- return (Success);
+ xRROutputPropertyNotifyEvent event = {
+ .type = RREventBase + RRNotify,
+ .subCode = RRNotify_OutputProperty,
+ .output = output->id,
+ .state = PropertyNewValue,
+ .atom = prop->propertyName,
+ .timestamp = currentTime.milliseconds
+ };
+ RRDeliverPropertyEvent(output->pScreen, (xEvent *) &event);
+ }
+ return Success;
}
Bool
@@ -265,7 +288,7 @@ RRPostPendingProperties(RROutputPtr output)
pending_value->format == current_value->format &&
pending_value->size == current_value->size &&
!memcmp(pending_value->data, current_value->data,
- pending_value->size))
+ pending_value->size * (pending_value->format / 8)))
continue;
if (RRChangeOutputProperty(output, property->propertyName,
@@ -292,13 +315,21 @@ RRPropertyValuePtr
RRGetOutputProperty(RROutputPtr output, Atom property, Bool pending)
{
RRPropertyPtr prop = RRQueryOutputProperty(output, property);
+ rrScrPrivPtr pScrPriv = rrGetScrPriv(output->pScreen);
if (!prop)
return NULL;
if (pending && prop->is_pending)
return &prop->pending;
- else
+ else {
+#if RANDR_13_INTERFACE
+ /* If we can, try to update the property value first */
+ if (pScrPriv->rrOutputGetProperty)
+ pScrPriv->rrOutputGetProperty(output->pScreen, output,
+ prop->propertyName);
+#endif
return &prop->current;
+ }
}
int
@@ -313,21 +344,31 @@ RRConfigureOutputProperty(RROutputPtr output, Atom property,
if (!prop) {
prop = RRCreateOutputProperty(property);
if (!prop)
- return (BadAlloc);
+ return BadAlloc;
add = TRUE;
}
else if (prop->immutable && !immutable)
- return (BadAccess);
+ return BadAccess;
/*
* ranges must have even number of values
*/
- if (range && (num_values & 1))
+ if (range && (num_values & 1)) {
+ if (add)
+ RRDestroyOutputProperty(prop);
return BadMatch;
+ }
+#ifndef NXAGENT_SERVER
+ new_values = xallocarray(num_values, sizeof(INT32));
+#else /* !defined(NXAGENT_SERVER) */
new_values = xalloc(num_values * sizeof(INT32));
- if (!new_values && num_values)
+#endif /* !defined(NXAGENT_SERVER) */
+ if (!new_values && num_values) {
+ if (add)
+ RRDestroyOutputProperty(prop);
return BadAlloc;
+ }
if (num_values)
memcpy(new_values, values, num_values * sizeof(INT32));
@@ -336,8 +377,7 @@ RRConfigureOutputProperty(RROutputPtr output, Atom property,
* loses any pending values
*/
if (prop->is_pending && !pending) {
- if (prop->pending.data)
- xfree(prop->pending.data);
+ xfree(prop->pending.data);
RRInitOutputPropertyValue(&prop->pending);
}
@@ -345,8 +385,7 @@ RRConfigureOutputProperty(RROutputPtr output, Atom property,
prop->range = range;
prop->immutable = immutable;
prop->num_valid = num_values;
- if (prop->valid_values)
- xfree(prop->valid_values);
+ xfree(prop->valid_values);
prop->valid_values = new_values;
if (add) {
@@ -361,47 +400,51 @@ int
ProcRRListOutputProperties(ClientPtr client)
{
REQUEST(xRRListOutputPropertiesReq);
- Atom *pAtoms = NULL, *temppAtoms;
+ Atom *pAtoms = NULL;
xRRListOutputPropertiesReply rep;
int numProps = 0;
RROutputPtr output;
RRPropertyPtr prop;
+ int n;
REQUEST_SIZE_MATCH(xRRListOutputPropertiesReq);
- output = LookupOutput(client, stuff->output, DixReadAccess);
-
- if (!output)
- return RRErrorBase + BadRROutput;
+ VERIFY_RR_OUTPUT(stuff->output, output, DixReadAccess);
for (prop = output->properties; prop; prop = prop->next)
numProps++;
if (numProps)
- if (!(pAtoms = (Atom *) xalloc(numProps * sizeof(Atom))))
- return (BadAlloc);
+#ifndef NXAGENT_SERVER
+ if (!(pAtoms = xallocarray(numProps, sizeof(Atom))))
+#else /* !defined(NXAGENT_SERVER) */
+ if (!(pAtoms = xalloc(numProps * sizeof(Atom))))
+#endif /* !defined(NXAGENT_SERVER) */
+ return BadAlloc;
- rep.type = X_Reply;
- rep.length = (numProps * sizeof(Atom)) >> 2;
- rep.sequenceNumber = client->sequence;
- rep.nAtoms = numProps;
+ rep = (xRRListOutputPropertiesReply) {
+ .type = X_Reply,
+ .sequenceNumber = client->sequence,
+ .length = bytes_to_int32(numProps * sizeof(Atom)),
+ .nAtoms = numProps
+ };
if (client->swapped) {
- int n;
-
swaps(&rep.sequenceNumber, n);
swapl(&rep.length, n);
swaps(&rep.nAtoms, n);
}
- temppAtoms = pAtoms;
- for (prop = output->properties; prop; prop = prop->next)
- *temppAtoms++ = prop->propertyName;
-
WriteToClient(client, sizeof(xRRListOutputPropertiesReply), (char *) &rep);
+
if (numProps) {
+ /* Copy property name atoms to reply buffer */
+ Atom *temppAtoms = pAtoms;
+ for (prop = output->properties; prop; prop = prop->next)
+ *temppAtoms++ = prop->propertyName;
+
client->pSwapReplyFunc = (ReplySwapPtr) Swap32Write;
WriteSwappedDataToClient(client, numProps * sizeof(Atom), pAtoms);
xfree(pAtoms);
}
- return (client->noClientException);
+ return Success;
}
int
@@ -411,33 +454,36 @@ ProcRRQueryOutputProperty(ClientPtr client)
xRRQueryOutputPropertyReply rep;
RROutputPtr output;
RRPropertyPtr prop;
- char *extra;
+ char *extra = NULL;
+ int n;
REQUEST_SIZE_MATCH(xRRQueryOutputPropertyReq);
- output = LookupOutput(client, stuff->output, DixReadAccess);
-
- if (!output)
- return RRErrorBase + BadRROutput;
+ VERIFY_RR_OUTPUT(stuff->output, output, DixReadAccess);
prop = RRQueryOutputProperty(output, stuff->property);
if (!prop)
return BadName;
if (prop->num_valid) {
+#ifndef NXAGENT_SERVER
+ extra = xallocarray(prop->num_valid, sizeof(INT32));
+#else /* !defined(NXAGENT_SERVER) */
extra = xalloc(prop->num_valid * sizeof(INT32));
+#endif /* !defined(NXAGENT_SERVER) */
if (!extra)
return BadAlloc;
}
- rep.type = X_Reply;
- rep.length = prop->num_valid;
- rep.sequenceNumber = client->sequence;
- rep.pending = prop->is_pending;
- rep.range = prop->range;
- rep.immutable = prop->immutable;
- if (client->swapped) {
- int n;
+ rep = (xRRQueryOutputPropertyReply) {
+ .type = X_Reply,
+ .sequenceNumber = client->sequence,
+ .length = prop->num_valid,
+ .pending = prop->is_pending,
+ .range = prop->range,
+ .immutable = prop->immutable
+ };
+ if (client->swapped) {
swaps(&rep.sequenceNumber, n);
swapl(&rep.length, n);
}
@@ -449,7 +495,7 @@ ProcRRQueryOutputProperty(ClientPtr client)
extra);
xfree(extra);
}
- return (client->noClientException);
+ return Success;
}
int
@@ -461,15 +507,13 @@ ProcRRConfigureOutputProperty(ClientPtr client)
REQUEST_AT_LEAST_SIZE(xRRConfigureOutputPropertyReq);
- output = LookupOutput(client, stuff->output, DixReadAccess);
-
- if (!output)
- return RRErrorBase + BadRROutput;
+ VERIFY_RR_OUTPUT(stuff->output, output, DixReadAccess);
- num_valid = stuff->length - (sizeof(xRRConfigureOutputPropertyReq) >> 2);
- return RRConfigureOutputProperty(output, stuff->property,
- stuff->pending, stuff->range,
- FALSE, num_valid, (INT32 *) (stuff + 1));
+ num_valid =
+ stuff->length - bytes_to_int32(sizeof(xRRConfigureOutputPropertyReq));
+ return RRConfigureOutputProperty(output, stuff->property, stuff->pending,
+ stuff->range, FALSE, num_valid,
+ (INT32 *) (stuff + 1));
}
int
@@ -497,23 +541,21 @@ ProcRRChangeOutputProperty(ClientPtr client)
return BadValue;
}
len = stuff->nUnits;
- if (len > ((0xffffffff - sizeof(xChangePropertyReq)) >> 2))
+ if (len > bytes_to_int32((0xffffffff - sizeof(xChangePropertyReq))))
return BadLength;
sizeInBytes = format >> 3;
totalSize = len * sizeInBytes;
REQUEST_FIXED_SIZE(xRRChangeOutputPropertyReq, totalSize);
- output = LookupOutput(client, stuff->output, DixWriteAccess);
- if (!output)
- return RRErrorBase + BadRROutput;
+ VERIFY_RR_OUTPUT(stuff->output, output, DixReadAccess);
if (!ValidAtom(stuff->property)) {
client->errorValue = stuff->property;
- return (BadAtom);
+ return BadAtom;
}
if (!ValidAtom(stuff->type)) {
client->errorValue = stuff->type;
- return (BadAtom);
+ return BadAtom;
}
err = RRChangeOutputProperty(output, stuff->property,
@@ -523,7 +565,7 @@ ProcRRChangeOutputProperty(ClientPtr client)
if (err != Success)
return err;
else
- return client->noClientException;
+ return Success;
}
int
@@ -531,20 +573,30 @@ ProcRRDeleteOutputProperty(ClientPtr client)
{
REQUEST(xRRDeleteOutputPropertyReq);
RROutputPtr output;
+ RRPropertyPtr prop;
REQUEST_SIZE_MATCH(xRRDeleteOutputPropertyReq);
UpdateCurrentTime();
- output = LookupOutput(client, stuff->output, DixWriteAccess);
- if (!output)
- return RRErrorBase + BadRROutput;
+ VERIFY_RR_OUTPUT(stuff->output, output, DixReadAccess);
if (!ValidAtom(stuff->property)) {
client->errorValue = stuff->property;
- return (BadAtom);
+ return BadAtom;
+ }
+
+ prop = RRQueryOutputProperty(output, stuff->property);
+ if (!prop) {
+ client->errorValue = stuff->property;
+ return BadName;
+ }
+
+ if (prop->immutable) {
+ client->errorValue = stuff->property;
+ return BadAccess;
}
RRDeleteOutputProperty(output, stuff->property);
- return client->noClientException;
+ return Success;
}
int
@@ -556,35 +608,36 @@ ProcRRGetOutputProperty(ClientPtr client)
unsigned long n, len, ind;
RROutputPtr output;
xRRGetOutputPropertyReply reply;
- char *extra;
+ char *extra = NULL;
+ int m;
REQUEST_SIZE_MATCH(xRRGetOutputPropertyReq);
if (stuff->delete)
UpdateCurrentTime();
- output = LookupOutput(client, stuff->output,
- stuff->delete ? DixWriteAccess : DixReadAccess);
- if (!output)
- return RRErrorBase + BadRROutput;
+ VERIFY_RR_OUTPUT(stuff->output, output,
+ stuff->delete ? DixWriteAccess : DixReadAccess);
if (!ValidAtom(stuff->property)) {
client->errorValue = stuff->property;
- return (BadAtom);
+ return BadAtom;
}
if ((stuff->delete != xTrue) && (stuff->delete != xFalse)) {
client->errorValue = stuff->delete;
- return (BadValue);
+ return BadValue;
}
if ((stuff->type != AnyPropertyType) && !ValidAtom(stuff->type)) {
client->errorValue = stuff->type;
- return (BadAtom);
+ return BadAtom;
}
for (prev = &output->properties; (prop = *prev); prev = &prop->next)
if (prop->propertyName == stuff->property)
break;
- reply.type = X_Reply;
- reply.sequenceNumber = client->sequence;
+ reply = (xRRGetOutputPropertyReply) {
+ .type = X_Reply,
+ .sequenceNumber = client->sequence
+ };
if (!prop) {
reply.nItems = 0;
reply.length = 0;
@@ -592,25 +645,23 @@ ProcRRGetOutputProperty(ClientPtr client)
reply.propertyType = None;
reply.format = 0;
if (client->swapped) {
- int n;
-
- swaps(&reply.sequenceNumber, n);
- swapl(&reply.length, n);
- swapl(&reply.propertyType, n);
- swapl(&reply.bytesAfter, n);
- swapl(&reply.nItems, n);
+ swaps(&reply.sequenceNumber, m);
+ swapl(&reply.length, m);
+ swapl(&reply.propertyType, m);
+ swapl(&reply.bytesAfter, m);
+ swapl(&reply.nItems, m);
}
- WriteToClient(client, sizeof(xRRGetOutputPropertyReply), &reply);
- return (client->noClientException);
+ WriteToClient(client, sizeof(xRRGetOutputPropertyReply),
+ (char *) &reply);
+ return Success;
}
if (prop->immutable && stuff->delete)
return BadAccess;
- if (stuff->pending && prop->is_pending)
- prop_value = &prop->pending;
- else
- prop_value = &prop->current;
+ prop_value = RRGetOutputProperty(output, stuff->property, stuff->pending);
+ if (!prop_value)
+ return BadAtom;
/* If the request type and actual type don't match. Return the
property information, but not the data. */
@@ -623,16 +674,15 @@ ProcRRGetOutputProperty(ClientPtr client)
reply.nItems = 0;
reply.propertyType = prop_value->type;
if (client->swapped) {
- int n;
-
swaps(&reply.sequenceNumber, n);
swapl(&reply.length, n);
swapl(&reply.propertyType, n);
swapl(&reply.bytesAfter, n);
swapl(&reply.nItems, n);
}
- WriteToClient(client, sizeof(xRRGetOutputPropertyReply), &reply);
- return (client->noClientException);
+ WriteToClient(client, sizeof(xRRGetOutputPropertyReply),
+ (char *) &reply);
+ return Success;
}
/*
@@ -658,7 +708,7 @@ ProcRRGetOutputProperty(ClientPtr client)
}
reply.bytesAfter = n - (ind + len);
reply.format = prop_value->format;
- reply.length = (len + 3) >> 2;
+ reply.length = bytes_to_int32(len);
if (prop_value->format)
reply.nItems = len / (prop_value->format / 8);
else
@@ -666,28 +716,25 @@ ProcRRGetOutputProperty(ClientPtr client)
reply.propertyType = prop_value->type;
if (stuff->delete && (reply.bytesAfter == 0)) {
- xRROutputPropertyNotifyEvent event;
-
- event.type = RREventBase + RRNotify;
- event.subCode = RRNotify_OutputProperty;
- event.output = output->id;
- event.state = PropertyDelete;
- event.atom = prop->propertyName;
- event.timestamp = currentTime.milliseconds;
- RRDeliverEvent(output->pScreen, (xEvent *) &event,
- RROutputPropertyNotifyMask);
+ xRROutputPropertyNotifyEvent event = {
+ .type = RREventBase + RRNotify,
+ .subCode = RRNotify_OutputProperty,
+ .output = output->id,
+ .state = PropertyDelete,
+ .atom = prop->propertyName,
+ .timestamp = currentTime.milliseconds
+ };
+ RRDeliverPropertyEvent(output->pScreen, (xEvent *) &event);
}
if (client->swapped) {
- int n;
-
swaps(&reply.sequenceNumber, n);
swapl(&reply.length, n);
swapl(&reply.propertyType, n);
swapl(&reply.bytesAfter, n);
swapl(&reply.nItems, n);
}
- WriteToClient(client, sizeof(xGenericReply), &reply);
+ WriteToClient(client, sizeof(xGenericReply), (char *) &reply);
if (len) {
memcpy(extra, (char *) prop_value->data + ind, len);
switch (reply.format) {
@@ -709,5 +756,5 @@ ProcRRGetOutputProperty(ClientPtr client)
*prev = prop->next;
RRDestroyOutputProperty(prop);
}
- return (client->noClientException);
+ return Success;
}