randr: send RRProviderChangeNotify event

Send RRProviderChangeNotify event when a provider becomes output source or
offload sink.

Reviewed-by: Dave Airlie <airlied@redhat.com>
Signed-off-by: Michal Srb <msrb@suse.com>
Signed-off-by: Keith Packard <keithp@keithp.com>
This commit is contained in:
Michal Srb 2013-10-30 13:33:49 +02:00 committed by Keith Packard
parent 1470c0a132
commit 4b39ea8a91
3 changed files with 65 additions and 0 deletions

View File

@ -426,6 +426,8 @@ TellChanged(WindowPtr pWin, pointer value)
RREventPtr *pHead, pRREvent; RREventPtr *pHead, pRREvent;
ClientPtr client; ClientPtr client;
ScreenPtr pScreen = pWin->drawable.pScreen; ScreenPtr pScreen = pWin->drawable.pScreen;
ScreenPtr iter;
rrScrPrivPtr pSlaveScrPriv;
rrScrPriv(pScreen); rrScrPriv(pScreen);
int i; int i;
@ -460,6 +462,24 @@ TellChanged(WindowPtr pWin, pointer value)
RRDeliverOutputEvent(client, pWin, output); RRDeliverOutputEvent(client, pWin, output);
} }
} }
if (pRREvent->mask & RRProviderChangeNotifyMask) {
xorg_list_for_each_entry(iter, &pScreen->output_slave_list, output_head) {
pSlaveScrPriv = rrGetScrPriv(iter);
if (pSlaveScrPriv->provider->changed)
RRDeliverProviderEvent(client, pWin, pSlaveScrPriv->provider);
}
xorg_list_for_each_entry(iter, &pScreen->offload_slave_list, offload_head) {
pSlaveScrPriv = rrGetScrPriv(iter);
if (pSlaveScrPriv->provider->changed)
RRDeliverProviderEvent(client, pWin, pSlaveScrPriv->provider);
}
xorg_list_for_each_entry(iter, &pScreen->unattached_list, unattached_head) {
pSlaveScrPriv = rrGetScrPriv(iter);
if (pSlaveScrPriv->provider->changed)
RRDeliverProviderEvent(client, pWin, pSlaveScrPriv->provider);
}
}
} }
return WT_WALKCHILDREN; return WT_WALKCHILDREN;
} }
@ -496,6 +516,8 @@ RRTellChanged(ScreenPtr pScreen)
rrScrPriv(pScreen); rrScrPriv(pScreen);
rrScrPrivPtr mastersp; rrScrPrivPtr mastersp;
int i; int i;
ScreenPtr iter;
rrScrPrivPtr pSlaveScrPriv;
if (pScreen->isGPU) { if (pScreen->isGPU) {
master = pScreen->current_master; master = pScreen->current_master;
@ -519,6 +541,20 @@ RRTellChanged(ScreenPtr pScreen)
pScrPriv->outputs[i]->changed = FALSE; pScrPriv->outputs[i]->changed = FALSE;
for (i = 0; i < pScrPriv->numCrtcs; i++) for (i = 0; i < pScrPriv->numCrtcs; i++)
pScrPriv->crtcs[i]->changed = FALSE; pScrPriv->crtcs[i]->changed = FALSE;
xorg_list_for_each_entry(iter, &master->output_slave_list, output_head) {
pSlaveScrPriv = rrGetScrPriv(iter);
pSlaveScrPriv->provider->changed = FALSE;
}
xorg_list_for_each_entry(iter, &master->offload_slave_list, offload_head) {
pSlaveScrPriv = rrGetScrPriv(iter);
pSlaveScrPriv->provider->changed = FALSE;
}
xorg_list_for_each_entry(iter, &master->unattached_list, unattached_head) {
pSlaveScrPriv = rrGetScrPriv(iter);
pSlaveScrPriv->provider->changed = FALSE;
}
if (mastersp->layoutChanged) { if (mastersp->layoutChanged) {
pScrPriv->layoutChanged = FALSE; pScrPriv->layoutChanged = FALSE;
RRPointerScreenConfigured(master); RRPointerScreenConfigured(master);

View File

@ -164,6 +164,7 @@ struct _rrProvider {
int nameLength; int nameLength;
RRPropertyPtr properties; RRPropertyPtr properties;
Bool pendingProperties; Bool pendingProperties;
Bool changed;
struct _rrProvider *offload_sink; struct _rrProvider *offload_sink;
struct _rrProvider *output_source; struct _rrProvider *output_source;
}; };
@ -923,6 +924,9 @@ RRProviderSetCapabilities(RRProviderPtr provider, uint32_t capabilities);
extern _X_EXPORT Bool extern _X_EXPORT Bool
RRProviderLookup(XID id, RRProviderPtr *provider_p); RRProviderLookup(XID id, RRProviderPtr *provider_p);
extern _X_EXPORT void
RRDeliverProviderEvent(ClientPtr client, WindowPtr pWin, RRProviderPtr provider);
/* rrproviderproperty.c */ /* rrproviderproperty.c */
extern _X_EXPORT void extern _X_EXPORT void

View File

@ -304,6 +304,9 @@ ProcRRSetProviderOutputSource(ClientPtr client)
pScrPriv->rrProviderSetOutputSource(pScreen, provider, source_provider); pScrPriv->rrProviderSetOutputSource(pScreen, provider, source_provider);
provider->changed = TRUE;
RRSetChanged(pScreen);
RRTellChanged (pScreen); RRTellChanged (pScreen);
return Success; return Success;
@ -333,6 +336,9 @@ ProcRRSetProviderOffloadSink(ClientPtr client)
pScrPriv->rrProviderSetOffloadSink(pScreen, provider, sink_provider); pScrPriv->rrProviderSetOffloadSink(pScreen, provider, sink_provider);
provider->changed = TRUE;
RRSetChanged(pScreen);
RRTellChanged (pScreen); RRTellChanged (pScreen);
return Success; return Success;
@ -357,6 +363,7 @@ RRProviderCreate(ScreenPtr pScreen, const char *name,
provider->nameLength = nameLength; provider->nameLength = nameLength;
memcpy(provider->name, name, nameLength); memcpy(provider->name, name, nameLength);
provider->name[nameLength] = '\0'; provider->name[nameLength] = '\0';
provider->changed = FALSE;
if (!AddResource (provider->id, RRProviderType, (pointer) provider)) if (!AddResource (provider->id, RRProviderType, (pointer) provider))
return NULL; return NULL;
@ -416,3 +423,21 @@ RRProviderLookup(XID id, RRProviderPtr *provider_p)
return TRUE; return TRUE;
return FALSE; return FALSE;
} }
void
RRDeliverProviderEvent(ClientPtr client, WindowPtr pWin, RRProviderPtr provider)
{
ScreenPtr pScreen = pWin->drawable.pScreen;
rrScrPriv(pScreen);
xRRProviderChangeNotifyEvent pe = {
.type = RRNotify + RREventBase,
.subCode = RRNotify_ProviderChange,
.timestamp = pScrPriv->lastSetTime.milliseconds,
.window = pWin->drawable.id,
.provider = provider->id
};
WriteEventsToClient(client, 1, (xEvent *) &pe);
}