From e9612620ab2bfc229b71a2259ef49487542d22ac Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Wed, 12 Dec 2012 16:49:11 +1000 Subject: [PATCH] add events for autoconfig of gpus devices, allow usb devices to notify gnome --- ...-tell-changed-so-randr-clients-can-t.patch | 191 ++++++++++++++++++ xorg-x11-server.spec | 7 +- 2 files changed, 197 insertions(+), 1 deletion(-) create mode 100644 0001-autoconfig-fixup-tell-changed-so-randr-clients-can-t.patch diff --git a/0001-autoconfig-fixup-tell-changed-so-randr-clients-can-t.patch b/0001-autoconfig-fixup-tell-changed-so-randr-clients-can-t.patch new file mode 100644 index 0000000..9be545f --- /dev/null +++ b/0001-autoconfig-fixup-tell-changed-so-randr-clients-can-t.patch @@ -0,0 +1,191 @@ +From fc08ad50a2ad81f8741939f8e9eacf86b5af6676 Mon Sep 17 00:00:00 2001 +From: Fedora X Ninjas +Date: Wed, 12 Dec 2012 15:15:38 +1000 +Subject: [PATCH] autoconfig: fixup tell changed so randr clients can tell + +This lets the gnome applet update if a usb device appears/disappears +--- + hw/xfree86/common/xf86platformBus.c | 6 ++++-- + hw/xfree86/modes/xf86Crtc.c | 4 ++++ + randr/randr.c | 24 +++++++++++++++++++++++- + randr/randrstr.h | 4 ++++ + randr/rrcrtc.c | 2 +- + randr/rrinfo.c | 2 +- + randr/rroutput.c | 2 +- + randr/rrscreen.c | 2 +- + 8 files changed, 39 insertions(+), 7 deletions(-) + +diff --git a/hw/xfree86/common/xf86platformBus.c b/hw/xfree86/common/xf86platformBus.c +index 0b735d1..891142d 100644 +--- a/hw/xfree86/common/xf86platformBus.c ++++ b/hw/xfree86/common/xf86platformBus.c +@@ -47,6 +47,7 @@ + #include "Pci.h" + #include "xf86platformBus.h" + ++#include "randrstr.h" + int platformSlotClaimed; + + int xf86_num_platform_devices; +@@ -454,7 +455,8 @@ xf86platformAddDevice(int index) + /* attach unbound to 0 protocol screen */ + AttachUnboundGPU(xf86Screens[0]->pScreen, xf86GPUScreens[i]->pScreen); + xf86AutoConfigOutputDevice(xf86GPUScreens[i], xf86Screens[0]); +- ++ ++ RRTellChanged(xf86Screens[0]->pScreen); + return 0; + } + +@@ -497,7 +499,7 @@ xf86platformRemoveDevice(int index) + xf86UnclaimPlatformSlot(&xf86_platform_devices[index], NULL); + + xf86_remove_platform_device(index); +- ++ RRTellChanged(xf86Screens[0]->pScreen); + out: + return; + } +diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c +index 61119b3..a4fdec9 100644 +--- a/hw/xfree86/modes/xf86Crtc.c ++++ b/hw/xfree86/modes/xf86Crtc.c +@@ -743,10 +743,12 @@ xf86CrtcCloseScreen(ScreenPtr screen) + /* detach any providers */ + if (config->randr_provider) { + if (config->randr_provider->offload_sink) { ++ RRSetChanged(screen); + DetachOffloadGPU(screen); + config->randr_provider->offload_sink = NULL; + } + else if (config->randr_provider->output_source) { ++ RRSetChanged(screen); + DetachOutputGPU(screen); + config->randr_provider->output_source = NULL; + } +@@ -3341,11 +3343,13 @@ void xf86AutoConfigOutputDevice(ScrnInfoPtr pScrn, ScrnInfoPtr master) + DetachUnboundGPU(pScrn->pScreen); + AttachOffloadGPU(master->pScreen, pScrn->pScreen); + slave_config->randr_provider->offload_sink = master_provider; ++ RRSetChanged(master->pScreen); + } else if ((master->capabilities & RR_Capability_SourceOutput) && + pScrn->capabilities & RR_Capability_SinkOutput) { + /* sink offload */ + DetachUnboundGPU(pScrn->pScreen); + AttachOutputGPU(master->pScreen, pScrn->pScreen); + slave_config->randr_provider->output_source = master_provider; ++ RRSetChanged(master->pScreen); + } + } +diff --git a/randr/randr.c b/randr/randr.c +index da48c3f..5b1957b 100644 +--- a/randr/randr.c ++++ b/randr/randr.c +@@ -462,6 +462,28 @@ TellChanged(WindowPtr pWin, pointer value) + return WT_WALKCHILDREN; + } + ++void ++RRSetChanged(ScreenPtr pScreen) ++{ ++ /* set changed bits on the master screen only */ ++ ScreenPtr master; ++ rrScrPriv(pScreen); ++ rrScrPrivPtr mastersp; ++ ++ if (pScreen->isGPU) { ++ master = pScreen->current_master; ++ if (!master) ++ return; ++ mastersp = rrGetScrPriv(master); ++ } ++ else { ++ master = pScreen; ++ mastersp = pScrPriv; ++ } ++ ++ mastersp->changed = TRUE; ++} ++ + /* + * Something changed; send events and adjust pointer position + */ +@@ -482,7 +504,7 @@ RRTellChanged(ScreenPtr pScreen) + mastersp = pScrPriv; + } + +- if (pScrPriv->changed) { ++ if (mastersp->changed) { + UpdateCurrentTimeIf(); + if (mastersp->configChanged) { + mastersp->lastConfigTime = currentTime; +diff --git a/randr/randrstr.h b/randr/randrstr.h +index 212b0a9..d61f20e 100644 +--- a/randr/randrstr.h ++++ b/randr/randrstr.h +@@ -480,6 +480,10 @@ extern _X_EXPORT void + RRDeliverScreenEvent(ClientPtr client, WindowPtr pWin, ScreenPtr pScreen); + + /* randr.c */ ++/* set a screen change on the primary screen */ ++extern _X_EXPORT void ++RRSetChanged(ScreenPtr pScreen); ++ + /* + * Send all pending events + */ +diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c +index e82d050..d57cc08 100644 +--- a/randr/rrcrtc.c ++++ b/randr/rrcrtc.c +@@ -39,7 +39,7 @@ RRCrtcChanged(RRCrtcPtr crtc, Bool layoutChanged) + if (pScreen) { + rrScrPriv(pScreen); + +- pScrPriv->changed = TRUE; ++ RRSetChanged(pScreen); + /* + * Send ConfigureNotify on any layout change + */ +diff --git a/randr/rrinfo.c b/randr/rrinfo.c +index 1408d6f..fc57bd4 100644 +--- a/randr/rrinfo.c ++++ b/randr/rrinfo.c +@@ -225,7 +225,7 @@ RRScreenSetSizeRange(ScreenPtr pScreen, + pScrPriv->minHeight = minHeight; + pScrPriv->maxWidth = maxWidth; + pScrPriv->maxHeight = maxHeight; +- pScrPriv->changed = TRUE; ++ RRSetChanged(pScreen); + pScrPriv->configChanged = TRUE; + } + +diff --git a/randr/rroutput.c b/randr/rroutput.c +index 88781ba..922d61f 100644 +--- a/randr/rroutput.c ++++ b/randr/rroutput.c +@@ -36,7 +36,7 @@ RROutputChanged(RROutputPtr output, Bool configChanged) + output->changed = TRUE; + if (pScreen) { + rrScrPriv(pScreen); +- pScrPriv->changed = TRUE; ++ RRSetChanged(pScreen); + if (configChanged) + pScrPriv->configChanged = TRUE; + } +diff --git a/randr/rrscreen.c b/randr/rrscreen.c +index 39340cc..36179ae 100644 +--- a/randr/rrscreen.c ++++ b/randr/rrscreen.c +@@ -143,7 +143,7 @@ RRScreenSizeNotify(ScreenPtr pScreen) + pScrPriv->height = pScreen->height; + pScrPriv->mmWidth = pScreen->mmWidth; + pScrPriv->mmHeight = pScreen->mmHeight; +- pScrPriv->changed = TRUE; ++ RRSetChanged(pScreen); + /* pScrPriv->sizeChanged = TRUE; */ + + RRTellChanged(pScreen); +-- +1.8.0.1 + diff --git a/xorg-x11-server.spec b/xorg-x11-server.spec index 7eb32ba..cea4d2d 100644 --- a/xorg-x11-server.spec +++ b/xorg-x11-server.spec @@ -43,7 +43,7 @@ Summary: X.Org X11 X server Name: xorg-x11-server Version: 1.13.0 -Release: 13%{?gitdate:.%{gitdate}}%{dist} +Release: 14%{?gitdate:.%{gitdate}}%{dist} URL: http://www.x.org License: MIT Group: User Interface/X @@ -143,6 +143,8 @@ Patch7064: 0001-mieq-Bump-default-queue-size-to-512.patch # some hotplug fixes/workaround Patch7065: 0001-xfree86-hotplug-cleanup-properly-if-the-screen-fails.patch Patch7066: 0001-xf86crtc-don-t-use-display-for-vx-vy-for-gpu-screens.patch +# autoconfig: send events +Patch7067: 0001-autoconfig-fixup-tell-changed-so-randr-clients-can-t.patch %global moduledir %{_libdir}/xorg/modules %global drimoduledir %{_libdir}/dri @@ -616,6 +618,9 @@ rm -rf $RPM_BUILD_ROOT %{xserver_source_dir} %changelog +* Wed Dec 12 2012 Dave Airlie 1.13.0-14 +- add events for autoconfig of gpus devices, allow usb devices to notify gnome + * Wed Dec 12 2012 Dave Airlie 1.13.0-13 - fix hotplug issue with usb devices and large screens