commit xorg-x11-server.1642 for openSUSE:12.1:Update
Hello community, here is the log from the commit of package xorg-x11-server.1642 for openSUSE:12.1:Update checked in at 2013-05-10 16:28:44 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:12.1:Update/xorg-x11-server.1642 (Old) and /work/SRC/openSUSE:12.1:Update/.xorg-x11-server.1642.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Package is "xorg-x11-server.1642" Changes: -------- New Changes file: --- /dev/null 2013-05-09 10:40:33.472011256 +0200 +++ /work/SRC/openSUSE:12.1:Update/.xorg-x11-server.1642.new/xorg-x11-server.changes 2013-05-10 16:28:48.000000000 +0200 @@ -0,0 +1,3040 @@ +------------------------------------------------------------------- +Mon Apr 29 15:24:15 UTC 2013 - sndirsch@suse.com + +- U_xf86-fix-flush-input-to-work-with-Linux-evdev-device.patch + * So when we VT switch back and attempt to flush the input + devices, we don't succeed because evdev won't return part + of an event, since we were only asking for 4 bytes, we'd + only get -EINVAL back. This could later cause events to be + flushed that we shouldn't have gotten. + This is a fix for CVE-2013-1940. (bnc#814653) + +------------------------------------------------------------------- +Fri Mar 1 13:55:03 UTC 2013 - msrb@suse.com + +- N-VNC-Add-Xvnc-man-page.patch (bnc#798995) + +------------------------------------------------------------------- +Wed Nov 9 17:40:42 UTC 2011 - sndirsch@suse.com + +- u_record-fix-sig11.patch + * If you aren't using the Record extension (and you aren't), you + can work around the bug by moving the code which accesses the + (non-existant) request buffer inside the loop looking at the + recording contexts (of which there should be none). + (bnc #728964, fdo #36930) + +------------------------------------------------------------------- +Tue Oct 18 18:38:41 UTC 2011 - eich@suse.com + +- U_Don-t-call-deleted-Block-WakeupHandler.patch: + Don't call deleted Bloxk/WakeupHandler() - this avoids + crashes when handlers are unregistered from within a handler + which are in the call chain behind the current handler + (bnc #723777). + +------------------------------------------------------------------- +Tue Oct 18 06:42:32 UTC 2011 - eich@suse.com + +- zap_warning_xserver.diff: + Fix man page to match changed behavior. + +------------------------------------------------------------------- +Tue Sep 6 15:55:01 UTC 2011 - sndirsch@suse.com + +- update to xorg-server 1.10.4 +- VNC patches completely redone by Egbert Eich (N-VNC-*) +- Xvnc-pthread.diff: small buildfix required for factory +- removed obsolete patches + * EXA-mixed-ModifyPixmapHeader-pitch-fixes.-bug-33929.patch + * Replace-malloc-with-calloc-to-initialize-the-buffers.patch + * U_xserver_fix-pixmaps-lifetime-tracking.patch + * commit-5c6a2f9.diff + * pad-size-of-system-memory-copy-for-1x1-pixmaps + * record-avoid-crash-when-calling-RecordFlushReplyBuff.patch + * xorg-server-stop-cpu-eating.diff +- adjusted patches + * bug534768-prefer_local_symbols.patch + * zap_warning_xserver.diff +- disabled patches for now + * 0001-Xinput-Catch-missing-configlayout-when-deleting-dev.patch + * cache-xkbcomp-output-for-fast-start-up.patch + * xserver-bg-none-root.patch + * 0001-Prevent-XSync-Alarms-from-senslessly-calling-CheckTr.patch +- set VIDEO_ABI_VERSION = 10 and INPUT_ABI_VERSION = 12 in specfile + +------------------------------------------------------------------- +Tue Aug 30 13:53:46 UTC 2011 - sndirsch@suse.com + +- U_xserver_fix-pixmaps-lifetime-tracking.patch + * avoid crash when enabling the desktop icons in gnome3 + (bnc#701199) + +------------------------------------------------------------------- +Mon Aug 29 16:24:24 UTC 2011 - sndirsch@suse.com + +- u_xf4nvc_missing-libz.patch + * Xvnc no longer can rely on the toolchain to add the required + libs, it uses directly. + +------------------------------------------------------------------- +Fri Jul 8 08:20:41 UTC 2011 - eich@suse.de + +- update: + * randr1_1-sig11.diff + removed accidentally forgotten debugging code. + * u_OS-acpi-Reconnect-to-acpid-when-it-gets-restarted.patch + made socket non-blocking. Idea taken from a pach for SLES11. + +------------------------------------------------------------------- +Thu Jul 7 16:02:13 UTC 2011 - eich@suse.de + +- don't look for 10-evdev.conf for anything older than 11.3 + (this includes SLE-11). + +------------------------------------------------------------------- +Thu Jul 7 10:10:34 UTC 2011 - eich@suse.de + +- remove use-last-screen.patch: + This patch has been rejected upstream. We will try to resolve + this issue differently by not providing any screen, monitor or + device section. + +------------------------------------------------------------------- +Thu Jul 7 10:08:05 UTC 2011 - eich@suse.de + +- remove disable-fbblt-opt.diff: + We are unable to reproduce this issue any more. + So let's remove the workaround and start from scratch + when issue resurfaces and find a proper fix. + +------------------------------------------------------------------- +Wed Jul 6 09:04:30 UTC 2011 - eich@suse.de + +- fixed bug-197858_dpms.diff: + removed pieces that have been solved differently today. + +------------------------------------------------------------------- +Wed Jul 6 07:48:17 UTC 2011 - eich@suse.de + +- remove moblin-use_preferred_mode_for_all_outputs.diff: + remove moblin specific patches. + +------------------------------------------------------------------- +Tue Jul 5 13:54:21 UTC 2011 - eich@suse.de + +- rename edit_data_sanity_check.diff -> edid_data_sanity_check.diff + +------------------------------------------------------------------- +Tue Jul 5 13:44:54 UTC 2011 - eich@suse.de + +- remove p_xkills_wrong_client.diff: + made obsolete by commit b7f3618f. + +------------------------------------------------------------------- +Tue Jul 5 12:45:46 UTC 2011 - eich@suse.de + +- remove xorg-server-1.8.0.diff: + issue is now resolved in spec file. + +------------------------------------------------------------------- +Tue Jul 5 05:11:47 UTC 2011 - eich@suse.de + +- fix zap_warning_fix.diff: + recover from noisy people. + +------------------------------------------------------------------- +Tue Jul 5 05:09:40 UTC 2011 - eich@suse.de + +- remove p_xorg_acpi.diff + add u_OS-acpi-Reconnect-to-acpid-when-it-gets-restarted.patch + removed redundant error message. + +------------------------------------------------------------------- +Mon Jul 4 17:01:40 UTC 2011 - eich@suse.de + +- remove mouse.diff: + Never understood what this patch was good for. + +------------------------------------------------------------------- +Mon Jul 4 16:58:46 UTC 2011 - eich@suse.de + +- remove p_bug96328.diff: + /dev/input/mice is the default mouse for X -configure + on Linux for a long time already. + +------------------------------------------------------------------- +Mon Jul 4 12:19:43 UTC 2011 - eich@suse.de + +- remove xephyr.diff: + solved by configure options in spec file. + +------------------------------------------------------------------- +Mon Jul 4 12:10:14 UTC 2011 - eich@suse.de + +- remove libdrm.diff: + not needed any more, drivers seem to be fixed. + +------------------------------------------------------------------- +Mon Jul 4 11:32:31 UTC 2011 - eich@suse.de + +- remove xorg-docs.diff: + solved in spec file. + +------------------------------------------------------------------- +Mon Jul 4 10:06:49 UTC 2011 - eich@suse.de + +- remove pixman.diff: + Doesn't seem to be needed any more. + +------------------------------------------------------------------- +Mon Jul 4 05:58:11 UTC 2011 - eich@suse.de + +- remove xorg-x11-nonroot-vesa.patch, org-server-nohwaccess.diff: + There are other things missing to make those patches useful. + +------------------------------------------------------------------- +Fri Jul 1 14:18:49 UTC 2011 - eich@suse.de ++++ 2843 more lines (skipped) ++++ between /dev/null ++++ and /work/SRC/openSUSE:12.1:Update/.xorg-x11-server.1642.new/xorg-x11-server.changes New: ---- 0001-Check-harder-for-primary-PCI-device.patch 0001-Fix-segfault-when-killing-X-with-ctrl-alt-backspace.patch 0001-Prevent-XSync-Alarms-from-senslessly-calling-CheckTr.patch 0001-Xinput-Catch-missing-configlayout-when-deleting-dev.patch N-VNC-Add-Xvnc-man-page.patch N-VNC-Add-support-for-VNC.patch N-VNC-Don-t-let-VNC-access-the-framebuffer-directly-an.patch N-VNC-Enable-use-of-all-keyboard-layouts-independent-o.patch N-VNC-Fix-crash-due-to-unset-input-device-names.patch N-VNC-Fix-crash-when-no-depth-translation-is-required.patch N-VNC-Readd-timeout-when-vnc-viewer-connection-breaks.patch README.updates U_Don-t-call-deleted-Block-WakeupHandler.patch U_xf86-fix-flush-input-to-work-with-Linux-evdev-device.patch Use-external-tool-for-creating-backtraces-on-crashes.patch Xvnc-pthread.diff autoconfig_fallback_fbdev_first.diff bug-197858_dpms.diff bug474071-fix1.diff bug534768-prefer_local_symbols.patch cache-xkbcomp-output-for-fast-start-up.patch confine_to_shape.diff dpms_screensaver.diff driver-autoconfig.diff edid_data_sanity_check.diff fbdevhw.diff fix-dpi-values.diff fix_fglrx_screendepth_issue.patch modprobe.nvidia p_default-module-path.diff p_xnest-ignore-getimage-errors.diff pci-legacy-mem-fallback.diff pio_ia64.diff pu_fixes.diff randr1_1-sig11.diff sync-fix.patch sysconfig.displaymanager.template u_OS-acpi-Reconnect-to-acpid-when-it-gets-restarted.patch u_record-fix-sig11.patch vidmode-sig11.diff xorg-backtrace xorg-detect-psb.patch xorg-docs-1.6.tar.bz2 xorg-server-1.10.4.tar.bz2 xorg-server-xdmcp.patch xorg-x11-server.changes xorg-x11-server.spec xorgcfg.tar.bz2 xserver-bg-none-root.patch zap_warning_xserver.diff ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ xorg-x11-server.spec ++++++ # # spec file for package xorg-x11-server # # Copyright (c) 2013 SUSE LINUX Products GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed # upon. The license for this file, and modifications and additions to the # file, is the same license as for the pristine package itself (unless the # license for the pristine package is not an Open Source License, in which # case the license is the MIT License). An "Open Source License" is a # license that conforms to the Open Source Definition (Version 1.9) # published by the Open Source Initiative. # Please submit bugfixes or comments via http://bugs.opensuse.org/ # Name: xorg-x11-server %define dirsuffix 1.10.4 %define vnc 1 BuildRequires: Mesa-devel BuildRequires: bison BuildRequires: flex BuildRequires: fontconfig-devel BuildRequires: freetype2-devel BuildRequires: ghostscript-library BuildRequires: libdrm-devel BuildRequires: libopenssl-devel BuildRequires: pkgconfig BuildRequires: xorg-x11 BuildRequires: xorg-x11-devel BuildRequires: xorg-x11-fonts-devel BuildRequires: xorg-x11-libICE-devel BuildRequires: xorg-x11-libSM-devel BuildRequires: xorg-x11-libX11-devel BuildRequires: xorg-x11-libXau-devel BuildRequires: xorg-x11-libXdmcp-devel BuildRequires: xorg-x11-libXext-devel BuildRequires: xorg-x11-libXfixes-devel BuildRequires: xorg-x11-libXmu-devel BuildRequires: xorg-x11-libXp-devel BuildRequires: xorg-x11-libXpm-devel BuildRequires: xorg-x11-libXprintUtil-devel BuildRequires: xorg-x11-libXrender-devel BuildRequires: xorg-x11-libXt-devel BuildRequires: xorg-x11-libXv-devel BuildRequires: xorg-x11-libfontenc-devel BuildRequires: xorg-x11-libxkbfile-devel BuildRequires: xorg-x11-proto-devel BuildRequires: xorg-x11-xtrans-devel ### udev support (broken on openSUSE 11.2, see also bnc #589997) %if %suse_version > 1120 BuildRequires: libudev-devel %endif %if %vnc BuildRequires: libjpeg-devel %endif Url: http://xorg.freedesktop.org/ Version: 7.6_%{dirsuffix} Release: 0 BuildRoot: %{_tmppath}/%{name}-%{version}-build %ifnarch s390 s390x PreReq: %fillup_prereq %endif Requires: pkgconfig Requires: xorg-x11 Requires: xorg-x11-fonts-core %ifnarch s390 s390x Provides: INPUT_ABI_VERSION = 12 Provides: VIDEO_ABI_VERSION = 10 Requires: libpixman-1-0 >= 0.15.2 %endif Provides: xorg-x11-Xvfb Provides: xorg-x11-server-glx Obsoletes: xorg-x11-Xvfb Obsoletes: xorg-x11-server-glx Summary: X.Org Server License: GPL-2.0+ and MIT Group: System/X11/Servers/XF86_4 Source: xorg-server-%{dirsuffix}.tar.bz2 Source1: sysconfig.displaymanager.template Source3: README.updates Source4: xorgcfg.tar.bz2 Source5: modprobe.nvidia Source7: xorg-docs-1.6.tar.bz2 Source8: xorg-backtrace Patch2: p_default-module-path.diff Patch6: pu_fixes.diff Patch13: u_OS-acpi-Reconnect-to-acpid-when-it-gets-restarted.patch Patch16: p_xnest-ignore-getimage-errors.diff %if %vnc Patch17: N-VNC-Add-support-for-VNC.patch Patch18: N-VNC-Readd-timeout-when-vnc-viewer-connection-breaks.patch Patch19: N-VNC-Fix-crash-when-no-depth-translation-is-required.patch Patch20: N-VNC-Don-t-let-VNC-access-the-framebuffer-directly-an.patch Patch21: N-VNC-Enable-use-of-all-keyboard-layouts-independent-o.patch Patch22: N-VNC-Fix-crash-due-to-unset-input-device-names.patch Patch23: Xvnc-pthread.diff Patch24: N-VNC-Add-Xvnc-man-page.patch %endif Patch45: bug-197858_dpms.diff Patch77: fbdevhw.diff Patch79: edid_data_sanity_check.diff Patch101: zap_warning_xserver.diff Patch103: confine_to_shape.diff Patch106: randr1_1-sig11.diff Patch112: fix-dpi-values.diff Patch123: vidmode-sig11.diff Patch125: 0001-Xinput-Catch-missing-configlayout-when-deleting-dev.patch Patch127: dpms_screensaver.diff Patch128: pci-legacy-mem-fallback.diff Patch129: bug474071-fix1.diff Patch143: autoconfig_fallback_fbdev_first.diff Patch145: driver-autoconfig.diff Patch162: cache-xkbcomp-output-for-fast-start-up.patch Patch163: xserver-bg-none-root.patch Patch164: xorg-detect-psb.patch Patch200: bug534768-prefer_local_symbols.patch Patch202: 0001-Check-harder-for-primary-PCI-device.patch Patch203: 0001-Fix-segfault-when-killing-X-with-ctrl-alt-backspace.patch Patch206: fix_fglrx_screendepth_issue.patch Patch210: pio_ia64.diff Patch211: 0001-Prevent-XSync-Alarms-from-senslessly-calling-CheckTr.patch Patch213: xorg-server-xdmcp.patch Patch220: Use-external-tool-for-creating-backtraces-on-crashes.patch Patch222: sync-fix.patch Patch223: U_Don-t-call-deleted-Block-WakeupHandler.patch Patch224: u_record-fix-sig11.patch Patch225: U_xf86-fix-flush-input-to-work-with-Linux-evdev-device.patch %description This package contains the X.Org Server. %package extra Summary: Additional Xservers (Xdmx, Xephyr, Xnest) Group: System/X11/Servers/XF86_4 Provides: xorg-x11-Xnest Obsoletes: xorg-x11-Xnest Requires: Mesa Requires: xkeyboard-config Requires: xorg-x11 Requires: xorg-x11-fonts-core %description extra This package contains additional Xservers (Xdmx, Xephyr, Xnest). %package sdk Summary: X.Org Server SDK Group: System/Libraries Provides: xorg-x11-sdk Obsoletes: xorg-x11-sdk Requires: fontconfig-devel Requires: freetype2-devel Requires: libdrm-devel Requires: xorg-x11-devel Requires: xorg-x11-libICE-devel Requires: xorg-x11-libSM-devel Requires: xorg-x11-libX11-devel Requires: xorg-x11-libXau-devel Requires: xorg-x11-libXdmcp-devel Requires: xorg-x11-libXext-devel Requires: xorg-x11-libXfixes-devel Requires: xorg-x11-libXmu-devel Requires: xorg-x11-libXp-devel Requires: xorg-x11-libXpm-devel Requires: xorg-x11-libXprintUtil-devel Requires: xorg-x11-libXrender-devel Requires: xorg-x11-libXt-devel Requires: xorg-x11-libXv-devel Requires: xorg-x11-libfontenc-devel Requires: xorg-x11-libxkbfile-devel Requires: xorg-x11-proto-devel Requires: xorg-x11-server Requires: xorg-x11-xtrans-devel %description sdk This package contains the X.Org Server SDK. %if %vnc %package -n xorg-x11-Xvnc Summary: VNC Server for the X Window System Group: System/X11/Servers/XF86_4 Requires: xkeyboard-config Requires: xorg-x11 Requires: xorg-x11-fonts-core Provides: XFree86-Xvnc Provides: vnc:/usr/X11R6/bin/Xvnc Obsoletes: XFree86-Xvnc %ifarch ia64 Provides: vnc-x86 Obsoletes: vnc-x86 %endif %description -n xorg-x11-Xvnc An X Window System server for Virtual Network Computing (VNC). %endif %prep %setup -q -n xorg-server-%{dirsuffix} -a4 -a7 %patch2 %patch6 %patch13 -p1 %patch16 -p2 %if %vnc %patch17 -p1 %patch18 -p1 %patch19 -p1 %patch20 -p1 %patch21 -p1 %patch22 -p1 %patch23 -p1 %patch24 -p1 %endif %patch45 -p0 pushd xorg-docs-* popd %patch77 %patch79 -p1 %patch101 -p1 %patch103 %patch106 -p1 %patch112 -p0 %patch123 -p0 ### disabled for now #%patch125 -p1 %patch127 -p1 %patch128 pushd hw/xfree86/os-support/bus %patch129 -p0 popd %patch143 -p0 %patch145 -p0 ### disabled for now #%patch162 -p1 ### disabled for now #%patch163 -p1 %patch164 -p1 %patch200 -p1 %patch202 -p1 %patch203 -p1 %patch206 -p0 %patch210 -p1 ### disabled for now #%patch211 -p1 %patch213 -p1 # Disable backtrace generation patch for now #%patch220 -p1 %patch222 -p1 %patch223 -p2 %patch224 -p1 %patch225 -p1 %build pushd xorg-docs-* autoreconf -fi %configure CFLAGS="$RPM_OPT_FLAGS -fno-strict-aliasing" %{__make} %{?jobs:-j%jobs} popd autoreconf -fi %configure CFLAGS="$RPM_OPT_FLAGS -fno-strict-aliasing" \ --sysconfdir=/etc \ --enable-builddocs \ --enable-install-libxf86config \ --enable-xdmcp \ --enable-xdm-auth-1 \ --enable-dri \ --enable-dri2 \ --enable-dmx \ --enable-xnest \ --enable-kdrive \ --enable-kdrive-evdev \ --enable-xephyr \ --disable-xfake \ --disable-xfbdev \ --enable-record \ --enable-xcsecurity \ --with-sha1=libcrypto \ %ifarch s390 s390x --disable-xorg \ --disable-aiglx \ %else --enable-xorg \ %if %suse_version > 1120 --enable-config-udev \ %endif %endif %if %vnc --disable-xcliplist \ %endif --with-log-dir="/var/log" \ --with-os-name="openSUSE" \ --with-os-vendor="SUSE LINUX" \ --with-fontrootdir="/usr/share/fonts" \ --with-xkb-path="/usr/share/X11/xkb" \ --with-xkb-output="/var/lib/xkb/compiled" \ --with-default-font-path="/usr/share/fonts/misc:unscaled,\ /usr/share/fonts/Type1/,/usr/share/fonts/100dpi:unscaled,\ /usr/share/fonts/75dpi:unscaled,/usr/share/fonts/URW/,\ /usr/share/fonts/cyrillic:unscaled,\ /usr/share/fonts/truetype/,built-ins" make %{?jobs:-j %jobs} make -C hw/kdrive %{?jobs:-j %jobs} %install make -C xorg-docs-* install DESTDIR=$RPM_BUILD_ROOT make install DESTDIR=$RPM_BUILD_ROOT make -C hw/kdrive install DESTDIR=$RPM_BUILD_ROOT %ifnarch s390 s390x # remove .la files find $RPM_BUILD_ROOT/usr/%{_lib}/xorg/modules/ -name "*.la" | \ xargs rm install -m 644 hw/xfree86/parser/{xf86Parser.h,xf86Optrec.h} \ $RPM_BUILD_ROOT/usr/include/xorg # bnc #632737 chmod u-s $RPM_BUILD_ROOT/usr/bin/Xorg mkdir -p $RPM_BUILD_ROOT/var/lib/X11 ln -snf ../../../usr/bin/Xorg $RPM_BUILD_ROOT/var/lib/X11/X ln -snf ../../var/lib/X11/X $RPM_BUILD_ROOT/usr/bin/X %if %suse_version > 1120 %ifnarch s390 s390x mkdir -p $RPM_BUILD_ROOT/etc/X11/xorg.conf.d cp $RPM_BUILD_ROOT/%{_datadir}/X11/xorg.conf.d/10-evdev.conf $RPM_BUILD_ROOT/etc/X11/xorg.conf.d/ %endif %endif mkdir -p $RPM_BUILD_ROOT/usr/%{_lib}/xorg/modules/updates/{fonts,input,linux,drivers,multimedia,extensions} install -m 644 $RPM_SOURCE_DIR/README.updates $RPM_BUILD_ROOT/usr/%{_lib}/xorg/modules/updates mkdir -p $RPM_BUILD_ROOT/etc/modprobe.d install -m 644 $RPM_SOURCE_DIR/modprobe.nvidia $RPM_BUILD_ROOT/etc/modprobe.d/50-nvidia.conf %else rm -f $RPM_BUILD_ROOT/usr/share/aclocal/*.m4 %endif %if %vnc mkdir -p $RPM_BUILD_ROOT/etc/sysconfig/SuSEfirewall2.d/services cat > $RPM_BUILD_ROOT/etc/sysconfig/SuSEfirewall2.d/services/%{name} << EOF ## Name: VNC Server ## Description: Opens ports for VNC Server TCP="5801 5901" EOF %endif %ifarch s390 s390x rm $RPM_BUILD_ROOT/etc/X11/10-evdev.conf make -C hw/xfree86/parser mkdir -p $RPM_BUILD_ROOT/usr/include/xorg \ $RPM_BUILD_ROOT/usr/%{_lib} install -m 644 hw/xfree86/parser/{xf86Parser.h,xf86Optrec.h} \ $RPM_BUILD_ROOT/usr/include/xorg install -m 644 hw/xfree86/parser/libxf86config.a \ $RPM_BUILD_ROOT//usr/%{_lib} %endif %ifnarch s390 s390x mkdir -p %buildroot/var/adm/fillup-templates install -m 644 %_sourcedir/sysconfig.displaymanager.template \ %buildroot/var/adm/fillup-templates/sysconfig.displaymanager-%name %endif install -m 755 $RPM_SOURCE_DIR/xorg-backtrace $RPM_BUILD_ROOT/usr/bin/xorg-backtrace %clean rm -rf "$RPM_BUILD_ROOT" %ifnarch s390 s390x %verifyscript %verify_permissions -e /usr/bin/Xorg %endif %post %ifnarch s390 s390x %{fillup_only -an displaymanager} %run_permissions if [ -f etc/X11/xorg.conf ]; then # Document how to restore previous input driver behaviour in xorg.conf files created # on openSUSE <= 11.1 if ! grep -q "will be disabled unless 'Option \"AutoAddDevices\" \"off\"'" etc/X11/xorg.conf; then if ! grep -q "\"AutoAddDevices\" \"off\"" etc/X11/xorg.conf; then sed -i ' /Section "ServerFlags"/{ h g a\ # Uncomment the following option to reenable kbd/mouse driver input sections. \ # Otherwise evdev driver is used. \ #Option "AutoAddDevices" "off" } ' etc/X11/xorg.conf fi fi fi %endif exit 0 %files %defattr(-,root,root) %ifnarch s390 s390x %if %suse_version > 1120 %dir /etc/X11/xorg.conf.d %config(noreplace) /etc/X11/xorg.conf.d/10-evdev.conf %dir %{_datadir}/X11/xorg.conf.d %{_datadir}/X11/xorg.conf.d/10-evdev.conf %endif %dir /etc/modprobe.d %dir /var/lib/X11 %endif %dir /var/lib/xkb %dir /var/lib/xkb/compiled %dir /usr/%{_lib}/xorg /usr/%{_lib}/xorg/protocol.txt %{_mandir}/man1/* %{_mandir}/man7/* %doc %{_datadir}/doc/xorg-docs/ %exclude %{_mandir}/man1/Xdmx.1* %exclude %{_mandir}/man1/Xephyr.1* %exclude %{_mandir}/man1/Xnest.1* %exclude %{_mandir}/man7/Standards.7* %exclude %{_mandir}/man7/Consortium.7* %exclude %{_mandir}/man7/XProjectTeam.7* %exclude %{_mandir}/man7/XOrgFoundation.7* /var/lib/xkb/compiled/README.compiled %ifnarch s390 s390x /etc/modprobe.d/50-nvidia.conf %verify(not mode) /usr/bin/Xorg /usr/bin/X /usr/bin/Xvfb /usr/bin/cvt /usr/bin/gtf /usr/%{_lib}/xorg/modules/ %{_mandir}/man4/* %{_mandir}/man5/* /var/adm/fillup-templates/sysconfig.displaymanager-%name /var/lib/X11/X %endif /usr/bin/xorg-backtrace %files extra %defattr(-,root,root) /usr/bin/Xephyr /usr/bin/Xnest /usr/bin/Xdmx /usr/bin/dmxaddinput /usr/bin/dmxaddscreen /usr/bin/dmxinfo /usr/bin/dmxreconfig /usr/bin/dmxresize /usr/bin/dmxrminput /usr/bin/dmxrmscreen /usr/bin/dmxtodmx /usr/bin/dmxwininfo /usr/bin/vdltodmx /usr/bin/xdmxconfig %{_mandir}/man1/Xdmx.1* %{_mandir}/man1/Xephyr.1* %{_mandir}/man1/Xnest.1* %files sdk %defattr(-,root,root) /usr/include/xorg/ /usr/%{_lib}/*.a %ifnarch s390 s390x %exclude /usr/%{_lib}/libxf86config.la /usr/%{_lib}/pkgconfig/*.pc /usr/share/aclocal/*.m4 %endif %if %vnc %files -n xorg-x11-Xvnc %defattr(-, root, root) /etc/sysconfig/SuSEfirewall2.d/services/%{name} /usr/bin/Xvnc %endif %changelog ++++++ 0001-Check-harder-for-primary-PCI-device.patch ++++++
From 35540106538b24ca1765e752fe9d6efc968a88fa Mon Sep 17 00:00:00 2001 From: Egbert Eich <eich@linux-p1mv.site> Date: Wed, 7 Oct 2009 16:31:44 +0200 Subject: [PATCH] Check harder for primary PCI device.
Primary PCI devices are identified by checking for an 'PCIINFOCLASSES' device which is VGA and has access to the memory bars enabled. If there should be more than one device for which this is true redo the check and also check if IO resoures are also enabled, if this still doesn't turn up a unique result also check for the presence of a BIOS rom. ================================================================================ --- xorg-server-1.7.99/hw/xfree86/common/xf86pciBus.c +++ xorg-server-1.7.99/hw/xfree86/common/xf86pciBus.c @@ -140,9 +140,49 @@ primaryBus.type = BUS_PCI; primaryBus.id.pci = info; } else { - xf86Msg(X_NOTICE, - "More than one possible primary device found\n"); - primaryBus.type ^= (BusType)(-1); + /* + * Ok, we found more than one possible primary device with this heuristic + * Now also check if IO is enabled. + */ + int j; + + primaryBus.type = BUS_NONE; + for (j = 0; j < num; j++) { + info = xf86PciVideoInfo[j]; + pci_device_cfg_read_u16(info, & command, 4); + + if ((command & PCI_CMD_MEM_ENABLE) + && (command & PCI_CMD_IO_ENABLE) + && (IS_VGA(info->device_class))) { + if (primaryBus.type == BUS_NONE) { + primaryBus.type = BUS_PCI; + primaryBus.id.pci = info; + } else { + primaryBus.type = BUS_NONE; + for (j = 0; j < num; j++) { + info = xf86PciVideoInfo[j]; + pci_device_cfg_read_u16(info, & command, 4); + + if ((command & PCI_CMD_MEM_ENABLE) + && (command & PCI_CMD_IO_ENABLE) + && (IS_VGA(info->device_class)) + && info->rom_size) { + if (primaryBus.type == BUS_NONE) { + primaryBus.type = BUS_PCI; + primaryBus.id.pci = info; + } else { + xf86Msg(X_NOTICE, + "More than one possible primary device found\n"); + primaryBus.type ^= (BusType)(-1); + break; + } + } + } + break; + } + } + } + break; } } } ++++++ 0001-Fix-segfault-when-killing-X-with-ctrl-alt-backspace.patch ++++++ --- xorg-server-1.9.0/mi/misprite.c.orig 2010-07-23 21:40:56.000000000 +0200 +++ xorg-server-1.9.0/mi/misprite.c 2010-08-23 15:44:51.000000000 +0200 @@ -384,6 +384,7 @@ miSpriteCloseScreen (int i, ScreenPtr pS pScreen->InstallColormap = pScreenPriv->InstallColormap; pScreen->StoreColors = pScreenPriv->StoreColors; + miSpriteDisableDamage(pScreen, pScreenPriv); DamageDestroy (pScreenPriv->pDamage); free(pScreenPriv); ++++++ 0001-Prevent-XSync-Alarms-from-senslessly-calling-CheckTr.patch ++++++
From d1d9d4e5f8f9ac1d22e1258759d6ee9e49c7fe90 Mon Sep 17 00:00:00 2001 From: Egbert Eich <eich@freedesktop.org> Date: Fri, 9 Apr 2010 15:10:32 +0200 Subject: [PATCH] Prevent XSync Alarms from senslessly calling CheckTrigger() when inactive.
If an XSync Alarm is set to inactive there is no need to check if a trigger needs to fire. Doing so if the counter is the IdleCounter will put the server on 100 percent CPU load since the select timeout is set to 0. --- xorg-server-1.8.0/Xext/sync.c | 11 +++++++++-- xorg-server-1.8.0/Xext/syncsrv.h | 1 + 2 files changed, 10 insertions(+), 2 deletions(-) Index: xorg-server-1.8.0/Xext/sync.c =================================================================== --- xorg-server-1.8.0.orig/Xext/sync.c +++ xorg-server-1.8.0/Xext/sync.c @@ -518,6 +518,10 @@ SyncAlarmTriggerFired(SyncTrigger *pTrig pAlarm->state = XSyncAlarmInactive; } } + /* Stop server from looping! */ + if (pAlarm->state == XSyncAlarmInactive) + SyncDeleteTriggerFromCounter(&pAlarm->trigger); + /* The AlarmNotify event has to have the "new state of the alarm" * which we can't be sure of until this point. However, it has * to have the "old" trigger test value. That's the reason for @@ -730,7 +734,7 @@ SyncChangeAlarmAttributes(ClientPtr clie XSyncCounter counter; Mask origmask = mask; - counter = pAlarm->trigger.pCounter ? pAlarm->trigger.pCounter->id : None; + counter = pAlarm->counter_id; while (mask) { @@ -741,7 +745,7 @@ SyncChangeAlarmAttributes(ClientPtr clie case XSyncCACounter: mask &= ~XSyncCACounter; /* sanity check in SyncInitTrigger */ - counter = *values++; + counter = pAlarm->counter_id = *values++; break; case XSyncCAValueType: @@ -808,6 +812,14 @@ SyncChangeAlarmAttributes(ClientPtr clie return BadMatch; } } + if (pAlarm->state == XSyncAlarmInactive) { + /* + * If we are inactive the trigger has been deleted from the counter. + * Persuade SyncInitTrigger() to readd it. + */ + origmask |= XSyncCACounter; + pAlarm->trigger.pCounter = NULL; + } /* postpone this until now, when we're sure nothing else can go wrong */ if ((status = SyncInitTrigger(client, &pAlarm->trigger, counter, @@ -815,6 +827,7 @@ SyncChangeAlarmAttributes(ClientPtr clie return status; /* XXX spec does not really say to do this - needs clarification */ + /* It's the only place where it is set to XSyncAlarmActive! */ pAlarm->state = XSyncAlarmActive; return Success; } @@ -1617,8 +1630,10 @@ ProcSyncCreateAlarm(ClientPtr client) pAlarm->client = client; pAlarm->alarm_id = stuff->id; + pAlarm->counter_id = None; XSyncIntToValue(&pAlarm->delta, 1L); pAlarm->events = TRUE; + /* SyncChangeAlarmAttributes() changes this - no need to set this here! */ pAlarm->state = XSyncAlarmInactive; pAlarm->pEventClients = NULL; status = SyncChangeAlarmAttributes(client, pAlarm, vmask, Index: xorg-server-1.8.0/Xext/syncsrv.h =================================================================== --- xorg-server-1.8.0.orig/Xext/syncsrv.h +++ xorg-server-1.8.0/Xext/syncsrv.h @@ -129,6 +129,7 @@ typedef struct _SyncAlarm { int events; int state; SyncAlarmClientList *pEventClients; + XSyncCounter counter_id; } SyncAlarm; typedef struct { ++++++ 0001-Xinput-Catch-missing-configlayout-when-deleting-dev.patch ++++++
From 829037395f8b93e69a30852a95e378f78c3ccd6b Mon Sep 17 00:00:00 2001 From: Luc Verhaegen <libv@skynet.be> Date: Wed, 12 Nov 2008 17:09:33 +0100 Subject: [PATCH] Xinput: Catch missing configlayout when deleting device.
In DeleteInputDeviceRequest (xf86Xinput.c), we access idev members even if idev is null. This takes down the xserver hard in some cases (kernel SIGABRT), and segfaults on other cases. ================================================================================ --- xorg-server-1.7.99/hw/xfree86/common/xf86Xinput.c +++ xorg-server-1.7.99/hw/xfree86/common/xf86Xinput.c @@ -870,17 +870,20 @@ else xf86DeleteInput(pInfo, 0); - /* devices added through HAL aren't in the config layout */ - it = xf86ConfigLayout.inputs; - while(*it && *it != idev) - it++; - - if (!(*it)) /* end of list, not in the layout */ + if (idev) { - free(idev->driver); - free(idev->identifier); - xf86optionListFree(idev->commonOptions); - free(idev); + /* devices added through HAL aren't in the config layout */ + it = xf86ConfigLayout.inputs; + while(*it && *it != idev) + it++; + + if (!(*it)) /* end of list, not in the layout */ + { + free(idev->driver); + free(idev->identifier); + xf86optionListFree(idev->commonOptions); + free(idev); + } } } OsReleaseSignals(); ++++++ N-VNC-Add-Xvnc-man-page.patch ++++++ --- xorg-server-1.12.3.orig/configure.ac 2013-02-28 20:04:18.000000000 +0100 +++ xorg-server-1.12.3/configure.ac 2013-02-28 20:05:04.000000000 +0100 @@ -2261,6 +2261,7 @@ hw/dmx/man/Makefile hw/dmx/vnc/Makefile hw/vnc/Makefile +hw/vnc/man/Makefile hw/vfb/Makefile hw/vfb/man/Makefile hw/xnest/Makefile --- xorg-server-1.12.3.orig/hw/vnc/Makefile.am 2013-02-28 19:51:59.000000000 +0100 +++ xorg-server-1.12.3/hw/vnc/Makefile.am 2013-02-28 19:52:14.000000000 +0100 @@ -1,5 +1,7 @@ # XXX This Makefile.am probably needs some work. +SUBDIRS = man + bin_PROGRAMS = Xvnc Xvnc_SOURCES = \ --- /dev/null 2013-02-18 14:59:34.961000208 +0100 +++ xorg-server-1.12.3/hw/vnc/man/Xvnc.man 2013-02-28 18:43:58.000000000 +0100 @@ -0,0 +1,155 @@ +'\" t +.\" ** The above line should force tbl to be a preprocessor ** +.\" Man page for Xvnc +.\" +.\" Copyright (C) 1998 Marcus.Brinkmann@ruhr-uni-bochum.de +.\" Copyright (C) 2000, 2001 Red Hat, Inc. +.\" Copyright (C) 2001, 2002 Constantin Kaplinsky <const@ce.cctpu.edu.ru> +.\" +.\" You may distribute under the terms of the GNU General Public +.\" License as specified in the file LICENCE.TXT that comes with the +.\" TightVNC distribution. +.\" +.TH Xvnc 1 "August 2002" "" "TightVNC" +.SH NAME +Xvnc \- an X server providing VNC connectivity +.SH SYNOPSIS +.TP +\fBXvnc\fR +[:\fIdisplay\fR] +[\-geometry \fIwidth\fRx\fIheight\fR] [\-depth \fIdepth\fR] +[\-pixelformat rgb\fINNN\fR|bgr\fINNN\fR] [\-udpinputport \fIport\fR] +[\-rfbport \fIport\fR] [\-rfbwait \fItime\fR] [\-nocursor] +[\-rfbauth \fIpasswd-file\fR] [\-httpd \fIdir\fR] +[\-httpport \fIport\fR] [\-deferupdate \fItime\fR] +[\-economictranslate] [\-lazytight] [\-desktop \fIname\fR] [\-alwaysshared] +[\-nevershared] [\-dontdisconnect] [\-viewonly] [\-localhost] +[\-interface ipaddr] [\-inetd] +[\fIX-options\fR...] +.SH DESCRIPTION +\fBXvnc\fR is a VNC (Virtual Network Computing) server. It acts like +an X server with a virtual display. The display can be seen by a VNC +viewer application, which may be running on a different machine: see +\fBvncviewer\fR(1). Xvnc is built inside the source code tree of +XFree86, and shares many options with it. + +Normally, you don't need to start Xvnc manually; use the +\fBvncserver\fR(1) wrapper script instead. This script sets reasonable +defaults for Xvnc session, checks many error conditions etc. + +Please read the \fBBUGS\fR section if you plan to use VNC on an +untrusted network. +.SH OPTIONS +Xvnc supports many standard X server options and a number of +VNC-specific options. To see what standard X server options are +supported, please look at the \fBXvnc\fR \fI\-help\fR output and read +the \fBXserver\fR(1) manual page for details on those options. + +The VNC-specific options are as follows: +.TP +\fB\-geometry\fR \fIwidth\fR\fBx\fR\fIheight\fR +Set desktop width and height. +.TP +\fB\-depth\fR \fIdepth\fR +Set the colour depth of the visual to provide, in bits per pixel. Must +be a value between 8 and 32. +.TP +\fB\-pixelformat\fR \fBrgb\fR\fINNN\fR|\fBbgr\fR\fINNN\fR +Set colour format for pixels representation. The viewer can do the +conversion to any other pixel format, but it is faster if the depth +and pixel format of the server is the same as the equivalent values on +the viewer display. +.TP +\fB\-udpinputport\fR \fIport\fR +UDP port for keyboard/pointer data. +.TP +\fB\-rfbport\fR \fIport\fR +TCP port for RFB protocol. The RFB protocol is used for commnunication +between VNC server and clients. +.TP +\fB\-rfbwait\fR \fItime\fR +Maximum time, in milliseconds, to wait for an RFB client (VNC viewer). +.TP +\fB\-nocursor\fR +Don't put up a pointer cursor on the desktop. +.TP +\fB\-rfbauth\fR \fIpasswd-file\fR +Use authentication on RFB protocol from the specified file. The +\fIpasswd-file\fR can be created using the \fBvncpasswd\fR(1) utility. +.TP +\fB\-httpd\fR \fIdir\fR +Serve files via HTTP protocol from the specified directory. Normally, +Java viewer classes are stored in such directory. +.TP +\fB\-httpport\fR \fIport\fR +TCP port on which Xvnc should listen for incoming HTTP connections (to +allow access to the desktop from any Java-capable browser). +.TP +\fB\-deferupdate\fR \fItime\fR +Time in milliseconds, to defer screen updates (default 40). Deferring +updates helps to coalesce many small desktop changes into a few larger +updates thus saving network bandwidth. +.TP +\fB\-economictranslate\fR +Use less memory-hungry pixel format translation. +.TP +\fB\-lazytight\fR +Disable the "gradient" filter in Tight encoding (TightVNC-specific). +The "gradient" filter often helps to improve data compression ratios, +but may slow down the server performance. Please note that this filter +is never used when a client enables JPEG compression in the Tight +encoding. +.TP +\fB\-desktop\fR \fIname\fR +Set VNC desktop name ("x11" by default). +.TP +\fB\-alwaysshared\fR +Always treat new clients as shared, never disconnect existing client +on a new client connection. +.TP +\fB\-nevershared\fR +Never treat new clients as shared, do not allow several simultaneous +client connections. +.TP +\fB\-dontdisconnect\fR +Don't disconnect existing clients when a new non-shared connection +comes in, refuse new connection instead. +.TP +\fB\-viewonly\fR +Don't accept keboard and pointer events from clients. All clients will +be able to see the desktop but won't be able to control it. +.TP +\fB\-localhost\fR +Only allow loopback connections from localhost. This option is useful +in conjunction with SSH tunneling. +.TP +\fB\-interface\fR \fIipaddr\fR +Listen for client connections only on the network interface with given +\fIipaddr\fR. +.TP +\fB\-inetd\fR +Xvnc is launched by inetd. This option causes \fBXvnc\fR to redirect +network input/output to stdin/stdout. +.SH BUGS +There are many security problems in current Xvnc implementation. It's +recommended to restrict network access to Xvnc servers from untrusted +network adresses. Probably, the best way to secure Xvnc server is to +allow only loopback connections from the server machine (the +\fI\-localhost\fR option) and to use SSH tunneling for remote access +to the Xvnc server. For details on SSH tunneling, see +<URL:http://www.uk.research.att.com/vnc/sshvnc.html> . +.SH SEE ALSO +\fBvncserver\fR(1), \fBvncviewer\fR(1), \fBvncpasswd\fR(1), +\fBvncconnect\fR(1), \fBsshd\fR(1) +.SH AUTHORS +Original VNC was developed in AT&T Laboratories Cambridge. TightVNC +additions was implemented by Constantin Kaplinsky. Many other people +participated in development, testing and support. + +\fBMan page authors:\fR +.br +Marcus Brinkmann <Marcus.Brinkmann@ruhr-uni-bochum.de>, +.br +Tim Waugh <twaugh@redhat.com>, +.br +Constantin Kaplinsky <const@ce.cctpu.edu.ru> --- /dev/null 2013-02-18 14:59:34.961000208 +0100 +++ xorg-server-1.12.3/hw/vnc/man/Makefile.am 2012-07-09 02:44:01.000000000 +0200 @@ -0,0 +1,2 @@ +include $(top_srcdir)/manpages.am +appman_PRE = Xvnc.man ++++++ N-VNC-Add-support-for-VNC.patch ++++++ ++++ 23764 lines (skipped) ++++++ N-VNC-Don-t-let-VNC-access-the-framebuffer-directly-an.patch ++++++ From: Michal Srb <msrb@suse.cz> Date: Tue, 6 Sep 2011 13:08:25 +0200 Subject: [PATCH 4/6] VNC: Don't let VNC access the framebuffer directly any more. Patch-Mainline: Currently no upstream project. Git-commit: 3e0de1d95b3ffd3988016b2d3f40f577393ad046 Signed-off: Egbert Eich <eich@suse.de> References: bnc #653915 It seems that accessing the framebuffer directly is not a good idea anymore. This patch will let the tight encoding read the screen data using GetImage. It may be little slower, but not dramatically - it already does few GetImage calls on every repaint now. Signed-off-by: Egbert Eich <eich@freedesktop.org> --- hw/vnc/tight.c | 69 ++++++++++++++++++++++++++++++--------------- hw/vnc/vncext.c | 19 ++---------- hw/xfree86/vnc/vncInit.c | 11 ++----- hw/xfree86/vnc/vncint.h | 2 - 4 files changed, 53 insertions(+), 48 deletions(-) diff --git a/hw/vnc/tight.c b/hw/vnc/tight.c index 5c54736..f27c73e 100644 --- a/hw/vnc/tight.c +++ b/hw/vnc/tight.c @@ -109,15 +109,17 @@ static unsigned char *tightAfterBuf = NULL; static int *prevRowBuf = NULL; +static unsigned char* fakeFrameBuffer = NULL; + /* Prototypes for static functions. */ -static void FindBestSolidArea (ScreenPtr pScreen, int x, int y, int w, int h, +static void FindBestSolidArea (rfbClientPtr cl, int x, int y, int w, int h, CARD32 colorValue, int *w_ptr, int *h_ptr); -static void ExtendSolidArea (ScreenPtr pScreen, int x, int y, int w, int h, +static void ExtendSolidArea (rfbClientPtr cl, int x, int y, int w, int h, CARD32 colorValue, int *x_ptr, int *y_ptr, int *w_ptr, int *h_ptr); -static Bool CheckSolidTile (ScreenPtr pScreen, int x, int y, int w, int h, +static Bool CheckSolidTile (rfbClientPtr cl, int x, int y, int w, int h, CARD32 *colorPtr, Bool needSameColor); static Bool CheckSolidTile8 (ScreenPtr pScreen, int x, int y, int w, int h, CARD32 *colorPtr, Bool needSameColor); @@ -126,6 +128,7 @@ static Bool CheckSolidTile16 (ScreenPtr pScreen, int x, int y, int w, int h, static Bool CheckSolidTile32 (ScreenPtr pScreen, int x, int y, int w, int h, CARD32 *colorPtr, Bool needSameColor); +static Bool SendRectEncodingTight(rfbClientPtr cl, int x, int y, int w, int h); static Bool SendRectSimple (rfbClientPtr cl, int x, int y, int w, int h); static Bool SendSubrect (rfbClientPtr cl, int x, int y, int w, int h); static Bool SendTightHeader (rfbClientPtr cl, int x, int y, int w, int h); @@ -211,6 +214,25 @@ rfbSendRectEncodingTight(rfbClientPtr cl, int x, int y, int w, int h) { VNCSCREENPTR(cl->pScreen); + + /* Copy the rectangle to the fake buffer for CheckSolidTile functions. */ + + if(!fakeFrameBuffer) fakeFrameBuffer = malloc(pVNC->width * pVNC->height * cl->format.bitsPerPixel / 8); + (*cl->translateFn)(cl->pScreen, cl->translateLookupTable, + &pVNC->rfbServerFormat, + &cl->format, fakeFrameBuffer + (y * pVNC->width * cl->format.bitsPerPixel / 8), + pVNC->paddedWidthInBytes, pVNC->width, h, 0, y); + + /* Call the inner part */ + + return SendRectEncodingTight(cl, x, y, w, h); +} + +static Bool +SendRectEncodingTight(rfbClientPtr cl, + int x, int y, int w, int h) +{ + VNCSCREENPTR(cl->pScreen); int nMaxRows; CARD32 colorValue; int dx, dy, dw, dh; @@ -247,7 +269,7 @@ rfbSendRectEncodingTight(rfbClientPtr cl, nMaxWidth = (w > maxRectWidth) ? maxRectWidth : w; nMaxRows = maxRectSize / nMaxWidth; } - + /* Try to find large solid-color areas and send them separately. */ for (dy = y; dy < y + h; dy += MAX_SPLIT_TILE_SIZE) { @@ -269,11 +291,11 @@ rfbSendRectEncodingTight(rfbClientPtr cl, dw = (dx + MAX_SPLIT_TILE_SIZE <= x + w) ? MAX_SPLIT_TILE_SIZE : (x + w - dx); - if (CheckSolidTile(cl->pScreen, dx, dy, dw, dh, &colorValue, FALSE)) { + if (CheckSolidTile(cl, dx, dy, dw, dh, &colorValue, FALSE)) { /* Get dimensions of solid-color area. */ - FindBestSolidArea(cl->pScreen, dx, dy, w - (dx - x), h - (dy - y), + FindBestSolidArea(cl, dx, dy, w - (dx - x), h - (dy - y), colorValue, &w_best, &h_best); /* Make sure a solid rectangle is large enough @@ -286,7 +308,7 @@ rfbSendRectEncodingTight(rfbClientPtr cl, /* Try to extend solid rectangle to maximum size. */ x_best = dx; y_best = dy; - ExtendSolidArea(cl->pScreen, x, y, w, h, colorValue, + ExtendSolidArea(cl, x, y, w, h, colorValue, &x_best, &y_best, &w_best, &h_best); /* Send rectangles at top and left to solid-color area. */ @@ -295,7 +317,7 @@ rfbSendRectEncodingTight(rfbClientPtr cl, !SendRectSimple(cl, x, y, w, y_best-y) ) return FALSE; if ( x_best != x && - !rfbSendRectEncodingTight(cl, x, y_best, + !SendRectEncodingTight(cl, x, y_best, x_best-x, h_best) ) return FALSE; @@ -316,11 +338,11 @@ rfbSendRectEncodingTight(rfbClientPtr cl, /* Send remaining rectangles (at right and bottom). */ if ( x_best + w_best != x + w && - !rfbSendRectEncodingTight(cl, x_best+w_best, y_best, + !SendRectEncodingTight(cl, x_best+w_best, y_best, w-(x_best-x)-w_best, h_best) ) return FALSE; if ( y_best + h_best != y + h && - !rfbSendRectEncodingTight(cl, x, y_best+h_best, + !SendRectEncodingTight(cl, x, y_best+h_best, w, h-(y_best-y)-h_best) ) return FALSE; @@ -339,7 +361,7 @@ rfbSendRectEncodingTight(rfbClientPtr cl, } static void -FindBestSolidArea(ScreenPtr pScreen, +FindBestSolidArea(rfbClientPtr cl, int x, int y, int w, int h, CARD32 colorValue, int *w_ptr, int *h_ptr) @@ -357,13 +379,13 @@ FindBestSolidArea(ScreenPtr pScreen, dw = (w_prev > MAX_SPLIT_TILE_SIZE) ? MAX_SPLIT_TILE_SIZE : w_prev; - if (!CheckSolidTile(pScreen, x, dy, dw, dh, &colorValue, TRUE)) + if (!CheckSolidTile(cl, x, dy, dw, dh, &colorValue, TRUE)) break; for (dx = x + dw; dx < x + w_prev;) { dw = (dx + MAX_SPLIT_TILE_SIZE <= x + w_prev) ? MAX_SPLIT_TILE_SIZE : (x + w_prev - dx); - if (!CheckSolidTile(pScreen, dx, dy, dw, dh, &colorValue, TRUE)) + if (!CheckSolidTile(cl, dx, dy, dw, dh, &colorValue, TRUE)) break; dx += dw; } @@ -380,7 +402,7 @@ FindBestSolidArea(ScreenPtr pScreen, } static void -ExtendSolidArea(ScreenPtr pScreen, int x, int y, int w, int h, +ExtendSolidArea(rfbClientPtr cl, int x, int y, int w, int h, CARD32 colorValue, int *x_ptr, int *y_ptr, int *w_ptr, int *h_ptr) { @@ -388,7 +410,7 @@ ExtendSolidArea(ScreenPtr pScreen, int x, int y, int w, int h, /* Try to extend the area upwards. */ for ( cy = *y_ptr - 1; - cy >= y && CheckSolidTile(pScreen, *x_ptr, cy, *w_ptr, 1, &colorValue, TRUE); + cy >= y && CheckSolidTile(cl, *x_ptr, cy, *w_ptr, 1, &colorValue, TRUE); cy-- ); *h_ptr += *y_ptr - (cy + 1); *y_ptr = cy + 1; @@ -396,13 +418,13 @@ ExtendSolidArea(ScreenPtr pScreen, int x, int y, int w, int h, /* ... downwards. */ for ( cy = *y_ptr + *h_ptr; cy < y + h && - CheckSolidTile(pScreen, *x_ptr, cy, *w_ptr, 1, &colorValue, TRUE); + CheckSolidTile(cl, *x_ptr, cy, *w_ptr, 1, &colorValue, TRUE); cy++ ); *h_ptr += cy - (*y_ptr + *h_ptr); /* ... to the left. */ for ( cx = *x_ptr - 1; - cx >= x && CheckSolidTile(pScreen, cx, *y_ptr, 1, *h_ptr, &colorValue, TRUE); + cx >= x && CheckSolidTile(cl, cx, *y_ptr, 1, *h_ptr, &colorValue, TRUE); cx-- ); *w_ptr += *x_ptr - (cx + 1); *x_ptr = cx + 1; @@ -410,7 +432,7 @@ ExtendSolidArea(ScreenPtr pScreen, int x, int y, int w, int h, /* ... to the right. */ for ( cx = *x_ptr + *w_ptr; cx < x + w && - CheckSolidTile(pScreen, cx, *y_ptr, 1, *h_ptr, &colorValue, TRUE); + CheckSolidTile(cl, cx, *y_ptr, 1, *h_ptr, &colorValue, TRUE); cx++ ); *w_ptr += cx - (*x_ptr + *w_ptr); } @@ -423,11 +445,12 @@ ExtendSolidArea(ScreenPtr pScreen, int x, int y, int w, int h, */ static Bool -CheckSolidTile(ScreenPtr pScreen, int x, int y, int w, int h, CARD32 *colorPtr, +CheckSolidTile(rfbClientPtr cl, int x, int y, int w, int h, CARD32 *colorPtr, Bool needSameColor) { - VNCSCREENPTR(pScreen); - switch(pVNC->rfbServerFormat.bitsPerPixel) { + ScreenPtr pScreen = cl->pScreen; + + switch(cl->format.bitsPerPixel) { case 32: return CheckSolidTile32(pScreen, x, y, w, h, colorPtr, needSameColor); case 16: @@ -449,7 +472,7 @@ static Bool \ int dx, dy; \ \ fbptr = (CARD##bpp *) \ - &pVNC->pfbMemory[y * pVNC->paddedWidthInBytes + x * (bpp/8)]; \ + &fakeFrameBuffer[(y * pVNC->width + x) * (bpp/8)]; \ \ colorValue = *fbptr; \ if (needSameColor && (CARD32)colorValue != *colorPtr) \ @@ -460,7 +483,7 @@ static Bool \ if (colorValue != fbptr[dx]) \ return FALSE; \ } \ - fbptr = (CARD##bpp *)((CARD8 *)fbptr + pVNC->paddedWidthInBytes); \ + fbptr = (CARD##bpp *)((CARD8 *)fbptr + pVNC->width * (bpp/8)); \ } \ \ *colorPtr = (CARD32)colorValue; \ diff --git a/hw/vnc/vncext.c b/hw/vnc/vncext.c index ea913b7..534f3f5 100644 --- a/hw/vnc/vncext.c +++ b/hw/vnc/vncext.c @@ -702,15 +702,7 @@ CreateResourceTypes(void) static unsigned long vncExtGeneration = 0; #if XFREE86VNC -extern Bool VNCInit(ScreenPtr pScreen, unsigned char *FBStart); - -/* copied from miscrinit.c */ -typedef struct -{ - pointer pbits; /* pointer to framebuffer */ - int width; /* delta to add to a framebuffer addr to move one row down */ -} miScreenInitParmsRec, *miScreenInitParmsPtr; - +extern Bool VNCInit(ScreenPtr pScreen); static Bool vncCreateScreenResources(ScreenPtr pScreen) @@ -719,9 +711,6 @@ vncCreateScreenResources(ScreenPtr pScreen) CreateScreenResourcesProcPtr CreateScreenResources = (CreateScreenResourcesProcPtr) dixLookupPrivate(&pScreen->devPrivates, vncCreateScreenResourcesKey); - miScreenInitParmsPtr pScrInitParms; - - pScrInitParms = (miScreenInitParmsPtr)pScreen->devPrivate; if ( pScreen->CreateScreenResources != vncCreateScreenResources ) { /* Can't find hook we are hung on */ @@ -732,9 +721,6 @@ vncCreateScreenResources(ScreenPtr pScreen) (void *) pScreen->CreateScreenResources ); } - /* Now do our stuff */ - VNCInit(pScreen, pScrInitParms->pbits); - /* Unhook this function ... */ pScreen->CreateScreenResources = CreateScreenResources; dixSetPrivate(&pScreen->devPrivates, vncCreateScreenResourcesKey, NULL); @@ -744,6 +730,9 @@ vncCreateScreenResources(ScreenPtr pScreen) ret = (*pScreen->CreateScreenResources)(pScreen); } + /* Now do our stuff */ + VNCInit(pScreen); + #ifdef DEBUG ErrorF("vncCreateScreenResources() returns %d\n", ret); #endif diff --git a/hw/xfree86/vnc/vncInit.c b/hw/xfree86/vnc/vncInit.c index 4a124fb..8b2fa5f 100644 --- a/hw/xfree86/vnc/vncInit.c +++ b/hw/xfree86/vnc/vncInit.c @@ -49,7 +49,7 @@ extern void VncExtensionInit(void); extern void vncInitMouse(void); extern void vncInitKeyb(void); -Bool VNCInit(ScreenPtr pScreen, unsigned char *FBStart); +Bool VNCInit(ScreenPtr pScreen); #ifndef XFree86LOADER static unsigned long VNCGeneration = 0; @@ -151,7 +151,7 @@ void rfbLogPerror(char *str) * Called by vncCreateScreenResources() */ Bool -VNCInit(ScreenPtr pScreen, unsigned char *FBStart) +VNCInit(ScreenPtr pScreen) { ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; VisualPtr visual; @@ -164,9 +164,6 @@ VNCInit(ScreenPtr pScreen, unsigned char *FBStart) PictureScreenPtr ps; #endif - if (!FBStart) - return FALSE; - #ifndef XFree86LOADER if (VNCGeneration != serverGeneration) { VncExtensionInit(); @@ -287,9 +284,7 @@ VNCInit(ScreenPtr pScreen, unsigned char *FBStart) pScreenPriv->depth = pScrn->depth; pScreenPriv->paddedWidthInBytes = PixmapBytePad(pScrn->displayWidth, pScrn->depth); pScreenPriv->bitsPerPixel = rfbBitsPerPixel(pScrn->depth); - pScreenPriv->pfbMemory = FBStart; - pScreenPriv->oldpfbMemory = FBStart; - + pScreenPriv->cursorIsDrawn = TRUE; pScreenPriv->dontSendFramebufferUpdate = FALSE; diff --git a/hw/xfree86/vnc/vncint.h b/hw/xfree86/vnc/vncint.h index 18a3630..9e4a36f 100644 --- a/hw/xfree86/vnc/vncint.h +++ b/hw/xfree86/vnc/vncint.h @@ -44,13 +44,11 @@ typedef struct { size_t buf_filled; int maxFd; fd_set allFds; - unsigned char * oldpfbMemory; Bool rfbAlwaysShared; Bool rfbNeverShared; Bool rfbDontDisconnect; Bool rfbUserAccept; Bool rfbViewOnly; - unsigned char * pfbMemory; int paddedWidthInBytes; ColormapPtr rfbInstalledColormap; ColormapPtr savedColormap; -- 1.7.3.4 ++++++ N-VNC-Enable-use-of-all-keyboard-layouts-independent-o.patch ++++++ From: Matthias Hopf <mhopf@suse.de> Date: Tue, 6 Sep 2011 08:35:57 +0200 Subject: [PATCH 5/6] VNC: Enable use of all keyboard layouts, independent of remotely set layout Patch-Mainline: Currently no upstream project. Git-commit: 6885b927a6065e6379cfaa3ebbf6c51445a015d9 Signed-off: Egbert Eich <eich@suse.de> References: bnc #400520, #605015, #660797 Changes: - Use virtual core keyboard for events and key state lookup: Make layout changes work again - see discussion on https://defect.opensolaris.org/bz/show_bug.cgi?id=8687 - keycode lookup: Don't use any static keyboard layout any more. - ISO-Level3-Shift handling: Enable the use of keyboard layouts that use AltGr for 3rd and 4th level. - Make keyboard handling more XKB aware: Previous code was e.g. not multi-group aware. - Nuke use of legacy keymap as far as possible: Creating legacy keymap takes time, and it has to be freed again afterwards. - Free index lookup: Make XKB aware. - Ignore calls for NoSymbol: This destroys otherwise valid entries. - Fix analysis for shift/level3 event faking: Previous broken version lead to e.g. Shift+PgUp not being recognized. - Add tons of debug output (disabled). Signed-off-by: Egbert Eich <eich@freedesktop.org> --- hw/vnc/kbdptr.c | 289 +++++++++++++++++++++++++++++++++++++++++------------ hw/vnc/keyboard.h | 1 + 2 files changed, 228 insertions(+), 62 deletions(-) diff --git a/hw/vnc/kbdptr.c b/hw/vnc/kbdptr.c index f306022..b3b0e68 100644 --- a/hw/vnc/kbdptr.c +++ b/hw/vnc/kbdptr.c @@ -34,6 +34,8 @@ #include "X11/Xproto.h" #include "inputstr.h" #include "inpututils.h" +#include "xkbsrv.h" +#include "xkbstr.h" #define XK_CYRILLIC #include <X11/keysym.h> #include <X11/Xatom.h> @@ -46,6 +48,7 @@ #include "dmxinput.h" #endif +#if 0 #if !XFREE86VNC #define MIN_KEY_CODE 8 @@ -196,21 +199,20 @@ static KeySym map[MAX_KEY_CODE * GLYPHS_PER_KEY] = { #define N_PREDEFINED_KEYS (sizeof(map) / (sizeof(KeySym) * GLYPHS_PER_KEY)) #endif +#endif #define KEY_IS_PRESSED(keycode) \ - (kbdDevice->key->down[(keycode) >> 3] & (1 << ((keycode) & 7))) + (inputInfo.keyboard->key->down[(keycode) >> 3] & (1 << ((keycode) & 7))) static void vncXConvertCase(KeySym sym, KeySym *lower, KeySym *upper); -static DeviceIntPtr ptrDevice = NULL, kbdDevice = NULL; +static DeviceIntPtr ptrDevice = NULL; void vncSetKeyboardDevice(DeviceIntPtr kbd) { - if (kbdDevice && kbd) - return; /* set once */ - kbdDevice = kbd; + // obsoleted by inputInfo } @@ -280,6 +282,29 @@ EnqueueKey(DeviceIntPtr kbdDev, int type, int detail) mieqEnqueue(kbdDev, (InternalEvent*)(events + i)->event); } +/* In-server and highly changed version of XkbKeycodeToKeysym */ +static KeySym +_XkbKeycodeToKeysym(XkbDescPtr xkb, KeyCode kc, int group, int level) +{ + KeySym ks; + + if ((kc<xkb->min_key_code)||(kc>xkb->max_key_code)) + return NoSymbol; + /* Treat single group elements as present in all groups */ + if (XkbKeyNumGroups (xkb,kc) == 1) + group = 0; + if ((group<0)||(level<0)||(group>=XkbKeyNumGroups(xkb,kc))) + return NoSymbol; + if (level < XkbKeyGroupWidth(xkb, kc, group)) + ks = XkbKeySymEntry(xkb, kc, level, group); + else + ks = NoSymbol; + /* Treat 'K' as 'K K', */ + if (ks == NoSymbol && (level & 1) && level-1 < XkbKeyGroupWidth(xkb, kc, group)) + ks = XkbKeySymEntry(xkb, kc, level-1, group); + return ks; +} + /* * Called when the rfbserver receives a rfbKeyEvent event from a client. * Put an X keyboard event into the event queue. @@ -288,21 +313,35 @@ void KbdAddEvent(Bool down, KeySym keySym, rfbClientPtr cl) { const int type = down ? KeyPress : KeyRelease; - KeySymsPtr keySyms; - XkbStateRec *xkb; - int i; + XkbSrvInfoPtr xkbInfo; + int i, group, level; int keyCode = 0; - int freeIndex = -1; Bool fakeShiftPress = FALSE; Bool fakeShiftLRelease = FALSE; Bool fakeShiftRRelease = FALSE; Bool shiftMustBeReleased = FALSE; Bool shiftMustBePressed = FALSE; + Bool fakeLevel3Press = FALSE; + Bool fakeLevel3Release = FALSE; + Bool level3MustBeReleased = FALSE; + Bool level3MustBePressed = FALSE; + + /* Incomplete maps may create NoSymbol - which lets us + * select and/or overwrite otherwise valid entries. + * E.g Level3+a in serbian layout creates NoSymbol on os11.4 + * 2011-05-24 mhopf@suse.de */ + if (keySym == NoSymbol) { + ErrorF("KbdAddEvent: ignoring illegal NoSymbol\n"); + return; + } - if (!kbdDevice) - return; - - keySyms = XkbGetCoreMap(kbdDevice); + xkbInfo = inputInfo.keyboard->key->xkbInfo; + group = xkbInfo->state.group; + level = (KEY_IS_PRESSED(ISO_LEVEL3_KEY_CODE) ? 2 : 0) | + (XkbStateFieldFromRec(&xkbInfo->state) & ShiftMask ? 1 : 0); +#ifdef DEBUG + ErrorF ("VNCkbd:\t%s Sym %04x\n", down ? "+":"-", (int)keySym); +#endif #ifdef CORBA if (cl) { @@ -320,6 +359,12 @@ KbdAddEvent(Bool down, KeySym keySym, rfbClientPtr cl) * * Alan. */ + /* Never use predefined keys. + * This is inherently incapable of dealing with changing + * keyboard layouts. Not being able to work with non-local xmodmaps + * is a nuisance at worst, and probably even preferred. + * 2011-04-15 mhopf@suse.de */ +#ifdef NOTANYMORE #if !XFREE86VNC /* First check if it's one of our predefined keys. If so then we can make some attempt at allowing an xmodmap inside a VNC desktop behave @@ -346,107 +391,227 @@ KbdAddEvent(Bool down, KeySym keySym, rfbClientPtr cl) } } #endif +#endif if (!keyCode) { /* not one of our predefined keys - see if it's in the current keyboard mapping (i.e. we've already allocated an extra keycode for it) */ - if (keySyms->mapWidth < 2) { - ErrorF("KbdAddEvent: Sanity check failed - Keyboard mapping has " - "less than 2 keysyms per keycode (KeySym 0x%x)\n", (int)keySym); - return; - } - - for (i = 0; i < NO_OF_KEYS * keySyms->mapWidth; i++) { - if (keySym == keySyms->map[i]) { - keyCode = MIN_KEY_CODE + i / keySyms->mapWidth; - - if (keySyms->map[(i / keySyms->mapWidth) - * keySyms->mapWidth + 1] != NoSymbol) { - - /* this keycode has more than one symbol associated with - it, so shift state is important */ + for (keyCode = MIN_KEY_CODE; keyCode < MIN_KEY_CODE + NO_OF_KEYS; keyCode++) { + /* Check all keycodes, but only continue on those where + * backconversion results in keySym. + * 2011-05-20 mhopf@suse.de */ + +#ifdef DEBUG + int j; + ErrorF (" keyCode %3d map# %4d++ level %d of %d: keySyms", + keyCode, (i / keySyms->mapWidth) * keySyms->mapWidth, + i % keySyms->mapWidth, keySyms->mapWidth); + for (j = 0; j < keySyms->mapWidth; j++) + ErrorF (" %02x", (int)keySyms->map[(i / keySyms->mapWidth) * keySyms->mapWidth + j]); + ErrorF ("\n"); + ErrorF (" group %d of %d width %d: keySyms", + group, XkbKeyNumGroups(xkbInfo->desc, keyCode), + XkbKeyGroupWidth(xkbInfo->desc, keyCode, group)); + if (XkbKeyNumGroups(xkbInfo->desc, keyCode) > group) + for (j = 0; j < XkbKeyGroupWidth(xkbInfo->desc, keyCode, group); j++) + ErrorF (" %02x", (int) XkbKeySymEntry(xkbInfo->desc, keyCode, j, group)); + ErrorF ("\n"); +#endif - if ((i % keySyms->mapWidth) == 0) - shiftMustBeReleased = TRUE; - else - shiftMustBePressed = TRUE; - } + /* Check whether keySym is reachable in current group + * by any shift/Level3_shift state (preferrable w/o change). + * This doesn't do real modifyer analysis, only Shift and Level3_Shift. + * 2011-05-23 mhopf@suse.de */ + if (_XkbKeycodeToKeysym(xkbInfo->desc, keyCode, group, level) == keySym) + break; + if (_XkbKeycodeToKeysym(xkbInfo->desc, keyCode, group, level ^ 2) == keySym) { + if (level & 2) + level3MustBeReleased = TRUE; + else + level3MustBePressed = TRUE; break; } - if ((freeIndex == -1) && (keySyms->map[i] == NoSymbol) - && (i % keySyms->mapWidth) == 0) - { - freeIndex = i; + if (_XkbKeycodeToKeysym(xkbInfo->desc, keyCode, group, level ^ 1) == keySym) { + if (level & 1) + shiftMustBeReleased = TRUE; + else + shiftMustBePressed = TRUE; + break; + } + if (_XkbKeycodeToKeysym(xkbInfo->desc, keyCode, group, level ^ 3) == keySym) { + if (level & 2) + level3MustBeReleased = TRUE; + else + level3MustBePressed = TRUE; + if (level & 1) + shiftMustBeReleased = TRUE; + else + shiftMustBePressed = TRUE; + break; } } + if (keyCode == MIN_KEY_CODE + NO_OF_KEYS) + keyCode = 0; } if (!keyCode) { KeySym lower, upper; + KeySymsPtr keySyms = XkbGetCoreMap(inputInfo.keyboard); /* we don't have an existing keycode - make one up on the fly and add it to the keyboard mapping. Thanks to Vlad Harchev for pointing out problems with non-ascii capitalisation. */ - if (freeIndex == -1) { + /* Find free index for current group. */ + for (keyCode = MIN_KEY_CODE; keyCode < MIN_KEY_CODE + NO_OF_KEYS; keyCode++) { + /* A keyCode is free if no groups are assigned at all */ + if (XkbKeyNumGroups(xkbInfo->desc, keyCode) == 0) + break; +#ifdef NOTANYMORE + /* We can use exact map positions for group 1+2, but only partially + * filling out xkb legacy maps may suddenly change the # of groups. + * Reason for that is unknown yet. Might be related to (fixed) NoSymbol issue. + * 2011-05-24 mhopf@suse.de */ + /* For primary groups: A keyCode is free if current group is empty */ + if (XkbKeyGroupWidth(xkbInfo->desc, keyCode, group) < 1 && group < 2) + break; + /* Never touch groups that have a single level only (weird group?!?) */ + if (XkbKeyGroupWidth(xkbInfo->desc, keyCode, group) < 2) + continue; + /* For primary groups: A keyCode is free if only NoSymbol is assigned + * to available levels (only validating levels 0-3) */ + if (group < 2 && + XkbKeySymEntry(xkbInfo->desc, keyCode, 0, group) == NoSymbol && + XkbKeySymEntry(xkbInfo->desc, keyCode, 1, group) == NoSymbol && + (XkbKeyGroupWidth(xkbInfo->desc, keyCode, group) < 3 || + (XkbKeySymEntry(xkbInfo->desc, keyCode, 2, group) == NoSymbol && + (XkbKeyGroupWidth(xkbInfo->desc, keyCode, group) < 4 || + XkbKeySymEntry(xkbInfo->desc, keyCode, 3, group) == NoSymbol)))) + break; +#endif + } + + if (keyCode == MIN_KEY_CODE + NO_OF_KEYS) { ErrorF("KbdAddEvent: ignoring KeySym 0x%x - no free KeyCodes\n", (int)keySym); + free (keySyms->map); + free (keySyms); return; } - keyCode = MIN_KEY_CODE + freeIndex / keySyms->mapWidth; - vncXConvertCase(keySym, &lower, &upper); - if (lower == upper) { - keySyms->map[freeIndex] = keySym; - - } else { - keySyms->map[freeIndex] = lower; - keySyms->map[freeIndex+1] = upper; - + /* Adding keys is not using xkb mechanisms yet, but relying on support + * for changing keys in the legacy map. Should be changed, eventually. + * 2011-05-19 mhopf@suse.de */ +#ifdef NOTANYMORE + if (group < 2) { + /* Only set mapping for active group. Will only work with dual layouts. + * 2011-05-23 mhopf@suse.de */ + int active_group_offset = group ? 2 : 0; + + if (lower == upper) { + keySyms->map[(keyCode - MIN_KEY_CODE) * keySyms->mapWidth + active_group_offset] = keySym; + keySyms->map[(keyCode - MIN_KEY_CODE) * keySyms->mapWidth + active_group_offset + 1] = NoSymbol; + } else { + keySyms->map[(keyCode - MIN_KEY_CODE) * keySyms->mapWidth + active_group_offset] = lower; + keySyms->map[(keyCode - MIN_KEY_CODE) * keySyms->mapWidth + active_group_offset + 1] = upper; + } + } +#endif + /* Generic layouts needs to set the full map width. + * Weird enough, mapWidth seems too big... + * 2011-05-23 mhopf@suse.de */ + for (i = 0; i < (keySyms->mapWidth & ~1); i += 2) { + if (lower == upper) { + keySyms->map[(keyCode - MIN_KEY_CODE) * keySyms->mapWidth + i] = keySym; + keySyms->map[(keyCode - MIN_KEY_CODE) * keySyms->mapWidth + i + 1] = NoSymbol; + } else { + keySyms->map[(keyCode - MIN_KEY_CODE) * keySyms->mapWidth + i] = lower; + keySyms->map[(keyCode - MIN_KEY_CODE) * keySyms->mapWidth + i + 1] = upper; + } + } + if (lower != upper) { if (keySym == lower) shiftMustBeReleased = TRUE; else shiftMustBePressed = TRUE; } + level3MustBeReleased = TRUE; - XkbApplyMappingChange(kbdDevice, keySyms, keyCode, 1, NULL, serverClient); + XkbApplyMappingChange(inputInfo.keyboard, keySyms, keyCode, 1, NULL, serverClient); ErrorF("KbdAddEvent: unknown KeySym 0x%x - allocating KeyCode %d\n", (int)keySym, keyCode); + free (keySyms->map); + free (keySyms); } - xkb = &kbdDevice->key->xkbInfo->state; +#ifdef DEBUG + ErrorF ("\t%s Sym %04x Code%3d\tState x%02x %s%s%s\tSh %s%s\tL3 %s%s\n", + down ? "+":"-", (int)keySym, keyCode, XkbStateFieldFromRec(&xkbInfo->state), + KEY_IS_PRESSED(SHIFT_L_KEY_CODE) ? "Sl":"", + KEY_IS_PRESSED(SHIFT_R_KEY_CODE) ? "Sr":"", + KEY_IS_PRESSED(ISO_LEVEL3_KEY_CODE) ? "L3":"", + shiftMustBePressed ? "+":"", shiftMustBeReleased ? "-":"", + level3MustBePressed ? "+":"", level3MustBeReleased ? "-":""); +#endif +#ifdef NOTANYMORE + int back = _XkbKeycodeToKeysym (xkbInfo->desc, keyCode, group, + ((level3MustBePressed || (!level3MustBeReleased && (level & 2))) ? 2 : 0) | + ((shiftMustBePressed || (!shiftMustBeReleased && (level & 1))) ? 1 : 0)); + ErrorF ("\tvalidate code %d %-2s%-2s -> sym %04x %s\n\n", keyCode, + (shiftMustBePressed || (!shiftMustBeReleased && (level & 1))) ? "Sh" : "", + (level3MustBePressed || (!level3MustBeReleased && (level & 2))) ? "L3" : "", + back, (back == keySym ? "ok" : "FAILED")); +#endif + if (down) { - if (shiftMustBePressed && !(XkbStateFieldFromRec(xkb) & ShiftMask)) { + /* TODO: would require to check which keycodes are actually + * bound to ISO_Level3_Shift and/or Shift_L. + * 2011-04-18 mhopf@suse.de */ + if (level3MustBePressed && !(level & 2)) { + fakeLevel3Press = TRUE; + EnqueueKey(inputInfo.keyboard, KeyPress, ISO_LEVEL3_KEY_CODE); + } + if (level3MustBeReleased && (level & 2)) { + fakeLevel3Release = TRUE; + EnqueueKey(inputInfo.keyboard, KeyRelease, ISO_LEVEL3_KEY_CODE); + } + if (shiftMustBePressed && !(level & 1)) { fakeShiftPress = TRUE; - EnqueueKey(kbdDevice, KeyPress, SHIFT_L_KEY_CODE); + EnqueueKey(inputInfo.keyboard, KeyPress, SHIFT_L_KEY_CODE); } - if (shiftMustBeReleased && (XkbStateFieldFromRec(xkb) & ShiftMask)) { + if (shiftMustBeReleased && (level & 1)) { if (KEY_IS_PRESSED(SHIFT_L_KEY_CODE)) { fakeShiftLRelease = TRUE; - EnqueueKey(kbdDevice, KeyRelease, SHIFT_L_KEY_CODE); + EnqueueKey(inputInfo.keyboard, KeyRelease, SHIFT_L_KEY_CODE); } if (KEY_IS_PRESSED(SHIFT_R_KEY_CODE)) { fakeShiftRRelease = TRUE; - EnqueueKey(kbdDevice, KeyRelease, SHIFT_R_KEY_CODE); + EnqueueKey(inputInfo.keyboard, KeyRelease, SHIFT_R_KEY_CODE); } } } - EnqueueKey(kbdDevice, type, keyCode); + EnqueueKey(inputInfo.keyboard, type, keyCode); if (fakeShiftPress) { - EnqueueKey(kbdDevice, KeyRelease, SHIFT_L_KEY_CODE); + EnqueueKey(inputInfo.keyboard, KeyRelease, SHIFT_L_KEY_CODE); } if (fakeShiftLRelease) { - EnqueueKey(kbdDevice, KeyPress, SHIFT_L_KEY_CODE); + EnqueueKey(inputInfo.keyboard, KeyPress, SHIFT_L_KEY_CODE); } if (fakeShiftRRelease) { - EnqueueKey(kbdDevice, KeyPress, SHIFT_R_KEY_CODE); + EnqueueKey(inputInfo.keyboard, KeyPress, SHIFT_R_KEY_CODE); + } + if (fakeLevel3Press) { + EnqueueKey(inputInfo.keyboard, KeyRelease, ISO_LEVEL3_KEY_CODE); + } + if (fakeLevel3Release) { + EnqueueKey(inputInfo.keyboard, KeyPress, ISO_LEVEL3_KEY_CODE); } } @@ -497,15 +662,15 @@ KbdReleaseAllKeys(void) { int i, j; - if (!kbdDevice) + if (!inputInfo.keyboard) return; for (i = 0; i < DOWN_LENGTH; i++) { - if (kbdDevice->key->down[i] != 0) { + if (inputInfo.keyboard->key->down[i] != 0) { for (j = 0; j < 8; j++) { - if (kbdDevice->key->down[i] & (1 << j)) { + if (inputInfo.keyboard->key->down[i] & (1 << j)) { int detail = (i << 3) | j; - EnqueueKey(kbdDevice, KeyRelease, detail); + EnqueueKey(inputInfo.keyboard, KeyRelease, detail); } } } diff --git a/hw/vnc/keyboard.h b/hw/vnc/keyboard.h index d223b6b..beb948a 100644 --- a/hw/vnc/keyboard.h +++ b/hw/vnc/keyboard.h @@ -32,3 +32,4 @@ #define META_R_KEY_CODE (MIN_KEY_CODE + 108) #define ALT_L_KEY_CODE (MIN_KEY_CODE + 56) #define ALT_R_KEY_CODE (MIN_KEY_CODE + 105) +#define ISO_LEVEL3_KEY_CODE ALT_R_KEY_CODE -- 1.7.3.4 ++++++ N-VNC-Fix-crash-due-to-unset-input-device-names.patch ++++++ From: Egbert Eich <eich@freedesktop.org> Date: Tue, 6 Sep 2011 14:58:28 +0200 Subject: [PATCH 6/6] VNC: Fix crash due to unset input device names. Patch-Mainline: Currently no upstream project. Git-commit: b756a7efff37021ca503fe1e63084daae4082e9d Signed-off: Egbert Eich <eich@suse.de> References: bnc #716074 Signed-off-by: Egbert Eich <eich@freedesktop.org> --- hw/vnc/init.c | 2 +- hw/vnc/rfb.h | 2 +- hw/vnc/rfbkeyb.c | 7 +++++-- hw/vnc/rfbmouse.c | 9 +++++++-- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/hw/vnc/init.c b/hw/vnc/init.c index 0977fee..6f83aa8 100644 --- a/hw/vnc/init.c +++ b/hw/vnc/init.c @@ -816,7 +816,7 @@ rfbMouseProc(DeviceIntPtr pDevice, int onoff) switch (onoff) { case DEVICE_INIT: - PtrDeviceInit(); + PtrDeviceInit(pDevice, "vncMouse"); map[1] = 1; map[2] = 2; map[3] = 3; diff --git a/hw/vnc/rfb.h b/hw/vnc/rfb.h index 70b1a45..aa9abab 100644 --- a/hw/vnc/rfb.h +++ b/hw/vnc/rfb.h @@ -578,7 +578,7 @@ extern void rfbGotXCutText(char *str, int len); extern Bool compatibleKbd; extern unsigned char ptrAcceleration; -extern void PtrDeviceInit(void); +extern void PtrDeviceInit(DeviceIntPtr pDevice, char *name); extern void PtrDeviceOn(DeviceIntPtr pDev); extern void PtrDeviceOff(void); extern void PtrDeviceControl(DeviceIntPtr dev, PtrCtrl *ctrl); diff --git a/hw/vnc/rfbkeyb.c b/hw/vnc/rfbkeyb.c index 4da29c2..6d97999 100644 --- a/hw/vnc/rfbkeyb.c +++ b/hw/vnc/rfbkeyb.c @@ -36,6 +36,7 @@ #endif #include <xf86Xinput.h> #include <exevents.h> /* Needed for InitValuator/Proximity stuff */ +#include <extinit.h> #include <mipointer.h> #ifdef XFree86LOADER @@ -49,7 +50,6 @@ extern void rfbSendBell(void); -extern DeviceIntPtr kbdDevice; extern void vncInitKeyb(void); #include <X11/keysym.h> @@ -212,11 +212,15 @@ static KeySym map[MAX_KEY_CODE * GLYPHS_PER_KEY] = { }; #define N_PREDEFINED_KEYS (sizeof(map) / (sizeof(KeySym) * GLYPHS_PER_KEY)) +#define RFB_KEYB "rfbKeyb" void KbdDeviceInit(DeviceIntPtr pDevice, KeySymsPtr pKeySyms, CARD8 *pModMap) { int i; + Atom atom = MakeAtom(RFB_KEYB, strlen(RFB_KEYB), TRUE); + + AssignTypeAndName(pDevice, atom, RFB_KEYB); for (i = 0; i < MAP_LENGTH; i++) pModMap[i] = NoSymbol; @@ -359,7 +363,6 @@ xf86rfbKeybInit(struct _InputDriverRec *drv, pInfo->control_proc = NULL; pInfo->switch_mode = NULL; pInfo->fd = -1; - pInfo->dev = NULL; /* Collect the options, and process the common options. */ xf86CollectInputOptions(pInfo, (const char**)drv->default_options); diff --git a/hw/vnc/rfbmouse.c b/hw/vnc/rfbmouse.c index 4657128..86e8f2f 100644 --- a/hw/vnc/rfbmouse.c +++ b/hw/vnc/rfbmouse.c @@ -37,6 +37,7 @@ #endif #include <xf86Xinput.h> #include <exevents.h> /* Needed for InitValuator/Proximity stuff */ +#include <extinit.h> #include <mipointer.h> #ifdef XFree86LOADER @@ -63,8 +64,12 @@ PtrDeviceOn(DeviceIntPtr pDev) } void -PtrDeviceInit(void) +PtrDeviceInit(DeviceIntPtr pDevice, char *name) { + Atom atom = MakeAtom(name, strlen(name), TRUE); + + AssignTypeAndName(pDevice, atom, name); + } void @@ -119,7 +124,7 @@ xf86rfbMouseControlProc(DeviceIntPtr dev, int onoff) { case DEVICE_INIT: vncSetPointerDevice(dev); - PtrDeviceInit(); + // PtrDeviceInit(dev, "rfbPointer"); map[1] = 1; map[2] = 2; map[3] = 3; -- 1.7.3.4 ++++++ N-VNC-Fix-crash-when-no-depth-translation-is-required.patch ++++++ From: Michael Schroeder <mls@suse.de> Date: Tue, 6 Sep 2011 07:58:33 +0200 Subject: [PATCH 3/6] VNC: Fix crash when no depth translation is required. Patch-Mainline: Currently no upstream project. Git-commit: 74d5e3115cd955b7ee1acc64c6b8b42198ed894b Signed-off: Egbert Eich <eich@suse.de> References: bnc #389386 Signed-off-by: Egbert Eich <eich@freedesktop.org> --- hw/vnc/translate.c | 11 ++++++----- 1 files changed, 6 insertions(+), 5 deletions(-) diff --git a/hw/vnc/translate.c b/hw/vnc/translate.c index 5cc57a3..78030ed 100644 --- a/hw/vnc/translate.c +++ b/hw/vnc/translate.c @@ -168,17 +168,18 @@ rfbTranslateNone(ScreenPtr pScreen, char *table, rfbPixelFormat *in, rfbPixelFor { VNCSCREENPTR(pScreen); DrawablePtr pDraw = (DrawablePtr)pScreen->root; - int truewidth = PixmapBytePad(width, in->bitsPerPixel) / 4; + int truewidth = PixmapBytePad(width, in->bitsPerPixel); - if ((x + truewidth > pVNC->width) || truewidth != width) { - unsigned char *buffer = malloc(truewidth * height * in->bitsPerPixel / 8); + if ((x + width > pVNC->width) || truewidth != width * in->bitsPerPixel / 8) { + unsigned char *buffer = malloc(truewidth * height); unsigned char *buf = buffer; - (*pScreen->GetImage)(pDraw, x, y, truewidth, height, ZPixmap, ~0, (char*)buf); + (*pScreen->GetImage)(pDraw, x, y, width, height, ZPixmap, ~0, (char*)buf); + while (height--) { memcpy(optr, buf, width * in->bitsPerPixel / 8); optr += width * in->bitsPerPixel / 8; - buf += truewidth * in->bitsPerPixel / 8; + buf += truewidth; } free(buffer); return; -- 1.7.3.4 ++++++ N-VNC-Readd-timeout-when-vnc-viewer-connection-breaks.patch ++++++ From: Egbert Eich <eich@freedesktop.org> Date: Tue, 6 Sep 2011 07:02:11 +0200 Subject: [PATCH 2/6] VNC: Readd timeout when vnc viewer connection breaks. Patch-Mainline: Currently no upstream project. Git-commit: 759b49ed1c4ea03e45433c92c2fb8c44a60db34a Signed-off: Egbert Eich <eich@suse.de> References: bnc #441935, bnc #403901 This prevents Xvnc busy loop forever waiting for a viewer that no longer response due to network or other issues. Signed-off-by: Egbert Eich <eich@freedesktop.org> --- hw/vnc/sockets.c | 19 +++++-------------- 1 files changed, 5 insertions(+), 14 deletions(-) diff --git a/hw/vnc/sockets.c b/hw/vnc/sockets.c index 39eb88a..ae43ed0 100644 --- a/hw/vnc/sockets.c +++ b/hw/vnc/sockets.c @@ -442,9 +442,7 @@ WriteExact(int sock, char *buf, int len) int n; fd_set fds; struct timeval tv; -#if 0 int totalTimeWaited = 0; -#endif while (len > 0) { n = write(sock, buf, len); @@ -464,7 +462,6 @@ WriteExact(int sock, char *buf, int len) return n; } -#if 0 /* Retry every 5 seconds until we exceed rfbMaxClientWait. We need to do this because select doesn't necessarily return immediately when the other end has gone away */ @@ -473,19 +470,14 @@ WriteExact(int sock, char *buf, int len) FD_SET(sock, &fds); tv.tv_sec = 5; tv.tv_usec = 0; -#else - /* We're in the WakeupHandler now, so don't wait */ - FD_ZERO(&fds); - FD_SET(sock, &fds); - tv.tv_sec = 0; - tv.tv_usec = 0; -#endif n = select(sock+1, NULL, &fds, NULL, &tv); -#if 0 + if (n < 0) { - rfbLogPerror("WriteExact: select"); - return n; + if (errno != EINTR) { + rfbLogPerror("WriteExact: select"); + return n; + } } if (n == 0) { totalTimeWaited += 5000; @@ -496,7 +488,6 @@ WriteExact(int sock, char *buf, int len) } else { totalTimeWaited = 0; } -#endif } } return 1; -- 1.7.3.4 ++++++ README.updates ++++++ Xserver module update mechanism ------------------------------- If any corresponding Xserver module is found below "/usr/lib/xorg/modules/updates/" ("/usr/lib64/xorg/modules/updates/" on biarch 32/64 bit platforms) it will be favored over the one in "/usr/lib/xorg/modules/" ("/usr/lib64/xorg/modules/" on biarch 32/64 bit platforms). ++++++ U_Don-t-call-deleted-Block-WakeupHandler.patch ++++++ From: Egbert Eich <eich@suse.de> Date: Tue Oct 18 20:22:38 2011 +0200 Subject: [PATCH] Don't call deleted Bloxk/WakeupHandler() Patch-Mainline: Upstream/2ee85d95 Git-commit: b93eda251f0b6d0a1601511a55b060604919cc81 References: bnc #723777 Signed-off-by: Egbert Eich <eich@suse.de> When Block/WakeupHandlers are unregistered from within a handler the list of handlers is not corrected right away but they are marked as deleted. If a deleted handler in the handler list is located after the handler that calls the unregister function it was still called, as the list was only corrected after all handlers were processed. This could cause a crash if the handler got passed a pointer to a data structure which was no longer existing. A check for the deleted flag solves this problem. Signed-off-by: Egbert Eich <eich@suse.de> --- xorg-server-1.10.4/dix/dixutils.c | 10 ++++++---- 1 files changed, 6 insertions(+), 4 deletions(-) diff --git a/xorg-server-1.10.4/dix/dixutils.c b/xorg-server-1.10.4/dix/dixutils.c index 104363b..dd1c318 100644 --- a/xorg-server-1.10.4/dix/dixutils.c +++ b/xorg-server-1.10.4/dix/dixutils.c @@ -386,8 +386,9 @@ BlockHandler(pointer pTimeout, pointer pReadmask) screenInfo.screens[i]->blockData, pTimeout, pReadmask); for (i = 0; i < numHandlers; i++) - (*handlers[i].BlockHandler) (handlers[i].blockData, - pTimeout, pReadmask); + if (!handlers[i].deleted) + (*handlers[i].BlockHandler) (handlers[i].blockData, + pTimeout, pReadmask); if (handlerDeleted) { for (i = 0; i < numHandlers;) @@ -416,8 +417,9 @@ WakeupHandler(int result, pointer pReadmask) ++inHandler; for (i = numHandlers - 1; i >= 0; i--) - (*handlers[i].WakeupHandler) (handlers[i].blockData, - result, pReadmask); + if (!handlers[i].deleted) + (*handlers[i].WakeupHandler) (handlers[i].blockData, + result, pReadmask); for (i = 0; i < screenInfo.numScreens; i++) (* screenInfo.screens[i]->WakeupHandler)(i, screenInfo.screens[i]->wakeupData, ++++++ U_xf86-fix-flush-input-to-work-with-Linux-evdev-device.patch ++++++
From 6ca03b9161d33b1d2b55a3a1a913cf88deb2343f Mon Sep 17 00:00:00 2001 From: Dave Airlie <airlied@gmail.com> Date: Wed, 10 Apr 2013 16:09:01 +1000 Subject: [PATCH] xf86: fix flush input to work with Linux evdev devices.
So when we VT switch back and attempt to flush the input devices, we don't succeed because evdev won't return part of an event, since we were only asking for 4 bytes, we'd only get -EINVAL back. This could later cause events to be flushed that we shouldn't have gotten. This is a fix for CVE-2013-1940. Signed-off-by: Dave Airlie <airlied@redhat.com> Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> --- hw/xfree86/os-support/shared/posix_tty.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hw/xfree86/os-support/shared/posix_tty.c b/hw/xfree86/os-support/shared/posix_tty.c index ab3757a..4d08c1e 100644 --- a/hw/xfree86/os-support/shared/posix_tty.c +++ b/hw/xfree86/os-support/shared/posix_tty.c @@ -460,7 +460,8 @@ xf86FlushInput(int fd) { fd_set fds; struct timeval timeout; - char c[4]; + /* this needs to be big enough to flush an evdev event. */ + char c[256]; DebugF("FlushingSerial\n"); if (tcflush(fd, TCIFLUSH) == 0) -- 1.8.1.4 ++++++ Use-external-tool-for-creating-backtraces-on-crashes.patch ++++++
From bb4e768eaf8025d3ccf369cbad9a9b8be721e7ac Mon Sep 17 00:00:00 2001 From: Matthias Hopf <mhopf@suse.de> Date: Wed, 25 Aug 2010 14:12:48 +0200 Subject: [PATCH] Use external tool for creating backtraces on crashes if available.
This calls /usr/bin/xorg-backtrace to create reasonable commented backtraces with gdb. On errors it falls back to the generic method. Signed-off-by: Matthias Hopf <mhopf@suse.de> --- os/backtrace.c | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 82 insertions(+), 0 deletions(-) diff --git a/os/backtrace.c b/os/backtrace.c index 7ca6dab..1e3201a 100644 --- a/os/backtrace.c +++ b/os/backtrace.c @@ -28,6 +28,81 @@ #include "os.h" #include "misc.h" +#include <sys/types.h> +#include <sys/wait.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <errno.h> + +#define XORG_BACKTRACE "/usr/bin/xorg-backtrace" + +/* Call gdb to create reasonable(!) backtrace. Returns 0 if successfull. */ +static int xorg_backtrace_gdb(void) +{ + static const char *xorg_backtrace = XORG_BACKTRACE; + char pidstr[12]; + char fdname[] = "/tmp/xorg.XXXXXX"; + char buf[256]; + pid_t pid; + int fd, status = -1, ret; + FILE *f; + + if (access (xorg_backtrace, R_OK | X_OK) != 0) { + ErrorF ("%s not found, using internal backtrace system\n", xorg_backtrace); + return 1; + } + if ( (fd = mkstemp (fdname)) == -1) { + ErrorF ("xorg_backtrace_gdb internal error 1\n"); + return 1; + } + unlink (fdname); + snprintf (pidstr, 12, "%d", getpid()); + + switch ( (pid = fork()) ) { + case 0: + close (0); + close (1); + close (2); + dup2 (fd, 1); + dup2 (fd, 2); + close (fd); + execl (xorg_backtrace, xorg_backtrace, pidstr, NULL); + exit (-1); + case -1: + close (fd); + return 1; + } + + while (waitpid (pid, &status, 0) == -1 && errno == EINTR) + ; + if (WIFEXITED (status) && WEXITSTATUS (status) == 0) + ret = 0; + else { + ErrorF ("%s failed with returncode %d\n", xorg_backtrace, WEXITSTATUS (status)); + ret = 1; + } + + lseek (fd, 0, SEEK_SET); + if (! (f = fdopen (fd, "r"))) { + ErrorF ("xorg_backtrace_gdb internal error 2\n"); + close (fd); + return 1; + } + status = 0; + while (fgets (buf, 256, f)) { + status++; + ErrorF("%s", buf); + } + fclose (f); + if (status < 10 && ret == 0) { + ErrorF ("%s only produced %d lines of output\n", xorg_backtrace, status); + return 1; + } + + return ret; +} + #ifdef HAVE_BACKTRACE #ifndef _GNU_SOURCE #define _GNU_SOURCE @@ -41,6 +116,10 @@ void xorg_backtrace(void) const char *mod; int size, i; Dl_info info; + + if (xorg_backtrace_gdb () == 0) + return; + ErrorF("\nBacktrace:\n"); size = backtrace(array, 64); for (i = 0; i < size; i++) { @@ -182,6 +261,9 @@ static int xorg_backtrace_pstack(void) { void xorg_backtrace(void) { + if (xorg_backtrace_gdb () == 0) + return; + ErrorF("\nBacktrace:\n"); # ifdef HAVE_PSTACK -- 1.6.0.2 ++++++ Xvnc-pthread.diff ++++++ --- xorg-server-1.10.4/hw/vnc/Makefile.am.orig 2011-09-06 15:25:27.000000000 +0000 +++ xorg-server-1.10.4/hw/vnc/Makefile.am 2011-09-06 15:26:40.000000000 +0000 @@ -37,6 +37,7 @@ JPEG_LIBS = -ljpeg CRYPT_LIBS = -lcrypt Z_LIBS = -lz +PTHREAD_LIBS = -lpthread AM_CFLAGS = $(DIX_CFLAGS) $(XVNC_CFLAGS) -I$(top_srcdir)/hw/dmx/vnc -DCHROMIUM=1 @@ -48,7 +49,8 @@ $(CRYPT_LIBS) \ $(XSERVER_SYS_LIBS) \ $(VNCMODULES_LIBS) \ - $(Z_LIBS) + $(Z_LIBS) \ + $(PTHREAD_LIBS) relink: ++++++ autoconfig_fallback_fbdev_first.diff ++++++ Index: hw/xfree86/common/xf86AutoConfig.c ================================================================================ --- hw/xfree86/common/xf86AutoConfig.c +++ hw/xfree86/common/xf86AutoConfig.c @@ -506,7 +506,7 @@ /* Fallback to platform default hardware */ if (i < (nmatches - 1)) { #if defined(__i386__) || defined(__amd64__) || defined(__hurd__) - matches[i++] = xnfstrdup("vesa"); + matches[i++] = xnfstrdup("fbdev"); #elif defined(__sparc__) && !defined(sun) matches[i++] = xnfstrdup("sunffb"); #endif @@ -517,7 +517,7 @@ #if !defined(__linux__) && defined(__sparc__) matches[i++] = xnfstrdup("wsfb"); #else - matches[i++] = xnfstrdup("fbdev"); + matches[i++] = xnfstrdup("vesa"); #endif } } ++++++ bug-197858_dpms.diff ++++++ Index: hw/xfree86/common/xf86Events.c ================================================================================ --- hw/xfree86/common/xf86Events.c +++ hw/xfree86/common/xf86Events.c @@ -115,6 +115,7 @@ InputHandlerProc ihproc; pointer data; Bool enabled; + Bool is_input; struct x_IHRec * next; } IHRec, *IHPtr; @@ -449,8 +450,12 @@ * Keep the order: Disable Device > LeaveVT * EnterVT > EnableDevice */ - for (ih = InputHandlers; ih; ih = ih->next) - xf86DisableInputHandler(ih); + for (ih = InputHandlers; ih; ih = ih->next) { + if (ih->is_input) + xf86DisableInputHandler(ih); + else + xf86DisableGeneralHandler(ih); + } for (pInfo = xf86InputDevs; pInfo; pInfo = pInfo->next) { if (pInfo->dev) { xf86ReleaseKeys(pInfo->dev); @@ -492,8 +497,12 @@ EnableDevice(pInfo->dev, TRUE); pInfo = pInfo->next; } - for (ih = InputHandlers; ih; ih = ih->next) - xf86EnableInputHandler(ih); + for (ih = InputHandlers; ih; ih = ih->next) { + if (ih->is_input) + xf86EnableInputHandler(ih); + else + xf86EnableGeneralHandler(ih); + } xf86UnblockSIGIO(prevSIGIO); @@ -549,8 +558,12 @@ pInfo = pInfo->next; } - for (ih = InputHandlers; ih; ih = ih->next) - xf86EnableInputHandler(ih); + for (ih = InputHandlers; ih; ih = ih->next) { + if (ih->is_input) + xf86EnableInputHandler(ih); + else + xf86EnableGeneralHandler(ih); + } xf86UnblockSIGIO(prevSIGIO); } @@ -587,8 +600,10 @@ { IHPtr ih = addInputHandler(fd, proc, data); - if (ih) + if (ih) { AddEnabledDevice(fd); + ih->is_input = TRUE; + } return ih; } ++++++ bug474071-fix1.diff ++++++ Index: linuxPci.c ================================================================================ --- linuxPci.c +++ linuxPci.c @@ -195,7 +195,7 @@ struct pci_id_match bridge_match = { PCI_MATCH_ANY, PCI_MATCH_ANY, PCI_MATCH_ANY, PCI_MATCH_ANY, (PCI_CLASS_BRIDGE << 16) | (PCI_SUBCLASS_BRIDGE_PCI << 8), - 0 + (PCI_CLASS_BRIDGE << 16) | (PCI_SUBCLASS_BRIDGE_PCI << 8) }; struct pci_device *bridge; struct pci_device_iterator *iter; @@ -433,7 +433,6 @@ xf86MapLegacyIO(struct pci_device *dev) { const int domain = dev->domain; - struct pci_device *bridge = get_parent_bridge(dev); int fd; if (domain >= MAX_DOMAINS) @@ -441,9 +440,11 @@ if (DomainMmappedIO[domain] == NULL) { /* Permanently map all of I/O space */ - fd = linuxOpenLegacy(bridge, "legacy_io"); + fd = linuxOpenLegacy(dev, "legacy_io"); if (fd < 0) { - DomainMmappedIO[domain] = linuxMapPci(-1, VIDMEM_MMIO, bridge, + struct pci_device *bridge = get_parent_bridge(dev); + if (bridge != NULL) + DomainMmappedIO[domain] = linuxMapPci(-1, VIDMEM_MMIO, bridge, 0, linuxGetIOSize(bridge), PCIIOC_MMAP_IS_IO); } ++++++ bug534768-prefer_local_symbols.patch ++++++ Index: xorg-server-1.6.3.901/hw/xfree86/loader/dlloader.c ================================================================================ --- xorg-server-1.7.99/hw/xfree86/loader/loader.c +++ xorg-server-1.7.99/hw/xfree86/loader/loader.c @@ -120,5 +120,5 @@ if (!global_scope) - global_scope = dlopen(NULL, DLOPEN_LAZY | DLOPEN_GLOBAL); + global_scope = dlopen(NULL, DLOPEN_LAZY | DLOPEN_GLOBAL | RTLD_DEEPBIND); if (global_scope) ++++++ cache-xkbcomp-output-for-fast-start-up.patch ++++++
From 0f70ba9d3412b17ac4e08e33e1be3c226c06ea54 Mon Sep 17 00:00:00 2001 From: Yan Li <yan.i.li@intel.com> Date: Tue, 12 May 2009 17:49:07 +0800 Subject: [PATCH] XKB: cache xkbcomp output for fast start-up v5 for 1.6.1 Organization: Intel
xkbcomp outputs will be cached in files with hashed keymap as names. This saves boot time for around 1s on commodity netbooks. Signed-off-by: Yan Li <yan.i.li@intel.com> ================================================================================ --- xorg-server-1.7.99/configure.ac +++ xorg-server-1.7.99/configure.ac @@ -527,9 +527,9 @@ AC_ARG_WITH(xkb-path, AS_HELP_STRING([--with-xkb-path=PATH], [Path to XKB base dir (default: ${datadir}/X11/xkb)]), [ XKBPATH="$withval" ], [ XKBPATH="${datadir}/X11/xkb" ]) -AC_ARG_WITH(xkb-output, AS_HELP_STRING([--with-xkb-output=PATH], [Path to XKB output dir (default: ${datadir}/X11/xkb/compiled)]), +AC_ARG_WITH(xkb-output, AS_HELP_STRING([--with-xkb-output=PATH], [Path to XKB output dir (default: ${localstatedir}/cache/xkb)]), [ XKBOUTPUT="$withval" ], - [ XKBOUTPUT="compiled" ]) + [ XKBOUTPUT="${localstatedir}/cache/xkb" ]) AC_ARG_WITH(default-xkb-rules, AS_HELP_STRING([--with-default-xkb-rules=RULES], [Keyboard ruleset (default: base/evdev)]), [ XKB_DFLT_RULES="$withval" ], @@ -1160,7 +1160,7 @@ dnl Make sure XKM_OUTPUT_DIR is an absolute path XKBOUTPUT_FIRSTCHAR=`echo $XKBOUTPUT | cut -b 1` if [[ x$XKBOUTPUT_FIRSTCHAR != x/ -a x$XKBOUTPUT_FIRSTCHAR != 'x$' ]] ; then - XKBOUTPUT="$XKB_BASE_DIRECTORY/$XKBOUTPUT" + AC_MSG_ERROR([xkb-output must be an absolute path.]) fi dnl XKM_OUTPUT_DIR (used in code) must end in / or file names get hosed --- xorg-server-1.7.99/xkb/README.compiled +++ xorg-server-1.7.99/xkb/README.compiled @@ -4,10 +4,10 @@ or some other tool might destroy or replace the files in this directory, so it is not a safe place to store compiled keymaps for long periods of time. The default keymap for any server is usually stored in: - X<num>-default.xkm -where <num> is the display number of the server in question, which makes -it possible for several servers *on the same host* to share the same -directory. + server-<SHA1>.xkm + +where <SHA1> is the SHA1 hash of keymap source, so that compiled +keymap of different keymap sources are stored in different files. Unless the X server is modified, sharing this directory between servers on different hosts could cause problems. --- xorg-server-1.9.0/xkb/ddxLoad.c.orig 2010-07-14 22:23:17.000000000 +0200 +++ xorg-server-1.9.0/xkb/ddxLoad.c 2010-08-23 15:23:47.000000000 +0200 @@ -30,6 +30,12 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE. #include <xkb-config.h> +#ifdef HAVE_SHA1_IN_LIBMD /* Use libmd for SHA1 */ +# include <sha1.h> +#else /* Use OpenSSL's libcrypto */ +# include <stddef.h> /* buggy openssl/sha.h wants size_t */ +# include <openssl/sha.h> +#endif #include <stdio.h> #include <ctype.h> #include <X11/X.h> @@ -43,24 +49,13 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE. #define XKBSRV_NEED_FILE_FUNCS #include <xkbsrv.h> #include <X11/extensions/XI.h> +#include <errno.h> #include "xkb.h" #if defined(CSRG_BASED) || defined(linux) || defined(__GNU__) #include <paths.h> #endif - /* - * If XKM_OUTPUT_DIR specifies a path without a leading slash, it is - * relative to the top-level XKB configuration directory. - * Making the server write to a subdirectory of that directory - * requires some work in the general case (install procedure - * has to create links to /var or somesuch on many machines), - * so we just compile into /usr/tmp for now. - */ -#ifndef XKM_OUTPUT_DIR -#define XKM_OUTPUT_DIR "compiled/" -#endif - #define PRE_ERROR_MSG "\"The XKEYBOARD keymap compiler (xkbcomp) reports:\"" #define ERROR_PREFIX "\"> \"" #define POST_ERROR_MSG1 "\"Errors from xkbcomp are not fatal to the X server\"" @@ -175,6 +170,45 @@ OutputDirectory( } static Bool +Sha1Asc(char sha1Asc[SHA_DIGEST_LENGTH*2+1], const char * input) +{ + int i; + unsigned char sha1[SHA_DIGEST_LENGTH]; + +#ifdef HAVE_SHA1_IN_LIBMD /* Use libmd for SHA1 */ + SHA1_CTX ctx; + + SHA1Init (&ctx); + SHA1Update (&ctx, input, strlen(input)); + SHA1Final (sha1, &ctx); +#else /* Use OpenSSL's libcrypto */ + SHA_CTX ctx; + int success; + + success = SHA1_Init (&ctx); + if (! success) + return BadAlloc; + + success = SHA1_Update (&ctx, input, strlen(input)); + if (! success) + return BadAlloc; + + success = SHA1_Final (sha1, &ctx); + if (! success) + return BadAlloc; +#endif + + /* convert sha1 to sha1_asc */ + for(i=0; i<SHA_DIGEST_LENGTH; ++i) { + sprintf(sha1Asc+i*2, "%02X", sha1[i]); + } + + return Success; +} + +/* call xkbcomp and compile XKB keymap, return xkm file name in + nameRtrn */ +static Bool XkbDDXCompileKeymapByNames( XkbDescPtr xkb, XkbComponentNamesPtr names, unsigned want, @@ -183,7 +217,11 @@ XkbDDXCompileKeymapByNames( XkbDescPtr int nameRtrnLen) { FILE * out; - char *buf = NULL, keymap[PATH_MAX], xkm_output_dir[PATH_MAX]; + char * buf = NULL, xkmfile[PATH_MAX], xkm_output_dir[PATH_MAX]; + char * tmpXkmFile = NULL; + char * canonicalXkmFileName = NULL; + char sha1Asc[SHA_DIGEST_LENGTH*2+1], xkbKeyMapBuf[100*1024]; + int ret, result; const char *emptystring = ""; char *xkbbasedirflag = NULL; @@ -194,15 +232,70 @@ XkbDDXCompileKeymapByNames( XkbDescPtr /* WIN32 has no popen. The input must be stored in a file which is used as input for xkbcomp. xkbcomp does not read from stdin. */ char tmpname[PATH_MAX]; - const char *xkmfile = tmpname; + const char *xkbfile = tmpname; #else - const char *xkmfile = "-"; + const char *xkbfile = "-"; +#endif + + /* Write keymap source (xkbfile) to memory buffer `xkbKeyMapBuf', + of which SHA1 is generated and used as result xkm file name */ + memset(xkbKeyMapBuf, 0, sizeof(xkbKeyMapBuf)); + out = fmemopen(xkbKeyMapBuf, sizeof(xkbKeyMapBuf), "w"); + if (NULL == out) { + ErrorF("[xkb] Open xkbKeyMapBuf for writing failed\n"); + return FALSE; + } + ret = XkbWriteXKBKeymapForNames(out, names, xkb, want, need); + if (fclose(out) !=0) + { + ErrorF("[xkb] XkbWriteXKBKeymapForNames error, perhaps xkbKeyMapBuf is too small\n"); + return FALSE; + } +#ifdef DEBUG + if (xkbDebugFlags) { + ErrorF("[xkb] XkbDDXCompileKeymapByNames compiling keymap:\n"); + fputs(xkbKeyMapBuf, stderr); + } #endif + if (!ret) { + ErrorF("[xkb] Generating XKB Keymap failed, giving up compiling keymap\n"); + return FALSE; + } - snprintf(keymap, sizeof(keymap), "server-%s", display); + DebugF("[xkb] computing SHA1 of keymap\n"); + if (Success == Sha1Asc(sha1Asc, xkbKeyMapBuf)) { + snprintf(xkmfile, sizeof(xkmfile), "server-%s", sha1Asc); + } + else { + ErrorF("[xkb] Computing SHA1 of keymap failed, " + "using display name instead as xkm file name\n"); + snprintf(xkmfile, sizeof(xkmfile), "server-%s", display); + } OutputDirectory(xkm_output_dir, sizeof(xkm_output_dir)); + /* set nameRtrn, fail if it's too small */ + if ((strlen(xkmfile)+1 > nameRtrnLen) && nameRtrn) { + ErrorF("[xkb] nameRtrn too small to hold xkmfile name\n"); + return FALSE; + } + strncpy(nameRtrn, xkmfile, nameRtrnLen); + + /* if the xkm file already exists, reuse it */ + canonicalXkmFileName = Xprintf("%s%s.xkm", xkm_output_dir, xkmfile); + if (access(canonicalXkmFileName, R_OK) == 0) { + /* yes, we can reuse the old xkm file */ + LogMessage(X_INFO, "XKB: reuse xkmfile %s\n", canonicalXkmFileName); + result = TRUE; + goto _ret; + } + LogMessage(X_INFO, "XKB: generating xkmfile %s\n", canonicalXkmFileName); + + /* continue to call xkbcomp to compile the keymap. to avoid race + condition, we compile it to a tmpfile then rename it to + xkmfile */ + + #ifdef WIN32 strcpy(tmpname, Win32TempDir()); strcat(tmpname, "\\xkb_XXXXXX"); @@ -225,14 +318,20 @@ XkbDDXCompileKeymapByNames( XkbDescPtr } } + if ( (tmpXkmFile = tempnam(xkm_output_dir, NULL)) == NULL ) { + ErrorF("[xkb] Can't generate temp xkm file name"); + result = FALSE; + goto _ret; + } + buf = Xprintf("\"%s%sxkbcomp\" -w %d %s -xkm \"%s\" " - "-em1 %s -emp %s -eml %s \"%s%s.xkm\"", + "-em1 %s -emp %s -eml %s \"%s\"", xkbbindir, xkbbindirsep, ( (xkbDebugFlags < 2) ? 1 : ((xkbDebugFlags > 10) ? 10 : (int)xkbDebugFlags) ), - xkbbasedirflag ? xkbbasedirflag : "", xkmfile, + xkbbasedirflag ? xkbbasedirflag : "", xkbfile, PRE_ERROR_MSG, ERROR_PREFIX, POST_ERROR_MSG1, - xkm_output_dir, keymap); + tmpXkmFile); free(xkbbasedirflag); @@ -240,7 +339,12 @@ XkbDDXCompileKeymapByNames( XkbDescPtr LogMessage(X_ERROR, "XKB: Could not invoke xkbcomp: not enough memory\n"); return FALSE; } - + + /* there's a potential race condition between calling tempnam() + and invoking xkbcomp to write the result file (potential temp + file name conflicts), but since xkbcomp is a standalone + program, we have to live with this */ + #ifndef WIN32 out= Popen(buf,"w"); #else @@ -248,31 +352,42 @@ XkbDDXCompileKeymapByNames( XkbDescPtr #endif if (out!=NULL) { -#ifdef DEBUG - if (xkbDebugFlags) { - ErrorF("[xkb] XkbDDXCompileKeymapByNames compiling keymap:\n"); - XkbWriteXKBKeymapForNames(stderr,names,xkb,want,need); - } -#endif - XkbWriteXKBKeymapForNames(out,names,xkb,want,need); + /* write XKBKeyMapBuf to xkbcomp */ + if (EOF==fputs(xkbKeyMapBuf, out)) + { + ErrorF("[xkb] Sending keymap to xkbcomp failed\n"); + result = FALSE; + goto _ret; + } #ifndef WIN32 if (Pclose(out)==0) #else if (fclose(out)==0 && System(buf) >= 0) #endif { + /* xkbcomp success */ if (xkbDebugFlags) DebugF("[xkb] xkb executes: %s\n",buf); - if (nameRtrn) { - strncpy(nameRtrn,keymap,nameRtrnLen); - nameRtrn[nameRtrnLen-1]= '\0'; + /* if canonicalXkmFileName already exists now, we simply + overwrite it, this is OK */ + ret = rename(tmpXkmFile, canonicalXkmFileName); + if (0 != ret) { + ErrorF("[xkb] Can't rename %s to %s, error: %s\n", + tmpXkmFile, canonicalXkmFileName, + strerror(errno)); + + /* in case of error, don't unlink tmpXkmFile, leave it + for debugging */ + + result = FALSE; + goto _ret; } - if (buf != NULL) - free(buf); - return TRUE; + + result = TRUE; + goto _ret; } else - LogMessage(X_ERROR, "Error compiling keymap (%s)\n", keymap); + LogMessage(X_ERROR, "Error compiling keymap (%s)\n", xkbfile); #ifdef WIN32 /* remove the temporary file */ unlink(tmpname); @@ -289,7 +404,17 @@ XkbDDXCompileKeymapByNames( XkbDescPtr nameRtrn[0]= '\0'; if (buf != NULL) free(buf); - return FALSE; + result = FALSE; + +_ret: + if (tmpXkmFile) + free(tmpXkmFile); + if (canonicalXkmFileName) + xfree(canonicalXkmFileName); + if (buf != NULL) + xfree (buf); + + return result; } static FILE * @@ -373,7 +498,6 @@ unsigned missing; DebugF("Loaded XKB keymap %s, defined=0x%x\n",fileName,(*xkbRtrn)->defined); } fclose(file); - (void) unlink (fileName); return (need|want)&(~missing); } ++++++ confine_to_shape.diff ++++++ Index: dix/events.c ================================================================================ --- dix/events.c +++ dix/events.c @@ -661,37 +661,80 @@ { BoxRec box; int x = *px, y = *py; - int incx = 1, incy = 1; SpritePtr pSprite; + int nbox; + BoxPtr pbox; + int d, min = (~0U >> 1), dx2, dy2, x_r, y_r; pSprite = pDev->spriteInfo->sprite; if (RegionContainsPoint(shape, x, y, &box)) return; - box = *RegionExtents(shape); - /* this is rather crude */ - do { - x += incx; - if (x >= box.x2) - { - incx = -1; - x = *px - 1; + + for (nbox = REGION_NUM_RECTS (shape), + pbox = REGION_RECTS(shape); + nbox--; + pbox++) + { + if (pbox->x1 < x && pbox->x2 > x) { + d = pbox->y1 - y; + if (d >= 0) { + d *= d; + if (d < min) { + *px = x; + *py = pbox->y1 + 1; + min = d; + } + } else { + d = pbox->y2 - y; d *= d; + if (d < min) { + *px = x; + *py = pbox->y2 - 1; + min = d; + } + } } - else if (x < box.x1) - { - incx = 1; - x = *px; - y += incy; - if (y >= box.y2) - { - incy = -1; - y = *py - 1; + else if (pbox->y1 < y && pbox->y2 > y) { + d = pbox->x1 - x; + if (d >= 0) { + d *= d; + if (d < min) { + *px = pbox->x1 + 1; + *py = y; + min = d; + } + } else { + d = pbox->x2 - x; d *= d; + if (d < min) { + *px = pbox->x2 - 1; + *py = y; + min = d; + } + } + + } else { + dx2 = pbox->x1 - x; + if (dx2 >= 0) { + dx2 *= dx2; + x_r = pbox->x1 + 1; + } else { + dx2 = pbox->x2 - x; dx2 *= dx2; + x_r = pbox->x2 - 1; + } + dy2 = pbox->y1 - y; + if (dy2 >= 0) { + dy2 *= dy2; + y_r = pbox->y1 + 1; + } else { + dy2 = pbox->y2 - y; dy2 *= dy2; + y_r = pbox->y2 - 1; + } + if ((d = dx2 + dy2) < min) { + *px = x_r; + *py = y_r; + min = d; } - else if (y < box.y1) - return; /* should never get here! */ } - } while (!RegionContainsPoint(shape, x, y, &box)); - *px = x; - *py = y; + } } static void ++++++ dpms_screensaver.diff ++++++ Index: xorg-server-1.6.3.901/hw/xfree86/common/xf86DPMS.c ================================================================================ --- xorg-server-1.7.99/hw/xfree86/common/xf86DPMS.c +++ xorg-server-1.7.99/hw/xfree86/common/xf86DPMS.c @@ -156,7 +156,8 @@ rc = dixSaveScreens(client, SCREEN_SAVER_FORCER, ScreenSaverActive); if (rc != Success) return rc; - } + } else + dixSaveScreens(client, SCREEN_SAVER_FORCER, ScreenSaverReset); /* For each screen, set the DPMS level */ for (i = 0; i < xf86NumScreens; i++) { ++++++ driver-autoconfig.diff ++++++ --- hw/xfree86/common/xf86pciBus.c +++ hw/xfree86/common/xf86pciBus.c @@ -176,7 +176,11 @@ case 0x1142: driverList[0] = "apm"; break; case 0xedd8: driverList[0] = "ark"; break; case 0x1a03: driverList[0] = "ast"; break; - case 0x1002: driverList[0] = "ati"; break; + case 0x1002: + driverList[0] = "fglrx"; + driverList[1] = "radeonhd"; + driverList[2] = "ati"; + break; case 0x102c: driverList[0] = "chips"; break; case 0x1013: driverList[0] = "cirrus"; break; case 0x3d3d: driverList[0] = "glint"; break; @@ -192,8 +196,20 @@ break; case 0x102b: driverList[0] = "mga"; break; case 0x10c8: driverList[0] = "neomagic"; break; - case 0x10de: case 0x12d2: driverList[0] = "nv"; break; - case 0x1106: driverList[0] = "openchrome"; break; + case 0x12d2: driverList[0] = "nv"; break; + case 0x10de: + driverList[0] = "nvidia"; + driverList[1] = "nouveau"; + /* GeForce 6150SE support broken (bnc #465190/544674) */ + if (dev->device_id != 0x03D0) { + driverList[2] = "nv"; + } + break; + case 0x1106: + driverList[0] = "via"; + driverList[1] = "openchrome"; + driverList[2] = "unichrome"; + break; case 0x1b36: driverList[0] = "qxl"; break; case 0x1163: driverList[0] = "rendition"; break; case 0x5333: ++++++ edid_data_sanity_check.diff ++++++ Index: xorg-server-1.6.3.901/hw/xfree86/modes/xf86Crtc.c ================================================================================ --- xorg-server-1.7.99/hw/xfree86/modes/xf86Crtc.c +++ xorg-server-1.7.99/hw/xfree86/modes/xf86Crtc.c @@ -2916,8 +2916,14 @@ p->output->MonInfo->features.vsize); if (det_mon->type == DT && det_mon->section.d_timings.h_size != 0 && - det_mon->section.d_timings.v_size != 0) { - + det_mon->section.d_timings.v_size != 0 && + det_mon->section.d_timings.v_size != 0 && + /* some sanity checking for aspect ration */ + ((det_mon->section.d_timings.h_size / + det_mon->section.d_timings.v_size) < 2) && + ((det_mon->section.d_timings.v_size / + det_mon->section.d_timings.h_size) < 2) + ) { p->output->mm_width = det_mon->section.d_timings.h_size; p->output->mm_height = det_mon->section.d_timings.v_size; p->ret = TRUE; ++++++ fbdevhw.diff ++++++ Index: hw/xfree86/fbdevhw/fbdevhw.c ================================================================================ --- hw/xfree86/fbdevhw/fbdevhw.c +++ hw/xfree86/fbdevhw/fbdevhw.c @@ -957,9 +957,10 @@ return; } + /* Novell Bug #146462 */ if (-1 == ioctl(fPtr->fd, FBIOBLANK, (void *)fbmode)) - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "FBIOBLANK: %s\n", strerror(errno)); + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "FBIOBLANK: %s (Screen blanking not supported by vesafb of Linux Kernel)\n", strerror(errno)); } Bool @@ -975,9 +976,10 @@ unblank = xf86IsUnblank(mode); + /* Novell Bug #146462 */ if (-1 == ioctl(fPtr->fd, FBIOBLANK, (void *)(1-unblank))) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "FBIOBLANK: %s\n", strerror(errno)); + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "FBIOBLANK: %s (Screen blanking not supported by vesafb of Linux Kernel)\n", strerror(errno)); return FALSE; } ++++++ fix-dpi-values.diff ++++++ Index: hw/xfree86/common/xf86Helper.c ================================================================================ --- hw/xfree86/common/xf86Helper.c +++ hw/xfree86/common/xf86Helper.c @@ -974,12 +974,22 @@ } else if (pScrn->widthmm > 0 || pScrn->heightmm > 0) { from = X_CONFIG; if (pScrn->widthmm > 0) { - pScrn->xDpi = - (int)((double)pScrn->virtualX * MMPERINCH / pScrn->widthmm); + if (pScrn->modes && pScrn->modes->HDisplay > 0) { + pScrn->xDpi = + (int)((double) pScrn->modes->HDisplay * MMPERINCH / pScrn->widthmm); + } else { + pScrn->xDpi = + (int)((double)pScrn->virtualX * MMPERINCH / pScrn->widthmm); + } } if (pScrn->heightmm > 0) { - pScrn->yDpi = - (int)((double)pScrn->virtualY * MMPERINCH / pScrn->heightmm); + if (pScrn->modes && pScrn->modes->VDisplay > 0) { + pScrn->yDpi = + (int)((double)pScrn->modes->VDisplay * MMPERINCH / pScrn->heightmm); + } else { + pScrn->yDpi = + (int)((double)pScrn->virtualY * MMPERINCH / pScrn->heightmm); + } } if (pScrn->xDpi > 0 && pScrn->yDpi <= 0) pScrn->yDpi = pScrn->xDpi; @@ -1014,12 +1024,22 @@ pScrn->widthmm = ddcWidthmm; pScrn->heightmm = ddcHeightmm; if (pScrn->widthmm > 0) { - pScrn->xDpi = - (int)((double)pScrn->virtualX * MMPERINCH / pScrn->widthmm); + if (pScrn->modes && pScrn->modes->HDisplay > 0) { + pScrn->xDpi = + (int)((double) pScrn->modes->HDisplay * MMPERINCH / pScrn->widthmm); + } else { + pScrn->xDpi = + (int)((double)pScrn->virtualX * MMPERINCH / pScrn->widthmm); + } } if (pScrn->heightmm > 0) { - pScrn->yDpi = - (int)((double)pScrn->virtualY * MMPERINCH / pScrn->heightmm); + if (pScrn->modes && pScrn->modes->VDisplay > 0) { + pScrn->yDpi = + (int)((double)pScrn->modes->VDisplay * MMPERINCH / pScrn->heightmm); + } else { + pScrn->yDpi = + (int)((double)pScrn->virtualY * MMPERINCH / pScrn->heightmm); + } } if (pScrn->xDpi > 0 && pScrn->yDpi <= 0) pScrn->yDpi = pScrn->xDpi; ++++++ fix_fglrx_screendepth_issue.patch ++++++ --- hw/xfree86/common/xf86AutoConfig.c.orig 2010-03-23 19:36:35.242114919 +0100 +++ hw/xfree86/common/xf86AutoConfig.c 2010-03-23 19:46:34.037124633 +0100 @@ -75,6 +75,13 @@ "\tDevice\t" BUILTIN_DEVICE_NAME "\n" \ "EndSection\n\n" +#define BUILTIN_SCREEN_SECTION_FOR_FGLRX \ + "Section \"Screen\"\n" \ + "\tIdentifier\t" BUILTIN_SCREEN_NAME "\n" \ + "\tDevice\t" BUILTIN_DEVICE_NAME "\n" \ + "\tDefaultDepth\t24\n" \ + "EndSection\n\n" + #define BUILTIN_LAYOUT_SECTION_PRE \ "Section \"ServerLayout\"\n" \ "\tIdentifier\t\"Builtin Default Layout\"\n" @@ -259,7 +266,10 @@ xf86AutoConfig(void) for (p = deviceList; *p; p++) { snprintf(buf, sizeof(buf), BUILTIN_DEVICE_SECTION, *p, 0, *p); AppendToConfig(buf); - snprintf(buf, sizeof(buf), BUILTIN_SCREEN_SECTION, *p, 0, *p, 0); + if( strcmp(*p, "fglrx") == 0 ) + snprintf(buf, sizeof(buf), BUILTIN_SCREEN_SECTION_FOR_FGLRX, *p, 0, *p, 0); + else + snprintf(buf, sizeof(buf), BUILTIN_SCREEN_SECTION, *p, 0, *p, 0); AppendToConfig(buf); } ++++++ modprobe.nvidia ++++++ options nvidia NVreg_DeviceFileUID=0 NVreg_DeviceFileGID=33 NVreg_DeviceFileMode=0660 ++++++ p_default-module-path.diff ++++++ Index: hw/xfree86/common/xf86Globals.c ================================================================================ --- hw/xfree86/common/xf86Globals.c +++ hw/xfree86/common/xf86Globals.c @@ -144,7 +144,7 @@ }; const char *xf86ConfigFile = NULL; const char *xf86ConfigDir = NULL; -const char *xf86ModulePath = DEFAULT_MODULE_PATH; +const char *xf86ModulePath = DEFAULT_MODULE_PATH "/updates," DEFAULT_MODULE_PATH; MessageType xf86ModPathFrom = X_DEFAULT; const char *xf86LogFile = DEFAULT_LOGPREFIX; MessageType xf86LogFileFrom = X_DEFAULT; ++++++ p_xnest-ignore-getimage-errors.diff ++++++ Index: build-GucBkyZ/xorg-server-1.6.3.901/hw/xnest/GCOps.c ================================================================================ --- BUILD/xorg-server-1.7.99/hw/xnest/GCOps.c +++ BUILD/xorg-server-1.7.99/hw/xnest/GCOps.c @@ -94,6 +94,13 @@ } } +static int +xnestIgnoreErrorHandler (Display *display, + XErrorEvent *event) +{ + return False; /* return value is ignored */ +} + void xnestGetImage(DrawablePtr pDrawable, int x, int y, int w, int h, unsigned int format, unsigned long planeMask, @@ -101,9 +108,13 @@ { XImage *ximage; int length; + int (*old_handler)(Display*, XErrorEvent*); + /* we may get BadMatch error when xnest window is minimized */ + old_handler = XSetErrorHandler (xnestIgnoreErrorHandler); ximage = XGetImage(xnestDisplay, xnestDrawable(pDrawable), x, y, w, h, planeMask, format); + XSetErrorHandler (old_handler); if (ximage) { length = ximage->bytes_per_line * ximage->height; ++++++ pci-legacy-mem-fallback.diff ++++++ Index: hw/xfree86/os-support/bus/linuxPci.c ================================================================================ --- hw/xfree86/os-support/bus/linuxPci.c +++ hw/xfree86/os-support/bus/linuxPci.c @@ -397,6 +397,7 @@ * legacy_mem interface is unavailable. */ if ((Base > 1024*1024) || ((fd = linuxOpenLegacy(dev, "legacy_mem")) < 0)) + fallback: return linuxMapPci(ScreenNum, Flags, dev, Base, Size, PCIIOC_MMAP_IS_MEM); else @@ -405,6 +406,8 @@ if (fd >= 0) close(fd); if (addr == NULL || addr == MAP_FAILED) { + if (errno == ENXIO) + goto fallback; perror("mmap failure"); FatalError("xf86MapDomainMem(): mmap() failure\n"); } ++++++ pio_ia64.diff ++++++ Index: xorg-server-1.8.0/hw/xfree86/common/compiler.h =================================================================== --- xorg-server-1.8.0.orig/hw/xfree86/common/compiler.h +++ xorg-server-1.8.0/hw/xfree86/common/compiler.h @@ -409,12 +409,18 @@ extern _X_EXPORT unsigned int inl(unsign # undef inb # undef inw # undef inl -extern _X_EXPORT void outb(unsigned long port, unsigned char val); -extern _X_EXPORT void outw(unsigned long port, unsigned short val); -extern _X_EXPORT void outl(unsigned long port, unsigned int val); -extern _X_EXPORT unsigned int inb(unsigned long port); -extern _X_EXPORT unsigned int inw(unsigned long port); -extern _X_EXPORT unsigned int inl(unsigned long port); +#define outb(p,v) outb_ia64(p,v) +#define outw(p,v) outw_ia64(p,v) +#define outl(p,v) outl_ia64(p,v) +#define inb(p) inb_ia64(p) +#define inw(p) inw_ia64(p) +#define inl(p) inl_ia64(p) +extern _X_EXPORT void outb_ia64(unsigned long port, unsigned char val); +extern _X_EXPORT void outw_ia64(unsigned long port, unsigned short val); +extern _X_EXPORT void outl_ia64(unsigned long port, unsigned int val); +extern _X_EXPORT unsigned int inb_ia64(unsigned long port); +extern _X_EXPORT unsigned int inw_ia64(unsigned long port); +extern _X_EXPORT unsigned int inl_ia64(unsigned long port); # elif (defined(linux) || defined(__FreeBSD__)) && defined(__amd64__) Index: xorg-server-1.8.0/hw/xfree86/os-support/shared/ia64Pci.c =================================================================== --- xorg-server-1.8.0.orig/hw/xfree86/os-support/shared/ia64Pci.c +++ xorg-server-1.8.0/hw/xfree86/os-support/shared/ia64Pci.c @@ -60,7 +60,7 @@ static int ia64_port_to_fd(unsigned long return (port >> 24) & 0xffffffff; } -void outb(unsigned long port, unsigned char val) +void outb_ia64(unsigned long port, unsigned char val) { int fd = ia64_port_to_fd(port); @@ -80,7 +80,7 @@ void outb(unsigned long port, unsigned c return; } -void outw(unsigned long port, unsigned short val) +void outw_ia64(unsigned long port, unsigned short val) { int fd = ia64_port_to_fd(port); @@ -100,7 +100,7 @@ void outw(unsigned long port, unsigned s return; } -void outl(unsigned long port, unsigned int val) +void outl_ia64(unsigned long port, unsigned int val) { int fd = ia64_port_to_fd(port); @@ -120,7 +120,7 @@ void outl(unsigned long port, unsigned i return; } -unsigned int inb(unsigned long port) +unsigned int inb_ia64(unsigned long port) { int fd = ia64_port_to_fd(port); unsigned char val; @@ -142,7 +142,7 @@ unsigned int inb(unsigned long port) return val; } -unsigned int inw(unsigned long port) +unsigned int inw_ia64(unsigned long port) { int fd = ia64_port_to_fd(port); unsigned short val; @@ -164,7 +164,7 @@ unsigned int inw(unsigned long port) return val; } -unsigned int inl(unsigned long port) +unsigned int inl_ia64(unsigned long port) { int fd = ia64_port_to_fd(port); unsigned int val; ++++++ pu_fixes.diff ++++++ Index: hw/xfree86/xaa/xaaImage.c ================================================================================ --- hw/xfree86/xaa/xaaImage.c +++ hw/xfree86/xaa/xaaImage.c @@ -238,12 +238,16 @@ (*infoRec->SetupForImageWrite)(pScrn, rop, planemask, trans, bpp, depth); (*infoRec->SubsequentImageWriteRect)(pScrn, x, y, w, h, skipleft); +#if 0 if(beCareful) { /* in cases with bad alignment we have to be careful not to read beyond the end of the source */ if(((x * Bpp) + (dwords << 2)) > srcwidth) h--; else beCareful = FALSE; } +#endif + if (beCareful) + h--; if(dwords > infoRec->ImageWriteRange) { while(h--) { ++++++ randr1_1-sig11.diff ++++++ Index: xorg-server-1.6.3.901/hw/xfree86/common/xf86RandR.c ================================================================================ --- xorg-server-1.7.99/hw/xfree86/common/xf86RandR.c +++ xorg-server-1.7.99/hw/xfree86/common/xf86RandR.c @@ -247,6 +247,9 @@ Bool useVirtual = FALSE; Rotation oldRotation = randrp->rotation; + if (!scrp->vtSema) + return FALSE; + miPointerGetPosition(inputInfo.pointer, &px, &py); for (mode = scrp->modes; ; mode = mode->next) { ++++++ sync-fix.patch ++++++ --- xorg-server-1.9.1/Xext/sync.c 2010-11-16 23:11:56.751124639 -0500 +++ xorg-server-1.9.1/Xext/sync.c 2010-11-16 23:13:16.327862535 -0500 @@ -2264,8 +2264,44 @@ static void IdleTimeQueryValue (pointer pCounter, CARD64 *pValue_return) { - CARD32 idle = GetTimeInMillis() - lastDeviceEventTime.milliseconds; + static CARD32 previousLastDeviceEventTimeMilliseconds = 0; + CARD32 now = GetTimeInMillis(); + CARD32 idle = now - lastDeviceEventTime.milliseconds; + CARD32 previousIdle = now - previousLastDeviceEventTimeMilliseconds; + SyncCounter *pIdleTimeCounter = (SyncCounter*)pCounter; + XSyncIntsToValue (pValue_return, idle, 0); + + if (pCounter == NULL) + { + return; + } + if (previousLastDeviceEventTimeMilliseconds == 0) + { + /* initialize static var when this function is invoked the first time. */ + previousLastDeviceEventTimeMilliseconds = lastDeviceEventTime.milliseconds; + return; + } + + if (previousLastDeviceEventTimeMilliseconds == lastDeviceEventTime.milliseconds) + { + /* no new user event, no need to change idle counter. */ + return; + } + previousLastDeviceEventTimeMilliseconds = lastDeviceEventTime.milliseconds; + + /* + * Some user event occured; now update idle counter with previous + * event time, so idle counter has the most up-to-date value with + * respect to previous user event (we need old and new counter + * value to compute if a transition occured). Recompute bracket + * values if this is system counter. + */ + + XSyncIntsToValue (&pIdleTimeCounter->value, previousIdle, 0); + if (IsSystemCounter(pIdleTimeCounter)) { + SyncComputeBracketValues(pIdleTimeCounter); + } } static void @@ -2342,7 +2378,7 @@ if (!pIdleTimeValueLess && !pIdleTimeValueGreater) return; - IdleTimeQueryValue (NULL, &idle); + IdleTimeQueryValue (IdleTimeCounter, &idle); if ((pIdleTimeValueGreater && XSyncValueGreaterOrEqual (idle, *pIdleTimeValueGreater)) || ++++++ sysconfig.displaymanager.template ++++++ ## Type: string(Xorg) ## Path: Desktop/Display manager ## Default: "Xorg" # DISPLAYMANAGER_XSERVER="Xorg" ++++++ u_OS-acpi-Reconnect-to-acpid-when-it-gets-restarted.patch ++++++
From 142ba992065dd9c37a9d06dc6e96cfc9adfb6be0 Mon Sep 17 00:00:00 2001 From: Egbert Eich <eich@suse.de> Date: Tue, 5 Jul 2011 06:56:43 +0200 Subject: [PATCH] OS/acpi: Reconnect to acpid when it gets restarted. Patch-mainline: To be upstreamed
On Linux the Xserver connects to the ACPI daemon to receive power management events. If this daemon isn't started when the server starts or goes down the connection is lost. When this happens we add a timer which periodically tries to reconnect. Signed-off-by: Egbert Eich <eich@suse.de> --- hw/xfree86/os-support/linux/lnx_acpi.c | 68 ++++++++++++++++++++++++++----- hw/xfree86/os-support/linux/lnx_apm.c | 9 ++++ 2 files changed, 66 insertions(+), 11 deletions(-) diff --git a/hw/xfree86/os-support/linux/lnx_acpi.c b/hw/xfree86/os-support/linux/lnx_acpi.c index 5fad194..8dd6881 100644 --- a/hw/xfree86/os-support/linux/lnx_acpi.c +++ b/hw/xfree86/os-support/linux/lnx_acpi.c @@ -32,9 +32,12 @@ #define ACPI_VIDEO_HEAD_INVALID (~0u - 1) #define ACPI_VIDEO_HEAD_END (~0u) +static PMClose doLnxACPIOpen(void); static void lnxCloseACPI(void); static pointer ACPIihPtr = NULL; +static OsTimerPtr acpiTimer = NULL; PMClose lnxACPIOpen(void); +PMClose lnxACPIPoll(void); /* in milliseconds */ #define ACPI_REOPEN_DELAY 1000 @@ -52,6 +55,22 @@ lnxACPIReopen(OsTimerPtr timer, CARD32 time, pointer arg) #define LINE_LENGTH 80 +static CARD32 +lnxACPICheckTimer(OsTimerPtr timer, CARD32 now, pointer arg) +{ +#if DEBUG + ErrorF("ACPI: trying to reopen\n"); +#endif + if (doLnxACPIOpen()) { +#if DEBUG + ErrorF("ACPI: successfully reopened\n"); +#endif + acpiTimer = NULL; + return 0; + } + return 10000; +} + static int lnxACPIGetEventFromOs(int fd, pmEvent *events, int num) { @@ -127,33 +146,35 @@ lnxACPIConfirmEventToOs(int fd, pmEvent event) } } -PMClose -lnxACPIOpen(void) +static PMClose +doLnxACPIOpen(void) { - int fd; + int fd = -1; struct sockaddr_un addr; int r = -1; static int warned = 0; - DebugF("ACPI: OSPMOpen called\n"); if (ACPIihPtr || !xf86Info.pmFlag) return NULL; DebugF("ACPI: Opening device\n"); - if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) > -1) { + fd = socket(AF_UNIX, SOCK_STREAM, 0); + if (fd > -1) { memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_UNIX; strcpy(addr.sun_path, ACPI_SOCKET); - if ((r = connect(fd, (struct sockaddr*)&addr, sizeof(addr))) == -1) { - if (!warned) + r = connect(fd, (struct sockaddr*)&addr, sizeof(addr)); + if (r == -1) { + if (errno != warned) xf86MsgVerb(X_WARNING,3,"Open ACPI failed (%s) (%s)\n", ACPI_SOCKET, strerror(errno)); - warned = 1; - shutdown(fd, 2); + warned = errno; + shutdown(fd, SHUT_RDWR); close(fd); return NULL; } - } + } else + return NULL; xf86PMGetEventFromOs = lnxACPIGetEventFromOs; xf86PMConfirmEventToOs = lnxACPIConfirmEventToOs; @@ -164,6 +185,25 @@ lnxACPIOpen(void) return lnxCloseACPI; } +PMClose +lnxACPIPoll(void) +{ + TimerSet(NULL, 0, 10000, lnxACPICheckTimer, NULL); + return lnxCloseACPI; +} + +PMClose +lnxACPIOpen(void) +{ + PMClose ret; +#ifdef DEBUG + ErrorF("ACPI: OSPMOpen called\n"); +#endif + ret = doLnxACPIOpen(); + + return ret; +} + static void lnxCloseACPI(void) { @@ -172,8 +212,14 @@ lnxCloseACPI(void) DebugF("ACPI: Closing device\n"); if (ACPIihPtr) { fd = xf86RemoveGeneralHandler(ACPIihPtr); - shutdown(fd, 2); + shutdown(fd, SHUT_RDWR); close(fd); ACPIihPtr = NULL; + xf86PMGetEventFromOs = NULL; + xf86PMConfirmEventToOs = NULL; + if (acpiTimer) { + TimerCancel(acpiTimer); + acpiTimer = NULL; + } } } diff --git a/hw/xfree86/os-support/linux/lnx_apm.c b/hw/xfree86/os-support/linux/lnx_apm.c index 54c6989..c8b254f 100644 --- a/hw/xfree86/os-support/linux/lnx_apm.c +++ b/hw/xfree86/os-support/linux/lnx_apm.c @@ -12,6 +12,7 @@ #ifdef HAVE_ACPI extern PMClose lnxACPIOpen(void); +extern PMClose lnxACPIPoll(void); #endif #ifdef HAVE_APM @@ -149,6 +150,14 @@ xf86OSPMOpen(void) ret = lnxAPMOpen(); #endif +#ifdef HAVE_ACPI + /* if we can neither open ACPI nor APM poll for an ACPI service to + become available */ + + if (!ret && !xf86acpiDisableFlag) + ret = lnxACPIPoll(); +#endif + return ret; } -- 1.6.0.2
From 3f35d15f7c7eb202de36e2d1040f27ef7b38c1d2 Mon Sep 17 00:00:00 2001 From: Egbert Eich <eich@freedesktop.org> Date: Thu, 7 Jul 2011 09:01:35 +0200 Subject: [PATCH] OS/ACPI: Make socket to read from acpid non-blocking.
If acpid for some reason does not service a connect() this function may hang forever stalling the Xserver. To prevent this make the socket non-blocking. If connect returns EINPROGRESS use select() and getsockopt() to check for completion of the connect request. select() gets a different timeout depending if it is called during startup or to do a reconnect. Signed-off-by: Egbert Eich <eich@freedesktop.org> --- hw/xfree86/os-support/linux/lnx_acpi.c | 34 +++++++++++++++++++++++++++---- 1 files changed, 29 insertions(+), 5 deletions(-) diff --git a/hw/xfree86/os-support/linux/lnx_acpi.c b/hw/xfree86/os-support/linux/lnx_acpi.c index 8dd6881..f0e6eb4 100644 --- a/hw/xfree86/os-support/linux/lnx_acpi.c +++ b/hw/xfree86/os-support/linux/lnx_acpi.c @@ -32,7 +32,7 @@ #define ACPI_VIDEO_HEAD_INVALID (~0u - 1) #define ACPI_VIDEO_HEAD_END (~0u) -static PMClose doLnxACPIOpen(void); +static PMClose doLnxACPIOpen(struct timeval *); static void lnxCloseACPI(void); static pointer ACPIihPtr = NULL; static OsTimerPtr acpiTimer = NULL; @@ -58,10 +58,11 @@ lnxACPIReopen(OsTimerPtr timer, CARD32 time, pointer arg) static CARD32 lnxACPICheckTimer(OsTimerPtr timer, CARD32 now, pointer arg) { + struct timeval timeval = { 0, 0 }; #if DEBUG ErrorF("ACPI: trying to reopen\n"); #endif - if (doLnxACPIOpen()) { + if (doLnxACPIOpen(&timeval)) { #if DEBUG ErrorF("ACPI: successfully reopened\n"); #endif @@ -147,7 +148,7 @@ lnxACPIConfirmEventToOs(int fd, pmEvent event) } static PMClose -doLnxACPIOpen(void) +doLnxACPIOpen(struct timeval *tv_p) { int fd = -1; struct sockaddr_un addr; @@ -158,13 +159,34 @@ doLnxACPIOpen(void) return NULL; DebugF("ACPI: Opening device\n"); - fd = socket(AF_UNIX, SOCK_STREAM, 0); + fd = socket(AF_UNIX, SOCK_STREAM | SOCK_NONBLOCK, 0); if (fd > -1) { memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_UNIX; strcpy(addr.sun_path, ACPI_SOCKET); r = connect(fd, (struct sockaddr*)&addr, sizeof(addr)); if (r == -1) { + int sock_errno = errno; + if (sock_errno == EINPROGRESS) { + fd_set fds; + int result; + do { + FD_ZERO(&fds); + FD_SET(fd, &fds); + result = select(fd + 1, NULL, &fds, NULL, tv_p); + } while (result < 0 && errno == EINTR); + if (result < 0) + sock_errno = errno; + else if (result > 0) { + int sock_errno; + socklen_t size = sizeof(sock_errno); + if (0 > getsockopt(fd, SOL_SOCKET, SO_ERROR, &sock_errno, + &size)) + sock_errno = errno; + if (!sock_errno) + goto success; + } + } if (errno != warned) xf86MsgVerb(X_WARNING,3,"Open ACPI failed (%s) (%s)\n", ACPI_SOCKET, strerror(errno)); @@ -176,6 +198,7 @@ doLnxACPIOpen(void) } else return NULL; + success: xf86PMGetEventFromOs = lnxACPIGetEventFromOs; xf86PMConfirmEventToOs = lnxACPIConfirmEventToOs; ACPIihPtr = xf86AddGeneralHandler(fd,xf86HandlePMEvents,NULL); @@ -196,10 +219,11 @@ PMClose lnxACPIOpen(void) { PMClose ret; + struct timeval timeval = { 0, 30000 }; #ifdef DEBUG ErrorF("ACPI: OSPMOpen called\n"); #endif - ret = doLnxACPIOpen(); + ret = doLnxACPIOpen(&timeval); return ret; } -- 1.7.3.4 ++++++ u_record-fix-sig11.patch ++++++ Date: Mon, 07 Nov 2011 22:09:34 -0800 From: Keith Packard <keithp@keithp.com> Subject: Re: X server SIGSEGV? If you aren't using the Record extension (and you aren't), you can work around the bug by moving the code which accesses the (non-existant) request buffer inside the loop looking at the recording contexts (of which there should be none): diff --git a/record/record.c b/record/record.c index 68311ac..9e36103 100644 --- a/record/record.c +++ b/record/record.c @@ -603,12 +603,10 @@ RecordAReply(CallbackListPtr *pcbl, pointer nulldata, pointer calldata) RecordContextPtr pContext; RecordClientsAndProtocolPtr pRCAP; int eci; - int majorop; ReplyInfoRec *pri = (ReplyInfoRec *)calldata; ClientPtr client = pri->client; REQUEST(xReq); - majorop = stuff->reqType; for (eci = 0; eci < numEnabledContexts; eci++) { pContext = ppAllContexts[eci]; @@ -616,6 +614,7 @@ RecordAReply(CallbackListPtr *pcbl, pointer nulldata, pointer calldata) NULL); if (pRCAP) { + int majorop = stuff->reqType; if (pContext->continuedReply) { RecordAProtocolElement(pContext, client, XRecordFromServer, I'll see if I can't get someone to fix this for real... ++++++ vidmode-sig11.diff ++++++ Index: hw/xfree86/common/xf86VidMode.c ================================================================================ --- hw/xfree86/common/xf86VidMode.c +++ hw/xfree86/common/xf86VidMode.c @@ -220,6 +220,8 @@ pScrn = xf86Screens[scrnIndex]; pVidMode = VMPTR(pScrn->pScreen); + if (!pScrn->modes) + return FALSE; pVidMode->First = pScrn->modes; pVidMode->Next = pVidMode->First->next; ++++++ xorg-backtrace ++++++ #!/usr/bin/perl $version = "1.0"; $timeout = 5; @pkgs = ( "xorg-x11-server", "xorg-x11-driver-video", "xorg-x11-driver-input", "libpixman-1-0", "libpciaccess0" ); $xtracmds= "/etc/X11/xorg-backtrace-cmds"; $pid=$ARGV[0]; if ($pid == 0) { print "Usage: $0 <pid>\n"; exit 1; } if (! -e "/usr/bin/gdb") { print "Install gdb to get reasonable backtraces\n"; exit 2; } $SIG{ALRM} = sub { die "timeout starting gdb" }; alarm $timeout; open STDERR, ">&STDOUT"; use FileHandle; use IPC::Open2; $gdb = open2 (*R, *W, "/usr/bin/gdb -n -p $pid"); $SIG{ALRM} = sub { kill QUIT, $gdb; sleep 1; kill KILL, $gdb; die "timeout using gdb" }; alarm $timeout; print "\n==================== GDB Backtrace ============\n\n"; print "Done by $0 V$version\n\n"; $needpkgs=0; for $p (@pkgs) { next if system ("rpm", "-q", "--quiet", "$p-debuginfo") == 0 && system ("rpm", "-q", "--quiet", "$p-debugsource") == 0; print "Install following debug packages to improve backtrace:\n" unless $needpkgs; $needpkgs++; print "\t$p-debug*\n"; } print "\n" if $needpkgs; print W "set prompt\necho \\n===info\\n\n"; #print W "info files\necho ===files\\n\n"; print W "thread apply all bt full\necho ===btend\\n\n"; $_=<R>; # GNU gdb version print; while (<R>) { last if /^===info/; print if /^This GDB was configured as/; } #print "\n==================== Files ====================\n\n"; #while (<R>) { # last if /^===files/; # print; #} print "\n==================== Backtrace ================\n"; $fno = ""; $fls = 0; $o = ""; $use = 0; while (<R>) { last if /^===btend/; if (/^#(\d+)\s/) { $fno = $1; $o .= "\n"; $o .= "===l".($fno-1)."\n" if $use; $o .= "\n"; $fls = $fno+1 if /\bxorg_backtrace \(/ || /\bOsSigHandler \(/; $use = 1; } $line{$fno} = $1 if $line{$fno} == 0 && /:(\d+)\s*$/; $o .= $_; $use = 0 if /^No symbol table info available/; } $o .="\n===l$fno"; for $i ($fls..$fno) { print W "frame $i\necho ===fs$i\\n\nlist\necho ===fe$i\\n\n"; while (<R>) { last if /^===fs$i\b/; } $r = ""; while (<R>) { last if /^===fe$i\b/; $r .= $_; } if ($line{$i} > 0) { $r =~ s/^$line{$i}\b/$line{$i} */m; } $o =~ s/^===l$i$/$r/m; } if ($fls > 0) { for $i (0..$fls-1) { $o =~ s/^(#$i\s.*?)\n.*?\n#/$1\n\n#/ms; } } $o =~ s/^===l.*$//mg; print "$o"; if (-e $xtracmds) { print W "source -v $xtracmds\necho ===cmds\\n\n"; print "\n==================== Extra Commands ===========\n\n"; while (<R>) { last if /^===cmds/; print unless /^\+echo ===cmds/; } } print "\n==================== Backtrace End ============\n\n"; close R; close W; exit 0; ++++++ xorg-detect-psb.patch ++++++ Index: xorg-server-1.6.3.901/hw/xfree86/common/xf86pciBus.c =============================================================================== --- xorg-server-1.7.99/hw/xfree86/common/xf86pciBus.c +++ xorg-server-1.7.99/hw/xfree86/common/xf86pciBus.c @@ -186,12 +186,14 @@ case 0x3d3d: driverList[0] = "glint"; break; case 0x105d: driverList[0] = "i128"; break; case 0x8086: - if ((dev->device_id == 0x00d1) || (dev->device_id == 0x7800)) { - driverList[0] = "i740"; - } else if (dev->device_id == 0x8108) { - break; /* "hooray" for poulsbo */ - } else { - driverList[0] = "intel"; + switch (dev->device_id) + { + case 0x00d1: case 0x7800: + driverList[0] = "i740"; break; + case 0x8109: case 0x8108: case 0x4102: + driverList[0] = "psb"; driverList[1] = "psb_drv"; break; + default: + driverList[0] = "intel"; break; } break; case 0x102b: driverList[0] = "mga"; break; ++++++ xorg-server-xdmcp.patch ++++++ --- xorg-server-1.6.5/os/access.c +++ xorg-server-1.6.5/os/access.c @@ -781,7 +781,9 @@ /* * ignore 'localhost' entries as they're not useful - * on the other end of the wire + * on the other end of the wire and because on hosts + * with shared home dirs they'll result in conflic + * entries in ~/.Xauthority */ if (ifr->ifa_flags & IFF_LOOPBACK) continue; @@ -804,6 +806,14 @@ else if (family == FamilyInternet6 && IN6_IS_ADDR_LOOPBACK((struct in6_addr *)addr)) continue; + + /* Ignore IPv6 link local addresses (fe80::/10), because + * they need a scope identifier, which we have no way + * of telling to the other end. + */ + if (family == FamilyInternet6 && + IN6_IS_ADDR_LINKLOCAL((struct in6_addr *)addr)) + continue; #endif XdmcpRegisterConnection(family, (char *)addr, len); #if defined(IPv6) && defined(AF_INET6) ++++++ xserver-bg-none-root.patch ++++++
From a3e15680da24cb8259f6a83dee0c930dab024290 Mon Sep 17 00:00:00 2001 From: Kristian <krh@redhat.com> Date: Fri, 15 Aug 2008 15:15:14 +1000 Subject: [PATCH] Add nr for background=none root
--- dix/globals.c | 1 + dix/window.c | 22 ++++++++++++---------- hw/xfree86/common/xf86Init.c | 11 +++++++++++ hw/xfree86/common/xf86str.h | 5 ++++- include/opaque.h | 1 + os/utils.c | 3 +++ 6 files changed, 32 insertions(+), 11 deletions(-) Index: xorg-server-1.8.0/dix/globals.c =================================================================== Index: xorg-server-1.8.0/dix/window.c =================================================================== --- xorg-server-1.8.0.orig/dix/window.c +++ xorg-server-1.8.0/dix/window.c @@ -465,23 +465,24 @@ InitRootWindow(WindowPtr pWin) pWin->cursorIsNone = FALSE; pWin->optional->cursor = rootCursor; rootCursor->refcnt++; - + pWin->backingStore = defaultBackingStore; + pWin->forcedBS = (defaultBackingStore != NotUseful); if (party_like_its_1989) { MakeRootTile(pWin); backFlag |= CWBackPixmap; + pScreen->ChangeWindowAttributes(pWin, backFlag); + } else if (bgNoneRoot) { + /* nothing, handled in xf86CreateRootWindow */ } else { if (whiteRoot) pWin->background.pixel = pScreen->whitePixel; else pWin->background.pixel = pScreen->blackPixel; backFlag |= CWBackPixel; - } - pWin->backingStore = defaultBackingStore; - pWin->forcedBS = (defaultBackingStore != NotUseful); - /* We SHOULD check for an error value here XXX */ - (*pScreen->ChangeWindowAttributes)(pWin, backFlag); + pScreen->ChangeWindowAttributes(pWin, backFlag); + } MapWindow(pWin, serverClient); } Index: xorg-server-1.8.0/hw/xfree86/common/xf86Init.c =================================================================== Index: xorg-server-1.8.0/hw/xfree86/common/xf86str.h =================================================================== --- xorg-server-1.8.0.orig/hw/xfree86/common/xf86str.h +++ xorg-server-1.8.0/hw/xfree86/common/xf86str.h @@ -503,7 +503,7 @@ typedef struct _confdrirec { } confDRIRec, *confDRIPtr; /* These values should be adjusted when new fields are added to ScrnInfoRec */ -#define NUM_RESERVED_INTS 16 +#define NUM_RESERVED_INTS 15 #define NUM_RESERVED_POINTERS 14 #define NUM_RESERVED_FUNCS 11 @@ -775,6 +775,9 @@ typedef struct _ScrnInfoRec { ClockRangePtr clockRanges; int adjustFlags; + /* -nr support */ + int canDoBGNoneRoot; + /* * These can be used when the minor ABI version is incremented. * The NUM_* parameters must be reduced appropriately to keep the Index: xorg-server-1.8.0/include/opaque.h =================================================================== --- xorg-server-1.8.0.orig/include/opaque.h +++ xorg-server-1.8.0/include/opaque.h @@ -71,6 +71,7 @@ extern _X_EXPORT Bool defeatAccessContro extern _X_EXPORT long maxBigRequestSize; extern _X_EXPORT Bool party_like_its_1989; extern _X_EXPORT Bool whiteRoot; +extern _X_EXPORT Bool bgNoneRoot; extern _X_EXPORT Bool CoreDump; Index: xorg-server-1.8.0/os/utils.c =================================================================== --- xorg-server-1.8.0.orig/os/utils.c +++ xorg-server-1.8.0/os/utils.c @@ -511,6 +511,7 @@ void UseMsg(void) #endif ErrorF("-nolisten string don't listen on protocol\n"); ErrorF("-noreset don't reset after last client exists\n"); + ErrorF("-nr create root window with no background\n"); ErrorF("-reset reset after last client exists\n"); ErrorF("-p # screen-saver pattern duration (minutes)\n"); ErrorF("-pn accept failure to listen on all ports\n"); @@ -852,6 +853,8 @@ ProcessCommandLine(int argc, char *argv[ defaultBackingStore = WhenMapped; else if ( strcmp( argv[i], "-wr") == 0) whiteRoot = TRUE; + else if ( strcmp( argv[i], "-nr") == 0) + bgNoneRoot = TRUE; else if ( strcmp( argv[i], "-maxbigreqsize") == 0) { if(++i < argc) { long reqSizeArg = atol(argv[i]); --- xorg-server-1.9.0/dix/globals.c.orig 2010-06-06 19:53:51.000000000 +0200 +++ xorg-server-1.9.0/dix/globals.c 2010-08-23 15:27:52.000000000 +0200 @@ -122,6 +122,7 @@ FontPtr defaultFont; /* not declared i CursorPtr rootCursor; Bool party_like_its_1989 = FALSE; Bool whiteRoot = FALSE; +Bool bgNoneRoot = FALSE; TimeStamp currentTime; TimeStamp lastDeviceEventTime; --- xorg-server-1.9.0/hw/xfree86/common/xf86Init.c.orig 2010-06-10 16:07:55.000000000 +0200 +++ xorg-server-1.9.0/hw/xfree86/common/xf86Init.c 2010-08-23 15:32:56.000000000 +0200 @@ -76,6 +76,7 @@ #include "xf86Xinput.h" #include "xf86InPriv.h" #include "picturestr.h" +#include "xace.h" #include "xf86Bus.h" #include "xf86VGAarbiter.h" @@ -242,6 +243,7 @@ xf86CreateRootWindow(WindowPtr pWin) int ret = TRUE; int err = Success; ScreenPtr pScreen = pWin->drawable.pScreen; + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; RootWinPropPtr pProp; CreateWindowProcPtr CreateWindow = (CreateWindowProcPtr) dixLookupPrivate(&pScreen->devPrivates, xf86CreateRootWindowKey); @@ -293,6 +295,17 @@ xf86CreateRootWindow(WindowPtr pWin) } } + if (bgNoneRoot) { + if (pScrn->canDoBGNoneRoot) { + pWin->backgroundState = XaceBackgroundNoneState(pWin); + pWin->background.pixel = pScreen->whitePixel; + pScreen->ChangeWindowAttributes(pWin, CWBackPixmap | CWBorderPixel | CWCursor | CWBackingStore); + } else { + pWin->background.pixel = pScreen->blackPixel; + pScreen->ChangeWindowAttributes(pWin, CWBackPixel | CWBorderPixel | CWCursor | CWBackingStore); + } + } + DebugF("xf86CreateRootWindow() returns %d\n", ret); return ret; } ++++++ zap_warning_xserver.diff ++++++ Index: xorg-server-1.6.3.901/hw/xfree86/common/xf86Config.c ================================================================================ --- xorg-server-1.7.99/hw/xfree86/common/xf86Config.c +++ xorg-server-1.7.99/hw/xfree86/common/xf86Config.c @@ -696,6 +696,7 @@ FLAG_NOTRAPSIGNALS, FLAG_DONTVTSWITCH, FLAG_DONTZAP, + FLAG_ZAPWARNING, FLAG_DONTZOOM, FLAG_DISABLEVIDMODE, FLAG_ALLOWNONLOCAL, @@ -734,6 +735,8 @@ {0}, FALSE }, { FLAG_DONTZAP, "DontZap", OPTV_BOOLEAN, {0}, FALSE }, + { FLAG_ZAPWARNING, "ZapWarning", OPTV_BOOLEAN, + {0}, FALSE }, { FLAG_DONTZOOM, "DontZoom", OPTV_BOOLEAN, {0}, FALSE }, { FLAG_DISABLEVIDMODE, "DisableVidModeExtension", OPTV_BOOLEAN, @@ -840,6 +843,7 @@ xf86GetOptValBool(FlagOptions, FLAG_NOTRAPSIGNALS, &xf86Info.notrapSignals); xf86GetOptValBool(FlagOptions, FLAG_DONTVTSWITCH, &xf86Info.dontVTSwitch); xf86GetOptValBool(FlagOptions, FLAG_DONTZAP, &xf86Info.dontZap); + xf86GetOptValBool(FlagOptions, FLAG_ZAPWARNING, &xf86Info.ZapWarning); xf86GetOptValBool(FlagOptions, FLAG_DONTZOOM, &xf86Info.dontZoom); xf86GetOptValBool(FlagOptions, FLAG_IGNORE_ABI, &xf86Info.ignoreABI); --- xorg-server-1.7.99/hw/xfree86/common/xf86Events.c +++ xorg-server-1.7.99/hw/xfree86/common/xf86Events.c @@ -180,12 +180,26 @@ DebugF("ProcessActionEvent(%d,%x)\n", (int) action, arg); switch (action) { case ACTION_TERMINATE: - if (!xf86Info.dontZap) { + if (xf86Info.dontZap) + break; + + if (xf86Info.ZapWarning) { + static struct timeval LastZap = { 0, 0}; + struct timeval NewZap; + + gettimeofday(&NewZap, NULL); + + if ((NewZap.tv_sec - LastZap.tv_sec) >= 2) { + xf86OSRingBell(30, 1000, 50); + LastZap = NewZap; + break; + } + } + #ifdef XFreeXDGA - DGAShutdown(); + DGAShutdown(); #endif - GiveUp(0); - } + GiveUp(0); break; case ACTION_NEXT_MODE: if (!xf86Info.dontZoom) --- xorg-server-1.7.99/hw/xfree86/common/xf86Globals.c +++ xorg-server-1.7.99/hw/xfree86/common/xf86Globals.c @@ -109,6 +109,7 @@ #endif .dontVTSwitch = FALSE, .dontZap = FALSE, + .ZapWarning = TRUE, .dontZoom = FALSE, .notrapSignals = FALSE, .caughtSignal = FALSE, --- xorg-server-1.7.99/hw/xfree86/common/xf86Privstr.h +++ xorg-server-1.7.99/hw/xfree86/common/xf86Privstr.h @@ -67,6 +67,7 @@ #endif Bool dontVTSwitch; Bool dontZap; + Bool ZapWarning; Bool dontZoom; Bool notrapSignals; /* don't exit cleanly - die at fault */ Bool caughtSignal; --- xorg-server-1.7.99/hw/xfree86/doc/man/Xorg.man +++ xorg-server-1.7.99/hw/xfree86/doc/man/Xorg.man @@ -438,7 +438,7 @@ .B Ctrl+Alt+Backspace Immediately kills the server -- no questions asked. It can be disabled by setting the -.B DontZap +.B DontZap/ZapWarning __xconfigfile__(__filemansuffix__) file option to a TRUE value. .PP .RS 8 --- xorg-server-1.7.99/hw/xfree86/doc/man/xorg.conf.man +++ xorg-server-1.7.99/hw/xfree86/doc/man/xorg.conf.man @@ -507,6 +507,13 @@ When this option is enabled, the action has no effect. Default: off. .TP 7 +.BI "Option \*qZapWarning\*q \*q" boolean \*q +This warns the user audibly when the +.B Ctrl+Alt+Backspace +sequence is pressed for the first time but still terminates the __xservername__ +server when this key-sequence is pressed again shortly after. +Default: on. +.TP 7 .BI "Option \*qDontZoom\*q \*q" boolean \*q This disallows the use of the .B Ctrl+Alt+Keypad\-Plus -- To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-commit+help@opensuse.org
participants (1)
-
root@hilbert.suse.de