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:
parent
1470c0a132
commit
4b39ea8a91
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user