Merge remote-tracking branch 'alanc/master'
This commit is contained in:
		
						commit
						beeea70495
					
				| 
						 | 
					@ -1056,11 +1056,12 @@ int
 | 
				
			||||||
ProcXineramaQueryScreens(ClientPtr client)
 | 
					ProcXineramaQueryScreens(ClientPtr client)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    /* REQUEST(xXineramaQueryScreensReq); */
 | 
					    /* REQUEST(xXineramaQueryScreensReq); */
 | 
				
			||||||
 | 
					    CARD32 number = (noPanoramiXExtension) ? 0 : PanoramiXNumScreens;
 | 
				
			||||||
    xXineramaQueryScreensReply rep = {
 | 
					    xXineramaQueryScreensReply rep = {
 | 
				
			||||||
        .type = X_Reply,
 | 
					        .type = X_Reply,
 | 
				
			||||||
        .sequenceNumber = client->sequence,
 | 
					        .sequenceNumber = client->sequence,
 | 
				
			||||||
        .length = bytes_to_int32(rep.number * sz_XineramaScreenInfo),
 | 
					        .length = bytes_to_int32(number * sz_XineramaScreenInfo),
 | 
				
			||||||
        .number = (noPanoramiXExtension) ? 0 : PanoramiXNumScreens
 | 
					        .number = number
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    REQUEST_SIZE_MATCH(xXineramaQueryScreensReq);
 | 
					    REQUEST_SIZE_MATCH(xXineramaQueryScreensReq);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -135,6 +135,7 @@ ProcXvMCListSurfaceTypes(ClientPtr client)
 | 
				
			||||||
    xvmcSurfaceInfo info;
 | 
					    xvmcSurfaceInfo info;
 | 
				
			||||||
    XvMCAdaptorPtr adaptor = NULL;
 | 
					    XvMCAdaptorPtr adaptor = NULL;
 | 
				
			||||||
    XvMCSurfaceInfoPtr surface;
 | 
					    XvMCSurfaceInfoPtr surface;
 | 
				
			||||||
 | 
					    int num_surfaces;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    REQUEST(xvmcListSurfaceTypesReq);
 | 
					    REQUEST(xvmcListSurfaceTypesReq);
 | 
				
			||||||
    REQUEST_SIZE_MATCH(xvmcListSurfaceTypesReq);
 | 
					    REQUEST_SIZE_MATCH(xvmcListSurfaceTypesReq);
 | 
				
			||||||
| 
						 | 
					@ -154,16 +155,17 @@ ProcXvMCListSurfaceTypes(ClientPtr client)
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    num_surfaces = (adaptor) ? adaptor->num_surfaces : 0;
 | 
				
			||||||
    rep = (xvmcListSurfaceTypesReply) {
 | 
					    rep = (xvmcListSurfaceTypesReply) {
 | 
				
			||||||
        .type = X_Reply,
 | 
					        .type = X_Reply,
 | 
				
			||||||
        .sequenceNumber = client->sequence,
 | 
					        .sequenceNumber = client->sequence,
 | 
				
			||||||
        .num = (adaptor) ? adaptor->num_surfaces : 0,
 | 
					        .num = num_surfaces,
 | 
				
			||||||
        .length = bytes_to_int32(rep.num * sizeof(xvmcSurfaceInfo)),
 | 
					        .length = bytes_to_int32(num_surfaces * sizeof(xvmcSurfaceInfo)),
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    WriteToClient(client, sizeof(xvmcListSurfaceTypesReply), &rep);
 | 
					    WriteToClient(client, sizeof(xvmcListSurfaceTypesReply), &rep);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (i = 0; i < rep.num; i++) {
 | 
					    for (i = 0; i < num_surfaces; i++) {
 | 
				
			||||||
        surface = adaptor->surfaces[i];
 | 
					        surface = adaptor->surfaces[i];
 | 
				
			||||||
        info.surface_type_id = surface->surface_type_id;
 | 
					        info.surface_type_id = surface->surface_type_id;
 | 
				
			||||||
        info.chroma_format = surface->chroma_format;
 | 
					        info.chroma_format = surface->chroma_format;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -550,15 +550,16 @@ static int
 | 
				
			||||||
ProcDRI2GetParam(ClientPtr client)
 | 
					ProcDRI2GetParam(ClientPtr client)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    REQUEST(xDRI2GetParamReq);
 | 
					    REQUEST(xDRI2GetParamReq);
 | 
				
			||||||
    xDRI2GetParamReply rep;
 | 
					    xDRI2GetParamReply rep = {
 | 
				
			||||||
 | 
					        .type = X_Reply,
 | 
				
			||||||
 | 
					        .sequenceNumber = client->sequence,
 | 
				
			||||||
 | 
					        .length = 0
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
    DrawablePtr pDrawable;
 | 
					    DrawablePtr pDrawable;
 | 
				
			||||||
    CARD64 value;
 | 
					    CARD64 value;
 | 
				
			||||||
    int status;
 | 
					    int status;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    REQUEST_SIZE_MATCH(xDRI2GetParamReq);
 | 
					    REQUEST_SIZE_MATCH(xDRI2GetParamReq);
 | 
				
			||||||
    rep.type = X_Reply;
 | 
					 | 
				
			||||||
    rep.length = 0;
 | 
					 | 
				
			||||||
    rep.sequenceNumber = client->sequence;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!validDrawable(client, stuff->drawable, DixReadAccess,
 | 
					    if (!validDrawable(client, stuff->drawable, DixReadAccess,
 | 
				
			||||||
                       &pDrawable, &status))
 | 
					                       &pDrawable, &status))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -86,23 +86,26 @@ ProcRRGetProviders (ClientPtr client)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pScrPriv = rrGetScrPriv(pScreen);
 | 
					    pScrPriv = rrGetScrPriv(pScreen);
 | 
				
			||||||
    rep.pad = 0;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!pScrPriv)
 | 
					    if (!pScrPriv)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        rep.type = X_Reply;
 | 
					        rep = (xRRGetProvidersReply) {
 | 
				
			||||||
        rep.sequenceNumber = client->sequence;
 | 
					            .type = X_Reply,
 | 
				
			||||||
        rep.length = 0;
 | 
					            .sequenceNumber = client->sequence,
 | 
				
			||||||
        rep.timestamp = currentTime.milliseconds;
 | 
					            .length = 0,
 | 
				
			||||||
        rep.nProviders = 0;
 | 
					            .timestamp = currentTime.milliseconds,
 | 
				
			||||||
 | 
					            .nProviders = 0
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
        extra = NULL;
 | 
					        extra = NULL;
 | 
				
			||||||
        extraLen = 0;
 | 
					        extraLen = 0;
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        rep.type = X_Reply;
 | 
					        rep = (xRRGetProvidersReply) {
 | 
				
			||||||
        rep.sequenceNumber = client->sequence;
 | 
					            .type = X_Reply,
 | 
				
			||||||
        rep.timestamp = pScrPriv->lastSetTime.milliseconds;
 | 
					            .sequenceNumber = client->sequence,
 | 
				
			||||||
        rep.nProviders = total_providers;
 | 
					            .timestamp = pScrPriv->lastSetTime.milliseconds,
 | 
				
			||||||
        rep.length = total_providers;
 | 
					            .nProviders = total_providers,
 | 
				
			||||||
 | 
					            .length = total_providers
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
        extraLen = rep.length << 2;
 | 
					        extraLen = rep.length << 2;
 | 
				
			||||||
        if (extraLen) {
 | 
					        if (extraLen) {
 | 
				
			||||||
            extra = malloc(extraLen);
 | 
					            extra = malloc(extraLen);
 | 
				
			||||||
| 
						 | 
					@ -163,18 +166,20 @@ ProcRRGetProviderInfo (ClientPtr client)
 | 
				
			||||||
    pScreen = provider->pScreen;
 | 
					    pScreen = provider->pScreen;
 | 
				
			||||||
    pScrPriv = rrGetScrPriv(pScreen);
 | 
					    pScrPriv = rrGetScrPriv(pScreen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    rep.type = X_Reply;
 | 
					    rep = (xRRGetProviderInfoReply) {
 | 
				
			||||||
    rep.status = RRSetConfigSuccess;
 | 
					        .type = X_Reply,
 | 
				
			||||||
    rep.sequenceNumber = client->sequence;
 | 
					        .status = RRSetConfigSuccess,
 | 
				
			||||||
    rep.length = 0;
 | 
					        .sequenceNumber = client->sequence,
 | 
				
			||||||
    rep.capabilities = provider->capabilities;
 | 
					        .length = 0,
 | 
				
			||||||
    rep.nameLength = provider->nameLength;
 | 
					        .capabilities = provider->capabilities,
 | 
				
			||||||
    rep.timestamp = pScrPriv->lastSetTime.milliseconds;
 | 
					        .nameLength = provider->nameLength,
 | 
				
			||||||
    rep.nCrtcs = pScrPriv->numCrtcs;
 | 
					        .timestamp = pScrPriv->lastSetTime.milliseconds,
 | 
				
			||||||
    rep.nOutputs = pScrPriv->numOutputs;
 | 
					        .nCrtcs = pScrPriv->numCrtcs,
 | 
				
			||||||
 | 
					        .nOutputs = pScrPriv->numOutputs,
 | 
				
			||||||
 | 
					        .nAssociatedProviders = 0
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* count associated providers */
 | 
					    /* count associated providers */
 | 
				
			||||||
    rep.nAssociatedProviders = 0;
 | 
					 | 
				
			||||||
    if (provider->offload_sink)
 | 
					    if (provider->offload_sink)
 | 
				
			||||||
        rep.nAssociatedProviders++;
 | 
					        rep.nAssociatedProviders++;
 | 
				
			||||||
    if (provider->output_source)
 | 
					    if (provider->output_source)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -65,14 +65,14 @@ RRDestroyProviderProperty(RRPropertyPtr prop)
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
RRDeleteProperty(RRProviderRec * provider, RRPropertyRec * prop)
 | 
					RRDeleteProperty(RRProviderRec * provider, RRPropertyRec * prop)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    xRRProviderPropertyNotifyEvent event;
 | 
					    xRRProviderPropertyNotifyEvent event = {
 | 
				
			||||||
 | 
					        .type = RREventBase + RRNotify,
 | 
				
			||||||
    event.type = RREventBase + RRNotify;
 | 
					        .subCode = RRNotify_ProviderProperty,
 | 
				
			||||||
    event.subCode = RRNotify_ProviderProperty;
 | 
					        .provider = provider->id,
 | 
				
			||||||
    event.provider = provider->id;
 | 
					        .state = PropertyDelete,
 | 
				
			||||||
    event.state = PropertyDelete;
 | 
					        .atom = prop->propertyName,
 | 
				
			||||||
    event.atom = prop->propertyName;
 | 
					        .timestamp = currentTime.milliseconds
 | 
				
			||||||
    event.timestamp = currentTime.milliseconds;
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    RRDeliverPropertyEvent(provider->pScreen, (xEvent *) &event);
 | 
					    RRDeliverPropertyEvent(provider->pScreen, (xEvent *) &event);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -138,7 +138,6 @@ RRChangeProviderProperty(RRProviderPtr provider, Atom property, Atom type,
 | 
				
			||||||
                       pointer value, Bool sendevent, Bool pending)
 | 
					                       pointer value, Bool sendevent, Bool pending)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    RRPropertyPtr prop;
 | 
					    RRPropertyPtr prop;
 | 
				
			||||||
    xRRProviderPropertyNotifyEvent event;
 | 
					 | 
				
			||||||
    rrScrPrivPtr pScrPriv = rrGetScrPriv(provider->pScreen);
 | 
					    rrScrPrivPtr pScrPriv = rrGetScrPriv(provider->pScreen);
 | 
				
			||||||
    int size_in_bytes;
 | 
					    int size_in_bytes;
 | 
				
			||||||
    int total_size;
 | 
					    int total_size;
 | 
				
			||||||
| 
						 | 
					@ -237,12 +236,14 @@ RRChangeProviderProperty(RRProviderPtr provider, Atom property, Atom type,
 | 
				
			||||||
        provider->pendingProperties = TRUE;
 | 
					        provider->pendingProperties = TRUE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (sendevent) {
 | 
					    if (sendevent) {
 | 
				
			||||||
        event.type = RREventBase + RRNotify;
 | 
					        xRRProviderPropertyNotifyEvent event = {
 | 
				
			||||||
        event.subCode = RRNotify_ProviderProperty;
 | 
					            .type = RREventBase + RRNotify,
 | 
				
			||||||
        event.provider = provider->id;
 | 
					            .subCode = RRNotify_ProviderProperty,
 | 
				
			||||||
        event.state = PropertyNewValue;
 | 
					            .provider = provider->id,
 | 
				
			||||||
        event.atom = prop->propertyName;
 | 
					            .state = PropertyNewValue,
 | 
				
			||||||
        event.timestamp = currentTime.milliseconds;
 | 
					            .atom = prop->propertyName,
 | 
				
			||||||
 | 
					            .timestamp = currentTime.milliseconds
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
        RRDeliverPropertyEvent(provider->pScreen, (xEvent *) &event);
 | 
					        RRDeliverPropertyEvent(provider->pScreen, (xEvent *) &event);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return Success;
 | 
					    return Success;
 | 
				
			||||||
| 
						 | 
					@ -394,10 +395,12 @@ ProcRRListProviderProperties(ClientPtr client)
 | 
				
			||||||
        if (!(pAtoms = (Atom *) malloc(numProps * sizeof(Atom))))
 | 
					        if (!(pAtoms = (Atom *) malloc(numProps * sizeof(Atom))))
 | 
				
			||||||
            return BadAlloc;
 | 
					            return BadAlloc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    rep.type = X_Reply;
 | 
					    rep = (xRRListProviderPropertiesReply) {
 | 
				
			||||||
    rep.length = bytes_to_int32(numProps * sizeof(Atom));
 | 
					        .type = X_Reply,
 | 
				
			||||||
    rep.sequenceNumber = client->sequence;
 | 
					        .sequenceNumber = client->sequence,
 | 
				
			||||||
    rep.nAtoms = numProps;
 | 
					        .length = bytes_to_int32(numProps * sizeof(Atom)),
 | 
				
			||||||
 | 
					        .nAtoms = numProps
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
    if (client->swapped) {
 | 
					    if (client->swapped) {
 | 
				
			||||||
        swaps(&rep.sequenceNumber);
 | 
					        swaps(&rep.sequenceNumber);
 | 
				
			||||||
        swapl(&rep.length);
 | 
					        swapl(&rep.length);
 | 
				
			||||||
| 
						 | 
					@ -438,12 +441,14 @@ ProcRRQueryProviderProperty(ClientPtr client)
 | 
				
			||||||
        if (!extra)
 | 
					        if (!extra)
 | 
				
			||||||
            return BadAlloc;
 | 
					            return BadAlloc;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    rep.type = X_Reply;
 | 
					    rep = (xRRQueryProviderPropertyReply) {
 | 
				
			||||||
    rep.length = prop->num_valid;
 | 
					        .type = X_Reply,
 | 
				
			||||||
    rep.sequenceNumber = client->sequence;
 | 
					        .sequenceNumber = client->sequence,
 | 
				
			||||||
    rep.pending = prop->is_pending;
 | 
					        .length = prop->num_valid,
 | 
				
			||||||
    rep.range = prop->range;
 | 
					        .pending = prop->is_pending,
 | 
				
			||||||
    rep.immutable = prop->immutable;
 | 
					        .range = prop->range,
 | 
				
			||||||
 | 
					        .immutable = prop->immutable
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
    if (client->swapped) {
 | 
					    if (client->swapped) {
 | 
				
			||||||
        swaps(&rep.sequenceNumber);
 | 
					        swaps(&rep.sequenceNumber);
 | 
				
			||||||
        swapl(&rep.length);
 | 
					        swapl(&rep.length);
 | 
				
			||||||
| 
						 | 
					@ -568,7 +573,10 @@ ProcRRGetProviderProperty(ClientPtr client)
 | 
				
			||||||
    RRPropertyValuePtr prop_value;
 | 
					    RRPropertyValuePtr prop_value;
 | 
				
			||||||
    unsigned long n, len, ind;
 | 
					    unsigned long n, len, ind;
 | 
				
			||||||
    RRProviderPtr provider;
 | 
					    RRProviderPtr provider;
 | 
				
			||||||
    xRRGetProviderPropertyReply reply;
 | 
					    xRRGetProviderPropertyReply reply = {
 | 
				
			||||||
 | 
					        .type = X_Reply,
 | 
				
			||||||
 | 
					        .sequenceNumber = client->sequence
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
    char *extra = NULL;
 | 
					    char *extra = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    REQUEST_SIZE_MATCH(xRRGetProviderPropertyReq);
 | 
					    REQUEST_SIZE_MATCH(xRRGetProviderPropertyReq);
 | 
				
			||||||
| 
						 | 
					@ -594,8 +602,6 @@ ProcRRGetProviderProperty(ClientPtr client)
 | 
				
			||||||
        if (prop->propertyName == stuff->property)
 | 
					        if (prop->propertyName == stuff->property)
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    reply.type = X_Reply;
 | 
					 | 
				
			||||||
    reply.sequenceNumber = client->sequence;
 | 
					 | 
				
			||||||
    if (!prop) {
 | 
					    if (!prop) {
 | 
				
			||||||
        reply.nItems = 0;
 | 
					        reply.nItems = 0;
 | 
				
			||||||
        reply.length = 0;
 | 
					        reply.length = 0;
 | 
				
			||||||
| 
						 | 
					@ -672,14 +678,14 @@ ProcRRGetProviderProperty(ClientPtr client)
 | 
				
			||||||
    reply.propertyType = prop_value->type;
 | 
					    reply.propertyType = prop_value->type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (stuff->delete && (reply.bytesAfter == 0)) {
 | 
					    if (stuff->delete && (reply.bytesAfter == 0)) {
 | 
				
			||||||
        xRRProviderPropertyNotifyEvent event;
 | 
					        xRRProviderPropertyNotifyEvent event = {
 | 
				
			||||||
 | 
					            .type = RREventBase + RRNotify,
 | 
				
			||||||
        event.type = RREventBase + RRNotify;
 | 
					            .subCode = RRNotify_ProviderProperty,
 | 
				
			||||||
        event.subCode = RRNotify_ProviderProperty;
 | 
					            .provider = provider->id,
 | 
				
			||||||
        event.provider = provider->id;
 | 
					            .state = PropertyDelete,
 | 
				
			||||||
        event.state = PropertyDelete;
 | 
					            .atom = prop->propertyName,
 | 
				
			||||||
        event.atom = prop->propertyName;
 | 
					            .timestamp = currentTime.milliseconds
 | 
				
			||||||
        event.timestamp = currentTime.milliseconds;
 | 
					        };
 | 
				
			||||||
        RRDeliverPropertyEvent(provider->pScreen, (xEvent *) &event);
 | 
					        RRDeliverPropertyEvent(provider->pScreen, (xEvent *) &event);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -396,16 +396,17 @@ rrGetMultiScreenResources(ClientPtr client, Bool query, ScreenPtr pScreen)
 | 
				
			||||||
    ErrorF("reporting %d %d %d %d\n", total_crtcs, total_outputs, total_modes, total_name_len);
 | 
					    ErrorF("reporting %d %d %d %d\n", total_crtcs, total_outputs, total_modes, total_name_len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pScrPriv = rrGetScrPriv(pScreen);
 | 
					    pScrPriv = rrGetScrPriv(pScreen);
 | 
				
			||||||
    rep.pad = 0;
 | 
					    rep = (xRRGetScreenResourcesReply) {
 | 
				
			||||||
    rep.type = X_Reply;
 | 
					        .type = X_Reply,
 | 
				
			||||||
    rep.sequenceNumber = client->sequence;
 | 
					        .sequenceNumber = client->sequence,
 | 
				
			||||||
    rep.length = 0;
 | 
					        .length = 0,
 | 
				
			||||||
    rep.timestamp = pScrPriv->lastSetTime.milliseconds;
 | 
					        .timestamp = pScrPriv->lastSetTime.milliseconds,
 | 
				
			||||||
    rep.configTimestamp = pScrPriv->lastConfigTime.milliseconds;
 | 
					        .configTimestamp = pScrPriv->lastConfigTime.milliseconds,
 | 
				
			||||||
    rep.nCrtcs = total_crtcs;
 | 
					        .nCrtcs = total_crtcs,
 | 
				
			||||||
    rep.nOutputs = total_outputs;
 | 
					        .nOutputs = total_outputs,
 | 
				
			||||||
    rep.nModes = total_modes;
 | 
					        .nModes = total_modes,
 | 
				
			||||||
    rep.nbytesNames = total_name_len;
 | 
					        .nbytesNames = total_name_len
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    rep.length = (total_crtcs + total_outputs + total_modes * bytes_to_int32(SIZEOF(xRRModeInfo)) +
 | 
					    rep.length = (total_crtcs + total_outputs + total_modes * bytes_to_int32(SIZEOF(xRRModeInfo)) +
 | 
				
			||||||
                  bytes_to_int32(rep.nbytesNames));
 | 
					                  bytes_to_int32(rep.nbytesNames));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue